From 292fa154c18b5a203c1aa211dce4efd54e6e8e0a Mon Sep 17 00:00:00 2001 From: Dave Borowitz Date: Sun, 13 Nov 2016 09:56:32 -0800 Subject: [PATCH] Format all Java files with google-java-format Having a standard tool for formatting saves reviewers' valuable time. google-java-format is Google's standard formatter and is somewhat inspired by gofmt[1]. This commit formats everything using google-java-format version 1.2. The downside of this one-off formatting is breaking blame. This can be somewhat hacked around with a tool like git-hyper-blame[2], but it's definitely not optimal until/unless this kind of feature makes its way to git core. Not in this change: * Tool support, e.g. Eclipse. The command must be run manually [3]. * Documentation of best practice, e.g. new 100-column default. [1] https://talks.golang.org/2015/gofmt-en.slide#3 [2] https://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/git-hyper-blame.html [3] git ls-files | grep java$ | xargs google-java-format -i Change-Id: Id5f3c6de95ce0b68b41f0a478b5c99a93675aaa3 Signed-off-by: David Pursehouse --- .../gerrit/convertkey/ConvertKey.java | 12 +- .../gerrit/acceptance/AbstractDaemonTest.java | 590 +++-- .../AcceptanceTestRequestScope.java | 60 +- .../gerrit/acceptance/AccountCreator.java | 29 +- .../google/gerrit/acceptance/AssertUtil.java | 5 +- .../acceptance/ConfigAnnotationParser.java | 10 +- .../gerrit/acceptance/EventRecorder.java | 130 +- .../google/gerrit/acceptance/GcAssert.java | 34 +- .../gerrit/acceptance/GerritConfig.java | 2 + .../gerrit/acceptance/GerritServer.java | 163 +- .../com/google/gerrit/acceptance/GitUtil.java | 172 +- .../gerrit/acceptance/HttpResponse.java | 27 +- .../google/gerrit/acceptance/HttpSession.java | 11 +- .../InMemoryTestingDatabaseModule.java | 26 +- .../gerrit/acceptance/InProcessProtocol.java | 103 +- .../LightweightPluginDaemonTest.java | 23 +- .../acceptance/MergeableFileBasedConfig.java | 24 +- .../com/google/gerrit/acceptance/NoHttpd.java | 3 +- .../gerrit/acceptance/PluginDaemonTest.java | 58 +- .../gerrit/acceptance/PushOneCommit.java | 185 +- .../acceptance/ReadOnlyChangeIndex.java | 5 +- .../gerrit/acceptance/RestResponse.java | 6 +- .../google/gerrit/acceptance/RestSession.java | 48 +- .../google/gerrit/acceptance/Sandboxed.java | 3 +- .../google/gerrit/acceptance/SshSession.java | 16 +- .../google/gerrit/acceptance/TestAccount.java | 17 +- .../google/gerrit/acceptance/TestPlugin.java | 2 + .../gerrit/acceptance/TestProjectInput.java | 15 +- .../gerrit/acceptance/UseLocalDisk.java | 3 +- .../com/google/gerrit/acceptance/UseSsh.java | 3 +- .../UseGerritConfigAnnotationTest.java | 5 +- .../acceptance/api/accounts/AccountIT.java | 370 ++-- .../acceptance/api/accounts/AgreementsIT.java | 18 +- .../api/accounts/DiffPreferencesIT.java | 39 +- .../api/accounts/EditPreferencesIT.java | 17 +- .../api/accounts/GeneralPreferencesIT.java | 24 +- .../acceptance/api/change/ChangeIT.java | 1464 +++++-------- .../acceptance/api/change/MergeListIT.java | 117 +- .../api/change/StickyApprovalsIT.java | 226 +- .../api/change/SubmitTypeRuleIT.java | 103 +- .../api/config/DiffPreferencesIT.java | 7 +- .../api/config/GeneralPreferencesIT.java | 10 +- .../acceptance/api/config/ServerIT.java | 4 +- .../acceptance/api/group/GroupAssert.java | 7 +- .../gerrit/acceptance/api/group/GroupsIT.java | 119 +- .../acceptance/api/project/ProjectIT.java | 79 +- .../acceptance/api/revision/RevisionIT.java | 731 +++---- .../api/revision/RobotCommentsIT.java | 204 +- .../gerrit/acceptance/edit/ChangeEditIT.java | 491 ++--- .../acceptance/git/AbstractPushForReview.java | 663 +++--- .../git/AbstractSubmoduleSubscription.java | 241 ++- .../acceptance/git/DraftChangeBlockedIT.java | 1 - .../gerrit/acceptance/git/ForcePushIT.java | 1 - .../acceptance/git/HttpPushForReviewIT.java | 4 +- .../acceptance/git/ImplicitMergeCheckIT.java | 15 +- .../acceptance/git/RefAdvertisementIT.java | 182 +- .../acceptance/git/SshPushForReviewIT.java | 1 - .../gerrit/acceptance/git/SubmitOnPushIT.java | 109 +- .../git/SubmoduleSectionParserIT.java | 433 ++-- .../git/SubmoduleSubscriptionsIT.java | 374 ++-- ...bmoduleSubscriptionsWholeTopicMergeIT.java | 504 +++-- .../acceptance/pgm/RebuildNoteDbIT.java | 20 +- .../gerrit/acceptance/pgm/ReindexIT.java | 17 +- .../rest/account/AccountAssert.java | 7 +- .../rest/account/CapabilitiesIT.java | 37 +- .../acceptance/rest/account/ExternalIdIT.java | 35 +- .../rest/account/GetAccountDetailIT.java | 1 - .../acceptance/rest/account/GetAccountIT.java | 4 +- .../rest/account/ImpersonationIT.java | 209 +- .../rest/account/PutUsernameIT.java | 25 +- .../rest/account/WatchedProjectsIT.java | 22 +- .../rest/change/AbstractSubmit.java | 485 ++--- .../rest/change/AbstractSubmitByMerge.java | 128 +- .../rest/change/AbstractSubmitByRebase.java | 176 +- .../acceptance/rest/change/ActionsIT.java | 138 +- .../acceptance/rest/change/AssigneeIT.java | 31 +- .../rest/change/ChangeIncludedInIT.java | 17 +- .../rest/change/ChangeMessagesIT.java | 7 +- .../acceptance/rest/change/ChangeOwnerIT.java | 6 +- .../rest/change/ChangeReviewersIT.java | 268 +-- .../rest/change/ConfigChangeIT.java | 84 +- .../gerrit/acceptance/rest/change/CorsIT.java | 36 +- .../rest/change/CreateChangeIT.java | 158 +- .../rest/change/DeleteDraftPatchSetIT.java | 59 +- .../acceptance/rest/change/DeleteVoteIT.java | 54 +- .../acceptance/rest/change/DraftChangeIT.java | 111 +- .../acceptance/rest/change/HashtagsIT.java | 36 +- .../acceptance/rest/change/IndexChangeIT.java | 9 +- .../rest/change/ListChangesOptionsIT.java | 24 +- .../acceptance/rest/change/MoveChangeIT.java | 93 +- .../rest/change/SubmitByCherryPickIT.java | 210 +- .../rest/change/SubmitByFastForwardIT.java | 59 +- .../rest/change/SubmitByMergeAlwaysIT.java | 43 +- .../change/SubmitByMergeIfNecessaryIT.java | 418 ++-- .../rest/change/SubmitByRebaseAlwaysIT.java | 50 +- .../change/SubmitByRebaseIfNecessaryIT.java | 33 +- .../change/SubmitResolvingMergeCommitIT.java | 188 +- .../rest/change/SuggestReviewersIT.java | 186 +- .../acceptance/rest/change/TopicIT.java | 1 - .../rest/config/CacheOperationsIT.java | 59 +- .../rest/config/ConfirmEmailIT.java | 23 +- .../acceptance/rest/config/FlushCacheIT.java | 31 +- .../acceptance/rest/config/GetCacheIT.java | 13 +- .../acceptance/rest/config/GetTaskIT.java | 18 +- .../acceptance/rest/config/KillTaskIT.java | 19 +- .../acceptance/rest/config/ListCachesIT.java | 24 +- .../acceptance/rest/config/ListTasksIT.java | 10 +- .../acceptance/rest/config/ServerInfoIT.java | 22 +- .../acceptance/rest/group/AddMemberIT.java | 5 +- .../acceptance/rest/group/GroupsIT.java | 1 - .../acceptance/rest/project/AccessIT.java | 210 +- .../acceptance/rest/project/BanCommitIT.java | 29 +- .../rest/project/CheckMergeabilityIT.java | 209 +- .../rest/project/CommitIncludedInIT.java | 25 +- .../rest/project/CreateBranchIT.java | 14 +- .../rest/project/CreateProjectIT.java | 88 +- .../rest/project/DeleteBranchIT.java | 13 +- .../rest/project/DeleteBranchesIT.java | 40 +- .../acceptance/rest/project/DeleteTagIT.java | 18 +- .../acceptance/rest/project/DeleteTagsIT.java | 35 +- .../acceptance/rest/project/FileBranchIT.java | 5 +- .../rest/project/GarbageCollectionIT.java | 8 +- .../rest/project/GetChildProjectIT.java | 14 +- .../acceptance/rest/project/GetCommitIT.java | 34 +- .../acceptance/rest/project/GetProjectIT.java | 1 - .../rest/project/ListBranchesIT.java | 87 +- .../rest/project/ListChildProjectsIT.java | 7 +- .../rest/project/ListProjectsIT.java | 68 +- .../rest/project/ProjectAssert.java | 14 +- .../rest/project/ProjectLevelConfigIT.java | 38 +- .../acceptance/rest/project/PushTagIT.java | 75 +- .../acceptance/rest/project/RefAssert.java | 15 +- .../acceptance/rest/project/SetParentIT.java | 31 +- .../acceptance/rest/project/TagsIT.java | 54 +- .../acceptance/server/change/CommentsIT.java | 401 ++-- .../server/change/ConsistencyCheckerIT.java | 568 ++--- .../server/change/GetRelatedIT.java | 395 ++-- .../server/change/PatchListCacheIT.java | 96 +- .../server/change/SubmittedTogetherIT.java | 136 +- .../server/event/CommentAddedEventIT.java | 91 +- .../gerrit/acceptance/server/mail/MailIT.java | 23 +- .../server/mail/MailMetadataIT.java | 73 +- .../server/mail/MailProcessorIT.java | 228 +- .../server/notedb/ChangeRebuilderIT.java | 461 ++-- .../server/notedb/NoteDbPrimaryIT.java | 117 +- .../server/project/CustomLabelIT.java | 47 +- .../server/project/ProjectWatchIT.java | 109 +- .../acceptance/ssh/AbandonRestoreIT.java | 36 +- .../gerrit/acceptance/ssh/BanCommitIT.java | 21 +- .../acceptance/ssh/CreateProjectIT.java | 27 +- .../acceptance/ssh/GarbageCollectionIT.java | 45 +- .../google/gerrit/acceptance/ssh/QueryIT.java | 50 +- .../acceptance/ssh/UploadArchiveIT.java | 41 +- .../server/query/QueryParseException.java | 4 +- .../server/cache/h2/DefaultCacheFactory.java | 43 +- .../server/cache/h2/H2CacheFactory.java | 75 +- .../gerrit/server/cache/h2/H2CacheImpl.java | 161 +- .../gerrit/server/cache/h2/H2CacheTest.java | 50 +- .../com/google/gerrit/common/FileUtil.java | 19 +- .../java/com/google/gerrit/common/IoUtil.java | 11 +- .../com/google/gerrit/common/Nullable.java | 7 +- .../com/google/gerrit/common/PageLinks.java | 12 +- .../com/google/gerrit/common/PluginData.java | 4 +- .../gerrit/common/ProjectAccessUtil.java | 1 - .../com/google/gerrit/common/ProjectUtil.java | 3 +- .../google/gerrit/common/RawInputUtil.java | 2 - .../gerrit/common/SiteLibraryLoaderUtil.java | 28 +- .../com/google/gerrit/common/TimeUtil.java | 7 +- .../com/google/gerrit/common/audit/Audit.java | 3 +- .../gerrit/common/auth/SignInRequired.java | 10 +- .../gerrit/common/data/AccessSection.java | 13 +- .../gerrit/common/data/AccountInfo.java | 10 +- .../gerrit/common/data/AccountSecurity.java | 5 +- .../gerrit/common/data/AgreementInfo.java | 3 +- .../gerrit/common/data/CommentDetail.java | 20 +- .../common/data/ContributorAgreement.java | 6 +- .../common/data/FilenameComparator.java | 8 +- .../common/data/GarbageCollectionResult.java | 4 +- .../google/gerrit/common/data/GitwebType.java | 8 +- .../gerrit/common/data/GlobalCapability.java | 45 +- .../gerrit/common/data/GroupDescription.java | 26 +- .../gerrit/common/data/GroupDescriptions.java | 7 +- .../gerrit/common/data/GroupDetail.java | 4 +- .../google/gerrit/common/data/GroupInfo.java | 10 +- .../gerrit/common/data/GroupReference.java | 9 +- .../gerrit/common/data/HostPageData.java | 9 +- .../google/gerrit/common/data/LabelType.java | 46 +- .../google/gerrit/common/data/LabelTypes.java | 7 +- .../google/gerrit/common/data/LabelValue.java | 3 +- .../common/data/ParameterizedString.java | 46 +- .../gerrit/common/data/PatchScript.java | 49 +- .../google/gerrit/common/data/Permission.java | 12 +- .../gerrit/common/data/PermissionRange.java | 6 +- .../gerrit/common/data/PermissionRule.java | 26 +- .../gerrit/common/data/ProjectAccess.java | 4 +- .../common/data/ProjectAdminService.java | 20 +- .../gerrit/common/data/RefConfigSection.java | 3 +- .../google/gerrit/common/data/SshHostKey.java | 3 +- .../gerrit/common/data/SubmitRecord.java | 37 +- .../gerrit/common/data/SubmitTypeRecord.java | 15 +- .../gerrit/common/data/SubscribeSection.java | 8 +- .../gerrit/common/data/SystemInfoService.java | 1 - .../errors/UpdateParentFailedException.java | 3 +- .../google/gerrit/common/AutoValueTest.java | 1 - .../common/data/EncodePathSeparatorTest.java | 1 - .../common/data/FilenameComparatorTest.java | 41 +- .../common/data/ParameterizedStringTest.java | 54 +- .../elasticsearch/AbstractElasticIndex.java | 94 +- .../elasticsearch/ElasticAccountIndex.java | 81 +- .../elasticsearch/ElasticChangeIndex.java | 154 +- .../elasticsearch/ElasticGroupIndex.java | 82 +- .../elasticsearch/ElasticIndexModule.java | 12 +- .../gerrit/elasticsearch/ElasticMapping.java | 4 +- .../elasticsearch/ElasticQueryBuilder.java | 42 +- .../ElasticQueryAccountsTest.java | 10 +- .../ElasticQueryChangesTest.java | 11 +- .../elasticsearch/ElasticQueryGroupsTest.java | 10 +- .../elasticsearch/ElasticTestUtils.java | 124 +- .../annotations/CapabilityScope.java | 10 +- .../gerrit/extensions/annotations/Export.java | 16 +- .../extensions/annotations/Exports.java | 3 +- .../annotations/ExtensionPoint.java | 16 +- .../gerrit/extensions/annotations/Listen.java | 14 +- .../annotations/PluginCanonicalWebUrl.java | 10 +- .../extensions/annotations/PluginData.java | 18 +- .../extensions/annotations/PluginName.java | 10 +- .../annotations/RequiresAnyCapability.java | 6 +- .../annotations/RequiresCapability.java | 5 +- .../extensions/annotations/RootRelative.java | 14 +- .../gerrit/extensions/api/GerritApi.java | 10 +- .../api/access/ProjectAccessInfo.java | 1 - .../extensions/api/accounts/AccountApi.java | 47 +- .../extensions/api/accounts/AccountInput.java | 4 +- .../extensions/api/accounts/Accounts.java | 74 +- .../extensions/api/accounts/EmailInput.java | 3 +- .../extensions/api/accounts/GpgKeyApi.java | 5 +- .../extensions/api/changes/AbandonInput.java | 5 +- .../extensions/api/changes/ActionVisitor.java | 45 +- .../api/changes/AddReviewerInput.java | 6 +- .../api/changes/AddReviewerResult.java | 41 +- .../extensions/api/changes/AssigneeInput.java | 3 +- .../extensions/api/changes/ChangeApi.java | 99 +- .../extensions/api/changes/ChangeEditApi.java | 106 +- .../extensions/api/changes/Changes.java | 30 +- .../extensions/api/changes/CommentApi.java | 6 +- .../api/changes/DeleteReviewerInput.java | 1 + .../api/changes/DeleteVoteInput.java | 5 +- .../extensions/api/changes/DraftApi.java | 10 +- .../extensions/api/changes/DraftInput.java | 1 - .../extensions/api/changes/FileApi.java | 23 +- .../extensions/api/changes/HashtagsInput.java | 7 +- .../api/changes/IncludedInInfo.java | 7 +- .../api/changes/NotifyHandling.java | 5 +- .../api/changes/PublishChangeEditInput.java | 3 +- .../extensions/api/changes/RecipientType.java | 4 +- .../extensions/api/changes/RestoreInput.java | 4 +- .../extensions/api/changes/RevertInput.java | 3 +- .../extensions/api/changes/ReviewInput.java | 55 +- .../extensions/api/changes/ReviewResult.java | 21 +- .../extensions/api/changes/ReviewerApi.java | 11 +- .../extensions/api/changes/ReviewerInfo.java | 13 +- .../extensions/api/changes/RevisionApi.java | 35 +- .../api/changes/RevisionReviewerApi.java | 7 +- .../api/changes/RobotCommentApi.java | 7 +- .../extensions/api/changes/StarsInput.java | 3 +- .../extensions/api/changes/SubmitInput.java | 3 +- .../api/changes/SubmittedTogetherInfo.java | 1 - .../gerrit/extensions/api/config/Config.java | 10 +- .../gerrit/extensions/api/config/Server.java | 25 +- .../extensions/api/groups/GroupApi.java | 29 +- .../gerrit/extensions/api/groups/Groups.java | 51 +- .../extensions/api/projects/BranchApi.java | 10 +- .../extensions/api/projects/BranchInfo.java | 1 - .../extensions/api/projects/BranchInput.java | 3 +- .../api/projects/ChildProjectApi.java | 7 +- .../extensions/api/projects/ConfigInfo.java | 1 - .../extensions/api/projects/ConfigInput.java | 1 - .../api/projects/DeleteBranchesInput.java | 2 +- .../api/projects/DescriptionInput.java | 3 +- .../extensions/api/projects/ProjectApi.java | 29 +- .../api/projects/ProjectConfigEntryType.java | 7 +- .../extensions/api/projects/ProjectInput.java | 1 - .../extensions/api/projects/Projects.java | 26 +- .../extensions/api/projects/TagApi.java | 6 +- .../extensions/api/projects/TagInfo.java | 3 +- .../extensions/api/projects/TagInput.java | 3 +- .../auth/oauth/OAuthLoginProvider.java | 18 +- .../auth/oauth/OAuthServiceProvider.java | 12 +- .../extensions/auth/oauth/OAuthToken.java | 11 +- .../extensions/auth/oauth/OAuthUserInfo.java | 3 +- .../extensions/client/AccountFieldName.java | 6 +- .../gerrit/extensions/client/AuthType.java | 62 +- .../extensions/client/ChangeStatus.java | 48 +- .../gerrit/extensions/client/Comment.java | 23 +- .../client/DiffPreferencesInfo.java | 3 +- .../client/GeneralPreferencesInfo.java | 7 +- .../extensions/client/GerritTopMenu.java | 7 +- .../extensions/client/ProjectWatchInfo.java | 14 +- .../common/AccountExternalIdInfo.java | 6 +- .../extensions/common/AgreementInput.java | 3 +- .../gerrit/extensions/common/AuthInfo.java | 3 +- .../gerrit/extensions/common/AvatarInfo.java | 6 +- .../extensions/common/ChangeConfigInfo.java | 2 +- .../gerrit/extensions/common/ChangeInfo.java | 1 - .../gerrit/extensions/common/ChangeInput.java | 2 +- .../gerrit/extensions/common/CommentInfo.java | 4 +- .../extensions/common/DiffWebLinkInfo.java | 20 +- .../extensions/common/DownloadInfo.java | 2 +- .../extensions/common/DownloadSchemeInfo.java | 2 +- .../gerrit/extensions/common/GerritInfo.java | 1 - .../gerrit/extensions/common/GpgKeyInfo.java | 13 +- .../common/GroupAuditEventInfo.java | 24 +- .../gerrit/extensions/common/MergeInput.java | 3 +- .../extensions/common/MergeableInfo.java | 1 - .../extensions/common/PluginConfigInfo.java | 2 +- .../gerrit/extensions/common/ProblemInfo.java | 9 +- .../gerrit/extensions/common/ProjectInfo.java | 1 - .../gerrit/extensions/common/ReceiveInfo.java | 2 +- .../extensions/common/ReviewerUpdateInfo.java | 1 - .../extensions/common/RevisionInfo.java | 1 - .../gerrit/extensions/common/ServerInfo.java | 2 +- .../gerrit/extensions/common/SshdInfo.java | 3 +- .../gerrit/extensions/common/SuggestInfo.java | 2 +- .../common/SuggestedReviewerInfo.java | 2 +- .../common/TestSubmitRuleInput.java | 6 +- .../extensions/common/UserConfigInfo.java | 2 +- .../extensions/config/CloneCommand.java | 3 +- .../extensions/config/DownloadCommand.java | 9 +- .../extensions/config/ExternalIncludedIn.java | 18 +- .../extensions/config/FactoryModule.java | 11 +- .../events/AgreementSignupListener.java | 1 + .../events/AssigneeChangedListener.java | 3 +- .../gerrit/extensions/events/ChangeEvent.java | 3 +- .../events/CommentAddedListener.java | 3 +- .../events/DraftPublishedListener.java | 3 +- .../events/GarbageCollectorListener.java | 8 +- .../events/GitReferenceUpdatedListener.java | 12 +- .../events/HashtagsEditedListener.java | 3 +- .../events/HeadUpdatedListener.java | 1 + .../extensions/events/LifecycleListener.java | 1 - .../events/NewProjectCreatedListener.java | 1 - .../events/PluginEventListener.java | 2 + .../events/ProjectDeletedListener.java | 3 +- .../events/ReviewerAddedListener.java | 1 - .../events/ReviewerDeletedListener.java | 4 +- .../events/RevisionCreatedListener.java | 3 +- .../extensions/events/RevisionEvent.java | 1 - .../events/UsageDataPublishedListener.java | 7 +- .../events/VoteDeletedListener.java | 4 +- .../extensions/registration/DynamicItem.java | 75 +- .../registration/DynamicItemProvider.java | 13 +- .../extensions/registration/DynamicMap.java | 55 +- .../registration/DynamicMapProvider.java | 7 +- .../extensions/registration/DynamicSet.java | 59 +- .../registration/DynamicSetProvider.java | 8 +- .../PrivateInternals_DynamicMapImpl.java | 22 +- .../PrivateInternals_DynamicTypes.java | 23 +- .../extensions/restapi/AcceptsCreate.java | 10 +- .../extensions/restapi/AcceptsDelete.java | 10 +- .../extensions/restapi/AcceptsPost.java | 15 +- .../extensions/restapi/BinaryResult.java | 49 +- .../extensions/restapi/CacheControl.java | 4 +- .../extensions/restapi/ChildCollection.java | 4 +- .../extensions/restapi/DefaultInput.java | 3 +- .../gerrit/extensions/restapi/ETagView.java | 4 +- .../gerrit/extensions/restapi/IdString.java | 4 +- .../restapi/MergeConflictException.java | 4 +- .../extensions/restapi/NeedsParams.java | 5 +- .../restapi/PreconditionFailedException.java | 7 +- .../gerrit/extensions/restapi/RawInput.java | 2 + .../restapi/ResourceConflictException.java | 10 +- .../restapi/ResourceNotFoundException.java | 3 +- .../gerrit/extensions/restapi/Response.java | 17 +- .../extensions/restapi/RestApiException.java | 3 +- .../extensions/restapi/RestApiModule.java | 78 +- .../extensions/restapi/RestCollection.java | 35 +- .../extensions/restapi/RestModifyView.java | 29 +- .../extensions/restapi/RestReadView.java | 21 +- .../extensions/restapi/RestResource.java | 11 +- .../gerrit/extensions/restapi/RestView.java | 7 +- .../extensions/restapi/TopLevelResource.java | 3 +- .../restapi/UnprocessableEntityException.java | 2 +- .../google/gerrit/extensions/restapi/Url.java | 22 +- .../systemstatus/MessageOfTheDay.java | 14 +- .../systemstatus/ServerInformation.java | 13 +- .../extensions/webui/BranchWebLink.java | 16 +- .../gerrit/extensions/webui/DiffWebLink.java | 32 +- .../extensions/webui/FileHistoryWebLink.java | 18 +- .../gerrit/extensions/webui/FileWebLink.java | 16 +- .../gerrit/extensions/webui/GwtPlugin.java | 4 +- .../extensions/webui/JavaScriptPlugin.java | 4 +- .../extensions/webui/ParentWebLink.java | 17 +- .../extensions/webui/PatchSetWebLink.java | 17 +- .../PrivateInternals_UiActionDescription.java | 7 +- .../extensions/webui/ProjectWebLink.java | 16 +- .../gerrit/extensions/webui/TopMenu.java | 1 - .../gerrit/extensions/webui/UiAction.java | 16 +- .../gerrit/extensions/webui/UiResult.java | 3 +- .../gerrit/extensions/webui/WebLink.java | 27 +- .../gerrit/extensions/webui/WebUiPlugin.java | 10 +- .../gerrit/extensions/client/RangeTest.java | 5 +- .../registration/DynamicSetTest.java | 1 - .../google/gerrit/gpg/BouncyCastleUtil.java | 28 +- .../com/google/gerrit/gpg/CheckResult.java | 19 +- .../com/google/gerrit/gpg/Fingerprint.java | 40 +- .../gerrit/gpg/GerritPublicKeyChecker.java | 82 +- .../gpg/GerritPushCertificateChecker.java | 4 +- .../java/com/google/gerrit/gpg/GpgModule.java | 10 +- .../google/gerrit/gpg/PublicKeyChecker.java | 179 +- .../com/google/gerrit/gpg/PublicKeyStore.java | 155 +- .../gerrit/gpg/PushCertificateChecker.java | 72 +- .../google/gerrit/gpg/SignedPushModule.java | 35 +- .../gerrit/gpg/SignedPushPreReceiveHook.java | 33 +- .../gerrit/gpg/api/GpgApiAdapterImpl.java | 23 +- .../google/gerrit/gpg/api/GpgApiModule.java | 8 +- .../google/gerrit/gpg/api/GpgKeyApiImpl.java | 9 +- .../gerrit/gpg/server/DeleteGpgKey.java | 27 +- .../com/google/gerrit/gpg/server/GpgKey.java | 1 - .../com/google/gerrit/gpg/server/GpgKeys.java | 59 +- .../google/gerrit/gpg/server/PostGpgKeys.java | 107 +- .../gpg/GerritPublicKeyCheckerTest.java | 209 +- .../gerrit/gpg/PublicKeyCheckerTest.java | 109 +- .../google/gerrit/gpg/PublicKeyStoreTest.java | 64 +- .../gpg/PushCertificateCheckerTest.java | 98 +- .../google/gerrit/gpg/testutil/TestKey.java | 20 +- .../google/gerrit/gpg/testutil/TestKeys.java | 1758 +++++++-------- .../gerrit/gpg/testutil/TestTrustKeys.java | 1894 ++++++++--------- .../gwtdebug/GerritGwtDebugLauncher.java | 14 +- .../gwtexpui/clippy/client/ClippyCss.java | 2 + .../gwtexpui/clippy/client/CopyableLabel.java | 157 +- .../clippy/client/CopyableLabelText.java | 2 + .../google/gwtexpui/css/rebind/CssLinker.java | 16 +- .../gwtexpui/globalkey/client/DocWidget.java | 3 +- .../gwtexpui/globalkey/client/GlobalKey.java | 91 +- .../gwtexpui/globalkey/client/KeyCommand.java | 5 +- .../globalkey/client/KeyCommandSet.java | 8 +- .../globalkey/client/KeyConstants.java | 12 + .../gwtexpui/globalkey/client/KeyCss.java | 8 + .../globalkey/client/KeyHelpPopup.java | 54 +- .../globalkey/client/ShowHelpCommand.java | 34 +- .../gwtexpui/linker/server/UserAgentRule.java | 14 +- .../gwtexpui/progress/client/ProgressBar.java | 8 +- .../gwtexpui/progress/client/ProgressCss.java | 2 + .../gwtexpui/safehtml/client/AttMap.java | 4 +- .../gwtexpui/safehtml/client/FindReplace.java | 14 +- .../client/HighlightSuggestOracle.java | 67 +- .../safehtml/client/LinkFindReplace.java | 25 +- .../safehtml/client/RawFindReplace.java | 11 +- .../gwtexpui/safehtml/client/SafeHtml.java | 114 +- .../safehtml/client/SafeHtmlBuilder.java | 36 +- .../gwtexpui/safehtml/client/SafeHtmlCss.java | 2 + .../gwtexpui/server/CacheControlFilter.java | 30 +- .../google/gwtexpui/server/CacheHeaders.java | 80 +- .../user/client/AutoCenterDialogBox.java | 24 +- .../google/gwtexpui/user/client/Tooltip.java | 5 +- .../gwtexpui/user/client/UserAgent.java | 64 +- .../com/google/gwtexpui/user/client/View.java | 12 +- .../google/gwtexpui/user/client/ViewSite.java | 23 +- .../safehtml/client/LinkFindReplaceTest.java | 17 +- .../safehtml/client/SafeHtmlBuilderTest.java | 18 +- .../safehtml/client/SafeHtml_LinkifyTest.java | 63 +- .../safehtml/client/SafeHtml_ReplaceTest.java | 52 +- .../client/SafeHtml_WikifyListTest.java | 96 +- .../client/SafeHtml_WikifyPreformatTest.java | 49 +- .../client/SafeHtml_WikifyQuoteTest.java | 10 +- .../safehtml/client/SafeHtml_WikifyTest.java | 35 +- .../gerrit/client/AccountFormatter.java | 19 +- .../google/gerrit/client/CommonConstants.java | 10 + .../google/gerrit/client/CommonMessages.java | 11 +- .../google/gerrit/client/DateFormatter.java | 1 - .../gerrit/client/GerritUiExtensionPoint.java | 8 +- .../gerrit/client/RelativeDateFormatter.java | 8 +- .../com/google/gerrit/client/Resources.java | 17 +- .../gerrit/client/info/AccountInfo.java | 37 +- .../google/gerrit/client/info/ActionInfo.java | 7 +- .../gerrit/client/info/AgreementInfo.java | 6 +- .../google/gerrit/client/info/AuthInfo.java | 52 +- .../google/gerrit/client/info/ChangeInfo.java | 178 +- .../gerrit/client/info/DownloadInfo.java | 25 +- .../google/gerrit/client/info/FileInfo.java | 20 +- .../client/info/GeneralPreferences.java | 125 +- .../google/gerrit/client/info/GerritInfo.java | 11 +- .../google/gerrit/client/info/GpgKeyInfo.java | 15 +- .../gerrit/client/info/GroupBaseInfo.java | 4 +- .../google/gerrit/client/info/GroupInfo.java | 19 +- .../gerrit/client/info/OAuthTokenInfo.java | 9 +- .../client/info/PushCertificateInfo.java | 4 +- .../google/gerrit/client/info/ServerInfo.java | 42 +- .../google/gerrit/client/info/TopMenu.java | 3 +- .../gerrit/client/info/TopMenuItem.java | 7 +- .../gerrit/client/info/TopMenuList.java | 3 +- .../gerrit/client/info/WebLinkInfo.java | 6 +- .../google/gerrit/client/rpc/NativeMap.java | 28 +- .../gerrit/client/rpc/NativeString.java | 11 +- .../com/google/gerrit/client/rpc/Natives.java | 11 +- .../gerrit/client/ui/HighlightSuggestion.java | 2 +- .../gerrit/client/ui/RemoteSuggestOracle.java | 42 +- .../client/RelativeDateFormatterTest.java | 6 +- .../client/ui/HighlightSuggestionTest.java | 4 +- .../com/google/gerrit/client/AvatarImage.java | 87 +- .../gerrit/client/ConfirmationCallback.java | 14 +- .../gerrit/client/ConfirmationDialog.java | 36 +- .../com/google/gerrit/client/DiffObject.java | 67 +- .../google/gerrit/client/DiffWebLinkInfo.java | 7 +- .../com/google/gerrit/client/Dispatcher.java | 672 +++--- .../com/google/gerrit/client/ErrorDialog.java | 36 +- .../com/google/gerrit/client/FormatUtil.java | 24 +- .../java/com/google/gerrit/client/Gerrit.java | 636 +++--- .../google/gerrit/client/GerritConstants.java | 60 + .../com/google/gerrit/client/GerritCss.java | 139 ++ .../google/gerrit/client/GerritMessages.java | 10 + .../com/google/gerrit/client/JumpKeys.java | 107 +- .../gerrit/client/MessageOfTheDayBar.java | 2 +- .../gerrit/client/NotSignedInDialog.java | 36 +- .../com/google/gerrit/client/RangeInfo.java | 3 +- .../com/google/gerrit/client/SearchPanel.java | 60 +- .../gerrit/client/SearchSuggestOracle.java | 106 +- .../google/gerrit/client/StringListPanel.java | 106 +- .../java/com/google/gerrit/client/Themer.java | 9 +- .../google/gerrit/client/UrlAliasMatcher.java | 1 - .../google/gerrit/client/UserPopupPanel.java | 13 +- .../com/google/gerrit/client/VoidResult.java | 3 +- .../gerrit/client/access/AccessMap.java | 32 +- .../client/access/ProjectAccessInfo.java | 5 +- .../gerrit/client/account/AccountApi.java | 131 +- .../client/account/AccountCapabilities.java | 12 +- .../client/account/AccountConstants.java | 119 ++ .../client/account/AccountMessages.java | 3 + .../client/account/ContactPanelShort.java | 321 +-- .../client/account/DiffPreferences.java | 67 +- .../client/account/EditPreferences.java | 40 +- .../gerrit/client/account/EmailInfo.java | 10 +- .../client/account/MyAgreementsScreen.java | 14 +- .../account/MyContactInformationScreen.java | 13 +- .../client/account/MyGpgKeysScreen.java | 100 +- .../gerrit/client/account/MyGroupsScreen.java | 15 +- .../client/account/MyIdentitiesScreen.java | 75 +- .../client/account/MyOAuthTokenScreen.java | 79 +- .../client/account/MyPasswordScreen.java | 102 +- .../client/account/MyPreferencesScreen.java | 210 +- .../client/account/MyProfileScreen.java | 27 +- .../client/account/MySshKeysScreen.java | 13 +- .../account/MyWatchedProjectsScreen.java | 141 +- .../gerrit/client/account/MyWatchesTable.java | 61 +- .../client/account/NewAgreementScreen.java | 95 +- .../client/account/ProjectWatchInfo.java | 42 +- .../gerrit/client/account/RegisterScreen.java | 42 +- .../gerrit/client/account/SettingsScreen.java | 13 +- .../gerrit/client/account/SshKeyInfo.java | 8 +- .../gerrit/client/account/SshPanel.java | 211 +- .../gerrit/client/account/UsernameField.java | 87 +- .../client/account/ValidateEmailScreen.java | 6 +- .../gerrit/client/actions/ActionButton.java | 19 +- .../client/admin/AccessSectionEditor.java | 85 +- .../admin/AccountGroupAuditLogScreen.java | 12 +- .../client/admin/AccountGroupInfoScreen.java | 141 +- .../admin/AccountGroupMembersScreen.java | 152 +- .../client/admin/AccountGroupScreen.java | 30 +- .../gerrit/client/admin/AdminConstants.java | 107 +- .../google/gerrit/client/admin/AdminCss.java | 2 + .../gerrit/client/admin/AdminMessages.java | 9 + .../gerrit/client/admin/AdminResources.java | 9 +- .../client/admin/CreateChangeAction.java | 36 +- .../client/admin/CreateGroupScreen.java | 110 +- .../client/admin/CreateProjectScreen.java | 210 +- .../gerrit/client/admin/EditConfigAction.java | 13 +- .../gerrit/client/admin/GroupListScreen.java | 40 +- .../client/admin/GroupReferenceBox.java | 43 +- .../gerrit/client/admin/GroupTable.java | 48 +- .../client/admin/PaginatedProjectScreen.java | 3 +- .../gerrit/client/admin/PermissionEditor.java | 101 +- .../client/admin/PermissionNameRenderer.java | 1 - .../client/admin/PermissionRuleEditor.java | 91 +- .../gerrit/client/admin/PluginListScreen.java | 21 +- .../client/admin/ProjectAccessEditor.java | 36 +- .../client/admin/ProjectAccessScreen.java | 96 +- .../client/admin/ProjectBranchesScreen.java | 298 +-- .../client/admin/ProjectDashboardsScreen.java | 13 +- .../client/admin/ProjectInfoScreen.java | 206 +- .../client/admin/ProjectListScreen.java | 173 +- .../client/admin/ProjectTagsScreen.java | 35 +- .../google/gerrit/client/admin/RangeBox.java | 7 +- .../gerrit/client/admin/RefPatternBox.java | 112 +- .../gerrit/client/admin/ValueEditor.java | 20 +- .../gerrit/client/api/ActionContext.java | 40 +- .../com/google/gerrit/client/api/ApiGlue.java | 11 +- .../google/gerrit/client/api/ChangeGlue.java | 13 +- .../gerrit/client/api/DefaultActions.java | 12 +- .../google/gerrit/client/api/EditGlue.java | 12 +- .../gerrit/client/api/ExtensionPanel.java | 41 +- .../gerrit/client/api/ExtensionScreen.java | 28 +- .../client/api/ExtensionSettingsScreen.java | 29 +- .../gerrit/client/api/HtmlTemplate.java | 28 +- .../com/google/gerrit/client/api/Plugin.java | 10 +- .../gerrit/client/api/PluginLoader.java | 72 +- .../google/gerrit/client/api/PluginName.java | 18 +- .../google/gerrit/client/api/PopupHelper.java | 19 +- .../google/gerrit/client/api/ProjectGlue.java | 17 +- .../gerrit/client/api/RevisionGlue.java | 13 +- .../client/auth/openid/OpenIdConstants.java | 2 + .../google/gerrit/client/blame/BlameInfo.java | 8 +- .../gerrit/client/change/AbandonAction.java | 17 +- .../client/change/ActionMessageBox.java | 18 +- .../google/gerrit/client/change/Actions.java | 24 +- .../gerrit/client/change/AddFileAction.java | 25 +- .../gerrit/client/change/AddFileBox.java | 33 +- .../google/gerrit/client/change/Assignee.java | 101 +- .../client/change/AssigneeSuggestOracle.java | 5 +- .../gerrit/client/change/ChangeConstants.java | 27 + .../gerrit/client/change/ChangeMessages.java | 13 + .../gerrit/client/change/ChangeScreen.java | 788 +++---- .../client/change/CherryPickAction.java | 17 +- .../gerrit/client/change/CommitBox.java | 39 +- .../client/change/DeleteFileAction.java | 21 +- .../gerrit/client/change/DeleteFileBox.java | 34 +- .../gerrit/client/change/DownloadAction.java | 6 +- .../gerrit/client/change/DownloadBox.java | 149 +- .../gerrit/client/change/DraftActions.java | 3 +- .../gerrit/client/change/FileComments.java | 8 +- .../gerrit/client/change/FileTable.java | 228 +- .../gerrit/client/change/FollowUpAction.java | 7 +- .../google/gerrit/client/change/Hashtags.java | 96 +- .../google/gerrit/client/change/History.java | 4 +- .../client/change/IncludedInAction.java | 5 +- .../gerrit/client/change/IncludedInBox.java | 38 +- .../google/gerrit/client/change/Labels.java | 105 +- .../gerrit/client/change/LineComment.java | 14 +- .../gerrit/client/change/LocalComments.java | 44 +- .../google/gerrit/client/change/Message.java | 32 +- .../gerrit/client/change/PatchSetsBox.java | 83 +- .../client/change/PathSuggestOracle.java | 38 +- .../gerrit/client/change/QuickApprove.java | 16 +- .../gerrit/client/change/RebaseAction.java | 39 +- .../gerrit/client/change/RelatedChanges.java | 144 +- .../client/change/RelatedChangesTab.java | 38 +- .../client/change/RenameFileAction.java | 21 +- .../gerrit/client/change/RenameFileBox.java | 23 +- .../gerrit/client/change/ReplyAction.java | 39 +- .../google/gerrit/client/change/ReplyBox.java | 188 +- .../gerrit/client/change/Resources.java | 6 +- .../gerrit/client/change/RestoreAction.java | 17 +- .../gerrit/client/change/RevertAction.java | 17 +- .../client/change/ReviewerSuggestOracle.java | 47 +- .../gerrit/client/change/Reviewers.java | 152 +- .../client/change/RightSidePopdownAction.java | 51 +- .../google/gerrit/client/change/StarIcon.java | 4 +- .../gerrit/client/change/SubmitAction.java | 39 +- .../client/change/SubmitFailureDialog.java | 3 +- .../google/gerrit/client/change/Topic.java | 19 +- .../client/change/UpdateAvailableBar.java | 3 +- .../client/change/UpdateCheckTimer.java | 55 +- .../gerrit/client/change/VotableInfo.java | 1 - .../changes/AccountDashboardScreen.java | 46 +- .../gerrit/client/changes/ChangeApi.java | 96 +- .../client/changes/ChangeConstants.java | 58 + .../gerrit/client/changes/ChangeEditApi.java | 20 +- .../gerrit/client/changes/ChangeList.java | 40 +- .../client/changes/ChangeListScreen.java | 3 +- .../gerrit/client/changes/ChangeMessages.java | 18 +- .../gerrit/client/changes/ChangeTable.java | 98 +- .../gerrit/client/changes/CommentApi.java | 27 +- .../gerrit/client/changes/CommentInfo.java | 39 +- .../client/changes/CustomDashboardScreen.java | 15 +- .../gerrit/client/changes/DashboardTable.java | 17 +- .../client/changes/PagedSingleListScreen.java | 32 +- .../changes/ProjectDashboardScreen.java | 15 +- .../gerrit/client/changes/QueryScreen.java | 12 +- .../gerrit/client/changes/ReviewInfo.java | 3 +- .../gerrit/client/changes/ReviewInput.java | 20 +- .../client/changes/RevisionInfoCache.java | 18 +- .../gerrit/client/changes/StarredChanges.java | 88 +- .../gerrit/client/changes/SubmitInfo.java | 3 +- .../google/gerrit/client/changes/Util.java | 28 +- .../gerrit/client/config/CapabilityInfo.java | 4 +- .../gerrit/client/config/ConfigServerApi.java | 8 +- .../client/dashboards/DashboardConstants.java | 5 + .../client/dashboards/DashboardInfo.java | 12 +- .../client/dashboards/DashboardList.java | 13 +- .../client/dashboards/DashboardsTable.java | 31 +- .../gerrit/client/diff/ChunkManager.java | 49 +- .../google/gerrit/client/diff/CommentBox.java | 73 +- .../gerrit/client/diff/CommentGroup.java | 18 +- .../gerrit/client/diff/CommentManager.java | 86 +- .../gerrit/client/diff/CommentRange.java | 7 +- .../client/diff/CommentsCollections.java | 49 +- .../google/gerrit/client/diff/DiffApi.java | 11 +- .../google/gerrit/client/diff/DiffInfo.java | 50 +- .../google/gerrit/client/diff/DiffScreen.java | 792 +++---- .../google/gerrit/client/diff/DiffTable.java | 59 +- .../google/gerrit/client/diff/Direction.java | 3 +- .../gerrit/client/diff/DisplaySide.java | 3 +- .../google/gerrit/client/diff/DraftBox.java | 220 +- .../gerrit/client/diff/EditIterator.java | 5 +- .../com/google/gerrit/client/diff/Header.java | 125 +- .../client/diff/InsertCommentBubble.java | 22 +- .../google/gerrit/client/diff/LineMapper.java | 55 +- .../gerrit/client/diff/NoOpKeyCommand.java | 3 +- .../gerrit/client/diff/PatchSetSelectBox.java | 108 +- .../gerrit/client/diff/PreferencesAction.java | 30 +- .../gerrit/client/diff/PreferencesBox.java | 233 +- .../gerrit/client/diff/PublishedBox.java | 26 +- .../google/gerrit/client/diff/Resources.java | 27 +- .../client/diff/ScrollSynchronizer.java | 22 +- .../google/gerrit/client/diff/Scrollbar.java | 10 +- .../client/diff/ScrollbarAnnotation.java | 20 +- .../google/gerrit/client/diff/SideBySide.java | 262 +-- .../client/diff/SideBySideChunkManager.java | 82 +- .../client/diff/SideBySideCommentGroup.java | 75 +- .../client/diff/SideBySideCommentManager.java | 38 +- .../gerrit/client/diff/SideBySideTable.java | 12 +- .../google/gerrit/client/diff/SkipBar.java | 79 +- .../gerrit/client/diff/SkipManager.java | 26 +- .../google/gerrit/client/diff/Unified.java | 214 +- .../client/diff/UnifiedChunkManager.java | 113 +- .../client/diff/UnifiedCommentGroup.java | 54 +- .../client/diff/UnifiedCommentManager.java | 80 +- .../client/diff/UnifiedDiffChunkInfo.java | 3 +- .../gerrit/client/diff/UnifiedTable.java | 21 +- .../gerrit/client/diff/UpToChangeCommand.java | 4 +- .../client/documentation/DocConstants.java | 2 + .../gerrit/client/documentation/DocInfo.java | 4 +- .../client/documentation/DocMessages.java | 1 + .../gerrit/client/documentation/DocTable.java | 25 +- .../client/download/DownloadCommandLink.java | 3 +- .../client/download/DownloadCommandPanel.java | 3 +- .../gerrit/client/download/DownloadPanel.java | 4 +- .../client/download/DownloadUrlLink.java | 24 +- .../client/download/DownloadUrlPanel.java | 3 +- .../gerrit/client/editor/EditConstants.java | 1 + .../gerrit/client/editor/EditFileInfo.java | 3 +- .../client/editor/EditPreferencesAction.java | 30 +- .../client/editor/EditPreferencesBox.java | 22 +- .../gerrit/client/editor/EditScreen.java | 486 +++-- .../google/gerrit/client/groups/GroupApi.java | 98 +- .../client/groups/GroupAuditEventInfo.java | 12 +- .../gerrit/client/groups/GroupList.java | 6 +- .../google/gerrit/client/groups/GroupMap.java | 10 +- .../gerrit/client/patches/PatchConstants.java | 27 + .../gerrit/client/patches/PatchMessages.java | 3 + .../gerrit/client/plugins/PluginInfo.java | 6 +- .../gerrit/client/plugins/PluginMap.java | 7 +- .../gerrit/client/projects/BranchInfo.java | 5 +- .../gerrit/client/projects/ConfigInfo.java | 121 +- .../client/projects/ConfigInfoCache.java | 62 +- .../gerrit/client/projects/ProjectApi.java | 176 +- .../gerrit/client/projects/ProjectInfo.java | 9 +- .../gerrit/client/projects/ProjectMap.java | 3 +- .../gerrit/client/projects/RefInfo.java | 4 +- .../gerrit/client/projects/TagInfo.java | 3 +- .../gerrit/client/projects/ThemeInfo.java | 5 +- .../gerrit/client/rpc/CallbackGroup.java | 44 +- .../gerrit/client/rpc/GerritCallback.java | 15 +- .../gerrit/client/rpc/HttpCallback.java | 1 + .../gerrit/client/rpc/HttpResponse.java | 2 +- .../com/google/gerrit/client/rpc/RestApi.java | 117 +- .../gerrit/client/rpc/RpcConstants.java | 1 + .../gerrit/client/rpc/ScreenLoadCallback.java | 3 +- .../client/ui/AccountGroupSuggestOracle.java | 4 +- .../gerrit/client/ui/AccountLinkPanel.java | 14 +- .../client/ui/AccountSuggestOracle.java | 12 +- .../google/gerrit/client/ui/AddMemberBox.java | 17 +- .../google/gerrit/client/ui/BranchLink.java | 18 +- .../gerrit/client/ui/CherryPickDialog.java | 33 +- .../client/ui/CommentLinkProcessor.java | 10 +- .../client/ui/CommentedActionDialog.java | 30 +- .../client/ui/ComplexDisclosurePanel.java | 47 +- .../gerrit/client/ui/CreateChangeDialog.java | 33 +- .../gerrit/client/ui/FancyFlexTable.java | 44 +- .../gerrit/client/ui/FancyFlexTableImpl.java | 2 +- .../client/ui/FancyFlexTableImplIE8.java | 5 +- .../ui/HighlightingInlineHyperlink.java | 5 +- .../client/ui/HighlightingProjectsTable.java | 3 +- .../google/gerrit/client/ui/HintTextBox.java | 81 +- .../google/gerrit/client/ui/Hyperlink.java | 7 +- .../gerrit/client/ui/InlineHyperlink.java | 6 +- .../google/gerrit/client/ui/LinkMenuBar.java | 3 +- .../google/gerrit/client/ui/MenuScreen.java | 3 +- .../gerrit/client/ui/MorphingTabPanel.java | 26 +- .../gerrit/client/ui/NavigationTable.java | 57 +- .../google/gerrit/client/ui/NpIntTextBox.java | 36 +- .../gerrit/client/ui/OnEditEnabler.java | 79 +- .../gerrit/client/ui/ParentProjectBox.java | 54 +- .../gerrit/client/ui/ProjectLinkMenuItem.java | 2 +- .../gerrit/client/ui/ProjectListPopup.java | 102 +- .../client/ui/ProjectNameSuggestOracle.java | 4 +- .../gerrit/client/ui/ProjectSearchLink.java | 3 +- .../gerrit/client/ui/ProjectsTable.java | 18 +- .../google/gerrit/client/ui/RebaseDialog.java | 109 +- .../gerrit/client/ui/RemoteSuggestBox.java | 80 +- .../com/google/gerrit/client/ui/Screen.java | 29 +- .../ui/SuggestAfterTypingNCharsOracle.java | 10 +- .../google/gerrit/client/ui/UIConstants.java | 8 + .../google/gerrit/client/ui/UIMessages.java | 2 + .../gerrit/client/ui/UserActivityMonitor.java | 22 +- .../com/google/gerrit/client/ui/Util.java | 3 +- .../net/codemirror/addon/AddonInjector.java | 41 +- .../java/net/codemirror/addon/Addons.java | 4 +- .../java/net/codemirror/lib/BlameConfig.java | 4 +- .../java/net/codemirror/lib/CodeMirror.java | 76 +- .../net/codemirror/lib/CodeMirrorDoc.java | 6 +- .../net/codemirror/lib/Configuration.java | 13 +- .../main/java/net/codemirror/lib/Extras.java | 30 +- .../main/java/net/codemirror/lib/KeyMap.java | 3 +- .../java/net/codemirror/lib/LineWidget.java | 4 +- .../java/net/codemirror/lib/LintLine.java | 39 +- .../main/java/net/codemirror/lib/Loader.java | 88 +- .../java/net/codemirror/lib/MergeView.java | 3 +- .../src/main/java/net/codemirror/lib/Pos.java | 5 +- .../main/java/net/codemirror/lib/Rect.java | 6 +- .../java/net/codemirror/lib/ScrollInfo.java | 12 +- .../java/net/codemirror/lib/TextMarker.java | 19 +- .../src/main/java/net/codemirror/lib/Vim.java | 15 +- .../java/net/codemirror/mode/ModeInfo.java | 267 ++- .../net/codemirror/mode/ModeInjector.java | 50 +- .../main/java/net/codemirror/mode/Modes.java | 604 ++++-- .../net/codemirror/theme/ThemeLoader.java | 120 +- .../java/net/codemirror/theme/Themes.java | 183 +- .../gerrit/client/diff/LineMapperTest.java | 43 +- .../httpd/AdvertisedObjectsCacheKey.java | 1 + .../google/gerrit/httpd/AllRequestFilter.java | 27 +- .../gerrit/httpd/CacheBasedWebSession.java | 11 +- .../google/gerrit/httpd/CanonicalWebUrl.java | 5 +- .../gerrit/httpd/ContainerAuthFilter.java | 41 +- .../com/google/gerrit/httpd/CookieBase64.java | 14 +- .../gerrit/httpd/DirectChangeByCommit.java | 17 +- .../google/gerrit/httpd/GetUserFilter.java | 19 +- .../gerrit/httpd/GitOverHttpModule.java | 4 +- .../gerrit/httpd/GitOverHttpServlet.java | 141 +- .../gerrit/httpd/H2CacheBasedWebSession.java | 16 +- .../com/google/gerrit/httpd/HtmlDomUtil.java | 28 +- .../httpd/HttpCanonicalWebUrlProvider.java | 4 +- .../gerrit/httpd/HttpLogoutServlet.java | 17 +- .../gerrit/httpd/HttpRemotePeerProvider.java | 2 - .../gerrit/httpd/HttpRequestContext.java | 3 +- .../httpd/HttpServletResponseRecorder.java | 13 +- .../google/gerrit/httpd/LoginUrlToken.java | 4 +- .../gerrit/httpd/ProjectBasicAuthFilter.java | 66 +- .../gerrit/httpd/ProjectDigestFilter.java | 48 +- .../gerrit/httpd/ProjectOAuthFilter.java | 91 +- .../google/gerrit/httpd/ProxyProperties.java | 2 + .../gerrit/httpd/ProxyPropertiesProvider.java | 9 +- .../google/gerrit/httpd/RemoteUserUtil.java | 19 +- .../gerrit/httpd/RequestContextFilter.java | 15 +- .../google/gerrit/httpd/RequestMetrics.java | 22 +- .../gerrit/httpd/RequestMetricsFilter.java | 12 +- .../httpd/RequireIdentifiedUserFilter.java | 11 +- .../google/gerrit/httpd/RequireSslFilter.java | 15 +- .../com/google/gerrit/httpd/RunAsFilter.java | 40 +- .../gerrit/httpd/UniversalWebLoginFilter.java | 28 +- .../com/google/gerrit/httpd/UrlModule.java | 222 +- .../google/gerrit/httpd/WebLoginListener.java | 20 +- .../com/google/gerrit/httpd/WebModule.java | 11 +- .../com/google/gerrit/httpd/WebSession.java | 11 +- .../gerrit/httpd/WebSessionManager.java | 56 +- .../google/gerrit/httpd/WebSshGlueModule.java | 8 +- .../google/gerrit/httpd/XsrfCookieFilter.java | 30 +- .../become/BecomeAnyAccountLoginServlet.java | 33 +- .../httpd/auth/container/HttpAuthFilter.java | 39 +- .../auth/container/HttpLoginServlet.java | 63 +- .../HttpsClientSslCertAuthFilter.java | 27 +- .../HttpsClientSslCertLoginServlet.java | 22 +- .../httpd/auth/ldap/LdapLoginServlet.java | 25 +- .../gerrit/httpd/gitweb/GitLogoServlet.java | 6 +- .../gerrit/httpd/gitweb/GitwebCssServlet.java | 9 +- .../httpd/gitweb/GitwebJavaScriptServlet.java | 6 +- .../gerrit/httpd/gitweb/GitwebServlet.java | 148 +- .../gerrit/httpd/plugins/ContextMapper.java | 2 - .../HttpAutoRegisterModuleGenerator.java | 29 +- .../httpd/plugins/HttpPluginModule.java | 36 +- .../httpd/plugins/HttpPluginServlet.java | 246 +-- .../httpd/plugins/LfsPluginServlet.java | 65 +- .../httpd/plugins/PluginResourceKey.java | 1 + .../httpd/plugins/PluginServletContext.java | 60 +- .../httpd/plugins/WrappedFilterConfig.java | 2 - .../google/gerrit/httpd/raw/BazelBuild.java | 6 +- .../httpd/raw/BowerComponentsDevServlet.java | 8 +- .../google/gerrit/httpd/raw/BuildSystem.java | 29 +- .../google/gerrit/httpd/raw/CatServlet.java | 32 +- .../gerrit/httpd/raw/DirectoryDocServlet.java | 1 - .../httpd/raw/DirectoryGwtUiServlet.java | 5 +- .../gerrit/httpd/raw/FontsDevServlet.java | 4 +- .../gerrit/httpd/raw/HostPageServlet.java | 43 +- .../gerrit/httpd/raw/LegacyGerritServlet.java | 17 +- .../gerrit/httpd/raw/PolyGerritUiServlet.java | 1 - .../httpd/raw/RecompileGwtUiFilter.java | 23 +- .../gerrit/httpd/raw/ResourceServlet.java | 108 +- .../gerrit/httpd/raw/SingleFileServlet.java | 5 +- .../httpd/raw/SiteStaticDirectoryServlet.java | 5 +- .../gerrit/httpd/raw/SshInfoServlet.java | 34 +- .../google/gerrit/httpd/raw/StaticModule.java | 173 +- .../google/gerrit/httpd/raw/ThemeFactory.java | 1 - .../google/gerrit/httpd/raw/ToolServlet.java | 17 +- .../gerrit/httpd/raw/WarDocServlet.java | 1 - .../gerrit/httpd/raw/WarGwtUiServlet.java | 1 - .../gerrit/httpd/resources/Resource.java | 45 +- .../gerrit/httpd/resources/SmallResource.java | 7 +- .../httpd/restapi/AccessRestApiServlet.java | 3 +- .../httpd/restapi/AccountsRestApiServlet.java | 3 +- .../httpd/restapi/ChangesRestApiServlet.java | 3 +- .../httpd/restapi/ConfigRestApiServlet.java | 4 +- .../httpd/restapi/GroupsRestApiServlet.java | 3 +- .../gerrit/httpd/restapi/ParameterParser.java | 57 +- .../httpd/restapi/ProjectsRestApiServlet.java | 3 +- .../gerrit/httpd/restapi/RestApiMetrics.java | 54 +- .../gerrit/httpd/restapi/RestApiServlet.java | 458 ++-- .../httpd/rpc/AuditedHttpServletResponse.java | 5 +- .../httpd/rpc/BaseServiceImplementation.java | 24 +- .../gerrit/httpd/rpc/GerritJsonServlet.java | 63 +- .../httpd/rpc/GerritJsonServletProvider.java | 18 +- .../com/google/gerrit/httpd/rpc/Handler.java | 22 +- .../gerrit/httpd/rpc/RpcServletModule.java | 6 +- .../httpd/rpc/SystemInfoServiceImpl.java | 16 +- .../httpd/rpc/account/AccountModule.java | 15 +- .../rpc/account/AccountSecurityImpl.java | 10 +- .../httpd/rpc/account/DeleteExternalIds.java | 12 +- .../rpc/account/ExternalIdDetailFactory.java | 8 +- .../rpc/doc/QueryDocumentationFilter.java | 19 +- .../rpc/project/ChangeProjectAccess.java | 41 +- .../rpc/project/ProjectAccessFactory.java | 22 +- .../rpc/project/ProjectAccessHandler.java | 77 +- .../rpc/project/ProjectAdminServiceImpl.java | 41 +- .../httpd/rpc/project/ProjectModule.java | 17 +- .../rpc/project/ReviewProjectAccess.java | 73 +- .../httpd/template/SiteHeaderFooter.java | 10 +- .../AllRequestFilterFilterProxyTest.java | 39 +- .../gerrit/httpd/RemoteUserUtilTest.java | 6 +- .../httpd/plugins/ContextMapperTest.java | 23 +- .../httpd/plugins/LfsPluginServletTest.java | 3 +- .../gerrit/httpd/raw/ResourceServletTest.java | 53 +- .../httpd/restapi/ParameterParserTest.java | 16 +- .../gerrit/launcher/GerritLauncher.java | 116 +- .../gerrit/lucene/AbstractLuceneIndex.java | 183 +- .../gerrit/lucene/AutoCommitWriter.java | 26 +- .../google/gerrit/lucene/ChangeSubIndex.java | 39 +- .../gerrit/lucene/CustomMappingAnalyzer.java | 14 +- .../lucene/GerritIndexWriterConfig.java | 39 +- .../gerrit/lucene/LuceneAccountIndex.java | 55 +- .../gerrit/lucene/LuceneChangeIndex.java | 219 +- .../gerrit/lucene/LuceneGroupIndex.java | 57 +- .../gerrit/lucene/LuceneIndexModule.java | 10 +- .../gerrit/lucene/LuceneVersionManager.java | 62 +- .../google/gerrit/lucene/QueryBuilder.java | 72 +- .../lucene/WrappableSearcherManager.java | 107 +- gerrit-main/src/main/java/Main.java | 5 +- .../httpd/auth/oauth/OAuthLogoutServlet.java | 9 +- .../gerrit/httpd/auth/oauth/OAuthSession.java | 82 +- .../httpd/auth/oauth/OAuthWebFilter.java | 74 +- .../httpd/auth/openid/DiscoveryResult.java | 3 +- .../gerrit/httpd/auth/openid/LoginForm.java | 112 +- .../openid/OAuthOverOpenIDLogoutServlet.java | 8 +- .../auth/openid/OAuthSessionOverOpenID.java | 65 +- .../auth/openid/OAuthWebFilterOverOpenID.java | 28 +- .../httpd/auth/openid/OpenIdLoginServlet.java | 2 - .../httpd/auth/openid/OpenIdServiceImpl.java | 136 +- .../gerrit/httpd/auth/openid/SignInMode.java | 4 +- .../gerrit/httpd/auth/openid/XrdsFilter.java | 12 +- .../gerrit/httpd/auth/openid/XrdsServlet.java | 11 +- .../commons/net/smtp/AuthSMTPClient.java | 26 +- .../eclipse/jgit/diff/EditDeserializer.java | 18 +- .../jgit/diff/Edit_JsonSerializer.java | 9 +- .../storage/file/WindowCacheStatAccessor.java | 3 +- .../jgit/lib/ObjectIdSerialization.java | 13 +- .../main/java/com/google/gerrit/pgm/Cat.java | 4 +- .../java/com/google/gerrit/pgm/Daemon.java | 140 +- .../main/java/com/google/gerrit/pgm/Gsql.java | 42 +- .../main/java/com/google/gerrit/pgm/Init.java | 62 +- .../com/google/gerrit/pgm/JythonShell.java | 89 +- .../gerrit/pgm/LocalUsernamesToLowerCase.java | 20 +- .../main/java/com/google/gerrit/pgm/Ls.java | 1 - .../java/com/google/gerrit/pgm/Passwd.java | 51 +- .../com/google/gerrit/pgm/PrologShell.java | 12 +- .../java/com/google/gerrit/pgm/ProtoGen.java | 19 +- .../com/google/gerrit/pgm/ProtobufImport.java | 78 +- .../com/google/gerrit/pgm/RebuildNoteDb.java | 162 +- .../java/com/google/gerrit/pgm/Reindex.java | 57 +- .../java/com/google/gerrit/pgm/Rulec.java | 41 +- .../google/gerrit/pgm/SwitchSecureStore.java | 109 +- .../google/gerrit/pgm/WarDistribution.java | 4 +- .../pgm/http/jetty/HiddenErrorHandler.java | 27 +- .../google/gerrit/pgm/http/jetty/HttpLog.java | 29 +- .../gerrit/pgm/http/jetty/HttpLogLayout.java | 9 +- .../gerrit/pgm/http/jetty/JettyServer.java | 170 +- .../pgm/http/jetty/ProjectQoSFilter.java | 64 +- .../pgm/init/AllUsersNameOnInitProvider.java | 3 +- .../com/google/gerrit/pgm/init/BaseInit.java | 279 +-- .../com/google/gerrit/pgm/init/Browser.java | 6 +- .../gerrit/pgm/init/DB2Initializer.java | 1 - .../pgm/init/DatabaseConfigInitializer.java | 4 +- .../gerrit/pgm/init/DatabaseConfigModule.java | 43 +- .../gerrit/pgm/init/DerbyInitializer.java | 1 - .../google/gerrit/pgm/init/H2Initializer.java | 1 - .../gerrit/pgm/init/HANAInitializer.java | 3 +- .../google/gerrit/pgm/init/InitAdminUser.java | 64 +- .../com/google/gerrit/pgm/init/InitAuth.java | 69 +- .../com/google/gerrit/pgm/init/InitCache.java | 14 +- .../google/gerrit/pgm/init/InitContainer.java | 12 +- .../google/gerrit/pgm/init/InitDatabase.java | 15 +- .../com/google/gerrit/pgm/init/InitDev.java | 3 +- .../gerrit/pgm/init/InitGitManager.java | 1 - .../com/google/gerrit/pgm/init/InitHttpd.java | 49 +- .../com/google/gerrit/pgm/init/InitIndex.java | 21 +- .../google/gerrit/pgm/init/InitLabels.java | 12 +- .../google/gerrit/pgm/init/InitModule.java | 1 - .../pgm/init/InitPluginStepsLoader.java | 32 +- .../google/gerrit/pgm/init/InitPlugins.java | 86 +- .../google/gerrit/pgm/init/InitSendEmail.java | 10 +- .../com/google/gerrit/pgm/init/InitSshd.java | 57 +- .../com/google/gerrit/pgm/init/Libraries.java | 52 +- .../gerrit/pgm/init/LibraryDownloader.java | 46 +- .../gerrit/pgm/init/OracleInitializer.java | 1 - .../gerrit/pgm/init/PluginsDistribution.java | 22 +- .../gerrit/pgm/init/SitePathInitializer.java | 17 +- .../gerrit/pgm/init/UpgradeFrom2_0_x.java | 42 +- .../init/VersionedAuthorizedKeysOnInit.java | 12 +- .../pgm/init/api/AllProjectsConfig.java | 23 +- .../api/AllProjectsNameOnInitProvider.java | 3 +- .../google/gerrit/pgm/init/api/ConsoleUI.java | 39 +- .../google/gerrit/pgm/init/api/InitFlags.java | 13 +- .../google/gerrit/pgm/init/api/InitUtil.java | 17 +- .../pgm/init/api/InstallAllPlugins.java | 4 +- .../gerrit/pgm/init/api/InstallPlugins.java | 4 +- .../gerrit/pgm/init/api/LibraryDownload.java | 4 +- .../google/gerrit/pgm/init/api/Section.java | 26 +- .../pgm/init/api/VersionedMetaDataOnInit.java | 27 +- .../pgm/init/index/IndexManagerOnInit.java | 5 +- .../pgm/init/index/IndexModuleOnInit.java | 29 +- .../ElasticIndexModuleOnInit.java | 8 +- .../gerrit/pgm/rules/PrologCompiler.java | 64 +- .../gerrit/pgm/util/AbstractProgram.java | 14 +- .../gerrit/pgm/util/BatchProgramModule.java | 59 +- .../google/gerrit/pgm/util/ErrorLogFile.java | 23 +- .../google/gerrit/pgm/util/GuiceLogger.java | 21 +- .../gerrit/pgm/util/LogFileCompressor.java | 23 +- .../pgm/util/PerThreadReviewDbModule.java | 68 +- .../com/google/gerrit/pgm/util/ProxyUtil.java | 28 +- .../gerrit/pgm/util/RuntimeShutdown.java | 12 +- .../SiteLibraryBasedDataSourceProvider.java | 8 +- .../google/gerrit/pgm/util/SiteProgram.java | 136 +- .../google/gerrit/pgm/util/ThreadLimiter.java | 17 +- .../google/gerrit/pgm/init/InitTestCase.java | 5 +- .../google/gerrit/pgm/init/LibrariesTest.java | 20 +- .../gerrit/pgm/init/UpgradeFrom2_0_xTest.java | 53 +- .../gerrit/plugin/client/FormatUtil.java | 23 +- .../google/gerrit/plugin/client/Plugin.java | 73 +- .../plugin/client/PluginEntryPoint.java | 11 +- .../gerrit/plugin/client/extension/Panel.java | 31 +- .../gerrit/plugin/client/rpc/NoContent.java | 3 +- .../gerrit/plugin/client/rpc/RestApi.java | 50 +- .../gerrit/plugin/client/screen/Screen.java | 38 +- .../plugin/client/ui/GroupSuggestOracle.java | 36 +- .../gerrit/plugin/rebind/PluginGenerator.java | 29 +- .../gerrit/prettify/common/EditList.java | 7 +- .../prettify/common/SparseFileContent.java | 7 +- .../gerrit/reviewdb/client/Account.java | 112 +- .../reviewdb/client/AccountExternalId.java | 18 +- .../gerrit/reviewdb/client/AccountGroup.java | 28 +- .../reviewdb/client/AccountGroupById.java | 3 +- .../reviewdb/client/AccountGroupByIdAud.java | 8 +- .../reviewdb/client/AccountGroupMember.java | 3 +- .../client/AccountGroupMemberAudit.java | 8 +- .../reviewdb/client/AccountGroupName.java | 3 +- .../reviewdb/client/AccountPatchReview.java | 7 +- .../gerrit/reviewdb/client/AccountSshKey.java | 4 +- .../google/gerrit/reviewdb/client/Branch.java | 3 +- .../google/gerrit/reviewdb/client/Change.java | 234 +- .../gerrit/reviewdb/client/ChangeMessage.java | 34 +- .../gerrit/reviewdb/client/Comment.java | 162 +- .../gerrit/reviewdb/client/CommentRange.java | 20 +- .../reviewdb/client/CoreDownloadSchemes.java | 8 +- .../reviewdb/client/CurrentSchemaVersion.java | 9 +- .../reviewdb/client/FixReplacement.java | 15 +- .../gerrit/reviewdb/client/FixSuggestion.java | 18 +- .../gerrit/reviewdb/client/LabelId.java | 3 +- .../google/gerrit/reviewdb/client/Patch.java | 48 +- .../reviewdb/client/PatchLineComment.java | 93 +- .../gerrit/reviewdb/client/PatchSet.java | 33 +- .../reviewdb/client/PatchSetApproval.java | 48 +- .../gerrit/reviewdb/client/PatchSetInfo.java | 11 +- .../gerrit/reviewdb/client/Project.java | 21 +- .../gerrit/reviewdb/client/RefNames.java | 39 +- .../google/gerrit/reviewdb/client/RevId.java | 7 +- .../gerrit/reviewdb/client/RobotComment.java | 74 +- .../client/SubmoduleSubscription.java | 21 +- .../gerrit/reviewdb/client/SystemConfig.java | 14 +- .../gerrit/reviewdb/client/TrackingId.java | 12 +- .../gerrit/reviewdb/server/AccountAccess.java | 7 +- .../server/AccountExternalIdAccess.java | 3 +- .../reviewdb/server/AccountGroupAccess.java | 3 +- .../server/AccountGroupByIdAccess.java | 3 +- .../server/AccountGroupByIdAudAccess.java | 14 +- .../server/AccountGroupMemberAccess.java | 4 +- .../server/AccountGroupMemberAuditAccess.java | 14 +- .../server/AccountGroupNameAccess.java | 8 +- .../reviewdb/server/ChangeMessageAccess.java | 3 +- .../DisabledChangesReviewDbWrapper.java | 41 +- .../server/PatchLineCommentAccess.java | 52 +- .../server/PatchSetApprovalAccess.java | 7 +- .../gerrit/reviewdb/server/ReviewDb.java | 11 +- .../gerrit/reviewdb/server/ReviewDbUtil.java | 27 +- .../reviewdb/server/ReviewDbWrapper.java | 116 +- .../reviewdb/server/SchemaVersionAccess.java | 4 +- .../reviewdb/server/SystemConfigAccess.java | 3 +- .../reviewdb/client/AccountSshKeyTest.java | 21 +- .../gerrit/reviewdb/client/ChangeTest.java | 9 +- .../reviewdb/client/PatchSetApprovalTest.java | 25 +- .../gerrit/reviewdb/client/PatchSetTest.java | 4 +- .../gerrit/reviewdb/client/RefNamesTest.java | 16 +- .../com/google/gerrit/audit/AuditEvent.java | 15 +- .../google/gerrit/audit/AuditListener.java | 1 - .../com/google/gerrit/audit/AuditModule.java | 1 - .../com/google/gerrit/audit/AuditService.java | 21 +- .../gerrit/audit/ExtendedHttpAuditEvent.java | 30 +- .../audit/GroupMemberAuditListener.java | 10 +- .../google/gerrit/audit/HttpAuditEvent.java | 13 +- .../google/gerrit/audit/RpcAuditEvent.java | 13 +- .../google/gerrit/audit/SshAuditEvent.java | 9 +- .../com/google/gerrit/common/EventBroker.java | 24 +- .../google/gerrit/common/EventDispatcher.java | 8 +- .../google/gerrit/common/EventListener.java | 4 +- .../common/UserScopedEventListener.java | 4 +- .../com/google/gerrit/common/Version.java | 8 +- .../gerrit/lifecycle/LifecycleManager.java | 29 +- .../gerrit/lifecycle/LifecycleModule.java | 12 +- .../google/gerrit/metrics/CallbackMetric.java | 1 - .../gerrit/metrics/CallbackMetric1.java | 3 +- .../com/google/gerrit/metrics/Counter0.java | 14 +- .../com/google/gerrit/metrics/Counter1.java | 14 +- .../com/google/gerrit/metrics/Counter2.java | 14 +- .../com/google/gerrit/metrics/Counter3.java | 14 +- .../google/gerrit/metrics/Description.java | 52 +- .../gerrit/metrics/DisabledMetricMaker.java | 150 +- .../java/com/google/gerrit/metrics/Field.java | 33 +- .../com/google/gerrit/metrics/Histogram0.java | 4 +- .../com/google/gerrit/metrics/Histogram1.java | 4 +- .../com/google/gerrit/metrics/Histogram2.java | 4 +- .../com/google/gerrit/metrics/Histogram3.java | 4 +- .../google/gerrit/metrics/MetricMaker.java | 92 +- .../com/google/gerrit/metrics/Timer0.java | 8 +- .../com/google/gerrit/metrics/Timer1.java | 5 +- .../com/google/gerrit/metrics/Timer2.java | 5 +- .../com/google/gerrit/metrics/Timer3.java | 8 +- .../metrics/dropwizard/BucketedCallback.java | 17 +- .../metrics/dropwizard/BucketedCounter.java | 8 +- .../metrics/dropwizard/BucketedHistogram.java | 8 +- .../metrics/dropwizard/BucketedMetric.java | 9 +- .../metrics/dropwizard/BucketedTimer.java | 7 +- .../metrics/dropwizard/CallbackGroup.java | 12 +- .../dropwizard/CallbackMetricGlue.java | 3 + .../dropwizard/CallbackMetricImpl0.java | 36 +- .../dropwizard/CallbackMetricImpl1.java | 19 +- .../metrics/dropwizard/CounterImpl1.java | 6 +- .../metrics/dropwizard/CounterImplN.java | 6 +- .../dropwizard/DropWizardMetricMaker.java | 56 +- .../gerrit/metrics/dropwizard/GetMetric.java | 5 +- .../metrics/dropwizard/HistogramImpl1.java | 6 +- .../metrics/dropwizard/HistogramImplN.java | 6 +- .../metrics/dropwizard/ListMetrics.java | 18 +- .../gerrit/metrics/dropwizard/MetricJson.java | 38 +- .../metrics/dropwizard/MetricResource.java | 3 +- .../metrics/dropwizard/MetricsCollection.java | 12 +- .../gerrit/metrics/dropwizard/TimerImpl1.java | 7 +- .../gerrit/metrics/dropwizard/TimerImplN.java | 10 +- .../gerrit/metrics/proc/JGitMetricModule.java | 27 +- .../gerrit/metrics/proc/MetricModule.java | 22 +- .../gerrit/metrics/proc/ProcMetricModule.java | 183 +- .../gerrit/rules/PredicateClassLoader.java | 14 +- .../gerrit/rules/PredicateProvider.java | 12 +- .../gerrit/rules/PrologEnvironment.java | 57 +- .../com/google/gerrit/rules/RulesCache.java | 74 +- .../com/google/gerrit/rules/StoredValue.java | 8 +- .../com/google/gerrit/rules/StoredValues.java | 127 +- .../google/gerrit/server/AnonymousUser.java | 1 - .../google/gerrit/server/ApprovalCopier.java | 90 +- .../google/gerrit/server/ApprovalsUtil.java | 222 +- .../google/gerrit/server/ChangeFinder.java | 26 +- .../gerrit/server/ChangeMessagesUtil.java | 86 +- .../com/google/gerrit/server/ChangeUtil.java | 26 +- .../gerrit/server/CmdLineParserModule.java | 12 +- .../google/gerrit/server/CommentsUtil.java | 296 ++- .../gerrit/server/CommonConverters.java | 15 +- .../com/google/gerrit/server/CurrentUser.java | 41 +- .../gerrit/server/EnableSignedPush.java | 8 +- .../gerrit/server/GerritPersonIdent.java | 4 +- .../server/GerritPersonIdentProvider.java | 2 - .../google/gerrit/server/GpgException.java | 1 - .../google/gerrit/server/IdentifiedUser.java | 140 +- .../google/gerrit/server/InternalUser.java | 9 +- .../google/gerrit/server/LibModuleLoader.java | 9 +- .../com/google/gerrit/server/OptionUtil.java | 7 +- .../google/gerrit/server/OutputFormat.java | 27 +- .../google/gerrit/server/PatchSetUtil.java | 62 +- .../google/gerrit/server/PeerDaemonUser.java | 5 +- .../com/google/gerrit/server/PluginUser.java | 3 +- .../com/google/gerrit/server/ProjectUtil.java | 18 +- .../com/google/gerrit/server/RemotePeer.java | 4 +- .../google/gerrit/server/RequestCleanup.java | 16 +- .../gerrit/server/ReviewerRecommender.java | 123 +- .../com/google/gerrit/server/ReviewerSet.java | 38 +- .../gerrit/server/ReviewerStatusUpdate.java | 7 +- .../google/gerrit/server/ReviewersUtil.java | 164 +- .../com/google/gerrit/server/Sequences.java | 30 +- .../gerrit/server/StarredChangesUtil.java | 189 +- .../google/gerrit/server/StartupCheck.java | 12 +- .../google/gerrit/server/StartupChecks.java | 9 +- .../com/google/gerrit/server/StringUtil.java | 25 +- .../com/google/gerrit/server/UrlEncoded.java | 5 +- .../com/google/gerrit/server/WebLinks.java | 113 +- .../server/access/AccessCollection.java | 6 +- .../gerrit/server/access/ListAccess.java | 13 +- .../gerrit/server/account/AbstractRealm.java | 5 +- .../server/account/AccountByEmailCache.java | 1 - .../account/AccountByEmailCacheImpl.java | 29 +- .../gerrit/server/account/AccountCache.java | 1 - .../server/account/AccountCacheImpl.java | 55 +- .../gerrit/server/account/AccountControl.java | 153 +- .../server/account/AccountDirectory.java | 7 +- .../gerrit/server/account/AccountLoader.java | 34 +- .../gerrit/server/account/AccountManager.java | 149 +- .../server/account/AccountResolver.java | 52 +- .../server/account/AccountResource.java | 4 +- .../gerrit/server/account/AccountState.java | 41 +- .../account/AccountUserNameException.java | 5 +- .../server/account/AccountVisibility.java | 4 +- .../account/AccountVisibilityProvider.java | 1 - .../server/account/AccountsCollection.java | 54 +- .../gerrit/server/account/AddSshKey.java | 38 +- .../gerrit/server/account/AuthRequest.java | 29 +- .../gerrit/server/account/AuthResult.java | 10 +- .../gerrit/server/account/AuthorizedKeys.java | 16 +- .../gerrit/server/account/Capabilities.java | 6 +- .../server/account/CapabilityCollection.java | 22 +- .../server/account/CapabilityControl.java | 70 +- .../server/account/CapabilityUtils.java | 89 +- .../gerrit/server/account/ChangeUserName.java | 27 +- .../gerrit/server/account/CreateAccount.java | 48 +- .../gerrit/server/account/CreateEmail.java | 28 +- .../server/account/CreateGroupArgs.java | 1 - .../gerrit/server/account/DefaultRealm.java | 11 +- .../gerrit/server/account/DeleteActive.java | 8 +- .../gerrit/server/account/DeleteEmail.java | 29 +- .../server/account/DeleteExternalIds.java | 24 +- .../gerrit/server/account/DeleteSshKey.java | 23 +- .../server/account/DeleteWatchedProjects.java | 24 +- .../gerrit/server/account/EmailExpander.java | 8 +- .../google/gerrit/server/account/Emails.java | 12 +- .../account/GeneralPreferencesLoader.java | 78 +- .../gerrit/server/account/GetAgreements.java | 29 +- .../gerrit/server/account/GetAvatar.java | 20 +- .../server/account/GetAvatarChangeUrl.java | 3 +- .../server/account/GetCapabilities.java | 19 +- .../gerrit/server/account/GetDetail.java | 4 +- .../server/account/GetDiffPreferences.java | 39 +- .../server/account/GetEditPreferences.java | 38 +- .../gerrit/server/account/GetEmail.java | 3 +- .../gerrit/server/account/GetEmails.java | 15 +- .../gerrit/server/account/GetExternalIds.java | 22 +- .../gerrit/server/account/GetGroups.java | 1 - .../server/account/GetHttpPassword.java | 6 +- .../gerrit/server/account/GetOAuthToken.java | 11 +- .../gerrit/server/account/GetPreferences.java | 9 +- .../gerrit/server/account/GetSshKeys.java | 20 +- .../gerrit/server/account/GetUsername.java | 6 +- .../server/account/GetWatchedProjects.java | 53 +- .../gerrit/server/account/GroupBackend.java | 18 +- .../gerrit/server/account/GroupBackends.java | 44 +- .../gerrit/server/account/GroupCache.java | 10 +- .../gerrit/server/account/GroupCacheImpl.java | 46 +- .../server/account/GroupComparator.java | 1 - .../gerrit/server/account/GroupControl.java | 36 +- .../server/account/GroupDetailFactory.java | 4 +- .../server/account/GroupIncludeCache.java | 2 +- .../server/account/GroupIncludeCacheImpl.java | 76 +- .../gerrit/server/account/GroupMembers.java | 34 +- .../server/account/GroupMembership.java | 31 +- .../gerrit/server/account/GroupUUID.java | 7 +- .../account/IncludingGroupMembership.java | 18 +- .../google/gerrit/server/account/Index.java | 13 +- .../account/InternalAccountDirectory.java | 31 +- .../server/account/InternalGroupBackend.java | 23 +- .../server/account/ListGroupMembership.java | 5 +- .../google/gerrit/server/account/Module.java | 3 +- .../server/account/PostWatchedProjects.java | 28 +- .../gerrit/server/account/PutAccount.java | 3 +- .../gerrit/server/account/PutActive.java | 4 +- .../gerrit/server/account/PutAgreement.java | 18 +- .../server/account/PutHttpPassword.java | 38 +- .../google/gerrit/server/account/PutName.java | 23 +- .../gerrit/server/account/PutPreferred.java | 16 +- .../gerrit/server/account/PutStatus.java | 23 +- .../gerrit/server/account/PutUsername.java | 16 +- .../gerrit/server/account/QueryAccounts.java | 34 +- .../google/gerrit/server/account/Realm.java | 10 +- .../server/account/SetDiffPreferences.java | 35 +- .../server/account/SetEditPreferences.java | 32 +- .../gerrit/server/account/SetPreferences.java | 54 +- .../google/gerrit/server/account/SshKeys.java | 19 +- .../gerrit/server/account/StarredChanges.java | 55 +- .../google/gerrit/server/account/Stars.java | 47 +- .../server/account/UniversalGroupBackend.java | 121 +- .../account/VersionedAccountDestinations.java | 7 +- .../account/VersionedAccountPreferences.java | 7 +- .../account/VersionedAccountQueries.java | 12 +- .../account/VersionedAuthorizedKeys.java | 76 +- .../gerrit/server/account/WatchConfig.java | 167 +- .../gerrit/server/api/GerritApiImpl.java | 7 +- .../server/api/accounts/AccountApiImpl.java | 55 +- .../accounts/AccountExternalIdCreator.java | 11 +- .../api/accounts/AccountInfoComparator.java | 7 +- .../server/api/accounts/AccountsImpl.java | 23 +- .../server/api/accounts/GpgApiAdapter.java | 12 +- .../server/api/changes/ChangeApiImpl.java | 48 +- .../server/api/changes/ChangeEditApiImpl.java | 35 +- .../server/api/changes/ChangesImpl.java | 24 +- .../server/api/changes/CommentApiImpl.java | 3 +- .../server/api/changes/DraftApiImpl.java | 3 +- .../server/api/changes/FileApiImpl.java | 5 +- .../server/api/changes/ReviewerApiImpl.java | 4 +- .../server/api/changes/RevisionApiImpl.java | 47 +- .../api/changes/RevisionReviewerApiImpl.java | 6 +- .../api/changes/RobotCommentApiImpl.java | 3 +- .../gerrit/server/api/config/ServerImpl.java | 17 +- .../server/api/groups/GroupApiImpl.java | 13 +- .../gerrit/server/api/groups/GroupsImpl.java | 16 +- .../server/api/projects/BranchApiImpl.java | 7 +- .../api/projects/ChildProjectApiImpl.java | 4 +- .../server/api/projects/ProjectApiImpl.java | 84 +- .../server/api/projects/ProjectsImpl.java | 10 +- .../server/api/projects/TagApiImpl.java | 4 +- .../server/args4j/AccountGroupIdHandler.java | 10 +- .../args4j/AccountGroupUUIDHandler.java | 10 +- .../server/args4j/AccountIdHandler.java | 10 +- .../gerrit/server/args4j/ChangeIdHandler.java | 11 +- .../gerrit/server/args4j/ObjectIdHandler.java | 7 +- .../server/args4j/PatchSetIdHandler.java | 13 +- .../server/args4j/ProjectControlHandler.java | 24 +- .../server/args4j/SocketAddressHandler.java | 13 +- .../server/args4j/SubcommandHandler.java | 10 +- .../server/args4j/TimestampHandler.java | 25 +- .../gerrit/server/auth/AuthBackend.java | 28 +- .../gerrit/server/auth/AuthException.java | 7 +- .../gerrit/server/auth/AuthRequest.java | 5 +- .../google/gerrit/server/auth/AuthUser.java | 11 +- .../server/auth/InternalAuthBackend.java | 14 +- .../auth/InvalidCredentialsException.java | 7 +- .../auth/MissingCredentialsException.java | 10 +- .../server/auth/UniversalAuthBackend.java | 15 +- .../server/auth/UnknownUserException.java | 6 +- .../server/auth/UserNotAllowedException.java | 8 +- .../gerrit/server/auth/ldap/Helper.java | 103 +- .../server/auth/ldap/LdapAuthBackend.java | 31 +- .../server/auth/ldap/LdapGroupBackend.java | 32 +- .../server/auth/ldap/LdapGroupMembership.java | 4 +- .../gerrit/server/auth/ldap/LdapModule.java | 30 +- .../gerrit/server/auth/ldap/LdapQuery.java | 13 +- .../gerrit/server/auth/ldap/LdapRealm.java | 47 +- .../gerrit/server/auth/ldap/LdapType.java | 5 +- .../gerrit/server/auth/oauth/OAuthRealm.java | 32 +- .../server/auth/oauth/OAuthTokenCache.java | 3 +- .../auth/openid/OpenIdProviderPattern.java | 3 +- .../gerrit/server/avatar/AvatarProvider.java | 21 +- .../gerrit/server/cache/CacheBinding.java | 17 +- .../gerrit/server/cache/CacheMetrics.java | 78 +- .../gerrit/server/cache/CacheModule.java | 79 +- .../gerrit/server/cache/CacheProvider.java | 17 +- .../server/cache/CacheRemovalListener.java | 6 +- .../cache/ForwardingRemovalListener.java | 8 +- .../server/cache/MemoryCacheFactory.java | 4 +- .../server/cache/PersistentCacheFactory.java | 4 +- .../google/gerrit/server/change/Abandon.java | 91 +- .../gerrit/server/change/AbandonUtil.java | 34 +- .../change/AccountPatchReviewStore.java | 42 +- .../gerrit/server/change/ActionJson.java | 36 +- .../gerrit/server/change/AllowedFormats.java | 6 +- .../gerrit/server/change/ArchiveFormat.java | 21 +- .../server/change/ChangeCleanupRunner.java | 24 +- .../server/change/ChangeEditResource.java | 9 +- .../gerrit/server/change/ChangeEdits.java | 207 +- .../server/change/ChangeIncludedIn.java | 5 +- .../gerrit/server/change/ChangeInserter.java | 198 +- .../gerrit/server/change/ChangeJson.java | 343 ++- .../gerrit/server/change/ChangeKindCache.java | 14 +- .../server/change/ChangeKindCacheImpl.java | 109 +- .../gerrit/server/change/ChangeResource.java | 20 +- .../gerrit/server/change/ChangeTriplet.java | 15 +- .../server/change/ChangesCollection.java | 9 +- .../google/gerrit/server/change/Check.java | 8 +- .../gerrit/server/change/CherryPick.java | 41 +- .../server/change/CherryPickChange.java | 208 +- .../gerrit/server/change/CommentJson.java | 51 +- .../google/gerrit/server/change/Comments.java | 10 +- .../server/change/ConsistencyChecker.java | 245 +-- .../gerrit/server/change/CreateChange.java | 137 +- .../server/change/CreateDraftComment.java | 28 +- .../server/change/CreateMergePatchSet.java | 91 +- .../gerrit/server/change/DeleteAssignee.java | 36 +- .../gerrit/server/change/DeleteChange.java | 28 +- .../server/change/DeleteChangeEdit.java | 7 +- .../gerrit/server/change/DeleteChangeOp.java | 68 +- .../server/change/DeleteDraftComment.java | 31 +- .../server/change/DeleteDraftPatchSet.java | 51 +- .../gerrit/server/change/DeleteReviewer.java | 73 +- .../gerrit/server/change/DeleteVote.java | 66 +- .../gerrit/server/change/DownloadContent.java | 10 +- .../gerrit/server/change/DraftComments.java | 8 +- .../server/change/EmailReviewComments.java | 12 +- .../gerrit/server/change/FileContentUtil.java | 69 +- .../gerrit/server/change/FileInfoJson.java | 23 +- .../google/gerrit/server/change/Files.java | 106 +- .../gerrit/server/change/GetArchive.java | 62 +- .../gerrit/server/change/GetAssignee.java | 7 +- .../google/gerrit/server/change/GetBlame.java | 43 +- .../gerrit/server/change/GetChange.java | 7 +- .../gerrit/server/change/GetCommit.java | 11 +- .../gerrit/server/change/GetContent.java | 30 +- .../gerrit/server/change/GetDetail.java | 1 - .../google/gerrit/server/change/GetDiff.java | 153 +- .../gerrit/server/change/GetHashtags.java | 1 - .../gerrit/server/change/GetMergeList.java | 21 +- .../server/change/GetPastAssignees.java | 10 +- .../google/gerrit/server/change/GetPatch.java | 146 +- .../gerrit/server/change/GetRelated.java | 52 +- .../gerrit/server/change/GetReviewer.java | 1 - .../server/change/GetRevisionActions.java | 10 +- .../gerrit/server/change/GetRobotComment.java | 3 +- .../gerrit/server/change/HashtagsUtil.java | 10 +- .../gerrit/server/change/IncludedIn.java | 18 +- .../server/change/IncludedInResolver.java | 113 +- .../google/gerrit/server/change/Index.java | 13 +- .../change/LimitedByteArrayOutputStream.java | 11 +- .../server/change/ListChangeComments.java | 11 +- .../server/change/ListChangeDrafts.java | 19 +- .../change/ListChangeRobotComments.java | 12 +- .../gerrit/server/change/ListReviewers.java | 7 +- .../server/change/ListRevisionComments.java | 11 +- .../server/change/ListRevisionDrafts.java | 31 +- .../server/change/ListRevisionReviewers.java | 14 +- .../server/change/ListRobotComments.java | 24 +- .../server/change/MergeabilityCache.java | 26 +- .../server/change/MergeabilityCacheImpl.java | 65 +- .../gerrit/server/change/Mergeable.java | 74 +- .../com/google/gerrit/server/change/Move.java | 44 +- .../gerrit/server/change/NotifyUtil.java | 13 +- .../server/change/PatchSetInserter.java | 95 +- .../gerrit/server/change/PostHashtags.java | 22 +- .../gerrit/server/change/PostReview.java | 522 ++--- .../gerrit/server/change/PostReviewers.java | 195 +- .../gerrit/server/change/PreviewSubmit.java | 80 +- .../server/change/PublishChangeEdit.java | 23 +- .../server/change/PublishDraftPatchSet.java | 96 +- .../gerrit/server/change/PutAssignee.java | 27 +- .../gerrit/server/change/PutDescription.java | 29 +- .../gerrit/server/change/PutDraftComment.java | 42 +- .../google/gerrit/server/change/PutTopic.java | 32 +- .../google/gerrit/server/change/Rebase.java | 90 +- .../server/change/RebaseChangeEdit.java | 18 +- .../gerrit/server/change/RebaseChangeOp.java | 94 +- .../gerrit/server/change/RebaseUtil.java | 61 +- .../google/gerrit/server/change/Rebuild.java | 34 +- .../server/change/RelatedChangesSorter.java | 58 +- .../google/gerrit/server/change/Restore.java | 35 +- .../google/gerrit/server/change/Revert.java | 92 +- .../google/gerrit/server/change/Reviewed.java | 39 +- .../gerrit/server/change/ReviewerJson.java | 34 +- .../server/change/ReviewerResource.java | 15 +- .../server/change/ReviewerSuggestion.java | 15 +- .../gerrit/server/change/Reviewers.java | 16 +- .../server/change/RevisionResource.java | 4 +- .../server/change/RevisionReviewers.java | 20 +- .../gerrit/server/change/Revisions.java | 27 +- .../gerrit/server/change/RobotComments.java | 9 +- .../gerrit/server/change/SetAssigneeOp.java | 40 +- .../gerrit/server/change/SetHashtagsOp.java | 28 +- .../google/gerrit/server/change/Submit.java | 236 +- .../server/change/SubmittedTogether.java | 44 +- .../server/change/SuggestChangeReviewers.java | 24 +- .../server/change/SuggestReviewers.java | 38 +- .../gerrit/server/change/TestSubmitRule.java | 33 +- .../gerrit/server/change/TestSubmitType.java | 29 +- .../google/gerrit/server/change/Votes.java | 33 +- .../gerrit/server/change/WalkSorter.java | 112 +- .../config/AdministrateServerGroups.java | 4 +- .../AdministrateServerGroupsProvider.java | 4 +- .../gerrit/server/config/AgreementJson.java | 21 +- .../config/AllProjectsNameProvider.java | 1 - .../server/config/AllUsersNameProvider.java | 1 - .../server/config/AnonymousCowardName.java | 4 +- .../config/AnonymousCowardNameProvider.java | 1 - .../gerrit/server/config/AuthConfig.java | 26 +- .../gerrit/server/config/CacheResource.java | 15 +- .../server/config/CachesCollection.java | 10 +- .../gerrit/server/config/CanonicalWebUrl.java | 12 +- .../server/config/CanonicalWebUrlModule.java | 3 +- .../config/CanonicalWebUrlProvider.java | 1 - .../server/config/CapabilitiesCollection.java | 6 +- .../server/config/ChangeCleanupConfig.java | 20 +- .../server/config/ConfigCollection.java | 6 +- .../gerrit/server/config/ConfigUtil.java | 153 +- .../gerrit/server/config/ConfirmEmail.java | 11 +- .../gerrit/server/config/DeleteTask.java | 8 +- .../config/DisableReverseDnsLookup.java | 4 +- .../DisableReverseDnsLookupProvider.java | 4 +- .../gerrit/server/config/DownloadConfig.java | 33 +- .../server/config/EmailExpanderProvider.java | 2 - .../gerrit/server/config/FlushCache.java | 12 +- .../google/gerrit/server/config/GcConfig.java | 1 - .../gerrit/server/config/GerritConfig.java | 1 - .../server/config/GerritGlobalModule.java | 35 +- .../gerrit/server/config/GerritOptions.java | 22 +- .../server/config/GerritServerConfig.java | 10 +- .../config/GerritServerConfigModule.java | 29 +- .../config/GerritServerConfigProvider.java | 13 +- .../gerrit/server/config/GerritServerId.java | 9 +- .../server/config/GerritServerIdProvider.java | 15 +- .../server/config/GetDiffPreferences.java | 26 +- .../gerrit/server/config/GetPreferences.java | 29 +- .../gerrit/server/config/GetServerInfo.java | 63 +- .../gerrit/server/config/GetSummary.java | 33 +- .../server/config/GitReceivePackGroups.java | 9 +- .../config/GitReceivePackGroupsProvider.java | 14 +- .../server/config/GitUploadPackGroups.java | 9 +- .../config/GitUploadPackGroupsProvider.java | 16 +- .../gerrit/server/config/GitwebCgiConfig.java | 14 +- .../gerrit/server/config/GitwebConfig.java | 144 +- .../server/config/GlobalPluginConfig.java | 14 +- .../server/config/GroupSetProvider.java | 15 +- .../gerrit/server/config/ListCaches.java | 21 +- .../server/config/ListCapabilities.java | 26 +- .../gerrit/server/config/ListTasks.java | 33 +- .../gerrit/server/config/ListTopMenus.java | 1 - .../gerrit/server/config/PluginConfig.java | 19 +- .../server/config/PluginConfigFactory.java | 317 ++- .../gerrit/server/config/PostCaches.java | 22 +- .../server/config/ProjectConfigEntry.java | 173 +- .../config/ProjectOwnerGroupsProvider.java | 12 +- .../server/config/RepositoryConfig.java | 36 +- .../config/RequestScopedReviewDbProvider.java | 21 +- .../gerrit/server/config/ScheduleConfig.java | 72 +- .../server/config/SetDiffPreferences.java | 35 +- .../gerrit/server/config/SetPreferences.java | 36 +- .../google/gerrit/server/config/SitePath.java | 8 +- .../gerrit/server/config/SitePaths.java | 5 +- .../gerrit/server/config/TasksCollection.java | 10 +- .../server/config/ThreadSettingsConfig.java | 4 +- .../server/config/TopMenuCollection.java | 6 +- .../gerrit/server/config/TrackingFooter.java | 11 +- .../gerrit/server/config/TrackingFooters.java | 13 +- .../config/TrackingFootersProvider.java | 56 +- .../config/VerboseSuperprojectUpdate.java | 4 +- .../gerrit/server/data/AccountAttribute.java | 6 +- .../gerrit/server/data/ApprovalAttribute.java | 12 +- .../gerrit/server/data/ChangeAttribute.java | 45 +- .../gerrit/server/data/MessageAttribute.java | 6 +- .../gerrit/server/data/PatchAttribute.java | 10 +- .../gerrit/server/data/PatchSetAttribute.java | 1 - .../server/data/PatchSetCommentAttribute.java | 8 +- .../server/data/SubmitLabelAttribute.java | 6 +- .../server/data/SubmitRecordAttribute.java | 4 +- .../documentation/MarkdownFormatter.java | 32 +- .../QueryDocumentationExecutor.java | 27 +- .../google/gerrit/server/edit/ChangeEdit.java | 17 +- .../gerrit/server/edit/ChangeEditJson.java | 16 +- .../server/edit/ChangeEditModifier.java | 321 ++- .../gerrit/server/edit/ChangeEditUtil.java | 150 +- .../gerrit/server/edit/tree/AddPath.java | 4 +- .../tree/ChangeFileContentModification.java | 34 +- .../edit/tree/DeleteFileModification.java | 15 +- .../edit/tree/RenameFileModification.java | 28 +- .../edit/tree/RestoreFileModification.java | 27 +- .../gerrit/server/edit/tree/TreeCreator.java | 41 +- .../server/edit/tree/TreeModification.java | 20 +- .../server/events/ChangeRestoredEvent.java | 2 +- .../server/events/CommitReceivedEvent.java | 9 +- .../server/events/EventDeserializer.java | 14 +- .../gerrit/server/events/EventFactory.java | 136 +- .../gerrit/server/events/EventTypes.java | 13 +- .../gerrit/server/events/EventsMetrics.java | 11 +- .../server/events/HashtagsChangedEvent.java | 2 +- .../events/ProjectNameKeySerializer.java | 8 +- .../server/events/RefReceivedEvent.java | 1 - .../events/StreamEventsApiListener.java | 179 +- .../server/events/SupplierDeserializer.java | 8 +- .../server/events/SupplierSerializer.java | 4 +- .../events/AbstractChangeEvent.java | 5 +- .../events/AbstractRevisionEvent.java | 12 +- .../extensions/events/AgreementSignup.java | 3 +- .../extensions/events/AssigneeChanged.java | 30 +- .../extensions/events/ChangeAbandoned.java | 46 +- .../extensions/events/ChangeMerged.java | 42 +- .../extensions/events/ChangeRestored.java | 41 +- .../extensions/events/ChangeReverted.java | 16 +- .../extensions/events/CommentAdded.java | 56 +- .../extensions/events/DraftPublished.java | 35 +- .../server/extensions/events/EventUtil.java | 41 +- .../events/GitReferenceUpdated.java | 120 +- .../extensions/events/HashtagsEdited.java | 42 +- .../server/extensions/events/PluginEvent.java | 3 +- .../extensions/events/ReviewerAdded.java | 43 +- .../extensions/events/ReviewerDeleted.java | 61 +- .../extensions/events/RevisionCreated.java | 39 +- .../server/extensions/events/TopicEdited.java | 26 +- .../server/extensions/events/VoteDeleted.java | 55 +- .../server/extensions/webui/UiActions.java | 46 +- .../google/gerrit/server/git/AbandonOp.java | 13 +- .../gerrit/server/git/AccountsSection.java | 1 - .../server/git/AsyncReceiveCommits.java | 48 +- .../google/gerrit/server/git/BanCommit.java | 46 +- .../gerrit/server/git/BanCommitResult.java | 3 +- .../google/gerrit/server/git/BatchUpdate.java | 293 ++- .../server/git/BatchUpdateReviewDb.java | 11 +- .../gerrit/server/git/BranchOrderSection.java | 3 +- .../server/git/ChainedReceiveCommands.java | 57 +- .../git/ChangeAlreadyMergedException.java | 4 +- .../server/git/ChangeMessageModifier.java | 34 +- .../gerrit/server/git/ChangeProgressOp.java | 1 - .../google/gerrit/server/git/ChangeSet.java | 30 +- .../server/git/ChangeUpdateExecutor.java | 8 +- .../gerrit/server/git/CodeReviewCommit.java | 50 +- .../server/git/ConfiguredMimeTypes.java | 22 +- .../gerrit/server/git/DefaultQueueOp.java | 6 +- .../gerrit/server/git/DestinationList.java | 8 +- .../google/gerrit/server/git/EmailMerge.java | 14 +- .../gerrit/server/git/GarbageCollection.java | 66 +- .../server/git/GarbageCollectionLogFile.java | 12 +- .../server/git/GarbageCollectionQueue.java | 4 +- .../server/git/GarbageCollectionRunner.java | 25 +- .../google/gerrit/server/git/GitModule.java | 4 +- .../google/gerrit/server/git/GitModules.java | 32 +- .../server/git/GitRepositoryManager.java | 34 +- .../gerrit/server/git/GroupCollector.java | 101 +- .../google/gerrit/server/git/GroupList.java | 14 +- .../server/git/HackPushNegotiateHook.java | 53 +- .../gerrit/server/git/InMemoryInserter.java | 25 +- .../gerrit/server/git/InsertedObject.java | 8 +- .../gerrit/server/git/LabelNormalizer.java | 58 +- .../server/git/LargeObjectException.java | 11 +- .../server/git/LazyPostReceiveHookChain.java | 4 +- .../git/LocalDiskRepositoryManager.java | 140 +- .../git/MergeIdenticalTreeException.java | 4 +- .../com/google/gerrit/server/git/MergeOp.java | 331 +-- .../gerrit/server/git/MergeOpRepoManager.java | 51 +- .../google/gerrit/server/git/MergeSorter.java | 19 +- .../gerrit/server/git/MergeSuperSet.java | 137 +- .../google/gerrit/server/git/MergeTip.java | 34 +- .../google/gerrit/server/git/MergeUtil.java | 328 +-- .../gerrit/server/git/MergedByPushOp.java | 90 +- .../gerrit/server/git/MetaDataUpdate.java | 86 +- .../MultiBaseLocalDiskRepositoryManager.java | 25 +- .../server/git/MultiProgressMonitor.java | 99 +- .../gerrit/server/git/NotesBranchUtil.java | 88 +- .../gerrit/server/git/NotifyConfig.java | 5 +- .../server/git/PerThreadRequestScope.java | 33 +- .../gerrit/server/git/ProjectConfig.java | 508 +++-- .../gerrit/server/git/ProjectLevelConfig.java | 20 +- .../gerrit/server/git/ProjectRunnable.java | 2 +- .../google/gerrit/server/git/QueryList.java | 3 +- .../gerrit/server/git/QueueProvider.java | 3 +- .../gerrit/server/git/ReadOnlyRepository.java | 21 +- .../gerrit/server/git/RebaseSorter.java | 44 +- .../gerrit/server/git/ReceiveCommits.java | 971 +++++---- .../git/ReceiveCommitsAdvertiseRefsHook.java | 32 +- .../server/git/ReceiveCommitsExecutor.java | 9 +- .../git/ReceiveCommitsExecutorModule.java | 31 +- .../gerrit/server/git/ReceiveConfig.java | 14 +- .../server/git/ReceivePackInitializer.java | 7 +- .../google/gerrit/server/git/RefCache.java | 23 +- .../gerrit/server/git/RenameGroupOp.java | 56 +- .../google/gerrit/server/git/ReplaceOp.java | 197 +- .../gerrit/server/git/RepoRefCache.java | 9 +- .../git/RepositoryCaseMismatchException.java | 20 +- .../gerrit/server/git/ReviewNoteMerger.java | 13 +- .../server/git/SearchingChangeCacheImpl.java | 50 +- .../gerrit/server/git/SendEmailExecutor.java | 8 +- .../google/gerrit/server/git/SubmoduleOp.java | 160 +- .../com/google/gerrit/server/git/TabFile.java | 30 +- .../google/gerrit/server/git/TagCache.java | 24 +- .../google/gerrit/server/git/TagMatcher.java | 8 +- .../com/google/gerrit/server/git/TagSet.java | 25 +- .../gerrit/server/git/TagSetHolder.java | 4 +- .../gerrit/server/git/TransferConfig.java | 15 +- .../server/git/UploadPackMetricsHook.java | 69 +- .../gerrit/server/git/UserConfigSections.java | 4 +- .../gerrit/server/git/ValidationError.java | 10 +- .../gerrit/server/git/VersionedMetaData.java | 231 +- .../gerrit/server/git/VisibleRefFilter.java | 63 +- .../google/gerrit/server/git/WorkQueue.java | 118 +- .../server/git/strategy/CherryPick.java | 103 +- .../git/strategy/CommitMergeStatus.java | 39 +- .../server/git/strategy/FastForwardOnly.java | 20 +- .../git/strategy/ImplicitIntegrateOp.java | 9 +- .../server/git/strategy/MergeAlways.java | 16 +- .../server/git/strategy/MergeIfNecessary.java | 30 +- .../server/git/strategy/MergeOneOp.java | 31 +- .../git/strategy/RebaseSubmitStrategy.java | 160 +- .../server/git/strategy/SubmitDryRun.java | 54 +- .../server/git/strategy/SubmitStrategy.java | 49 +- .../git/strategy/SubmitStrategyFactory.java | 55 +- .../git/strategy/SubmitStrategyListener.java | 40 +- .../server/git/strategy/SubmitStrategyOp.java | 229 +- .../validators/CommitValidationException.java | 4 +- .../validators/CommitValidationListener.java | 5 +- .../git/validators/CommitValidators.java | 304 ++- .../validators/MergeValidationException.java | 6 +- .../validators/MergeValidationListener.java | 6 +- .../git/validators/MergeValidators.java | 76 +- .../OnSubmitValidationListener.java | 36 +- .../git/validators/OnSubmitValidators.java | 14 +- .../RefOperationValidationException.java | 3 +- .../RefOperationValidationListener.java | 9 +- .../validators/RefOperationValidators.java | 30 +- .../validators/UploadValidationListener.java | 34 +- .../git/validators/UploadValidators.java | 33 +- .../server/group/AddIncludedGroups.java | 36 +- .../gerrit/server/group/AddMembers.java | 48 +- .../gerrit/server/group/CreateGroup.java | 49 +- .../group/DbGroupMemberAuditListener.java | 74 +- .../server/group/DeleteIncludedGroups.java | 34 +- .../gerrit/server/group/DeleteMembers.java | 25 +- .../gerrit/server/group/GetAuditLog.java | 57 +- .../google/gerrit/server/group/GetDetail.java | 3 +- .../gerrit/server/group/GetIncludedGroup.java | 2 +- .../google/gerrit/server/group/GroupJson.java | 10 +- .../gerrit/server/group/GroupsCollection.java | 56 +- .../server/group/IncludedGroupResource.java | 3 +- .../group/IncludedGroupsCollection.java | 26 +- .../com/google/gerrit/server/group/Index.java | 8 +- .../gerrit/server/group/ListGroups.java | 121 +- .../server/group/ListIncludedGroups.java | 45 +- .../gerrit/server/group/ListMembers.java | 17 +- .../server/group/MembersCollection.java | 14 +- .../google/gerrit/server/group/Module.java | 4 +- .../gerrit/server/group/PutDescription.java | 11 +- .../google/gerrit/server/group/PutName.java | 27 +- .../gerrit/server/group/PutOptions.java | 9 +- .../google/gerrit/server/group/PutOwner.java | 16 +- .../gerrit/server/group/QueryGroups.java | 38 +- .../server/group/SystemGroupBackend.java | 50 +- .../google/gerrit/server/index/FieldDef.java | 33 +- .../google/gerrit/server/index/FieldType.java | 25 +- .../server/index/GerritIndexStatus.java | 19 +- .../com/google/gerrit/server/index/Index.java | 62 +- .../gerrit/server/index/IndexCollection.java | 7 +- .../gerrit/server/index/IndexConfig.java | 22 +- .../gerrit/server/index/IndexDefinition.java | 10 +- .../gerrit/server/index/IndexExecutor.java | 6 +- .../gerrit/server/index/IndexModule.java | 62 +- .../gerrit/server/index/IndexRewriter.java | 3 +- .../gerrit/server/index/IndexUtils.java | 14 +- .../gerrit/server/index/IndexedQuery.java | 28 +- .../server/index/IntegerRangePredicate.java | 4 +- .../gerrit/server/index/OnlineReindexer.java | 57 +- .../gerrit/server/index/QueryOptions.java | 10 +- .../google/gerrit/server/index/Schema.java | 85 +- .../server/index/SchemaDefinitions.java | 14 +- .../gerrit/server/index/SchemaUtil.java | 17 +- .../server/index/SingleVersionModule.java | 16 +- .../gerrit/server/index/SiteIndexer.java | 24 +- .../server/index/TimestampRangePredicate.java | 5 +- .../server/index/account/AccountField.java | 54 +- .../server/index/account/AccountIndex.java | 5 +- .../index/account/AccountIndexCollection.java | 7 +- .../index/account/AccountIndexDefinition.java | 5 +- .../index/account/AccountIndexRewriter.java | 4 +- .../server/index/account/AccountIndexer.java | 1 - .../index/account/AccountIndexerImpl.java | 12 +- .../account/AccountSchemaDefinitions.java | 28 +- .../index/account/AllAccountsIndexer.java | 59 +- .../index/account/IndexedAccountQuery.java | 6 +- .../index/change/AllChangesIndexer.java | 107 +- .../server/index/change/ChangeField.java | 424 ++-- .../server/index/change/ChangeIndex.java | 5 +- .../index/change/ChangeIndexCollection.java | 6 +- .../index/change/ChangeIndexDefinition.java | 8 +- .../index/change/ChangeIndexRewriter.java | 60 +- .../server/index/change/ChangeIndexer.java | 142 +- .../index/change/ChangeSchemaDefinitions.java | 106 +- .../server/index/change/DummyChangeIndex.java | 16 +- .../index/change/IndexedChangeQuery.java | 48 +- .../index/change/ReindexAfterUpdate.java | 28 +- .../server/index/change/StalenessChecker.java | 106 +- .../server/index/group/AllGroupsIndexer.java | 63 +- .../gerrit/server/index/group/GroupField.java | 24 +- .../gerrit/server/index/group/GroupIndex.java | 5 +- .../index/group/GroupIndexCollection.java | 3 +- .../index/group/GroupIndexDefinition.java | 8 +- .../index/group/GroupIndexRewriter.java | 4 +- .../server/index/group/GroupIndexer.java | 1 - .../server/index/group/GroupIndexerImpl.java | 12 +- .../index/group/GroupSchemaDefinitions.java | 20 +- .../server/index/group/IndexedGroupQuery.java | 9 +- .../server/ioutil/BasicSerialization.java | 35 +- .../gerrit/server/ioutil/ColumnFormatter.java | 32 +- .../google/gerrit/server/mail/Address.java | 3 +- .../gerrit/server/mail/EmailSettings.java | 17 +- .../server/mail/EmailTokenVerifier.java | 6 +- .../google/gerrit/server/mail/Encryption.java | 4 +- .../google/gerrit/server/mail/MailFilter.java | 7 +- .../google/gerrit/server/mail/MailUtil.java | 33 +- .../mail/SignedTokenEmailTokenVerifier.java | 4 +- .../server/mail/receive/HtmlParser.java | 61 +- .../server/mail/receive/ImapMailReceiver.java | 27 +- .../server/mail/receive/MailComment.java | 5 +- .../server/mail/receive/MailMessage.java | 27 +- .../server/mail/receive/MailMetadata.java | 9 +- .../server/mail/receive/MailProcessor.java | 145 +- .../server/mail/receive/MailReceiver.java | 62 +- .../server/mail/receive/MetadataParser.java | 53 +- .../server/mail/receive/ParserUtil.java | 31 +- .../server/mail/receive/Pop3MailReceiver.java | 31 +- .../gerrit/server/mail/receive/Protocol.java | 4 +- .../server/mail/receive/RawMailParser.java | 62 +- .../server/mail/receive/TextParser.java | 27 +- .../server/mail/send/AbandonedSender.java | 8 +- .../gerrit/server/mail/send/AddKeySender.java | 15 +- .../server/mail/send/AddReviewerSender.java | 5 +- .../gerrit/server/mail/send/ChangeEmail.java | 93 +- .../server/mail/send/CommentFormatter.java | 47 +- .../server/mail/send/CommentSender.java | 270 +-- .../server/mail/send/CreateChangeSender.java | 22 +- .../mail/send/DeleteReviewerSender.java | 12 +- .../server/mail/send/DeleteVoteSender.java | 8 +- .../server/mail/send/EmailArguments.java | 14 +- .../gerrit/server/mail/send/EmailHeader.java | 21 +- .../gerrit/server/mail/send/EmailSender.java | 45 +- .../send/FromAddressGeneratorProvider.java | 63 +- .../server/mail/send/MailSoyTofuProvider.java | 11 +- .../server/mail/send/MailTemplates.java | 1 - .../gerrit/server/mail/send/MergedSender.java | 12 +- .../server/mail/send/NewChangeSender.java | 4 +- .../server/mail/send/NotificationEmail.java | 16 +- .../server/mail/send/OutgoingEmail.java | 64 +- .../mail/send/OutgoingEmailValidator.java | 2 +- .../gerrit/server/mail/send/ProjectWatch.java | 56 +- .../mail/send/RegisterNewEmailSender.java | 9 +- .../mail/send/ReplacePatchSetSender.java | 6 +- .../server/mail/send/ReplyToChangeSender.java | 3 +- .../server/mail/send/RestoredSender.java | 8 +- .../server/mail/send/RevertedSender.java | 5 +- .../server/mail/send/SetAssigneeSender.java | 6 +- .../server/mail/send/SmtpEmailSender.java | 121 +- .../mail/send/VelocityRuntimeProvider.java | 15 +- .../mime/DefaultFileExtensionRegistry.java | 11 +- .../gerrit/server/mime/FileTypeRegistry.java | 25 +- .../gerrit/server/mime/MimeUtil2Module.java | 4 +- .../server/mime/MimeUtilFileTypeRegistry.java | 34 +- .../server/notedb/AbstractChangeNotes.java | 36 +- .../server/notedb/AbstractChangeUpdate.java | 73 +- .../gerrit/server/notedb/ChangeBundle.java | 468 ++-- .../server/notedb/ChangeDraftUpdate.java | 86 +- .../gerrit/server/notedb/ChangeNoteUtil.java | 245 +-- .../gerrit/server/notedb/ChangeNotes.java | 229 +- .../server/notedb/ChangeNotesCache.java | 155 +- .../server/notedb/ChangeNotesCommit.java | 34 +- .../server/notedb/ChangeNotesParser.java | 274 ++- .../server/notedb/ChangeNotesState.java | 100 +- .../server/notedb/ChangeRevisionNote.java | 43 +- .../gerrit/server/notedb/ChangeUpdate.java | 175 +- .../server/notedb/ConfigNotesMigration.java | 36 +- .../server/notedb/DraftCommentNotes.java | 71 +- .../notedb/GwtormChangeBundleReader.java | 10 +- .../server/notedb/NoteDbChangeState.java | 171 +- .../gerrit/server/notedb/NoteDbMetrics.java | 96 +- .../gerrit/server/notedb/NoteDbModule.java | 62 +- .../server/notedb/NoteDbUpdateManager.java | 171 +- .../gerrit/server/notedb/NotesMigration.java | 75 +- .../gerrit/server/notedb/PatchSetState.java | 8 +- .../server/notedb/PrimaryStorageMigrator.java | 211 +- .../gerrit/server/notedb/RepoSequence.java | 69 +- .../server/notedb/ReviewerStateInternal.java | 12 +- .../gerrit/server/notedb/RevisionNote.java | 6 +- .../server/notedb/RevisionNoteBuilder.java | 25 +- .../server/notedb/RevisionNoteData.java | 2 +- .../gerrit/server/notedb/RevisionNoteMap.java | 36 +- .../server/notedb/RobotCommentNotes.java | 21 +- .../server/notedb/RobotCommentUpdate.java | 85 +- .../notedb/RobotCommentsRevisionNote.java | 18 +- .../notedb/RobotCommentsRevisionNoteData.java | 1 - .../notedb/TestChangeRebuilderWrapper.java | 26 +- .../server/notedb/rebuild/ApprovalEvent.java | 10 +- .../notedb/rebuild/ChangeMessageEvent.java | 19 +- .../notedb/rebuild/ChangeRebuilder.java | 36 +- .../notedb/rebuild/ChangeRebuilderImpl.java | 246 +-- .../server/notedb/rebuild/CommentEvent.java | 12 +- .../rebuild/ConflictingUpdateException.java | 7 +- .../notedb/rebuild/CreateChangeEvent.java | 10 +- .../notedb/rebuild/DraftCommentEvent.java | 12 +- .../gerrit/server/notedb/rebuild/Event.java | 34 +- .../server/notedb/rebuild/EventList.java | 25 +- .../server/notedb/rebuild/EventSorter.java | 23 +- .../notedb/rebuild/FinalUpdatesEvent.java | 19 +- .../server/notedb/rebuild/HashtagsEvent.java | 16 +- .../server/notedb/rebuild/PatchSetEvent.java | 18 +- .../server/notedb/rebuild/ReviewerEvent.java | 4 +- .../notedb/rebuild/StatusChangeEvent.java | 38 +- .../gerrit/server/patch/AutoMerger.java | 62 +- .../gerrit/server/patch/DiffExecutor.java | 7 +- .../server/patch/DiffExecutorModule.java | 8 +- .../gerrit/server/patch/DiffSummaryKey.java | 11 +- .../server/patch/DiffSummaryLoader.java | 10 +- .../server/patch/DiffSummaryWeigher.java | 23 +- .../gerrit/server/patch/IntraLineDiff.java | 11 +- .../server/patch/IntraLineDiffArgs.java | 21 +- .../gerrit/server/patch/IntraLineDiffKey.java | 7 +- .../gerrit/server/patch/IntraLineLoader.java | 91 +- .../gerrit/server/patch/IntraLineWeigher.java | 14 +- .../gerrit/server/patch/MergeListBuilder.java | 10 +- .../google/gerrit/server/patch/PatchFile.java | 25 +- .../google/gerrit/server/patch/PatchList.java | 34 +- .../gerrit/server/patch/PatchListCache.java | 10 +- .../server/patch/PatchListCacheImpl.java | 32 +- .../gerrit/server/patch/PatchListEntry.java | 54 +- .../gerrit/server/patch/PatchListKey.java | 46 +- .../gerrit/server/patch/PatchListLoader.java | 201 +- .../gerrit/server/patch/PatchListWeigher.java | 10 +- .../server/patch/PatchScriptBuilder.java | 91 +- .../server/patch/PatchScriptFactory.java | 78 +- .../server/patch/PatchSetInfoFactory.java | 32 +- .../PatchSetInfoNotAvailableException.java | 1 - .../com/google/gerrit/server/patch/Text.java | 57 +- .../AbstractPreloadedPluginScanner.java | 94 +- .../server/plugins/AutoRegisterModules.java | 76 +- .../server/plugins/AutoRegisterUtil.java | 1 - .../gerrit/server/plugins/CleanupHandle.java | 7 +- .../server/plugins/CopyConfigModule.java | 50 +- .../gerrit/server/plugins/DisablePlugin.java | 9 +- .../gerrit/server/plugins/EnablePlugin.java | 7 +- .../gerrit/server/plugins/InstallPlugin.java | 16 +- .../server/plugins/JarPluginProvider.java | 57 +- .../gerrit/server/plugins/JarScanner.java | 148 +- .../gerrit/server/plugins/JsPlugin.java | 13 +- .../gerrit/server/plugins/ListPlugins.java | 42 +- .../MultipleProvidersForPluginException.java | 14 +- .../google/gerrit/server/plugins/Plugin.java | 21 +- .../server/plugins/PluginCleanerTask.java | 19 +- .../server/plugins/PluginContentScanner.java | 61 +- .../gerrit/server/plugins/PluginEntry.java | 8 +- .../plugins/PluginGuiceEnvironment.java | 84 +- .../gerrit/server/plugins/PluginLoader.java | 210 +- .../server/plugins/PluginMetricMaker.java | 53 +- .../gerrit/server/plugins/PluginModule.java | 3 +- .../server/plugins/PluginScannerThread.java | 2 +- .../server/plugins/PluginsCollection.java | 9 +- .../gerrit/server/plugins/ReloadPlugin.java | 4 +- .../gerrit/server/plugins/ServerPlugin.java | 63 +- .../plugins/ServerPluginInfoModule.java | 40 +- .../server/plugins/ServerPluginProvider.java | 44 +- .../server/plugins/TestServerPlugin.java | 11 +- .../UniversalServerPluginProvider.java | 25 +- .../server/project/AccessControlModule.java | 7 +- .../gerrit/server/project/BanCommit.java | 12 +- .../server/project/BranchesCollection.java | 15 +- .../gerrit/server/project/ChangeControl.java | 120 +- .../server/project/CheckMergeability.java | 52 +- .../server/project/ChildProjectResource.java | 6 +- .../project/ChildProjectsCollection.java | 14 +- .../server/project/CommentLinkInfoImpl.java | 9 +- .../server/project/CommentLinkProvider.java | 12 +- .../server/project/CommitIncludedIn.java | 4 +- .../gerrit/server/project/CommitResource.java | 1 - .../server/project/CommitsCollection.java | 10 +- .../gerrit/server/project/ConfigInfoImpl.java | 90 +- .../gerrit/server/project/CreateBranch.java | 45 +- .../gerrit/server/project/CreateProject.java | 132 +- .../server/project/CreateProjectArgs.java | 1 - .../gerrit/server/project/CreateTag.java | 47 +- .../server/project/DashboardResource.java | 4 +- .../server/project/DashboardsCollection.java | 47 +- .../gerrit/server/project/DeleteBranch.java | 13 +- .../gerrit/server/project/DeleteBranches.java | 4 +- .../server/project/DeleteDashboard.java | 3 +- .../gerrit/server/project/DeleteRef.java | 74 +- .../gerrit/server/project/DeleteTag.java | 4 +- .../gerrit/server/project/DeleteTags.java | 4 +- .../gerrit/server/project/FileResource.java | 13 +- .../server/project/FilesCollection.java | 14 +- .../project/FilesInCommitCollection.java | 14 +- .../gerrit/server/project/GarbageCollect.java | 93 +- .../gerrit/server/project/GetAccess.java | 52 +- .../server/project/GetChildProject.java | 4 +- .../gerrit/server/project/GetCommit.java | 4 +- .../gerrit/server/project/GetConfig.java | 13 +- .../gerrit/server/project/GetContent.java | 8 +- .../gerrit/server/project/GetDashboard.java | 10 +- .../google/gerrit/server/project/GetHead.java | 11 +- .../gerrit/server/project/GetReflog.java | 54 +- .../gerrit/server/project/GetStatistics.java | 4 +- .../InvalidChangeOperationException.java | 1 - .../gerrit/server/project/ListBranches.java | 69 +- .../server/project/ListChildProjects.java | 19 +- .../gerrit/server/project/ListDashboards.java | 50 +- .../gerrit/server/project/ListProjects.java | 138 +- .../gerrit/server/project/ListTags.java | 90 +- .../PerRequestProjectControlCache.java | 4 +- .../server/project/PermissionCollection.java | 79 +- .../gerrit/server/project/ProjectCache.java | 13 +- .../server/project/ProjectCacheClock.java | 48 +- .../server/project/ProjectCacheImpl.java | 42 +- .../server/project/ProjectCacheWarmer.java | 60 +- .../gerrit/server/project/ProjectControl.java | 129 +- .../project/ProjectHierarchyIterator.java | 18 +- .../gerrit/server/project/ProjectJson.java | 7 +- .../gerrit/server/project/ProjectNode.java | 10 +- .../gerrit/server/project/ProjectRef.java | 1 + .../gerrit/server/project/ProjectState.java | 93 +- .../server/project/ProjectsCollection.java | 40 +- .../gerrit/server/project/PutBranch.java | 7 +- .../gerrit/server/project/PutConfig.java | 112 +- .../gerrit/server/project/PutDescription.java | 22 +- .../gerrit/server/project/PutProject.java | 3 +- .../google/gerrit/server/project/PutTag.java | 6 +- .../gerrit/server/project/RefControl.java | 108 +- .../gerrit/server/project/RefFilter.java | 2 - .../gerrit/server/project/RefPattern.java | 33 +- .../server/project/RefPatternMatcher.java | 20 +- .../gerrit/server/project/RefResource.java | 8 +- .../google/gerrit/server/project/RefUtil.java | 25 +- .../server/project/RefValidationHelper.java | 9 +- .../server/project/RepositoryStatistics.java | 6 +- .../gerrit/server/project/SectionMatcher.java | 9 +- .../server/project/SectionSortCache.java | 26 +- .../gerrit/server/project/SetAccess.java | 93 +- .../gerrit/server/project/SetDashboard.java | 6 +- .../server/project/SetDefaultDashboard.java | 36 +- .../google/gerrit/server/project/SetHead.java | 27 +- .../gerrit/server/project/SetParent.java | 61 +- .../server/project/SubmitRuleEvaluator.java | 238 ++- .../server/project/SubmitRuleOptions.java | 18 +- .../project/SuggestParentCandidates.java | 21 +- .../gerrit/server/project/TagsCollection.java | 13 +- .../gerrit/server/query/AndPredicate.java | 8 +- .../google/gerrit/server/query/AndSource.java | 17 +- .../gerrit/server/query/IntPredicate.java | 3 +- .../gerrit/server/query/InternalQuery.java | 30 +- .../server/query/IsVisibleToPredicate.java | 6 +- .../gerrit/server/query/NotPredicate.java | 8 +- .../server/query/OperatorPredicate.java | 4 +- .../gerrit/server/query/OrPredicate.java | 8 +- .../google/gerrit/server/query/Predicate.java | 39 +- .../gerrit/server/query/QueryBuilder.java | 119 +- .../gerrit/server/query/QueryProcessor.java | 56 +- .../gerrit/server/query/QueryResult.java | 23 +- .../account/AccountIsVisibleToPredicate.java | 6 +- .../query/account/AccountPredicates.java | 23 +- .../query/account/AccountQueryBuilder.java | 13 +- .../query/account/AccountQueryProcessor.java | 20 +- .../query/account/InternalAccountQuery.java | 32 +- .../server/query/change/AfterPredicate.java | 1 - .../server/query/change/AgePredicate.java | 1 - .../server/query/change/AndChangeSource.java | 19 +- .../server/query/change/AuthorPredicate.java | 3 +- .../server/query/change/BeforePredicate.java | 1 - .../server/query/change/ChangeData.java | 186 +- .../query/change/ChangeIndexPredicate.java | 3 +- .../change/ChangeIsVisibleToPredicate.java | 6 +- .../query/change/ChangeOperatorPredicate.java | 4 +- .../query/change/ChangeQueryBuilder.java | 317 +-- .../query/change/ChangeQueryProcessor.java | 30 +- .../query/change/ChangeRegexPredicate.java | 3 +- .../query/change/ChangeStatusPredicate.java | 22 +- .../query/change/CommentByPredicate.java | 1 - .../server/query/change/CommentPredicate.java | 6 +- .../server/query/change/CommitPredicate.java | 3 +- .../query/change/CommitterPredicate.java | 3 +- .../server/query/change/ConflictKey.java | 13 +- .../query/change/ConflictsCacheImpl.java | 6 +- .../query/change/ConflictsPredicate.java | 195 +- .../query/change/DestinationPredicate.java | 1 - .../query/change/EqualsFilePredicate.java | 3 +- .../query/change/EqualsLabelPredicate.java | 10 +- .../query/change/EqualsPathPredicate.java | 1 - .../server/query/change/GroupPredicate.java | 1 - .../server/query/change/HashtagPredicate.java | 1 - .../change/IntegerRangeChangePredicate.java | 8 +- .../query/change/InternalChangeQuery.java | 127 +- .../server/query/change/IsMergePredicate.java | 10 +- .../query/change/IsReviewedPredicate.java | 4 +- .../query/change/IsWatchedByPredicate.java | 19 +- .../server/query/change/LabelPredicate.java | 44 +- .../server/query/change/MessagePredicate.java | 11 +- .../gerrit/server/query/change/OrSource.java | 4 +- .../query/change/OutputStreamQuery.java | 92 +- .../server/query/change/OwnerinPredicate.java | 3 +- .../query/change/ParentProjectPredicate.java | 13 +- .../server/query/change/PredicateArgs.java | 18 +- .../server/query/change/QueryChanges.java | 50 +- .../query/change/RegexPathPredicate.java | 1 - .../query/change/RegexProjectPredicate.java | 1 - .../query/change/RegexRefPredicate.java | 1 - .../query/change/RegexTopicPredicate.java | 1 - .../query/change/ReviewerPredicate.java | 1 - .../query/change/ReviewerinPredicate.java | 3 +- .../server/query/change/SingleGroupUser.java | 9 +- .../server/query/change/StarPredicate.java | 3 +- .../query/change/SubmitRecordPredicate.java | 11 +- .../query/change/SubmittablePredicate.java | 3 +- .../change/TimestampRangeChangePredicate.java | 9 +- .../query/change/TrackingIdPredicate.java | 10 +- .../group/GroupIsVisibleToPredicate.java | 9 +- .../server/query/group/GroupPredicates.java | 22 +- .../server/query/group/GroupQueryBuilder.java | 11 +- .../query/group/GroupQueryProcessor.java | 21 +- .../google/gerrit/server/schema/AclUtil.java | 30 +- .../server/schema/AllProjectsCreator.java | 35 +- .../gerrit/server/schema/AllUsersCreator.java | 17 +- .../server/schema/BaseDataSourceType.java | 1 - .../com/google/gerrit/server/schema/DB2.java | 1 - .../server/schema/DataSourceProvider.java | 82 +- .../gerrit/server/schema/DataSourceType.java | 5 +- .../gerrit/server/schema/DatabaseModule.java | 7 +- .../google/gerrit/server/schema/Derby.java | 4 +- .../com/google/gerrit/server/schema/H2.java | 12 +- .../schema/H2AccountPatchReviewStore.java | 86 +- .../com/google/gerrit/server/schema/HANA.java | 4 +- .../com/google/gerrit/server/schema/JDBC.java | 1 - .../google/gerrit/server/schema/MaxDb.java | 4 +- .../google/gerrit/server/schema/MySql.java | 1 - .../schema/NotesMigrationSchemaFactory.java | 3 +- .../google/gerrit/server/schema/Oracle.java | 1 - .../gerrit/server/schema/PostgreSQL.java | 4 +- .../schema/ProjectConfigSchemaUpdate.java | 19 +- .../schema/ReviewDbDatabaseProvider.java | 1 - .../gerrit/server/schema/ReviewDbFactory.java | 16 +- .../gerrit/server/schema/SchemaCreator.java | 38 +- .../gerrit/server/schema/SchemaModule.java | 26 +- .../gerrit/server/schema/SchemaUpdater.java | 66 +- .../gerrit/server/schema/SchemaVersion.java | 65 +- .../server/schema/SchemaVersionCheck.java | 41 +- .../gerrit/server/schema/Schema_101.java | 24 +- .../gerrit/server/schema/Schema_102.java | 26 +- .../gerrit/server/schema/Schema_105.java | 31 +- .../gerrit/server/schema/Schema_106.java | 36 +- .../gerrit/server/schema/Schema_107.java | 1 - .../gerrit/server/schema/Schema_108.java | 46 +- .../gerrit/server/schema/Schema_115.java | 175 +- .../gerrit/server/schema/Schema_117.java | 10 +- .../gerrit/server/schema/Schema_119.java | 136 +- .../gerrit/server/schema/Schema_120.java | 44 +- .../gerrit/server/schema/Schema_123.java | 35 +- .../gerrit/server/schema/Schema_124.java | 61 +- .../gerrit/server/schema/Schema_125.java | 46 +- .../gerrit/server/schema/Schema_126.java | 16 +- .../gerrit/server/schema/Schema_127.java | 10 +- .../gerrit/server/schema/Schema_128.java | 17 +- .../gerrit/server/schema/Schema_129.java | 1 - .../gerrit/server/schema/Schema_130.java | 27 +- .../gerrit/server/schema/Schema_131.java | 21 +- .../gerrit/server/schema/Schema_135.java | 21 +- .../gerrit/server/schema/Schema_139.java | 268 +-- .../gerrit/server/schema/Schema_83.java | 13 +- .../gerrit/server/schema/Schema_87.java | 17 +- .../gerrit/server/schema/Schema_89.java | 10 +- .../gerrit/server/schema/Schema_90.java | 1 - .../gerrit/server/schema/Schema_94.java | 4 +- .../gerrit/server/schema/Schema_95.java | 7 +- .../gerrit/server/schema/Schema_98.java | 11 +- .../gerrit/server/schema/ScriptRunner.java | 11 +- .../google/gerrit/server/schema/UpdateUI.java | 4 +- .../securestore/DefaultSecureStore.java | 22 +- .../server/securestore/SecureStore.java | 55 +- .../securestore/SecureStoreClassName.java | 4 +- .../securestore/SecureStoreProvider.java | 14 +- .../google/gerrit/server/ssh/NoSshInfo.java | 1 - .../gerrit/server/ssh/NoSshKeyCache.java | 6 +- .../google/gerrit/server/ssh/NoSshModule.java | 4 +- .../gerrit/server/ssh/SshAddressesModule.java | 18 +- .../server/ssh/SshAdvertisedAddresses.java | 7 +- .../com/google/gerrit/server/ssh/SshInfo.java | 1 - .../gerrit/server/ssh/SshKeyCreator.java | 3 +- .../gerrit/server/ssh/SshListenAddresses.java | 8 +- .../gerrit/server/tools/ToolsCatalog.java | 28 +- .../server/util/FallbackRequestContext.java | 7 +- .../util/GuiceRequestScopePropagator.java | 11 +- .../gerrit/server/util/HostPlatform.java | 19 +- .../gerrit/server/util/IdGenerator.java | 30 +- .../google/gerrit/server/util/LabelVote.java | 13 +- .../gerrit/server/util/MagicBranch.java | 36 +- .../server/util/ManualRequestContext.java | 18 +- .../server/util/MostSpecificComparator.java | 38 +- .../server/util/OneOffRequestContext.java | 22 +- .../gerrit/server/util/PluginLogFile.java | 10 +- .../server/util/PluginRequestContext.java | 3 +- .../google/gerrit/server/util/RangeUtil.java | 4 +- .../gerrit/server/util/RegexListSearcher.java | 8 +- .../gerrit/server/util/RequestContext.java | 5 +- .../google/gerrit/server/util/RequestId.java | 15 +- .../server/util/RequestScopePropagator.java | 120 +- .../server/util/ServerRequestContext.java | 3 +- .../google/gerrit/server/util/SocketUtil.java | 10 +- .../server/util/SubmoduleSectionParser.java | 36 +- .../google/gerrit/server/util/SystemLog.java | 28 +- .../util/ThreadLocalRequestContext.java | 18 +- .../ThreadLocalRequestScopePropagator.java | 31 +- .../gerrit/server/util/TreeFormatter.java | 8 +- .../AssigneeValidationListener.java | 4 +- .../GroupCreationValidationListener.java | 9 +- .../validators/HashtagValidationListener.java | 9 +- .../OutgoingEmailValidationListener.java | 23 +- .../ProjectCreationValidationListener.java | 9 +- .../AbstractCommitUserIdentityPredicate.java | 1 - .../gerrit/PRED__load_commit_labels_1.java | 20 +- .../java/gerrit/PRED__user_label_range_4.java | 1 - .../java/gerrit/PRED_change_branch_1.java | 1 - .../main/java/gerrit/PRED_change_owner_1.java | 1 - .../java/gerrit/PRED_change_project_1.java | 1 - .../main/java/gerrit/PRED_change_topic_1.java | 1 - .../java/gerrit/PRED_commit_author_3.java | 1 - .../java/gerrit/PRED_commit_committer_3.java | 1 - .../main/java/gerrit/PRED_commit_delta_4.java | 20 +- .../main/java/gerrit/PRED_commit_edits_2.java | 20 +- .../java/gerrit/PRED_commit_message_1.java | 1 - .../main/java/gerrit/PRED_commit_stats_3.java | 10 +- .../main/java/gerrit/PRED_current_user_1.java | 4 +- .../main/java/gerrit/PRED_current_user_2.java | 8 +- .../gerrit/PRED_get_legacy_label_types_1.java | 23 +- .../PRED_project_default_submit_type_1.java | 1 - .../src/main/java/gerrit/PRED_uploader_1.java | 13 +- .../metrics/proc/ProcMetricModuleTest.java | 82 +- .../google/gerrit/rules/GerritCommonTest.java | 56 +- .../google/gerrit/rules/PrologTestCase.java | 36 +- .../google/gerrit/server/ChangeUtilTest.java | 3 +- .../gerrit/server/IdentifiedUserTest.java | 76 +- .../google/gerrit/server/StringUtilTest.java | 34 +- .../server/account/AuthorizedKeysTest.java | 57 +- .../account/UniversalGroupBackendTest.java | 40 +- .../server/account/WatchConfigTest.java | 112 +- .../gerrit/server/change/HashtagsTest.java | 22 +- .../server/change/IncludedInResolverTest.java | 64 +- .../gerrit/server/change/WalkSorterTest.java | 170 +- .../gerrit/server/config/ConfigUtilTest.java | 7 +- .../server/config/ListCapabilitiesTest.java | 37 +- .../server/config/RepositoryConfigTest.java | 83 +- .../server/config/ScheduleConfigTest.java | 11 +- .../gerrit/server/config/SitePathsTest.java | 7 +- .../gerrit/server/edit/ChangeEditTest.java | 1 - .../server/events/EventDeserializerTest.java | 33 +- .../gerrit/server/events/EventTypesTest.java | 5 +- .../gerrit/server/git/BatchUpdateTest.java | 72 +- .../server/git/DestinationListTest.java | 8 +- .../gerrit/server/git/GroupCollectorTest.java | 171 +- .../gerrit/server/git/GroupListTest.java | 24 +- .../server/git/LabelNormalizerTest.java | 85 +- .../git/LocalDiskRepositoryManagerTest.java | 26 +- ...ltiBaseLocalDiskRepositoryManagerTest.java | 78 +- .../gerrit/server/git/ProjectConfigTest.java | 324 +-- .../gerrit/server/git/QueryListTest.java | 6 +- .../gerrit/server/index/SchemaUtilTest.java | 29 +- .../server/index/change/ChangeFieldTest.java | 44 +- .../index/change/ChangeIndexRewriterTest.java | 98 +- .../server/index/change/FakeChangeIndex.java | 16 +- .../server/index/change/FakeQueryBuilder.java | 12 +- .../index/change/StalenessCheckerTest.java | 109 +- .../server/ioutil/BasicSerializationTest.java | 32 +- .../server/ioutil/ColumnFormatterTest.java | 54 +- .../gerrit/server/mail/AddressTest.java | 6 +- .../gerrit/server/mail/ValidatorTest.java | 22 +- .../mail/receive/AbstractParserTest.java | 33 +- .../mail/receive/GenericHtmlParserTest.java | 160 +- .../mail/receive/GmailHtmlParserTest.java | 160 +- .../server/mail/receive/HtmlParserTest.java | 73 +- .../mail/receive/MetadataParserTest.java | 49 +- .../mail/receive/RawMailParserTest.java | 34 +- .../server/mail/receive/TextParserTest.java | 252 ++- .../mail/receive/data/AttachmentMessage.java | 78 +- .../receive/data/Base64HeaderMessage.java | 36 +- .../mail/receive/data/HtmlMimeMessage.java | 107 +- .../mail/receive/data/NonUTF8Message.java | 36 +- .../data/QuotedPrintableHeaderMessage.java | 36 +- .../mail/receive/data/RawMailMessage.java | 6 +- .../mail/receive/data/SimpleTextMessage.java | 178 +- .../mail/send/CommentFormatterTest.java | 114 +- .../FromAddressGeneratorProviderTest.java | 19 +- .../notedb/AbstractChangeNotesTest.java | 145 +- .../server/notedb/ChangeBundleTest.java | 1537 +++++++------ .../server/notedb/ChangeNotesParserTest.java | 688 +++--- .../gerrit/server/notedb/ChangeNotesTest.java | 1825 ++++++++++------ .../notedb/CommitMessageOutputTest.java | 306 +-- .../server/notedb/NoteDbChangeStateTest.java | 107 +- .../server/notedb/RepoSequenceTest.java | 104 +- .../notedb/rebuild/EventSorterTest.java | 42 +- .../server/patch/IntraLineLoaderTest.java | 63 +- .../server/patch/PatchListEntryTest.java | 1 - .../server/project/ProjectControlTest.java | 31 +- .../gerrit/server/project/RefControlTest.java | 283 ++- .../google/gerrit/server/project/Util.java | 126 +- .../gerrit/server/query/AndPredicateTest.java | 7 +- .../server/query/FieldPredicateTest.java | 5 +- .../gerrit/server/query/NotPredicateTest.java | 8 +- .../gerrit/server/query/OrPredicateTest.java | 7 +- .../gerrit/server/query/PredicateTest.java | 1 - .../gerrit/server/query/QueryParserTest.java | 4 +- .../account/AbstractQueryAccountsTest.java | 188 +- .../account/LuceneQueryAccountsTest.java | 4 +- .../change/AbstractQueryChangesTest.java | 589 +++-- .../server/query/change/ChangeDataTest.java | 1 - .../query/change/LuceneQueryChangesTest.java | 10 +- .../query/change/RegexPathPredicateTest.java | 7 +- .../query/group/AbstractQueryGroupsTest.java | 176 +- .../query/group/LuceneQueryGroupsTest.java | 4 +- .../server/schema/SchemaCreatorTest.java | 34 +- .../server/schema/SchemaUpdaterTest.java | 117 +- .../server/tools/hooks/CommitMsgHookTest.java | 684 ++++-- .../server/tools/hooks/HookTestCase.java | 24 +- .../gerrit/server/util/IdGeneratorTest.java | 3 +- .../gerrit/server/util/LabelVoteTest.java | 15 +- .../util/MostSpecificComparatorTest.java | 14 +- .../gerrit/server/util/ParboiledTest.java | 19 +- .../server/util/RegexListSearcherTest.java | 24 +- .../gerrit/server/util/SocketUtilTest.java | 48 +- .../google/gerrit/testutil/ConfigSuite.java | 89 +- .../gerrit/testutil/FakeAccountCache.java | 7 +- .../gerrit/testutil/FakeEmailSender.java | 38 +- .../gerrit/testutil/GerritBaseTests.java | 4 +- .../gerrit/testutil/GerritServerTests.java | 36 +- .../gerrit/testutil/InMemoryDatabase.java | 58 +- .../gerrit/testutil/InMemoryModule.java | 100 +- .../testutil/InMemoryRepositoryManager.java | 14 +- .../google/gerrit/testutil/NoteDbChecker.java | 48 +- .../google/gerrit/testutil/NoteDbMode.java | 15 +- .../com/google/gerrit/testutil/SshMode.java | 11 +- .../google/gerrit/testutil/TempFileUtil.java | 3 +- .../google/gerrit/testutil/TestChanges.java | 90 +- .../gerrit/testutil/TestNotesMigration.java | 6 +- .../google/gerrit/testutil/TestTimeUtil.java | 36 +- .../gerrit/sshd/AbstractGitCommand.java | 60 +- .../gerrit/sshd/AdminHighPriorityCommand.java | 10 +- .../com/google/gerrit/sshd/AliasCommand.java | 21 +- .../gerrit/sshd/AliasCommandProvider.java | 4 +- .../com/google/gerrit/sshd/BaseCommand.java | 143 +- .../gerrit/sshd/ChangeArgumentParser.java | 32 +- .../google/gerrit/sshd/CommandExecutor.java | 4 +- .../gerrit/sshd/CommandExecutorProvider.java | 3 +- .../sshd/CommandExecutorQueueProvider.java | 31 +- .../gerrit/sshd/CommandFactoryProvider.java | 129 +- .../google/gerrit/sshd/CommandMetaData.java | 11 +- .../com/google/gerrit/sshd/CommandModule.java | 57 +- .../com/google/gerrit/sshd/CommandName.java | 5 +- .../google/gerrit/sshd/CommandProvider.java | 1 - .../java/com/google/gerrit/sshd/Commands.java | 19 +- .../gerrit/sshd/DatabasePubKeyAuth.java | 55 +- .../google/gerrit/sshd/DispatchCommand.java | 33 +- .../gerrit/sshd/DispatchCommandProvider.java | 29 +- .../gerrit/sshd/GerritGSSAuthenticator.java | 21 +- .../google/gerrit/sshd/HostKeyProvider.java | 19 +- .../java/com/google/gerrit/sshd/NoShell.java | 30 +- .../gerrit/sshd/PluginCommandModule.java | 2 - .../sshd/SingleCommandPluginModule.java | 5 +- .../sshd/SshAutoRegisterModuleGenerator.java | 33 +- .../com/google/gerrit/sshd/SshCommand.java | 32 +- .../com/google/gerrit/sshd/SshDaemon.java | 476 ++--- .../google/gerrit/sshd/SshHostKeyModule.java | 1 - .../google/gerrit/sshd/SshKeyCacheEntry.java | 1 - .../google/gerrit/sshd/SshKeyCacheImpl.java | 29 +- .../google/gerrit/sshd/SshKeyCreatorImpl.java | 15 +- .../java/com/google/gerrit/sshd/SshLog.java | 73 +- .../com/google/gerrit/sshd/SshLogLayout.java | 12 +- .../com/google/gerrit/sshd/SshModule.java | 43 +- .../gerrit/sshd/SshPluginStarterCallback.java | 15 +- .../gerrit/sshd/SshRemotePeerProvider.java | 1 - .../java/com/google/gerrit/sshd/SshScope.java | 47 +- .../com/google/gerrit/sshd/SshSession.java | 4 +- .../java/com/google/gerrit/sshd/SshUtil.java | 42 +- .../gerrit/sshd/StreamCommandExecutor.java | 4 +- .../sshd/StreamCommandExecutorProvider.java | 24 +- .../java/com/google/gerrit/sshd/SuExec.java | 24 +- .../gerrit/sshd/commands/AdminQueryShell.java | 24 +- .../gerrit/sshd/commands/AdminSetParent.java | 106 +- .../gerrit/sshd/commands/ApproveOption.java | 23 +- .../gerrit/sshd/commands/AproposCommand.java | 20 +- .../sshd/commands/BanCommitCommand.java | 46 +- .../sshd/commands/BaseTestPrologCommand.java | 38 +- .../gerrit/sshd/commands/CloseConnection.java | 37 +- .../sshd/commands/CreateAccountCommand.java | 32 +- .../sshd/commands/CreateBranchCommand.java | 16 +- .../sshd/commands/CreateGroupCommand.java | 75 +- .../sshd/commands/CreateProjectCommand.java | 114 +- .../sshd/commands/DefaultCommandModule.java | 8 +- .../gerrit/sshd/commands/FlushCaches.java | 27 +- .../commands/GarbageCollectionCommand.java | 48 +- .../sshd/commands/IndexActivateCommand.java | 10 +- .../sshd/commands/IndexChangesCommand.java | 23 +- .../sshd/commands/IndexStartCommand.java | 7 +- .../gerrit/sshd/commands/KillCommand.java | 10 +- .../sshd/commands/ListGroupsCommand.java | 53 +- .../commands/ListLoggingLevelCommand.java | 18 +- .../sshd/commands/ListMembersCommand.java | 27 +- .../sshd/commands/ListProjectsCommand.java | 11 +- .../gerrit/sshd/commands/LsUserRefs.java | 72 +- .../gerrit/sshd/commands/PatchSetParser.java | 28 +- .../sshd/commands/PluginEnableCommand.java | 10 +- .../sshd/commands/PluginInstallCommand.java | 24 +- .../gerrit/sshd/commands/PluginLsCommand.java | 6 +- .../sshd/commands/PluginReloadCommand.java | 10 +- .../sshd/commands/PluginRemoveCommand.java | 10 +- .../google/gerrit/sshd/commands/Query.java | 30 +- .../gerrit/sshd/commands/QueryShell.java | 132 +- .../google/gerrit/sshd/commands/Receive.java | 74 +- .../sshd/commands/RenameGroupCommand.java | 23 +- .../gerrit/sshd/commands/ReviewCommand.java | 91 +- .../gerrit/sshd/commands/ScpCommand.java | 33 +- .../sshd/commands/SetAccountCommand.java | 132 +- .../gerrit/sshd/commands/SetHeadCommand.java | 1 - .../sshd/commands/SetLoggingLevelCommand.java | 23 +- .../sshd/commands/SetMembersCommand.java | 111 +- .../sshd/commands/SetProjectCommand.java | 74 +- .../sshd/commands/SetReviewersCommand.java | 50 +- .../gerrit/sshd/commands/ShowCaches.java | 166 +- .../gerrit/sshd/commands/ShowConnections.java | 108 +- .../gerrit/sshd/commands/ShowQueue.java | 80 +- .../gerrit/sshd/commands/StreamEvents.java | 107 +- .../sshd/commands/TestSubmitRuleCommand.java | 3 +- .../sshd/commands/TestSubmitTypeCommand.java | 3 +- .../google/gerrit/sshd/commands/Upload.java | 46 +- .../gerrit/sshd/commands/UploadArchive.java | 125 +- .../gerrit/sshd/commands/VersionCommand.java | 3 +- .../sshd/plugin/LfsPluginAuthCommand.java | 16 +- .../ProjectConfigParamParserTest.java | 7 +- .../extensions/client/RangeSubject.java | 9 +- .../extensions/common/CommitInfoSubject.java | 17 +- .../extensions/common/EditInfoSubject.java | 13 +- .../common/FixReplacementInfoSubject.java | 30 +- .../common/FixSuggestionInfoSubject.java | 40 +- .../extensions/common/GitPersonSubject.java | 13 +- .../common/RobotCommentInfoSubject.java | 45 +- .../restapi/BinaryResultSubject.java | 28 +- .../com/google/gerrit/truth/ListSubject.java | 15 +- .../google/gerrit/truth/OptionalSubject.java | 27 +- .../google/gerrit/util/cli/CmdLineParser.java | 75 +- .../gerrit/util/cli/EndOfOptionsHandler.java | 4 +- .../gerrit/util/cli/OptionHandlerFactory.java | 4 +- .../gerrit/util/cli/OptionHandlerUtil.java | 11 +- .../gerrit/util/cli/OptionHandlers.java | 7 +- .../google/gerrit/util/http/RequestUtil.java | 11 +- .../gerrit/util/http/RequestUtilTest.java | 44 +- .../http/testutil/FakeHttpServletRequest.java | 18 +- .../testutil/FakeHttpServletResponse.java | 43 +- .../util/ssl/BlindSSLSocketFactory.java | 35 +- .../httpd/ReviewDbDataSourceProvider.java | 7 +- .../google/gerrit/httpd/SiteInitializer.java | 29 +- .../SitePathFromSystemConfigProvider.java | 11 +- .../gerrit/httpd/UnzippedDistribution.java | 8 +- .../gerrit/httpd/WebAppInitializer.java | 164 +- lib/asciidoctor/java/AsciiDoctor.java | 69 +- lib/asciidoctor/java/DocIndexer.java | 52 +- lib/prolog/java/BuckPrologCompiler.java | 4 +- 2443 files changed, 54816 insertions(+), 57825 deletions(-) diff --git a/contrib/convertkey/src/main/java/com/googlesource/gerrit/convertkey/ConvertKey.java b/contrib/convertkey/src/main/java/com/googlesource/gerrit/convertkey/ConvertKey.java index 5c6ef58acb..08a529c7bd 100644 --- a/contrib/convertkey/src/main/java/com/googlesource/gerrit/convertkey/ConvertKey.java +++ b/contrib/convertkey/src/main/java/com/googlesource/gerrit/convertkey/ConvertKey.java @@ -16,17 +16,14 @@ package com.googlesource.gerrit.convertkey; import com.jcraft.jsch.HostKey; import com.jcraft.jsch.JSchException; - -import org.apache.sshd.common.util.Buffer; -import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider; - -import org.bouncycastle.openssl.jcajce.JcaPEMWriter; - import java.io.File; import java.io.IOException; import java.io.StringWriter; -import java.security.KeyPair; import java.security.GeneralSecurityException; +import java.security.KeyPair; +import org.apache.sshd.common.util.Buffer; +import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider; +import org.bouncycastle.openssl.jcajce.JcaPEMWriter; public class ConvertKey { public static void main(String[] args) @@ -69,5 +66,4 @@ public class ConvertKey { System.out.println(privout); } } - } diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java index 2a0245b8f1..b7358d67b3 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java @@ -107,7 +107,22 @@ import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.SchemaFactory; import com.google.inject.Inject; import com.google.inject.Provider; - +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.regex.Pattern; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.RepositoryNotFoundException; @@ -139,122 +154,71 @@ import org.junit.runner.Description; import org.junit.runner.RunWith; import org.junit.runners.model.Statement; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.regex.Pattern; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; - @RunWith(ConfigSuite.class) public abstract class AbstractDaemonTest { private static GerritServer commonServer; - @ConfigSuite.Parameter - public Config baseConfig; + @ConfigSuite.Parameter public Config baseConfig; - @ConfigSuite.Name - private String configName; + @ConfigSuite.Name private String configName; - @Inject - protected AllProjectsName allProjects; + @Inject protected AllProjectsName allProjects; - @Inject - protected AccountCreator accounts; + @Inject protected AccountCreator accounts; - @Inject - private SchemaFactory reviewDbProvider; + @Inject private SchemaFactory reviewDbProvider; - @Inject - protected GerritApi gApi; + @Inject protected GerritApi gApi; - @Inject - protected AcceptanceTestRequestScope atrScope; + @Inject protected AcceptanceTestRequestScope atrScope; - @Inject - protected AccountCache accountCache; + @Inject protected AccountCache accountCache; - @Inject - protected IdentifiedUser.GenericFactory identifiedUserFactory; + @Inject protected IdentifiedUser.GenericFactory identifiedUserFactory; - @Inject - protected PushOneCommit.Factory pushFactory; + @Inject protected PushOneCommit.Factory pushFactory; - @Inject - protected MetaDataUpdate.Server metaDataUpdateFactory; + @Inject protected MetaDataUpdate.Server metaDataUpdateFactory; - @Inject - protected ProjectCache projectCache; + @Inject protected ProjectCache projectCache; - @Inject - protected GroupCache groupCache; + @Inject protected GroupCache groupCache; - @Inject - protected GitRepositoryManager repoManager; + @Inject protected GitRepositoryManager repoManager; - @Inject - protected ChangeIndexer indexer; + @Inject protected ChangeIndexer indexer; - @Inject - protected Provider queryProvider; + @Inject protected Provider queryProvider; - @Inject - @CanonicalWebUrl - protected Provider canonicalWebUrl; + @Inject @CanonicalWebUrl protected Provider canonicalWebUrl; - @Inject - @GerritServerConfig - protected Config cfg; + @Inject @GerritServerConfig protected Config cfg; - @Inject - private InProcessProtocol inProcessProtocol; + @Inject private InProcessProtocol inProcessProtocol; - @Inject - private Provider anonymousUser; + @Inject private Provider anonymousUser; - @Inject - @GerritPersonIdent - protected Provider serverIdent; + @Inject @GerritPersonIdent protected Provider serverIdent; - @Inject - protected ChangeData.Factory changeDataFactory; + @Inject protected ChangeData.Factory changeDataFactory; - @Inject - protected PatchSetUtil psUtil; + @Inject protected PatchSetUtil psUtil; - @Inject - protected ChangeFinder changeFinder; + @Inject protected ChangeFinder changeFinder; - @Inject - protected Revisions revisions; + @Inject protected Revisions revisions; - @Inject - protected FakeEmailSender sender; + @Inject protected FakeEmailSender sender; - @Inject - protected ChangeNoteUtil changeNoteUtil; + @Inject protected ChangeNoteUtil changeNoteUtil; - @Inject - protected ChangeResource.Factory changeResourceFactory; + @Inject protected ChangeResource.Factory changeResourceFactory; - @Inject - protected SystemGroupBackend systemGroupBackend; + @Inject protected SystemGroupBackend systemGroupBackend; - @Inject - private EventRecorder.Factory eventRecorderFactory; + @Inject private EventRecorder.Factory eventRecorderFactory; - @Inject - private ChangeIndexCollection changeIndexes; + @Inject private ChangeIndexCollection changeIndexes; protected TestRepository testRepo; protected GerritServer server; @@ -268,42 +232,38 @@ public abstract class AbstractDaemonTest { protected Project.NameKey project; protected EventRecorder eventRecorder; - @Inject - protected TestNotesMigration notesMigration; + @Inject protected TestNotesMigration notesMigration; - @Inject - protected ChangeNotes.Factory notesFactory; + @Inject protected ChangeNotes.Factory notesFactory; - @Inject - protected Abandon changeAbandoner; + @Inject protected Abandon changeAbandoner; - @Rule - public ExpectedException exception = ExpectedException.none(); + @Rule public ExpectedException exception = ExpectedException.none(); private String resourcePrefix; private List toClose; private boolean useSsh; @Rule - public TestRule testRunner = new TestRule() { - @Override - public Statement apply(final Statement base, final Description description) { - return new Statement() { + public TestRule testRunner = + new TestRule() { @Override - public void evaluate() throws Throwable { - beforeTest(description); - try { - base.evaluate(); - } finally { - afterTest(); - } + public Statement apply(final Statement base, final Description description) { + return new Statement() { + @Override + public void evaluate() throws Throwable { + beforeTest(description); + try { + base.evaluate(); + } finally { + afterTest(); + } + } + }; } }; - } - }; - @Rule - public TemporaryFolder tempSiteDir = new TemporaryFolder(); + @Rule public TemporaryFolder tempSiteDir = new TemporaryFolder(); @Before public void clearSender() { @@ -368,15 +328,13 @@ public abstract class AbstractDaemonTest { protected void beforeTest(Description description) throws Exception { GerritServer.Description classDesc = - GerritServer.Description.forTestClass(description, configName); + GerritServer.Description.forTestClass(description, configName); GerritServer.Description methodDesc = - GerritServer.Description.forTestMethod(description, configName); + GerritServer.Description.forTestMethod(description, configName); - baseConfig.setString("gerrit", null, "tempSiteDir", - tempSiteDir.getRoot().getPath()); + baseConfig.setString("gerrit", null, "tempSiteDir", tempSiteDir.getRoot().getPath()); baseConfig.setInt("receive", null, "changeUpdateThreads", 4); - if (classDesc.equals(methodDesc) && !classDesc.sandboxed() && - !methodDesc.sandboxed()) { + if (classDesc.equals(methodDesc) && !classDesc.sandboxed() && !methodDesc.sandboxed()) { if (commonServer == null) { commonServer = GerritServer.start(classDesc, baseConfig); } @@ -403,8 +361,7 @@ public abstract class AbstractDaemonTest { if (classDesc.useSsh() || methodDesc.useSsh()) { useSsh = true; - if (SshMode.useSsh() && (adminSshSession == null || - userSshSession == null)) { + if (SshMode.useSsh() && (adminSshSession == null || userSshSession == null)) { // Create Ssh sessions initSsh(admin); Context ctx = newRequestContext(user); @@ -420,9 +377,10 @@ public abstract class AbstractDaemonTest { useSsh = false; } - resourcePrefix = UNSAFE_PROJECT_NAME.matcher( - description.getClassName() + "_" - + description.getMethodName() + "_").replaceAll(""); + resourcePrefix = + UNSAFE_PROJECT_NAME + .matcher(description.getClassName() + "_" + description.getMethodName() + "_") + .replaceAll(""); Context ctx = newRequestContext(admin); atrScope.set(ctx); @@ -455,8 +413,7 @@ public abstract class AbstractDaemonTest { return in; } - private static final Pattern UNSAFE_PROJECT_NAME = - Pattern.compile("[^a-zA-Z0-9._/-]+"); + private static final Pattern UNSAFE_PROJECT_NAME = Pattern.compile("[^a-zA-Z0-9._/-]+"); protected Git git() { return testRepo.git(); @@ -468,10 +425,9 @@ public abstract class AbstractDaemonTest { /** * Return a resource name scoped to this test method. - *

- * Test methods in a single class by default share a running server. For any - * resource name you require to be unique to a test method, wrap it in a call - * to this method. + * + *

Test methods in a single class by default share a running server. For any resource name you + * require to be unique to a test method, wrap it in a call to this method. * * @param name resource name (group, project, topic, etc.) * @return name prefixed by a string unique to this test method. @@ -480,31 +436,31 @@ public abstract class AbstractDaemonTest { return resourcePrefix + name; } - protected Project.NameKey createProject(String nameSuffix) - throws RestApiException { + protected Project.NameKey createProject(String nameSuffix) throws RestApiException { return createProject(nameSuffix, null); } - protected Project.NameKey createProject(String nameSuffix, - Project.NameKey parent) throws RestApiException { + protected Project.NameKey createProject(String nameSuffix, Project.NameKey parent) + throws RestApiException { // Default for createEmptyCommit should match TestProjectConfig. return createProject(nameSuffix, parent, true, null); } - protected Project.NameKey createProject(String nameSuffix, - Project.NameKey parent, boolean createEmptyCommit) throws RestApiException { + protected Project.NameKey createProject( + String nameSuffix, Project.NameKey parent, boolean createEmptyCommit) + throws RestApiException { // Default for createEmptyCommit should match TestProjectConfig. return createProject(nameSuffix, parent, createEmptyCommit, null); } - protected Project.NameKey createProject(String nameSuffix, - Project.NameKey parent, SubmitType submitType) throws RestApiException { + protected Project.NameKey createProject( + String nameSuffix, Project.NameKey parent, SubmitType submitType) throws RestApiException { // Default for createEmptyCommit should match TestProjectConfig. return createProject(nameSuffix, parent, true, submitType); } - protected Project.NameKey createProject(String nameSuffix, - Project.NameKey parent, boolean createEmptyCommit, SubmitType submitType) + protected Project.NameKey createProject( + String nameSuffix, Project.NameKey parent, boolean createEmptyCommit, SubmitType submitType) throws RestApiException { ProjectInput in = new ProjectInput(); in.name = name(nameSuffix); @@ -514,8 +470,7 @@ public abstract class AbstractDaemonTest { return createProject(in); } - private Project.NameKey createProject(ProjectInput in) - throws RestApiException { + private Project.NameKey createProject(ProjectInput in) throws RestApiException { gApi.projects().create(in); return new Project.NameKey(in.name); } @@ -529,19 +484,18 @@ public abstract class AbstractDaemonTest { // Default implementation does nothing. } - protected TestRepository cloneProject(Project.NameKey p) - throws Exception { + protected TestRepository cloneProject(Project.NameKey p) throws Exception { return cloneProject(p, admin); } - protected TestRepository cloneProject(Project.NameKey p, - TestAccount testAccount) throws Exception { - InProcessProtocol.Context ctx = new InProcessProtocol.Context( - reviewDbProvider, identifiedUserFactory, testAccount.getId(), p); + protected TestRepository cloneProject( + Project.NameKey p, TestAccount testAccount) throws Exception { + InProcessProtocol.Context ctx = + new InProcessProtocol.Context( + reviewDbProvider, identifiedUserFactory, testAccount.getId(), p); Repository repo = repoManager.openRepository(p); toClose.add(repo); - return GitUtil.cloneProject( - p, inProcessProtocol.register(ctx, repo).toString()); + return GitUtil.cloneProject(p, inProcessProtocol.register(ctx, repo).toString()); } private void afterTest() throws Exception { @@ -590,28 +544,43 @@ public abstract class AbstractDaemonTest { return result; } - protected PushOneCommit.Result createMergeCommitChange(String ref) - throws Exception { + protected PushOneCommit.Result createMergeCommitChange(String ref) throws Exception { return createMergeCommitChange(ref, "foo"); } - protected PushOneCommit.Result createMergeCommitChange(String ref, String file) - throws Exception { + protected PushOneCommit.Result createMergeCommitChange(String ref, String file) throws Exception { ObjectId initial = repo().exactRef(HEAD).getLeaf().getObjectId(); - PushOneCommit.Result p1 = pushFactory.create(db, admin.getIdent(), - testRepo, "parent 1", ImmutableMap.of(file, "foo-1", "bar", "bar-1")) - .to(ref); + PushOneCommit.Result p1 = + pushFactory + .create( + db, + admin.getIdent(), + testRepo, + "parent 1", + ImmutableMap.of(file, "foo-1", "bar", "bar-1")) + .to(ref); // reset HEAD in order to create a sibling of the first change testRepo.reset(initial); - PushOneCommit.Result p2 = pushFactory.create(db, admin.getIdent(), - testRepo, "parent 2", ImmutableMap.of(file, "foo-2", "bar", "bar-2")) - .to(ref); + PushOneCommit.Result p2 = + pushFactory + .create( + db, + admin.getIdent(), + testRepo, + "parent 2", + ImmutableMap.of(file, "foo-2", "bar", "bar-2")) + .to(ref); - PushOneCommit m = pushFactory.create(db, admin.getIdent(), testRepo, "merge", - ImmutableMap.of(file, "foo-1", "bar", "bar-2")); + PushOneCommit m = + pushFactory.create( + db, + admin.getIdent(), + testRepo, + "merge", + ImmutableMap.of(file, "foo-1", "bar", "bar-2")); m.setParents(ImmutableList.of(p1.getCommit(), p2.getCommit())); PushOneCommit.Result result = m.to(ref); result.assertOkStatus(); @@ -622,26 +591,29 @@ public abstract class AbstractDaemonTest { return pushTo("refs/drafts/master"); } - protected PushOneCommit.Result createChange(String subject, - String fileName, String content) throws Exception { - PushOneCommit push = pushFactory.create( - db, admin.getIdent(), testRepo, subject, fileName, content); + protected PushOneCommit.Result createChange(String subject, String fileName, String content) + throws Exception { + PushOneCommit push = + pushFactory.create(db, admin.getIdent(), testRepo, subject, fileName, content); return push.to("refs/for/master"); } - protected PushOneCommit.Result createChange(String subject, - String fileName, String content, String topic) - throws Exception { - PushOneCommit push = pushFactory.create( - db, admin.getIdent(), testRepo, subject, fileName, content); + protected PushOneCommit.Result createChange( + String subject, String fileName, String content, String topic) throws Exception { + PushOneCommit push = + pushFactory.create(db, admin.getIdent(), testRepo, subject, fileName, content); return push.to("refs/for/master/" + name(topic)); } - protected PushOneCommit.Result createChange(TestRepository repo, - String branch, String subject, String fileName, String content, - String topic) throws Exception { - PushOneCommit push = pushFactory.create( - db, admin.getIdent(), repo, subject, fileName, content); + protected PushOneCommit.Result createChange( + TestRepository repo, + String branch, + String subject, + String fileName, + String content, + String topic) + throws Exception { + PushOneCommit push = pushFactory.create(db, admin.getIdent(), repo, subject, fileName, content); return push.to("refs/for/" + branch + "/" + name(topic)); } @@ -652,35 +624,37 @@ public abstract class AbstractDaemonTest { .create(new BranchInput()); } - protected BranchApi createBranchWithRevision(Branch.NameKey branch, - String revision) throws Exception { + protected BranchApi createBranchWithRevision(Branch.NameKey branch, String revision) + throws Exception { BranchInput in = new BranchInput(); in.revision = revision; - return gApi.projects() - .name(branch.getParentKey().get()) - .branch(branch.get()) - .create(in); + return gApi.projects().name(branch.getParentKey().get()).branch(branch.get()).create(in); } private static final List RANDOM = - Chars.asList(new char[]{'a','b','c','d','e','f','g','h'}); - protected PushOneCommit.Result amendChange(String changeId) - throws Exception { + Chars.asList(new char[] {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}); + + protected PushOneCommit.Result amendChange(String changeId) throws Exception { return amendChange(changeId, "refs/for/master"); } - protected PushOneCommit.Result amendChange(String changeId, String ref) - throws Exception { + protected PushOneCommit.Result amendChange(String changeId, String ref) throws Exception { return amendChange(changeId, ref, admin, testRepo); } - protected PushOneCommit.Result amendChange(String changeId, String ref, - TestAccount testAccount, TestRepository repo) throws Exception { + protected PushOneCommit.Result amendChange( + String changeId, String ref, TestAccount testAccount, TestRepository repo) + throws Exception { Collections.shuffle(RANDOM); PushOneCommit push = - pushFactory.create(db, testAccount.getIdent(), repo, - PushOneCommit.SUBJECT, PushOneCommit.FILE_NAME, - new String(Chars.toArray(RANDOM)), changeId); + pushFactory.create( + db, + testAccount.getIdent(), + repo, + PushOneCommit.SUBJECT, + PushOneCommit.FILE_NAME, + new String(Chars.toArray(RANDOM)), + changeId); return push.to(ref); } @@ -689,33 +663,26 @@ public abstract class AbstractDaemonTest { revision(r).submit(); } - protected PushOneCommit.Result amendChangeAsDraft(String changeId) - throws Exception { + protected PushOneCommit.Result amendChangeAsDraft(String changeId) throws Exception { return amendChange(changeId, "refs/drafts/master"); } - protected ChangeInfo info(String id) - throws RestApiException { + protected ChangeInfo info(String id) throws RestApiException { return gApi.changes().id(id).info(); } - protected ChangeInfo get(String id) - throws RestApiException { + protected ChangeInfo get(String id) throws RestApiException { return gApi.changes().id(id).get(); } - protected Optional getEdit(String id) - throws RestApiException { - return gApi.changes() - .id(id) - .edit() - .get(); + protected Optional getEdit(String id) throws RestApiException { + return gApi.changes().id(id).edit().get(); } - protected ChangeInfo get(String id, ListChangesOption... options) - throws RestApiException { - return gApi.changes().id(id).get( - Sets.newEnumSet(Arrays.asList(options), ListChangesOption.class)); + protected ChangeInfo get(String id, ListChangesOption... options) throws RestApiException { + return gApi.changes() + .id(id) + .get(Sets.newEnumSet(Arrays.asList(options), ListChangesOption.class)); } protected List query(String q) throws RestApiException { @@ -723,7 +690,9 @@ public abstract class AbstractDaemonTest { } private Context newRequestContext(TestAccount account) { - return atrScope.newContext(reviewDbProvider, new SshSession(server, account), + return atrScope.newContext( + reviewDbProvider, + new SshSession(server, account), identifiedUserFactory.create(account.getId())); } @@ -732,8 +701,7 @@ public abstract class AbstractDaemonTest { } protected Context setApiUserAnonymous() { - return atrScope.set( - atrScope.newContext(reviewDbProvider, null, anonymousUser.get())); + return atrScope.set(atrScope.newContext(reviewDbProvider, null, anonymousUser.get())); } protected Context disableDb() { @@ -757,7 +725,7 @@ public abstract class AbstractDaemonTest { protected void enableChangeIndexWrites() { for (ChangeIndex i : changeIndexes.getWriteIndexes()) { if (i instanceof ReadOnlyChangeIndex) { - changeIndexes.addWriteIndex(((ReadOnlyChangeIndex)i).unwrap()); + changeIndexes.addWriteIndex(((ReadOnlyChangeIndex) i).unwrap()); } } } @@ -767,25 +735,22 @@ public abstract class AbstractDaemonTest { } protected RevisionApi revision(PushOneCommit.Result r) throws Exception { - return gApi.changes() - .id(r.getChangeId()) - .current(); + return gApi.changes().id(r.getChangeId()).current(); } - protected void allow(String permission, AccountGroup.UUID id, String ref) - throws Exception { + protected void allow(String permission, AccountGroup.UUID id, String ref) throws Exception { ProjectConfig cfg = projectCache.checkedGet(project).getConfig(); Util.allow(cfg, permission, id, ref); saveProjectConfig(project, cfg); } - protected void allowGlobalCapabilities(AccountGroup.UUID id, - String... capabilityNames) throws Exception { + protected void allowGlobalCapabilities(AccountGroup.UUID id, String... capabilityNames) + throws Exception { allowGlobalCapabilities(id, Arrays.asList(capabilityNames)); } - protected void allowGlobalCapabilities(AccountGroup.UUID id, - Iterable capabilityNames) throws Exception { + protected void allowGlobalCapabilities(AccountGroup.UUID id, Iterable capabilityNames) + throws Exception { ProjectConfig cfg = projectCache.checkedGet(allProjects).getConfig(); for (String capabilityName : capabilityNames) { Util.allow(cfg, capabilityName, id); @@ -793,13 +758,13 @@ public abstract class AbstractDaemonTest { saveProjectConfig(allProjects, cfg); } - protected void removeGlobalCapabilities(AccountGroup.UUID id, - String... capabilityNames) throws Exception { + protected void removeGlobalCapabilities(AccountGroup.UUID id, String... capabilityNames) + throws Exception { removeGlobalCapabilities(id, Arrays.asList(capabilityNames)); } - protected void removeGlobalCapabilities(AccountGroup.UUID id, - Iterable capabilityNames) throws Exception { + protected void removeGlobalCapabilities(AccountGroup.UUID id, Iterable capabilityNames) + throws Exception { ProjectConfig cfg = projectCache.checkedGet(allProjects).getConfig(); for (String capabilityName : capabilityNames) { Util.remove(cfg, capabilityName, id); @@ -807,8 +772,7 @@ public abstract class AbstractDaemonTest { saveProjectConfig(allProjects, cfg); } - protected void setUseContributorAgreements(InheritableBoolean value) - throws Exception { + protected void setUseContributorAgreements(InheritableBoolean value) throws Exception { try (MetaDataUpdate md = metaDataUpdateFactory.create(project)) { ProjectConfig config = ProjectConfig.read(md); config.getProject().setUseContributorAgreements(value); @@ -817,8 +781,7 @@ public abstract class AbstractDaemonTest { } } - protected void setUseSignedOffBy(InheritableBoolean value) - throws Exception { + protected void setUseSignedOffBy(InheritableBoolean value) throws Exception { try (MetaDataUpdate md = metaDataUpdateFactory.create(project)) { ProjectConfig config = ProjectConfig.read(md); config.getProject().setUseSignedOffBy(value); @@ -827,13 +790,12 @@ public abstract class AbstractDaemonTest { } } - protected void deny(String permission, AccountGroup.UUID id, String ref) - throws Exception { + protected void deny(String permission, AccountGroup.UUID id, String ref) throws Exception { deny(project, permission, id, ref); } - protected void deny(Project.NameKey p, String permission, - AccountGroup.UUID id, String ref) throws Exception { + protected void deny(Project.NameKey p, String permission, AccountGroup.UUID id, String ref) + throws Exception { ProjectConfig cfg = projectCache.checkedGet(p).getConfig(); Util.deny(cfg, permission, id, ref); saveProjectConfig(p, cfg); @@ -844,8 +806,8 @@ public abstract class AbstractDaemonTest { return block(permission, id, ref, project); } - protected PermissionRule block(String permission, - AccountGroup.UUID id, String ref, Project.NameKey project) + protected PermissionRule block( + String permission, AccountGroup.UUID id, String ref, Project.NameKey project) throws Exception { ProjectConfig cfg = projectCache.checkedGet(project).getConfig(); PermissionRule rule = Util.block(cfg, permission, id, ref); @@ -853,8 +815,7 @@ public abstract class AbstractDaemonTest { return rule; } - protected void saveProjectConfig(Project.NameKey p, ProjectConfig cfg) - throws Exception { + protected void saveProjectConfig(Project.NameKey p, ProjectConfig cfg) throws Exception { try (MetaDataUpdate md = metaDataUpdateFactory.create(p)) { md.setAuthor(identifiedUserFactory.create(admin.getId())); cfg.commit(md); @@ -871,18 +832,19 @@ public abstract class AbstractDaemonTest { grant(permission, project, ref, false); } - protected void grant(String permission, Project.NameKey project, String ref, - boolean force) throws RepositoryNotFoundException, IOException, - ConfigInvalidException { - AccountGroup adminGroup = - groupCache.get(new AccountGroup.NameKey("Administrators")); + protected void grant(String permission, Project.NameKey project, String ref, boolean force) + throws RepositoryNotFoundException, IOException, ConfigInvalidException { + AccountGroup adminGroup = groupCache.get(new AccountGroup.NameKey("Administrators")); grant(permission, project, ref, force, adminGroup.getGroupUUID()); } - protected void grant(String permission, Project.NameKey project, String ref, - boolean force, AccountGroup.UUID groupUUID) - throws RepositoryNotFoundException, IOException, - ConfigInvalidException { + protected void grant( + String permission, + Project.NameKey project, + String ref, + boolean force, + AccountGroup.UUID groupUUID) + throws RepositoryNotFoundException, IOException, ConfigInvalidException { try (MetaDataUpdate md = metaDataUpdateFactory.create(project)) { md.setMessage(String.format("Grant %s on %s", permission, ref)); ProjectConfig config = ProjectConfig.read(md); @@ -896,8 +858,8 @@ public abstract class AbstractDaemonTest { } } - protected void removePermission(String permission, Project.NameKey project, - String ref) throws IOException, ConfigInvalidException { + protected void removePermission(String permission, Project.NameKey project, String ref) + throws IOException, ConfigInvalidException { try (MetaDataUpdate md = metaDataUpdateFactory.create(project)) { md.setMessage(String.format("Remove %s on %s", permission, ref)); ProjectConfig config = ProjectConfig.read(md); @@ -913,8 +875,7 @@ public abstract class AbstractDaemonTest { block(Permission.READ, REGISTERED_USERS, ref); } - protected void blockForgeCommitter(Project.NameKey project, String ref) - throws Exception { + protected void blockForgeCommitter(Project.NameKey project, String ref) throws Exception { ProjectConfig cfg = projectCache.checkedGet(project).getConfig(); Util.block(cfg, Permission.FORGE_COMMITTER, REGISTERED_USERS, ref); saveProjectConfig(project, cfg); @@ -926,86 +887,62 @@ public abstract class AbstractDaemonTest { } protected void approve(String id) throws Exception { - gApi.changes() - .id(id) - .revision("current") - .review(ReviewInput.approve()); + gApi.changes().id(id).revision("current").review(ReviewInput.approve()); } protected void recommend(String id) throws Exception { - gApi.changes() - .id(id) - .revision("current") - .review(ReviewInput.recommend()); + gApi.changes().id(id).revision("current").review(ReviewInput.recommend()); } protected Map getActions(String id) throws Exception { - return gApi.changes() - .id(id) - .revision(1) - .actions(); + return gApi.changes().id(id).revision(1).actions(); } protected String getETag(String id) throws Exception { - return gApi.changes() - .id(id) - .current() - .etag(); + return gApi.changes().id(id).current().etag(); } private static Iterable changeIds(Iterable changes) { return Iterables.transform(changes, i -> i.changeId); } - protected void assertSubmittedTogether(String chId, String... expected) - throws Exception { + protected void assertSubmittedTogether(String chId, String... expected) throws Exception { List actual = gApi.changes().id(chId).submittedTogether(); SubmittedTogetherInfo info = - gApi.changes() - .id(chId) - .submittedTogether(EnumSet.of(NON_VISIBLE_CHANGES)); + gApi.changes().id(chId).submittedTogether(EnumSet.of(NON_VISIBLE_CHANGES)); assertThat(info.nonVisibleChanges).isEqualTo(0); assertThat(actual).hasSize(expected.length); - assertThat(changeIds(actual)) - .containsExactly((Object[])expected).inOrder(); - assertThat(changeIds(info.changes)) - .containsExactly((Object[])expected).inOrder(); + assertThat(changeIds(actual)).containsExactly((Object[]) expected).inOrder(); + assertThat(changeIds(info.changes)).containsExactly((Object[]) expected).inOrder(); } protected PatchSet getPatchSet(PatchSet.Id psId) throws OrmException { - return changeDataFactory.create(db, project, psId.getParentKey()) - .patchSet(psId); + return changeDataFactory.create(db, project, psId.getParentKey()).patchSet(psId); } protected IdentifiedUser user(TestAccount testAccount) { return identifiedUserFactory.create(testAccount.getId()); } - protected RevisionResource parseCurrentRevisionResource(String changeId) - throws Exception { + protected RevisionResource parseCurrentRevisionResource(String changeId) throws Exception { ChangeResource cr = parseChangeResource(changeId); int psId = cr.getChange().currentPatchSetId().get(); - return revisions.parse(cr, - IdString.fromDecoded(Integer.toString(psId))); + return revisions.parse(cr, IdString.fromDecoded(Integer.toString(psId))); } - protected RevisionResource parseRevisionResource(String changeId, int n) - throws Exception { - return revisions.parse(parseChangeResource(changeId), - IdString.fromDecoded(Integer.toString(n))); + protected RevisionResource parseRevisionResource(String changeId, int n) throws Exception { + return revisions.parse( + parseChangeResource(changeId), IdString.fromDecoded(Integer.toString(n))); } - protected RevisionResource parseRevisionResource(PushOneCommit.Result r) - throws Exception { + protected RevisionResource parseRevisionResource(PushOneCommit.Result r) throws Exception { PatchSet.Id psId = r.getPatchSetId(); return parseRevisionResource(psId.getParentKey().toString(), psId.get()); } - protected ChangeResource parseChangeResource(String changeId) - throws Exception { - List ctls = changeFinder.find( - changeId, atrScope.get().getUser()); + protected ChangeResource parseChangeResource(String changeId) throws Exception { + List ctls = changeFinder.find(changeId, atrScope.get().getUser()); assertThat(ctls).hasSize(1); return changeResourceFactory.create(ctls.get(0)); } @@ -1034,16 +971,13 @@ public abstract class AbstractDaemonTest { return getHead(repo, "HEAD"); } - protected RevCommit getRemoteHead(Project.NameKey project, String branch) - throws Exception { + protected RevCommit getRemoteHead(Project.NameKey project, String branch) throws Exception { try (Repository repo = repoManager.openRepository(project)) { - return getHead(repo, - branch.startsWith(Constants.R_REFS) ? branch : "refs/heads/" + branch); + return getHead(repo, branch.startsWith(Constants.R_REFS) ? branch : "refs/heads/" + branch); } } - protected RevCommit getRemoteHead(String project, String branch) - throws Exception { + protected RevCommit getRemoteHead(String project, String branch) throws Exception { return getRemoteHead(new Project.NameKey(project), branch); } @@ -1057,23 +991,20 @@ public abstract class AbstractDaemonTest { grant(Permission.CREATE_SIGNED_TAG, project, R_TAGS + "*"); } - protected void assertMailFrom(Message message, String email) - throws Exception { + protected void assertMailFrom(Message message, String email) throws Exception { assertThat(message.headers()).containsKey("Reply-To"); - EmailHeader.String replyTo = - (EmailHeader.String)message.headers().get("Reply-To"); + EmailHeader.String replyTo = (EmailHeader.String) message.headers().get("Reply-To"); assertThat(replyTo.getString()).isEqualTo(email); } - protected ContributorAgreement configureContributorAgreement( - boolean autoVerify) throws Exception { + protected ContributorAgreement configureContributorAgreement(boolean autoVerify) + throws Exception { ContributorAgreement ca; if (autoVerify) { String g = createGroup("cla-test-group"); GroupApi groupApi = gApi.groups().id(g); groupApi.description("CLA test group"); - AccountGroup caGroup = groupCache.get( - new AccountGroup.UUID(groupApi.detail().id)); + AccountGroup caGroup = groupCache.get(new AccountGroup.UUID(groupApi.detail().id)); GroupReference groupRef = GroupReference.forGroup(caGroup); PermissionRule rule = new PermissionRule(groupRef); rule.setAction(PermissionRule.Action.ALLOW); @@ -1093,11 +1024,10 @@ public abstract class AbstractDaemonTest { } /** - * Fetches each bundle into a newly cloned repository, then it applies - * the bundle, and returns the resulting tree id. + * Fetches each bundle into a newly cloned repository, then it applies the bundle, and returns the + * resulting tree id. */ - protected Map - fetchFromBundles(BinaryResult bundles) throws Exception { + protected Map fetchFromBundles(BinaryResult bundles) throws Exception { assertThat(bundles.getContentType()).isEqualTo("application/x-zip"); @@ -1105,9 +1035,8 @@ public abstract class AbstractDaemonTest { bundles.writeTo(new FileOutputStream(tempfile)); Map ret = new HashMap<>(); - try (ZipFile readback = new ZipFile(tempfile);) { - for (ZipEntry entry : ImmutableList.copyOf( - Iterators.forEnumeration(readback.entries()))) { + try (ZipFile readback = new ZipFile(tempfile); ) { + for (ZipEntry entry : ImmutableList.copyOf(Iterators.forEnumeration(readback.entries()))) { String bundleName = entry.getName(); InputStream bundleStream = readback.getInputStream(entry); @@ -1117,11 +1046,14 @@ public abstract class AbstractDaemonTest { Project.NameKey proj = new Project.NameKey(repoName); TestRepository localRepo = cloneProject(proj); - try (TransportBundleStream tbs = new TransportBundleStream( - localRepo.getRepository(), new URIish(bundleName), bundleStream);) { + try (TransportBundleStream tbs = + new TransportBundleStream( + localRepo.getRepository(), new URIish(bundleName), bundleStream); ) { - FetchResult fr = tbs.fetch(NullProgressMonitor.INSTANCE, - Arrays.asList(new RefSpec("refs/*:refs/preview/*"))); + FetchResult fr = + tbs.fetch( + NullProgressMonitor.INSTANCE, + Arrays.asList(new RefSpec("refs/*:refs/preview/*"))); for (Ref r : fr.getAdvertisedRefs()) { String branchName = r.getName(); Branch.NameKey n = new Branch.NameKey(proj, branchName); @@ -1135,11 +1067,9 @@ public abstract class AbstractDaemonTest { return ret; } - /** - * Assert that the given branches have the given tree ids. - */ - protected void assertRevTrees(Project.NameKey proj, - Map trees) throws Exception { + /** Assert that the given branches have the given tree ids. */ + protected void assertRevTrees(Project.NameKey proj, Map trees) + throws Exception { TestRepository localRepo = cloneProject(proj); GitUtil.fetch(localRepo, "refs/*:refs/*"); Map refs = localRepo.getRepository().getAllRefs(); @@ -1161,8 +1091,8 @@ public abstract class AbstractDaemonTest { assertThat(refValues.keySet()).containsAnyIn(trees.keySet()); } - protected void assertDiffForNewFile(DiffInfo diff, RevCommit commit, - String path, String expectedContentSideB) throws Exception { + protected void assertDiffForNewFile( + DiffInfo diff, RevCommit commit, String path, String expectedContentSideB) throws Exception { List expectedLines = new ArrayList<>(); for (String line : expectedContentSideB.split("\n")) { expectedLines.add(line); @@ -1192,8 +1122,7 @@ public abstract class AbstractDaemonTest { assertThat(diff.content).hasSize(1); DiffInfo.ContentEntry contentEntry = diff.content.get(0); - assertThat(contentEntry.b).containsExactlyElementsIn(expectedLines) - .inOrder(); + assertThat(contentEntry.b).containsExactlyElementsIn(expectedLines).inOrder(); assertThat(contentEntry.a).isNull(); assertThat(contentEntry.ab).isNull(); assertThat(contentEntry.common).isNull(); @@ -1202,25 +1131,21 @@ public abstract class AbstractDaemonTest { assertThat(contentEntry.skip).isNull(); } - protected TestRepository createProjectWithPush(String name, - @Nullable Project.NameKey parent, - SubmitType submitType) throws Exception { + protected TestRepository createProjectWithPush( + String name, @Nullable Project.NameKey parent, SubmitType submitType) throws Exception { Project.NameKey project = createProject(name, parent, true, submitType); grant(Permission.PUSH, project, "refs/heads/*"); grant(Permission.SUBMIT, project, "refs/for/refs/heads/*"); return cloneProject(project); } - protected void assertPermitted(ChangeInfo info, String label, - Integer... expected) { + protected void assertPermitted(ChangeInfo info, String label, Integer... expected) { assertThat(info.permittedLabels).isNotNull(); Collection strs = info.permittedLabels.get(label); if (expected.length == 0) { assertThat(strs).isNull(); } else { - assertThat( - strs.stream().map(s -> Integer.valueOf(s.trim())) - .collect(toList())) + assertThat(strs.stream().map(s -> Integer.valueOf(s.trim())).collect(toList())) .containsExactlyElementsIn(Arrays.asList(expected)); } } @@ -1229,9 +1154,8 @@ public abstract class AbstractDaemonTest { assertThat(sender.getMessages()).hasSize(1); Message m = sender.getMessages().get(0); assertThat(m.rcpt()).containsExactly(expected.emailAddress); - assertThat( - ((EmailHeader.AddressList) m.headers().get("To")).getAddressList()) - .containsExactly(expected.emailAddress); + assertThat(((EmailHeader.AddressList) m.headers().get("To")).getAddressList()) + .containsExactly(expected.emailAddress); assertThat(m.headers().get("CC").isEmpty()).isTrue(); } @@ -1240,9 +1164,8 @@ public abstract class AbstractDaemonTest { Message m = sender.getMessages().get(0); assertThat(m.rcpt()).containsExactly(expected.emailAddress); assertThat(m.headers().get("To").isEmpty()).isTrue(); - assertThat( - ((EmailHeader.AddressList) m.headers().get("CC")).getAddressList()) - .containsExactly(expected.emailAddress); + assertThat(((EmailHeader.AddressList) m.headers().get("CC")).getAddressList()) + .containsExactly(expected.emailAddress); } protected void assertNotifyBcc(TestAccount expected) { @@ -1253,8 +1176,7 @@ public abstract class AbstractDaemonTest { assertThat(m.headers().get("CC").isEmpty()).isTrue(); } - protected void watch(String project, String filter) - throws RestApiException { + protected void watch(String project, String filter) throws RestApiException { List projectsToWatch = new ArrayList<>(); ProjectWatchInfo pwi = new ProjectWatchInfo(); pwi.project = project; diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AcceptanceTestRequestScope.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AcceptanceTestRequestScope.java index 71d738c4f9..b6547ef3d1 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AcceptanceTestRequestScope.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AcceptanceTestRequestScope.java @@ -30,14 +30,12 @@ import com.google.inject.OutOfScopeException; import com.google.inject.Provider; import com.google.inject.Scope; import com.google.inject.util.Providers; - import java.util.HashMap; import java.util.Map; /** Guice scopes for state during an Acceptance Test connection. */ public class AcceptanceTestRequestScope { - private static final Key RC_KEY = - Key.get(RequestCleanup.class); + private static final Key RC_KEY = Key.get(RequestCleanup.class); private static final Key DB_KEY = Key.get(RequestScopedReviewDbProvider.class); @@ -53,16 +51,13 @@ public class AcceptanceTestRequestScope { volatile long started; volatile long finished; - private Context(SchemaFactory sf, SshSession s, - CurrentUser u, long at) { + private Context(SchemaFactory sf, SshSession s, CurrentUser u, long at) { schemaFactory = sf; session = s; user = u; created = started = finished = at; map.put(RC_KEY, cleanup); - map.put(DB_KEY, new RequestScopedReviewDbProvider( - schemaFactory, - Providers.of(cleanup))); + map.put(DB_KEY, new RequestScopedReviewDbProvider(schemaFactory, Providers.of(cleanup))); } private Context(Context p, SshSession s, CurrentUser c) { @@ -117,7 +112,9 @@ public class AcceptanceTestRequestScope { private final AcceptanceTestRequestScope atrScope; @Inject - Propagator(AcceptanceTestRequestScope atrScope, ThreadLocalRequestContext local, + Propagator( + AcceptanceTestRequestScope atrScope, + ThreadLocalRequestContext local, Provider dbProviderProvider) { super(REQUEST, current, local, dbProviderProvider); this.atrScope = atrScope; @@ -169,12 +166,13 @@ public class AcceptanceTestRequestScope { public Context disableDb() { Context old = current.get(); - SchemaFactory sf = new SchemaFactory() { - @Override - public ReviewDb open() { - return new DisabledReviewDb(); - } - }; + SchemaFactory sf = + new SchemaFactory() { + @Override + public ReviewDb open() { + return new DisabledReviewDb(); + } + }; Context ctx = new Context(sf, old.session, old.user, old.created); current.set(ctx); @@ -186,30 +184,30 @@ public class AcceptanceTestRequestScope { // Setting a new context with the same fields is enough to get the ReviewDb // provider to reopen the database. Context old = current.get(); - return set( - new Context(old.schemaFactory, old.session, old.user, old.created)); + return set(new Context(old.schemaFactory, old.session, old.user, old.created)); } /** Returns exactly one instance per command executed. */ - static final Scope REQUEST = new Scope() { - @Override - public Provider scope(final Key key, final Provider creator) { - return new Provider() { + static final Scope REQUEST = + new Scope() { @Override - public T get() { - return requireContext().get(key, creator); + public Provider scope(final Key key, final Provider creator) { + return new Provider() { + @Override + public T get() { + return requireContext().get(key, creator); + } + + @Override + public String toString() { + return String.format("%s[%s]", creator, REQUEST); + } + }; } @Override public String toString() { - return String.format("%s[%s]", creator, REQUEST); + return "Acceptance Test Scope.REQUEST"; } }; - } - - @Override - public String toString() { - return "Acceptance Test Scope.REQUEST"; - } - }; } diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AccountCreator.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AccountCreator.java index b271f8a5b6..de0c430da0 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AccountCreator.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AccountCreator.java @@ -34,11 +34,9 @@ import com.google.gerrit.testutil.SshMode; import com.google.gwtorm.server.SchemaFactory; import com.google.inject.Inject; import com.google.inject.Singleton; - import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.KeyPair; - import java.io.ByteArrayOutputStream; import java.io.UnsupportedEncodingException; import java.util.Collections; @@ -58,7 +56,8 @@ public class AccountCreator { private final AccountIndexer indexer; @Inject - AccountCreator(SchemaFactory schema, + AccountCreator( + SchemaFactory schema, VersionedAuthorizedKeys.Accessor authorizedKeys, GroupCache groupCache, SshKeyCache sshKeyCache, @@ -75,8 +74,8 @@ public class AccountCreator { this.indexer = indexer; } - public synchronized TestAccount create(String username, String email, - String fullName, String... groups) throws Exception { + public synchronized TestAccount create( + String username, String email, String fullName, String... groups) throws Exception { TestAccount account = accounts.get(username); if (account != null) { return account; @@ -85,8 +84,8 @@ public class AccountCreator { Account.Id id = new Account.Id(db.nextAccountId()); AccountExternalId extUser = - new AccountExternalId(id, new AccountExternalId.Key( - AccountExternalId.SCHEME_USERNAME, username)); + new AccountExternalId( + id, new AccountExternalId.Key(AccountExternalId.SCHEME_USERNAME, username)); String httpPass = "http-pass"; extUser.setPassword(httpPass); db.accountExternalIds().insert(Collections.singleton(extUser)); @@ -107,8 +106,7 @@ public class AccountCreator { AccountGroup.NameKey k = new AccountGroup.NameKey(n); AccountGroup g = groupCache.get(k); checkArgument(g != null, "group not found: %s", n); - AccountGroupMember m = - new AccountGroupMember(new AccountGroupMember.Key(id, g.getId())); + AccountGroupMember m = new AccountGroupMember(new AccountGroupMember.Key(id, g.getId())); db.accountGroupMembers().insert(Collections.singleton(m)); } } @@ -125,8 +123,7 @@ public class AccountCreator { indexer.index(id); - account = - new TestAccount(id, username, email, fullName, sshKey, httpPass); + account = new TestAccount(id, username, email, fullName, sshKey, httpPass); accounts.put(username, account); return account; } @@ -141,13 +138,11 @@ public class AccountCreator { } public TestAccount admin() throws Exception { - return create("admin", "admin@example.com", "Administrator", - "Administrators"); + return create("admin", "admin@example.com", "Administrator", "Administrators"); } public TestAccount admin2() throws Exception { - return create("admin2", "admin2@example.com", "Administrator2", - "Administrators"); + return create("admin2", "admin2@example.com", "Administrator2", "Administrators"); } public TestAccount user() throws Exception { @@ -159,9 +154,7 @@ public class AccountCreator { } public TestAccount get(String username) { - return checkNotNull( - accounts.get(username), - "No TestAccount created for %s", username); + return checkNotNull(accounts.get(username), "No TestAccount created for %s", username); } private AccountExternalId.Key getEmailKey(String email) { diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AssertUtil.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AssertUtil.java index a325febb02..a1d3e7988e 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AssertUtil.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AssertUtil.java @@ -23,9 +23,8 @@ import java.util.HashSet; import java.util.Set; public class AssertUtil { - public static void assertPrefs(T actual, T expected, - String... fieldsToExclude) - throws IllegalArgumentException, IllegalAccessException { + public static void assertPrefs(T actual, T expected, String... fieldsToExclude) + throws IllegalArgumentException, IllegalAccessException { Set exludedFields = new HashSet<>(Arrays.asList(fieldsToExclude)); for (Field field : actual.getClass().getDeclaredFields()) { if (exludedFields.contains(field.getName()) || skipField(field)) { diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/ConfigAnnotationParser.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/ConfigAnnotationParser.java index b07ed30319..4adb6c3d43 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/ConfigAnnotationParser.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/ConfigAnnotationParser.java @@ -17,11 +17,9 @@ package com.google.gerrit.acceptance; import com.google.common.base.Splitter; import com.google.common.base.Strings; import com.google.common.collect.Lists; - -import org.eclipse.jgit.lib.Config; - import java.util.ArrayList; import java.util.Arrays; +import org.eclipse.jgit.lib.Config; class ConfigAnnotationParser { private static Splitter splitter = Splitter.on(".").trimResults(); @@ -57,13 +55,11 @@ class ConfigAnnotationParser { if (!Strings.isNullOrEmpty(c.value())) { cfg.setString(l.get(0), l.get(1), l.get(2), c.value()); } else { - cfg.setStringList(l.get(0), l.get(1), l.get(2), - Arrays.asList(c.value())); + cfg.setStringList(l.get(0), l.get(1), l.get(2), Arrays.asList(c.value())); } } else { throw new IllegalArgumentException( - "GerritConfig.name must be of the format" - + " section.subsection.name or section.name"); + "GerritConfig.name must be of the format" + " section.subsection.name or section.name"); } } } diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/EventRecorder.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/EventRecorder.java index 606ad61ecc..f25ca83220 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/EventRecorder.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/EventRecorder.java @@ -33,7 +33,6 @@ import com.google.gerrit.server.events.RefUpdatedEvent; import com.google.gerrit.server.events.ReviewerDeletedEvent; import com.google.inject.Inject; import com.google.inject.Singleton; - import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.revwalk.RevCommit; @@ -47,7 +46,8 @@ public class EventRecorder { private final IdentifiedUser.GenericFactory userFactory; @Inject - Factory(DynamicSet eventListeners, + Factory( + DynamicSet eventListeners, IdentifiedUser.GenericFactory userFactory) { this.eventListeners = eventListeners; this.userFactory = userFactory; @@ -58,39 +58,39 @@ public class EventRecorder { } } - public EventRecorder(DynamicSet eventListeners, - final IdentifiedUser user) { + public EventRecorder( + DynamicSet eventListeners, final IdentifiedUser user) { recordedEvents = LinkedListMultimap.create(); - eventListenerRegistration = eventListeners.add( - new UserScopedEventListener() { - @Override - public void onEvent(Event e) { - if (e instanceof ReviewerDeletedEvent) { - recordedEvents.put( - ReviewerDeletedEvent.TYPE, (ReviewerDeletedEvent) e); - } else if (e instanceof RefEvent) { - RefEvent event = (RefEvent) e; - String key = refEventKey(event.getType(), - event.getProjectNameKey().get(), - event.getRefName()); - recordedEvents.put(key, event); - } - } + eventListenerRegistration = + eventListeners.add( + new UserScopedEventListener() { + @Override + public void onEvent(Event e) { + if (e instanceof ReviewerDeletedEvent) { + recordedEvents.put(ReviewerDeletedEvent.TYPE, (ReviewerDeletedEvent) e); + } else if (e instanceof RefEvent) { + RefEvent event = (RefEvent) e; + String key = + refEventKey( + event.getType(), event.getProjectNameKey().get(), event.getRefName()); + recordedEvents.put(key, event); + } + } - @Override - public CurrentUser getUser() { - return user; - } - }); + @Override + public CurrentUser getUser() { + return user; + } + }); } private static String refEventKey(String type, String project, String ref) { return String.format("%s-%s-%s", type, project, ref); } - private ImmutableList getRefUpdatedEvents(String project, - String refName, int expectedSize) { + private ImmutableList getRefUpdatedEvents( + String project, String refName, int expectedSize) { String key = refEventKey(RefUpdatedEvent.TYPE, project, refName); if (expectedSize == 0) { assertThat(recordedEvents).doesNotContainKey(key); @@ -98,16 +98,16 @@ public class EventRecorder { } assertThat(recordedEvents).containsKey(key); - ImmutableList events = FluentIterable - .from(recordedEvents.get(key)) - .transform(RefUpdatedEvent.class::cast) - .toList(); + ImmutableList events = + FluentIterable.from(recordedEvents.get(key)) + .transform(RefUpdatedEvent.class::cast) + .toList(); assertThat(events).hasSize(expectedSize); return events; } - private ImmutableList getChangeMergedEvents(String project, - String branch, int expectedSize) { + private ImmutableList getChangeMergedEvents( + String project, String branch, int expectedSize) { String key = refEventKey(ChangeMergedEvent.TYPE, project, branch); if (expectedSize == 0) { assertThat(recordedEvents).doesNotContainKey(key); @@ -115,90 +115,80 @@ public class EventRecorder { } assertThat(recordedEvents).containsKey(key); - ImmutableList events = FluentIterable - .from(recordedEvents.get(key)) - .transform(ChangeMergedEvent.class::cast) - .toList(); + ImmutableList events = + FluentIterable.from(recordedEvents.get(key)) + .transform(ChangeMergedEvent.class::cast) + .toList(); assertThat(events).hasSize(expectedSize); return events; } - private ImmutableList getReviewerDeletedEvents( - int expectedSize) { + private ImmutableList getReviewerDeletedEvents(int expectedSize) { String key = ReviewerDeletedEvent.TYPE; if (expectedSize == 0) { assertThat(recordedEvents).doesNotContainKey(key); return ImmutableList.of(); } assertThat(recordedEvents).containsKey(key); - ImmutableList events = FluentIterable - .from(recordedEvents.get(key)) - .transform(ReviewerDeletedEvent.class::cast) - .toList(); + ImmutableList events = + FluentIterable.from(recordedEvents.get(key)) + .transform(ReviewerDeletedEvent.class::cast) + .toList(); assertThat(events).hasSize(expectedSize); return events; } - public void assertRefUpdatedEvents(String project, String branch, - String... expected) throws Exception { - ImmutableList events = getRefUpdatedEvents(project, - branch, expected.length / 2); + public void assertRefUpdatedEvents(String project, String branch, String... expected) + throws Exception { + ImmutableList events = + getRefUpdatedEvents(project, branch, expected.length / 2); int i = 0; for (RefUpdatedEvent event : events) { RefUpdateAttribute actual = event.refUpdate.get(); - String oldRev = expected[i] == null - ? ObjectId.zeroId().name() - : expected[i]; - String newRev = expected[i+1] == null - ? ObjectId.zeroId().name() - : expected[i+1]; + String oldRev = expected[i] == null ? ObjectId.zeroId().name() : expected[i]; + String newRev = expected[i + 1] == null ? ObjectId.zeroId().name() : expected[i + 1]; assertThat(actual.oldRev).isEqualTo(oldRev); assertThat(actual.newRev).isEqualTo(newRev); i += 2; } } - public void assertRefUpdatedEvents(String project, String branch, - RevCommit... expected) throws Exception { - ImmutableList events = getRefUpdatedEvents(project, - branch, expected.length / 2); + public void assertRefUpdatedEvents(String project, String branch, RevCommit... expected) + throws Exception { + ImmutableList events = + getRefUpdatedEvents(project, branch, expected.length / 2); int i = 0; for (RefUpdatedEvent event : events) { RefUpdateAttribute actual = event.refUpdate.get(); - String oldRev = expected[i] == null - ? ObjectId.zeroId().name() - : expected[i].name(); - String newRev = expected[i+1] == null - ? ObjectId.zeroId().name() - : expected[i+1].name(); + String oldRev = expected[i] == null ? ObjectId.zeroId().name() : expected[i].name(); + String newRev = expected[i + 1] == null ? ObjectId.zeroId().name() : expected[i + 1].name(); assertThat(actual.oldRev).isEqualTo(oldRev); assertThat(actual.newRev).isEqualTo(newRev); i += 2; } } - public void assertChangeMergedEvents(String project, String branch, - String... expected) throws Exception { - ImmutableList events = getChangeMergedEvents(project, - branch, expected.length / 2); + public void assertChangeMergedEvents(String project, String branch, String... expected) + throws Exception { + ImmutableList events = + getChangeMergedEvents(project, branch, expected.length / 2); int i = 0; for (ChangeMergedEvent event : events) { String id = event.change.get().id; assertThat(id).isEqualTo(expected[i]); - assertThat(event.newRev).isEqualTo(expected[i+1]); + assertThat(event.newRev).isEqualTo(expected[i + 1]); i += 2; } } public void assertReviewerDeletedEvents(String... expected) { - ImmutableList events = - getReviewerDeletedEvents(expected.length / 2); + ImmutableList events = getReviewerDeletedEvents(expected.length / 2); int i = 0; for (ReviewerDeletedEvent event : events) { String id = event.change.get().id; assertThat(id).isEqualTo(expected[i]); String reviewer = event.reviewer.get().email; - assertThat(reviewer).isEqualTo(expected[i+1]); + assertThat(reviewer).isEqualTo(expected[i + 1]); i += 2; } } diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GcAssert.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GcAssert.java index 5f8a8ed4e3..0cc72ecef9 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GcAssert.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GcAssert.java @@ -19,13 +19,11 @@ import static com.google.common.truth.Truth.assert_; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.git.GitRepositoryManager; import com.google.inject.Inject; - -import org.eclipse.jgit.errors.RepositoryNotFoundException; -import org.eclipse.jgit.lib.Repository; - import java.io.File; import java.io.FilenameFilter; import java.io.IOException; +import org.eclipse.jgit.errors.RepositoryNotFoundException; +import org.eclipse.jgit.lib.Repository; public class GcAssert { @@ -40,9 +38,9 @@ public class GcAssert { throws RepositoryNotFoundException, IOException { for (Project.NameKey p : projects) { assert_() - .withFailureMessage("Project " + p.get() + " has no pack files.") - .that(getPackFiles(p)) - .isNotEmpty(); + .withFailureMessage("Project " + p.get() + " has no pack files.") + .that(getPackFiles(p)) + .isNotEmpty(); } } @@ -50,22 +48,22 @@ public class GcAssert { throws RepositoryNotFoundException, IOException { for (Project.NameKey p : projects) { assert_() - .withFailureMessage("Project " + p.get() + " has pack files.") - .that(getPackFiles(p)) - .isEmpty(); + .withFailureMessage("Project " + p.get() + " has pack files.") + .that(getPackFiles(p)) + .isEmpty(); } } - private String[] getPackFiles(Project.NameKey p) - throws RepositoryNotFoundException, IOException { + private String[] getPackFiles(Project.NameKey p) throws RepositoryNotFoundException, IOException { try (Repository repo = repoManager.openRepository(p)) { File packDir = new File(repo.getDirectory(), "objects/pack"); - return packDir.list(new FilenameFilter() { - @Override - public boolean accept(File dir, String name) { - return name.endsWith(".pack"); - } - }); + return packDir.list( + new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + return name.endsWith(".pack"); + } + }); } } } diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GerritConfig.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GerritConfig.java index 4e40d9238a..54ff9ffff4 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GerritConfig.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GerritConfig.java @@ -26,6 +26,8 @@ import java.lang.annotation.Target; @Repeatable(GerritConfigs.class) public @interface GerritConfig { String name(); + String value() default ""; + String[] values() default ""; } diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GerritServer.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GerritServer.java index 39d06f3251..9df6053524 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GerritServer.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GerritServer.java @@ -37,13 +37,6 @@ import com.google.gerrit.testutil.TempFileUtil; import com.google.inject.Injector; import com.google.inject.Key; import com.google.inject.Module; - -import org.apache.log4j.Level; -import org.apache.log4j.Logger; -import org.eclipse.jgit.lib.Config; -import org.eclipse.jgit.lib.RepositoryCache; -import org.eclipse.jgit.util.FS; - import java.io.File; import java.lang.annotation.Annotation; import java.lang.reflect.Field; @@ -57,12 +50,16 @@ import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.lib.RepositoryCache; +import org.eclipse.jgit.util.FS; public class GerritServer { @AutoValue abstract static class Description { - static Description forTestClass(org.junit.runner.Description testDesc, - String configName) { + static Description forTestClass(org.junit.runner.Description testDesc, String configName) { return new AutoValue_GerritServer_Description( testDesc, configName, @@ -72,27 +69,24 @@ public class GerritServer { has(UseSsh.class, testDesc.getTestClass()), null, // @GerritConfig is only valid on methods. null); // @GerritConfigs is only valid on methods. - } - static Description forTestMethod(org.junit.runner.Description testDesc, - String configName) { + static Description forTestMethod(org.junit.runner.Description testDesc, String configName) { return new AutoValue_GerritServer_Description( testDesc, configName, testDesc.getAnnotation(UseLocalDisk.class) == null, testDesc.getAnnotation(NoHttpd.class) == null - && !has(NoHttpd.class, testDesc.getTestClass()), - testDesc.getAnnotation(Sandboxed.class) != null || - has(Sandboxed.class, testDesc.getTestClass()), - testDesc.getAnnotation(UseSsh.class) != null || - has(UseSsh.class, testDesc.getTestClass()), + && !has(NoHttpd.class, testDesc.getTestClass()), + testDesc.getAnnotation(Sandboxed.class) != null + || has(Sandboxed.class, testDesc.getTestClass()), + testDesc.getAnnotation(UseSsh.class) != null + || has(UseSsh.class, testDesc.getTestClass()), testDesc.getAnnotation(GerritConfig.class), testDesc.getAnnotation(GerritConfigs.class)); } - private static boolean has( - Class annotation, Class clazz) { + private static boolean has(Class annotation, Class clazz) { for (; clazz != null; clazz = clazz.getSuperclass()) { if (clazz.getAnnotation(annotation) != null) { return true; @@ -102,18 +96,27 @@ public class GerritServer { } abstract org.junit.runner.Description testDescription(); - @Nullable abstract String configName(); + + @Nullable + abstract String configName(); + abstract boolean memory(); + abstract boolean httpd(); + abstract boolean sandboxed(); + abstract boolean useSsh(); - @Nullable abstract GerritConfig config(); - @Nullable abstract GerritConfigs configs(); + + @Nullable + abstract GerritConfig config(); + + @Nullable + abstract GerritConfigs configs(); private Config buildConfig(Config baseConfig) { if (configs() != null && config() != null) { - throw new IllegalStateException( - "Use either @GerritConfigs or @GerritConfig not both"); + throw new IllegalStateException("Use either @GerritConfigs or @GerritConfig not both"); } if (configs() != null) { return ConfigAnnotationParser.parse(baseConfig, configs()); @@ -126,21 +129,23 @@ public class GerritServer { } /** Returns fully started Gerrit server */ - static GerritServer start(Description desc, Config baseConfig) - throws Exception { + static GerritServer start(Description desc, Config baseConfig) throws Exception { Config cfg = desc.buildConfig(baseConfig); Logger.getLogger("com.google.gerrit").setLevel(Level.DEBUG); final CyclicBarrier serverStarted = new CyclicBarrier(2); - final Daemon daemon = new Daemon(new Runnable() { - @Override - public void run() { - try { - serverStarted.await(); - } catch (InterruptedException | BrokenBarrierException e) { - throw new RuntimeException(e); - } - } - }, Paths.get(baseConfig.getString("gerrit", null, "tempSiteDir"))); + final Daemon daemon = + new Daemon( + new Runnable() { + @Override + public void run() { + try { + serverStarted.await(); + } catch (InterruptedException | BrokenBarrierException e) { + throw new RuntimeException(e); + } + } + }, + Paths.get(baseConfig.getString("gerrit", null, "tempSiteDir"))); daemon.setEmailModuleForTesting(new FakeEmailSender.Module()); daemon.setEnableSshd(SshMode.useSsh()); @@ -158,25 +163,28 @@ public class GerritServer { cfg.setString("gitweb", null, "cgi", ""); daemon.setEnableHttpd(desc.httpd()); daemon.setLuceneModule(LuceneIndexModule.singleVersionAllLatest(0)); - daemon.setDatabaseForTesting(ImmutableList.of( - new InMemoryTestingDatabaseModule(cfg))); + daemon.setDatabaseForTesting( + ImmutableList.of(new InMemoryTestingDatabaseModule(cfg))); daemon.start(); } else { site = initSite(cfg); daemonService = Executors.newSingleThreadExecutor(); - daemonService.submit(new Callable() { - @Override - public Void call() throws Exception { - int rc = daemon.main(new String[] { - "-d", site.getPath(), - "--headless", "--console-log", "--show-stack-trace",}); - if (rc != 0) { - System.err.println("Failed to start Gerrit daemon"); - serverStarted.reset(); - } - return null; - } - }); + daemonService.submit( + new Callable() { + @Override + public Void call() throws Exception { + int rc = + daemon.main( + new String[] { + "-d", site.getPath(), "--headless", "--console-log", "--show-stack-trace", + }); + if (rc != 0) { + System.err.println("Failed to start Gerrit daemon"); + serverStarted.reset(); + } + return null; + } + }); serverStarted.await(); System.out.println("Gerrit Server Started"); } @@ -188,16 +196,17 @@ public class GerritServer { private static File initSite(Config base) throws Exception { File tmp = TempFileUtil.createTempDirectory(); Init init = new Init(); - int rc = init.main(new String[] { - "-d", tmp.getPath(), "--batch", "--no-auto-start", - "--skip-plugins",}); + int rc = + init.main( + new String[] { + "-d", tmp.getPath(), "--batch", "--no-auto-start", "--skip-plugins", + }); if (rc != 0) { throw new RuntimeException("Couldn't initialize site"); } - MergeableFileBasedConfig cfg = new MergeableFileBasedConfig( - new File(new File(tmp, "etc"), "gerrit.config"), - FS.DETECTED); + MergeableFileBasedConfig cfg = + new MergeableFileBasedConfig(new File(new File(tmp, "etc"), "gerrit.config"), FS.DETECTED); cfg.load(); cfg.merge(base); mergeTestConfig(cfg); @@ -206,8 +215,7 @@ public class GerritServer { } private static void mergeTestConfig(Config cfg) { - String forceEphemeralPort = String.format("%s:0", - getLocalHost().getHostName()); + String forceEphemeralPort = String.format("%s:0", getLocalHost().getHostName()); String url = "http://" + forceEphemeralPort + "/"; cfg.setString("gerrit", null, "canonicalWebUrl", url); cfg.setString("httpd", null, "listenUrl", url); @@ -228,22 +236,24 @@ public class GerritServer { private static Injector createTestInjector(Daemon daemon) throws Exception { Injector sysInjector = get(daemon, "sysInjector"); - Module module = new FactoryModule() { - @Override - protected void configure() { - bind(AccountCreator.class); - factory(PushOneCommit.Factory.class); - install(InProcessProtocol.module()); - install(new NoSshModule()); - install(new AsyncReceiveCommits.Module()); - } - }; + Module module = + new FactoryModule() { + @Override + protected void configure() { + bind(AccountCreator.class); + factory(PushOneCommit.Factory.class); + install(InProcessProtocol.module()); + install(new NoSshModule()); + install(new AsyncReceiveCommits.Module()); + } + }; return sysInjector.createChildInjector(module); } @SuppressWarnings("unchecked") - private static T get(Object obj, String field) throws SecurityException, - NoSuchFieldException, IllegalArgumentException, IllegalAccessException { + private static T get(Object obj, String field) + throws SecurityException, NoSuchFieldException, IllegalArgumentException, + IllegalAccessException { Field f = obj.getClass().getDeclaredField(field); f.setAccessible(true); return (T) f.get(obj); @@ -262,21 +272,18 @@ public class GerritServer { private InetSocketAddress sshdAddress; private InetSocketAddress httpAddress; - private GerritServer(Description desc, Injector testInjector, Daemon daemon, - ExecutorService daemonService) { + private GerritServer( + Description desc, Injector testInjector, Daemon daemon, ExecutorService daemonService) { this.desc = desc; this.testInjector = testInjector; this.daemon = daemon; this.daemonService = daemonService; - Config cfg = testInjector.getInstance( - Key.get(Config.class, GerritServerConfig.class)); + Config cfg = testInjector.getInstance(Key.get(Config.class, GerritServerConfig.class)); url = cfg.getString("gerrit", null, "canonicalWebUrl"); URI uri = URI.create(url); - sshdAddress = SocketUtil.resolve( - cfg.getString("sshd", null, "listenAddress"), - 0); + sshdAddress = SocketUtil.resolve(cfg.getString("sshd", null, "listenAddress"), 0); httpAddress = new InetSocketAddress(uri.getHost(), uri.getPort()); } diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GitUtil.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GitUtil.java index 2f1463d7ff..7e27e67c5d 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GitUtil.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GitUtil.java @@ -21,11 +21,15 @@ import com.google.common.collect.Lists; import com.google.common.primitives.Ints; import com.google.gerrit.common.FooterConstants; import com.google.gerrit.reviewdb.client.Project; - import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; - +import java.io.IOException; +import java.util.List; +import java.util.Optional; +import java.util.Properties; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; import org.eclipse.jgit.api.FetchCommand; import org.eclipse.jgit.api.PushCommand; import org.eclipse.jgit.api.TagCommand; @@ -48,13 +52,6 @@ import org.eclipse.jgit.transport.RemoteRefUpdate; import org.eclipse.jgit.transport.SshSessionFactory; import org.eclipse.jgit.util.FS; -import java.io.IOException; -import java.util.List; -import java.util.Optional; -import java.util.Properties; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; - public class GitUtil { private static final AtomicInteger testRepoCount = new AtomicInteger(); private static final int TEST_REPO_WINDOW_DAYS = 2; @@ -67,66 +64,64 @@ public class GitUtil { // register a JschConfigSessionFactory that adds the private key as identity // to the JSch instance of JGit so that SSH communication via JGit can // succeed - SshSessionFactory.setInstance(new JschConfigSessionFactory() { - @Override - protected void configure(Host hc, Session session) { - try { - final JSch jsch = getJSch(hc, FS.DETECTED); - jsch.addIdentity("KeyPair", a.privateKey(), - a.sshKey.getPublicKeyBlob(), null); - } catch (JSchException e) { - throw new RuntimeException(e); - } - } - }); + SshSessionFactory.setInstance( + new JschConfigSessionFactory() { + @Override + protected void configure(Host hc, Session session) { + try { + final JSch jsch = getJSch(hc, FS.DETECTED); + jsch.addIdentity("KeyPair", a.privateKey(), a.sshKey.getPublicKeyBlob(), null); + } catch (JSchException e) { + throw new RuntimeException(e); + } + } + }); } /** * Create a new {@link TestRepository} with a distinct commit clock. - *

- * It is very easy for tests to create commits with identical subjects and - * trees; if such commits also have identical authors/committers, then the - * computed Change-Id is identical as well. Tests may generally assume that - * Change-Ids are unique, so to ensure this, we provision TestRepository - * instances with non-overlapping commit clock times. - *

- * Space test repos 1 day apart, which allows for about 86k ticks per repo - * before overlapping, and about 8k instances per process before hitting - * JGit's year 2038 limit. + * + *

It is very easy for tests to create commits with identical subjects and trees; if such + * commits also have identical authors/committers, then the computed Change-Id is identical as + * well. Tests may generally assume that Change-Ids are unique, so to ensure this, we provision + * TestRepository instances with non-overlapping commit clock times. + * + *

Space test repos 1 day apart, which allows for about 86k ticks per repo before overlapping, + * and about 8k instances per process before hitting JGit's year 2038 limit. * * @param repo repository to wrap. * @return wrapped test repository with distinct commit time space. */ - public static TestRepository newTestRepository( - R repo) throws IOException { + public static TestRepository newTestRepository(R repo) + throws IOException { TestRepository tr = new TestRepository<>(repo); - tr.tick(Ints.checkedCast(TimeUnit.SECONDS.convert( - testRepoCount.getAndIncrement() * TEST_REPO_WINDOW_DAYS, - TimeUnit.DAYS))); + tr.tick( + Ints.checkedCast( + TimeUnit.SECONDS.convert( + testRepoCount.getAndIncrement() * TEST_REPO_WINDOW_DAYS, TimeUnit.DAYS))); return tr; } - public static TestRepository cloneProject( - Project.NameKey project, String uri) throws Exception { - DfsRepositoryDescription desc = - new DfsRepositoryDescription("clone of " + project.get()); + public static TestRepository cloneProject(Project.NameKey project, String uri) + throws Exception { + DfsRepositoryDescription desc = new DfsRepositoryDescription("clone of " + project.get()); FS fs = FS.detect(); // Avoid leaking user state into our tests. fs.setUserHome(null); - InMemoryRepository dest = new InMemoryRepository.Builder() - .setRepositoryDescription(desc) - // SshTransport depends on a real FS to read ~/.ssh/config, but - // InMemoryRepository by default uses a null FS. - // TODO(dborowitz): Remove when we no longer depend on SSH. - .setFS(fs) - .build(); + InMemoryRepository dest = + new InMemoryRepository.Builder() + .setRepositoryDescription(desc) + // SshTransport depends on a real FS to read ~/.ssh/config, but + // InMemoryRepository by default uses a null FS. + // TODO(dborowitz): Remove when we no longer depend on SSH. + .setFS(fs) + .build(); Config cfg = dest.getConfig(); cfg.setString("remote", "origin", "url", uri); - cfg.setString("remote", "origin", "fetch", - "+refs/heads/*:refs/remotes/origin/*"); + cfg.setString("remote", "origin", "fetch", "+refs/heads/*:refs/remotes/origin/*"); TestRepository testRepo = newTestRepository(dest); FetchResult result = testRepo.git().fetch().setRemote("origin").call(); String originMaster = "refs/remotes/origin/master"; @@ -141,51 +136,47 @@ public class GitUtil { return cloneProject(project, sshSession.getUrl() + "/" + project.get()); } - public static Ref createAnnotatedTag(TestRepository testRepo, String name, - PersonIdent tagger) throws GitAPIException { - TagCommand cmd = testRepo.git().tag() - .setName(name) - .setAnnotated(true) - .setMessage(name) - .setTagger(tagger); + public static Ref createAnnotatedTag(TestRepository testRepo, String name, PersonIdent tagger) + throws GitAPIException { + TagCommand cmd = + testRepo.git().tag().setName(name).setAnnotated(true).setMessage(name).setTagger(tagger); return cmd.call(); } - public static Ref updateAnnotatedTag(TestRepository testRepo, String name, - PersonIdent tagger) throws GitAPIException { + public static Ref updateAnnotatedTag(TestRepository testRepo, String name, PersonIdent tagger) + throws GitAPIException { TagCommand tc = testRepo.git().tag().setName(name); - return tc.setAnnotated(true) - .setMessage(name) - .setTagger(tagger) - .setForceUpdate(true) - .call(); + return tc.setAnnotated(true).setMessage(name).setTagger(tagger).setForceUpdate(true).call(); } - public static void fetch(TestRepository testRepo, String spec) - throws GitAPIException { + public static void fetch(TestRepository testRepo, String spec) throws GitAPIException { FetchCommand fetch = testRepo.git().fetch(); fetch.setRefSpecs(new RefSpec(spec)); fetch.call(); } - public static PushResult pushHead(TestRepository testRepo, String ref) - throws GitAPIException { + public static PushResult pushHead(TestRepository testRepo, String ref) throws GitAPIException { return pushHead(testRepo, ref, false); } - public static PushResult pushHead(TestRepository testRepo, String ref, - boolean pushTags) throws GitAPIException { + public static PushResult pushHead(TestRepository testRepo, String ref, boolean pushTags) + throws GitAPIException { return pushHead(testRepo, ref, pushTags, false); } - public static PushResult pushHead(TestRepository testRepo, String ref, - boolean pushTags, boolean force) throws GitAPIException { + public static PushResult pushHead( + TestRepository testRepo, String ref, boolean pushTags, boolean force) + throws GitAPIException { return pushOne(testRepo, "HEAD", ref, pushTags, force, null); } - public static PushResult pushHead(TestRepository testRepo, String ref, - boolean pushTags, boolean force, List pushOptions) - throws GitAPIException { + public static PushResult pushHead( + TestRepository testRepo, + String ref, + boolean pushTags, + boolean force, + List pushOptions) + throws GitAPIException { return pushOne(testRepo, "HEAD", ref, pushTags, force, pushOptions); } @@ -194,9 +185,14 @@ public class GitUtil { return pushOne(testRepo, "", ref, false, true, null); } - public static PushResult pushOne(TestRepository testRepo, String source, - String target, boolean pushTags, boolean force, List pushOptions) - throws GitAPIException { + public static PushResult pushOne( + TestRepository testRepo, + String source, + String target, + boolean pushTags, + boolean force, + List pushOptions) + throws GitAPIException { PushCommand pushCmd = testRepo.git().push(); pushCmd.setForce(force); pushCmd.setPushOptions(pushOptions); @@ -210,25 +206,23 @@ public class GitUtil { public static void assertPushOk(PushResult result, String ref) { RemoteRefUpdate rru = result.getRemoteUpdate(ref); - assertThat(rru.getStatus()).named(rru.toString()) - .isEqualTo(RemoteRefUpdate.Status.OK); + assertThat(rru.getStatus()).named(rru.toString()).isEqualTo(RemoteRefUpdate.Status.OK); } - public static void assertPushRejected(PushResult result, String ref, - String expectedMessage) { + public static void assertPushRejected(PushResult result, String ref, String expectedMessage) { RemoteRefUpdate rru = result.getRemoteUpdate(ref); - assertThat(rru.getStatus()).named(rru.toString()) + assertThat(rru.getStatus()) + .named(rru.toString()) .isEqualTo(RemoteRefUpdate.Status.REJECTED_OTHER_REASON); assertThat(rru.getMessage()).isEqualTo(expectedMessage); } - public static PushResult pushTag(TestRepository testRepo, String tag) - throws GitAPIException { + public static PushResult pushTag(TestRepository testRepo, String tag) throws GitAPIException { return pushTag(testRepo, tag, false); } - public static PushResult pushTag(TestRepository testRepo, String tag, - boolean force) throws GitAPIException { + public static PushResult pushTag(TestRepository testRepo, String tag, boolean force) + throws GitAPIException { PushCommand pushCmd = testRepo.git().push(); pushCmd.setForce(force); pushCmd.setRefSpecs(new RefSpec("refs/tags/" + tag + ":refs/tags/" + tag)); @@ -236,11 +230,9 @@ public class GitUtil { return Iterables.getOnlyElement(r); } - public static Optional getChangeId(TestRepository tr, ObjectId id) - throws IOException { + public static Optional getChangeId(TestRepository tr, ObjectId id) throws IOException { RevCommit c = tr.getRevWalk().parseCommit(id); tr.getRevWalk().parseBody(c); - return Lists.reverse(c.getFooterLines(FooterConstants.CHANGE_ID)).stream() - .findFirst(); + return Lists.reverse(c.getFooterLines(FooterConstants.CHANGE_ID)).stream().findFirst(); } } diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/HttpResponse.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/HttpResponse.java index e9c6e96e71..b62e932ed1 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/HttpResponse.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/HttpResponse.java @@ -15,15 +15,13 @@ package com.google.gerrit.acceptance; import com.google.common.base.Preconditions; - -import org.apache.http.Header; -import org.eclipse.jgit.util.IO; -import org.eclipse.jgit.util.RawParseUtils; - import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.nio.ByteBuffer; +import org.apache.http.Header; +import org.eclipse.jgit.util.IO; +import org.eclipse.jgit.util.RawParseUtils; public class HttpResponse { @@ -62,23 +60,14 @@ public class HttpResponse { } public boolean hasContent() { - Preconditions.checkNotNull(response, - "Response is not initialized."); + Preconditions.checkNotNull(response, "Response is not initialized."); return response.getEntity() != null; } public String getEntityContent() throws IOException { - Preconditions.checkNotNull(response, - "Response is not initialized."); - Preconditions.checkNotNull(response.getEntity(), - "Response.Entity is not initialized."); - ByteBuffer buf = IO.readWholeStream( - response.getEntity().getContent(), - 1024); - return RawParseUtils.decode( - buf.array(), - buf.arrayOffset(), - buf.limit()) - .trim(); + Preconditions.checkNotNull(response, "Response is not initialized."); + Preconditions.checkNotNull(response.getEntity(), "Response.Entity is not initialized."); + ByteBuffer buf = IO.readWholeStream(response.getEntity().getContent(), 1024); + return RawParseUtils.decode(buf.array(), buf.arrayOffset(), buf.limit()).trim(); } } diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/HttpSession.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/HttpSession.java index e5182df70e..fe446f4a40 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/HttpSession.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/HttpSession.java @@ -16,14 +16,12 @@ package com.google.gerrit.acceptance; import com.google.common.base.CharMatcher; import com.google.gerrit.common.Nullable; - +import java.io.IOException; +import java.net.URI; import org.apache.http.HttpHost; import org.apache.http.client.fluent.Executor; import org.apache.http.client.fluent.Request; -import java.io.IOException; -import java.net.URI; - public class HttpSession { protected TestAccount account; protected final String url; @@ -35,9 +33,8 @@ public class HttpSession { this.executor = Executor.newInstance(); this.account = account; if (account != null) { - executor.auth( - new HttpHost(uri.getHost(), uri.getPort()), - account.username, account.httpPassword); + executor.auth( + new HttpHost(uri.getHost(), uri.getPort()), account.username, account.httpPassword); } } diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/InMemoryTestingDatabaseModule.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/InMemoryTestingDatabaseModule.java index bdc1bb3fc3..1096b03758 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/InMemoryTestingDatabaseModule.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/InMemoryTestingDatabaseModule.java @@ -48,15 +48,13 @@ import com.google.inject.Provides; import com.google.inject.ProvisionException; import com.google.inject.Singleton; import com.google.inject.TypeLiteral; - -import org.apache.sshd.common.keyprovider.KeyPairProvider; -import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider; -import org.eclipse.jgit.lib.Config; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import org.apache.sshd.common.keyprovider.KeyPairProvider; +import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider; +import org.eclipse.jgit.lib.Config; class InMemoryTestingDatabaseModule extends LifecycleModule { private final Config cfg; @@ -67,19 +65,14 @@ class InMemoryTestingDatabaseModule extends LifecycleModule { @Override protected void configure() { - bind(Config.class) - .annotatedWith(GerritServerConfig.class) - .toInstance(cfg); + bind(Config.class).annotatedWith(GerritServerConfig.class).toInstance(cfg); // TODO(dborowitz): Use jimfs. Path p = Paths.get(cfg.getString("gerrit", null, "tempSiteDir")); - bind(Path.class) - .annotatedWith(SitePath.class) - .toInstance(p); + bind(Path.class).annotatedWith(SitePath.class).toInstance(p); makeSiteDirs(p); - bind(GitRepositoryManager.class) - .to(InMemoryRepositoryManager.class); + bind(GitRepositoryManager.class).to(InMemoryRepositoryManager.class); bind(InMemoryRepositoryManager.class).in(SINGLETON); bind(MetricMaker.class).to(DisabledMetricMaker.class); @@ -89,17 +82,14 @@ class InMemoryTestingDatabaseModule extends LifecycleModule { TypeLiteral> schemaFactory = new TypeLiteral>() {}; bind(schemaFactory).to(NotesMigrationSchemaFactory.class); - bind(Key.get(schemaFactory, ReviewDbFactory.class)) - .to(InMemoryDatabase.class); + bind(Key.get(schemaFactory, ReviewDbFactory.class)).to(InMemoryDatabase.class); bind(InMemoryDatabase.class).in(SINGLETON); bind(ChangeBundleReader.class).to(GwtormChangeBundleReader.class); listener().to(CreateDatabase.class); bind(SitePaths.class); - bind(TrackingFooters.class) - .toProvider(TrackingFootersProvider.class) - .in(SINGLETON); + bind(TrackingFooters.class).toProvider(TrackingFootersProvider.class).in(SINGLETON); install(new SchemaModule()); bind(SchemaVersion.class).to(SchemaVersion.C); diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/InProcessProtocol.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/InProcessProtocol.java index 1d03acda6f..0977e24b7d 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/InProcessProtocol.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/InProcessProtocol.java @@ -55,7 +55,11 @@ import com.google.inject.Provides; import com.google.inject.Scope; import com.google.inject.servlet.RequestScoped; import com.google.inject.util.Providers; - +import java.io.IOException; +import java.net.SocketAddress; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.transport.PostReceiveHook; import org.eclipse.jgit.transport.PostReceiveHookChain; @@ -68,12 +72,6 @@ import org.eclipse.jgit.transport.resolver.ReceivePackFactory; import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException; import org.eclipse.jgit.transport.resolver.UploadPackFactory; -import java.io.IOException; -import java.net.SocketAddress; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - class InProcessProtocol extends TestProtocol { static Module module() { return new AbstractModule() { @@ -94,36 +92,37 @@ class InProcessProtocol extends TestProtocol { }; } - private static final Scope REQUEST = new Scope() { - @Override - public Provider scope(final Key key, final Provider creator) { - return new Provider() { + private static final Scope REQUEST = + new Scope() { @Override - public T get() { - Context ctx = current.get(); - if (ctx == null) { - throw new OutOfScopeException("Not in TestProtocol scope"); - } - return ctx.get(key, creator); + public Provider scope(final Key key, final Provider creator) { + return new Provider() { + @Override + public T get() { + Context ctx = current.get(); + if (ctx == null) { + throw new OutOfScopeException("Not in TestProtocol scope"); + } + return ctx.get(key, creator); + } + + @Override + public String toString() { + return String.format("%s[%s]", creator, REQUEST); + } + }; } @Override public String toString() { - return String.format("%s[%s]", creator, REQUEST); + return "InProcessProtocol.REQUEST"; } }; - } - @Override - public String toString() { - return "InProcessProtocol.REQUEST"; - } - }; - - private static class Propagator - extends ThreadLocalRequestScopePropagator { + private static class Propagator extends ThreadLocalRequestScopePropagator { @Inject - Propagator(ThreadLocalRequestContext local, + Propagator( + ThreadLocalRequestContext local, Provider dbProviderProvider) { super(REQUEST, current, local, dbProviderProvider); } @@ -139,22 +138,20 @@ class InProcessProtocol extends TestProtocol { // TODO(dborowitz): Merge this with AcceptanceTestRequestScope. /** * Multi-purpose session/context object. - *

- * Confusingly, Gerrit has two ideas of what a "context" object is: - * one for Guice {@link RequestScoped}, and one for its own simplified - * version of request scoping using {@link ThreadLocalRequestContext}. - * This class provides both, in essence just delegating the {@code + * + *

Confusingly, Gerrit has two ideas of what a "context" object is: one for Guice {@link + * RequestScoped}, and one for its own simplified version of request scoping using {@link + * ThreadLocalRequestContext}. This class provides both, in essence just delegating the {@code * ThreadLocalRequestContext} scoping to the Guice scoping mechanism. - *

- * It is also used as the session type for {@code UploadPackFactory} and - * {@code ReceivePackFactory}, since, after all, it encapsulates all the - * information about a single request. + * + *

It is also used as the session type for {@code UploadPackFactory} and {@code + * ReceivePackFactory}, since, after all, it encapsulates all the information about a single + * request. */ static class Context implements RequestContext { private static final Key DB_KEY = Key.get(RequestScopedReviewDbProvider.class); - private static final Key RC_KEY = - Key.get(RequestCleanup.class); + private static final Key RC_KEY = Key.get(RequestCleanup.class); private static final Key USER_KEY = Key.get(CurrentUser.class); private final SchemaFactory schemaFactory; @@ -164,7 +161,8 @@ class InProcessProtocol extends TestProtocol { private final RequestCleanup cleanup; private final Map, Object> map; - Context(SchemaFactory schemaFactory, + Context( + SchemaFactory schemaFactory, IdentifiedUser.GenericFactory userFactory, Account.Id accountId, Project.NameKey project) { @@ -174,9 +172,7 @@ class InProcessProtocol extends TestProtocol { this.project = project; map = new HashMap<>(); cleanup = new RequestCleanup(); - map.put(DB_KEY, - new RequestScopedReviewDbProvider( - schemaFactory, Providers.of(cleanup))); + map.put(DB_KEY, new RequestScopedReviewDbProvider(schemaFactory, Providers.of(cleanup))); map.put(RC_KEY, cleanup); IdentifiedUser user = userFactory.create(accountId); @@ -255,8 +251,7 @@ class InProcessProtocol extends TestProtocol { threadContext.setContext(req); current.set(req); try { - ProjectControl ctl = projectControlFactory.controlFor( - req.project, userProvider.get()); + ProjectControl ctl = projectControlFactory.controlFor(req.project, userProvider.get()); if (!ctl.canRunUploadPack()) { throw new ServiceNotAuthorizedException(); } @@ -264,12 +259,11 @@ class InProcessProtocol extends TestProtocol { UploadPack up = new UploadPack(repo); up.setPackConfig(transferConfig.getPackConfig()); up.setTimeout(transferConfig.getTimeout()); - up.setAdvertiseRefsHook(new VisibleRefFilter( - tagCache, changeNotesFactory, changeCache, repo, ctl, - dbProvider.get(), true)); + up.setAdvertiseRefsHook( + new VisibleRefFilter( + tagCache, changeNotesFactory, changeCache, repo, ctl, dbProvider.get(), true)); List hooks = Lists.newArrayList(preUploadHooks); - hooks.add(uploadValidatorsFactory.create( - ctl.getProject(), repo, "localhost-test")); + hooks.add(uploadValidatorsFactory.create(ctl.getProject(), repo, "localhost-test")); up.setPreUploadHook(PreUploadHookChain.newChain(hooks)); return up; } catch (NoSuchProjectException | IOException e) { @@ -315,8 +309,7 @@ class InProcessProtocol extends TestProtocol { threadContext.setContext(req); current.set(req); try { - ProjectControl ctl = - projectControlFactory.controlFor(req.project, userProvider.get()); + ProjectControl ctl = projectControlFactory.controlFor(req.project, userProvider.get()); if (!ctl.canRunReceivePack()) { throw new ServiceNotAuthorizedException(); } @@ -337,8 +330,7 @@ class InProcessProtocol extends TestProtocol { initializer.init(ctl.getProject().getNameKey(), rp); } - rp.setPostReceiveHook(PostReceiveHookChain.newChain( - Lists.newArrayList(postReceiveHooks))); + rp.setPostReceiveHook(PostReceiveHookChain.newChain(Lists.newArrayList(postReceiveHooks))); return rp; } catch (NoSuchProjectException | IOException e) { throw new RuntimeException(e); @@ -347,8 +339,7 @@ class InProcessProtocol extends TestProtocol { } @Inject - InProcessProtocol(Upload uploadPackFactory, - Receive receivePackFactory) { + InProcessProtocol(Upload uploadPackFactory, Receive receivePackFactory) { super(uploadPackFactory, receivePackFactory); } } diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/LightweightPluginDaemonTest.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/LightweightPluginDaemonTest.java index 9c863917a4..58a9238f7c 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/LightweightPluginDaemonTest.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/LightweightPluginDaemonTest.java @@ -18,16 +18,13 @@ import com.google.gerrit.server.PluginUser; import com.google.gerrit.server.plugins.PluginGuiceEnvironment; import com.google.gerrit.server.plugins.TestServerPlugin; import com.google.inject.Inject; - import org.junit.After; import org.junit.Before; public class LightweightPluginDaemonTest extends AbstractDaemonTest { - @Inject - private PluginGuiceEnvironment env; + @Inject private PluginGuiceEnvironment env; - @Inject - private PluginUser.Factory pluginUserFactory; + @Inject private PluginUser.Factory pluginUserFactory; private TestServerPlugin plugin; @@ -35,13 +32,15 @@ public class LightweightPluginDaemonTest extends AbstractDaemonTest { public void setUp() throws Exception { TestPlugin testPlugin = getTestPlugin(getClass()); String name = testPlugin.name(); - plugin = new TestServerPlugin(name, - canonicalWebUrl.get() + "plugins/" + name, - pluginUserFactory.create(name), - getClass().getClassLoader(), - testPlugin.sysModule(), - testPlugin.httpModule(), - testPlugin.sshModule()); + plugin = + new TestServerPlugin( + name, + canonicalWebUrl.get() + "plugins/" + name, + pluginUserFactory.create(name), + getClass().getClassLoader(), + testPlugin.sysModule(), + testPlugin.httpModule(), + testPlugin.sshModule()); plugin.start(env); env.onStartPlugin(plugin); diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/MergeableFileBasedConfig.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/MergeableFileBasedConfig.java index 3b59d28bcc..c651d481d1 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/MergeableFileBasedConfig.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/MergeableFileBasedConfig.java @@ -15,16 +15,12 @@ package com.google.gerrit.acceptance; import com.google.common.collect.Lists; - +import java.io.File; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.storage.file.FileBasedConfig; import org.eclipse.jgit.util.FS; -import java.io.File; - -/** - * A file based Config that can merge another Config instance. - */ +/** A file based Config that can merge another Config instance. */ public class MergeableFileBasedConfig extends FileBasedConfig { public MergeableFileBasedConfig(File cfgLocation, FS fs) { super(cfgLocation, fs); @@ -33,9 +29,8 @@ public class MergeableFileBasedConfig extends FileBasedConfig { /** * Merge another Config into this Config. * - * In case a configuration parameter exists both in this instance and in the - * merged instance then the value in this instance will simply replaced by - * the value from the merged instance. + *

In case a configuration parameter exists both in this instance and in the merged instance + * then the value in this instance will simply replaced by the value from the merged instance. * * @param s Config to merge into this instance */ @@ -46,14 +41,17 @@ public class MergeableFileBasedConfig extends FileBasedConfig { for (String section : s.getSections()) { for (String subsection : s.getSubsections(section)) { for (String name : s.getNames(section, subsection)) { - setStringList(section, subsection, name, Lists.newArrayList(s - .getStringList(section, subsection, name))); + setStringList( + section, + subsection, + name, + Lists.newArrayList(s.getStringList(section, subsection, name))); } } for (String name : s.getNames(section, true)) { - setStringList(section, null, name, - Lists.newArrayList(s.getStringList(section, null, name))); + setStringList( + section, null, name, Lists.newArrayList(s.getStringList(section, null, name))); } } } diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/NoHttpd.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/NoHttpd.java index 378439ce2d..e8d6103bda 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/NoHttpd.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/NoHttpd.java @@ -23,5 +23,4 @@ import java.lang.annotation.Target; @Target({TYPE, METHOD}) @Retention(RUNTIME) -public @interface NoHttpd { -} +public @interface NoHttpd {} diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/PluginDaemonTest.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/PluginDaemonTest.java index 8620c6d647..2af193f610 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/PluginDaemonTest.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/PluginDaemonTest.java @@ -20,12 +20,6 @@ import com.google.common.base.MoreObjects; import com.google.common.base.Strings; import com.google.gerrit.launcher.GerritLauncher; import com.google.gerrit.server.config.SitePaths; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.storage.file.FileBasedConfig; -import org.eclipse.jgit.util.FS; -import org.junit.runner.Description; - import java.io.IOException; import java.io.InputStream; import java.lang.ProcessBuilder.Redirect; @@ -37,10 +31,12 @@ import java.nio.file.StandardCopyOption; import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.storage.file.FileBasedConfig; +import org.eclipse.jgit.util.FS; +import org.junit.runner.Description; -/** - * @deprecated use {@link LightweightPluginDaemonTest} instead. - */ +/** @deprecated use {@link LightweightPluginDaemonTest} instead. */ @Deprecated public abstract class PluginDaemonTest extends AbstractDaemonTest { @@ -73,8 +69,7 @@ public abstract class PluginDaemonTest extends AbstractDaemonTest { super.beforeTest(description); } - protected void beforeTestServerStarts() throws Exception { - } + protected void beforeTestServerStarts() throws Exception {} protected void setPluginConfigString(String name, String value) throws IOException, ConfigInvalidException { @@ -85,10 +80,8 @@ public abstract class PluginDaemonTest extends AbstractDaemonTest { cfg.save(); } - private FileBasedConfig getGerritConfigFile(SitePaths sitePath) - throws IOException { - FileBasedConfig cfg = - new FileBasedConfig(sitePath.gerrit_config.toFile(), FS.DETECTED); + private FileBasedConfig getGerritConfigFile(SitePaths sitePath) throws IOException { + FileBasedConfig cfg = new FileBasedConfig(sitePath.gerrit_config.toFile(), FS.DETECTED); if (!cfg.getFile().exists()) { Path etc_path = Files.createDirectories(sitePath.etc_dir); Files.createFile(etc_path.resolve("gerrit.config")); @@ -97,8 +90,7 @@ public abstract class PluginDaemonTest extends AbstractDaemonTest { } private void locatePaths() throws IOException { - URL pluginClassesUrl = - getClass().getProtectionDomain().getCodeSource().getLocation(); + URL pluginClassesUrl = getClass().getProtectionDomain().getCodeSource().getLocation(); basePath = Paths.get(pluginClassesUrl.getPath()).getParent(); int idx = 0; @@ -141,17 +133,15 @@ public abstract class PluginDaemonTest extends AbstractDaemonTest { return false; } String pathCharStringOrNone = "[a-zA-Z0-9._-]*?"; - Pattern pattern = Pattern.compile(pathCharStringOrNone + "gerrit" + - pathCharStringOrNone); + Pattern pattern = Pattern.compile(pathCharStringOrNone + "gerrit" + pathCharStringOrNone); Path partialPath = basePath; for (int i = basePath.getNameCount(); i > 0; i--) { int count = partialPath.getNameCount(); if (count > 1) { - String gerritDirCandidate = - partialPath.subpath(count - 2, count - 1).toString(); + String gerritDirCandidate = partialPath.subpath(count - 2, count - 1).toString(); if (pattern.matcher(gerritDirCandidate).matches()) { - if (partialPath.endsWith(gerritDirCandidate + "/" + BUCKOUT) || - partialPath.endsWith(gerritDirCandidate + "/" + ECLIPSE)) { + if (partialPath.endsWith(gerritDirCandidate + "/" + BUCKOUT) + || partialPath.endsWith(gerritDirCandidate + "/" + ECLIPSE)) { return false; } } @@ -171,14 +161,11 @@ public abstract class PluginDaemonTest extends AbstractDaemonTest { buildfile = pluginSource.resolve("BUILD"); } if (!Files.exists(buildfile)) { - throw new IllegalStateException("Cannot find build file in: " - + pluginSource); + throw new IllegalStateException("Cannot find build file in: " + pluginSource); } byte[] bytes = Files.readAllBytes(buildfile); - String buckContent = - new String(bytes, UTF_8).replaceAll("\\s+", ""); - Matcher matcher = - Pattern.compile("gerrit_plugin\\(name='(.*?)'").matcher(buckContent); + String buckContent = new String(bytes, UTF_8).replaceAll("\\s+", ""); + Matcher matcher = Pattern.compile("gerrit_plugin\\(name='(.*?)'").matcher(buckContent); if (matcher.find()) { pluginName = matcher.group(1); } @@ -196,13 +183,11 @@ public abstract class PluginDaemonTest extends AbstractDaemonTest { String build; if (bazel) { dir = GerritLauncher.resolveInSourceRoot("."); - Properties properties = loadBuildProperties( - dir.resolve(".primary_build_tool")); - build = MoreObjects.firstNonNull( - properties.getProperty(BAZELLC), BAZELLC); + Properties properties = loadBuildProperties(dir.resolve(".primary_build_tool")); + build = MoreObjects.firstNonNull(properties.getProperty(BAZELLC), BAZELLC); } else { - Properties properties = loadBuildProperties( - gen.resolve(Paths.get("tools/buck/buck.properties"))); + Properties properties = + loadBuildProperties(gen.resolve(Paths.get("tools/buck/buck.properties"))); build = MoreObjects.firstNonNull(properties.getProperty(BUCKLC), BUCKLC); } String target; @@ -213,7 +198,8 @@ public abstract class PluginDaemonTest extends AbstractDaemonTest { } ProcessBuilder processBuilder = - new ProcessBuilder(build, "build", target).directory(dir.toFile()) + new ProcessBuilder(build, "build", target) + .directory(dir.toFile()) .redirectErrorStream(true); Path forceJar = pluginSource.resolve("src/main/java/ForceJarIfMissing.java"); if (!bazel) { diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/PushOneCommit.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/PushOneCommit.java index 3f5ada8a84..d7649145d3 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/PushOneCommit.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/PushOneCommit.java @@ -35,7 +35,8 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - +import java.util.List; +import java.util.Map; import org.eclipse.jgit.api.TagCommand; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.PersonIdent; @@ -44,37 +45,32 @@ import org.eclipse.jgit.transport.PushResult; import org.eclipse.jgit.transport.RemoteRefUpdate; import org.eclipse.jgit.transport.RemoteRefUpdate.Status; -import java.util.List; -import java.util.Map; - public class PushOneCommit { public static final String SUBJECT = "test commit"; public static final String FILE_NAME = "a.txt"; public static final String FILE_CONTENT = "some content"; public static final String PATCH_FILE_ONLY = - "diff --git a/a.txt b/a.txt\n" + - "new file mode 100644\n" + - "index 0000000..f0eec86\n" + - "--- /dev/null\n" + - "+++ b/a.txt\n" + - "@@ -0,0 +1 @@\n" + - "+some content\n" + - "\\ No newline at end of file\n"; + "diff --git a/a.txt b/a.txt\n" + + "new file mode 100644\n" + + "index 0000000..f0eec86\n" + + "--- /dev/null\n" + + "+++ b/a.txt\n" + + "@@ -0,0 +1 @@\n" + + "+some content\n" + + "\\ No newline at end of file\n"; public static final String PATCH = - "From %s Mon Sep 17 00:00:00 2001\n" + - "From: Administrator \n" + - "Date: %s\n" + - "Subject: [PATCH] test commit\n" + - "\n" + - "Change-Id: %s\n" + - "---\n" + - "\n" + PATCH_FILE_ONLY; + "From %s Mon Sep 17 00:00:00 2001\n" + + "From: Administrator \n" + + "Date: %s\n" + + "Subject: [PATCH] test commit\n" + + "\n" + + "Change-Id: %s\n" + + "---\n" + + "\n" + + PATCH_FILE_ONLY; public interface Factory { - PushOneCommit create( - ReviewDb db, - PersonIdent i, - TestRepository testRepo); + PushOneCommit create(ReviewDb db, PersonIdent i, TestRepository testRepo); PushOneCommit create( ReviewDb db, @@ -142,30 +138,52 @@ public class PushOneCommit { private final TestRepository.CommitBuilder commitBuilder; @AssistedInject - PushOneCommit(ChangeNotes.Factory notesFactory, + PushOneCommit( + ChangeNotes.Factory notesFactory, ApprovalsUtil approvalsUtil, Provider queryProvider, @Assisted ReviewDb db, @Assisted PersonIdent i, - @Assisted TestRepository testRepo) throws Exception { - this(notesFactory, approvalsUtil, queryProvider, - db, i, testRepo, SUBJECT, FILE_NAME, FILE_CONTENT); + @Assisted TestRepository testRepo) + throws Exception { + this( + notesFactory, + approvalsUtil, + queryProvider, + db, + i, + testRepo, + SUBJECT, + FILE_NAME, + FILE_CONTENT); } @AssistedInject - PushOneCommit(ChangeNotes.Factory notesFactory, + PushOneCommit( + ChangeNotes.Factory notesFactory, ApprovalsUtil approvalsUtil, Provider queryProvider, @Assisted ReviewDb db, @Assisted PersonIdent i, @Assisted TestRepository testRepo, - @Assisted("changeId") String changeId) throws Exception { - this(notesFactory, approvalsUtil, queryProvider, - db, i, testRepo, SUBJECT, FILE_NAME, FILE_CONTENT, changeId); + @Assisted("changeId") String changeId) + throws Exception { + this( + notesFactory, + approvalsUtil, + queryProvider, + db, + i, + testRepo, + SUBJECT, + FILE_NAME, + FILE_CONTENT, + changeId); } @AssistedInject - PushOneCommit(ChangeNotes.Factory notesFactory, + PushOneCommit( + ChangeNotes.Factory notesFactory, ApprovalsUtil approvalsUtil, Provider queryProvider, @Assisted ReviewDb db, @@ -173,26 +191,38 @@ public class PushOneCommit { @Assisted TestRepository testRepo, @Assisted("subject") String subject, @Assisted("fileName") String fileName, - @Assisted("content") String content) throws Exception { - this(notesFactory, approvalsUtil, queryProvider, - db, i, testRepo, subject, fileName, content, null); + @Assisted("content") String content) + throws Exception { + this( + notesFactory, + approvalsUtil, + queryProvider, + db, + i, + testRepo, + subject, + fileName, + content, + null); } @AssistedInject - PushOneCommit(ChangeNotes.Factory notesFactory, + PushOneCommit( + ChangeNotes.Factory notesFactory, ApprovalsUtil approvalsUtil, Provider queryProvider, @Assisted ReviewDb db, @Assisted PersonIdent i, @Assisted TestRepository testRepo, @Assisted String subject, - @Assisted Map files) throws Exception { - this(notesFactory, approvalsUtil, queryProvider, db, i, testRepo, - subject, files, null); + @Assisted Map files) + throws Exception { + this(notesFactory, approvalsUtil, queryProvider, db, i, testRepo, subject, files, null); } @AssistedInject - PushOneCommit(ChangeNotes.Factory notesFactory, + PushOneCommit( + ChangeNotes.Factory notesFactory, ApprovalsUtil approvalsUtil, Provider queryProvider, @Assisted ReviewDb db, @@ -201,12 +231,22 @@ public class PushOneCommit { @Assisted("subject") String subject, @Assisted("fileName") String fileName, @Assisted("content") String content, - @Nullable @Assisted("changeId") String changeId) throws Exception { - this(notesFactory, approvalsUtil, queryProvider, db, i, testRepo, - subject, ImmutableMap.of(fileName, content), changeId); + @Nullable @Assisted("changeId") String changeId) + throws Exception { + this( + notesFactory, + approvalsUtil, + queryProvider, + db, + i, + testRepo, + subject, + ImmutableMap.of(fileName, content), + changeId); } - private PushOneCommit(ChangeNotes.Factory notesFactory, + private PushOneCommit( + ChangeNotes.Factory notesFactory, ApprovalsUtil approvalsUtil, Provider queryProvider, ReviewDb db, @@ -214,7 +254,8 @@ public class PushOneCommit { TestRepository testRepo, String subject, Map files, - String changeId) throws Exception { + String changeId) + throws Exception { this.db = db; this.testRepo = testRepo; this.notesFactory = notesFactory; @@ -224,14 +265,11 @@ public class PushOneCommit { this.files = files; this.changeId = changeId; if (changeId != null) { - commitBuilder = testRepo.amendRef("HEAD") - .insertChangeId(changeId.substring(1)); + commitBuilder = testRepo.amendRef("HEAD").insertChangeId(changeId.substring(1)); } else { commitBuilder = testRepo.branch("HEAD").commit().insertChangeId(); } - commitBuilder.message(subject) - .author(i) - .committer(new PersonIdent(i, testRepo.getDate())); + commitBuilder.message(subject).author(i).committer(new PersonIdent(i, testRepo.getDate())); } public void setParents(List parents) throws Exception { @@ -268,17 +306,17 @@ public class PushOneCommit { if (tag != null) { TagCommand tagCommand = testRepo.git().tag().setName(tag.name); if (tag instanceof AnnotatedTag) { - AnnotatedTag annotatedTag = (AnnotatedTag)tag; - tagCommand.setAnnotated(true) - .setMessage(annotatedTag.message) - .setTagger(annotatedTag.tagger); + AnnotatedTag annotatedTag = (AnnotatedTag) tag; + tagCommand + .setAnnotated(true) + .setMessage(annotatedTag.message) + .setTagger(annotatedTag.tagger); } else { tagCommand.setAnnotated(false); } tagCommand.call(); } - return new Result(ref, - pushHead(testRepo, ref, tag != null, force, pushOptions), c, subject); + return new Result(ref, pushHead(testRepo, ref, tag != null, force, pushOptions), c, subject); } public void setTag(final Tag tag) { @@ -307,8 +345,7 @@ public class PushOneCommit { private final RevCommit commit; private final String resSubj; - private Result(String ref, PushResult resSubj, RevCommit commit, - String subject) { + private Result(String ref, PushResult resSubj, RevCommit commit, String subject) { this.ref = ref; this.result = resSubj; this.commit = commit; @@ -316,8 +353,7 @@ public class PushOneCommit { } public ChangeData getChange() throws OrmException { - return Iterables.getOnlyElement( - queryProvider.get().byKeyPrefix(changeId)); + return Iterables.getOnlyElement(queryProvider.get().byKeyPrefix(changeId)); } public PatchSet getPatchSet() throws OrmException { @@ -340,8 +376,8 @@ public class PushOneCommit { assertEquals(pushOptions, getPushOptions()); } - public void assertChange(Change.Status expectedStatus, - String expectedTopic, TestAccount... expectedReviewers) + public void assertChange( + Change.Status expectedStatus, String expectedTopic, TestAccount... expectedReviewers) throws OrmException { Change c = getChange().change(); assertThat(c.getSubject()).isEqualTo(resSubj); @@ -350,13 +386,11 @@ public class PushOneCommit { assertReviewers(c, expectedReviewers); } - private void assertReviewers(Change c, TestAccount... expectedReviewers) - throws OrmException { - Iterable actualIds = approvalsUtil - .getReviewers(db, notesFactory.createChecked(db, c)) - .all(); - assertThat(actualIds).containsExactlyElementsIn( - Sets.newHashSet(TestAccount.ids(expectedReviewers))); + private void assertReviewers(Change c, TestAccount... expectedReviewers) throws OrmException { + Iterable actualIds = + approvalsUtil.getReviewers(db, notesFactory.createChecked(db, c)).all(); + assertThat(actualIds) + .containsExactlyElementsIn(Sets.newHashSet(TestAccount.ids(expectedReviewers))); } public void assertOkStatus() { @@ -370,22 +404,19 @@ public class PushOneCommit { public void assertErrorStatus() { RemoteRefUpdate refUpdate = result.getRemoteUpdate(ref); assertThat(refUpdate.getStatus()) - .named(message(refUpdate)) - .isEqualTo(Status.REJECTED_OTHER_REASON); + .named(message(refUpdate)) + .isEqualTo(Status.REJECTED_OTHER_REASON); } private void assertStatus(Status expectedStatus, String expectedMessage) { RemoteRefUpdate refUpdate = result.getRemoteUpdate(ref); - assertThat(refUpdate.getStatus()) - .named(message(refUpdate)) - .isEqualTo(expectedStatus); + assertThat(refUpdate.getStatus()).named(message(refUpdate)).isEqualTo(expectedStatus); assertThat(refUpdate.getMessage()).isEqualTo(expectedMessage); } public void assertMessage(String expectedMessage) { RemoteRefUpdate refUpdate = result.getRemoteUpdate(ref); - assertThat(message(refUpdate).toLowerCase()) - .contains(expectedMessage.toLowerCase()); + assertThat(message(refUpdate).toLowerCase()).contains(expectedMessage.toLowerCase()); } public String getMessage() { diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/ReadOnlyChangeIndex.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/ReadOnlyChangeIndex.java index cdecf059aa..6b054c8bb7 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/ReadOnlyChangeIndex.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/ReadOnlyChangeIndex.java @@ -22,7 +22,6 @@ import com.google.gerrit.server.query.DataSource; import com.google.gerrit.server.query.Predicate; import com.google.gerrit.server.query.QueryParseException; import com.google.gerrit.server.query.change.ChangeData; - import java.io.IOException; public class ReadOnlyChangeIndex implements ChangeIndex { @@ -62,8 +61,8 @@ public class ReadOnlyChangeIndex implements ChangeIndex { } @Override - public DataSource getSource(Predicate p, - QueryOptions opts) throws QueryParseException { + public DataSource getSource(Predicate p, QueryOptions opts) + throws QueryParseException { return index.getSource(p, opts); } diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/RestResponse.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/RestResponse.java index d76cb8159a..e08132a380 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/RestResponse.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/RestResponse.java @@ -18,11 +18,10 @@ import static com.google.common.truth.Truth.assert_; import static com.google.gerrit.httpd.restapi.RestApiServlet.JSON_MAGIC; import static java.nio.charset.StandardCharsets.UTF_8; -import org.apache.http.HttpStatus; - import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; +import org.apache.http.HttpStatus; public class RestResponse extends HttpResponse { @@ -33,8 +32,7 @@ public class RestResponse extends HttpResponse { @Override public Reader getReader() throws IllegalStateException, IOException { if (reader == null && response.getEntity() != null) { - reader = new InputStreamReader( - response.getEntity().getContent(), UTF_8); + reader = new InputStreamReader(response.getEntity().getContent(), UTF_8); reader.skip(JSON_MAGIC.length); } return reader; diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/RestSession.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/RestSession.java index f6bdf7a2e0..300e75f255 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/RestSession.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/RestSession.java @@ -21,7 +21,7 @@ import com.google.common.net.HttpHeaders; import com.google.gerrit.common.Nullable; import com.google.gerrit.extensions.restapi.RawInput; import com.google.gerrit.server.OutputFormat; - +import java.io.IOException; import org.apache.http.Header; import org.apache.http.HttpStatus; import org.apache.http.client.fluent.Request; @@ -30,21 +30,17 @@ import org.apache.http.entity.InputStreamEntity; import org.apache.http.entity.StringEntity; import org.apache.http.message.BasicHeader; -import java.io.IOException; - public class RestSession extends HttpSession { public RestSession(GerritServer server, @Nullable TestAccount account) { super(server, account); } - public RestResponse getOK(String endPoint) - throws Exception { + public RestResponse getOK(String endPoint) throws Exception { return get(endPoint, HttpStatus.SC_OK); } - public RestResponse get(String endPoint, int expectedStatus) - throws Exception { + public RestResponse get(String endPoint, int expectedStatus) throws Exception { RestResponse r = get(endPoint); r.assertStatus(expectedStatus); return r; @@ -55,12 +51,10 @@ public class RestSession extends HttpSession { } public RestResponse getJsonAccept(String endPoint) throws IOException { - return getWithHeader(endPoint, - new BasicHeader(HttpHeaders.ACCEPT, "application/json")); + return getWithHeader(endPoint, new BasicHeader(HttpHeaders.ACCEPT, "application/json")); } - public RestResponse getWithHeader(String endPoint, Header header) - throws IOException { + public RestResponse getWithHeader(String endPoint, Header header) throws IOException { Request get = Request.Get(getUrl(endPoint)); if (header != null) { get.addHeader(header); @@ -80,22 +74,19 @@ public class RestSession extends HttpSession { return putWithHeader(endPoint, null, content); } - public RestResponse putWithHeader(String endPoint, Header header) - throws IOException { + public RestResponse putWithHeader(String endPoint, Header header) throws IOException { return putWithHeader(endPoint, header, null); } - public RestResponse putWithHeader(String endPoint, Header header, - Object content) throws IOException { + public RestResponse putWithHeader(String endPoint, Header header, Object content) + throws IOException { Request put = Request.Put(getUrl(endPoint)); if (header != null) { put.addHeader(header); } if (content != null) { put.addHeader(new BasicHeader("Content-Type", "application/json")); - put.body(new StringEntity( - OutputFormat.JSON_COMPACT.newGson().toJson(content), - UTF_8)); + put.body(new StringEntity(OutputFormat.JSON_COMPACT.newGson().toJson(content), UTF_8)); } return execute(put); } @@ -104,10 +95,9 @@ public class RestSession extends HttpSession { Preconditions.checkNotNull(stream); Request put = Request.Put(getUrl(endPoint)); put.addHeader(new BasicHeader("Content-Type", stream.getContentType())); - put.body(new BufferedHttpEntity( - new InputStreamEntity( - stream.getInputStream(), - stream.getContentLength()))); + put.body( + new BufferedHttpEntity( + new InputStreamEntity(stream.getInputStream(), stream.getContentLength()))); return execute(put); } @@ -115,13 +105,11 @@ public class RestSession extends HttpSession { return post(endPoint, null); } - public RestResponse postOK(String endPoint, Object content) - throws Exception { + public RestResponse postOK(String endPoint, Object content) throws Exception { return post(endPoint, content, HttpStatus.SC_OK); } - public RestResponse post(String endPoint, Object content, int expectedStatus) - throws Exception { + public RestResponse post(String endPoint, Object content, int expectedStatus) throws Exception { RestResponse r = post(endPoint, content); r.assertStatus(expectedStatus); return r; @@ -131,17 +119,15 @@ public class RestSession extends HttpSession { return postWithHeader(endPoint, content, null); } - public RestResponse postWithHeader(String endPoint, Object content, - Header header) throws IOException { + public RestResponse postWithHeader(String endPoint, Object content, Header header) + throws IOException { Request post = Request.Post(getUrl(endPoint)); if (header != null) { post.addHeader(header); } if (content != null) { post.addHeader(new BasicHeader("Content-Type", "application/json")); - post.body(new StringEntity( - OutputFormat.JSON_COMPACT.newGson().toJson(content), - UTF_8)); + post.body(new StringEntity(OutputFormat.JSON_COMPACT.newGson().toJson(content), UTF_8)); } return execute(post); } diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/Sandboxed.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/Sandboxed.java index 11446e081b..2128c3c8c2 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/Sandboxed.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/Sandboxed.java @@ -23,5 +23,4 @@ import java.lang.annotation.Target; @Target({TYPE, METHOD}) @Retention(RUNTIME) -public @interface Sandboxed { -} +public @interface Sandboxed {} diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/SshSession.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/SshSession.java index 4ce3301093..1f002487d1 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/SshSession.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/SshSession.java @@ -20,7 +20,6 @@ import com.jcraft.jsch.ChannelExec; import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; - import java.io.IOException; import java.io.InputStream; import java.net.InetSocketAddress; @@ -42,8 +41,7 @@ public class SshSession { } @SuppressWarnings("resource") - public String exec(String command, InputStream opt) throws JSchException, - IOException { + public String exec(String command, InputStream opt) throws JSchException, IOException { ChannelExec channel = (ChannelExec) getSession().openChannel("exec"); try { channel.setCommand(command); @@ -62,8 +60,7 @@ public class SshSession { } } - public InputStream exec2(String command, InputStream opt) throws JSchException, - IOException { + public InputStream exec2(String command, InputStream opt) throws JSchException, IOException { ChannelExec channel = (ChannelExec) getSession().openChannel("exec"); channel.setCommand(command); channel.setInputStream(opt); @@ -94,12 +91,9 @@ public class SshSession { private Session getSession() throws JSchException { if (session == null) { JSch jsch = new JSch(); - jsch.addIdentity("KeyPair", - account.privateKey(), account.sshKey.getPublicKeyBlob(), null); - session = jsch.getSession( - account.username, - addr.getAddress().getHostAddress(), - addr.getPort()); + jsch.addIdentity("KeyPair", account.privateKey(), account.sshKey.getPublicKeyBlob(), null); + session = + jsch.getSession(account.username, addr.getAddress().getHostAddress(), addr.getPort()); session.setConfig("StrictHostKeyChecking", "no"); session.connect(); } diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/TestAccount.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/TestAccount.java index 563dd3cc27..5117328f3d 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/TestAccount.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/TestAccount.java @@ -18,14 +18,11 @@ import static java.util.stream.Collectors.toList; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.server.mail.Address; - import com.jcraft.jsch.KeyPair; - -import org.eclipse.jgit.lib.PersonIdent; - import java.io.ByteArrayOutputStream; import java.util.Arrays; import java.util.List; +import org.eclipse.jgit.lib.PersonIdent; public class TestAccount { public static List ids(List accounts) { @@ -53,8 +50,13 @@ public class TestAccount { public final String httpPassword; public String status; - TestAccount(Account.Id id, String username, String email, String fullName, - KeyPair sshKey, String httpPassword) { + TestAccount( + Account.Id id, + String username, + String email, + String fullName, + KeyPair sshKey, + String httpPassword) { this.id = id; this.username = username; this.email = email; @@ -75,7 +77,8 @@ public class TestAccount { } public String getHttpUrl(GerritServer server) { - return String.format("http://%s:%s@%s:%d", + return String.format( + "http://%s:%s@%s:%d", username, httpPassword, server.getHttpAddress().getAddress().getHostAddress(), diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/TestPlugin.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/TestPlugin.java index 4a838ad434..cafc775460 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/TestPlugin.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/TestPlugin.java @@ -26,6 +26,8 @@ public @interface TestPlugin { String name(); String sysModule() default ""; + String httpModule() default ""; + String sshModule() default ""; } diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/TestProjectInput.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/TestProjectInput.java index 4ad37e2b74..739d4f5f93 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/TestProjectInput.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/TestProjectInput.java @@ -19,7 +19,6 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.google.gerrit.extensions.client.InheritableBoolean; import com.google.gerrit.extensions.client.SubmitType; - import java.lang.annotation.Retention; import java.lang.annotation.Target; @@ -29,18 +28,22 @@ public @interface TestProjectInput { // Fields from ProjectInput for creating the project. String parent() default ""; + boolean createEmptyCommit() default true; + String description() default ""; // These may be null in a ProjectInput, but annotations do not allow null // default values. Thus these defaults should match ProjectConfig. SubmitType submitType() default SubmitType.MERGE_IF_NECESSARY; - InheritableBoolean useContributorAgreements() - default InheritableBoolean.INHERIT; - InheritableBoolean useSignedOffBy() default InheritableBoolean.INHERIT; - InheritableBoolean useContentMerge() default InheritableBoolean.INHERIT; - InheritableBoolean requireChangeId() default InheritableBoolean.INHERIT; + InheritableBoolean useContributorAgreements() default InheritableBoolean.INHERIT; + + InheritableBoolean useSignedOffBy() default InheritableBoolean.INHERIT; + + InheritableBoolean useContentMerge() default InheritableBoolean.INHERIT; + + InheritableBoolean requireChangeId() default InheritableBoolean.INHERIT; // Fields specific to acceptance test behavior. diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/UseLocalDisk.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/UseLocalDisk.java index f9367ecc4f..a649095531 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/UseLocalDisk.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/UseLocalDisk.java @@ -22,5 +22,4 @@ import java.lang.annotation.Target; @Target({METHOD}) @Retention(RUNTIME) -public @interface UseLocalDisk { -} +public @interface UseLocalDisk {} diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/UseSsh.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/UseSsh.java index b5ca4b2e77..550914020e 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/UseSsh.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/UseSsh.java @@ -23,5 +23,4 @@ import java.lang.annotation.Target; @Target({TYPE, METHOD}) @Retention(RUNTIME) -public @interface UseSsh { -} +public @interface UseSsh {} diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/UseGerritConfigAnnotationTest.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/UseGerritConfigAnnotationTest.java index 5773da4d8f..e3223b3494 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/UseGerritConfigAnnotationTest.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/UseGerritConfigAnnotationTest.java @@ -18,15 +18,12 @@ import static com.google.common.truth.Truth.assertThat; import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; - import org.eclipse.jgit.lib.Config; import org.junit.Test; public class UseGerritConfigAnnotationTest extends AbstractDaemonTest { - @Inject - @GerritServerConfig - Config serverConfig; + @Inject @GerritServerConfig Config serverConfig; @Test @GerritConfig(name = "x.y", value = "z") diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AccountIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AccountIT.java index 3efbab3f88..130eb23658 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AccountIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AccountIT.java @@ -71,7 +71,15 @@ import com.google.gerrit.testutil.ConfigSuite; import com.google.gerrit.testutil.FakeEmailSender.Message; import com.google.inject.Inject; import com.google.inject.Provider; - +import java.io.ByteArrayOutputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.EnumSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; import org.bouncycastle.bcpg.ArmoredOutputStream; import org.bouncycastle.openpgp.PGPPublicKey; import org.bouncycastle.openpgp.PGPPublicKeyRing; @@ -88,16 +96,6 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import java.io.ByteArrayOutputStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.EnumSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - public class AccountIT extends AbstractDaemonTest { @ConfigSuite.Default public static Config enableSignedPushConfig() { @@ -106,11 +104,9 @@ public class AccountIT extends AbstractDaemonTest { return cfg; } - @Inject - private Provider publicKeyStoreProvider; + @Inject private Provider publicKeyStoreProvider; - @Inject - private AllUsersName allUsers; + @Inject private AllUsersName allUsers; private List savedExternalIds; @@ -147,8 +143,7 @@ public class AccountIT extends AbstractDaemonTest { } } - private Collection getExternalIds(TestAccount account) - throws Exception { + private Collection getExternalIds(TestAccount account) throws Exception { return accountCache.get(account.getId()).getExternalIds(); } @@ -159,18 +154,17 @@ public class AccountIT extends AbstractDaemonTest { if (repo.getRefDatabase().exactRef(ref) != null) { RefUpdate ru = repo.updateRef(ref); ru.setForceUpdate(true); - assert_().withFailureMessage("Failed to delete " + ref) - .that(ru.delete()).isEqualTo(RefUpdate.Result.FORCED); + assert_() + .withFailureMessage("Failed to delete " + ref) + .that(ru.delete()) + .isEqualTo(RefUpdate.Result.FORCED); } } } @Test public void get() throws Exception { - AccountInfo info = gApi - .accounts() - .id("admin") - .get(); + AccountInfo info = gApi.accounts().id("admin").get(); assertThat(info.name).isEqualTo("Administrator"); assertThat(info.email).isEqualTo("admin@example.com"); assertThat(info.username).isEqualTo("admin"); @@ -178,29 +172,17 @@ public class AccountIT extends AbstractDaemonTest { @Test public void getByIntId() throws Exception { - AccountInfo info = gApi - .accounts() - .id("admin") - .get(); - AccountInfo infoByIntId = gApi - .accounts() - .id(info._accountId) - .get(); + AccountInfo info = gApi.accounts().id("admin").get(); + AccountInfo infoByIntId = gApi.accounts().id(info._accountId).get(); assertThat(info.name).isEqualTo(infoByIntId.name); } @Test public void self() throws Exception { - AccountInfo info = gApi - .accounts() - .self() - .get(); + AccountInfo info = gApi.accounts().self().get(); assertUser(info, admin); - info = gApi - .accounts() - .id("self") - .get(); + info = gApi.accounts().id("self").get(); assertUser(info, admin); } @@ -238,16 +220,12 @@ public class AccountIT extends AbstractDaemonTest { public void starUnstarChange() throws Exception { PushOneCommit.Result r = createChange(); String triplet = project.get() + "~master~" + r.getChangeId(); - gApi.accounts() - .self() - .starChange(triplet); + gApi.accounts().self().starChange(triplet); ChangeInfo change = info(triplet); assertThat(change.starred).isTrue(); assertThat(change.stars).contains(DEFAULT_LABEL); - gApi.accounts() - .self() - .unstarChange(triplet); + gApi.accounts().self().unstarChange(triplet); change = info(triplet); assertThat(change.starred).isNull(); assertThat(change.stars).isNull(); @@ -260,31 +238,31 @@ public class AccountIT extends AbstractDaemonTest { assertThat(gApi.accounts().self().getStars(triplet)).isEmpty(); assertThat(gApi.accounts().self().getStarredChanges()).isEmpty(); - gApi.accounts().self().setStars(triplet, - new StarsInput(ImmutableSet.of(DEFAULT_LABEL, "red", "blue"))); + gApi.accounts() + .self() + .setStars(triplet, new StarsInput(ImmutableSet.of(DEFAULT_LABEL, "red", "blue"))); ChangeInfo change = info(triplet); assertThat(change.starred).isTrue(); - assertThat(change.stars) - .containsExactly("blue", "red", DEFAULT_LABEL).inOrder(); + assertThat(change.stars).containsExactly("blue", "red", DEFAULT_LABEL).inOrder(); assertThat(gApi.accounts().self().getStars(triplet)) - .containsExactly("blue", "red", DEFAULT_LABEL).inOrder(); - List starredChanges = - gApi.accounts().self().getStarredChanges(); + .containsExactly("blue", "red", DEFAULT_LABEL) + .inOrder(); + List starredChanges = gApi.accounts().self().getStarredChanges(); assertThat(starredChanges).hasSize(1); ChangeInfo starredChange = starredChanges.get(0); assertThat(starredChange._number).isEqualTo(r.getChange().getId().get()); assertThat(starredChange.starred).isTrue(); - assertThat(starredChange.stars) - .containsExactly("blue", "red", DEFAULT_LABEL).inOrder(); + assertThat(starredChange.stars).containsExactly("blue", "red", DEFAULT_LABEL).inOrder(); - gApi.accounts().self().setStars(triplet, - new StarsInput(ImmutableSet.of("yellow"), - ImmutableSet.of(DEFAULT_LABEL, "blue"))); + gApi.accounts() + .self() + .setStars( + triplet, + new StarsInput(ImmutableSet.of("yellow"), ImmutableSet.of(DEFAULT_LABEL, "blue"))); change = info(triplet); assertThat(change.starred).isNull(); assertThat(change.stars).containsExactly("red", "yellow").inOrder(); - assertThat(gApi.accounts().self().getStars(triplet)).containsExactly( - "red", "yellow").inOrder(); + assertThat(gApi.accounts().self().getStars(triplet)).containsExactly("red", "yellow").inOrder(); starredChanges = gApi.accounts().self().getStarredChanges(); assertThat(starredChanges).hasSize(1); starredChange = starredChanges.get(0); @@ -303,11 +281,13 @@ public class AccountIT extends AbstractDaemonTest { PushOneCommit.Result r = createChange(); String triplet = project.get() + "~master~" + r.getChangeId(); exception.expect(BadRequestException.class); - exception.expectMessage( - "invalid labels: another invalid label, invalid label"); - gApi.accounts().self().setStars(triplet, - new StarsInput(ImmutableSet.of(DEFAULT_LABEL, "invalid label", "blue", - "another invalid label"))); + exception.expectMessage("invalid labels: another invalid label, invalid label"); + gApi.accounts() + .self() + .setStars( + triplet, + new StarsInput( + ImmutableSet.of(DEFAULT_LABEL, "invalid label", "blue", "another invalid label"))); } @Test @@ -315,11 +295,16 @@ public class AccountIT extends AbstractDaemonTest { PushOneCommit.Result r = createChange(); String triplet = project.get() + "~master~" + r.getChangeId(); exception.expect(BadRequestException.class); - exception.expectMessage("The labels " + DEFAULT_LABEL - + " and " + IGNORE_LABEL + " are mutually exclusive." - + " Only one of them can be set."); - gApi.accounts().self().setStars(triplet, - new StarsInput(ImmutableSet.of(DEFAULT_LABEL, "blue", IGNORE_LABEL))); + exception.expectMessage( + "The labels " + + DEFAULT_LABEL + + " and " + + IGNORE_LABEL + + " are mutually exclusive." + + " Only one of them can be set."); + gApi.accounts() + .self() + .setStars(triplet, new StarsInput(ImmutableSet.of(DEFAULT_LABEL, "blue", IGNORE_LABEL))); } @Test @@ -328,26 +313,19 @@ public class AccountIT extends AbstractDaemonTest { AddReviewerInput in = new AddReviewerInput(); in.reviewer = user.email; - gApi.changes() - .id(r.getChangeId()) - .addReviewer(in); + gApi.changes().id(r.getChangeId()).addReviewer(in); TestAccount user2 = accounts.user2(); in = new AddReviewerInput(); in.reviewer = user2.email; - gApi.changes() - .id(r.getChangeId()) - .addReviewer(in); + gApi.changes().id(r.getChangeId()).addReviewer(in); setApiUser(user); - gApi.accounts().self().setStars(r.getChangeId(), - new StarsInput(ImmutableSet.of(IGNORE_LABEL))); + gApi.accounts().self().setStars(r.getChangeId(), new StarsInput(ImmutableSet.of(IGNORE_LABEL))); sender.clear(); setApiUser(admin); - gApi.changes() - .id(r.getChangeId()) - .abandon(); + gApi.changes().id(r.getChangeId()).abandon(); List messages = sender.getMessages(); assertThat(messages).hasSize(1); assertThat(messages.get(0).rcpt()).containsExactly(user2.emailAddress); @@ -358,17 +336,14 @@ public class AccountIT extends AbstractDaemonTest { PushOneCommit.Result r = createChange(); setApiUser(user); - gApi.accounts().self().setStars(r.getChangeId(), - new StarsInput(ImmutableSet.of(IGNORE_LABEL))); + gApi.accounts().self().setStars(r.getChangeId(), new StarsInput(ImmutableSet.of(IGNORE_LABEL))); sender.clear(); setApiUser(admin); AddReviewerInput in = new AddReviewerInput(); in.reviewer = user.email; - gApi.changes() - .id(r.getChangeId()) - .addReviewer(in); + gApi.changes().id(r.getChangeId()).addReviewer(in); List messages = sender.getMessages(); assertThat(messages).hasSize(1); Message message = messages.get(0); @@ -379,28 +354,26 @@ public class AccountIT extends AbstractDaemonTest { @Test public void suggestAccounts() throws Exception { String adminUsername = "admin"; - List result = gApi.accounts() - .suggestAccounts().withQuery(adminUsername).get(); + List result = gApi.accounts().suggestAccounts().withQuery(adminUsername).get(); assertThat(result).hasSize(1); assertThat(result.get(0).username).isEqualTo(adminUsername); - List resultShortcutApi = gApi.accounts() - .suggestAccounts(adminUsername).get(); + List resultShortcutApi = gApi.accounts().suggestAccounts(adminUsername).get(); assertThat(resultShortcutApi).hasSize(result.size()); - List emptyResult = gApi.accounts() - .suggestAccounts("unknown").get(); + List emptyResult = gApi.accounts().suggestAccounts("unknown").get(); assertThat(emptyResult).isEmpty(); } @Test public void addEmail() throws Exception { - List emails = ImmutableList.of( - "new.email@example.com", - "new.email@example.systems", + List emails = + ImmutableList.of( + "new.email@example.com", + "new.email@example.systems", - // Not in the list of TLDs but added to override in OutgoingEmailValidator - "new.email@example.local"); + // Not in the list of TLDs but added to override in OutgoingEmailValidator + "new.email@example.local"); for (String email : emails) { EmailInput input = new EmailInput(); input.email = email; @@ -411,8 +384,7 @@ public class AccountIT extends AbstractDaemonTest { @Test public void putStatus() throws Exception { - List statuses = ImmutableList.of( - "OOO", "Busy"); + List statuses = ImmutableList.of("OOO", "Busy"); AccountInfo info; for (String status : statuses) { gApi.accounts().self().setStatus(status); @@ -424,21 +396,21 @@ public class AccountIT extends AbstractDaemonTest { @Test public void addInvalidEmail() throws Exception { - List emails = ImmutableList.of( - // Missing domain part - "new.email", + List emails = + ImmutableList.of( + // Missing domain part + "new.email", - // Missing domain part - "new.email@", + // Missing domain part + "new.email@", - // Missing user part - "@example.com", + // Missing user part + "@example.com", - // Non-supported TLD (see tlds-alpha-by-domain.txt) - "new.email@example.blog" - ); + // Non-supported TLD (see tlds-alpha-by-domain.txt) + "new.email@example.blog"); for (String email : emails) { - EmailInput input = new EmailInput(); + EmailInput input = new EmailInput(); input.email = email; input.noConfirmation = true; try { @@ -456,18 +428,15 @@ public class AccountIT extends AbstractDaemonTest { // is created setApiUser(user); GeneralPreferencesInfo input = new GeneralPreferencesInfo(); - input.changesPerPage = - GeneralPreferencesInfo.defaults().changesPerPage + 10; + input.changesPerPage = GeneralPreferencesInfo.defaults().changesPerPage + 10; gApi.accounts().self().setPreferences(input); - TestRepository allUsersRepo = - cloneProject(allUsers, user); + TestRepository allUsersRepo = cloneProject(allUsers, user); String userRefName = RefNames.refsUsers(user.id); // remove default READ permissions ProjectConfig cfg = projectCache.checkedGet(allUsers).getConfig(); - cfg.getAccessSection( - RefNames.REFS_USERS + "${" + RefPattern.USERID_SHARDED + "}", true) + cfg.getAccessSection(RefNames.REFS_USERS + "${" + RefPattern.USERID_SHARDED + "}", true) .remove(new Permission(Permission.READ)); saveProjectConfig(allUsers, cfg); @@ -477,15 +446,17 @@ public class AccountIT extends AbstractDaemonTest { // fetching user branch without READ permission fails try { fetch(allUsersRepo, userRefName + ":userRef"); - Assert.fail( - "user branch is visible although no READ permission is granted"); + Assert.fail("user branch is visible although no READ permission is granted"); } catch (TransportException e) { // expected because no READ granted on user branch } // allow each user to read its own user branch - grant(Permission.READ, allUsers, - RefNames.REFS_USERS + "${" + RefPattern.USERID_SHARDED + "}", false, + grant( + Permission.READ, + allUsers, + RefNames.REFS_USERS + "${" + RefPattern.USERID_SHARDED + "}", + false, REGISTERED_USERS); // fetch user branch using refs/users/YY/XXXXXXX @@ -495,16 +466,14 @@ public class AccountIT extends AbstractDaemonTest { // fetch user branch using refs/users/self fetch(allUsersRepo, RefNames.REFS_USERS_SELF + ":userSelfRef"); - Ref userSelfRef = - allUsersRepo.getRepository().getRefDatabase().exactRef("userSelfRef"); + Ref userSelfRef = allUsersRepo.getRepository().getRefDatabase().exactRef("userSelfRef"); assertThat(userSelfRef).isNotNull(); assertThat(userSelfRef.getObjectId()).isEqualTo(userRef.getObjectId()); // fetching user branch of another user fails String otherUserRefName = RefNames.refsUsers(admin.id); exception.expect(TransportException.class); - exception.expectMessage( - "Remote does not have " + otherUserRefName + " available for fetch."); + exception.expectMessage("Remote does not have " + otherUserRefName + " available for fetch."); fetch(allUsersRepo, otherUserRefName + ":otherUserRef"); } @@ -513,8 +482,7 @@ public class AccountIT extends AbstractDaemonTest { // change something in the user preferences to ensure that the user branch // is created GeneralPreferencesInfo input = new GeneralPreferencesInfo(); - input.changesPerPage = - GeneralPreferencesInfo.defaults().changesPerPage + 10; + input.changesPerPage = GeneralPreferencesInfo.defaults().changesPerPage + 10; gApi.accounts().self().setPreferences(input); TestRepository allUsersRepo = cloneProject(allUsers); @@ -532,8 +500,7 @@ public class AccountIT extends AbstractDaemonTest { // change something in the user preferences to ensure that the user branch // is created GeneralPreferencesInfo input = new GeneralPreferencesInfo(); - input.changesPerPage = - GeneralPreferencesInfo.defaults().changesPerPage + 10; + input.changesPerPage = GeneralPreferencesInfo.defaults().changesPerPage + 10; gApi.accounts().self().setPreferences(input); String userRefName = RefNames.refsUsers(admin.id); @@ -560,8 +527,7 @@ public class AccountIT extends AbstractDaemonTest { // change something in the user preferences to ensure that the user branch // is created GeneralPreferencesInfo input = new GeneralPreferencesInfo(); - input.changesPerPage = - GeneralPreferencesInfo.defaults().changesPerPage + 10; + input.changesPerPage = GeneralPreferencesInfo.defaults().changesPerPage + 10; gApi.accounts().self().setPreferences(input); TestRepository allUsersRepo = cloneProject(allUsers); @@ -569,24 +535,37 @@ public class AccountIT extends AbstractDaemonTest { allUsersRepo.reset("userRef"); Config wc = new Config(); - wc.setString(WatchConfig.PROJECT, project.get(), WatchConfig.KEY_NOTIFY, - WatchConfig.NotifyValue - .create(null, EnumSet.of(NotifyType.ALL_COMMENTS)).toString()); - PushOneCommit push = pushFactory.create(db, admin.getIdent(), allUsersRepo, - "Add project watch", WatchConfig.WATCH_CONFIG, wc.toText()); + wc.setString( + WatchConfig.PROJECT, + project.get(), + WatchConfig.KEY_NOTIFY, + WatchConfig.NotifyValue.create(null, EnumSet.of(NotifyType.ALL_COMMENTS)).toString()); + PushOneCommit push = + pushFactory.create( + db, + admin.getIdent(), + allUsersRepo, + "Add project watch", + WatchConfig.WATCH_CONFIG, + wc.toText()); push.to(RefNames.REFS_USERS_SELF).assertOkStatus(); String invalidNotifyValue = "]invalid["; - wc.setString(WatchConfig.PROJECT, project.get(), WatchConfig.KEY_NOTIFY, - invalidNotifyValue); - push = pushFactory.create(db, admin.getIdent(), allUsersRepo, - "Add invalid project watch", WatchConfig.WATCH_CONFIG, wc.toText()); + wc.setString(WatchConfig.PROJECT, project.get(), WatchConfig.KEY_NOTIFY, invalidNotifyValue); + push = + pushFactory.create( + db, + admin.getIdent(), + allUsersRepo, + "Add invalid project watch", + WatchConfig.WATCH_CONFIG, + wc.toText()); PushOneCommit.Result r = push.to(RefNames.REFS_USERS_SELF); r.assertErrorStatus("invalid watch configuration"); - r.assertMessage(String.format( - "%s: Invalid project watch of account %d for project %s: %s", - WatchConfig.WATCH_CONFIG, admin.getId().get(), project.get(), - invalidNotifyValue)); + r.assertMessage( + String.format( + "%s: Invalid project watch of account %d for project %s: %s", + WatchConfig.WATCH_CONFIG, admin.getId().get(), project.get(), invalidNotifyValue)); } @Test @@ -625,8 +604,8 @@ public class AccountIT extends AbstractDaemonTest { public void addOtherUsersGpgKey_Conflict() throws Exception { // Both users have a matching external ID for this key. addExternalIdEmail(admin, "test5@example.com"); - AccountExternalId extId = new AccountExternalId( - user.getId(), new AccountExternalId.Key("foo:myId")); + AccountExternalId extId = + new AccountExternalId(user.getId(), new AccountExternalId.Key("foo:myId")); db.accountExternalIds().insert(Collections.singleton(extId)); accountCache.evict(user.getId()); @@ -645,11 +624,10 @@ public class AccountIT extends AbstractDaemonTest { List keys = allValidKeys(); List toAdd = new ArrayList<>(keys.size()); for (TestKey key : keys) { - addExternalIdEmail(admin, - PushCertificateIdent.parse(key.getFirstUserId()).getEmailAddress()); + addExternalIdEmail(admin, PushCertificateIdent.parse(key.getFirstUserId()).getEmailAddress()); toAdd.add(key.getPublicKeyArmored()); } - gApi.accounts().self().putGpgKeys(toAdd, ImmutableList. of()); + gApi.accounts().self().putGpgKeys(toAdd, ImmutableList.of()); assertKeys(keys); } @@ -672,37 +650,40 @@ public class AccountIT extends AbstractDaemonTest { @Test public void addAndRemoveGpgKeys() throws Exception { for (TestKey key : allValidKeys()) { - addExternalIdEmail(admin, - PushCertificateIdent.parse(key.getFirstUserId()).getEmailAddress()); + addExternalIdEmail(admin, PushCertificateIdent.parse(key.getFirstUserId()).getEmailAddress()); } TestKey key1 = validKeyWithoutExpiration(); TestKey key2 = validKeyWithExpiration(); TestKey key5 = validKeyWithSecondUserId(); - Map infos = gApi.accounts().self().putGpgKeys( - ImmutableList.of( - key1.getPublicKeyArmored(), - key2.getPublicKeyArmored()), - ImmutableList.of(key5.getKeyIdString())); - assertThat(infos.keySet()) - .containsExactly(key1.getKeyIdString(), key2.getKeyIdString()); + Map infos = + gApi.accounts() + .self() + .putGpgKeys( + ImmutableList.of(key1.getPublicKeyArmored(), key2.getPublicKeyArmored()), + ImmutableList.of(key5.getKeyIdString())); + assertThat(infos.keySet()).containsExactly(key1.getKeyIdString(), key2.getKeyIdString()); assertKeys(key1, key2); - infos = gApi.accounts().self().putGpgKeys( - ImmutableList.of(key5.getPublicKeyArmored()), - ImmutableList.of(key1.getKeyIdString())); - assertThat(infos.keySet()) - .containsExactly(key1.getKeyIdString(), key5.getKeyIdString()); + infos = + gApi.accounts() + .self() + .putGpgKeys( + ImmutableList.of(key5.getPublicKeyArmored()), + ImmutableList.of(key1.getKeyIdString())); + assertThat(infos.keySet()).containsExactly(key1.getKeyIdString(), key5.getKeyIdString()); assertKeyMapContains(key5, infos); assertThat(infos.get(key1.getKeyIdString()).key).isNull(); assertKeys(key2, key5); exception.expect(BadRequestException.class); - exception.expectMessage("Cannot both add and delete key: " - + keyToString(key2.getPublicKey())); - infos = gApi.accounts().self().putGpgKeys( - ImmutableList.of(key2.getPublicKeyArmored()), - ImmutableList.of(key2.getKeyIdString())); + exception.expectMessage("Cannot both add and delete key: " + keyToString(key2.getPublicKey())); + infos = + gApi.accounts() + .self() + .putGpgKeys( + ImmutableList.of(key2.getPublicKeyArmored()), + ImmutableList.of(key2.getKeyIdString())); } @Test @@ -718,8 +699,7 @@ public class AccountIT extends AbstractDaemonTest { assertThat(key.sshPublicKey).isEqualTo(inital); // Add a new key - String newKey = AccountCreator.publicKey( - AccountCreator.genSshKey(), admin.email); + String newKey = AccountCreator.publicKey(AccountCreator.genSshKey(), admin.email); gApi.accounts().self().addSshKey(newKey); info = gApi.accounts().self().listSshKeys(); assertThat(info).hasSize(2); @@ -732,8 +712,7 @@ public class AccountIT extends AbstractDaemonTest { assertSequenceNumbers(info); // Add another new key - String newKey2 = AccountCreator.publicKey( - AccountCreator.genSshKey(), admin.email); + String newKey2 = AccountCreator.publicKey(AccountCreator.genSshKey(), admin.email); gApi.accounts().self().addSshKey(newKey2); info = gApi.accounts().self().listSshKeys(); assertThat(info).hasSize(3); @@ -792,8 +771,7 @@ public class AccountIT extends AbstractDaemonTest { assertThat(ImmutableList.copyOf(it)).hasSize(size); } - private static void assertKeyMapContains(TestKey expected, - Map actualMap) { + private static void assertKeyMapContains(TestKey expected, Map actualMap) { GpgKeyInfo actual = actualMap.get(expected.getKeyIdString()); assertThat(actual).isNotNull(); assertThat(actual.id).isNull(); @@ -814,22 +792,23 @@ public class AccountIT extends AbstractDaemonTest { .containsExactlyElementsIn(expected.transform(TestKey::getKeyIdString)); for (TestKey key : expected) { - assertKeyEquals(key, gApi.accounts().self().gpgKey( - key.getKeyIdString()).get()); - assertKeyEquals(key, gApi.accounts().self().gpgKey( - Fingerprint.toString(key.getPublicKey().getFingerprint())).get()); + assertKeyEquals(key, gApi.accounts().self().gpgKey(key.getKeyIdString()).get()); + assertKeyEquals( + key, + gApi.accounts() + .self() + .gpgKey(Fingerprint.toString(key.getPublicKey().getFingerprint())) + .get()); assertKeyMapContains(key, keyMap); } // Check raw external IDs. Account.Id currAccountId = atrScope.get().getUser().getAccountId(); - Iterable expectedFps = expected.transform( - k -> BaseEncoding.base16().encode(k.getPublicKey().getFingerprint())); - Iterable actualFps = GpgKeys.getGpgExtIds(db, currAccountId) - .transform(AccountExternalId::getSchemeRest); - assertThat(actualFps) - .named("external IDs in database") - .containsExactlyElementsIn(expectedFps); + Iterable expectedFps = + expected.transform(k -> BaseEncoding.base16().encode(k.getPublicKey().getFingerprint())); + Iterable actualFps = + GpgKeys.getGpgExtIds(db, currAccountId).transform(AccountExternalId::getSchemeRest); + assertThat(actualFps).named("external IDs in database").containsExactlyElementsIn(expectedFps); // Check raw stored keys. for (TestKey key : expected) { @@ -840,23 +819,21 @@ public class AccountIT extends AbstractDaemonTest { private static void assertKeyEquals(TestKey expected, GpgKeyInfo actual) { String id = expected.getKeyIdString(); assertThat(actual.id).named(id).isEqualTo(id); - assertThat(actual.fingerprint).named(id).isEqualTo( - Fingerprint.toString(expected.getPublicKey().getFingerprint())); + assertThat(actual.fingerprint) + .named(id) + .isEqualTo(Fingerprint.toString(expected.getPublicKey().getFingerprint())); @SuppressWarnings("unchecked") - List userIds = - ImmutableList.copyOf(expected.getPublicKey().getUserIDs()); + List userIds = ImmutableList.copyOf(expected.getPublicKey().getUserIDs()); assertThat(actual.userIds).named(id).containsExactlyElementsIn(userIds); - assertThat(actual.key).named(id) - .startsWith("-----BEGIN PGP PUBLIC KEY BLOCK-----\n"); + assertThat(actual.key).named(id).startsWith("-----BEGIN PGP PUBLIC KEY BLOCK-----\n"); assertThat(actual.status).isEqualTo(GpgKeyInfo.Status.TRUSTED); assertThat(actual.problems).isEmpty(); } - private void addExternalIdEmail(TestAccount account, String email) - throws Exception { + private void addExternalIdEmail(TestAccount account, String email) throws Exception { checkNotNull(email); - AccountExternalId extId = new AccountExternalId( - account.getId(), new AccountExternalId.Key(name("test"), email)); + AccountExternalId extId = + new AccountExternalId(account.getId(), new AccountExternalId.Key(name("test"), email)); extId.setEmailAddress(email); db.accountExternalIds().insert(Collections.singleton(extId)); // Clear saved AccountState and AccountExternalIds. @@ -865,13 +842,10 @@ public class AccountIT extends AbstractDaemonTest { } private Map addGpgKey(String armored) throws Exception { - return gApi.accounts().self().putGpgKeys( - ImmutableList.of(armored), - ImmutableList. of()); + return gApi.accounts().self().putGpgKeys(ImmutableList.of(armored), ImmutableList.of()); } - private void assertUser(AccountInfo info, TestAccount account) - throws Exception { + private void assertUser(AccountInfo info, TestAccount account) throws Exception { assertThat(info.name).isEqualTo(account.fullName); assertThat(info.email).isEqualTo(account.email); assertThat(info.username).isEqualTo(account.username); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AgreementsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AgreementsIT.java index 00b48b453c..0e9d2ab6bf 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AgreementsIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AgreementsIT.java @@ -37,15 +37,13 @@ import com.google.gerrit.extensions.restapi.MethodNotAllowedException; import com.google.gerrit.extensions.restapi.UnprocessableEntityException; import com.google.gerrit.testutil.ConfigSuite; import com.google.gerrit.testutil.TestTimeUtil; - +import java.util.List; import org.eclipse.jgit.lib.Config; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; -import java.util.List; - public class AgreementsIT extends AbstractDaemonTest { private ContributorAgreement caAutoVerify; private ContributorAgreement caNoAutoVerify; @@ -173,8 +171,12 @@ public class AgreementsIT extends AbstractDaemonTest { // Create a new branch setApiUser(admin); - BranchInfo dest = gApi.projects().name(project.get()) - .branch("cherry-pick-to").create(new BranchInput()).get(); + BranchInfo dest = + gApi.projects() + .name(project.get()) + .branch("cherry-pick-to") + .create(new BranchInput()) + .get(); // Create a change succeeds when agreement is not required setUseContributorAgreements(InheritableBoolean.FALSE); @@ -209,8 +211,7 @@ public class AgreementsIT extends AbstractDaemonTest { gApi.changes().create(newChangeInput()); fail("Expected AuthException"); } catch (AuthException e) { - assertThat(e.getMessage()).contains( - "A Contributor Agreement must be completed"); + assertThat(e.getMessage()).contains("A Contributor Agreement must be completed"); } // Sign the agreement @@ -228,8 +229,7 @@ public class AgreementsIT extends AbstractDaemonTest { assertThat(info.description).isEqualTo(ca.getDescription()); assertThat(info.url).isEqualTo(ca.getAgreementUrl()); if (ca.getAutoVerify() != null) { - assertThat(info.autoVerifyGroup.name) - .isEqualTo(ca.getAutoVerify().getName()); + assertThat(info.autoVerifyGroup.name).isEqualTo(ca.getAutoVerify().getName()); } else { assertThat(info.autoVerifyGroup).isNull(); } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/DiffPreferencesIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/DiffPreferencesIT.java index bce98610ef..fe8003241e 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/DiffPreferencesIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/DiffPreferencesIT.java @@ -28,7 +28,6 @@ import com.google.gerrit.reviewdb.client.RefNames; import com.google.gerrit.server.account.VersionedAccountPreferences; import com.google.gerrit.server.config.AllUsersName; import com.google.inject.Inject; - import org.eclipse.jgit.api.errors.TransportException; import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository; import org.eclipse.jgit.junit.TestRepository; @@ -37,37 +36,39 @@ import org.junit.Test; @NoHttpd public class DiffPreferencesIT extends AbstractDaemonTest { - @Inject - private AllUsersName allUsers; + @Inject private AllUsersName allUsers; @After public void cleanUp() throws Exception { - gApi.accounts().id(admin.getId().toString()) - .setDiffPreferences(DiffPreferencesInfo.defaults()); + gApi.accounts().id(admin.getId().toString()).setDiffPreferences(DiffPreferencesInfo.defaults()); TestRepository allUsersRepo = cloneProject(allUsers); try { fetch(allUsersRepo, RefNames.REFS_USERS_DEFAULT + ":defaults"); } catch (TransportException e) { - if (e.getMessage().equals("Remote does not have " - + RefNames.REFS_USERS_DEFAULT + " available for fetch.")) { + if (e.getMessage() + .equals( + "Remote does not have " + RefNames.REFS_USERS_DEFAULT + " available for fetch.")) { return; } throw e; } allUsersRepo.reset("defaults"); - PushOneCommit push = pushFactory.create(db, admin.getIdent(), allUsersRepo, - "Delete default preferences", VersionedAccountPreferences.PREFERENCES, - ""); + PushOneCommit push = + pushFactory.create( + db, + admin.getIdent(), + allUsersRepo, + "Delete default preferences", + VersionedAccountPreferences.PREFERENCES, + ""); push.rm(RefNames.REFS_USERS_DEFAULT).assertOkStatus(); } @Test public void getDiffPreferences() throws Exception { DiffPreferencesInfo d = DiffPreferencesInfo.defaults(); - DiffPreferencesInfo o = gApi.accounts() - .id(admin.getId().toString()) - .getDiffPreferences(); + DiffPreferencesInfo o = gApi.accounts().id(admin.getId().toString()).getDiffPreferences(); assertPrefs(o, d); } @@ -102,17 +103,13 @@ public class DiffPreferencesIT extends AbstractDaemonTest { i.matchBrackets ^= true; i.lineWrapping ^= true; - DiffPreferencesInfo o = gApi.accounts() - .id(admin.getId().toString()) - .setDiffPreferences(i); + DiffPreferencesInfo o = gApi.accounts().id(admin.getId().toString()).setDiffPreferences(i); assertPrefs(o, i); // Partially fill input record i = new DiffPreferencesInfo(); i.tabSize = 42; - DiffPreferencesInfo a = gApi.accounts() - .id(admin.getId().toString()) - .setDiffPreferences(i); + DiffPreferencesInfo a = gApi.accounts().id(admin.getId().toString()).setDiffPreferences(i); assertPrefs(a, o, "tabSize"); assertThat(a.tabSize).isEqualTo(42); } @@ -129,9 +126,7 @@ public class DiffPreferencesIT extends AbstractDaemonTest { update.fontSize = newFontSize; gApi.config().server().setDefaultDiffPreferences(update); - DiffPreferencesInfo o = gApi.accounts() - .id(admin.getId().toString()) - .getDiffPreferences(); + DiffPreferencesInfo o = gApi.accounts().id(admin.getId().toString()).getDiffPreferences(); // assert configured defaults assertThat(o.lineLength).isEqualTo(newLineLength); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/EditPreferencesIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/EditPreferencesIT.java index 9eb69184a9..8baaa54a00 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/EditPreferencesIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/EditPreferencesIT.java @@ -21,16 +21,13 @@ import com.google.gerrit.acceptance.NoHttpd; import com.google.gerrit.extensions.client.EditPreferencesInfo; import com.google.gerrit.extensions.client.KeyMapType; import com.google.gerrit.extensions.client.Theme; - import org.junit.Test; @NoHttpd public class EditPreferencesIT extends AbstractDaemonTest { @Test public void getSetEditPreferences() throws Exception { - EditPreferencesInfo out = gApi.accounts() - .id(admin.getId().toString()) - .getEditPreferences(); + EditPreferencesInfo out = gApi.accounts().id(admin.getId().toString()).getEditPreferences(); assertThat(out.lineLength).isEqualTo(100); assertThat(out.indentUnit).isEqualTo(2); @@ -65,9 +62,7 @@ public class EditPreferencesIT extends AbstractDaemonTest { out.theme = Theme.TWILIGHT; out.keyMapType = KeyMapType.EMACS; - EditPreferencesInfo info = gApi.accounts() - .id(admin.getId().toString()) - .setEditPreferences(out); + EditPreferencesInfo info = gApi.accounts().id(admin.getId().toString()).setEditPreferences(out); assertEditPreferences(info, out); @@ -75,16 +70,14 @@ public class EditPreferencesIT extends AbstractDaemonTest { EditPreferencesInfo in = new EditPreferencesInfo(); in.tabSize = 42; - info = gApi.accounts() - .id(admin.getId().toString()) - .setEditPreferences(in); + info = gApi.accounts().id(admin.getId().toString()).setEditPreferences(in); out.tabSize = in.tabSize; assertEditPreferences(info, out); } - private void assertEditPreferences(EditPreferencesInfo out, - EditPreferencesInfo in) throws Exception { + private void assertEditPreferences(EditPreferencesInfo out, EditPreferencesInfo in) + throws Exception { assertThat(out.lineLength).isEqualTo(in.lineLength); assertThat(out.indentUnit).isEqualTo(in.indentUnit); assertThat(out.tabSize).isEqualTo(in.tabSize); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/GeneralPreferencesIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/GeneralPreferencesIT.java index 5bff9c6a27..334f33635b 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/GeneralPreferencesIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/GeneralPreferencesIT.java @@ -32,20 +32,17 @@ import com.google.gerrit.extensions.client.MenuItem; import com.google.gerrit.reviewdb.client.RefNames; import com.google.gerrit.server.config.AllUsersName; import com.google.inject.Inject; - +import java.util.ArrayList; +import java.util.HashMap; import org.eclipse.jgit.lib.RefUpdate; import org.eclipse.jgit.lib.Repository; import org.junit.After; import org.junit.Before; import org.junit.Test; -import java.util.ArrayList; -import java.util.HashMap; - @NoHttpd public class GeneralPreferencesIT extends AbstractDaemonTest { - @Inject - private AllUsersName allUsers; + @Inject private AllUsersName allUsers; private TestAccount user42; @@ -57,8 +54,7 @@ public class GeneralPreferencesIT extends AbstractDaemonTest { @After public void cleanUp() throws Exception { - gApi.accounts().id(user42.getId().toString()) - .setPreferences(GeneralPreferencesInfo.defaults()); + gApi.accounts().id(user42.getId().toString()).setPreferences(GeneralPreferencesInfo.defaults()); try (Repository git = repoManager.openRepository(allUsers)) { if (git.exactRef(RefNames.REFS_USERS_DEFAULT) != null) { @@ -72,9 +68,7 @@ public class GeneralPreferencesIT extends AbstractDaemonTest { @Test public void getAndSetPreferences() throws Exception { - GeneralPreferencesInfo o = gApi.accounts() - .id(user42.id.toString()) - .getPreferences(); + GeneralPreferencesInfo o = gApi.accounts().id(user42.id.toString()).getPreferences(); assertPrefs(o, GeneralPreferencesInfo.defaults(), "my", "changeTable"); assertThat(o.my).hasSize(7); assertThat(o.changeTable).isEmpty(); @@ -106,9 +100,7 @@ public class GeneralPreferencesIT extends AbstractDaemonTest { i.urlAliases = new HashMap<>(); i.urlAliases.put("foo", "bar"); - o = gApi.accounts() - .id(user42.getId().toString()) - .setPreferences(i); + o = gApi.accounts().id(user42.getId().toString()).setPreferences(i); assertPrefs(o, i, "my"); assertThat(o.my).hasSize(1); assertThat(o.changeTable).hasSize(1); @@ -122,9 +114,7 @@ public class GeneralPreferencesIT extends AbstractDaemonTest { update.changesPerPage = newChangesPerPage; gApi.config().server().setDefaultPreferences(update); - GeneralPreferencesInfo o = gApi.accounts() - .id(user42.getId().toString()) - .getPreferences(); + GeneralPreferencesInfo o = gApi.accounts().id(user42.getId().toString()).getPreferences(); // assert configured defaults assertThat(o.changesPerPage).isEqualTo(newChangesPerPage); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/ChangeIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/ChangeIT.java index b336ab4901..998abbff8b 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/ChangeIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/ChangeIT.java @@ -104,7 +104,16 @@ import com.google.gerrit.server.project.Util; import com.google.gerrit.testutil.FakeEmailSender.Message; import com.google.gerrit.testutil.TestTimeUtil; import com.google.inject.Inject; - +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.Constants; @@ -117,26 +126,13 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; -import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - @NoHttpd public class ChangeIT extends AbstractDaemonTest { private String systemTimeZone; - @Inject - private BatchUpdate.Factory updateFactory; + @Inject private BatchUpdate.Factory updateFactory; - @Inject - private DynamicSet changeMessageModifiers; + @Inject private DynamicSet changeMessageModifiers; @Before public void setTimeForTesting() { @@ -180,14 +176,17 @@ public class ChangeIT extends AbstractDaemonTest { BranchInput b = new BranchInput(); b.revision = repo().exactRef("HEAD").getObjectId().name(); - gApi.projects() - .name(project.get()) - .branch("other") - .create(b); + gApi.projects().name(project.get()).branch("other").create(b); - PushOneCommit push2 = pushFactory.create(db, admin.getIdent(), testRepo, - PushOneCommit.SUBJECT, PushOneCommit.FILE_NAME, - PushOneCommit.FILE_CONTENT, changeId); + PushOneCommit push2 = + pushFactory.create( + db, + admin.getIdent(), + testRepo, + PushOneCommit.SUBJECT, + PushOneCommit.FILE_NAME, + PushOneCommit.FILE_CONTENT, + changeId); PushOneCommit.Result r2 = push2.to("refs/for/other"); assertThat(r2.getChangeId()).isEqualTo(changeId); @@ -201,19 +200,14 @@ public class ChangeIT extends AbstractDaemonTest { PushOneCommit.Result r = createChange(); String changeId = r.getChangeId(); assertThat(info(changeId).status).isEqualTo(ChangeStatus.NEW); - gApi.changes() - .id(changeId) - .abandon(); + gApi.changes().id(changeId).abandon(); ChangeInfo info = get(changeId); assertThat(info.status).isEqualTo(ChangeStatus.ABANDONED); - assertThat(Iterables.getLast(info.messages).message.toLowerCase()) - .contains("abandoned"); + assertThat(Iterables.getLast(info.messages).message.toLowerCase()).contains("abandoned"); exception.expect(ResourceConflictException.class); exception.expectMessage("change is abandoned"); - gApi.changes() - .id(changeId) - .abandon(); + gApi.changes().id(changeId).abandon(); } @Test @@ -225,24 +219,18 @@ public class ChangeIT extends AbstractDaemonTest { PushOneCommit.Result b = createChange(); List controlB = changeFinder.find(b.getChangeId(), user); assertThat(controlB).hasSize(1); - List list = - ImmutableList.of(controlA.get(0), controlB.get(0)); - changeAbandoner.batchAbandon( - controlA.get(0).getProject().getNameKey(), user, list, "deadbeef"); + List list = ImmutableList.of(controlA.get(0), controlB.get(0)); + changeAbandoner.batchAbandon(controlA.get(0).getProject().getNameKey(), user, list, "deadbeef"); ChangeInfo info = get(a.getChangeId()); assertThat(info.status).isEqualTo(ChangeStatus.ABANDONED); - assertThat(Iterables.getLast(info.messages).message.toLowerCase()) - .contains("abandoned"); - assertThat(Iterables.getLast(info.messages).message.toLowerCase()) - .contains("deadbeef"); + assertThat(Iterables.getLast(info.messages).message.toLowerCase()).contains("abandoned"); + assertThat(Iterables.getLast(info.messages).message.toLowerCase()).contains("deadbeef"); info = get(b.getChangeId()); assertThat(info.status).isEqualTo(ChangeStatus.ABANDONED); - assertThat(Iterables.getLast(info.messages).message.toLowerCase()) - .contains("abandoned"); - assertThat(Iterables.getLast(info.messages).message.toLowerCase()) - .contains("deadbeef"); + assertThat(Iterables.getLast(info.messages).message.toLowerCase()).contains("abandoned"); + assertThat(Iterables.getLast(info.messages).message.toLowerCase()).contains("deadbeef"); } @Test @@ -251,26 +239,20 @@ public class ChangeIT extends AbstractDaemonTest { String project2Name = name("Project2"); gApi.projects().create(project1Name); gApi.projects().create(project2Name); - TestRepository project1 = - cloneProject(new Project.NameKey(project1Name)); - TestRepository project2 = - cloneProject(new Project.NameKey(project2Name)); + TestRepository project1 = cloneProject(new Project.NameKey(project1Name)); + TestRepository project2 = cloneProject(new Project.NameKey(project2Name)); CurrentUser user = atrScope.get().getUser(); - PushOneCommit.Result a = - createChange(project1, "master", "x", "x", "x", ""); + PushOneCommit.Result a = createChange(project1, "master", "x", "x", "x", ""); List controlA = changeFinder.find(a.getChangeId(), user); assertThat(controlA).hasSize(1); - PushOneCommit.Result b = - createChange(project2, "master", "x", "x", "x", ""); + PushOneCommit.Result b = createChange(project2, "master", "x", "x", "x", ""); List controlB = changeFinder.find(b.getChangeId(), user); assertThat(controlB).hasSize(1); - List list = - ImmutableList.of(controlA.get(0), controlB.get(0)); + List list = ImmutableList.of(controlA.get(0), controlB.get(0)); exception.expect(ResourceConflictException.class); - exception.expectMessage(String.format( - "Project name \"%s\" doesn't match \"%s\"", - project2Name, project1Name)); + exception.expectMessage( + String.format("Project name \"%s\" doesn't match \"%s\"", project2Name, project1Name)); changeAbandoner.batchAbandon(new Project.NameKey(project1Name), user, list); } @@ -282,9 +264,7 @@ public class ChangeIT extends AbstractDaemonTest { exception.expect(ResourceConflictException.class); exception.expectMessage("draft changes cannot be abandoned"); - gApi.changes() - .id(changeId) - .abandon(); + gApi.changes().id(changeId).abandon(); } @Test @@ -292,78 +272,52 @@ public class ChangeIT extends AbstractDaemonTest { PushOneCommit.Result r = createChange(); String changeId = r.getChangeId(); assertThat(info(changeId).status).isEqualTo(ChangeStatus.NEW); - gApi.changes() - .id(changeId) - .abandon(); + gApi.changes().id(changeId).abandon(); assertThat(info(changeId).status).isEqualTo(ChangeStatus.ABANDONED); - gApi.changes() - .id(changeId) - .restore(); + gApi.changes().id(changeId).restore(); ChangeInfo info = get(changeId); assertThat(info.status).isEqualTo(ChangeStatus.NEW); - assertThat(Iterables.getLast(info.messages).message.toLowerCase()) - .contains("restored"); + assertThat(Iterables.getLast(info.messages).message.toLowerCase()).contains("restored"); exception.expect(ResourceConflictException.class); exception.expectMessage("change is new"); - gApi.changes() - .id(changeId) - .restore(); + gApi.changes().id(changeId).restore(); } @Test public void revert() throws Exception { PushOneCommit.Result r = createChange(); - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .review(ReviewInput.approve()); - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .submit(); - ChangeInfo revertChange = - gApi.changes() - .id(r.getChangeId()) - .revert().get(); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve()); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).submit(); + ChangeInfo revertChange = gApi.changes().id(r.getChangeId()).revert().get(); // expected messages on source change: // 1. Uploaded patch set 1. // 2. Patch Set 1: Code-Review+2 // 3. Change has been successfully merged by Administrator // 4. Patch Set 1: Reverted - List sourceMessages = new ArrayList<>( - gApi.changes().id(r.getChangeId()).get().messages); + List sourceMessages = + new ArrayList<>(gApi.changes().id(r.getChangeId()).get().messages); assertThat(sourceMessages).hasSize(4); - String expectedMessage = String.format( - "Created a revert of this change as %s", - revertChange.changeId); + String expectedMessage = + String.format("Created a revert of this change as %s", revertChange.changeId); assertThat(sourceMessages.get(3).message).isEqualTo(expectedMessage); assertThat(revertChange.messages).hasSize(1); - assertThat(revertChange.messages.iterator().next().message) - .isEqualTo("Uploaded patch set 1."); + assertThat(revertChange.messages.iterator().next().message).isEqualTo("Uploaded patch set 1."); } @Test @TestProjectInput(createEmptyCommit = false) public void revertInitialCommit() throws Exception { PushOneCommit.Result r = createChange(); - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .review(ReviewInput.approve()); - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .submit(); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve()); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).submit(); exception.expect(ResourceConflictException.class); exception.expectMessage("Cannot revert initial commit"); - gApi.changes() - .id(r.getChangeId()) - .revert(); + gApi.changes().id(r.getChangeId()).revert(); } @Test @@ -374,52 +328,40 @@ public class ChangeIT extends AbstractDaemonTest { PushOneCommit.Result r2 = createChange(); // Approve and submit the first change - RevisionApi revision = gApi.changes() - .id(r.getChangeId()) - .current(); + RevisionApi revision = gApi.changes().id(r.getChangeId()).current(); revision.review(ReviewInput.approve()); revision.submit(); String changeId = r2.getChangeId(); // Rebase the second change - gApi.changes() - .id(changeId) - .current() - .rebase(); + gApi.changes().id(changeId).current().rebase(); // Second change should have 2 patch sets ChangeInfo c2 = gApi.changes().id(changeId).get(); assertThat(c2.revisions.get(c2.currentRevision)._number).isEqualTo(2); // ...and the committer and description should be correct - ChangeInfo info = gApi.changes() - .id(changeId).get(EnumSet.of( - ListChangesOption.CURRENT_REVISION, - ListChangesOption.CURRENT_COMMIT)); - GitPerson committer = info.revisions.get( - info.currentRevision).commit.committer; + ChangeInfo info = + gApi.changes() + .id(changeId) + .get(EnumSet.of(ListChangesOption.CURRENT_REVISION, ListChangesOption.CURRENT_COMMIT)); + GitPerson committer = info.revisions.get(info.currentRevision).commit.committer; assertThat(committer.name).isEqualTo(admin.fullName); assertThat(committer.email).isEqualTo(admin.email); - String description = info.revisions.get( - info.currentRevision).description; + String description = info.revisions.get(info.currentRevision).description; assertThat(description).isEqualTo("Rebase"); // Rebasing the second change again should fail exception.expect(ResourceConflictException.class); exception.expectMessage("Change is already up to date"); - gApi.changes() - .id(changeId) - .current() - .rebase(); + gApi.changes().id(changeId).current().rebase(); } @Test public void publish() throws Exception { PushOneCommit.Result r = createChange("refs/drafts/master"); assertThat(info(r.getChangeId()).status).isEqualTo(ChangeStatus.DRAFT); - gApi.changes() - .id(r.getChangeId()) - .publish(); + gApi.changes().id(r.getChangeId()).publish(); assertThat(info(r.getChangeId()).status).isEqualTo(ChangeStatus.NEW); } @@ -428,9 +370,7 @@ public class ChangeIT extends AbstractDaemonTest { PushOneCommit.Result r = createChange("refs/drafts/master"); assertThat(query(r.getChangeId())).hasSize(1); assertThat(info(r.getChangeId()).status).isEqualTo(ChangeStatus.DRAFT); - gApi.changes() - .id(r.getChangeId()) - .delete(); + gApi.changes().id(r.getChangeId()).delete(); assertThat(query(r.getChangeId())).isEmpty(); } @@ -439,9 +379,7 @@ public class ChangeIT extends AbstractDaemonTest { PushOneCommit.Result changeResult = createChange(); String changeId = changeResult.getChangeId(); - gApi.changes() - .id(changeId) - .delete(); + gApi.changes().id(changeId).delete(); assertThat(query(changeId)).isEmpty(); } @@ -450,33 +388,26 @@ public class ChangeIT extends AbstractDaemonTest { @TestProjectInput(cloneAs = "user") public void deleteNewChangeAsNormalUser() throws Exception { PushOneCommit.Result changeResult = - pushFactory.create(db, user.getIdent(), testRepo) - .to("refs/for/master"); + pushFactory.create(db, user.getIdent(), testRepo).to("refs/for/master"); String changeId = changeResult.getChangeId(); Change.Id id = changeResult.getChange().getId(); setApiUser(user); exception.expect(AuthException.class); - exception.expectMessage(String.format( - "Deleting change %s is not permitted", id)); - gApi.changes() - .id(changeId) - .delete(); + exception.expectMessage(String.format("Deleting change %s is not permitted", id)); + gApi.changes().id(changeId).delete(); } @Test @TestProjectInput(cloneAs = "user") public void deleteNewChangeOfAnotherUserAsAdmin() throws Exception { PushOneCommit.Result changeResult = - pushFactory.create(db, user.getIdent(), testRepo) - .to("refs/for/master"); + pushFactory.create(db, user.getIdent(), testRepo).to("refs/for/master"); changeResult.assertOkStatus(); String changeId = changeResult.getChangeId(); setApiUser(admin); - gApi.changes() - .id(changeId) - .delete(); + gApi.changes().id(changeId).delete(); assertThat(query(changeId)).isEmpty(); } @@ -487,9 +418,7 @@ public class ChangeIT extends AbstractDaemonTest { PushOneCommit.Result changeResult = createChange(); String changeId = changeResult.getChangeId(); - gApi.changes() - .id(changeId) - .delete(); + gApi.changes().id(changeId).delete(); assertThat(query(changeId)).isEmpty(); } @@ -498,39 +427,28 @@ public class ChangeIT extends AbstractDaemonTest { @TestProjectInput(cloneAs = "user") public void deleteAbandonedChangeAsNormalUser() throws Exception { PushOneCommit.Result changeResult = - pushFactory.create(db, user.getIdent(), testRepo) - .to("refs/for/master"); + pushFactory.create(db, user.getIdent(), testRepo).to("refs/for/master"); String changeId = changeResult.getChangeId(); Change.Id id = changeResult.getChange().getId(); setApiUser(user); - gApi.changes() - .id(changeId) - .abandon(); + gApi.changes().id(changeId).abandon(); exception.expect(AuthException.class); - exception.expectMessage(String.format( - "Deleting change %s is not permitted", id)); - gApi.changes() - .id(changeId) - .delete(); + exception.expectMessage(String.format("Deleting change %s is not permitted", id)); + gApi.changes().id(changeId).delete(); } @Test @TestProjectInput(cloneAs = "user") public void deleteAbandonedChangeOfAnotherUserAsAdmin() throws Exception { PushOneCommit.Result changeResult = - pushFactory.create(db, user.getIdent(), testRepo) - .to("refs/for/master"); + pushFactory.create(db, user.getIdent(), testRepo).to("refs/for/master"); String changeId = changeResult.getChangeId(); - gApi.changes() - .id(changeId) - .abandon(); + gApi.changes().id(changeId).abandon(); - gApi.changes() - .id(changeId) - .delete(); + gApi.changes().id(changeId).delete(); assertThat(query(changeId)).isEmpty(); } @@ -544,11 +462,8 @@ public class ChangeIT extends AbstractDaemonTest { merge(changeResult); exception.expect(MethodNotAllowedException.class); - exception.expectMessage(String.format( - "Deleting merged change %s is not allowed", id)); - gApi.changes() - .id(changeId) - .delete(); + exception.expectMessage(String.format("Deleting merged change %s is not allowed", id)); + gApi.changes().id(changeId).delete(); } @Test @@ -561,11 +476,9 @@ public class ChangeIT extends AbstractDaemonTest { setChangeStatus(id, Change.Status.NEW); exception.expect(ResourceConflictException.class); - exception.expectMessage(String.format( - "Cannot delete change %s: patch set 1 is already merged", id)); - gApi.changes() - .id(changeId) - .delete(); + exception.expectMessage( + String.format("Cannot delete change %s: patch set 1 is already merged", id)); + gApi.changes().id(changeId).delete(); } @Test @@ -573,35 +486,29 @@ public class ChangeIT extends AbstractDaemonTest { PushOneCommit.Result r = createChange(); exception.expect(ResourceConflictException.class); exception.expectMessage("Change is already up to date"); - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .rebase(); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).rebase(); } @Test public void rebaseConflict() throws Exception { PushOneCommit.Result r = createChange(); - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .review(ReviewInput.approve()); - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .submit(); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve()); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).submit(); - PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo, - PushOneCommit.SUBJECT, PushOneCommit.FILE_NAME, "other content", - "If09d8782c1e59dd0b33de2b1ec3595d69cc10ad5"); + PushOneCommit push = + pushFactory.create( + db, + admin.getIdent(), + testRepo, + PushOneCommit.SUBJECT, + PushOneCommit.FILE_NAME, + "other content", + "If09d8782c1e59dd0b33de2b1ec3595d69cc10ad5"); r = push.to("refs/for/master"); r.assertOkStatus(); exception.expect(ResourceConflictException.class); - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .rebase(); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).rebase(); } @Test @@ -613,37 +520,25 @@ public class ChangeIT extends AbstractDaemonTest { // rebase r3 directly onto master (break dep. towards r2) ri.base = ""; - gApi.changes() - .id(r3.getChangeId()) - .revision(r3.getCommit().name()) - .rebase(ri); + gApi.changes().id(r3.getChangeId()).revision(r3.getCommit().name()).rebase(ri); PatchSet ps3 = r3.getPatchSet(); assertThat(ps3.getId().get()).isEqualTo(2); // rebase r2 onto r3 (referenced by ref) ri.base = ps3.getId().toRefName(); - gApi.changes() - .id(r2.getChangeId()) - .revision(r2.getCommit().name()) - .rebase(ri); + gApi.changes().id(r2.getChangeId()).revision(r2.getCommit().name()).rebase(ri); PatchSet ps2 = r2.getPatchSet(); assertThat(ps2.getId().get()).isEqualTo(2); // rebase r1 onto r2 (referenced by commit) ri.base = ps2.getRevision().get(); - gApi.changes() - .id(r1.getChangeId()) - .revision(r1.getCommit().name()) - .rebase(ri); + gApi.changes().id(r1.getChangeId()).revision(r1.getCommit().name()).rebase(ri); PatchSet ps1 = r1.getPatchSet(); assertThat(ps1.getId().get()).isEqualTo(2); // rebase r1 onto r3 (referenced by change number) ri.base = String.valueOf(r3.getChange().getId().get()); - gApi.changes() - .id(r1.getChangeId()) - .revision(ps1.getRevision().get()) - .rebase(ri); + gApi.changes().id(r1.getChangeId()).revision(ps1.getRevision().get()).rebase(ri); assertThat(r1.getPatchSetId().get()).isEqualTo(3); } @@ -654,14 +549,13 @@ public class ChangeIT extends AbstractDaemonTest { RebaseInput ri = new RebaseInput(); ri.base = r2.getCommit().name(); - String expectedMessage = "base change " + r2.getChangeId() - + " is a descendant of the current change - recursion not allowed"; + String expectedMessage = + "base change " + + r2.getChangeId() + + " is a descendant of the current change - recursion not allowed"; exception.expect(ResourceConflictException.class); exception.expectMessage(expectedMessage); - gApi.changes() - .id(r1.getChangeId()) - .revision(r1.getCommit().name()) - .rebase(ri); + gApi.changes().id(r1.getChangeId()).revision(r1.getCommit().name()).rebase(ri); } @Test @@ -669,18 +563,13 @@ public class ChangeIT extends AbstractDaemonTest { PushOneCommit.Result r = createChange(); String changeId = r.getChangeId(); assertThat(info(changeId).status).isEqualTo(ChangeStatus.NEW); - gApi.changes() - .id(changeId) - .abandon(); + gApi.changes().id(changeId).abandon(); ChangeInfo info = get(changeId); assertThat(info.status).isEqualTo(ChangeStatus.ABANDONED); exception.expect(ResourceConflictException.class); exception.expectMessage("change is abandoned"); - gApi.changes() - .id(changeId) - .revision(r.getCommit().name()) - .rebase(); + gApi.changes().id(changeId).revision(r.getCommit().name()).rebase(); } @Test @@ -693,9 +582,7 @@ public class ChangeIT extends AbstractDaemonTest { // Abandon the first change String changeId = r.getChangeId(); assertThat(info(changeId).status).isEqualTo(ChangeStatus.NEW); - gApi.changes() - .id(changeId) - .abandon(); + gApi.changes().id(changeId).abandon(); ChangeInfo info = get(changeId); assertThat(info.status).isEqualTo(ChangeStatus.ABANDONED); @@ -704,10 +591,7 @@ public class ChangeIT extends AbstractDaemonTest { exception.expect(ResourceConflictException.class); exception.expectMessage("base change is abandoned: " + changeId); - gApi.changes() - .id(r2.getChangeId()) - .revision(r2.getCommit().name()) - .rebase(ri); + gApi.changes().id(r2.getChangeId()).revision(r2.getCommit().name()).rebase(ri); } @Test @@ -719,10 +603,7 @@ public class ChangeIT extends AbstractDaemonTest { ri.base = commit; exception.expect(ResourceConflictException.class); exception.expectMessage("cannot rebase change onto itself"); - gApi.changes() - .id(changeId) - .revision(commit) - .rebase(ri); + gApi.changes().id(changeId).revision(commit).rebase(ri); } @Test @@ -730,8 +611,7 @@ public class ChangeIT extends AbstractDaemonTest { public void changeNoParentToOneParent() throws Exception { // create initial commit with no parent and push it as change, so that patch // set 1 has no parent - RevCommit c = - testRepo.commit().message("Initial commit").insertChangeId().create(); + RevCommit c = testRepo.commit().message("Initial commit").insertChangeId().create(); String id = GitUtil.getChangeId(testRepo, c).get(); testRepo.reset(c); @@ -739,8 +619,7 @@ public class ChangeIT extends AbstractDaemonTest { assertPushOk(pr, "refs/for/master"); ChangeInfo change = gApi.changes().id(id).get(); - assertThat(change.revisions.get(change.currentRevision).commit.parents) - .isEmpty(); + assertThat(change.revisions.get(change.currentRevision).commit.parents).isEmpty(); // create another initial commit with no parent and push it directly into // the remote repository @@ -751,8 +630,13 @@ public class ChangeIT extends AbstractDaemonTest { // create a successor commit and push it as second patch set to the change, // so that patch set 2 has 1 parent - RevCommit c2 = testRepo.commit().message("Initial commit").parent(c) - .insertChangeId(id.substring(1)).create(); + RevCommit c2 = + testRepo + .commit() + .message("Initial commit") + .parent(c) + .insertChangeId(id.substring(1)) + .create(); testRepo.reset(c2); pr = pushHead(testRepo, "refs/for/master", false); @@ -784,18 +668,15 @@ public class ChangeIT extends AbstractDaemonTest { Collection reviewers = change.reviewers.get(REVIEWER); assertThat(reviewers).isNotNull(); assertThat(reviewers).hasSize(1); - assertThat(reviewers.iterator().next()._accountId) - .isEqualTo(user.getId().get()); + assertThat(reviewers.iterator().next()._accountId).isEqualTo(user.getId().get()); assertThat(change.reviewers.get(CC)).isNull(); List messages = sender.getMessages(); assertThat(messages).hasSize(1); Message m = messages.get(0); assertThat(m.rcpt()).containsExactly(user.emailAddress); - assertThat(m.body()) - .contains(admin.fullName + " has uploaded this change for review"); - assertThat(m.body()) - .contains("Change subject: " + PushOneCommit.SUBJECT + "\n"); + assertThat(m.body()).contains(admin.fullName + " has uploaded this change for review"); + assertThat(m.body()).contains("Change subject: " + PushOneCommit.SUBJECT + "\n"); assertMailFrom(m, admin.email); } @@ -804,10 +685,10 @@ public class ChangeIT extends AbstractDaemonTest { // create hidden project that is only visible to administrators Project.NameKey p = createProject("p"); ProjectConfig cfg = projectCache.checkedGet(p).getConfig(); - Util.allow(cfg, + Util.allow( + cfg, Permission.READ, - groupCache.get(new AccountGroup.NameKey("Administrators")) - .getGroupUUID(), + groupCache.get(new AccountGroup.NameKey("Administrators")).getGroupUUID(), "refs/*"); Util.block(cfg, Permission.READ, REGISTERED_USERS, "refs/*"); saveProjectConfig(p, cfg); @@ -843,11 +724,18 @@ public class ChangeIT extends AbstractDaemonTest { @Test public void pushCommitWithFooterOfOtherUser() throws Exception { // admin pushes commit that references 'user' in a footer - PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo, - PushOneCommit.SUBJECT + "\n\n" - + FooterConstants.REVIEWED_BY.getName() + ": " - + user.getIdent().toExternalString(), - PushOneCommit.FILE_NAME, PushOneCommit.FILE_CONTENT); + PushOneCommit push = + pushFactory.create( + db, + admin.getIdent(), + testRepo, + PushOneCommit.SUBJECT + + "\n\n" + + FooterConstants.REVIEWED_BY.getName() + + ": " + + user.getIdent().toExternalString(), + PushOneCommit.FILE_NAME, + PushOneCommit.FILE_CONTENT); PushOneCommit.Result result = push.to("refs/for/master"); result.assertOkStatus(); @@ -856,8 +744,7 @@ public class ChangeIT extends AbstractDaemonTest { Collection reviewers = change.reviewers.get(REVIEWER); assertThat(reviewers).isNotNull(); assertThat(reviewers).hasSize(1); - assertThat(reviewers.iterator().next()._accountId) - .isEqualTo(user.getId().get()); + assertThat(reviewers.iterator().next()._accountId).isEqualTo(user.getId().get()); assertThat(change.reviewers.get(CC)).isNull(); List messages = sender.getMessages(); @@ -866,30 +753,37 @@ public class ChangeIT extends AbstractDaemonTest { assertThat(m.rcpt()).containsExactly(user.emailAddress); assertThat(m.body()).contains("Hello " + user.fullName + ",\n"); assertThat(m.body()).contains("I'd like you to do a code review."); - assertThat(m.body()) - .contains("Change subject: " + PushOneCommit.SUBJECT + "\n"); + assertThat(m.body()).contains("Change subject: " + PushOneCommit.SUBJECT + "\n"); assertMailFrom(m, admin.email); } @Test - public void pushCommitWithFooterOfOtherUserThatCannotSeeChange() - throws Exception { + public void pushCommitWithFooterOfOtherUserThatCannotSeeChange() throws Exception { // create hidden project that is only visible to administrators Project.NameKey p = createProject("p"); ProjectConfig cfg = projectCache.checkedGet(p).getConfig(); - Util.allow(cfg, - Permission.READ, groupCache - .get(new AccountGroup.NameKey("Administrators")).getGroupUUID(), + Util.allow( + cfg, + Permission.READ, + groupCache.get(new AccountGroup.NameKey("Administrators")).getGroupUUID(), "refs/*"); Util.block(cfg, Permission.READ, REGISTERED_USERS, "refs/*"); saveProjectConfig(p, cfg); // admin pushes commit that references 'user' in a footer TestRepository repo = cloneProject(p, admin); - PushOneCommit push = pushFactory.create(db, admin.getIdent(), repo, - PushOneCommit.SUBJECT + "\n\n" + FooterConstants.REVIEWED_BY.getName() - + ": " + user.getIdent().toExternalString(), - PushOneCommit.FILE_NAME, PushOneCommit.FILE_CONTENT); + PushOneCommit push = + pushFactory.create( + db, + admin.getIdent(), + repo, + PushOneCommit.SUBJECT + + "\n\n" + + FooterConstants.REVIEWED_BY.getName() + + ": " + + user.getIdent().toExternalString(), + PushOneCommit.FILE_NAME, + PushOneCommit.FILE_CONTENT); PushOneCommit.Result result = push.to("refs/for/master"); result.assertOkStatus(); @@ -915,10 +809,10 @@ public class ChangeIT extends AbstractDaemonTest { // create hidden project that is only visible to administrators Project.NameKey p = createProject("p"); ProjectConfig cfg = projectCache.checkedGet(p).getConfig(); - Util.allow(cfg, + Util.allow( + cfg, Permission.READ, - groupCache.get(new AccountGroup.NameKey("Administrators")) - .getGroupUUID(), + groupCache.get(new AccountGroup.NameKey("Administrators")).getGroupUUID(), "refs/*"); Util.block(cfg, Permission.READ, REGISTERED_USERS, "refs/*"); saveProjectConfig(p, cfg); @@ -944,9 +838,7 @@ public class ChangeIT extends AbstractDaemonTest { in.reviewer = user.email; exception.expect(UnprocessableEntityException.class); exception.expectMessage("Change not visible to " + user.email); - gApi.changes() - .id(result.getChangeId()) - .addReviewer(in); + gApi.changes().id(result.getChangeId()).addReviewer(in); } @Test @@ -960,9 +852,7 @@ public class ChangeIT extends AbstractDaemonTest { in.reviewer = username; exception.expect(UnprocessableEntityException.class); exception.expectMessage("Account of " + username + " is inactive."); - gApi.changes() - .id(r.getChangeId()) - .addReviewer(in); + gApi.changes().id(r.getChangeId()).addReviewer(in); } @Test @@ -975,9 +865,7 @@ public class ChangeIT extends AbstractDaemonTest { AddReviewerInput in = new AddReviewerInput(); in.reviewer = user.email; - gApi.changes() - .id(r.getChangeId()) - .addReviewer(in); + gApi.changes().id(r.getChangeId()).addReviewer(in); List messages = sender.getMessages(); assertThat(messages).hasSize(1); @@ -987,9 +875,7 @@ public class ChangeIT extends AbstractDaemonTest { assertThat(m.body()).contains("I'd like you to do a code review."); assertThat(m.body()).contains("Change subject: " + PushOneCommit.SUBJECT + "\n"); assertMailFrom(m, admin.email); - ChangeInfo c = gApi.changes() - .id(r.getChangeId()) - .get(); + ChangeInfo c = gApi.changes().id(r.getChangeId()).get(); // When NoteDb is enabled adding a reviewer records that user as reviewer // in NoteDb. When NoteDb is disabled adding a reviewer results in a dummy 0 @@ -998,8 +884,7 @@ public class ChangeIT extends AbstractDaemonTest { Collection reviewers = c.reviewers.get(REVIEWER); assertThat(reviewers).isNotNull(); assertThat(reviewers).hasSize(1); - assertThat(reviewers.iterator().next()._accountId) - .isEqualTo(user.getId().get()); + assertThat(reviewers.iterator().next()._accountId).isEqualTo(user.getId().get()); // Ensure ETag and lastUpdatedOn are updated. rsrc = parseResource(r); @@ -1008,25 +893,23 @@ public class ChangeIT extends AbstractDaemonTest { } @Test - public void addReviewerWithNoteDbWhenDummyApprovalInReviewDbExists() - throws Exception { + public void addReviewerWithNoteDbWhenDummyApprovalInReviewDbExists() throws Exception { assume().that(notesMigration.enabled()).isTrue(); - assume().that(notesMigration.changePrimaryStorage()) - .isEqualTo(PrimaryStorage.REVIEW_DB); + assume().that(notesMigration.changePrimaryStorage()).isEqualTo(PrimaryStorage.REVIEW_DB); PushOneCommit.Result r = createChange(); // insert dummy approval in ReviewDb PatchSetApproval psa = - new PatchSetApproval(new PatchSetApproval.Key(r.getPatchSetId(), - user.id, new LabelId("Code-Review")), (short) 0, TimeUtil.nowTs()); + new PatchSetApproval( + new PatchSetApproval.Key(r.getPatchSetId(), user.id, new LabelId("Code-Review")), + (short) 0, + TimeUtil.nowTs()); db.patchSetApprovals().insert(Collections.singleton(psa)); AddReviewerInput in = new AddReviewerInput(); in.reviewer = user.email; - gApi.changes() - .id(r.getChangeId()) - .addReviewer(in); + gApi.changes().id(r.getChangeId()).addReviewer(in); } @Test @@ -1040,9 +923,7 @@ public class ChangeIT extends AbstractDaemonTest { AddReviewerInput in = new AddReviewerInput(); in.reviewer = user.email; setApiUser(user); - gApi.changes() - .id(r.getChangeId()) - .addReviewer(in); + gApi.changes().id(r.getChangeId()).addReviewer(in); // There should be no email notification when adding self assertThat(sender.getMessages()).isEmpty(); @@ -1051,14 +932,11 @@ public class ChangeIT extends AbstractDaemonTest { // in NoteDb. When NoteDb is disabled adding a reviewer results in a dummy 0 // approval on the change which is treated as CC when the ChangeInfo is // created. - ChangeInfo c = gApi.changes() - .id(r.getChangeId()) - .get(); + ChangeInfo c = gApi.changes().id(r.getChangeId()).get(); Collection reviewers = c.reviewers.get(REVIEWER); assertThat(reviewers).isNotNull(); assertThat(reviewers).hasSize(1); - assertThat(reviewers.iterator().next()._accountId) - .isEqualTo(user.getId().get()); + assertThat(reviewers.iterator().next()._accountId).isEqualTo(user.getId().get()); // Ensure ETag and lastUpdatedOn are updated. rsrc = parseResource(r); @@ -1070,19 +948,14 @@ public class ChangeIT extends AbstractDaemonTest { public void implicitlyCcOnNonVotingReview() throws Exception { PushOneCommit.Result r = createChange(); setApiUser(user); - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .review(new ReviewInput()); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(new ReviewInput()); - ChangeInfo c = gApi.changes() - .id(r.getChangeId()) - .get(); + ChangeInfo c = gApi.changes().id(r.getChangeId()).get(); // If we're not reading from NoteDb, then the CCed user will be returned // in the REVIEWER state. ReviewerState state = notesMigration.readChanges() ? CC : REVIEWER; - assertThat(c.reviewers.get(state).stream().map(ai -> ai._accountId) - .collect(toList())).containsExactly(user.id.get()); + assertThat(c.reviewers.get(state).stream().map(ai -> ai._accountId).collect(toList())) + .containsExactly(user.id.get()); } @Test @@ -1094,22 +967,15 @@ public class ChangeIT extends AbstractDaemonTest { .revision(r.getCommit().name()) .review(ReviewInput.recommend().message("LGTM")); - ChangeInfo c = gApi.changes() - .id(r.getChangeId()) - .get(); - assertThat(c.reviewers.get(REVIEWER).stream().map(ai -> ai._accountId) - .collect(toList())).containsExactly(user.id.get()); + ChangeInfo c = gApi.changes().id(r.getChangeId()).get(); + assertThat(c.reviewers.get(REVIEWER).stream().map(ai -> ai._accountId).collect(toList())) + .containsExactly(user.id.get()); // Further test: remove the vote, then comment again. The user should be // implicitly re-added to the ReviewerSet, as a CC if we're using NoteDb. setApiUser(admin); - gApi.changes() - .id(r.getChangeId()) - .reviewer(user.getId().toString()) - .remove(); - c = gApi.changes() - .id(r.getChangeId()) - .get(); + gApi.changes().id(r.getChangeId()).reviewer(user.getId().toString()).remove(); + c = gApi.changes().id(r.getChangeId()).get(); assertThat(c.reviewers.values()).isEmpty(); setApiUser(user); @@ -1117,51 +983,34 @@ public class ChangeIT extends AbstractDaemonTest { .id(r.getChangeId()) .revision(r.getCommit().name()) .review(new ReviewInput().message("hi")); - c = gApi.changes() - .id(r.getChangeId()) - .get(); + c = gApi.changes().id(r.getChangeId()).get(); ReviewerState state = notesMigration.readChanges() ? CC : REVIEWER; - assertThat(c.reviewers.get(state).stream().map(ai -> ai._accountId) - .collect(toList())).containsExactly(user.id.get()); + assertThat(c.reviewers.get(state).stream().map(ai -> ai._accountId).collect(toList())) + .containsExactly(user.id.get()); } @Test public void addReviewerToClosedChange() throws Exception { PushOneCommit.Result r = createChange(); - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .review(ReviewInput.approve()); - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .submit(); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve()); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).submit(); - ChangeInfo c = gApi.changes() - .id(r.getChangeId()) - .get(); + ChangeInfo c = gApi.changes().id(r.getChangeId()).get(); Collection reviewers = c.reviewers.get(REVIEWER); assertThat(reviewers).hasSize(1); - assertThat(reviewers.iterator().next()._accountId) - .isEqualTo(admin.getId().get()); + assertThat(reviewers.iterator().next()._accountId).isEqualTo(admin.getId().get()); assertThat(c.reviewers).doesNotContainKey(CC); AddReviewerInput in = new AddReviewerInput(); in.reviewer = user.email; - gApi.changes() - .id(r.getChangeId()) - .addReviewer(in); + gApi.changes().id(r.getChangeId()).addReviewer(in); - c = gApi.changes() - .id(r.getChangeId()) - .get(); + c = gApi.changes().id(r.getChangeId()).get(); reviewers = c.reviewers.get(REVIEWER); assertThat(reviewers).hasSize(2); Iterator reviewerIt = reviewers.iterator(); - assertThat(reviewerIt.next()._accountId) - .isEqualTo(admin.getId().get()); - assertThat(reviewerIt.next()._accountId) - .isEqualTo(user.getId().get()); + assertThat(reviewerIt.next()._accountId).isEqualTo(admin.getId().get()); + assertThat(reviewerIt.next()._accountId).isEqualTo(user.getId().get()); assertThat(c.reviewers).doesNotContainKey(CC); } @@ -1171,9 +1020,7 @@ public class ChangeIT extends AbstractDaemonTest { AddReviewerInput in = new AddReviewerInput(); in.reviewer = user.email; - gApi.changes() - .id(changeId) - .addReviewer(in); + gApi.changes().id(changeId).addReviewer(in); sender.clear(); ReviewInput review = new ReviewInput(); @@ -1193,96 +1040,67 @@ public class ChangeIT extends AbstractDaemonTest { @Test public void listVotes() throws Exception { PushOneCommit.Result r = createChange(); - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .review(ReviewInput.approve()); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve()); - Map m = gApi.changes() - .id(r.getChangeId()) - .reviewer(admin.getId().toString()) - .votes(); + Map m = + gApi.changes().id(r.getChangeId()).reviewer(admin.getId().toString()).votes(); assertThat(m).hasSize(1); - assertThat(m).containsEntry("Code-Review", Short.valueOf((short)2)); + assertThat(m).containsEntry("Code-Review", Short.valueOf((short) 2)); setApiUser(user); - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .review(ReviewInput.dislike()); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.dislike()); - m = gApi.changes() - .id(r.getChangeId()) - .reviewer(user.getId().toString()) - .votes(); + m = gApi.changes().id(r.getChangeId()).reviewer(user.getId().toString()).votes(); assertThat(m).hasSize(1); - assertThat(m).containsEntry("Code-Review", Short.valueOf((short)-1)); + assertThat(m).containsEntry("Code-Review", Short.valueOf((short) -1)); } @Test public void removeReviewerNoVotes() throws Exception { ProjectConfig cfg = projectCache.checkedGet(project).getConfig(); - LabelType verified = category("Verified", value(1, "Passes"), - value(0, "No score"), value(-1, "Failed")); + LabelType verified = + category("Verified", value(1, "Passes"), value(0, "No score"), value(-1, "Failed")); cfg.getLabelSections().put(verified.getName(), verified); - AccountGroup.UUID registeredUsers = - systemGroupBackend.getGroup(REGISTERED_USERS).getUUID(); + AccountGroup.UUID registeredUsers = systemGroupBackend.getGroup(REGISTERED_USERS).getUUID(); String heads = RefNames.REFS_HEADS + "*"; - Util.allow(cfg, Permission.forLabel(Util.verified().getName()), -1, 1, - registeredUsers, heads); + Util.allow(cfg, Permission.forLabel(Util.verified().getName()), -1, 1, registeredUsers, heads); saveProjectConfig(project, cfg); PushOneCommit.Result r = createChange(); String changeId = r.getChangeId(); - gApi.changes() - .id(changeId) - .addReviewer(user.getId().toString()); + gApi.changes().id(changeId).addReviewer(user.getId().toString()); // ReviewerState will vary between ReviewDb and NoteDb; we just care that it // shows up somewhere. - Iterable reviewers = Iterables.concat( - gApi.changes().id(changeId).get().reviewers.values()); + Iterable reviewers = + Iterables.concat(gApi.changes().id(changeId).get().reviewers.values()); assertThat(reviewers).hasSize(1); - assertThat(reviewers.iterator().next()._accountId) - .isEqualTo(user.getId().get()); + assertThat(reviewers.iterator().next()._accountId).isEqualTo(user.getId().get()); sender.clear(); - gApi.changes() - .id(changeId) - .reviewer(user.getId().toString()) - .remove(); + gApi.changes().id(changeId).reviewer(user.getId().toString()).remove(); assertThat(gApi.changes().id(changeId).get().reviewers).isEmpty(); assertThat(sender.getMessages()).hasSize(1); Message message = sender.getMessages().get(0); - assertThat(message.body()).contains( - "Removed reviewer " + user.fullName + "."); + assertThat(message.body()).contains("Removed reviewer " + user.fullName + "."); assertThat(message.body()).doesNotContain("with the following votes"); // Make sure the reviewer can still be added again. - gApi.changes() - .id(changeId) - .addReviewer(user.getId().toString()); + gApi.changes().id(changeId).addReviewer(user.getId().toString()); reviewers = Iterables.concat(gApi.changes().id(changeId).get().reviewers.values()); assertThat(reviewers).hasSize(1); - assertThat(reviewers.iterator().next()._accountId) - .isEqualTo(user.getId().get()); + assertThat(reviewers.iterator().next()._accountId).isEqualTo(user.getId().get()); // Remove again, and then try to remove once more to verify 404 is // returned. - gApi.changes() - .id(changeId) - .reviewer(user.getId().toString()) - .remove(); + gApi.changes().id(changeId).reviewer(user.getId().toString()).remove(); exception.expect(ResourceNotFoundException.class); - gApi.changes() - .id(changeId) - .reviewer(user.getId().toString()) - .remove(); + gApi.changes().id(changeId).reviewer(user.getId().toString()).remove(); } @Test @@ -1298,28 +1116,17 @@ public class ChangeIT extends AbstractDaemonTest { private void testRemoveReviewer(boolean notify) throws Exception { PushOneCommit.Result r = createChange(); String changeId = r.getChangeId(); - gApi.changes() - .id(changeId) - .revision(r.getCommit().name()) - .review(ReviewInput.approve()); + gApi.changes().id(changeId).revision(r.getCommit().name()).review(ReviewInput.approve()); setApiUser(user); - gApi.changes() - .id(changeId) - .revision(r.getCommit().name()) - .review(ReviewInput.recommend()); + gApi.changes().id(changeId).revision(r.getCommit().name()).review(ReviewInput.recommend()); - Collection reviewers = gApi.changes() - .id(changeId) - .get() - .reviewers.get(REVIEWER); + Collection reviewers = gApi.changes().id(changeId).get().reviewers.get(REVIEWER); assertThat(reviewers).hasSize(2); Iterator reviewerIt = reviewers.iterator(); - assertThat(reviewerIt.next()._accountId) - .isEqualTo(admin.getId().get()); - assertThat(reviewerIt.next()._accountId) - .isEqualTo(user.getId().get()); + assertThat(reviewerIt.next()._accountId).isEqualTo(admin.getId().get()); + assertThat(reviewerIt.next()._accountId).isEqualTo(user.getId().get()); sender.clear(); setApiUser(admin); @@ -1327,29 +1134,22 @@ public class ChangeIT extends AbstractDaemonTest { if (!notify) { input.notify = NotifyHandling.NONE; } - gApi.changes() - .id(changeId) - .reviewer(user.getId().toString()) - .remove(input); + gApi.changes().id(changeId).reviewer(user.getId().toString()).remove(input); if (notify) { assertThat(sender.getMessages()).hasSize(1); Message message = sender.getMessages().get(0); - assertThat(message.body()).contains( - "Removed reviewer " + user.fullName + " with the following votes"); + assertThat(message.body()) + .contains("Removed reviewer " + user.fullName + " with the following votes"); assertThat(message.body()).contains("* Code-Review+1 by " + user.fullName); } else { assertThat(sender.getMessages()).isEmpty(); } - reviewers = gApi.changes() - .id(changeId) - .get() - .reviewers.get(REVIEWER); + reviewers = gApi.changes().id(changeId).get().reviewers.get(REVIEWER); assertThat(reviewers).hasSize(1); reviewerIt = reviewers.iterator(); - assertThat(reviewerIt.next()._accountId) - .isEqualTo(admin.getId().get()); + assertThat(reviewerIt.next()._accountId).isEqualTo(admin.getId().get()); eventRecorder.assertReviewerDeletedEvents(changeId, user.email); } @@ -1358,76 +1158,53 @@ public class ChangeIT extends AbstractDaemonTest { public void removeReviewerNotPermitted() throws Exception { PushOneCommit.Result r = createChange(); String changeId = r.getChangeId(); - gApi.changes() - .id(changeId) - .revision(r.getCommit().name()) - .review(ReviewInput.approve()); + gApi.changes().id(changeId).revision(r.getCommit().name()).review(ReviewInput.approve()); setApiUser(user); exception.expect(AuthException.class); exception.expectMessage("delete reviewer not permitted"); - gApi.changes() - .id(r.getChangeId()) - .reviewer(admin.getId().toString()) - .remove(); + gApi.changes().id(r.getChangeId()).reviewer(admin.getId().toString()).remove(); } @Test public void deleteVote() throws Exception { PushOneCommit.Result r = createChange(); - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .review(ReviewInput.approve()); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve()); setApiUser(user); recommend(r.getChangeId()); setApiUser(admin); sender.clear(); - gApi.changes() - .id(r.getChangeId()) - .reviewer(user.getId().toString()) - .deleteVote("Code-Review"); + gApi.changes().id(r.getChangeId()).reviewer(user.getId().toString()).deleteVote("Code-Review"); List messages = sender.getMessages(); assertThat(messages).hasSize(1); Message msg = messages.get(0); assertThat(msg.rcpt()).containsExactly(user.emailAddress); - assertThat(msg.body()).contains( - admin.fullName + " has removed a vote on this change.\n"); - assertThat(msg.body()).contains( - "Removed Code-Review+1 by " - + user.fullName + " <" + user.email + ">" + "\n"); + assertThat(msg.body()).contains(admin.fullName + " has removed a vote on this change.\n"); + assertThat(msg.body()) + .contains("Removed Code-Review+1 by " + user.fullName + " <" + user.email + ">" + "\n"); - Map m = gApi.changes() - .id(r.getChangeId()) - .reviewer(user.getId().toString()) - .votes(); + Map m = + gApi.changes().id(r.getChangeId()).reviewer(user.getId().toString()).votes(); // Dummy 0 approval on the change to block vote copying to this patch set. - assertThat(m).containsExactly("Code-Review", Short.valueOf((short)0)); + assertThat(m).containsExactly("Code-Review", Short.valueOf((short) 0)); - ChangeInfo c = gApi.changes() - .id(r.getChangeId()) - .get(); + ChangeInfo c = gApi.changes().id(r.getChangeId()).get(); ChangeMessageInfo message = Iterables.getLast(c.messages); assertThat(message.author._accountId).isEqualTo(admin.getId().get()); - assertThat(message.message).isEqualTo( - "Removed Code-Review+1 by User \n"); + assertThat(message.message).isEqualTo("Removed Code-Review+1 by User \n"); assertThat(getReviewers(c.reviewers.get(REVIEWER))) - .containsExactlyElementsIn( - ImmutableSet.of(admin.getId(), user.getId())); + .containsExactlyElementsIn(ImmutableSet.of(admin.getId(), user.getId())); } @Test public void deleteVoteNotifyNone() throws Exception { PushOneCommit.Result r = createChange(); - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .review(ReviewInput.approve()); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve()); setApiUser(user); recommend(r.getChangeId()); @@ -1437,20 +1214,14 @@ public class ChangeIT extends AbstractDaemonTest { DeleteVoteInput in = new DeleteVoteInput(); in.label = "Code-Review"; in.notify = NotifyHandling.NONE; - gApi.changes() - .id(r.getChangeId()) - .reviewer(user.getId().toString()) - .deleteVote(in); + gApi.changes().id(r.getChangeId()).reviewer(user.getId().toString()).deleteVote(in); assertThat(sender.getMessages()).isEmpty(); } @Test public void deleteVoteNotifyAccount() throws Exception { PushOneCommit.Result r = createChange(); - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .review(ReviewInput.approve()); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve()); DeleteVoteInput in = new DeleteVoteInput(); in.label = "Code-Review"; @@ -1463,12 +1234,8 @@ public class ChangeIT extends AbstractDaemonTest { setApiUser(admin); sender.clear(); in.notifyDetails = new HashMap<>(); - in.notifyDetails.put(RecipientType.TO, - new NotifyInfo(ImmutableList.of(user2.email))); - gApi.changes() - .id(r.getChangeId()) - .reviewer(user.getId().toString()) - .deleteVote(in); + in.notifyDetails.put(RecipientType.TO, new NotifyInfo(ImmutableList.of(user2.email))); + gApi.changes().id(r.getChangeId()).reviewer(user.getId().toString()).deleteVote(in); assertNotifyTo(user2); // notify unrelated account as CC @@ -1477,12 +1244,8 @@ public class ChangeIT extends AbstractDaemonTest { setApiUser(admin); sender.clear(); in.notifyDetails = new HashMap<>(); - in.notifyDetails.put(RecipientType.CC, - new NotifyInfo(ImmutableList.of(user2.email))); - gApi.changes() - .id(r.getChangeId()) - .reviewer(user.getId().toString()) - .deleteVote(in); + in.notifyDetails.put(RecipientType.CC, new NotifyInfo(ImmutableList.of(user2.email))); + gApi.changes().id(r.getChangeId()).reviewer(user.getId().toString()).deleteVote(in); assertNotifyCc(user2); // notify unrelated account as BCC @@ -1491,47 +1254,33 @@ public class ChangeIT extends AbstractDaemonTest { setApiUser(admin); sender.clear(); in.notifyDetails = new HashMap<>(); - in.notifyDetails.put(RecipientType.BCC, - new NotifyInfo(ImmutableList.of(user2.email))); - gApi.changes() - .id(r.getChangeId()) - .reviewer(user.getId().toString()) - .deleteVote(in); + in.notifyDetails.put(RecipientType.BCC, new NotifyInfo(ImmutableList.of(user2.email))); + gApi.changes().id(r.getChangeId()).reviewer(user.getId().toString()).deleteVote(in); assertNotifyBcc(user2); } @Test public void deleteVoteNotPermitted() throws Exception { PushOneCommit.Result r = createChange(); - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .review(ReviewInput.approve()); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve()); setApiUser(user); exception.expect(AuthException.class); exception.expectMessage("delete vote not permitted"); - gApi.changes() - .id(r.getChangeId()) - .reviewer(admin.getId().toString()) - .deleteVote("Code-Review"); + gApi.changes().id(r.getChangeId()).reviewer(admin.getId().toString()).deleteVote("Code-Review"); } @Test public void nonVotingReviewerStaysAfterSubmit() throws Exception { - LabelType verified = category("Verified", - value(1, "Passes"), value(0, "No score"), value(-1, "Failed")); + LabelType verified = + category("Verified", value(1, "Passes"), value(0, "No score"), value(-1, "Failed")); ProjectConfig cfg = projectCache.checkedGet(project).getConfig(); cfg.getLabelSections().put(verified.getName(), verified); String heads = "refs/heads/*"; - AccountGroup.UUID owners = - systemGroupBackend.getGroup(CHANGE_OWNER).getUUID(); - AccountGroup.UUID registered = - systemGroupBackend.getGroup(REGISTERED_USERS).getUUID(); - Util.allow(cfg, - Permission.forLabel(verified.getName()), -1, 1, owners, heads); - Util.allow(cfg, - Permission.forLabel("Code-Review"), -2, +2, registered, heads); + AccountGroup.UUID owners = systemGroupBackend.getGroup(CHANGE_OWNER).getUUID(); + AccountGroup.UUID registered = systemGroupBackend.getGroup(REGISTERED_USERS).getUUID(); + Util.allow(cfg, Permission.forLabel(verified.getName()), -1, 1, owners, heads); + Util.allow(cfg, Permission.forLabel("Code-Review"), -2, +2, registered, heads); saveProjectConfig(project, cfg); // Set Code-Review+2 and Verified+1 as admin (change owner) @@ -1540,10 +1289,7 @@ public class ChangeIT extends AbstractDaemonTest { String commit = r.getCommit().name(); ReviewInput input = ReviewInput.approve(); input.label(verified.getName(), 1); - gApi.changes() - .id(changeId) - .revision(commit) - .review(input); + gApi.changes().id(changeId).revision(commit).review(input); // Reviewers should only be "admin" ChangeInfo c = gApi.changes().id(changeId).get(); @@ -1554,38 +1300,25 @@ public class ChangeIT extends AbstractDaemonTest { // Add the user as reviewer AddReviewerInput in = new AddReviewerInput(); in.reviewer = user.email; - gApi.changes() - .id(changeId) - .addReviewer(in); + gApi.changes().id(changeId).addReviewer(in); c = gApi.changes().id(changeId).get(); assertThat(getReviewers(c.reviewers.get(REVIEWER))) - .containsExactlyElementsIn(ImmutableSet.of( - admin.getId(), user.getId())); + .containsExactlyElementsIn(ImmutableSet.of(admin.getId(), user.getId())); // Approve the change as user, then remove the approval // (only to confirm that the user does have Code-Review+2 permission) setApiUser(user); - gApi.changes() - .id(changeId) - .revision(commit) - .review(ReviewInput.approve()); - gApi.changes() - .id(changeId) - .revision(commit) - .review(ReviewInput.noScore()); + gApi.changes().id(changeId).revision(commit).review(ReviewInput.approve()); + gApi.changes().id(changeId).revision(commit).review(ReviewInput.noScore()); // Submit the change setApiUser(admin); - gApi.changes() - .id(changeId) - .revision(commit) - .submit(); + gApi.changes().id(changeId).revision(commit).submit(); // User should still be on the change c = gApi.changes().id(changeId).get(); assertThat(getReviewers(c.reviewers.get(REVIEWER))) - .containsExactlyElementsIn(ImmutableSet.of( - admin.getId(), user.getId())); + .containsExactlyElementsIn(ImmutableSet.of(admin.getId(), user.getId())); } @Test @@ -1594,15 +1327,11 @@ public class ChangeIT extends AbstractDaemonTest { in.branch = Constants.MASTER; in.subject = "Create a change from the API"; in.project = project.get(); - ChangeInfo info = gApi - .changes() - .create(in) - .get(); + ChangeInfo info = gApi.changes().create(in).get(); assertThat(info.project).isEqualTo(in.project); assertThat(info.branch).isEqualTo(in.branch); assertThat(info.subject).isEqualTo(in.subject); - assertThat(Iterables.getOnlyElement(info.messages).message) - .isEqualTo("Uploaded patch set 1."); + assertThat(Iterables.getOnlyElement(info.messages).message).isEqualTo("Uploaded patch set 1."); } @Test @@ -1626,18 +1355,15 @@ public class ChangeIT extends AbstractDaemonTest { public void queryChangesNoResults() throws Exception { createChange(); assertThat(query("message:test")).isNotEmpty(); - assertThat(query("message:{" + getClass().getName() + "fhqwhgads}")) - .isEmpty(); + assertThat(query("message:{" + getClass().getName() + "fhqwhgads}")).isEmpty(); } @Test public void queryChanges() throws Exception { PushOneCommit.Result r1 = createChange(); createChange(); - List results = - query("project:{" + project.get() + "} " + r1.getChangeId()); - assertThat(Iterables.getOnlyElement(results).changeId) - .isEqualTo(r1.getChangeId()); + List results = query("project:{" + project.get() + "} " + r1.getChangeId()); + assertThat(Iterables.getOnlyElement(results).changeId).isEqualTo(r1.getChangeId()); } @Test @@ -1646,18 +1372,16 @@ public class ChangeIT extends AbstractDaemonTest { PushOneCommit.Result r2 = createChange(); List results = gApi.changes().query().withLimit(1).get(); assertThat(results).hasSize(1); - assertThat(Iterables.getOnlyElement(results).changeId) - .isEqualTo(r2.getChangeId()); + assertThat(Iterables.getOnlyElement(results).changeId).isEqualTo(r2.getChangeId()); } @Test public void queryChangesStart() throws Exception { PushOneCommit.Result r1 = createChange(); createChange(); - List results = gApi.changes() - .query("project:{" + project.get() + "}").withStart(1).get(); - assertThat(Iterables.getOnlyElement(results).changeId) - .isEqualTo(r1.getChangeId()); + List results = + gApi.changes().query("project:{" + project.get() + "}").withStart(1).get(); + assertThat(Iterables.getOnlyElement(results).changeId).isEqualTo(r1.getChangeId()); } @Test @@ -1674,26 +1398,22 @@ public class ChangeIT extends AbstractDaemonTest { public void queryChangesOptions() throws Exception { PushOneCommit.Result r = createChange(); - ChangeInfo result = Iterables.getOnlyElement(gApi.changes() - .query(r.getChangeId()) - .get()); + ChangeInfo result = Iterables.getOnlyElement(gApi.changes().query(r.getChangeId()).get()); assertThat(result.labels).isNull(); assertThat(result.messages).isNull(); assertThat(result.actions).isNull(); assertThat(result.revisions).isNull(); - EnumSet options = EnumSet.of( - ListChangesOption.ALL_REVISIONS, - ListChangesOption.CHANGE_ACTIONS, - ListChangesOption.CURRENT_ACTIONS, - ListChangesOption.DETAILED_LABELS, - ListChangesOption.MESSAGES); - result = Iterables.getOnlyElement(gApi.changes() - .query(r.getChangeId()) - .withOptions(options) - .get()); - assertThat(Iterables.getOnlyElement(result.labels.keySet())) - .isEqualTo("Code-Review"); + EnumSet options = + EnumSet.of( + ListChangesOption.ALL_REVISIONS, + ListChangesOption.CHANGE_ACTIONS, + ListChangesOption.CURRENT_ACTIONS, + ListChangesOption.DETAILED_LABELS, + ListChangesOption.MESSAGES); + result = + Iterables.getOnlyElement(gApi.changes().query(r.getChangeId()).withOptions(options).get()); + assertThat(Iterables.getOnlyElement(result.labels.keySet())).isEqualTo("Code-Review"); assertThat(result.messages).hasSize(1); assertThat(result.actions).isNotEmpty(); @@ -1708,8 +1428,8 @@ public class ChangeIT extends AbstractDaemonTest { @Test public void queryChangesOwnerWithDifferentUsers() throws Exception { PushOneCommit.Result r = createChange(); - assertThat(Iterables.getOnlyElement( - query("project:{" + project.get() + "} owner:self")).changeId) + assertThat( + Iterables.getOnlyElement(query("project:{" + project.get() + "} owner:self")).changeId) .isEqualTo(r.getChangeId()); setApiUser(user); assertThat(query("owner:self")).isEmpty(); @@ -1720,9 +1440,7 @@ public class ChangeIT extends AbstractDaemonTest { PushOneCommit.Result r = createChange(); AddReviewerInput in = new AddReviewerInput(); in.reviewer = user.email; - gApi.changes() - .id(r.getChangeId()) - .addReviewer(in); + gApi.changes().id(r.getChangeId()).addReviewer(in); setApiUser(user); assertThat(get(r.getChangeId()).reviewed).isNull(); @@ -1734,40 +1452,20 @@ public class ChangeIT extends AbstractDaemonTest { @Test public void topic() throws Exception { PushOneCommit.Result r = createChange(); - assertThat(gApi.changes() - .id(r.getChangeId()) - .topic()).isEqualTo(""); - gApi.changes() - .id(r.getChangeId()) - .topic("mytopic"); - assertThat(gApi.changes() - .id(r.getChangeId()) - .topic()).isEqualTo("mytopic"); - gApi.changes() - .id(r.getChangeId()) - .topic(""); - assertThat(gApi.changes() - .id(r.getChangeId()) - .topic()).isEqualTo(""); + assertThat(gApi.changes().id(r.getChangeId()).topic()).isEqualTo(""); + gApi.changes().id(r.getChangeId()).topic("mytopic"); + assertThat(gApi.changes().id(r.getChangeId()).topic()).isEqualTo("mytopic"); + gApi.changes().id(r.getChangeId()).topic(""); + assertThat(gApi.changes().id(r.getChangeId()).topic()).isEqualTo(""); } @Test public void submitted() throws Exception { PushOneCommit.Result r = createChange(); - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .review(ReviewInput.approve()); - assertThat(gApi.changes() - .id(r.getChangeId()) - .info().submitted).isNull(); - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .submit(); - assertThat(gApi.changes() - .id(r.getChangeId()) - .info().submitted).isNotNull(); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve()); + assertThat(gApi.changes().id(r.getChangeId()).info().submitted).isNull(); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).submit(); + assertThat(gApi.changes().id(r.getChangeId()).info().submitted).isNotNull(); } @Test @@ -1781,18 +1479,10 @@ public class ChangeIT extends AbstractDaemonTest { enableChangeIndexWrites(); } - gApi.changes() - .id(r.getChangeId()) - .current() - .review(ReviewInput.approve()); + gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve()); - gApi.changes() - .id(r.getChangeId()) - .current() - .submit(); - assertThat(gApi.changes() - .id(r.getChangeId()) - .info().status).isEqualTo(ChangeStatus.MERGED); + gApi.changes().id(r.getChangeId()).current().submit(); + assertThat(gApi.changes().id(r.getChangeId()).info().status).isEqualTo(ChangeStatus.MERGED); } @Test @@ -1800,31 +1490,25 @@ public class ChangeIT extends AbstractDaemonTest { // TODO(dborowitz): Re-enable when ConsistencyChecker supports NoteDb. assume().that(notesMigration.enabled()).isFalse(); PushOneCommit.Result r = createChange(); - assertThat(gApi.changes() - .id(r.getChangeId()) - .get() - .problems).isNull(); - assertThat(gApi.changes() - .id(r.getChangeId()) - .get(EnumSet.of(ListChangesOption.CHECK)) - .problems).isEmpty(); + assertThat(gApi.changes().id(r.getChangeId()).get().problems).isNull(); + assertThat(gApi.changes().id(r.getChangeId()).get(EnumSet.of(ListChangesOption.CHECK)).problems) + .isEmpty(); } @Test public void commitFooters() throws Exception { - LabelType verified = category("Verified", - value(1, "Passes"), value(0, "No score"), value(-1, "Failed")); - LabelType custom1 = category("Custom1", - value(1, "Positive"), value(0, "No score"), value(-1, "Negative")); - LabelType custom2 = category("Custom2", - value(1, "Positive"), value(0, "No score"), value(-1, "Negative")); + LabelType verified = + category("Verified", value(1, "Passes"), value(0, "No score"), value(-1, "Failed")); + LabelType custom1 = + category("Custom1", value(1, "Positive"), value(0, "No score"), value(-1, "Negative")); + LabelType custom2 = + category("Custom2", value(1, "Positive"), value(0, "No score"), value(-1, "Negative")); ProjectConfig cfg = projectCache.checkedGet(project).getConfig(); cfg.getLabelSections().put(verified.getName(), verified); cfg.getLabelSections().put(custom1.getName(), custom1); cfg.getLabelSections().put(custom2.getName(), custom2); String heads = "refs/heads/*"; - AccountGroup.UUID anon = - systemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID(); + AccountGroup.UUID anon = systemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID(); Util.allow(cfg, Permission.forLabel("Verified"), -1, 1, anon, heads); Util.allow(cfg, Permission.forLabel("Custom1"), -1, 1, anon, heads); Util.allow(cfg, Permission.forLabel("Custom2"), -1, 1, anon, heads); @@ -1832,10 +1516,11 @@ public class ChangeIT extends AbstractDaemonTest { PushOneCommit.Result r1 = createChange(); r1.assertOkStatus(); - PushOneCommit.Result r2 = pushFactory.create( - db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "new content", - r1.getChangeId()) - .to("refs/for/master"); + PushOneCommit.Result r2 = + pushFactory + .create( + db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "new content", r1.getChangeId()) + .to("refs/for/master"); r2.assertOkStatus(); ReviewInput in = new ReviewInput(); @@ -1845,30 +1530,29 @@ public class ChangeIT extends AbstractDaemonTest { in.label("Custom2", 1); gApi.changes().id(r2.getChangeId()).current().review(in); - EnumSet options = EnumSet.of( - ListChangesOption.ALL_REVISIONS, ListChangesOption.COMMIT_FOOTERS); + EnumSet options = + EnumSet.of(ListChangesOption.ALL_REVISIONS, ListChangesOption.COMMIT_FOOTERS); ChangeInfo actual = gApi.changes().id(r2.getChangeId()).get(options); assertThat(actual.revisions).hasSize(2); // No footers except on latest patch set. - assertThat(actual.revisions.get(r1.getCommit().getName()).commitWithFooters) - .isNull(); + assertThat(actual.revisions.get(r1.getCommit().getName()).commitWithFooters).isNull(); List footers = - new ArrayList<>(Arrays.asList( - actual.revisions.get(r2.getCommit().getName()) - .commitWithFooters.split("\\n"))); + new ArrayList<>( + Arrays.asList( + actual.revisions.get(r2.getCommit().getName()).commitWithFooters.split("\\n"))); // remove subject + blank line footers.remove(0); footers.remove(0); - List expectedFooters = Arrays.asList( - "Change-Id: " + r2.getChangeId(), - "Reviewed-on: " - + canonicalWebUrl.get() + r2.getChange().getId(), - "Reviewed-by: Administrator ", - "Custom2: Administrator ", - "Tested-by: Administrator "); + List expectedFooters = + Arrays.asList( + "Change-Id: " + r2.getChangeId(), + "Reviewed-on: " + canonicalWebUrl.get() + r2.getChange().getId(), + "Reviewed-by: Administrator ", + "Custom2: Administrator ", + "Tested-by: Administrator "); assertThat(footers).containsExactlyElementsIn(expectedFooters); } @@ -1877,33 +1561,38 @@ public class ChangeIT extends AbstractDaemonTest { public void customCommitFooters() throws Exception { PushOneCommit.Result change = createChange(); RegistrationHandle handle = - changeMessageModifiers.add(new ChangeMessageModifier() { - @Override - public String onSubmit(String newCommitMessage, RevCommit original, - RevCommit mergeTip, Branch.NameKey destination) { - assertThat(original.getName()).isNotEqualTo(mergeTip.getName()); - return newCommitMessage + "Custom: " + destination.get(); - } - }); + changeMessageModifiers.add( + new ChangeMessageModifier() { + @Override + public String onSubmit( + String newCommitMessage, + RevCommit original, + RevCommit mergeTip, + Branch.NameKey destination) { + assertThat(original.getName()).isNotEqualTo(mergeTip.getName()); + return newCommitMessage + "Custom: " + destination.get(); + } + }); ChangeInfo actual; try { - EnumSet options = EnumSet.of( - ListChangesOption.ALL_REVISIONS, ListChangesOption.COMMIT_FOOTERS); + EnumSet options = + EnumSet.of(ListChangesOption.ALL_REVISIONS, ListChangesOption.COMMIT_FOOTERS); actual = gApi.changes().id(change.getChangeId()).get(options); } finally { handle.remove(); } - List footers = new ArrayList<>(Arrays.asList( - actual.revisions.get(change.getCommit().getName()).commitWithFooters - .split("\\n"))); + List footers = + new ArrayList<>( + Arrays.asList( + actual.revisions.get(change.getCommit().getName()).commitWithFooters.split("\\n"))); // remove subject + blank line footers.remove(0); footers.remove(0); List expectedFooters = Arrays.asList( - "Change-Id: " + change.getChangeId(), "Reviewed-on: " - + canonicalWebUrl.get() + change.getChange().getId(), + "Change-Id: " + change.getChangeId(), + "Reviewed-on: " + canonicalWebUrl.get() + change.getChange().getId(), "Custom: refs/heads/master"); assertThat(footers).containsExactlyElementsIn(expectedFooters); } @@ -1916,10 +1605,7 @@ public class ChangeIT extends AbstractDaemonTest { .id(r1.getChangeId()) .revision(r1.getCommit().name()) .review(ReviewInput.approve()); - gApi.changes() - .id(r1.getChangeId()) - .revision(r1.getCommit().name()) - .submit(); + gApi.changes().id(r1.getChangeId()).revision(r1.getCommit().name()).submit(); createChange(); createDraftChange(); @@ -1927,14 +1613,15 @@ public class ChangeIT extends AbstractDaemonTest { setApiUser(user); AcceptanceTestRequestScope.Context ctx = disableDb(); try { - assertThat(gApi.changes().query() - .withQuery( - "project:{" + project.get() + "} (status:open OR status:closed)") - // Options should match defaults in AccountDashboardScreen. - .withOption(ListChangesOption.LABELS) - .withOption(ListChangesOption.DETAILED_ACCOUNTS) - .withOption(ListChangesOption.REVIEWED) - .get()) + assertThat( + gApi.changes() + .query() + .withQuery("project:{" + project.get() + "} (status:open OR status:closed)") + // Options should match defaults in AccountDashboardScreen. + .withOption(ListChangesOption.LABELS) + .withOption(ListChangesOption.DETAILED_ACCOUNTS) + .withOption(ListChangesOption.REVIEWED) + .get()) .hasSize(2); } finally { enableDb(ctx); @@ -1946,8 +1633,7 @@ public class ChangeIT extends AbstractDaemonTest { PushOneCommit.Result r = createChange(); String triplet = project.get() + "~master~" + r.getChangeId(); gApi.changes().id(triplet).addReviewer(user.username); - ChangeInfo c = gApi.changes().id(triplet).get(EnumSet.of( - ListChangesOption.DETAILED_LABELS)); + ChangeInfo c = gApi.changes().id(triplet).get(EnumSet.of(ListChangesOption.DETAILED_LABELS)); LabelInfo codeReview = c.labels.get("Code-Review"); assertThat(codeReview.all).hasSize(1); ApprovalInfo approval = codeReview.all.get(0); @@ -1957,8 +1643,7 @@ public class ChangeIT extends AbstractDaemonTest { ProjectConfig cfg = projectCache.checkedGet(project).getConfig(); blockLabel(cfg, "Code-Review", REGISTERED_USERS, "refs/heads/*"); saveProjectConfig(project, cfg); - c = gApi.changes().id(triplet).get(EnumSet.of( - ListChangesOption.DETAILED_LABELS)); + c = gApi.changes().id(triplet).get(EnumSet.of(ListChangesOption.DETAILED_LABELS)); codeReview = c.labels.get("Code-Review"); assertThat(codeReview.all).hasSize(1); approval = codeReview.all.get(0); @@ -1973,11 +1658,10 @@ public class ChangeIT extends AbstractDaemonTest { PushOneCommit.Result r1 = createChange(); PushOneCommit.Result r2 = amendChange(r1.getChangeId()); - ChangeInfo info = gApi.changes() - .id(r1.getChangeId()) - .get(EnumSet.of( - ListChangesOption.ALL_REVISIONS, - ListChangesOption.PUSH_CERTIFICATES)); + ChangeInfo info = + gApi.changes() + .id(r1.getChangeId()) + .get(EnumSet.of(ListChangesOption.ALL_REVISIONS, ListChangesOption.PUSH_CERTIFICATES)); RevisionInfo rev1 = info.revisions.get(r1.getCommit().name()); assertThat(rev1).isNotNull(); @@ -2008,10 +1692,7 @@ public class ChangeIT extends AbstractDaemonTest { assertThat(info.changeId).isEqualTo(r.getChangeId()); exception.expect(AuthException.class); - gApi.changes() - .id(triplet) - .current() - .review(ReviewInput.approve()); + gApi.changes().id(triplet).current().review(ReviewInput.approve()); } @Test @@ -2019,34 +1700,36 @@ public class ChangeIT extends AbstractDaemonTest { assume().that(notesMigration.readChanges()).isTrue(); PushOneCommit.Result r = createChange(); - pushFactory.create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, - "b.txt", "4711", r.getChangeId()).to("refs/for/master").assertOkStatus(); + pushFactory + .create( + db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "b.txt", "4711", r.getChangeId()) + .to("refs/for/master") + .assertOkStatus(); ChangeInfo c = gApi.changes().id(r.getChangeId()).get(); try (Repository repo = repoManager.openRepository(project); RevWalk rw = new RevWalk(repo)) { - RevCommit commitPatchSetCreation = rw.parseCommit( - repo.exactRef(changeMetaRef(new Change.Id(c._number))).getObjectId()); + RevCommit commitPatchSetCreation = + rw.parseCommit(repo.exactRef(changeMetaRef(new Change.Id(c._number))).getObjectId()); - assertThat(commitPatchSetCreation.getShortMessage()) - .isEqualTo("Create patch set 2"); - PersonIdent expectedAuthor = changeNoteUtil.newIdent( - accountCache.get(admin.id).getAccount(), c.updated, - serverIdent.get(), AnonymousCowardNameProvider.DEFAULT); - assertThat(commitPatchSetCreation.getAuthorIdent()) - .isEqualTo(expectedAuthor); + assertThat(commitPatchSetCreation.getShortMessage()).isEqualTo("Create patch set 2"); + PersonIdent expectedAuthor = + changeNoteUtil.newIdent( + accountCache.get(admin.id).getAccount(), c.updated, + serverIdent.get(), AnonymousCowardNameProvider.DEFAULT); + assertThat(commitPatchSetCreation.getAuthorIdent()).isEqualTo(expectedAuthor); assertThat(commitPatchSetCreation.getCommitterIdent()) .isEqualTo(new PersonIdent(serverIdent.get(), c.updated)); assertThat(commitPatchSetCreation.getParentCount()).isEqualTo(1); - RevCommit commitChangeCreation = - rw.parseCommit(commitPatchSetCreation.getParent(0)); - assertThat(commitChangeCreation.getShortMessage()) - .isEqualTo("Create change"); - expectedAuthor = changeNoteUtil.newIdent( - accountCache.get(admin.id).getAccount(), c.created, serverIdent.get(), - AnonymousCowardNameProvider.DEFAULT); - assertThat(commitChangeCreation.getAuthorIdent()) - .isEqualTo(expectedAuthor); + RevCommit commitChangeCreation = rw.parseCommit(commitPatchSetCreation.getParent(0)); + assertThat(commitChangeCreation.getShortMessage()).isEqualTo("Create change"); + expectedAuthor = + changeNoteUtil.newIdent( + accountCache.get(admin.id).getAccount(), + c.created, + serverIdent.get(), + AnonymousCowardNameProvider.DEFAULT); + assertThat(commitChangeCreation.getAuthorIdent()).isEqualTo(expectedAuthor); assertThat(commitChangeCreation.getCommitterIdent()) .isEqualTo(new PersonIdent(serverIdent.get(), c.created)); assertThat(commitChangeCreation.getParentCount()).isEqualTo(0); @@ -2060,15 +1743,11 @@ public class ChangeIT extends AbstractDaemonTest { in.subject = "Create a change on new branch from the API"; in.project = project.get(); in.newBranch = true; - ChangeInfo info = gApi - .changes() - .create(in) - .get(); + ChangeInfo info = gApi.changes().create(in).get(); assertThat(info.project).isEqualTo(in.project); assertThat(info.branch).isEqualTo(in.branch); assertThat(info.subject).isEqualTo(in.subject); - assertThat(Iterables.getOnlyElement(info.messages).message) - .isEqualTo("Uploaded patch set 1."); + assertThat(Iterables.getOnlyElement(info.messages).message).isEqualTo("Uploaded patch set 1."); } @Test @@ -2080,64 +1759,54 @@ public class ChangeIT extends AbstractDaemonTest { in.newBranch = true; exception.expect(ResourceConflictException.class); - gApi.changes() - .create(in) - .get(); + gApi.changes().create(in).get(); } @Test public void createNewPatchSetOnVisibleDraftPatchSet() throws Exception { // Clone separate repositories of the same project as admin and as user - TestRepository adminTestRepo = - cloneProject(project, admin); - TestRepository userTestRepo = - cloneProject(project, user); + TestRepository adminTestRepo = cloneProject(project, admin); + TestRepository userTestRepo = cloneProject(project, user); // Create change as admin - PushOneCommit push = pushFactory.create( - db, admin.getIdent(), adminTestRepo); + PushOneCommit push = pushFactory.create(db, admin.getIdent(), adminTestRepo); PushOneCommit.Result r1 = push.to("refs/for/master"); r1.assertOkStatus(); // Amend draft as admin - PushOneCommit.Result r2 = amendChange( - r1.getChangeId(), "refs/drafts/master", admin, adminTestRepo); + PushOneCommit.Result r2 = + amendChange(r1.getChangeId(), "refs/drafts/master", admin, adminTestRepo); r2.assertOkStatus(); // Add user as reviewer to make this patch set visible AddReviewerInput in = new AddReviewerInput(); in.reviewer = user.email; - gApi.changes() - .id(r1.getChangeId()) - .addReviewer(in); + gApi.changes().id(r1.getChangeId()).addReviewer(in); // Fetch change GitUtil.fetch(userTestRepo, r2.getPatchSet().getRefName() + ":ps"); userTestRepo.reset("ps"); // Amend change as user - PushOneCommit.Result r3 = amendChange( - r2.getChangeId(), "refs/drafts/master", user, userTestRepo); + PushOneCommit.Result r3 = + amendChange(r2.getChangeId(), "refs/drafts/master", user, userTestRepo); r3.assertOkStatus(); } @Test public void createNewPatchSetOnInvisibleDraftPatchSet() throws Exception { // Clone separate repositories of the same project as admin and as user - TestRepository adminTestRepo = - cloneProject(project, admin); - TestRepository userTestRepo = - cloneProject(project, user); + TestRepository adminTestRepo = cloneProject(project, admin); + TestRepository userTestRepo = cloneProject(project, user); // Create change as admin - PushOneCommit push = pushFactory.create( - db, admin.getIdent(), adminTestRepo); + PushOneCommit push = pushFactory.create(db, admin.getIdent(), adminTestRepo); PushOneCommit.Result r1 = push.to("refs/for/master"); r1.assertOkStatus(); // Amend draft as admin - PushOneCommit.Result r2 = amendChange( - r1.getChangeId(), "refs/drafts/master", admin, adminTestRepo); + PushOneCommit.Result r2 = + amendChange(r1.getChangeId(), "refs/drafts/master", admin, adminTestRepo); r2.assertOkStatus(); // Fetch change @@ -2145,10 +1814,8 @@ public class ChangeIT extends AbstractDaemonTest { userTestRepo.reset("ps"); // Amend change as user - PushOneCommit.Result r3 = amendChange( - r1.getChangeId(), "refs/for/master", user, userTestRepo); - r3.assertErrorStatus("cannot add patch set to " - + r3.getChange().change().getChangeId() + "."); + PushOneCommit.Result r3 = amendChange(r1.getChangeId(), "refs/for/master", user, userTestRepo); + r3.assertErrorStatus("cannot add patch set to " + r3.getChange().change().getChangeId() + "."); } @Test @@ -2157,18 +1824,14 @@ public class ChangeIT extends AbstractDaemonTest { Project.NameKey p = createProject("addPatchSet1"); // Clone separate repositories of the same project as admin and as user - TestRepository adminTestRepo = - cloneProject(p, admin); - TestRepository userTestRepo = - cloneProject(p, user); + TestRepository adminTestRepo = cloneProject(p, admin); + TestRepository userTestRepo = cloneProject(p, user); // Block default permission - block(Permission.ADD_PATCH_SET, - REGISTERED_USERS, "refs/for/*", p); + block(Permission.ADD_PATCH_SET, REGISTERED_USERS, "refs/for/*", p); // Create change as admin - PushOneCommit push = pushFactory.create( - db, admin.getIdent(), adminTestRepo); + PushOneCommit push = pushFactory.create(db, admin.getIdent(), adminTestRepo); PushOneCommit.Result r1 = push.to("refs/for/master"); r1.assertOkStatus(); @@ -2177,10 +1840,8 @@ public class ChangeIT extends AbstractDaemonTest { userTestRepo.reset("ps"); // Amend change as user - PushOneCommit.Result r2 = - amendChange(r1.getChangeId(), "refs/for/master", user, userTestRepo); - r2.assertErrorStatus("cannot add patch set to " - + r1.getChange().getId().id + "."); + PushOneCommit.Result r2 = amendChange(r1.getChangeId(), "refs/for/master", user, userTestRepo); + r2.assertErrorStatus("cannot add patch set to " + r1.getChange().getId().id + "."); } @Test @@ -2190,8 +1851,7 @@ public class ChangeIT extends AbstractDaemonTest { TestRepository userTestRepo = cloneProject(project, user); // Create change as admin - PushOneCommit push = pushFactory.create( - db, admin.getIdent(), adminTestRepo); + PushOneCommit push = pushFactory.create(db, admin.getIdent(), adminTestRepo); PushOneCommit.Result r1 = push.to("refs/for/master"); r1.assertOkStatus(); @@ -2200,8 +1860,7 @@ public class ChangeIT extends AbstractDaemonTest { userTestRepo.reset("ps"); // Amend change as user - PushOneCommit.Result r2 = amendChange( - r1.getChangeId(), "refs/for/master", user, userTestRepo); + PushOneCommit.Result r2 = amendChange(r1.getChangeId(), "refs/for/master", user, userTestRepo); r2.assertOkStatus(); } @@ -2216,8 +1875,7 @@ public class ChangeIT extends AbstractDaemonTest { block(Permission.ADD_PATCH_SET, REGISTERED_USERS, "refs/for/*", p); // Create change as admin - PushOneCommit push = - pushFactory.create(db, admin.getIdent(), adminTestRepo); + PushOneCommit push = pushFactory.create(db, admin.getIdent(), adminTestRepo); PushOneCommit.Result r1 = push.to("refs/for/master"); r1.assertOkStatus(); @@ -2226,8 +1884,8 @@ public class ChangeIT extends AbstractDaemonTest { adminTestRepo.reset("ps"); // Amend change as admin - PushOneCommit.Result r2 = amendChange( - r1.getChangeId(), "refs/for/master", admin, adminTestRepo); + PushOneCommit.Result r2 = + amendChange(r1.getChangeId(), "refs/for/master", admin, adminTestRepo); r2.assertOkStatus(); } @@ -2238,25 +1896,21 @@ public class ChangeIT extends AbstractDaemonTest { TestRepository userTestRepo = cloneProject(project, user); // Create change as admin - PushOneCommit push = pushFactory.create( - db, admin.getIdent(), adminTestRepo); + PushOneCommit push = pushFactory.create(db, admin.getIdent(), adminTestRepo); PushOneCommit.Result r1 = push.to("refs/drafts/master"); r1.assertOkStatus(); // Add user as reviewer AddReviewerInput in = new AddReviewerInput(); in.reviewer = user.email; - gApi.changes() - .id(r1.getChangeId()) - .addReviewer(in); + gApi.changes().id(r1.getChangeId()).addReviewer(in); // Fetch change GitUtil.fetch(userTestRepo, r1.getPatchSet().getRefName() + ":ps"); userTestRepo.reset("ps"); // Amend change as user - PushOneCommit.Result r2 = amendChange( - r1.getChangeId(), "refs/for/master", user, userTestRepo); + PushOneCommit.Result r2 = amendChange(r1.getChangeId(), "refs/for/master", user, userTestRepo); r2.assertOkStatus(); } @@ -2272,27 +1926,23 @@ public class ChangeIT extends AbstractDaemonTest { block(Permission.ADD_PATCH_SET, REGISTERED_USERS, "refs/for/*", p); // Create change as admin - PushOneCommit push = pushFactory.create( - db, admin.getIdent(), adminTestRepo); + PushOneCommit push = pushFactory.create(db, admin.getIdent(), adminTestRepo); PushOneCommit.Result r1 = push.to("refs/drafts/master"); r1.assertOkStatus(); // Add user as reviewer AddReviewerInput in = new AddReviewerInput(); in.reviewer = user.email; - gApi.changes() - .id(r1.getChangeId()) - .addReviewer(in); + gApi.changes().id(r1.getChangeId()).addReviewer(in); // Fetch change GitUtil.fetch(userTestRepo, r1.getPatchSet().getRefName() + ":ps"); userTestRepo.reset("ps"); // Amend change as user - PushOneCommit.Result r2 = amendChange( - r1.getChangeId(), "refs/drafts/master", user, userTestRepo); - r2.assertErrorStatus("cannot add patch set to " - + r1.getChange().getId().id + "."); + PushOneCommit.Result r2 = + amendChange(r1.getChangeId(), "refs/drafts/master", user, userTestRepo); + r2.assertErrorStatus("cannot add patch set to " + r1.getChange().getId().id + "."); } @Test @@ -2311,9 +1961,10 @@ public class ChangeIT extends AbstractDaemonTest { // push a commit into dev branch createBranch(new Branch.NameKey(project, "dev")); - PushOneCommit.Result changeA = pushFactory - .create(db, user.getIdent(), testRepo, "change A", "A.txt", "A content") - .to("refs/heads/dev"); + PushOneCommit.Result changeA = + pushFactory + .create(db, user.getIdent(), testRepo, "change A", "A.txt", "A content") + .to("refs/heads/dev"); changeA.assertOkStatus(); MergeInput mergeInput = new MergeInput(); mergeInput.source = "dev"; @@ -2321,15 +1972,18 @@ public class ChangeIT extends AbstractDaemonTest { in.merge = mergeInput; in.subject = "update change by merge ps2"; gApi.changes().id(changeId).createMergePatchSet(in); - ChangeInfo changeInfo = gApi.changes().id(changeId) - .get(EnumSet.of(ListChangesOption.ALL_REVISIONS, - ListChangesOption.CURRENT_COMMIT, - ListChangesOption.CURRENT_REVISION)); + ChangeInfo changeInfo = + gApi.changes() + .id(changeId) + .get( + EnumSet.of( + ListChangesOption.ALL_REVISIONS, + ListChangesOption.CURRENT_COMMIT, + ListChangesOption.CURRENT_REVISION)); assertThat(changeInfo.revisions.size()).isEqualTo(2); assertThat(changeInfo.subject).isEqualTo(in.subject); - assertThat( - changeInfo.revisions.get(changeInfo.currentRevision).commit.parents - .get(0).commit).isEqualTo(parent); + assertThat(changeInfo.revisions.get(changeInfo.currentRevision).commit.parents.get(0).commit) + .isEqualTo(parent); } @Test @@ -2349,9 +2003,10 @@ public class ChangeIT extends AbstractDaemonTest { // push a commit into dev branch createBranch(new Branch.NameKey(project, "dev")); - PushOneCommit.Result changeA = pushFactory - .create(db, user.getIdent(), testRepo, "change A", "A.txt", "A content") - .to("refs/heads/dev"); + PushOneCommit.Result changeA = + pushFactory + .create(db, user.getIdent(), testRepo, "change A", "A.txt", "A content") + .to("refs/heads/dev"); changeA.assertOkStatus(); MergeInput mergeInput = new MergeInput(); mergeInput.source = "dev"; @@ -2360,27 +2015,27 @@ public class ChangeIT extends AbstractDaemonTest { in.subject = "update change by merge ps2 inherit parent of ps1"; in.inheritParent = true; gApi.changes().id(changeId).createMergePatchSet(in); - ChangeInfo changeInfo = gApi.changes().id(changeId) - .get(EnumSet.of(ListChangesOption.ALL_REVISIONS, - ListChangesOption.CURRENT_COMMIT, - ListChangesOption.CURRENT_REVISION)); + ChangeInfo changeInfo = + gApi.changes() + .id(changeId) + .get( + EnumSet.of( + ListChangesOption.ALL_REVISIONS, + ListChangesOption.CURRENT_COMMIT, + ListChangesOption.CURRENT_REVISION)); assertThat(changeInfo.revisions.size()).isEqualTo(2); assertThat(changeInfo.subject).isEqualTo(in.subject); - assertThat( - changeInfo.revisions.get(changeInfo.currentRevision).commit.parents - .get(0).commit).isEqualTo(parent); - assertThat( - changeInfo.revisions.get(changeInfo.currentRevision).commit.parents - .get(0).commit).isNotEqualTo(currentMaster.getCommit().getName()); + assertThat(changeInfo.revisions.get(changeInfo.currentRevision).commit.parents.get(0).commit) + .isEqualTo(parent); + assertThat(changeInfo.revisions.get(changeInfo.currentRevision).commit.parents.get(0).commit) + .isNotEqualTo(currentMaster.getCommit().getName()); } @Test public void checkLabelsForOpenChange() throws Exception { PushOneCommit.Result r = createChange(); - ChangeInfo change = gApi.changes() - .id(r.getChangeId()) - .get(); + ChangeInfo change = gApi.changes().id(r.getChangeId()).get(); assertThat(change.status).isEqualTo(ChangeStatus.NEW); assertThat(change.labels.keySet()).containsExactly("Code-Review"); assertThat(change.permittedLabels.keySet()).containsExactly("Code-Review"); @@ -2389,20 +2044,14 @@ public class ChangeIT extends AbstractDaemonTest { ProjectConfig cfg = projectCache.checkedGet(project).getConfig(); LabelType verified = Util.verified(); cfg.getLabelSections().put(verified.getName(), verified); - AccountGroup.UUID registeredUsers = - systemGroupBackend.getGroup(REGISTERED_USERS).getUUID(); + AccountGroup.UUID registeredUsers = systemGroupBackend.getGroup(REGISTERED_USERS).getUUID(); String heads = RefNames.REFS_HEADS + "*"; - Util.allow(cfg, Permission.forLabel(verified.getName()), -1, 1, - registeredUsers, heads); + Util.allow(cfg, Permission.forLabel(verified.getName()), -1, 1, registeredUsers, heads); saveProjectConfig(project, cfg); - change = gApi.changes() - .id(r.getChangeId()) - .get(); - assertThat(change.labels.keySet()) - .containsExactly("Code-Review", "Verified"); - assertThat(change.permittedLabels.keySet()) - .containsExactly("Code-Review", "Verified"); + change = gApi.changes().id(r.getChangeId()).get(); + assertThat(change.labels.keySet()).containsExactly("Code-Review", "Verified"); + assertThat(change.permittedLabels.keySet()).containsExactly("Code-Review", "Verified"); assertPermitted(change, "Code-Review", -2, -1, 0, 1, 2); assertPermitted(change, "Verified", -1, 0, 1); @@ -2410,19 +2059,15 @@ public class ChangeIT extends AbstractDaemonTest { gApi.changes() .id(r.getChangeId()) .revision(r.getCommit().name()) - .review(new ReviewInput().label( - verified.getName(), verified.getMax().getValue())); + .review(new ReviewInput().label(verified.getName(), verified.getMax().getValue())); // remove label and assert that it's no longer returned for existing // changes, even if there is an approval for it cfg.getLabelSections().remove(verified.getName()); - Util.remove(cfg, Permission.forLabel(verified.getName()), registeredUsers, - heads); + Util.remove(cfg, Permission.forLabel(verified.getName()), registeredUsers, heads); saveProjectConfig(project, cfg); - change = gApi.changes() - .id(r.getChangeId()) - .get(); + change = gApi.changes().id(r.getChangeId()).get(); assertThat(change.labels.keySet()).containsExactly("Code-Review"); assertThat(change.permittedLabels.keySet()).containsExactly("Code-Review"); } @@ -2430,18 +2075,10 @@ public class ChangeIT extends AbstractDaemonTest { @Test public void checkLabelsForMergedChange() throws Exception { PushOneCommit.Result r = createChange(); - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .review(ReviewInput.approve()); - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .submit(); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve()); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).submit(); - ChangeInfo change = gApi.changes() - .id(r.getChangeId()) - .get(); + ChangeInfo change = gApi.changes().id(r.getChangeId()).get(); assertThat(change.status).isEqualTo(ChangeStatus.MERGED); assertThat(change.labels.keySet()).containsExactly("Code-Review"); assertThat(change.permittedLabels.keySet()).containsExactly("Code-Review"); @@ -2451,20 +2088,14 @@ public class ChangeIT extends AbstractDaemonTest { ProjectConfig cfg = projectCache.checkedGet(project).getConfig(); LabelType verified = Util.verified(); cfg.getLabelSections().put(verified.getName(), verified); - AccountGroup.UUID registeredUsers = - systemGroupBackend.getGroup(REGISTERED_USERS).getUUID(); + AccountGroup.UUID registeredUsers = systemGroupBackend.getGroup(REGISTERED_USERS).getUUID(); String heads = RefNames.REFS_HEADS + "*"; - Util.allow(cfg, Permission.forLabel(verified.getName()), -1, 1, - registeredUsers, heads); + Util.allow(cfg, Permission.forLabel(verified.getName()), -1, 1, registeredUsers, heads); saveProjectConfig(project, cfg); - change = gApi.changes() - .id(r.getChangeId()) - .get(); - assertThat(change.labels.keySet()) - .containsExactly("Code-Review", "Verified"); - assertThat(change.permittedLabels.keySet()) - .containsExactly("Code-Review", "Verified"); + change = gApi.changes().id(r.getChangeId()).get(); + assertThat(change.labels.keySet()).containsExactly("Code-Review", "Verified"); + assertThat(change.permittedLabels.keySet()).containsExactly("Code-Review", "Verified"); assertPermitted(change, "Code-Review", 2); assertPermitted(change, "Verified", 0, 1); @@ -2472,16 +2103,17 @@ public class ChangeIT extends AbstractDaemonTest { // no longer returned GitUtil.fetch(testRepo, RefNames.REFS_CONFIG + ":config"); testRepo.reset("config"); - PushOneCommit push2 = pushFactory.create(db, admin.getIdent(), testRepo, - "Ignore Verified", - "rules.pl", - "submit_rule(submit(CR)) :-\n" - + " gerrit:max_with_block(-2, 2, 'Code-Review', CR)."); + PushOneCommit push2 = + pushFactory.create( + db, + admin.getIdent(), + testRepo, + "Ignore Verified", + "rules.pl", + "submit_rule(submit(CR)) :-\n" + " gerrit:max_with_block(-2, 2, 'Code-Review', CR)."); push2.to(RefNames.REFS_CONFIG); - change = gApi.changes() - .id(r.getChangeId()) - .get(); + change = gApi.changes().id(r.getChangeId()).get(); assertPermitted(change, "Code-Review", 2); assertPermitted(change, "Verified"); @@ -2491,14 +2123,10 @@ public class ChangeIT extends AbstractDaemonTest { gApi.changes() .id(r.getChangeId()) .revision(r.getCommit().name()) - .review(new ReviewInput().label( - verified.getName(), verified.getMax().getValue())); + .review(new ReviewInput().label(verified.getName(), verified.getMax().getValue())); - change = gApi.changes() - .id(r.getChangeId()) - .get(); - assertThat(change.labels.keySet()) - .containsExactly("Code-Review", "Verified"); + change = gApi.changes().id(r.getChangeId()).get(); + assertThat(change.labels.keySet()).containsExactly("Code-Review", "Verified"); assertPermitted(change, "Code-Review", 2); assertPermitted(change, "Verified"); @@ -2506,73 +2134,63 @@ public class ChangeIT extends AbstractDaemonTest { // changes, even if there is an approval for it cfg = projectCache.checkedGet(project).getConfig(); cfg.getLabelSections().remove(verified.getName()); - Util.remove(cfg, Permission.forLabel(verified.getName()), registeredUsers, - heads); + Util.remove(cfg, Permission.forLabel(verified.getName()), registeredUsers, heads); saveProjectConfig(project, cfg); - change = gApi.changes() - .id(r.getChangeId()) - .get(); + change = gApi.changes().id(r.getChangeId()).get(); assertThat(change.labels.keySet()).containsExactly("Code-Review"); assertThat(change.permittedLabels.keySet()).containsExactly("Code-Review"); assertPermitted(change, "Code-Review", 2); } @Test - public void checkLabelsForMergedChangeWithNonAuthorCodeReview() - throws Exception { + public void checkLabelsForMergedChangeWithNonAuthorCodeReview() throws Exception { // Configure Non-Author-Code-Review RevCommit oldHead = getRemoteHead(); GitUtil.fetch(testRepo, RefNames.REFS_CONFIG + ":config"); testRepo.reset("config"); - PushOneCommit push2 = pushFactory.create(db, admin.getIdent(), testRepo, - "Configure Non-Author-Code-Review", - "rules.pl", - "submit_rule(S) :-\n" - + " gerrit:default_submit(X),\n" - + " X =.. [submit | Ls],\n" - + " add_non_author_approval(Ls, R),\n" - + " S =.. [submit | R].\n" - + "\n" - + "add_non_author_approval(S1, S2) :-\n" - + " gerrit:commit_author(A),\n" - + " gerrit:commit_label(label('Code-Review', 2), R),\n" - + " R \\= A, !,\n" - + " S2 = [label('Non-Author-Code-Review', ok(R)) | S1].\n" - + "add_non_author_approval(S1," - + " [label('Non-Author-Code-Review', need(_)) | S1])."); + PushOneCommit push2 = + pushFactory.create( + db, + admin.getIdent(), + testRepo, + "Configure Non-Author-Code-Review", + "rules.pl", + "submit_rule(S) :-\n" + + " gerrit:default_submit(X),\n" + + " X =.. [submit | Ls],\n" + + " add_non_author_approval(Ls, R),\n" + + " S =.. [submit | R].\n" + + "\n" + + "add_non_author_approval(S1, S2) :-\n" + + " gerrit:commit_author(A),\n" + + " gerrit:commit_label(label('Code-Review', 2), R),\n" + + " R \\= A, !,\n" + + " S2 = [label('Non-Author-Code-Review', ok(R)) | S1].\n" + + "add_non_author_approval(S1," + + " [label('Non-Author-Code-Review', need(_)) | S1])."); push2.to(RefNames.REFS_CONFIG); testRepo.reset(oldHead); // Allow user to approve ProjectConfig cfg = projectCache.checkedGet(project).getConfig(); - AccountGroup.UUID registeredUsers = - systemGroupBackend.getGroup(REGISTERED_USERS).getUUID(); + AccountGroup.UUID registeredUsers = systemGroupBackend.getGroup(REGISTERED_USERS).getUUID(); String heads = RefNames.REFS_HEADS + "*"; - Util.allow(cfg, Permission.forLabel(Util.codeReview().getName()), -2, 2, - registeredUsers, heads); + Util.allow( + cfg, Permission.forLabel(Util.codeReview().getName()), -2, 2, registeredUsers, heads); saveProjectConfig(project, cfg); PushOneCommit.Result r = createChange(); setApiUser(user); - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .review(ReviewInput.approve()); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve()); setApiUser(admin); - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .submit(); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).submit(); - ChangeInfo change = gApi.changes() - .id(r.getChangeId()) - .get(); + ChangeInfo change = gApi.changes().id(r.getChangeId()).get(); assertThat(change.status).isEqualTo(ChangeStatus.MERGED); - assertThat(change.labels.keySet()).containsExactly("Code-Review", - "Non-Author-Code-Review"); + assertThat(change.labels.keySet()).containsExactly("Code-Review", "Non-Author-Code-Review"); assertThat(change.permittedLabels.keySet()).containsExactly("Code-Review"); assertPermitted(change, "Code-Review", 0, 1, 2); } @@ -2585,9 +2203,7 @@ public class ChangeIT extends AbstractDaemonTest { PushOneCommit.Result result = push.to("refs/heads/master"); result.assertOkStatus(); - ChangeInfo change = gApi.changes() - .id(r.getChangeId()) - .get(); + ChangeInfo change = gApi.changes().id(r.getChangeId()).get(); assertThat(change.status).isEqualTo(ChangeStatus.MERGED); assertThat(change.labels.keySet()).containsExactly("Code-Review"); assertPermitted(change, "Code-Review", 0, 1, 2); @@ -2596,13 +2212,9 @@ public class ChangeIT extends AbstractDaemonTest { @Test public void checkLabelsForAbandonedChange() throws Exception { PushOneCommit.Result r = createChange(); - gApi.changes() - .id(r.getChangeId()) - .abandon(); + gApi.changes().id(r.getChangeId()).abandon(); - ChangeInfo change = gApi.changes() - .id(r.getChangeId()) - .get(); + ChangeInfo change = gApi.changes().id(r.getChangeId()).get(); assertThat(change.status).isEqualTo(ChangeStatus.ABANDONED); assertThat(change.labels).isEmpty(); assertThat(change.permittedLabels).isEmpty(); @@ -2619,9 +2231,7 @@ public class ChangeIT extends AbstractDaemonTest { gApi.changes().id(triplet).addReviewer(user.username); - ChangeInfo c = gApi.changes() - .id(triplet) - .get(EnumSet.of(ListChangesOption.DETAILED_LABELS)); + ChangeInfo c = gApi.changes().id(triplet).get(EnumSet.of(ListChangesOption.DETAILED_LABELS)); LabelInfo codeReview = c.labels.get("Code-Review"); assertThat(codeReview.all).hasSize(1); ApprovalInfo approval = codeReview.all.get(0); @@ -2632,14 +2242,16 @@ public class ChangeIT extends AbstractDaemonTest { assertThat(approval.permittedVotingRange.max).isEqualTo(1); ProjectConfig cfg = projectCache.checkedGet(project).getConfig(); - Util.allow(cfg, - Permission.forLabel("Code-Review"), minPermittedValue, maxPermittedValue, - REGISTERED_USERS, heads); + Util.allow( + cfg, + Permission.forLabel("Code-Review"), + minPermittedValue, + maxPermittedValue, + REGISTERED_USERS, + heads); saveProjectConfig(project, cfg); - c = gApi.changes() - .id(triplet) - .get(EnumSet.of(ListChangesOption.DETAILED_LABELS)); + c = gApi.changes().id(triplet).get(EnumSet.of(ListChangesOption.DETAILED_LABELS)); codeReview = c.labels.get("Code-Review"); assertThat(codeReview.all).hasSize(1); approval = codeReview.all.get(0); @@ -2660,9 +2272,7 @@ public class ChangeIT extends AbstractDaemonTest { gApi.changes().id(triplet).addReviewer(user.username); - ChangeInfo c = gApi.changes() - .id(triplet) - .get(EnumSet.of(ListChangesOption.DETAILED_LABELS)); + ChangeInfo c = gApi.changes().id(triplet).get(EnumSet.of(ListChangesOption.DETAILED_LABELS)); LabelInfo codeReview = c.labels.get("Code-Review"); assertThat(codeReview.all).hasSize(1); ApprovalInfo approval = codeReview.all.get(0); @@ -2670,31 +2280,24 @@ public class ChangeIT extends AbstractDaemonTest { assertThat(approval.permittedVotingRange).isNull(); } - private static Iterable getReviewers( - Collection r) { + private static Iterable getReviewers(Collection r) { return Iterables.transform(r, a -> new Account.Id(a._accountId)); } - private ChangeResource parseResource(PushOneCommit.Result r) - throws Exception { - List ctls = changeFinder.find( - r.getChangeId(), atrScope.get().getUser()); + private ChangeResource parseResource(PushOneCommit.Result r) throws Exception { + List ctls = changeFinder.find(r.getChangeId(), atrScope.get().getUser()); assertThat(ctls).hasSize(1); return changeResourceFactory.create(ctls.get(0)); } - private void setChangeStatus(Change.Id id, Change.Status newStatus) - throws Exception { - try (BatchUpdate batchUpdate = updateFactory - .create(db, project, atrScope.get().getUser(), TimeUtil.nowTs())) { + private void setChangeStatus(Change.Id id, Change.Status newStatus) throws Exception { + try (BatchUpdate batchUpdate = + updateFactory.create(db, project, atrScope.get().getUser(), TimeUtil.nowTs())) { batchUpdate.addOp(id, new ChangeStatusUpdateOp(newStatus)); batchUpdate.execute(); } - ChangeStatus changeStatus = gApi.changes() - .id(id.get()) - .get() - .status; + ChangeStatus changeStatus = gApi.changes().id(id.get()).get().status; assertThat(changeStatus).isEqualTo(newStatus.asChangeStatus()); } @@ -2706,8 +2309,7 @@ public class ChangeIT extends AbstractDaemonTest { } @Override - public boolean updateChange(BatchUpdate.ChangeContext ctx) - throws Exception { + public boolean updateChange(BatchUpdate.ChangeContext ctx) throws Exception { Change change = ctx.getChange(); // Change status in database. diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/MergeListIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/MergeListIT.java index 2f9b4aa015..1acd71c418 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/MergeListIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/MergeListIT.java @@ -30,16 +30,14 @@ import com.google.gerrit.extensions.common.CommitInfo; import com.google.gerrit.extensions.common.DiffInfo; import com.google.gerrit.extensions.restapi.BinaryResult; import com.google.gerrit.extensions.restapi.ResourceConflictException; - +import java.io.ByteArrayOutputStream; +import java.util.List; +import java.util.Set; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.revwalk.RevCommit; import org.junit.Before; import org.junit.Test; -import java.io.ByteArrayOutputStream; -import java.util.List; -import java.util.Set; - @NoHttpd public class MergeListIT extends AbstractDaemonTest { @@ -54,35 +52,60 @@ public class MergeListIT extends AbstractDaemonTest { public void setup() throws Exception { ObjectId initial = repo().exactRef(HEAD).getLeaf().getObjectId(); - PushOneCommit.Result gp1 = pushFactory - .create(db, admin.getIdent(), testRepo, "grand parent 1", - ImmutableMap.of("foo", "foo-1.1", "bar", "bar-1.1")) - .to("refs/for/master"); + PushOneCommit.Result gp1 = + pushFactory + .create( + db, + admin.getIdent(), + testRepo, + "grand parent 1", + ImmutableMap.of("foo", "foo-1.1", "bar", "bar-1.1")) + .to("refs/for/master"); grandParent1 = gp1.getCommit(); - PushOneCommit.Result p1 = pushFactory - .create(db, admin.getIdent(), testRepo, "parent 1", - ImmutableMap.of("foo", "foo-1.2", "bar", "bar-1.2")) - .to("refs/for/master"); + PushOneCommit.Result p1 = + pushFactory + .create( + db, + admin.getIdent(), + testRepo, + "parent 1", + ImmutableMap.of("foo", "foo-1.2", "bar", "bar-1.2")) + .to("refs/for/master"); parent1 = p1.getCommit(); // reset HEAD in order to create a sibling of the first change testRepo.reset(initial); - PushOneCommit.Result gp2 = pushFactory - .create(db, admin.getIdent(), testRepo, "grand parent 2", - ImmutableMap.of("foo", "foo-2.1", "bar", "bar-2.1")) - .to("refs/for/master"); + PushOneCommit.Result gp2 = + pushFactory + .create( + db, + admin.getIdent(), + testRepo, + "grand parent 2", + ImmutableMap.of("foo", "foo-2.1", "bar", "bar-2.1")) + .to("refs/for/master"); grandParent2 = gp2.getCommit(); - PushOneCommit.Result p2 = pushFactory - .create(db, admin.getIdent(), testRepo, "parent 2", - ImmutableMap.of("foo", "foo-2.2", "bar", "bar-2.2")) - .to("refs/for/master"); + PushOneCommit.Result p2 = + pushFactory + .create( + db, + admin.getIdent(), + testRepo, + "parent 2", + ImmutableMap.of("foo", "foo-2.2", "bar", "bar-2.2")) + .to("refs/for/master"); parent2 = p2.getCommit(); - PushOneCommit m = pushFactory.create(db, admin.getIdent(), testRepo, - "merge", ImmutableMap.of("foo", "foo-1", "bar", "bar-2")); + PushOneCommit m = + pushFactory.create( + db, + admin.getIdent(), + testRepo, + "merge", + ImmutableMap.of("foo", "foo-1", "bar", "bar-2")); m.setParents(ImmutableList.of(p1.getCommit(), p2.getCommit())); PushOneCommit.Result result = m.to("refs/for/master"); result.assertOkStatus(); @@ -97,8 +120,7 @@ public class MergeListIT extends AbstractDaemonTest { assertThat(mergeList.get(0).commit).isEqualTo(parent2.name()); assertThat(mergeList.get(1).commit).isEqualTo(grandParent2.name()); - mergeList = current(changeId).getMergeList() - .withUninterestingParent(2).get(); + mergeList = current(changeId).getMergeList().withUninterestingParent(2).get(); assertThat(mergeList).hasSize(2); assertThat(mergeList.get(0).commit).isEqualTo(parent1.name()); assertThat(mergeList.get(1).commit).isEqualTo(grandParent1.name()); @@ -110,8 +132,7 @@ public class MergeListIT extends AbstractDaemonTest { ByteArrayOutputStream os = new ByteArrayOutputStream(); bin.writeTo(os); String content = new String(os.toByteArray(), UTF_8); - assertThat(content).isEqualTo( - getMergeListContent(parent2, grandParent2)); + assertThat(content).isEqualTo(getMergeListContent(parent2, grandParent2)); } @Test @@ -120,59 +141,44 @@ public class MergeListIT extends AbstractDaemonTest { assertThat(getFiles(changeId, 1)).contains(MERGE_LIST); assertThat(getFiles(changeId, 2)).contains(MERGE_LIST); - assertThat(getFiles(createChange().getChangeId())) - .doesNotContain(MERGE_LIST); + assertThat(getFiles(createChange().getChangeId())).doesNotContain(MERGE_LIST); } @Test public void getDiffForMergeList() throws Exception { DiffInfo diff = getMergeListDiff(changeId); - assertDiffForNewFile(diff, merge, MERGE_LIST, - getMergeListContent(parent2, grandParent2)); + assertDiffForNewFile(diff, merge, MERGE_LIST, getMergeListContent(parent2, grandParent2)); diff = getMergeListDiff(changeId, 1); - assertDiffForNewFile(diff, merge, MERGE_LIST, - getMergeListContent(parent2, grandParent2)); + assertDiffForNewFile(diff, merge, MERGE_LIST, getMergeListContent(parent2, grandParent2)); diff = getMergeListDiff(changeId, 2); - assertDiffForNewFile(diff, merge, MERGE_LIST, - getMergeListContent(parent1, grandParent1)); + assertDiffForNewFile(diff, merge, MERGE_LIST, getMergeListContent(parent1, grandParent1)); } @Test public void editMergeList() throws Exception { - gApi.changes() - .id(changeId) - .edit() - .create(); + gApi.changes().id(changeId).edit().create(); exception.expect(ResourceConflictException.class); exception.expectMessage("Invalid path: " + MERGE_LIST); - gApi.changes() - .id(changeId) - .edit() - .modifyFile(MERGE_LIST, RawInputUtil.create("new content")); + gApi.changes().id(changeId).edit().modifyFile(MERGE_LIST, RawInputUtil.create("new content")); } @Test public void deleteMergeList() throws Exception { - gApi.changes() - .id(changeId) - .edit() - .create(); + gApi.changes().id(changeId).edit().create(); exception.expect(ResourceConflictException.class); exception.expectMessage("no changes were made"); - gApi.changes() - .id(changeId) - .edit() - .deleteFile(MERGE_LIST); + gApi.changes().id(changeId).edit().deleteFile(MERGE_LIST); } private String getMergeListContent(RevCommit... commits) { StringBuilder mergeList = new StringBuilder("Merge List:\n\n"); for (RevCommit c : commits) { - mergeList.append("* ") + mergeList + .append("* ") .append(c.abbreviate(8).name()) .append(" ") .append(c.getShortMessage()) @@ -193,14 +199,11 @@ public class MergeListIT extends AbstractDaemonTest { return current(changeId).file(MERGE_LIST).diff(); } - private DiffInfo getMergeListDiff(String changeId, int parent) - throws Exception { + private DiffInfo getMergeListDiff(String changeId, int parent) throws Exception { return current(changeId).file(MERGE_LIST).diff(parent); } private RevisionApi current(String changeId) throws Exception { - return gApi.changes() - .id(changeId) - .current(); + return gApi.changes().id(changeId).current(); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/StickyApprovalsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/StickyApprovalsIT.java index 32a7c9e698..94f84945e3 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/StickyApprovalsIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/StickyApprovalsIT.java @@ -46,7 +46,9 @@ import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gerrit.reviewdb.client.RefNames; import com.google.gerrit.server.git.ProjectConfig; import com.google.gerrit.server.project.Util; - +import java.util.EnumSet; +import java.util.List; +import java.util.Set; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.PersonIdent; @@ -54,10 +56,6 @@ import org.eclipse.jgit.revwalk.RevCommit; import org.junit.Before; import org.junit.Test; -import java.util.EnumSet; -import java.util.List; -import java.util.Set; - @NoHttpd public class StickyApprovalsIT extends AbstractDaemonTest { @Before @@ -67,7 +65,9 @@ public class StickyApprovalsIT extends AbstractDaemonTest { // Overwrite "Code-Review" label that is inherited from All-Projects. // This way changes to the "Code Review" label don't affect other tests. LabelType codeReview = - category("Code-Review", value(2, "Looks good to me, approved"), + category( + "Code-Review", + value(2, "Looks good to me, approved"), value(1, "Looks good to me, but someone else must approve"), value(0, "No score"), value(-1, "I would prefer that you didn't submit this"), @@ -75,25 +75,23 @@ public class StickyApprovalsIT extends AbstractDaemonTest { codeReview.setCopyAllScoresIfNoChange(false); cfg.getLabelSections().put(codeReview.getName(), codeReview); - LabelType verified = category("Verified", value(1, "Passes"), - value(0, "No score"), value(-1, "Failed")); + LabelType verified = + category("Verified", value(1, "Passes"), value(0, "No score"), value(-1, "Failed")); verified.setCopyAllScoresIfNoChange(false); cfg.getLabelSections().put(verified.getName(), verified); - AccountGroup.UUID registeredUsers = - systemGroupBackend.getGroup(REGISTERED_USERS).getUUID(); + AccountGroup.UUID registeredUsers = systemGroupBackend.getGroup(REGISTERED_USERS).getUUID(); String heads = RefNames.REFS_HEADS + "*"; - Util.allow(cfg, Permission.forLabel(Util.codeReview().getName()), -2, 2, - registeredUsers, heads); - Util.allow(cfg, Permission.forLabel(Util.verified().getName()), -1, 1, - registeredUsers, heads); + Util.allow( + cfg, Permission.forLabel(Util.codeReview().getName()), -2, 2, registeredUsers, heads); + Util.allow(cfg, Permission.forLabel(Util.verified().getName()), -1, 1, registeredUsers, heads); saveProjectConfig(project, cfg); } @Test public void notSticky() throws Exception { - assertNotSticky(EnumSet.of(REWORK, TRIVIAL_REBASE, NO_CODE_CHANGE, - MERGE_FIRST_PARENT_UPDATE, NO_CHANGE)); + assertNotSticky( + EnumSet.of(REWORK, TRIVIAL_REBASE, NO_CODE_CHANGE, MERGE_FIRST_PARENT_UPDATE, NO_CHANGE)); } @Test @@ -102,8 +100,8 @@ public class StickyApprovalsIT extends AbstractDaemonTest { cfg.getLabelSections().get("Code-Review").setCopyMinScore(true); saveProjectConfig(project, cfg); - for (ChangeKind changeKind : EnumSet.of(REWORK, TRIVIAL_REBASE, - NO_CODE_CHANGE, MERGE_FIRST_PARENT_UPDATE, NO_CHANGE)) { + for (ChangeKind changeKind : + EnumSet.of(REWORK, TRIVIAL_REBASE, NO_CODE_CHANGE, MERGE_FIRST_PARENT_UPDATE, NO_CHANGE)) { testRepo.reset(getRemoteHead()); String changeId = createChange(changeKind); @@ -123,8 +121,8 @@ public class StickyApprovalsIT extends AbstractDaemonTest { cfg.getLabelSections().get("Code-Review").setCopyMaxScore(true); saveProjectConfig(project, cfg); - for (ChangeKind changeKind : EnumSet.of(REWORK, TRIVIAL_REBASE, - NO_CODE_CHANGE, MERGE_FIRST_PARENT_UPDATE, NO_CHANGE)) { + for (ChangeKind changeKind : + EnumSet.of(REWORK, TRIVIAL_REBASE, NO_CODE_CHANGE, MERGE_FIRST_PARENT_UPDATE, NO_CHANGE)) { testRepo.reset(getRemoteHead()); String changeId = createChange(changeKind); @@ -141,8 +139,7 @@ public class StickyApprovalsIT extends AbstractDaemonTest { @Test public void stickyOnTrivialRebase() throws Exception { ProjectConfig cfg = projectCache.checkedGet(project).getConfig(); - cfg.getLabelSections().get("Code-Review") - .setCopyAllScoresOnTrivialRebase(true); + cfg.getLabelSections().get("Code-Review").setCopyAllScoresOnTrivialRebase(true); saveProjectConfig(project, cfg); String changeId = createChange(TRIVIAL_REBASE); @@ -159,8 +156,7 @@ public class StickyApprovalsIT extends AbstractDaemonTest { assertVotes(c, admin, 2, 0, TRIVIAL_REBASE); assertVotes(c, user, -2, 0, TRIVIAL_REBASE); - assertNotSticky( - EnumSet.of(REWORK, NO_CODE_CHANGE, MERGE_FIRST_PARENT_UPDATE)); + assertNotSticky(EnumSet.of(REWORK, NO_CODE_CHANGE, MERGE_FIRST_PARENT_UPDATE)); // check that votes are sticky when trivial rebase is done by cherry-pick testRepo.reset(getRemoteHead()); @@ -188,8 +184,7 @@ public class StickyApprovalsIT extends AbstractDaemonTest { @Test public void stickyOnNoCodeChange() throws Exception { ProjectConfig cfg = projectCache.checkedGet(project).getConfig(); - cfg.getLabelSections().get("Verified") - .setCopyAllScoresIfNoCodeChange(true); + cfg.getLabelSections().get("Verified").setCopyAllScoresIfNoCodeChange(true); saveProjectConfig(project, cfg); String changeId = createChange(NO_CODE_CHANGE); @@ -206,15 +201,13 @@ public class StickyApprovalsIT extends AbstractDaemonTest { assertVotes(c, admin, 0, 1, NO_CODE_CHANGE); assertVotes(c, user, 0, -1, NO_CODE_CHANGE); - assertNotSticky( - EnumSet.of(REWORK, TRIVIAL_REBASE, MERGE_FIRST_PARENT_UPDATE)); + assertNotSticky(EnumSet.of(REWORK, TRIVIAL_REBASE, MERGE_FIRST_PARENT_UPDATE)); } @Test public void stickyOnMergeFirstParentUpdate() throws Exception { ProjectConfig cfg = projectCache.checkedGet(project).getConfig(); - cfg.getLabelSections().get("Code-Review") - .setCopyAllScoresOnMergeFirstParentUpdate(true); + cfg.getLabelSections().get("Code-Review").setCopyAllScoresOnMergeFirstParentUpdate(true); saveProjectConfig(project, cfg); String changeId = createChange(MERGE_FIRST_PARENT_UPDATE); @@ -237,13 +230,12 @@ public class StickyApprovalsIT extends AbstractDaemonTest { @Test public void removedVotesNotSticky() throws Exception { ProjectConfig cfg = projectCache.checkedGet(project).getConfig(); - cfg.getLabelSections().get("Code-Review") - .setCopyAllScoresOnTrivialRebase(true); + cfg.getLabelSections().get("Code-Review").setCopyAllScoresOnTrivialRebase(true); cfg.getLabelSections().get("Verified").setCopyAllScoresIfNoCodeChange(true); saveProjectConfig(project, cfg); - for (ChangeKind changeKind : EnumSet.of(REWORK, TRIVIAL_REBASE, - NO_CODE_CHANGE, MERGE_FIRST_PARENT_UPDATE, NO_CHANGE)) { + for (ChangeKind changeKind : + EnumSet.of(REWORK, TRIVIAL_REBASE, NO_CODE_CHANGE, MERGE_FIRST_PARENT_UPDATE, NO_CHANGE)) { testRepo.reset(getRemoteHead()); String changeId = createChange(changeKind); @@ -267,10 +259,8 @@ public class StickyApprovalsIT extends AbstractDaemonTest { @Test public void stickyAcrossMultiplePatchSets() throws Exception { ProjectConfig cfg = projectCache.checkedGet(project).getConfig(); - cfg.getLabelSections().get("Code-Review") - .setCopyMaxScore(true); - cfg.getLabelSections().get("Verified") - .setCopyAllScoresIfNoCodeChange(true); + cfg.getLabelSections().get("Code-Review").setCopyMaxScore(true); + cfg.getLabelSections().get("Verified").setCopyAllScoresIfNoCodeChange(true); saveProjectConfig(project, cfg); String changeId = createChange(REWORK); @@ -290,10 +280,8 @@ public class StickyApprovalsIT extends AbstractDaemonTest { @Test public void copyMinMaxAcrossMultiplePatchSets() throws Exception { ProjectConfig cfg = projectCache.checkedGet(project).getConfig(); - cfg.getLabelSections().get("Code-Review") - .setCopyMaxScore(true); - cfg.getLabelSections().get("Code-Review") - .setCopyMinScore(true); + cfg.getLabelSections().get("Code-Review").setCopyMaxScore(true); + cfg.getLabelSections().get("Code-Review").setCopyMinScore(true); saveProjectConfig(project, cfg); // Vote max score on PS1 @@ -332,8 +320,7 @@ public class StickyApprovalsIT extends AbstractDaemonTest { public void deleteStickyVote() throws Exception { String label = "Code-Review"; ProjectConfig cfg = projectCache.checkedGet(project).getConfig(); - cfg.getLabelSections().get(label) - .setCopyMaxScore(true); + cfg.getLabelSections().get(label).setCopyMaxScore(true); saveProjectConfig(project, cfg); // Vote max score on PS1 @@ -349,10 +336,13 @@ public class StickyApprovalsIT extends AbstractDaemonTest { } private ChangeInfo detailedChange(String changeId) throws Exception { - return gApi.changes().id(changeId) - .get(EnumSet.of(ListChangesOption.DETAILED_LABELS, - ListChangesOption.CURRENT_REVISION, - ListChangesOption.CURRENT_COMMIT)); + return gApi.changes() + .id(changeId) + .get( + EnumSet.of( + ListChangesOption.DETAILED_LABELS, + ListChangesOption.CURRENT_REVISION, + ListChangesOption.CURRENT_COMMIT)); } private void assertNotSticky(Set changeKinds) throws Exception { @@ -384,8 +374,7 @@ public class StickyApprovalsIT extends AbstractDaemonTest { } } - private void updateChange(String changeId, ChangeKind changeKind) - throws Exception { + private void updateChange(String changeId, ChangeKind changeKind) throws Exception { switch (changeKind) { case NO_CODE_CHANGE: noCodeChange(changeId); @@ -410,7 +399,8 @@ public class StickyApprovalsIT extends AbstractDaemonTest { private void noCodeChange(String changeId) throws Exception { TestRepository.CommitBuilder commitBuilder = testRepo.amendRef("HEAD").insertChangeId(changeId.substring(1)); - commitBuilder.message("New subject " + System.nanoTime()) + commitBuilder + .message("New subject " + System.nanoTime()) .author(admin.getIdent()) .committer(new PersonIdent(admin.getIdent(), testRepo.getDate())); commitBuilder.create(); @@ -420,12 +410,12 @@ public class StickyApprovalsIT extends AbstractDaemonTest { private void noChange(String changeId) throws Exception { ChangeInfo change = gApi.changes().id(changeId).get(); - String commitMessage = - change.revisions.get(change.currentRevision).commit.message; + String commitMessage = change.revisions.get(change.currentRevision).commit.message; TestRepository.CommitBuilder commitBuilder = testRepo.amendRef("HEAD").insertChangeId(changeId.substring(1)); - commitBuilder.message(commitMessage) + commitBuilder + .message(commitMessage) .author(admin.getIdent()) .committer(new PersonIdent(admin.getIdent(), testRepo.getDate())); commitBuilder.create(); @@ -434,9 +424,15 @@ public class StickyApprovalsIT extends AbstractDaemonTest { } private void rework(String changeId) throws Exception { - PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo, - PushOneCommit.SUBJECT, PushOneCommit.FILE_NAME, - "new content " + System.nanoTime(), changeId); + PushOneCommit push = + pushFactory.create( + db, + admin.getIdent(), + testRepo, + PushOneCommit.SUBJECT, + PushOneCommit.FILE_NAME, + "new content " + System.nanoTime(), + changeId); push.to("refs/for/master").assertOkStatus(); assertThat(getChangeKind(changeId)).isEqualTo(REWORK); } @@ -445,41 +441,36 @@ public class StickyApprovalsIT extends AbstractDaemonTest { setApiUser(admin); testRepo.reset(getRemoteHead()); PushOneCommit push = - pushFactory.create(db, admin.getIdent(), testRepo, "Other Change", - "a" + System.nanoTime() + ".txt", PushOneCommit.FILE_CONTENT); + pushFactory.create( + db, + admin.getIdent(), + testRepo, + "Other Change", + "a" + System.nanoTime() + ".txt", + PushOneCommit.FILE_CONTENT); PushOneCommit.Result r = push.to("refs/for/master"); r.assertOkStatus(); - RevisionApi revision = gApi.changes() - .id(r.getChangeId()) - .current(); - ReviewInput in = new ReviewInput() - .label("Code-Review", 2) - .label("Verified", 1); + RevisionApi revision = gApi.changes().id(r.getChangeId()).current(); + ReviewInput in = new ReviewInput().label("Code-Review", 2).label("Verified", 1); revision.review(in); revision.submit(); - gApi.changes() - .id(changeId) - .current() - .rebase(); + gApi.changes().id(changeId).current().rebase(); assertThat(getChangeKind(changeId)).isEqualTo(TRIVIAL_REBASE); } private String createChangeForMergeCommit() throws Exception { ObjectId initial = repo().exactRef(HEAD).getLeaf().getObjectId(); - PushOneCommit.Result parent1 = - createChange("parent 1", "p1.txt", "content 1"); + PushOneCommit.Result parent1 = createChange("parent 1", "p1.txt", "content 1"); testRepo.reset(initial); - PushOneCommit.Result parent2 = - createChange("parent 2", "p2.txt", "content 2"); + PushOneCommit.Result parent2 = createChange("parent 2", "p2.txt", "content 2"); testRepo.reset(parent1.getCommit()); PushOneCommit merge = pushFactory.create(db, admin.getIdent(), testRepo); - merge.setParents( - ImmutableList.of(parent1.getCommit(), parent2.getCommit())); + merge.setParents(ImmutableList.of(parent1.getCommit(), parent2.getCommit())); PushOneCommit.Result result = merge.to("refs/for/master"); result.assertOkStatus(); return result.getChangeId(); @@ -490,17 +481,13 @@ public class StickyApprovalsIT extends AbstractDaemonTest { List parents = c.revisions.get(c.currentRevision).commit.parents; String parent1 = parents.get(0).commit; String parent2 = parents.get(1).commit; - RevCommit commitParent2 = - testRepo.getRevWalk().parseCommit(ObjectId.fromString(parent2)); + RevCommit commitParent2 = testRepo.getRevWalk().parseCommit(ObjectId.fromString(parent2)); testRepo.reset(parent1); - PushOneCommit.Result newParent1 = - createChange("new parent 1", "p1-1.txt", "content 1-1"); + PushOneCommit.Result newParent1 = createChange("new parent 1", "p1-1.txt", "content 1-1"); - PushOneCommit merge = - pushFactory.create(db, admin.getIdent(), testRepo, changeId); - merge.setParents( - ImmutableList.of(newParent1.getCommit(), commitParent2)); + PushOneCommit merge = pushFactory.create(db, admin.getIdent(), testRepo, changeId); + merge.setParents(ImmutableList.of(newParent1.getCommit(), commitParent2)); PushOneCommit.Result result = merge.to("refs/for/master"); result.assertOkStatus(); @@ -520,75 +507,66 @@ public class StickyApprovalsIT extends AbstractDaemonTest { } testRepo.reset(getRemoteHead()); - PushOneCommit.Result r = pushFactory - .create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, - "other.txt", "new content " + System.nanoTime()) - .to("refs/for/master"); + PushOneCommit.Result r = + pushFactory + .create( + db, + admin.getIdent(), + testRepo, + PushOneCommit.SUBJECT, + "other.txt", + "new content " + System.nanoTime()) + .to("refs/for/master"); r.assertOkStatus(); vote(admin, r.getChangeId(), 2, 1); merge(r); - String subject = TRIVIAL_REBASE.equals(changeKind) - ? PushOneCommit.SUBJECT - : "Reworked change " + System.nanoTime(); + String subject = + TRIVIAL_REBASE.equals(changeKind) + ? PushOneCommit.SUBJECT + : "Reworked change " + System.nanoTime(); CherryPickInput in = new CherryPickInput(); in.destination = "master"; - in.message = - String.format("%s\n\nChange-Id: %s", subject, changeId); - ChangeInfo c = gApi.changes() - .id(changeId) - .revision("current") - .cherryPick(in) - .get(); + in.message = String.format("%s\n\nChange-Id: %s", subject, changeId); + ChangeInfo c = gApi.changes().id(changeId).revision("current").cherryPick(in).get(); return c.changeId; } private ChangeKind getChangeKind(String changeId) throws Exception { - ChangeInfo c = gApi.changes().id(changeId) - .get(EnumSet.of(ListChangesOption.CURRENT_REVISION)); + ChangeInfo c = gApi.changes().id(changeId).get(EnumSet.of(ListChangesOption.CURRENT_REVISION)); return c.revisions.get(c.currentRevision).kind; } - private void vote(TestAccount user, String changeId, String label, int vote) - throws Exception { + private void vote(TestAccount user, String changeId, String label, int vote) throws Exception { setApiUser(user); - gApi.changes() - .id(changeId) - .current() - .review(new ReviewInput().label(label, vote)); + gApi.changes().id(changeId).current().review(new ReviewInput().label(label, vote)); } - private void vote(TestAccount user, String changeId, int codeReviewVote, - int verifiedVote) throws Exception { + private void vote(TestAccount user, String changeId, int codeReviewVote, int verifiedVote) + throws Exception { setApiUser(user); - ReviewInput in = new ReviewInput() - .label("Code-Review", codeReviewVote) - .label("Verified", verifiedVote); + ReviewInput in = + new ReviewInput().label("Code-Review", codeReviewVote).label("Verified", verifiedVote); gApi.changes().id(changeId).current().review(in); } - private void deleteVote(TestAccount user, String changeId, String label) - throws Exception { + private void deleteVote(TestAccount user, String changeId, String label) throws Exception { setApiUser(user); - gApi.changes() - .id(changeId) - .reviewer(user.getId().toString()) - .deleteVote(label); + gApi.changes().id(changeId).reviewer(user.getId().toString()).deleteVote(label); } - private void assertVotes(ChangeInfo c, TestAccount user, int codeReviewVote, - int verifiedVote) { + private void assertVotes(ChangeInfo c, TestAccount user, int codeReviewVote, int verifiedVote) { assertVotes(c, user, codeReviewVote, verifiedVote, null); } - private void assertVotes(ChangeInfo c, TestAccount user, int codeReviewVote, - int verifiedVote, ChangeKind changeKind) { + private void assertVotes( + ChangeInfo c, TestAccount user, int codeReviewVote, int verifiedVote, ChangeKind changeKind) { assertVotes(c, user, "Code-Review", codeReviewVote, changeKind); assertVotes(c, user, "Verified", verifiedVote, changeKind); } - private void assertVotes(ChangeInfo c, TestAccount user, String label, - int expectedVote, ChangeKind changeKind) { + private void assertVotes( + ChangeInfo c, TestAccount user, String label, int expectedVote, ChangeKind changeKind) { Integer vote = 0; if (c.labels.get(label) != null && c.labels.get(label).all != null) { for (ApprovalInfo approval : c.labels.get(label).all) { @@ -603,8 +581,6 @@ public class StickyApprovalsIT extends AbstractDaemonTest { if (changeKind != null) { name += "; changeKind = " + changeKind.name(); } - assertThat(vote) - .named(name) - .isEqualTo(expectedVote); + assertThat(vote).named(name).isEqualTo(expectedVote); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/SubmitTypeRuleIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/SubmitTypeRuleIT.java index f132e0d903..69f59a13f0 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/SubmitTypeRuleIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/SubmitTypeRuleIT.java @@ -38,7 +38,9 @@ import com.google.gerrit.reviewdb.client.RefNames; import com.google.gerrit.server.git.MetaDataUpdate; import com.google.gerrit.server.git.VersionedMetaData; import com.google.gerrit.testutil.ConfigSuite; - +import java.io.IOException; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.CommitBuilder; @@ -49,10 +51,6 @@ import org.eclipse.jgit.revwalk.RevCommit; import org.junit.Before; import org.junit.Test; -import java.io.IOException; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - @NoHttpd public class SubmitTypeRuleIT extends AbstractDaemonTest { @ConfigSuite.Default @@ -76,8 +74,7 @@ public class SubmitTypeRuleIT extends AbstractDaemonTest { } @Override - protected boolean onSave(CommitBuilder commit) - throws IOException, ConfigInvalidException { + protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException { TestSubmitRuleInput in = new TestSubmitRuleInput(); in.rule = rule; try { @@ -97,8 +94,7 @@ public class SubmitTypeRuleIT extends AbstractDaemonTest { @Before public void setUp() throws Exception { fileCounter = new AtomicInteger(); - gApi.projects().name(project.get()).branch("test") - .create(new BranchInput()); + gApi.projects().name(project.get()).branch("test").create(new BranchInput()); testChangeId = createChange("test", "test change").getChange().getId(); } @@ -113,36 +109,40 @@ public class SubmitTypeRuleIT extends AbstractDaemonTest { private static final String SUBMIT_TYPE_FROM_SUBJECT = "submit_type(fast_forward_only) :-" - + "gerrit:commit_message(M)," - + "regex_matches('.*FAST_FORWARD_ONLY.*', M)," - + "!.\n" - + "submit_type(merge_if_necessary) :-" - + "gerrit:commit_message(M)," - + "regex_matches('.*MERGE_IF_NECESSARY.*', M)," - + "!.\n" - + "submit_type(rebase_if_necessary) :-" - + "gerrit:commit_message(M)," - + "regex_matches('.*REBASE_IF_NECESSARY.*', M)," - + "!.\n" - + "submit_type(rebase_always) :-" - + "gerrit:commit_message(M)," - + "regex_matches('.*REBASE_ALWAYS.*', M)," - + "!.\n" - + "submit_type(merge_always) :-" - + "gerrit:commit_message(M)," - + "regex_matches('.*MERGE_ALWAYS.*', M)," - + "!.\n" - + "submit_type(cherry_pick) :-" - + "gerrit:commit_message(M)," - + "regex_matches('.*CHERRY_PICK.*', M)," - + "!.\n" - + "submit_type(T) :- gerrit:project_default_submit_type(T)."; + + "gerrit:commit_message(M)," + + "regex_matches('.*FAST_FORWARD_ONLY.*', M)," + + "!.\n" + + "submit_type(merge_if_necessary) :-" + + "gerrit:commit_message(M)," + + "regex_matches('.*MERGE_IF_NECESSARY.*', M)," + + "!.\n" + + "submit_type(rebase_if_necessary) :-" + + "gerrit:commit_message(M)," + + "regex_matches('.*REBASE_IF_NECESSARY.*', M)," + + "!.\n" + + "submit_type(rebase_always) :-" + + "gerrit:commit_message(M)," + + "regex_matches('.*REBASE_ALWAYS.*', M)," + + "!.\n" + + "submit_type(merge_always) :-" + + "gerrit:commit_message(M)," + + "regex_matches('.*MERGE_ALWAYS.*', M)," + + "!.\n" + + "submit_type(cherry_pick) :-" + + "gerrit:commit_message(M)," + + "regex_matches('.*CHERRY_PICK.*', M)," + + "!.\n" + + "submit_type(T) :- gerrit:project_default_submit_type(T)."; - private PushOneCommit.Result createChange(String dest, String subject) - throws Exception { - PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo, - subject, "file" + fileCounter.incrementAndGet(), - PushOneCommit.FILE_CONTENT); + private PushOneCommit.Result createChange(String dest, String subject) throws Exception { + PushOneCommit push = + pushFactory.create( + db, + admin.getIdent(), + testRepo, + subject, + "file" + fileCounter.incrementAndGet(), + PushOneCommit.FILE_CONTENT); PushOneCommit.Result r = push.to("refs/for/" + dest); r.assertOkStatus(); return r; @@ -197,8 +197,7 @@ public class SubmitTypeRuleIT extends AbstractDaemonTest { List log = log("master", 1); assertThat(log.get(0).getShortMessage()).isEqualTo("CHERRY_PICK 1"); assertThat(log.get(0).name()).isNotEqualTo(r.getCommit().name()); - assertThat(log.get(0).getFullMessage()) - .contains("Change-Id: " + r.getChangeId()); + assertThat(log.get(0).getFullMessage()).contains("Change-Id: " + r.getChangeId()); assertThat(log.get(0).getFullMessage()).contains("Reviewed-on: "); } @@ -226,8 +225,7 @@ public class SubmitTypeRuleIT extends AbstractDaemonTest { List branchLog = log("branch", 1); assertThat(branchLog.get(0).getParents()).hasLength(2); - assertThat(branchLog.get(0).getParent(1).name()) - .isEqualTo(r2.getCommit().name()); + assertThat(branchLog.get(0).getParent(1).name()).isEqualTo(r2.getCommit().name()); } @Test @@ -244,11 +242,16 @@ public class SubmitTypeRuleIT extends AbstractDaemonTest { gApi.changes().id(r2.getChangeId()).current().submit(); fail("Expected ResourceConflictException"); } catch (ResourceConflictException e) { - assertThat(e).hasMessage( - "Failed to submit 2 changes due to the following problems:\n" - + "Change " + r1.getChange().getId() + ": Change has submit type " - + "CHERRY_PICK, but previously chose submit type MERGE_IF_NECESSARY " - + "from change " + r2.getChange().getId() + " in the same batch"); + assertThat(e) + .hasMessage( + "Failed to submit 2 changes due to the following problems:\n" + + "Change " + + r1.getChange().getId() + + ": Change has submit type " + + "CHERRY_PICK, but previously chose submit type MERGE_IF_NECESSARY " + + "from change " + + r2.getChange().getId() + + " in the same batch"); } } @@ -261,9 +264,7 @@ public class SubmitTypeRuleIT extends AbstractDaemonTest { } } - private void assertSubmitType(SubmitType expected, String id) - throws Exception { - assertThat(gApi.changes().id(id).current().submitType()) - .isEqualTo(expected); + private void assertSubmitType(SubmitType expected, String id) throws Exception { + assertThat(gApi.changes().id(id).current().submitType()).isEqualTo(expected); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/config/DiffPreferencesIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/config/DiffPreferencesIT.java index 047305ca99..fd08838e24 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/config/DiffPreferencesIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/config/DiffPreferencesIT.java @@ -20,7 +20,6 @@ import static com.google.gerrit.acceptance.AssertUtil.assertPrefs; import com.google.gerrit.acceptance.AbstractDaemonTest; import com.google.gerrit.acceptance.NoHttpd; import com.google.gerrit.extensions.client.DiffPreferencesInfo; - import org.junit.Test; @NoHttpd @@ -28,8 +27,7 @@ public class DiffPreferencesIT extends AbstractDaemonTest { @Test public void getDiffPreferences() throws Exception { - DiffPreferencesInfo result = - gApi.config().server().getDefaultDiffPreferences(); + DiffPreferencesInfo result = gApi.config().server().getDefaultDiffPreferences(); assertPrefs(result, DiffPreferencesInfo.defaults()); } @@ -38,8 +36,7 @@ public class DiffPreferencesIT extends AbstractDaemonTest { int newLineLength = DiffPreferencesInfo.defaults().lineLength + 10; DiffPreferencesInfo update = new DiffPreferencesInfo(); update.lineLength = newLineLength; - DiffPreferencesInfo result = - gApi.config().server().setDefaultDiffPreferences(update); + DiffPreferencesInfo result = gApi.config().server().setDefaultDiffPreferences(update); assertThat(result.lineLength).named("lineLength").isEqualTo(newLineLength); result = gApi.config().server().getDefaultDiffPreferences(); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/config/GeneralPreferencesIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/config/GeneralPreferencesIT.java index 1dcdaedc35..23372463d4 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/config/GeneralPreferencesIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/config/GeneralPreferencesIT.java @@ -23,7 +23,6 @@ import com.google.gerrit.extensions.client.GeneralPreferencesInfo; import com.google.gerrit.reviewdb.client.RefNames; import com.google.gerrit.server.config.AllUsersName; import com.google.inject.Inject; - import org.eclipse.jgit.lib.RefUpdate; import org.eclipse.jgit.lib.Repository; import org.junit.After; @@ -31,8 +30,7 @@ import org.junit.Test; @NoHttpd public class GeneralPreferencesIT extends AbstractDaemonTest { - @Inject - private AllUsersName allUsers; + @Inject private AllUsersName allUsers; @After public void cleanUp() throws Exception { @@ -48,8 +46,7 @@ public class GeneralPreferencesIT extends AbstractDaemonTest { @Test public void getGeneralPreferences() throws Exception { - GeneralPreferencesInfo result = - gApi.config().server().getDefaultPreferences(); + GeneralPreferencesInfo result = gApi.config().server().getDefaultPreferences(); assertPrefs(result, GeneralPreferencesInfo.defaults(), "my"); } @@ -58,8 +55,7 @@ public class GeneralPreferencesIT extends AbstractDaemonTest { boolean newSignedOffBy = !GeneralPreferencesInfo.defaults().signedOffBy; GeneralPreferencesInfo update = new GeneralPreferencesInfo(); update.signedOffBy = newSignedOffBy; - GeneralPreferencesInfo result = - gApi.config().server().setDefaultPreferences(update); + GeneralPreferencesInfo result = gApi.config().server().setDefaultPreferences(update); assertThat(result.signedOffBy).named("signedOffBy").isEqualTo(newSignedOffBy); result = gApi.config().server().getDefaultPreferences(); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/config/ServerIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/config/ServerIT.java index 8646aff2da..88503bec6c 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/config/ServerIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/config/ServerIT.java @@ -19,14 +19,12 @@ import static com.google.common.truth.Truth.assertThat; import com.google.gerrit.acceptance.AbstractDaemonTest; import com.google.gerrit.acceptance.NoHttpd; import com.google.gerrit.common.Version; - import org.junit.Test; @NoHttpd public class ServerIT extends AbstractDaemonTest { @Test public void getVersion() throws Exception { - assertThat(gApi.config().server().getVersion()) - .isEqualTo(Version.getVersion()); + assertThat(gApi.config().server().getVersion()).isEqualTo(Version.getVersion()); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/group/GroupAssert.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/group/GroupAssert.java index 6c301da032..c9d5a8fa40 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/group/GroupAssert.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/group/GroupAssert.java @@ -20,18 +20,15 @@ import static com.google.common.truth.Truth.assert_; import com.google.gerrit.extensions.common.GroupInfo; import com.google.gerrit.extensions.restapi.Url; import com.google.gerrit.reviewdb.client.AccountGroup; - import java.util.Set; public class GroupAssert { public static void assertGroups(Iterable expected, Set actual) { for (String g : expected) { - assert_().withFailureMessage("missing group " + g) - .that(actual.remove(g)).isTrue(); + assert_().withFailureMessage("missing group " + g).that(actual.remove(g)).isTrue(); } - assert_().withFailureMessage("unexpected groups: " + actual) - .that(actual).isEmpty(); + assert_().withFailureMessage("unexpected groups: " + actual).that(actual).isEmpty(); } public static void assertGroupInfo(AccountGroup group, GroupInfo info) { diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/group/GroupsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/group/GroupsIT.java index 604d6bf837..a395132120 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/group/GroupsIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/group/GroupsIT.java @@ -43,15 +43,13 @@ import com.google.gerrit.extensions.restapi.Url; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gerrit.server.group.SystemGroupBackend; - -import org.junit.Test; - import java.sql.Timestamp; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; +import org.junit.Test; @NoHttpd public class GroupsIT extends AbstractDaemonTest { @@ -141,8 +139,7 @@ public class GroupsIT extends AbstractDaemonTest { } @Test - public void createDuplicateInternalGroupCaseSensitiveName_Conflict() - throws Exception { + public void createDuplicateInternalGroupCaseSensitiveName_Conflict() throws Exception { String dupGroupName = name("dupGroup"); gApi.groups().create(dupGroupName); exception.expect(ResourceConflictException.class); @@ -151,8 +148,7 @@ public class GroupsIT extends AbstractDaemonTest { } @Test - public void createDuplicateInternalGroupCaseInsensitiveName() - throws Exception { + public void createDuplicateInternalGroupCaseInsensitiveName() throws Exception { String dupGroupName = name("dupGroupA"); String dupGroupNameLowerCase = name("dupGroupA").toLowerCase(); gApi.groups().create(dupGroupName); @@ -162,8 +158,7 @@ public class GroupsIT extends AbstractDaemonTest { } @Test - public void createDuplicateSystemGroupCaseSensitiveName_Conflict() - throws Exception { + public void createDuplicateSystemGroupCaseSensitiveName_Conflict() throws Exception { String newGroupName = "Registered Users"; exception.expect(ResourceConflictException.class); exception.expectMessage("group 'Registered Users' already exists"); @@ -171,8 +166,7 @@ public class GroupsIT extends AbstractDaemonTest { } @Test - public void createDuplicateSystemGroupCaseInsensitiveName_Conflict() - throws Exception { + public void createDuplicateSystemGroupCaseInsensitiveName_Conflict() throws Exception { String newGroupName = "registered users"; exception.expect(ResourceConflictException.class); exception.expectMessage("group 'Registered Users' already exists"); @@ -181,8 +175,7 @@ public class GroupsIT extends AbstractDaemonTest { @Test @GerritConfig(name = "groups.global:Anonymous-Users.name", value = "All Users") - public void createGroupWithConfiguredNameOfSystemGroup_Conflict() - throws Exception { + public void createGroupWithConfiguredNameOfSystemGroup_Conflict() throws Exception { exception.expect(ResourceConflictException.class); exception.expectMessage("group 'All Users' already exists"); gApi.groups().create("all users"); @@ -190,8 +183,7 @@ public class GroupsIT extends AbstractDaemonTest { @Test @GerritConfig(name = "groups.global:Anonymous-Users.name", value = "All Users") - public void createGroupWithDefaultNameOfSystemGroup_Conflict() - throws Exception { + public void createGroupWithDefaultNameOfSystemGroup_Conflict() throws Exception { exception.expect(ResourceConflictException.class); exception.expectMessage("group name 'Anonymous Users' is reserved"); gApi.groups().create("anonymous users"); @@ -225,42 +217,34 @@ public class GroupsIT extends AbstractDaemonTest { testGetGroup(adminGroup.getId().get(), adminGroup); } - private void testGetGroup(Object id, AccountGroup expectedGroup) - throws Exception { + private void testGetGroup(Object id, AccountGroup expectedGroup) throws Exception { GroupInfo group = gApi.groups().id(id.toString()).get(); assertGroupInfo(expectedGroup, group); } @Test - @GerritConfig(name = "groups.global:Anonymous-Users.name", - value = "All Users") + @GerritConfig(name = "groups.global:Anonymous-Users.name", value = "All Users") public void getSystemGroupByConfiguredName() throws Exception { - GroupReference anonymousUsersGroup = - systemGroupBackend.getGroup(ANONYMOUS_USERS); + GroupReference anonymousUsersGroup = systemGroupBackend.getGroup(ANONYMOUS_USERS); assertThat(anonymousUsersGroup.getName()).isEqualTo("All Users"); - GroupInfo group = - gApi.groups().id(anonymousUsersGroup.getUUID().get()).get(); + GroupInfo group = gApi.groups().id(anonymousUsersGroup.getUUID().get()).get(); assertThat(group.name).isEqualTo(anonymousUsersGroup.getName()); group = gApi.groups().id(anonymousUsersGroup.getName()).get(); - assertThat(group.id) - .isEqualTo(Url.encode((anonymousUsersGroup.getUUID().get()))); + assertThat(group.id).isEqualTo(Url.encode((anonymousUsersGroup.getUUID().get()))); } @Test public void getSystemGroupByDefaultName() throws Exception { - GroupReference anonymousUsersGroup = - systemGroupBackend.getGroup(ANONYMOUS_USERS); + GroupReference anonymousUsersGroup = systemGroupBackend.getGroup(ANONYMOUS_USERS); GroupInfo group = gApi.groups().id("Anonymous Users").get(); assertThat(group.name).isEqualTo(anonymousUsersGroup.getName()); - assertThat(group.id) - .isEqualTo(Url.encode((anonymousUsersGroup.getUUID().get()))); + assertThat(group.id).isEqualTo(Url.encode((anonymousUsersGroup.getUUID().get()))); } @Test - @GerritConfig(name = "groups.global:Anonymous-Users.name", - value = "All Users") + @GerritConfig(name = "groups.global:Anonymous-Users.name", value = "All Users") public void getSystemGroupByDefaultName_NotFound() throws Exception { exception.expect(ResourceNotFoundException.class); gApi.groups().id("Anonymous-Users").get(); @@ -345,18 +329,15 @@ public class GroupsIT extends AbstractDaemonTest { String registeredUUID = SystemGroupBackend.REGISTERED_USERS.get(); // get owner - assertThat(Url.decode(gApi.groups().id(name).owner().id)) - .isEqualTo(info.id); + assertThat(Url.decode(gApi.groups().id(name).owner().id)).isEqualTo(info.id); // set owner by name gApi.groups().id(name).owner("Registered Users"); - assertThat(Url.decode(gApi.groups().id(name).owner().id)) - .isEqualTo(registeredUUID); + assertThat(Url.decode(gApi.groups().id(name).owner().id)).isEqualTo(registeredUUID); // set owner by UUID gApi.groups().id(name).owner(adminUUID); - assertThat(Url.decode(gApi.groups().id(name).owner().id)) - .isEqualTo(adminUUID); + assertThat(Url.decode(gApi.groups().id(name).owner().id)).isEqualTo(adminUUID); // set non existing owner exception.expect(UnprocessableEntityException.class); @@ -447,19 +428,17 @@ public class GroupsIT extends AbstractDaemonTest { @Test public void defaultGroupsCreated() throws Exception { Iterable names = gApi.groups().list().getAsMap().keySet(); - assertThat(names).containsAllOf("Administrators", "Non-Interactive Users") - .inOrder(); + assertThat(names).containsAllOf("Administrators", "Non-Interactive Users").inOrder(); } @Test public void listAllGroups() throws Exception { - List expectedGroups = groupCache.all().stream() - .map(a -> a.getName()) - .sorted() - .collect(toList()); + List expectedGroups = + groupCache.all().stream().map(a -> a.getName()).sorted().collect(toList()); assertThat(expectedGroups.size()).isAtLeast(2); assertThat(gApi.groups().list().getAsMap().keySet()) - .containsExactlyElementsIn(expectedGroups).inOrder(); + .containsExactlyElementsIn(expectedGroups) + .inOrder(); } @Test @@ -473,8 +452,7 @@ public class GroupsIT extends AbstractDaemonTest { gApi.groups().create(in); setApiUser(user); - assertThat(gApi.groups().list().getAsMap()) - .doesNotContainKey(newGroupName); + assertThat(gApi.groups().list().getAsMap()).doesNotContainKey(newGroupName); setApiUser(admin); gApi.groups().id(newGroupName).addMembers(user.username); @@ -493,8 +471,7 @@ public class GroupsIT extends AbstractDaemonTest { @Test public void allGroupInfoFieldsSetCorrectly() throws Exception { AccountGroup adminGroup = getFromCache("Administrators"); - Map groups = - gApi.groups().list().addGroup(adminGroup.getName()).getAsMap(); + Map groups = gApi.groups().list().addGroup(adminGroup.getName()).getAsMap(); assertThat(groups).hasSize(1); assertThat(groups).containsKey("Administrators"); assertGroupInfo(adminGroup, Iterables.getOnlyElement(groups.values())); @@ -544,8 +521,8 @@ public class GroupsIT extends AbstractDaemonTest { TestAccount groupOwner = accounts.user2(); GroupInput in = new GroupInput(); in.name = name("group"); - in.members = Collections.singleton(groupOwner).stream() - .map(u -> u.id.toString()).collect(toList()); + in.members = + Collections.singleton(groupOwner).stream().map(u -> u.id.toString()).collect(toList()); in.visibleToAll = true; GroupInfo group = gApi.groups().create(in).get(); @@ -564,53 +541,53 @@ public class GroupsIT extends AbstractDaemonTest { gApi.groups().id(group.id).index(); } - private void assertAuditEvent(GroupAuditEventInfo info, Type expectedType, - Account.Id expectedUser, Account.Id expectedMember) { + private void assertAuditEvent( + GroupAuditEventInfo info, + Type expectedType, + Account.Id expectedUser, + Account.Id expectedMember) { assertThat(info.user._accountId).isEqualTo(expectedUser.get()); assertThat(info.type).isEqualTo(expectedType); assertThat(info).isInstanceOf(UserMemberAuditEventInfo.class); - assertThat(((UserMemberAuditEventInfo) info).member._accountId).isEqualTo( - expectedMember.get()); + assertThat(((UserMemberAuditEventInfo) info).member._accountId).isEqualTo(expectedMember.get()); } - private void assertAuditEvent(GroupAuditEventInfo info, Type expectedType, - Account.Id expectedUser, String expectedMemberGroupName) { + private void assertAuditEvent( + GroupAuditEventInfo info, + Type expectedType, + Account.Id expectedUser, + String expectedMemberGroupName) { assertThat(info.user._accountId).isEqualTo(expectedUser.get()); assertThat(info.type).isEqualTo(expectedType); assertThat(info).isInstanceOf(GroupMemberAuditEventInfo.class); - assertThat(((GroupMemberAuditEventInfo) info).member.name).isEqualTo( - expectedMemberGroupName); + assertThat(((GroupMemberAuditEventInfo) info).member.name).isEqualTo(expectedMemberGroupName); } - private void assertMembers(String group, TestAccount... expectedMembers) - throws Exception { + private void assertMembers(String group, TestAccount... expectedMembers) throws Exception { assertMembers( gApi.groups().id(group).members(), TestAccount.names(expectedMembers).stream().toArray(String[]::new)); - assertAccountInfos( - Arrays.asList(expectedMembers), - gApi.groups().id(group).members()); + assertAccountInfos(Arrays.asList(expectedMembers), gApi.groups().id(group).members()); } - private void assertMembers(Iterable members, - String... expectedNames) { + private void assertMembers(Iterable members, String... expectedNames) { assertThat(Iterables.transform(members, i -> i.name)) - .containsExactlyElementsIn(Arrays.asList(expectedNames)).inOrder(); + .containsExactlyElementsIn(Arrays.asList(expectedNames)) + .inOrder(); } private void assertNoMembers(String group) throws Exception { assertThat(gApi.groups().id(group).members()).isEmpty(); } - private void assertIncludes(String group, String... expectedNames) - throws Exception { + private void assertIncludes(String group, String... expectedNames) throws Exception { assertIncludes(gApi.groups().id(group).includedGroups(), expectedNames); } - private static void assertIncludes( - Iterable includes, String... expectedNames) { + private static void assertIncludes(Iterable includes, String... expectedNames) { assertThat(Iterables.transform(includes, i -> i.name)) - .containsExactlyElementsIn(Arrays.asList(expectedNames)).inOrder(); + .containsExactlyElementsIn(Arrays.asList(expectedNames)) + .inOrder(); } private void assertNoIncludes(String group) throws Exception { diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java index 6892893709..e30e9b3ea3 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java @@ -29,45 +29,32 @@ import com.google.gerrit.extensions.client.SubmitType; import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.reviewdb.client.RefNames; - import org.eclipse.jgit.revwalk.RevCommit; import org.junit.Test; @NoHttpd -public class ProjectIT extends AbstractDaemonTest { +public class ProjectIT extends AbstractDaemonTest { @Test public void createProject() throws Exception { String name = name("foo"); - assertThat(name).isEqualTo( - gApi.projects() - .create(name) - .get() - .name); + assertThat(name).isEqualTo(gApi.projects().create(name).get().name); RevCommit head = getRemoteHead(name, RefNames.REFS_CONFIG); - eventRecorder.assertRefUpdatedEvents(name, RefNames.REFS_CONFIG, - null, head); + eventRecorder.assertRefUpdatedEvents(name, RefNames.REFS_CONFIG, null, head); - eventRecorder.assertRefUpdatedEvents(name, "refs/heads/master", - new String[]{}); + eventRecorder.assertRefUpdatedEvents(name, "refs/heads/master", new String[] {}); } @Test public void createProjectWithGitSuffix() throws Exception { String name = name("foo"); - assertThat(name).isEqualTo( - gApi.projects() - .create(name + ".git") - .get() - .name); + assertThat(name).isEqualTo(gApi.projects().create(name + ".git").get().name); RevCommit head = getRemoteHead(name, RefNames.REFS_CONFIG); - eventRecorder.assertRefUpdatedEvents(name, RefNames.REFS_CONFIG, - null, head); + eventRecorder.assertRefUpdatedEvents(name, RefNames.REFS_CONFIG, null, head); - eventRecorder.assertRefUpdatedEvents(name, "refs/heads/master", - new String[]{}); + eventRecorder.assertRefUpdatedEvents(name, "refs/heads/master", new String[] {}); } @Test @@ -76,19 +63,13 @@ public class ProjectIT extends AbstractDaemonTest { ProjectInput input = new ProjectInput(); input.name = name; input.createEmptyCommit = true; - assertThat(name).isEqualTo( - gApi.projects() - .create(input) - .get() - .name); + assertThat(name).isEqualTo(gApi.projects().create(input).get().name); RevCommit head = getRemoteHead(name, RefNames.REFS_CONFIG); - eventRecorder.assertRefUpdatedEvents(name, RefNames.REFS_CONFIG, - null, head); + eventRecorder.assertRefUpdatedEvents(name, RefNames.REFS_CONFIG, null, head); head = getRemoteHead(name, "refs/heads/master"); - eventRecorder.assertRefUpdatedEvents(name, "refs/heads/master", - null, head); + eventRecorder.assertRefUpdatedEvents(name, "refs/heads/master", null, head); } @Test @@ -97,9 +78,7 @@ public class ProjectIT extends AbstractDaemonTest { in.name = name("foo"); exception.expect(BadRequestException.class); exception.expectMessage("name must match input.name"); - gApi.projects() - .name("bar") - .create(in); + gApi.projects().name("bar").create(in); } @Test @@ -107,51 +86,37 @@ public class ProjectIT extends AbstractDaemonTest { ProjectInput in = new ProjectInput(); exception.expect(BadRequestException.class); exception.expectMessage("input.name is required"); - gApi.projects() - .create(in); + gApi.projects().create(in); } @Test public void createProjectDuplicate() throws Exception { ProjectInput in = new ProjectInput(); in.name = name("baz"); - gApi.projects() - .create(in); + gApi.projects().create(in); exception.expect(ResourceConflictException.class); exception.expectMessage("Project already exists"); - gApi.projects() - .create(in); + gApi.projects().create(in); } @Test public void createBranch() throws Exception { allow(Permission.READ, ANONYMOUS_USERS, "refs/*"); - gApi.projects() - .name(project.get()) - .branch("foo") - .create(new BranchInput()); + gApi.projects().name(project.get()).branch("foo").create(new BranchInput()); } @Test public void description() throws Exception { RevCommit initialHead = getRemoteHead(project, RefNames.REFS_CONFIG); - assertThat(gApi.projects() - .name(project.get()) - .description()) - .isEmpty(); + assertThat(gApi.projects().name(project.get()).description()).isEmpty(); DescriptionInput in = new DescriptionInput(); in.description = "new project description"; - gApi.projects() - .name(project.get()) - .description(in); - assertThat(gApi.projects() - .name(project.get()) - .description()) - .isEqualTo(in.description); + gApi.projects().name(project.get()).description(in); + assertThat(gApi.projects().name(project.get()).description()).isEqualTo(in.description); RevCommit updatedHead = getRemoteHead(project, RefNames.REFS_CONFIG); - eventRecorder.assertRefUpdatedEvents(project.get(), RefNames.REFS_CONFIG, - initialHead, updatedHead); + eventRecorder.assertRefUpdatedEvents( + project.get(), RefNames.REFS_CONFIG, initialHead, updatedHead); } @Test @@ -168,7 +133,7 @@ public class ProjectIT extends AbstractDaemonTest { assertThat(info.submitType).isEqualTo(SubmitType.CHERRY_PICK); RevCommit updatedHead = getRemoteHead(project, RefNames.REFS_CONFIG); - eventRecorder.assertRefUpdatedEvents(project.get(), RefNames.REFS_CONFIG, - initialHead, updatedHead); + eventRecorder.assertRefUpdatedEvents( + project.get(), RefNames.REFS_CONFIG, initialHead, updatedHead); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RevisionIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RevisionIT.java index d8fcc99e63..22a1f5d4ee 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RevisionIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RevisionIT.java @@ -72,14 +72,6 @@ import com.google.gerrit.server.change.GetRevisionActions; import com.google.gerrit.server.change.RevisionResource; import com.google.gerrit.server.query.change.ChangeData; import com.google.inject.Inject; - -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.PersonIdent; -import org.eclipse.jgit.lib.RefUpdate; -import org.eclipse.jgit.revwalk.RevCommit; -import org.eclipse.jgit.transport.RefSpec; -import org.junit.Test; - import java.io.ByteArrayOutputStream; import java.text.DateFormat; import java.text.SimpleDateFormat; @@ -93,11 +85,16 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Optional; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.PersonIdent; +import org.eclipse.jgit.lib.RefUpdate; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.transport.RefSpec; +import org.junit.Test; public class RevisionIT extends AbstractDaemonTest { - @Inject - private GetRevisionActions getRevisionActions; + @Inject private GetRevisionActions getRevisionActions; @Test public void reviewTriplet() throws Exception { @@ -111,51 +108,32 @@ public class RevisionIT extends AbstractDaemonTest { @Test public void reviewCurrent() throws Exception { PushOneCommit.Result r = createChange(); - gApi.changes() - .id(r.getChangeId()) - .current() - .review(ReviewInput.approve()); + gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve()); } @Test public void reviewNumber() throws Exception { PushOneCommit.Result r = createChange(); - gApi.changes() - .id(r.getChangeId()) - .revision(1) - .review(ReviewInput.approve()); + gApi.changes().id(r.getChangeId()).revision(1).review(ReviewInput.approve()); r = updateChange(r, "new content"); - gApi.changes() - .id(r.getChangeId()) - .revision(2) - .review(ReviewInput.approve()); + gApi.changes().id(r.getChangeId()).revision(2).review(ReviewInput.approve()); } @Test public void submit() throws Exception { PushOneCommit.Result r = createChange(); String changeId = project.get() + "~master~" + r.getChangeId(); - gApi.changes() - .id(changeId) - .current() - .review(ReviewInput.approve()); - gApi.changes() - .id(changeId) - .current() - .submit(); - assertThat(gApi.changes().id(changeId).get().status) - .isEqualTo(ChangeStatus.MERGED); + gApi.changes().id(changeId).current().review(ReviewInput.approve()); + gApi.changes().id(changeId).current().submit(); + assertThat(gApi.changes().id(changeId).get().status).isEqualTo(ChangeStatus.MERGED); } @Test public void postSubmitApproval() throws Exception { PushOneCommit.Result r = createChange(); String changeId = project.get() + "~master~" + r.getChangeId(); - gApi.changes() - .id(changeId) - .current() - .review(ReviewInput.recommend()); + gApi.changes().id(changeId).current().review(ReviewInput.recommend()); String label = "Code-Review"; ApprovalInfo approval = getApproval(changeId, label); @@ -163,66 +141,46 @@ public class RevisionIT extends AbstractDaemonTest { assertThat(approval.postSubmit).isNull(); // Submit by direct push. - git().push() - .setRefSpecs(new RefSpec(r.getCommit().name() + ":refs/heads/master")) - .call(); - assertThat(gApi.changes().id(changeId).get().status) - .isEqualTo(ChangeStatus.MERGED); + git().push().setRefSpecs(new RefSpec(r.getCommit().name() + ":refs/heads/master")).call(); + assertThat(gApi.changes().id(changeId).get().status).isEqualTo(ChangeStatus.MERGED); approval = getApproval(changeId, label); assertThat(approval.value).isEqualTo(1); assertThat(approval.postSubmit).isNull(); assertPermitted( - gApi.changes().id(changeId).get(EnumSet.of(DETAILED_LABELS)), - "Code-Review", 1, 2); + gApi.changes().id(changeId).get(EnumSet.of(DETAILED_LABELS)), "Code-Review", 1, 2); // Repeating the current label is allowed. Does not flip the postSubmit bit // due to deduplication codepath. - gApi.changes() - .id(changeId) - .current() - .review(ReviewInput.recommend()); + gApi.changes().id(changeId).current().review(ReviewInput.recommend()); approval = getApproval(changeId, label); assertThat(approval.value).isEqualTo(1); assertThat(approval.postSubmit).isNull(); // Reducing vote is not allowed. try { - gApi.changes() - .id(changeId) - .current() - .review(ReviewInput.dislike()); + gApi.changes().id(changeId).current().review(ReviewInput.dislike()); fail("expected ResourceConflictException"); } catch (ResourceConflictException e) { - assertThat(e).hasMessage( - "Cannot reduce vote on labels for closed change: Code-Review"); + assertThat(e).hasMessage("Cannot reduce vote on labels for closed change: Code-Review"); } approval = getApproval(changeId, label); assertThat(approval.value).isEqualTo(1); assertThat(approval.postSubmit).isNull(); // Increasing vote is allowed. - gApi.changes() - .id(changeId) - .current() - .review(ReviewInput.approve()); + gApi.changes().id(changeId).current().review(ReviewInput.approve()); approval = getApproval(changeId, label); assertThat(approval.value).isEqualTo(2); assertThat(approval.postSubmit).isTrue(); - assertPermitted( - gApi.changes().id(changeId).get(EnumSet.of(DETAILED_LABELS)), - "Code-Review", 2); + assertPermitted(gApi.changes().id(changeId).get(EnumSet.of(DETAILED_LABELS)), "Code-Review", 2); // Decreasing to previous post-submit vote is still not allowed. try { - gApi.changes() - .id(changeId) - .current() - .review(ReviewInput.dislike()); + gApi.changes().id(changeId).current().review(ReviewInput.dislike()); fail("expected ResourceConflictException"); } catch (ResourceConflictException e) { - assertThat(e).hasMessage( - "Cannot reduce vote on labels for closed change: Code-Review"); + assertThat(e).hasMessage("Cannot reduce vote on labels for closed change: Code-Review"); } approval = getApproval(changeId, label); assertThat(approval.value).isEqualTo(2); @@ -241,13 +199,15 @@ public class RevisionIT extends AbstractDaemonTest { revision(r).review(ReviewInput.recommend()); setApiUser(admin); - gApi.changes() - .id(changeId) - .reviewer(user.username) - .deleteVote("Code-Review"); - Optional crUser = get(changeId, DETAILED_LABELS) - .labels.get("Code-Review").all.stream() - .filter(a -> a._accountId == user.id.get()).findFirst(); + gApi.changes().id(changeId).reviewer(user.username).deleteVote("Code-Review"); + Optional crUser = + get(changeId, DETAILED_LABELS) + .labels + .get("Code-Review") + .all + .stream() + .filter(a -> a._accountId == user.id.get()) + .findFirst(); assertThat(crUser.isPresent()).isTrue(); assertThat(crUser.get().value).isEqualTo(0); @@ -271,8 +231,7 @@ public class RevisionIT extends AbstractDaemonTest { in.label("Code-Review", 0); exception.expect(ResourceConflictException.class); - exception.expectMessage( - "Cannot reduce vote on labels for closed change: Code-Review"); + exception.expectMessage("Cannot reduce vote on labels for closed change: Code-Review"); revision(r).review(in); } @@ -281,20 +240,14 @@ public class RevisionIT extends AbstractDaemonTest { public void approvalCopiedDuringSubmitIsNotPostSubmit() throws Exception { PushOneCommit.Result r = createChange(); Change.Id id = r.getChange().getId(); - gApi.changes() - .id(id.get()) - .current() - .review(ReviewInput.approve()); - gApi.changes() - .id(id.get()) - .current() - .submit(); + gApi.changes().id(id.get()).current().review(ReviewInput.approve()); + gApi.changes().id(id.get()).current().submit(); ChangeData cd = r.getChange(); assertThat(cd.patchSets()).hasSize(2); - PatchSetApproval psa = Iterators.getOnlyElement( - cd.currentApprovals().stream() - .filter(a -> !a.isLegacySubmit()).iterator()); + PatchSetApproval psa = + Iterators.getOnlyElement( + cd.currentApprovals().stream().filter(a -> !a.isLegacySubmit()).iterator()); assertThat(psa.getPatchSetId().get()).isEqualTo(2); assertThat(psa.getLabel()).isEqualTo("Code-Review"); assertThat(psa.getValue()).isEqualTo(2); @@ -313,10 +266,7 @@ public class RevisionIT extends AbstractDaemonTest { @Test public void deleteDraft() throws Exception { PushOneCommit.Result r = createDraft(); - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .delete(); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).delete(); } @Test @@ -325,27 +275,22 @@ public class RevisionIT extends AbstractDaemonTest { CherryPickInput in = new CherryPickInput(); in.destination = "foo"; in.message = "it goes to stable branch"; - gApi.projects() - .name(project.get()) - .branch(in.destination) - .create(new BranchInput()); - ChangeApi orig = gApi.changes() - .id(project.get() + "~master~" + r.getChangeId()); + gApi.projects().name(project.get()).branch(in.destination).create(new BranchInput()); + ChangeApi orig = gApi.changes().id(project.get() + "~master~" + r.getChangeId()); assertThat(orig.get().messages).hasSize(1); - ChangeApi cherry = orig.revision(r.getCommit().name()) - .cherryPick(in); + ChangeApi cherry = orig.revision(r.getCommit().name()).cherryPick(in); - Collection messages = gApi.changes() - .id(project.get() + "~master~" + r.getChangeId()) - .get().messages; + Collection messages = + gApi.changes().id(project.get() + "~master~" + r.getChangeId()).get().messages; assertThat(messages).hasSize(2); String cherryPickedRevision = cherry.get().currentRevision; - String expectedMessage = String.format( - "Patch Set 1: Cherry Picked\n\n" + - "This patchset was cherry picked to branch %s as commit %s", - in.destination, cherryPickedRevision); + String expectedMessage = + String.format( + "Patch Set 1: Cherry Picked\n\n" + + "This patchset was cherry picked to branch %s as commit %s", + in.destination, cherryPickedRevision); Iterator origIt = messages.iterator(); origIt.next(); @@ -368,15 +313,10 @@ public class RevisionIT extends AbstractDaemonTest { CherryPickInput in = new CherryPickInput(); in.destination = "foo"; in.message = "it goes to stable branch"; - gApi.projects() - .name(project.get()) - .branch(in.destination) - .create(new BranchInput()); - ChangeApi orig = gApi.changes() - .id(project.get() + "~master~" + r.getChangeId()); + gApi.projects().name(project.get()).branch(in.destination).create(new BranchInput()); + ChangeApi orig = gApi.changes().id(project.get() + "~master~" + r.getChangeId()); - ChangeApi cherry = orig.revision(r.getCommit().name()) - .cherryPick(in); + ChangeApi cherry = orig.revision(r.getCommit().name()).cherryPick(in); assertThat(cherry.get().topic).isNull(); cherry.current().review(ReviewInput.approve()); cherry.current().submit(); @@ -388,11 +328,12 @@ public class RevisionIT extends AbstractDaemonTest { CherryPickInput in = new CherryPickInput(); in.destination = "master"; in.message = "it generates a new patch set\n\nChange-Id: " + r.getChangeId(); - ChangeInfo cherryInfo = gApi.changes() - .id(project.get() + "~master~" + r.getChangeId()) - .revision(r.getCommit().name()) - .cherryPick(in) - .get(); + ChangeInfo cherryInfo = + gApi.changes() + .id(project.get() + "~master~" + r.getChangeId()) + .revision(r.getCommit().name()) + .cherryPick(in) + .get(); assertThat(cherryInfo.messages).hasSize(2); Iterator cherryIt = cherryInfo.messages.iterator(); assertThat(cherryIt.next().message).isEqualTo("Uploaded patch set 1."); @@ -412,16 +353,14 @@ public class RevisionIT extends AbstractDaemonTest { PushOneCommit.Result r1 = createChange(); // Push another new change (change 2) - String subject = "Test change\n\n" + - "Change-Id: Ideadbeefdeadbeefdeadbeefdeadbeefdeadbeef"; + String subject = "Test change\n\n" + "Change-Id: Ideadbeefdeadbeefdeadbeefdeadbeefdeadbeef"; PushOneCommit push = - pushFactory.create(db, admin.getIdent(), testRepo, subject, - "another_file.txt", "another content"); + pushFactory.create( + db, admin.getIdent(), testRepo, subject, "another_file.txt", "another content"); PushOneCommit.Result r2 = push.to("refs/for/master"); // Change 2's parent should be change 1 - assertThat(r2.getCommit().getParents()[0].name()) - .isEqualTo(r1.getCommit().name()); + assertThat(r2.getCommit().getParents()[0].name()).isEqualTo(r1.getCommit().name()); // Cherry pick change 2 onto the same branch triplet = project.get() + "~master~" + r2.getChangeId(); @@ -438,8 +377,8 @@ public class RevisionIT extends AbstractDaemonTest { // Parent of change 2 should now be the change that was merged, i.e. // change 2 is rebased onto the head of the master branch. - String newParent = cherryInfo.revisions.get(cherryInfo.currentRevision) - .commit.parents.get(0).commit; + String newParent = + cherryInfo.revisions.get(cherryInfo.currentRevision).commit.parents.get(0).commit; assertThat(newParent).isEqualTo(baseChange.getCommit().name()); } @@ -449,20 +388,14 @@ public class RevisionIT extends AbstractDaemonTest { CherryPickInput in = new CherryPickInput(); in.destination = "foo"; in.message = "it goes to stable branch"; - gApi.projects() - .name(project.get()) - .branch(in.destination) - .create(new BranchInput()); - ChangeApi orig = gApi.changes() - .id(project.get() + "~master~" + r.getChangeId()); + gApi.projects().name(project.get()).branch(in.destination).create(new BranchInput()); + ChangeApi orig = gApi.changes().id(project.get() + "~master~" + r.getChangeId()); assertThat(orig.get().messages).hasSize(1); - ChangeApi cherry = orig.revision(r.getCommit().name()) - .cherryPick(in); + ChangeApi cherry = orig.revision(r.getCommit().name()).cherryPick(in); - Collection messages = gApi.changes() - .id(project.get() + "~master~" + r.getChangeId()) - .get().messages; + Collection messages = + gApi.changes().id(project.get() + "~master~" + r.getChangeId()).get().messages; assertThat(messages).hasSize(2); assertThat(cherry.get().subject).contains(in.message); @@ -480,14 +413,16 @@ public class RevisionIT extends AbstractDaemonTest { CherryPickInput in = new CherryPickInput(); in.destination = "foo"; in.message = "it goes to stable branch"; - gApi.projects() - .name(project.get()) - .branch(in.destination) - .create(new BranchInput()); + gApi.projects().name(project.get()).branch(in.destination).create(new BranchInput()); PushOneCommit push = - pushFactory.create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, - PushOneCommit.FILE_NAME, "another content"); + pushFactory.create( + db, + admin.getIdent(), + testRepo, + PushOneCommit.SUBJECT, + PushOneCommit.FILE_NAME, + "another content"); push.to("refs/heads/foo"); String triplet = project.get() + "~master~" + r.getChangeId(); @@ -501,22 +436,20 @@ public class RevisionIT extends AbstractDaemonTest { @Test public void cherryPickToExistingChange() throws Exception { - PushOneCommit.Result r1 = pushFactory.create( - db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "a") - .to("refs/for/master"); + PushOneCommit.Result r1 = + pushFactory + .create(db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "a") + .to("refs/for/master"); String t1 = project.get() + "~master~" + r1.getChangeId(); BranchInput bin = new BranchInput(); bin.revision = r1.getCommit().getParent(0).name(); - gApi.projects() - .name(project.get()) - .branch("foo") - .create(bin); + gApi.projects().name(project.get()).branch("foo").create(bin); - PushOneCommit.Result r2 = pushFactory.create( - db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "b", - r1.getChangeId()) - .to("refs/for/foo"); + PushOneCommit.Result r2 = + pushFactory + .create(db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "b", r1.getChangeId()) + .to("refs/for/foo"); String t2 = project.get() + "~foo~" + r2.getChangeId(); gApi.changes().id(t2).abandon(); @@ -527,17 +460,17 @@ public class RevisionIT extends AbstractDaemonTest { gApi.changes().id(t1).current().cherryPick(in); fail(); } catch (ResourceConflictException e) { - assertThat(e.getMessage()).isEqualTo( - "Cannot create new patch set of change " + info(t2)._number - + " because it is abandoned"); + assertThat(e.getMessage()) + .isEqualTo( + "Cannot create new patch set of change " + + info(t2)._number + + " because it is abandoned"); } gApi.changes().id(t2).restore(); gApi.changes().id(t1).current().cherryPick(in); assertThat(get(t2).revisions).hasSize(2); - assertThat( - gApi.changes().id(t2).current().file(FILE_NAME).content().asString()) - .isEqualTo("a"); + assertThat(gApi.changes().id(t2).current().file(FILE_NAME).content().asString()).isEqualTo("a"); } @Test @@ -554,16 +487,15 @@ public class RevisionIT extends AbstractDaemonTest { cherryPickInput.destination = cherryPickBranchName; cherryPickInput.message = "Cherry-pick a merge commit to another branch"; - ChangeInfo cherryPickedChangeInfo = gApi.changes() - .id(mergeChangeResult.getChangeId()) - .current() - .cherryPick(cherryPickInput) - .get(); + ChangeInfo cherryPickedChangeInfo = + gApi.changes() + .id(mergeChangeResult.getChangeId()) + .current() + .cherryPick(cherryPickInput) + .get(); Map cherryPickedFilesByName = - cherryPickedChangeInfo.revisions - .get(cherryPickedChangeInfo.currentRevision) - .files; + cherryPickedChangeInfo.revisions.get(cherryPickedChangeInfo.currentRevision).files; assertThat(cherryPickedFilesByName).containsKey(parent2FileName); assertThat(cherryPickedFilesByName).doesNotContainKey(parent1FileName); } @@ -583,16 +515,15 @@ public class RevisionIT extends AbstractDaemonTest { cherryPickInput.message = "Cherry-pick a merge commit to another branch"; cherryPickInput.parent = 2; - ChangeInfo cherryPickedChangeInfo = gApi.changes() - .id(mergeChangeResult.getChangeId()) - .current() - .cherryPick(cherryPickInput) - .get(); + ChangeInfo cherryPickedChangeInfo = + gApi.changes() + .id(mergeChangeResult.getChangeId()) + .current() + .cherryPick(cherryPickInput) + .get(); Map cherryPickedFilesByName = - cherryPickedChangeInfo.revisions - .get(cherryPickedChangeInfo.currentRevision) - .files; + cherryPickedChangeInfo.revisions.get(cherryPickedChangeInfo.currentRevision).files; assertThat(cherryPickedFilesByName).containsKey(parent1FileName); assertThat(cherryPickedFilesByName).doesNotContainKey(parent2FileName); } @@ -613,12 +544,9 @@ public class RevisionIT extends AbstractDaemonTest { cherryPickInput.parent = 0; exception.expect(BadRequestException.class); - exception.expectMessage("Cherry Pick: Parent 0 does not exist. Please" - + " specify a parent in range [1, 2]."); - gApi.changes() - .id(mergeChangeResult.getChangeId()) - .current() - .cherryPick(cherryPickInput); + exception.expectMessage( + "Cherry Pick: Parent 0 does not exist. Please" + " specify a parent in range [1, 2]."); + gApi.changes().id(mergeChangeResult.getChangeId()).current().cherryPick(cherryPickInput); } @Test @@ -637,12 +565,9 @@ public class RevisionIT extends AbstractDaemonTest { cherryPickInput.parent = 3; exception.expect(BadRequestException.class); - exception.expectMessage("Cherry Pick: Parent 3 does not exist. Please" - + " specify a parent in range [1, 2]."); - gApi.changes() - .id(mergeChangeResult.getChangeId()) - .current() - .cherryPick(cherryPickInput); + exception.expectMessage( + "Cherry Pick: Parent 3 does not exist. Please" + " specify a parent in range [1, 2]."); + gApi.changes().id(mergeChangeResult.getChangeId()).current().cherryPick(cherryPickInput); } @Test @@ -653,10 +578,8 @@ public class RevisionIT extends AbstractDaemonTest { push = pushFactory.create(db, admin.getIdent(), testRepo); PushOneCommit.Result r2 = push.to("refs/for/master"); - boolean canRebase = gApi.changes() - .id(r2.getChangeId()) - .revision(r2.getCommit().name()) - .canRebase(); + boolean canRebase = + gApi.changes().id(r2.getChangeId()).revision(r2.getCommit().name()).canRebase(); assertThat(canRebase).isFalse(); merge(r2); @@ -664,10 +587,7 @@ public class RevisionIT extends AbstractDaemonTest { push = pushFactory.create(db, admin.getIdent(), testRepo); PushOneCommit.Result r3 = push.to("refs/for/master"); - canRebase = gApi.changes() - .id(r3.getChangeId()) - .revision(r3.getCommit().name()) - .canRebase(); + canRebase = gApi.changes().id(r3.getChangeId()).revision(r3.getCommit().name()).canRebase(); assertThat(canRebase).isTrue(); } @@ -676,24 +596,14 @@ public class RevisionIT extends AbstractDaemonTest { PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo); PushOneCommit.Result r = push.to("refs/for/master"); - gApi.changes() - .id(r.getChangeId()) - .current() - .setReviewed(PushOneCommit.FILE_NAME, true); + gApi.changes().id(r.getChangeId()).current().setReviewed(PushOneCommit.FILE_NAME, true); - assertThat(Iterables.getOnlyElement( - gApi.changes() - .id(r.getChangeId()) - .current() - .reviewed())).isEqualTo(PushOneCommit.FILE_NAME); + assertThat(Iterables.getOnlyElement(gApi.changes().id(r.getChangeId()).current().reviewed())) + .isEqualTo(PushOneCommit.FILE_NAME); - gApi.changes() - .id(r.getChangeId()) - .current() - .setReviewed(PushOneCommit.FILE_NAME, false); + gApi.changes().id(r.getChangeId()).current().setReviewed(PushOneCommit.FILE_NAME, false); - assertThat(gApi.changes().id(r.getChangeId()).current().reviewed()) - .isEmpty(); + assertThat(gApi.changes().id(r.getChangeId()).current().reviewed()).isEmpty(); } @Test @@ -701,8 +611,13 @@ public class RevisionIT extends AbstractDaemonTest { ObjectId initial = repo().exactRef(HEAD).getLeaf().getObjectId(); PushOneCommit push1 = - pushFactory.create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, - PushOneCommit.FILE_NAME, "push 1 content"); + pushFactory.create( + db, + admin.getIdent(), + testRepo, + PushOneCommit.SUBJECT, + PushOneCommit.FILE_NAME, + "push 1 content"); PushOneCommit.Result r1 = push1.to("refs/for/master"); assertMergeable(r1.getChangeId(), true); @@ -714,8 +629,13 @@ public class RevisionIT extends AbstractDaemonTest { assertThat(ru.forceUpdate()).isEqualTo(RefUpdate.Result.FORCED); PushOneCommit push2 = - pushFactory.create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, - PushOneCommit.FILE_NAME, "push 2 content"); + pushFactory.create( + db, + admin.getIdent(), + testRepo, + PushOneCommit.SUBJECT, + PushOneCommit.FILE_NAME, + "push 2 content"); PushOneCommit.Result r2 = push2.to("refs/for/master"); assertMergeable(r2.getChangeId(), false); // TODO(dborowitz): Test for other-branches. @@ -724,14 +644,10 @@ public class RevisionIT extends AbstractDaemonTest { @Test public void files() throws Exception { PushOneCommit.Result r = createChange(); - Map files = gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .files(); + Map files = + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).files(); assertThat(files).hasSize(2); - assertThat( - Iterables.all( - files.keySet(), f -> f.matches(FILE_NAME + '|' + COMMIT_MSG))) + assertThat(Iterables.all(files.keySet(), f -> f.matches(FILE_NAME + '|' + COMMIT_MSG))) .isTrue(); } @@ -740,28 +656,16 @@ public class RevisionIT extends AbstractDaemonTest { PushOneCommit.Result r = createMergeCommitChange("refs/for/master"); // list files against auto-merge - assertThat(gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .files() - .keySet() - ).containsExactly(COMMIT_MSG, MERGE_LIST, "foo", "bar"); + assertThat(gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).files().keySet()) + .containsExactly(COMMIT_MSG, MERGE_LIST, "foo", "bar"); // list files against parent 1 - assertThat(gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .files(1) - .keySet() - ).containsExactly(COMMIT_MSG, MERGE_LIST, "bar"); + assertThat(gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).files(1).keySet()) + .containsExactly(COMMIT_MSG, MERGE_LIST, "bar"); // list files against parent 2 - assertThat(gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .files(2) - .keySet() - ).containsExactly(COMMIT_MSG, MERGE_LIST, "foo"); + assertThat(gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).files(2).keySet()) + .containsExactly(COMMIT_MSG, MERGE_LIST, "foo"); } @Test @@ -773,16 +677,11 @@ public class RevisionIT extends AbstractDaemonTest { @Test public void diffDeletedFile() throws Exception { - pushFactory.create(db, admin.getIdent(), testRepo) - .to("refs/heads/master"); + pushFactory.create(db, admin.getIdent(), testRepo).to("refs/heads/master"); PushOneCommit.Result r = - pushFactory.create(db, admin.getIdent(), testRepo) - .rm("refs/for/master"); - DiffInfo diff = gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .file(FILE_NAME) - .diff(); + pushFactory.create(db, admin.getIdent(), testRepo).rm("refs/for/master"); + DiffInfo diff = + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).file(FILE_NAME).diff(); assertThat(diff.metaA.lines).isEqualTo(1); assertThat(diff.metaB).isNull(); } @@ -794,37 +693,21 @@ public class RevisionIT extends AbstractDaemonTest { DiffInfo diff; // automerge - diff = gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .file("foo") - .diff(); + diff = gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).file("foo").diff(); assertThat(diff.metaA.lines).isEqualTo(5); assertThat(diff.metaB.lines).isEqualTo(1); - diff = gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .file("bar") - .diff(); + diff = gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).file("bar").diff(); assertThat(diff.metaA.lines).isEqualTo(5); assertThat(diff.metaB.lines).isEqualTo(1); // parent 1 - diff = gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .file("bar") - .diff(1); + diff = gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).file("bar").diff(1); assertThat(diff.metaA.lines).isEqualTo(1); assertThat(diff.metaB.lines).isEqualTo(1); // parent 2 - diff = gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .file("foo") - .diff(2); + diff = gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).file("foo").diff(2); assertThat(diff.metaA.lines).isEqualTo(1); assertThat(diff.metaB.lines).isEqualTo(1); } @@ -832,26 +715,14 @@ public class RevisionIT extends AbstractDaemonTest { @Test public void description() throws Exception { PushOneCommit.Result r = createChange(); - assertThat(gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .description()).isEqualTo(""); - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .description("test"); - assertThat(gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .description()).isEqualTo("test"); - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .description(""); - assertThat(gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .description()).isEqualTo(""); + assertThat(gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).description()) + .isEqualTo(""); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).description("test"); + assertThat(gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).description()) + .isEqualTo("test"); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).description(""); + assertThat(gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).description()) + .isEqualTo(""); } @Test @@ -865,10 +736,14 @@ public class RevisionIT extends AbstractDaemonTest { public void contentType() throws Exception { PushOneCommit.Result r = createChange(); - String endPoint = "/changes/" + r.getChangeId() - + "/revisions/" + r.getCommit().name() - + "/files/" + FILE_NAME - + "/content"; + String endPoint = + "/changes/" + + r.getChangeId() + + "/revisions/" + + r.getCommit().name() + + "/files/" + + FILE_NAME + + "/content"; RestResponse response = adminRestSession.head(endPoint); response.assertOK(); assertThat(response.getContentType()).startsWith("text/plain"); @@ -892,51 +767,43 @@ public class RevisionIT extends AbstractDaemonTest { in.message = "nit: trailing whitespace"; in.path = FILE_NAME; - DraftApi draftApi = gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .createDraft(in); - assertThat(draftApi - .get() - .message) - .isEqualTo(in.message); - assertThat(gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .draft(draftApi.get().id) - .get() - .message) - .isEqualTo(in.message); - assertThat(gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .drafts()) - .hasSize(1); + DraftApi draftApi = + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).createDraft(in); + assertThat(draftApi.get().message).isEqualTo(in.message); + assertThat( + gApi.changes() + .id(r.getChangeId()) + .revision(r.getCommit().name()) + .draft(draftApi.get().id) + .get() + .message) + .isEqualTo(in.message); + assertThat(gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).drafts()) + .hasSize(1); in.message = "good catch!"; - assertThat(gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .draft(draftApi.get().id) - .update(in) - .message) - .isEqualTo(in.message); + assertThat( + gApi.changes() + .id(r.getChangeId()) + .revision(r.getCommit().name()) + .draft(draftApi.get().id) + .update(in) + .message) + .isEqualTo(in.message); - assertThat(gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .draft(draftApi.get().id) - .get() - .author - .email) - .isEqualTo(admin.email); + assertThat( + gApi.changes() + .id(r.getChangeId()) + .revision(r.getCommit().name()) + .draft(draftApi.get().id) + .get() + .author + .email) + .isEqualTo(admin.email); draftApi.delete(); - assertThat(gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .drafts()) - .isEmpty(); + assertThat(gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).drafts()) + .isEmpty(); } @Test @@ -951,25 +818,18 @@ public class RevisionIT extends AbstractDaemonTest { comments.put(FILE_NAME, Collections.singletonList(in)); reviewInput.comments = comments; reviewInput.message = "comment test"; - gApi.changes() - .id(r.getChangeId()) - .current() - .review(reviewInput); + gApi.changes().id(r.getChangeId()).current().review(reviewInput); - Map> out = gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .comments(); + Map> out = + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).comments(); assertThat(out).hasSize(1); CommentInfo comment = Iterables.getOnlyElement(out.get(FILE_NAME)); assertThat(comment.message).isEqualTo(in.message); assertThat(comment.author.email).isEqualTo(admin.email); assertThat(comment.path).isNull(); - List list = gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .commentsAsList(); + List list = + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).commentsAsList(); assertThat(list).hasSize(1); CommentInfo comment2 = list.get(0); @@ -978,44 +838,36 @@ public class RevisionIT extends AbstractDaemonTest { assertThat(comment2.message).isEqualTo(comment.message); assertThat(comment2.author.email).isEqualTo(comment.author.email); - assertThat(gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .comment(comment.id) - .get() - .message) - .isEqualTo(in.message); + assertThat( + gApi.changes() + .id(r.getChangeId()) + .revision(r.getCommit().name()) + .comment(comment.id) + .get() + .message) + .isEqualTo(in.message); } @Test public void patch() throws Exception { PushOneCommit.Result r = createChange(); - ChangeApi changeApi = gApi.changes() - .id(r.getChangeId()); - BinaryResult bin = changeApi - .revision(r.getCommit().name()) - .patch(); + ChangeApi changeApi = gApi.changes().id(r.getChangeId()); + BinaryResult bin = changeApi.revision(r.getCommit().name()).patch(); ByteArrayOutputStream os = new ByteArrayOutputStream(); bin.writeTo(os); String res = new String(os.toByteArray(), UTF_8); ChangeInfo change = changeApi.get(); RevisionInfo rev = change.revisions.get(change.currentRevision); - DateFormat df = new SimpleDateFormat( - "EEE, dd MMM yyyy HH:mm:ss Z", - Locale.US); + DateFormat df = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US); String date = df.format(rev.commit.author.date); - assertThat(res).isEqualTo( - String.format(PATCH, r.getCommit().name(), date, r.getChangeId())); + assertThat(res).isEqualTo(String.format(PATCH, r.getCommit().name(), date, r.getChangeId())); } @Test public void patchWithPath() throws Exception { PushOneCommit.Result r = createChange(); - ChangeApi changeApi = gApi.changes() - .id(r.getChangeId()); - BinaryResult bin = changeApi - .revision(r.getCommit().name()) - .patch(FILE_NAME); + ChangeApi changeApi = gApi.changes().id(r.getChangeId()); + BinaryResult bin = changeApi.revision(r.getCommit().name()).patch(FILE_NAME); ByteArrayOutputStream os = new ByteArrayOutputStream(); bin.writeTo(os); String res = new String(os.toByteArray(), UTF_8); @@ -1037,8 +889,7 @@ public class RevisionIT extends AbstractDaemonTest { .containsExactly("submit", "cherrypick", "description", "rebase"); current(r).submit(); - assertThat(current(r).actions().keySet()) - .containsExactly("cherrypick"); + assertThat(current(r).actions().keySet()).containsExactly("cherrypick"); } @Test @@ -1061,10 +912,7 @@ public class RevisionIT extends AbstractDaemonTest { @Test public void deleteVoteOnNonCurrentPatchSet() throws Exception { PushOneCommit.Result r = createChange(); // patch set 1 - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .review(ReviewInput.approve()); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve()); // patch set 2 amendChange(r.getChangeId()); @@ -1087,10 +935,7 @@ public class RevisionIT extends AbstractDaemonTest { @Test public void deleteVoteOnCurrentPatchSet() throws Exception { PushOneCommit.Result r = createChange(); // patch set 1 - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .review(ReviewInput.approve()); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve()); // patch set 2 amendChange(r.getChangeId()); @@ -1106,27 +951,24 @@ public class RevisionIT extends AbstractDaemonTest { .reviewer(user.getId().toString()) .deleteVote("Code-Review"); - Map m = gApi.changes() - .id(r.getChangeId()) - .current() - .reviewer(user.getId().toString()) - .votes(); + Map m = + gApi.changes().id(r.getChangeId()).current().reviewer(user.getId().toString()).votes(); - assertThat(m).containsExactly("Code-Review", Short.valueOf((short)0)); + assertThat(m).containsExactly("Code-Review", Short.valueOf((short) 0)); ChangeInfo c = gApi.changes().id(r.getChangeId()).get(); ChangeMessageInfo message = Iterables.getLast(c.messages); assertThat(message.author._accountId).isEqualTo(admin.getId().get()); - assertThat(message.message).isEqualTo( - "Removed Code-Review+1 by User \n"); + assertThat(message.message).isEqualTo("Removed Code-Review+1 by User \n"); assertThat(getReviewers(c.reviewers.get(REVIEWER))) .containsExactlyElementsIn(ImmutableSet.of(admin.getId(), user.getId())); } - private PushOneCommit.Result updateChange(PushOneCommit.Result r, - String content) throws Exception { - PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo, - "test commit", "a.txt", content, r.getChangeId()); + private PushOneCommit.Result updateChange(PushOneCommit.Result r, String content) + throws Exception { + PushOneCommit push = + pushFactory.create( + db, admin.getIdent(), testRepo, "test commit", "a.txt", content, r.getChangeId()); return push.to("refs/for/master"); } @@ -1139,59 +981,55 @@ public class RevisionIT extends AbstractDaemonTest { return gApi.changes().id(r.getChangeId()).current(); } - private String checkETag(ETagView view, - PushOneCommit.Result r, String oldETag) throws Exception { + private String checkETag(ETagView view, PushOneCommit.Result r, String oldETag) + throws Exception { String eTag = view.getETag(parseRevisionResource(r)); assertThat(eTag).isNotEqualTo(oldETag); return eTag; } - private void assertContent(PushOneCommit.Result pushResult, String path, - String expectedContent) throws Exception { - BinaryResult bin = gApi.changes() - .id(pushResult.getChangeId()) - .revision(pushResult.getCommit().name()) - .file(path) - .content(); + private void assertContent(PushOneCommit.Result pushResult, String path, String expectedContent) + throws Exception { + BinaryResult bin = + gApi.changes() + .id(pushResult.getChangeId()) + .revision(pushResult.getCommit().name()) + .file(path) + .content(); ByteArrayOutputStream os = new ByteArrayOutputStream(); bin.writeTo(os); String res = new String(os.toByteArray(), UTF_8); assertThat(res).isEqualTo(expectedContent); } - private void assertDiffForNewFile(PushOneCommit.Result pushResult, String path, - String expectedContentSideB) throws Exception { - DiffInfo diff = gApi.changes() - .id(pushResult.getChangeId()) - .revision(pushResult.getCommit().name()) - .file(path) - .diff(); + private void assertDiffForNewFile( + PushOneCommit.Result pushResult, String path, String expectedContentSideB) throws Exception { + DiffInfo diff = + gApi.changes() + .id(pushResult.getChangeId()) + .revision(pushResult.getCommit().name()) + .file(path) + .diff(); List headers = new ArrayList<>(); if (path.equals(COMMIT_MSG)) { RevCommit c = pushResult.getCommit(); RevCommit parentCommit = c.getParents()[0]; - String parentCommitId = testRepo.getRevWalk().getObjectReader() - .abbreviate(parentCommit.getId(), 8).name(); - headers.add("Parent: " + parentCommitId + " (" - + parentCommit.getShortMessage() + ")"); + String parentCommitId = + testRepo.getRevWalk().getObjectReader().abbreviate(parentCommit.getId(), 8).name(); + headers.add("Parent: " + parentCommitId + " (" + parentCommit.getShortMessage() + ")"); - SimpleDateFormat dtfmt = - new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z", Locale.US); + SimpleDateFormat dtfmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z", Locale.US); PersonIdent author = c.getAuthorIdent(); dtfmt.setTimeZone(author.getTimeZone()); - headers.add("Author: " + author.getName() + " <" - + author.getEmailAddress() + ">"); - headers.add("AuthorDate: " - + dtfmt.format(Long.valueOf(author.getWhen().getTime()))); + headers.add("Author: " + author.getName() + " <" + author.getEmailAddress() + ">"); + headers.add("AuthorDate: " + dtfmt.format(Long.valueOf(author.getWhen().getTime()))); PersonIdent committer = c.getCommitterIdent(); dtfmt.setTimeZone(committer.getTimeZone()); - headers.add("Commit: " + committer.getName() + " <" - + committer.getEmailAddress() + ">"); - headers.add("CommitDate: " - + dtfmt.format(Long.valueOf(committer.getWhen().getTime()))); + headers.add("Commit: " + committer.getName() + " <" + committer.getEmailAddress() + ">"); + headers.add("CommitDate: " + dtfmt.format(Long.valueOf(committer.getWhen().getTime()))); headers.add(""); } @@ -1200,12 +1038,11 @@ public class RevisionIT extends AbstractDaemonTest { expectedContentSideB = header + "\n" + expectedContentSideB; } - assertDiffForNewFile(diff, pushResult.getCommit(), path, - expectedContentSideB); + assertDiffForNewFile(diff, pushResult.getCommit(), path, expectedContentSideB); } - private PushOneCommit.Result createCherryPickableMerge(String parent1FileName, - String parent2FileName) throws Exception { + private PushOneCommit.Result createCherryPickableMerge( + String parent1FileName, String parent2FileName) throws Exception { RevCommit initialCommit = getHead(repo()); String branchAName = "branchA"; @@ -1213,44 +1050,40 @@ public class RevisionIT extends AbstractDaemonTest { String branchBName = "branchB"; createBranch(new Branch.NameKey(project, branchBName)); - PushOneCommit.Result changeAResult = pushFactory - .create(db, admin.getIdent(), testRepo, "change a", - parent1FileName, "Content of a") - .to("refs/for/" + branchAName); + PushOneCommit.Result changeAResult = + pushFactory + .create(db, admin.getIdent(), testRepo, "change a", parent1FileName, "Content of a") + .to("refs/for/" + branchAName); testRepo.reset(initialCommit); - PushOneCommit.Result changeBResult = pushFactory - .create(db, admin.getIdent(), testRepo, "change b", - parent2FileName, "Content of b") - .to("refs/for/" + branchBName); + PushOneCommit.Result changeBResult = + pushFactory + .create(db, admin.getIdent(), testRepo, "change b", parent2FileName, "Content of b") + .to("refs/for/" + branchBName); - PushOneCommit pushableMergeCommit = pushFactory.create(db, admin.getIdent(), - testRepo, "merge", ImmutableMap.of(parent1FileName, "Content of a", - parent2FileName, "Content of b")); - pushableMergeCommit.setParents(ImmutableList.of(changeAResult.getCommit(), - changeBResult.getCommit())); - PushOneCommit.Result mergeChangeResult = - pushableMergeCommit.to("refs/for/" + branchAName); + PushOneCommit pushableMergeCommit = + pushFactory.create( + db, + admin.getIdent(), + testRepo, + "merge", + ImmutableMap.of(parent1FileName, "Content of a", parent2FileName, "Content of b")); + pushableMergeCommit.setParents( + ImmutableList.of(changeAResult.getCommit(), changeBResult.getCommit())); + PushOneCommit.Result mergeChangeResult = pushableMergeCommit.to("refs/for/" + branchAName); mergeChangeResult.assertOkStatus(); return mergeChangeResult; } - private ApprovalInfo getApproval(String changeId, String label) - throws Exception { - ChangeInfo info = gApi.changes() - .id(changeId) - .get(EnumSet.of(DETAILED_LABELS)); + private ApprovalInfo getApproval(String changeId, String label) throws Exception { + ChangeInfo info = gApi.changes().id(changeId).get(EnumSet.of(DETAILED_LABELS)); LabelInfo li = info.labels.get(label); assertThat(li).isNotNull(); int accountId = atrScope.get().getUser().getAccountId().get(); - return li.all.stream() - .filter(a -> a._accountId == accountId) - .findFirst() - .get(); + return li.all.stream().filter(a -> a._accountId == accountId).findFirst().get(); } - private static Iterable getReviewers( - Collection r) { + private static Iterable getReviewers(Collection r) { return Iterables.transform(r, a -> new Account.Id(a._accountId)); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RobotCommentsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RobotCommentsIT.java index f23667e0a7..283f14b759 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RobotCommentsIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RobotCommentsIT.java @@ -31,15 +31,13 @@ import com.google.gerrit.extensions.common.RobotCommentInfo; import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.restapi.MethodNotAllowedException; import com.google.gerrit.extensions.restapi.RestApiException; - -import org.junit.Before; -import org.junit.Test; - import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.junit.Before; +import org.junit.Test; public class RobotCommentsIT extends AbstractDaemonTest { private String changeId; @@ -58,14 +56,11 @@ public class RobotCommentsIT extends AbstractDaemonTest { } @Test - public void retrievingRobotCommentsBeforeAddingAnyDoesNotRaiseAnException() - throws Exception { + public void retrievingRobotCommentsBeforeAddingAnyDoesNotRaiseAnException() throws Exception { assume().that(notesMigration.enabled()).isTrue(); - Map> robotComments = gApi.changes() - .id(changeId) - .current() - .robotComments(); + Map> robotComments = + gApi.changes().id(changeId).current().robotComments(); assertThat(robotComments).isNotNull(); assertThat(robotComments).isEmpty(); @@ -78,10 +73,7 @@ public class RobotCommentsIT extends AbstractDaemonTest { RobotCommentInput in = createRobotCommentInput(); addRobotComment(changeId, in); - Map> out = gApi.changes() - .id(changeId) - .current() - .robotComments(); + Map> out = gApi.changes().id(changeId).current().robotComments(); assertThat(out).hasSize(1); RobotCommentInfo comment = Iterables.getOnlyElement(out.get(in.path)); @@ -95,14 +87,12 @@ public class RobotCommentsIT extends AbstractDaemonTest { RobotCommentInput in = createRobotCommentInput(); addRobotComment(changeId, in); - pushFactory.create(db, admin.getIdent(), testRepo, changeId) - .to("refs/for/master"); + pushFactory.create(db, admin.getIdent(), testRepo, changeId).to("refs/for/master"); RobotCommentInput in2 = createRobotCommentInput(); addRobotComment(changeId, in2); - Map> out = - gApi.changes().id(changeId).robotComments(); + Map> out = gApi.changes().id(changeId).robotComments(); assertThat(out).hasSize(1); assertThat(out.get(in.path)).hasSize(2); @@ -120,14 +110,11 @@ public class RobotCommentsIT extends AbstractDaemonTest { RobotCommentInput robotCommentInput = createRobotCommentInput(); addRobotComment(changeId, robotCommentInput); - List robotCommentInfos = gApi.changes() - .id(changeId) - .current() - .robotCommentsAsList(); + List robotCommentInfos = + gApi.changes().id(changeId).current().robotCommentsAsList(); assertThat(robotCommentInfos).hasSize(1); - RobotCommentInfo robotCommentInfo = - Iterables.getOnlyElement(robotCommentInfos); + RobotCommentInfo robotCommentInfo = Iterables.getOnlyElement(robotCommentInfos); assertRobotComment(robotCommentInfo, robotCommentInput); } @@ -139,14 +126,10 @@ public class RobotCommentsIT extends AbstractDaemonTest { addRobotComment(changeId, robotCommentInput); List robotCommentInfos = getRobotComments(); - RobotCommentInfo robotCommentInfo = - Iterables.getOnlyElement(robotCommentInfos); + RobotCommentInfo robotCommentInfo = Iterables.getOnlyElement(robotCommentInfos); - RobotCommentInfo specificRobotCommentInfo = gApi.changes() - .id(changeId) - .current() - .robotComment(robotCommentInfo.id) - .get(); + RobotCommentInfo specificRobotCommentInfo = + gApi.changes().id(changeId).current().robotComment(robotCommentInfo.id).get(); assertRobotComment(specificRobotCommentInfo, robotCommentInput); } @@ -157,10 +140,7 @@ public class RobotCommentsIT extends AbstractDaemonTest { RobotCommentInput in = createRobotCommentInputWithMandatoryFields(); addRobotComment(changeId, in); - Map> out = gApi.changes() - .id(changeId) - .current() - .robotComments(); + Map> out = gApi.changes().id(changeId).current().robotComments(); assertThat(out).hasSize(1); RobotCommentInfo comment = Iterables.getOnlyElement(out.get(in.path)); assertRobotComment(comment, in, false); @@ -173,22 +153,22 @@ public class RobotCommentsIT extends AbstractDaemonTest { addRobotComment(changeId, withFixRobotCommentInput); List robotCommentInfos = getRobotComments(); - assertThatList(robotCommentInfos).onlyElement() - .onlyFixSuggestion().isNotNull(); + assertThatList(robotCommentInfos).onlyElement().onlyFixSuggestion().isNotNull(); } @Test - public void fixIdIsGeneratedForFixSuggestion() - throws Exception { + public void fixIdIsGeneratedForFixSuggestion() throws Exception { assume().that(notesMigration.enabled()).isTrue(); addRobotComment(changeId, withFixRobotCommentInput); List robotCommentInfos = getRobotComments(); - assertThatList(robotCommentInfos).onlyElement() - .onlyFixSuggestion().fixId().isNotEmpty(); - assertThatList(robotCommentInfos).onlyElement() - .onlyFixSuggestion().fixId().isNotEqualTo(fixSuggestionInfo.fixId); + assertThatList(robotCommentInfos).onlyElement().onlyFixSuggestion().fixId().isNotEmpty(); + assertThatList(robotCommentInfos) + .onlyElement() + .onlyFixSuggestion() + .fixId() + .isNotEqualTo(fixSuggestionInfo.fixId); } @Test @@ -198,8 +178,11 @@ public class RobotCommentsIT extends AbstractDaemonTest { addRobotComment(changeId, withFixRobotCommentInput); List robotCommentInfos = getRobotComments(); - assertThatList(robotCommentInfos).onlyElement().onlyFixSuggestion() - .description().isEqualTo(fixSuggestionInfo.description); + assertThatList(robotCommentInfos) + .onlyElement() + .onlyFixSuggestion() + .description() + .isEqualTo(fixSuggestionInfo.description); } @Test @@ -209,9 +192,10 @@ public class RobotCommentsIT extends AbstractDaemonTest { fixSuggestionInfo.description = null; exception.expect(BadRequestException.class); - exception.expectMessage(String.format("A description is required for the " - + "suggested fix of the robot comment on %s", - withFixRobotCommentInput.path)); + exception.expectMessage( + String.format( + "A description is required for the " + "suggested fix of the robot comment on %s", + withFixRobotCommentInput.path)); addRobotComment(changeId, withFixRobotCommentInput); } @@ -222,8 +206,11 @@ public class RobotCommentsIT extends AbstractDaemonTest { addRobotComment(changeId, withFixRobotCommentInput); List robotCommentInfos = getRobotComments(); - assertThatList(robotCommentInfos).onlyElement().onlyFixSuggestion() - .onlyReplacement().isNotNull(); + assertThatList(robotCommentInfos) + .onlyElement() + .onlyFixSuggestion() + .onlyReplacement() + .isNotNull(); } @Test @@ -233,9 +220,11 @@ public class RobotCommentsIT extends AbstractDaemonTest { fixSuggestionInfo.replacements = Collections.emptyList(); exception.expect(BadRequestException.class); - exception.expectMessage(String.format("At least one replacement is required" - + " for the suggested fix of the robot comment on %s", - withFixRobotCommentInput.path)); + exception.expectMessage( + String.format( + "At least one replacement is required" + + " for the suggested fix of the robot comment on %s", + withFixRobotCommentInput.path)); addRobotComment(changeId, withFixRobotCommentInput); } @@ -247,8 +236,12 @@ public class RobotCommentsIT extends AbstractDaemonTest { List robotCommentInfos = getRobotComments(); - assertThatList(robotCommentInfos).onlyElement().onlyFixSuggestion() - .onlyReplacement().path().isEqualTo(fixReplacementInfo.path); + assertThatList(robotCommentInfos) + .onlyElement() + .onlyFixSuggestion() + .onlyReplacement() + .path() + .isEqualTo(fixReplacementInfo.path); } @Test @@ -258,9 +251,10 @@ public class RobotCommentsIT extends AbstractDaemonTest { fixReplacementInfo.path = null; exception.expect(BadRequestException.class); - exception.expectMessage(String.format("A file path must be given for the " - + "replacement of the robot comment on %s", - withFixRobotCommentInput.path)); + exception.expectMessage( + String.format( + "A file path must be given for the " + "replacement of the robot comment on %s", + withFixRobotCommentInput.path)); addRobotComment(changeId, withFixRobotCommentInput); } @@ -271,9 +265,11 @@ public class RobotCommentsIT extends AbstractDaemonTest { fixReplacementInfo.path = "anotherFile.txt"; exception.expect(BadRequestException.class); - exception.expectMessage(String.format("Replacements may only be specified " - + "for the file %s on which the robot comment was added", - withFixRobotCommentInput.path)); + exception.expectMessage( + String.format( + "Replacements may only be specified " + + "for the file %s on which the robot comment was added", + withFixRobotCommentInput.path)); addRobotComment(changeId, withFixRobotCommentInput); } @@ -285,8 +281,12 @@ public class RobotCommentsIT extends AbstractDaemonTest { List robotCommentInfos = getRobotComments(); - assertThatList(robotCommentInfos).onlyElement().onlyFixSuggestion() - .onlyReplacement().range().isEqualTo(fixReplacementInfo.range); + assertThatList(robotCommentInfos) + .onlyElement() + .onlyFixSuggestion() + .onlyReplacement() + .range() + .isEqualTo(fixReplacementInfo.range); } @Test @@ -296,9 +296,10 @@ public class RobotCommentsIT extends AbstractDaemonTest { fixReplacementInfo.range = null; exception.expect(BadRequestException.class); - exception.expectMessage(String.format("A range must be given for the " - + "replacement of the robot comment on %s", - withFixRobotCommentInput.path)); + exception.expectMessage( + String.format( + "A range must be given for the " + "replacement of the robot comment on %s", + withFixRobotCommentInput.path)); addRobotComment(changeId, withFixRobotCommentInput); } @@ -309,37 +310,41 @@ public class RobotCommentsIT extends AbstractDaemonTest { fixReplacementInfo.range = createRange(13, 9, 5, 10); exception.expect(BadRequestException.class); - exception.expectMessage(String.format("Range (13:9 - 5:10) is not " - + "valid for the replacement of the robot comment on %s", - withFixRobotCommentInput.path)); + exception.expectMessage( + String.format( + "Range (13:9 - 5:10) is not " + "valid for the replacement of the robot comment on %s", + withFixRobotCommentInput.path)); addRobotComment(changeId, withFixRobotCommentInput); } @Test - public void replacementStringOfFixReplacementIsAcceptedAsIs() - throws Exception { + public void replacementStringOfFixReplacementIsAcceptedAsIs() throws Exception { assume().that(notesMigration.enabled()).isTrue(); addRobotComment(changeId, withFixRobotCommentInput); List robotCommentInfos = getRobotComments(); - assertThatList(robotCommentInfos).onlyElement() - .onlyFixSuggestion().onlyReplacement() - .replacement().isEqualTo(fixReplacementInfo.replacement); + assertThatList(robotCommentInfos) + .onlyElement() + .onlyFixSuggestion() + .onlyReplacement() + .replacement() + .isEqualTo(fixReplacementInfo.replacement); } @Test - public void replacementStringOfFixReplacementIsMandatory() - throws Exception { + public void replacementStringOfFixReplacementIsMandatory() throws Exception { assume().that(notesMigration.enabled()).isTrue(); fixReplacementInfo.replacement = null; exception.expect(BadRequestException.class); - exception.expectMessage(String.format("A content for replacement must be " - + "indicated for the replacement of the robot comment on %s", - withFixRobotCommentInput.path)); + exception.expectMessage( + String.format( + "A content for replacement must be " + + "indicated for the replacement of the robot comment on %s", + withFixRobotCommentInput.path)); addRobotComment(changeId, withFixRobotCommentInput); } @@ -356,10 +361,7 @@ public class RobotCommentsIT extends AbstractDaemonTest { exception.expect(MethodNotAllowedException.class); exception.expectMessage("robot comments not supported"); - gApi.changes() - .id(changeId) - .current() - .review(reviewInput); + gApi.changes().id(changeId).current().review(reviewInput); } private RobotCommentInput createRobotCommentInputWithMandatoryFields() { @@ -372,8 +374,7 @@ public class RobotCommentsIT extends AbstractDaemonTest { return in; } - private RobotCommentInput createRobotCommentInput( - FixSuggestionInfo... fixSuggestionInfos) { + private RobotCommentInput createRobotCommentInput(FixSuggestionInfo... fixSuggestionInfos) { RobotCommentInput in = createRobotCommentInputWithMandatoryFields(); in.url = "http://www.happy-robot.com"; in.properties = new HashMap<>(); @@ -383,8 +384,7 @@ public class RobotCommentsIT extends AbstractDaemonTest { return in; } - private FixSuggestionInfo createFixSuggestionInfo( - FixReplacementInfo... fixReplacementInfos) { + private FixSuggestionInfo createFixSuggestionInfo(FixReplacementInfo... fixReplacementInfos) { FixSuggestionInfo newFixSuggestionInfo = new FixSuggestionInfo(); newFixSuggestionInfo.fixId = "An ID which must be overwritten."; newFixSuggestionInfo.description = "A description for a suggested fix."; @@ -400,8 +400,8 @@ public class RobotCommentsIT extends AbstractDaemonTest { return newFixReplacementInfo; } - private Comment.Range createRange(int startLine, int startCharacter, - int endLine, int endCharacter) { + private Comment.Range createRange( + int startLine, int startCharacter, int endLine, int endCharacter) { Comment.Range range = new Comment.Range(); range.startLine = startLine; range.startCharacter = startCharacter; @@ -410,32 +410,26 @@ public class RobotCommentsIT extends AbstractDaemonTest { return range; } - private void addRobotComment(String targetChangeId, - RobotCommentInput robotCommentInput) throws Exception { + private void addRobotComment(String targetChangeId, RobotCommentInput robotCommentInput) + throws Exception { ReviewInput reviewInput = new ReviewInput(); - reviewInput.robotComments = Collections.singletonMap(robotCommentInput.path, - Collections.singletonList(robotCommentInput)); + reviewInput.robotComments = + Collections.singletonMap( + robotCommentInput.path, Collections.singletonList(robotCommentInput)); reviewInput.message = "robot comment test"; - gApi.changes() - .id(targetChangeId) - .current() - .review(reviewInput); + gApi.changes().id(targetChangeId).current().review(reviewInput); } private List getRobotComments() throws RestApiException { - return gApi.changes() - .id(changeId) - .current() - .robotCommentsAsList(); + return gApi.changes().id(changeId).current().robotCommentsAsList(); } - private void assertRobotComment(RobotCommentInfo c, - RobotCommentInput expected) { + private void assertRobotComment(RobotCommentInfo c, RobotCommentInput expected) { assertRobotComment(c, expected, true); } - private void assertRobotComment(RobotCommentInfo c, - RobotCommentInput expected, boolean expectPath) { + private void assertRobotComment( + RobotCommentInfo c, RobotCommentInput expected, boolean expectPath) { assertThat(c.robotId).isEqualTo(expected.robotId); assertThat(c.robotRunId).isEqualTo(expected.robotRunId); assertThat(c.url).isEqualTo(expected.url); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/edit/ChangeEditIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/edit/ChangeEditIT.java index 02d5cc7d6f..08fe4a9489 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/edit/ChangeEditIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/edit/ChangeEditIT.java @@ -59,7 +59,12 @@ import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; import com.google.gwtorm.server.SchemaFactory; import com.google.inject.Inject; - +import java.io.IOException; +import java.sql.Timestamp; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.ObjectId; @@ -73,13 +78,6 @@ import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; -import java.io.IOException; -import java.sql.Timestamp; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.stream.Collectors; - public class ChangeEditIT extends AbstractDaemonTest { private static final String FILE_NAME = "foo"; @@ -90,8 +88,7 @@ public class ChangeEditIT extends AbstractDaemonTest { private static final String CONTENT_NEW2_STR = "quxÄÜÖßµ"; private static final byte[] CONTENT_NEW2 = CONTENT_NEW2_STR.getBytes(UTF_8); - @Inject - private SchemaFactory reviewDbProvider; + @Inject private SchemaFactory reviewDbProvider; private String changeId; private String changeId2; @@ -136,10 +133,7 @@ public class ChangeEditIT extends AbstractDaemonTest { @Test public void deleteEditOfCurrentPatchSet() throws Exception { createArbitraryEditFor(changeId); - gApi.changes() - .id(changeId) - .edit() - .delete(); + gApi.changes().id(changeId).edit().delete(); assertThat(getEdit(changeId)).isAbsent(); } @@ -148,10 +142,7 @@ public class ChangeEditIT extends AbstractDaemonTest { createArbitraryEditFor(changeId2); amendChange(admin.getIdent(), changeId2); - gApi.changes() - .id(changeId2) - .edit() - .delete(); + gApi.changes().id(changeId2).edit().delete(); assertThat(getEdit(changeId2)).isAbsent(); } @@ -161,14 +152,13 @@ public class ChangeEditIT extends AbstractDaemonTest { PublishChangeEditInput publishInput = new PublishChangeEditInput(); publishInput.notify = NotifyHandling.NONE; - gApi.changes() - .id(changeId) - .edit() - .publish(publishInput); + gApi.changes().id(changeId).edit().publish(publishInput); assertThat(getEdit(changeId)).isAbsent(); - assertChangeMessages(changeId, - ImmutableList.of("Uploaded patch set 1.", + assertChangeMessages( + changeId, + ImmutableList.of( + "Uploaded patch set 1.", "Uploaded patch set 2.", "Patch Set 3: Published edit on patch set 2.")); } @@ -181,10 +171,11 @@ public class ChangeEditIT extends AbstractDaemonTest { adminRestSession.post(urlPublish(changeId)).assertNoContent(); assertThat(getEdit(changeId)).isAbsent(); PatchSet newCurrentPatchSet = getCurrentPatchSet(changeId); - assertThat(newCurrentPatchSet.getId()) - .isNotEqualTo(oldCurrentPatchSet.getId()); - assertChangeMessages(changeId, - ImmutableList.of("Uploaded patch set 1.", + assertThat(newCurrentPatchSet.getId()).isNotEqualTo(oldCurrentPatchSet.getId()); + assertChangeMessages( + changeId, + ImmutableList.of( + "Uploaded patch set 1.", "Uploaded patch set 2.", "Patch Set 3: Published edit on patch set 2.")); } @@ -208,17 +199,12 @@ public class ChangeEditIT extends AbstractDaemonTest { public void publishEditWithDefaultNotify() throws Exception { AddReviewerInput in = new AddReviewerInput(); in.reviewer = user.email; - gApi.changes() - .id(changeId) - .addReviewer(in); + gApi.changes().id(changeId).addReviewer(in); createArbitraryEditFor(changeId); sender.clear(); - gApi.changes() - .id(changeId) - .edit() - .publish(); + gApi.changes().id(changeId).edit().publish(); assertThat(sender.getMessages()).isNotEmpty(); } @@ -242,69 +228,56 @@ public class ChangeEditIT extends AbstractDaemonTest { public void rebaseEdit() throws Exception { PatchSet previousPatchSet = getCurrentPatchSet(changeId2); createEmptyEditFor(changeId2); - gApi.changes() - .id(changeId2) - .edit() - .modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW)); + gApi.changes().id(changeId2).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW)); amendChange(admin.getIdent(), changeId2); PatchSet currentPatchSet = getCurrentPatchSet(changeId2); Optional originalEdit = getEdit(changeId2); - assertThat(originalEdit).value().baseRevision() - .isEqualTo(previousPatchSet.getRevision().get()); + assertThat(originalEdit).value().baseRevision().isEqualTo(previousPatchSet.getRevision().get()); Timestamp beforeRebase = originalEdit.get().commit.committer.date; - gApi.changes() - .id(changeId2) - .edit() - .rebase(); + gApi.changes().id(changeId2).edit().rebase(); ensureSameBytes(getFileContentOfEdit(changeId2, FILE_NAME), CONTENT_NEW); ensureSameBytes(getFileContentOfEdit(changeId2, FILE_NAME2), CONTENT_NEW2); Optional rebasedEdit = getEdit(changeId2); - assertThat(rebasedEdit).value().baseRevision() - .isEqualTo(currentPatchSet.getRevision().get()); - assertThat(rebasedEdit).value().commit().committer().creationDate() - .isNotEqualTo(beforeRebase); + assertThat(rebasedEdit).value().baseRevision().isEqualTo(currentPatchSet.getRevision().get()); + assertThat(rebasedEdit).value().commit().committer().creationDate().isNotEqualTo(beforeRebase); } @Test public void rebaseEditRest() throws Exception { PatchSet previousPatchSet = getCurrentPatchSet(changeId2); createEmptyEditFor(changeId2); - gApi.changes() - .id(changeId2) - .edit() - .modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW)); + gApi.changes().id(changeId2).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW)); amendChange(admin.getIdent(), changeId2); PatchSet currentPatchSet = getCurrentPatchSet(changeId2); Optional originalEdit = getEdit(changeId2); - assertThat(originalEdit).value().baseRevision() - .isEqualTo(previousPatchSet.getRevision().get()); + assertThat(originalEdit).value().baseRevision().isEqualTo(previousPatchSet.getRevision().get()); Timestamp beforeRebase = originalEdit.get().commit.committer.date; adminRestSession.post(urlRebase(changeId2)).assertNoContent(); ensureSameBytes(getFileContentOfEdit(changeId2, FILE_NAME), CONTENT_NEW); ensureSameBytes(getFileContentOfEdit(changeId2, FILE_NAME2), CONTENT_NEW2); Optional rebasedEdit = getEdit(changeId2); - assertThat(rebasedEdit).value().baseRevision() - .isEqualTo(currentPatchSet.getRevision().get()); - assertThat(rebasedEdit).value().commit().committer().creationDate() - .isNotEqualTo(beforeRebase); + assertThat(rebasedEdit).value().baseRevision().isEqualTo(currentPatchSet.getRevision().get()); + assertThat(rebasedEdit).value().commit().committer().creationDate().isNotEqualTo(beforeRebase); } @Test public void rebaseEditWithConflictsRest_Conflict() throws Exception { PatchSet currentPatchSet = getCurrentPatchSet(changeId2); createEmptyEditFor(changeId2); - gApi.changes() - .id(changeId2) - .edit() - .modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW)); + gApi.changes().id(changeId2).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW)); Optional edit = getEdit(changeId2); - assertThat(edit).value().baseRevision() - .isEqualTo(currentPatchSet.getRevision().get()); - PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo, - PushOneCommit.SUBJECT, FILE_NAME, new String(CONTENT_NEW2, UTF_8), - changeId2); + assertThat(edit).value().baseRevision().isEqualTo(currentPatchSet.getRevision().get()); + PushOneCommit push = + pushFactory.create( + db, + admin.getIdent(), + testRepo, + PushOneCommit.SUBJECT, + FILE_NAME, + new String(CONTENT_NEW2, UTF_8), + changeId2); push.to("refs/for/master").assertOkStatus(); adminRestSession.post(urlRebase(changeId2)).assertConflict(); } @@ -312,10 +285,7 @@ public class ChangeEditIT extends AbstractDaemonTest { @Test public void updateExistingFile() throws Exception { createEmptyEditFor(changeId); - gApi.changes() - .id(changeId) - .edit() - .modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW)); + gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW)); assertThat(getEdit(changeId)).isPresent(); ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME), CONTENT_NEW); ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME), CONTENT_NEW); @@ -332,85 +302,55 @@ public class ChangeEditIT extends AbstractDaemonTest { Optional edit = getEdit(changeId); assertThat(edit).value().commit().parents().isEmpty(); - String msg = String.format("New commit message\n\nChange-Id: %s\n", - changeId); - gApi.changes() - .id(changeId) - .edit() - .modifyCommitMessage(msg); - String commitMessage = gApi.changes() - .id(changeId) - .edit() - .getCommitMessage(); + String msg = String.format("New commit message\n\nChange-Id: %s\n", changeId); + gApi.changes().id(changeId).edit().modifyCommitMessage(msg); + String commitMessage = gApi.changes().id(changeId).edit().getCommitMessage(); assertThat(commitMessage).isEqualTo(msg); } @Test public void updateMessageNoChange() throws Exception { createEmptyEditFor(changeId); - String commitMessage = gApi.changes() - .id(changeId) - .edit() - .getCommitMessage(); + String commitMessage = gApi.changes().id(changeId).edit().getCommitMessage(); exception.expect(ResourceConflictException.class); - exception.expectMessage( - "New commit message cannot be same as existing commit message"); - gApi.changes() - .id(changeId) - .edit() - .modifyCommitMessage(commitMessage); + exception.expectMessage("New commit message cannot be same as existing commit message"); + gApi.changes().id(changeId).edit().modifyCommitMessage(commitMessage); } @Test public void updateMessageOnlyAddTrailingNewLines() throws Exception { createEmptyEditFor(changeId); - String commitMessage = gApi.changes() - .id(changeId) - .edit() - .getCommitMessage(); + String commitMessage = gApi.changes().id(changeId).edit().getCommitMessage(); exception.expect(ResourceConflictException.class); - exception.expectMessage( - "New commit message cannot be same as existing commit message"); - gApi.changes() - .id(changeId) - .edit() - .modifyCommitMessage(commitMessage + "\n\n"); + exception.expectMessage("New commit message cannot be same as existing commit message"); + gApi.changes().id(changeId).edit().modifyCommitMessage(commitMessage + "\n\n"); } @Test public void updateMessage() throws Exception { createEmptyEditFor(changeId); - String msg = String.format("New commit message\n\nChange-Id: %s\n", - changeId); - gApi.changes() - .id(changeId) - .edit() - .modifyCommitMessage(msg); - String commitMessage = gApi.changes() - .id(changeId) - .edit() - .getCommitMessage(); + String msg = String.format("New commit message\n\nChange-Id: %s\n", changeId); + gApi.changes().id(changeId).edit().modifyCommitMessage(msg); + String commitMessage = gApi.changes().id(changeId).edit().getCommitMessage(); assertThat(commitMessage).isEqualTo(msg); PublishChangeEditInput publishInput = new PublishChangeEditInput(); publishInput.notify = NotifyHandling.NONE; - gApi.changes() - .id(changeId) - .edit() - .publish(publishInput); + gApi.changes().id(changeId).edit().publish(publishInput); assertThat(getEdit(changeId)).isAbsent(); - ChangeInfo info = get(changeId, ListChangesOption.CURRENT_COMMIT, - ListChangesOption.CURRENT_REVISION); - assertThat(info.revisions.get(info.currentRevision).commit.message) - .isEqualTo(msg); + ChangeInfo info = + get(changeId, ListChangesOption.CURRENT_COMMIT, ListChangesOption.CURRENT_REVISION); + assertThat(info.revisions.get(info.currentRevision).commit.message).isEqualTo(msg); assertThat(info.revisions.get(info.currentRevision).description) .isEqualTo("Edit commit message"); - assertChangeMessages(changeId, - ImmutableList.of("Uploaded patch set 1.", + assertChangeMessages( + changeId, + ImmutableList.of( + "Uploaded patch set 1.", "Uploaded patch set 2.", "Patch Set 3: Commit message was updated.")); } @@ -419,44 +359,34 @@ public class ChangeEditIT extends AbstractDaemonTest { public void updateMessageRest() throws Exception { adminRestSession.get(urlEditMessage(changeId, false)).assertNotFound(); EditMessage.Input in = new EditMessage.Input(); - in.message = String.format("New commit message\n\n" + - CONTENT_NEW2_STR + "\n\nChange-Id: %s\n", - changeId); + in.message = + String.format( + "New commit message\n\n" + CONTENT_NEW2_STR + "\n\nChange-Id: %s\n", changeId); adminRestSession.put(urlEditMessage(changeId, false), in).assertNoContent(); - RestResponse r = adminRestSession.getJsonAccept(urlEditMessage(changeId, - false)); + RestResponse r = adminRestSession.getJsonAccept(urlEditMessage(changeId, false)); r.assertOK(); assertThat(readContentFromJson(r)).isEqualTo(in.message); - String commitMessage = gApi.changes() - .id(changeId) - .edit() - .getCommitMessage(); + String commitMessage = gApi.changes().id(changeId).edit().getCommitMessage(); assertThat(commitMessage).isEqualTo(in.message); - in.message = String.format("New commit message2\n\nChange-Id: %s\n", - changeId); + in.message = String.format("New commit message2\n\nChange-Id: %s\n", changeId); adminRestSession.put(urlEditMessage(changeId, false), in).assertNoContent(); - String updatedCommitMessage = gApi.changes() - .id(changeId) - .edit() - .getCommitMessage(); + String updatedCommitMessage = gApi.changes().id(changeId).edit().getCommitMessage(); assertThat(updatedCommitMessage).isEqualTo(in.message); r = adminRestSession.getJsonAccept(urlEditMessage(changeId, true)); try (Repository repo = repoManager.openRepository(project); RevWalk rw = new RevWalk(repo)) { - RevCommit commit = rw.parseCommit( - ObjectId.fromString(ps.getRevision().get())); + RevCommit commit = rw.parseCommit(ObjectId.fromString(ps.getRevision().get())); assertThat(readContentFromJson(r)).isEqualTo(commit.getFullMessage()); } PublishChangeEditInput publishInput = new PublishChangeEditInput(); publishInput.notify = NotifyHandling.NONE; - gApi.changes() - .id(changeId) - .edit() - .publish(publishInput); - assertChangeMessages(changeId, - ImmutableList.of("Uploaded patch set 1.", + gApi.changes().id(changeId).edit().publish(publishInput); + assertChangeMessages( + changeId, + ImmutableList.of( + "Uploaded patch set 1.", "Uploaded patch set 2.", "Patch Set 3: Commit message was updated.")); } @@ -471,10 +401,7 @@ public class ChangeEditIT extends AbstractDaemonTest { assertThat(editInfo).commit().parents().hasSize(1); assertThat(editInfo).baseRevision().isEqualTo(changeInfo.currentRevision); - gApi.changes() - .id(changeId) - .edit() - .delete(); + gApi.changes().id(changeId).edit().delete(); adminRestSession.get(urlEdit(changeId)).assertNoContent(); } @@ -482,34 +409,24 @@ public class ChangeEditIT extends AbstractDaemonTest { @Test public void retrieveFilesInEdit() throws Exception { createEmptyEditFor(changeId); - gApi.changes() - .id(changeId) - .edit() - .modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW)); + gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW)); EditInfo info = getEditInfo(changeId, true); assertThat(info.files).isNotNull(); - assertThat(info.files.keySet()).containsExactly(Patch.COMMIT_MSG, - FILE_NAME, FILE_NAME2); + assertThat(info.files.keySet()).containsExactly(Patch.COMMIT_MSG, FILE_NAME, FILE_NAME2); } @Test public void deleteExistingFile() throws Exception { createEmptyEditFor(changeId); - gApi.changes() - .id(changeId) - .edit() - .deleteFile(FILE_NAME); + gApi.changes().id(changeId).edit().deleteFile(FILE_NAME); assertThat(getFileContentOfEdit(changeId, FILE_NAME)).isAbsent(); } @Test public void renameExistingFile() throws Exception { createEmptyEditFor(changeId); - gApi.changes() - .id(changeId) - .edit() - .renameFile(FILE_NAME, FILE_NAME3); + gApi.changes().id(changeId).edit().renameFile(FILE_NAME, FILE_NAME3); ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME3), CONTENT_OLD); assertThat(getFileContentOfEdit(changeId, FILE_NAME)).isAbsent(); } @@ -535,30 +452,18 @@ public class ChangeEditIT extends AbstractDaemonTest { @Test public void restoreDeletedFileInPatchSet() throws Exception { createEmptyEditFor(changeId2); - gApi.changes() - .id(changeId2) - .edit() - .restoreFile(FILE_NAME); + gApi.changes().id(changeId2).edit().restoreFile(FILE_NAME); ensureSameBytes(getFileContentOfEdit(changeId2, FILE_NAME), CONTENT_OLD); } @Test public void revertChanges() throws Exception { createEmptyEditFor(changeId2); - gApi.changes() - .id(changeId2) - .edit() - .restoreFile(FILE_NAME); + gApi.changes().id(changeId2).edit().restoreFile(FILE_NAME); ensureSameBytes(getFileContentOfEdit(changeId2, FILE_NAME), CONTENT_OLD); - gApi.changes() - .id(changeId2) - .edit() - .modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW)); + gApi.changes().id(changeId2).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW)); ensureSameBytes(getFileContentOfEdit(changeId2, FILE_NAME), CONTENT_NEW); - gApi.changes() - .id(changeId2) - .edit() - .restoreFile(FILE_NAME); + gApi.changes().id(changeId2).edit().restoreFile(FILE_NAME); ensureSameBytes(getFileContentOfEdit(changeId2, FILE_NAME), CONTENT_OLD); } @@ -584,15 +489,9 @@ public class ChangeEditIT extends AbstractDaemonTest { @Test public void amendExistingFile() throws Exception { createEmptyEditFor(changeId); - gApi.changes() - .id(changeId) - .edit() - .modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW)); + gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW)); ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME), CONTENT_NEW); - gApi.changes() - .id(changeId) - .edit() - .modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW2)); + gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW2)); ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME), CONTENT_NEW2); } @@ -600,12 +499,10 @@ public class ChangeEditIT extends AbstractDaemonTest { public void createAndChangeEditInOneRequestRest() throws Exception { Put.Input in = new Put.Input(); in.content = RawInputUtil.create(CONTENT_NEW); - adminRestSession.putRaw(urlEditFile(changeId, FILE_NAME), in.content) - .assertNoContent(); + adminRestSession.putRaw(urlEditFile(changeId, FILE_NAME), in.content).assertNoContent(); ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME), CONTENT_NEW); in.content = RawInputUtil.create(CONTENT_NEW2); - adminRestSession.putRaw(urlEditFile(changeId, FILE_NAME), in.content) - .assertNoContent(); + adminRestSession.putRaw(urlEditFile(changeId, FILE_NAME), in.content).assertNoContent(); ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME), CONTENT_NEW2); } @@ -614,8 +511,7 @@ public class ChangeEditIT extends AbstractDaemonTest { createEmptyEditFor(changeId); Put.Input in = new Put.Input(); in.content = RawInputUtil.create(CONTENT_NEW); - adminRestSession.putRaw(urlEditFile(changeId, FILE_NAME), in.content) - .assertNoContent(); + adminRestSession.putRaw(urlEditFile(changeId, FILE_NAME), in.content).assertNoContent(); ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME), CONTENT_NEW); } @@ -623,8 +519,7 @@ public class ChangeEditIT extends AbstractDaemonTest { public void emptyPutRequest() throws Exception { createEmptyEditFor(changeId); adminRestSession.put(urlEditFile(changeId, FILE_NAME)).assertNoContent(); - ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME), - "".getBytes(UTF_8)); + ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME), "".getBytes(UTF_8)); } @Test @@ -637,22 +532,15 @@ public class ChangeEditIT extends AbstractDaemonTest { public void getFileContentRest() throws Exception { Put.Input in = new Put.Input(); in.content = RawInputUtil.create(CONTENT_NEW); - adminRestSession.putRaw(urlEditFile(changeId, FILE_NAME), in.content) - .assertNoContent(); - gApi.changes() - .id(changeId) - .edit() - .modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW2)); - RestResponse r = adminRestSession.getJsonAccept(urlEditFile(changeId, - FILE_NAME)); + adminRestSession.putRaw(urlEditFile(changeId, FILE_NAME), in.content).assertNoContent(); + gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW2)); + RestResponse r = adminRestSession.getJsonAccept(urlEditFile(changeId, FILE_NAME)); r.assertOK(); - assertThat(readContentFromJson(r)).isEqualTo( - new String(CONTENT_NEW2, UTF_8)); + assertThat(readContentFromJson(r)).isEqualTo(new String(CONTENT_NEW2, UTF_8)); r = adminRestSession.getJsonAccept(urlEditFile(changeId, FILE_NAME, true)); r.assertOK(); - assertThat(readContentFromJson(r)).isEqualTo( - new String(CONTENT_OLD, UTF_8)); + assertThat(readContentFromJson(r)).isEqualTo(new String(CONTENT_OLD, UTF_8)); } @Test @@ -666,25 +554,16 @@ public class ChangeEditIT extends AbstractDaemonTest { @Test public void addNewFile() throws Exception { createEmptyEditFor(changeId); - gApi.changes() - .id(changeId) - .edit() - .modifyFile(FILE_NAME3, RawInputUtil.create(CONTENT_NEW)); + gApi.changes().id(changeId).edit().modifyFile(FILE_NAME3, RawInputUtil.create(CONTENT_NEW)); ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME3), CONTENT_NEW); } @Test public void addNewFileAndAmend() throws Exception { createEmptyEditFor(changeId); - gApi.changes() - .id(changeId) - .edit() - .modifyFile(FILE_NAME3, RawInputUtil.create(CONTENT_NEW)); + gApi.changes().id(changeId).edit().modifyFile(FILE_NAME3, RawInputUtil.create(CONTENT_NEW)); ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME3), CONTENT_NEW); - gApi.changes() - .id(changeId) - .edit() - .modifyFile(FILE_NAME3, RawInputUtil.create(CONTENT_NEW2)); + gApi.changes().id(changeId).edit().modifyFile(FILE_NAME3, RawInputUtil.create(CONTENT_NEW2)); ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME3), CONTENT_NEW2); } @@ -693,10 +572,7 @@ public class ChangeEditIT extends AbstractDaemonTest { createEmptyEditFor(changeId); exception.expect(ResourceConflictException.class); exception.expectMessage("no changes were made"); - gApi.changes() - .id(changeId) - .edit() - .modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_OLD)); + gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_OLD)); } @Test @@ -710,24 +586,15 @@ public class ChangeEditIT extends AbstractDaemonTest { ReviewInput r = new ReviewInput(); r.labels = ImmutableMap.of(cr, (short) 1); - gApi.changes() - .id(changeId) - .current() - .review(r); + gApi.changes().id(changeId).current().review(r); createEmptyEditFor(changeId); String newSubj = "New commit message"; String newMsg = newSubj + "\n\nChange-Id: " + changeId + "\n"; - gApi.changes() - .id(changeId) - .edit() - .modifyCommitMessage(newMsg); + gApi.changes().id(changeId).edit().modifyCommitMessage(newMsg); PublishChangeEditInput publishInput = new PublishChangeEditInput(); publishInput.notify = NotifyHandling.NONE; - gApi.changes() - .id(changeId) - .edit() - .publish(publishInput); + gApi.changes().id(changeId).edit().publish(publishInput); ChangeInfo info = get(changeId); assertThat(info.subject).isEqualTo(newSubj); @@ -742,28 +609,16 @@ public class ChangeEditIT extends AbstractDaemonTest { assertThat(queryEdits()).hasSize(1); createEmptyEditFor(changeId2); - gApi.changes() - .id(changeId2) - .edit() - .modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW)); + gApi.changes().id(changeId2).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW)); assertThat(queryEdits()).hasSize(2); - gApi.changes() - .id(changeId) - .edit() - .modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW)); - gApi.changes() - .id(changeId) - .edit() - .delete(); + gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW)); + gApi.changes().id(changeId).edit().delete(); assertThat(queryEdits()).hasSize(1); PublishChangeEditInput publishInput = new PublishChangeEditInput(); publishInput.notify = NotifyHandling.NONE; - gApi.changes() - .id(changeId2) - .edit() - .publish(publishInput); + gApi.changes().id(changeId2).edit().publish(publishInput); assertThat(queryEdits()).isEmpty(); setApiUser(user); @@ -777,18 +632,13 @@ public class ChangeEditIT extends AbstractDaemonTest { @Test public void files() throws Exception { createEmptyEditFor(changeId); - gApi.changes() - .id(changeId) - .edit() - .modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW)); + gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW)); Optional edit = getEdit(changeId); assertThat(edit).isPresent(); String editCommitId = edit.get().commit.commit; - RestResponse r = adminRestSession.getJsonAccept(urlRevisionFiles(changeId, - editCommitId)); - Map files = readContentFromJson( - r, new TypeToken>() {}); + RestResponse r = adminRestSession.getJsonAccept(urlRevisionFiles(changeId, editCommitId)); + Map files = readContentFromJson(r, new TypeToken>() {}); assertThat(files).containsKey(FILE_NAME); r = adminRestSession.getJsonAccept(urlRevisionFiles(changeId)); @@ -799,16 +649,12 @@ public class ChangeEditIT extends AbstractDaemonTest { @Test public void diff() throws Exception { createEmptyEditFor(changeId); - gApi.changes() - .id(changeId) - .edit() - .modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW)); + gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW)); Optional edit = getEdit(changeId); assertThat(edit).isPresent(); String editCommitId = edit.get().commit.commit; - RestResponse r = adminRestSession.getJsonAccept(urlDiff(changeId, - editCommitId, FILE_NAME)); + RestResponse r = adminRestSession.getJsonAccept(urlDiff(changeId, editCommitId, FILE_NAME)); DiffInfo diff = readContentFromJson(r, DiffInfo.class); assertThat(diff.diffHeader.get(0)).contains(FILE_NAME); @@ -822,15 +668,13 @@ public class ChangeEditIT extends AbstractDaemonTest { // Create new project with clean permissions Project.NameKey p = createProject("addPatchSetEdit"); // Clone repository as user - TestRepository userTestRepo = - cloneProject(p, user); + TestRepository userTestRepo = cloneProject(p, user); // Block default permission block(Permission.ADD_PATCH_SET, REGISTERED_USERS, "refs/for/*", p); // Create change as user - PushOneCommit push = pushFactory.create( - db, user.getIdent(), userTestRepo); + PushOneCommit push = pushFactory.create(db, user.getIdent(), userTestRepo); PushOneCommit.Result r1 = push.to("refs/for/master"); r1.assertOkStatus(); @@ -845,25 +689,16 @@ public class ChangeEditIT extends AbstractDaemonTest { } private void createEmptyEditFor(String changeId) throws Exception { - gApi.changes() - .id(changeId) - .edit() - .create(); + gApi.changes().id(changeId).edit().create(); } private void arbitrarilyModifyEditOf(String changeId) throws Exception { - gApi.changes() - .id(changeId) - .edit() - .modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW)); + gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW)); } - private Optional getFileContentOfEdit(String changeId, - String filePath) throws Exception { - return gApi.changes() - .id(changeId) - .edit() - .getFile(filePath); + private Optional getFileContentOfEdit(String changeId, String filePath) + throws Exception { + return gApi.changes().id(changeId).edit().getFile(filePath); } private List queryEdits() throws Exception { @@ -872,46 +707,46 @@ public class ChangeEditIT extends AbstractDaemonTest { private String newChange(PersonIdent ident) throws Exception { PushOneCommit push = - pushFactory.create(db, ident, testRepo, PushOneCommit.SUBJECT, FILE_NAME, - new String(CONTENT_OLD, UTF_8)); + pushFactory.create( + db, ident, testRepo, PushOneCommit.SUBJECT, FILE_NAME, new String(CONTENT_OLD, UTF_8)); return push.to("refs/for/master").getChangeId(); } - private String amendChange(PersonIdent ident, String changeId) - throws Exception { - PushOneCommit push = pushFactory.create(db, ident, testRepo, - PushOneCommit.SUBJECT, FILE_NAME2, new String(CONTENT_NEW2, UTF_8), - changeId); + private String amendChange(PersonIdent ident, String changeId) throws Exception { + PushOneCommit push = + pushFactory.create( + db, + ident, + testRepo, + PushOneCommit.SUBJECT, + FILE_NAME2, + new String(CONTENT_NEW2, UTF_8), + changeId); return push.to("refs/for/master").getChangeId(); } private String newChange2(PersonIdent ident) throws Exception { - PushOneCommit push = pushFactory.create(db, ident, testRepo, - PushOneCommit.SUBJECT, FILE_NAME, new String(CONTENT_OLD, UTF_8)); + PushOneCommit push = + pushFactory.create( + db, ident, testRepo, PushOneCommit.SUBJECT, FILE_NAME, new String(CONTENT_OLD, UTF_8)); return push.rm("refs/for/master").getChangeId(); } private PatchSet getCurrentPatchSet(String changeId) throws Exception { - return getOnlyElement(queryProvider.get().byKeyPrefix(changeId)) - .currentPatchSet(); + return getOnlyElement(queryProvider.get().byKeyPrefix(changeId)).currentPatchSet(); } - private void ensureSameBytes(Optional fileContent, - byte[] expectedFileBytes) throws IOException { + private void ensureSameBytes(Optional fileContent, byte[] expectedFileBytes) + throws IOException { assertThat(fileContent).value().bytes().isEqualTo(expectedFileBytes); } private String urlEdit(String changeId) { - return "/changes/" - + changeId - + "/edit"; + return "/changes/" + changeId + "/edit"; } private String urlEditMessage(String changeId, boolean base) { - return "/changes/" - + changeId - + "/edit:message" - + (base ? "?base" : ""); + return "/changes/" + changeId + "/edit:message" + (base ? "?base" : ""); } private String urlEditFile(String changeId, String fileName) { @@ -919,41 +754,27 @@ public class ChangeEditIT extends AbstractDaemonTest { } private String urlEditFile(String changeId, String fileName, boolean base) { - return urlEdit(changeId) - + "/" - + fileName - + (base ? "?base" : ""); + return urlEdit(changeId) + "/" + fileName + (base ? "?base" : ""); } private String urlGetFiles(String changeId) { - return urlEdit(changeId) - + "?list"; + return urlEdit(changeId) + "?list"; } private String urlRevisionFiles(String changeId, String revisionId) { - return "/changes/" - + changeId - + "/revisions/" - + revisionId - + "/files"; + return "/changes/" + changeId + "/revisions/" + revisionId + "/files"; } private String urlRevisionFiles(String changeId) { - return "/changes/" - + changeId - + "/revisions/0/files"; + return "/changes/" + changeId + "/revisions/0/files"; } private String urlPublish(String changeId) { - return "/changes/" - + changeId - + "/edit:publish"; + return "/changes/" + changeId + "/edit:publish"; } private String urlRebase(String changeId) { - return "/changes/" - + changeId - + "/edit:rebase"; + return "/changes/" + changeId + "/edit:rebase"; } private String urlDiff(String changeId, String fileName) { @@ -974,23 +795,19 @@ public class ChangeEditIT extends AbstractDaemonTest { + "/diff?context=ALL&intraline"; } - private EditInfo getEditInfo(String changeId, boolean files) - throws Exception { - RestResponse r = adminRestSession.get(files ? urlGetFiles(changeId) - : urlEdit(changeId)); + private EditInfo getEditInfo(String changeId, boolean files) throws Exception { + RestResponse r = adminRestSession.get(files ? urlGetFiles(changeId) : urlEdit(changeId)); return readContentFromJson(r, EditInfo.class); } - private T readContentFromJson(RestResponse r, Class clazz) - throws Exception { + private T readContentFromJson(RestResponse r, Class clazz) throws Exception { r.assertOK(); JsonReader jsonReader = new JsonReader(r.getReader()); jsonReader.setLenient(true); return newGson().fromJson(jsonReader, clazz); } - private T readContentFromJson(RestResponse r, TypeToken typeToken) - throws Exception { + private T readContentFromJson(RestResponse r, TypeToken typeToken) throws Exception { r.assertOK(); JsonReader jsonReader = new JsonReader(r.getReader()); jsonReader.setLenient(true); @@ -1001,17 +818,13 @@ public class ChangeEditIT extends AbstractDaemonTest { return readContentFromJson(r, String.class); } - private void assertChangeMessages(String changeId, - List expectedMessages) + private void assertChangeMessages(String changeId, List expectedMessages) throws Exception { ChangeInfo ci = get(changeId); assertThat(ci.messages).isNotNull(); assertThat(ci.messages).hasSize(expectedMessages.size()); - List actualMessages = ci.messages.stream() - .map(message -> message.message) - .collect(Collectors.toList()); - assertThat(actualMessages) - .containsExactlyElementsIn(expectedMessages) - .inOrder(); + List actualMessages = + ci.messages.stream().map(message -> message.message).collect(Collectors.toList()); + assertThat(actualMessages).containsExactlyElementsIn(expectedMessages).inOrder(); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/AbstractPushForReview.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/AbstractPushForReview.java index 6fde56d95b..c3ff47694b 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/AbstractPushForReview.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/AbstractPushForReview.java @@ -58,7 +58,14 @@ import com.google.gerrit.server.project.Util; import com.google.gerrit.server.query.change.ChangeData; import com.google.gerrit.testutil.FakeEmailSender.Message; import com.google.gerrit.testutil.TestTimeUtil; - +import java.util.ArrayList; +import java.util.Collection; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.ObjectId; @@ -72,20 +79,11 @@ import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; -import java.util.ArrayList; -import java.util.Collection; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; - - public abstract class AbstractPushForReview extends AbstractDaemonTest { protected enum Protocol { // TODO(dborowitz): TEST. - SSH, HTTP + SSH, + HTTP } private LabelType patchSetLock; @@ -105,10 +103,9 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { ProjectConfig cfg = projectCache.checkedGet(project).getConfig(); patchSetLock = Util.patchSetLock(); cfg.getLabelSections().put(patchSetLock.getName(), patchSetLock); - AccountGroup.UUID anonymousUsers = - systemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID(); - Util.allow(cfg, Permission.forLabel(patchSetLock.getName()), 0, 1, anonymousUsers, - "refs/heads/*"); + AccountGroup.UUID anonymousUsers = systemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID(); + Util.allow( + cfg, Permission.forLabel(patchSetLock.getName()), 0, 1, anonymousUsers, "refs/heads/*"); saveProjectConfig(cfg); grant(Permission.LABEL + "Patch-Set-Lock", project, "refs/heads/*"); } @@ -138,8 +135,7 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { @Test @TestProjectInput(createEmptyCommit = false) public void pushInitialCommitForMasterBranch() throws Exception { - RevCommit c = - testRepo.commit().message("Initial commit").insertChangeId().create(); + RevCommit c = testRepo.commit().message("Initial commit").insertChangeId().create(); String id = GitUtil.getChangeId(testRepo, c).get(); testRepo.reset(c); @@ -165,28 +161,38 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { r1.assertOkStatus(); r1.assertChange(Change.Status.NEW, null); r1.assertMessage( - "New changes:\n" - + " " + url + id1 + " " + r1.getCommit().getShortMessage() + "\n"); + "New changes:\n" + " " + url + id1 + " " + r1.getCommit().getShortMessage() + "\n"); testRepo.reset(initialHead); String newMsg = r1.getCommit().getShortMessage() + " v2"; - testRepo.branch("HEAD").commit() + testRepo + .branch("HEAD") + .commit() .message(newMsg) .insertChangeId(r1.getChangeId().substring(1)) .create(); - PushOneCommit.Result r2 = pushFactory.create( - db, admin.getIdent(), testRepo, "another commit", "b.txt", "bbb") - .to("refs/for/master"); + PushOneCommit.Result r2 = + pushFactory + .create(db, admin.getIdent(), testRepo, "another commit", "b.txt", "bbb") + .to("refs/for/master"); Change.Id id2 = r2.getChange().getId(); r2.assertOkStatus(); r2.assertChange(Change.Status.NEW, null); r2.assertMessage( "New changes:\n" - + " " + url + id2 + " another commit\n" - + "\n" - + "\n" - + "Updated changes:\n" - + " " + url + id1 + " " + newMsg + "\n"); + + " " + + url + + id2 + + " another commit\n" + + "\n" + + "\n" + + "Updated changes:\n" + + " " + + url + + id1 + + " " + + newMsg + + "\n"); } @Test @@ -232,13 +238,10 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { gApi.accounts().self().setWatchedProjects(projectsToWatch); TestAccount user2 = accounts.user2(); - String pushSpec = "refs/for/master" - + "%reviewer=" + user.email - + ",cc=" + user2.email; + String pushSpec = "refs/for/master" + "%reviewer=" + user.email + ",cc=" + user2.email; sender.clear(); - PushOneCommit.Result r = - pushTo(pushSpec + ",notify=" + NotifyHandling.NONE); + PushOneCommit.Result r = pushTo(pushSpec + ",notify=" + NotifyHandling.NONE); r.assertOkStatus(); assertThat(sender.getMessages()).isEmpty(); @@ -260,43 +263,36 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { r.assertOkStatus(); assertThat(sender.getMessages()).hasSize(1); m = sender.getMessages().get(0); - assertThat(m.rcpt()).containsExactly(user.emailAddress, user2.emailAddress, - user3.emailAddress); + assertThat(m.rcpt()).containsExactly(user.emailAddress, user2.emailAddress, user3.emailAddress); sender.clear(); - r = pushTo(pushSpec + ",notify=" + NotifyHandling.NONE + ",notify-to=" - + user3.email); + r = pushTo(pushSpec + ",notify=" + NotifyHandling.NONE + ",notify-to=" + user3.email); r.assertOkStatus(); assertNotifyTo(user3); sender.clear(); - r = pushTo(pushSpec + ",notify=" + NotifyHandling.NONE + ",notify-cc=" - + user3.email); + r = pushTo(pushSpec + ",notify=" + NotifyHandling.NONE + ",notify-cc=" + user3.email); r.assertOkStatus(); assertNotifyCc(user3); sender.clear(); - r = pushTo(pushSpec + ",notify=" + NotifyHandling.NONE + ",notify-bcc=" - + user3.email); + r = pushTo(pushSpec + ",notify=" + NotifyHandling.NONE + ",notify-bcc=" + user3.email); r.assertOkStatus(); assertNotifyBcc(user3); // request that sender gets notified as TO, CC and BCC, email should be sent // even if the sender is the only recipient sender.clear(); - r = pushTo(pushSpec + ",notify=" + NotifyHandling.NONE + ",notify-to=" - + admin.email); + r = pushTo(pushSpec + ",notify=" + NotifyHandling.NONE + ",notify-to=" + admin.email); assertNotifyTo(admin); sender.clear(); - r = pushTo(pushSpec + ",notify=" + NotifyHandling.NONE + ",notify-cc=" - + admin.email); + r = pushTo(pushSpec + ",notify=" + NotifyHandling.NONE + ",notify-cc=" + admin.email); r.assertOkStatus(); assertNotifyCc(admin); sender.clear(); - r = pushTo(pushSpec + ",notify=" + NotifyHandling.NONE + ",notify-bcc=" - + admin.email); + r = pushTo(pushSpec + ",notify=" + NotifyHandling.NONE + ",notify-bcc=" + admin.email); r.assertOkStatus(); assertNotifyBcc(admin); } @@ -310,17 +306,32 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { r.assertChange(Change.Status.NEW, topic); // cc several users - TestAccount user2 = - accounts.create("another-user", "another.user@example.com", "Another User"); - r = pushTo("refs/for/master/" + topic + "%cc=" + admin.email + ",cc=" - + user.email + ",cc=" + user2.email); + TestAccount user2 = accounts.create("another-user", "another.user@example.com", "Another User"); + r = + pushTo( + "refs/for/master/" + + topic + + "%cc=" + + admin.email + + ",cc=" + + user.email + + ",cc=" + + user2.email); r.assertOkStatus(); r.assertChange(Change.Status.NEW, topic); // cc non-existing user String nonExistingEmail = "non.existing@example.com"; - r = pushTo("refs/for/master/" + topic + "%cc=" + admin.email + ",cc=" - + nonExistingEmail + ",cc=" + user.email); + r = + pushTo( + "refs/for/master/" + + topic + + "%cc=" + + admin.email + + ",cc=" + + nonExistingEmail + + ",cc=" + + user.email); r.assertErrorStatus("user \"" + nonExistingEmail + "\" not found"); } @@ -333,18 +344,33 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { r.assertChange(Change.Status.NEW, topic, user); // add several reviewers - TestAccount user2 = - accounts.create("another-user", "another.user@example.com", "Another User"); - r = pushTo("refs/for/master/" + topic + "%r=" + admin.email + ",r=" + user.email - + ",r=" + user2.email); + TestAccount user2 = accounts.create("another-user", "another.user@example.com", "Another User"); + r = + pushTo( + "refs/for/master/" + + topic + + "%r=" + + admin.email + + ",r=" + + user.email + + ",r=" + + user2.email); r.assertOkStatus(); // admin is the owner of the change and should not appear as reviewer r.assertChange(Change.Status.NEW, topic, user, user2); // add non-existing user as reviewer String nonExistingEmail = "non.existing@example.com"; - r = pushTo("refs/for/master/" + topic + "%r=" + admin.email + ",r=" - + nonExistingEmail + ",r=" + user.email); + r = + pushTo( + "refs/for/master/" + + topic + + "%r=" + + admin.email + + ",r=" + + nonExistingEmail + + ",r=" + + user.email); r.assertErrorStatus("user \"" + nonExistingEmail + "\" not found"); } @@ -387,10 +413,13 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { edit = getEdit(r.getChangeId()); assertThat(edit).isPresent(); EditInfo editInfo = edit.get(); - r.assertMessage("Updated Changes:\n " - + canonicalWebUrl.get() - + r.getChange().getId() - + " " + editInfo.commit.subject + " [EDIT]\n"); + r.assertMessage( + "Updated Changes:\n " + + canonicalWebUrl.get() + + r.getChange().getId() + + " " + + editInfo.commit.subject + + " [EDIT]\n"); } @Test @@ -402,8 +431,7 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { Collection changeMessages = ci.messages; assertThat(changeMessages).hasSize(1); for (ChangeMessageInfo cm : changeMessages) { - assertThat(cm.message).isEqualTo( - "Uploaded patch set 1.\nmy test message"); + assertThat(cm.message).isEqualTo("Uploaded patch set 1.\nmy test message"); } Collection revisions = ci.revisions.values(); assertThat(revisions).hasSize(1); @@ -413,31 +441,33 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { } @Test - public void pushForMasterWithMessageTwiceWithDifferentMessages() - throws Exception { + public void pushForMasterWithMessageTwiceWithDifferentMessages() throws Exception { ProjectConfig config = projectCache.checkedGet(project).getConfig(); - config.getProject() - .setCreateNewChangeForAllNotInTarget(InheritableBoolean.TRUE); + config.getProject().setCreateNewChangeForAllNotInTarget(InheritableBoolean.TRUE); saveProjectConfig(project, config); PushOneCommit push = - pushFactory - .create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, - "a.txt", "content"); + pushFactory.create( + db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "a.txt", "content"); PushOneCommit.Result r = push.to("refs/for/master/%m=my_test_message"); r.assertOkStatus(); push = - pushFactory - .create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, - "b.txt", "anotherContent", r.getChangeId()); + pushFactory.create( + db, + admin.getIdent(), + testRepo, + PushOneCommit.SUBJECT, + "b.txt", + "anotherContent", + r.getChangeId()); r = push.to("refs/for/master/%m=new_test_message"); r.assertOkStatus(); ChangeInfo ci = get(r.getChangeId()); Collection revisions = ci.revisions.values(); assertThat(revisions).hasSize(2); - for (RevisionInfo ri: revisions) { + for (RevisionInfo ri : revisions) { if (ri.isCurrent) { assertThat(ri.description).isEqualTo("new test message"); } else { @@ -455,52 +485,63 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { assertThat(cr.all).hasSize(1); assertThat(cr.all.get(0).name).isEqualTo("Administrator"); assertThat(cr.all.get(0).value).isEqualTo(1); - assertThat(Iterables.getLast(ci.messages).message).isEqualTo( - "Uploaded patch set 1: Code-Review+1."); + assertThat(Iterables.getLast(ci.messages).message) + .isEqualTo("Uploaded patch set 1: Code-Review+1."); PushOneCommit push = - pushFactory.create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, - "b.txt", "anotherContent", r.getChangeId()); + pushFactory.create( + db, + admin.getIdent(), + testRepo, + PushOneCommit.SUBJECT, + "b.txt", + "anotherContent", + r.getChangeId()); r = push.to("refs/for/master/%l=Code-Review+2"); ci = get(r.getChangeId()); cr = ci.labels.get("Code-Review"); - assertThat(Iterables.getLast(ci.messages).message).isEqualTo( - "Uploaded patch set 2: Code-Review+2."); + assertThat(Iterables.getLast(ci.messages).message) + .isEqualTo("Uploaded patch set 2: Code-Review+2."); assertThat(cr.all).hasSize(1); assertThat(cr.all.get(0).name).isEqualTo("Administrator"); assertThat(cr.all.get(0).value).isEqualTo(2); push = - pushFactory.create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, - "c.txt", "moreContent", r.getChangeId()); + pushFactory.create( + db, + admin.getIdent(), + testRepo, + PushOneCommit.SUBJECT, + "c.txt", + "moreContent", + r.getChangeId()); r = push.to("refs/for/master/%l=Code-Review+2"); ci = get(r.getChangeId()); - assertThat(Iterables.getLast(ci.messages).message).isEqualTo( - "Uploaded patch set 3."); + assertThat(Iterables.getLast(ci.messages).message).isEqualTo("Uploaded patch set 3."); } /** - * There was a bug that allowed a user with Forge Committer Identity access - * right to upload a commit and put *votes on behalf of another user* on it. - * This test checks that this is not possible, but that the votes that are - * specified on push are applied only on behalf of the uploader. + * There was a bug that allowed a user with Forge Committer Identity access right to upload a + * commit and put *votes on behalf of another user* on it. This test checks that this is not + * possible, but that the votes that are specified on push are applied only on behalf of the + * uploader. * - * This particular bug only occurred when there was more than one label - * defined. However to test that the votes that are specified on push are - * applied on behalf of the uploader a single label is sufficient. + *

This particular bug only occurred when there was more than one label defined. However to + * test that the votes that are specified on push are applied on behalf of the uploader a single + * label is sufficient. */ @Test - public void pushForMasterWithApprovalsForgeCommitterButNoForgeVote() - throws Exception { + public void pushForMasterWithApprovalsForgeCommitterButNoForgeVote() throws Exception { // Create a commit with "User" as author and committer - RevCommit c = commitBuilder() - .author(user.getIdent()) - .committer(user.getIdent()) - .add(PushOneCommit.FILE_NAME, PushOneCommit.FILE_CONTENT) - .message(PushOneCommit.SUBJECT) - .create(); + RevCommit c = + commitBuilder() + .author(user.getIdent()) + .committer(user.getIdent()) + .add(PushOneCommit.FILE_NAME, PushOneCommit.FILE_CONTENT) + .message(PushOneCommit.SUBJECT) + .create(); // Push this commit as "Administrator" (requires Forge Committer Identity) pushHead(testRepo, "refs/for/master/%l=Code-Review+1", false); @@ -521,31 +562,28 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { assertThat(cr.all.get(indexAdmin).value.intValue()).isEqualTo(1); assertThat(cr.all.get(indexUser).name).isEqualTo(user.fullName); assertThat(cr.all.get(indexUser).value.intValue()).isEqualTo(0); - assertThat(Iterables.getLast(ci.messages).message).isEqualTo( - "Uploaded patch set 1: Code-Review+1."); + assertThat(Iterables.getLast(ci.messages).message) + .isEqualTo("Uploaded patch set 1: Code-Review+1."); } @Test - public void pushWithMultipleApprovals() - throws Exception { - LabelType Q = category("Custom-Label", - value(1, "Positive"), - value(0, "No score"), - value(-1, "Negative")); + public void pushWithMultipleApprovals() throws Exception { + LabelType Q = + category("Custom-Label", value(1, "Positive"), value(0, "No score"), value(-1, "Negative")); ProjectConfig config = projectCache.checkedGet(project).getConfig(); - AccountGroup.UUID anon = - systemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID(); + AccountGroup.UUID anon = systemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID(); String heads = "refs/heads/*"; Util.allow(config, Permission.forLabel("Custom-Label"), -1, 1, anon, heads); config.getLabelSections().put(Q.getName(), Q); saveProjectConfig(project, config); - RevCommit c = commitBuilder() - .author(admin.getIdent()) - .committer(admin.getIdent()) - .add(PushOneCommit.FILE_NAME, PushOneCommit.FILE_CONTENT) - .message(PushOneCommit.SUBJECT) - .create(); + RevCommit c = + commitBuilder() + .author(admin.getIdent()) + .committer(admin.getIdent()) + .add(PushOneCommit.FILE_NAME, PushOneCommit.FILE_CONTENT) + .message(PushOneCommit.SUBJECT) + .create(); pushHead(testRepo, "refs/for/master/%l=Code-Review+1,l=Custom-Label-1", false); @@ -561,8 +599,14 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { PushOneCommit.Result r = pushTo("refs/for/master"); r.assertOkStatus(); PushOneCommit push = - pushFactory.create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, - "b.txt", "anotherContent", r.getChangeId()); + pushFactory.create( + db, + admin.getIdent(), + testRepo, + PushOneCommit.SUBJECT, + "b.txt", + "anotherContent", + r.getChangeId()); r = push.to("refs/changes/" + r.getChange().change().getId().get()); r.assertOkStatus(); } @@ -571,19 +615,27 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { public void pushNewPatchsetToPatchSetLockedChange() throws Exception { PushOneCommit.Result r = pushTo("refs/for/master"); r.assertOkStatus(); - PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo, - PushOneCommit.SUBJECT, "b.txt", "anotherContent", r.getChangeId()); + PushOneCommit push = + pushFactory.create( + db, + admin.getIdent(), + testRepo, + PushOneCommit.SUBJECT, + "b.txt", + "anotherContent", + r.getChangeId()); revision(r).review(new ReviewInput().label("Patch-Set-Lock", 1)); r = push.to("refs/for/master"); - r.assertErrorStatus("cannot add patch set to " - + r.getChange().change().getChangeId() - + ". Change is patch set locked."); + r.assertErrorStatus( + "cannot add patch set to " + + r.getChange().change().getChangeId() + + ". Change is patch set locked."); } @Test public void pushForMasterWithApprovals_MissingLabel() throws Exception { - PushOneCommit.Result r = pushTo("refs/for/master/%l=Verify"); - r.assertErrorStatus("label \"Verify\" is not a configured label"); + PushOneCommit.Result r = pushTo("refs/for/master/%l=Verify"); + r.assertErrorStatus("label \"Verify\" is not a configured label"); } @Test @@ -617,8 +669,14 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { // specify a single hashtag as option in new patch set String hashtag2 = "tag2"; PushOneCommit push = - pushFactory.create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, - "b.txt", "anotherContent", r.getChangeId()); + pushFactory.create( + db, + admin.getIdent(), + testRepo, + PushOneCommit.SUBJECT, + "b.txt", + "anotherContent", + r.getChangeId()); r = push.to("refs/for/master/%hashtag=" + hashtag2); r.assertOkStatus(); expected = ImmutableSet.of(hashtag1, hashtag2); @@ -635,8 +693,8 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { String hashtag1 = "tag1"; String hashtag2 = "tag2"; Set expected = ImmutableSet.of(hashtag1, hashtag2); - PushOneCommit.Result r = pushTo("refs/for/master%hashtag=#" + hashtag1 - + ",hashtag=##" + hashtag2); + PushOneCommit.Result r = + pushTo("refs/for/master%hashtag=#" + hashtag1 + ",hashtag=##" + hashtag2); r.assertOkStatus(); r.assertChange(Change.Status.NEW, null); @@ -647,8 +705,14 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { String hashtag3 = "tag3"; String hashtag4 = "tag4"; PushOneCommit push = - pushFactory.create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, - "b.txt", "anotherContent", r.getChangeId()); + pushFactory.create( + db, + admin.getIdent(), + testRepo, + PushOneCommit.SUBJECT, + "b.txt", + "anotherContent", + r.getChangeId()); r = push.to("refs/for/master%hashtag=" + hashtag3 + ",hashtag=" + hashtag4); r.assertOkStatus(); expected = ImmutableSet.of(hashtag1, hashtag2, hashtag3, hashtag4); @@ -667,26 +731,31 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { @Test public void pushCommitUsingSignedOffBy() throws Exception { PushOneCommit push = - pushFactory.create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, - "b.txt", "anotherContent"); + pushFactory.create( + db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "b.txt", "anotherContent"); PushOneCommit.Result r = push.to("refs/for/master"); r.assertOkStatus(); setUseSignedOffBy(InheritableBoolean.TRUE); blockForgeCommitter(project, "refs/heads/master"); - push = pushFactory.create(db, admin.getIdent(), testRepo, - PushOneCommit.SUBJECT + String.format( - "\n\nSigned-off-by: %s <%s>", admin.fullName, admin.email), - "b.txt", "anotherContent"); + push = + pushFactory.create( + db, + admin.getIdent(), + testRepo, + PushOneCommit.SUBJECT + + String.format("\n\nSigned-off-by: %s <%s>", admin.fullName, admin.email), + "b.txt", + "anotherContent"); r = push.to("refs/for/master"); r.assertOkStatus(); - push = pushFactory.create(db, admin.getIdent(), testRepo, - PushOneCommit.SUBJECT, "b.txt", "anotherContent"); + push = + pushFactory.create( + db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "b.txt", "anotherContent"); r = push.to("refs/for/master"); - r.assertErrorStatus( - "not Signed-off-by author/committer/uploader in commit message footer"); + r.assertErrorStatus("not Signed-off-by author/committer/uploader in commit message footer"); } @Test @@ -696,21 +765,18 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { saveProjectConfig(project, config); PushOneCommit push = - pushFactory.create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, - "a.txt", "content"); + pushFactory.create( + db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "a.txt", "content"); PushOneCommit.Result r = push.to("refs/for/master"); r.assertOkStatus(); push = - pushFactory.create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, - "b.txt", "anotherContent"); + pushFactory.create( + db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "b.txt", "anotherContent"); r = push.to("refs/for/master"); r.assertOkStatus(); - gApi.projects() - .name(project.get()) - .branch("otherBranch") - .create(new BranchInput()); + gApi.projects().name(project.get()).branch("otherBranch").create(new BranchInput()); PushOneCommit.Result r2 = push.to("refs/for/otherBranch"); r2.assertOkStatus(); @@ -718,26 +784,22 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { } @Test - public void pushSameCommitTwiceUsingMagicBranchBaseOption() - throws Exception { + public void pushSameCommitTwiceUsingMagicBranchBaseOption() throws Exception { grant(Permission.PUSH, project, "refs/heads/master"); PushOneCommit.Result rBase = pushTo("refs/heads/master"); rBase.assertOkStatus(); - gApi.projects() - .name(project.get()) - .branch("foo") - .create(new BranchInput()); + gApi.projects().name(project.get()).branch("foo").create(new BranchInput()); PushOneCommit push = - pushFactory.create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, - "b.txt", "anotherContent"); + pushFactory.create( + db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "b.txt", "anotherContent"); PushOneCommit.Result r = push.to("refs/for/master"); r.assertOkStatus(); - PushResult pr = GitUtil.pushHead( - testRepo, "refs/for/foo%base=" + rBase.getCommit().name(), false, false); + PushResult pr = + GitUtil.pushHead(testRepo, "refs/for/foo%base=" + rBase.getCommit().name(), false, false); assertThat(pr.getMessages()).contains("changes: new: 1, refs: 1, done"); assertTwoChangesWithSameRevision(r); @@ -746,57 +808,54 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { @Test public void pushSameCommitTwice() throws Exception { ProjectConfig config = projectCache.checkedGet(project).getConfig(); - config.getProject() - .setCreateNewChangeForAllNotInTarget(InheritableBoolean.TRUE); + config.getProject().setCreateNewChangeForAllNotInTarget(InheritableBoolean.TRUE); saveProjectConfig(project, config); PushOneCommit push = - pushFactory - .create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, - "a.txt", "content"); + pushFactory.create( + db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "a.txt", "content"); PushOneCommit.Result r = push.to("refs/for/master"); r.assertOkStatus(); push = - pushFactory - .create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, - "b.txt", "anotherContent"); + pushFactory.create( + db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "b.txt", "anotherContent"); r = push.to("refs/for/master"); r.assertOkStatus(); - assertPushRejected(pushHead(testRepo, "refs/for/master", false), - "refs/for/master", "commit(s) already exists (as current patchset)"); + assertPushRejected( + pushHead(testRepo, "refs/for/master", false), + "refs/for/master", + "commit(s) already exists (as current patchset)"); } @Test public void pushSameCommitTwiceWhenIndexFailed() throws Exception { ProjectConfig config = projectCache.checkedGet(project).getConfig(); - config.getProject() - .setCreateNewChangeForAllNotInTarget(InheritableBoolean.TRUE); + config.getProject().setCreateNewChangeForAllNotInTarget(InheritableBoolean.TRUE); saveProjectConfig(project, config); PushOneCommit push = - pushFactory - .create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, - "a.txt", "content"); + pushFactory.create( + db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "a.txt", "content"); PushOneCommit.Result r = push.to("refs/for/master"); r.assertOkStatus(); push = - pushFactory - .create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, - "b.txt", "anotherContent"); + pushFactory.create( + db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "b.txt", "anotherContent"); r = push.to("refs/for/master"); r.assertOkStatus(); indexer.delete(r.getChange().getId()); - assertPushRejected(pushHead(testRepo, "refs/for/master", false), - "refs/for/master", "commit(s) already exists (as current patchset)"); + assertPushRejected( + pushHead(testRepo, "refs/for/master", false), + "refs/for/master", + "commit(s) already exists (as current patchset)"); } - private void assertTwoChangesWithSameRevision(PushOneCommit.Result result) - throws Exception { + private void assertTwoChangesWithSameRevision(PushOneCommit.Result result) throws Exception { List changes = query(result.getCommit().name()); assertThat(changes).hasSize(2); ChangeInfo c1 = get(changes.get(0).id); @@ -829,11 +888,10 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { RevCommit c2 = commits2.get(i); String name = "change for " + c2.name(); ChangeData cd = byCommit(c); - assertThat(cd.change().getSubject()) + assertThat(cd.change().getSubject()).named(name).isEqualTo(c2.getShortMessage()); + assertThat(getPatchSetRevisions(cd)) .named(name) - .isEqualTo(c2.getShortMessage()); - assertThat(getPatchSetRevisions(cd)).named(name).containsExactlyEntriesIn( - ImmutableMap.of(1, c.name(), 2, c2.name())); + .containsExactlyEntriesIn(ImmutableMap.of(1, c.name(), 2, c2.name())); } // Pushing again results in "no new changes". @@ -844,8 +902,7 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { public void pushWithoutChangeId() throws Exception { RevCommit c = createCommit(testRepo, "Message without Change-Id"); assertThat(GitUtil.getChangeId(testRepo, c).isPresent()).isFalse(); - pushForReviewRejected(testRepo, - "missing Change-Id in commit message footer"); + pushForReviewRejected(testRepo, "missing Change-Id in commit message footer"); ProjectConfig config = projectCache.checkedGet(project).getConfig(); config.getProject().setRequireChangeID(InheritableBoolean.FALSE); @@ -855,55 +912,49 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { @Test public void pushWithMultipleChangeIds() throws Exception { - createCommit(testRepo, + createCommit( + testRepo, "Message with multiple Change-Id\n" + "\n" + "Change-Id: I10f98c2ef76e52e23aa23be5afeb71e40b350e86\n" + "Change-Id: Ie9a132e107def33bdd513b7854b50de911edba0a\n"); - pushForReviewRejected(testRepo, - "multiple Change-Id lines in commit message footer"); + pushForReviewRejected(testRepo, "multiple Change-Id lines in commit message footer"); ProjectConfig config = projectCache.checkedGet(project).getConfig(); config.getProject().setRequireChangeID(InheritableBoolean.FALSE); saveProjectConfig(project, config); - pushForReviewRejected(testRepo, - "multiple Change-Id lines in commit message footer"); + pushForReviewRejected(testRepo, "multiple Change-Id lines in commit message footer"); } @Test public void pushWithInvalidChangeId() throws Exception { - createCommit(testRepo, "Message with invalid Change-Id\n" - + "\n" - + "Change-Id: X\n"); - pushForReviewRejected(testRepo, - "invalid Change-Id line format in commit message footer"); + createCommit(testRepo, "Message with invalid Change-Id\n" + "\n" + "Change-Id: X\n"); + pushForReviewRejected(testRepo, "invalid Change-Id line format in commit message footer"); ProjectConfig config = projectCache.checkedGet(project).getConfig(); config.getProject().setRequireChangeID(InheritableBoolean.FALSE); saveProjectConfig(project, config); - pushForReviewRejected(testRepo, - "invalid Change-Id line format in commit message footer"); + pushForReviewRejected(testRepo, "invalid Change-Id line format in commit message footer"); } @Test public void pushWithInvalidChangeIdFromEgit() throws Exception { - createCommit(testRepo, "Message with invalid Change-Id\n" - + "\n" - + "Change-Id: I0000000000000000000000000000000000000000\n"); - pushForReviewRejected(testRepo, - "invalid Change-Id line format in commit message footer"); + createCommit( + testRepo, + "Message with invalid Change-Id\n" + + "\n" + + "Change-Id: I0000000000000000000000000000000000000000\n"); + pushForReviewRejected(testRepo, "invalid Change-Id line format in commit message footer"); ProjectConfig config = projectCache.checkedGet(project).getConfig(); config.getProject().setRequireChangeID(InheritableBoolean.FALSE); saveProjectConfig(project, config); - pushForReviewRejected(testRepo, - "invalid Change-Id line format in commit message footer"); + pushForReviewRejected(testRepo, "invalid Change-Id line format in commit message footer"); } - private static RevCommit createCommit(TestRepository testRepo, - String message) throws Exception { - return testRepo.branch("HEAD").commit().message(message) - .add("a.txt", "content").create(); + private static RevCommit createCommit(TestRepository testRepo, String message) + throws Exception { + return testRepo.branch("HEAD").commit().message(message).add("a.txt", "content").create(); } @Test @@ -919,20 +970,16 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { tr.branch("refs/heads/master").update(r1.getCommit()); } - assertThat(gApi.changes().id(id1.get()).info().status) - .isEqualTo(ChangeStatus.NEW); - assertThat(gApi.changes().id(id2.get()).info().status) - .isEqualTo(ChangeStatus.NEW); + assertThat(gApi.changes().id(id1.get()).info().status).isEqualTo(ChangeStatus.NEW); + assertThat(gApi.changes().id(id2.get()).info().status).isEqualTo(ChangeStatus.NEW); r2 = amendChange(r2.getChangeId()); r2.assertOkStatus(); // Change 1 is still new despite being merged into the branch, because // ReceiveCommits only considers commits between the branch tip (which is // now the merged change 1) and the push tip (new patch set of change 2). - assertThat(gApi.changes().id(id1.get()).info().status) - .isEqualTo(ChangeStatus.NEW); - assertThat(gApi.changes().id(id2.get()).info().status) - .isEqualTo(ChangeStatus.NEW); + assertThat(gApi.changes().id(id1.get()).info().status).isEqualTo(ChangeStatus.NEW); + assertThat(gApi.changes().id(id2.get()).info().status).isEqualTo(ChangeStatus.NEW); } @Test @@ -940,8 +987,7 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { throws Exception { Change.Id id = accidentallyPushNewPatchSetDirectlyToBranch(); ChangeData cd = byChangeId(id); - String ps1Rev = - Iterables.getOnlyElement(cd.patchSets()).getRevision().get(); + String ps1Rev = Iterables.getOnlyElement(cd.patchSets()).getRevision().get(); String r = "refs/changes/" + id; assertPushOk(pushHead(testRepo, r, false), r); @@ -949,10 +995,9 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { // Added a new patch set and auto-closed the change. cd = byChangeId(id); assertThat(cd.change().getStatus()).isEqualTo(Change.Status.MERGED); - assertThat(getPatchSetRevisions(cd)).containsExactlyEntriesIn( - ImmutableMap.of( - 1, ps1Rev, - 2, testRepo.getRepository().resolve("HEAD").name())); + assertThat(getPatchSetRevisions(cd)) + .containsExactlyEntriesIn( + ImmutableMap.of(1, ps1Rev, 2, testRepo.getRepository().resolve("HEAD").name())); } @Test @@ -960,8 +1005,7 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { throws Exception { Change.Id id = accidentallyPushNewPatchSetDirectlyToBranch(); ChangeData cd = byChangeId(id); - String ps1Rev = - Iterables.getOnlyElement(cd.patchSets()).getRevision().get(); + String ps1Rev = Iterables.getOnlyElement(cd.patchSets()).getRevision().get(); String r = "refs/for/master"; assertPushRejected(pushHead(testRepo, r, false), r, "no new changes"); @@ -969,12 +1013,10 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { // Change not updated. cd = byChangeId(id); assertThat(cd.change().getStatus()).isEqualTo(Change.Status.NEW); - assertThat(getPatchSetRevisions(cd)).containsExactlyEntriesIn( - ImmutableMap.of(1, ps1Rev)); + assertThat(getPatchSetRevisions(cd)).containsExactlyEntriesIn(ImmutableMap.of(1, ps1Rev)); } - private Change.Id accidentallyPushNewPatchSetDirectlyToBranch() - throws Exception { + private Change.Id accidentallyPushNewPatchSetDirectlyToBranch() throws Exception { PushOneCommit.Result r = createChange(); RevCommit ps1Commit = r.getCommit(); Change c = r.getChange().change(); @@ -986,20 +1028,21 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { // create and push this behind Gerrit's back (e.g. an admin accidentally // using direct ssh access to the repo), but that's harder to do in tests. TestRepository tr = new TestRepository<>(repo); - ps2Commit = tr.branch("refs/heads/master").commit() - .message(ps1Commit.getShortMessage() + " v2") - .insertChangeId(r.getChangeId().substring(1)) - .create(); + ps2Commit = + tr.branch("refs/heads/master") + .commit() + .message(ps1Commit.getShortMessage() + " v2") + .insertChangeId(r.getChangeId().substring(1)) + .create(); } - testRepo.git().fetch() - .setRefSpecs(new RefSpec("refs/heads/master")).call(); + testRepo.git().fetch().setRefSpecs(new RefSpec("refs/heads/master")).call(); testRepo.reset(ps2Commit); ChangeData cd = byCommit(ps1Commit); assertThat(cd.change().getStatus()).isEqualTo(Change.Status.NEW); - assertThat(getPatchSetRevisions(cd)).containsExactlyEntriesIn( - ImmutableMap.of(1, ps1Commit.name())); + assertThat(getPatchSetRevisions(cd)) + .containsExactlyEntriesIn(ImmutableMap.of(1, ps1Commit.name())); return c.getId(); } @@ -1015,9 +1058,7 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { @Test public void pushWithEmailInFooterNotFound() throws Exception { - pushWithReviewerInFooter( - new Address("No Body", "notarealuser@example.com").toString(), - null); + pushWithReviewerInFooter(new Address("No Body", "notarealuser@example.com").toString(), null); } @Test @@ -1036,8 +1077,14 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { PushOneCommit.Result r = pushTo("refs/for/master%l=Code-Review+2"); r.assertOkStatus(); PushOneCommit push = - pushFactory.create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, - "b.txt", "anotherContent", r.getChangeId()); + pushFactory.create( + db, + admin.getIdent(), + testRepo, + PushOneCommit.SUBJECT, + "b.txt", + "anotherContent", + r.getChangeId()); r = push.to("refs/for/master%l=Code-Review+1"); r.assertOkStatus(); } @@ -1048,31 +1095,23 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { grant(Permission.PUSH, project, master, true); // Update master with a direct push. - RevCommit c1 = testRepo.commit() - .message("Non-change 1") - .create(); - RevCommit c2 = testRepo.parseBody( - testRepo.commit() - .parent(c1) - .message("Non-change 2") - .insertChangeId() - .create()); + RevCommit c1 = testRepo.commit().message("Non-change 1").create(); + RevCommit c2 = + testRepo.parseBody( + testRepo.commit().parent(c1).message("Non-change 2").insertChangeId().create()); String changeId = Iterables.getOnlyElement(c2.getFooterLines(CHANGE_ID)); testRepo.reset(c2); assertPushOk(pushHead(testRepo, master, false, true), master); - String q = "commit:" + c1.name() - + " OR commit:" + c2.name() - + " OR change:" + changeId; + String q = "commit:" + c1.name() + " OR commit:" + c2.name() + " OR change:" + changeId; assertThat(gApi.changes().query(q).get()).isEmpty(); // Push c2 as a merged change. String r = "refs/for/master%merged"; assertPushOk(pushHead(testRepo, r, false), r); - EnumSet opts = - EnumSet.of(ListChangesOption.CURRENT_REVISION); + EnumSet opts = EnumSet.of(ListChangesOption.CURRENT_REVISION); ChangeInfo info = gApi.changes().id(changeId).get(opts); assertThat(info.currentRevision).isEqualTo(c2.name()); assertThat(info.status).isEqualTo(ChangeStatus.MERGED); @@ -1084,8 +1123,7 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { // Push c1 as a merged change. testRepo.reset(c1); assertPushOk(pushHead(testRepo, r, false), r); - List infos = - gApi.changes().query(q1).withOptions(opts).get(); + List infos = gApi.changes().query(q1).withOptions(opts).get(); assertThat(infos).hasSize(1); info = infos.get(0); assertThat(info.currentRevision).isEqualTo(c1.name()); @@ -1099,8 +1137,7 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { } @Test - public void mergedOptionFailsWhenCommitIsMergedOnOtherBranch() - throws Exception { + public void mergedOptionFailsWhenCommitIsMergedOnOtherBranch() throws Exception { PushOneCommit.Result r = pushTo("refs/for/master"); r.assertOkStatus(); gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve()); @@ -1108,14 +1145,10 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { try (Repository repo = repoManager.openRepository(project)) { TestRepository tr = new TestRepository<>(repo); - tr.branch("refs/heads/branch") - .commit() - .message("Initial commit on branch") - .create(); + tr.branch("refs/heads/branch").commit().message("Initial commit on branch").create(); } - pushTo("refs/for/master%merged") - .assertErrorStatus("not merged into branch"); + pushTo("refs/for/master%merged").assertErrorStatus("not merged into branch"); } @Test @@ -1129,36 +1162,34 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { String ref = "refs/for/master%merged"; PushResult pr = pushHead(testRepo, ref, false); RemoteRefUpdate rru = pr.getRemoteUpdate(ref); - assertThat(rru.getStatus()) - .isEqualTo(RemoteRefUpdate.Status.REJECTED_OTHER_REASON); + assertThat(rru.getStatus()).isEqualTo(RemoteRefUpdate.Status.REJECTED_OTHER_REASON); assertThat(rru.getMessage()).contains("no new changes"); } @Test - public void mergedOptionWithNewCommitWithSameChangeIdFails() - throws Exception { + public void mergedOptionWithNewCommitWithSameChangeIdFails() throws Exception { PushOneCommit.Result r = pushTo("refs/for/master"); r.assertOkStatus(); gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve()); gApi.changes().id(r.getChangeId()).current().submit(); - RevCommit c2 = testRepo.amend(r.getCommit()) - .message("New subject") - .insertChangeId(r.getChangeId().substring(1)) - .create(); + RevCommit c2 = + testRepo + .amend(r.getCommit()) + .message("New subject") + .insertChangeId(r.getChangeId().substring(1)) + .create(); testRepo.reset(c2); String ref = "refs/for/master%merged"; PushResult pr = pushHead(testRepo, ref, false); RemoteRefUpdate rru = pr.getRemoteUpdate(ref); - assertThat(rru.getStatus()) - .isEqualTo(RemoteRefUpdate.Status.REJECTED_OTHER_REASON); + assertThat(rru.getStatus()).isEqualTo(RemoteRefUpdate.Status.REJECTED_OTHER_REASON); assertThat(rru.getMessage()).contains("not merged into branch"); } @Test - public void mergedOptionWithExistingChangeInsertsPatchSet() - throws Exception { + public void mergedOptionWithExistingChangeInsertsPatchSet() throws Exception { String master = "refs/heads/master"; grant(Permission.PUSH, project, master, true); @@ -1173,49 +1204,39 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { ObjectId c2; try (Repository repo = repoManager.openRepository(project)) { TestRepository tr = new TestRepository<>(repo); - RevCommit commit2 = tr.amend(c1) - .message("New subject") - .insertChangeId(r.getChangeId().substring(1)) - .create(); + RevCommit commit2 = + tr.amend(c1).message("New subject").insertChangeId(r.getChangeId().substring(1)).create(); c2 = commit2.copy(); tr.update(master, c2); } - testRepo.git().fetch() - .setRefSpecs(new RefSpec("refs/heads/master")).call(); + testRepo.git().fetch().setRefSpecs(new RefSpec("refs/heads/master")).call(); testRepo.reset(c2); String ref = "refs/for/master%merged"; assertPushOk(pushHead(testRepo, ref, false), ref); - EnumSet opts = - EnumSet.of(ListChangesOption.ALL_REVISIONS); + EnumSet opts = EnumSet.of(ListChangesOption.ALL_REVISIONS); ChangeInfo info = gApi.changes().id(r.getChangeId()).get(opts); assertThat(info.currentRevision).isEqualTo(c2.name()); - assertThat(info.revisions.keySet()) - .containsExactly(c1.name(), c2.name()); + assertThat(info.revisions.keySet()).containsExactly(c1.name(), c2.name()); // TODO(dborowitz): Fix ReceiveCommits to also auto-close the change. assertThat(info.status).isEqualTo(ChangeStatus.NEW); } - private void pushWithReviewerInFooter(String nameEmail, - TestAccount expectedReviewer) throws Exception { + private void pushWithReviewerInFooter(String nameEmail, TestAccount expectedReviewer) + throws Exception { int n = 5; String r = "refs/for/master"; ObjectId initialHead = testRepo.getRepository().resolve("HEAD"); - List commits = - createChanges(n, r, ImmutableList.of("Acked-By: " + nameEmail)); + List commits = createChanges(n, r, ImmutableList.of("Acked-By: " + nameEmail)); for (int i = 0; i < n; i++) { RevCommit c = commits.get(i); ChangeData cd = byCommit(c); String name = "reviewers for " + (i + 1); if (expectedReviewer != null) { - assertThat(cd.reviewers().all()).named(name) - .containsExactly(expectedReviewer.getId()); - gApi.changes() - .id(cd.getId().get()) - .reviewer(expectedReviewer.getId().toString()) - .remove(); + assertThat(cd.reviewers().all()).named(name).containsExactly(expectedReviewer.getId()); + gApi.changes().id(cd.getId().get()).reviewer(expectedReviewer.getId().toString()).remove(); } assertThat(byCommit(c).reviewers().all()).named(name).isEmpty(); } @@ -1226,21 +1247,19 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { ChangeData cd = byCommit(c); String name = "reviewers for " + (i + 1); if (expectedReviewer != null) { - assertThat(cd.reviewers().all()).named(name) - .containsExactly(expectedReviewer.getId()); + assertThat(cd.reviewers().all()).named(name).containsExactly(expectedReviewer.getId()); } else { assertThat(byCommit(c).reviewers().all()).named(name).isEmpty(); } } } - private List createChanges(int n, String refsFor) - throws Exception { + private List createChanges(int n, String refsFor) throws Exception { return createChanges(n, refsFor, ImmutableList.of()); } - private List createChanges(int n, String refsFor, - List footerLines) throws Exception { + private List createChanges(int n, String refsFor, List footerLines) + throws Exception { List commits = new ArrayList<>(n); for (int i = 1; i <= n; i++) { String msg = "Change " + i; @@ -1251,8 +1270,8 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { } msg = sb.toString(); } - TestRepository.CommitBuilder cb = testRepo.branch("HEAD").commit() - .message(msg).insertChangeId(); + TestRepository.CommitBuilder cb = + testRepo.branch("HEAD").commit().message(msg).insertChangeId(); if (!commits.isEmpty()) { cb.parent(commits.get(commits.size() - 1)); } @@ -1264,8 +1283,8 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { return commits; } - private List amendChanges(ObjectId initialHead, - List origCommits, String refsFor) throws Exception { + private List amendChanges( + ObjectId initialHead, List origCommits, String refsFor) throws Exception { testRepo.reset(initialHead); List newCommits = new ArrayList<>(origCommits.size()); for (RevCommit c : origCommits) { @@ -1273,8 +1292,7 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { if (!c.getShortMessage().equals(c.getFullMessage())) { msg = msg + c.getFullMessage().substring(c.getShortMessage().length()); } - TestRepository.CommitBuilder cb = testRepo.branch("HEAD").commit() - .message(msg); + TestRepository.CommitBuilder cb = testRepo.branch("HEAD").commit().message(msg); if (!newCommits.isEmpty()) { cb.parent(origCommits.get(newCommits.size() - 1)); } @@ -1286,8 +1304,7 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { return newCommits; } - private static Map getPatchSetRevisions(ChangeData cd) - throws Exception { + private static Map getPatchSetRevisions(ChangeData cd) throws Exception { Map revisions = new HashMap<>(); for (PatchSet ps : cd.patchSets()) { revisions.put(ps.getPatchSetId(), ps.getRevision().get()); @@ -1307,20 +1324,18 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest { return cds.get(0); } - private static void pushForReviewOk(TestRepository testRepo) - throws GitAPIException { + private static void pushForReviewOk(TestRepository testRepo) throws GitAPIException { pushForReview(testRepo, RemoteRefUpdate.Status.OK, null); } - private static void pushForReviewRejected(TestRepository testRepo, - String expectedMessage) throws GitAPIException { - pushForReview(testRepo, RemoteRefUpdate.Status.REJECTED_OTHER_REASON, - expectedMessage); + private static void pushForReviewRejected(TestRepository testRepo, String expectedMessage) + throws GitAPIException { + pushForReview(testRepo, RemoteRefUpdate.Status.REJECTED_OTHER_REASON, expectedMessage); } - private static void pushForReview(TestRepository testRepo, - RemoteRefUpdate.Status expectedStatus, String expectedMessage) - throws GitAPIException { + private static void pushForReview( + TestRepository testRepo, RemoteRefUpdate.Status expectedStatus, String expectedMessage) + throws GitAPIException { String ref = "refs/for/master"; PushResult r = pushHead(testRepo, ref); RemoteRefUpdate refUpdate = r.getRemoteUpdate(ref); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/AbstractSubmoduleSubscription.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/AbstractSubmoduleSubscription.java index 2b2759c501..42463c7d20 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/AbstractSubmoduleSubscription.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/AbstractSubmoduleSubscription.java @@ -25,7 +25,7 @@ import com.google.gerrit.extensions.client.SubmitType; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.git.MetaDataUpdate; import com.google.gerrit.server.git.ProjectConfig; - +import java.util.concurrent.atomic.AtomicInteger; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.ObjectId; @@ -39,8 +39,6 @@ import org.eclipse.jgit.transport.RefSpec; import org.eclipse.jgit.transport.RemoteRefUpdate; import org.eclipse.jgit.transport.RemoteRefUpdate.Status; -import java.util.concurrent.atomic.AtomicInteger; - public abstract class AbstractSubmoduleSubscription extends AbstractDaemonTest { protected SubmitType getSubmitType() { @@ -82,39 +80,39 @@ public abstract class AbstractSubmoduleSubscription extends AbstractDaemonTest { return cfg; } - protected TestRepository createProjectWithPush(String name, - @Nullable Project.NameKey parent, boolean createEmptyCommit, - SubmitType submitType) throws Exception { + protected TestRepository createProjectWithPush( + String name, + @Nullable Project.NameKey parent, + boolean createEmptyCommit, + SubmitType submitType) + throws Exception { Project.NameKey project = createProject(name, parent, createEmptyCommit, submitType); grant(Permission.PUSH, project, "refs/heads/*"); grant(Permission.SUBMIT, project, "refs/for/refs/heads/*"); return cloneProject(project); } - protected TestRepository createProjectWithPush(String name, - @Nullable Project.NameKey parent) throws Exception { + protected TestRepository createProjectWithPush(String name, @Nullable Project.NameKey parent) + throws Exception { return createProjectWithPush(name, parent, true, getSubmitType()); } - protected TestRepository createProjectWithPush(String name, - boolean createEmptyCommit) throws Exception { + protected TestRepository createProjectWithPush(String name, boolean createEmptyCommit) + throws Exception { return createProjectWithPush(name, null, createEmptyCommit, getSubmitType()); } - protected TestRepository createProjectWithPush(String name) - throws Exception { + protected TestRepository createProjectWithPush(String name) throws Exception { return createProjectWithPush(name, null, true, getSubmitType()); } private static AtomicInteger contentCounter = new AtomicInteger(0); - protected ObjectId pushChangeTo(TestRepository repo, String ref, - String file, String content, String message, String topic) + protected ObjectId pushChangeTo( + TestRepository repo, String ref, String file, String content, String message, String topic) throws Exception { - ObjectId ret = repo.branch("HEAD").commit().insertChangeId() - .message(message) - .add(file, content) - .create(); + ObjectId ret = + repo.branch("HEAD").commit().insertChangeId().message(message).add(file, content).create(); String pushedRef = ref; if (!topic.isEmpty()) { @@ -122,8 +120,8 @@ public abstract class AbstractSubmoduleSubscription extends AbstractDaemonTest { } String refspec = "HEAD:" + pushedRef; - Iterable res = repo.git().push() - .setRemote("origin").setRefSpecs(new RefSpec(refspec)).call(); + Iterable res = + repo.git().push().setRemote("origin").setRefSpecs(new RefSpec(refspec)).call(); RemoteRefUpdate u = Iterables.getOnlyElement(res).getRemoteUpdate(pushedRef); assertThat(u).isNotNull(); @@ -133,19 +131,18 @@ public abstract class AbstractSubmoduleSubscription extends AbstractDaemonTest { return ret; } - protected ObjectId pushChangeTo(TestRepository repo, String ref, - String message, String topic) throws Exception { - return pushChangeTo(repo, ref, "a.txt", - "a contents: " + contentCounter.incrementAndGet(), message, topic); + protected ObjectId pushChangeTo(TestRepository repo, String ref, String message, String topic) + throws Exception { + return pushChangeTo( + repo, ref, "a.txt", "a contents: " + contentCounter.incrementAndGet(), message, topic); } - protected ObjectId pushChangeTo(TestRepository repo, String branch) - throws Exception { + protected ObjectId pushChangeTo(TestRepository repo, String branch) throws Exception { return pushChangeTo(repo, "refs/heads/" + branch, "some change", ""); } - protected void allowSubmoduleSubscription(String submodule, - String subBranch, String superproject, String superBranch, boolean match) + protected void allowSubmoduleSubscription( + String submodule, String subBranch, String superproject, String superBranch, boolean match) throws Exception { Project.NameKey sub = new Project.NameKey(name(submodule)); Project.NameKey superName = new Project.NameKey(name(superproject)); @@ -177,31 +174,37 @@ public abstract class AbstractSubmoduleSubscription extends AbstractDaemonTest { } } - protected void allowMatchingSubmoduleSubscription(String submodule, - String subBranch, String superproject, String superBranch) + protected void allowMatchingSubmoduleSubscription( + String submodule, String subBranch, String superproject, String superBranch) throws Exception { - allowSubmoduleSubscription(submodule, subBranch, superproject, - superBranch, true); + allowSubmoduleSubscription(submodule, subBranch, superproject, superBranch, true); } - protected void createSubmoduleSubscription(TestRepository repo, String branch, - String subscribeToRepo, String subscribeToBranch) throws Exception { + protected void createSubmoduleSubscription( + TestRepository repo, String branch, String subscribeToRepo, String subscribeToBranch) + throws Exception { Config config = new Config(); prepareSubmoduleConfigEntry(config, subscribeToRepo, subscribeToBranch); pushSubmoduleConfig(repo, branch, config); } - protected void createRelativeSubmoduleSubscription(TestRepository repo, - String branch, String subscribeToRepoPrefix, String subscribeToRepo, - String subscribeToBranch) throws Exception { + protected void createRelativeSubmoduleSubscription( + TestRepository repo, + String branch, + String subscribeToRepoPrefix, + String subscribeToRepo, + String subscribeToBranch) + throws Exception { Config config = new Config(); - prepareRelativeSubmoduleConfigEntry(config, subscribeToRepoPrefix, - subscribeToRepo, subscribeToBranch); + prepareRelativeSubmoduleConfigEntry( + config, subscribeToRepoPrefix, subscribeToRepo, subscribeToBranch); pushSubmoduleConfig(repo, branch, config); } - protected void prepareRelativeSubmoduleConfigEntry(Config config, - String subscribeToRepoPrefix, String subscribeToRepo, + protected void prepareRelativeSubmoduleConfigEntry( + Config config, + String subscribeToRepoPrefix, + String subscribeToRepo, String subscribeToBranch) { subscribeToRepo = name(subscribeToRepo); String url = subscribeToRepoPrefix + subscribeToRepo; @@ -212,23 +215,22 @@ public abstract class AbstractSubmoduleSubscription extends AbstractDaemonTest { } } - protected void prepareSubmoduleConfigEntry(Config config, - String subscribeToRepo, String subscribeToBranch) { + protected void prepareSubmoduleConfigEntry( + Config config, String subscribeToRepo, String subscribeToBranch) { // The submodule subscription module checks for gerrit.canonicalWebUrl to // detect if it's configured for automatic updates. It doesn't matter if // it serves from that URL. prepareSubmoduleConfigEntry(config, subscribeToRepo, subscribeToRepo, subscribeToBranch); } - protected void prepareSubmoduleConfigEntry(Config config, - String subscribeToRepo, String subscribeToRepoPath, String subscribeToBranch) { + protected void prepareSubmoduleConfigEntry( + Config config, String subscribeToRepo, String subscribeToRepoPath, String subscribeToBranch) { subscribeToRepo = name(subscribeToRepo); subscribeToRepoPath = name(subscribeToRepoPath); // The submodule subscription module checks for gerrit.canonicalWebUrl to // detect if it's configured for automatic updates. It doesn't matter if // it serves from that URL. - String url = cfg.getString("gerrit", null, "canonicalWebUrl") + "/" - + subscribeToRepo; + String url = cfg.getString("gerrit", null, "canonicalWebUrl") + "/" + subscribeToRepo; config.setString("submodule", subscribeToRepoPath, "path", subscribeToRepoPath); config.setString("submodule", subscribeToRepoPath, "url", url); if (subscribeToBranch != null) { @@ -236,28 +238,48 @@ public abstract class AbstractSubmoduleSubscription extends AbstractDaemonTest { } } - protected void pushSubmoduleConfig(TestRepository repo, - String branch, Config config) throws Exception { + protected void pushSubmoduleConfig(TestRepository repo, String branch, Config config) + throws Exception { - repo.branch("HEAD").commit().insertChangeId() - .message("subject: adding new subscription") - .add(".gitmodules", config.toText().toString()) - .create(); + repo.branch("HEAD") + .commit() + .insertChangeId() + .message("subject: adding new subscription") + .add(".gitmodules", config.toText().toString()) + .create(); - repo.git().push().setRemote("origin").setRefSpecs( - new RefSpec("HEAD:refs/heads/" + branch)).call(); + repo.git() + .push() + .setRemote("origin") + .setRefSpecs(new RefSpec("HEAD:refs/heads/" + branch)) + .call(); } - protected void expectToHaveSubmoduleState(TestRepository repo, - String branch, String submodule, TestRepository subRepo, - String subBranch) throws Exception { + protected void expectToHaveSubmoduleState( + TestRepository repo, + String branch, + String submodule, + TestRepository subRepo, + String subBranch) + throws Exception { submodule = name(submodule); - ObjectId commitId = repo.git().fetch().setRemote("origin").call() - .getAdvertisedRef("refs/heads/" + branch).getObjectId(); + ObjectId commitId = + repo.git() + .fetch() + .setRemote("origin") + .call() + .getAdvertisedRef("refs/heads/" + branch) + .getObjectId(); - ObjectId subHead = subRepo.git().fetch().setRemote("origin").call() - .getAdvertisedRef("refs/heads/" + subBranch).getObjectId(); + ObjectId subHead = + subRepo + .git() + .fetch() + .setRemote("origin") + .call() + .getAdvertisedRef("refs/heads/" + subBranch) + .getObjectId(); RevWalk rw = repo.getRevWalk(); RevCommit c = rw.parseCommit(commitId); @@ -269,12 +291,18 @@ public abstract class AbstractSubmoduleSubscription extends AbstractDaemonTest { assertThat(actualId).isEqualTo(subHead); } - protected void expectToHaveSubmoduleState(TestRepository repo, - String branch, String submodule, ObjectId expectedId) throws Exception { + protected void expectToHaveSubmoduleState( + TestRepository repo, String branch, String submodule, ObjectId expectedId) + throws Exception { submodule = name(submodule); - ObjectId commitId = repo.git().fetch().setRemote("origin").call() - .getAdvertisedRef("refs/heads/" + branch).getObjectId(); + ObjectId commitId = + repo.git() + .fetch() + .setRemote("origin") + .call() + .getAdvertisedRef("refs/heads/" + branch) + .getObjectId(); RevWalk rw = repo.getRevWalk(); RevCommit c = rw.parseCommit(commitId); @@ -286,46 +314,66 @@ public abstract class AbstractSubmoduleSubscription extends AbstractDaemonTest { assertThat(actualId).isEqualTo(expectedId); } - protected void deleteAllSubscriptions(TestRepository repo, String branch) - throws Exception { + protected void deleteAllSubscriptions(TestRepository repo, String branch) throws Exception { repo.git().fetch().setRemote("origin").call(); repo.reset("refs/remotes/origin/" + branch); - ObjectId expectedId = repo.branch("HEAD").commit().insertChangeId() - .message("delete contents in .gitmodules") - .add(".gitmodules", "") // Just remove the contents of the file! - .create(); - repo.git().push().setRemote("origin").setRefSpecs( - new RefSpec("HEAD:refs/heads/" + branch)).call(); + ObjectId expectedId = + repo.branch("HEAD") + .commit() + .insertChangeId() + .message("delete contents in .gitmodules") + .add(".gitmodules", "") // Just remove the contents of the file! + .create(); + repo.git() + .push() + .setRemote("origin") + .setRefSpecs(new RefSpec("HEAD:refs/heads/" + branch)) + .call(); - ObjectId actualId = repo.git().fetch().setRemote("origin").call() - .getAdvertisedRef("refs/heads/master").getObjectId(); + ObjectId actualId = + repo.git() + .fetch() + .setRemote("origin") + .call() + .getAdvertisedRef("refs/heads/master") + .getObjectId(); assertThat(actualId).isEqualTo(expectedId); } - protected void deleteGitModulesFile(TestRepository repo, String branch) - throws Exception { + protected void deleteGitModulesFile(TestRepository repo, String branch) throws Exception { repo.git().fetch().setRemote("origin").call(); repo.reset("refs/remotes/origin/" + branch); - ObjectId expectedId = repo.branch("HEAD").commit().insertChangeId() - .message("delete .gitmodules") - .rm(".gitmodules") - .create(); - repo.git().push().setRemote("origin").setRefSpecs( - new RefSpec("HEAD:refs/heads/" + branch)).call(); + ObjectId expectedId = + repo.branch("HEAD") + .commit() + .insertChangeId() + .message("delete .gitmodules") + .rm(".gitmodules") + .create(); + repo.git() + .push() + .setRemote("origin") + .setRefSpecs(new RefSpec("HEAD:refs/heads/" + branch)) + .call(); - ObjectId actualId = repo.git().fetch().setRemote("origin").call() - .getAdvertisedRef("refs/heads/master").getObjectId(); + ObjectId actualId = + repo.git() + .fetch() + .setRemote("origin") + .call() + .getAdvertisedRef("refs/heads/master") + .getObjectId(); assertThat(actualId).isEqualTo(expectedId); } - protected boolean hasSubmodule(TestRepository repo, String branch, - String submodule) throws Exception { + protected boolean hasSubmodule(TestRepository repo, String branch, String submodule) + throws Exception { submodule = name(submodule); - Ref branchTip = repo.git().fetch().setRemote("origin").call() - .getAdvertisedRef("refs/heads/" + branch); + Ref branchTip = + repo.git().fetch().setRemote("origin").call().getAdvertisedRef("refs/heads/" + branch); if (branchTip == null) { return false; } @@ -345,11 +393,16 @@ public abstract class AbstractSubmoduleSubscription extends AbstractDaemonTest { } } - protected void expectToHaveCommitMessage(TestRepository repo, - String branch, String expectedMessage) throws Exception { + protected void expectToHaveCommitMessage( + TestRepository repo, String branch, String expectedMessage) throws Exception { - ObjectId commitId = repo.git().fetch().setRemote("origin").call() - .getAdvertisedRef("refs/heads/" + branch).getObjectId(); + ObjectId commitId = + repo.git() + .fetch() + .setRemote("origin") + .call() + .getAdvertisedRef("refs/heads/" + branch) + .getObjectId(); RevWalk rw = repo.getRevWalk(); RevCommit c = rw.parseCommit(commitId); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/DraftChangeBlockedIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/DraftChangeBlockedIT.java index ac5477ca07..f2dc8d5140 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/DraftChangeBlockedIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/DraftChangeBlockedIT.java @@ -20,7 +20,6 @@ import com.google.gerrit.acceptance.AbstractDaemonTest; import com.google.gerrit.acceptance.NoHttpd; import com.google.gerrit.acceptance.PushOneCommit; import com.google.gerrit.common.data.Permission; - import org.junit.Before; import org.junit.Test; diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/ForcePushIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/ForcePushIT.java index 38f28dfcca..6aaf12cb38 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/ForcePushIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/ForcePushIT.java @@ -20,7 +20,6 @@ import static org.eclipse.jgit.lib.Constants.HEAD; import com.google.gerrit.acceptance.AbstractDaemonTest; import com.google.gerrit.acceptance.PushOneCommit; import com.google.gerrit.common.data.Permission; - import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.RefUpdate; import org.junit.Test; diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/HttpPushForReviewIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/HttpPushForReviewIT.java index 9f884c883f..ed17c38156 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/HttpPushForReviewIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/HttpPushForReviewIT.java @@ -21,8 +21,8 @@ import org.junit.Before; public class HttpPushForReviewIT extends AbstractPushForReview { @Before public void selectHttpUrl() throws Exception { - CredentialsProvider.setDefault(new UsernamePasswordCredentialsProvider( - admin.username, admin.httpPassword)); + CredentialsProvider.setDefault( + new UsernamePasswordCredentialsProvider(admin.username, admin.httpPassword)); selectProtocol(Protocol.HTTP); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/ImplicitMergeCheckIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/ImplicitMergeCheckIT.java index e7097f095c..00645703e7 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/ImplicitMergeCheckIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/ImplicitMergeCheckIT.java @@ -21,7 +21,6 @@ import com.google.gerrit.acceptance.AbstractDaemonTest; import com.google.gerrit.acceptance.PushOneCommit; import com.google.gerrit.extensions.client.InheritableBoolean; import com.google.gerrit.server.git.ProjectConfig; - import org.eclipse.jgit.lib.ObjectId; import org.junit.Test; @@ -61,8 +60,7 @@ public class ImplicitMergeCheckIT extends AbstractDaemonTest { PushOneCommit.Result m = push("refs/heads/master", "1", "f", "1"); PushOneCommit.Result c = push("refs/for/stable", "2", "f", "2"); - assertThat(c.getMessage().toLowerCase()).doesNotContain( - implicitMergeOf(m.getCommit())); + assertThat(c.getMessage().toLowerCase()).doesNotContain(implicitMergeOf(m.getCommit())); } @Test @@ -75,8 +73,7 @@ public class ImplicitMergeCheckIT extends AbstractDaemonTest { PushOneCommit.Result m = push("refs/heads/master", "1", "f", "1"); PushOneCommit.Result c = push("refs/for/master", "2", "f", "2"); - assertThat(c.getMessage().toLowerCase()).doesNotContain( - implicitMergeOf(m.getCommit())); + assertThat(c.getMessage().toLowerCase()).doesNotContain(implicitMergeOf(m.getCommit())); } private static String implicitMergeOf(ObjectId commit) { @@ -89,10 +86,10 @@ public class ImplicitMergeCheckIT extends AbstractDaemonTest { saveProjectConfig(project, cfg); } - private PushOneCommit.Result push(String ref, String subject, - String fileName, String content) throws Exception { - PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo, - subject, fileName, content); + private PushOneCommit.Result push(String ref, String subject, String fileName, String content) + throws Exception { + PushOneCommit push = + pushFactory.create(db, admin.getIdent(), testRepo, subject, fileName, content); return push.to(ref); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/RefAdvertisementIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/RefAdvertisementIT.java index 78fa70d320..b900cc71a1 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/RefAdvertisementIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/RefAdvertisementIT.java @@ -50,7 +50,10 @@ import com.google.gerrit.testutil.DisabledReviewDb; import com.google.gerrit.testutil.TestChanges; import com.google.inject.Inject; import com.google.inject.Provider; - +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.PersonIdent; @@ -60,32 +63,19 @@ import org.eclipse.jgit.lib.Repository; import org.junit.Before; import org.junit.Test; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; - @NoHttpd public class RefAdvertisementIT extends AbstractDaemonTest { - @Inject - private ProjectControl.GenericFactory projectControlFactory; + @Inject private ProjectControl.GenericFactory projectControlFactory; - @Inject - @Nullable - private SearchingChangeCacheImpl changeCache; + @Inject @Nullable private SearchingChangeCacheImpl changeCache; - @Inject - private TagCache tagCache; + @Inject private TagCache tagCache; - @Inject - private Provider userProvider; + @Inject private Provider userProvider; - @Inject - private ChangeNoteUtil noteUtil; + @Inject private ChangeNoteUtil noteUtil; - @Inject - @AnonymousCowardName - private String anonymousCowardName; + @Inject @AnonymousCowardName private String anonymousCowardName; private AccountGroup.UUID admins; @@ -100,8 +90,7 @@ public class RefAdvertisementIT extends AbstractDaemonTest { @Before public void setUp() throws Exception { - admins = groupCache.get(new AccountGroup.NameKey("Administrators")) - .getGroupUUID(); + admins = groupCache.get(new AccountGroup.NameKey("Administrators")).getGroupUUID(); setUpPermissions(); setUpChanges(); } @@ -123,33 +112,28 @@ public class RefAdvertisementIT extends AbstractDaemonTest { } private void setUpChanges() throws Exception { - gApi.projects() - .name(project.get()) - .branch("branch") - .create(new BranchInput()); + gApi.projects().name(project.get()).branch("branch").create(new BranchInput()); // First 2 changes are merged, which means the tags pointing to them are // visible. allow(Permission.SUBMIT, admins, "refs/for/refs/heads/*"); - PushOneCommit.Result mr = pushFactory.create(db, admin.getIdent(), testRepo) - .to("refs/for/master%submit"); + PushOneCommit.Result mr = + pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/master%submit"); mr.assertOkStatus(); c1 = mr.getChange(); r1 = changeRefPrefix(c1.getId()); - PushOneCommit.Result br = pushFactory.create(db, admin.getIdent(), testRepo) - .to("refs/for/branch%submit"); + PushOneCommit.Result br = + pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/branch%submit"); br.assertOkStatus(); c2 = br.getChange(); r2 = changeRefPrefix(c2.getId()); // Second 2 changes are unmerged. - mr = pushFactory.create(db, admin.getIdent(), testRepo) - .to("refs/for/master"); + mr = pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/master"); mr.assertOkStatus(); c3 = mr.getChange(); r3 = changeRefPrefix(c3.getId()); - br = pushFactory.create(db, admin.getIdent(), testRepo) - .to("refs/for/branch"); + br = pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/branch"); br.assertOkStatus(); c4 = br.getChange(); r4 = changeRefPrefix(c4.getId()); @@ -260,17 +244,11 @@ public class RefAdvertisementIT extends AbstractDaemonTest { // Admin's edit is not visible. setApiUser(admin); - gApi.changes() - .id(changeId) - .edit() - .create(); + gApi.changes().id(changeId).edit().create(); // User's edit is visible. setApiUser(user); - gApi.changes() - .id(changeId) - .edit() - .create(); + gApi.changes().id(changeId).edit().create(); assertUploadPackRefs( "HEAD", @@ -292,10 +270,7 @@ public class RefAdvertisementIT extends AbstractDaemonTest { String changeId = c1.change().getKey().get(); setApiUser(admin); - gApi.changes() - .id(changeId) - .edit() - .create(); + gApi.changes().id(changeId).edit().create(); setApiUser(user); assertUploadPackRefs( @@ -324,8 +299,8 @@ public class RefAdvertisementIT extends AbstractDaemonTest { public void uploadPackDraftRefs() throws Exception { allow(Permission.READ, REGISTERED_USERS, "refs/heads/*"); - PushOneCommit.Result br = pushFactory.create(db, admin.getIdent(), testRepo) - .to("refs/drafts/master"); + PushOneCommit.Result br = + pushFactory.create(db, admin.getIdent(), testRepo).to("refs/drafts/master"); br.assertOkStatus(); Change.Id c5 = br.getChange().getId(); String r5 = changeRefPrefix(c5); @@ -376,8 +351,7 @@ public class RefAdvertisementIT extends AbstractDaemonTest { try (Repository repo = repoManager.openRepository(project)) { assertRefs( repo, - new VisibleRefFilter(tagCache, notesFactory, null, repo, - projectControl(), db, true), + new VisibleRefFilter(tagCache, notesFactory, null, repo, projectControl(), db, true), // Can't use stored values from the index so DB must be enabled. false, "HEAD", @@ -403,16 +377,12 @@ public class RefAdvertisementIT extends AbstractDaemonTest { setApiUser(user); assertRefs(repo, newFilter(db, repo, allProjects), true); - allowGlobalCapabilities( - REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE); + allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE); try { setApiUser(user); - assertRefs( - repo, newFilter(db, repo, allProjects), true, - "refs/sequences/changes"); + assertRefs(repo, newFilter(db, repo, allProjects), true, "refs/sequences/changes"); } finally { - removeGlobalCapabilities( - REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE); + removeGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE); } } } @@ -420,14 +390,15 @@ public class RefAdvertisementIT extends AbstractDaemonTest { @Test public void receivePackListsOpenChangesAsAdditionalHaves() throws Exception { ReceiveCommitsAdvertiseRefsHook.Result r = getReceivePackRefs(); - assertThat(r.allRefs().keySet()).containsExactly( - // meta refs are excluded even when NoteDb is enabled. - "HEAD", - "refs/heads/branch", - "refs/heads/master", - "refs/meta/config", - "refs/tags/branch-tag", - "refs/tags/master-tag"); + assertThat(r.allRefs().keySet()) + .containsExactly( + // meta refs are excluded even when NoteDb is enabled. + "HEAD", + "refs/heads/branch", + "refs/heads/master", + "refs/meta/config", + "refs/tags/branch-tag", + "refs/tags/master-tag"); assertThat(r.additionalHaves()).containsExactly(obj(c3, 1), obj(c4, 1)); } @@ -437,8 +408,7 @@ public class RefAdvertisementIT extends AbstractDaemonTest { deny(Permission.READ, REGISTERED_USERS, "refs/heads/branch"); setApiUser(user); - assertThat(getReceivePackRefs().additionalHaves()) - .containsExactly(obj(c3, 1)); + assertThat(getReceivePackRefs().additionalHaves()).containsExactly(obj(c3, 1)); } @Test @@ -447,8 +417,7 @@ public class RefAdvertisementIT extends AbstractDaemonTest { PushOneCommit.Result r = amendChange(c3.change().getKey().get()); r.assertOkStatus(); c3 = r.getChange(); - assertThat(getReceivePackRefs().additionalHaves()) - .containsExactly(obj(c3, 2), obj(c4, 1)); + assertThat(getReceivePackRefs().additionalHaves()).containsExactly(obj(c3, 2), obj(c4, 1)); } @Test @@ -469,52 +438,66 @@ public class RefAdvertisementIT extends AbstractDaemonTest { if (notesMigration.commitChangeWrites()) { PersonIdent committer = serverIdent.get(); - PersonIdent author = noteUtil.newIdent( - accountCache.get(admin.getId()).getAccount(), - committer.getWhen(), - committer, - anonymousCowardName); + PersonIdent author = + noteUtil.newIdent( + accountCache.get(admin.getId()).getAccount(), + committer.getWhen(), + committer, + anonymousCowardName); tr.branch(RefNames.changeMetaRef(c3.getId())) .commit() .author(author) .committer(committer) .message( - "Update patch set " + psId.get() + "\n" + "Update patch set " + + psId.get() + "\n" - + "Patch-set: " + psId.get() + "\n" - + "Commit: " + rev + "\n" - + "Subject: " + subject + "\n") + + "\n" + + "Patch-set: " + + psId.get() + + "\n" + + "Commit: " + + rev + + "\n" + + "Subject: " + + subject + + "\n") .create(); } indexer.index(db, c.getProject(), c.getId()); } - assertThat(getReceivePackRefs().additionalHaves()) - .containsExactly(obj(c4, 1)); + assertThat(getReceivePackRefs().additionalHaves()).containsExactly(obj(c4, 1)); } /** * Assert that refs seen by a non-admin user match expected. * - * @param expectedWithMeta expected refs, in order. If NoteDb is disabled by - * the configuration, any NoteDb refs (i.e. ending in "/meta") are removed - * from the expected list before comparing to the actual results. + * @param expectedWithMeta expected refs, in order. If NoteDb is disabled by the configuration, + * any NoteDb refs (i.e. ending in "/meta") are removed from the expected list before + * comparing to the actual results. * @throws Exception */ - private void assertUploadPackRefs(String... expectedWithMeta) - throws Exception { + private void assertUploadPackRefs(String... expectedWithMeta) throws Exception { try (Repository repo = repoManager.openRepository(project)) { assertRefs( repo, - new VisibleRefFilter(tagCache, notesFactory, changeCache, repo, - projectControl(), new DisabledReviewDb(), true), + new VisibleRefFilter( + tagCache, + notesFactory, + changeCache, + repo, + projectControl(), + new DisabledReviewDb(), + true), true, expectedWithMeta); } } - private void assertRefs(Repository repo, VisibleRefFilter filter, - boolean disableDb, String... expectedWithMeta) throws Exception { + private void assertRefs( + Repository repo, VisibleRefFilter filter, boolean disableDb, String... expectedWithMeta) + throws Exception { List expected = new ArrayList<>(expectedWithMeta.length); for (String r : expectedWithMeta) { if (notesMigration.writeChanges() || !r.endsWith(RefNames.META_SUFFIX)) { @@ -528,8 +511,7 @@ public class RefAdvertisementIT extends AbstractDaemonTest { } try { Map all = repo.getAllRefs(); - assertThat(filter.filter(all, false).keySet()) - .containsExactlyElementsIn(expected); + assertThat(filter.filter(all, false).keySet()).containsExactlyElementsIn(expected); } finally { if (disableDb) { enableDb(ctx); @@ -537,8 +519,7 @@ public class RefAdvertisementIT extends AbstractDaemonTest { } } - private ReceiveCommitsAdvertiseRefsHook.Result getReceivePackRefs() - throws Exception { + private ReceiveCommitsAdvertiseRefsHook.Result getReceivePackRefs() throws Exception { ReceiveCommitsAdvertiseRefsHook hook = new ReceiveCommitsAdvertiseRefsHook(queryProvider, project); try (Repository repo = repoManager.openRepository(project)) { @@ -550,19 +531,22 @@ public class RefAdvertisementIT extends AbstractDaemonTest { return projectControlFactory.controlFor(project, userProvider.get()); } - private VisibleRefFilter newFilter(ReviewDb db, Repository repo, - Project.NameKey project) throws Exception { + private VisibleRefFilter newFilter(ReviewDb db, Repository repo, Project.NameKey project) + throws Exception { return new VisibleRefFilter( - tagCache, notesFactory, null, repo, + tagCache, + notesFactory, + null, + repo, projectControlFactory.controlFor(project, userProvider.get()), - db, true); + db, + true); } private static ObjectId obj(ChangeData cd, int psNum) throws Exception { PatchSet.Id psId = new PatchSet.Id(cd.getId(), psNum); PatchSet ps = cd.patchSet(psId); - assertWithMessage("%s not found in %s", psId, cd.patchSets()).that(ps) - .isNotNull(); + assertWithMessage("%s not found in %s", psId, cd.patchSets()).that(ps).isNotNull(); return ObjectId.fromString(ps.getRevision().get()); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SshPushForReviewIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SshPushForReviewIT.java index ede1d4fa0e..5ec6cea089 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SshPushForReviewIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SshPushForReviewIT.java @@ -16,7 +16,6 @@ package com.google.gerrit.acceptance.git; import com.google.gerrit.acceptance.NoHttpd; import com.google.gerrit.acceptance.UseSsh; - import org.junit.Before; @NoHttpd diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmitOnPushIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmitOnPushIT.java index 7983d0fb74..2f9d501698 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmitOnPushIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmitOnPushIT.java @@ -33,7 +33,6 @@ import com.google.gerrit.server.ApprovalsUtil; import com.google.gerrit.server.notedb.ChangeNotes; import com.google.gerrit.server.query.change.ChangeData; import com.google.inject.Inject; - import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; @@ -46,8 +45,7 @@ import org.junit.Test; @NoHttpd public class SubmitOnPushIT extends AbstractDaemonTest { - @Inject - private ApprovalsUtil approvalsUtil; + @Inject private ApprovalsUtil approvalsUtil; @Test public void submitOnPush() throws Exception { @@ -116,8 +114,8 @@ public class SubmitOnPushIT extends AbstractDaemonTest { push("refs/for/master%submit", "other change", "a.txt", "other content"); r.assertErrorStatus(); r.assertChange(Change.Status.NEW, null); - r.assertMessage("Change " + r.getChange().getId() - + ": change could not be merged due to a path conflict."); + r.assertMessage( + "Change " + r.getChange().getId() + ": change could not be merged due to a path conflict."); } @Test @@ -141,12 +139,13 @@ public class SubmitOnPushIT extends AbstractDaemonTest { push("refs/for/master", PushOneCommit.SUBJECT, "a.txt", "some content"); grant(Permission.SUBMIT, project, "refs/for/refs/heads/master"); - r = push("refs/for/master%submit", PushOneCommit.SUBJECT, "a.txt", - "other content", r.getChangeId()); + r = + push( + "refs/for/master%submit", + PushOneCommit.SUBJECT, "a.txt", "other content", r.getChangeId()); r.assertOkStatus(); r.assertChange(Change.Status.MERGED, null, admin); - ChangeData cd = Iterables.getOnlyElement( - queryProvider.get().byKeyPrefix(r.getChangeId())); + ChangeData cd = Iterables.getOnlyElement(queryProvider.get().byKeyPrefix(r.getChangeId())); assertThat(cd.patchSets()).hasSize(2); assertSubmitApproval(r.getPatchSetId()); assertCommit(project, "refs/heads/master"); @@ -163,8 +162,10 @@ public class SubmitOnPushIT extends AbstractDaemonTest { PushOneCommit.Result r = push("refs/for/master", PushOneCommit.SUBJECT, "a.txt", "some content"); - r = push("refs/for/master%submit", PushOneCommit.SUBJECT, "a.txt", - "other content", r.getChangeId()); + r = + push( + "refs/for/master%submit", + PushOneCommit.SUBJECT, "a.txt", "other content", r.getChangeId()); r.assertErrorStatus("submit not allowed"); } @@ -188,13 +189,11 @@ public class SubmitOnPushIT extends AbstractDaemonTest { push("refs/for/master", PushOneCommit.SUBJECT, "a.txt", "some content"); r.assertOkStatus(); - git().push() - .setRefSpecs(new RefSpec(r.getCommit().name() + ":refs/heads/master")) - .call(); + git().push().setRefSpecs(new RefSpec(r.getCommit().name() + ":refs/heads/master")).call(); assertCommit(project, "refs/heads/master"); - ChangeData cd = Iterables.getOnlyElement( - queryProvider.get().byKey(new Change.Key(r.getChangeId()))); + ChangeData cd = + Iterables.getOnlyElement(queryProvider.get().byKey(new Change.Key(r.getChangeId()))); RevCommit c = r.getCommit(); PatchSet.Id psId = cd.currentPatchSet().getId(); assertThat(psId.get()).isEqualTo(1); @@ -215,8 +214,14 @@ public class SubmitOnPushIT extends AbstractDaemonTest { assertThat(psId1.get()).isEqualTo(1); PushOneCommit push = - pushFactory.create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, - "b.txt", "anotherContent", r.getChangeId()); + pushFactory.create( + db, + admin.getIdent(), + testRepo, + PushOneCommit.SUBJECT, + "b.txt", + "anotherContent", + r.getChangeId()); r = push.to("refs/heads/master"); r.assertOkStatus(); @@ -251,8 +256,7 @@ public class SubmitOnPushIT extends AbstractDaemonTest { assertThat(psId2.get()).isEqualTo(2); testRepo.reset(c1); - assertPushOk( - pushHead(testRepo, "refs/heads/master", false), "refs/heads/master"); + assertPushOk(pushHead(testRepo, "refs/heads/master", false), "refs/heads/master"); cd = changeDataFactory.create(db, project, psId1.getParentKey()); Change c = cd.change(); @@ -282,40 +286,35 @@ public class SubmitOnPushIT extends AbstractDaemonTest { // Amend both changes. testRepo.reset(initialHead); - RevCommit c1_2 = testRepo.branch("HEAD").commit() - .message(c1_1.getShortMessage() + "v2") - .insertChangeId(r1.getChangeId().substring(1)) - .create(); + RevCommit c1_2 = + testRepo + .branch("HEAD") + .commit() + .message(c1_1.getShortMessage() + "v2") + .insertChangeId(r1.getChangeId().substring(1)) + .create(); RevCommit c2_2 = testRepo.cherryPick(c2_1); // Push directly to branch. - assertPushOk( - pushHead(testRepo, "refs/heads/master", false), "refs/heads/master"); + assertPushOk(pushHead(testRepo, "refs/heads/master", false), "refs/heads/master"); ChangeData cd2 = r2.getChange(); assertThat(cd2.change().getStatus()).isEqualTo(Change.Status.MERGED); PatchSet.Id psId2_2 = cd2.change().currentPatchSetId(); assertThat(psId2_2.get()).isEqualTo(2); - assertThat(cd2.patchSet(psId2_1).getRevision().get()) - .isEqualTo(c2_1.name()); - assertThat(cd2.patchSet(psId2_2).getRevision().get()) - .isEqualTo(c2_2.name()); + assertThat(cd2.patchSet(psId2_1).getRevision().get()).isEqualTo(c2_1.name()); + assertThat(cd2.patchSet(psId2_2).getRevision().get()).isEqualTo(c2_2.name()); ChangeData cd1 = r1.getChange(); assertThat(cd1.change().getStatus()).isEqualTo(Change.Status.MERGED); PatchSet.Id psId1_2 = cd1.change().currentPatchSetId(); assertThat(psId1_2.get()).isEqualTo(2); - assertThat(cd1.patchSet(psId1_1).getRevision().get()) - .isEqualTo(c1_1.name()); - assertThat(cd1.patchSet(psId1_2).getRevision().get()) - .isEqualTo(c1_2.name()); + assertThat(cd1.patchSet(psId1_1).getRevision().get()).isEqualTo(c1_1.name()); + assertThat(cd1.patchSet(psId1_2).getRevision().get()).isEqualTo(c1_2.name()); } - private PatchSetApproval getSubmitter(PatchSet.Id patchSetId) - throws Exception { - ChangeNotes notes = - notesFactory.createChecked(db, project, patchSetId.getParentKey()) - .load(); + private PatchSetApproval getSubmitter(PatchSet.Id patchSetId) throws Exception { + ChangeNotes notes = notesFactory.createChecked(db, project, patchSetId.getParentKey()).load(); return approvalsUtil.getSubmitter(db, notes, patchSetId); } @@ -326,15 +325,13 @@ public class SubmitOnPushIT extends AbstractDaemonTest { assertThat(a.getAccountId()).isEqualTo(admin.id); } - private void assertCommit(Project.NameKey project, String branch) - throws Exception { + private void assertCommit(Project.NameKey project, String branch) throws Exception { try (Repository r = repoManager.openRepository(project); RevWalk rw = new RevWalk(r)) { RevCommit c = rw.parseCommit(r.exactRef(branch).getObjectId()); assertThat(c.getShortMessage()).isEqualTo(PushOneCommit.SUBJECT); assertThat(c.getAuthorIdent().getEmailAddress()).isEqualTo(admin.email); - assertThat(c.getCommitterIdent().getEmailAddress()).isEqualTo( - admin.email); + assertThat(c.getCommitterIdent().getEmailAddress()).isEqualTo(admin.email); } } @@ -345,25 +342,24 @@ public class SubmitOnPushIT extends AbstractDaemonTest { assertThat(c.getParentCount()).isEqualTo(2); assertThat(c.getShortMessage()).isEqualTo("Merge \"" + subject + "\""); assertThat(c.getAuthorIdent().getEmailAddress()).isEqualTo(admin.email); - assertThat(c.getCommitterIdent().getEmailAddress()).isEqualTo( - serverIdent.get().getEmailAddress()); + assertThat(c.getCommitterIdent().getEmailAddress()) + .isEqualTo(serverIdent.get().getEmailAddress()); } } - private void assertTag(Project.NameKey project, String branch, - PushOneCommit.Tag tag) throws Exception { + private void assertTag(Project.NameKey project, String branch, PushOneCommit.Tag tag) + throws Exception { try (Repository repo = repoManager.openRepository(project)) { Ref tagRef = repo.findRef(tag.name); assertThat(tagRef).isNotNull(); ObjectId taggedCommit = null; if (tag instanceof PushOneCommit.AnnotatedTag) { - PushOneCommit.AnnotatedTag annotatedTag = (PushOneCommit.AnnotatedTag)tag; + PushOneCommit.AnnotatedTag annotatedTag = (PushOneCommit.AnnotatedTag) tag; try (RevWalk rw = new RevWalk(repo)) { RevObject object = rw.parseAny(tagRef.getObjectId()); assertThat(object).isInstanceOf(RevTag.class); RevTag tagObject = (RevTag) object; - assertThat(tagObject.getFullMessage()) - .isEqualTo(annotatedTag.message); + assertThat(tagObject.getFullMessage()).isEqualTo(annotatedTag.message); assertThat(tagObject.getTaggerIdent()).isEqualTo(annotatedTag.tagger); taggedCommit = tagObject.getObject(); } @@ -376,17 +372,18 @@ public class SubmitOnPushIT extends AbstractDaemonTest { } } - private PushOneCommit.Result push(String ref, String subject, - String fileName, String content) throws Exception { + private PushOneCommit.Result push(String ref, String subject, String fileName, String content) + throws Exception { PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo, subject, fileName, content); return push.to(ref); } - private PushOneCommit.Result push(String ref, String subject, - String fileName, String content, String changeId) throws Exception { - PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo, subject, - fileName, content, changeId); + private PushOneCommit.Result push( + String ref, String subject, String fileName, String content, String changeId) + throws Exception { + PushOneCommit push = + pushFactory.create(db, admin.getIdent(), testRepo, subject, fileName, content, changeId); return push.to(ref); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSectionParserIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSectionParserIT.java index 9fe1e71f94..d0225c791d 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSectionParserIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSectionParserIT.java @@ -22,12 +22,10 @@ import com.google.gerrit.reviewdb.client.Branch; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.reviewdb.client.SubmoduleSubscription; import com.google.gerrit.server.util.SubmoduleSectionParser; - +import java.util.Set; import org.eclipse.jgit.lib.Config; import org.junit.Test; -import java.util.Set; - public class SubmoduleSectionParserIT extends AbstractDaemonTest { private static final String THIS_SERVER = "http://localhost/"; @@ -35,20 +33,23 @@ public class SubmoduleSectionParserIT extends AbstractDaemonTest { public void followMasterBranch() throws Exception { Project.NameKey p = createProject("a"); Config cfg = new Config(); - cfg.fromText("" - + "[submodule \"a\"]\n" - + "path = localpath-to-a\n" - + "url = ssh://localhost/" + p.get() + "\n" - + "branch = master\n"); - Branch.NameKey targetBranch = new Branch.NameKey( - new Project.NameKey("project"), "master"); + cfg.fromText( + "" + + "[submodule \"a\"]\n" + + "path = localpath-to-a\n" + + "url = ssh://localhost/" + + p.get() + + "\n" + + "branch = master\n"); + Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master"); - Set res = new SubmoduleSectionParser( - cfg, THIS_SERVER, targetBranch).parseAllSections(); + Set res = + new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections(); - Set expected = Sets.newHashSet( - new SubmoduleSubscription(targetBranch, new Branch.NameKey( - p, "master"), "localpath-to-a")); + Set expected = + Sets.newHashSet( + new SubmoduleSubscription( + targetBranch, new Branch.NameKey(p, "master"), "localpath-to-a")); assertThat(res).containsExactlyElementsIn(expected); } @@ -57,33 +58,34 @@ public class SubmoduleSectionParserIT extends AbstractDaemonTest { public void followMatchingBranch() throws Exception { Project.NameKey p = createProject("a"); Config cfg = new Config(); - cfg.fromText("" - + "[submodule \"a\"]\n" - + "path = a\n" - + "url = ssh://localhost/" + p.get() + "\n" - + "branch = .\n"); + cfg.fromText( + "" + + "[submodule \"a\"]\n" + + "path = a\n" + + "url = ssh://localhost/" + + p.get() + + "\n" + + "branch = .\n"); - Branch.NameKey targetBranch1 = new Branch.NameKey( - new Project.NameKey("project"), "master"); + Branch.NameKey targetBranch1 = new Branch.NameKey(new Project.NameKey("project"), "master"); - Set res1 = new SubmoduleSectionParser( - cfg, THIS_SERVER, targetBranch1).parseAllSections(); + Set res1 = + new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch1).parseAllSections(); - Set expected1 = Sets.newHashSet( - new SubmoduleSubscription(targetBranch1, new Branch.NameKey( - p, "master"), "a")); + Set expected1 = + Sets.newHashSet( + new SubmoduleSubscription(targetBranch1, new Branch.NameKey(p, "master"), "a")); assertThat(res1).containsExactlyElementsIn(expected1); - Branch.NameKey targetBranch2 = new Branch.NameKey( - new Project.NameKey("project"), "somebranch"); + Branch.NameKey targetBranch2 = new Branch.NameKey(new Project.NameKey("project"), "somebranch"); - Set res2 = new SubmoduleSectionParser( - cfg, THIS_SERVER, targetBranch2).parseAllSections(); + Set res2 = + new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch2).parseAllSections(); - Set expected2 = Sets.newHashSet( - new SubmoduleSubscription(targetBranch2, new Branch.NameKey( - p, "somebranch"), "a")); + Set expected2 = + Sets.newHashSet( + new SubmoduleSubscription(targetBranch2, new Branch.NameKey(p, "somebranch"), "a")); assertThat(res2).containsExactlyElementsIn(expected2); } @@ -92,21 +94,23 @@ public class SubmoduleSectionParserIT extends AbstractDaemonTest { public void followAnotherBranch() throws Exception { Project.NameKey p = createProject("a"); Config cfg = new Config(); - cfg.fromText("" - + "[submodule \"a\"]\n" - + "path = a\n" - + "url = ssh://localhost/" + p.get() + "\n" - + "branch = anotherbranch\n"); + cfg.fromText( + "" + + "[submodule \"a\"]\n" + + "path = a\n" + + "url = ssh://localhost/" + + p.get() + + "\n" + + "branch = anotherbranch\n"); - Branch.NameKey targetBranch = new Branch.NameKey( - new Project.NameKey("project"), "master"); + Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master"); - Set res = new SubmoduleSectionParser( - cfg, THIS_SERVER, targetBranch).parseAllSections(); + Set res = + new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections(); - Set expected = Sets.newHashSet( - new SubmoduleSubscription(targetBranch, new Branch.NameKey( - p, "anotherbranch"), "a")); + Set expected = + Sets.newHashSet( + new SubmoduleSubscription(targetBranch, new Branch.NameKey(p, "anotherbranch"), "a")); assertThat(res).containsExactlyElementsIn(expected); } @@ -115,21 +119,23 @@ public class SubmoduleSectionParserIT extends AbstractDaemonTest { public void withAnotherURI() throws Exception { Project.NameKey p = createProject("a"); Config cfg = new Config(); - cfg.fromText("" - + "[submodule \"a\"]\n" - + "path = a\n" - + "url = http://localhost:80/" + p.get() + "\n" - + "branch = master\n"); + cfg.fromText( + "" + + "[submodule \"a\"]\n" + + "path = a\n" + + "url = http://localhost:80/" + + p.get() + + "\n" + + "branch = master\n"); - Branch.NameKey targetBranch = new Branch.NameKey( - new Project.NameKey("project"), "master"); + Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master"); - Set res =new SubmoduleSectionParser( - cfg, THIS_SERVER, targetBranch).parseAllSections(); + Set res = + new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections(); - Set expected = Sets.newHashSet( - new SubmoduleSubscription(targetBranch, new Branch.NameKey( - p, "master"), "a")); + Set expected = + Sets.newHashSet( + new SubmoduleSubscription(targetBranch, new Branch.NameKey(p, "master"), "a")); assertThat(res).containsExactlyElementsIn(expected); } @@ -138,21 +144,23 @@ public class SubmoduleSectionParserIT extends AbstractDaemonTest { public void withSlashesInProjectName() throws Exception { Project.NameKey p = createProject("project/with/slashes/a"); Config cfg = new Config(); - cfg.fromText("" - + "[submodule \"project/with/slashes/a\"]\n" - + "path = a\n" - + "url = http://localhost:80/" + p.get() + "\n" - + "branch = master\n"); + cfg.fromText( + "" + + "[submodule \"project/with/slashes/a\"]\n" + + "path = a\n" + + "url = http://localhost:80/" + + p.get() + + "\n" + + "branch = master\n"); - Branch.NameKey targetBranch = new Branch.NameKey( - new Project.NameKey("project"), "master"); + Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master"); - Set res = new SubmoduleSectionParser( - cfg, THIS_SERVER, targetBranch).parseAllSections(); + Set res = + new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections(); - Set expected = Sets.newHashSet( - new SubmoduleSubscription(targetBranch, new Branch.NameKey( - p, "master"), "a")); + Set expected = + Sets.newHashSet( + new SubmoduleSubscription(targetBranch, new Branch.NameKey(p, "master"), "a")); assertThat(res).containsExactlyElementsIn(expected); } @@ -161,21 +169,23 @@ public class SubmoduleSectionParserIT extends AbstractDaemonTest { public void withSlashesInPath() throws Exception { Project.NameKey p = createProject("a"); Config cfg = new Config(); - cfg.fromText("" - + "[submodule \"a\"]\n" - + "path = a/b/c/d/e\n" - + "url = http://localhost:80/" + p.get() + "\n" - + "branch = master\n"); + cfg.fromText( + "" + + "[submodule \"a\"]\n" + + "path = a/b/c/d/e\n" + + "url = http://localhost:80/" + + p.get() + + "\n" + + "branch = master\n"); - Branch.NameKey targetBranch = new Branch.NameKey( - new Project.NameKey("project"), "master"); + Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master"); - Set res = new SubmoduleSectionParser( - cfg, THIS_SERVER, targetBranch).parseAllSections(); + Set res = + new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections(); - Set expected = Sets.newHashSet( - new SubmoduleSubscription(targetBranch, new Branch.NameKey( - p, "master"), "a/b/c/d/e")); + Set expected = + Sets.newHashSet( + new SubmoduleSubscription(targetBranch, new Branch.NameKey(p, "master"), "a/b/c/d/e")); assertThat(res).containsExactlyElementsIn(expected); } @@ -185,27 +195,30 @@ public class SubmoduleSectionParserIT extends AbstractDaemonTest { Project.NameKey p1 = createProject("a"); Project.NameKey p2 = createProject("b"); Config cfg = new Config(); - cfg.fromText("" - + "[submodule \"a\"]\n" - + " path = a\n" - + " url = ssh://localhost/" + p1.get() + "\n" - + " branch = .\n" - + "[submodule \"b\"]\n" - + " path = b\n" - + " url = http://localhost:80/" + p2.get() + "\n" - + " branch = master\n"); + cfg.fromText( + "" + + "[submodule \"a\"]\n" + + " path = a\n" + + " url = ssh://localhost/" + + p1.get() + + "\n" + + " branch = .\n" + + "[submodule \"b\"]\n" + + " path = b\n" + + " url = http://localhost:80/" + + p2.get() + + "\n" + + " branch = master\n"); - Branch.NameKey targetBranch = new Branch.NameKey( - new Project.NameKey("project"), "master"); + Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master"); - Set res = new SubmoduleSectionParser( - cfg, THIS_SERVER, targetBranch).parseAllSections(); + Set res = + new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections(); - Set expected = Sets.newHashSet( - new SubmoduleSubscription(targetBranch, new Branch.NameKey( - p1, "master"), "a"), - new SubmoduleSubscription(targetBranch, new Branch.NameKey( - p2, "master"), "b")); + Set expected = + Sets.newHashSet( + new SubmoduleSubscription(targetBranch, new Branch.NameKey(p1, "master"), "a"), + new SubmoduleSubscription(targetBranch, new Branch.NameKey(p2, "master"), "b")); assertThat(res).containsExactlyElementsIn(expected); } @@ -215,27 +228,30 @@ public class SubmoduleSectionParserIT extends AbstractDaemonTest { Project.NameKey p1 = createProject("a/b"); Project.NameKey p2 = createProject("b"); Config cfg = new Config(); - cfg.fromText("\n" - + "[submodule \"a/b\"]\n" - + "path = a/b\n" - + "url = ssh://localhost/" + p1.get() + "\n" - + "branch = .\n" - + "[submodule \"b\"]\n" - + "path = b\n" - + "url = http://localhost/" + p2.get() + "\n" - + "branch = .\n"); + cfg.fromText( + "\n" + + "[submodule \"a/b\"]\n" + + "path = a/b\n" + + "url = ssh://localhost/" + + p1.get() + + "\n" + + "branch = .\n" + + "[submodule \"b\"]\n" + + "path = b\n" + + "url = http://localhost/" + + p2.get() + + "\n" + + "branch = .\n"); - Branch.NameKey targetBranch = new Branch.NameKey( - new Project.NameKey("project"), "master"); + Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master"); - Set res = new SubmoduleSectionParser( - cfg, THIS_SERVER, targetBranch).parseAllSections(); + Set res = + new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections(); - Set expected = Sets.newHashSet( - new SubmoduleSubscription(targetBranch, new Branch.NameKey( - p2, "master"), "b"), - new SubmoduleSubscription(targetBranch, new Branch.NameKey( - p1, "master"), "a/b")); + Set expected = + Sets.newHashSet( + new SubmoduleSubscription(targetBranch, new Branch.NameKey(p2, "master"), "b"), + new SubmoduleSubscription(targetBranch, new Branch.NameKey(p1, "master"), "a/b")); assertThat(res).containsExactlyElementsIn(expected); } @@ -247,39 +263,46 @@ public class SubmoduleSectionParserIT extends AbstractDaemonTest { Project.NameKey p3 = createProject("d"); Project.NameKey p4 = createProject("e"); Config cfg = new Config(); - cfg.fromText("\n" - + "[submodule \"a\"]\n" - + " path = a\n" - + " url = ssh://localhost/" + p1.get() + "\n" - + " branch = .\n" - + "[submodule \"b\"]\n" + cfg.fromText( + "\n" + + "[submodule \"a\"]\n" + + " path = a\n" + + " url = ssh://localhost/" + + p1.get() + + "\n" + + " branch = .\n" + + "[submodule \"b\"]\n" // path missing - + " url = http://localhost:80/" + p2.get() + "\n" - + " branch = master\n" - + "[submodule \"c\"]\n" - + " path = c\n" + + " url = http://localhost:80/" + + p2.get() + + "\n" + + " branch = master\n" + + "[submodule \"c\"]\n" + + " path = c\n" // url missing - + " branch = .\n" - + "[submodule \"d\"]\n" - + " path = d-parent/the-d-folder\n" - + " url = ssh://localhost/" + p3.get() + "\n" + + " branch = .\n" + + "[submodule \"d\"]\n" + + " path = d-parent/the-d-folder\n" + + " url = ssh://localhost/" + + p3.get() + + "\n" // branch missing - + "[submodule \"e\"]\n" - + " path = e\n" - + " url = ssh://localhost/" + p4.get() + "\n" - + " branch = refs/heads/master\n"); + + "[submodule \"e\"]\n" + + " path = e\n" + + " url = ssh://localhost/" + + p4.get() + + "\n" + + " branch = refs/heads/master\n"); - Branch.NameKey targetBranch = new Branch.NameKey( - new Project.NameKey("project"), "master"); + Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master"); - Set res = new SubmoduleSectionParser( - cfg, THIS_SERVER, targetBranch).parseAllSections(); + Set res = + new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections(); - Set expected = Sets.newHashSet( - new SubmoduleSubscription(targetBranch, new Branch.NameKey( - p1, "master"), "a"), - new SubmoduleSubscription(targetBranch, new Branch.NameKey( - p4, "master"), "e")); + Set expected = + Sets.newHashSet( + new SubmoduleSubscription(targetBranch, new Branch.NameKey(p1, "master"), "a"), + new SubmoduleSubscription(targetBranch, new Branch.NameKey(p4, "master"), "e")); assertThat(res).containsExactlyElementsIn(expected); } @@ -287,18 +310,18 @@ public class SubmoduleSectionParserIT extends AbstractDaemonTest { @Test public void withSectionOfNonexistingProject() throws Exception { Config cfg = new Config(); - cfg.fromText("\n" - + "[submodule \"a\"]\n" - + "path = a\n" - + "url = ssh://non-localhost/a\n" - // Project "a" doesn't exist - + "branch = .\\n"); + cfg.fromText( + "\n" + + "[submodule \"a\"]\n" + + "path = a\n" + + "url = ssh://non-localhost/a\n" + // Project "a" doesn't exist + + "branch = .\\n"); - Branch.NameKey targetBranch = new Branch.NameKey( - new Project.NameKey("project"), "master"); + Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master"); - Set res = new SubmoduleSectionParser( - cfg, THIS_SERVER, targetBranch).parseAllSections(); + Set res = + new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections(); assertThat(res).isEmpty(); } @@ -307,17 +330,19 @@ public class SubmoduleSectionParserIT extends AbstractDaemonTest { public void withSectionToOtherServer() throws Exception { Project.NameKey p1 = createProject("a"); Config cfg = new Config(); - cfg.fromText("" - + "[submodule \"a\"]" - + "path = a" - + "url = ssh://non-localhost/" + p1.get() + "\n" - + "branch = ."); + cfg.fromText( + "" + + "[submodule \"a\"]" + + "path = a" + + "url = ssh://non-localhost/" + + p1.get() + + "\n" + + "branch = ."); - Branch.NameKey targetBranch = new Branch.NameKey( - new Project.NameKey("project"), "master"); + Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master"); - Set res = new SubmoduleSectionParser( - cfg, THIS_SERVER, targetBranch).parseAllSections(); + Set res = + new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections(); assertThat(res).isEmpty(); } @@ -326,21 +351,23 @@ public class SubmoduleSectionParserIT extends AbstractDaemonTest { public void withRelativeURI() throws Exception { Project.NameKey p1 = createProject("a"); Config cfg = new Config(); - cfg.fromText("" - + "[submodule \"a\"]\n" - + "path = a\n" - + "url = ../" + p1.get() + "\n" - + "branch = master\n"); + cfg.fromText( + "" + + "[submodule \"a\"]\n" + + "path = a\n" + + "url = ../" + + p1.get() + + "\n" + + "branch = master\n"); - Branch.NameKey targetBranch = new Branch.NameKey( - new Project.NameKey("project"), "master"); + Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master"); - Set res = new SubmoduleSectionParser( - cfg, THIS_SERVER, targetBranch).parseAllSections(); + Set res = + new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections(); - Set expected = Sets.newHashSet( - new SubmoduleSubscription(targetBranch, new Branch.NameKey( - p1, "master"), "a")); + Set expected = + Sets.newHashSet( + new SubmoduleSubscription(targetBranch, new Branch.NameKey(p1, "master"), "a")); assertThat(res).containsExactlyElementsIn(expected); } @@ -349,21 +376,24 @@ public class SubmoduleSectionParserIT extends AbstractDaemonTest { public void withDeepRelativeURI() throws Exception { Project.NameKey p1 = createProject("a"); Config cfg = new Config(); - cfg.fromText("" - + "[submodule \"a\"]\n" - + "path = a\n" - + "url = ../../" + p1.get() + "\n" - + "branch = master\n"); + cfg.fromText( + "" + + "[submodule \"a\"]\n" + + "path = a\n" + + "url = ../../" + + p1.get() + + "\n" + + "branch = master\n"); - Branch.NameKey targetBranch = new Branch.NameKey( - new Project.NameKey("nested/project"), "master"); + Branch.NameKey targetBranch = + new Branch.NameKey(new Project.NameKey("nested/project"), "master"); - Set res = new SubmoduleSectionParser( - cfg, THIS_SERVER, targetBranch).parseAllSections(); + Set res = + new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections(); - Set expected = Sets.newHashSet( - new SubmoduleSubscription(targetBranch, new Branch.NameKey( - p1, "master"), "a")); + Set expected = + Sets.newHashSet( + new SubmoduleSubscription(targetBranch, new Branch.NameKey(p1, "master"), "a")); assertThat(res).containsExactlyElementsIn(expected); } @@ -372,21 +402,24 @@ public class SubmoduleSectionParserIT extends AbstractDaemonTest { public void withOverlyDeepRelativeURI() throws Exception { Project.NameKey p1 = createProject("nested/a"); Config cfg = new Config(); - cfg.fromText("" - + "[submodule \"a\"]\n" - + "path = a\n" - + "url = ../../" + p1.get() + "\n" - + "branch = master\n"); + cfg.fromText( + "" + + "[submodule \"a\"]\n" + + "path = a\n" + + "url = ../../" + + p1.get() + + "\n" + + "branch = master\n"); - Branch.NameKey targetBranch = new Branch.NameKey( - new Project.NameKey("nested/project"), "master"); + Branch.NameKey targetBranch = + new Branch.NameKey(new Project.NameKey("nested/project"), "master"); - Set res = new SubmoduleSectionParser( - cfg, THIS_SERVER, targetBranch).parseAllSections(); + Set res = + new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections(); - Set expected = Sets.newHashSet( - new SubmoduleSubscription(targetBranch, new Branch.NameKey( - p1, "master"), "a")); + Set expected = + Sets.newHashSet( + new SubmoduleSubscription(targetBranch, new Branch.NameKey(p1, "master"), "a")); assertThat(res).containsExactlyElementsIn(expected); } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsIT.java index 3b4aa22458..02fdd091ce 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsIT.java @@ -21,7 +21,6 @@ import com.google.gerrit.acceptance.GerritConfig; import com.google.gerrit.acceptance.NoHttpd; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.testutil.ConfigSuite; - import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.ObjectId; @@ -44,14 +43,12 @@ public class SubmoduleSubscriptionsIT extends AbstractSubmoduleSubscription { public void testSubscriptionWithoutGlobalServerSetting() throws Exception { TestRepository superRepo = createProjectWithPush("super-project"); TestRepository subRepo = createProjectWithPush("subscribed-to-project"); - allowMatchingSubmoduleSubscription("subscribed-to-project", "refs/heads/master", - "super-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master"); - createSubmoduleSubscription(superRepo, "master", - "subscribed-to-project", "master"); + createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master"); pushChangeTo(subRepo, "master"); - assertThat(hasSubmodule(superRepo, "master", - "subscribed-to-project")).isFalse(); + assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isFalse(); } @Test @@ -59,45 +56,37 @@ public class SubmoduleSubscriptionsIT extends AbstractSubmoduleSubscription { TestRepository superRepo = createProjectWithPush("super-project"); TestRepository subRepo = createProjectWithPush("subscribed-to-project"); - createSubmoduleSubscription(superRepo, "master", - "subscribed-to-project", "master"); + createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master"); pushChangeTo(subRepo, "master"); - assertThat(hasSubmodule(superRepo, "master", - "subscribed-to-project")).isFalse(); + assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isFalse(); } @Test public void subscriptionToEmptyRepo() throws Exception { TestRepository superRepo = createProjectWithPush("super-project"); TestRepository subRepo = createProjectWithPush("subscribed-to-project"); - allowMatchingSubmoduleSubscription("subscribed-to-project", "refs/heads/master", - "super-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master"); - createSubmoduleSubscription(superRepo, "master", - "subscribed-to-project", "master"); + createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master"); pushChangeTo(subRepo, "master"); ObjectId subHEAD = pushChangeTo(subRepo, "master"); - assertThat(hasSubmodule(superRepo, "master", - "subscribed-to-project")).isTrue(); - expectToHaveSubmoduleState(superRepo, "master", - "subscribed-to-project", subHEAD); + assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isTrue(); + expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subHEAD); } @Test public void subscriptionToExistingRepo() throws Exception { TestRepository superRepo = createProjectWithPush("super-project"); TestRepository subRepo = createProjectWithPush("subscribed-to-project"); - allowMatchingSubmoduleSubscription("subscribed-to-project", "refs/heads/master", - "super-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master"); pushChangeTo(subRepo, "master"); - createSubmoduleSubscription(superRepo, "master", - "subscribed-to-project", "master"); + createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master"); ObjectId subHEAD = pushChangeTo(subRepo, "master"); - assertThat(hasSubmodule(superRepo, "master", - "subscribed-to-project")).isTrue(); - expectToHaveSubmoduleState(superRepo, "master", - "subscribed-to-project", subHEAD); + assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isTrue(); + expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subHEAD); } @Test @@ -105,30 +94,26 @@ public class SubmoduleSubscriptionsIT extends AbstractSubmoduleSubscription { TestRepository superRepo = createProjectWithPush("super-project"); TestRepository subRepo = createProjectWithPush("subscribed-to-project"); // master is allowed to be subscribed to master branch only: - allowMatchingSubmoduleSubscription("subscribed-to-project", "refs/heads/master", - "super-project", null); + allowMatchingSubmoduleSubscription( + "subscribed-to-project", "refs/heads/master", "super-project", null); // create 'branch': pushChangeTo(superRepo, "branch"); pushChangeTo(subRepo, "master"); - createSubmoduleSubscription(superRepo, "master", - "subscribed-to-project", "master"); - createSubmoduleSubscription(superRepo, "branch", - "subscribed-to-project", "master"); + createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master"); + createSubmoduleSubscription(superRepo, "branch", "subscribed-to-project", "master"); ObjectId subHEAD = pushChangeTo(subRepo, "master"); - expectToHaveSubmoduleState(superRepo, "master", - "subscribed-to-project", subHEAD); - assertThat(hasSubmodule(superRepo, "branch", - "subscribed-to-project")).isFalse(); + expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subHEAD); + assertThat(hasSubmodule(superRepo, "branch", "subscribed-to-project")).isFalse(); } @Test public void subscriptionWildcardACLForMissingProject() throws Exception { TestRepository subRepo = createProjectWithPush("subscribed-to-project"); - allowMatchingSubmoduleSubscription("subscribed-to-project", "refs/heads/*", - "not-existing-super-project", "refs/heads/*"); + allowMatchingSubmoduleSubscription( + "subscribed-to-project", "refs/heads/*", "not-existing-super-project", "refs/heads/*"); pushChangeTo(subRepo, "master"); } @@ -136,8 +121,8 @@ public class SubmoduleSubscriptionsIT extends AbstractSubmoduleSubscription { public void subscriptionWildcardACLForMissingBranch() throws Exception { createProjectWithPush("super-project"); TestRepository subRepo = createProjectWithPush("subscribed-to-project"); - allowMatchingSubmoduleSubscription("subscribed-to-project", "refs/heads/*", - "super-project", "refs/heads/*"); + allowMatchingSubmoduleSubscription( + "subscribed-to-project", "refs/heads/*", "super-project", "refs/heads/*"); pushChangeTo(subRepo, "foo"); } @@ -145,8 +130,8 @@ public class SubmoduleSubscriptionsIT extends AbstractSubmoduleSubscription { public void subscriptionWildcardACLForMissingGitmodules() throws Exception { TestRepository superRepo = createProjectWithPush("super-project"); TestRepository subRepo = createProjectWithPush("subscribed-to-project"); - allowMatchingSubmoduleSubscription("subscribed-to-project", "refs/heads/*", - "super-project", "refs/heads/*"); + allowMatchingSubmoduleSubscription( + "subscribed-to-project", "refs/heads/*", "super-project", "refs/heads/*"); pushChangeTo(superRepo, "master"); pushChangeTo(subRepo, "master"); } @@ -156,36 +141,29 @@ public class SubmoduleSubscriptionsIT extends AbstractSubmoduleSubscription { TestRepository superRepo = createProjectWithPush("super-project"); TestRepository subRepo = createProjectWithPush("subscribed-to-project"); // any branch is allowed to be subscribed to the same superprojects branch: - allowMatchingSubmoduleSubscription("subscribed-to-project", "refs/heads/*", - "super-project", "refs/heads/*"); + allowMatchingSubmoduleSubscription( + "subscribed-to-project", "refs/heads/*", "super-project", "refs/heads/*"); // create 'branch' in both repos: pushChangeTo(superRepo, "branch"); pushChangeTo(subRepo, "branch"); pushChangeTo(subRepo, "master"); - createSubmoduleSubscription(superRepo, "master", - "subscribed-to-project", "master"); - createSubmoduleSubscription(superRepo, "branch", - "subscribed-to-project", "branch"); + createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master"); + createSubmoduleSubscription(superRepo, "branch", "subscribed-to-project", "branch"); ObjectId subHEAD1 = pushChangeTo(subRepo, "master"); ObjectId subHEAD2 = pushChangeTo(subRepo, "branch"); - expectToHaveSubmoduleState(superRepo, "master", - "subscribed-to-project", subHEAD1); - expectToHaveSubmoduleState(superRepo, "branch", - "subscribed-to-project", subHEAD2); + expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subHEAD1); + expectToHaveSubmoduleState(superRepo, "branch", "subscribed-to-project", subHEAD2); // Now test that cross subscriptions do not work: - createSubmoduleSubscription(superRepo, "master", - "subscribed-to-project", "branch"); + createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "branch"); ObjectId subHEAD3 = pushChangeTo(subRepo, "branch"); - expectToHaveSubmoduleState(superRepo, "master", - "subscribed-to-project", subHEAD1); - expectToHaveSubmoduleState(superRepo, "branch", - "subscribed-to-project", subHEAD3); + expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subHEAD1); + expectToHaveSubmoduleState(superRepo, "branch", "subscribed-to-project", subHEAD3); } @Test @@ -194,15 +172,13 @@ public class SubmoduleSubscriptionsIT extends AbstractSubmoduleSubscription { TestRepository subRepo = createProjectWithPush("subscribed-to-project"); // Any branch is allowed to be subscribed to any superproject branch: - allowSubmoduleSubscription("subscribed-to-project", "refs/heads/*", - "super-project", null, false); + allowSubmoduleSubscription( + "subscribed-to-project", "refs/heads/*", "super-project", null, false); pushChangeTo(superRepo, "branch"); pushChangeTo(subRepo, "another-branch"); - createSubmoduleSubscription(superRepo, "branch", - "subscribed-to-project", "another-branch"); + createSubmoduleSubscription(superRepo, "branch", "subscribed-to-project", "another-branch"); ObjectId subHEAD = pushChangeTo(subRepo, "another-branch"); - expectToHaveSubmoduleState(superRepo, "branch", - "subscribed-to-project", subHEAD); + expectToHaveSubmoduleState(superRepo, "branch", "subscribed-to-project", subHEAD); } @Test @@ -211,22 +187,18 @@ public class SubmoduleSubscriptionsIT extends AbstractSubmoduleSubscription { TestRepository subRepo = createProjectWithPush("subscribed-to-project"); // Any branch is allowed to be subscribed to any superproject branch: - allowSubmoduleSubscription("subscribed-to-project", "refs/heads/master", - "super-project", "refs/heads/*", false); + allowSubmoduleSubscription( + "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/*", false); pushChangeTo(superRepo, "branch"); - createSubmoduleSubscription(superRepo, "branch", - "subscribed-to-project", "master"); + createSubmoduleSubscription(superRepo, "branch", "subscribed-to-project", "master"); ObjectId subHEAD = pushChangeTo(subRepo, "master"); - expectToHaveSubmoduleState(superRepo, "branch", - "subscribed-to-project", subHEAD); + expectToHaveSubmoduleState(superRepo, "branch", "subscribed-to-project", subHEAD); - createSubmoduleSubscription(superRepo, "branch", - "subscribed-to-project", "branch"); + createSubmoduleSubscription(superRepo, "branch", "subscribed-to-project", "branch"); pushChangeTo(subRepo, "branch"); // no change expected, as only master is subscribed: - expectToHaveSubmoduleState(superRepo, "branch", - "subscribed-to-project", subHEAD); + expectToHaveSubmoduleState(superRepo, "branch", "subscribed-to-project", subHEAD); } @Test @@ -234,26 +206,21 @@ public class SubmoduleSubscriptionsIT extends AbstractSubmoduleSubscription { public void testSubmoduleShortCommitMessage() throws Exception { TestRepository superRepo = createProjectWithPush("super-project"); TestRepository subRepo = createProjectWithPush("subscribed-to-project"); - allowMatchingSubmoduleSubscription("subscribed-to-project", "refs/heads/master", - "super-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master"); pushChangeTo(subRepo, "master"); - createSubmoduleSubscription(superRepo, "master", - "subscribed-to-project", "master"); + createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master"); // The first update doesn't include any commit messages ObjectId subRepoId = pushChangeTo(subRepo, "master"); - expectToHaveSubmoduleState(superRepo, "master", - "subscribed-to-project", subRepoId); - expectToHaveCommitMessage(superRepo, "master", - "Update git submodules\n\n"); + expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subRepoId); + expectToHaveCommitMessage(superRepo, "master", "Update git submodules\n\n"); // Any following update also has a short message subRepoId = pushChangeTo(subRepo, "master"); - expectToHaveSubmoduleState(superRepo, "master", - "subscribed-to-project", subRepoId); - expectToHaveCommitMessage(superRepo, "master", - "Update git submodules\n\n"); + expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subRepoId); + expectToHaveCommitMessage(superRepo, "master", "Update git submodules\n\n"); } @Test @@ -261,149 +228,153 @@ public class SubmoduleSubscriptionsIT extends AbstractSubmoduleSubscription { public void testSubmoduleSubjectCommitMessage() throws Exception { TestRepository superRepo = createProjectWithPush("super-project"); TestRepository subRepo = createProjectWithPush("subscribed-to-project"); - allowMatchingSubmoduleSubscription("subscribed-to-project", "refs/heads/master", - "super-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master"); pushChangeTo(subRepo, "master"); - createSubmoduleSubscription(superRepo, "master", - "subscribed-to-project", "master"); + createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master"); ObjectId subHEAD = pushChangeTo(subRepo, "master"); // The first update doesn't include the rev log RevWalk rw = subRepo.getRevWalk(); - expectToHaveCommitMessage(superRepo, "master", - "Update git submodules\n\n" + - "* Update " + name("subscribed-to-project") + " from branch 'master'"); + expectToHaveCommitMessage( + superRepo, + "master", + "Update git submodules\n\n" + + "* Update " + + name("subscribed-to-project") + + " from branch 'master'"); // The next commit should generate only its commit message, // omitting previous commit logs subHEAD = pushChangeTo(subRepo, "master"); RevCommit subCommitMsg = rw.parseCommit(subHEAD); - expectToHaveCommitMessage(superRepo, "master", - "Update git submodules\n\n" + - "* Update " + name("subscribed-to-project") + " from branch 'master'" - + "\n - " + subCommitMsg.getShortMessage()); + expectToHaveCommitMessage( + superRepo, + "master", + "Update git submodules\n\n" + + "* Update " + + name("subscribed-to-project") + + " from branch 'master'" + + "\n - " + + subCommitMsg.getShortMessage()); } @Test public void submoduleCommitMessage() throws Exception { TestRepository superRepo = createProjectWithPush("super-project"); TestRepository subRepo = createProjectWithPush("subscribed-to-project"); - allowMatchingSubmoduleSubscription("subscribed-to-project", "refs/heads/master", - "super-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master"); pushChangeTo(subRepo, "master"); - createSubmoduleSubscription(superRepo, "master", - "subscribed-to-project", "master"); + createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master"); ObjectId subHEAD = pushChangeTo(subRepo, "master"); // The first update doesn't include the rev log RevWalk rw = subRepo.getRevWalk(); - expectToHaveCommitMessage(superRepo, "master", - "Update git submodules\n\n" + - "* Update " + name("subscribed-to-project") + " from branch 'master'"); + expectToHaveCommitMessage( + superRepo, + "master", + "Update git submodules\n\n" + + "* Update " + + name("subscribed-to-project") + + " from branch 'master'"); // The next commit should generate only its commit message, // omitting previous commit logs subHEAD = pushChangeTo(subRepo, "master"); RevCommit subCommitMsg = rw.parseCommit(subHEAD); - expectToHaveCommitMessage(superRepo, "master", - "Update git submodules\n\n" + - "* Update " + name("subscribed-to-project") + " from branch 'master'" - + "\n - " + subCommitMsg.getFullMessage().replace("\n", "\n ")); + expectToHaveCommitMessage( + superRepo, + "master", + "Update git submodules\n\n" + + "* Update " + + name("subscribed-to-project") + + " from branch 'master'" + + "\n - " + + subCommitMsg.getFullMessage().replace("\n", "\n ")); } @Test public void subscriptionUnsubscribe() throws Exception { TestRepository superRepo = createProjectWithPush("super-project"); TestRepository subRepo = createProjectWithPush("subscribed-to-project"); - allowMatchingSubmoduleSubscription("subscribed-to-project", "refs/heads/master", - "super-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master"); pushChangeTo(subRepo, "master"); - createSubmoduleSubscription(superRepo, "master", - "subscribed-to-project", "master"); + createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master"); pushChangeTo(subRepo, "master"); ObjectId subHEADbeforeUnsubscribing = pushChangeTo(subRepo, "master"); deleteAllSubscriptions(superRepo, "master"); - expectToHaveSubmoduleState(superRepo, "master", - "subscribed-to-project", subHEADbeforeUnsubscribing); + expectToHaveSubmoduleState( + superRepo, "master", "subscribed-to-project", subHEADbeforeUnsubscribing); - pushChangeTo(superRepo, "refs/heads/master", - "commit after unsubscribe", ""); - pushChangeTo(subRepo, "refs/heads/master", - "commit after unsubscribe", ""); - expectToHaveSubmoduleState(superRepo, "master", - "subscribed-to-project", subHEADbeforeUnsubscribing); + pushChangeTo(superRepo, "refs/heads/master", "commit after unsubscribe", ""); + pushChangeTo(subRepo, "refs/heads/master", "commit after unsubscribe", ""); + expectToHaveSubmoduleState( + superRepo, "master", "subscribed-to-project", subHEADbeforeUnsubscribing); } @Test - public void subscriptionUnsubscribeByDeletingGitModules() - throws Exception { + public void subscriptionUnsubscribeByDeletingGitModules() throws Exception { TestRepository superRepo = createProjectWithPush("super-project"); TestRepository subRepo = createProjectWithPush("subscribed-to-project"); - allowMatchingSubmoduleSubscription("subscribed-to-project", "refs/heads/master", - "super-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master"); pushChangeTo(subRepo, "master"); - createSubmoduleSubscription(superRepo, "master", - "subscribed-to-project", "master"); + createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master"); pushChangeTo(subRepo, "master"); ObjectId subHEADbeforeUnsubscribing = pushChangeTo(subRepo, "master"); deleteGitModulesFile(superRepo, "master"); - expectToHaveSubmoduleState(superRepo, "master", - "subscribed-to-project", subHEADbeforeUnsubscribing); + expectToHaveSubmoduleState( + superRepo, "master", "subscribed-to-project", subHEADbeforeUnsubscribing); - pushChangeTo(superRepo, "refs/heads/master", - "commit after unsubscribe", ""); - pushChangeTo(subRepo, "refs/heads/master", - "commit after unsubscribe", ""); - expectToHaveSubmoduleState(superRepo, "master", - "subscribed-to-project", subHEADbeforeUnsubscribing); + pushChangeTo(superRepo, "refs/heads/master", "commit after unsubscribe", ""); + pushChangeTo(subRepo, "refs/heads/master", "commit after unsubscribe", ""); + expectToHaveSubmoduleState( + superRepo, "master", "subscribed-to-project", subHEADbeforeUnsubscribing); } @Test public void subscriptionToDifferentBranches() throws Exception { TestRepository superRepo = createProjectWithPush("super-project"); TestRepository subRepo = createProjectWithPush("subscribed-to-project"); - allowMatchingSubmoduleSubscription("subscribed-to-project", "refs/heads/foo", - "super-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "subscribed-to-project", "refs/heads/foo", "super-project", "refs/heads/master"); - createSubmoduleSubscription(superRepo, "master", - "subscribed-to-project", "foo"); + createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "foo"); ObjectId subFoo = pushChangeTo(subRepo, "foo"); pushChangeTo(subRepo, "master"); - expectToHaveSubmoduleState(superRepo, "master", - "subscribed-to-project", subFoo); + expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subFoo); } @Test public void branchCircularSubscription() throws Exception { TestRepository superRepo = createProjectWithPush("super-project"); TestRepository subRepo = createProjectWithPush("subscribed-to-project"); - allowMatchingSubmoduleSubscription("subscribed-to-project", "refs/heads/master", - "super-project", "refs/heads/master"); - allowMatchingSubmoduleSubscription("super-project", "refs/heads/master", - "subscribed-to-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "super-project", "refs/heads/master", "subscribed-to-project", "refs/heads/master"); pushChangeTo(subRepo, "master"); pushChangeTo(superRepo, "master"); - createSubmoduleSubscription(superRepo, "master", - "subscribed-to-project", "master"); + createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master"); createSubmoduleSubscription(subRepo, "master", "super-project", "master"); pushChangeTo(subRepo, "master"); pushChangeTo(superRepo, "master"); - assertThat(hasSubmodule(subRepo, "master", - "super-project")).isFalse(); - assertThat(hasSubmodule(superRepo, "master", - "subscribed-to-project")).isFalse(); + assertThat(hasSubmodule(subRepo, "master", "super-project")).isFalse(); + assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isFalse(); } @Test @@ -411,31 +382,26 @@ public class SubmoduleSubscriptionsIT extends AbstractSubmoduleSubscription { TestRepository superRepo = createProjectWithPush("super-project"); TestRepository subRepo = createProjectWithPush("subscribed-to-project"); - allowMatchingSubmoduleSubscription("subscribed-to-project", "refs/heads/master", - "super-project", "refs/heads/master"); - allowMatchingSubmoduleSubscription("super-project", "refs/heads/dev", - "subscribed-to-project", "refs/heads/dev"); + allowMatchingSubmoduleSubscription( + "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "super-project", "refs/heads/dev", "subscribed-to-project", "refs/heads/dev"); pushChangeTo(subRepo, "master"); pushChangeTo(superRepo, "master"); pushChangeTo(subRepo, "dev"); pushChangeTo(superRepo, "dev"); - createSubmoduleSubscription(superRepo, "master", - "subscribed-to-project", "master"); + createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master"); createSubmoduleSubscription(subRepo, "dev", "super-project", "dev"); ObjectId subMasterHead = pushChangeTo(subRepo, "master"); ObjectId superDevHead = pushChangeTo(superRepo, "dev"); - assertThat(hasSubmodule(superRepo, "master", - "subscribed-to-project")).isTrue(); - assertThat(hasSubmodule(subRepo, "dev", - "super-project")).isTrue(); - expectToHaveSubmoduleState(superRepo, "master", - "subscribed-to-project", subMasterHead); - expectToHaveSubmoduleState(subRepo, "dev", - "super-project", superDevHead); + assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isTrue(); + assertThat(hasSubmodule(subRepo, "dev", "super-project")).isTrue(); + expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subMasterHead); + expectToHaveSubmoduleState(subRepo, "dev", "super-project", superDevHead); } @Test @@ -444,103 +410,93 @@ public class SubmoduleSubscriptionsIT extends AbstractSubmoduleSubscription { TestRepository subRepo = createProjectWithPush("subscribed-to-project"); pushChangeTo(subRepo, "master"); - createSubmoduleSubscription(superRepo, "master", - "subscribed-to-project", "master"); + createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master"); pushChangeTo(subRepo, "master"); - assertThat(hasSubmodule(superRepo, "master", - "subscribed-to-project")).isFalse(); + assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isFalse(); } @Test public void subscriptionFailOnWrongProjectACL() throws Exception { TestRepository superRepo = createProjectWithPush("super-project"); TestRepository subRepo = createProjectWithPush("subscribed-to-project"); - allowMatchingSubmoduleSubscription("subscribed-to-project", "refs/heads/master", - "wrong-super-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "subscribed-to-project", "refs/heads/master", "wrong-super-project", "refs/heads/master"); pushChangeTo(subRepo, "master"); - createSubmoduleSubscription(superRepo, "master", - "subscribed-to-project", "master"); + createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master"); pushChangeTo(subRepo, "master"); - assertThat(hasSubmodule(superRepo, "master", - "subscribed-to-project")).isFalse(); + assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isFalse(); } @Test public void subscriptionFailOnWrongBranchACL() throws Exception { TestRepository superRepo = createProjectWithPush("super-project"); TestRepository subRepo = createProjectWithPush("subscribed-to-project"); - allowMatchingSubmoduleSubscription("subscribed-to-project", "refs/heads/master", - "super-project", "refs/heads/wrong-branch"); + allowMatchingSubmoduleSubscription( + "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/wrong-branch"); pushChangeTo(subRepo, "master"); - createSubmoduleSubscription(superRepo, "master", - "subscribed-to-project", "master"); + createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master"); pushChangeTo(subRepo, "master"); - assertThat(hasSubmodule(superRepo, "master", - "subscribed-to-project")).isFalse(); + assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isFalse(); } @Test public void subscriptionInheritACL() throws Exception { createProjectWithPush("config-repo"); - createProjectWithPush("config-repo2", - new Project.NameKey(name("config-repo"))); + createProjectWithPush("config-repo2", new Project.NameKey(name("config-repo"))); TestRepository superRepo = createProjectWithPush("super-project"); - TestRepository subRepo = createProjectWithPush("subscribed-to-project", - new Project.NameKey(name("config-repo2"))); - allowMatchingSubmoduleSubscription("config-repo", "refs/heads/*", - "super-project", "refs/heads/*"); + TestRepository subRepo = + createProjectWithPush("subscribed-to-project", new Project.NameKey(name("config-repo2"))); + allowMatchingSubmoduleSubscription( + "config-repo", "refs/heads/*", "super-project", "refs/heads/*"); pushChangeTo(subRepo, "master"); - createSubmoduleSubscription(superRepo, "master", - "subscribed-to-project", "master"); + createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master"); ObjectId subHEAD = pushChangeTo(subRepo, "master"); - expectToHaveSubmoduleState(superRepo, "master", - "subscribed-to-project", subHEAD); + expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subHEAD); } @Test public void allowedButNotSubscribed() throws Exception { TestRepository superRepo = createProjectWithPush("super-project"); TestRepository subRepo = createProjectWithPush("subscribed-to-project"); - allowMatchingSubmoduleSubscription("subscribed-to-project", "refs/heads/master", - "super-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master"); pushChangeTo(subRepo, "master"); - subRepo.branch("HEAD").commit().insertChangeId() + subRepo + .branch("HEAD") + .commit() + .insertChangeId() .message("some change") .add("b.txt", "b contents for testing") .create(); String refspec = "HEAD:refs/heads/master"; - PushResult r = Iterables.getOnlyElement(subRepo.git().push() - .setRemote("origin") - .setRefSpecs(new RefSpec(refspec)) - .call()); + PushResult r = + Iterables.getOnlyElement( + subRepo.git().push().setRemote("origin").setRefSpecs(new RefSpec(refspec)).call()); assertThat(r.getMessages()).doesNotContain("error"); assertThat(r.getRemoteUpdate("refs/heads/master").getStatus()) - .isEqualTo(RemoteRefUpdate.Status.OK); + .isEqualTo(RemoteRefUpdate.Status.OK); - assertThat(hasSubmodule(superRepo, "master", - "subscribed-to-project")).isFalse(); + assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isFalse(); } @Test public void subscriptionDeepRelative() throws Exception { TestRepository superRepo = createProjectWithPush("super-project"); - TestRepository subRepo = createProjectWithPush( - "nested/subscribed-to-project"); + TestRepository subRepo = createProjectWithPush("nested/subscribed-to-project"); // master is allowed to be subscribed to any superprojects branch: - allowMatchingSubmoduleSubscription("nested/subscribed-to-project", - "refs/heads/master", "super-project", null); + allowMatchingSubmoduleSubscription( + "nested/subscribed-to-project", "refs/heads/master", "super-project", null); pushChangeTo(subRepo, "master"); - createRelativeSubmoduleSubscription(superRepo, "master", - "../", "nested/subscribed-to-project", "master"); + createRelativeSubmoduleSubscription( + superRepo, "master", "../", "nested/subscribed-to-project", "master"); ObjectId subHEAD = pushChangeTo(subRepo, "master"); - expectToHaveSubmoduleState(superRepo, "master", - "nested/subscribed-to-project", subHEAD); + expectToHaveSubmoduleState(superRepo, "master", "nested/subscribed-to-project", subHEAD); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsWholeTopicMergeIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsWholeTopicMergeIT.java index 045ed07bb7..068eb4f956 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsWholeTopicMergeIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsWholeTopicMergeIT.java @@ -26,7 +26,7 @@ import com.google.gerrit.extensions.restapi.BinaryResult; import com.google.gerrit.reviewdb.client.Branch; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.testutil.ConfigSuite; - +import java.util.Map; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.ObjectId; @@ -35,11 +35,8 @@ import org.eclipse.jgit.revwalk.RevTree; import org.eclipse.jgit.transport.RefSpec; import org.junit.Test; -import java.util.Map; - @NoHttpd -public class SubmoduleSubscriptionsWholeTopicMergeIT - extends AbstractSubmoduleSubscription { +public class SubmoduleSubscriptionsWholeTopicMergeIT extends AbstractSubmoduleSubscription { @ConfigSuite.Default public static Config mergeIfNecessary() { @@ -70,41 +67,67 @@ public class SubmoduleSubscriptionsWholeTopicMergeIT public void subscriptionUpdateOfManyChanges() throws Exception { TestRepository superRepo = createProjectWithPush("super-project"); TestRepository subRepo = createProjectWithPush("subscribed-to-project"); - allowMatchingSubmoduleSubscription("subscribed-to-project", "refs/heads/master", - "super-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master"); createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master"); - ObjectId subHEAD = subRepo.branch("HEAD").commit().insertChangeId() - .message("some change") - .add("a.txt", "a contents ") - .create(); - subRepo.git().push().setRemote("origin").setRefSpecs( - new RefSpec("HEAD:refs/heads/master")).call(); + ObjectId subHEAD = + subRepo + .branch("HEAD") + .commit() + .insertChangeId() + .message("some change") + .add("a.txt", "a contents ") + .create(); + subRepo + .git() + .push() + .setRemote("origin") + .setRefSpecs(new RefSpec("HEAD:refs/heads/master")) + .call(); RevCommit c = subRepo.getRevWalk().parseCommit(subHEAD); - RevCommit c1 = subRepo.branch("HEAD").commit().insertChangeId() - .message("first change") - .add("asdf", "asdf\n") - .create(); - subRepo.git().push().setRemote("origin") - .setRefSpecs(new RefSpec("HEAD:refs/for/master/" + name("topic-foo"))) - .call(); + RevCommit c1 = + subRepo + .branch("HEAD") + .commit() + .insertChangeId() + .message("first change") + .add("asdf", "asdf\n") + .create(); + subRepo + .git() + .push() + .setRemote("origin") + .setRefSpecs(new RefSpec("HEAD:refs/for/master/" + name("topic-foo"))) + .call(); subRepo.reset(c.getId()); - RevCommit c2 = subRepo.branch("HEAD").commit().insertChangeId() - .message("qwerty") - .add("qwerty", "qwerty") - .create(); + RevCommit c2 = + subRepo + .branch("HEAD") + .commit() + .insertChangeId() + .message("qwerty") + .add("qwerty", "qwerty") + .create(); - RevCommit c3 = subRepo.branch("HEAD").commit().insertChangeId() - .message("qwerty followup") - .add("qwerty", "qwerty\nqwerty\n") - .create(); - subRepo.git().push().setRemote("origin") - .setRefSpecs(new RefSpec("HEAD:refs/for/master/" + name("topic-foo"))) - .call(); + RevCommit c3 = + subRepo + .branch("HEAD") + .commit() + .insertChangeId() + .message("qwerty followup") + .add("qwerty", "qwerty\nqwerty\n") + .create(); + subRepo + .git() + .push() + .setRemote("origin") + .setRefSpecs(new RefSpec("HEAD:refs/for/master/" + name("topic-foo"))) + .call(); String id1 = getChangeId(subRepo, c1).get(); String id2 = getChangeId(subRepo, c2).get(); @@ -114,25 +137,27 @@ public class SubmoduleSubscriptionsWholeTopicMergeIT gApi.changes().id(id3).current().review(ReviewInput.approve()); BinaryResult request = gApi.changes().id(id1).current().submitPreview(); - Map preview = - fetchFromBundles(request); + Map preview = fetchFromBundles(request); gApi.changes().id(id1).current().submit(); - ObjectId subRepoId = subRepo.git().fetch().setRemote("origin").call() - .getAdvertisedRef("refs/heads/master").getObjectId(); + ObjectId subRepoId = + subRepo + .git() + .fetch() + .setRemote("origin") + .call() + .getAdvertisedRef("refs/heads/master") + .getObjectId(); - expectToHaveSubmoduleState(superRepo, "master", - "subscribed-to-project", subRepoId); + expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subRepoId); // As the submodules have changed commits, the superproject tree will be // different, so we cannot directly compare the trees here, so make // assumptions only about the changed branches: Project.NameKey p1 = new Project.NameKey(name("super-project")); Project.NameKey p2 = new Project.NameKey(name("subscribed-to-project")); - assertThat(preview).containsKey( - new Branch.NameKey(p1, "refs/heads/master")); - assertThat(preview).containsKey( - new Branch.NameKey(p2, "refs/heads/master")); + assertThat(preview).containsKey(new Branch.NameKey(p1, "refs/heads/master")); + assertThat(preview).containsKey(new Branch.NameKey(p2, "refs/heads/master")); if ((getSubmitType() == SubmitType.CHERRY_PICK) || (getSubmitType() == SubmitType.REBASE_ALWAYS)) { @@ -149,54 +174,85 @@ public class SubmoduleSubscriptionsWholeTopicMergeIT } @Test - public void subscriptionUpdateIncludingChangeInSuperproject() - throws Exception { + public void subscriptionUpdateIncludingChangeInSuperproject() throws Exception { TestRepository superRepo = createProjectWithPush("super-project"); TestRepository subRepo = createProjectWithPush("subscribed-to-project"); - allowMatchingSubmoduleSubscription("subscribed-to-project", - "refs/heads/master", "super-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master"); - createSubmoduleSubscription(superRepo, "master", - "subscribed-to-project", "master"); + createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master"); - ObjectId subHEAD = subRepo.branch("HEAD").commit().insertChangeId() - .message("some change") - .add("a.txt", "a contents ") - .create(); - subRepo.git().push().setRemote("origin").setRefSpecs( - new RefSpec("HEAD:refs/heads/master")).call(); + ObjectId subHEAD = + subRepo + .branch("HEAD") + .commit() + .insertChangeId() + .message("some change") + .add("a.txt", "a contents ") + .create(); + subRepo + .git() + .push() + .setRemote("origin") + .setRefSpecs(new RefSpec("HEAD:refs/heads/master")) + .call(); RevCommit c = subRepo.getRevWalk().parseCommit(subHEAD); - RevCommit c1 = subRepo.branch("HEAD").commit().insertChangeId() - .message("first change") - .add("asdf", "asdf\n") - .create(); - subRepo.git().push().setRemote("origin") - .setRefSpecs(new RefSpec("HEAD:refs/for/master/" + name("topic-foo"))) - .call(); + RevCommit c1 = + subRepo + .branch("HEAD") + .commit() + .insertChangeId() + .message("first change") + .add("asdf", "asdf\n") + .create(); + subRepo + .git() + .push() + .setRemote("origin") + .setRefSpecs(new RefSpec("HEAD:refs/for/master/" + name("topic-foo"))) + .call(); subRepo.reset(c.getId()); - RevCommit c2 = subRepo.branch("HEAD").commit().insertChangeId() - .message("qwerty") - .add("qwerty", "qwerty") - .create(); + RevCommit c2 = + subRepo + .branch("HEAD") + .commit() + .insertChangeId() + .message("qwerty") + .add("qwerty", "qwerty") + .create(); - RevCommit c3 = subRepo.branch("HEAD").commit().insertChangeId() - .message("qwerty followup") - .add("qwerty", "qwerty\nqwerty\n") - .create(); - subRepo.git().push().setRemote("origin") - .setRefSpecs(new RefSpec("HEAD:refs/for/master/" + name("topic-foo"))) - .call(); + RevCommit c3 = + subRepo + .branch("HEAD") + .commit() + .insertChangeId() + .message("qwerty followup") + .add("qwerty", "qwerty\nqwerty\n") + .create(); + subRepo + .git() + .push() + .setRemote("origin") + .setRefSpecs(new RefSpec("HEAD:refs/for/master/" + name("topic-foo"))) + .call(); - RevCommit c4 = superRepo.branch("HEAD").commit().insertChangeId() - .message("new change on superproject") - .add("foo", "bar") - .create(); - superRepo.git().push().setRemote("origin") - .setRefSpecs(new RefSpec("HEAD:refs/for/master/" + name("topic-foo"))) - .call(); + RevCommit c4 = + superRepo + .branch("HEAD") + .commit() + .insertChangeId() + .message("new change on superproject") + .add("foo", "bar") + .create(); + superRepo + .git() + .push() + .setRemote("origin") + .setRefSpecs(new RefSpec("HEAD:refs/for/master/" + name("topic-foo"))) + .call(); String id1 = getChangeId(subRepo, c1).get(); String id2 = getChangeId(subRepo, c2).get(); @@ -208,11 +264,16 @@ public class SubmoduleSubscriptionsWholeTopicMergeIT gApi.changes().id(id4).current().review(ReviewInput.approve()); gApi.changes().id(id1).current().submit(); - ObjectId subRepoId = subRepo.git().fetch().setRemote("origin").call() - .getAdvertisedRef("refs/heads/master").getObjectId(); + ObjectId subRepoId = + subRepo + .git() + .fetch() + .setRemote("origin") + .call() + .getAdvertisedRef("refs/heads/master") + .getObjectId(); - expectToHaveSubmoduleState(superRepo, "master", - "subscribed-to-project", subRepoId); + expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subRepoId); } @Test @@ -222,12 +283,12 @@ public class SubmoduleSubscriptionsWholeTopicMergeIT TestRepository sub2 = createProjectWithPush("sub2"); TestRepository sub3 = createProjectWithPush("sub3"); - allowMatchingSubmoduleSubscription("sub1", "refs/heads/master", - "super-project", "refs/heads/master"); - allowMatchingSubmoduleSubscription("sub2", "refs/heads/master", - "super-project", "refs/heads/master"); - allowMatchingSubmoduleSubscription("sub3", "refs/heads/master", - "super-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "sub1", "refs/heads/master", "super-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "sub2", "refs/heads/master", "super-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "sub3", "refs/heads/master", "super-project", "refs/heads/master"); Config config = new Config(); prepareSubmoduleConfigEntry(config, "sub1", "master"); @@ -237,12 +298,9 @@ public class SubmoduleSubscriptionsWholeTopicMergeIT ObjectId superPreviousId = pushChangeTo(superRepo, "master"); - ObjectId sub1Id = pushChangeTo(sub1, "refs/for/master", - "some message", "same-topic"); - ObjectId sub2Id = pushChangeTo(sub2, "refs/for/master", - "some message", "same-topic"); - ObjectId sub3Id = pushChangeTo(sub3, "refs/for/master", - "some message", "same-topic"); + ObjectId sub1Id = pushChangeTo(sub1, "refs/for/master", "some message", "same-topic"); + ObjectId sub2Id = pushChangeTo(sub2, "refs/for/master", "some message", "same-topic"); + ObjectId sub3Id = pushChangeTo(sub3, "refs/for/master", "some message", "same-topic"); approve(getChangeId(sub1, sub1Id).get()); approve(getChangeId(sub2, sub2Id).get()); @@ -254,11 +312,15 @@ public class SubmoduleSubscriptionsWholeTopicMergeIT expectToHaveSubmoduleState(superRepo, "master", "sub2", sub2, "master"); expectToHaveSubmoduleState(superRepo, "master", "sub3", sub3, "master"); - superRepo.git().fetch().setRemote("origin").call() - .getAdvertisedRef("refs/heads/master").getObjectId(); + superRepo + .git() + .fetch() + .setRemote("origin") + .call() + .getAdvertisedRef("refs/heads/master") + .getObjectId(); - assertWithMessage("submodule subscription update " - + "should have made one commit") + assertWithMessage("submodule subscription update " + "should have made one commit") .that(superRepo.getRepository().resolve("origin/master^")) .isEqualTo(superPreviousId); } @@ -268,16 +330,14 @@ public class SubmoduleSubscriptionsWholeTopicMergeIT TestRepository superRepo = createProjectWithPush("super-project", false); TestRepository sub = createProjectWithPush("sub", false); - allowMatchingSubmoduleSubscription("sub", "refs/heads/master", - "super-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "sub", "refs/heads/master", "super-project", "refs/heads/master"); createSubmoduleSubscription(superRepo, "master", "sub", "master"); - ObjectId subId = - pushChangeTo(sub, "refs/for/master", "some message", "same-topic"); + ObjectId subId = pushChangeTo(sub, "refs/for/master", "some message", "same-topic"); - ObjectId superId = - pushChangeTo(superRepo, "refs/for/master", "some message", "same-topic"); + ObjectId superId = pushChangeTo(superRepo, "refs/for/master", "some message", "same-topic"); String subChangeId = getChangeId(sub, subId).get(); approve(subChangeId); @@ -296,11 +356,9 @@ public class SubmoduleSubscriptionsWholeTopicMergeIT TestRepository superRepo = createProjectWithPush("super-project", false); TestRepository sub = createProjectWithPush("sub", false); - ObjectId subId = - pushChangeTo(sub, "refs/for/master", "some message", "same-topic"); + ObjectId subId = pushChangeTo(sub, "refs/for/master", "some message", "same-topic"); - ObjectId superId = - pushChangeTo(superRepo, "refs/for/master", "some message", "same-topic"); + ObjectId superId = pushChangeTo(superRepo, "refs/for/master", "some message", "same-topic"); String subChangeId = getChangeId(sub, subId).get(); approve(subChangeId); @@ -318,8 +376,8 @@ public class SubmoduleSubscriptionsWholeTopicMergeIT TestRepository superRepo = createProjectWithPush("super-project"); TestRepository sub = createProjectWithPush("sub"); - allowMatchingSubmoduleSubscription("sub", "refs/heads/master", - "super-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "sub", "refs/heads/master", "super-project", "refs/heads/master"); Config config = new Config(); prepareSubmoduleConfigEntry(config, "sub", "master"); @@ -337,11 +395,15 @@ public class SubmoduleSubscriptionsWholeTopicMergeIT expectToHaveSubmoduleState(superRepo, "master", "sub", sub, "master"); expectToHaveSubmoduleState(superRepo, "master", "sub-copy", sub, "master"); - superRepo.git().fetch().setRemote("origin").call() - .getAdvertisedRef("refs/heads/master").getObjectId(); + superRepo + .git() + .fetch() + .setRemote("origin") + .call() + .getAdvertisedRef("refs/heads/master") + .getObjectId(); - assertWithMessage("submodule subscription update " - + "should have made one commit") + assertWithMessage("submodule subscription update " + "should have made one commit") .that(superRepo.getRepository().resolve("origin/master^")) .isEqualTo(superPreviousId); } @@ -351,10 +413,10 @@ public class SubmoduleSubscriptionsWholeTopicMergeIT TestRepository superRepo = createProjectWithPush("super-project"); TestRepository sub = createProjectWithPush("sub"); - allowMatchingSubmoduleSubscription("sub", "refs/heads/master", - "super-project", "refs/heads/master"); - allowMatchingSubmoduleSubscription("sub", "refs/heads/dev", - "super-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "sub", "refs/heads/master", "super-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "sub", "refs/heads/dev", "super-project", "refs/heads/master"); ObjectId devHead = pushChangeTo(sub, "dev"); Config config = new Config(); @@ -363,13 +425,12 @@ public class SubmoduleSubscriptionsWholeTopicMergeIT pushSubmoduleConfig(superRepo, "master", config); ObjectId subMasterId = - pushChangeTo(sub, "refs/for/master", "some message", "b.txt", - "content b", "same-topic"); + pushChangeTo(sub, "refs/for/master", "some message", "b.txt", "content b", "same-topic"); sub.reset(devHead); ObjectId subDevId = - pushChangeTo(sub, "refs/for/dev", "some message in dev", "b.txt", - "content b", "same-topic"); + pushChangeTo( + sub, "refs/for/dev", "some message in dev", "b.txt", "content b", "same-topic"); approve(getChangeId(sub, subMasterId).get()); approve(getChangeId(sub, subDevId).get()); @@ -381,11 +442,15 @@ public class SubmoduleSubscriptionsWholeTopicMergeIT expectToHaveSubmoduleState(superRepo, "master", "sub-master", sub, "master"); expectToHaveSubmoduleState(superRepo, "master", "sub-dev", sub, "dev"); - superRepo.git().fetch().setRemote("origin").call() - .getAdvertisedRef("refs/heads/master").getObjectId(); + superRepo + .git() + .fetch() + .setRemote("origin") + .call() + .getAdvertisedRef("refs/heads/master") + .getObjectId(); - assertWithMessage("submodule subscription update " - + "should have made one commit") + assertWithMessage("submodule subscription update " + "should have made one commit") .that(superRepo.getRepository().resolve("origin/master^")) .isEqualTo(superPreviousId); } @@ -396,18 +461,16 @@ public class SubmoduleSubscriptionsWholeTopicMergeIT TestRepository sub = createProjectWithPush("sub"); TestRepository standAlone = createProjectWithPush("standalone"); - allowMatchingSubmoduleSubscription("sub", "refs/heads/master", - "super-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "sub", "refs/heads/master", "super-project", "refs/heads/master"); createSubmoduleSubscription(superRepo, "master", "sub", "master"); ObjectId superPreviousId = pushChangeTo(superRepo, "master"); - ObjectId subId = - pushChangeTo(sub, "refs/for/master", "some message", "same-topic"); + ObjectId subId = pushChangeTo(sub, "refs/for/master", "some message", "same-topic"); ObjectId standAloneId = - pushChangeTo(standAlone, "refs/for/master", "some message", - "same-topic"); + pushChangeTo(standAlone, "refs/for/master", "some message", "same-topic"); String subChangeId = getChangeId(sub, subId).get(); String standAloneChangeId = getChangeId(standAlone, standAloneId).get(); @@ -421,11 +484,15 @@ public class SubmoduleSubscriptionsWholeTopicMergeIT ChangeStatus status = gApi.changes().id(standAloneChangeId).info().status; assertThat(status).isEqualTo(ChangeStatus.MERGED); - superRepo.git().fetch().setRemote("origin").call() - .getAdvertisedRef("refs/heads/master").getObjectId(); + superRepo + .git() + .fetch() + .setRemote("origin") + .call() + .getAdvertisedRef("refs/heads/master") + .getObjectId(); - assertWithMessage("submodule subscription update " - + "should have made one commit") + assertWithMessage("submodule subscription update " + "should have made one commit") .that(superRepo.getRepository().resolve("origin/master^")) .isEqualTo(superPreviousId); } @@ -436,19 +503,16 @@ public class SubmoduleSubscriptionsWholeTopicMergeIT TestRepository midRepo = createProjectWithPush("mid-project"); TestRepository bottomRepo = createProjectWithPush("bottom-project"); - allowMatchingSubmoduleSubscription("mid-project", "refs/heads/master", - "top-project", "refs/heads/master"); - allowMatchingSubmoduleSubscription("bottom-project", "refs/heads/master", - "mid-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "mid-project", "refs/heads/master", "top-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "bottom-project", "refs/heads/master", "mid-project", "refs/heads/master"); createSubmoduleSubscription(topRepo, "master", "mid-project", "master"); createSubmoduleSubscription(midRepo, "master", "bottom-project", "master"); - ObjectId bottomHead = - pushChangeTo(bottomRepo, "refs/for/master", - "some message", "same-topic"); - ObjectId topHead = - pushChangeTo(topRepo, "refs/for/master", "some message", "same-topic"); + ObjectId bottomHead = pushChangeTo(bottomRepo, "refs/for/master", "some message", "same-topic"); + ObjectId topHead = pushChangeTo(topRepo, "refs/for/master", "some message", "same-topic"); String id1 = getChangeId(bottomRepo, bottomHead).get(); String id2 = getChangeId(topRepo, topHead).get(); @@ -458,10 +522,8 @@ public class SubmoduleSubscriptionsWholeTopicMergeIT gApi.changes().id(id1).current().submit(); - expectToHaveSubmoduleState(midRepo, "master", "bottom-project", - bottomRepo, "master"); - expectToHaveSubmoduleState(topRepo, "master", "mid-project", - midRepo, "master"); + expectToHaveSubmoduleState(midRepo, "master", "bottom-project", bottomRepo, "master"); + expectToHaveSubmoduleState(topRepo, "master", "mid-project", midRepo, "master"); } @Test @@ -470,12 +532,12 @@ public class SubmoduleSubscriptionsWholeTopicMergeIT TestRepository midRepo = createProjectWithPush("mid-project"); TestRepository bottomRepo = createProjectWithPush("bottom-project"); - allowMatchingSubmoduleSubscription("mid-project", "refs/heads/master", - "top-project", "refs/heads/master"); - allowMatchingSubmoduleSubscription("bottom-project", "refs/heads/master", - "mid-project", "refs/heads/master"); - allowMatchingSubmoduleSubscription("bottom-project", "refs/heads/master", - "top-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "mid-project", "refs/heads/master", "top-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "bottom-project", "refs/heads/master", "mid-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "bottom-project", "refs/heads/master", "top-project", "refs/heads/master"); createSubmoduleSubscription(midRepo, "master", "bottom-project", "master"); Config config = new Config(); @@ -483,11 +545,8 @@ public class SubmoduleSubscriptionsWholeTopicMergeIT prepareSubmoduleConfigEntry(config, "mid-project", "master"); pushSubmoduleConfig(topRepo, "master", config); - ObjectId bottomHead = - pushChangeTo(bottomRepo, "refs/for/master", - "some message", "same-topic"); - ObjectId topHead = - pushChangeTo(topRepo, "refs/for/master", "some message", "same-topic"); + ObjectId bottomHead = pushChangeTo(bottomRepo, "refs/for/master", "some message", "same-topic"); + ObjectId topHead = pushChangeTo(topRepo, "refs/for/master", "some message", "same-topic"); String id1 = getChangeId(bottomRepo, bottomHead).get(); String id2 = getChangeId(topRepo, topHead).get(); @@ -497,15 +556,11 @@ public class SubmoduleSubscriptionsWholeTopicMergeIT gApi.changes().id(id1).current().submit(); - expectToHaveSubmoduleState(midRepo, "master", - "bottom-project", bottomRepo, "master"); - expectToHaveSubmoduleState(topRepo, "master", - "mid-project", midRepo, "master"); - expectToHaveSubmoduleState(topRepo, "master", - "bottom-project", bottomRepo, "master"); + expectToHaveSubmoduleState(midRepo, "master", "bottom-project", bottomRepo, "master"); + expectToHaveSubmoduleState(topRepo, "master", "mid-project", midRepo, "master"); + expectToHaveSubmoduleState(topRepo, "master", "bottom-project", bottomRepo, "master"); } - private String prepareBranchCircularSubscription() throws Exception { TestRepository topRepo = createProjectWithPush("top-project"); TestRepository midRepo = createProjectWithPush("mid-project"); @@ -515,15 +570,14 @@ public class SubmoduleSubscriptionsWholeTopicMergeIT createSubmoduleSubscription(topRepo, "master", "mid-project", "master"); createSubmoduleSubscription(bottomRepo, "master", "top-project", "master"); - allowMatchingSubmoduleSubscription("bottom-project", "refs/heads/master", - "mid-project", "refs/heads/master"); - allowMatchingSubmoduleSubscription("mid-project", "refs/heads/master", - "top-project", "refs/heads/master"); - allowMatchingSubmoduleSubscription("top-project", "refs/heads/master", - "bottom-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "bottom-project", "refs/heads/master", "mid-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "mid-project", "refs/heads/master", "top-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "top-project", "refs/heads/master", "bottom-project", "refs/heads/master"); - ObjectId bottomMasterHead = - pushChangeTo(bottomRepo, "refs/for/master", "some message", ""); + ObjectId bottomMasterHead = pushChangeTo(bottomRepo, "refs/for/master", "some message", ""); String changeId = getChangeId(bottomRepo, bottomMasterHead).get(); approve(changeId); @@ -551,24 +605,21 @@ public class SubmoduleSubscriptionsWholeTopicMergeIT TestRepository superRepo = createProjectWithPush("super-project"); TestRepository subRepo = createProjectWithPush("subscribed-to-project"); - allowMatchingSubmoduleSubscription("subscribed-to-project", - "refs/heads/master", "super-project", "refs/heads/master"); - allowMatchingSubmoduleSubscription("super-project", "refs/heads/dev", - "subscribed-to-project", "refs/heads/dev"); + allowMatchingSubmoduleSubscription( + "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "super-project", "refs/heads/dev", "subscribed-to-project", "refs/heads/dev"); pushChangeTo(subRepo, "dev"); pushChangeTo(superRepo, "dev"); - createSubmoduleSubscription(superRepo, "master", - "subscribed-to-project", "master"); + createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master"); createSubmoduleSubscription(subRepo, "dev", "super-project", "dev"); ObjectId subMasterHead = - pushChangeTo(subRepo, "refs/for/master", "b.txt", "content b", - "some message", "same-topic"); - ObjectId superDevHead = - pushChangeTo(superRepo, "refs/for/dev", - "some message", "same-topic"); + pushChangeTo( + subRepo, "refs/for/master", "b.txt", "content b", "some message", "same-topic"); + ObjectId superDevHead = pushChangeTo(superRepo, "refs/for/dev", "some message", "same-topic"); approve(getChangeId(subRepo, subMasterHead).get()); approve(getChangeId(superRepo, superDevHead).get()); @@ -576,11 +627,9 @@ public class SubmoduleSubscriptionsWholeTopicMergeIT exception.expectMessage("Project level circular subscriptions detected"); exception.expectMessage("subscribed-to-project"); exception.expectMessage("super-project"); - gApi.changes().id(getChangeId(subRepo, subMasterHead).get()).current() - .submit(); + gApi.changes().id(getChangeId(subRepo, subMasterHead).get()).current().submit(); - assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")) - .isFalse(); + assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isFalse(); assertThat(hasSubmodule(subRepo, "dev", "super-project")).isFalse(); } @@ -596,25 +645,45 @@ public class SubmoduleSubscriptionsWholeTopicMergeIT // create a change for master branch in repo a ObjectId aHead = - pushChangeTo(repoA, "refs/for/master", "master.txt", "content master A", - "some message in a master.txt", "same-topic"); + pushChangeTo( + repoA, + "refs/for/master", + "master.txt", + "content master A", + "some message in a master.txt", + "same-topic"); // create a change for master branch in repo b ObjectId bHead = - pushChangeTo(repoB, "refs/for/master", "master.txt", "content master B", - "some message in b master.txt", "same-topic"); + pushChangeTo( + repoB, + "refs/for/master", + "master.txt", + "content master B", + "some message in b master.txt", + "same-topic"); // create a change for dev branch in repo a repoA.reset(a0); ObjectId aDevHead = - pushChangeTo(repoA, "refs/for/dev", "dev.txt", "content dev A", - "some message in a dev.txt", "same-topic"); + pushChangeTo( + repoA, + "refs/for/dev", + "dev.txt", + "content dev A", + "some message in a dev.txt", + "same-topic"); // create a change for dev branch in repo b repoB.reset(b0); ObjectId bDevHead = - pushChangeTo(repoB, "refs/for/dev", "dev.txt", "content dev B", - "some message in b dev.txt", "same-topic"); + pushChangeTo( + repoB, + "refs/for/dev", + "dev.txt", + "content dev B", + "some message in b dev.txt", + "same-topic"); approve(getChangeId(repoA, aHead).get()); approve(getChangeId(repoB, bHead).get()); @@ -622,17 +691,13 @@ public class SubmoduleSubscriptionsWholeTopicMergeIT approve(getChangeId(repoB, bDevHead).get()); gApi.changes().id(getChangeId(repoA, aDevHead).get()).current().submit(); - assertThat( - getRemoteHead(name("project-a"), "refs/heads/master").getShortMessage()) + assertThat(getRemoteHead(name("project-a"), "refs/heads/master").getShortMessage()) .contains("some message in a master.txt"); - assertThat( - getRemoteHead(name("project-a"), "refs/heads/dev").getShortMessage()) + assertThat(getRemoteHead(name("project-a"), "refs/heads/dev").getShortMessage()) .contains("some message in a dev.txt"); - assertThat( - getRemoteHead(name("project-b"), "refs/heads/master").getShortMessage()) + assertThat(getRemoteHead(name("project-b"), "refs/heads/master").getShortMessage()) .contains("some message in b master.txt"); - assertThat( - getRemoteHead(name("project-b"), "refs/heads/dev").getShortMessage()) + assertThat(getRemoteHead(name("project-b"), "refs/heads/dev").getShortMessage()) .contains("some message in b dev.txt"); } @@ -646,25 +711,34 @@ public class SubmoduleSubscriptionsWholeTopicMergeIT // bootstrap the dev branch ObjectId b0 = pushChangeTo(repoB, "dev"); - allowMatchingSubmoduleSubscription("project-b", - "refs/heads/master", "project-a", "refs/heads/master"); - allowMatchingSubmoduleSubscription("project-b", "refs/heads/dev", - "project-a", "refs/heads/dev"); + allowMatchingSubmoduleSubscription( + "project-b", "refs/heads/master", "project-a", "refs/heads/master"); + allowMatchingSubmoduleSubscription( + "project-b", "refs/heads/dev", "project-a", "refs/heads/dev"); createSubmoduleSubscription(repoA, "master", "project-b", "master"); createSubmoduleSubscription(repoA, "dev", "project-b", "dev"); - // create a change for master branch in repo b ObjectId bHead = - pushChangeTo(repoB, "refs/for/master", "master.txt", "content master B", - "some message in b master.txt", "same-topic"); + pushChangeTo( + repoB, + "refs/for/master", + "master.txt", + "content master B", + "some message in b master.txt", + "same-topic"); // create a change for dev branch in repo b repoB.reset(b0); ObjectId bDevHead = - pushChangeTo(repoB, "refs/for/dev", "dev.txt", "content dev B", - "some message in b dev.txt", "same-topic"); + pushChangeTo( + repoB, + "refs/for/dev", + "dev.txt", + "content dev B", + "some message in b dev.txt", + "same-topic"); approve(getChangeId(repoB, bHead).get()); approve(getChangeId(repoB, bDevHead).get()); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/RebuildNoteDbIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/RebuildNoteDbIT.java index 66e0c73b80..e00058de3f 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/RebuildNoteDbIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/RebuildNoteDbIT.java @@ -21,13 +21,11 @@ import com.google.common.io.Files; import com.google.gerrit.launcher.GerritLauncher; import com.google.gerrit.server.notedb.ConfigNotesMigration; import com.google.gerrit.testutil.TempFileUtil; - +import java.io.File; import org.junit.After; import org.junit.Before; import org.junit.Test; -import java.io.File; - public class RebuildNoteDbIT { private File sitePath; @@ -46,16 +44,22 @@ public class RebuildNoteDbIT { @Test public void rebuildEmptySite() throws Exception { initSite(); - Files.append(ConfigNotesMigration.allEnabledConfig().toText(), + Files.append( + ConfigNotesMigration.allEnabledConfig().toText(), new File(sitePath.toString(), "etc/gerrit.config"), UTF_8); - runGerrit("RebuildNoteDb", "-d", sitePath.toString(), - "--show-stack-trace"); + runGerrit("RebuildNoteDb", "-d", sitePath.toString(), "--show-stack-trace"); } private void initSite() throws Exception { - runGerrit("init", "-d", sitePath.getPath(), - "--batch", "--no-auto-start", "--skip-plugins", "--show-stack-trace"); + runGerrit( + "init", + "-d", + sitePath.getPath(), + "--batch", + "--no-auto-start", + "--skip-plugins", + "--show-stack-trace"); } private static void runGerrit(String... args) throws Exception { diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/ReindexIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/ReindexIT.java index 968456b9d0..79bbba2654 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/ReindexIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/ReindexIT.java @@ -18,13 +18,11 @@ import static com.google.common.truth.Truth.assertThat; import com.google.gerrit.launcher.GerritLauncher; import com.google.gerrit.testutil.TempFileUtil; - +import java.io.File; import org.junit.After; import org.junit.Before; import org.junit.Test; -import java.io.File; - public class ReindexIT { private File sitePath; @@ -43,13 +41,18 @@ public class ReindexIT { @Test public void reindexEmptySite() throws Exception { initSite(); - runGerrit("reindex", "-d", sitePath.toString(), - "--show-stack-trace"); + runGerrit("reindex", "-d", sitePath.toString(), "--show-stack-trace"); } private void initSite() throws Exception { - runGerrit("init", "-d", sitePath.getPath(), - "--batch", "--no-auto-start", "--skip-plugins", "--show-stack-trace"); + runGerrit( + "init", + "-d", + sitePath.getPath(), + "--batch", + "--no-auto-start", + "--skip-plugins", + "--show-stack-trace"); } private static void runGerrit(String... args) throws Exception { diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/AccountAssert.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/AccountAssert.java index 787902e807..2baaef8366 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/AccountAssert.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/AccountAssert.java @@ -20,7 +20,6 @@ import com.google.common.collect.Iterables; import com.google.gerrit.acceptance.TestAccount; import com.google.gerrit.extensions.common.AccountInfo; import com.google.gerrit.reviewdb.client.Account; - import java.util.List; public class AccountAssert { @@ -31,11 +30,9 @@ public class AccountAssert { assertThat(a.email).isEqualTo(ai.email); } - public static void assertAccountInfos(List expected, - List actual) { + public static void assertAccountInfos(List expected, List actual) { Iterable expectedIds = TestAccount.ids(expected); - Iterable actualIds = Iterables.transform( - actual, a -> new Account.Id(a._accountId)); + Iterable actualIds = Iterables.transform(actual, a -> new Account.Id(a._accountId)); assertThat(actualIds).containsExactlyElementsIn(expectedIds).inOrder(); for (int i = 0; i < expected.size(); i++) { AccountAssert.assertAccountInfo(expected.get(i), actual.get(i)); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/CapabilitiesIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/CapabilitiesIT.java index 329bf88cc0..ec0197a4a7 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/CapabilitiesIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/CapabilitiesIT.java @@ -32,24 +32,23 @@ import com.google.gerrit.acceptance.RestResponse; import com.google.gerrit.common.data.GlobalCapability; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; - import org.junit.Test; public class CapabilitiesIT extends AbstractDaemonTest { @Test public void capabilitiesUser() throws Exception { - Iterable all = Iterables.filter( - GlobalCapability.getAllNames(), - c -> !ADMINISTRATE_SERVER.equals(c) && !PRIORITY.equals(c)); + Iterable all = + Iterables.filter( + GlobalCapability.getAllNames(), + c -> !ADMINISTRATE_SERVER.equals(c) && !PRIORITY.equals(c)); allowGlobalCapabilities(REGISTERED_USERS, all); try { - RestResponse r = - userRestSession.get("/accounts/self/capabilities"); + RestResponse r = userRestSession.get("/accounts/self/capabilities"); r.assertOK(); - CapabilityInfo info = (new Gson()).fromJson(r.getReader(), - new TypeToken() {}.getType()); + CapabilityInfo info = + (new Gson()).fromJson(r.getReader(), new TypeToken() {}.getType()); for (String c : GlobalCapability.getAllNames()) { if (ADMINISTRATE_SERVER.equals(c)) { assertThat(info.administrateServer).isFalse(); @@ -62,8 +61,10 @@ public class CapabilitiesIT extends AbstractDaemonTest { assertThat(info.queryLimit.min).isEqualTo((short) 0); assertThat(info.queryLimit.max).isEqualTo((short) DEFAULT_MAX_QUERY_LIMIT); } else { - assert_().withFailureMessage(String.format("capability %s was not granted", c)) - .that((Boolean) CapabilityInfo.class.getField(c).get(info)).isTrue(); + assert_() + .withFailureMessage(String.format("capability %s was not granted", c)) + .that((Boolean) CapabilityInfo.class.getField(c).get(info)) + .isTrue(); } } } finally { @@ -73,11 +74,10 @@ public class CapabilitiesIT extends AbstractDaemonTest { @Test public void capabilitiesAdmin() throws Exception { - RestResponse r = - adminRestSession.get("/accounts/self/capabilities"); + RestResponse r = adminRestSession.get("/accounts/self/capabilities"); r.assertOK(); - CapabilityInfo info = (new Gson()).fromJson(r.getReader(), - new TypeToken() {}.getType()); + CapabilityInfo info = + (new Gson()).fromJson(r.getReader(), new TypeToken() {}.getType()); for (String c : GlobalCapability.getAllNames()) { if (BATCH_CHANGES_LIMIT.equals(c)) { // It does not have default value for any user as it can override the @@ -86,8 +86,7 @@ public class CapabilitiesIT extends AbstractDaemonTest { } else if (PRIORITY.equals(c)) { assertThat(info.priority).isFalse(); } else if (QUERY_LIMIT.equals(c)) { - assert_().withFailureMessage("missing queryLimit") - .that(info.queryLimit).isNotNull(); + assert_().withFailureMessage("missing queryLimit").that(info.queryLimit).isNotNull(); assertThat(info.queryLimit.min).isEqualTo((short) 0); assertThat(info.queryLimit.max).isEqualTo((short) DEFAULT_MAX_QUERY_LIMIT); } else if (ACCESS_DATABASE.equals(c)) { @@ -95,8 +94,10 @@ public class CapabilitiesIT extends AbstractDaemonTest { } else if (RUN_AS.equals(c)) { assertThat(info.runAs).isFalse(); } else { - assert_().withFailureMessage(String.format("capability %s was not granted", c)) - .that((Boolean) CapabilityInfo.class.getField(c).get(info)).isTrue(); + assert_() + .withFailureMessage(String.format("capability %s was not granted", c)) + .that((Boolean) CapabilityInfo.class.getField(c).get(info)) + .isTrue(); } } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/ExternalIdIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/ExternalIdIT.java index c94fe1f2b0..4272bae30b 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/ExternalIdIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/ExternalIdIT.java @@ -22,20 +22,17 @@ import com.google.gerrit.acceptance.Sandboxed; import com.google.gerrit.extensions.common.AccountExternalIdInfo; import com.google.gerrit.reviewdb.client.AccountExternalId; import com.google.gson.reflect.TypeToken; - -import org.junit.Test; - import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; +import org.junit.Test; @Sandboxed public class ExternalIdIT extends AbstractDaemonTest { @Test public void getExternalIDs() throws Exception { - Collection expectedIds = - accountCache.get(user.getId()).getExternalIds(); + Collection expectedIds = accountCache.get(user.getId()).getExternalIds(); List expectedIdInfos = new ArrayList<>(); for (AccountExternalId id : expectedIds) { @@ -48,8 +45,9 @@ public class ExternalIdIT extends AbstractDaemonTest { response.assertOK(); List results = - newGson().fromJson(response.getReader(), - new TypeToken>() {}.getType()); + newGson() + .fromJson( + response.getReader(), new TypeToken>() {}.getType()); Collections.sort(expectedIdInfos); Collections.sort(results); @@ -59,8 +57,7 @@ public class ExternalIdIT extends AbstractDaemonTest { @Test public void deleteExternalIDs() throws Exception { setApiUser(user); - List externalIds = - gApi.accounts().self().getExternalIds(); + List externalIds = gApi.accounts().self().getExternalIds(); List toDelete = new ArrayList<>(); List expectedIds = new ArrayList<>(); @@ -74,11 +71,9 @@ public class ExternalIdIT extends AbstractDaemonTest { assertThat(toDelete).hasSize(1); - RestResponse response = userRestSession.post( - "/accounts/self/external.ids:delete", toDelete); + RestResponse response = userRestSession.post("/accounts/self/external.ids:delete", toDelete); response.assertNoContent(); - List results = - gApi.accounts().self().getExternalIds(); + List results = gApi.accounts().self().getExternalIds(); // The external ID in WebSession will not be set for tests, resulting that // "mailto:user@example.com" can be deleted while "username:user" can't. assertThat(results).hasSize(1); @@ -90,11 +85,10 @@ public class ExternalIdIT extends AbstractDaemonTest { List toDelete = new ArrayList<>(); String externalIdStr = "username:" + user.username; toDelete.add(externalIdStr); - RestResponse response = userRestSession.post( - "/accounts/self/external.ids:delete", toDelete); + RestResponse response = userRestSession.post("/accounts/self/external.ids:delete", toDelete); response.assertConflict(); - assertThat(response.getEntityContent()).isEqualTo( - String.format("External id %s cannot be deleted", externalIdStr)); + assertThat(response.getEntityContent()) + .isEqualTo(String.format("External id %s cannot be deleted", externalIdStr)); } @Test @@ -102,11 +96,10 @@ public class ExternalIdIT extends AbstractDaemonTest { List toDelete = new ArrayList<>(); String externalIdStr = "mailto:user@domain.com"; toDelete.add(externalIdStr); - RestResponse response = userRestSession.post( - "/accounts/self/external.ids:delete", toDelete); + RestResponse response = userRestSession.post("/accounts/self/external.ids:delete", toDelete); response.assertUnprocessableEntity(); - assertThat(response.getEntityContent()).isEqualTo( - String.format("External id %s does not exist", externalIdStr)); + assertThat(response.getEntityContent()) + .isEqualTo(String.format("External id %s does not exist", externalIdStr)); } private static AccountExternalIdInfo toInfo(AccountExternalId id) { diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/GetAccountDetailIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/GetAccountDetailIT.java index f48f9fada4..dcd40b935d 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/GetAccountDetailIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/GetAccountDetailIT.java @@ -21,7 +21,6 @@ import com.google.gerrit.acceptance.AbstractDaemonTest; import com.google.gerrit.acceptance.RestResponse; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.server.account.GetDetail.AccountDetailInfo; - import org.junit.Test; public class GetAccountDetailIT extends AbstractDaemonTest { diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/GetAccountIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/GetAccountIT.java index 2944a57382..ed7abd2b6a 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/GetAccountIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/GetAccountIT.java @@ -20,7 +20,6 @@ import com.google.gerrit.acceptance.AbstractDaemonTest; import com.google.gerrit.acceptance.NoHttpd; import com.google.gerrit.acceptance.TestAccount; import com.google.gerrit.extensions.restapi.ResourceNotFoundException; - import org.junit.Test; @NoHttpd @@ -51,8 +50,7 @@ public class GetAccountIT extends AbstractDaemonTest { testGetAccount("self", admin); } - private void testGetAccount(String id, TestAccount expectedAccount) - throws Exception { + private void testGetAccount(String id, TestAccount expectedAccount) throws Exception { assertAccountInfo(expectedAccount, gApi.accounts().id(id).get()); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/ImpersonationIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/ImpersonationIT.java index 5772ec9ac7..c69391c3ec 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/ImpersonationIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/ImpersonationIT.java @@ -62,7 +62,6 @@ import com.google.gerrit.server.git.ProjectConfig; import com.google.gerrit.server.project.Util; import com.google.gerrit.server.query.change.ChangeData; import com.google.inject.Inject; - import org.apache.http.Header; import org.apache.http.message.BasicHeader; import org.junit.After; @@ -70,17 +69,13 @@ import org.junit.Before; import org.junit.Test; public class ImpersonationIT extends AbstractDaemonTest { - @Inject - private AccountControl.Factory accountControlFactory; + @Inject private AccountControl.Factory accountControlFactory; - @Inject - private ApprovalsUtil approvalsUtil; + @Inject private ApprovalsUtil approvalsUtil; - @Inject - private ChangeMessagesUtil cmUtil; + @Inject private ChangeMessagesUtil cmUtil; - @Inject - private CommentsUtil commentsUtil; + @Inject private CommentsUtil commentsUtil; private RestSession anonRestSession; private TestAccount admin2; @@ -105,17 +100,14 @@ public class ImpersonationIT extends AbstractDaemonTest { public void voteOnBehalfOf() throws Exception { allowCodeReviewOnBehalfOf(); PushOneCommit.Result r = createChange(); - RevisionApi revision = gApi.changes() - .id(r.getChangeId()) - .current(); + RevisionApi revision = gApi.changes().id(r.getChangeId()).current(); ReviewInput in = ReviewInput.recommend(); in.onBehalfOf = user.id.toString(); in.message = "Message on behalf of"; revision.review(in); - PatchSetApproval psa = Iterables.getOnlyElement( - r.getChange().approvals().values()); + PatchSetApproval psa = Iterables.getOnlyElement(r.getChange().approvals().values()); assertThat(psa.getPatchSetId().get()).isEqualTo(1); assertThat(psa.getLabel()).isEqualTo("Code-Review"); assertThat(psa.getAccountId()).isEqualTo(user.id); @@ -133,17 +125,14 @@ public class ImpersonationIT extends AbstractDaemonTest { public void voteOnBehalfOfRequiresLabel() throws Exception { allowCodeReviewOnBehalfOf(); PushOneCommit.Result r = createChange(); - RevisionApi revision = gApi.changes() - .id(r.getChangeId()) - .current(); + RevisionApi revision = gApi.changes().id(r.getChangeId()).current(); ReviewInput in = new ReviewInput(); in.onBehalfOf = user.id.toString(); in.message = "Message on behalf of"; exception.expect(AuthException.class); - exception.expectMessage( - "label required to post review on behalf of \"" + in.onBehalfOf + '"'); + exception.expectMessage("label required to post review on behalf of \"" + in.onBehalfOf + '"'); revision.review(in); } @@ -151,9 +140,7 @@ public class ImpersonationIT extends AbstractDaemonTest { public void voteOnBehalfOfInvalidLabel() throws Exception { allowCodeReviewOnBehalfOf(); PushOneCommit.Result r = createChange(); - RevisionApi revision = gApi.changes() - .id(r.getChangeId()) - .current(); + RevisionApi revision = gApi.changes().id(r.getChangeId()).current(); ReviewInput in = new ReviewInput(); in.onBehalfOf = user.id.toString(); @@ -161,19 +148,15 @@ public class ImpersonationIT extends AbstractDaemonTest { in.label("Not-A-Label", 5); exception.expect(BadRequestException.class); - exception.expectMessage( - "label \"Not-A-Label\" is not a configured label"); + exception.expectMessage("label \"Not-A-Label\" is not a configured label"); revision.review(in); } @Test - public void voteOnBehalfOfInvalidLabelIgnoredWithoutStrictLabels() - throws Exception { + public void voteOnBehalfOfInvalidLabelIgnoredWithoutStrictLabels() throws Exception { allowCodeReviewOnBehalfOf(); PushOneCommit.Result r = createChange(); - RevisionApi revision = gApi.changes() - .id(r.getChangeId()) - .current(); + RevisionApi revision = gApi.changes().id(r.getChangeId()).current(); ReviewInput in = new ReviewInput(); in.onBehalfOf = user.id.toString(); @@ -183,8 +166,7 @@ public class ImpersonationIT extends AbstractDaemonTest { revision.review(in); - assertThat(gApi.changes().id(r.getChangeId()).get().labels) - .doesNotContainKey("Not-A-Label"); + assertThat(gApi.changes().id(r.getChangeId()).get().labels).doesNotContainKey("Not-A-Label"); } @Test @@ -195,9 +177,7 @@ public class ImpersonationIT extends AbstractDaemonTest { saveProjectConfig(project, cfg); PushOneCommit.Result r = createChange(); - RevisionApi revision = gApi.changes() - .id(r.getChangeId()) - .current(); + RevisionApi revision = gApi.changes().id(r.getChangeId()).current(); ReviewInput in = new ReviewInput(); in.onBehalfOf = user.id.toString(); @@ -205,8 +185,7 @@ public class ImpersonationIT extends AbstractDaemonTest { exception.expect(AuthException.class); exception.expectMessage( - "not permitted to modify label \"Verified\" on behalf of \"" - + in.onBehalfOf + '"'); + "not permitted to modify label \"Verified\" on behalf of \"" + in.onBehalfOf + '"'); revision.review(in); } @@ -237,8 +216,7 @@ public class ImpersonationIT extends AbstractDaemonTest { in.comments = ImmutableMap.of(ci.path, ImmutableList.of(ci)); gApi.changes().id(r.getChangeId()).current().review(in); - PatchSetApproval psa = Iterables.getOnlyElement( - r.getChange().approvals().values()); + PatchSetApproval psa = Iterables.getOnlyElement(r.getChange().approvals().values()); assertThat(psa.getPatchSetId().get()).isEqualTo(1); assertThat(psa.getLabel()).isEqualTo("Code-Review"); assertThat(psa.getAccountId()).isEqualTo(user.id); @@ -246,8 +224,7 @@ public class ImpersonationIT extends AbstractDaemonTest { assertThat(psa.getRealAccountId()).isEqualTo(admin.id); ChangeData cd = r.getChange(); - Comment c = Iterables.getOnlyElement( - commentsUtil.publishedByChange(db, cd.notes())); + Comment c = Iterables.getOnlyElement(commentsUtil.publishedByChange(db, cd.notes())); assertThat(c.message).isEqualTo(ci.message); assertThat(c.author.getId()).isEqualTo(user.id); assertThat(c.getRealAuthor().getId()).isEqualTo(admin.id); @@ -274,8 +251,7 @@ public class ImpersonationIT extends AbstractDaemonTest { gApi.changes().id(r.getChangeId()).current().review(in); ChangeData cd = r.getChange(); - RobotComment c = Iterables.getOnlyElement( - commentsUtil.robotCommentsByChange(cd.notes())); + RobotComment c = Iterables.getOnlyElement(commentsUtil.robotCommentsByChange(cd.notes())); assertThat(c.message).isEqualTo(ci.message); assertThat(c.robotId).isEqualTo(ci.robotId); assertThat(c.robotRunId).isEqualTo(ci.robotRunId); @@ -311,9 +287,7 @@ public class ImpersonationIT extends AbstractDaemonTest { public void voteOnBehalfOfMissingUser() throws Exception { allowCodeReviewOnBehalfOf(); PushOneCommit.Result r = createChange(); - RevisionApi revision = gApi.changes() - .id(r.getChangeId()) - .current(); + RevisionApi revision = gApi.changes().id(r.getChangeId()).current(); ReviewInput in = new ReviewInput(); in.onBehalfOf = "doesnotexist"; @@ -325,23 +299,19 @@ public class ImpersonationIT extends AbstractDaemonTest { } @Test - public void voteOnBehalfOfFailsWhenUserCannotSeeDestinationRef() - throws Exception { + public void voteOnBehalfOfFailsWhenUserCannotSeeDestinationRef() throws Exception { blockRead(newGroup); allowCodeReviewOnBehalfOf(); PushOneCommit.Result r = createChange(); - RevisionApi revision = gApi.changes() - .id(r.getChangeId()) - .current(); + RevisionApi revision = gApi.changes().id(r.getChangeId()).current(); ReviewInput in = new ReviewInput(); in.onBehalfOf = user.id.toString(); in.label("Code-Review", 1); exception.expect(UnprocessableEntityException.class); - exception.expectMessage( - "on_behalf_of account " + user.id + " cannot see destination ref"); + exception.expectMessage("on_behalf_of account " + user.id + " cannot see destination ref"); revision.review(in); } @@ -353,9 +323,7 @@ public class ImpersonationIT extends AbstractDaemonTest { assertThat(accountControlFactory.get().canSee(user.id)).isFalse(); PushOneCommit.Result r = createChange(); - RevisionApi revision = gApi.changes() - .id(r.getChangeId()) - .current(); + RevisionApi revision = gApi.changes().id(r.getChangeId()).current(); ReviewInput in = new ReviewInput(); in.onBehalfOf = user.id.toString(); @@ -371,21 +339,15 @@ public class ImpersonationIT extends AbstractDaemonTest { allowSubmitOnBehalfOf(); PushOneCommit.Result r = createChange(); String changeId = project.get() + "~master~" + r.getChangeId(); - gApi.changes() - .id(changeId) - .current() - .review(ReviewInput.approve()); + gApi.changes().id(changeId).current().review(ReviewInput.approve()); SubmitInput in = new SubmitInput(); in.onBehalfOf = admin2.email; - gApi.changes() - .id(changeId) - .current() - .submit(in); + gApi.changes().id(changeId).current().submit(in); ChangeData cd = r.getChange(); assertThat(cd.change().getStatus()).isEqualTo(Change.Status.MERGED); - PatchSetApproval submitter = approvalsUtil.getSubmitter( - db, cd.notes(), cd.change().currentPatchSetId()); + PatchSetApproval submitter = + approvalsUtil.getSubmitter(db, cd.notes(), cd.change().currentPatchSetId()); assertThat(submitter.getAccountId()).isEqualTo(admin2.id); assertThat(submitter.getRealAccountId()).isEqualTo(admin.id); } @@ -395,18 +357,12 @@ public class ImpersonationIT extends AbstractDaemonTest { allowSubmitOnBehalfOf(); PushOneCommit.Result r = createChange(); String changeId = project.get() + "~master~" + r.getChangeId(); - gApi.changes() - .id(changeId) - .current() - .review(ReviewInput.approve()); + gApi.changes().id(changeId).current().review(ReviewInput.approve()); SubmitInput in = new SubmitInput(); in.onBehalfOf = "doesnotexist"; exception.expect(UnprocessableEntityException.class); exception.expectMessage("Account Not Found: doesnotexist"); - gApi.changes() - .id(changeId) - .current() - .submit(in); + gApi.changes().id(changeId).current().submit(in); } @Test @@ -420,33 +376,22 @@ public class ImpersonationIT extends AbstractDaemonTest { in.onBehalfOf = admin2.email; exception.expect(AuthException.class); exception.expectMessage("submit on behalf of not permitted"); - gApi.changes() - .id(project.get() + "~master~" + r.getChangeId()) - .current() - .submit(in); + gApi.changes().id(project.get() + "~master~" + r.getChangeId()).current().submit(in); } @Test - public void submitOnBehalfOfFailsWhenUserCannotSeeDestinationRef() - throws Exception { + public void submitOnBehalfOfFailsWhenUserCannotSeeDestinationRef() throws Exception { blockRead(newGroup); allowSubmitOnBehalfOf(); PushOneCommit.Result r = createChange(); String changeId = project.get() + "~master~" + r.getChangeId(); - gApi.changes() - .id(changeId) - .current() - .review(ReviewInput.approve()); + gApi.changes().id(changeId).current().review(ReviewInput.approve()); SubmitInput in = new SubmitInput(); in.onBehalfOf = user.email; exception.expect(UnprocessableEntityException.class); - exception.expectMessage( - "on_behalf_of account " + user.id + " cannot see destination ref"); - gApi.changes() - .id(changeId) - .current() - .submit(in); + exception.expectMessage("on_behalf_of account " + user.id + " cannot see destination ref"); + gApi.changes().id(changeId).current().submit(in); } @GerritConfig(name = "accounts.visibility", value = "SAME_GROUP") @@ -458,28 +403,20 @@ public class ImpersonationIT extends AbstractDaemonTest { PushOneCommit.Result r = createChange(); String changeId = project.get() + "~master~" + r.getChangeId(); - gApi.changes() - .id(changeId) - .current() - .review(ReviewInput.approve()); + gApi.changes().id(changeId).current().review(ReviewInput.approve()); SubmitInput in = new SubmitInput(); in.onBehalfOf = user.email; exception.expect(UnprocessableEntityException.class); exception.expectMessage("Account Not Found: " + in.onBehalfOf); - gApi.changes() - .id(changeId) - .current() - .submit(in); + gApi.changes().id(changeId).current().submit(in); } @Test public void runAsValidUser() throws Exception { allowRunAs(); - RestResponse res = - adminRestSession.getWithHeader("/accounts/self", runAsHeader(user.id)); + RestResponse res = adminRestSession.getWithHeader("/accounts/self", runAsHeader(user.id)); res.assertOK(); - AccountInfo account = - newGson().fromJson(res.getEntityContent(), AccountInfo.class); + AccountInfo account = newGson().fromJson(res.getEntityContent(), AccountInfo.class); assertThat(account._accountId).isEqualTo(user.id.get()); } @@ -487,8 +424,7 @@ public class ImpersonationIT extends AbstractDaemonTest { @Test public void runAsDisabledByConfig() throws Exception { allowRunAs(); - RestResponse res = - adminRestSession.getWithHeader("/changes/", runAsHeader(user.id)); + RestResponse res = adminRestSession.getWithHeader("/changes/", runAsHeader(user.id)); res.assertForbidden(); assertThat(res.getEntityContent()) .isEqualTo("X-Gerrit-RunAs disabled by auth.enableRunAs = false"); @@ -496,31 +432,25 @@ public class ImpersonationIT extends AbstractDaemonTest { @Test public void runAsNotPermitted() throws Exception { - RestResponse res = - adminRestSession.getWithHeader("/changes/", runAsHeader(user.id)); + RestResponse res = adminRestSession.getWithHeader("/changes/", runAsHeader(user.id)); res.assertForbidden(); - assertThat(res.getEntityContent()) - .isEqualTo("not permitted to use X-Gerrit-RunAs"); + assertThat(res.getEntityContent()).isEqualTo("not permitted to use X-Gerrit-RunAs"); } @Test public void runAsNeverPermittedForAnonymousUsers() throws Exception { allowRunAs(); - RestResponse res = - anonRestSession.getWithHeader("/changes/", runAsHeader(user.id)); + RestResponse res = anonRestSession.getWithHeader("/changes/", runAsHeader(user.id)); res.assertForbidden(); - assertThat(res.getEntityContent()) - .isEqualTo("not permitted to use X-Gerrit-RunAs"); + assertThat(res.getEntityContent()).isEqualTo("not permitted to use X-Gerrit-RunAs"); } @Test public void runAsInvalidUser() throws Exception { allowRunAs(); - RestResponse res = adminRestSession.getWithHeader( - "/changes/", runAsHeader("doesnotexist")); + RestResponse res = adminRestSession.getWithHeader("/changes/", runAsHeader("doesnotexist")); res.assertForbidden(); - assertThat(res.getEntityContent()) - .isEqualTo("no account matches X-Gerrit-RunAs"); + assertThat(res.getEntityContent()).isEqualTo("no account matches X-Gerrit-RunAs"); } @Test @@ -543,18 +473,17 @@ public class ImpersonationIT extends AbstractDaemonTest { ReviewInput in = new ReviewInput(); in.message = "message"; in.drafts = DraftHandling.PUBLISH; - RestResponse res = adminRestSession.postWithHeader( - "/changes/" + r.getChangeId() + "/revisions/current/review", in, - runAsHeader(user.id)); + RestResponse res = + adminRestSession.postWithHeader( + "/changes/" + r.getChangeId() + "/revisions/current/review", in, runAsHeader(user.id)); res.assertOK(); - ChangeMessageInfo m = Iterables.getLast( - gApi.changes().id(r.getChangeId()).get().messages); + ChangeMessageInfo m = Iterables.getLast(gApi.changes().id(r.getChangeId()).get().messages); assertThat(m.message).endsWith(in.message); assertThat(m.author._accountId).isEqualTo(user.id.get()); - CommentInfo c = Iterables.getOnlyElement( - gApi.changes().id(r.getChangeId()).comments().get(di.path)); + CommentInfo c = + Iterables.getOnlyElement(gApi.changes().id(r.getChangeId()).comments().get(di.path)); assertThat(c.author._accountId).isEqualTo(user.id.get()); assertThat(c.message).isEqualTo(di.message); @@ -577,20 +506,16 @@ public class ImpersonationIT extends AbstractDaemonTest { in.onBehalfOf = user.id.toString(); in.message = "Message on behalf of"; - String endpoint = - "/changes/" + r.getChangeId() + "/revisions/current/review"; - RestResponse res = - adminRestSession.postWithHeader(endpoint, in, runAsHeader(user2.id)); + String endpoint = "/changes/" + r.getChangeId() + "/revisions/current/review"; + RestResponse res = adminRestSession.postWithHeader(endpoint, in, runAsHeader(user2.id)); res.assertForbidden(); - assertThat(res.getEntityContent()).isEqualTo( - "label required to post review on behalf of \"" + in.onBehalfOf + '"'); + assertThat(res.getEntityContent()) + .isEqualTo("label required to post review on behalf of \"" + in.onBehalfOf + '"'); in.label("Code-Review", 1); - adminRestSession.postWithHeader(endpoint, in, runAsHeader(user2.id)) - .assertOK(); + adminRestSession.postWithHeader(endpoint, in, runAsHeader(user2.id)).assertOK(); - PatchSetApproval psa = Iterables.getOnlyElement( - r.getChange().approvals().values()); + PatchSetApproval psa = Iterables.getOnlyElement(r.getChange().approvals().values()); assertThat(psa.getPatchSetId().get()).isEqualTo(1); assertThat(psa.getLabel()).isEqualTo("Code-Review"); assertThat(psa.getAccountId()).isEqualTo(user.id); @@ -609,8 +534,7 @@ public class ImpersonationIT extends AbstractDaemonTest { LabelType codeReviewType = Util.codeReview(); String forCodeReviewAs = Permission.forLabelAs(codeReviewType.getName()); String heads = "refs/heads/*"; - AccountGroup.UUID uuid = - systemGroupBackend.getGroup(REGISTERED_USERS).getUUID(); + AccountGroup.UUID uuid = systemGroupBackend.getGroup(REGISTERED_USERS).getUUID(); Util.allow(cfg, forCodeReviewAs, -1, 1, uuid, heads); saveProjectConfig(project, cfg); } @@ -618,34 +542,31 @@ public class ImpersonationIT extends AbstractDaemonTest { private void allowSubmitOnBehalfOf() throws Exception { ProjectConfig cfg = projectCache.checkedGet(project).getConfig(); String heads = "refs/heads/*"; - AccountGroup.UUID uuid = - systemGroupBackend.getGroup(REGISTERED_USERS).getUUID(); + AccountGroup.UUID uuid = systemGroupBackend.getGroup(REGISTERED_USERS).getUUID(); Util.allow(cfg, Permission.SUBMIT_AS, uuid, heads); Util.allow(cfg, Permission.SUBMIT, uuid, heads); LabelType codeReviewType = Util.codeReview(); - Util.allow(cfg, Permission.forLabel(codeReviewType.getName()), - -2, 2, uuid, heads); + Util.allow(cfg, Permission.forLabel(codeReviewType.getName()), -2, 2, uuid, heads); saveProjectConfig(project, cfg); } private void blockRead(GroupInfo group) throws Exception { ProjectConfig cfg = projectCache.checkedGet(project).getConfig(); - Util.block( - cfg, Permission.READ, new AccountGroup.UUID(group.id), "refs/heads/master"); + Util.block(cfg, Permission.READ, new AccountGroup.UUID(group.id), "refs/heads/master"); saveProjectConfig(project, cfg); } private void allowRunAs() throws Exception { ProjectConfig cfg = projectCache.checkedGet(allProjects).getConfig(); - Util.allow(cfg, GlobalCapability.RUN_AS, - systemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID()); + Util.allow( + cfg, GlobalCapability.RUN_AS, systemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID()); saveProjectConfig(allProjects, cfg); } private void removeRunAs() throws Exception { ProjectConfig cfg = projectCache.checkedGet(allProjects).getConfig(); - Util.remove(cfg, GlobalCapability.RUN_AS, - systemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID()); + Util.remove( + cfg, GlobalCapability.RUN_AS, systemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID()); saveProjectConfig(allProjects, cfg); } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/PutUsernameIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/PutUsernameIT.java index 3297c60e82..9378591da8 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/PutUsernameIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/PutUsernameIT.java @@ -24,49 +24,38 @@ import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.server.account.PutUsername; import com.google.gwtorm.server.SchemaFactory; import com.google.inject.Inject; - +import java.util.Collections; import org.junit.Test; -import java.util.Collections; - public class PutUsernameIT extends AbstractDaemonTest { - @Inject - private SchemaFactory reviewDbProvider; + @Inject private SchemaFactory reviewDbProvider; @Test public void set() throws Exception { PutUsername.Input in = new PutUsername.Input(); in.username = "myUsername"; - RestResponse r = - adminRestSession.put("/accounts/" + createUser().get() + "/username", in); + RestResponse r = adminRestSession.put("/accounts/" + createUser().get() + "/username", in); r.assertOK(); - assertThat(newGson().fromJson(r.getReader(), String.class)).isEqualTo( - in.username); + assertThat(newGson().fromJson(r.getReader(), String.class)).isEqualTo(in.username); } @Test public void setExisting_Conflict() throws Exception { PutUsername.Input in = new PutUsername.Input(); in.username = admin.username; - adminRestSession - .put("/accounts/" + createUser().get() + "/username", in) - .assertConflict(); + adminRestSession.put("/accounts/" + createUser().get() + "/username", in).assertConflict(); } @Test public void setNew_MethodNotAllowed() throws Exception { PutUsername.Input in = new PutUsername.Input(); in.username = "newUsername"; - adminRestSession - .put("/accounts/" + admin.username + "/username", in) - .assertMethodNotAllowed(); + adminRestSession.put("/accounts/" + admin.username + "/username", in).assertMethodNotAllowed(); } @Test public void delete_MethodNotAllowed() throws Exception { - adminRestSession - .put("/accounts/" + admin.username + "/username") - .assertMethodNotAllowed(); + adminRestSession.put("/accounts/" + admin.username + "/username").assertMethodNotAllowed(); } private Account.Id createUser() throws Exception { diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/WatchedProjectsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/WatchedProjectsIT.java index 36a95f1f17..9edafb8b6a 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/WatchedProjectsIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/WatchedProjectsIT.java @@ -21,11 +21,9 @@ import com.google.gerrit.acceptance.AbstractDaemonTest; import com.google.gerrit.extensions.client.ProjectWatchInfo; import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.restapi.UnprocessableEntityException; - -import org.junit.Test; - import java.util.ArrayList; import java.util.List; +import org.junit.Test; public class WatchedProjectsIT extends AbstractDaemonTest { @@ -54,8 +52,7 @@ public class WatchedProjectsIT extends AbstractDaemonTest { List persistedWatchedProjects = gApi.accounts().self().setWatchedProjects(projectsToWatch); - assertThat(persistedWatchedProjects) - .containsAllIn(projectsToWatch).inOrder(); + assertThat(persistedWatchedProjects).containsAllIn(projectsToWatch).inOrder(); } @Test @@ -86,8 +83,7 @@ public class WatchedProjectsIT extends AbstractDaemonTest { gApi.accounts().self().deleteWatchedProjects(d); projectsToWatch.remove(pwi); - List persistedWatchedProjects = - gApi.accounts().self().getWatchedProjects(); + List persistedWatchedProjects = gApi.accounts().self().getWatchedProjects(); assertThat(persistedWatchedProjects).doesNotContain(pwi); assertThat(persistedWatchedProjects).containsAllIn(projectsToWatch); @@ -128,8 +124,7 @@ public class WatchedProjectsIT extends AbstractDaemonTest { projectsToWatch.add(pwi); gApi.accounts().self().setWatchedProjects(projectsToWatch); - List persistedWatchedProjects = - gApi.accounts().self().getWatchedProjects(); + List persistedWatchedProjects = gApi.accounts().self().getWatchedProjects(); assertThat(persistedWatchedProjects).containsAllIn(projectsToWatch); } @@ -202,15 +197,13 @@ public class WatchedProjectsIT extends AbstractDaemonTest { // Perform update gApi.accounts().self().setWatchedProjects(projectsToWatch); - List watchedProjects = - gApi.accounts().self().getWatchedProjects(); + List watchedProjects = gApi.accounts().self().getWatchedProjects(); assertThat(watchedProjects).containsAllIn(projectsToWatch); } @Test - public void setAndDeleteWatchedProjectsWithDifferentFilter() - throws Exception { + public void setAndDeleteWatchedProjectsWithDifferentFilter() throws Exception { String projectName = project.get(); List projectsToWatch = new ArrayList<>(); @@ -237,8 +230,7 @@ public class WatchedProjectsIT extends AbstractDaemonTest { gApi.accounts().self().deleteWatchedProjects(d); projectsToWatch.remove(pwi); - List persistedWatchedProjects = - gApi.accounts().self().getWatchedProjects(); + List persistedWatchedProjects = gApi.accounts().self().getWatchedProjects(); assertThat(persistedWatchedProjects).doesNotContain(pwi); assertThat(persistedWatchedProjects).containsAllIn(projectsToWatch); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java index 2a39ffd18c..3736710ff6 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java @@ -75,7 +75,15 @@ import com.google.gerrit.testutil.ConfigSuite; import com.google.gerrit.testutil.TestTimeUtil; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; import org.eclipse.jgit.diff.DiffFormatter; import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository; import org.eclipse.jgit.junit.TestRepository; @@ -91,16 +99,6 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.stream.Collectors; - @NoHttpd public abstract class AbstractSubmit extends AbstractDaemonTest { @ConfigSuite.Config @@ -108,20 +106,15 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { return submitWholeTopicEnabledConfig(); } - @Inject - private ApprovalsUtil approvalsUtil; + @Inject private ApprovalsUtil approvalsUtil; - @Inject - private Submit submitHandler; + @Inject private Submit submitHandler; - @Inject - private IdentifiedUser.GenericFactory userFactory; + @Inject private IdentifiedUser.GenericFactory userFactory; - @Inject - private BatchUpdate.Factory updateFactory; + @Inject private BatchUpdate.Factory updateFactory; - @Inject - private DynamicSet onSubmitValidationListeners; + @Inject private DynamicSet onSubmitValidationListeners; private RegistrationHandle onSubmitValidatorHandle; private String systemTimeZone; @@ -144,8 +137,8 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { } @After - public void removeOnSubmitValidator(){ - if (onSubmitValidatorHandle != null){ + public void removeOnSubmitValidator() { + if (onSubmitValidatorHandle != null) { onSubmitValidatorHandle.remove(); } } @@ -160,8 +153,7 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { BinaryResult request = submitPreview(change.getChangeId()); RevCommit headAfterSubmitPreview = getRemoteHead(); assertThat(headAfterSubmitPreview).isEqualTo(initialHead); - Map actual = - fetchFromBundles(request); + Map actual = fetchFromBundles(request); assertThat(actual).hasSize(1); submit(change.getChangeId()); @@ -179,8 +171,7 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { assertRefUpdatedEvents(); assertChangeMergedEvents(); - Map actual = - fetchFromBundles(request); + Map actual = fetchFromBundles(request); if ((getSubmitType() == SubmitType.CHERRY_PICK) || (getSubmitType() == SubmitType.REBASE_ALWAYS)) { @@ -195,18 +186,15 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { } @Test - public void submitMultipleChangesOtherMergeConflictPreview() - throws Exception { + public void submitMultipleChangesOtherMergeConflictPreview() throws Exception { RevCommit initialHead = getRemoteHead(); - PushOneCommit.Result change = - createChange("Change 1", "a.txt", "content"); + PushOneCommit.Result change = createChange("Change 1", "a.txt", "content"); submit(change.getChangeId()); RevCommit headAfterFirstSubmit = getRemoteHead(); testRepo.reset(initialHead); - PushOneCommit.Result change2 = createChange("Change 2", - "a.txt", "other content"); + PushOneCommit.Result change2 = createChange("Change 2", "a.txt", "other content"); PushOneCommit.Result change3 = createChange("Change 3", "d", "d"); PushOneCommit.Result change4 = createChange("Change 4", "e", "e"); // change 2 is not approved, but we ignore labels @@ -220,62 +208,73 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { } if (getSubmitType() == SubmitType.CHERRY_PICK) { - Map s = - fetchFromBundles(request); + Map s = fetchFromBundles(request); submit(change4.getChangeId()); assertRevTrees(project, s); } else if (getSubmitType() == SubmitType.FAST_FORWARD_ONLY) { - assertThat(msg).isEqualTo( - "Failed to submit 3 changes due to the following problems:\n" + - "Change " + change2.getChange().getId() + ": internal error: " + - "change not processed by merge strategy\n" + - "Change " + change3.getChange().getId() + ": internal error: " + - "change not processed by merge strategy\n" + - "Change " + change4.getChange().getId() + ": Project policy " + - "requires all submissions to be a fast-forward. Please " + - "rebase the change locally and upload again for review."); + assertThat(msg) + .isEqualTo( + "Failed to submit 3 changes due to the following problems:\n" + + "Change " + + change2.getChange().getId() + + ": internal error: " + + "change not processed by merge strategy\n" + + "Change " + + change3.getChange().getId() + + ": internal error: " + + "change not processed by merge strategy\n" + + "Change " + + change4.getChange().getId() + + ": Project policy " + + "requires all submissions to be a fast-forward. Please " + + "rebase the change locally and upload again for review."); RevCommit headAfterSubmit = getRemoteHead(); assertThat(headAfterSubmit).isEqualTo(headAfterFirstSubmit); assertRefUpdatedEvents(initialHead, headAfterFirstSubmit); - assertChangeMergedEvents(change.getChangeId(), - headAfterFirstSubmit.name()); + assertChangeMergedEvents(change.getChangeId(), headAfterFirstSubmit.name()); } else if ((getSubmitType() == SubmitType.REBASE_IF_NECESSARY) || (getSubmitType() == SubmitType.REBASE_ALWAYS)) { - String change2hash = change2.getChange().currentPatchSet() - .getRevision().get(); - assertThat(msg).isEqualTo( - "Cannot rebase " + change2hash + ": The change could " + - "not be rebased due to a conflict during merge."); + String change2hash = change2.getChange().currentPatchSet().getRevision().get(); + assertThat(msg) + .isEqualTo( + "Cannot rebase " + + change2hash + + ": The change could " + + "not be rebased due to a conflict during merge."); RevCommit headAfterSubmit = getRemoteHead(); assertThat(headAfterSubmit).isEqualTo(headAfterFirstSubmit); assertRefUpdatedEvents(initialHead, headAfterFirstSubmit); - assertChangeMergedEvents(change.getChangeId(), - headAfterFirstSubmit.name()); + assertChangeMergedEvents(change.getChangeId(), headAfterFirstSubmit.name()); } else { - assertThat(msg).isEqualTo( - "Failed to submit 3 changes due to the following problems:\n" + - "Change " + change2.getChange().getId() + ": Change could not be " + - "merged due to a path conflict. Please rebase the change " + - "locally and upload the rebased commit for review.\n" + - "Change " + change3.getChange().getId() + ": Change could not be " + - "merged due to a path conflict. Please rebase the change " + - "locally and upload the rebased commit for review.\n" + - "Change " + change4.getChange().getId() + ": Change could not be " + - "merged due to a path conflict. Please rebase the change " + - "locally and upload the rebased commit for review."); + assertThat(msg) + .isEqualTo( + "Failed to submit 3 changes due to the following problems:\n" + + "Change " + + change2.getChange().getId() + + ": Change could not be " + + "merged due to a path conflict. Please rebase the change " + + "locally and upload the rebased commit for review.\n" + + "Change " + + change3.getChange().getId() + + ": Change could not be " + + "merged due to a path conflict. Please rebase the change " + + "locally and upload the rebased commit for review.\n" + + "Change " + + change4.getChange().getId() + + ": Change could not be " + + "merged due to a path conflict. Please rebase the change " + + "locally and upload the rebased commit for review."); RevCommit headAfterSubmit = getRemoteHead(); assertThat(headAfterSubmit).isEqualTo(headAfterFirstSubmit); assertRefUpdatedEvents(initialHead, headAfterFirstSubmit); - assertChangeMergedEvents(change.getChangeId(), - headAfterFirstSubmit.name()); + assertChangeMergedEvents(change.getChangeId(), headAfterFirstSubmit.name()); } } @Test public void submitMultipleChangesPreview() throws Exception { RevCommit initialHead = getRemoteHead(); - PushOneCommit.Result change2 = createChange("Change 2", - "a.txt", "other content"); + PushOneCommit.Result change2 = createChange("Change 2", "a.txt", "other content"); PushOneCommit.Result change3 = createChange("Change 3", "d", "d"); PushOneCommit.Result change4 = createChange("Change 4", "e", "e"); // change 2 is not approved, but we ignore labels @@ -285,12 +284,10 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { Map> expected = new HashMap<>(); expected.put(project.get(), new HashMap()); expected.get(project.get()).put("refs/heads/master", 3); - Map actual = - fetchFromBundles(request); + Map actual = fetchFromBundles(request); - assertThat(actual).containsKey( - new Branch.NameKey(project, "refs/heads/master")); - if (getSubmitType() == SubmitType.CHERRY_PICK){ + assertThat(actual).containsKey(new Branch.NameKey(project, "refs/heads/master")); + if (getSubmitType() == SubmitType.CHERRY_PICK) { // CherryPick ignores dependencies, thus only change and destination // branch refs are modified. assertThat(actual).hasSize(2); @@ -325,8 +322,7 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { PushOneCommit.Result result = push.to("refs/for/master"); result.assertOkStatus(); - submit(result.getChangeId(), new SubmitInput(), AuthException.class, - "submit not permitted"); + submit(result.getChangeId(), new SubmitInput(), AuthException.class, "submit not permitted"); } @Test @@ -336,8 +332,7 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { ProjectConfig cfg = projectCache.checkedGet(p).getConfig(); Util.block(cfg, Permission.SUBMIT, CHANGE_OWNER, "refs/*"); Util.allow(cfg, Permission.SUBMIT, REGISTERED_USERS, "refs/heads/*"); - Util.allow(cfg, Permission.forLabel("Code-Review"), -2, +2, - REGISTERED_USERS, "refs/*"); + Util.allow(cfg, Permission.forLabel("Code-Review"), -2, +2, REGISTERED_USERS, "refs/*"); saveProjectConfig(p, cfg); TestRepository repo = cloneProject(p, admin); @@ -348,8 +343,7 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { ChangeInfo change = gApi.changes().id(result.getChangeId()).get(); assertThat(change.owner._accountId).isEqualTo(admin.id.get()); - submit(result.getChangeId(), new SubmitInput(), AuthException.class, - "submit not permitted"); + submit(result.getChangeId(), new SubmitInput(), AuthException.class, "submit not permitted"); setApiUser(user); submit(result.getChangeId()); @@ -362,8 +356,7 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { ProjectConfig cfg = projectCache.checkedGet(p).getConfig(); Util.block(cfg, Permission.SUBMIT, REGISTERED_USERS, "refs/*"); Util.allow(cfg, Permission.SUBMIT, CHANGE_OWNER, "refs/*"); - Util.allow(cfg, Permission.forLabel("Code-Review"), -2, +2, - REGISTERED_USERS, "refs/*"); + Util.allow(cfg, Permission.forLabel("Code-Review"), -2, +2, REGISTERED_USERS, "refs/*"); saveProjectConfig(p, cfg); TestRepository repo = cloneProject(p, admin); @@ -375,8 +368,7 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { assertThat(change.owner._accountId).isEqualTo(admin.id.get()); setApiUser(user); - submit(result.getChangeId(), new SubmitInput(), AuthException.class, - "submit not permitted"); + submit(result.getChangeId(), new SubmitInput(), AuthException.class, "submit not permitted"); setApiUser(admin); submit(result.getChangeId()); @@ -388,10 +380,8 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { String topic = "test-topic"; // Create test projects - TestRepository repoA = createProjectWithPush( - "project-a", null, getSubmitType()); - TestRepository repoB = createProjectWithPush( - "project-b", null, getSubmitType()); + TestRepository repoA = createProjectWithPush("project-a", null, getSubmitType()); + TestRepository repoB = createProjectWithPush("project-b", null, getSubmitType()); // Create changes on project-a PushOneCommit.Result change1 = @@ -425,11 +415,9 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { // Create test project String projectName = "project-a"; - TestRepository repoA = createProjectWithPush( - projectName, null, getSubmitType()); + TestRepository repoA = createProjectWithPush(projectName, null, getSubmitType()); - RevCommit initialHead = - getRemoteHead(new Project.NameKey(name(projectName)), "master"); + RevCommit initialHead = getRemoteHead(new Project.NameKey(name(projectName)), "master"); // Create the dev branch on the test project BranchInput in = new BranchInput(); @@ -466,12 +454,9 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { public void submitWholeTopic() throws Exception { assume().that(isSubmitWholeTopicEnabled()).isTrue(); String topic = "test-topic"; - PushOneCommit.Result change1 = - createChange("Change 1", "a.txt", "content", topic); - PushOneCommit.Result change2 = - createChange("Change 2", "b.txt", "content", topic); - PushOneCommit.Result change3 = - createChange("Change 3", "c.txt", "content", topic); + PushOneCommit.Result change1 = createChange("Change 1", "a.txt", "content", topic); + PushOneCommit.Result change2 = createChange("Change 2", "b.txt", "content", topic); + PushOneCommit.Result change3 = createChange("Change 3", "c.txt", "content", topic); approve(change1.getChangeId()); approve(change2.getChangeId()); approve(change3.getChangeId()); @@ -489,19 +474,18 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { // Check that the repo has the expected commits List log = getRemoteLog(); - List commitsInRepo = log.stream() - .map(c -> c.getShortMessage()) - .collect(Collectors.toList()); - int expectedCommitCount = getSubmitType() == SubmitType.MERGE_ALWAYS - ? 5 // initial commit + 3 commits + merge commit - : 4; // initial commit + 3 commits + List commitsInRepo = + log.stream().map(c -> c.getShortMessage()).collect(Collectors.toList()); + int expectedCommitCount = + getSubmitType() == SubmitType.MERGE_ALWAYS + ? 5 // initial commit + 3 commits + merge commit + : 4; // initial commit + 3 commits assertThat(log).hasSize(expectedCommitCount); - assertThat(commitsInRepo).containsAllOf( - "Initial empty repository", "Change 1", "Change 2", "Change 3"); + assertThat(commitsInRepo) + .containsAllOf("Initial empty repository", "Change 1", "Change 2", "Change 3"); if (getSubmitType() == SubmitType.MERGE_ALWAYS) { - assertThat(commitsInRepo).contains( - "Merge changes from topic '" + expectedTopic + "'"); + assertThat(commitsInRepo).contains("Merge changes from topic '" + expectedTopic + "'"); } } @@ -509,9 +493,14 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { public void submitDraftChange() throws Exception { PushOneCommit.Result draft = createDraftChange(); Change.Id num = draft.getChange().getId(); - submitWithConflict(draft.getChangeId(), + submitWithConflict( + draft.getChangeId(), "Failed to submit 1 change due to the following problems:\n" - + "Change " + num + ": Change " + num + " is draft"); + + "Change " + + num + + ": Change " + + num + + " is draft"); } @Test @@ -520,26 +509,30 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { PushOneCommit.Result draft = amendChangeAsDraft(change.getChangeId()); Change.Id num = draft.getChange().getId(); - submitWithConflict(draft.getChangeId(), + submitWithConflict( + draft.getChangeId(), "Failed to submit 1 change due to the following problems:\n" - + "Change " + num + ": submit rule error: " - + "Cannot submit draft patch sets"); + + "Change " + + num + + ": submit rule error: " + + "Cannot submit draft patch sets"); } @Test public void submitWithHiddenBranchInSameTopic() throws Exception { assume().that(isSubmitWholeTopicEnabled()).isTrue(); - PushOneCommit.Result visible = - createChange("refs/for/master/" + name("topic")); + PushOneCommit.Result visible = createChange("refs/for/master/" + name("topic")); Change.Id num = visible.getChange().getId(); createBranch(new Branch.NameKey(project, "hidden")); - PushOneCommit.Result hidden = - createChange("refs/for/hidden/" + name("topic")); + PushOneCommit.Result hidden = createChange("refs/for/hidden/" + name("topic")); approve(hidden.getChangeId()); blockRead("refs/heads/hidden"); - submit(visible.getChangeId(), new SubmitInput(), AuthException.class, + submit( + visible.getChangeId(), + new SubmitInput(), + AuthException.class, "A change to be submitted with " + num + " is not visible"); } @@ -556,16 +549,17 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { // C0 -- Master // ProjectConfig config = projectCache.checkedGet(project).getConfig(); - config.getProject().setCreateNewChangeForAllNotInTarget( - InheritableBoolean.TRUE); + config.getProject().setCreateNewChangeForAllNotInTarget(InheritableBoolean.TRUE); saveProjectConfig(project, config); - PushOneCommit push1 = pushFactory.create(db, admin.getIdent(), testRepo, - PushOneCommit.SUBJECT, "a.txt", "content"); + PushOneCommit push1 = + pushFactory.create( + db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "a.txt", "content"); PushOneCommit.Result c1 = push1.to("refs/heads/topic"); c1.assertOkStatus(); - PushOneCommit push2 = pushFactory.create(db, admin.getIdent(), testRepo, - PushOneCommit.SUBJECT, "b.txt", "anotherContent"); + PushOneCommit push2 = + pushFactory.create( + db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "b.txt", "anotherContent"); PushOneCommit.Result c2 = push2.to("refs/heads/topic"); c2.assertOkStatus(); @@ -588,11 +582,12 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { // I -- master // RevCommit master = getRemoteHead(project, "master"); - PushOneCommit stableTip = pushFactory.create(db, admin.getIdent(), testRepo, - "Tip of branch stable", "stable.txt", ""); + PushOneCommit stableTip = + pushFactory.create( + db, admin.getIdent(), testRepo, "Tip of branch stable", "stable.txt", ""); PushOneCommit.Result stable = stableTip.to("refs/heads/stable"); - PushOneCommit mergeCommit = pushFactory.create(db, admin.getIdent(), - testRepo, "The merge commit", "merge.txt", ""); + PushOneCommit mergeCommit = + pushFactory.create(db, admin.getIdent(), testRepo, "The merge commit", "merge.txt", ""); mergeCommit.setParents(ImmutableList.of(master, stable.getCommit())); PushOneCommit.Result mergeReview = mergeCommit.to("refs/for/master"); approve(mergeReview.getChangeId()); @@ -671,20 +666,21 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { @Test public void submitWithValidation() throws Exception { AtomicBoolean called = new AtomicBoolean(false); - this.addOnSubmitValidationListener(new OnSubmitValidationListener() { - @Override - public void preBranchUpdate(Arguments args) throws ValidationException { - called.set(true); - HashSet refs = Sets.newHashSet(args.getCommands().keySet()); - assertThat(refs).contains("refs/heads/master"); - refs.remove("refs/heads/master"); - if (!refs.isEmpty()){ - // Some submit strategies need to insert new patchset. - assertThat(refs).hasSize(1); - assertThat(refs.iterator().next()).startsWith(RefNames.REFS_CHANGES); - } - } - }); + this.addOnSubmitValidationListener( + new OnSubmitValidationListener() { + @Override + public void preBranchUpdate(Arguments args) throws ValidationException { + called.set(true); + HashSet refs = Sets.newHashSet(args.getCommands().keySet()); + assertThat(refs).contains("refs/heads/master"); + refs.remove("refs/heads/master"); + if (!refs.isEmpty()) { + // Some submit strategies need to insert new patchset. + assertThat(refs).hasSize(1); + assertThat(refs.iterator().next()).startsWith(RefNames.REFS_CHANGES); + } + } + }); PushOneCommit.Result change = createChange(); approve(change.getChangeId()); @@ -698,10 +694,8 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { String topic = "test-topic"; // Create test projects - TestRepository repoA = - createProjectWithPush("project-a", null, getSubmitType()); - TestRepository repoB = - createProjectWithPush("project-b", null, getSubmitType()); + TestRepository repoA = createProjectWithPush("project-a", null, getSubmitType()); + TestRepository repoB = createProjectWithPush("project-b", null, getSubmitType()); // Create changes on project-a PushOneCommit.Result change1 = @@ -715,8 +709,7 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { PushOneCommit.Result change4 = createChange(repoB, "master", "Change 4", "b.txt", "content", topic); - List changes = - Lists.newArrayList(change1, change2, change3, change4); + List changes = Lists.newArrayList(change1, change2, change3, change4); for (PushOneCommit.Result change : changes) { approve(change.getChangeId()); } @@ -725,51 +718,51 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { // Since there are 2 repos, first submit attempt will fail, the second will // succeed. List projectsCalled = new ArrayList<>(4); - this.addOnSubmitValidationListener(new OnSubmitValidationListener() { - @Override - public void preBranchUpdate(Arguments args) throws ValidationException { - assertThat(args.getCommands().keySet()).contains("refs/heads/master"); - try (RevWalk rw = args.newRevWalk()) { - rw.parseBody(rw.parseCommit( - args.getCommands().get("refs/heads/master").getNewId())); - } catch (IOException e) { - assertThat(e).isNull(); - } - projectsCalled.add(args.getProject().get()); - if (projectsCalled.size() == 2) { - throw new ValidationException("time to fail"); - } - } - }); + this.addOnSubmitValidationListener( + new OnSubmitValidationListener() { + @Override + public void preBranchUpdate(Arguments args) throws ValidationException { + assertThat(args.getCommands().keySet()).contains("refs/heads/master"); + try (RevWalk rw = args.newRevWalk()) { + rw.parseBody(rw.parseCommit(args.getCommands().get("refs/heads/master").getNewId())); + } catch (IOException e) { + assertThat(e).isNull(); + } + projectsCalled.add(args.getProject().get()); + if (projectsCalled.size() == 2) { + throw new ValidationException("time to fail"); + } + } + }); submitWithConflict(change4.getChangeId(), "time to fail"); - assertThat(projectsCalled).containsExactly(name("project-a"), - name("project-b")); + assertThat(projectsCalled).containsExactly(name("project-a"), name("project-b")); for (PushOneCommit.Result change : changes) { change.assertChange(Change.Status.NEW, name(topic), admin); } submit(change4.getChangeId()); - assertThat(projectsCalled).containsExactly(name("project-a"), - name("project-b"), name("project-a"), name("project-b")); + assertThat(projectsCalled) + .containsExactly( + name("project-a"), name("project-b"), name("project-a"), name("project-b")); for (PushOneCommit.Result change : changes) { change.assertChange(Change.Status.MERGED, name(topic), admin); } } - private void setChangeStatusToNew(PushOneCommit.Result... changes) - throws Exception { + private void setChangeStatusToNew(PushOneCommit.Result... changes) throws Exception { for (PushOneCommit.Result change : changes) { - try (BatchUpdate bu = updateFactory.create(db, project, - userFactory.create(admin.id), TimeUtil.nowTs())) { - bu.addOp(change.getChange().getId(), new BatchUpdate.Op() { - @Override - public boolean updateChange(ChangeContext ctx) throws OrmException { - ctx.getChange().setStatus(Change.Status.NEW); - ctx.getUpdate(ctx.getChange().currentPatchSetId()) - .setStatus(Change.Status.NEW); - return true; - } - }); + try (BatchUpdate bu = + updateFactory.create(db, project, userFactory.create(admin.id), TimeUtil.nowTs())) { + bu.addOp( + change.getChange().getId(), + new BatchUpdate.Op() { + @Override + public boolean updateChange(ChangeContext ctx) throws OrmException { + ctx.getChange().setStatus(Change.Status.NEW); + ctx.getUpdate(ctx.getChange().currentPatchSetId()).setStatus(Change.Status.NEW); + return true; + } + }); bu.execute(); } } @@ -778,18 +771,15 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { private void assertSubmitter(PushOneCommit.Result change) throws Exception { ChangeInfo info = get(change.getChangeId(), ListChangesOption.MESSAGES); assertThat(info.messages).isNotNull(); - Iterable messages = - Iterables.transform(info.messages, i -> i.message); + Iterable messages = Iterables.transform(info.messages, i -> i.message); assertThat(messages).hasSize(3); String last = Iterables.getLast(messages); if (getSubmitType() == SubmitType.CHERRY_PICK) { - assertThat(last).startsWith( - "Change has been successfully cherry-picked as "); + assertThat(last).startsWith("Change has been successfully cherry-picked as "); } else if (getSubmitType() == SubmitType.REBASE_ALWAYS) { assertThat(last).startsWith("Change has been successfully rebased as"); } else { - assertThat(last).isEqualTo( - "Change has been successfully merged by Administrator"); + assertThat(last).isEqualTo("Change has been successfully merged by Administrator"); } } @@ -809,15 +799,16 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { submit(changeId, input, null, null); } - protected void submitWithConflict(String changeId, - String expectedError) throws Exception { - submit(changeId, new SubmitInput(), ResourceConflictException.class, - expectedError); + protected void submitWithConflict(String changeId, String expectedError) throws Exception { + submit(changeId, new SubmitInput(), ResourceConflictException.class, expectedError); } - protected void submit(String changeId, SubmitInput input, + protected void submit( + String changeId, + SubmitInput input, Class expectedExceptionType, - String expectedExceptionMsg) throws Exception { + String expectedExceptionMsg) + throws Exception { approve(changeId); if (expectedExceptionType == null) { assertSubmittable(changeId); @@ -825,8 +816,7 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { try { gApi.changes().id(changeId).current().submit(input); if (expectedExceptionType != null) { - fail("Expected exception of type " - + expectedExceptionType.getSimpleName()); + fail("Expected exception of type " + expectedExceptionType.getSimpleName()); } } catch (RestApiException e) { if (expectedExceptionType == null) { @@ -836,11 +826,17 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { // us the stack trace. if (!expectedExceptionType.isAssignableFrom(e.getClass()) || !e.getMessage().equals(expectedExceptionMsg)) { - throw new AssertionError("Expected exception of type " - + expectedExceptionType.getSimpleName() + " with message: \"" - + expectedExceptionMsg + "\" but got exception of type " - + e.getClass().getSimpleName() + " with message \"" - + e.getMessage() + "\"", e); + throw new AssertionError( + "Expected exception of type " + + expectedExceptionType.getSimpleName() + + " with message: \"" + + expectedExceptionMsg + + "\" but got exception of type " + + e.getClass().getSimpleName() + + " with message \"" + + e.getMessage() + + "\"", + e); } return; } @@ -852,8 +848,7 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { return gApi.changes().id(changeId).current().submitPreview(); } - protected BinaryResult submitPreview(String changeId, String format) - throws Exception { + protected BinaryResult submitPreview(String changeId, String format) throws Exception { return gApi.changes().id(changeId).current().submitPreview(format); } @@ -868,25 +863,20 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { } protected void assertChangeMergedEvents(String... expected) throws Exception { - eventRecorder.assertChangeMergedEvents( - project.get(), "refs/heads/master", expected); + eventRecorder.assertChangeMergedEvents(project.get(), "refs/heads/master", expected); } - protected void assertRefUpdatedEvents(RevCommit... expected) + protected void assertRefUpdatedEvents(RevCommit... expected) throws Exception { + eventRecorder.assertRefUpdatedEvents(project.get(), "refs/heads/master", expected); + } + + protected void assertCurrentRevision(String changeId, int expectedNum, ObjectId expectedId) throws Exception { - eventRecorder.assertRefUpdatedEvents( - project.get(), "refs/heads/master", expected); - } - - protected void assertCurrentRevision(String changeId, int expectedNum, - ObjectId expectedId) throws Exception { ChangeInfo c = get(changeId, CURRENT_REVISION); assertThat(c.currentRevision).isEqualTo(expectedId.name()); assertThat(c.revisions.get(expectedId.name())._number).isEqualTo(expectedNum); - try (Repository repo = - repoManager.openRepository(new Project.NameKey(c.project))) { - String refName = new PatchSet.Id(new Change.Id(c._number), expectedNum) - .toRefName(); + try (Repository repo = repoManager.openRepository(new Project.NameKey(c.project))) { + String refName = new PatchSet.Id(new Change.Id(c._number), expectedNum).toRefName(); Ref ref = repo.exactRef(refName); assertThat(ref).named(refName).isNotNull(); assertThat(ref.getObjectId()).isEqualTo(expectedId); @@ -901,14 +891,12 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { assertApproved(changeId, admin); } - protected void assertApproved(String changeId, TestAccount user) - throws Exception { + protected void assertApproved(String changeId, TestAccount user) throws Exception { ChangeInfo c = get(changeId, DETAILED_LABELS); LabelInfo cr = c.labels.get("Code-Review"); assertThat(cr.all).hasSize(1); assertThat(cr.all.get(0).value).isEqualTo(2); - assertThat(new Account.Id(cr.all.get(0)._accountId)) - .isEqualTo(user.getId()); + assertThat(new Account.Id(cr.all.get(0)._accountId)).isEqualTo(user.getId()); } protected void assertMerged(String changeId) throws RestApiException { @@ -916,59 +904,50 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { assertThat(status).isEqualTo(ChangeStatus.MERGED); } - protected void assertPersonEquals(PersonIdent expected, - PersonIdent actual) { - assertThat(actual.getEmailAddress()) - .isEqualTo(expected.getEmailAddress()); - assertThat(actual.getName()) - .isEqualTo(expected.getName()); - assertThat(actual.getTimeZone()) - .isEqualTo(expected.getTimeZone()); + protected void assertPersonEquals(PersonIdent expected, PersonIdent actual) { + assertThat(actual.getEmailAddress()).isEqualTo(expected.getEmailAddress()); + assertThat(actual.getName()).isEqualTo(expected.getName()); + assertThat(actual.getTimeZone()).isEqualTo(expected.getTimeZone()); } - protected void assertSubmitter(String changeId, int psId) - throws Exception { + protected void assertSubmitter(String changeId, int psId) throws Exception { assertSubmitter(changeId, psId, admin); } - protected void assertSubmitter(String changeId, int psId, TestAccount user) - throws Exception { - Change c = - getOnlyElement(queryProvider.get().byKeyPrefix(changeId)).change(); + protected void assertSubmitter(String changeId, int psId, TestAccount user) throws Exception { + Change c = getOnlyElement(queryProvider.get().byKeyPrefix(changeId)).change(); ChangeNotes cn = notesFactory.createChecked(db, c); - PatchSetApproval submitter = approvalsUtil.getSubmitter(db, cn, - new PatchSet.Id(cn.getChangeId(), psId)); + PatchSetApproval submitter = + approvalsUtil.getSubmitter(db, cn, new PatchSet.Id(cn.getChangeId(), psId)); assertThat(submitter).isNotNull(); assertThat(submitter.isLegacySubmit()).isTrue(); assertThat(submitter.getAccountId()).isEqualTo(user.getId()); } - protected void assertNoSubmitter(String changeId, int psId) - throws Exception { - Change c = - getOnlyElement(queryProvider.get().byKeyPrefix(changeId)).change(); + protected void assertNoSubmitter(String changeId, int psId) throws Exception { + Change c = getOnlyElement(queryProvider.get().byKeyPrefix(changeId)).change(); ChangeNotes cn = notesFactory.createChecked(db, c); - PatchSetApproval submitter = approvalsUtil.getSubmitter( - db, cn, new PatchSet.Id(cn.getChangeId(), psId)); + PatchSetApproval submitter = + approvalsUtil.getSubmitter(db, cn, new PatchSet.Id(cn.getChangeId(), psId)); assertThat(submitter).isNull(); } - protected void assertCherryPick(TestRepository testRepo, - boolean contentMerge) throws Exception { + protected void assertCherryPick(TestRepository testRepo, boolean contentMerge) + throws Exception { assertRebase(testRepo, contentMerge); RevCommit remoteHead = getRemoteHead(); assertThat(remoteHead.getFooterLines("Reviewed-On")).isNotEmpty(); assertThat(remoteHead.getFooterLines("Reviewed-By")).isNotEmpty(); } - protected void assertRebase(TestRepository testRepo, boolean contentMerge) - throws Exception { + protected void assertRebase(TestRepository testRepo, boolean contentMerge) throws Exception { Repository repo = testRepo.getRepository(); RevCommit localHead = getHead(repo); RevCommit remoteHead = getRemoteHead(); - assert_().withFailureMessage( - String.format("%s not equal %s", localHead.name(), remoteHead.name())) - .that(localHead.getId()).isNotEqualTo(remoteHead.getId()); + assert_() + .withFailureMessage(String.format("%s not equal %s", localHead.name(), remoteHead.name())) + .that(localHead.getId()) + .isNotEqualTo(remoteHead.getId()); assertThat(remoteHead.getParentCount()).isEqualTo(1); if (!contentMerge) { assertThat(getLatestRemoteDiff()).isEqualTo(getLatestDiff(repo)); @@ -976,12 +955,10 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { assertThat(remoteHead.getShortMessage()).isEqualTo(localHead.getShortMessage()); } - protected List getRemoteLog(Project.NameKey project, String branch) - throws Exception { + protected List getRemoteLog(Project.NameKey project, String branch) throws Exception { try (Repository repo = repoManager.openRepository(project); RevWalk rw = new RevWalk(repo)) { - rw.markStart(rw.parseCommit( - repo.exactRef("refs/heads/" + branch).getObjectId())); + rw.markStart(rw.parseCommit(repo.exactRef("refs/heads/" + branch).getObjectId())); return Lists.newArrayList(rw); } } @@ -990,7 +967,7 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { return getRemoteLog(project, "master"); } - protected void addOnSubmitValidationListener(OnSubmitValidationListener listener){ + protected void addOnSubmitValidationListener(OnSubmitValidationListener listener) { assertThat(onSubmitValidatorHandle).isNull(); onSubmitValidatorHandle = onSubmitValidationListeners.add(listener); } @@ -1010,8 +987,8 @@ public abstract class AbstractSubmit extends AbstractDaemonTest { } } - private String getLatestDiff(Repository repo, ObjectId oldTreeId, - ObjectId newTreeId) throws Exception { + private String getLatestDiff(Repository repo, ObjectId oldTreeId, ObjectId newTreeId) + throws Exception { ByteArrayOutputStream out = new ByteArrayOutputStream(); try (DiffFormatter fmt = new DiffFormatter(out)) { fmt.setRepository(repo); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmitByMerge.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmitByMerge.java index e14f153754..0250db1888 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmitByMerge.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmitByMerge.java @@ -30,7 +30,6 @@ import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.server.change.Submit.TestSubmitInput; - import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; @@ -43,14 +42,12 @@ public abstract class AbstractSubmitByMerge extends AbstractSubmit { @Test public void submitWithMerge() throws Exception { RevCommit initialHead = getRemoteHead(); - PushOneCommit.Result change = - createChange("Change 1", "a.txt", "content"); + PushOneCommit.Result change = createChange("Change 1", "a.txt", "content"); submit(change.getChangeId()); RevCommit oldHead = getRemoteHead(); testRepo.reset(initialHead); - PushOneCommit.Result change2 = - createChange("Change 2", "b.txt", "other content"); + PushOneCommit.Result change2 = createChange("Change 2", "b.txt", "other content"); submit(change2.getChangeId()); RevCommit head = getRemoteHead(); assertThat(head.getParentCount()).isEqualTo(2); @@ -61,17 +58,14 @@ public abstract class AbstractSubmitByMerge extends AbstractSubmit { @Test @TestProjectInput(useContentMerge = InheritableBoolean.TRUE) public void submitWithContentMerge() throws Exception { - PushOneCommit.Result change = - createChange("Change 1", "a.txt", "aaa\nbbb\nccc\n"); + PushOneCommit.Result change = createChange("Change 1", "a.txt", "aaa\nbbb\nccc\n"); submit(change.getChangeId()); - PushOneCommit.Result change2 = - createChange("Change 2", "a.txt", "aaa\nbbb\nccc\nddd\n"); + PushOneCommit.Result change2 = createChange("Change 2", "a.txt", "aaa\nbbb\nccc\nddd\n"); submit(change2.getChangeId()); RevCommit oldHead = getRemoteHead(); testRepo.reset(change.getCommit()); - PushOneCommit.Result change3 = - createChange("Change 3", "a.txt", "bbb\nccc\n"); + PushOneCommit.Result change3 = createChange("Change 3", "a.txt", "bbb\nccc\n"); submit(change3.getChangeId()); RevCommit head = getRemoteHead(); assertThat(head.getParentCount()).isEqualTo(2); @@ -83,20 +77,21 @@ public abstract class AbstractSubmitByMerge extends AbstractSubmit { @TestProjectInput(useContentMerge = InheritableBoolean.TRUE) public void submitWithContentMerge_Conflict() throws Exception { RevCommit initialHead = getRemoteHead(); - PushOneCommit.Result change = - createChange("Change 1", "a.txt", "content"); + PushOneCommit.Result change = createChange("Change 1", "a.txt", "content"); submit(change.getChangeId()); RevCommit oldHead = getRemoteHead(); testRepo.reset(initialHead); - PushOneCommit.Result change2 = - createChange("Change 2", "a.txt", "other content"); - submitWithConflict(change2.getChangeId(), - "Failed to submit 1 change due to the following problems:\n" + - "Change " + change2.getChange().getId() + ": " + - "Change could not be merged due to a path conflict. " + - "Please rebase the change locally " + - "and upload the rebased commit for review."); + PushOneCommit.Result change2 = createChange("Change 2", "a.txt", "other content"); + submitWithConflict( + change2.getChangeId(), + "Failed to submit 1 change due to the following problems:\n" + + "Change " + + change2.getChange().getId() + + ": " + + "Change could not be merged due to a path conflict. " + + "Please rebase the change locally " + + "and upload the rebased commit for review."); assertThat(getRemoteHead()).isEqualTo(oldHead); } @@ -114,12 +109,12 @@ public abstract class AbstractSubmitByMerge extends AbstractSubmit { @TestProjectInput(createEmptyCommit = false) public void submitMultipleCommitsToEmptyRepoWithOneMerge() throws Exception { assume().that(isSubmitWholeTopicEnabled()).isTrue(); - PushOneCommit.Result change1 = pushFactory.create( - db, admin.getIdent(), testRepo, "Change 1", "a", "a") - .to("refs/for/master/" + name("topic")); + PushOneCommit.Result change1 = + pushFactory + .create(db, admin.getIdent(), testRepo, "Change 1", "a", "a") + .to("refs/for/master/" + name("topic")); - PushOneCommit push2 = pushFactory.create( - db, admin.getIdent(), testRepo, "Change 2", "b", "b"); + PushOneCommit push2 = pushFactory.create(db, admin.getIdent(), testRepo, "Change 2", "b", "b"); push2.noParents(); PushOneCommit.Result change2 = push2.to("refs/for/master/" + name("topic")); change2.assertOkStatus(); @@ -136,19 +131,19 @@ public abstract class AbstractSubmitByMerge extends AbstractSubmit { @Test public void repairChangeStateAfterFailure() throws Exception { RevCommit initialHead = getRemoteHead(); - PushOneCommit.Result change = - createChange("Change 1", "a.txt", "content"); + PushOneCommit.Result change = createChange("Change 1", "a.txt", "content"); submit(change.getChangeId()); RevCommit afterChange1Head = getRemoteHead(); testRepo.reset(initialHead); - PushOneCommit.Result change2 = - createChange("Change 2", "b.txt", "other content"); + PushOneCommit.Result change2 = createChange("Change 2", "b.txt", "other content"); Change.Id id2 = change2.getChange().getId(); - SubmitInput failAfterRefUpdates = - new TestSubmitInput(new SubmitInput(), true); - submit(change2.getChangeId(), failAfterRefUpdates, - ResourceConflictException.class, "Failing after ref updates"); + SubmitInput failAfterRefUpdates = new TestSubmitInput(new SubmitInput(), true); + submit( + change2.getChangeId(), + failAfterRefUpdates, + ResourceConflictException.class, + "Failing after ref updates"); // Bad: ref advanced but change wasn't updated. PatchSet.Id psId1 = new PatchSet.Id(id2, 1); @@ -179,8 +174,7 @@ public abstract class AbstractSubmitByMerge extends AbstractSubmit { .isEqualTo("Change has been successfully merged by Administrator"); try (Repository repo = repoManager.openRepository(project)) { - assertThat(repo.exactRef("refs/heads/master").getObjectId()) - .isEqualTo(tip); + assertThat(repo.exactRef("refs/heads/master").getObjectId()).isEqualTo(tip); } } @@ -191,12 +185,9 @@ public abstract class AbstractSubmitByMerge extends AbstractSubmit { RevCommit initialHead = getRemoteHead(); // Create a stable branch and bootstrap it. - gApi.projects() - .name(project.get()) - .branch("stable") - .create(new BranchInput()); - PushOneCommit push = pushFactory.create( - db, user.getIdent(), testRepo, "initial commit", "a.txt", "a"); + gApi.projects().name(project.get()).branch("stable").create(new BranchInput()); + PushOneCommit push = + pushFactory.create(db, user.getIdent(), testRepo, "initial commit", "a.txt", "a"); PushOneCommit.Result change = push.to("refs/heads/stable"); RevCommit stable = getRemoteHead(project, "stable"); @@ -206,44 +197,41 @@ public abstract class AbstractSubmitByMerge extends AbstractSubmit { assertThat(stable).isEqualTo(change.getCommit()); testRepo.git().fetch().call(); - testRepo.git() - .branchCreate() - .setName("stable") - .setStartPoint(stable) - .call(); - testRepo.git() - .branchCreate() - .setName("master") - .setStartPoint(master) - .call(); + testRepo.git().branchCreate().setName("stable").setStartPoint(stable).call(); + testRepo.git().branchCreate().setName("master").setStartPoint(master).call(); // Create a fix in stable branch. testRepo.reset(stable); - RevCommit fix = testRepo.commit() - .parent(stable) - .message("small fix") - .add("b.txt", "b") - .insertChangeId() - .create(); + RevCommit fix = + testRepo + .commit() + .parent(stable) + .message("small fix") + .add("b.txt", "b") + .insertChangeId() + .create(); testRepo.branch("refs/heads/stable").update(fix); - testRepo.git() + testRepo + .git() .push() - .setRefSpecs( - new RefSpec("refs/heads/stable:refs/for/stable/" + name("topic"))) + .setRefSpecs(new RefSpec("refs/heads/stable:refs/for/stable/" + name("topic"))) .call(); // Merge the fix into master. testRepo.reset(master); - RevCommit merge = testRepo.commit() - .parent(master) - .parent(fix) - .message("Merge stable into master") - .insertChangeId() - .create(); + RevCommit merge = + testRepo + .commit() + .parent(master) + .parent(fix) + .message("Merge stable into master") + .insertChangeId() + .create(); testRepo.branch("refs/heads/master").update(merge); - testRepo.git().push() - .setRefSpecs( - new RefSpec("refs/heads/master:refs/for/master/" + name("topic"))) + testRepo + .git() + .push() + .setRefSpecs(new RefSpec("refs/heads/master:refs/for/master/" + name("topic"))) .call(); // Submit together. diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmitByRebase.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmitByRebase.java index 3cb8040959..64dd46cf8e 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmitByRebase.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmitByRebase.java @@ -38,7 +38,6 @@ import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.change.Submit.TestSubmitInput; import com.google.gerrit.server.git.ProjectConfig; import com.google.gerrit.server.project.Util; - import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; @@ -62,8 +61,13 @@ public abstract class AbstractSubmitByRebase extends AbstractSubmit { ProjectConfig cfg = projectCache.checkedGet(project).getConfig(); Util.block(cfg, Permission.ADD_PATCH_SET, REGISTERED_USERS, "refs/*"); Util.allow(cfg, Permission.SUBMIT, REGISTERED_USERS, "refs/heads/*"); - Util.allow(cfg, Permission.forLabel(Util.codeReview().getName()), -2, 2, - REGISTERED_USERS, "refs/heads/*"); + Util.allow( + cfg, + Permission.forLabel(Util.codeReview().getName()), + -2, + 2, + REGISTERED_USERS, + "refs/heads/*"); saveProjectConfig(project, cfg); submitWithRebase(user); @@ -72,57 +76,49 @@ public abstract class AbstractSubmitByRebase extends AbstractSubmit { private void submitWithRebase(TestAccount submitter) throws Exception { setApiUser(submitter); RevCommit initialHead = getRemoteHead(); - PushOneCommit.Result change = - createChange("Change 1", "a.txt", "content"); + PushOneCommit.Result change = createChange("Change 1", "a.txt", "content"); submit(change.getChangeId()); RevCommit headAfterFirstSubmit = getRemoteHead(); testRepo.reset(initialHead); - PushOneCommit.Result change2 = - createChange("Change 2", "b.txt", "other content"); + PushOneCommit.Result change2 = createChange("Change 2", "b.txt", "other content"); submit(change2.getChangeId()); assertRebase(testRepo, false); RevCommit headAfterSecondSubmit = getRemoteHead(); - assertThat(headAfterSecondSubmit.getParent(0)) - .isEqualTo(headAfterFirstSubmit); + assertThat(headAfterSecondSubmit.getParent(0)).isEqualTo(headAfterFirstSubmit); assertApproved(change2.getChangeId(), submitter); assertCurrentRevision(change2.getChangeId(), 2, headAfterSecondSubmit); assertSubmitter(change2.getChangeId(), 1, submitter); assertSubmitter(change2.getChangeId(), 2, submitter); - assertPersonEquals(admin.getIdent(), - headAfterSecondSubmit.getAuthorIdent()); - assertPersonEquals(submitter.getIdent(), - headAfterSecondSubmit.getCommitterIdent()); + assertPersonEquals(admin.getIdent(), headAfterSecondSubmit.getAuthorIdent()); + assertPersonEquals(submitter.getIdent(), headAfterSecondSubmit.getCommitterIdent()); - assertRefUpdatedEvents(initialHead, headAfterFirstSubmit, - headAfterFirstSubmit, headAfterSecondSubmit); - assertChangeMergedEvents(change.getChangeId(), headAfterFirstSubmit.name(), - change2.getChangeId(), headAfterSecondSubmit.name()); + assertRefUpdatedEvents( + initialHead, headAfterFirstSubmit, headAfterFirstSubmit, headAfterSecondSubmit); + assertChangeMergedEvents( + change.getChangeId(), + headAfterFirstSubmit.name(), + change2.getChangeId(), + headAfterSecondSubmit.name()); } @Test public void submitWithRebaseMultipleChanges() throws Exception { RevCommit initialHead = getRemoteHead(); - PushOneCommit.Result change1 = - createChange("Change 1", "a.txt", "content"); + PushOneCommit.Result change1 = createChange("Change 1", "a.txt", "content"); submit(change1.getChangeId()); RevCommit headAfterFirstSubmit = getRemoteHead(); if (getSubmitType() == SubmitType.REBASE_ALWAYS) { assertCurrentRevision(change1.getChangeId(), 2, headAfterFirstSubmit); } else { - assertThat(headAfterFirstSubmit.name()) - .isEqualTo(change1.getCommit().name()); + assertThat(headAfterFirstSubmit.name()).isEqualTo(change1.getCommit().name()); } testRepo.reset(initialHead); - PushOneCommit.Result change2 = - createChange("Change 2", "b.txt", "other content"); - assertThat(change2.getCommit().getParent(0)) - .isNotEqualTo(change1.getCommit()); - PushOneCommit.Result change3 = - createChange("Change 3", "c.txt", "third content"); - PushOneCommit.Result change4 = - createChange("Change 4", "d.txt", "fourth content"); + PushOneCommit.Result change2 = createChange("Change 2", "b.txt", "other content"); + assertThat(change2.getCommit().getParent(0)).isNotEqualTo(change1.getCommit()); + PushOneCommit.Result change3 = createChange("Change 3", "c.txt", "third content"); + PushOneCommit.Result change4 = createChange("Change 4", "d.txt", "fourth content"); approve(change2.getChangeId()); approve(change3.getChangeId()); submit(change4.getChangeId()); @@ -154,33 +150,37 @@ public abstract class AbstractSubmitByRebase extends AbstractSubmit { assertCurrentRevision(change1.getChangeId(), 1, greatgrandparent); } - - assertRefUpdatedEvents(initialHead, headAfterFirstSubmit, - headAfterFirstSubmit, headAfterSecondSubmit); - assertChangeMergedEvents(change1.getChangeId(), headAfterFirstSubmit.name(), - change2.getChangeId(), headAfterSecondSubmit.name(), - change3.getChangeId(), headAfterSecondSubmit.name(), - change4.getChangeId(), headAfterSecondSubmit.name()); + assertRefUpdatedEvents( + initialHead, headAfterFirstSubmit, headAfterFirstSubmit, headAfterSecondSubmit); + assertChangeMergedEvents( + change1.getChangeId(), + headAfterFirstSubmit.name(), + change2.getChangeId(), + headAfterSecondSubmit.name(), + change3.getChangeId(), + headAfterSecondSubmit.name(), + change4.getChangeId(), + headAfterSecondSubmit.name()); } @Test public void submitWithRebaseMergeCommit() throws Exception { /* - * (HEAD, origin/master, origin/HEAD) Merge changes X,Y - |\ - | * Merge branch 'master' into origin/master - | |\ - | | * SHA Added a - | |/ - * | Before - |/ - * Initial empty repository - */ + * (HEAD, origin/master, origin/HEAD) Merge changes X,Y + |\ + | * Merge branch 'master' into origin/master + | |\ + | | * SHA Added a + | |/ + * | Before + |/ + * Initial empty repository + */ RevCommit initialHead = getRemoteHead(); PushOneCommit.Result change1 = createChange("Added a", "a.txt", ""); - PushOneCommit change2Push = pushFactory.create(db, admin.getIdent(), testRepo, - "Merge to master", "m.txt", ""); + PushOneCommit change2Push = + pushFactory.create(db, admin.getIdent(), testRepo, "Merge to master", "m.txt", ""); change2Push.setParents(ImmutableList.of(initialHead, change1.getCommit())); PushOneCommit.Result change2 = change2Push.to("refs/for/master"); @@ -200,7 +200,7 @@ public abstract class AbstractSubmitByRebase extends AbstractSubmit { RevCommit headParent1 = parse(newHead.getParent(0).getId()); RevCommit headParent2 = parse(newHead.getParent(1).getId()); - if (getSubmitType() == SubmitType.REBASE_ALWAYS){ + if (getSubmitType() == SubmitType.REBASE_ALWAYS) { assertCurrentRevision(change3.getChangeId(), 2, headParent1.getId()); } else { assertThat(change3.getCommit().getId()).isEqualTo(headParent1.getId()); @@ -222,17 +222,17 @@ public abstract class AbstractSubmitByRebase extends AbstractSubmit { @TestProjectInput(useContentMerge = InheritableBoolean.TRUE) public void submitWithContentMerge_Conflict() throws Exception { RevCommit initialHead = getRemoteHead(); - PushOneCommit.Result change = - createChange("Change 1", "a.txt", "content"); + PushOneCommit.Result change = createChange("Change 1", "a.txt", "content"); submit(change.getChangeId()); RevCommit headAfterFirstSubmit = getRemoteHead(); testRepo.reset(initialHead); - PushOneCommit.Result change2 = - createChange("Change 2", "a.txt", "other content"); - submitWithConflict(change2.getChangeId(), - "Cannot rebase " + change2.getCommit().name() - + ": The change could not be rebased due to a conflict during merge."); + PushOneCommit.Result change2 = createChange("Change 2", "a.txt", "other content"); + submitWithConflict( + change2.getChangeId(), + "Cannot rebase " + + change2.getCommit().name() + + ": The change could not be rebased due to a conflict during merge."); RevCommit head = getRemoteHead(); assertThat(head).isEqualTo(headAfterFirstSubmit); assertCurrentRevision(change2.getChangeId(), 1, change2.getCommit()); @@ -245,19 +245,19 @@ public abstract class AbstractSubmitByRebase extends AbstractSubmit { @Test public void repairChangeStateAfterFailure() throws Exception { RevCommit initialHead = getRemoteHead(); - PushOneCommit.Result change = - createChange("Change 1", "a.txt", "content"); + PushOneCommit.Result change = createChange("Change 1", "a.txt", "content"); submit(change.getChangeId()); RevCommit headAfterFirstSubmit = getRemoteHead(); testRepo.reset(initialHead); - PushOneCommit.Result change2 = - createChange("Change 2", "b.txt", "other content"); + PushOneCommit.Result change2 = createChange("Change 2", "b.txt", "other content"); Change.Id id2 = change2.getChange().getId(); - SubmitInput failAfterRefUpdates = - new TestSubmitInput(new SubmitInput(), true); - submit(change2.getChangeId(), failAfterRefUpdates, - ResourceConflictException.class, "Failing after ref updates"); + SubmitInput failAfterRefUpdates = new TestSubmitInput(new SubmitInput(), true); + submit( + change2.getChangeId(), + failAfterRefUpdates, + ResourceConflictException.class, + "Failing after ref updates"); RevCommit headAfterFailedSubmit = getRemoteHead(); // Bad: ref advanced but change wasn't updated. @@ -279,8 +279,7 @@ public abstract class AbstractSubmitByRebase extends AbstractSubmit { assertThat(rev2).isNotEqualTo(rev1); assertThat(rw.parseCommit(rev2).getParent(0)).isEqualTo(headAfterFirstSubmit); - assertThat(repo.exactRef("refs/heads/master").getObjectId()) - .isEqualTo(rev2); + assertThat(repo.exactRef("refs/heads/master").getObjectId()).isEqualTo(rev2); } submit(change2.getChangeId()); @@ -296,17 +295,18 @@ public abstract class AbstractSubmitByRebase extends AbstractSubmit { assertThat(ps2).isNotNull(); assertThat(ps2.getRevision().get()).isEqualTo(rev2.name()); assertThat(Iterables.getLast(info.messages).message) - .isEqualTo("Change has been successfully rebased as " - + rev2.name() + " by Administrator"); + .isEqualTo("Change has been successfully rebased as " + rev2.name() + " by Administrator"); try (Repository repo = repoManager.openRepository(project)) { - assertThat(repo.exactRef("refs/heads/master").getObjectId()) - .isEqualTo(rev2); + assertThat(repo.exactRef("refs/heads/master").getObjectId()).isEqualTo(rev2); } assertRefUpdatedEvents(initialHead, headAfterFirstSubmit); - assertChangeMergedEvents(change.getChangeId(), headAfterFirstSubmit.name(), - change2.getChangeId(), headAfterSecondSubmit.name()); + assertChangeMergedEvents( + change.getChangeId(), + headAfterFirstSubmit.name(), + change2.getChangeId(), + headAfterSecondSubmit.name()); } protected RevCommit parse(ObjectId id) throws Exception { @@ -323,14 +323,8 @@ public abstract class AbstractSubmitByRebase extends AbstractSubmit { RevCommit initialHead = getRemoteHead(); // Create two commits and push. - RevCommit c1 = commitBuilder() - .add("a.txt", "1") - .message("subject: 1") - .create(); - RevCommit c2 = commitBuilder() - .add("b.txt", "2") - .message("subject: 2") - .create(); + RevCommit c1 = commitBuilder().add("a.txt", "1").message("subject: 1").create(); + RevCommit c2 = commitBuilder().add("b.txt", "2").message("subject: 2").create(); pushHead(testRepo, "refs/for/master", false); String id1 = getChangeId(testRepo, c1).get(); @@ -348,8 +342,7 @@ public abstract class AbstractSubmitByRebase extends AbstractSubmit { RevCommit headAfterSubmit = getRemoteHead(); assertRefUpdatedEvents(initialHead, headAfterSubmit); - assertChangeMergedEvents(id2, headAfterSubmit.name(), - id1, headAfterSubmit.name()); + assertChangeMergedEvents(id2, headAfterSubmit.name(), id1, headAfterSubmit.name()); } @Test @@ -370,8 +363,8 @@ public abstract class AbstractSubmitByRebase extends AbstractSubmit { RevCommit newHead = getRemoteHead(); assertRefUpdatedEvents(initialHead, newHead); - assertChangeMergedEvents(change.getChangeId(), newHead.name(), - change2.getChangeId(), newHead.name()); + assertChangeMergedEvents( + change.getChangeId(), newHead.name(), change2.getChangeId(), newHead.name()); } @Test @@ -381,8 +374,7 @@ public abstract class AbstractSubmitByRebase extends AbstractSubmit { PushOneCommit.Result change1 = createChange("Change 1", "a.txt", "a"); PushOneCommit.Result change2 = createChange("Change 2", "a.txt", "a"); - assertThat(change1.getCommit().getTree()) - .isEqualTo(change2.getCommit().getTree()); + assertThat(change1.getCommit().getTree()).isEqualTo(change2.getCommit().getTree()); // for rebase if necessary, otherwise, the manual rebase of change2 will // fail since change1 would be merged as fast forward @@ -411,10 +403,8 @@ public abstract class AbstractSubmitByRebase extends AbstractSubmit { @Test @TestProjectInput(useContentMerge = InheritableBoolean.TRUE) public void submitChainOneByOne() throws Exception { - PushOneCommit.Result change1 = createChange("subject 1", "fileName 1", - "content 1"); - PushOneCommit.Result change2 = createChange("subject 2", "fileName 2", - "content 2"); + PushOneCommit.Result change1 = createChange("subject 1", "fileName 1", "content 1"); + PushOneCommit.Result change2 = createChange("subject 2", "fileName 2", "content 2"); submit(change1.getChangeId()); submit(change2.getChangeId()); } @@ -423,10 +413,8 @@ public abstract class AbstractSubmitByRebase extends AbstractSubmit { @TestProjectInput(useContentMerge = InheritableBoolean.TRUE) public void submitChainOneByOneManualRebase() throws Exception { RevCommit initialHead = getRemoteHead(); - PushOneCommit.Result change1 = createChange("subject 1", "fileName 1", - "content 1"); - PushOneCommit.Result change2 = createChange("subject 2", "fileName 2", - "content 2"); + PushOneCommit.Result change1 = createChange("subject 1", "fileName 1", "content 1"); + PushOneCommit.Result change2 = createChange("subject 2", "fileName 2", "content 2"); // for rebase if necessary, otherwise, the manual rebase of change2 will // fail since change1 would be merged as fast forward diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ActionsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ActionsIT.java index 2c9159fcaa..12b34350c1 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ActionsIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ActionsIT.java @@ -37,7 +37,10 @@ import com.google.gerrit.server.change.ChangeJson; import com.google.gerrit.server.query.change.ChangeData; import com.google.gerrit.testutil.ConfigSuite; import com.google.inject.Inject; - +import java.util.EnumSet; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.Config; @@ -45,22 +48,15 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; -import java.util.EnumSet; -import java.util.Map; -import java.util.Set; -import java.util.TreeSet; - public class ActionsIT extends AbstractDaemonTest { @ConfigSuite.Config public static Config submitWholeTopicEnabled() { return submitWholeTopicEnabledConfig(); } - @Inject - private ChangeJson.Factory changeJsonFactory; + @Inject private ChangeJson.Factory changeJsonFactory; - @Inject - private DynamicSet actionVisitors; + @Inject private DynamicSet actionVisitors; private RegistrationHandle visitorHandle; @@ -109,8 +105,8 @@ public class ActionsIT extends AbstractDaemonTest { assertThat(info.enabled).isNull(); assertThat(info.label).isEqualTo("Submit whole topic"); assertThat(info.method).isEqualTo("POST"); - assertThat(info.title).isEqualTo("This change depends on other " + - "changes which are not ready"); + assertThat(info.title) + .isEqualTo("This change depends on other " + "changes which are not ready"); } else { noSubmitWholeTopicAssertions(actions, 1); @@ -227,14 +223,17 @@ public class ActionsIT extends AbstractDaemonTest { approve(changeId); // create another change with the same topic - String changeId2 = createChangeWithTopic(testRepo, "foo2", "touching b", - "b.txt", "real content").getChangeId(); + String changeId2 = + createChangeWithTopic(testRepo, "foo2", "touching b", "b.txt", "real content") + .getChangeId(); approve(changeId2); // collide with the other change in the same topic testRepo.reset("HEAD~2"); - String collidingChange = createChangeWithTopic(testRepo, "off_topic", - "rewriting file b", "b.txt", "garbage\ngarbage\ngarbage").getChangeId(); + String collidingChange = + createChangeWithTopic( + testRepo, "off_topic", "rewriting file b", "b.txt", "garbage\ngarbage\ngarbage") + .getChangeId(); gApi.changes().id(collidingChange).current().review(ReviewInput.approve()); gApi.changes().id(collidingChange).current().submit(); @@ -252,8 +251,7 @@ public class ActionsIT extends AbstractDaemonTest { } @Test - public void revisionActionsTwoChangesInTopicWithAncestorReady() - throws Exception { + public void revisionActionsTwoChangesInTopicWithAncestorReady() throws Exception { String changeId = createChange().getChangeId(); approve(changeId); approve(changeId); @@ -269,9 +267,11 @@ public class ActionsIT extends AbstractDaemonTest { assertThat(info.enabled).isTrue(); assertThat(info.label).isEqualTo("Submit whole topic"); assertThat(info.method).isEqualTo("POST"); - assertThat(info.title).isEqualTo("Submit all 2 changes of the same " + - "topic (3 changes including ancestors " + - "and other changes related by topic)"); + assertThat(info.title) + .isEqualTo( + "Submit all 2 changes of the same " + + "topic (3 changes including ancestors " + + "and other changes related by topic)"); } else { noSubmitWholeTopicAssertions(actions, 2); } @@ -292,8 +292,7 @@ public class ActionsIT extends AbstractDaemonTest { noSubmitWholeTopicAssertions(actions, 3); } - private void noSubmitWholeTopicAssertions(Map actions, - int nrChanges) { + private void noSubmitWholeTopicAssertions(Map actions, int nrChanges) { ActionInfo info = actions.get("submit"); assertThat(info.enabled).isTrue(); if (nrChanges == 1) { @@ -305,22 +304,22 @@ public class ActionsIT extends AbstractDaemonTest { if (nrChanges == 1) { assertThat(info.title).isEqualTo("Submit patch set 1 into master"); } else { - assertThat(info.title).isEqualTo(String.format( - "Submit patch set 1 and ancestors (%d changes " + - "altogether) into master", nrChanges)); + assertThat(info.title) + .isEqualTo( + String.format( + "Submit patch set 1 and ancestors (%d changes " + "altogether) into master", + nrChanges)); } } @Test public void changeActionVisitor() throws Exception { String id = createChange().getChangeId(); - ChangeInfo origChange = - gApi.changes().id(id).get(EnumSet.of(ListChangesOption.CHANGE_ACTIONS)); + ChangeInfo origChange = gApi.changes().id(id).get(EnumSet.of(ListChangesOption.CHANGE_ACTIONS)); class Visitor implements ActionVisitor { @Override - public boolean visit(String name, ActionInfo actionInfo, - ChangeInfo changeInfo) { + public boolean visit(String name, ActionInfo actionInfo, ChangeInfo changeInfo) { assertThat(changeInfo).isNotNull(); assertThat(changeInfo._number).isEqualTo(origChange._number); if (name.equals("followup")) { @@ -333,8 +332,8 @@ public class ActionsIT extends AbstractDaemonTest { } @Override - public boolean visit(String name, ActionInfo actionInfo, - ChangeInfo changeInfo, RevisionInfo revisionInfo) { + public boolean visit( + String name, ActionInfo actionInfo, ChangeInfo changeInfo, RevisionInfo revisionInfo) { throw new UnsupportedOperationException(); } } @@ -346,10 +345,8 @@ public class ActionsIT extends AbstractDaemonTest { Visitor v = new Visitor(); visitorHandle = actionVisitors.add(v); - Map newActions = gApi.changes() - .id(id) - .get(EnumSet.of(ListChangesOption.CHANGE_ACTIONS)) - .actions; + Map newActions = + gApi.changes().id(id).get(EnumSet.of(ListChangesOption.CHANGE_ACTIONS)).actions; Set expectedNames = new TreeSet<>(origActions.keySet()); expectedNames.remove("followup"); @@ -363,19 +360,17 @@ public class ActionsIT extends AbstractDaemonTest { @Test public void revisionActionVisitor() throws Exception { String id = createChange().getChangeId(); - ChangeInfo origChange = - gApi.changes().id(id).get(EnumSet.of(ListChangesOption.CHANGE_ACTIONS)); + ChangeInfo origChange = gApi.changes().id(id).get(EnumSet.of(ListChangesOption.CHANGE_ACTIONS)); class Visitor implements ActionVisitor { @Override - public boolean visit(String name, ActionInfo actionInfo, - ChangeInfo changeInfo) { + public boolean visit(String name, ActionInfo actionInfo, ChangeInfo changeInfo) { return true; // Do nothing; implicitly called for CURRENT_ACTIONS. } @Override - public boolean visit(String name, ActionInfo actionInfo, - ChangeInfo changeInfo, RevisionInfo revisionInfo) { + public boolean visit( + String name, ActionInfo actionInfo, ChangeInfo changeInfo, RevisionInfo revisionInfo) { assertThat(changeInfo).isNotNull(); assertThat(changeInfo._number).isEqualTo(origChange._number); assertThat(revisionInfo).isNotNull(); @@ -390,8 +385,7 @@ public class ActionsIT extends AbstractDaemonTest { } } - Map origActions = - gApi.changes().id(id).current().actions(); + Map origActions = gApi.changes().id(id).current().actions(); assertThat(origActions.keySet()).containsAllOf("cherrypick", "rebase"); assertThat(origActions.get("rebase").label).isEqualTo("Rebase"); @@ -400,23 +394,20 @@ public class ActionsIT extends AbstractDaemonTest { // Test different codepaths within ActionJson... // ...via revision API. - visitedRevisionActionsAssertions( - origActions, gApi.changes().id(id).current().actions()); + visitedRevisionActionsAssertions(origActions, gApi.changes().id(id).current().actions()); // ...via change API with option. - EnumSet opts = - EnumSet.of(CURRENT_ACTIONS, CURRENT_REVISION); + EnumSet opts = EnumSet.of(CURRENT_ACTIONS, CURRENT_REVISION); ChangeInfo changeInfo = gApi.changes().id(id).get(opts); - RevisionInfo revisionInfo = - Iterables.getOnlyElement(changeInfo.revisions.values()); + RevisionInfo revisionInfo = Iterables.getOnlyElement(changeInfo.revisions.values()); visitedRevisionActionsAssertions(origActions, revisionInfo.actions); // ...via ChangeJson directly. - ChangeData cd = changeDataFactory.create( - db, project, new Change.Id(origChange._number)); - revisionInfo = changeJsonFactory.create(opts) - .getRevisionInfo( - cd.changeControl(), Iterables.getOnlyElement(cd.patchSets())); + ChangeData cd = changeDataFactory.create(db, project, new Change.Id(origChange._number)); + revisionInfo = + changeJsonFactory + .create(opts) + .getRevisionInfo(cd.changeControl(), Iterables.getOnlyElement(cd.patchSets())); visitedRevisionActionsAssertions(origActions, revisionInfo.actions); } @@ -441,30 +432,33 @@ public class ActionsIT extends AbstractDaemonTest { } private PushOneCommit.Result createCommitAndPush( - TestRepository repo, String ref, - String commitMsg, String fileName, String content) throws Exception { - return pushFactory - .create(db, admin.getIdent(), repo, commitMsg, fileName, content) - .to(ref); + TestRepository repo, + String ref, + String commitMsg, + String fileName, + String content) + throws Exception { + return pushFactory.create(db, admin.getIdent(), repo, commitMsg, fileName, content).to(ref); } private PushOneCommit.Result createChangeWithTopic( - TestRepository repo, String topic, - String commitMsg, String fileName, String content) throws Exception { + TestRepository repo, + String topic, + String commitMsg, + String fileName, + String content) + throws Exception { assertThat(topic).isNotEmpty(); - return createCommitAndPush(repo, "refs/for/master/" + name(topic), - commitMsg, fileName, content); + return createCommitAndPush( + repo, "refs/for/master/" + name(topic), commitMsg, fileName, content); } - private PushOneCommit.Result createChangeWithTopic() - throws Exception { - return createChangeWithTopic(testRepo, "foo2", - "a message", "a.txt", "content\n"); + private PushOneCommit.Result createChangeWithTopic() throws Exception { + return createChangeWithTopic(testRepo, "foo2", "a message", "a.txt", "content\n"); } - private PushOneCommit.Result createDraftWithTopic() - throws Exception { - return createCommitAndPush(testRepo, "refs/drafts/master/" + name("foo2"), - "a message", "a.txt", "content\n"); + private PushOneCommit.Result createDraftWithTopic() throws Exception { + return createCommitAndPush( + testRepo, "refs/drafts/master/" + name("foo2"), "a message", "a.txt", "content\n"); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AssigneeIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AssigneeIT.java index af64a3211c..35ba1a2da5 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AssigneeIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AssigneeIT.java @@ -27,14 +27,12 @@ import com.google.gerrit.extensions.client.ReviewerState; import com.google.gerrit.extensions.common.AccountInfo; import com.google.gerrit.testutil.FakeEmailSender.Message; import com.google.gerrit.testutil.TestTimeUtil; - +import java.util.Iterator; +import java.util.List; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; -import java.util.Iterator; -import java.util.List; - @NoHttpd public class AssigneeIT extends AbstractDaemonTest { @@ -57,8 +55,7 @@ public class AssigneeIT extends AbstractDaemonTest { @Test public void addGetAssignee() throws Exception { PushOneCommit.Result r = createChange(); - assertThat(setAssignee(r, user.email)._accountId) - .isEqualTo(user.getId().get()); + assertThat(setAssignee(r, user.email)._accountId).isEqualTo(user.getId().get()); assertThat(getAssignee(r)._accountId).isEqualTo(user.getId().get()); assertThat(sender.getMessages()).hasSize(1); @@ -70,8 +67,7 @@ public class AssigneeIT extends AbstractDaemonTest { public void setNewAssigneeWhenExists() throws Exception { PushOneCommit.Result r = createChange(); setAssignee(r, user.email); - assertThat(setAssignee(r, user.email)._accountId) - .isEqualTo(user.getId().get()); + assertThat(setAssignee(r, user.email)._accountId).isEqualTo(user.getId().get()); } @Test @@ -100,8 +96,7 @@ public class AssigneeIT extends AbstractDaemonTest { PushOneCommit.Result r = createChange(); Iterable reviewers = getReviewers(r, state); assertThat(reviewers).isNull(); - assertThat(setAssignee(r, user.email)._accountId) - .isEqualTo(user.getId().get()); + assertThat(setAssignee(r, user.email)._accountId).isEqualTo(user.getId().get()); reviewers = getReviewers(r, state); assertThat(reviewers).hasSize(1); AccountInfo reviewer = Iterables.getFirst(reviewers, null); @@ -112,15 +107,13 @@ public class AssigneeIT extends AbstractDaemonTest { public void setAlreadyExistingAssignee() throws Exception { PushOneCommit.Result r = createChange(); setAssignee(r, user.email); - assertThat(setAssignee(r, user.email)._accountId) - .isEqualTo(user.getId().get()); + assertThat(setAssignee(r, user.email)._accountId).isEqualTo(user.getId().get()); } @Test public void deleteAssignee() throws Exception { PushOneCommit.Result r = createChange(); - assertThat(setAssignee(r, user.email)._accountId) - .isEqualTo(user.getId().get()); + assertThat(setAssignee(r, user.email)._accountId).isEqualTo(user.getId().get()); assertThat(deleteAssignee(r)._accountId).isEqualTo(user.getId().get()); assertThat(getAssignee(r)).isNull(); } @@ -135,18 +128,16 @@ public class AssigneeIT extends AbstractDaemonTest { return gApi.changes().id(r.getChange().getId().get()).getAssignee(); } - private List getPastAssignees(PushOneCommit.Result r) - throws Exception { + private List getPastAssignees(PushOneCommit.Result r) throws Exception { return gApi.changes().id(r.getChange().getId().get()).getPastAssignees(); } - private Iterable getReviewers(PushOneCommit.Result r, - ReviewerState state) throws Exception { + private Iterable getReviewers(PushOneCommit.Result r, ReviewerState state) + throws Exception { return get(r.getChangeId()).reviewers.get(state); } - private AccountInfo setAssignee(PushOneCommit.Result r, String identifieer) - throws Exception { + private AccountInfo setAssignee(PushOneCommit.Result r, String identifieer) throws Exception { AssigneeInput input = new AssigneeInput(); input.assignee = identifieer; return gApi.changes().id(r.getChange().getId().get()).setAssignee(input); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeIncludedInIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeIncludedInIT.java index c37501d907..fbd55bb518 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeIncludedInIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeIncludedInIT.java @@ -22,7 +22,6 @@ import com.google.gerrit.acceptance.PushOneCommit.Result; import com.google.gerrit.extensions.api.changes.ReviewInput; import com.google.gerrit.extensions.api.projects.TagInput; import com.google.gerrit.reviewdb.client.Branch; - import org.junit.Test; @NoHttpd @@ -31,24 +30,22 @@ public class ChangeIncludedInIT extends AbstractDaemonTest { @Test public void includedInOpenChange() throws Exception { Result result = createChange(); - assertThat(gApi.changes().id(result.getChangeId()).includedIn().branches) - .isEmpty(); - assertThat(gApi.changes().id(result.getChangeId()).includedIn().tags) - .isEmpty(); + assertThat(gApi.changes().id(result.getChangeId()).includedIn().branches).isEmpty(); + assertThat(gApi.changes().id(result.getChangeId()).includedIn().tags).isEmpty(); } @Test public void includedInMergedChange() throws Exception { Result result = createChange(); - gApi.changes().id(result.getChangeId()).revision(result.getCommit().name()) + gApi.changes() + .id(result.getChangeId()) + .revision(result.getCommit().name()) .review(ReviewInput.approve()); - gApi.changes().id(result.getChangeId()).revision(result.getCommit().name()) - .submit(); + gApi.changes().id(result.getChangeId()).revision(result.getCommit().name()).submit(); assertThat(gApi.changes().id(result.getChangeId()).includedIn().branches) .containsExactly("master"); - assertThat(gApi.changes().id(result.getChangeId()).includedIn().tags) - .isEmpty(); + assertThat(gApi.changes().id(result.getChangeId()).includedIn().tags).isEmpty(); grantTagPermissions(); gApi.projects().name(project.get()).tag("test-tag").create(new TagInput()); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeMessagesIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeMessagesIT.java index 40b0391444..4c49e4cf82 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeMessagesIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeMessagesIT.java @@ -23,14 +23,12 @@ import com.google.gerrit.extensions.common.ChangeInfo; import com.google.gerrit.extensions.common.ChangeMessageInfo; import com.google.gerrit.testutil.ConfigSuite; import com.google.gerrit.testutil.TestTimeUtil; - +import java.util.Iterator; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import java.util.Iterator; - @RunWith(ConfigSuite.class) public class ChangeMessagesIT extends AbstractDaemonTest { private String systemTimeZone; @@ -61,8 +59,7 @@ public class ChangeMessagesIT extends AbstractDaemonTest { ChangeInfo c = get(changeId); assertThat(c.messages).isNotNull(); assertThat(c.messages).hasSize(1); - assertThat(c.messages.iterator().next().message) - .isEqualTo("Uploaded patch set 1."); + assertThat(c.messages.iterator().next().message).isEqualTo("Uploaded patch set 1."); } @Test diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeOwnerIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeOwnerIT.java index 91fc3e7077..49f5c5a278 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeOwnerIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeOwnerIT.java @@ -29,7 +29,6 @@ import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.server.git.MetaDataUpdate; import com.google.gerrit.server.git.ProjectConfig; import com.google.gerrit.server.group.SystemGroupBackend; - import org.junit.Before; import org.junit.Test; @@ -83,8 +82,9 @@ public class ChangeOwnerIT extends AbstractDaemonTest { ProjectConfig config = ProjectConfig.read(md); AccessSection s = config.getAccessSection("refs/heads/*", true); Permission p = s.getPermission(LABEL + "Code-Review", true); - PermissionRule rule = new PermissionRule(config - .resolve(systemGroupBackend.getGroup(SystemGroupBackend.CHANGE_OWNER))); + PermissionRule rule = + new PermissionRule( + config.resolve(systemGroupBackend.getGroup(SystemGroupBackend.CHANGE_OWNER))); rule.setMin(-2); rule.setMax(+2); p.add(rule); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeReviewersIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeReviewersIT.java index 7c84d6a8f3..5dc8a0c09f 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeReviewersIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeReviewersIT.java @@ -40,15 +40,13 @@ import com.google.gerrit.server.change.PostReviewers; import com.google.gerrit.server.mail.Address; import com.google.gerrit.testutil.FakeEmailSender.Message; import com.google.gson.stream.JsonReader; - -import org.junit.Test; - import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import org.junit.Test; public class ChangeReviewersIT extends AbstractDaemonTest { @Test @@ -60,18 +58,18 @@ public class ChangeReviewersIT extends AbstractDaemonTest { int largeGroupSize = PostReviewers.DEFAULT_MAX_REVIEWERS + 1; int mediumGroupSize = PostReviewers.DEFAULT_MAX_REVIEWERS_WITHOUT_CHECK + 1; - List users = - createAccounts(largeGroupSize, "addGroupAsReviewer"); + List users = createAccounts(largeGroupSize, "addGroupAsReviewer"); List largeGroupUsernames = new ArrayList<>(mediumGroupSize); for (TestAccount u : users) { largeGroupUsernames.add(u.username); } - List mediumGroupUsernames = - largeGroupUsernames.subList(0, mediumGroupSize); - gApi.groups().id(largeGroup).addMembers( - largeGroupUsernames.toArray(new String[largeGroupSize])); - gApi.groups().id(mediumGroup).addMembers( - mediumGroupUsernames.toArray(new String[mediumGroupSize])); + List mediumGroupUsernames = largeGroupUsernames.subList(0, mediumGroupSize); + gApi.groups() + .id(largeGroup) + .addMembers(largeGroupUsernames.toArray(new String[largeGroupSize])); + gApi.groups() + .id(mediumGroup) + .addMembers(mediumGroupUsernames.toArray(new String[mediumGroupSize])); // Attempt to add overly large group as reviewers. PushOneCommit.Result r = createChange(); @@ -79,8 +77,7 @@ public class ChangeReviewersIT extends AbstractDaemonTest { AddReviewerResult result = addReviewer(changeId, largeGroup); assertThat(result.input).isEqualTo(largeGroup); assertThat(result.confirm).isNull(); - assertThat(result.error) - .contains("has too many members to add them all as reviewers"); + assertThat(result.error).contains("has too many members to add them all as reviewers"); assertThat(result.reviewers).isNull(); // Attempt to add medium group without confirmation. @@ -88,8 +85,8 @@ public class ChangeReviewersIT extends AbstractDaemonTest { assertThat(result.input).isEqualTo(mediumGroup); assertThat(result.confirm).isTrue(); assertThat(result.error) - .contains("has " + mediumGroupSize + " members. Do you want to add them" - + " all as reviewers?"); + .contains( + "has " + mediumGroupSize + " members. Do you want to add them" + " all as reviewers?"); assertThat(result.reviewers).isNull(); // Add medium group with confirmation. @@ -140,8 +137,7 @@ public class ChangeReviewersIT extends AbstractDaemonTest { Message m = messages.get(0); assertThat(m.rcpt()).containsExactly(user.emailAddress); if (notesMigration.readChanges()) { - assertThat(m.body()) - .contains(admin.fullName + " has uploaded this change for review."); + assertThat(m.body()).contains(admin.fullName + " has uploaded this change for review."); } else { assertThat(m.body()).contains("Hello " + user.fullName + ",\n"); assertThat(m.body()).contains("I'd like you to do a code review."); @@ -164,7 +160,8 @@ public class ChangeReviewersIT extends AbstractDaemonTest { AddReviewerInput in = new AddReviewerInput(); in.reviewer = createGroup("cc1"); in.state = CC; - gApi.groups().id(in.reviewer) + gApi.groups() + .id(in.reviewer) .addMembers(firstUsernames.toArray(new String[firstUsernames.size()])); AddReviewerResult result = addReviewer(changeId, in); @@ -195,14 +192,13 @@ public class ChangeReviewersIT extends AbstractDaemonTest { assertThat(m.rcpt()).containsExactlyElementsIn(expectedAddresses); // CC a group that overlaps with some existing reviewers and CCed accounts. - TestAccount reviewer = accounts.create(name("reviewer"), - "addCcGroup-reviewer@example.com", "Reviewer"); + TestAccount reviewer = + accounts.create(name("reviewer"), "addCcGroup-reviewer@example.com", "Reviewer"); result = addReviewer(changeId, reviewer.username); assertThat(result.error).isNull(); sender.clear(); in.reviewer = createGroup("cc2"); - gApi.groups().id(in.reviewer) - .addMembers(usernames.toArray(new String[usernames.size()])); + gApi.groups().id(in.reviewer).addMembers(usernames.toArray(new String[usernames.size()])); gApi.groups().id(in.reviewer).addMembers(reviewer.username); result = addReviewer(changeId, in); assertThat(result.input).isEqualTo(in.reviewer); @@ -270,17 +266,16 @@ public class ChangeReviewersIT extends AbstractDaemonTest { // Post drive-by message as user. ReviewInput input = new ReviewInput().message("hello"); - RestResponse resp = userRestSession.post( - "/changes/" + r.getChangeId() + "/revisions/" + - r.getCommit().getName() + "/review", input); + RestResponse resp = + userRestSession.post( + "/changes/" + r.getChangeId() + "/revisions/" + r.getCommit().getName() + "/review", + input); ReviewResult result = readContentFromJson(resp, 200, ReviewResult.class); assertThat(result.labels).isNull(); assertThat(result.reviewers).isNull(); // Verify user is added to CC list. - ChangeInfo c = gApi.changes() - .id(r.getChangeId()) - .get(); + ChangeInfo c = gApi.changes().id(r.getChangeId()).get(); if (notesMigration.readChanges()) { assertReviewers(c, REVIEWER); assertReviewers(c, CC, user); @@ -299,18 +294,17 @@ public class ChangeReviewersIT extends AbstractDaemonTest { // user adds self as REVIEWER. ReviewInput input = new ReviewInput().reviewer(user.username); - RestResponse resp = userRestSession.post( - "/changes/" + r.getChangeId() + "/revisions/" + - r.getCommit().getName() + "/review", input); + RestResponse resp = + userRestSession.post( + "/changes/" + r.getChangeId() + "/revisions/" + r.getCommit().getName() + "/review", + input); ReviewResult result = readContentFromJson(resp, 200, ReviewResult.class); assertThat(result.labels).isNull(); assertThat(result.reviewers).isNotNull(); assertThat(result.reviewers).hasSize(1); // Verify reviewer state. - ChangeInfo c = gApi.changes() - .id(r.getChangeId()) - .get(); + ChangeInfo c = gApi.changes().id(r.getChangeId()).get(); assertReviewers(c, REVIEWER, user); assertReviewers(c, CC); LabelInfo label = c.labels.get("Code-Review"); @@ -328,18 +322,17 @@ public class ChangeReviewersIT extends AbstractDaemonTest { // user adds self as CC. ReviewInput input = new ReviewInput().reviewer(user.username, CC, false); - RestResponse resp = userRestSession.post( - "/changes/" + r.getChangeId() + "/revisions/" + - r.getCommit().getName() + "/review", input); + RestResponse resp = + userRestSession.post( + "/changes/" + r.getChangeId() + "/revisions/" + r.getCommit().getName() + "/review", + input); ReviewResult result = readContentFromJson(resp, 200, ReviewResult.class); assertThat(result.labels).isNull(); assertThat(result.reviewers).isNotNull(); assertThat(result.reviewers).hasSize(1); // Verify reviewer state. - ChangeInfo c = gApi.changes() - .id(r.getChangeId()) - .get(); + ChangeInfo c = gApi.changes().id(r.getChangeId()).get(); if (notesMigration.readChanges()) { assertReviewers(c, REVIEWER); assertReviewers(c, CC, user); @@ -368,9 +361,7 @@ public class ChangeReviewersIT extends AbstractDaemonTest { PushOneCommit.Result r = createChange(); // Verify reviewer state. - ChangeInfo c = gApi.changes() - .id(r.getChangeId()) - .get(); + ChangeInfo c = gApi.changes().id(r.getChangeId()).get(); assertReviewers(c, REVIEWER); assertReviewers(c, CC); LabelInfo label = c.labels.get("Code-Review"); @@ -386,9 +377,7 @@ public class ChangeReviewersIT extends AbstractDaemonTest { // Verify reviewer state. Both admin and user should be REVIEWERs now, // because admin gets forced into REVIEWER state by virtue of being owner. - c = gApi.changes() - .id(r.getChangeId()) - .get(); + c = gApi.changes().id(r.getChangeId()).get(); assertReviewers(c, REVIEWER, admin, user); assertReviewers(c, CC); label = c.labels.get("Code-Review"); @@ -405,16 +394,15 @@ public class ChangeReviewersIT extends AbstractDaemonTest { // Comment as user without voting. This should delete the approval and // then replace it with the default value. input = new ReviewInput().message("hello"); - RestResponse resp = userRestSession.post( - "/changes/" + r.getChangeId() + "/revisions/" + - r.getCommit().getName() + "/review", input); + RestResponse resp = + userRestSession.post( + "/changes/" + r.getChangeId() + "/revisions/" + r.getCommit().getName() + "/review", + input); result = readContentFromJson(resp, 200, ReviewResult.class); assertThat(result.labels).isNull(); // Verify reviewer state. - c = gApi.changes() - .id(r.getChangeId()) - .get(); + c = gApi.changes().id(r.getChangeId()).get(); assertReviewers(c, REVIEWER, admin, user); assertReviewers(c, CC); label = c.labels.get("Code-Review"); @@ -433,9 +421,8 @@ public class ChangeReviewersIT extends AbstractDaemonTest { public void reviewAndAddReviewers() throws Exception { TestAccount observer = accounts.user2(); PushOneCommit.Result r = createChange(); - ReviewInput input = ReviewInput.approve() - .reviewer(user.email) - .reviewer(observer.email, CC, false); + ReviewInput input = + ReviewInput.approve().reviewer(user.email).reviewer(observer.email, CC, false); ReviewResult result = review(r.getChangeId(), r.getCommit().name(), input); assertThat(result.labels).isNotNull(); @@ -444,9 +431,7 @@ public class ChangeReviewersIT extends AbstractDaemonTest { // Verify reviewer and CC were added. If not in NoteDb read mode, both // parties will be returned as CCed. - ChangeInfo c = gApi.changes() - .id(r.getChangeId()) - .get(); + ChangeInfo c = gApi.changes().id(r.getChangeId()).get(); if (notesMigration.readChanges()) { assertReviewers(c, REVIEWER, admin, user); assertReviewers(c, CC, observer); @@ -461,17 +446,13 @@ public class ChangeReviewersIT extends AbstractDaemonTest { assertThat(messages).hasSize(2); Message m = messages.get(0); - assertThat(m.rcpt()) - .containsExactly(user.emailAddress,observer.emailAddress); - assertThat(m.body()) - .contains(admin.fullName + " has posted comments on this change."); - assertThat(m.body()) - .contains("Change subject: " + PushOneCommit.SUBJECT + "\n"); + assertThat(m.rcpt()).containsExactly(user.emailAddress, observer.emailAddress); + assertThat(m.body()).contains(admin.fullName + " has posted comments on this change."); + assertThat(m.body()).contains("Change subject: " + PushOneCommit.SUBJECT + "\n"); assertThat(m.body()).contains("Patch Set 1: Code-Review+2"); m = messages.get(1); - assertThat(m.rcpt()) - .containsExactly(user.emailAddress, observer.emailAddress); + assertThat(m.rcpt()).containsExactly(user.emailAddress, observer.emailAddress); assertThat(m.body()).contains("Hello " + user.fullName + ",\n"); assertThat(m.body()).contains("I'd like you to do a code review."); } @@ -480,8 +461,7 @@ public class ChangeReviewersIT extends AbstractDaemonTest { public void reviewAndAddGroupReviewers() throws Exception { int largeGroupSize = PostReviewers.DEFAULT_MAX_REVIEWERS + 1; int mediumGroupSize = PostReviewers.DEFAULT_MAX_REVIEWERS_WITHOUT_CHECK + 1; - List users = - createAccounts(largeGroupSize, "reviewAndAddGroupReviewers"); + List users = createAccounts(largeGroupSize, "reviewAndAddGroupReviewers"); List usernames = new ArrayList<>(largeGroupSize); for (TestAccount u : users) { usernames.add(u.username); @@ -489,22 +469,21 @@ public class ChangeReviewersIT extends AbstractDaemonTest { String largeGroup = createGroup("largeGroup"); String mediumGroup = createGroup("mediumGroup"); - gApi.groups().id(largeGroup).addMembers( - usernames.toArray(new String[largeGroupSize])); - gApi.groups().id(mediumGroup).addMembers( - usernames.subList(0, mediumGroupSize) - .toArray(new String[mediumGroupSize])); + gApi.groups().id(largeGroup).addMembers(usernames.toArray(new String[largeGroupSize])); + gApi.groups() + .id(mediumGroup) + .addMembers(usernames.subList(0, mediumGroupSize).toArray(new String[mediumGroupSize])); TestAccount observer = accounts.user2(); PushOneCommit.Result r = createChange(); // Attempt to add overly large group as reviewers. - ReviewInput input = ReviewInput.approve() - .reviewer(user.email) - .reviewer(observer.email, CC, false) - .reviewer(largeGroup); - ReviewResult result = review( - r.getChangeId(), r.getCommit().name(), input, SC_BAD_REQUEST); + ReviewInput input = + ReviewInput.approve() + .reviewer(user.email) + .reviewer(observer.email, CC, false) + .reviewer(largeGroup); + ReviewResult result = review(r.getChangeId(), r.getCommit().name(), input, SC_BAD_REQUEST); assertThat(result.labels).isNull(); assertThat(result.reviewers).isNotNull(); assertThat(result.reviewers).hasSize(3); @@ -515,21 +494,19 @@ public class ChangeReviewersIT extends AbstractDaemonTest { assertThat(reviewerResult.error).contains("has too many members to add them all as reviewers"); // No labels should have changed, and no reviewers/CCs should have been added. - ChangeInfo c = gApi.changes() - .id(r.getChangeId()) - .get(); + ChangeInfo c = gApi.changes().id(r.getChangeId()).get(); assertThat(c.messages).hasSize(1); assertThat(c.reviewers.get(REVIEWER)).isNull(); assertThat(c.reviewers.get(CC)).isNull(); // Attempt to add group large enough to require confirmation, without // confirmation, as reviewers. - input = ReviewInput.approve() - .reviewer(user.email) - .reviewer(observer.email, CC, false) - .reviewer(mediumGroup); - result = review(r.getChangeId(), r.getCommit().name(), input, - SC_BAD_REQUEST); + input = + ReviewInput.approve() + .reviewer(user.email) + .reviewer(observer.email, CC, false) + .reviewer(mediumGroup); + result = review(r.getChangeId(), r.getCommit().name(), input, SC_BAD_REQUEST); assertThat(result.labels).isNull(); assertThat(result.reviewers).isNotNull(); assertThat(result.reviewers).hasSize(3); @@ -537,29 +514,23 @@ public class ChangeReviewersIT extends AbstractDaemonTest { assertThat(reviewerResult).isNotNull(); assertThat(reviewerResult.confirm).isTrue(); assertThat(reviewerResult.error) - .contains("has " + mediumGroupSize + " members. Do you want to add them all" - + " as reviewers?"); + .contains( + "has " + mediumGroupSize + " members. Do you want to add them all" + " as reviewers?"); // No labels should have changed, and no reviewers/CCs should have been added. - c = gApi.changes() - .id(r.getChangeId()) - .get(); + c = gApi.changes().id(r.getChangeId()).get(); assertThat(c.messages).hasSize(1); assertThat(c.reviewers.get(REVIEWER)).isNull(); assertThat(c.reviewers.get(CC)).isNull(); // Retrying with confirmation should successfully approve and add reviewers/CCs. - input = ReviewInput.approve() - .reviewer(user.email) - .reviewer(mediumGroup, CC, true); + input = ReviewInput.approve().reviewer(user.email).reviewer(mediumGroup, CC, true); result = review(r.getChangeId(), r.getCommit().name(), input); assertThat(result.labels).isNotNull(); assertThat(result.reviewers).isNotNull(); assertThat(result.reviewers).hasSize(2); - c = gApi.changes() - .id(r.getChangeId()) - .get(); + c = gApi.changes().id(r.getChangeId()).get(); assertThat(c.messages).hasSize(2); if (notesMigration.readChanges()) { @@ -604,32 +575,24 @@ public class ChangeReviewersIT extends AbstractDaemonTest { Iterator it = c.reviewerUpdates.iterator(); ReviewerUpdateInfo reviewerChange = it.next(); assertThat(reviewerChange.state).isEqualTo(CC); - assertThat(reviewerChange.reviewer._accountId).isEqualTo( - user.getId().get()); - assertThat(reviewerChange.updatedBy._accountId).isEqualTo( - admin.getId().get()); + assertThat(reviewerChange.reviewer._accountId).isEqualTo(user.getId().get()); + assertThat(reviewerChange.updatedBy._accountId).isEqualTo(admin.getId().get()); reviewerChange = it.next(); assertThat(reviewerChange.state).isEqualTo(REVIEWER); - assertThat(reviewerChange.reviewer._accountId).isEqualTo( - user.getId().get()); - assertThat(reviewerChange.updatedBy._accountId).isEqualTo( - admin.getId().get()); + assertThat(reviewerChange.reviewer._accountId).isEqualTo(user.getId().get()); + assertThat(reviewerChange.updatedBy._accountId).isEqualTo(admin.getId().get()); reviewerChange = it.next(); assertThat(reviewerChange.state).isEqualTo(REMOVED); - assertThat(reviewerChange.reviewer._accountId).isEqualTo( - user.getId().get()); - assertThat(reviewerChange.updatedBy._accountId).isEqualTo( - admin.getId().get()); + assertThat(reviewerChange.reviewer._accountId).isEqualTo(user.getId().get()); + assertThat(reviewerChange.updatedBy._accountId).isEqualTo(admin.getId().get()); } @Test public void addDuplicateReviewers() throws Exception { PushOneCommit.Result r = createChange(); - ReviewInput input = ReviewInput.approve() - .reviewer(user.email) - .reviewer(user.email); + ReviewInput input = ReviewInput.approve().reviewer(user.email).reviewer(user.email); ReviewResult result = review(r.getChangeId(), r.getCommit().name(), input); assertThat(result.reviewers).isNotNull(); assertThat(result.reviewers).hasSize(1); @@ -642,21 +605,16 @@ public class ChangeReviewersIT extends AbstractDaemonTest { @Test public void addOverlappingGroups() throws Exception { String emailPrefix = "addOverlappingGroups-"; - TestAccount user1 = accounts.create(name("user1"), - emailPrefix + "user1@example.com", "User1"); - TestAccount user2 = accounts.create(name("user2"), - emailPrefix + "user2@example.com", "User2"); - TestAccount user3 = accounts.create(name("user3"), - emailPrefix + "user3@example.com", "User3"); + TestAccount user1 = accounts.create(name("user1"), emailPrefix + "user1@example.com", "User1"); + TestAccount user2 = accounts.create(name("user2"), emailPrefix + "user2@example.com", "User2"); + TestAccount user3 = accounts.create(name("user3"), emailPrefix + "user3@example.com", "User3"); String group1 = createGroup("group1"); String group2 = createGroup("group2"); gApi.groups().id(group1).addMembers(user1.username, user2.username); gApi.groups().id(group2).addMembers(user2.username, user3.username); PushOneCommit.Result r = createChange(); - ReviewInput input = ReviewInput.approve() - .reviewer(group1) - .reviewer(group2); + ReviewInput input = ReviewInput.approve().reviewer(group1).reviewer(group2); ReviewResult result = review(r.getChangeId(), r.getCommit().name(), input); assertThat(result.reviewers).isNotNull(); assertThat(result.reviewers).hasSize(2); @@ -672,9 +630,7 @@ public class ChangeReviewersIT extends AbstractDaemonTest { return; } r = createChange(); - input = ReviewInput.approve() - .reviewer(group1, CC, false) - .reviewer(group2, CC, false); + input = ReviewInput.approve().reviewer(group1, CC, false).reviewer(group2, CC, false); result = review(r.getChangeId(), r.getCommit().name(), input); assertThat(result.reviewers).isNotNull(); assertThat(result.reviewers).hasSize(2); @@ -688,9 +644,7 @@ public class ChangeReviewersIT extends AbstractDaemonTest { // Repeat again with one group REVIEWER, the other CC. The overlapping // member should end up as a REVIEWER. r = createChange(); - input = ReviewInput.approve() - .reviewer(group1, REVIEWER, false) - .reviewer(group2, CC, false); + input = ReviewInput.approve().reviewer(group1, REVIEWER, false).reviewer(group2, CC, false); result = review(r.getChangeId(), r.getCommit().name(), input); assertThat(result.reviewers).isNotNull(); assertThat(result.reviewers).hasSize(2); @@ -703,52 +657,43 @@ public class ChangeReviewersIT extends AbstractDaemonTest { assertThat(reviewerResult.ccs).hasSize(1); } - private AddReviewerResult addReviewer(String changeId, String reviewer) - throws Exception { + private AddReviewerResult addReviewer(String changeId, String reviewer) throws Exception { return addReviewer(changeId, reviewer, SC_OK); } - private AddReviewerResult addReviewer( - String changeId, String reviewer, int expectedStatus) throws Exception { + private AddReviewerResult addReviewer(String changeId, String reviewer, int expectedStatus) + throws Exception { AddReviewerInput in = new AddReviewerInput(); in.reviewer = reviewer; return addReviewer(changeId, in, expectedStatus); } - private AddReviewerResult addReviewer(String changeId, AddReviewerInput in) - throws Exception { + private AddReviewerResult addReviewer(String changeId, AddReviewerInput in) throws Exception { return addReviewer(changeId, in, SC_OK); } - private AddReviewerResult addReviewer(String changeId, AddReviewerInput in, - int expectedStatus) throws Exception { - RestResponse resp = - adminRestSession.post("/changes/" + changeId + "/reviewers", in); - return readContentFromJson( - resp, expectedStatus, AddReviewerResult.class); - } - - private RestResponse deleteReviewer(String changeId, TestAccount account) + private AddReviewerResult addReviewer(String changeId, AddReviewerInput in, int expectedStatus) throws Exception { - return adminRestSession.delete("/changes/" + changeId + "/reviewers/" + - account.getId().get()); + RestResponse resp = adminRestSession.post("/changes/" + changeId + "/reviewers", in); + return readContentFromJson(resp, expectedStatus, AddReviewerResult.class); } - private ReviewResult review( - String changeId, String revisionId, ReviewInput in) throws Exception { + private RestResponse deleteReviewer(String changeId, TestAccount account) throws Exception { + return adminRestSession.delete("/changes/" + changeId + "/reviewers/" + account.getId().get()); + } + + private ReviewResult review(String changeId, String revisionId, ReviewInput in) throws Exception { return review(changeId, revisionId, in, SC_OK); } private ReviewResult review( - String changeId, String revisionId, ReviewInput in, int expectedStatus) - throws Exception { - RestResponse resp = adminRestSession.post( - "/changes/" + changeId + "/revisions/" + revisionId + "/review", in); + String changeId, String revisionId, ReviewInput in, int expectedStatus) throws Exception { + RestResponse resp = + adminRestSession.post("/changes/" + changeId + "/revisions/" + revisionId + "/review", in); return readContentFromJson(resp, expectedStatus, ReviewResult.class); } - private static T readContentFromJson( - RestResponse r, int expectedStatus, Class clazz) + private static T readContentFromJson(RestResponse r, int expectedStatus, Class clazz) throws Exception { r.assertStatus(expectedStatus); JsonReader jsonReader = new JsonReader(r.getReader()); @@ -756,8 +701,8 @@ public class ChangeReviewersIT extends AbstractDaemonTest { return newGson().fromJson(jsonReader, clazz); } - private static void assertReviewers(ChangeInfo c, ReviewerState reviewerState, - TestAccount... accounts) throws Exception { + private static void assertReviewers( + ChangeInfo c, ReviewerState reviewerState, TestAccount... accounts) throws Exception { List accountList = new ArrayList<>(accounts.length); for (TestAccount a : accounts) { accountList.add(a); @@ -765,8 +710,8 @@ public class ChangeReviewersIT extends AbstractDaemonTest { assertReviewers(c, reviewerState, accountList); } - private static void assertReviewers(ChangeInfo c, ReviewerState reviewerState, - Iterable accounts) throws Exception { + private static void assertReviewers( + ChangeInfo c, ReviewerState reviewerState, Iterable accounts) throws Exception { Collection actualAccounts = c.reviewers.get(reviewerState); if (actualAccounts == null) { assertThat(accounts.iterator().hasNext()).isFalse(); @@ -784,12 +729,11 @@ public class ChangeReviewersIT extends AbstractDaemonTest { assertThat(actualAccountIds).containsExactlyElementsIn(expectedAccountIds); } - private List createAccounts(int n, String emailPrefix) - throws Exception { + private List createAccounts(int n, String emailPrefix) throws Exception { List result = new ArrayList<>(n); for (int i = 0; i < n; i++) { - result.add(accounts.create(name("u" + i), - emailPrefix + "-" + i + "@example.com", "Full Name " + i)); + result.add( + accounts.create(name("u" + i), emailPrefix + "-" + i + "@example.com", "Full Name " + i)); } return result; } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ConfigChangeIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ConfigChangeIT.java index 02cf4f895f..cef5e6e7eb 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ConfigChangeIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ConfigChangeIT.java @@ -33,7 +33,6 @@ import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.reviewdb.client.RefNames; import com.google.gerrit.server.git.ProjectConfig; import com.google.gerrit.server.project.Util; - import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.Config; @@ -50,8 +49,7 @@ public class ConfigChangeIT extends AbstractDaemonTest { public void setUp() throws Exception { ProjectConfig cfg = projectCache.checkedGet(project).getConfig(); Util.allow(cfg, Permission.OWNER, REGISTERED_USERS, "refs/*"); - Util.allow( - cfg, Permission.PUSH, REGISTERED_USERS, "refs/for/refs/meta/config"); + Util.allow(cfg, Permission.PUSH, REGISTERED_USERS, "refs/for/refs/meta/config"); Util.allow(cfg, Permission.SUBMIT, REGISTERED_USERS, RefNames.REFS_CONFIG); saveProjectConfig(project, cfg); @@ -85,16 +83,13 @@ public class ConfigChangeIT extends AbstractDaemonTest { gApi.changes().id(id).current().review(ReviewInput.approve()); gApi.changes().id(id).current().submit(); - assertThat(gApi.changes().id(id).info().status) - .isEqualTo(ChangeStatus.MERGED); - assertThat(gApi.projects().name(project.get()).get().description) - .isEqualTo(desc); + assertThat(gApi.changes().id(id).info().status).isEqualTo(ChangeStatus.MERGED); + assertThat(gApi.projects().name(project.get()).get().description).isEqualTo(desc); fetchRefsMetaConfig(); - assertThat(readProjectConfig().getString("project", null, "description")) - .isEqualTo(desc); + assertThat(readProjectConfig().getString("project", null, "description")).isEqualTo(desc); String changeRev = gApi.changes().id(id).get().currentRevision; - String branchRev = gApi.projects().name(project.get()) - .branch(RefNames.REFS_CONFIG).get().revision; + String branchRev = + gApi.projects().name(project.get()).branch(RefNames.REFS_CONFIG).get().revision; assertThat(changeRev).isEqualTo(branchRev); return id; } @@ -110,8 +105,7 @@ public class ConfigChangeIT extends AbstractDaemonTest { setApiUser(user); Config cfg = readProjectConfig(); - assertThat(cfg.getString("access", null, "inheritFrom")) - .isAnyOf(null, allProjects.get()); + assertThat(cfg.getString("access", null, "inheritFrom")).isAnyOf(null, allProjects.get()); cfg.setString("access", null, "inheritFrom", parent.name); PushOneCommit.Result r = createConfigChange(cfg); @@ -123,28 +117,27 @@ public class ConfigChangeIT extends AbstractDaemonTest { fail("expected submit to fail"); } catch (ResourceConflictException e) { int n = gApi.changes().id(id).info()._number; - assertThat(e).hasMessage( - "Failed to submit 1 change due to the following problems:\n" - + "Change " + n + ": Change contains a project configuration that" - + " changes the parent project.\n" - + "The change must be submitted by a Gerrit administrator."); + assertThat(e) + .hasMessage( + "Failed to submit 1 change due to the following problems:\n" + + "Change " + + n + + ": Change contains a project configuration that" + + " changes the parent project.\n" + + "The change must be submitted by a Gerrit administrator."); } - assertThat(gApi.projects().name(project.get()).get().parent) - .isEqualTo(allProjects.get()); + assertThat(gApi.projects().name(project.get()).get().parent).isEqualTo(allProjects.get()); fetchRefsMetaConfig(); assertThat(readProjectConfig().getString("access", null, "inheritFrom")) .isAnyOf(null, allProjects.get()); setApiUser(admin); gApi.changes().id(id).current().submit(); - assertThat(gApi.changes().id(id).info().status) - .isEqualTo(ChangeStatus.MERGED); - assertThat(gApi.projects().name(project.get()).get().parent) - .isEqualTo(parent.name); + assertThat(gApi.changes().id(id).info().status).isEqualTo(ChangeStatus.MERGED); + assertThat(gApi.projects().name(project.get()).get().parent).isEqualTo(parent.name); fetchRefsMetaConfig(); - assertThat(readProjectConfig().getString("access", null, "inheritFrom")) - .isEqualTo(parent.name); + assertThat(readProjectConfig().getString("access", null, "inheritFrom")).isEqualTo(parent.name); } @Test @@ -154,32 +147,31 @@ public class ConfigChangeIT extends AbstractDaemonTest { Project.NameKey parent = createProject("projectToInheritFrom"); Project.NameKey child = createProject("projectWithMalformedConfig"); - String config = gApi.projects() - .name(child.get()) - .branch(RefNames.REFS_CONFIG).file("project.config").asString(); + String config = + gApi.projects() + .name(child.get()) + .branch(RefNames.REFS_CONFIG) + .file("project.config") + .asString(); // Append and push malformed project config - String pattern = "[access]\n" - + "\tinheritFrom = " + allProjects.get() + "\n"; + String pattern = "[access]\n" + "\tinheritFrom = " + allProjects.get() + "\n"; String doubleInherit = pattern + "\tinheritFrom = " + parent.get() + "\n"; config = config.replace(pattern, doubleInherit); - TestRepository childRepo = - cloneProject(child, admin); + TestRepository childRepo = cloneProject(child, admin); // Fetch meta ref GitUtil.fetch(childRepo, RefNames.REFS_CONFIG + ":cfg"); childRepo.reset("cfg"); - PushOneCommit push = pushFactory.create( - db, admin.getIdent(), childRepo, "Subject", "project.config", - config); + PushOneCommit push = + pushFactory.create(db, admin.getIdent(), childRepo, "Subject", "project.config", config); PushOneCommit.Result res = push.to(RefNames.REFS_CONFIG); res.assertErrorStatus(); res.assertMessage("cannot inherit from multiple projects"); } private void fetchRefsMetaConfig() throws Exception { - git().fetch().setRefSpecs(new RefSpec("refs/meta/config:refs/meta/config")) - .call(); + git().fetch().setRefSpecs(new RefSpec("refs/meta/config:refs/meta/config")).call(); testRepo.reset(RefNames.REFS_CONFIG); } @@ -195,12 +187,16 @@ public class ConfigChangeIT extends AbstractDaemonTest { } private PushOneCommit.Result createConfigChange(Config cfg) throws Exception { - PushOneCommit.Result r = pushFactory.create( - db, user.getIdent(), testRepo, - "Update project config", - "project.config", - cfg.toText()) - .to("refs/for/refs/meta/config"); + PushOneCommit.Result r = + pushFactory + .create( + db, + user.getIdent(), + testRepo, + "Update project config", + "project.config", + cfg.toText()) + .to("refs/for/refs/meta/config"); r.assertOkStatus(); return r; } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/CorsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/CorsIT.java index f5ae0726b1..4f2d2bd2c2 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/CorsIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/CorsIT.java @@ -28,7 +28,6 @@ import com.google.gerrit.acceptance.AbstractDaemonTest; import com.google.gerrit.acceptance.PushOneCommit.Result; import com.google.gerrit.acceptance.RestResponse; import com.google.gerrit.testutil.ConfigSuite; - import org.apache.http.Header; import org.apache.http.client.fluent.Request; import org.apache.http.message.BasicHeader; @@ -40,10 +39,10 @@ public class CorsIT extends AbstractDaemonTest { public static Config allowExampleDotCom() { Config cfg = new Config(); cfg.setStringList( - "site", null, "allowOriginRegex", - ImmutableList.of( - "https?://(.+[.])?example[.]com", - "http://friend[.]ly")); + "site", + null, + "allowOriginRegex", + ImmutableList.of("https?://(.+[.])?example[.]com", "http://friend[.]ly")); return cfg; } @@ -69,10 +68,9 @@ public class CorsIT extends AbstractDaemonTest { public void putWithOriginRefused() throws Exception { Result change = createChange(); String origin = "http://example.com"; - RestResponse r = adminRestSession.putWithHeader( - "/changes/" + change.getChangeId() + "/topic", - new BasicHeader(ORIGIN, origin), - "A"); + RestResponse r = + adminRestSession.putWithHeader( + "/changes/" + change.getChangeId() + "/topic", new BasicHeader(ORIGIN, origin), "A"); r.assertOK(); checkCors(r, false, origin); } @@ -82,8 +80,8 @@ public class CorsIT extends AbstractDaemonTest { Result change = createChange(); String origin = "http://example.com"; - Request req = Request.Options(adminRestSession.url() - + "/a/changes/" + change.getChangeId() + "/detail"); + Request req = + Request.Options(adminRestSession.url() + "/a/changes/" + change.getChangeId() + "/detail"); req.addHeader(ORIGIN, origin); req.addHeader(ACCESS_CONTROL_REQUEST_METHOD, "GET"); req.addHeader(ACCESS_CONTROL_REQUEST_HEADERS, "X-Requested-With"); @@ -97,8 +95,8 @@ public class CorsIT extends AbstractDaemonTest { public void preflightBadOrigin() throws Exception { Result change = createChange(); - Request req = Request.Options(adminRestSession.url() - + "/a/changes/" + change.getChangeId() + "/detail"); + Request req = + Request.Options(adminRestSession.url() + "/a/changes/" + change.getChangeId() + "/detail"); req.addHeader(ORIGIN, "http://evil.attacker"); req.addHeader(ACCESS_CONTROL_REQUEST_METHOD, "GET"); @@ -110,8 +108,9 @@ public class CorsIT extends AbstractDaemonTest { Result change = createChange(); for (String method : new String[] {"POST", "PUT", "DELETE", "PATCH"}) { - Request req = Request.Options(adminRestSession.url() - + "/a/changes/" + change.getChangeId() + "/detail"); + Request req = + Request.Options( + adminRestSession.url() + "/a/changes/" + change.getChangeId() + "/detail"); req.addHeader(ORIGIN, "http://example.com"); req.addHeader(ACCESS_CONTROL_REQUEST_METHOD, method); adminRestSession.execute(req).assertBadRequest(); @@ -122,8 +121,8 @@ public class CorsIT extends AbstractDaemonTest { public void preflightBadHeader() throws Exception { Result change = createChange(); - Request req = Request.Options(adminRestSession.url() - + "/a/changes/" + change.getChangeId() + "/detail"); + Request req = + Request.Options(adminRestSession.url() + "/a/changes/" + change.getChangeId() + "/detail"); req.addHeader(ORIGIN, "http://example.com"); req.addHeader(ACCESS_CONTROL_REQUEST_METHOD, "GET"); req.addHeader(ACCESS_CONTROL_REQUEST_HEADERS, "X-Gerrit-Auth"); @@ -131,8 +130,7 @@ public class CorsIT extends AbstractDaemonTest { adminRestSession.execute(req).assertBadRequest(); } - private RestResponse check(String url, boolean accept, String origin) - throws Exception { + private RestResponse check(String url, boolean accept, String origin) throws Exception { Header hdr = new BasicHeader(ORIGIN, origin); RestResponse r = adminRestSession.getWithHeader(url, hdr); r.assertOK(); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/CreateChangeIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/CreateChangeIT.java index 5db627b933..f79b5fa911 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/CreateChangeIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/CreateChangeIT.java @@ -45,7 +45,7 @@ import com.google.gerrit.server.git.ChangeAlreadyMergedException; import com.google.gerrit.testutil.ConfigSuite; import com.google.gerrit.testutil.FakeEmailSender.Message; import com.google.gerrit.testutil.TestTimeUtil; - +import java.util.List; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.PersonIdent; @@ -57,8 +57,6 @@ import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; -import java.util.List; - public class CreateChangeIT extends AbstractDaemonTest { @ConfigSuite.Config public static Config allowDraftsDisabled() { @@ -79,8 +77,7 @@ public class CreateChangeIT extends AbstractDaemonTest { public void createEmptyChange_MissingBranch() throws Exception { ChangeInput ci = new ChangeInput(); ci.project = project.get(); - assertCreateFails(ci, BadRequestException.class, - "branch must be non-empty"); + assertCreateFails(ci, BadRequestException.class, "branch must be non-empty"); } @Test @@ -88,15 +85,13 @@ public class CreateChangeIT extends AbstractDaemonTest { ChangeInput ci = new ChangeInput(); ci.project = project.get(); ci.branch = "master"; - assertCreateFails(ci, BadRequestException.class, - "commit message must be non-empty"); + assertCreateFails(ci, BadRequestException.class, "commit message must be non-empty"); } @Test public void createEmptyChange_InvalidStatus() throws Exception { ChangeInput ci = newChangeInput(ChangeStatus.MERGED); - assertCreateFails(ci, BadRequestException.class, - "unsupported change status"); + assertCreateFails(ci, BadRequestException.class, "unsupported change status"); } @Test @@ -117,8 +112,7 @@ public class CreateChangeIT extends AbstractDaemonTest { assertThat(messages).hasSize(1); Message m = messages.get(0); assertThat(m.rcpt()).containsExactly(user.emailAddress); - assertThat(m.body()) - .contains(admin.fullName + " has uploaded this change for review."); + assertThat(m.body()).contains(admin.fullName + " has uploaded this change for review."); // check that watcher is not notified if notify=NONE sender.clear(); @@ -134,9 +128,10 @@ public class CreateChangeIT extends AbstractDaemonTest { setSignedOffByFooter(); ChangeInfo info = assertCreateSucceeds(newChangeInput(ChangeStatus.NEW)); String message = info.revisions.get(info.currentRevision).commit.message; - assertThat(message).contains( - String.format("%sAdministrator <%s>", SIGNED_OFF_BY_TAG, - admin.getIdent().getEmailAddress())); + assertThat(message) + .contains( + String.format( + "%sAdministrator <%s>", SIGNED_OFF_BY_TAG, admin.getIdent().getEmailAddress())); } @Test @@ -149,8 +144,7 @@ public class CreateChangeIT extends AbstractDaemonTest { public void createNewDraftChangeNotAllowed() throws Exception { assume().that(isAllowDrafts()).isFalse(); ChangeInput ci = newChangeInput(ChangeStatus.DRAFT); - assertCreateFails(ci, MethodNotAllowedException.class, - "draft workflow is disabled"); + assertCreateFails(ci, MethodNotAllowedException.class, "draft workflow is disabled"); } @Test @@ -160,14 +154,17 @@ public class CreateChangeIT extends AbstractDaemonTest { ChangeInfo c = assertCreateSucceeds(newChangeInput(ChangeStatus.NEW)); try (Repository repo = repoManager.openRepository(project); RevWalk rw = new RevWalk(repo)) { - RevCommit commit = rw.parseCommit( - repo.exactRef(changeMetaRef(new Change.Id(c._number))).getObjectId()); + RevCommit commit = + rw.parseCommit(repo.exactRef(changeMetaRef(new Change.Id(c._number))).getObjectId()); assertThat(commit.getShortMessage()).isEqualTo("Create change"); - PersonIdent expectedAuthor = changeNoteUtil.newIdent( - accountCache.get(admin.id).getAccount(), c.created, serverIdent.get(), - AnonymousCowardNameProvider.DEFAULT); + PersonIdent expectedAuthor = + changeNoteUtil.newIdent( + accountCache.get(admin.id).getAccount(), + c.created, + serverIdent.get(), + AnonymousCowardNameProvider.DEFAULT); assertThat(commit.getAuthorIdent()).isEqualTo(expectedAuthor); assertThat(commit.getCommitterIdent()) @@ -179,75 +176,89 @@ public class CreateChangeIT extends AbstractDaemonTest { @Test public void createMergeChange() throws Exception { changeInTwoBranches("branchA", "a.txt", "branchB", "b.txt"); - ChangeInput in = - newMergeChangeInput("branchA", "branchB", ""); + ChangeInput in = newMergeChangeInput("branchA", "branchB", ""); assertCreateSucceeds(in); } @Test public void createMergeChange_Conflicts() throws Exception { changeInTwoBranches("branchA", "shared.txt", "branchB", "shared.txt"); - ChangeInput in = - newMergeChangeInput("branchA", "branchB", ""); + ChangeInput in = newMergeChangeInput("branchA", "branchB", ""); assertCreateFails(in, RestApiException.class, "merge conflict"); } @Test public void createMergeChange_Conflicts_Ours() throws Exception { changeInTwoBranches("branchA", "shared.txt", "branchB", "shared.txt"); - ChangeInput in = - newMergeChangeInput("branchA", "branchB", "ours"); + ChangeInput in = newMergeChangeInput("branchA", "branchB", "ours"); assertCreateSucceeds(in); } @Test public void invalidSource() throws Exception { changeInTwoBranches("branchA", "a.txt", "branchB", "b.txt"); - ChangeInput in = - newMergeChangeInput("branchA", "invalid", ""); - assertCreateFails(in, BadRequestException.class, - "Cannot resolve 'invalid' to a commit"); + ChangeInput in = newMergeChangeInput("branchA", "invalid", ""); + assertCreateFails(in, BadRequestException.class, "Cannot resolve 'invalid' to a commit"); } @Test public void invalidStrategy() throws Exception { changeInTwoBranches("branchA", "a.txt", "branchB", "b.txt"); - ChangeInput in = - newMergeChangeInput("branchA", "branchB", "octopus"); - assertCreateFails(in, BadRequestException.class, - "invalid merge strategy: octopus"); + ChangeInput in = newMergeChangeInput("branchA", "branchB", "octopus"); + assertCreateFails(in, BadRequestException.class, "invalid merge strategy: octopus"); } @Test public void alreadyMerged() throws Exception { - ObjectId c0 = testRepo.branch("HEAD").commit().insertChangeId() - .message("first commit") - .add("a.txt", "a contents ") - .create(); - testRepo.git().push().setRemote("origin").setRefSpecs( - new RefSpec("HEAD:refs/heads/master")).call(); + ObjectId c0 = + testRepo + .branch("HEAD") + .commit() + .insertChangeId() + .message("first commit") + .add("a.txt", "a contents ") + .create(); + testRepo + .git() + .push() + .setRemote("origin") + .setRefSpecs(new RefSpec("HEAD:refs/heads/master")) + .call(); - testRepo.branch("HEAD").commit().insertChangeId() + testRepo + .branch("HEAD") + .commit() + .insertChangeId() .message("second commit") .add("b.txt", "b contents ") .create(); - testRepo.git().push().setRemote("origin").setRefSpecs( - new RefSpec("HEAD:refs/heads/master")).call(); + testRepo + .git() + .push() + .setRemote("origin") + .setRefSpecs(new RefSpec("HEAD:refs/heads/master")) + .call(); - ChangeInput in = - newMergeChangeInput("master", c0.getName(), ""); - assertCreateFails(in, ChangeAlreadyMergedException.class, - "'" + c0.getName() + "' has already been merged"); + ChangeInput in = newMergeChangeInput("master", c0.getName(), ""); + assertCreateFails( + in, ChangeAlreadyMergedException.class, "'" + c0.getName() + "' has already been merged"); } @Test public void onlyContentMerged() throws Exception { - testRepo.branch("HEAD").commit().insertChangeId() + testRepo + .branch("HEAD") + .commit() + .insertChangeId() .message("first commit") .add("a.txt", "a contents ") .create(); - testRepo.git().push().setRemote("origin").setRefSpecs( - new RefSpec("HEAD:refs/heads/master")).call(); + testRepo + .git() + .push() + .setRemote("origin") + .setRefSpecs(new RefSpec("HEAD:refs/heads/master")) + .call(); // create a change, and cherrypick into master PushOneCommit.Result cId = createChange(); @@ -255,8 +266,7 @@ public class CreateChangeIT extends AbstractDaemonTest { CherryPickInput cpi = new CherryPickInput(); cpi.destination = "master"; cpi.message = "cherry pick the commit"; - ChangeApi orig = gApi.changes() - .id(cId.getChangeId()); + ChangeApi orig = gApi.changes().id(cId.getChangeId()); ChangeApi cherry = orig.current().cherryPick(cpi); cherry.current().review(ReviewInput.approve()); cherry.current().submit(); @@ -264,8 +274,7 @@ public class CreateChangeIT extends AbstractDaemonTest { ObjectId remoteId = getRemoteHead(); assertThat(remoteId).isNotEqualTo(commitId); - ChangeInput in = - newMergeChangeInput("master", commitId.getName(), ""); + ChangeInput in = newMergeChangeInput("master", commitId.getName(), ""); assertCreateSucceeds(in); } @@ -293,8 +302,8 @@ public class CreateChangeIT extends AbstractDaemonTest { return out; } - private void assertCreateFails(ChangeInput in, - Class errType, String errSubstring) + private void assertCreateFails( + ChangeInput in, Class errType, String errSubstring) throws Exception { exception.expect(errType); exception.expectMessage(errSubstring); @@ -310,23 +319,19 @@ public class CreateChangeIT extends AbstractDaemonTest { // TODO(davido): Expose setting of account preferences in the API private void setSignedOffByFooter() throws Exception { - RestResponse r = adminRestSession.get("/accounts/" + admin.email - + "/preferences"); + RestResponse r = adminRestSession.get("/accounts/" + admin.email + "/preferences"); r.assertOK(); - GeneralPreferencesInfo i = - newGson().fromJson(r.getReader(), GeneralPreferencesInfo.class); + GeneralPreferencesInfo i = newGson().fromJson(r.getReader(), GeneralPreferencesInfo.class); i.signedOffBy = true; r = adminRestSession.put("/accounts/" + admin.email + "/preferences", i); r.assertOK(); - GeneralPreferencesInfo o = newGson().fromJson(r.getReader(), - GeneralPreferencesInfo.class); + GeneralPreferencesInfo o = newGson().fromJson(r.getReader(), GeneralPreferencesInfo.class); assertThat(o.signedOffBy).isTrue(); } - private ChangeInput newMergeChangeInput(String targetBranch, String sourceRef, - String strategy) { + private ChangeInput newMergeChangeInput(String targetBranch, String sourceRef, String strategy) { // create a merge change from branchA to master in gerrit ChangeInput in = new ChangeInput(); in.project = project.get(); @@ -342,13 +347,13 @@ public class CreateChangeIT extends AbstractDaemonTest { return in; } - private void changeInTwoBranches(String branchA, String fileA, String branchB, - String fileB) throws Exception { + private void changeInTwoBranches(String branchA, String fileA, String branchB, String fileB) + throws Exception { // create a initial commit in master - Result initialCommit = pushFactory - .create(db, user.getIdent(), testRepo, "initial commit", "readme.txt", - "initial commit") - .to("refs/heads/master"); + Result initialCommit = + pushFactory + .create(db, user.getIdent(), testRepo, "initial commit", "readme.txt", "initial commit") + .to("refs/heads/master"); initialCommit.assertOkStatus(); // create two new branches @@ -356,14 +361,15 @@ public class CreateChangeIT extends AbstractDaemonTest { createBranch(new Branch.NameKey(project, branchB)); // create a commit in branchA - Result changeA = pushFactory - .create(db, user.getIdent(), testRepo, "change A", fileA, "A content") - .to("refs/heads/" + branchA); + Result changeA = + pushFactory + .create(db, user.getIdent(), testRepo, "change A", fileA, "A content") + .to("refs/heads/" + branchA); changeA.assertOkStatus(); // create a commit in branchB - PushOneCommit commitB = pushFactory - .create(db, user.getIdent(), testRepo, "change B", fileB, "B content"); + PushOneCommit commitB = + pushFactory.create(db, user.getIdent(), testRepo, "change B", fileB, "B content"); commitB.setParent(initialCommit.getCommit()); Result changeB = commitB.to("refs/heads/" + branchB); changeB.assertOkStatus(); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/DeleteDraftPatchSetIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/DeleteDraftPatchSetIT.java index 2474d683fc..244efbf820 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/DeleteDraftPatchSetIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/DeleteDraftPatchSetIT.java @@ -39,20 +39,17 @@ import com.google.gerrit.reviewdb.client.RefNames; import com.google.gerrit.server.config.AllUsersName; import com.google.gerrit.server.query.change.ChangeData; import com.google.inject.Inject; - +import java.util.HashMap; import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; import org.junit.Test; -import java.util.HashMap; - @NoHttpd public class DeleteDraftPatchSetIT extends AbstractDaemonTest { - @Inject - private AllUsersName allUsers; + @Inject private AllUsersName allUsers; @Test public void deletePatchSetNotDraft() throws Exception { @@ -145,8 +142,7 @@ public class DeleteDraftPatchSetIT extends AbstractDaemonTest { cd = getChange(changeId); assertThat(cd.patchSets()).hasSize(1); - assertThat(Iterables.getOnlyElement(cd.patchSets()).getId().get()) - .isEqualTo(2); + assertThat(Iterables.getOnlyElement(cd.patchSets()).getId().get()).isEqualTo(2); // Other entities based on deleted patch sets are also deleted. for (ChangeMessage m : cd.messages()) { @@ -180,8 +176,7 @@ public class DeleteDraftPatchSetIT extends AbstractDaemonTest { cd = getChange(changeId); assertThat(cd.patchSets()).hasSize(1); - assertThat(Iterables.getOnlyElement(cd.patchSets()).getId().get()) - .isEqualTo(1); + assertThat(Iterables.getOnlyElement(cd.patchSets()).getId().get()).isEqualTo(1); // Other entities based on deleted patch sets are also deleted. for (ChangeMessage m : cd.messages()) { @@ -197,50 +192,34 @@ public class DeleteDraftPatchSetIT extends AbstractDaemonTest { String ref = "refs/drafts/master"; // Clone repository - TestRepository testRepo = - cloneProject(project, admin); + TestRepository testRepo = cloneProject(project, admin); // Create change - PushOneCommit push = pushFactory.create( - db, admin.getIdent(), testRepo); + PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo); PushOneCommit.Result r1 = push.to(ref); r1.assertOkStatus(); String revPs1 = r1.getChange().currentPatchSet().getRevision().get(); // Push draft patch set - PushOneCommit.Result r2 = amendChange( - r1.getChangeId(), ref, admin, testRepo); + PushOneCommit.Result r2 = amendChange(r1.getChangeId(), ref, admin, testRepo); r2.assertOkStatus(); String revPs2 = r2.getChange().currentPatchSet().getRevision().get(); - assertThat( - gApi.changes() - .id(r1.getChange().getId().get()).get() - .currentRevision) + assertThat(gApi.changes().id(r1.getChange().getId().get()).get().currentRevision) .isEqualTo(revPs2); // Remove draft patch set - gApi.changes() - .id(r1.getChange().getId().get()) - .revision(revPs2) - .delete(); + gApi.changes().id(r1.getChange().getId().get()).revision(revPs2).delete(); - assertThat( - gApi.changes() - .id(r1.getChange().getId().get()).get() - .currentRevision) + assertThat(gApi.changes().id(r1.getChange().getId().get()).get().currentRevision) .isEqualTo(revPs1); // Push new draft patch set - PushOneCommit.Result r3 = amendChange( - r1.getChangeId(), ref, admin, testRepo); + PushOneCommit.Result r3 = amendChange(r1.getChangeId(), ref, admin, testRepo); r3.assertOkStatus(); String revPs3 = r2.getChange().currentPatchSet().getRevision().get(); - assertThat( - gApi.changes() - .id(r1.getChange().getId().get()).get() - .currentRevision) + assertThat(gApi.changes().id(r1.getChange().getId().get()).get().currentRevision) .isEqualTo(revPs3); // Check that all patch sets have different SHA1s @@ -248,8 +227,7 @@ public class DeleteDraftPatchSetIT extends AbstractDaemonTest { assertThat(revPs2).doesNotMatch(revPs3); } - private Ref getDraftRef(TestAccount account, Change.Id changeId) - throws Exception { + private Ref getDraftRef(TestAccount account, Change.Id changeId) throws Exception { try (Repository repo = repoManager.openRepository(allUsers)) { return repo.exactRef(RefNames.refsDraftComments(changeId, account.id)); } @@ -264,8 +242,15 @@ public class DeleteDraftPatchSetIT extends AbstractDaemonTest { private String createDraftChangeWith2PS() throws Exception { PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo); Result result = push.to("refs/drafts/master"); - push = pushFactory.create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, - "b.txt", "4711", result.getChangeId()); + push = + pushFactory.create( + db, + admin.getIdent(), + testRepo, + PushOneCommit.SUBJECT, + "b.txt", + "4711", + result.getChangeId()); return push.to("refs/drafts/master").getChangeId(); } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/DeleteVoteIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/DeleteVoteIT.java index fb25da1aa0..d524f2a7ee 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/DeleteVoteIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/DeleteVoteIT.java @@ -29,12 +29,10 @@ import com.google.gerrit.extensions.common.ChangeMessageInfo; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.testutil.FakeEmailSender; import com.google.gson.reflect.TypeToken; - -import org.junit.Test; - import java.util.Collection; import java.util.List; import java.util.Map; +import org.junit.Test; public class DeleteVoteIT extends AbstractDaemonTest { @Test @@ -49,10 +47,7 @@ public class DeleteVoteIT extends AbstractDaemonTest { private void deleteVote(boolean onRevisionLevel) throws Exception { PushOneCommit.Result r = createChange(); - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .review(ReviewInput.approve()); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve()); PushOneCommit.Result r2 = amendChange(r.getChangeId()); @@ -60,10 +55,13 @@ public class DeleteVoteIT extends AbstractDaemonTest { recommend(r.getChangeId()); sender.clear(); - String endPoint = "/changes/" + r.getChangeId() - + (onRevisionLevel ? ("/revisions/" + r2.getCommit().getName()) : "") - + "/reviewers/" + user.getId().toString() - + "/votes/Code-Review"; + String endPoint = + "/changes/" + + r.getChangeId() + + (onRevisionLevel ? ("/revisions/" + r2.getCommit().getName()) : "") + + "/reviewers/" + + user.getId().toString() + + "/votes/Code-Review"; RestResponse response = adminRestSession.delete(endPoint); response.assertNoContent(); @@ -72,35 +70,33 @@ public class DeleteVoteIT extends AbstractDaemonTest { assertThat(messages).hasSize(1); FakeEmailSender.Message msg = messages.get(0); assertThat(msg.rcpt()).containsExactly(user.emailAddress); - assertThat(msg.body()).contains( - admin.fullName + " has removed a vote on this change.\n"); - assertThat(msg.body()).contains("Removed Code-Review+1 by " - + user.fullName + " <" + user.email + ">" + "\n"); + assertThat(msg.body()).contains(admin.fullName + " has removed a vote on this change.\n"); + assertThat(msg.body()) + .contains("Removed Code-Review+1 by " + user.fullName + " <" + user.email + ">" + "\n"); - endPoint = "/changes/" + r.getChangeId() - + (onRevisionLevel ? ("/revisions/" + r2.getCommit().getName()) : "") - + "/reviewers/" + user.getId().toString() - + "/votes"; + endPoint = + "/changes/" + + r.getChangeId() + + (onRevisionLevel ? ("/revisions/" + r2.getCommit().getName()) : "") + + "/reviewers/" + + user.getId().toString() + + "/votes"; response = adminRestSession.get(endPoint); response.assertOK(); - Map m = newGson().fromJson(response.getReader(), - new TypeToken>() {}.getType()); + Map m = + newGson().fromJson(response.getReader(), new TypeToken>() {}.getType()); - assertThat(m).containsExactly("Code-Review", Short.valueOf((short)0)); + assertThat(m).containsExactly("Code-Review", Short.valueOf((short) 0)); - ChangeInfo c = gApi.changes() - .id(r.getChangeId()) - .get(); + ChangeInfo c = gApi.changes().id(r.getChangeId()).get(); ChangeMessageInfo message = Iterables.getLast(c.messages); assertThat(message.author._accountId).isEqualTo(admin.getId().get()); - assertThat(message.message).isEqualTo( - "Removed Code-Review+1 by User \n"); + assertThat(message.message).isEqualTo("Removed Code-Review+1 by User \n"); assertThat(getReviewers(c.reviewers.get(REVIEWER))) - .containsExactlyElementsIn( - ImmutableSet.of(admin.getId(), user.getId())); + .containsExactlyElementsIn(ImmutableSet.of(admin.getId(), user.getId())); } private Iterable getReviewers(Collection r) { diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/DraftChangeIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/DraftChangeIT.java index eb6e4339be..1b0d0237c8 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/DraftChangeIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/DraftChangeIT.java @@ -43,14 +43,12 @@ import com.google.gerrit.server.git.BatchUpdate; import com.google.gerrit.server.notedb.PatchSetState; import com.google.gerrit.testutil.ConfigSuite; import com.google.inject.Inject; - -import org.eclipse.jgit.lib.Config; -import org.junit.Test; - import java.util.Collection; import java.util.EnumSet; import java.util.List; import java.util.stream.Collectors; +import org.eclipse.jgit.lib.Config; +import org.junit.Test; public class DraftChangeIT extends AbstractDaemonTest { @ConfigSuite.Config @@ -58,8 +56,7 @@ public class DraftChangeIT extends AbstractDaemonTest { return allowDraftsDisabledConfig(); } - @Inject - private BatchUpdate.Factory updateFactory; + @Inject private BatchUpdate.Factory updateFactory; @Test public void deleteDraftChange() throws Exception { @@ -86,31 +83,24 @@ public class DraftChangeIT extends AbstractDaemonTest { Change.Id id = changeResult.getChange().getId(); // The user needs to be able to see the draft change (which reviewers can). - gApi.changes() - .id(changeId) - .addReviewer(user.fullName); + gApi.changes().id(changeId).addReviewer(user.fullName); setApiUser(user); exception.expect(AuthException.class); - exception.expectMessage(String.format( - "Deleting change %s is not permitted", id)); - gApi.changes() - .id(changeId) - .delete(); + exception.expectMessage(String.format("Deleting change %s is not permitted", id)); + gApi.changes().id(changeId).delete(); } @Test @TestProjectInput(cloneAs = "user") - public void deleteDraftChangeWhenDraftsNotAllowedAsNormalUser() - throws Exception { + public void deleteDraftChangeWhenDraftsNotAllowedAsNormalUser() throws Exception { assume().that(isAllowDrafts()).isFalse(); setApiUser(user); // We can't create a draft change while the draft workflow is disabled. // For this reason, we create a normal change and modify the database. PushOneCommit.Result changeResult = - pushFactory.create(db, user.getIdent(), testRepo) - .to("refs/for/master"); + pushFactory.create(db, user.getIdent(), testRepo).to("refs/for/master"); Change.Id id = changeResult.getChange().getId(); markChangeAsDraft(id); setDraftStatusOfPatchSetsOfChange(id, true); @@ -118,9 +108,7 @@ public class DraftChangeIT extends AbstractDaemonTest { String changeId = changeResult.getChangeId(); exception.expect(MethodNotAllowedException.class); exception.expectMessage("Draft workflow is disabled"); - gApi.changes() - .id(changeId) - .delete(); + gApi.changes().id(changeId).delete(); } @Test @@ -132,8 +120,7 @@ public class DraftChangeIT extends AbstractDaemonTest { // We can't create a draft change while the draft workflow is disabled. // For this reason, we create a normal change and modify the database. PushOneCommit.Result changeResult = - pushFactory.create(db, user.getIdent(), testRepo) - .to("refs/for/master"); + pushFactory.create(db, user.getIdent(), testRepo).to("refs/for/master"); Change.Id id = changeResult.getChange().getId(); markChangeAsDraft(id); setDraftStatusOfPatchSetsOfChange(id, true); @@ -146,9 +133,7 @@ public class DraftChangeIT extends AbstractDaemonTest { try { setApiUser(admin); - gApi.changes() - .id(changeId) - .delete(); + gApi.changes().id(changeId).delete(); } finally { removePermission(Permission.DELETE_DRAFTS, project, "refs/*"); removePermission(Permission.VIEW_DRAFTS, project, "refs/*"); @@ -168,11 +153,9 @@ public class DraftChangeIT extends AbstractDaemonTest { String changeId = changeResult.getChangeId(); exception.expect(ResourceConflictException.class); - exception.expectMessage(String.format( - "Cannot delete draft change %s: patch set 1 is not a draft", id)); - gApi.changes() - .id(changeId) - .delete(); + exception.expectMessage( + String.format("Cannot delete draft change %s: patch set 1 is not a draft", id)); + gApi.changes().id(changeId).delete(); } @Test @@ -243,8 +226,7 @@ public class DraftChangeIT extends AbstractDaemonTest { assertThat(label.all.get(0).value).isEqualTo(1); } - private static RestResponse deleteChange(String changeId, - RestSession s) throws Exception { + private static RestResponse deleteChange(String changeId, RestSession s) throws Exception { return s.delete("/changes/" + changeId); } @@ -253,59 +235,52 @@ public class DraftChangeIT extends AbstractDaemonTest { } private RestResponse publishPatchSet(String changeId) throws Exception { - PatchSet patchSet = Iterables.getOnlyElement( - queryProvider.get().byKeyPrefix(changeId)).currentPatchSet(); - return adminRestSession.post("/changes/" - + changeId - + "/revisions/" - + patchSet.getRevision().get() - + "/publish"); + PatchSet patchSet = + Iterables.getOnlyElement(queryProvider.get().byKeyPrefix(changeId)).currentPatchSet(); + return adminRestSession.post( + "/changes/" + changeId + "/revisions/" + patchSet.getRevision().get() + "/publish"); } private void markChangeAsDraft(Change.Id id) throws Exception { - try (BatchUpdate batchUpdate = updateFactory - .create(db, project, atrScope.get().getUser(), TimeUtil.nowTs())) { + try (BatchUpdate batchUpdate = + updateFactory.create(db, project, atrScope.get().getUser(), TimeUtil.nowTs())) { batchUpdate.addOp(id, new MarkChangeAsDraftUpdateOp()); batchUpdate.execute(); } - ChangeStatus changeStatus = gApi.changes() - .id(id.get()) - .get() - .status; + ChangeStatus changeStatus = gApi.changes().id(id.get()).get().status; assertThat(changeStatus).isEqualTo(ChangeStatus.DRAFT); } - private void setDraftStatusOfPatchSetsOfChange(Change.Id id, - boolean draftStatus) throws Exception { - try (BatchUpdate batchUpdate = updateFactory - .create(db, project, atrScope.get().getUser(), TimeUtil.nowTs())) { + private void setDraftStatusOfPatchSetsOfChange(Change.Id id, boolean draftStatus) + throws Exception { + try (BatchUpdate batchUpdate = + updateFactory.create(db, project, atrScope.get().getUser(), TimeUtil.nowTs())) { batchUpdate.addOp(id, new DraftStatusOfPatchSetsUpdateOp(draftStatus)); batchUpdate.execute(); } Boolean expectedDraftStatus = draftStatus ? Boolean.TRUE : null; List patchSetDraftStatuses = getPatchSetDraftStatuses(id); - patchSetDraftStatuses.forEach(status -> - assertThat(status).isEqualTo(expectedDraftStatus)); + patchSetDraftStatuses.forEach(status -> assertThat(status).isEqualTo(expectedDraftStatus)); } - private List getPatchSetDraftStatuses(Change.Id id) - throws Exception { - Collection revisionInfos = gApi.changes() - .id(id.get()) - .get(EnumSet.of(ListChangesOption.ALL_REVISIONS)) - .revisions - .values(); - return revisionInfos.stream() + private List getPatchSetDraftStatuses(Change.Id id) throws Exception { + Collection revisionInfos = + gApi.changes() + .id(id.get()) + .get(EnumSet.of(ListChangesOption.ALL_REVISIONS)) + .revisions + .values(); + return revisionInfos + .stream() .map(revisionInfo -> revisionInfo.draft) .collect(Collectors.toList()); } private class MarkChangeAsDraftUpdateOp extends BatchUpdate.Op { @Override - public boolean updateChange(BatchUpdate.ChangeContext ctx) - throws Exception { + public boolean updateChange(BatchUpdate.ChangeContext ctx) throws Exception { Change change = ctx.getChange(); // Change status in database. @@ -327,8 +302,7 @@ public class DraftChangeIT extends AbstractDaemonTest { } @Override - public boolean updateChange(BatchUpdate.ChangeContext ctx) - throws Exception { + public boolean updateChange(BatchUpdate.ChangeContext ctx) throws Exception { Collection patchSets = psUtil.byChange(db, ctx.getNotes()); // Change status in database. @@ -336,13 +310,12 @@ public class DraftChangeIT extends AbstractDaemonTest { db.patchSets().update(patchSets); // Change status in NoteDb. - PatchSetState patchSetState = draftStatus ? PatchSetState.DRAFT - : PatchSetState.PUBLISHED; - patchSets.stream() + PatchSetState patchSetState = draftStatus ? PatchSetState.DRAFT : PatchSetState.PUBLISHED; + patchSets + .stream() .map(PatchSet::getId) .map(ctx::getUpdate) - .forEach(changeUpdate -> - changeUpdate.setPatchSetState(patchSetState)); + .forEach(changeUpdate -> changeUpdate.setPatchSetState(patchSetState)); return true; } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/HashtagsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/HashtagsIT.java index 9997ee6845..f522e41a1f 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/HashtagsIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/HashtagsIT.java @@ -28,7 +28,6 @@ import com.google.gerrit.acceptance.PushOneCommit; import com.google.gerrit.extensions.api.changes.HashtagsInput; import com.google.gerrit.extensions.common.ChangeMessageInfo; import com.google.gerrit.testutil.TestTimeUtil; - import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; @@ -245,48 +244,37 @@ public class HashtagsIT extends AbstractDaemonTest { assertMessage(r, "Hashtag added: MyHashtag"); } - private IterableSubject assertThatGet(PushOneCommit.Result r) - throws Exception { - return assertThat(gApi.changes() - .id(r.getChange().getId().get()) - .getHashtags()); + private IterableSubject assertThatGet(PushOneCommit.Result r) throws Exception { + return assertThat(gApi.changes().id(r.getChange().getId().get()).getHashtags()); } - private void addHashtags(PushOneCommit.Result r, String... toAdd) - throws Exception { + private void addHashtags(PushOneCommit.Result r, String... toAdd) throws Exception { HashtagsInput input = new HashtagsInput(); input.add = Sets.newHashSet(toAdd); - gApi.changes() - .id(r.getChange().getId().get()) - .setHashtags(input); + gApi.changes().id(r.getChange().getId().get()).setHashtags(input); } - private void removeHashtags(PushOneCommit.Result r, String... toRemove) - throws Exception { + private void removeHashtags(PushOneCommit.Result r, String... toRemove) throws Exception { HashtagsInput input = new HashtagsInput(); input.remove = Sets.newHashSet(toRemove); - gApi.changes() - .id(r.getChange().getId().get()) - .setHashtags(input); + gApi.changes().id(r.getChange().getId().get()).setHashtags(input); } - private void assertMessage(PushOneCommit.Result r, String expectedMessage) - throws Exception { + private void assertMessage(PushOneCommit.Result r, String expectedMessage) throws Exception { assertThat(getLastMessage(r).message).isEqualTo(expectedMessage); } - private void assertNoNewMessageSince(PushOneCommit.Result r, - ChangeMessageInfo expected) throws Exception { + private void assertNoNewMessageSince(PushOneCommit.Result r, ChangeMessageInfo expected) + throws Exception { checkNotNull(expected); ChangeMessageInfo last = getLastMessage(r); assertThat(last.message).isEqualTo(expected.message); assertThat(last.id).isEqualTo(expected.id); } - private ChangeMessageInfo getLastMessage(PushOneCommit.Result r) - throws Exception { - ChangeMessageInfo lastMessage = Iterables.getLast( - gApi.changes().id(r.getChange().getId().get()).get().messages, null); + private ChangeMessageInfo getLastMessage(PushOneCommit.Result r) throws Exception { + ChangeMessageInfo lastMessage = + Iterables.getLast(gApi.changes().id(r.getChange().getId().get()).get().messages, null); assertThat(lastMessage).named(lastMessage.message).isNotNull(); return lastMessage; } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/IndexChangeIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/IndexChangeIT.java index 9dba788b76..822841cb65 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/IndexChangeIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/IndexChangeIT.java @@ -15,24 +15,19 @@ package com.google.gerrit.acceptance.rest.change; import com.google.gerrit.acceptance.AbstractDaemonTest; - import org.junit.Test; public class IndexChangeIT extends AbstractDaemonTest { @Test public void indexChange() throws Exception { String changeId = createChange().getChangeId(); - adminRestSession - .post("/changes/" + changeId + "/index/") - .assertNoContent(); + adminRestSession.post("/changes/" + changeId + "/index/").assertNoContent(); } @Test public void indexChangeOnNonVisibleBranch() throws Exception { String changeId = createChange().getChangeId(); blockRead("refs/heads/master"); - userRestSession - .post("/changes/" + changeId + "/index/") - .assertNotFound(); + userRestSession.post("/changes/" + changeId + "/index/").assertNotFound(); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ListChangesOptionsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ListChangesOptionsIT.java index b0d34f08d0..174280d3e3 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ListChangesOptionsIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ListChangesOptionsIT.java @@ -24,12 +24,10 @@ import com.google.gerrit.acceptance.AbstractDaemonTest; import com.google.gerrit.acceptance.NoHttpd; import com.google.gerrit.acceptance.PushOneCommit; import com.google.gerrit.extensions.common.ChangeInfo; - -import org.junit.Before; -import org.junit.Test; - import java.util.ArrayList; import java.util.List; +import org.junit.Before; +import org.junit.Test; @NoHttpd public class ListChangesOptionsIT extends AbstractDaemonTest { @@ -46,12 +44,12 @@ public class ListChangesOptionsIT extends AbstractDaemonTest { results.add(push("new contents 2", changeId)); } - private PushOneCommit.Result push(String content, String baseChangeId) - throws Exception { + private PushOneCommit.Result push(String content, String baseChangeId) throws Exception { String subject = "Change subject"; String fileName = "a.txt"; - PushOneCommit push = pushFactory.create( - db, admin.getIdent(), testRepo, subject, fileName, content, baseChangeId); + PushOneCommit push = + pushFactory.create( + db, admin.getIdent(), testRepo, subject, fileName, content, baseChangeId); PushOneCommit.Result r = push.to("refs/for/master"); r.assertOkStatus(); return r; @@ -68,8 +66,7 @@ public class ListChangesOptionsIT extends AbstractDaemonTest { public void currentRevision() throws Exception { ChangeInfo c = get(changeId, CURRENT_REVISION); assertThat(c.currentRevision).isEqualTo(commitId(2)); - assertThat(c.revisions.keySet()).containsAllIn( - ImmutableSet.of(commitId(2))); + assertThat(c.revisions.keySet()).containsAllIn(ImmutableSet.of(commitId(2))); assertThat(c.revisions.get(commitId(2))._number).isEqualTo(3); } @@ -78,8 +75,7 @@ public class ListChangesOptionsIT extends AbstractDaemonTest { ChangeInfo c = get(changeId, CURRENT_REVISION, MESSAGES); assertThat(c.revisions).hasSize(1); assertThat(c.currentRevision).isEqualTo(commitId(2)); - assertThat(c.revisions.keySet()).containsAllIn( - ImmutableSet.of(commitId(2))); + assertThat(c.revisions.keySet()).containsAllIn(ImmutableSet.of(commitId(2))); assertThat(c.revisions.get(commitId(2))._number).isEqualTo(3); } @@ -87,8 +83,8 @@ public class ListChangesOptionsIT extends AbstractDaemonTest { public void allRevisions() throws Exception { ChangeInfo c = get(changeId, ALL_REVISIONS); assertThat(c.currentRevision).isEqualTo(commitId(2)); - assertThat(c.revisions.keySet()).containsAllIn( - ImmutableSet.of(commitId(0), commitId(1), commitId(2))); + assertThat(c.revisions.keySet()) + .containsAllIn(ImmutableSet.of(commitId(0), commitId(1), commitId(2))); assertThat(c.revisions.get(commitId(0))._number).isEqualTo(1); assertThat(c.revisions.get(commitId(1))._number).isEqualTo(2); assertThat(c.revisions.get(commitId(2))._number).isEqualTo(3); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/MoveChangeIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/MoveChangeIT.java index 19563b8d11..36f8452f20 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/MoveChangeIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/MoveChangeIT.java @@ -34,7 +34,6 @@ import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gerrit.reviewdb.client.Branch; import com.google.gerrit.server.git.ProjectConfig; import com.google.gerrit.server.project.Util; - import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.revwalk.RevCommit; @@ -46,8 +45,7 @@ public class MoveChangeIT extends AbstractDaemonTest { public void moveChangeWithShortRef() throws Exception { // Move change to a different branch using short ref name PushOneCommit.Result r = createChange(); - Branch.NameKey newBranch = - new Branch.NameKey(r.getChange().change().getProject(), "moveTest"); + Branch.NameKey newBranch = new Branch.NameKey(r.getChange().change().getProject(), "moveTest"); createBranch(newBranch); move(r.getChangeId(), newBranch.getShortName()); assertThat(r.getChange().change().getDest()).isEqualTo(newBranch); @@ -57,8 +55,7 @@ public class MoveChangeIT extends AbstractDaemonTest { public void moveChangeWithFullRef() throws Exception { // Move change to a different branch using full ref name PushOneCommit.Result r = createChange(); - Branch.NameKey newBranch = - new Branch.NameKey(r.getChange().change().getProject(), "moveTest"); + Branch.NameKey newBranch = new Branch.NameKey(r.getChange().change().getProject(), "moveTest"); createBranch(newBranch); move(r.getChangeId(), newBranch.get()); assertThat(r.getChange().change().getDest()).isEqualTo(newBranch); @@ -68,8 +65,7 @@ public class MoveChangeIT extends AbstractDaemonTest { public void moveChangeWithMessage() throws Exception { // Provide a message using --message flag PushOneCommit.Result r = createChange(); - Branch.NameKey newBranch = - new Branch.NameKey(r.getChange().change().getProject(), "moveTest"); + Branch.NameKey newBranch = new Branch.NameKey(r.getChange().change().getProject(), "moveTest"); createBranch(newBranch); String moveMessage = "Moving for the move test"; move(r.getChangeId(), newBranch.get(), moveMessage); @@ -78,8 +74,7 @@ public class MoveChangeIT extends AbstractDaemonTest { expectedMessage.append("Change destination moved from master to moveTest"); expectedMessage.append("\n\n"); expectedMessage.append(moveMessage); - assertThat(r.getChange().messages().get(1).getMessage()) - .isEqualTo(expectedMessage.toString()); + assertThat(r.getChange().messages().get(1).getMessage()).isEqualTo(expectedMessage.toString()); } @Test @@ -95,14 +90,16 @@ public class MoveChangeIT extends AbstractDaemonTest { public void moveChangeToSameChangeId() throws Exception { // Move change to a branch with existing change with same change ID PushOneCommit.Result r = createChange(); - Branch.NameKey newBranch = - new Branch.NameKey(r.getChange().change().getProject(), "moveTest"); + Branch.NameKey newBranch = new Branch.NameKey(r.getChange().change().getProject(), "moveTest"); createBranch(newBranch); int changeNum = r.getChange().change().getChangeId(); createChange(newBranch.get(), r.getChangeId()); exception.expect(ResourceConflictException.class); - exception.expectMessage("Destination " + newBranch.getShortName() - + " has a different change with same change key " + r.getChangeId()); + exception.expectMessage( + "Destination " + + newBranch.getShortName() + + " has a different change with same change key " + + r.getChangeId()); move(changeNum, newBranch.get()); } @@ -110,11 +107,10 @@ public class MoveChangeIT extends AbstractDaemonTest { public void moveChangeToNonExistentRef() throws Exception { // Move change to a non-existing branch PushOneCommit.Result r = createChange(); - Branch.NameKey newBranch = new Branch.NameKey( - r.getChange().change().getProject(), "does_not_exist"); + Branch.NameKey newBranch = + new Branch.NameKey(r.getChange().change().getProject(), "does_not_exist"); exception.expect(ResourceConflictException.class); - exception.expectMessage("Destination " + newBranch.get() - + " not found in the project"); + exception.expectMessage("Destination " + newBranch.get() + " not found in the project"); move(r.getChangeId(), newBranch.get()); } @@ -122,8 +118,7 @@ public class MoveChangeIT extends AbstractDaemonTest { public void moveClosedChange() throws Exception { // Move a change which is not open PushOneCommit.Result r = createChange(); - Branch.NameKey newBranch = - new Branch.NameKey(r.getChange().change().getProject(), "moveTest"); + Branch.NameKey newBranch = new Branch.NameKey(r.getChange().change().getProject(), "moveTest"); createBranch(newBranch); merge(r); exception.expect(ResourceConflictException.class); @@ -140,17 +135,16 @@ public class MoveChangeIT extends AbstractDaemonTest { TestRepository.CommitBuilder commitBuilder = testRepo.branch("HEAD").commit().insertChangeId(); commitBuilder - .parent(r1.getCommit()) - .parent(r2.getCommit()) - .message("Move change Merge Commit") - .author(admin.getIdent()) - .committer(new PersonIdent(admin.getIdent(), testRepo.getDate())); + .parent(r1.getCommit()) + .parent(r2.getCommit()) + .message("Move change Merge Commit") + .author(admin.getIdent()) + .committer(new PersonIdent(admin.getIdent(), testRepo.getDate())); RevCommit c = commitBuilder.create(); pushHead(testRepo, "refs/for/master", false, false); // Try to move the merge commit to another branch - Branch.NameKey newBranch = - new Branch.NameKey(r1.getChange().change().getProject(), "moveTest"); + Branch.NameKey newBranch = new Branch.NameKey(r1.getChange().change().getProject(), "moveTest"); createBranch(newBranch); exception.expect(ResourceConflictException.class); exception.expectMessage("Merge commit cannot be moved"); @@ -164,7 +158,8 @@ public class MoveChangeIT extends AbstractDaemonTest { Branch.NameKey newBranch = new Branch.NameKey(r.getChange().change().getProject(), "blocked_branch"); createBranch(newBranch); - block(Permission.PUSH, + block( + Permission.PUSH, systemGroupBackend.getGroup(REGISTERED_USERS).getUUID(), "refs/for/" + newBranch.get()); exception.expect(AuthException.class); @@ -176,10 +171,10 @@ public class MoveChangeIT extends AbstractDaemonTest { public void moveChangeFromBranchWithoutAbandonPerms() throws Exception { // Move change for which user does not have abandon permissions PushOneCommit.Result r = createChange(); - Branch.NameKey newBranch = - new Branch.NameKey(r.getChange().change().getProject(), "moveTest"); + Branch.NameKey newBranch = new Branch.NameKey(r.getChange().change().getProject(), "moveTest"); createBranch(newBranch); - block(Permission.ABANDON, + block( + Permission.ABANDON, systemGroupBackend.getGroup(REGISTERED_USERS).getUUID(), r.getChange().change().getDest().get()); setApiUser(user); @@ -198,20 +193,15 @@ public class MoveChangeIT extends AbstractDaemonTest { int changeNum = r.getChange().change().getChangeId(); // Create a branch with that same commit - Branch.NameKey newBranch = - new Branch.NameKey(r.getChange().change().getProject(), "moveTest"); + Branch.NameKey newBranch = new Branch.NameKey(r.getChange().change().getProject(), "moveTest"); BranchInput bi = new BranchInput(); bi.revision = r.getCommit().name(); - gApi.projects() - .name(newBranch.getParentKey().get()) - .branch(newBranch.get()) - .create(bi); + gApi.projects().name(newBranch.getParentKey().get()).branch(newBranch.get()).create(bi); // Try to move the change to the branch with the same commit exception.expect(ResourceConflictException.class); - exception - .expectMessage("Current patchset revision is reachable from tip of " - + newBranch.get()); + exception.expectMessage( + "Current patchset revision is reachable from tip of " + newBranch.get()); move(changeNum, newBranch.get()); } @@ -219,17 +209,15 @@ public class MoveChangeIT extends AbstractDaemonTest { public void moveChangeWithCurrentPatchSetLocked() throws Exception { // Move change that is locked PushOneCommit.Result r = createChange(); - Branch.NameKey newBranch = - new Branch.NameKey(r.getChange().change().getProject(), "moveTest"); + Branch.NameKey newBranch = new Branch.NameKey(r.getChange().change().getProject(), "moveTest"); createBranch(newBranch); ProjectConfig cfg = projectCache.checkedGet(project).getConfig(); LabelType patchSetLock = Util.patchSetLock(); cfg.getLabelSections().put(patchSetLock.getName(), patchSetLock); - AccountGroup.UUID registeredUsers = - systemGroupBackend.getGroup(REGISTERED_USERS).getUUID(); - Util.allow(cfg, Permission.forLabel(patchSetLock.getName()), 0, 1, registeredUsers, - "refs/heads/*"); + AccountGroup.UUID registeredUsers = systemGroupBackend.getGroup(REGISTERED_USERS).getUUID(); + Util.allow( + cfg, Permission.forLabel(patchSetLock.getName()), 0, 1, registeredUsers, "refs/heads/*"); saveProjectConfig(cfg); grant(Permission.LABEL + "Patch-Set-Lock", project, "refs/heads/*"); revision(r).review(new ReviewInput().label("Patch-Set-Lock", 1)); @@ -239,28 +227,23 @@ public class MoveChangeIT extends AbstractDaemonTest { move(r.getChangeId(), newBranch.get()); } - private void move(int changeNum, String destination) - throws RestApiException { + private void move(int changeNum, String destination) throws RestApiException { gApi.changes().id(changeNum).move(destination); } - private void move(String changeId, String destination) - throws RestApiException { + private void move(String changeId, String destination) throws RestApiException { gApi.changes().id(changeId).move(destination); } - private void move(String changeId, String destination, String message) - throws RestApiException { + private void move(String changeId, String destination, String message) throws RestApiException { MoveInput in = new MoveInput(); in.destinationBranch = destination; in.message = message; gApi.changes().id(changeId).move(in); } - private PushOneCommit.Result createChange(String branch, String changeId) - throws Exception { - PushOneCommit push = - pushFactory.create(db, admin.getIdent(), testRepo, changeId); + private PushOneCommit.Result createChange(String branch, String changeId) throws Exception { + PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo, changeId); PushOneCommit.Result result = push.to("refs/for/" + branch); result.assertOkStatus(); return result; diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByCherryPickIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByCherryPickIT.java index 0a3b217ec2..26a91aab6c 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByCherryPickIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByCherryPickIT.java @@ -36,18 +36,15 @@ import com.google.gerrit.server.change.Submit.TestSubmitInput; import com.google.gerrit.server.git.ChangeMessageModifier; import com.google.gerrit.server.git.strategy.CommitMergeStatus; import com.google.inject.Inject; - +import java.util.List; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; import org.junit.Test; -import java.util.List; - public class SubmitByCherryPickIT extends AbstractSubmit { - @Inject - private DynamicSet changeMessageModifiers; + @Inject private DynamicSet changeMessageModifiers; @Override protected SubmitType getSubmitType() { @@ -61,8 +58,7 @@ public class SubmitByCherryPickIT extends AbstractSubmit { submit(change.getChangeId()); assertCherryPick(testRepo, false); RevCommit newHead = getRemoteHead(); - assertThat(newHead.getParent(0)) - .isEqualTo(change.getCommit().getParent(0)); + assertThat(newHead.getParent(0)).isEqualTo(change.getCommit().getParent(0)); assertRefUpdatedEvents(initialHead, newHead); assertChangeMergedEvents(change.getChangeId(), newHead.name()); @@ -71,14 +67,12 @@ public class SubmitByCherryPickIT extends AbstractSubmit { @Test public void submitWithCherryPick() throws Exception { RevCommit initialHead = getRemoteHead(); - PushOneCommit.Result change = - createChange("Change 1", "a.txt", "content"); + PushOneCommit.Result change = createChange("Change 1", "a.txt", "content"); submit(change.getChangeId()); RevCommit headAfterFirstSubmit = getRemoteHead(); testRepo.reset(initialHead); - PushOneCommit.Result change2 = - createChange("Change 2", "b.txt", "other content"); + PushOneCommit.Result change2 = createChange("Change 2", "b.txt", "other content"); submit(change2.getChangeId()); assertCherryPick(testRepo, false); RevCommit newHead = getRemoteHead(); @@ -90,23 +84,26 @@ public class SubmitByCherryPickIT extends AbstractSubmit { assertPersonEquals(admin.getIdent(), newHead.getAuthorIdent()); assertPersonEquals(admin.getIdent(), newHead.getCommitterIdent()); - assertRefUpdatedEvents(initialHead, headAfterFirstSubmit, - headAfterFirstSubmit, newHead); - assertChangeMergedEvents(change.getChangeId(), headAfterFirstSubmit.name(), - change2.getChangeId(), newHead.name()); + assertRefUpdatedEvents(initialHead, headAfterFirstSubmit, headAfterFirstSubmit, newHead); + assertChangeMergedEvents( + change.getChangeId(), headAfterFirstSubmit.name(), change2.getChangeId(), newHead.name()); } @Test public void changeMessageOnSubmit() throws Exception { PushOneCommit.Result change = createChange(); RegistrationHandle handle = - changeMessageModifiers.add(new ChangeMessageModifier() { - @Override - public String onSubmit(String newCommitMessage, RevCommit original, - RevCommit mergeTip, Branch.NameKey destination) { - return newCommitMessage + "Custom: " + destination.get(); - } - }); + changeMessageModifiers.add( + new ChangeMessageModifier() { + @Override + public String onSubmit( + String newCommitMessage, + RevCommit original, + RevCommit mergeTip, + Branch.NameKey destination) { + return newCommitMessage + "Custom: " + destination.get(); + } + }); try { submit(change.getChangeId()); } finally { @@ -114,8 +111,7 @@ public class SubmitByCherryPickIT extends AbstractSubmit { } testRepo.git().fetch().setRemote("origin").call(); ChangeInfo info = get(change.getChangeId()); - RevCommit c = testRepo.getRevWalk() - .parseCommit(ObjectId.fromString(info.currentRevision)); + RevCommit c = testRepo.getRevWalk().parseCommit(ObjectId.fromString(info.currentRevision)); testRepo.getRevWalk().parseBody(c); assertThat(c.getFooterLines("Custom")).containsExactly("refs/heads/master"); assertThat(c.getFooterLines(FooterConstants.REVIEWED_ON)).hasSize(1); @@ -125,53 +121,58 @@ public class SubmitByCherryPickIT extends AbstractSubmit { @TestProjectInput(useContentMerge = InheritableBoolean.TRUE) public void submitWithContentMerge() throws Exception { RevCommit initialHead = getRemoteHead(); - PushOneCommit.Result change = - createChange("Change 1", "a.txt", "aaa\nbbb\nccc\n"); + PushOneCommit.Result change = createChange("Change 1", "a.txt", "aaa\nbbb\nccc\n"); submit(change.getChangeId()); RevCommit headAfterFirstSubmit = getRemoteHead(); - PushOneCommit.Result change2 = - createChange("Change 2", "a.txt", "aaa\nbbb\nccc\nddd\n"); + PushOneCommit.Result change2 = createChange("Change 2", "a.txt", "aaa\nbbb\nccc\nddd\n"); submit(change2.getChangeId()); RevCommit headAfterSecondSubmit = getRemoteHead(); testRepo.reset(change.getCommit()); - PushOneCommit.Result change3 = - createChange("Change 3", "a.txt", "bbb\nccc\n"); + PushOneCommit.Result change3 = createChange("Change 3", "a.txt", "bbb\nccc\n"); submit(change3.getChangeId()); assertCherryPick(testRepo, true); RevCommit headAfterThirdSubmit = getRemoteHead(); - assertThat(headAfterThirdSubmit.getParent(0)) - .isEqualTo(headAfterSecondSubmit); + assertThat(headAfterThirdSubmit.getParent(0)).isEqualTo(headAfterSecondSubmit); assertApproved(change3.getChangeId()); assertCurrentRevision(change3.getChangeId(), 2, headAfterThirdSubmit); assertSubmitter(change2.getChangeId(), 1); assertSubmitter(change2.getChangeId(), 2); - assertRefUpdatedEvents(initialHead, headAfterFirstSubmit, - headAfterFirstSubmit, headAfterSecondSubmit, - headAfterSecondSubmit, headAfterThirdSubmit); - assertChangeMergedEvents(change.getChangeId(), headAfterFirstSubmit.name(), - change2.getChangeId(), headAfterSecondSubmit.name(), - change3.getChangeId(), headAfterThirdSubmit.name()); + assertRefUpdatedEvents( + initialHead, + headAfterFirstSubmit, + headAfterFirstSubmit, + headAfterSecondSubmit, + headAfterSecondSubmit, + headAfterThirdSubmit); + assertChangeMergedEvents( + change.getChangeId(), + headAfterFirstSubmit.name(), + change2.getChangeId(), + headAfterSecondSubmit.name(), + change3.getChangeId(), + headAfterThirdSubmit.name()); } @Test @TestProjectInput(useContentMerge = InheritableBoolean.TRUE) public void submitWithContentMerge_Conflict() throws Exception { RevCommit initialHead = getRemoteHead(); - PushOneCommit.Result change = - createChange("Change 1", "a.txt", "content"); + PushOneCommit.Result change = createChange("Change 1", "a.txt", "content"); submit(change.getChangeId()); RevCommit newHead = getRemoteHead(); testRepo.reset(initialHead); - PushOneCommit.Result change2 = - createChange("Change 2", "a.txt", "other content"); - submitWithConflict(change2.getChangeId(), - "Failed to submit 1 change due to the following problems:\n" + - "Change " + change2.getChange().getId() + ": Change could not be " + - "merged due to a path conflict. Please rebase the change locally and " + - "upload the rebased commit for review."); + PushOneCommit.Result change2 = createChange("Change 2", "a.txt", "other content"); + submitWithConflict( + change2.getChangeId(), + "Failed to submit 1 change due to the following problems:\n" + + "Change " + + change2.getChange().getId() + + ": Change could not be " + + "merged due to a path conflict. Please rebase the change locally and " + + "upload the rebased commit for review."); assertThat(getRemoteHead()).isEqualTo(newHead); assertCurrentRevision(change2.getChangeId(), 1, change2.getCommit()); @@ -184,48 +185,49 @@ public class SubmitByCherryPickIT extends AbstractSubmit { @Test public void submitOutOfOrder() throws Exception { RevCommit initialHead = getRemoteHead(); - PushOneCommit.Result change = - createChange("Change 1", "a.txt", "content"); + PushOneCommit.Result change = createChange("Change 1", "a.txt", "content"); submit(change.getChangeId()); RevCommit headAfterFirstSubmit = getRemoteHead(); testRepo.reset(initialHead); createChange("Change 2", "b.txt", "other content"); - PushOneCommit.Result change3 = - createChange("Change 3", "c.txt", "different content"); + PushOneCommit.Result change3 = createChange("Change 3", "c.txt", "different content"); submit(change3.getChangeId()); assertCherryPick(testRepo, false); RevCommit headAfterSecondSubmit = getRemoteHead(); - assertThat(headAfterSecondSubmit.getParent(0)) - .isEqualTo(headAfterFirstSubmit); + assertThat(headAfterSecondSubmit.getParent(0)).isEqualTo(headAfterFirstSubmit); assertApproved(change3.getChangeId()); assertCurrentRevision(change3.getChangeId(), 2, headAfterSecondSubmit); assertSubmitter(change3.getChangeId(), 1); assertSubmitter(change3.getChangeId(), 2); - assertRefUpdatedEvents(initialHead, headAfterFirstSubmit, - headAfterFirstSubmit, headAfterSecondSubmit); - assertChangeMergedEvents(change.getChangeId(), headAfterFirstSubmit.name(), - change3.getChangeId(), headAfterSecondSubmit.name()); + assertRefUpdatedEvents( + initialHead, headAfterFirstSubmit, headAfterFirstSubmit, headAfterSecondSubmit); + assertChangeMergedEvents( + change.getChangeId(), + headAfterFirstSubmit.name(), + change3.getChangeId(), + headAfterSecondSubmit.name()); } @Test public void submitOutOfOrder_Conflict() throws Exception { RevCommit initialHead = getRemoteHead(); - PushOneCommit.Result change = - createChange("Change 1", "a.txt", "content"); + PushOneCommit.Result change = createChange("Change 1", "a.txt", "content"); submit(change.getChangeId()); RevCommit newHead = getRemoteHead(); testRepo.reset(initialHead); createChange("Change 2", "b.txt", "other content"); - PushOneCommit.Result change3 = - createChange("Change 3", "b.txt", "different content"); - submitWithConflict(change3.getChangeId(), - "Failed to submit 1 change due to the following problems:\n" + - "Change " + change3.getChange().getId() + ": Change could not be " + - "merged due to a path conflict. Please rebase the change locally and " + - "upload the rebased commit for review."); + PushOneCommit.Result change3 = createChange("Change 3", "b.txt", "different content"); + submitWithConflict( + change3.getChangeId(), + "Failed to submit 1 change due to the following problems:\n" + + "Change " + + change3.getChange().getId() + + ": Change could not be " + + "merged due to a path conflict. Please rebase the change locally and " + + "upload the rebased commit for review."); assertThat(getRemoteHead()).isEqualTo(newHead); assertCurrentRevision(change3.getChangeId(), 1, change3.getCommit()); @@ -253,8 +255,7 @@ public class SubmitByCherryPickIT extends AbstractSubmit { submit(change3.getChangeId()); List log = getRemoteLog(); - assertThat(log.get(0).getShortMessage()).isEqualTo( - change3.getCommit().getShortMessage()); + assertThat(log.get(0).getShortMessage()).isEqualTo(change3.getCommit().getShortMessage()); assertThat(log.get(1).getId()).isEqualTo(initialHead.getId()); assertNew(change.getChangeId()); @@ -283,20 +284,21 @@ public class SubmitByCherryPickIT extends AbstractSubmit { // change is the new tip. List log = getRemoteLog(); - assertThat(log.get(0).getShortMessage()).isEqualTo( - change.getCommit().getShortMessage()); + assertThat(log.get(0).getShortMessage()).isEqualTo(change.getCommit().getShortMessage()); assertThat(log.get(0).getParent(0)).isEqualTo(log.get(1)); - assertThat(log.get(1).getShortMessage()).isEqualTo( - change2.getCommit().getShortMessage()); + assertThat(log.get(1).getShortMessage()).isEqualTo(change2.getCommit().getShortMessage()); assertThat(log.get(1).getParent(0)).isEqualTo(log.get(2)); assertThat(log.get(2).getId()).isEqualTo(initialHead.getId()); - assertRefUpdatedEvents(initialHead, headAfterFirstSubmit, - headAfterFirstSubmit, headAfterSecondSubmit); - assertChangeMergedEvents(change2.getChangeId(), headAfterFirstSubmit.name(), - change.getChangeId(), headAfterSecondSubmit.name()); + assertRefUpdatedEvents( + initialHead, headAfterFirstSubmit, headAfterFirstSubmit, headAfterSecondSubmit); + assertChangeMergedEvents( + change2.getChangeId(), + headAfterFirstSubmit.name(), + change.getChangeId(), + headAfterSecondSubmit.name()); } @Test @@ -310,11 +312,14 @@ public class SubmitByCherryPickIT extends AbstractSubmit { // Submit fails; change2 contains the delta "b1" -> "b2", which cannot be // applied against tip. - submitWithConflict(change2.getChangeId(), - "Failed to submit 1 change due to the following problems:\n" + - "Change " + change2.getChange().getId() + ": Change could not be " + - "merged due to a path conflict. Please rebase the change locally and " + - "upload the rebased commit for review."); + submitWithConflict( + change2.getChangeId(), + "Failed to submit 1 change due to the following problems:\n" + + "Change " + + change2.getChange().getId() + + ": Change could not be " + + "merged due to a path conflict. Please rebase the change locally and " + + "upload the rebased commit for review."); ChangeInfo info3 = get(change2.getChangeId(), ListChangesOption.MESSAGES); assertThat(info3.status).isEqualTo(ChangeStatus.NEW); @@ -374,26 +379,29 @@ public class SubmitByCherryPickIT extends AbstractSubmit { .isEqualTo(CommitMergeStatus.SKIPPED_IDENTICAL_TREE.getMessage()); assertRefUpdatedEvents(initialHead, headAfterFirstSubmit); - assertChangeMergedEvents(change1.getChangeId(), headAfterFirstSubmit.name(), - change2.getChangeId(), headAfterFirstSubmit.name()); + assertChangeMergedEvents( + change1.getChangeId(), + headAfterFirstSubmit.name(), + change2.getChangeId(), + headAfterFirstSubmit.name()); } @Test public void repairChangeStateAfterFailure() throws Exception { RevCommit initialHead = getRemoteHead(); - PushOneCommit.Result change = - createChange("Change 1", "a.txt", "content"); + PushOneCommit.Result change = createChange("Change 1", "a.txt", "content"); submit(change.getChangeId()); RevCommit headAfterFirstSubmit = getRemoteHead(); testRepo.reset(initialHead); - PushOneCommit.Result change2 = - createChange("Change 2", "b.txt", "other content"); + PushOneCommit.Result change2 = createChange("Change 2", "b.txt", "other content"); Change.Id id2 = change2.getChange().getId(); - SubmitInput failAfterRefUpdates = - new TestSubmitInput(new SubmitInput(), true); - submit(change2.getChangeId(), failAfterRefUpdates, - ResourceConflictException.class, "Failing after ref updates"); + SubmitInput failAfterRefUpdates = new TestSubmitInput(new SubmitInput(), true); + submit( + change2.getChangeId(), + failAfterRefUpdates, + ResourceConflictException.class, + "Failing after ref updates"); RevCommit headAfterFailedSubmit = getRemoteHead(); // Bad: ref advanced but change wasn't updated. @@ -413,11 +421,9 @@ public class SubmitByCherryPickIT extends AbstractSubmit { rev2 = repo.exactRef(psId2.toRefName()).getObjectId(); assertThat(rev2).isNotNull(); assertThat(rev2).isNotEqualTo(rev1); - assertThat(rw.parseCommit(rev2).getParent(0)) - .isEqualTo(headAfterFirstSubmit); + assertThat(rw.parseCommit(rev2).getParent(0)).isEqualTo(headAfterFirstSubmit); - assertThat(repo.exactRef("refs/heads/master").getObjectId()) - .isEqualTo(rev2); + assertThat(repo.exactRef("refs/heads/master").getObjectId()).isEqualTo(rev2); } submit(change2.getChangeId()); @@ -433,16 +439,18 @@ public class SubmitByCherryPickIT extends AbstractSubmit { assertThat(ps2).isNotNull(); assertThat(ps2.getRevision().get()).isEqualTo(rev2.name()); assertThat(Iterables.getLast(info.messages).message) - .isEqualTo("Change has been successfully cherry-picked as " - + rev2.name() + " by Administrator"); + .isEqualTo( + "Change has been successfully cherry-picked as " + rev2.name() + " by Administrator"); try (Repository repo = repoManager.openRepository(project)) { - assertThat(repo.exactRef("refs/heads/master").getObjectId()) - .isEqualTo(rev2); + assertThat(repo.exactRef("refs/heads/master").getObjectId()).isEqualTo(rev2); } assertRefUpdatedEvents(initialHead, headAfterFirstSubmit); - assertChangeMergedEvents(change.getChangeId(), headAfterFirstSubmit.name(), - change2.getChangeId(), headAfterSecondSubmit.name()); + assertChangeMergedEvents( + change.getChangeId(), + headAfterFirstSubmit.name(), + change2.getChangeId(), + headAfterSecondSubmit.name()); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByFastForwardIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByFastForwardIT.java index 65f3fc8fac..65ad4991dd 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByFastForwardIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByFastForwardIT.java @@ -30,7 +30,7 @@ import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.server.change.Submit.TestSubmitInput; - +import java.util.Map; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; @@ -38,8 +38,6 @@ import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.transport.PushResult; import org.junit.Test; -import java.util.Map; - public class SubmitByFastForwardIT extends AbstractSubmit { @Override @@ -89,9 +87,8 @@ public class SubmitByFastForwardIT extends AbstractSubmit { assertSubmittedTogether(id3, id3, id2, id1); assertRefUpdatedEvents(initialHead, updatedHead); - assertChangeMergedEvents(id1, updatedHead.name(), - id2, updatedHead.name(), - id3, updatedHead.name()); + assertChangeMergedEvents( + id1, updatedHead.name(), id2, updatedHead.name(), id3, updatedHead.name()); } @Test @@ -101,9 +98,12 @@ public class SubmitByFastForwardIT extends AbstractSubmit { PushOneCommit.Result change2 = createChange(); Change.Id id1 = change1.getPatchSetId().getParentKey(); - submitWithConflict(change2.getChangeId(), + submitWithConflict( + change2.getChangeId(), "Failed to submit 2 changes due to the following problems:\n" - + "Change " + id1 + ": needs Code-Review"); + + "Change " + + id1 + + ": needs Code-Review"); RevCommit updatedHead = getRemoteHead(); assertThat(updatedHead.getId()).isEqualTo(initialHead.getId()); @@ -114,14 +114,12 @@ public class SubmitByFastForwardIT extends AbstractSubmit { @Test public void submitFastForwardNotPossible_Conflict() throws Exception { RevCommit initialHead = getRemoteHead(); - PushOneCommit.Result change = - createChange("Change 1", "a.txt", "content"); + PushOneCommit.Result change = createChange("Change 1", "a.txt", "content"); submit(change.getChangeId()); RevCommit headAfterFirstSubmit = getRemoteHead(); testRepo.reset(initialHead); - PushOneCommit.Result change2 = - createChange("Change 2", "b.txt", "other content"); + PushOneCommit.Result change2 = createChange("Change 2", "b.txt", "other content"); approve(change2.getChangeId()); Map actions = getActions(change2.getChangeId()); @@ -130,11 +128,14 @@ public class SubmitByFastForwardIT extends AbstractSubmit { ActionInfo info = actions.get("submit"); assertThat(info.enabled).isNull(); - submitWithConflict(change2.getChangeId(), - "Failed to submit 1 change due to the following problems:\n" + - "Change " + change2.getChange().getId() + ": Project policy requires " + - "all submissions to be a fast-forward. Please rebase the change " + - "locally and upload again for review."); + submitWithConflict( + change2.getChangeId(), + "Failed to submit 1 change due to the following problems:\n" + + "Change " + + change2.getChange().getId() + + ": Project policy requires " + + "all submissions to be a fast-forward. Please rebase the change " + + "locally and upload again for review."); assertThat(getRemoteHead()).isEqualTo(headAfterFirstSubmit); assertSubmitter(change.getChangeId(), 1); @@ -146,10 +147,12 @@ public class SubmitByFastForwardIT extends AbstractSubmit { public void repairChangeStateAfterFailure() throws Exception { PushOneCommit.Result change = createChange("Change 1", "a.txt", "content"); Change.Id id = change.getChange().getId(); - SubmitInput failAfterRefUpdates = - new TestSubmitInput(new SubmitInput(), true); - submit(change.getChangeId(), failAfterRefUpdates, - ResourceConflictException.class, "Failing after ref updates"); + SubmitInput failAfterRefUpdates = new TestSubmitInput(new SubmitInput(), true); + submit( + change.getChangeId(), + failAfterRefUpdates, + ResourceConflictException.class, + "Failing after ref updates"); // Bad: ref advanced but change wasn't updated. PatchSet.Id psId = new PatchSet.Id(id, 1); @@ -162,8 +165,7 @@ public class SubmitByFastForwardIT extends AbstractSubmit { RevWalk rw = new RevWalk(repo)) { rev = repo.exactRef(psId.toRefName()).getObjectId(); assertThat(rev).isNotNull(); - assertThat(repo.exactRef("refs/heads/master").getObjectId()) - .isEqualTo(rev); + assertThat(repo.exactRef("refs/heads/master").getObjectId()).isEqualTo(rev); } submit(change.getChangeId()); @@ -176,8 +178,7 @@ public class SubmitByFastForwardIT extends AbstractSubmit { .isEqualTo("Change has been successfully merged by Administrator"); try (Repository repo = repoManager.openRepository(project)) { - assertThat(repo.exactRef("refs/heads/master").getObjectId()) - .isEqualTo(rev); + assertThat(repo.exactRef("refs/heads/master").getObjectId()).isEqualTo(rev); } assertRefUpdatedEvents(); @@ -191,15 +192,11 @@ public class SubmitByFastForwardIT extends AbstractSubmit { grant(Permission.CREATE, project, "refs/heads/*"); grant(Permission.PUSH, project, "refs/heads/experimental"); - RevCommit c1 = commitBuilder() - .add("b.txt", "1") - .message("commit at tip") - .create(); + RevCommit c1 = commitBuilder().add("b.txt", "1").message("commit at tip").create(); String id1 = GitUtil.getChangeId(testRepo, c1).get(); PushResult r1 = pushHead(testRepo, "refs/for/master", false); - assertThat(r1.getRemoteUpdate("refs/for/master").getNewObjectId()) - .isEqualTo(c1.getId()); + assertThat(r1.getRemoteUpdate("refs/for/master").getNewObjectId()).isEqualTo(c1.getId()); PushResult r2 = pushHead(testRepo, "refs/heads/experimental", false); assertThat(r2.getRemoteUpdate("refs/heads/experimental").getNewObjectId()) diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeAlwaysIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeAlwaysIT.java index 315971fa47..4af27ab6e1 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeAlwaysIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeAlwaysIT.java @@ -18,7 +18,6 @@ import static com.google.common.truth.Truth.assertThat; import com.google.gerrit.acceptance.PushOneCommit; import com.google.gerrit.extensions.client.SubmitType; - import org.eclipse.jgit.revwalk.RevCommit; import org.junit.Test; @@ -57,12 +56,11 @@ public class SubmitByMergeAlwaysIT extends AbstractSubmitByMerge { // The remote head should now be a merge of the previous head // and "Change 1" RevCommit headAfterFirstSubmit = getRemoteLog().get(0); - assertThat(headAfterFirstSubmit.getParent(1).getShortMessage()).isEqualTo( - change.getCommit().getShortMessage()); - assertThat(headAfterFirstSubmit.getParent(0).getShortMessage()).isEqualTo( - initialHead.getShortMessage()); - assertThat(headAfterFirstSubmit.getParent(0).getId()).isEqualTo( - initialHead.getId()); + assertThat(headAfterFirstSubmit.getParent(1).getShortMessage()) + .isEqualTo(change.getCommit().getShortMessage()); + assertThat(headAfterFirstSubmit.getParent(0).getShortMessage()) + .isEqualTo(initialHead.getShortMessage()); + assertThat(headAfterFirstSubmit.getParent(0).getId()).isEqualTo(initialHead.getId()); // Submit three changes at the same time PushOneCommit.Result change2 = createChange("Change 2", "c", "c"); @@ -79,21 +77,24 @@ public class SubmitByMergeAlwaysIT extends AbstractSubmitByMerge { // The remote head should now be a merge of the new head after // the previous submit, and "Change 4". RevCommit headAfterSecondSubmit = getRemoteLog().get(0); - assertThat(headAfterSecondSubmit.getParent(1).getShortMessage()).isEqualTo( - change4.getCommit().getShortMessage()); - assertThat(headAfterSecondSubmit.getParent(0).getShortMessage()).isEqualTo( - headAfterFirstSubmit.getShortMessage()); - assertThat(headAfterSecondSubmit.getParent(0).getId()).isEqualTo( - headAfterFirstSubmit.getId()); + assertThat(headAfterSecondSubmit.getParent(1).getShortMessage()) + .isEqualTo(change4.getCommit().getShortMessage()); + assertThat(headAfterSecondSubmit.getParent(0).getShortMessage()) + .isEqualTo(headAfterFirstSubmit.getShortMessage()); + assertThat(headAfterSecondSubmit.getParent(0).getId()).isEqualTo(headAfterFirstSubmit.getId()); assertPersonEquals(admin.getIdent(), headAfterSecondSubmit.getAuthorIdent()); - assertPersonEquals(serverIdent.get(), - headAfterSecondSubmit.getCommitterIdent()); + assertPersonEquals(serverIdent.get(), headAfterSecondSubmit.getCommitterIdent()); - assertRefUpdatedEvents(initialHead, headAfterFirstSubmit, - headAfterFirstSubmit, headAfterSecondSubmit); - assertChangeMergedEvents(change.getChangeId(), headAfterFirstSubmit.name(), - change2.getChangeId(), headAfterSecondSubmit.name(), - change3.getChangeId(), headAfterSecondSubmit.name(), - change4.getChangeId(), headAfterSecondSubmit.name()); + assertRefUpdatedEvents( + initialHead, headAfterFirstSubmit, headAfterFirstSubmit, headAfterSecondSubmit); + assertChangeMergedEvents( + change.getChangeId(), + headAfterFirstSubmit.name(), + change2.getChangeId(), + headAfterSecondSubmit.name(), + change3.getChangeId(), + headAfterSecondSubmit.name(), + change4.getChangeId(), + headAfterSecondSubmit.name()); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeIfNecessaryIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeIfNecessaryIT.java index 03921c3b0c..295aefd3fc 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeIfNecessaryIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeIfNecessaryIT.java @@ -29,16 +29,6 @@ import com.google.gerrit.extensions.restapi.BinaryResult; import com.google.gerrit.extensions.restapi.RestApiException; import com.google.gerrit.reviewdb.client.Branch; import com.google.gerrit.reviewdb.client.Project; - -import org.apache.commons.compress.archivers.ArchiveStreamFactory; -import org.apache.commons.compress.archivers.tar.TarArchiveEntry; -import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; -import org.eclipse.jgit.junit.TestRepository; -import org.eclipse.jgit.revwalk.RevCommit; -import org.eclipse.jgit.revwalk.RevTree; -import org.eclipse.jgit.transport.RefSpec; -import org.junit.Test; - import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -47,6 +37,14 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.zip.GZIPInputStream; +import org.apache.commons.compress.archivers.ArchiveStreamFactory; +import org.apache.commons.compress.archivers.tar.TarArchiveEntry; +import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; +import org.eclipse.jgit.junit.TestRepository; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.revwalk.RevTree; +import org.eclipse.jgit.transport.RefSpec; +import org.junit.Test; public class SubmitByMergeIfNecessaryIT extends AbstractSubmitByMerge { @@ -90,10 +88,9 @@ public class SubmitByMergeIfNecessaryIT extends AbstractSubmitByMerge { submit(change2.getChangeId()); RevCommit headAfterFirstSubmit = getRemoteLog().get(0); - assertThat(headAfterFirstSubmit.getShortMessage()).isEqualTo( - change2.getCommit().getShortMessage()); - assertThat(headAfterFirstSubmit.getParent(0).getId()).isEqualTo( - initialHead.getId()); + assertThat(headAfterFirstSubmit.getShortMessage()) + .isEqualTo(change2.getCommit().getShortMessage()); + assertThat(headAfterFirstSubmit.getParent(0).getId()).isEqualTo(initialHead.getId()); assertPersonEquals(admin.getIdent(), headAfterFirstSubmit.getAuthorIdent()); assertPersonEquals(admin.getIdent(), headAfterFirstSubmit.getCommitterIdent()); @@ -103,10 +100,10 @@ public class SubmitByMergeIfNecessaryIT extends AbstractSubmitByMerge { submit(change5.getChangeId()); RevCommit headAfterSecondSubmit = getRemoteLog().get(0); - assertThat(headAfterSecondSubmit.getParent(1).getShortMessage()).isEqualTo( - change5.getCommit().getShortMessage()); - assertThat(headAfterSecondSubmit.getParent(0).getShortMessage()).isEqualTo( - change2.getCommit().getShortMessage()); + assertThat(headAfterSecondSubmit.getParent(1).getShortMessage()) + .isEqualTo(change5.getCommit().getShortMessage()); + assertThat(headAfterSecondSubmit.getParent(0).getShortMessage()) + .isEqualTo(change2.getCommit().getShortMessage()); assertPersonEquals(admin.getIdent(), headAfterSecondSubmit.getAuthorIdent()); assertPersonEquals(serverIdent.get(), headAfterSecondSubmit.getCommitterIdent()); @@ -116,12 +113,17 @@ public class SubmitByMergeIfNecessaryIT extends AbstractSubmitByMerge { // The two submit operations should have resulted in two ref-update events // and three change-merged events. - assertRefUpdatedEvents(initialHead, headAfterFirstSubmit, - headAfterFirstSubmit, headAfterSecondSubmit); - assertChangeMergedEvents(change2.getChangeId(), headAfterFirstSubmit.name(), - change3.getChangeId(), headAfterSecondSubmit.name(), - change4.getChangeId(), headAfterSecondSubmit.name(), - change5.getChangeId(), headAfterSecondSubmit.name()); + assertRefUpdatedEvents( + initialHead, headAfterFirstSubmit, headAfterFirstSubmit, headAfterSecondSubmit); + assertChangeMergedEvents( + change2.getChangeId(), + headAfterFirstSubmit.name(), + change3.getChangeId(), + headAfterSecondSubmit.name(), + change4.getChangeId(), + headAfterSecondSubmit.name(), + change5.getChangeId(), + headAfterSecondSubmit.name()); } @Test @@ -137,23 +139,31 @@ public class SubmitByMergeIfNecessaryIT extends AbstractSubmitByMerge { TestRepository repo2 = cloneProject(p2); TestRepository repo3 = cloneProject(p3); - PushOneCommit.Result change1a = createChange(repo1, "master", - "An ancestor of the change we want to submit", - "a.txt", "1", "dependent-topic"); - PushOneCommit.Result change1b = createChange(repo1, "master", - "We're interested in submitting this change", - "a.txt", "2", "topic-to-submit"); + PushOneCommit.Result change1a = + createChange( + repo1, + "master", + "An ancestor of the change we want to submit", + "a.txt", + "1", + "dependent-topic"); + PushOneCommit.Result change1b = + createChange( + repo1, + "master", + "We're interested in submitting this change", + "a.txt", + "2", + "topic-to-submit"); - PushOneCommit.Result change2a = createChange(repo2, "master", - "indirection level 1", - "a.txt", "1", "topic-indirect"); - PushOneCommit.Result change2b = createChange(repo2, "master", - "should go in with first change", - "a.txt", "2", "dependent-topic"); + PushOneCommit.Result change2a = + createChange(repo2, "master", "indirection level 1", "a.txt", "1", "topic-indirect"); + PushOneCommit.Result change2b = + createChange( + repo2, "master", "should go in with first change", "a.txt", "2", "dependent-topic"); - PushOneCommit.Result change3 = createChange(repo3, "master", - "indirection level 2", - "a.txt", "1", "topic-indirect"); + PushOneCommit.Result change3 = + createChange(repo3, "master", "indirection level 2", "a.txt", "1", "topic-indirect"); approve(change1a.getChangeId()); approve(change2a.getChangeId()); @@ -162,43 +172,34 @@ public class SubmitByMergeIfNecessaryIT extends AbstractSubmitByMerge { // get a preview before submitting: BinaryResult request = submitPreview(change1b.getChangeId()); - Map preview = - fetchFromBundles(request); + Map preview = fetchFromBundles(request); submit(change1b.getChangeId()); - RevCommit tip1 = getRemoteLog(p1, "master").get(0); - RevCommit tip2 = getRemoteLog(p2, "master").get(0); - RevCommit tip3 = getRemoteLog(p3, "master").get(0); + RevCommit tip1 = getRemoteLog(p1, "master").get(0); + RevCommit tip2 = getRemoteLog(p2, "master").get(0); + RevCommit tip3 = getRemoteLog(p3, "master").get(0); - assertThat(tip1.getShortMessage()).isEqualTo( - change1b.getCommit().getShortMessage()); + assertThat(tip1.getShortMessage()).isEqualTo(change1b.getCommit().getShortMessage()); if (isSubmitWholeTopicEnabled()) { - assertThat(tip2.getShortMessage()).isEqualTo( - change2b.getCommit().getShortMessage()); - assertThat(tip3.getShortMessage()).isEqualTo( - change3.getCommit().getShortMessage()); + assertThat(tip2.getShortMessage()).isEqualTo(change2b.getCommit().getShortMessage()); + assertThat(tip3.getShortMessage()).isEqualTo(change3.getCommit().getShortMessage()); // check that the preview matched what happened: assertThat(preview).hasSize(3); - assertThat(preview).containsKey( - new Branch.NameKey(p1, "refs/heads/master")); + assertThat(preview).containsKey(new Branch.NameKey(p1, "refs/heads/master")); assertRevTrees(p1, preview); - assertThat(preview).containsKey( - new Branch.NameKey(p2, "refs/heads/master")); + assertThat(preview).containsKey(new Branch.NameKey(p2, "refs/heads/master")); assertRevTrees(p2, preview); - assertThat(preview).containsKey( - new Branch.NameKey(p3, "refs/heads/master")); + assertThat(preview).containsKey(new Branch.NameKey(p3, "refs/heads/master")); assertRevTrees(p3, preview); } else { - assertThat(tip2.getShortMessage()).isEqualTo( - initialHead2.getShortMessage()); - assertThat(tip3.getShortMessage()).isEqualTo( - initialHead3.getShortMessage()); + assertThat(tip2.getShortMessage()).isEqualTo(initialHead2.getShortMessage()); + assertThat(tip3.getShortMessage()).isEqualTo(initialHead3.getShortMessage()); assertThat(preview).hasSize(1); assertThat(preview.get(new Branch.NameKey(p1, "refs/heads/master"))).isNotNull(); } @@ -218,34 +219,41 @@ public class SubmitByMergeIfNecessaryIT extends AbstractSubmitByMerge { RevCommit initialHead2 = getRemoteHead(p2, "master"); RevCommit initialHead3 = getRemoteHead(p3, "master"); - PushOneCommit.Result change1a = createChange(repo1, "master", - "An ancestor of the change we want to submit", - "a.txt", "1", "dependent-topic"); - PushOneCommit.Result change1b = createChange(repo1, "master", - "we're interested to submit this change", - "a.txt", "2", "topic-to-submit"); + PushOneCommit.Result change1a = + createChange( + repo1, + "master", + "An ancestor of the change we want to submit", + "a.txt", + "1", + "dependent-topic"); + PushOneCommit.Result change1b = + createChange( + repo1, + "master", + "we're interested to submit this change", + "a.txt", + "2", + "topic-to-submit"); - PushOneCommit.Result change2a = createChange(repo2, "master", - "indirection level 2a", - "a.txt", "1", "topic-indirect"); - PushOneCommit.Result change2b = createChange(repo2, "master", - "should go in with first change", - "a.txt", "2", "dependent-topic"); + PushOneCommit.Result change2a = + createChange(repo2, "master", "indirection level 2a", "a.txt", "1", "topic-indirect"); + PushOneCommit.Result change2b = + createChange( + repo2, "master", "should go in with first change", "a.txt", "2", "dependent-topic"); - PushOneCommit.Result change3 = createChange(repo3, "master", - "indirection level 2b", - "a.txt", "1", "topic-indirect"); + PushOneCommit.Result change3 = + createChange(repo3, "master", "indirection level 2b", "a.txt", "1", "topic-indirect"); // Create a merge conflict for change3 which is only indirectly related // via topics. repo3.reset(initialHead3); - PushOneCommit.Result change3Conflict = createChange(repo3, "master", - "conflicting change", - "a.txt", "2\n2", "conflicting-topic"); + PushOneCommit.Result change3Conflict = + createChange(repo3, "master", "conflicting change", "a.txt", "2\n2", "conflicting-topic"); submit(change3Conflict.getChangeId()); RevCommit tipConflict = getRemoteLog(p3, "master").get(0); - assertThat(tipConflict.getShortMessage()).isEqualTo( - change3Conflict.getCommit().getShortMessage()); + assertThat(tipConflict.getShortMessage()) + .isEqualTo(change3Conflict.getCommit().getShortMessage()); approve(change1a.getChangeId()); approve(change2a.getChangeId()); @@ -254,10 +262,12 @@ public class SubmitByMergeIfNecessaryIT extends AbstractSubmitByMerge { if (isSubmitWholeTopicEnabled()) { String msg = - "Failed to submit 5 changes due to the following problems:\n" + - "Change " + change3.getChange().getId() + ": Change could not be " + - "merged due to a path conflict. Please rebase the change locally " + - "and upload the rebased commit for review."; + "Failed to submit 5 changes due to the following problems:\n" + + "Change " + + change3.getChange().getId() + + ": Change could not be " + + "merged due to a path conflict. Please rebase the change locally " + + "and upload the rebased commit for review."; // Get a preview before submitting: try { @@ -274,27 +284,21 @@ public class SubmitByMergeIfNecessaryIT extends AbstractSubmitByMerge { submit(change1b.getChangeId()); } - RevCommit tip1 = getRemoteLog(p1, "master").get(0); - RevCommit tip2 = getRemoteLog(p2, "master").get(0); - RevCommit tip3 = getRemoteLog(p3, "master").get(0); + RevCommit tip1 = getRemoteLog(p1, "master").get(0); + RevCommit tip2 = getRemoteLog(p2, "master").get(0); + RevCommit tip3 = getRemoteLog(p3, "master").get(0); if (isSubmitWholeTopicEnabled()) { - assertThat(tip1.getShortMessage()).isEqualTo( - initialHead1.getShortMessage()); - assertThat(tip2.getShortMessage()).isEqualTo( - initialHead2.getShortMessage()); - assertThat(tip3.getShortMessage()).isEqualTo( - change3Conflict.getCommit().getShortMessage()); + assertThat(tip1.getShortMessage()).isEqualTo(initialHead1.getShortMessage()); + assertThat(tip2.getShortMessage()).isEqualTo(initialHead2.getShortMessage()); + assertThat(tip3.getShortMessage()).isEqualTo(change3Conflict.getCommit().getShortMessage()); assertNoSubmitter(change1a.getChangeId(), 1); assertNoSubmitter(change2a.getChangeId(), 1); assertNoSubmitter(change2b.getChangeId(), 1); assertNoSubmitter(change3.getChangeId(), 1); } else { - assertThat(tip1.getShortMessage()).isEqualTo( - change1b.getCommit().getShortMessage()); - assertThat(tip2.getShortMessage()).isEqualTo( - initialHead2.getShortMessage()); - assertThat(tip3.getShortMessage()).isEqualTo( - change3Conflict.getCommit().getShortMessage()); + assertThat(tip1.getShortMessage()).isEqualTo(change1b.getCommit().getShortMessage()); + assertThat(tip2.getShortMessage()).isEqualTo(initialHead2.getShortMessage()); + assertThat(tip3.getShortMessage()).isEqualTo(change3Conflict.getCommit().getShortMessage()); assertNoSubmitter(change2a.getChangeId(), 1); assertNoSubmitter(change2b.getChangeId(), 1); assertNoSubmitter(change3.getChangeId(), 1); @@ -305,105 +309,112 @@ public class SubmitByMergeIfNecessaryIT extends AbstractSubmitByMerge { public void submitWithMergedAncestorsOnOtherBranch() throws Exception { RevCommit initialHead = getRemoteHead(); - PushOneCommit.Result change1 = createChange(testRepo, "master", - "base commit", - "a.txt", "1", ""); + PushOneCommit.Result change1 = + createChange(testRepo, "master", "base commit", "a.txt", "1", ""); submit(change1.getChangeId()); RevCommit headAfterFirstSubmit = getRemoteHead(); - gApi.projects() - .name(project.get()) - .branch("branch") - .create(new BranchInput()); + gApi.projects().name(project.get()).branch("branch").create(new BranchInput()); - PushOneCommit.Result change2 = createChange(testRepo, "master", - "We want to commit this to master first", - "a.txt", "2", ""); + PushOneCommit.Result change2 = + createChange( + testRepo, "master", "We want to commit this to master first", "a.txt", "2", ""); submit(change2.getChangeId()); RevCommit headAfterSecondSubmit = getRemoteLog(project, "master").get(0); - assertThat(headAfterSecondSubmit.getShortMessage()).isEqualTo( - change2.getCommit().getShortMessage()); + assertThat(headAfterSecondSubmit.getShortMessage()) + .isEqualTo(change2.getCommit().getShortMessage()); RevCommit tip2 = getRemoteLog(project, "branch").get(0); - assertThat(tip2.getShortMessage()).isEqualTo( - change1.getCommit().getShortMessage()); + assertThat(tip2.getShortMessage()).isEqualTo(change1.getCommit().getShortMessage()); - PushOneCommit.Result change3 = createChange(testRepo, "branch", - "This commit is based on master, which includes change2, " - + "but is targeted at branch, which doesn't include it.", - "a.txt", "3", ""); + PushOneCommit.Result change3 = + createChange( + testRepo, + "branch", + "This commit is based on master, which includes change2, " + + "but is targeted at branch, which doesn't include it.", + "a.txt", + "3", + ""); submit(change3.getChangeId()); List log3 = getRemoteLog(project, "branch"); - assertThat(log3.get(0).getShortMessage()).isEqualTo( - change3.getCommit().getShortMessage()); - assertThat(log3.get(1).getShortMessage()).isEqualTo( - change2.getCommit().getShortMessage()); + assertThat(log3.get(0).getShortMessage()).isEqualTo(change3.getCommit().getShortMessage()); + assertThat(log3.get(1).getShortMessage()).isEqualTo(change2.getCommit().getShortMessage()); - assertRefUpdatedEvents(initialHead, headAfterFirstSubmit, - headAfterFirstSubmit, headAfterSecondSubmit); - assertChangeMergedEvents(change1.getChangeId(), headAfterFirstSubmit.name(), - change2.getChangeId(), headAfterSecondSubmit.name()); + assertRefUpdatedEvents( + initialHead, headAfterFirstSubmit, headAfterFirstSubmit, headAfterSecondSubmit); + assertChangeMergedEvents( + change1.getChangeId(), + headAfterFirstSubmit.name(), + change2.getChangeId(), + headAfterSecondSubmit.name()); } @Test public void submitWithOpenAncestorsOnOtherBranch() throws Exception { RevCommit initialHead = getRemoteHead(); - PushOneCommit.Result change1 = createChange(testRepo, "master", - "base commit", - "a.txt", "1", ""); + PushOneCommit.Result change1 = + createChange(testRepo, "master", "base commit", "a.txt", "1", ""); submit(change1.getChangeId()); RevCommit headAfterFirstSubmit = getRemoteHead(); - gApi.projects() - .name(project.get()) - .branch("branch") - .create(new BranchInput()); + gApi.projects().name(project.get()).branch("branch").create(new BranchInput()); - PushOneCommit.Result change2 = createChange(testRepo, "master", - "We want to commit this to master first", - "a.txt", "2", ""); + PushOneCommit.Result change2 = + createChange( + testRepo, "master", "We want to commit this to master first", "a.txt", "2", ""); approve(change2.getChangeId()); RevCommit tip1 = getRemoteLog(project, "master").get(0); - assertThat(tip1.getShortMessage()).isEqualTo( - change1.getCommit().getShortMessage()); + assertThat(tip1.getShortMessage()).isEqualTo(change1.getCommit().getShortMessage()); RevCommit tip2 = getRemoteLog(project, "branch").get(0); - assertThat(tip2.getShortMessage()).isEqualTo( - change1.getCommit().getShortMessage()); + assertThat(tip2.getShortMessage()).isEqualTo(change1.getCommit().getShortMessage()); - PushOneCommit.Result change3a = createChange(testRepo, "branch", - "This commit is based on change2 pending for master, " - + "but is targeted itself at branch, which doesn't include it.", - "a.txt", "3", "a-topic-here"); + PushOneCommit.Result change3a = + createChange( + testRepo, + "branch", + "This commit is based on change2 pending for master, " + + "but is targeted itself at branch, which doesn't include it.", + "a.txt", + "3", + "a-topic-here"); Project.NameKey p3 = createProject("project-related-to-change3"); TestRepository repo3 = cloneProject(p3); RevCommit repo3Head = getRemoteHead(p3, "master"); - PushOneCommit.Result change3b = createChange(repo3, "master", - "some accompanying changes for change3a in another repo " - + "tied together via topic", - "a.txt", "1", "a-topic-here"); + PushOneCommit.Result change3b = + createChange( + repo3, + "master", + "some accompanying changes for change3a in another repo " + "tied together via topic", + "a.txt", + "1", + "a-topic-here"); approve(change3b.getChangeId()); String cnt = isSubmitWholeTopicEnabled() ? "2 changes" : "1 change"; - submitWithConflict(change3a.getChangeId(), - "Failed to submit " + cnt + " due to the following problems:\n" - + "Change " + change3a.getChange().getId() + ": depends on change that" - + " was not submitted"); + submitWithConflict( + change3a.getChangeId(), + "Failed to submit " + + cnt + + " due to the following problems:\n" + + "Change " + + change3a.getChange().getId() + + ": depends on change that" + + " was not submitted"); RevCommit tipbranch = getRemoteLog(project, "branch").get(0); - assertThat(tipbranch.getShortMessage()).isEqualTo( - change1.getCommit().getShortMessage()); + assertThat(tipbranch.getShortMessage()).isEqualTo(change1.getCommit().getShortMessage()); RevCommit tipmaster = getRemoteLog(p3, "master").get(0); - assertThat(tipmaster.getShortMessage()).isEqualTo( - repo3Head.getShortMessage()); + assertThat(tipmaster.getShortMessage()).isEqualTo(repo3Head.getShortMessage()); assertRefUpdatedEvents(initialHead, headAfterFirstSubmit); assertChangeMergedEvents(change1.getChangeId(), headAfterFirstSubmit.name()); @@ -417,28 +428,22 @@ public class SubmitByMergeIfNecessaryIT extends AbstractSubmitByMerge { // Then we create a change to be applied to master, which is // then cherry picked back to stable. The stable branch will // be merged up into master again. - gApi.projects() - .name(project.get()) - .branch("stable") - .create(new BranchInput()); + gApi.projects().name(project.get()).branch("stable").create(new BranchInput()); // Push a change to master PushOneCommit push = - pushFactory.create(db, user.getIdent(), testRepo, - "small fix", "a.txt", "2"); + pushFactory.create(db, user.getIdent(), testRepo, "small fix", "a.txt", "2"); PushOneCommit.Result change = push.to("refs/for/master"); submit(change.getChangeId()); RevCommit headAfterFirstSubmit = getRemoteLog(project, "master").get(0); - assertThat(headAfterFirstSubmit.getShortMessage()).isEqualTo( - change.getCommit().getShortMessage()); + assertThat(headAfterFirstSubmit.getShortMessage()) + .isEqualTo(change.getCommit().getShortMessage()); // Now cherry pick to stable CherryPickInput in = new CherryPickInput(); in.destination = "stable"; - in.message = "This goes to stable as well\n" - + headAfterFirstSubmit.getFullMessage(); - ChangeApi orig = gApi.changes() - .id(change.getChangeId()); + in.message = "This goes to stable as well\n" + headAfterFirstSubmit.getFullMessage(); + ChangeApi orig = gApi.changes().id(change.getChangeId()); String cherryId = orig.current().cherryPick(in).id(); gApi.changes().id(cherryId).current().review(ReviewInput.approve()); gApi.changes().id(cherryId).current().submit(); @@ -447,62 +452,47 @@ public class SubmitByMergeIfNecessaryIT extends AbstractSubmitByMerge { RevCommit stable = getRemoteHead(project, "stable"); RevCommit master = getRemoteHead(project, "master"); testRepo.git().fetch().call(); - testRepo.git() - .branchCreate() - .setName("stable") - .setStartPoint(stable) - .call(); - testRepo.git() - .branchCreate() - .setName("master") - .setStartPoint(master) - .call(); + testRepo.git().branchCreate().setName("stable").setStartPoint(stable).call(); + testRepo.git().branchCreate().setName("master").setStartPoint(master).call(); - RevCommit merge = testRepo.commit() - .parent(master) - .parent(stable) - .message("Merge stable into master") - .insertChangeId() - .create(); + RevCommit merge = + testRepo + .commit() + .parent(master) + .parent(stable) + .message("Merge stable into master") + .insertChangeId() + .create(); testRepo.branch("refs/heads/master").update(merge); - testRepo.git().push() - .setRefSpecs(new RefSpec("refs/heads/master:refs/for/master")) - .call(); + testRepo.git().push().setRefSpecs(new RefSpec("refs/heads/master:refs/for/master")).call(); String changeId = GitUtil.getChangeId(testRepo, merge).get(); approve(changeId); submit(changeId); RevCommit headAfterSecondSubmit = getRemoteLog(project, "master").get(0); - assertThat(headAfterSecondSubmit.getShortMessage()) - .isEqualTo(merge.getShortMessage()); + assertThat(headAfterSecondSubmit.getShortMessage()).isEqualTo(merge.getShortMessage()); - assertRefUpdatedEvents(initialHead, headAfterFirstSubmit, - headAfterFirstSubmit, headAfterSecondSubmit); + assertRefUpdatedEvents( + initialHead, headAfterFirstSubmit, headAfterFirstSubmit, headAfterSecondSubmit); assertChangeMergedEvents( - change.getChangeId(), headAfterFirstSubmit.name(), - changeId, headAfterSecondSubmit.name()); + change.getChangeId(), headAfterFirstSubmit.name(), changeId, headAfterSecondSubmit.name()); } @Test public void openChangeForTargetBranchPreventsMerge() throws Exception { - gApi.projects() - .name(project.get()) - .branch("stable") - .create(new BranchInput()); + gApi.projects().name(project.get()).branch("stable").create(new BranchInput()); // Propose a change for master, but leave it open for master! PushOneCommit change = - pushFactory.create(db, user.getIdent(), testRepo, - "small fix", "a.txt", "2"); + pushFactory.create(db, user.getIdent(), testRepo, "small fix", "a.txt", "2"); PushOneCommit.Result change2result = change.to("refs/for/master"); // Now cherry pick to stable CherryPickInput in = new CherryPickInput(); in.destination = "stable"; in.message = "it goes to stable branch"; - ChangeApi orig = gApi.changes() - .id(change2result.getChangeId()); + ChangeApi orig = gApi.changes().id(change2result.getChangeId()); ChangeApi cherry = orig.current().cherryPick(in); cherry.current().review(ReviewInput.approve()); cherry.current().submit(); @@ -510,12 +500,13 @@ public class SubmitByMergeIfNecessaryIT extends AbstractSubmitByMerge { // Create a commit locally testRepo.git().fetch().setRefSpecs(new RefSpec("refs/heads/stable")).call(); - PushOneCommit.Result change3 = createChange(testRepo, "stable", - "test","a.txt", "3", ""); - submitWithConflict(change3.getChangeId(), - "Failed to submit 1 change due to the following problems:\n" + - "Change " + change3.getPatchSetId().getParentKey().get() + - ": depends on change that was not submitted"); + PushOneCommit.Result change3 = createChange(testRepo, "stable", "test", "a.txt", "3", ""); + submitWithConflict( + change3.getChangeId(), + "Failed to submit 1 change due to the following problems:\n" + + "Change " + + change3.getPatchSetId().getParentKey().get() + + ": depends on change that was not submitted"); assertRefUpdatedEvents(); assertChangeMergedEvents(); @@ -534,9 +525,11 @@ public class SubmitByMergeIfNecessaryIT extends AbstractSubmitByMerge { gApi.changes().id(draftResult.getChangeId()).delete(); // approve and submit the change - submitWithConflict(changeResult.getChangeId(), + submitWithConflict( + changeResult.getChangeId(), "Failed to submit 1 change due to the following problems:\n" - + "Change " + changeResult.getChange().getId() + + "Change " + + changeResult.getChange().getId() + ": depends on change that was not submitted"); assertRefUpdatedEvents(); @@ -548,8 +541,7 @@ public class SubmitByMergeIfNecessaryIT extends AbstractSubmitByMerge { Project.NameKey p1 = createProject("project-name"); TestRepository repo1 = cloneProject(p1); - PushOneCommit.Result change1 = createChange(repo1, "master", - "test", "a.txt", "1", "topic"); + PushOneCommit.Result change1 = createChange(repo1, "master", "test", "a.txt", "1", "topic"); approve(change1.getChangeId()); // get a preview before submitting: @@ -562,10 +554,10 @@ public class SubmitByMergeIfNecessaryIT extends AbstractSubmitByMerge { InputStream is = new GZIPInputStream(new FileInputStream(tempfile)); List untarredFiles = new ArrayList<>(); - try (TarArchiveInputStream tarInputStream = (TarArchiveInputStream) - new ArchiveStreamFactory().createArchiveInputStream("tar", is)) { + try (TarArchiveInputStream tarInputStream = + (TarArchiveInputStream) new ArchiveStreamFactory().createArchiveInputStream("tar", is)) { TarArchiveEntry entry = null; - while ((entry = (TarArchiveEntry)tarInputStream.getNextEntry()) != null) { + while ((entry = (TarArchiveEntry) tarInputStream.getNextEntry()) != null) { untarredFiles.add(entry.getName()); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByRebaseAlwaysIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByRebaseAlwaysIT.java index 03894179f9..e4c929a3db 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByRebaseAlwaysIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByRebaseAlwaysIT.java @@ -27,16 +27,13 @@ import com.google.gerrit.extensions.registration.RegistrationHandle; import com.google.gerrit.reviewdb.client.Branch; import com.google.gerrit.server.git.ChangeMessageModifier; import com.google.inject.Inject; - +import java.util.List; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.revwalk.RevCommit; import org.junit.Test; -import java.util.List; - public class SubmitByRebaseAlwaysIT extends AbstractSubmitByRebase { - @Inject - private DynamicSet changeMessageModifiers; + @Inject private DynamicSet changeMessageModifiers; @Override protected SubmitType getSubmitType() { @@ -69,12 +66,8 @@ public class SubmitByRebaseAlwaysIT extends AbstractSubmitByRebase { PushOneCommit.Result change1 = createChange(); PushOneCommit.Result change2 = createChange(); - assertThat( - getCurrentCommit(change1).getFooterLines(FooterConstants.REVIEWED_BY)) - .isEmpty(); - assertThat( - getCurrentCommit(change2).getFooterLines(FooterConstants.REVIEWED_BY)) - .isEmpty(); + assertThat(getCurrentCommit(change1).getFooterLines(FooterConstants.REVIEWED_BY)).isEmpty(); + assertThat(getCurrentCommit(change2).getFooterLines(FooterConstants.REVIEWED_BY)).isEmpty(); // change1 is a fast-forward, but should be rebased in cherry pick style // anyway, making change2 not a fast-forward, requiring a rebase. @@ -92,17 +85,21 @@ public class SubmitByRebaseAlwaysIT extends AbstractSubmitByRebase { PushOneCommit.Result change2 = createChange(); RegistrationHandle handle = - changeMessageModifiers.add(new ChangeMessageModifier() { - @Override - public String onSubmit(String newCommitMessage, RevCommit original, - RevCommit mergeTip, Branch.NameKey destination) { - List custom = mergeTip.getFooterLines("Custom"); - if (!custom.isEmpty()) { - newCommitMessage += "Custom-Parent: " + custom.get(0) + "\n"; - } - return newCommitMessage + "Custom: " + destination.get(); - } - }); + changeMessageModifiers.add( + new ChangeMessageModifier() { + @Override + public String onSubmit( + String newCommitMessage, + RevCommit original, + RevCommit mergeTip, + Branch.NameKey destination) { + List custom = mergeTip.getFooterLines("Custom"); + if (!custom.isEmpty()) { + newCommitMessage += "Custom-Parent: " + custom.get(0) + "\n"; + } + return newCommitMessage + "Custom: " + destination.get(); + } + }); try { // change1 is a fast-forward, but should be rebased in cherry pick style // anyway, making change2 not a fast-forward, requiring a rebase. @@ -120,20 +117,17 @@ public class SubmitByRebaseAlwaysIT extends AbstractSubmitByRebase { .containsExactly("refs/heads/master"); } - private void assertLatestRevisionHasFooters(PushOneCommit.Result change) - throws Exception { + private void assertLatestRevisionHasFooters(PushOneCommit.Result change) throws Exception { RevCommit c = getCurrentCommit(change); assertThat(c.getFooterLines(FooterConstants.CHANGE_ID)).isNotEmpty(); assertThat(c.getFooterLines(FooterConstants.REVIEWED_BY)).isNotEmpty(); assertThat(c.getFooterLines(FooterConstants.REVIEWED_ON)).isNotEmpty(); } - private RevCommit getCurrentCommit(PushOneCommit.Result change) - throws Exception { + private RevCommit getCurrentCommit(PushOneCommit.Result change) throws Exception { testRepo.git().fetch().setRemote("origin").call(); ChangeInfo info = get(change.getChangeId()); - RevCommit c = testRepo.getRevWalk() - .parseCommit(ObjectId.fromString(info.currentRevision)); + RevCommit c = testRepo.getRevWalk().parseCommit(ObjectId.fromString(info.currentRevision)); testRepo.getRevWalk().parseBody(c); return c; } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByRebaseIfNecessaryIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByRebaseIfNecessaryIT.java index 431978d269..19f170643d 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByRebaseIfNecessaryIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByRebaseIfNecessaryIT.java @@ -20,7 +20,6 @@ import com.google.gerrit.acceptance.PushOneCommit; import com.google.gerrit.acceptance.TestProjectInput; import com.google.gerrit.extensions.client.InheritableBoolean; import com.google.gerrit.extensions.client.SubmitType; - import org.eclipse.jgit.revwalk.RevCommit; import org.junit.Test; @@ -53,33 +52,37 @@ public class SubmitByRebaseIfNecessaryIT extends AbstractSubmitByRebase { @TestProjectInput(useContentMerge = InheritableBoolean.TRUE) public void submitWithContentMerge() throws Exception { RevCommit initialHead = getRemoteHead(); - PushOneCommit.Result change = - createChange("Change 1", "a.txt", "aaa\nbbb\nccc\n"); + PushOneCommit.Result change = createChange("Change 1", "a.txt", "aaa\nbbb\nccc\n"); submit(change.getChangeId()); RevCommit headAfterFirstSubmit = getRemoteHead(); - PushOneCommit.Result change2 = - createChange("Change 2", "a.txt", "aaa\nbbb\nccc\nddd\n"); + PushOneCommit.Result change2 = createChange("Change 2", "a.txt", "aaa\nbbb\nccc\nddd\n"); submit(change2.getChangeId()); RevCommit headAfterSecondSubmit = getRemoteHead(); testRepo.reset(change.getCommit()); - PushOneCommit.Result change3 = - createChange("Change 3", "a.txt", "bbb\nccc\n"); + PushOneCommit.Result change3 = createChange("Change 3", "a.txt", "bbb\nccc\n"); submit(change3.getChangeId()); assertRebase(testRepo, true); RevCommit headAfterThirdSubmit = getRemoteHead(); - assertThat(headAfterThirdSubmit.getParent(0)) - .isEqualTo(headAfterSecondSubmit); + assertThat(headAfterThirdSubmit.getParent(0)).isEqualTo(headAfterSecondSubmit); assertApproved(change3.getChangeId()); assertCurrentRevision(change3.getChangeId(), 2, headAfterThirdSubmit); assertSubmitter(change3.getChangeId(), 1); assertSubmitter(change3.getChangeId(), 2); - assertRefUpdatedEvents(initialHead, headAfterFirstSubmit, - headAfterFirstSubmit, headAfterSecondSubmit, - headAfterSecondSubmit, headAfterThirdSubmit); - assertChangeMergedEvents(change.getChangeId(), headAfterFirstSubmit.name(), - change2.getChangeId(), headAfterSecondSubmit.name(), - change3.getChangeId(), headAfterThirdSubmit.name()); + assertRefUpdatedEvents( + initialHead, + headAfterFirstSubmit, + headAfterFirstSubmit, + headAfterSecondSubmit, + headAfterSecondSubmit, + headAfterThirdSubmit); + assertChangeMergedEvents( + change.getChangeId(), + headAfterFirstSubmit.name(), + change2.getChangeId(), + headAfterSecondSubmit.name(), + change3.getChangeId(), + headAfterThirdSubmit.name()); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitResolvingMergeCommitIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitResolvingMergeCommitIT.java index ce7e76dbf2..308c9a5513 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitResolvingMergeCommitIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitResolvingMergeCommitIT.java @@ -31,7 +31,10 @@ import com.google.gerrit.testutil.ConfigSuite; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository; @@ -40,18 +43,11 @@ import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.revwalk.RevCommit; import org.junit.Test; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - @NoHttpd public class SubmitResolvingMergeCommitIT extends AbstractDaemonTest { - @Inject - private Provider mergeSuperSet; + @Inject private Provider mergeSuperSet; - @Inject - private Submit submit; + @Inject private Submit submit; @ConfigSuite.Default public static Config submitWholeTopicEnabled() { @@ -71,15 +67,15 @@ public class SubmitResolvingMergeCommitIT extends AbstractDaemonTest { */ PushOneCommit.Result a = createChange("A"); - PushOneCommit.Result b = createChange("B", "new.txt", "No conflict line", - ImmutableList.of(a.getCommit())); + PushOneCommit.Result b = + createChange("B", "new.txt", "No conflict line", ImmutableList.of(a.getCommit())); PushOneCommit.Result c = createChange("C", ImmutableList.of(b.getCommit())); PushOneCommit.Result d = createChange("D", ImmutableList.of(c.getCommit())); PushOneCommit.Result e = createChange("E", ImmutableList.of(a.getCommit())); PushOneCommit.Result f = createChange("F", ImmutableList.of(e.getCommit())); - PushOneCommit.Result g = createChange("G", "new.txt", "Conflicting line", - ImmutableList.of(f.getCommit())); + PushOneCommit.Result g = + createChange("G", "new.txt", "Conflicting line", ImmutableList.of(f.getCommit())); PushOneCommit.Result h = createChange("H", ImmutableList.of(g.getCommit())); approve(a.getChangeId()); @@ -98,8 +94,9 @@ public class SubmitResolvingMergeCommitIT extends AbstractDaemonTest { assertNotMergeable(g.getChange()); assertNotMergeable(h.getChange()); - PushOneCommit.Result m = createChange("M", "new.txt", "Resolved conflict", - ImmutableList.of(d.getCommit(), h.getCommit())); + PushOneCommit.Result m = + createChange( + "M", "new.txt", "Resolved conflict", ImmutableList.of(d.getCommit(), h.getCommit())); approve(m.getChangeId()); assertChangeSetMergeable(m.getChange(), true); @@ -127,17 +124,18 @@ public class SubmitResolvingMergeCommitIT extends AbstractDaemonTest { */ PushOneCommit.Result a = createChange("A"); - PushOneCommit.Result b = createChange("B", "new.txt", "No conflict line", - ImmutableList.of(a.getCommit())); - PushOneCommit.Result c = createChange("C", "new.txt", "No conflict line #2", - ImmutableList.of(b.getCommit())); + PushOneCommit.Result b = + createChange("B", "new.txt", "No conflict line", ImmutableList.of(a.getCommit())); + PushOneCommit.Result c = + createChange("C", "new.txt", "No conflict line #2", ImmutableList.of(b.getCommit())); PushOneCommit.Result d = createChange("D", ImmutableList.of(c.getCommit())); - PushOneCommit.Result e = createChange("E", "new.txt", "Conflicting line", - ImmutableList.of(a.getCommit())); - PushOneCommit.Result f = createChange("F", "new.txt", "Resolved conflict", - ImmutableList.of(b.getCommit(), e.getCommit())); - PushOneCommit.Result g = createChange("G", "new.txt", "Conflicting line #2", - ImmutableList.of(f.getCommit())); + PushOneCommit.Result e = + createChange("E", "new.txt", "Conflicting line", ImmutableList.of(a.getCommit())); + PushOneCommit.Result f = + createChange( + "F", "new.txt", "Resolved conflict", ImmutableList.of(b.getCommit(), e.getCommit())); + PushOneCommit.Result g = + createChange("G", "new.txt", "Conflicting line #2", ImmutableList.of(f.getCommit())); assertMergeable(e.getChange()); @@ -188,37 +186,50 @@ public class SubmitResolvingMergeCommitIT extends AbstractDaemonTest { String project2Name = name("Project2"); gApi.projects().create(project1Name); gApi.projects().create(project2Name); - TestRepository project1 = - cloneProject(new Project.NameKey(project1Name)); - TestRepository project2 = - cloneProject(new Project.NameKey(project2Name)); + TestRepository project1 = cloneProject(new Project.NameKey(project1Name)); + TestRepository project2 = cloneProject(new Project.NameKey(project2Name)); PushOneCommit.Result a = createChange(project1, "A"); - PushOneCommit.Result b = createChange(project1, "B", "new.txt", - "No conflict line", ImmutableList.of(a.getCommit())); - PushOneCommit.Result c = createChange(project1, "C", "new.txt", - "No conflict line #2", ImmutableList.of(b.getCommit())); + PushOneCommit.Result b = + createChange(project1, "B", "new.txt", "No conflict line", ImmutableList.of(a.getCommit())); + PushOneCommit.Result c = + createChange( + project1, "C", "new.txt", "No conflict line #2", ImmutableList.of(b.getCommit())); approve(a.getChangeId()); approve(b.getChangeId()); approve(c.getChangeId()); submit(c.getChangeId()); - PushOneCommit.Result e = createChange(project1, "E", "new.txt", - "Conflicting line", ImmutableList.of(a.getCommit())); - PushOneCommit.Result f = createChange(project1, "F", "new.txt", - "Resolved conflict", ImmutableList.of(b.getCommit(), e.getCommit())); - PushOneCommit.Result g = createChange(project1, "G", "new.txt", - "Conflicting line #2", ImmutableList.of(f.getCommit()), - "refs/for/master/" + name("topic1")); + PushOneCommit.Result e = + createChange(project1, "E", "new.txt", "Conflicting line", ImmutableList.of(a.getCommit())); + PushOneCommit.Result f = + createChange( + project1, + "F", + "new.txt", + "Resolved conflict", + ImmutableList.of(b.getCommit(), e.getCommit())); + PushOneCommit.Result g = + createChange( + project1, + "G", + "new.txt", + "Conflicting line #2", + ImmutableList.of(f.getCommit()), + "refs/for/master/" + name("topic1")); PushOneCommit.Result h = createChange(project2, "H"); - PushOneCommit.Result i = createChange(project2, "I", "new.txt", - "No conflict line", ImmutableList.of(h.getCommit())); - PushOneCommit.Result j = createChange(project2, "J", "new.txt", - "Conflicting line", ImmutableList.of(h.getCommit())); + PushOneCommit.Result i = + createChange(project2, "I", "new.txt", "No conflict line", ImmutableList.of(h.getCommit())); + PushOneCommit.Result j = + createChange(project2, "J", "new.txt", "Conflicting line", ImmutableList.of(h.getCommit())); PushOneCommit.Result k = - createChange(project2, "K", "new.txt", "Sadly conflicting topic-wise", + createChange( + project2, + "K", + "new.txt", + "Sadly conflicting topic-wise", ImmutableList.of(i.getCommit(), j.getCommit()), "refs/for/master/" + name("topic1")); @@ -236,7 +247,11 @@ public class SubmitResolvingMergeCommitIT extends AbstractDaemonTest { assertChangeSetMergeable(k.getChange(), false); PushOneCommit.Result l = - createChange(project1, "L", "new.txt", "Resolving conflicts again", + createChange( + project1, + "L", + "new.txt", + "Resolving conflicts again", ImmutableList.of(c.getCommit(), g.getCommit()), "refs/for/master/" + name("topic1")); @@ -263,18 +278,19 @@ public class SubmitResolvingMergeCommitIT extends AbstractDaemonTest { */ PushOneCommit.Result a = createChange("A"); - PushOneCommit.Result b = createChange("B", "new.txt", "No conflict line", - ImmutableList.of(a.getCommit())); + PushOneCommit.Result b = + createChange("B", "new.txt", "No conflict line", ImmutableList.of(a.getCommit())); approve(a.getChangeId()); approve(b.getChangeId()); submit(b.getChangeId()); - PushOneCommit.Result c = createChange("C", "new.txt", "Create conflicts", - ImmutableList.of(a.getCommit())); + PushOneCommit.Result c = + createChange("C", "new.txt", "Create conflicts", ImmutableList.of(a.getCommit())); PushOneCommit.Result e = createChange("E", ImmutableList.of(c.getCommit())); - PushOneCommit.Result d = createChange("D", "new.txt", "Resolves conflicts", - ImmutableList.of(c.getCommit(), e.getCommit())); + PushOneCommit.Result d = + createChange( + "D", "new.txt", "Resolves conflicts", ImmutableList.of(c.getCommit(), e.getCommit())); approve(c.getChangeId()); approve(e.getChangeId()); @@ -284,17 +300,12 @@ public class SubmitResolvingMergeCommitIT extends AbstractDaemonTest { } private void submit(String changeId) throws Exception { - gApi.changes() - .id(changeId) - .current() - .submit(); + gApi.changes().id(changeId).current().submit(); } private void assertChangeSetMergeable(ChangeData change, boolean expected) - throws MissingObjectException, IncorrectObjectTypeException, IOException, - OrmException { - ChangeSet cs = - mergeSuperSet.get().completeChangeSet(db, change.change(), user(admin)); + throws MissingObjectException, IncorrectObjectTypeException, IOException, OrmException { + ChangeSet cs = mergeSuperSet.get().completeChangeSet(db, change.change(), user(admin)); assertThat(submit.unmergeableChanges(cs).isEmpty()).isEqualTo(expected); } @@ -309,18 +320,18 @@ public class SubmitResolvingMergeCommitIT extends AbstractDaemonTest { } private void assertMerged(String changeId) throws Exception { - assertThat(gApi - .changes() - .id(changeId) - .get() - .status).isEqualTo(ChangeStatus.MERGED); + assertThat(gApi.changes().id(changeId).get().status).isEqualTo(ChangeStatus.MERGED); } - private PushOneCommit.Result createChange(TestRepository repo, - String subject, String fileName, String content, List parents, - String ref) throws Exception { - PushOneCommit push = pushFactory.create(db, admin.getIdent(), repo, - subject, fileName, content); + private PushOneCommit.Result createChange( + TestRepository repo, + String subject, + String fileName, + String content, + List parents, + String ref) + throws Exception { + PushOneCommit push = pushFactory.create(db, admin.getIdent(), repo, subject, fileName, content); if (!parents.isEmpty()) { push.setParents(parents); @@ -336,33 +347,34 @@ public class SubmitResolvingMergeCommitIT extends AbstractDaemonTest { return result; } - private PushOneCommit.Result createChange(TestRepository repo, - String subject) throws Exception { - return createChange(repo, subject, "x", "x", new ArrayList(), - "refs/for/master"); + private PushOneCommit.Result createChange(TestRepository repo, String subject) + throws Exception { + return createChange(repo, subject, "x", "x", new ArrayList(), "refs/for/master"); } - private PushOneCommit.Result createChange(TestRepository repo, - String subject, String fileName, String content, List parents) - throws Exception { - return createChange(repo, subject, fileName, content, parents, - "refs/for/master"); + private PushOneCommit.Result createChange( + TestRepository repo, + String subject, + String fileName, + String content, + List parents) + throws Exception { + return createChange(repo, subject, fileName, content, parents, "refs/for/master"); } @Override protected PushOneCommit.Result createChange(String subject) throws Exception { - return createChange(testRepo, subject, "", "", - Collections. emptyList(), "refs/for/master"); + return createChange( + testRepo, subject, "", "", Collections.emptyList(), "refs/for/master"); } - private PushOneCommit.Result createChange(String subject, - List parents) throws Exception { + private PushOneCommit.Result createChange(String subject, List parents) + throws Exception { return createChange(testRepo, subject, "", "", parents, "refs/for/master"); } - private PushOneCommit.Result createChange(String subject, String fileName, - String content, List parents) throws Exception { - return createChange(testRepo, subject, fileName, content, parents, - "refs/for/master"); + private PushOneCommit.Result createChange( + String subject, String fileName, String content, List parents) throws Exception { + return createChange(testRepo, subject, fileName, content, parents, "refs/for/master"); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SuggestReviewersIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SuggestReviewersIT.java index bf3f05c651..9c972cb057 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SuggestReviewersIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SuggestReviewersIT.java @@ -39,21 +39,17 @@ import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.group.CreateGroup; import com.google.gerrit.server.group.GroupsCollection; import com.google.inject.Inject; - -import org.junit.Before; -import org.junit.Test; - import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; +import org.junit.Before; +import org.junit.Test; @Sandboxed public class SuggestReviewersIT extends AbstractDaemonTest { - @Inject - private CreateGroup.Factory createGroupFactory; + @Inject private CreateGroup.Factory createGroupFactory; - @Inject - private GroupsCollection groups; + @Inject private GroupsCollection groups; private AccountGroup group1; private AccountGroup group2; @@ -80,8 +76,7 @@ public class SuggestReviewersIT extends AbstractDaemonTest { @GerritConfig(name = "accounts.visibility", value = "NONE") public void suggestReviewersNoResult1() throws Exception { String changeId = createChange().getChangeId(); - List reviewers = - suggestReviewers(changeId, name("u"), 6); + List reviewers = suggestReviewers(changeId, name("u"), 6); assertThat(reviewers).isEmpty(); } @@ -90,22 +85,20 @@ public class SuggestReviewersIT extends AbstractDaemonTest { @GerritConfig(name = "accounts.visibility", value = "NONE") public void suggestReviewersNoResult2() throws Exception { String changeId = createChange().getChangeId(); - List reviewers = - suggestReviewers(changeId, name("u"), 6); + List reviewers = suggestReviewers(changeId, name("u"), 6); assertThat(reviewers).isEmpty(); } @Test public void suggestReviewersChange() throws Exception { String changeId = createChange().getChangeId(); - List reviewers = - suggestReviewers(changeId, name("u"), 6); - assertReviewers(reviewers, ImmutableList.of(user1, user2, user3), - ImmutableList.of(group1, group2, group3)); + List reviewers = suggestReviewers(changeId, name("u"), 6); + assertReviewers( + reviewers, ImmutableList.of(user1, user2, user3), ImmutableList.of(group1, group2, group3)); reviewers = suggestReviewers(changeId, name("u"), 5); - assertReviewers(reviewers, ImmutableList.of(user1, user2, user3), - ImmutableList.of(group1, group2)); + assertReviewers( + reviewers, ImmutableList.of(user1, user2, user3), ImmutableList.of(group1, group2)); reviewers = suggestReviewers(changeId, group3.getName(), 10); assertReviewers(reviewers, ImmutableList.of(), ImmutableList.of(group3)); @@ -117,8 +110,8 @@ public class SuggestReviewersIT extends AbstractDaemonTest { assertThat(reviewers).hasSize(1); assertThat(reviewers.get(0).account).isNotNull(); assertThat(ImmutableList.of(reviewers.get(0).account._accountId)) - .containsAnyIn(ImmutableList.of(user1, user2, user3).stream() - .map(u -> u.id.get()).collect(toList())); + .containsAnyIn( + ImmutableList.of(user1, user2, user3).stream().map(u -> u.id.get()).collect(toList())); } @Test @@ -129,8 +122,7 @@ public class SuggestReviewersIT extends AbstractDaemonTest { reviewers = suggestReviewers(changeId, user2.username, 2); assertThat(reviewers).hasSize(1); - assertThat(Iterables.getOnlyElement(reviewers).account.name) - .isEqualTo(user2.fullName); + assertThat(Iterables.getOnlyElement(reviewers).account.name).isEqualTo(user2.fullName); setApiUser(user1); reviewers = suggestReviewers(changeId, user2.fullName, 2); @@ -139,14 +131,12 @@ public class SuggestReviewersIT extends AbstractDaemonTest { setApiUser(user2); reviewers = suggestReviewers(changeId, user2.username, 2); assertThat(reviewers).hasSize(1); - assertThat(Iterables.getOnlyElement(reviewers).account.name) - .isEqualTo(user2.fullName); + assertThat(Iterables.getOnlyElement(reviewers).account.name).isEqualTo(user2.fullName); setApiUser(user3); reviewers = suggestReviewers(changeId, user2.username, 2); assertThat(reviewers).hasSize(1); - assertThat(Iterables.getOnlyElement(reviewers).account.name) - .isEqualTo(user2.fullName); + assertThat(Iterables.getOnlyElement(reviewers).account.name).isEqualTo(user2.fullName); } @Test @@ -172,20 +162,17 @@ public class SuggestReviewersIT extends AbstractDaemonTest { assertThat(reviewers).isEmpty(); setApiUser(user1); // Clear cached group info. - allowGlobalCapabilities(group1.getGroupUUID(), - GlobalCapability.VIEW_ALL_ACCOUNTS); + allowGlobalCapabilities(group1.getGroupUUID(), GlobalCapability.VIEW_ALL_ACCOUNTS); reviewers = suggestReviewers(changeId, user2.username, 2); assertThat(reviewers).hasSize(1); - assertThat(Iterables.getOnlyElement(reviewers).account.name) - .isEqualTo(user2.fullName); + assertThat(Iterables.getOnlyElement(reviewers).account.name).isEqualTo(user2.fullName); } @Test @GerritConfig(name = "suggest.maxSuggestedReviewers", value = "2") public void suggestReviewersMaxNbrSuggestions() throws Exception { String changeId = createChange().getChangeId(); - List reviewers = - suggestReviewers(changeId, name("user"), 5); + List reviewers = suggestReviewers(changeId, name("user"), 5); assertThat(reviewers).hasSize(2); } @@ -245,16 +232,14 @@ public class SuggestReviewersIT extends AbstractDaemonTest { public void suggestReviewersWithoutLimitOptionSpecified() throws Exception { String changeId = createChange().getChangeId(); String query = user3.username; - List suggestedReviewerInfos = gApi.changes() - .id(changeId) - .suggestReviewers(query) - .get(); + List suggestedReviewerInfos = + gApi.changes().id(changeId).suggestReviewers(query).get(); assertThat(suggestedReviewerInfos).hasSize(1); } @Test - @GerritConfig(name = "addreviewer.maxAllowed", value="2") - @GerritConfig(name = "addreviewer.maxWithoutConfirmation", value="1") + @GerritConfig(name = "addreviewer.maxAllowed", value = "2") + @GerritConfig(name = "addreviewer.maxWithoutConfirmation", value = "1") public void suggestReviewersGroupSizeConsiderations() throws Exception { AccountGroup largeGroup = group("large"); AccountGroup mediumGroup = group("medium"); @@ -290,7 +275,7 @@ public class SuggestReviewersIT extends AbstractDaemonTest { } @Test - public void defaultReviewerSuggestion() throws Exception{ + public void defaultReviewerSuggestion() throws Exception { TestAccount user1 = user("customuser1", "User1"); TestAccount reviewer1 = user("customuser2", "User2"); TestAccount reviewer2 = user("customuser3", "User3"); @@ -312,42 +297,30 @@ public class SuggestReviewersIT extends AbstractDaemonTest { setApiUser(user1); String changeId3 = createChangeFromApi(); - List reviewers = - suggestReviewers(changeId3, null, 4); - assertThat( - reviewers.stream() - .map(r -> r.account._accountId) - .collect(Collectors.toList())) - .containsExactly( - reviewer1.id.get(), - reviewer2.id.get()) + List reviewers = suggestReviewers(changeId3, null, 4); + assertThat(reviewers.stream().map(r -> r.account._accountId).collect(Collectors.toList())) + .containsExactly(reviewer1.id.get(), reviewer2.id.get()) .inOrder(); // check that existing reviewers are filtered out gApi.changes().id(changeId3).addReviewer(reviewer1.email); - reviewers = - suggestReviewers(changeId3, null, 4); - assertThat( - reviewers.stream() - .map(r -> r.account._accountId) - .collect(Collectors.toList())) - .containsExactly( - reviewer2.id.get()) + reviewers = suggestReviewers(changeId3, null, 4); + assertThat(reviewers.stream().map(r -> r.account._accountId).collect(Collectors.toList())) + .containsExactly(reviewer2.id.get()) .inOrder(); } @Test - public void defaultReviewerSuggestionOnFirstChange() throws Exception{ + public void defaultReviewerSuggestionOnFirstChange() throws Exception { TestAccount user1 = user("customuser1", "User1"); setApiUser(user1); - List reviewers = - suggestReviewers(createChange().getChangeId(), "", 4); + List reviewers = suggestReviewers(createChange().getChangeId(), "", 4); assertThat(reviewers).isEmpty(); } @Test @GerritConfig(name = "suggest.maxSuggestedReviewers", value = "10") - public void reviewerRanking() throws Exception{ + public void reviewerRanking() throws Exception { // Assert that user are ranked by the number of times they have applied a // a label to a change (highest), added comments (medium) or owned a // change (low). @@ -384,22 +357,15 @@ public class SuggestReviewersIT extends AbstractDaemonTest { // ranking setApiUser(userWhoLooksForSuggestions); - List reviewers = - suggestReviewers(createChangeFromApi(), "Pri", 4); - assertThat( - reviewers.stream() - .map(r -> r.account._accountId) - .collect(Collectors.toList())) + List reviewers = suggestReviewers(createChangeFromApi(), "Pri", 4); + assertThat(reviewers.stream().map(r -> r.account._accountId).collect(Collectors.toList())) .containsExactly( - reviewer1.id.get(), - reviewer2.id.get(), - userWhoOwns.id.get(), - userWhoComments.id.get()) + reviewer1.id.get(), reviewer2.id.get(), userWhoOwns.id.get(), userWhoComments.id.get()) .inOrder(); } @Test - public void reviewerRankingProjectIsolation() throws Exception{ + public void reviewerRankingProjectIsolation() throws Exception { // Create new project Project.NameKey newProject = createProject("test"); @@ -428,54 +394,38 @@ public class SuggestReviewersIT extends AbstractDaemonTest { reviewChange(changeId3); setApiUser(userWhoOwns); - List reviewers = - suggestReviewers(createChangeFromApi(), "Prim", 4); + List reviewers = suggestReviewers(createChangeFromApi(), "Prim", 4); // Assert that reviewer1 is on top, even though reviewer2 has more reviews // in other projects - assertThat( - reviewers.stream() - .map(r -> r.account._accountId) - .collect(Collectors.toList())) + assertThat(reviewers.stream().map(r -> r.account._accountId).collect(Collectors.toList())) .containsExactly(reviewer1.id.get(), reviewer2.id.get()) .inOrder(); } - private List suggestReviewers(String changeId, - String query) throws Exception { - return gApi.changes() - .id(changeId) - .suggestReviewers(query) - .get(); + private List suggestReviewers(String changeId, String query) + throws Exception { + return gApi.changes().id(changeId).suggestReviewers(query).get(); } - private List suggestReviewers(String changeId, - String query, int n) throws Exception { - return gApi.changes() - .id(changeId) - .suggestReviewers(query) - .withLimit(n) - .get(); + private List suggestReviewers(String changeId, String query, int n) + throws Exception { + return gApi.changes().id(changeId).suggestReviewers(query).withLimit(n).get(); } private AccountGroup group(String name) throws Exception { - GroupInfo group = createGroupFactory.create(name(name)) - .apply(TopLevelResource.INSTANCE, null); + GroupInfo group = createGroupFactory.create(name(name)).apply(TopLevelResource.INSTANCE, null); GroupDescription.Basic d = groups.parseInternal(Url.decode(group.id)); return GroupDescriptions.toAccountGroup(d); } - private TestAccount user(String name, String fullName, String emailName, - AccountGroup... groups) throws Exception { - String[] groupNames = Arrays.stream(groups) - .map(AccountGroup::getName) - .toArray(String[]::new); - return accounts.create(name(name), name(emailName) + "@example.com", - fullName, groupNames); + private TestAccount user(String name, String fullName, String emailName, AccountGroup... groups) + throws Exception { + String[] groupNames = Arrays.stream(groups).map(AccountGroup::getName).toArray(String[]::new); + return accounts.create(name(name), name(emailName) + "@example.com", fullName, groupNames); } - private TestAccount user(String name, String fullName, AccountGroup... groups) - throws Exception { + private TestAccount user(String name, String fullName, AccountGroup... groups) throws Exception { return user(name, fullName, name, groups); } @@ -485,12 +435,11 @@ public class SuggestReviewersIT extends AbstractDaemonTest { gApi.changes().id(changeId).current().review(ri); } - private String createChangeFromApi() throws RestApiException{ + private String createChangeFromApi() throws RestApiException { return createChangeFromApi(project); } - private String createChangeFromApi(Project.NameKey project) - throws RestApiException{ + private String createChangeFromApi(Project.NameKey project) throws RestApiException { ChangeInput ci = new ChangeInput(); ci.project = project.get(); ci.subject = "Test change at" + System.nanoTime(); @@ -498,25 +447,24 @@ public class SuggestReviewersIT extends AbstractDaemonTest { return gApi.changes().create(ci).get().changeId; } - private void assertReviewers(List actual, - List expectedUsers, List expectedGroups) { - List actualAccountIds = actual.stream() - .filter(i -> i.account != null) - .map(i -> i.account._accountId) - .collect(toList()); + private void assertReviewers( + List actual, + List expectedUsers, + List expectedGroups) { + List actualAccountIds = + actual + .stream() + .filter(i -> i.account != null) + .map(i -> i.account._accountId) + .collect(toList()); assertThat(actualAccountIds) - .containsExactlyElementsIn( - expectedUsers.stream().map(u -> u.id.get()).collect(toList())); + .containsExactlyElementsIn(expectedUsers.stream().map(u -> u.id.get()).collect(toList())); - List actualGroupIds = actual.stream() - .filter(i -> i.group != null) - .map(i -> i.group.id) - .collect(toList()); + List actualGroupIds = + actual.stream().filter(i -> i.group != null).map(i -> i.group.id).collect(toList()); assertThat(actualGroupIds) .containsExactlyElementsIn( - expectedGroups.stream() - .map(g -> g.getGroupUUID().get()) - .collect(toList())) + expectedGroups.stream().map(g -> g.getGroupUUID().get()).collect(toList())) .inOrder(); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/TopicIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/TopicIT.java index f52fccd6a2..3121812792 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/TopicIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/TopicIT.java @@ -17,7 +17,6 @@ package com.google.gerrit.acceptance.rest.change; import com.google.gerrit.acceptance.AbstractDaemonTest; import com.google.gerrit.acceptance.PushOneCommit.Result; import com.google.gerrit.acceptance.RestResponse; - import org.junit.Test; public class TopicIT extends AbstractDaemonTest { diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/CacheOperationsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/CacheOperationsIT.java index b4bfed67d9..2ef74b4669 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/CacheOperationsIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/CacheOperationsIT.java @@ -24,10 +24,8 @@ import com.google.gerrit.acceptance.RestResponse; import com.google.gerrit.common.data.GlobalCapability; import com.google.gerrit.server.config.ListCaches.CacheInfo; import com.google.gerrit.server.config.PostCaches; - -import org.junit.Test; - import java.util.Arrays; +import org.junit.Test; public class CacheOperationsIT extends AbstractDaemonTest { @@ -47,15 +45,15 @@ public class CacheOperationsIT extends AbstractDaemonTest { @Test public void flushAll_Forbidden() throws Exception { - userRestSession.post("/config/server/caches/", - new PostCaches.Input(FLUSH_ALL)).assertForbidden(); + userRestSession + .post("/config/server/caches/", new PostCaches.Input(FLUSH_ALL)) + .assertForbidden(); } @Test public void flushAll_BadRequest() throws Exception { adminRestSession - .post("/config/server/caches/", - new PostCaches.Input(FLUSH_ALL, Arrays.asList("projects"))) + .post("/config/server/caches/", new PostCaches.Input(FLUSH_ALL, Arrays.asList("projects"))) .assertBadRequest(); } @@ -63,14 +61,16 @@ public class CacheOperationsIT extends AbstractDaemonTest { public void flush() throws Exception { RestResponse r = adminRestSession.getOK("/config/server/caches/project_list"); CacheInfo cacheInfo = newGson().fromJson(r.getReader(), CacheInfo.class); - assertThat(cacheInfo.entries.mem).isGreaterThan((long)0); + assertThat(cacheInfo.entries.mem).isGreaterThan((long) 0); r = adminRestSession.getOK("/config/server/caches/projects"); cacheInfo = newGson().fromJson(r.getReader(), CacheInfo.class); - assertThat(cacheInfo.entries.mem).isGreaterThan((long)1); + assertThat(cacheInfo.entries.mem).isGreaterThan((long) 1); - r = adminRestSession.postOK("/config/server/caches/", - new PostCaches.Input(FLUSH, Arrays.asList("accounts", "project_list"))); + r = + adminRestSession.postOK( + "/config/server/caches/", + new PostCaches.Input(FLUSH, Arrays.asList("accounts", "project_list"))); r.consume(); r = adminRestSession.getOK("/config/server/caches/project_list"); @@ -79,57 +79,56 @@ public class CacheOperationsIT extends AbstractDaemonTest { r = adminRestSession.getOK("/config/server/caches/projects"); cacheInfo = newGson().fromJson(r.getReader(), CacheInfo.class); - assertThat(cacheInfo.entries.mem).isGreaterThan((long)1); + assertThat(cacheInfo.entries.mem).isGreaterThan((long) 1); } @Test public void flush_Forbidden() throws Exception { userRestSession - .post("/config/server/caches/", - new PostCaches.Input(FLUSH, Arrays.asList("projects"))) + .post("/config/server/caches/", new PostCaches.Input(FLUSH, Arrays.asList("projects"))) .assertForbidden(); } @Test public void flush_BadRequest() throws Exception { - adminRestSession - .post("/config/server/caches/", - new PostCaches.Input(FLUSH)) - .assertBadRequest(); + adminRestSession.post("/config/server/caches/", new PostCaches.Input(FLUSH)).assertBadRequest(); } @Test public void flush_UnprocessableEntity() throws Exception { RestResponse r = adminRestSession.getOK("/config/server/caches/projects"); CacheInfo cacheInfo = newGson().fromJson(r.getReader(), CacheInfo.class); - assertThat(cacheInfo.entries.mem).isGreaterThan((long)0); + assertThat(cacheInfo.entries.mem).isGreaterThan((long) 0); - r = adminRestSession.post("/config/server/caches/", - new PostCaches.Input(FLUSH, Arrays.asList("projects", "unprocessable"))); + r = + adminRestSession.post( + "/config/server/caches/", + new PostCaches.Input(FLUSH, Arrays.asList("projects", "unprocessable"))); r.assertUnprocessableEntity(); r.consume(); r = adminRestSession.getOK("/config/server/caches/projects"); cacheInfo = newGson().fromJson(r.getReader(), CacheInfo.class); - assertThat(cacheInfo.entries.mem).isGreaterThan((long)0); + assertThat(cacheInfo.entries.mem).isGreaterThan((long) 0); } @Test public void flushWebSessions_Forbidden() throws Exception { - allowGlobalCapabilities(REGISTERED_USERS, - GlobalCapability.FLUSH_CACHES, GlobalCapability.VIEW_CACHES); + allowGlobalCapabilities( + REGISTERED_USERS, GlobalCapability.FLUSH_CACHES, GlobalCapability.VIEW_CACHES); try { - RestResponse r = userRestSession.postOK("/config/server/caches/", - new PostCaches.Input(FLUSH, Arrays.asList("projects"))); + RestResponse r = + userRestSession.postOK( + "/config/server/caches/", new PostCaches.Input(FLUSH, Arrays.asList("projects"))); r.consume(); userRestSession - .post("/config/server/caches/", - new PostCaches.Input(FLUSH, Arrays.asList("web_sessions"))) + .post( + "/config/server/caches/", new PostCaches.Input(FLUSH, Arrays.asList("web_sessions"))) .assertForbidden(); } finally { - removeGlobalCapabilities(REGISTERED_USERS, - GlobalCapability.FLUSH_CACHES, GlobalCapability.VIEW_CACHES); + removeGlobalCapabilities( + REGISTERED_USERS, GlobalCapability.FLUSH_CACHES, GlobalCapability.VIEW_CACHES); } } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ConfirmEmailIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ConfirmEmailIT.java index bdcdfaeee8..dea9174c97 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ConfirmEmailIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ConfirmEmailIT.java @@ -20,7 +20,6 @@ import com.google.gerrit.server.mail.EmailTokenVerifier; import com.google.gerrit.testutil.ConfigSuite; import com.google.gwtjsonrpc.server.SignedToken; import com.google.inject.Inject; - import org.eclipse.jgit.lib.Config; import org.junit.Test; @@ -28,47 +27,37 @@ public class ConfirmEmailIT extends AbstractDaemonTest { @ConfigSuite.Default public static Config defaultConfig() { Config cfg = new Config(); - cfg.setString("auth", null, "registerEmailPrivateKey", - SignedToken.generateRandomKey()); + cfg.setString("auth", null, "registerEmailPrivateKey", SignedToken.generateRandomKey()); return cfg; } - @Inject - private EmailTokenVerifier emailTokenVerifier; + @Inject private EmailTokenVerifier emailTokenVerifier; @Test public void confirm() throws Exception { ConfirmEmail.Input in = new ConfirmEmail.Input(); in.token = emailTokenVerifier.encode(admin.getId(), "new.mail@example.com"); - adminRestSession - .put("/config/server/email.confirm", in) - .assertNoContent(); + adminRestSession.put("/config/server/email.confirm", in).assertNoContent(); } @Test public void confirmForOtherUser_UnprocessableEntity() throws Exception { ConfirmEmail.Input in = new ConfirmEmail.Input(); in.token = emailTokenVerifier.encode(user.getId(), "new.mail@example.com"); - adminRestSession - .put("/config/server/email.confirm", in) - .assertUnprocessableEntity(); + adminRestSession.put("/config/server/email.confirm", in).assertUnprocessableEntity(); } @Test public void confirmInvalidToken_UnprocessableEntity() throws Exception { ConfirmEmail.Input in = new ConfirmEmail.Input(); in.token = "invalidToken"; - adminRestSession - .put("/config/server/email.confirm", in) - .assertUnprocessableEntity(); + adminRestSession.put("/config/server/email.confirm", in).assertUnprocessableEntity(); } @Test public void confirmAlreadyInUse_UnprocessableEntity() throws Exception { ConfirmEmail.Input in = new ConfirmEmail.Input(); in.token = emailTokenVerifier.encode(admin.getId(), user.email); - adminRestSession - .put("/config/server/email.confirm", in) - .assertUnprocessableEntity(); + adminRestSession.put("/config/server/email.confirm", in).assertUnprocessableEntity(); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/FlushCacheIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/FlushCacheIT.java index 149d05f522..3f675ef7cc 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/FlushCacheIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/FlushCacheIT.java @@ -21,7 +21,6 @@ import com.google.gerrit.acceptance.AbstractDaemonTest; import com.google.gerrit.acceptance.RestResponse; import com.google.gerrit.common.data.GlobalCapability; import com.google.gerrit.server.config.ListCaches.CacheInfo; - import org.junit.Test; public class FlushCacheIT extends AbstractDaemonTest { @@ -30,7 +29,7 @@ public class FlushCacheIT extends AbstractDaemonTest { public void flushCache() throws Exception { RestResponse r = adminRestSession.get("/config/server/caches/groups"); CacheInfo result = newGson().fromJson(r.getReader(), CacheInfo.class); - assertThat(result.entries.mem).isGreaterThan((long)0); + assertThat(result.entries.mem).isGreaterThan((long) 0); r = adminRestSession.post("/config/server/caches/groups/flush"); r.assertOK(); @@ -43,47 +42,37 @@ public class FlushCacheIT extends AbstractDaemonTest { @Test public void flushCache_Forbidden() throws Exception { - userRestSession - .post("/config/server/caches/accounts/flush") - .assertForbidden(); + userRestSession.post("/config/server/caches/accounts/flush").assertForbidden(); } @Test public void flushCache_NotFound() throws Exception { - adminRestSession - .post("/config/server/caches/nonExisting/flush") - .assertNotFound(); + adminRestSession.post("/config/server/caches/nonExisting/flush").assertNotFound(); } @Test public void flushCacheWithGerritPrefix() throws Exception { - adminRestSession - .post("/config/server/caches/gerrit-accounts/flush") - .assertOK(); + adminRestSession.post("/config/server/caches/gerrit-accounts/flush").assertOK(); } @Test public void flushWebSessionsCache() throws Exception { - adminRestSession - .post("/config/server/caches/web_sessions/flush") - .assertOK(); + adminRestSession.post("/config/server/caches/web_sessions/flush").assertOK(); } @Test public void flushWebSessionsCache_Forbidden() throws Exception { - allowGlobalCapabilities(REGISTERED_USERS, - GlobalCapability.VIEW_CACHES, GlobalCapability.FLUSH_CACHES); + allowGlobalCapabilities( + REGISTERED_USERS, GlobalCapability.VIEW_CACHES, GlobalCapability.FLUSH_CACHES); try { RestResponse r = userRestSession.post("/config/server/caches/accounts/flush"); r.assertOK(); r.consume(); - userRestSession - .post("/config/server/caches/web_sessions/flush") - .assertForbidden(); + userRestSession.post("/config/server/caches/web_sessions/flush").assertForbidden(); } finally { - removeGlobalCapabilities(REGISTERED_USERS, - GlobalCapability.VIEW_CACHES, GlobalCapability.FLUSH_CACHES); + removeGlobalCapabilities( + REGISTERED_USERS, GlobalCapability.VIEW_CACHES, GlobalCapability.FLUSH_CACHES); } } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/GetCacheIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/GetCacheIT.java index 1a1ccd9025..fe600ccb89 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/GetCacheIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/GetCacheIT.java @@ -20,7 +20,6 @@ import com.google.gerrit.acceptance.AbstractDaemonTest; import com.google.gerrit.acceptance.RestResponse; import com.google.gerrit.server.config.ListCaches.CacheInfo; import com.google.gerrit.server.config.ListCaches.CacheType; - import org.junit.Test; public class GetCacheIT extends AbstractDaemonTest { @@ -51,22 +50,16 @@ public class GetCacheIT extends AbstractDaemonTest { @Test public void getCache_Forbidden() throws Exception { - userRestSession - .get("/config/server/caches/accounts") - .assertForbidden(); + userRestSession.get("/config/server/caches/accounts").assertForbidden(); } @Test public void getCache_NotFound() throws Exception { - adminRestSession - .get("/config/server/caches/nonExisting") - .assertNotFound(); + adminRestSession.get("/config/server/caches/nonExisting").assertNotFound(); } @Test public void getCacheWithGerritPrefix() throws Exception { - adminRestSession - .get("/config/server/caches/gerrit-accounts") - .assertOK(); + adminRestSession.get("/config/server/caches/gerrit-accounts").assertOK(); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/GetTaskIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/GetTaskIT.java index 1321650061..900b4be727 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/GetTaskIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/GetTaskIT.java @@ -20,21 +20,16 @@ import com.google.gerrit.acceptance.AbstractDaemonTest; import com.google.gerrit.acceptance.RestResponse; import com.google.gerrit.server.config.ListTasks.TaskInfo; import com.google.gson.reflect.TypeToken; - -import org.junit.Test; - import java.util.List; +import org.junit.Test; public class GetTaskIT extends AbstractDaemonTest { @Test public void getTask() throws Exception { - RestResponse r = - adminRestSession.get("/config/server/tasks/" + getLogFileCompressorTaskId()); + RestResponse r = adminRestSession.get("/config/server/tasks/" + getLogFileCompressorTaskId()); r.assertOK(); - TaskInfo info = - newGson().fromJson(r.getReader(), - new TypeToken() {}.getType()); + TaskInfo info = newGson().fromJson(r.getReader(), new TypeToken() {}.getType()); assertThat(info.id).isNotNull(); Long.parseLong(info.id, 16); assertThat(info.command).isEqualTo("Log File Compressor"); @@ -43,16 +38,13 @@ public class GetTaskIT extends AbstractDaemonTest { @Test public void getTask_NotFound() throws Exception { - userRestSession - .get("/config/server/tasks/" + getLogFileCompressorTaskId()) - .assertNotFound(); + userRestSession.get("/config/server/tasks/" + getLogFileCompressorTaskId()).assertNotFound(); } private String getLogFileCompressorTaskId() throws Exception { RestResponse r = adminRestSession.get("/config/server/tasks/"); List result = - newGson().fromJson(r.getReader(), - new TypeToken>() {}.getType()); + newGson().fromJson(r.getReader(), new TypeToken>() {}.getType()); r.consume(); for (TaskInfo info : result) { if ("Log File Compressor".equals(info.command)) { diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/KillTaskIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/KillTaskIT.java index 306bb589d2..ece30e92a5 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/KillTaskIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/KillTaskIT.java @@ -20,17 +20,15 @@ import com.google.gerrit.acceptance.AbstractDaemonTest; import com.google.gerrit.acceptance.RestResponse; import com.google.gerrit.server.config.ListTasks.TaskInfo; import com.google.gson.reflect.TypeToken; - -import org.junit.Test; - import java.util.List; +import org.junit.Test; public class KillTaskIT extends AbstractDaemonTest { private void killTask() throws Exception { RestResponse r = adminRestSession.get("/config/server/tasks/"); - List result = newGson().fromJson(r.getReader(), - new TypeToken>() {}.getType()); + List result = + newGson().fromJson(r.getReader(), new TypeToken>() {}.getType()); r.consume(); int taskCount = result.size(); assertThat(taskCount).isGreaterThan(0); @@ -40,22 +38,19 @@ public class KillTaskIT extends AbstractDaemonTest { r.consume(); r = adminRestSession.get("/config/server/tasks/"); - result = newGson().fromJson(r.getReader(), - new TypeToken>() {}.getType()); + result = newGson().fromJson(r.getReader(), new TypeToken>() {}.getType()); r.consume(); assertThat(result).hasSize(taskCount - 1); } private void killTask_NotFound() throws Exception { RestResponse r = adminRestSession.get("/config/server/tasks/"); - List result = newGson().fromJson(r.getReader(), - new TypeToken>() {}.getType()); + List result = + newGson().fromJson(r.getReader(), new TypeToken>() {}.getType()); r.consume(); assertThat(result.size()).isGreaterThan(0); - userRestSession - .delete("/config/server/tasks/" + result.get(0).id) - .assertNotFound(); + userRestSession.delete("/config/server/tasks/" + result.get(0).id).assertNotFound(); } @Test diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ListCachesIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ListCachesIT.java index d0a5070caa..4d48bf41b1 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ListCachesIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ListCachesIT.java @@ -23,13 +23,11 @@ import com.google.gerrit.acceptance.RestResponse; import com.google.gerrit.server.config.ListCaches.CacheInfo; import com.google.gerrit.server.config.ListCaches.CacheType; import com.google.gson.reflect.TypeToken; - -import org.eclipse.jgit.util.Base64; -import org.junit.Test; - import java.util.Arrays; import java.util.List; import java.util.Map; +import org.eclipse.jgit.util.Base64; +import org.junit.Test; public class ListCachesIT extends AbstractDaemonTest { @@ -38,8 +36,7 @@ public class ListCachesIT extends AbstractDaemonTest { RestResponse r = adminRestSession.get("/config/server/caches/"); r.assertOK(); Map result = - newGson().fromJson(r.getReader(), - new TypeToken>() {}.getType()); + newGson().fromJson(r.getReader(), new TypeToken>() {}.getType()); assertThat(result).containsKey("accounts"); CacheInfo accountsCacheInfo = result.get("accounts"); @@ -56,16 +53,14 @@ public class ListCachesIT extends AbstractDaemonTest { userRestSession.get("/config/server/version").consume(); r = adminRestSession.get("/config/server/caches/"); r.assertOK(); - result = newGson().fromJson(r.getReader(), - new TypeToken>() {}.getType()); + result = + newGson().fromJson(r.getReader(), new TypeToken>() {}.getType()); assertThat(result.get("accounts").entries.mem).isEqualTo(2); } @Test public void listCaches_Forbidden() throws Exception { - userRestSession - .get("/config/server/caches/") - .assertForbidden(); + userRestSession.get("/config/server/caches/").assertForbidden(); } @Test @@ -73,8 +68,7 @@ public class ListCachesIT extends AbstractDaemonTest { RestResponse r = adminRestSession.get("/config/server/caches/?format=LIST"); r.assertOK(); List result = - newGson().fromJson(r.getReader(), - new TypeToken>() {}.getType()); + newGson().fromJson(r.getReader(), new TypeToken>() {}.getType()); assertThat(result).contains("accounts"); assertThat(result).contains("projects"); assertThat(Ordering.natural().isOrdered(result)).isTrue(); @@ -93,8 +87,6 @@ public class ListCachesIT extends AbstractDaemonTest { @Test public void listCaches_BadRequest() throws Exception { - adminRestSession - .get("/config/server/caches/?format=NONSENSE") - .assertBadRequest(); + adminRestSession.get("/config/server/caches/?format=NONSENSE").assertBadRequest(); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ListTasksIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ListTasksIT.java index c405ff2a66..ee6411ab6c 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ListTasksIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ListTasksIT.java @@ -20,10 +20,8 @@ import com.google.gerrit.acceptance.AbstractDaemonTest; import com.google.gerrit.acceptance.RestResponse; import com.google.gerrit.server.config.ListTasks.TaskInfo; import com.google.gson.reflect.TypeToken; - -import org.junit.Test; - import java.util.List; +import org.junit.Test; public class ListTasksIT extends AbstractDaemonTest { @@ -32,8 +30,7 @@ public class ListTasksIT extends AbstractDaemonTest { RestResponse r = adminRestSession.get("/config/server/tasks/"); r.assertOK(); List result = - newGson().fromJson(r.getReader(), - new TypeToken>() {}.getType()); + newGson().fromJson(r.getReader(), new TypeToken>() {}.getType()); assertThat(result).isNotEmpty(); boolean foundLogFileCompressorTask = false; for (TaskInfo info : result) { @@ -53,8 +50,7 @@ public class ListTasksIT extends AbstractDaemonTest { RestResponse r = userRestSession.get("/config/server/tasks/"); r.assertOK(); List result = - newGson().fromJson(r.getReader(), - new TypeToken>() {}.getType()); + newGson().fromJson(r.getReader(), new TypeToken>() {}.getType()); assertThat(result).isEmpty(); } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ServerInfoIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ServerInfoIT.java index 63f4919c99..a4e443740f 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ServerInfoIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ServerInfoIT.java @@ -27,11 +27,9 @@ import com.google.gerrit.extensions.common.ServerInfo; import com.google.gerrit.server.config.AllProjectsNameProvider; import com.google.gerrit.server.config.AllUsersNameProvider; import com.google.gerrit.server.config.AnonymousCowardNameProvider; - -import org.junit.Test; - import java.nio.file.Files; import java.nio.file.Path; +import org.junit.Test; @NoHttpd public class ServerInfoIT extends AbstractDaemonTest { @@ -58,8 +56,10 @@ public class ServerInfoIT extends AbstractDaemonTest { @GerritConfig(name = "change.updateDelay", value = "50s") // download - @GerritConfig(name = "download.archive", values = {"tar", - "tbz2", "tgz", "txz"}) + @GerritConfig( + name = "download.archive", + values = {"tar", "tbz2", "tgz", "txz"} + ) // gerrit @GerritConfig(name = "gerrit.allProjects", value = "Root") @@ -78,8 +78,8 @@ public class ServerInfoIT extends AbstractDaemonTest { // auth assertThat(i.auth.authType).isEqualTo(AuthType.HTTP); - assertThat(i.auth.editableAccountFields).containsExactly( - AccountFieldName.REGISTER_NEW_EMAIL, AccountFieldName.FULL_NAME); + assertThat(i.auth.editableAccountFields) + .containsExactly(AccountFieldName.REGISTER_NEW_EMAIL, AccountFieldName.FULL_NAME); assertThat(i.auth.useContributorAgreements).isTrue(); assertThat(i.auth.loginUrl).isEqualTo("https://example.com/login"); assertThat(i.auth.loginText).isEqualTo("LOGIN"); @@ -150,9 +150,11 @@ public class ServerInfoIT extends AbstractDaemonTest { // auth assertThat(i.auth.authType).isEqualTo(AuthType.OPENID); - assertThat(i.auth.editableAccountFields).containsExactly( - AccountFieldName.REGISTER_NEW_EMAIL, AccountFieldName.FULL_NAME, - AccountFieldName.USER_NAME); + assertThat(i.auth.editableAccountFields) + .containsExactly( + AccountFieldName.REGISTER_NEW_EMAIL, + AccountFieldName.FULL_NAME, + AccountFieldName.USER_NAME); assertThat(i.auth.useContributorAgreements).isNull(); assertThat(i.auth.loginUrl).isNull(); assertThat(i.auth.loginText).isNull(); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/AddMemberIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/AddMemberIT.java index e37567c9c1..fe0f42d100 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/AddMemberIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/AddMemberIT.java @@ -15,14 +15,11 @@ package com.google.gerrit.acceptance.rest.group; import com.google.gerrit.acceptance.AbstractDaemonTest; - import org.junit.Test; public class AddMemberIT extends AbstractDaemonTest { @Test public void addNonExistingMember_NotFound() throws Exception { - adminRestSession - .put("/groups/Administrators/members/non-existing") - .assertNotFound(); + adminRestSession.put("/groups/Administrators/members/non-existing").assertNotFound(); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/GroupsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/GroupsIT.java index b3b0b27a32..e153e5618a 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/GroupsIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/GroupsIT.java @@ -18,7 +18,6 @@ import static com.google.common.truth.Truth.assertThat; import com.google.gerrit.acceptance.AbstractDaemonTest; import com.google.gerrit.acceptance.RestResponse; - import org.junit.Test; public class GroupsIT extends AbstractDaemonTest { diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/AccessIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/AccessIT.java index c78b291722..839f166ebd 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/AccessIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/AccessIT.java @@ -35,7 +35,7 @@ import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.reviewdb.client.RefNames; import com.google.gerrit.server.config.AllProjectsNameProvider; import com.google.gerrit.server.group.SystemGroupBackend; - +import java.util.HashMap; import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.Config; @@ -44,8 +44,6 @@ import org.eclipse.jgit.revwalk.RevCommit; import org.junit.Before; import org.junit.Test; -import java.util.HashMap; - public class AccessIT extends AbstractDaemonTest { private final String PROJECT_NAME = "newProject"; @@ -59,7 +57,7 @@ public class AccessIT extends AbstractDaemonTest { private ProjectApi pApi; @Before - public void setUp() throws Exception { + public void setUp() throws Exception { newProjectName = createProject(PROJECT_NAME).get(); pApi = gApi.projects().name(newProjectName); } @@ -84,9 +82,8 @@ public class AccessIT extends AbstractDaemonTest { assertThat(pApi.access().local).isEqualTo(accessInput.add); RevCommit updatedHead = getRemoteHead(p, RefNames.REFS_CONFIG); - eventRecorder.assertRefUpdatedEvents(p.get(), RefNames.REFS_CONFIG, - null, initialHead, - initialHead, updatedHead); + eventRecorder.assertRefUpdatedEvents( + p.get(), RefNames.REFS_CONFIG, null, initialHead, initialHead, updatedHead); } @Test @@ -100,15 +97,14 @@ public class AccessIT extends AbstractDaemonTest { // Remove specific permission AccessSectionInfo accessSectionToRemove = newAccessSectionInfo(); - accessSectionToRemove.permissions - .put(Permission.LABEL + LABEL_CODE_REVIEW, newPermissionInfo()); + accessSectionToRemove.permissions.put( + Permission.LABEL + LABEL_CODE_REVIEW, newPermissionInfo()); ProjectAccessInput removal = newProjectAccessInput(); removal.remove.put(REFS_HEADS, accessSectionToRemove); pApi.access(removal); // Remove locally - accessInput.add.get(REFS_HEADS).permissions - .remove(Permission.LABEL + LABEL_CODE_REVIEW); + accessInput.add.get(REFS_HEADS).permissions.remove(Permission.LABEL + LABEL_CODE_REVIEW); // Check assertThat(pApi.access().local).isEqualTo(accessInput.add); @@ -127,20 +123,21 @@ public class AccessIT extends AbstractDaemonTest { AccessSectionInfo accessSectionToRemove = newAccessSectionInfo(); PermissionInfo codeReview = newPermissionInfo(); codeReview.label = LABEL_CODE_REVIEW; - PermissionRuleInfo pri = new PermissionRuleInfo( - PermissionRuleInfo.Action.DENY, false); - codeReview.rules.put( - SystemGroupBackend.REGISTERED_USERS.get(), pri); - accessSectionToRemove.permissions - .put(Permission.LABEL +LABEL_CODE_REVIEW, codeReview); + PermissionRuleInfo pri = new PermissionRuleInfo(PermissionRuleInfo.Action.DENY, false); + codeReview.rules.put(SystemGroupBackend.REGISTERED_USERS.get(), pri); + accessSectionToRemove.permissions.put(Permission.LABEL + LABEL_CODE_REVIEW, codeReview); ProjectAccessInput removal = newProjectAccessInput(); removal.remove.put(REFS_HEADS, accessSectionToRemove); pApi.access(removal); // Remove locally - accessInput.add.get(REFS_HEADS).permissions + accessInput + .add + .get(REFS_HEADS) + .permissions .get(Permission.LABEL + LABEL_CODE_REVIEW) - .rules.remove(SystemGroupBackend.REGISTERED_USERS.get()); + .rules + .remove(SystemGroupBackend.REGISTERED_USERS.get()); // Check assertThat(pApi.access().local).isEqualTo(accessInput.add); @@ -159,23 +156,17 @@ public class AccessIT extends AbstractDaemonTest { AccessSectionInfo accessSectionToRemove = newAccessSectionInfo(); PermissionInfo codeReview = newPermissionInfo(); codeReview.label = LABEL_CODE_REVIEW; - PermissionRuleInfo pri = new PermissionRuleInfo( - PermissionRuleInfo.Action.DENY, false); - codeReview.rules.put( - SystemGroupBackend.REGISTERED_USERS.get(), pri); - pri = new PermissionRuleInfo( - PermissionRuleInfo.Action.DENY, false); - codeReview.rules.put( - SystemGroupBackend.PROJECT_OWNERS.get(), pri); - accessSectionToRemove.permissions - .put(Permission.LABEL +LABEL_CODE_REVIEW, codeReview); + PermissionRuleInfo pri = new PermissionRuleInfo(PermissionRuleInfo.Action.DENY, false); + codeReview.rules.put(SystemGroupBackend.REGISTERED_USERS.get(), pri); + pri = new PermissionRuleInfo(PermissionRuleInfo.Action.DENY, false); + codeReview.rules.put(SystemGroupBackend.PROJECT_OWNERS.get(), pri); + accessSectionToRemove.permissions.put(Permission.LABEL + LABEL_CODE_REVIEW, codeReview); ProjectAccessInput removal = newProjectAccessInput(); removal.remove.put(REFS_HEADS, accessSectionToRemove); pApi.access(removal); // Remove locally - accessInput.add.get(REFS_HEADS) - .permissions.remove(Permission.LABEL + LABEL_CODE_REVIEW); + accessInput.add.get(REFS_HEADS).permissions.remove(Permission.LABEL + LABEL_CODE_REVIEW); // Check assertThat(pApi.access().local).isEqualTo(accessInput.add); @@ -208,8 +199,7 @@ public class AccessIT extends AbstractDaemonTest { // Create a change to apply ProjectAccessInput accessInfoToApply = newProjectAccessInput(); - AccessSectionInfo accessSectionInfoToApply = - createDefaultAccessSectionInfo(); + AccessSectionInfo accessSectionInfoToApply = createDefaultAccessSectionInfo(); accessInfoToApply.add.put(REFS_HEADS, accessSectionInfoToApply); setApiUser(user); @@ -249,11 +239,9 @@ public class AccessIT extends AbstractDaemonTest { @Test public void addGlobalCapabilityAsUser() throws Exception { ProjectAccessInput accessInput = newProjectAccessInput(); - AccessSectionInfo accessSectionInfo = - createDefaultGlobalCapabilitiesAccessSectionInfo(); + AccessSectionInfo accessSectionInfo = createDefaultGlobalCapabilitiesAccessSectionInfo(); - accessInput.add.put(AccessSection.GLOBAL_CAPABILITIES, - accessSectionInfo); + accessInput.add.put(AccessSection.GLOBAL_CAPABILITIES, accessSectionInfo); setApiUser(user); exception.expect(AuthException.class); @@ -263,27 +251,27 @@ public class AccessIT extends AbstractDaemonTest { @Test public void addGlobalCapabilityAsAdmin() throws Exception { ProjectAccessInput accessInput = newProjectAccessInput(); - AccessSectionInfo accessSectionInfo = - createDefaultGlobalCapabilitiesAccessSectionInfo(); + AccessSectionInfo accessSectionInfo = createDefaultGlobalCapabilitiesAccessSectionInfo(); - accessInput.add.put(AccessSection.GLOBAL_CAPABILITIES, - accessSectionInfo); + accessInput.add.put(AccessSection.GLOBAL_CAPABILITIES, accessSectionInfo); ProjectAccessInfo updatedAccessSectionInfo = gApi.projects().name(allProjects.get()).access(accessInput); - assertThat(updatedAccessSectionInfo.local.get( - AccessSection.GLOBAL_CAPABILITIES).permissions.keySet()) + assertThat( + updatedAccessSectionInfo + .local + .get(AccessSection.GLOBAL_CAPABILITIES) + .permissions + .keySet()) .containsAllIn(accessSectionInfo.permissions.keySet()); } @Test public void addGlobalCapabilityForNonRootProject() throws Exception { ProjectAccessInput accessInput = newProjectAccessInput(); - AccessSectionInfo accessSectionInfo = - createDefaultGlobalCapabilitiesAccessSectionInfo(); + AccessSectionInfo accessSectionInfo = createDefaultGlobalCapabilitiesAccessSectionInfo(); - accessInput.add.put(AccessSection.GLOBAL_CAPABILITIES, - accessSectionInfo); + accessInput.add.put(AccessSection.GLOBAL_CAPABILITIES, accessSectionInfo); exception.expect(BadRequestException.class); pApi.access(accessInput); @@ -291,20 +279,16 @@ public class AccessIT extends AbstractDaemonTest { @Test public void addNonGlobalCapabilityToGlobalCapabilities() throws Exception { - AccountGroup adminGroup = - groupCache.get(new AccountGroup.NameKey("Administrators")); + AccountGroup adminGroup = groupCache.get(new AccountGroup.NameKey("Administrators")); ProjectAccessInput accessInput = newProjectAccessInput(); AccessSectionInfo accessSectionInfo = newAccessSectionInfo(); PermissionInfo permissionInfo = newPermissionInfo(); - permissionInfo.rules.put( - adminGroup.getGroupUUID().get(), null); - accessSectionInfo.permissions.put(Permission.PUSH, - permissionInfo); + permissionInfo.rules.put(adminGroup.getGroupUUID().get(), null); + accessSectionInfo.permissions.put(Permission.PUSH, permissionInfo); - accessInput.add.put(AccessSection.GLOBAL_CAPABILITIES, - accessSectionInfo); + accessInput.add.put(AccessSection.GLOBAL_CAPABILITIES, accessSectionInfo); exception.expect(BadRequestException.class); gApi.projects().name(allProjects.get()).access(accessInput); @@ -313,11 +297,9 @@ public class AccessIT extends AbstractDaemonTest { @Test public void removeGlobalCapabilityAsUser() throws Exception { ProjectAccessInput accessInput = newProjectAccessInput(); - AccessSectionInfo accessSectionInfo = - createDefaultGlobalCapabilitiesAccessSectionInfo(); + AccessSectionInfo accessSectionInfo = createDefaultGlobalCapabilitiesAccessSectionInfo(); - accessInput.remove.put(AccessSection.GLOBAL_CAPABILITIES, - accessSectionInfo); + accessInput.remove.put(AccessSection.GLOBAL_CAPABILITIES, accessSectionInfo); setApiUser(user); exception.expect(AuthException.class); @@ -326,38 +308,40 @@ public class AccessIT extends AbstractDaemonTest { @Test public void removeGlobalCapabilityAsAdmin() throws Exception { - AccountGroup adminGroup = - groupCache.get(new AccountGroup.NameKey("Administrators")); + AccountGroup adminGroup = groupCache.get(new AccountGroup.NameKey("Administrators")); ProjectAccessInput accessInput = newProjectAccessInput(); AccessSectionInfo accessSectionInfo = newAccessSectionInfo(); PermissionInfo permissionInfo = newPermissionInfo(); - permissionInfo.rules.put( - adminGroup.getGroupUUID().get(), null); - accessSectionInfo.permissions.put(GlobalCapability.ACCESS_DATABASE, - permissionInfo); + permissionInfo.rules.put(adminGroup.getGroupUUID().get(), null); + accessSectionInfo.permissions.put(GlobalCapability.ACCESS_DATABASE, permissionInfo); // Add and validate first as removing existing privileges such as // administrateServer would break upcoming tests - accessInput.add.put(AccessSection.GLOBAL_CAPABILITIES, - accessSectionInfo); + accessInput.add.put(AccessSection.GLOBAL_CAPABILITIES, accessSectionInfo); ProjectAccessInfo updatedProjectAccessInfo = gApi.projects().name(allProjects.get()).access(accessInput); - assertThat(updatedProjectAccessInfo.local.get( - AccessSection.GLOBAL_CAPABILITIES).permissions.keySet()) + assertThat( + updatedProjectAccessInfo + .local + .get(AccessSection.GLOBAL_CAPABILITIES) + .permissions + .keySet()) .containsAllIn(accessSectionInfo.permissions.keySet()); // Remove accessInput.add.clear(); - accessInput.remove.put(AccessSection.GLOBAL_CAPABILITIES, - accessSectionInfo); + accessInput.remove.put(AccessSection.GLOBAL_CAPABILITIES, accessSectionInfo); - updatedProjectAccessInfo = - gApi.projects().name(allProjects.get()).access(accessInput); - assertThat(updatedProjectAccessInfo.local.get( - AccessSection.GLOBAL_CAPABILITIES).permissions.keySet()) + updatedProjectAccessInfo = gApi.projects().name(allProjects.get()).access(accessInput); + assertThat( + updatedProjectAccessInfo + .local + .get(AccessSection.GLOBAL_CAPABILITIES) + .permissions + .keySet()) .containsNoneIn(accessSectionInfo.permissions.keySet()); } @@ -368,35 +352,39 @@ public class AccessIT extends AbstractDaemonTest { String registeredUsers = "group Registered Users"; String refsFor = "refs/for/*"; // Clone repository to forcefully add permission - TestRepository allProjectsRepo = - cloneProject(allProjects, admin); + TestRepository allProjectsRepo = cloneProject(allProjects, admin); // Fetch permission ref GitUtil.fetch(allProjectsRepo, "refs/meta/config:cfg"); allProjectsRepo.reset("cfg"); // Load current permissions - String config = gApi.projects() - .name(allProjects.get()) - .branch(RefNames.REFS_CONFIG).file("project.config").asString(); + String config = + gApi.projects() + .name(allProjects.get()) + .branch(RefNames.REFS_CONFIG) + .file("project.config") + .asString(); // Append and push unknown permission Config cfg = new Config(); cfg.fromText(config); cfg.setString(access, refsFor, unknownPermission, registeredUsers); config = cfg.toText(); - PushOneCommit push = pushFactory.create( - db, admin.getIdent(), allProjectsRepo, "Subject", "project.config", - config); + PushOneCommit push = + pushFactory.create( + db, admin.getIdent(), allProjectsRepo, "Subject", "project.config", config); push.to(RefNames.REFS_CONFIG).assertOkStatus(); // Verify that unknownPermission is present - config = gApi.projects() - .name(allProjects.get()) - .branch(RefNames.REFS_CONFIG).file("project.config").asString(); + config = + gApi.projects() + .name(allProjects.get()) + .branch(RefNames.REFS_CONFIG) + .file("project.config") + .asString(); cfg.fromText(config); - assertThat(cfg.getString(access, refsFor, unknownPermission)) - .isEqualTo(registeredUsers); + assertThat(cfg.getString(access, refsFor, unknownPermission)).isEqualTo(registeredUsers); // Make permission change through API ProjectAccessInput accessInput = newProjectAccessInput(); @@ -408,12 +396,14 @@ public class AccessIT extends AbstractDaemonTest { gApi.projects().name(allProjects.get()).access(accessInput); // Verify that unknownPermission is still present - config = gApi.projects() - .name(allProjects.get()) - .branch(RefNames.REFS_CONFIG).file("project.config").asString(); + config = + gApi.projects() + .name(allProjects.get()) + .branch(RefNames.REFS_CONFIG) + .file("project.config") + .asString(); cfg.fromText(config); - assertThat(cfg.getString(access, refsFor, unknownPermission)) - .isEqualTo(registeredUsers); + assertThat(cfg.getString(access, refsFor, unknownPermission)).isEqualTo(registeredUsers); } private ProjectAccessInput newProjectAccessInput() { @@ -439,40 +429,30 @@ public class AccessIT extends AbstractDaemonTest { AccessSectionInfo accessSection = newAccessSectionInfo(); PermissionInfo push = newPermissionInfo(); - PermissionRuleInfo pri = new PermissionRuleInfo( - PermissionRuleInfo.Action.ALLOW, false); - push.rules.put( - SystemGroupBackend.REGISTERED_USERS.get(), pri); + PermissionRuleInfo pri = new PermissionRuleInfo(PermissionRuleInfo.Action.ALLOW, false); + push.rules.put(SystemGroupBackend.REGISTERED_USERS.get(), pri); accessSection.permissions.put(Permission.PUSH, push); PermissionInfo codeReview = newPermissionInfo(); codeReview.label = LABEL_CODE_REVIEW; - pri = new PermissionRuleInfo( - PermissionRuleInfo.Action.DENY, false); - codeReview.rules.put( - SystemGroupBackend.REGISTERED_USERS.get(), pri); + pri = new PermissionRuleInfo(PermissionRuleInfo.Action.DENY, false); + codeReview.rules.put(SystemGroupBackend.REGISTERED_USERS.get(), pri); - pri = new PermissionRuleInfo( - PermissionRuleInfo.Action.ALLOW, false); + pri = new PermissionRuleInfo(PermissionRuleInfo.Action.ALLOW, false); pri.max = 1; pri.min = -1; - codeReview.rules.put( - SystemGroupBackend.PROJECT_OWNERS.get(), pri); - accessSection.permissions.put(Permission.LABEL - + LABEL_CODE_REVIEW, codeReview); + codeReview.rules.put(SystemGroupBackend.PROJECT_OWNERS.get(), pri); + accessSection.permissions.put(Permission.LABEL + LABEL_CODE_REVIEW, codeReview); return accessSection; } - private AccessSectionInfo createDefaultGlobalCapabilitiesAccessSectionInfo() { AccessSectionInfo accessSection = newAccessSectionInfo(); PermissionInfo email = newPermissionInfo(); - PermissionRuleInfo pri = new PermissionRuleInfo( - PermissionRuleInfo.Action.ALLOW, false); - email.rules.put( - SystemGroupBackend.REGISTERED_USERS.get(), pri); + PermissionRuleInfo pri = new PermissionRuleInfo(PermissionRuleInfo.Action.ALLOW, false); + email.rules.put(SystemGroupBackend.REGISTERED_USERS.get(), pri); accessSection.permissions.put(GlobalCapability.EMAIL_REVIEWERS, email); return accessSection; @@ -482,10 +462,8 @@ public class AccessIT extends AbstractDaemonTest { AccessSectionInfo accessSection = newAccessSectionInfo(); PermissionInfo read = newPermissionInfo(); - PermissionRuleInfo pri = new PermissionRuleInfo( - PermissionRuleInfo.Action.DENY, false); - read.rules.put( - SystemGroupBackend.ANONYMOUS_USERS.get(), pri); + PermissionRuleInfo pri = new PermissionRuleInfo(PermissionRuleInfo.Action.DENY, false); + read.rules.put(SystemGroupBackend.ANONYMOUS_USERS.get(), pri); accessSection.permissions.put(Permission.READ, read); return accessSection; diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/BanCommitIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/BanCommitIT.java index 23fe562e49..90d51e041e 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/BanCommitIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/BanCommitIT.java @@ -23,7 +23,6 @@ import com.google.gerrit.acceptance.AbstractDaemonTest; import com.google.gerrit.acceptance.RestResponse; import com.google.gerrit.server.project.BanCommit; import com.google.gerrit.server.project.BanCommit.BanResultInfo; - import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.transport.RemoteRefUpdate; import org.junit.Test; @@ -32,21 +31,19 @@ public class BanCommitIT extends AbstractDaemonTest { @Test public void banCommit() throws Exception { - RevCommit c = commitBuilder() - .add("a.txt", "some content") - .create(); + RevCommit c = commitBuilder().add("a.txt", "some content").create(); RestResponse r = - adminRestSession.put("/projects/" + project.get() + "/ban/", - BanCommit.Input.fromCommits(c.name())); + adminRestSession.put( + "/projects/" + project.get() + "/ban/", BanCommit.Input.fromCommits(c.name())); r.assertOK(); BanResultInfo info = newGson().fromJson(r.getReader(), BanResultInfo.class); assertThat(Iterables.getOnlyElement(info.newlyBanned)).isEqualTo(c.name()); assertThat(info.alreadyBanned).isNull(); assertThat(info.ignored).isNull(); - RemoteRefUpdate u = pushHead(testRepo, "refs/heads/master", false) - .getRemoteUpdate("refs/heads/master"); + RemoteRefUpdate u = + pushHead(testRepo, "refs/heads/master", false).getRemoteUpdate("refs/heads/master"); assertThat(u).isNotNull(); assertThat(u.getStatus()).isEqualTo(REJECTED_OTHER_REASON); assertThat(u.getMessage()).startsWith("contains banned commit"); @@ -55,16 +52,19 @@ public class BanCommitIT extends AbstractDaemonTest { @Test public void banAlreadyBannedCommit() throws Exception { RestResponse r = - adminRestSession.put("/projects/" + project.get() + "/ban/", + adminRestSession.put( + "/projects/" + project.get() + "/ban/", BanCommit.Input.fromCommits("a8a477efffbbf3b44169bb9a1d3a334cbbd9aa96")); r.consume(); - r = adminRestSession.put("/projects/" + project.get() + "/ban/", - BanCommit.Input.fromCommits("a8a477efffbbf3b44169bb9a1d3a334cbbd9aa96")); + r = + adminRestSession.put( + "/projects/" + project.get() + "/ban/", + BanCommit.Input.fromCommits("a8a477efffbbf3b44169bb9a1d3a334cbbd9aa96")); r.assertOK(); BanResultInfo info = newGson().fromJson(r.getReader(), BanResultInfo.class); assertThat(Iterables.getOnlyElement(info.alreadyBanned)) - .isEqualTo("a8a477efffbbf3b44169bb9a1d3a334cbbd9aa96"); + .isEqualTo("a8a477efffbbf3b44169bb9a1d3a334cbbd9aa96"); assertThat(info.newlyBanned).isNull(); assertThat(info.ignored).isNull(); } @@ -72,8 +72,9 @@ public class BanCommitIT extends AbstractDaemonTest { @Test public void banCommit_Forbidden() throws Exception { userRestSession - .put("/projects/" + project.get() + "/ban/", BanCommit.Input.fromCommits( - "a8a477efffbbf3b44169bb9a1d3a334cbbd9aa96")) + .put( + "/projects/" + project.get() + "/ban/", + BanCommit.Input.fromCommits("a8a477efffbbf3b44169bb9a1d3a334cbbd9aa96")) .assertForbidden(); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CheckMergeabilityIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CheckMergeabilityIT.java index a094f93dc7..7667fc0c9f 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CheckMergeabilityIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CheckMergeabilityIT.java @@ -26,7 +26,6 @@ import com.google.gerrit.extensions.api.changes.ReviewInput; import com.google.gerrit.extensions.api.projects.BranchInput; import com.google.gerrit.extensions.common.MergeableInfo; import com.google.gerrit.reviewdb.client.Branch; - import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.transport.RefSpec; @@ -42,26 +41,41 @@ public class CheckMergeabilityIT extends AbstractDaemonTest { branch = new Branch.NameKey(project, "test"); gApi.projects() .name(branch.getParentKey().get()) - .branch(branch.get()).create(new BranchInput()); + .branch(branch.get()) + .create(new BranchInput()); } @Test public void checkMergeableCommit() throws Exception { RevCommit initialHead = getRemoteHead(); - testRepo.branch("HEAD").commit().insertChangeId() + testRepo + .branch("HEAD") + .commit() + .insertChangeId() .message("some change in a") .add("a.txt", "a contents ") .create(); - testRepo.git().push().setRemote("origin").setRefSpecs( - new RefSpec("HEAD:refs/heads/master")).call(); + testRepo + .git() + .push() + .setRemote("origin") + .setRefSpecs(new RefSpec("HEAD:refs/heads/master")) + .call(); testRepo.reset(initialHead); - testRepo.branch("HEAD").commit().insertChangeId() + testRepo + .branch("HEAD") + .commit() + .insertChangeId() .message("some change in b") .add("b.txt", "b contents ") .create(); - testRepo.git().push().setRemote("origin").setRefSpecs( - new RefSpec("HEAD:refs/heads/test")).call(); + testRepo + .git() + .push() + .setRemote("origin") + .setRefSpecs(new RefSpec("HEAD:refs/heads/test")) + .call(); assertMergeable("master", "test", "recursive"); } @@ -69,20 +83,34 @@ public class CheckMergeabilityIT extends AbstractDaemonTest { @Test public void checkUnMergeableCommit() throws Exception { RevCommit initialHead = getRemoteHead(); - testRepo.branch("HEAD").commit().insertChangeId() + testRepo + .branch("HEAD") + .commit() + .insertChangeId() .message("some change in a") .add("a.txt", "a contents ") .create(); - testRepo.git().push().setRemote("origin").setRefSpecs( - new RefSpec("HEAD:refs/heads/master")).call(); + testRepo + .git() + .push() + .setRemote("origin") + .setRefSpecs(new RefSpec("HEAD:refs/heads/master")) + .call(); testRepo.reset(initialHead); - testRepo.branch("HEAD").commit().insertChangeId() + testRepo + .branch("HEAD") + .commit() + .insertChangeId() .message("some change in a too") .add("a.txt", "a contents too") .create(); - testRepo.git().push().setRemote("origin").setRefSpecs( - new RefSpec("HEAD:refs/heads/test")).call(); + testRepo + .git() + .push() + .setRemote("origin") + .setRefSpecs(new RefSpec("HEAD:refs/heads/test")) + .call(); assertUnMergeable("master", "test", "recursive", "a.txt"); } @@ -90,51 +118,87 @@ public class CheckMergeabilityIT extends AbstractDaemonTest { @Test public void checkOursMergeStrategy() throws Exception { RevCommit initialHead = getRemoteHead(); - testRepo.branch("HEAD").commit().insertChangeId() + testRepo + .branch("HEAD") + .commit() + .insertChangeId() .message("some change in a") .add("a.txt", "a contents ") .create(); - testRepo.git().push().setRemote("origin").setRefSpecs( - new RefSpec("HEAD:refs/heads/master")).call(); + testRepo + .git() + .push() + .setRemote("origin") + .setRefSpecs(new RefSpec("HEAD:refs/heads/master")) + .call(); testRepo.reset(initialHead); - testRepo.branch("HEAD").commit().insertChangeId() + testRepo + .branch("HEAD") + .commit() + .insertChangeId() .message("some change in a too") .add("a.txt", "a contents too") .create(); - testRepo.git().push().setRemote("origin").setRefSpecs( - new RefSpec("HEAD:refs/heads/test")).call(); + testRepo + .git() + .push() + .setRemote("origin") + .setRefSpecs(new RefSpec("HEAD:refs/heads/test")) + .call(); assertMergeable("master", "test", "ours"); } @Test public void checkAlreadyMergedCommit() throws Exception { - ObjectId c0 = testRepo.branch("HEAD").commit().insertChangeId() - .message("first commit") - .add("a.txt", "a contents ") - .create(); - testRepo.git().push().setRemote("origin").setRefSpecs( - new RefSpec("HEAD:refs/heads/master")).call(); + ObjectId c0 = + testRepo + .branch("HEAD") + .commit() + .insertChangeId() + .message("first commit") + .add("a.txt", "a contents ") + .create(); + testRepo + .git() + .push() + .setRemote("origin") + .setRefSpecs(new RefSpec("HEAD:refs/heads/master")) + .call(); - testRepo.branch("HEAD").commit().insertChangeId() + testRepo + .branch("HEAD") + .commit() + .insertChangeId() .message("second commit") .add("b.txt", "b contents ") .create(); - testRepo.git().push().setRemote("origin").setRefSpecs( - new RefSpec("HEAD:refs/heads/master")).call(); + testRepo + .git() + .push() + .setRemote("origin") + .setRefSpecs(new RefSpec("HEAD:refs/heads/master")) + .call(); assertCommitMerged("master", c0.getName(), ""); } @Test public void checkContentMergedCommit() throws Exception { - testRepo.branch("HEAD").commit().insertChangeId() + testRepo + .branch("HEAD") + .commit() + .insertChangeId() .message("first commit") .add("a.txt", "a contents ") .create(); - testRepo.git().push().setRemote("origin").setRefSpecs( - new RefSpec("HEAD:refs/heads/master")).call(); + testRepo + .git() + .push() + .setRemote("origin") + .setRefSpecs(new RefSpec("HEAD:refs/heads/master")) + .call(); // create a change, and cherrypick into master PushOneCommit.Result cId = createChange(); @@ -142,8 +206,7 @@ public class CheckMergeabilityIT extends AbstractDaemonTest { CherryPickInput cpi = new CherryPickInput(); cpi.destination = "master"; cpi.message = "cherry pick the commit"; - ChangeApi orig = gApi.changes() - .id(cId.getChangeId()); + ChangeApi orig = gApi.changes().id(cId.getChangeId()); ChangeApi cherry = orig.current().cherryPick(cpi); cherry.current().review(ReviewInput.approve()); cherry.current().submit(); @@ -155,71 +218,87 @@ public class CheckMergeabilityIT extends AbstractDaemonTest { @Test public void checkInvalidSource() throws Exception { - testRepo.branch("HEAD").commit().insertChangeId() + testRepo + .branch("HEAD") + .commit() + .insertChangeId() .message("first commit") .add("a.txt", "a contents ") .create(); - testRepo.git().push().setRemote("origin").setRefSpecs( - new RefSpec("HEAD:refs/heads/master")).call(); + testRepo + .git() + .push() + .setRemote("origin") + .setRefSpecs(new RefSpec("HEAD:refs/heads/master")) + .call(); - assertBadRequest("master", "fdsafsdf", "recursive", - "Cannot resolve 'fdsafsdf' to a commit"); + assertBadRequest("master", "fdsafsdf", "recursive", "Cannot resolve 'fdsafsdf' to a commit"); } @Test public void checkInvalidStrategy() throws Exception { RevCommit initialHead = getRemoteHead(); - testRepo.branch("HEAD").commit().insertChangeId() + testRepo + .branch("HEAD") + .commit() + .insertChangeId() .message("first commit") .add("a.txt", "a contents ") .create(); - testRepo.git().push().setRemote("origin").setRefSpecs( - new RefSpec("HEAD:refs/heads/master")).call(); + testRepo + .git() + .push() + .setRemote("origin") + .setRefSpecs(new RefSpec("HEAD:refs/heads/master")) + .call(); testRepo.reset(initialHead); - testRepo.branch("HEAD").commit().insertChangeId() + testRepo + .branch("HEAD") + .commit() + .insertChangeId() .message("some change in a too") .add("a.txt", "a contents too") .create(); - testRepo.git().push().setRemote("origin").setRefSpecs( - new RefSpec("HEAD:refs/heads/test")).call(); + testRepo + .git() + .push() + .setRemote("origin") + .setRefSpecs(new RefSpec("HEAD:refs/heads/test")) + .call(); - assertBadRequest("master", "test", "octopus", - "invalid merge strategy: octopus"); + assertBadRequest("master", "test", "octopus", "invalid merge strategy: octopus"); } - private void assertMergeable(String targetBranch, String source, - String strategy) throws Exception { - MergeableInfo - mergeableInfo = getMergeableInfo(targetBranch, source, strategy); + private void assertMergeable(String targetBranch, String source, String strategy) + throws Exception { + MergeableInfo mergeableInfo = getMergeableInfo(targetBranch, source, strategy); assertThat(mergeableInfo.mergeable).isTrue(); } - private void assertUnMergeable(String targetBranch, String source, - String strategy, String... conflicts) throws Exception { + private void assertUnMergeable( + String targetBranch, String source, String strategy, String... conflicts) throws Exception { MergeableInfo mergeableInfo = getMergeableInfo(targetBranch, source, strategy); assertThat(mergeableInfo.mergeable).isFalse(); assertThat(mergeableInfo.conflicts).containsExactly((Object[]) conflicts); } - private void assertCommitMerged(String targetBranch, String source, - String strategy) throws Exception { - MergeableInfo - mergeableInfo = getMergeableInfo(targetBranch, source, strategy); + private void assertCommitMerged(String targetBranch, String source, String strategy) + throws Exception { + MergeableInfo mergeableInfo = getMergeableInfo(targetBranch, source, strategy); assertThat(mergeableInfo.mergeable).isTrue(); assertThat(mergeableInfo.commitMerged).isTrue(); } - private void assertContentMerged(String targetBranch, String source, - String strategy) throws Exception { - MergeableInfo - mergeableInfo = getMergeableInfo(targetBranch, source, strategy); + private void assertContentMerged(String targetBranch, String source, String strategy) + throws Exception { + MergeableInfo mergeableInfo = getMergeableInfo(targetBranch, source, strategy); assertThat(mergeableInfo.mergeable).isTrue(); assertThat(mergeableInfo.contentMerged).isTrue(); } - private void assertBadRequest(String targetBranch, String source, - String strategy, String errMsg) throws Exception { + private void assertBadRequest(String targetBranch, String source, String strategy, String errMsg) + throws Exception { String url = "/projects/" + project.get() + "/branches/" + targetBranch; url += "/mergeable?source=" + source; if (!Strings.isNullOrEmpty(strategy)) { @@ -231,8 +310,8 @@ public class CheckMergeabilityIT extends AbstractDaemonTest { assertThat(r.getEntityContent()).isEqualTo(errMsg); } - private MergeableInfo getMergeableInfo(String targetBranch, String source, - String strategy) throws Exception { + private MergeableInfo getMergeableInfo(String targetBranch, String source, String strategy) + throws Exception { String url = "/projects/" + project.get() + "/branches/" + targetBranch; url += "/mergeable?source=" + source; if (!Strings.isNullOrEmpty(strategy)) { diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CommitIncludedInIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CommitIncludedInIT.java index dac922e4d4..61f14e4353 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CommitIncludedInIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CommitIncludedInIT.java @@ -14,7 +14,6 @@ package com.google.gerrit.acceptance.rest.project; - import static com.google.common.truth.Truth.assertThat; import com.google.gerrit.acceptance.AbstractDaemonTest; @@ -24,7 +23,6 @@ import com.google.gerrit.extensions.api.changes.IncludedInInfo; import com.google.gerrit.extensions.api.changes.ReviewInput; import com.google.gerrit.extensions.api.projects.TagInput; import com.google.gerrit.reviewdb.client.Branch; - import org.eclipse.jgit.lib.ObjectId; import org.junit.Test; @@ -39,21 +37,19 @@ public class CommitIncludedInIT extends AbstractDaemonTest { @Test public void includedInMergedChange() throws Exception { Result result = createChange(); - gApi.changes().id(result.getChangeId()).revision(result.getCommit().name()) + gApi.changes() + .id(result.getChangeId()) + .revision(result.getCommit().name()) .review(ReviewInput.approve()); - gApi.changes().id(result.getChangeId()).revision(result.getCommit().name()) - .submit(); + gApi.changes().id(result.getChangeId()).revision(result.getCommit().name()).submit(); - assertThat(getIncludedIn(result.getCommit().getId()).branches) - .containsExactly("master"); + assertThat(getIncludedIn(result.getCommit().getId()).branches).containsExactly("master"); assertThat(getIncludedIn(result.getCommit().getId()).tags).isEmpty(); grantTagPermissions(); - gApi.projects().name(result.getChange().project().get()).tag("test-tag") - .create(new TagInput()); + gApi.projects().name(result.getChange().project().get()).tag("test-tag").create(new TagInput()); - assertThat(getIncludedIn(result.getCommit().getId()).tags) - .containsExactly("test-tag"); + assertThat(getIncludedIn(result.getCommit().getId()).tags).containsExactly("test-tag"); createBranch(new Branch.NameKey(project.get(), "test-branch")); @@ -62,10 +58,9 @@ public class CommitIncludedInIT extends AbstractDaemonTest { } private IncludedInInfo getIncludedIn(ObjectId id) throws Exception { - RestResponse r = userRestSession - .get("/projects/" + project.get() + "/commits/" + id.name() + "/in"); - IncludedInInfo result = - newGson().fromJson(r.getReader(), IncludedInInfo.class); + RestResponse r = + userRestSession.get("/projects/" + project.get() + "/commits/" + id.name() + "/in"); + IncludedInInfo result = newGson().fromJson(r.getReader(), IncludedInInfo.class); r.consume(); return result; } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateBranchIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateBranchIT.java index 63777101d9..2c749492e5 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateBranchIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateBranchIT.java @@ -28,7 +28,6 @@ import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.extensions.restapi.RestApiException; import com.google.gerrit.reviewdb.client.Branch; - import org.eclipse.jgit.lib.Constants; import org.junit.Before; import org.junit.Test; @@ -73,8 +72,7 @@ public class CreateBranchIT extends AbstractDaemonTest { } @Test - public void createBranchByProjectOwnerCreateReferenceBlocked_Forbidden() - throws Exception { + public void createBranchByProjectOwnerCreateReferenceBlocked_Forbidden() throws Exception { grantOwner(); blockCreateReference(); setApiUser(user); @@ -90,19 +88,15 @@ public class CreateBranchIT extends AbstractDaemonTest { } private BranchApi branch() throws Exception { - return gApi.projects() - .name(branch.getParentKey().get()) - .branch(branch.get()); + return gApi.projects().name(branch.getParentKey().get()).branch(branch.get()); } private void assertCreateSucceeds() throws Exception { BranchInfo created = branch().create(new BranchInput()).get(); - assertThat(created.ref) - .isEqualTo(Constants.R_HEADS + branch.getShortName()); + assertThat(created.ref).isEqualTo(Constants.R_HEADS + branch.getShortName()); } - private void assertCreateFails(Class errType) - throws Exception { + private void assertCreateFails(Class errType) throws Exception { exception.expect(errType); branch().create(new BranchInput()); } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java index 48a8cd4b37..78c66d61a4 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java @@ -39,7 +39,8 @@ import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.reviewdb.client.RefNames; import com.google.gerrit.server.group.SystemGroupBackend; import com.google.gerrit.server.project.ProjectState; - +import java.util.Collections; +import java.util.Set; import org.apache.http.message.BasicHeader; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.Repository; @@ -48,9 +49,6 @@ import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.treewalk.TreeWalk; import org.junit.Test; -import java.util.Collections; -import java.util.Set; - public class CreateProjectIT extends AbstractDaemonTest { @Test public void createProjectHttp() throws Exception { @@ -66,48 +64,36 @@ public class CreateProjectIT extends AbstractDaemonTest { } @Test - public void createProjectHttpWhenProjectAlreadyExists_Conflict() - throws Exception { - adminRestSession - .put("/projects/" + allProjects.get()) - .assertConflict(); + public void createProjectHttpWhenProjectAlreadyExists_Conflict() throws Exception { + adminRestSession.put("/projects/" + allProjects.get()).assertConflict(); } @Test - public void createProjectHttpWhenProjectAlreadyExists_PreconditionFailed() - throws Exception { + public void createProjectHttpWhenProjectAlreadyExists_PreconditionFailed() throws Exception { adminRestSession - .putWithHeader("/projects/" + allProjects.get(), - new BasicHeader(HttpHeaders.IF_NONE_MATCH, "*")) + .putWithHeader( + "/projects/" + allProjects.get(), new BasicHeader(HttpHeaders.IF_NONE_MATCH, "*")) .assertPreconditionFailed(); } @Test @UseLocalDisk - public void createProjectHttpWithUnreasonableName_BadRequest() - throws Exception { - adminRestSession - .put("/projects/" + Url.encode(name("invalid/../name"))) - .assertBadRequest(); + public void createProjectHttpWithUnreasonableName_BadRequest() throws Exception { + adminRestSession.put("/projects/" + Url.encode(name("invalid/../name"))).assertBadRequest(); } @Test public void createProjectHttpWithNameMismatch_BadRequest() throws Exception { ProjectInput in = new ProjectInput(); in.name = name("otherName"); - adminRestSession - .put("/projects/" + name("someName"), in) - .assertBadRequest(); + adminRestSession.put("/projects/" + name("someName"), in).assertBadRequest(); } @Test - public void createProjectHttpWithInvalidRefName_BadRequest() - throws Exception { + public void createProjectHttpWithInvalidRefName_BadRequest() throws Exception { ProjectInput in = new ProjectInput(); in.branches = Collections.singletonList(name("invalid ref name")); - adminRestSession - .put("/projects/" + name("newProject"), in) - .assertBadRequest(); + adminRestSession.put("/projects/" + name("newProject"), in).assertBadRequest(); } @Test @@ -172,8 +158,7 @@ public class CreateProjectIT extends AbstractDaemonTest { } @Test - public void createChildProjectUnderNonExistingParent_UnprocessableEntity() - throws Exception { + public void createChildProjectUnderNonExistingParent_UnprocessableEntity() throws Exception { ProjectInput in = new ProjectInput(); in.name = name("newProjectName"); in.parent = "non-existing-project"; @@ -188,8 +173,9 @@ public class CreateProjectIT extends AbstractDaemonTest { in.owners = Lists.newArrayListWithCapacity(3); in.owners.add("Anonymous Users"); // by name in.owners.add(SystemGroupBackend.REGISTERED_USERS.get()); // by UUID - in.owners.add(Integer.toString(groupCache.get( - new AccountGroup.NameKey("Administrators")).getId().get())); // by ID + in.owners.add( + Integer.toString( + groupCache.get(new AccountGroup.NameKey("Administrators")).getId().get())); // by ID gApi.projects().create(in); ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName)); Set expectedOwnerIds = Sets.newHashSetWithExpectedSize(3); @@ -200,8 +186,7 @@ public class CreateProjectIT extends AbstractDaemonTest { } @Test - public void createProjectWithNonExistingOwner_UnprocessableEntity() - throws Exception { + public void createProjectWithNonExistingOwner_UnprocessableEntity() throws Exception { ProjectInput in = new ProjectInput(); in.name = name("newProjectName"); in.owners = Collections.singletonList("non-existing-group"); @@ -240,14 +225,12 @@ public class CreateProjectIT extends AbstractDaemonTest { in.branches.add("release"); // without 'refs/heads' prefix gApi.projects().create(in); assertHead(newProjectName, "refs/heads/test"); - assertEmptyCommit(newProjectName, "refs/heads/test", "refs/heads/master", - "refs/heads/release"); + assertEmptyCommit(newProjectName, "refs/heads/test", "refs/heads/master", "refs/heads/release"); } @Test public void createProjectWithCapability() throws Exception { - allowGlobalCapabilities(SystemGroupBackend.REGISTERED_USERS, - GlobalCapability.CREATE_PROJECT); + allowGlobalCapabilities(SystemGroupBackend.REGISTERED_USERS, GlobalCapability.CREATE_PROJECT); try { setApiUser(user); ProjectInput in = new ProjectInput(); @@ -255,8 +238,8 @@ public class CreateProjectIT extends AbstractDaemonTest { ProjectInfo p = gApi.projects().create(in).get(); assertThat(p.name).isEqualTo(in.name); } finally { - removeGlobalCapabilities(SystemGroupBackend.REGISTERED_USERS, - GlobalCapability.CREATE_PROJECT); + removeGlobalCapabilities( + SystemGroupBackend.REGISTERED_USERS, GlobalCapability.CREATE_PROJECT); } } @@ -269,20 +252,17 @@ public class CreateProjectIT extends AbstractDaemonTest { } @Test - public void createProjectWhenProjectAlreadyExists_Conflict() - throws Exception { + public void createProjectWhenProjectAlreadyExists_Conflict() throws Exception { ProjectInput in = new ProjectInput(); in.name = allProjects.get(); assertCreateFails(in, ResourceConflictException.class); } @Test - public void createProjectWithCreateProjectCapabilityAndParentNotVisible() - throws Exception { + public void createProjectWithCreateProjectCapabilityAndParentNotVisible() throws Exception { Project parent = projectCache.get(allProjects).getProject(); parent.setState(com.google.gerrit.extensions.client.ProjectState.HIDDEN); - allowGlobalCapabilities(SystemGroupBackend.REGISTERED_USERS, - GlobalCapability.CREATE_PROJECT); + allowGlobalCapabilities(SystemGroupBackend.REGISTERED_USERS, GlobalCapability.CREATE_PROJECT); try { setApiUser(user); ProjectInput in = new ProjectInput(); @@ -291,8 +271,8 @@ public class CreateProjectIT extends AbstractDaemonTest { assertThat(p.name).isEqualTo(in.name); } finally { parent.setState(com.google.gerrit.extensions.client.ProjectState.ACTIVE); - removeGlobalCapabilities(SystemGroupBackend.REGISTERED_USERS, - GlobalCapability.CREATE_PROJECT); + removeGlobalCapabilities( + SystemGroupBackend.REGISTERED_USERS, GlobalCapability.CREATE_PROJECT); } } @@ -300,17 +280,13 @@ public class CreateProjectIT extends AbstractDaemonTest { return groupCache.get(new AccountGroup.NameKey(groupName)).getGroupUUID(); } - private void assertHead(String projectName, String expectedRef) - throws Exception { - try (Repository repo = - repoManager.openRepository(new Project.NameKey(projectName))) { - assertThat(repo.exactRef(Constants.HEAD).getTarget().getName()) - .isEqualTo(expectedRef); + private void assertHead(String projectName, String expectedRef) throws Exception { + try (Repository repo = repoManager.openRepository(new Project.NameKey(projectName))) { + assertThat(repo.exactRef(Constants.HEAD).getTarget().getName()).isEqualTo(expectedRef); } } - private void assertEmptyCommit(String projectName, String... refs) - throws Exception { + private void assertEmptyCommit(String projectName, String... refs) throws Exception { Project.NameKey projectKey = new Project.NameKey(projectName); try (Repository repo = repoManager.openRepository(projectKey); RevWalk rw = new RevWalk(repo); @@ -325,8 +301,8 @@ public class CreateProjectIT extends AbstractDaemonTest { } } - private void assertCreateFails(ProjectInput in, - Class errType) throws Exception { + private void assertCreateFails(ProjectInput in, Class errType) + throws Exception { exception.expect(errType); gApi.projects().create(in); } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/DeleteBranchIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/DeleteBranchIT.java index 1c9711f2be..bf08ac959b 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/DeleteBranchIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/DeleteBranchIT.java @@ -25,7 +25,6 @@ import com.google.gerrit.extensions.api.projects.BranchInput; import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.reviewdb.client.Branch; - import org.junit.Before; import org.junit.Test; @@ -66,8 +65,7 @@ public class DeleteBranchIT extends AbstractDaemonTest { } @Test - public void deleteBranchByProjectOwnerForcePushBlocked_Forbidden() - throws Exception { + public void deleteBranchByProjectOwnerForcePushBlocked_Forbidden() throws Exception { grantOwner(); blockForcePush(); setApiUser(user); @@ -105,17 +103,14 @@ public class DeleteBranchIT extends AbstractDaemonTest { } private BranchApi branch() throws Exception { - return gApi.projects() - .name(branch.getParentKey().get()) - .branch(branch.get()); + return gApi.projects().name(branch.getParentKey().get()).branch(branch.get()); } private void assertDeleteSucceeds() throws Exception { String branchRev = branch().get().revision; branch().delete(); - eventRecorder.assertRefUpdatedEvents(project.get(), branch.get(), - null, branchRev, - branchRev, null); + eventRecorder.assertRefUpdatedEvents( + project.get(), branch.get(), null, branchRev, branchRev, null); exception.expect(ResourceNotFoundException.class); branch().get(); } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/DeleteBranchesIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/DeleteBranchesIT.java index 3f0c43ed06..79b3fb55cf 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/DeleteBranchesIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/DeleteBranchesIT.java @@ -28,18 +28,16 @@ import com.google.gerrit.extensions.api.projects.ProjectApi; import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.reviewdb.client.RefNames; - +import java.util.HashMap; +import java.util.List; import org.eclipse.jgit.revwalk.RevCommit; import org.junit.Before; import org.junit.Test; -import java.util.HashMap; -import java.util.List; - @NoHttpd public class DeleteBranchesIT extends AbstractDaemonTest { - private static final List BRANCHES = ImmutableList.of( - "refs/heads/test-1", "refs/heads/test-2", "refs/heads/test-3"); + private static final List BRANCHES = + ImmutableList.of("refs/heads/test-1", "refs/heads/test-2", "refs/heads/test-3"); @Before public void setUp() throws Exception { @@ -84,8 +82,8 @@ public class DeleteBranchesIT extends AbstractDaemonTest { project().deleteBranches(input); fail("Expected ResourceConflictException"); } catch (ResourceConflictException e) { - assertThat(e).hasMessage(errorMessageForBranches( - ImmutableList.of("refs/heads/does-not-exist"))); + assertThat(e) + .hasMessage(errorMessageForBranches(ImmutableList.of("refs/heads/does-not-exist"))); } assertBranchesDeleted(); } @@ -102,8 +100,8 @@ public class DeleteBranchesIT extends AbstractDaemonTest { project().deleteBranches(input); fail("Expected ResourceConflictException"); } catch (ResourceConflictException e) { - assertThat(e).hasMessage(errorMessageForBranches( - ImmutableList.of("refs/heads/does-not-exist"))); + assertThat(e) + .hasMessage(errorMessageForBranches(ImmutableList.of("refs/heads/does-not-exist"))); } assertBranchesDeleted(); } @@ -136,16 +134,16 @@ public class DeleteBranchesIT extends AbstractDaemonTest { private String errorMessageForBranches(List branches) { StringBuilder message = new StringBuilder(); for (String branch : branches) { - message.append("Cannot delete ") - .append(branch) - .append(": it doesn't exist or you do not have permission ") - .append("to delete it\n"); + message + .append("Cannot delete ") + .append(branch) + .append(": it doesn't exist or you do not have permission ") + .append("to delete it\n"); } return message.toString(); } - private HashMap initialRevisions(List branches) - throws Exception { + private HashMap initialRevisions(List branches) throws Exception { HashMap result = new HashMap<>(); for (String branch : branches) { result.put(branch, getRemoteHead(project, branch)); @@ -153,13 +151,10 @@ public class DeleteBranchesIT extends AbstractDaemonTest { return result; } - private void assertRefUpdatedEvents(HashMap revisions) - throws Exception { + private void assertRefUpdatedEvents(HashMap revisions) throws Exception { for (String branch : revisions.keySet()) { RevCommit revision = revisions.get(branch); - eventRecorder.assertRefUpdatedEvents(project.get(), branch, - null, revision, - revision, null); + eventRecorder.assertRefUpdatedEvents(project.get(), branch, null, revision, revision, null); } } @@ -168,8 +163,7 @@ public class DeleteBranchesIT extends AbstractDaemonTest { } private void assertBranches(List branches) throws Exception { - List expected = Lists.newArrayList( - "HEAD", RefNames.REFS_CONFIG, "refs/heads/master"); + List expected = Lists.newArrayList("HEAD", RefNames.REFS_CONFIG, "refs/heads/master"); expected.addAll(branches); assertRefNames(expected, project().branches().get()); } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/DeleteTagIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/DeleteTagIT.java index 491171d2a2..c9d744644e 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/DeleteTagIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/DeleteTagIT.java @@ -24,7 +24,6 @@ import com.google.gerrit.extensions.api.projects.TagApi; import com.google.gerrit.extensions.api.projects.TagInput; import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.extensions.restapi.ResourceNotFoundException; - import org.junit.Before; import org.junit.Test; @@ -62,8 +61,7 @@ public class DeleteTagIT extends AbstractDaemonTest { } @Test - public void deleteTagByProjectOwnerForcePushBlocked_Forbidden() - throws Exception { + public void deleteTagByProjectOwnerForcePushBlocked_Forbidden() throws Exception { grantOwner(); blockForcePush(); setApiUser(user); @@ -96,22 +94,18 @@ public class DeleteTagIT extends AbstractDaemonTest { allow(Permission.DELETE, ANONYMOUS_USERS, "refs/tags/*"); } - private void grantOwner() throws Exception { - allow(Permission.OWNER, REGISTERED_USERS, "refs/tags/*"); - } + private void grantOwner() throws Exception { + allow(Permission.OWNER, REGISTERED_USERS, "refs/tags/*"); + } private TagApi tag() throws Exception { - return gApi.projects() - .name(project.get()) - .tag(TAG); + return gApi.projects().name(project.get()).tag(TAG); } private void assertDeleteSucceeds() throws Exception { String tagRev = tag().get().revision; tag().delete(); - eventRecorder.assertRefUpdatedEvents(project.get(), TAG, - null, tagRev, - tagRev, null); + eventRecorder.assertRefUpdatedEvents(project.get(), TAG, null, tagRev, tagRev, null); exception.expect(ResourceNotFoundException.class); tag().get(); } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/DeleteTagsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/DeleteTagsIT.java index 4516fb3430..32f763486e 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/DeleteTagsIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/DeleteTagsIT.java @@ -27,18 +27,16 @@ import com.google.gerrit.extensions.api.projects.ProjectApi; import com.google.gerrit.extensions.api.projects.TagInfo; import com.google.gerrit.extensions.api.projects.TagInput; import com.google.gerrit.extensions.restapi.ResourceConflictException; - +import java.util.HashMap; +import java.util.List; import org.eclipse.jgit.revwalk.RevCommit; import org.junit.Before; import org.junit.Test; -import java.util.HashMap; -import java.util.List; - @NoHttpd public class DeleteTagsIT extends AbstractDaemonTest { - private static final List TAGS = ImmutableList.of( - "refs/tags/test-1", "refs/tags/test-2", "refs/tags/test-3"); + private static final List TAGS = + ImmutableList.of("refs/tags/test-1", "refs/tags/test-2", "refs/tags/test-3"); @Before public void setUp() throws Exception { @@ -83,8 +81,7 @@ public class DeleteTagsIT extends AbstractDaemonTest { project().deleteTags(input); fail("Expected ResourceConflictException"); } catch (ResourceConflictException e) { - assertThat(e).hasMessage(errorMessageForTags( - ImmutableList.of("refs/tags/does-not-exist"))); + assertThat(e).hasMessage(errorMessageForTags(ImmutableList.of("refs/tags/does-not-exist"))); } assertTagsDeleted(); } @@ -101,8 +98,7 @@ public class DeleteTagsIT extends AbstractDaemonTest { project().deleteTags(input); fail("Expected ResourceConflictException"); } catch (ResourceConflictException e) { - assertThat(e).hasMessage(errorMessageForTags( - ImmutableList.of("refs/tags/does-not-exist"))); + assertThat(e).hasMessage(errorMessageForTags(ImmutableList.of("refs/tags/does-not-exist"))); } assertTagsDeleted(); } @@ -110,16 +106,16 @@ public class DeleteTagsIT extends AbstractDaemonTest { private String errorMessageForTags(List tags) { StringBuilder message = new StringBuilder(); for (String tag : tags) { - message.append("Cannot delete ") - .append(tag) - .append(": it doesn't exist or you do not have permission ") - .append("to delete it\n"); + message + .append("Cannot delete ") + .append(tag) + .append(": it doesn't exist or you do not have permission ") + .append("to delete it\n"); } return message.toString(); } - private HashMap initialRevisions(List tags) - throws Exception { + private HashMap initialRevisions(List tags) throws Exception { HashMap result = new HashMap<>(); for (String tag : tags) { result.put(tag, getRemoteHead(project, tag)); @@ -127,13 +123,10 @@ public class DeleteTagsIT extends AbstractDaemonTest { return result; } - private void assertRefUpdatedEvents(HashMap revisions) - throws Exception { + private void assertRefUpdatedEvents(HashMap revisions) throws Exception { for (String tag : revisions.keySet()) { RevCommit revision = revisions.get(tag); - eventRecorder.assertRefUpdatedEvents(project.get(), tag, - null, revision, - revision, null); + eventRecorder.assertRefUpdatedEvents(project.get(), tag, null, revision, revision, null); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/FileBranchIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/FileBranchIT.java index 66d04df2e3..63f41ad34b 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/FileBranchIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/FileBranchIT.java @@ -23,7 +23,6 @@ import com.google.gerrit.extensions.api.projects.BranchApi; import com.google.gerrit.extensions.restapi.BinaryResult; import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.reviewdb.client.Branch; - import org.junit.Before; import org.junit.Test; @@ -52,8 +51,6 @@ public class FileBranchIT extends AbstractDaemonTest { } private BranchApi branch() throws Exception { - return gApi.projects() - .name(branch.getParentKey().get()) - .branch(branch.get()); + return gApi.projects().name(branch.getParentKey().get()).branch(branch.get()); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GarbageCollectionIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GarbageCollectionIT.java index 4667cc6727..78d027010e 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GarbageCollectionIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GarbageCollectionIT.java @@ -20,14 +20,12 @@ import com.google.gerrit.acceptance.RestResponse; import com.google.gerrit.acceptance.UseLocalDisk; import com.google.gerrit.reviewdb.client.Project; import com.google.inject.Inject; - import org.junit.Before; import org.junit.Test; public class GarbageCollectionIT extends AbstractDaemonTest { - @Inject - private GcAssert gcAssert; + @Inject private GcAssert gcAssert; private Project.NameKey project2; @@ -43,9 +41,7 @@ public class GarbageCollectionIT extends AbstractDaemonTest { @Test public void gcNotAllowed_Forbidden() throws Exception { - userRestSession - .post("/projects/" + allProjects.get() + "/gc") - .assertForbidden(); + userRestSession.post("/projects/" + allProjects.get() + "/gc").assertForbidden(); } @Test diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetChildProjectIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetChildProjectIT.java index f87b921ec5..d5e811dd9f 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetChildProjectIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetChildProjectIT.java @@ -21,7 +21,6 @@ import com.google.gerrit.acceptance.NoHttpd; import com.google.gerrit.extensions.common.ProjectInfo; import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.reviewdb.client.Project; - import org.junit.Test; @NoHttpd @@ -43,8 +42,7 @@ public class GetChildProjectIT extends AbstractDaemonTest { @Test public void getChildProject() throws Exception { Project.NameKey child = createProject("p1"); - ProjectInfo childInfo = gApi.projects().name(allProjects.get()) - .child(child.get()).get(); + ProjectInfo childInfo = gApi.projects().name(allProjects.get()).child(child.get()).get(); assertProjectInfo(projectCache.get(child).getProject(), childInfo); } @@ -62,14 +60,12 @@ public class GetChildProjectIT extends AbstractDaemonTest { Project.NameKey child = createProject("p1"); Project.NameKey grandChild = createProject("p1.1", child); - ProjectInfo grandChildInfo = gApi.projects().name(allProjects.get()) - .child(grandChild.get()).get(true); - assertProjectInfo( - projectCache.get(grandChild).getProject(), grandChildInfo); + ProjectInfo grandChildInfo = + gApi.projects().name(allProjects.get()).child(grandChild.get()).get(true); + assertProjectInfo(projectCache.get(grandChild).getProject(), grandChildInfo); } - private void assertChildNotFound(Project.NameKey parent, String child) - throws Exception { + private void assertChildNotFound(Project.NameKey parent, String child) throws Exception { exception.expect(ResourceNotFoundException.class); exception.expectMessage(child); gApi.projects().name(parent.get()).child(child).get(); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetCommitIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetCommitIT.java index 307d512d97..76d17f146d 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetCommitIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetCommitIT.java @@ -24,7 +24,6 @@ import com.google.gerrit.acceptance.RestResponse; import com.google.gerrit.common.data.Permission; import com.google.gerrit.extensions.common.CommitInfo; import com.google.gerrit.server.git.ProjectConfig; - import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; @@ -51,17 +50,14 @@ public class GetCommitIT extends AbstractDaemonTest { @Test public void getNonExistingCommit_NotFound() throws Exception { - assertNotFound( - ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef")); + assertNotFound(ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef")); } @Test public void getMergedCommit_Found() throws Exception { unblockRead(); - RevCommit commit = repo.parseBody(repo.branch("master") - .commit() - .message("Create\n\nNew commit\n") - .create()); + RevCommit commit = + repo.parseBody(repo.branch("master").commit().message("Create\n\nNew commit\n").create()); CommitInfo info = getCommit(commit); assertThat(info.commit).isEqualTo(commit.name()); @@ -82,25 +78,22 @@ public class GetCommitIT extends AbstractDaemonTest { @Test public void getMergedCommit_NotFound() throws Exception { - RevCommit commit = repo.parseBody(repo.branch("master") - .commit() - .message("Create\n\nNew commit\n") - .create()); + RevCommit commit = + repo.parseBody(repo.branch("master").commit().message("Create\n\nNew commit\n").create()); assertNotFound(commit); } @Test public void getOpenChange_Found() throws Exception { unblockRead(); - PushOneCommit.Result r = pushFactory.create(db, admin.getIdent(), testRepo) - .to("refs/for/master"); + PushOneCommit.Result r = + pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/master"); r.assertOkStatus(); CommitInfo info = getCommit(r.getCommit()); assertThat(info.commit).isEqualTo(r.getCommit().name()); assertThat(info.subject).isEqualTo("test commit"); - assertThat(info.message).isEqualTo( - "test commit\n\nChange-Id: " + r.getChangeId() + "\n"); + assertThat(info.message).isEqualTo("test commit\n\nChange-Id: " + r.getChangeId() + "\n"); assertThat(info.author.name).isEqualTo("Administrator"); assertThat(info.author.email).isEqualTo("admin@example.com"); assertThat(info.committer.name).isEqualTo("Administrator"); @@ -116,8 +109,8 @@ public class GetCommitIT extends AbstractDaemonTest { @Test public void getOpenChange_NotFound() throws Exception { - PushOneCommit.Result r = pushFactory.create(db, admin.getIdent(), testRepo) - .to("refs/for/master"); + PushOneCommit.Result r = + pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/master"); r.assertOkStatus(); assertNotFound(r.getCommit()); } @@ -129,14 +122,11 @@ public class GetCommitIT extends AbstractDaemonTest { } private void assertNotFound(ObjectId id) throws Exception { - userRestSession - .get("/projects/" + project.get() + "/commits/" + id.name()) - .assertNotFound(); + userRestSession.get("/projects/" + project.get() + "/commits/" + id.name()).assertNotFound(); } private CommitInfo getCommit(ObjectId id) throws Exception { - RestResponse r = userRestSession.get( - "/projects/" + project.get() + "/commits/" + id.name()); + RestResponse r = userRestSession.get("/projects/" + project.get() + "/commits/" + id.name()); r.assertOK(); CommitInfo result = newGson().fromJson(r.getReader(), CommitInfo.class); r.consume(); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetProjectIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetProjectIT.java index 24b1770a43..53e5b55c0b 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetProjectIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetProjectIT.java @@ -20,7 +20,6 @@ import com.google.gerrit.acceptance.AbstractDaemonTest; import com.google.gerrit.acceptance.NoHttpd; import com.google.gerrit.extensions.common.ProjectInfo; import com.google.gerrit.extensions.restapi.ResourceNotFoundException; - import org.junit.Test; @NoHttpd diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListBranchesIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListBranchesIT.java index 57282170b2..a642d17eaa 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListBranchesIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListBranchesIT.java @@ -25,7 +25,6 @@ import com.google.gerrit.extensions.api.projects.BranchInfo; import com.google.gerrit.extensions.api.projects.ProjectApi.ListRefsRequest; import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.reviewdb.client.RefNames; - import org.junit.Test; @NoHttpd @@ -47,9 +46,8 @@ public class ListBranchesIT extends AbstractDaemonTest { @Test @TestProjectInput(createEmptyCommit = false) public void listBranchesOfEmptyProject() throws Exception { - assertRefs(ImmutableList.of( - branch("HEAD", null, false), - branch(RefNames.REFS_CONFIG, null, false)), + assertRefs( + ImmutableList.of(branch("HEAD", null, false), branch(RefNames.REFS_CONFIG, null, false)), list().get()); } @@ -57,11 +55,12 @@ public class ListBranchesIT extends AbstractDaemonTest { public void listBranches() throws Exception { String master = pushTo("refs/heads/master").getCommit().name(); String dev = pushTo("refs/heads/dev").getCommit().name(); - assertRefs(ImmutableList.of( - branch("HEAD", "master", false), - branch(RefNames.REFS_CONFIG, null, false), - branch("refs/heads/dev", dev, true), - branch("refs/heads/master", master, false)), + assertRefs( + ImmutableList.of( + branch("HEAD", "master", false), + branch(RefNames.REFS_CONFIG, null, false), + branch("refs/heads/dev", dev, true), + branch("refs/heads/master", master, false)), list().get()); } @@ -72,9 +71,9 @@ public class ListBranchesIT extends AbstractDaemonTest { pushTo("refs/heads/dev"); setApiUser(user); // refs/meta/config is hidden since user is no project owner - assertRefs(ImmutableList.of( - branch("HEAD", "master", false), - branch("refs/heads/master", master, false)), + assertRefs( + ImmutableList.of( + branch("HEAD", "master", false), branch("refs/heads/master", master, false)), list().get()); } @@ -85,8 +84,7 @@ public class ListBranchesIT extends AbstractDaemonTest { String dev = pushTo("refs/heads/dev").getCommit().name(); setApiUser(user); // refs/meta/config is hidden since user is no project owner - assertRefs(ImmutableList.of(branch("refs/heads/dev", dev, false)), - list().get()); + assertRefs(ImmutableList.of(branch("refs/heads/dev", dev, false)), list().get()); } @Test @@ -97,38 +95,37 @@ public class ListBranchesIT extends AbstractDaemonTest { pushTo("refs/heads/someBranch3"); // Using only limit. - assertRefNames(ImmutableList.of( - "HEAD", - RefNames.REFS_CONFIG, - "refs/heads/master", - "refs/heads/someBranch1"), + assertRefNames( + ImmutableList.of( + "HEAD", RefNames.REFS_CONFIG, "refs/heads/master", "refs/heads/someBranch1"), list().withLimit(4).get()); // Limit higher than total number of branches. - assertRefNames(ImmutableList.of( - "HEAD", - RefNames.REFS_CONFIG, - "refs/heads/master", - "refs/heads/someBranch1", - "refs/heads/someBranch2", - "refs/heads/someBranch3"), + assertRefNames( + ImmutableList.of( + "HEAD", + RefNames.REFS_CONFIG, + "refs/heads/master", + "refs/heads/someBranch1", + "refs/heads/someBranch2", + "refs/heads/someBranch3"), list().withLimit(25).get()); // Using start only. - assertRefNames(ImmutableList.of( - "refs/heads/master", - "refs/heads/someBranch1", - "refs/heads/someBranch2", - "refs/heads/someBranch3"), + assertRefNames( + ImmutableList.of( + "refs/heads/master", + "refs/heads/someBranch1", + "refs/heads/someBranch2", + "refs/heads/someBranch3"), list().withStart(2).get()); // Skip more branches than the number of available branches. - assertRefNames(ImmutableList. of(), list().withStart(7).get()); + assertRefNames(ImmutableList.of(), list().withStart(7).get()); // Ssing start and limit. - assertRefNames(ImmutableList.of( - "refs/heads/master", - "refs/heads/someBranch1"), + assertRefNames( + ImmutableList.of("refs/heads/master", "refs/heads/someBranch1"), list().withStart(2).withLimit(2).get()); } @@ -140,29 +137,25 @@ public class ListBranchesIT extends AbstractDaemonTest { pushTo("refs/heads/someBranch3"); // Using substring. - assertRefNames(ImmutableList.of( - "refs/heads/someBranch1", - "refs/heads/someBranch2", - "refs/heads/someBranch3"), + assertRefNames( + ImmutableList.of( + "refs/heads/someBranch1", "refs/heads/someBranch2", "refs/heads/someBranch3"), list().withSubstring("some").get()); - assertRefNames(ImmutableList.of( - "refs/heads/someBranch1", - "refs/heads/someBranch2", - "refs/heads/someBranch3"), + assertRefNames( + ImmutableList.of( + "refs/heads/someBranch1", "refs/heads/someBranch2", "refs/heads/someBranch3"), list().withSubstring("Branch").get()); // Using regex. - assertRefNames(ImmutableList.of("refs/heads/master"), - list().withRegex(".*ast.*r").get()); + assertRefNames(ImmutableList.of("refs/heads/master"), list().withRegex(".*ast.*r").get()); } private ListRefsRequest list() throws Exception { return gApi.projects().name(project.get()).branches(); } - private static BranchInfo branch(String ref, String revision, - boolean canDelete) { + private static BranchInfo branch(String ref, String revision, boolean canDelete) { BranchInfo info = new BranchInfo(); info.ref = ref; info.revision = revision; diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListChildProjectsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListChildProjectsIT.java index 78e0ba2588..dd92a7ab44 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListChildProjectsIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListChildProjectsIT.java @@ -20,7 +20,6 @@ import com.google.gerrit.acceptance.AbstractDaemonTest; import com.google.gerrit.acceptance.NoHttpd; import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.reviewdb.client.Project; - import org.junit.Test; @NoHttpd @@ -35,8 +34,7 @@ public class ListChildProjectsIT extends AbstractDaemonTest { @Test public void listNoChildren() throws Exception { - assertThatNameList(gApi.projects().name(project.get()).children()) - .isEmpty(); + assertThatNameList(gApi.projects().name(project.get()).children()).isEmpty(); } @Test @@ -46,7 +44,8 @@ public class ListChildProjectsIT extends AbstractDaemonTest { Project.NameKey child1_2 = createProject("p1.2", child1); assertThatNameList(gApi.projects().name(child1.get()).children()) - .containsExactly(child1_1, child1_2).inOrder(); + .containsExactly(child1_1, child1_2) + .inOrder(); } @Test diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListProjectsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListProjectsIT.java index 496e7fdf9e..e41d579f93 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListProjectsIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListProjectsIT.java @@ -33,23 +33,21 @@ import com.google.gerrit.server.config.AllUsersName; import com.google.gerrit.server.git.ProjectConfig; import com.google.gerrit.server.project.Util; import com.google.inject.Inject; - -import org.junit.Test; - import java.util.List; import java.util.Map; +import org.junit.Test; @NoHttpd public class ListProjectsIT extends AbstractDaemonTest { - @Inject - private AllUsersName allUsers; + @Inject private AllUsersName allUsers; @Test public void listProjects() throws Exception { Project.NameKey someProject = createProject("some-project"); assertThatNameList(filter(gApi.projects().list().get())) - .containsExactly(allProjects, allUsers, project, someProject).inOrder(); + .containsExactly(allProjects, allUsers, project, someProject) + .inOrder(); } @Test @@ -61,14 +59,12 @@ public class ListProjectsIT extends AbstractDaemonTest { Util.block(cfg, Permission.READ, REGISTERED_USERS, "refs/*"); saveProjectConfig(project, cfg); - assertThatNameList(filter(gApi.projects().list().get())) - .doesNotContain(project); + assertThatNameList(filter(gApi.projects().list().get())).doesNotContain(project); } @Test public void listProjectsWithBranch() throws Exception { - Map result = gApi.projects().list() - .addShowBranch("master").getAsMap(); + Map result = gApi.projects().list().addShowBranch("master").getAsMap(); assertThat(result).containsKey(project.get()); ProjectInfo info = result.get(project.get()); assertThat(info.branches).isNotNull(); @@ -86,8 +82,7 @@ public class ListProjectsIT extends AbstractDaemonTest { result = gApi.projects().list().withDescription(true).getAsMap(); assertThat(result).containsKey(project.get()); - assertThat(result.get(project.get()).description).isEqualTo( - "Description of some-project"); + assertThat(result.get(project.get()).description).isEqualTo("Description of some-project"); } @Test @@ -100,8 +95,7 @@ public class ListProjectsIT extends AbstractDaemonTest { // 5, plus p which was automatically created. int n = 6; for (int i = 1; i <= n + 2; i++) { - assertThatNameList(gApi.projects().list().withPrefix(p) - .withLimit(i).get()) + assertThatNameList(gApi.projects().list().withPrefix(p).withLimit(i).get()) .hasSize(Math.min(i, n)); } } @@ -116,7 +110,8 @@ public class ListProjectsIT extends AbstractDaemonTest { assertBadRequest(gApi.projects().list().withPrefix(p).withRegex(".*")); assertBadRequest(gApi.projects().list().withPrefix(p).withSubstring(p)); assertThatNameList(filter(gApi.projects().list().withPrefix(p).get())) - .containsExactly(someOtherProject, someProject).inOrder(); + .containsExactly(someOtherProject, someProject) + .inOrder(); } @Test @@ -135,8 +130,8 @@ public class ListProjectsIT extends AbstractDaemonTest { assertThatNameList(filter(gApi.projects().list().withRegex(r).get())) .containsExactly(someProject); assertThatNameList(filter(gApi.projects().list().withRegex(".*").get())) - .containsExactly(allProjects, allUsers, project, projectAwesome, - someOtherProject, someProject) + .containsExactly( + allProjects, allUsers, project, projectAwesome, someOtherProject, someProject) .inOrder(); } @@ -151,8 +146,7 @@ public class ListProjectsIT extends AbstractDaemonTest { // 5, plus p which was automatically created. int n = 6; assertThat(all).hasSize(n); - assertThatNameList(gApi.projects().list().withPrefix(p) - .withStart(n - 1).get()) + assertThatNameList(gApi.projects().list().withPrefix(p).withStart(n - 1).get()) .containsExactly(new Project.NameKey(Iterables.getLast(all).name)); } @@ -162,12 +156,9 @@ public class ListProjectsIT extends AbstractDaemonTest { Project.NameKey someOtherProject = createProject("some-other-project"); Project.NameKey projectAwesome = createProject("project-awesome"); - assertBadRequest(gApi.projects().list().withSubstring("some") - .withRegex(".*")); - assertBadRequest(gApi.projects().list().withSubstring("some") - .withPrefix("some")); - assertThatNameList(filter(gApi.projects().list().withSubstring("some") - .get())) + assertBadRequest(gApi.projects().list().withSubstring("some").withRegex(".*")); + assertBadRequest(gApi.projects().list().withSubstring("some").withPrefix("some")); + assertThatNameList(filter(gApi.projects().list().withSubstring("some").get())) .containsExactly(projectAwesome, someOtherProject, someProject) .inOrder(); } @@ -175,26 +166,23 @@ public class ListProjectsIT extends AbstractDaemonTest { @Test public void listProjectsWithTree() throws Exception { Project.NameKey someParentProject = createProject("some-parent-project"); - Project.NameKey someChildProject = - createProject("some-child-project", someParentProject); + Project.NameKey someChildProject = createProject("some-child-project", someParentProject); - Map result = gApi.projects().list().withTree(true) - .getAsMap(); + Map result = gApi.projects().list().withTree(true).getAsMap(); assertThat(result).containsKey(someChildProject.get()); - assertThat(result.get(someChildProject.get()).parent) - .isEqualTo(someParentProject.get()); + assertThat(result.get(someChildProject.get()).parent).isEqualTo(someParentProject.get()); } @Test public void listProjectWithType() throws Exception { - Map result = gApi.projects().list() - .withType(FilterType.PERMISSIONS).getAsMap(); + Map result = + gApi.projects().list().withType(FilterType.PERMISSIONS).getAsMap(); assertThat(result).hasSize(1); assertThat(result).containsKey(allProjects.get()); - assertThatNameList(filter(gApi.projects().list().withType(FilterType.ALL) - .get())) - .containsExactly(allProjects, allUsers, project).inOrder(); + assertThatNameList(filter(gApi.projects().list().withType(FilterType.ALL).get())) + .containsExactly(allProjects, allUsers, project) + .inOrder(); } private void assertBadRequest(ListRequest req) throws Exception { @@ -211,10 +199,10 @@ public class ListProjectsIT extends AbstractDaemonTest { return Iterables.filter( infos, p -> { - return p.name != null && ( - p.name.equals(allProjects.get()) - || p.name.equals(allUsers.get()) - || p.name.startsWith(prefix)); + return p.name != null + && (p.name.equals(allProjects.get()) + || p.name.equals(allUsers.get()) + || p.name.startsWith(prefix)); }); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectAssert.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectAssert.java index e3104bb063..3b5a3a4e76 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectAssert.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectAssert.java @@ -26,13 +26,11 @@ import com.google.gerrit.extensions.restapi.Url; import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.project.ProjectState; - import java.util.List; import java.util.Set; public class ProjectAssert { - public static IterableSubject assertThatNameList( - Iterable actualIt) { + public static IterableSubject assertThatNameList(Iterable actualIt) { List actual = ImmutableList.copyOf(actualIt); for (ProjectInfo info : actual) { assertWithMessage("missing project name").that(info.name).isNotNull(); @@ -40,8 +38,7 @@ public class ProjectAssert { .that(Url.decode(info.id)) .isEqualTo(info.name); } - return assertThat( - Iterables.transform(actual, p -> new Project.NameKey(p.name))); + return assertThat(Iterables.transform(actual, p -> new Project.NameKey(p.name))); } public static void assertProjectInfo(Project project, ProjectInfo info) { @@ -56,12 +53,11 @@ public class ProjectAssert { } else { assertThat(info.parent).isNull(); } - assertThat(Strings.nullToEmpty(info.description)).isEqualTo( - project.getDescription()); + assertThat(Strings.nullToEmpty(info.description)).isEqualTo(project.getDescription()); } - public static void assertProjectOwners(Set expectedOwners, - ProjectState state) { + public static void assertProjectOwners( + Set expectedOwners, ProjectState state) { for (AccountGroup.UUID g : state.getOwners()) { assertThat(expectedOwners.remove(g)).isTrue(); } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectLevelConfigIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectLevelConfigIT.java index 649534b778..c1bbf2e553 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectLevelConfigIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectLevelConfigIT.java @@ -22,7 +22,6 @@ import com.google.gerrit.acceptance.PushOneCommit; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.reviewdb.client.RefNames; import com.google.gerrit.server.project.ProjectState; - import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.Config; import org.junit.Before; @@ -42,13 +41,17 @@ public class ProjectLevelConfigIT extends AbstractDaemonTest { cfg.setString("s1", null, "k1", "v1"); cfg.setString("s2", "ss", "k2", "v2"); PushOneCommit push = - pushFactory.create(db, admin.getIdent(), testRepo, "Create Project Level Config", - configName, cfg.toText()); + pushFactory.create( + db, + admin.getIdent(), + testRepo, + "Create Project Level Config", + configName, + cfg.toText()); push.to(RefNames.REFS_CONFIG); ProjectState state = projectCache.get(project); - assertThat(state.getConfig(configName).get().toText()).isEqualTo( - cfg.toText()); + assertThat(state.getConfig(configName).get().toText()).isEqualTo(cfg.toText()); } @Test @@ -67,9 +70,14 @@ public class ProjectLevelConfigIT extends AbstractDaemonTest { parentCfg.setString("s2", "ss", "k3", "parentValue3"); parentCfg.setString("s2", "ss", "k4", "parentValue4"); - pushFactory.create( - db, admin.getIdent(), testRepo, "Create Project Level Config", - configName, parentCfg.toText()) + pushFactory + .create( + db, + admin.getIdent(), + testRepo, + "Create Project Level Config", + configName, + parentCfg.toText()) .to(RefNames.REFS_CONFIG) .assertOkStatus(); @@ -82,9 +90,14 @@ public class ProjectLevelConfigIT extends AbstractDaemonTest { cfg.setString("s1", null, "k1", "childValue1"); cfg.setString("s2", "ss", "k3", "childValue2"); - pushFactory.create( - db, admin.getIdent(), childTestRepo, "Create Project Level Config", - configName, cfg.toText()) + pushFactory + .create( + db, + admin.getIdent(), + childTestRepo, + "Create Project Level Config", + configName, + cfg.toText()) .to(RefNames.REFS_CONFIG) .assertOkStatus(); @@ -99,7 +112,6 @@ public class ProjectLevelConfigIT extends AbstractDaemonTest { assertThat(state.getConfig(configName).getWithInheritance().toText()) .isEqualTo(expectedCfg.toText()); - assertThat(state.getConfig(configName).get().toText()).isEqualTo( - cfg.toText()); + assertThat(state.getConfig(configName).get().toText()).isEqualTo(cfg.toText()); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/PushTagIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/PushTagIT.java index 01a2443620..4bd8df4a96 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/PushTagIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/PushTagIT.java @@ -29,7 +29,6 @@ import com.google.gerrit.acceptance.GitUtil; import com.google.gerrit.acceptance.NoHttpd; import com.google.gerrit.common.data.Permission; import com.google.gerrit.reviewdb.client.RefNames; - import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.transport.PushResult; @@ -97,18 +96,15 @@ public class PushTagIT extends AbstractDaemonTest { allowTagCreation(tagType); String tagName = pushTagForExistingCommit(tagType, Status.OK); - fastForwardTagToExistingCommit(tagType, tagName, - Status.REJECTED_OTHER_REASON); + fastForwardTagToExistingCommit(tagType, tagName, Status.REJECTED_OTHER_REASON); fastForwardTagToNewCommit(tagType, tagName, Status.REJECTED_OTHER_REASON); allowTagDeletion(); - fastForwardTagToExistingCommit(tagType, tagName, - Status.REJECTED_OTHER_REASON); + fastForwardTagToExistingCommit(tagType, tagName, Status.REJECTED_OTHER_REASON); fastForwardTagToNewCommit(tagType, tagName, Status.REJECTED_OTHER_REASON); allowPushOnRefsTags(); - Status expectedStatus = - tagType == ANNOTATED ? Status.REJECTED_OTHER_REASON : Status.OK; + Status expectedStatus = tagType == ANNOTATED ? Status.REJECTED_OTHER_REASON : Status.OK; fastForwardTagToExistingCommit(tagType, tagName, expectedStatus); fastForwardTagToNewCommit(tagType, tagName, expectedStatus); @@ -126,18 +122,15 @@ public class PushTagIT extends AbstractDaemonTest { allowTagCreation(tagType); String tagName = pushTagForExistingCommit(tagType, Status.OK); - forceUpdateTagToExistingCommit(tagType, tagName, - Status.REJECTED_OTHER_REASON); + forceUpdateTagToExistingCommit(tagType, tagName, Status.REJECTED_OTHER_REASON); forceUpdateTagToNewCommit(tagType, tagName, Status.REJECTED_OTHER_REASON); allowPushOnRefsTags(); - forceUpdateTagToExistingCommit(tagType, tagName, - Status.REJECTED_OTHER_REASON); + forceUpdateTagToExistingCommit(tagType, tagName, Status.REJECTED_OTHER_REASON); forceUpdateTagToNewCommit(tagType, tagName, Status.REJECTED_OTHER_REASON); allowTagDeletion(); - forceUpdateTagToExistingCommit(tagType, tagName, - Status.REJECTED_OTHER_REASON); + forceUpdateTagToExistingCommit(tagType, tagName, Status.REJECTED_OTHER_REASON); forceUpdateTagToNewCommit(tagType, tagName, Status.REJECTED_OTHER_REASON); allowForcePushOnRefsTags(); @@ -174,38 +167,37 @@ public class PushTagIT extends AbstractDaemonTest { } } - private String pushTagForExistingCommit(TagType tagType, - Status expectedStatus) throws Exception { + private String pushTagForExistingCommit(TagType tagType, Status expectedStatus) throws Exception { return pushTag(tagType, null, false, false, expectedStatus); } - private String pushTagForNewCommit(TagType tagType, - Status expectedStatus) throws Exception { + private String pushTagForNewCommit(TagType tagType, Status expectedStatus) throws Exception { return pushTag(tagType, null, true, false, expectedStatus); } - private void fastForwardTagToExistingCommit(TagType tagType, String tagName, - Status expectedStatus) throws Exception { + private void fastForwardTagToExistingCommit( + TagType tagType, String tagName, Status expectedStatus) throws Exception { pushTag(tagType, tagName, false, false, expectedStatus); } - private void fastForwardTagToNewCommit(TagType tagType, String tagName, - Status expectedStatus) throws Exception { + private void fastForwardTagToNewCommit(TagType tagType, String tagName, Status expectedStatus) + throws Exception { pushTag(tagType, tagName, true, false, expectedStatus); } - private void forceUpdateTagToExistingCommit(TagType tagType, String tagName, - Status expectedStatus) throws Exception { + private void forceUpdateTagToExistingCommit( + TagType tagType, String tagName, Status expectedStatus) throws Exception { pushTag(tagType, tagName, false, true, expectedStatus); } - private void forceUpdateTagToNewCommit(TagType tagType, String tagName, - Status expectedStatus) throws Exception { + private void forceUpdateTagToNewCommit(TagType tagType, String tagName, Status expectedStatus) + throws Exception { pushTag(tagType, tagName, true, true, expectedStatus); } - private String pushTag(TagType tagType, String tagName, boolean newCommit, - boolean force, Status expectedStatus) throws Exception { + private String pushTag( + TagType tagType, String tagName, boolean newCommit, boolean force, Status expectedStatus) + throws Exception { if (force) { testRepo.reset(initialHead); } @@ -228,34 +220,30 @@ public class PushTagIT extends AbstractDaemonTest { } if (!newCommit) { - grant(Permission.SUBMIT, project, "refs/for/refs/heads/master", false, - REGISTERED_USERS); + grant(Permission.SUBMIT, project, "refs/for/refs/heads/master", false, REGISTERED_USERS); pushHead(testRepo, "refs/for/master%submit"); } String tagRef = tagRef(tagName); - PushResult r = tagType == LIGHTWEIGHT - ? pushHead(testRepo, tagRef, false, force) - : GitUtil.pushTag(testRepo, tagName, !createTag); + PushResult r = + tagType == LIGHTWEIGHT + ? pushHead(testRepo, tagRef, false, force) + : GitUtil.pushTag(testRepo, tagName, !createTag); RemoteRefUpdate refUpdate = r.getRemoteUpdate(tagRef); - assertThat(refUpdate.getStatus()) - .named(tagType.name()) - .isEqualTo(expectedStatus); + assertThat(refUpdate.getStatus()).named(tagType.name()).isEqualTo(expectedStatus); return tagName; } - private void pushTagDeletion(TagType tagType, String tagName, - Status expectedStatus) throws Exception { + private void pushTagDeletion(TagType tagType, String tagName, Status expectedStatus) + throws Exception { String tagRef = tagRef(tagName); PushResult r = deleteRef(testRepo, tagRef); RemoteRefUpdate refUpdate = r.getRemoteUpdate(tagRef); - assertThat(refUpdate.getStatus()).named(tagType.name()) - .isEqualTo(expectedStatus); + assertThat(refUpdate.getStatus()).named(tagType.name()).isEqualTo(expectedStatus); } private void allowTagCreation(TagType tagType) throws Exception { - grant(tagType.createPermission, project, "refs/tags/*", false, - REGISTERED_USERS); + grant(tagType.createPermission, project, "refs/tags/*", false, REGISTERED_USERS); } private void allowPushOnRefsTags() throws Exception { @@ -278,10 +266,7 @@ public class PushTagIT extends AbstractDaemonTest { } private void commit(PersonIdent ident, String subject) throws Exception { - commitBuilder() - .ident(ident) - .message(subject + " (" + System.nanoTime() + ")") - .create(); + commitBuilder().ident(ident).message(subject + " (" + System.nanoTime() + ")").create(); } private static String tagRef(String tagName) { diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/RefAssert.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/RefAssert.java index 0cbf79a3d7..b3e3d2f8cf 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/RefAssert.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/RefAssert.java @@ -18,20 +18,19 @@ import static com.google.common.truth.Truth.assertThat; import com.google.common.collect.Iterables; import com.google.gerrit.extensions.api.projects.RefInfo; - import java.util.List; public class RefAssert { - public static void assertRefs(List expectedRefs, - List actualRefs) { + public static void assertRefs( + List expectedRefs, List actualRefs) { assertRefNames(refs(expectedRefs), actualRefs); for (int i = 0; i < expectedRefs.size(); i++) { assertRefInfo(expectedRefs.get(i), actualRefs.get(i)); } } - public static void assertRefNames(Iterable expectedRefs, - Iterable actualRefs) { + public static void assertRefNames( + Iterable expectedRefs, Iterable actualRefs) { Iterable actualNames = refs(actualRefs); assertThat(actualNames).containsExactlyElementsIn(expectedRefs).inOrder(); } @@ -39,10 +38,10 @@ public class RefAssert { public static void assertRefInfo(RefInfo expected, RefInfo actual) { assertThat(actual.ref).isEqualTo(expected.ref); if (expected.revision != null) { - assertThat(actual.revision).named("revision of " + actual.ref) - .isEqualTo(expected.revision); + assertThat(actual.revision).named("revision of " + actual.ref).isEqualTo(expected.revision); } - assertThat(toBoolean(actual.canDelete)).named("can delete " + actual.ref) + assertThat(toBoolean(actual.canDelete)) + .named("can delete " + actual.ref) .isEqualTo(toBoolean(expected.canDelete)); } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/SetParentIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/SetParentIT.java index b106e99bdb..841e398c0a 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/SetParentIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/SetParentIT.java @@ -21,7 +21,6 @@ import com.google.gerrit.acceptance.RestResponse; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.config.AllProjectsNameProvider; import com.google.gerrit.server.project.SetParent; - import org.junit.Test; public class SetParentIT extends AbstractDaemonTest { @@ -29,8 +28,7 @@ public class SetParentIT extends AbstractDaemonTest { public void setParent_Forbidden() throws Exception { String parent = createProject("parent", null, true).get(); RestResponse r = - userRestSession.put("/projects/" + project.get() + "/parent", - newParentInput(parent)); + userRestSession.put("/projects/" + project.get() + "/parent", newParentInput(parent)); r.assertForbidden(); r.consume(); } @@ -39,22 +37,19 @@ public class SetParentIT extends AbstractDaemonTest { public void setParent() throws Exception { String parent = createProject("parent", null, true).get(); RestResponse r = - adminRestSession.put("/projects/" + project.get() + "/parent", - newParentInput(parent)); + adminRestSession.put("/projects/" + project.get() + "/parent", newParentInput(parent)); r.assertOK(); r.consume(); r = adminRestSession.get("/projects/" + project.get() + "/parent"); r.assertOK(); - String newParent = - newGson().fromJson(r.getReader(), String.class); + String newParent = newGson().fromJson(r.getReader(), String.class); assertThat(newParent).isEqualTo(parent); r.consume(); // When the parent name is not explicitly set, it should be // set to "All-Projects". - r = adminRestSession.put("/projects/" + project.get() + "/parent", - newParentInput(null)); + r = adminRestSession.put("/projects/" + project.get() + "/parent", newParentInput(null)); r.assertOK(); r.consume(); @@ -68,8 +63,8 @@ public class SetParentIT extends AbstractDaemonTest { @Test public void setParentForAllProjects_Conflict() throws Exception { RestResponse r = - adminRestSession.put("/projects/" + allProjects.get() + "/parent", - newParentInput(project.get())); + adminRestSession.put( + "/projects/" + allProjects.get() + "/parent", newParentInput(project.get())); r.assertConflict(); r.consume(); } @@ -77,20 +72,18 @@ public class SetParentIT extends AbstractDaemonTest { @Test public void setInvalidParent_Conflict() throws Exception { RestResponse r = - adminRestSession.put("/projects/" + project.get() + "/parent", - newParentInput(project.get())); + adminRestSession.put( + "/projects/" + project.get() + "/parent", newParentInput(project.get())); r.assertConflict(); r.consume(); Project.NameKey child = createProject("child", project, true); - r = adminRestSession.put("/projects/" + project.get() + "/parent", - newParentInput(child.get())); + r = adminRestSession.put("/projects/" + project.get() + "/parent", newParentInput(child.get())); r.assertConflict(); r.consume(); String grandchild = createProject("grandchild", child, true).get(); - r = adminRestSession.put("/projects/" + project.get() + "/parent", - newParentInput(grandchild)); + r = adminRestSession.put("/projects/" + project.get() + "/parent", newParentInput(grandchild)); r.assertConflict(); r.consume(); } @@ -98,8 +91,8 @@ public class SetParentIT extends AbstractDaemonTest { @Test public void setNonExistingParent_UnprocessibleEntity() throws Exception { RestResponse r = - adminRestSession.put("/projects/" + project.get() + "/parent", - newParentInput("non-existing")); + adminRestSession.put( + "/projects/" + project.get() + "/parent", newParentInput("non-existing")); r.assertUnprocessableEntity(); r.consume(); } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/TagsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/TagsIT.java index fcaf7ce1be..03459da0dc 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/TagsIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/TagsIT.java @@ -33,28 +33,27 @@ import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.restapi.MethodNotAllowedException; import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.extensions.restapi.ResourceNotFoundException; - -import org.junit.Test; - import java.util.List; +import org.junit.Test; @NoHttpd public class TagsIT extends AbstractDaemonTest { - private static final List testTags = ImmutableList.of( - "tag-A", "tag-B", "tag-C", "tag-D", "tag-E", "tag-F", "tag-G", "tag-H"); + private static final List testTags = + ImmutableList.of("tag-A", "tag-B", "tag-C", "tag-D", "tag-E", "tag-F", "tag-G", "tag-H"); - private static final String SIGNED_ANNOTATION = "annotation\n" - + "-----BEGIN PGP SIGNATURE-----\n" - + "Version: GnuPG v1\n" - + "\n" - + "iQEcBAABAgAGBQJVeGg5AAoJEPfTicJkUdPkUggH/RKAeI9/i/LduuiqrL/SSdIa\n" - + "9tYaSqJKLbXz63M/AW4Sp+4u+dVCQvnAt/a35CVEnpZz6hN4Kn/tiswOWVJf4CO7\n" - + "htNubGs5ZMwvD6sLYqKAnrM3WxV/2TbbjzjZW6Jkidz3jz/WRT4SmjGYiEO7aA+V\n" - + "4ZdIS9f7sW5VsHHYlNThCA7vH8Uu48bUovFXyQlPTX0pToSgrWV3JnTxDNxfn3iG\n" - + "IL0zTY/qwVCdXgFownLcs6J050xrrBWIKqfcWr3u4D2aCLyR0v+S/KArr7ulZygY\n" - + "+SOklImn8TAZiNxhWtA6ens66IiammUkZYFv7SSzoPLFZT4dC84SmGPWgf94NoQ=\n" - + "=XFeC\n" - + "-----END PGP SIGNATURE-----"; + private static final String SIGNED_ANNOTATION = + "annotation\n" + + "-----BEGIN PGP SIGNATURE-----\n" + + "Version: GnuPG v1\n" + + "\n" + + "iQEcBAABAgAGBQJVeGg5AAoJEPfTicJkUdPkUggH/RKAeI9/i/LduuiqrL/SSdIa\n" + + "9tYaSqJKLbXz63M/AW4Sp+4u+dVCQvnAt/a35CVEnpZz6hN4Kn/tiswOWVJf4CO7\n" + + "htNubGs5ZMwvD6sLYqKAnrM3WxV/2TbbjzjZW6Jkidz3jz/WRT4SmjGYiEO7aA+V\n" + + "4ZdIS9f7sW5VsHHYlNThCA7vH8Uu48bUovFXyQlPTX0pToSgrWV3JnTxDNxfn3iG\n" + + "IL0zTY/qwVCdXgFownLcs6J050xrrBWIKqfcWr3u4D2aCLyR0v+S/KArr7ulZygY\n" + + "+SOklImn8TAZiNxhWtA6ens66IiammUkZYFv7SSzoPLFZT4dC84SmGPWgf94NoQ=\n" + + "=XFeC\n" + + "-----END PGP SIGNATURE-----"; @Test public void listTagsOfNonExistingProject() throws Exception { @@ -107,8 +106,7 @@ public class TagsIT extends AbstractDaemonTest { // With regular expression filter result = getTags().withRegex("^tag-[C|D]$").get(); - assertTagList( - FluentIterable.from(ImmutableList.of("tag-C", "tag-D")), result); + assertTagList(FluentIterable.from(ImmutableList.of("tag-C", "tag-D")), result); // With substring filter result = getTags().withSubstring("tag-").get(); @@ -178,8 +176,7 @@ public class TagsIT extends AbstractDaemonTest { assertThat(result.ref).isEqualTo(input.ref); assertThat(result.revision).isEqualTo(input.revision); - eventRecorder.assertRefUpdatedEvents(project.get(), result.ref, - null, result.revision); + eventRecorder.assertRefUpdatedEvents(project.get(), result.ref, null, result.revision); } @Test @@ -202,8 +199,7 @@ public class TagsIT extends AbstractDaemonTest { assertThat(result.tagger.name).isEqualTo(admin.fullName); assertThat(result.tagger.email).isEqualTo(admin.email); - eventRecorder.assertRefUpdatedEvents(project.get(), result.ref, - null, result.revision); + eventRecorder.assertRefUpdatedEvents(project.get(), result.ref, null, result.revision); // A second tag pushed on the same ref should have the same ref TagInput input2 = new TagInput(); @@ -217,8 +213,7 @@ public class TagsIT extends AbstractDaemonTest { assertThat(result2.tagger.name).isEqualTo(admin.fullName); assertThat(result2.tagger.email).isEqualTo(admin.email); - eventRecorder.assertRefUpdatedEvents(project.get(), result2.ref, - null, result2.revision); + eventRecorder.assertRefUpdatedEvents(project.get(), result2.ref, null, result2.revision); } @Test @@ -253,8 +248,7 @@ public class TagsIT extends AbstractDaemonTest { input.ref = "test"; input.message = "annotation"; exception.expect(AuthException.class); - exception.expectMessage( - "Cannot create annotated tag \"" + R_TAGS + "test\""); + exception.expectMessage("Cannot create annotated tag \"" + R_TAGS + "test\""); tag(input.ref).create(input); } @@ -315,10 +309,10 @@ public class TagsIT extends AbstractDaemonTest { tag(input.ref).create(input); } - private void assertTagList(FluentIterable expected, - List actual) throws Exception { + private void assertTagList(FluentIterable expected, List actual) + throws Exception { assertThat(actual).hasSize(expected.size()); - for (int i = 0; i < expected.size(); i ++) { + for (int i = 0; i < expected.size(); i++) { assertThat(actual.get(i).ref).isEqualTo(R_TAGS + expected.get(i)); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/CommentsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/CommentsIT.java index 68b87daf09..2fa0f4dca3 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/CommentsIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/CommentsIT.java @@ -45,10 +45,6 @@ import com.google.gerrit.testutil.FakeEmailSender; import com.google.gerrit.testutil.FakeEmailSender.Message; import com.google.inject.Inject; import com.google.inject.Provider; - -import org.junit.Before; -import org.junit.Test; - import java.sql.Timestamp; import java.util.ArrayList; import java.util.HashMap; @@ -57,18 +53,17 @@ import java.util.Map; import java.util.function.Supplier; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.junit.Before; +import org.junit.Test; @NoHttpd public class CommentsIT extends AbstractDaemonTest { - @Inject - private Provider changes; + @Inject private Provider changes; - @Inject - private Provider postReview; + @Inject private Provider postReview; - @Inject - private FakeEmailSender email; + @Inject private FakeEmailSender email; private final Integer[] lines = {0, 1}; @@ -129,14 +124,13 @@ public class CommentsIT extends AbstractDaemonTest { for (Integer line : lines) { String file = "file"; String contents = "contents " + line; - PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo, - "first subject", file, contents); + PushOneCommit push = + pushFactory.create(db, admin.getIdent(), testRepo, "first subject", file, contents); PushOneCommit.Result r = push.to("refs/for/master"); String changeId = r.getChangeId(); String revId = r.getCommit().getName(); ReviewInput input = new ReviewInput(); - CommentInput comment = - newComment(file, Side.REVISION, line, "comment 1", false); + CommentInput comment = newComment(file, Side.REVISION, line, "comment 1", false); input.comments = new HashMap<>(); input.comments.put(comment.path, Lists.newArrayList(comment)); revision(r).review(input); @@ -144,8 +138,8 @@ public class CommentsIT extends AbstractDaemonTest { assertThat(result).isNotEmpty(); CommentInfo actual = Iterables.getOnlyElement(result.get(comment.path)); assertThat(comment).isEqualTo(infoToInput(file).apply(actual)); - assertThat(comment).isEqualTo(infoToInput(file).apply( - getPublishedComment(changeId, revId, actual.id))); + assertThat(comment) + .isEqualTo(infoToInput(file).apply(getPublishedComment(changeId, revId, actual.id))); } } @@ -154,19 +148,17 @@ public class CommentsIT extends AbstractDaemonTest { for (Integer line : lines) { String file = "file"; String contents = "contents " + line; - PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo, - "first subject", file, contents); + PushOneCommit push = + pushFactory.create(db, admin.getIdent(), testRepo, "first subject", file, contents); PushOneCommit.Result r = push.to("refs/for/master"); String changeId = r.getChangeId(); String revId = r.getCommit().getName(); ReviewInput input = new ReviewInput(); - CommentInput comment = - newComment(file, Side.REVISION, line, "comment 1", false); + CommentInput comment = newComment(file, Side.REVISION, line, "comment 1", false); input.comments = new HashMap<>(); input.comments.put(comment.path, Lists.newArrayList(comment)); revision(r).review(input); - Map> result = - getPublishedComments(changeId, revId); + Map> result = getPublishedComments(changeId, revId); CommentInfo actual = Iterables.getOnlyElement(result.get(comment.path)); input = new ReviewInput(); @@ -178,8 +170,8 @@ public class CommentsIT extends AbstractDaemonTest { result = getPublishedComments(changeId, revId); actual = result.get(comment.path).get(1); assertThat(comment).isEqualTo(infoToInput(file).apply(actual)); - assertThat(comment).isEqualTo(infoToInput(file).apply( - getPublishedComment(changeId, revId, actual.id))); + assertThat(comment) + .isEqualTo(infoToInput(file).apply(getPublishedComment(changeId, revId, actual.id))); } } @@ -188,14 +180,13 @@ public class CommentsIT extends AbstractDaemonTest { for (Integer line : lines) { String file = "file"; String contents = "contents " + line; - PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo, - "first subject", file, contents); + PushOneCommit push = + pushFactory.create(db, admin.getIdent(), testRepo, "first subject", file, contents); PushOneCommit.Result r = push.to("refs/for/master"); String changeId = r.getChangeId(); String revId = r.getCommit().getName(); ReviewInput input = new ReviewInput(); - CommentInput comment = - newComment(file, Side.REVISION, line, "comment 1", true); + CommentInput comment = newComment(file, Side.REVISION, line, "comment 1", true); input.comments = new HashMap<>(); input.comments.put(comment.path, Lists.newArrayList(comment)); revision(r).review(input); @@ -203,8 +194,8 @@ public class CommentsIT extends AbstractDaemonTest { assertThat(result).isNotEmpty(); CommentInfo actual = Iterables.getOnlyElement(result.get(comment.path)); assertThat(comment).isEqualTo(infoToInput(file).apply(actual)); - assertThat(comment).isEqualTo(infoToInput(file).apply( - getPublishedComment(changeId, revId, actual.id))); + assertThat(comment) + .isEqualTo(infoToInput(file).apply(getPublishedComment(changeId, revId, actual.id))); } } @@ -217,8 +208,7 @@ public class CommentsIT extends AbstractDaemonTest { String revId = r.getCommit().getName(); ReviewInput input = new ReviewInput(); CommentInput c1 = newComment(file, Side.REVISION, line, "ps-1", false); - CommentInput c2 = - newComment(file, Side.PARENT, line, "auto-merge of ps-1", false); + CommentInput c2 = newComment(file, Side.PARENT, line, "auto-merge of ps-1", false); CommentInput c3 = newCommentOnParent(file, 1, line, "parent-1 of ps-1"); CommentInput c4 = newCommentOnParent(file, 2, line, "parent-2 of ps-1"); input.comments = new HashMap<>(); @@ -245,8 +235,7 @@ public class CommentsIT extends AbstractDaemonTest { revision(r).review(input); Map> result = getPublishedComments(changeId, revId); assertThat(result).isNotEmpty(); - assertThat(Lists.transform(result.get(file), infoToInput(file))) - .containsExactly(c1, c2, c3); + assertThat(Lists.transform(result.get(file), infoToInput(file))).containsExactly(c1, c2, c3); } } @@ -254,21 +243,19 @@ public class CommentsIT extends AbstractDaemonTest { public void postCommentOnCommitMessageOnAutoMerge() throws Exception { PushOneCommit.Result r = createMergeCommitChange("refs/for/master"); ReviewInput input = new ReviewInput(); - CommentInput c = newComment(Patch.COMMIT_MSG, Side.PARENT, 0, - "comment on auto-merge", false); + CommentInput c = newComment(Patch.COMMIT_MSG, Side.PARENT, 0, "comment on auto-merge", false); input.comments = new HashMap<>(); input.comments.put(Patch.COMMIT_MSG, ImmutableList.of(c)); exception.expect(BadRequestException.class); - exception.expectMessage( - "cannot comment on " + Patch.COMMIT_MSG + " on auto-merge"); + exception.expectMessage("cannot comment on " + Patch.COMMIT_MSG + " on auto-merge"); revision(r).review(input); } @Test public void listComments() throws Exception { String file = "file"; - PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo, - "first subject", file, "contents"); + PushOneCommit push = + pushFactory.create(db, admin.getIdent(), testRepo, "first subject", file, "contents"); PushOneCommit.Result r = push.to("refs/for/master"); String changeId = r.getChangeId(); String revId = r.getCommit().getName(); @@ -277,8 +264,7 @@ public class CommentsIT extends AbstractDaemonTest { List expectedComments = new ArrayList<>(); for (Integer line : lines) { ReviewInput input = new ReviewInput(); - CommentInput comment = - newComment(file, Side.REVISION, line, "comment " + line, false); + CommentInput comment = newComment(file, Side.REVISION, line, "comment " + line, false); expectedComments.add(comment); input.comments = new HashMap<>(); input.comments.put(comment.path, Lists.newArrayList(comment)); @@ -313,8 +299,7 @@ public class CommentsIT extends AbstractDaemonTest { assertThat(comment).isEqualTo(infoToDraft(path).apply(actual)); // Posting a draft comment doesn't cause lastUpdatedOn to change. - assertThat(r.getChange().change().getLastUpdatedOn()) - .isEqualTo(origLastUpdated); + assertThat(r.getChange().change().getLastUpdatedOn()).isEqualTo(origLastUpdated); } } @@ -347,8 +332,7 @@ public class CommentsIT extends AbstractDaemonTest { String changeId = r.getChangeId(); String revId = r.getCommit().getName(); String path = "file1"; - DraftInput comment = newDraft( - path, Side.REVISION, line, "comment 1"); + DraftInput comment = newDraft(path, Side.REVISION, line, "comment 1"); CommentInfo returned = addDraft(changeId, revId, comment); CommentInfo actual = getDraftComment(changeId, revId, returned.id); assertThat(comment).isEqualTo(infoToDraft(path).apply(actual)); @@ -369,8 +353,7 @@ public class CommentsIT extends AbstractDaemonTest { assertThat(drafts).isEmpty(); // Deleting a draft comment doesn't cause lastUpdatedOn to change. - assertThat(r.getChange().change().getLastUpdatedOn()) - .isEqualTo(origLastUpdated); + assertThat(r.getChange().change().getLastUpdatedOn()).isEqualTo(origLastUpdated); } } @@ -380,24 +363,21 @@ public class CommentsIT extends AbstractDaemonTest { for (Integer line : lines) { String file = "file"; String contents = "contents " + line; - PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo, - "first subject", file, contents); + PushOneCommit push = + pushFactory.create(db, admin.getIdent(), testRepo, "first subject", file, contents); PushOneCommit.Result r = push.to("refs/for/master"); String changeId = r.getChangeId(); String revId = r.getCommit().getName(); Timestamp origLastUpdated = r.getChange().change().getLastUpdatedOn(); ReviewInput input = new ReviewInput(); - CommentInput comment = - newComment(file, Side.REVISION, line, "comment 1", false); + CommentInput comment = newComment(file, Side.REVISION, line, "comment 1", false); comment.updated = timestamp; input.comments = new HashMap<>(); input.comments.put(comment.path, Lists.newArrayList(comment)); ChangeResource changeRsrc = - changes.get().parse(TopLevelResource.INSTANCE, - IdString.fromDecoded(changeId)); - RevisionResource revRsrc = - revisions.parse(changeRsrc, IdString.fromDecoded(revId)); + changes.get().parse(TopLevelResource.INSTANCE, IdString.fromDecoded(changeId)); + RevisionResource revRsrc = revisions.parse(changeRsrc, IdString.fromDecoded(revId)); postReview.get().apply(revRsrc, input, timestamp); Map> result = getPublishedComments(changeId, revId); assertThat(result).isNotEmpty(); @@ -405,12 +385,10 @@ public class CommentsIT extends AbstractDaemonTest { CommentInput ci = infoToInput(file).apply(actual); ci.updated = comment.updated; assertThat(comment).isEqualTo(ci); - assertThat(actual.updated) - .isEqualTo(gApi.changes().id(r.getChangeId()).info().created); + assertThat(actual.updated).isEqualTo(gApi.changes().id(r.getChangeId()).info().created); // Updating historic comments doesn't cause lastUpdatedOn to regress. - assertThat(r.getChange().change().getLastUpdatedOn()) - .isEqualTo(origLastUpdated); + assertThat(r.getChange().change().getLastUpdatedOn()).isEqualTo(origLastUpdated); } } @@ -427,9 +405,10 @@ public class CommentsIT extends AbstractDaemonTest { result = getPublishedComments(changeId, revId); assertThat(result.get(FILE_NAME)).hasSize(2); - PushOneCommit.Result r2 = pushFactory.create( - db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "content") - .to("refs/for/master"); + PushOneCommit.Result r2 = + pushFactory + .create(db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "content") + .to("refs/for/master"); changeId = r2.getChangeId(); revId = r2.getCommit().getName(); addComment(r2, "nit: trailing whitespace", true); @@ -441,25 +420,30 @@ public class CommentsIT extends AbstractDaemonTest { public void listChangeDrafts() throws Exception { PushOneCommit.Result r1 = createChange(); - PushOneCommit.Result r2 = pushFactory.create( - db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "new content", - r1.getChangeId()) - .to("refs/for/master"); - + PushOneCommit.Result r2 = + pushFactory + .create( + db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "new content", r1.getChangeId()) + .to("refs/for/master"); setApiUser(admin); - addDraft(r1.getChangeId(), r1.getCommit().getName(), + addDraft( + r1.getChangeId(), + r1.getCommit().getName(), newDraft(FILE_NAME, Side.REVISION, 1, "nit: trailing whitespace")); - addDraft(r2.getChangeId(), r2.getCommit().getName(), + addDraft( + r2.getChangeId(), + r2.getCommit().getName(), newDraft(FILE_NAME, Side.REVISION, 1, "typo: content")); setApiUser(user); - addDraft(r2.getChangeId(), r2.getCommit().getName(), + addDraft( + r2.getChangeId(), + r2.getCommit().getName(), newDraft(FILE_NAME, Side.REVISION, 1, "+1, please fix")); setApiUser(admin); - Map> actual = - gApi.changes().id(r1.getChangeId()).drafts(); + Map> actual = gApi.changes().id(r1.getChangeId()).drafts(); assertThat(actual.keySet()).containsExactly(FILE_NAME); List comments = actual.get(FILE_NAME); assertThat(comments).hasSize(2); @@ -483,17 +467,16 @@ public class CommentsIT extends AbstractDaemonTest { public void listChangeComments() throws Exception { PushOneCommit.Result r1 = createChange(); - PushOneCommit.Result r2 = pushFactory.create( - db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "new cntent", - r1.getChangeId()) - .to("refs/for/master"); + PushOneCommit.Result r2 = + pushFactory + .create( + db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "new cntent", r1.getChangeId()) + .to("refs/for/master"); addComment(r1, "nit: trailing whitespace"); addComment(r2, "typo: content"); - Map> actual = gApi.changes() - .id(r2.getChangeId()) - .comments(); + Map> actual = gApi.changes().id(r2.getChangeId()).comments(); assertThat(actual.keySet()).containsExactly(FILE_NAME); List comments = actual.get(FILE_NAME); @@ -520,11 +503,9 @@ public class CommentsIT extends AbstractDaemonTest { PushOneCommit.Result r = createChange(); String changeId = r.getChangeId(); String revId = r.getCommit().getName(); - DraftInput comment = newDraft( - "file1", Side.REVISION, line, "comment 1"); + DraftInput comment = newDraft("file1", Side.REVISION, line, "comment 1"); addDraft(changeId, revId, comment); - assertThat(gApi.changes().query( - "change:" + changeId + " has:draft").get()).hasSize(1); + assertThat(gApi.changes().query("change:" + changeId + " has:draft").get()).hasSize(1); } } @@ -532,52 +513,65 @@ public class CommentsIT extends AbstractDaemonTest { public void publishCommentsAllRevisions() throws Exception { PushOneCommit.Result r1 = createChange(); - PushOneCommit.Result r2 = pushFactory.create( - db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "new\ncntent\n", - r1.getChangeId()) - .to("refs/for/master"); + PushOneCommit.Result r2 = + pushFactory + .create( + db, + admin.getIdent(), + testRepo, + SUBJECT, + FILE_NAME, + "new\ncntent\n", + r1.getChangeId()) + .to("refs/for/master"); - addDraft(r1.getChangeId(), r1.getCommit().getName(), + addDraft( + r1.getChangeId(), + r1.getCommit().getName(), newDraft(FILE_NAME, Side.REVISION, 1, "nit: trailing whitespace")); - addDraft(r1.getChangeId(), r1.getCommit().getName(), + addDraft( + r1.getChangeId(), + r1.getCommit().getName(), newDraft(FILE_NAME, Side.PARENT, 2, "what happened to this?")); - addDraft(r2.getChangeId(), r2.getCommit().getName(), + addDraft( + r2.getChangeId(), + r2.getCommit().getName(), newDraft(FILE_NAME, Side.REVISION, 1, "join lines")); - addDraft(r2.getChangeId(), r2.getCommit().getName(), + addDraft( + r2.getChangeId(), + r2.getCommit().getName(), newDraft(FILE_NAME, Side.REVISION, 2, "typo: content")); - addDraft(r2.getChangeId(), r2.getCommit().getName(), + addDraft( + r2.getChangeId(), + r2.getCommit().getName(), newDraft(FILE_NAME, Side.PARENT, 1, "comment 1 on base")); - addDraft(r2.getChangeId(), r2.getCommit().getName(), + addDraft( + r2.getChangeId(), + r2.getCommit().getName(), newDraft(FILE_NAME, Side.PARENT, 2, "comment 2 on base")); PushOneCommit.Result other = createChange(); // Drafts on other changes aren't returned. - addDraft(other.getChangeId(), other.getCommit().getName(), + addDraft( + other.getChangeId(), + other.getCommit().getName(), newDraft(FILE_NAME, Side.REVISION, 1, "unrelated comment")); setApiUser(admin); // Drafts by other users aren't returned. - addDraft(r2.getChangeId(), r2.getCommit().getName(), - newDraft(FILE_NAME, Side.REVISION, 2, "oops")); + addDraft( + r2.getChangeId(), r2.getCommit().getName(), newDraft(FILE_NAME, Side.REVISION, 2, "oops")); setApiUser(user); ReviewInput reviewInput = new ReviewInput(); reviewInput.drafts = DraftHandling.PUBLISH_ALL_REVISIONS; reviewInput.message = "comments"; - gApi.changes() - .id(r2.getChangeId()) - .current() - .review(reviewInput); + gApi.changes().id(r2.getChangeId()).current().review(reviewInput); - assertThat(gApi.changes() - .id(r1.getChangeId()) - .revision(r1.getCommit().name()) - .drafts()) + assertThat(gApi.changes().id(r1.getChangeId()).revision(r1.getCommit().name()).drafts()) .isEmpty(); - Map> ps1Map = gApi.changes() - .id(r1.getChangeId()) - .revision(r1.getCommit().name()) - .comments(); + Map> ps1Map = + gApi.changes().id(r1.getChangeId()).revision(r1.getCommit().name()).comments(); assertThat(ps1Map.keySet()).containsExactly(FILE_NAME); List ps1List = ps1Map.get(FILE_NAME); assertThat(ps1List).hasSize(2); @@ -586,15 +580,10 @@ public class CommentsIT extends AbstractDaemonTest { assertThat(ps1List.get(1).message).isEqualTo("nit: trailing whitespace"); assertThat(ps1List.get(1).side).isNull(); - assertThat(gApi.changes() - .id(r2.getChangeId()) - .revision(r2.getCommit().name()) - .drafts()) + assertThat(gApi.changes().id(r2.getChangeId()).revision(r2.getCommit().name()).drafts()) .isEmpty(); - Map> ps2Map = gApi.changes() - .id(r2.getChangeId()) - .revision(r2.getCommit().name()) - .comments(); + Map> ps2Map = + gApi.changes().id(r2.getChangeId()).revision(r2.getCommit().name()).comments(); assertThat(ps2Map.keySet()).containsExactly(FILE_NAME); List ps2List = ps2Map.get(FILE_NAME); assertThat(ps2List).hasSize(4); @@ -607,49 +596,74 @@ public class CommentsIT extends AbstractDaemonTest { assertThat(messages).hasSize(1); String url = canonicalWebUrl.get(); int c = r1.getChange().getId().get(); - assertThat(extractComments(messages.get(0).body())).isEqualTo( - "Patch Set 2:\n" - + "\n" - + "(6 comments)\n" - + "\n" - + "comments\n" - + "\n" - + url + "#/c/" + c + "/1/a.txt\n" - + "File a.txt:\n" - + "\n" - + url + "#/c/" + c + "/1/a.txt@a2\n" - + "PS1, Line 2: \n" - + "what happened to this?\n" - + "\n" - + "\n" - + url + "#/c/" + c + "/1/a.txt@1\n" - + "PS1, Line 1: ew\n" - + "nit: trailing whitespace\n" - + "\n" - + "\n" - + url + "#/c/" + c + "/2/a.txt\n" - + "File a.txt:\n" - + "\n" - + url + "#/c/" + c + "/2/a.txt@a1\n" - + "PS2, Line 1: \n" - + "comment 1 on base\n" - + "\n" - + "\n" - + url + "#/c/" + c + "/2/a.txt@a2\n" - + "PS2, Line 2: \n" - + "comment 2 on base\n" - + "\n" - + "\n" - + url + "#/c/" + c + "/2/a.txt@1\n" - + "PS2, Line 1: ew\n" - + "join lines\n" - + "\n" - + "\n" - + url + "#/c/" + c + "/2/a.txt@2\n" - + "PS2, Line 2: nten\n" - + "typo: content\n" - + "\n" - + "\n"); + assertThat(extractComments(messages.get(0).body())) + .isEqualTo( + "Patch Set 2:\n" + + "\n" + + "(6 comments)\n" + + "\n" + + "comments\n" + + "\n" + + url + + "#/c/" + + c + + "/1/a.txt\n" + + "File a.txt:\n" + + "\n" + + url + + "#/c/" + + c + + "/1/a.txt@a2\n" + + "PS1, Line 2: \n" + + "what happened to this?\n" + + "\n" + + "\n" + + url + + "#/c/" + + c + + "/1/a.txt@1\n" + + "PS1, Line 1: ew\n" + + "nit: trailing whitespace\n" + + "\n" + + "\n" + + url + + "#/c/" + + c + + "/2/a.txt\n" + + "File a.txt:\n" + + "\n" + + url + + "#/c/" + + c + + "/2/a.txt@a1\n" + + "PS2, Line 1: \n" + + "comment 1 on base\n" + + "\n" + + "\n" + + url + + "#/c/" + + c + + "/2/a.txt@a2\n" + + "PS2, Line 2: \n" + + "comment 2 on base\n" + + "\n" + + "\n" + + url + + "#/c/" + + c + + "/2/a.txt@1\n" + + "PS2, Line 1: ew\n" + + "join lines\n" + + "\n" + + "\n" + + url + + "#/c/" + + c + + "/2/a.txt@2\n" + + "PS2, Line 2: nten\n" + + "typo: content\n" + + "\n" + + "\n"); } @Test @@ -664,8 +678,7 @@ public class CommentsIT extends AbstractDaemonTest { rin.tag = "tag1"; gApi.changes().id(r.getChangeId()).current().review(rin); - List comments = - gApi.changes().id(r.getChangeId()).current().commentsAsList(); + List comments = gApi.changes().id(r.getChangeId()).current().commentsAsList(); assertThat(comments).hasSize(1); assertThat(comments.get(0).tag).isEqualTo("tag1"); @@ -676,8 +689,7 @@ public class CommentsIT extends AbstractDaemonTest { draft.tag = "tag2"; addDraft(r.getChangeId(), r.getCommit().name(), draft); - List drafts = - gApi.changes().id(r.getChangeId()).current().draftsAsList(); + List drafts = gApi.changes().id(r.getChangeId()).current().draftsAsList(); assertThat(drafts).hasSize(1); assertThat(drafts.get(0).tag).isEqualTo("tag2"); } @@ -696,88 +708,77 @@ public class CommentsIT extends AbstractDaemonTest { return in; } - private void addComment(PushOneCommit.Result r, String message) - throws Exception { + private void addComment(PushOneCommit.Result r, String message) throws Exception { addComment(r, message, false); } - private void addComment(PushOneCommit.Result r, String message, - boolean omitDuplicateComments) throws Exception { + private void addComment(PushOneCommit.Result r, String message, boolean omitDuplicateComments) + throws Exception { CommentInput c = new CommentInput(); c.line = 1; c.message = message; c.path = FILE_NAME; ReviewInput in = newInput(c); in.omitDuplicateComments = omitDuplicateComments; - gApi.changes() - .id(r.getChangeId()) - .revision(r.getCommit().name()) - .review(in); + gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(in); } - private CommentInfo addDraft(String changeId, String revId, DraftInput in) - throws Exception { + private CommentInfo addDraft(String changeId, String revId, DraftInput in) throws Exception { return gApi.changes().id(changeId).revision(revId).createDraft(in).get(); } - private void updateDraft(String changeId, String revId, DraftInput in, - String uuid) throws Exception { + private void updateDraft(String changeId, String revId, DraftInput in, String uuid) + throws Exception { gApi.changes().id(changeId).revision(revId).draft(uuid).update(in); } - private void deleteDraft(String changeId, String revId, String uuid) - throws Exception { + private void deleteDraft(String changeId, String revId, String uuid) throws Exception { gApi.changes().id(changeId).revision(revId).draft(uuid).delete(); } - private CommentInfo getPublishedComment(String changeId, String revId, - String uuid) throws Exception { + private CommentInfo getPublishedComment(String changeId, String revId, String uuid) + throws Exception { return gApi.changes().id(changeId).revision(revId).comment(uuid).get(); } - private Map> getPublishedComments(String changeId, - String revId) throws Exception { + private Map> getPublishedComments(String changeId, String revId) + throws Exception { return gApi.changes().id(changeId).revision(revId).comments(); } - private Map> getDraftComments(String changeId, - String revId) throws Exception { + private Map> getDraftComments(String changeId, String revId) + throws Exception { return gApi.changes().id(changeId).revision(revId).drafts(); } - private CommentInfo getDraftComment(String changeId, String revId, - String uuid) throws Exception { + private CommentInfo getDraftComment(String changeId, String revId, String uuid) throws Exception { return gApi.changes().id(changeId).revision(revId).draft(uuid).get(); } - private static CommentInput newComment(String path, Side side, int line, - String message, Boolean unresolved) { + private static CommentInput newComment( + String path, Side side, int line, String message, Boolean unresolved) { CommentInput c = new CommentInput(); return populate(c, path, side, null, line, message, unresolved); } - private static CommentInput newCommentOnParent(String path, int parent, - int line, String message) { + private static CommentInput newCommentOnParent( + String path, int parent, int line, String message) { CommentInput c = new CommentInput(); - return populate(c, path, Side.PARENT, Integer.valueOf(parent), line, - message, false); + return populate(c, path, Side.PARENT, Integer.valueOf(parent), line, message, false); } - private DraftInput newDraft(String path, Side side, int line, - String message) { + private DraftInput newDraft(String path, Side side, int line, String message) { DraftInput d = new DraftInput(); return populate(d, path, side, null, line, message, false); } - private DraftInput newDraftOnParent(String path, int parent, int line, - String message) { + private DraftInput newDraftOnParent(String path, int parent, int line, String message) { DraftInput d = new DraftInput(); - return populate(d, path, Side.PARENT, Integer.valueOf(parent), line, - message, false); + return populate(d, path, Side.PARENT, Integer.valueOf(parent), line, message, false); } - private static C populate(C c, String path, Side side, - Integer parent, int line, String message, Boolean unresolved) { + private static C populate( + C c, String path, Side side, Integer parent, int line, String message, Boolean unresolved) { c.path = path; c.side = side; c.parent = parent; diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/ConsistencyCheckerIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/ConsistencyCheckerIT.java index fced72e2fd..b76a96a0a8 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/ConsistencyCheckerIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/ConsistencyCheckerIT.java @@ -57,7 +57,10 @@ import com.google.gerrit.testutil.TestChanges; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.ObjectId; @@ -68,40 +71,25 @@ import org.eclipse.jgit.transport.ReceiveCommand; import org.junit.Before; import org.junit.Test; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - @NoHttpd public class ConsistencyCheckerIT extends AbstractDaemonTest { - @Inject - private ChangeControl.GenericFactory changeControlFactory; + @Inject private ChangeControl.GenericFactory changeControlFactory; - @Inject - private Provider checkerProvider; + @Inject private Provider checkerProvider; - @Inject - private IdentifiedUser.GenericFactory userFactory; + @Inject private IdentifiedUser.GenericFactory userFactory; - @Inject - private BatchUpdate.Factory updateFactory; + @Inject private BatchUpdate.Factory updateFactory; - @Inject - private ChangeInserter.Factory changeInserterFactory; + @Inject private ChangeInserter.Factory changeInserterFactory; - @Inject - private PatchSetInserter.Factory patchSetInserterFactory; + @Inject private PatchSetInserter.Factory patchSetInserterFactory; - @Inject - private ChangeNoteUtil noteUtil; + @Inject private ChangeNoteUtil noteUtil; - @Inject - @AnonymousCowardName - private String anonymousCowardName; + @Inject @AnonymousCowardName private String anonymousCowardName; - @Inject - private Sequences sequences; + @Inject private Sequences sequences; private RevCommit tip; private Account.Id adminId; @@ -110,10 +98,9 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { @Before public void setUp() throws Exception { // Ignore client clone of project; repurpose as server-side TestRepository. - testRepo = new TestRepository<>( - (InMemoryRepository) repoManager.openRepository(project)); - tip = testRepo.getRevWalk().parseCommit( - testRepo.getRepository().exactRef("HEAD").getObjectId()); + testRepo = new TestRepository<>((InMemoryRepository) repoManager.openRepository(project)); + tip = + testRepo.getRevWalk().parseCommit(testRepo.getRepository().exactRef("HEAD").getObjectId()); adminId = admin.getId(); checker = checkerProvider.get(); } @@ -135,8 +122,7 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { ChangeControl ctl = insertChange(owner); db.accounts().deleteKeys(singleton(owner.getId())); - assertProblems(ctl, null, - problem("Missing change owner: " + owner.getId())); + assertProblems(ctl, null, problem("Missing change owner: " + owner.getId())); } @Test @@ -148,9 +134,7 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { Project.NameKey name = ctl.getProject().getNameKey(); ((InMemoryRepositoryManager) repoManager).deleteRepository(name); - assertProblems( - ctl, null, - problem("Destination repository not found: " + name)); + assertProblems(ctl, null, problem("Destination repository not found: " + name)); } @Test @@ -160,16 +144,17 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { assume().that(notesMigration.enabled()).isFalse(); ChangeControl ctl = insertChange(); - PatchSet ps = newPatchSet( - ctl.getChange().currentPatchSetId(), - "fooooooooooooooooooooooooooooooooooooooo", - adminId); + PatchSet ps = + newPatchSet( + ctl.getChange().currentPatchSetId(), + "fooooooooooooooooooooooooooooooooooooooo", + adminId); db.patchSets().update(singleton(ps)); assertProblems( - ctl, null, - problem("Invalid revision on patch set 1:" - + " fooooooooooooooooooooooooooooooooooooooo")); + ctl, + null, + problem("Invalid revision on patch set 1:" + " fooooooooooooooooooooooooooooooooooooooo")); } // No test for ref existing but object missing; InMemoryRepository won't let @@ -182,11 +167,10 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { PatchSet ps = insertMissingPatchSet(ctl, rev); ctl = reload(ctl); assertProblems( - ctl, null, + ctl, + null, problem("Ref missing: " + ps.getId().toRefName()), - problem( - "Object missing: patch set 2:" - + " deadbeefdeadbeefdeadbeefdeadbeefdeadbeef")); + problem("Object missing: patch set 2:" + " deadbeefdeadbeefdeadbeefdeadbeefdeadbeef")); } @Test @@ -198,7 +182,8 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { String refName = ps.getId().toRefName(); assertProblems( - ctl, new FixInput(), + ctl, + new FixInput(), problem("Ref missing: " + refName), problem("Object missing: patch set 2: " + rev)); } @@ -208,8 +193,7 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { ChangeControl ctl = insertChange(); testRepo.update( "refs/other/foo", - ObjectId.fromString( - psUtil.current(db, ctl.getNotes()).getRevision().get())); + ObjectId.fromString(psUtil.current(db, ctl.getNotes()).getRevision().get())); String refName = ctl.getChange().currentPatchSetId().toRefName(); deleteRef(refName); @@ -225,15 +209,12 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { deleteRef(refName); assertProblems( - ctl, new FixInput(), - problem("Ref missing: " + refName, FIXED, "Repaired patch set ref")); - assertThat(testRepo.getRepository().exactRef(refName).getObjectId().name()) - .isEqualTo(rev); + ctl, new FixInput(), problem("Ref missing: " + refName, FIXED, "Repaired patch set ref")); + assertThat(testRepo.getRepository().exactRef(refName).getObjectId().name()).isEqualTo(rev); } @Test - public void patchSetObjectAndRefMissingWithDeletingPatchSet() - throws Exception { + public void patchSetObjectAndRefMissingWithDeletingPatchSet() throws Exception { ChangeControl ctl = insertChange(); PatchSet ps1 = psUtil.current(db, ctl.getNotes()); @@ -244,10 +225,10 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { FixInput fix = new FixInput(); fix.deletePatchSetIfCommitMissing = true; assertProblems( - ctl, fix, + ctl, + fix, problem("Ref missing: " + ps2.getId().toRefName()), - problem("Object missing: patch set 2: " + rev2, - FIXED, "Deleted patch set")); + problem("Object missing: patch set 2: " + rev2, FIXED, "Deleted patch set")); ctl = reload(ctl); assertThat(ctl.getChange().currentPatchSetId().get()).isEqualTo(1); @@ -256,8 +237,7 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { } @Test - public void patchSetMultipleObjectsMissingWithDeletingPatchSets() - throws Exception { + public void patchSetMultipleObjectsMissingWithDeletingPatchSets() throws Exception { ChangeControl ctl = insertChange(); PatchSet ps1 = psUtil.current(db, ctl.getNotes()); @@ -274,13 +254,12 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { FixInput fix = new FixInput(); fix.deletePatchSetIfCommitMissing = true; assertProblems( - ctl, fix, + ctl, + fix, problem("Ref missing: " + ps2.getId().toRefName()), - problem("Object missing: patch set 2: " + rev2, - FIXED, "Deleted patch set"), + problem("Object missing: patch set 2: " + rev2, FIXED, "Deleted patch set"), problem("Ref missing: " + ps4.getId().toRefName()), - problem("Object missing: patch set 4: " + rev4, - FIXED, "Deleted patch set")); + problem("Object missing: patch set 4: " + rev4, FIXED, "Deleted patch set")); ctl = reload(ctl); assertThat(ctl.getChange().currentPatchSetId().get()).isEqualTo(3); @@ -292,8 +271,7 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { @Test public void onlyPatchSetObjectMissingWithFix() throws Exception { - Change c = TestChanges.newChange( - project, admin.getId(), sequences.nextChangeId()); + Change c = TestChanges.newChange(project, admin.getId(), sequences.nextChangeId()); PatchSet.Id psId = c.currentPatchSetId(); String rev = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"; PatchSet ps = newPatchSet(psId, rev, adminId); @@ -307,23 +285,33 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { "Create change\n" + "\n" + "Patch-set: 1\n" - + "Branch: " + c.getDest().get() + "\n" - + "Change-id: " + c.getKey().get() + "\n" + + "Branch: " + + c.getDest().get() + + "\n" + + "Change-id: " + + c.getKey().get() + + "\n" + "Subject: Bogus subject\n" - + "Commit: " + rev + "\n" - + "Groups: " + rev + "\n"); + + "Commit: " + + rev + + "\n" + + "Groups: " + + rev + + "\n"); indexer.index(db, c.getProject(), c.getId()); IdentifiedUser user = userFactory.create(admin.getId()); - ChangeControl ctl = changeControlFactory.controlFor( - db, c.getProject(), c.getId(), user); + ChangeControl ctl = changeControlFactory.controlFor(db, c.getProject(), c.getId(), user); FixInput fix = new FixInput(); fix.deletePatchSetIfCommitMissing = true; assertProblems( - ctl, fix, + ctl, + fix, problem("Ref missing: " + ps.getId().toRefName()), - problem("Object missing: patch set 1: " + rev, - FIX_FAILED, "Cannot delete patch set; no patch sets would remain")); + problem( + "Object missing: patch set 1: " + rev, + FIX_FAILED, + "Cannot delete patch set; no patch sets would remain")); ctl = reload(ctl); assertThat(ctl.getChange().currentPatchSetId().get()).isEqualTo(1); @@ -346,12 +334,9 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { PatchSet ps1 = psUtil.current(db, ctl.getNotes()); String rev = ps1.getRevision().get(); - ctl = incrementPatchSet( - ctl, testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev))); + ctl = incrementPatchSet(ctl, testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev))); - assertProblems( - ctl, null, - problem("Multiple patch sets pointing to " + rev + ": [1, 2]")); + assertProblems(ctl, null, problem("Multiple patch sets pointing to " + rev + ": [1, 2]")); } @Test @@ -365,9 +350,7 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { ru.setForceUpdate(true); assertThat(ru.delete()).isEqualTo(RefUpdate.Result.FORCED); - assertProblems( - ctl, null, - problem("Destination ref not found (may be new branch): " + ref)); + assertProblems(ctl, null, problem("Destination ref not found (may be new branch): " + ref)); } @Test @@ -375,15 +358,16 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { ChangeControl ctl = insertChange(); try (BatchUpdate bu = newUpdate(adminId)) { - bu.addOp(ctl.getId(), new BatchUpdate.Op() { - @Override - public boolean updateChange(ChangeContext ctx) throws OrmException { - ctx.getChange().setStatus(Change.Status.MERGED); - ctx.getUpdate(ctx.getChange().currentPatchSetId()) - .fixStatus(Change.Status.MERGED); - return true; - } - }); + bu.addOp( + ctl.getId(), + new BatchUpdate.Op() { + @Override + public boolean updateChange(ChangeContext ctx) throws OrmException { + ctx.getChange().setStatus(Change.Status.MERGED); + ctx.getUpdate(ctx.getChange().currentPatchSetId()).fixStatus(Change.Status.MERGED); + return true; + } + }); bu.execute(); } ctl = reload(ctl); @@ -391,10 +375,14 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { String rev = psUtil.current(db, ctl.getNotes()).getRevision().get(); ObjectId tip = getDestRef(ctl); assertProblems( - ctl, null, + ctl, + null, problem( - "Patch set 1 (" + rev + ") is not merged into destination ref" - + " refs/heads/master (" + tip.name() + "Patch set 1 (" + + rev + + ") is not merged into destination ref" + + " refs/heads/master (" + + tip.name() + "), but change status is MERGED")); } @@ -402,14 +390,19 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { public void newChangeIsMerged() throws Exception { ChangeControl ctl = insertChange(); String rev = psUtil.current(db, ctl.getNotes()).getRevision().get(); - testRepo.branch(ctl.getChange().getDest().get()) + testRepo + .branch(ctl.getChange().getDest().get()) .update(testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev))); assertProblems( - ctl, null, + ctl, + null, problem( - "Patch set 1 (" + rev + ") is merged into destination ref" - + " refs/heads/master (" + rev + "Patch set 1 (" + + rev + + ") is merged into destination ref" + + " refs/heads/master (" + + rev + "), but change status is NEW")); } @@ -417,16 +410,22 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { public void newChangeIsMergedWithFix() throws Exception { ChangeControl ctl = insertChange(); String rev = psUtil.current(db, ctl.getNotes()).getRevision().get(); - testRepo.branch(ctl.getChange().getDest().get()) + testRepo + .branch(ctl.getChange().getDest().get()) .update(testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev))); assertProblems( - ctl, new FixInput(), + ctl, + new FixInput(), problem( - "Patch set 1 (" + rev + ") is merged into destination ref" - + " refs/heads/master (" + rev + "Patch set 1 (" + + rev + + ") is merged into destination ref" + + " refs/heads/master (" + + rev + "), but change status is NEW", - FIXED, "Marked change as merged")); + FIXED, + "Marked change as merged")); ctl = reload(ctl); assertThat(ctl.getChange().getStatus()).isEqualTo(Change.Status.MERGED); @@ -437,17 +436,14 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { public void extensionApiReturnsUpdatedValueAfterFix() throws Exception { ChangeControl ctl = insertChange(); String rev = psUtil.current(db, ctl.getNotes()).getRevision().get(); - testRepo.branch(ctl.getChange().getDest().get()) + testRepo + .branch(ctl.getChange().getDest().get()) .update(testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev))); - ChangeInfo info = gApi.changes() - .id(ctl.getId().get()) - .info(); + ChangeInfo info = gApi.changes().id(ctl.getId().get()).info(); assertThat(info.status).isEqualTo(ChangeStatus.NEW); - info = gApi.changes() - .id(ctl.getId().get()) - .check(new FixInput()); + info = gApi.changes().id(ctl.getId().get()).check(new FixInput()); assertThat(info.status).isEqualTo(ChangeStatus.MERGED); } @@ -455,17 +451,24 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { public void expectedMergedCommitIsLatestPatchSet() throws Exception { ChangeControl ctl = insertChange(); String rev = psUtil.current(db, ctl.getNotes()).getRevision().get(); - testRepo.branch(ctl.getChange().getDest().get()) + testRepo + .branch(ctl.getChange().getDest().get()) .update(testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev))); FixInput fix = new FixInput(); fix.expectMergedAs = rev; assertProblems( - ctl, fix, + ctl, + fix, problem( - "Patch set 1 (" + rev + ") is merged into destination ref" - + " refs/heads/master (" + rev + "), but change status is NEW", - FIXED, "Marked change as merged")); + "Patch set 1 (" + + rev + + ") is merged into destination ref" + + " refs/heads/master (" + + rev + + "), but change status is NEW", + FIXED, + "Marked change as merged")); ctl = reload(ctl); assertThat(ctl.getChange().getStatus()).isEqualTo(Change.Status.MERGED); @@ -476,33 +479,33 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { public void expectedMergedCommitNotMergedIntoDestination() throws Exception { ChangeControl ctl = insertChange(); String rev = psUtil.current(db, ctl.getNotes()).getRevision().get(); - RevCommit commit = - testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev)); + RevCommit commit = testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev)); testRepo.branch(ctl.getChange().getDest().get()).update(commit); FixInput fix = new FixInput(); - RevCommit other = - testRepo.commit().message(commit.getFullMessage()).create(); + RevCommit other = testRepo.commit().message(commit.getFullMessage()).create(); fix.expectMergedAs = other.name(); assertProblems( - ctl, fix, + ctl, + fix, problem( - "Expected merged commit " + other.name() + "Expected merged commit " + + other.name() + " is not merged into destination ref refs/heads/master" - + " (" + commit.name() + ")")); + + " (" + + commit.name() + + ")")); } @Test - public void createNewPatchSetForExpectedMergeCommitWithNoChangeId() - throws Exception { + public void createNewPatchSetForExpectedMergeCommitWithNoChangeId() throws Exception { ChangeControl ctl = insertChange(); String dest = ctl.getChange().getDest().get(); String rev = psUtil.current(db, ctl.getNotes()).getRevision().get(); - RevCommit commit = - testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev)); + RevCommit commit = testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev)); - RevCommit mergedAs = testRepo.commit().parent(commit.getParent(0)) - .message(commit.getShortMessage()).create(); + RevCommit mergedAs = + testRepo.commit().parent(commit.getParent(0)).message(commit.getShortMessage()).create(); testRepo.getRevWalk().parseBody(mergedAs); assertThat(mergedAs.getFooterLines(FooterConstants.CHANGE_ID)).isEmpty(); testRepo.update(dest, mergedAs); @@ -512,14 +515,16 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { FixInput fix = new FixInput(); fix.expectMergedAs = mergedAs.name(); assertProblems( - ctl, fix, + ctl, + fix, problem( "No patch set found for merged commit " + mergedAs.name(), - FIXED, "Marked change as merged"), + FIXED, + "Marked change as merged"), problem( - "Expected merged commit " + mergedAs.name() - + " has no associated patch set", - FIXED, "Inserted as patch set 2")); + "Expected merged commit " + mergedAs.name() + " has no associated patch set", + FIXED, + "Inserted as patch set 2")); ctl = reload(ctl); PatchSet.Id psId2 = new PatchSet.Id(ctl.getId(), 2); @@ -531,18 +536,24 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { } @Test - public void createNewPatchSetForExpectedMergeCommitWithChangeId() - throws Exception { + public void createNewPatchSetForExpectedMergeCommitWithChangeId() throws Exception { ChangeControl ctl = insertChange(); String dest = ctl.getChange().getDest().get(); String rev = psUtil.current(db, ctl.getNotes()).getRevision().get(); - RevCommit commit = - testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev)); + RevCommit commit = testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev)); - RevCommit mergedAs = testRepo.commit().parent(commit.getParent(0)) - .message(commit.getShortMessage() + "\n" - + "\n" - + "Change-Id: " + ctl.getChange().getKey().get() + "\n").create(); + RevCommit mergedAs = + testRepo + .commit() + .parent(commit.getParent(0)) + .message( + commit.getShortMessage() + + "\n" + + "\n" + + "Change-Id: " + + ctl.getChange().getKey().get() + + "\n") + .create(); testRepo.getRevWalk().parseBody(mergedAs); assertThat(mergedAs.getFooterLines(FooterConstants.CHANGE_ID)) .containsExactly(ctl.getChange().getKey().get()); @@ -553,14 +564,16 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { FixInput fix = new FixInput(); fix.expectMergedAs = mergedAs.name(); assertProblems( - ctl, fix, + ctl, + fix, problem( "No patch set found for merged commit " + mergedAs.name(), - FIXED, "Marked change as merged"), + FIXED, + "Marked change as merged"), problem( - "Expected merged commit " + mergedAs.name() - + " has no associated patch set", - FIXED, "Inserted as patch set 2")); + "Expected merged commit " + mergedAs.name() + " has no associated patch set", + FIXED, + "Inserted as patch set 2")); ctl = reload(ctl); PatchSet.Id psId2 = new PatchSet.Id(ctl.getId(), 2); @@ -572,31 +585,36 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { } @Test - public void expectedMergedCommitIsOldPatchSetOfSameChange() - throws Exception { + public void expectedMergedCommitIsOldPatchSetOfSameChange() throws Exception { ChangeControl ctl = insertChange(); PatchSet ps1 = psUtil.current(db, ctl.getNotes()); String rev1 = ps1.getRevision().get(); ctl = incrementPatchSet(ctl); PatchSet ps2 = psUtil.current(db, ctl.getNotes()); - testRepo.branch(ctl.getChange().getDest().get()) + testRepo + .branch(ctl.getChange().getDest().get()) .update(testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev1))); FixInput fix = new FixInput(); fix.expectMergedAs = rev1; assertProblems( - ctl, fix, + ctl, + fix, + problem("No patch set found for merged commit " + rev1, FIXED, "Marked change as merged"), problem( - "No patch set found for merged commit " + rev1, - FIXED, "Marked change as merged"), - problem( - "Expected merge commit " + rev1 + " corresponds to patch set 1," + "Expected merge commit " + + rev1 + + " corresponds to patch set 1," + " not the current patch set 2", - FIXED, "Deleted patch set"), + FIXED, + "Deleted patch set"), problem( - "Expected merge commit " + rev1 + " corresponds to patch set 1," + "Expected merge commit " + + rev1 + + " corresponds to patch set 1," + " not the current patch set 2", - FIXED, "Inserted as patch set 3")); + FIXED, + "Inserted as patch set 3")); ctl = reload(ctl); PatchSet.Id psId3 = new PatchSet.Id(ctl.getId(), 3); @@ -604,13 +622,11 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { assertThat(ctl.getChange().getStatus()).isEqualTo(Change.Status.MERGED); assertThat(psUtil.byChangeAsMap(db, ctl.getNotes()).keySet()) .containsExactly(ps2.getId(), psId3); - assertThat(psUtil.get(db, ctl.getNotes(), psId3).getRevision().get()) - .isEqualTo(rev1); + assertThat(psUtil.get(db, ctl.getNotes(), psId3).getRevision().get()).isEqualTo(rev1); } @Test - public void expectedMergedCommitIsDanglingPatchSetOlderThanCurrent() - throws Exception { + public void expectedMergedCommitIsDanglingPatchSetOlderThanCurrent() throws Exception { ChangeControl ctl = insertChange(); PatchSet ps1 = psUtil.current(db, ctl.getNotes()); @@ -624,24 +640,30 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { PatchSet ps3 = psUtil.current(db, ctl.getNotes()); assertThat(ps3.getId().get()).isEqualTo(3); - testRepo.branch(ctl.getChange().getDest().get()) + testRepo + .branch(ctl.getChange().getDest().get()) .update(testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev2))); FixInput fix = new FixInput(); fix.expectMergedAs = rev2; assertProblems( - ctl, fix, + ctl, + fix, + problem("No patch set found for merged commit " + rev2, FIXED, "Marked change as merged"), problem( - "No patch set found for merged commit " + rev2, - FIXED, "Marked change as merged"), - problem( - "Expected merge commit " + rev2 + " corresponds to patch set 2," + "Expected merge commit " + + rev2 + + " corresponds to patch set 2," + " not the current patch set 3", - FIXED, "Deleted patch set"), + FIXED, + "Deleted patch set"), problem( - "Expected merge commit " + rev2 + " corresponds to patch set 2," + "Expected merge commit " + + rev2 + + " corresponds to patch set 2," + " not the current patch set 3", - FIXED, "Inserted as patch set 4")); + FIXED, + "Inserted as patch set 4")); ctl = reload(ctl); PatchSet.Id psId4 = new PatchSet.Id(ctl.getId(), 4); @@ -649,13 +671,11 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { assertThat(ctl.getChange().getStatus()).isEqualTo(Change.Status.MERGED); assertThat(psUtil.byChangeAsMap(db, ctl.getNotes()).keySet()) .containsExactly(ps1.getId(), ps3.getId(), psId4); - assertThat(psUtil.get(db, ctl.getNotes(), psId4).getRevision().get()) - .isEqualTo(rev2); + assertThat(psUtil.get(db, ctl.getNotes(), psId4).getRevision().get()).isEqualTo(rev2); } @Test - public void expectedMergedCommitIsDanglingPatchSetNewerThanCurrent() - throws Exception { + public void expectedMergedCommitIsDanglingPatchSetNewerThanCurrent() throws Exception { ChangeControl ctl = insertChange(); PatchSet ps1 = psUtil.current(db, ctl.getNotes()); @@ -665,50 +685,50 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { String rev2 = commit2.name(); testRepo.branch(psId2.toRefName()).update(commit2); - testRepo.branch(ctl.getChange().getDest().get()) + testRepo + .branch(ctl.getChange().getDest().get()) .update(testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev2))); FixInput fix = new FixInput(); fix.expectMergedAs = rev2; assertProblems( - ctl, fix, + ctl, + fix, + problem("No patch set found for merged commit " + rev2, FIXED, "Marked change as merged"), problem( - "No patch set found for merged commit " + rev2, - FIXED, "Marked change as merged"), - problem( - "Expected merge commit " + rev2 + " corresponds to patch set 2," + "Expected merge commit " + + rev2 + + " corresponds to patch set 2," + " not the current patch set 1", - FIXED, "Inserted as patch set 2")); + FIXED, + "Inserted as patch set 2")); ctl = reload(ctl); assertThat(ctl.getChange().currentPatchSetId()).isEqualTo(psId2); assertThat(ctl.getChange().getStatus()).isEqualTo(Change.Status.MERGED); assertThat(psUtil.byChangeAsMap(db, ctl.getNotes()).keySet()) .containsExactly(ps1.getId(), psId2); - assertThat(psUtil.get(db, ctl.getNotes(), psId2).getRevision().get()) - .isEqualTo(rev2); + assertThat(psUtil.get(db, ctl.getNotes(), psId2).getRevision().get()).isEqualTo(rev2); } @Test public void expectedMergedCommitWithMismatchedChangeId() throws Exception { ChangeControl ctl = insertChange(); String dest = ctl.getChange().getDest().get(); - RevCommit parent = - testRepo.branch(dest).commit().message("parent").create(); + RevCommit parent = testRepo.branch(dest).commit().message("parent").create(); String rev = psUtil.current(db, ctl.getNotes()).getRevision().get(); - RevCommit commit = - testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev)); + RevCommit commit = testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev)); testRepo.branch(dest).update(commit); String badId = "I0000000000000000000000000000000000000000"; - RevCommit mergedAs = testRepo.commit().parent(parent) - .message(commit.getShortMessage() + "\n" - + "\n" - + "Change-Id: " + badId + "\n") - .create(); + RevCommit mergedAs = + testRepo + .commit() + .parent(parent) + .message(commit.getShortMessage() + "\n" + "\n" + "Change-Id: " + badId + "\n") + .create(); testRepo.getRevWalk().parseBody(mergedAs); - assertThat(mergedAs.getFooterLines(FooterConstants.CHANGE_ID)) - .containsExactly(badId); + assertThat(mergedAs.getFooterLines(FooterConstants.CHANGE_ID)).containsExactly(badId); testRepo.update(dest, mergedAs); assertNoProblems(ctl, null); @@ -716,21 +736,24 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { FixInput fix = new FixInput(); fix.expectMergedAs = mergedAs.name(); assertProblems( - ctl, fix, + ctl, + fix, problem( - "Expected merged commit " + mergedAs.name() + " has Change-Id: " - + badId + ", but expected " + ctl.getChange().getKey().get())); + "Expected merged commit " + + mergedAs.name() + + " has Change-Id: " + + badId + + ", but expected " + + ctl.getChange().getKey().get())); } @Test - public void expectedMergedCommitMatchesMultiplePatchSets() - throws Exception { + public void expectedMergedCommitMatchesMultiplePatchSets() throws Exception { ChangeControl ctl1 = insertChange(); PatchSet.Id psId1 = psUtil.current(db, ctl1.getNotes()).getId(); String dest = ctl1.getChange().getDest().get(); String rev = psUtil.current(db, ctl1.getNotes()).getRevision().get(); - RevCommit commit = - testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev)); + RevCommit commit = testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev)); testRepo.branch(dest).update(commit); ChangeControl ctl2 = insertChange(); @@ -744,62 +767,67 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { FixInput fix = new FixInput(); fix.expectMergedAs = commit.name(); assertProblems( - ctl1, fix, + ctl1, + fix, problem( - "Multiple patch sets for expected merged commit " + commit.name() - + ": [" + psId1 + ", " + psId2 + ", " + psId3 + "]")); + "Multiple patch sets for expected merged commit " + + commit.name() + + ": [" + + psId1 + + ", " + + psId2 + + ", " + + psId3 + + "]")); } private BatchUpdate newUpdate(Account.Id owner) { - return updateFactory.create( - db, project, userFactory.create(owner), TimeUtil.nowTs()); + return updateFactory.create(db, project, userFactory.create(owner), TimeUtil.nowTs()); } private ChangeControl insertChange() throws Exception { return insertChange(admin); } - private ChangeControl insertChange(TestAccount owner) throws Exception { return insertChange(owner, "refs/heads/master"); } - private ChangeControl insertChange(TestAccount owner, String dest) - throws Exception { + private ChangeControl insertChange(TestAccount owner, String dest) throws Exception { Change.Id id = new Change.Id(sequences.nextChangeId()); ChangeInserter ins; try (BatchUpdate bu = newUpdate(owner.getId())) { RevCommit commit = patchSetCommit(new PatchSet.Id(id, 1)); - ins = changeInserterFactory - .create(id, commit, dest) - .setValidatePolicy(CommitValidators.Policy.NONE) - .setNotify(NotifyHandling.NONE) - .setFireRevisionCreated(false) - .setSendMail(false); + ins = + changeInserterFactory + .create(id, commit, dest) + .setValidatePolicy(CommitValidators.Policy.NONE) + .setNotify(NotifyHandling.NONE) + .setFireRevisionCreated(false) + .setSendMail(false); bu.insertChange(ins).execute(); } // Return control for admin regardless of owner. - return changeControlFactory.controlFor( - db, ins.getChange(), userFactory.create(adminId)); + return changeControlFactory.controlFor(db, ins.getChange(), userFactory.create(adminId)); } private PatchSet.Id nextPatchSetId(ChangeControl ctl) throws Exception { - return ChangeUtil.nextPatchSetId( - testRepo.getRepository(), ctl.getChange().currentPatchSetId()); + return ChangeUtil.nextPatchSetId(testRepo.getRepository(), ctl.getChange().currentPatchSetId()); } private ChangeControl incrementPatchSet(ChangeControl ctl) throws Exception { return incrementPatchSet(ctl, patchSetCommit(nextPatchSetId(ctl))); } - private ChangeControl incrementPatchSet(ChangeControl ctl, - RevCommit commit) throws Exception { + private ChangeControl incrementPatchSet(ChangeControl ctl, RevCommit commit) throws Exception { PatchSetInserter ins; try (BatchUpdate bu = newUpdate(ctl.getChange().getOwner())) { - ins = patchSetInserterFactory.create(ctl, nextPatchSetId(ctl), commit) - .setValidatePolicy(CommitValidators.Policy.NONE) - .setFireRevisionCreated(false) - .setNotify(NotifyHandling.NONE); + ins = + patchSetInserterFactory + .create(ctl, nextPatchSetId(ctl), commit) + .setValidatePolicy(CommitValidators.Policy.NONE) + .setFireRevisionCreated(false) + .setNotify(NotifyHandling.NONE); bu.addOp(ctl.getId(), ins).execute(); } return reload(ctl); @@ -811,16 +839,11 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { } private RevCommit patchSetCommit(PatchSet.Id psId) throws Exception { - RevCommit c = testRepo - .commit() - .parent(tip) - .message("Change " + psId) - .create(); + RevCommit c = testRepo.commit().parent(tip).message("Change " + psId).create(); return testRepo.parseBody(c); } - private PatchSet insertMissingPatchSet(ChangeControl ctl, String rev) - throws Exception { + private PatchSet insertMissingPatchSet(ChangeControl ctl, String rev) throws Exception { // Don't use BatchUpdate since we're manually updating the meta ref rather // than using ChangeUpdate. String subject = "Subject for missing commit"; @@ -836,11 +859,19 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { addNoteDbCommit( c.getId(), - "Update patch set " + psId.get() + "\n" + "Update patch set " + + psId.get() + "\n" - + "Patch-set: " + psId.get() + "\n" - + "Commit: " + rev + "\n" - + "Subject: " + subject + "\n"); + + "\n" + + "Patch-set: " + + psId.get() + + "\n" + + "Commit: " + + rev + + "\n" + + "Subject: " + + subject + + "\n"); indexer.index(db, c.getProject(), c.getId()); return ps; @@ -852,18 +883,19 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { assertThat(ru.delete()).isEqualTo(RefUpdate.Result.FORCED); } - private void addNoteDbCommit(Change.Id id, String commitMessage) - throws Exception { + private void addNoteDbCommit(Change.Id id, String commitMessage) throws Exception { if (!notesMigration.commitChangeWrites()) { return; } PersonIdent committer = serverIdent.get(); - PersonIdent author = noteUtil.newIdent( - accountCache.get(admin.getId()).getAccount(), - committer.getWhen(), - committer, - anonymousCowardName); - testRepo.branch(RefNames.changeMetaRef(id)) + PersonIdent author = + noteUtil.newIdent( + accountCache.get(admin.getId()).getAccount(), + committer.getWhen(), + committer, + anonymousCowardName); + testRepo + .branch(RefNames.changeMetaRef(id)) .commit() .author(author) .committer(committer) @@ -872,32 +904,31 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { } private ObjectId getDestRef(ChangeControl ctl) throws Exception { - return testRepo.getRepository() - .exactRef(ctl.getChange().getDest().get()) - .getObjectId(); + return testRepo.getRepository().exactRef(ctl.getChange().getDest().get()).getObjectId(); } private ChangeControl mergeChange(ChangeControl ctl) throws Exception { final ObjectId oldId = getDestRef(ctl); - final ObjectId newId = ObjectId.fromString( - psUtil.current(db, ctl.getNotes()).getRevision().get()); + final ObjectId newId = + ObjectId.fromString(psUtil.current(db, ctl.getNotes()).getRevision().get()); final String dest = ctl.getChange().getDest().get(); try (BatchUpdate bu = newUpdate(adminId)) { - bu.addOp(ctl.getId(), new BatchUpdate.Op() { - @Override - public void updateRepo(RepoContext ctx) throws IOException { - ctx.addRefUpdate(new ReceiveCommand(oldId, newId, dest)); - } + bu.addOp( + ctl.getId(), + new BatchUpdate.Op() { + @Override + public void updateRepo(RepoContext ctx) throws IOException { + ctx.addRefUpdate(new ReceiveCommand(oldId, newId, dest)); + } - @Override - public boolean updateChange(ChangeContext ctx) throws OrmException { - ctx.getChange().setStatus(Change.Status.MERGED); - ctx.getUpdate(ctx.getChange().currentPatchSetId()) - .fixStatus(Change.Status.MERGED); - return true; - } - }); + @Override + public boolean updateChange(ChangeContext ctx) throws OrmException { + ctx.getChange().setStatus(Change.Status.MERGED); + ctx.getUpdate(ctx.getChange().currentPatchSetId()).fixStatus(Change.Status.MERGED); + return true; + } + }); bu.execute(); } return reload(ctl); @@ -909,22 +940,19 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { return p; } - private static ProblemInfo problem(String message, - ProblemInfo.Status status, String outcome) { + private static ProblemInfo problem(String message, ProblemInfo.Status status, String outcome) { ProblemInfo p = problem(message); p.status = checkNotNull(status); p.outcome = checkNotNull(outcome); return p; } - private void assertProblems(ChangeControl ctl, @Nullable FixInput fix, - ProblemInfo first, ProblemInfo... rest) { + private void assertProblems( + ChangeControl ctl, @Nullable FixInput fix, ProblemInfo first, ProblemInfo... rest) { List expected = new ArrayList<>(1 + rest.length); expected.add(first); expected.addAll(Arrays.asList(rest)); - assertThat(checker.check(ctl, fix).problems()) - .containsExactlyElementsIn(expected) - .inOrder(); + assertThat(checker.check(ctl, fix).problems()).containsExactlyElementsIn(expected).inOrder(); } private void assertNoProblems(ChangeControl ctl, @Nullable FixInput fix) { diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/GetRelatedIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/GetRelatedIT.java index c577f65387..0c09bbf9c5 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/GetRelatedIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/GetRelatedIT.java @@ -40,16 +40,14 @@ import com.google.gerrit.server.query.change.ChangeData; import com.google.gerrit.testutil.TestTimeUtil; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - +import java.util.List; +import java.util.Optional; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.revwalk.RevCommit; import org.junit.After; import org.junit.Before; import org.junit.Test; -import java.util.List; -import java.util.Optional; - public class GetRelatedIT extends AbstractDaemonTest { private String systemTimeZone; @@ -65,11 +63,9 @@ public class GetRelatedIT extends AbstractDaemonTest { System.setProperty("user.timezone", systemTimeZone); } - @Inject - private BatchUpdate.Factory updateFactory; + @Inject private BatchUpdate.Factory updateFactory; - @Inject - private ChangesCollection changes; + @Inject private ChangesCollection changes; @Test public void getRelatedNoResult() throws Exception { @@ -80,36 +76,22 @@ public class GetRelatedIT extends AbstractDaemonTest { @Test public void getRelatedLinear() throws Exception { // 1,1---2,1 - RevCommit c1_1 = commitBuilder() - .add("a.txt", "1") - .message("subject: 1") - .create(); - RevCommit c2_1 = commitBuilder() - .add("b.txt", "2") - .message("subject: 2") - .create(); + RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create(); + RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create(); pushHead(testRepo, "refs/for/master", false); PatchSet.Id ps1_1 = getPatchSetId(c1_1); PatchSet.Id ps2_1 = getPatchSetId(c2_1); for (PatchSet.Id ps : ImmutableList.of(ps2_1, ps1_1)) { - assertRelated(ps, - changeAndCommit(ps2_1, c2_1, 1), - changeAndCommit(ps1_1, c1_1, 1)); + assertRelated(ps, changeAndCommit(ps2_1, c2_1, 1), changeAndCommit(ps1_1, c1_1, 1)); } } @Test public void getRelatedLinearSeparatePushes() throws Exception { // 1,1---2,1 - RevCommit c1_1 = commitBuilder() - .add("a.txt", "1") - .message("subject: 1") - .create(); - RevCommit c2_1 = commitBuilder() - .add("b.txt", "2") - .message("subject: 2") - .create(); + RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create(); + RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create(); testRepo.reset(c1_1); pushHead(testRepo, "refs/for/master", false); @@ -121,13 +103,10 @@ public class GetRelatedIT extends AbstractDaemonTest { PatchSet.Id ps2_1 = getPatchSetId(c2_1); // Push of change 2 should not affect groups (or anything else) of change 1. - assertThat(changes.parse(ps1_1.getParentKey()).getETag()) - .isEqualTo(oldETag); + assertThat(changes.parse(ps1_1.getParentKey()).getETag()).isEqualTo(oldETag); for (PatchSet.Id ps : ImmutableList.of(ps2_1, ps1_1)) { - assertRelated(ps, - changeAndCommit(ps2_1, c2_1, 1), - changeAndCommit(ps1_1, c1_1, 1)); + assertRelated(ps, changeAndCommit(ps2_1, c2_1, 1), changeAndCommit(ps1_1, c1_1, 1)); } } @@ -138,14 +117,8 @@ public class GetRelatedIT extends AbstractDaemonTest { // 2,2---1,2 // Create two commits and push. - RevCommit c1_1 = commitBuilder() - .add("a.txt", "1") - .message("subject: 1") - .create(); - RevCommit c2_1 = commitBuilder() - .add("b.txt", "2") - .message("subject: 2") - .create(); + RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create(); + RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create(); pushHead(testRepo, "refs/for/master", false); PatchSet.Id ps1_1 = getPatchSetId(c1_1); PatchSet.Id ps2_1 = getPatchSetId(c2_1); @@ -159,15 +132,11 @@ public class GetRelatedIT extends AbstractDaemonTest { PatchSet.Id ps2_2 = getPatchSetId(c2_1); for (PatchSet.Id ps : ImmutableList.of(ps2_2, ps1_2)) { - assertRelated(ps, - changeAndCommit(ps1_2, c1_2, 2), - changeAndCommit(ps2_2, c2_2, 2)); + assertRelated(ps, changeAndCommit(ps1_2, c1_2, 2), changeAndCommit(ps2_2, c2_2, 2)); } for (PatchSet.Id ps : ImmutableList.of(ps2_1, ps1_1)) { - assertRelated(ps, - changeAndCommit(ps2_1, c2_1, 2), - changeAndCommit(ps1_1, c1_1, 2)); + assertRelated(ps, changeAndCommit(ps2_1, c2_1, 2), changeAndCommit(ps1_1, c1_1, 2)); } } @@ -178,35 +147,23 @@ public class GetRelatedIT extends AbstractDaemonTest { // 1,2 // Create two commits and push. - RevCommit c1_1 = commitBuilder() - .add("a.txt", "1") - .message("subject: 1") - .create(); - RevCommit c2_1 = commitBuilder() - .add("b.txt", "2") - .message("subject: 2") - .create(); + RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create(); + RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create(); pushHead(testRepo, "refs/for/master", false); PatchSet.Id ps1_1 = getPatchSetId(c1_1); PatchSet.Id ps2_1 = getPatchSetId(c2_1); // Amend parent change and push. testRepo.reset("HEAD~1"); - RevCommit c1_2 = amendBuilder() - .add("c.txt", "2") - .create(); + RevCommit c1_2 = amendBuilder().add("c.txt", "2").create(); pushHead(testRepo, "refs/for/master", false); PatchSet.Id ps1_2 = getPatchSetId(c1_2); for (PatchSet.Id ps : ImmutableList.of(ps2_1, ps1_1)) { - assertRelated(ps, - changeAndCommit(ps2_1, c2_1, 1), - changeAndCommit(ps1_1, c1_1, 2)); + assertRelated(ps, changeAndCommit(ps2_1, c2_1, 1), changeAndCommit(ps1_1, c1_1, 2)); } - assertRelated(ps1_2, - changeAndCommit(ps2_1, c2_1, 1), - changeAndCommit(ps1_2, c1_2, 2)); + assertRelated(ps1_2, changeAndCommit(ps2_1, c2_1, 1), changeAndCommit(ps1_2, c1_2, 2)); } @Test @@ -217,14 +174,8 @@ public class GetRelatedIT extends AbstractDaemonTest { // Create two commits and push. ObjectId initial = repo().exactRef("HEAD").getObjectId(); - RevCommit c1_1 = commitBuilder() - .add("a.txt", "1") - .message("subject: 1") - .create(); - RevCommit c2_1 = commitBuilder() - .add("b.txt", "2") - .message("subject: 2") - .create(); + RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create(); + RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create(); pushHead(testRepo, "refs/for/master", false); PatchSet.Id ps1_1 = getPatchSetId(c1_1); PatchSet.Id ps2_1 = getPatchSetId(c2_1); @@ -233,24 +184,23 @@ public class GetRelatedIT extends AbstractDaemonTest { testRepo.reset(initial); RevCommit c2_2 = testRepo.cherryPick(c2_1); RevCommit c1_2 = testRepo.cherryPick(c1_1); - RevCommit c3_1 = commitBuilder() - .add("c.txt", "3") - .message("subject: 3") - .create(); + RevCommit c3_1 = commitBuilder().add("c.txt", "3").message("subject: 3").create(); pushHead(testRepo, "refs/for/master", false); PatchSet.Id ps1_2 = getPatchSetId(c1_1); PatchSet.Id ps2_2 = getPatchSetId(c2_1); PatchSet.Id ps3_1 = getPatchSetId(c3_1); for (PatchSet.Id ps : ImmutableList.of(ps3_1, ps2_2, ps1_2)) { - assertRelated(ps, + assertRelated( + ps, changeAndCommit(ps3_1, c3_1, 1), changeAndCommit(ps1_2, c1_2, 2), changeAndCommit(ps2_2, c2_2, 2)); } for (PatchSet.Id ps : ImmutableList.of(ps2_1, ps1_1)) { - assertRelated(ps, + assertRelated( + ps, changeAndCommit(ps3_1, c3_1, 1), changeAndCommit(ps2_1, c2_1, 2), changeAndCommit(ps1_1, c1_1, 2)); @@ -264,18 +214,9 @@ public class GetRelatedIT extends AbstractDaemonTest { // 1,2---2,2---3,2 // Create three commits and push. - RevCommit c1_1 = commitBuilder() - .add("a.txt", "1") - .message("subject: 1") - .create(); - RevCommit c2_1 = commitBuilder() - .add("b.txt", "1") - .message("subject: 2") - .create(); - RevCommit c3_1 = commitBuilder() - .add("b.txt", "1") - .message("subject: 3") - .create(); + RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create(); + RevCommit c2_1 = commitBuilder().add("b.txt", "1").message("subject: 2").create(); + RevCommit c3_1 = commitBuilder().add("b.txt", "1").message("subject: 3").create(); pushHead(testRepo, "refs/for/master", false); PatchSet.Id ps1_1 = getPatchSetId(c1_1); PatchSet.Id ps2_1 = getPatchSetId(c2_1); @@ -283,31 +224,27 @@ public class GetRelatedIT extends AbstractDaemonTest { // Amend all changes change and push. testRepo.reset(c1_1); - RevCommit c1_2 = amendBuilder() - .add("a.txt", "2") - .create(); - RevCommit c2_2 = commitBuilder() - .add("b.txt", "2") - .message(parseBody(c2_1).getFullMessage()) - .create(); - RevCommit c3_2 = commitBuilder() - .add("b.txt", "3") - .message(parseBody(c3_1).getFullMessage()) - .create(); + RevCommit c1_2 = amendBuilder().add("a.txt", "2").create(); + RevCommit c2_2 = + commitBuilder().add("b.txt", "2").message(parseBody(c2_1).getFullMessage()).create(); + RevCommit c3_2 = + commitBuilder().add("b.txt", "3").message(parseBody(c3_1).getFullMessage()).create(); pushHead(testRepo, "refs/for/master", false); PatchSet.Id ps1_2 = getPatchSetId(c1_2); PatchSet.Id ps2_2 = getPatchSetId(c2_2); PatchSet.Id ps3_2 = getPatchSetId(c3_2); for (PatchSet.Id ps : ImmutableList.of(ps1_1, ps2_1, ps3_1)) { - assertRelated(ps, + assertRelated( + ps, changeAndCommit(ps3_1, c3_1, 2), changeAndCommit(ps2_1, c2_1, 2), changeAndCommit(ps1_1, c1_1, 2)); } for (PatchSet.Id ps : ImmutableList.of(ps1_2, ps2_2, ps3_2)) { - assertRelated(ps, + assertRelated( + ps, changeAndCommit(ps3_2, c3_2, 2), changeAndCommit(ps2_2, c2_2, 2), changeAndCommit(ps1_2, c1_2, 2)); @@ -322,18 +259,9 @@ public class GetRelatedIT extends AbstractDaemonTest { // \---4,1 // Create three commits and push. - RevCommit c1_1 = commitBuilder() - .add("a.txt", "1") - .message("subject: 1") - .create(); - RevCommit c2_1 = commitBuilder() - .add("b.txt", "1") - .message("subject: 2") - .create(); - RevCommit c3_1 = commitBuilder() - .add("b.txt", "1") - .message("subject: 3") - .create(); + RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create(); + RevCommit c2_1 = commitBuilder().add("b.txt", "1").message("subject: 2").create(); + RevCommit c3_1 = commitBuilder().add("b.txt", "1").message("subject: 3").create(); pushHead(testRepo, "refs/for/master", false); PatchSet.Id ps1_1 = getPatchSetId(c1_1); PatchSet.Id ps2_1 = getPatchSetId(c2_1); @@ -341,17 +269,11 @@ public class GetRelatedIT extends AbstractDaemonTest { // Amend all changes change and push. testRepo.reset(c1_1); - RevCommit c1_2 = amendBuilder() - .add("a.txt", "2") - .create(); - RevCommit c2_2 = commitBuilder() - .add("b.txt", "2") - .message(parseBody(c2_1).getFullMessage()) - .create(); - RevCommit c3_2 = commitBuilder() - .add("b.txt", "3") - .message(parseBody(c3_1).getFullMessage()) - .create(); + RevCommit c1_2 = amendBuilder().add("a.txt", "2").create(); + RevCommit c2_2 = + commitBuilder().add("b.txt", "2").message(parseBody(c2_1).getFullMessage()).create(); + RevCommit c3_2 = + commitBuilder().add("b.txt", "3").message(parseBody(c3_1).getFullMessage()).create(); pushHead(testRepo, "refs/for/master", false); PatchSet.Id ps1_2 = getPatchSetId(c1_2); PatchSet.Id ps2_2 = getPatchSetId(c2_2); @@ -359,15 +281,13 @@ public class GetRelatedIT extends AbstractDaemonTest { // Add one more commit 4,1 based on 1,2. testRepo.reset(c1_2); - RevCommit c4_1 = commitBuilder() - .add("d.txt", "4") - .message("subject: 4") - .create(); + RevCommit c4_1 = commitBuilder().add("d.txt", "4").message("subject: 4").create(); pushHead(testRepo, "refs/for/master", false); PatchSet.Id ps4_1 = getPatchSetId(c4_1); // 1,1 is related indirectly to 4,1. - assertRelated(ps1_1, + assertRelated( + ps1_1, changeAndCommit(ps4_1, c4_1, 1), changeAndCommit(ps3_1, c3_1, 2), changeAndCommit(ps2_1, c2_1, 2), @@ -376,14 +296,16 @@ public class GetRelatedIT extends AbstractDaemonTest { // 2,1 and 3,1 don't include 4,1 since we don't walk forward after walking // backward. for (PatchSet.Id ps : ImmutableList.of(ps2_1, ps3_1)) { - assertRelated(ps, + assertRelated( + ps, changeAndCommit(ps3_1, c3_1, 2), changeAndCommit(ps2_1, c2_1, 2), changeAndCommit(ps1_1, c1_1, 2)); } // 1,2 is related directly to 4,1, and the 2-3 parallel branch stays intact. - assertRelated(ps1_2, + assertRelated( + ps1_2, changeAndCommit(ps4_1, c4_1, 1), changeAndCommit(ps3_2, c3_2, 2), changeAndCommit(ps2_2, c2_2, 2), @@ -391,14 +313,13 @@ public class GetRelatedIT extends AbstractDaemonTest { // 4,1 is only related to 1,2, since we don't walk forward after walking // backward. - assertRelated(ps4_1, - changeAndCommit(ps4_1, c4_1, 1), - changeAndCommit(ps1_2, c1_2, 2)); + assertRelated(ps4_1, changeAndCommit(ps4_1, c4_1, 1), changeAndCommit(ps1_2, c1_2, 2)); // 2,2 and 3,2 don't include 4,1 since we don't walk forward after walking // backward. for (PatchSet.Id ps : ImmutableList.of(ps2_2, ps3_2)) { - assertRelated(ps, + assertRelated( + ps, changeAndCommit(ps3_2, c3_2, 2), changeAndCommit(ps2_2, c2_2, 2), changeAndCommit(ps1_2, c1_2, 2)); @@ -412,57 +333,44 @@ public class GetRelatedIT extends AbstractDaemonTest { // 1,2---2,2---3,1 // Create two commits and push. - RevCommit c1_1 = commitBuilder() - .add("a.txt", "1") - .message("subject: 1") - .create(); - RevCommit c2_1 = commitBuilder() - .add("b.txt", "2") - .message("subject: 2") - .create(); + RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create(); + RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create(); pushHead(testRepo, "refs/for/master", false); PatchSet.Id ps1_1 = getPatchSetId(c1_1); PatchSet.Id ps2_1 = getPatchSetId(c2_1); // Amend both changes change and push. testRepo.reset(c1_1); - RevCommit c1_2 = amendBuilder() - .add("a.txt", "2") - .create(); - RevCommit c2_2 = commitBuilder() - .add("b.txt", "2") - .message(parseBody(c2_1).getFullMessage()) - .create(); + RevCommit c1_2 = amendBuilder().add("a.txt", "2").create(); + RevCommit c2_2 = + commitBuilder().add("b.txt", "2").message(parseBody(c2_1).getFullMessage()).create(); pushHead(testRepo, "refs/for/master", false); PatchSet.Id ps1_2 = getPatchSetId(c1_2); PatchSet.Id ps2_2 = getPatchSetId(c2_2); // PS 3,1 depends on 2,2. - RevCommit c3_1 = commitBuilder() - .add("c.txt", "1") - .message("subject: 3") - .create(); + RevCommit c3_1 = commitBuilder().add("c.txt", "1").message("subject: 3").create(); pushHead(testRepo, "refs/for/master", false); PatchSet.Id ps3_1 = getPatchSetId(c3_1); // PS 3,2 depends on 2,1. testRepo.reset(c2_1); - RevCommit c3_2 = commitBuilder() - .add("c.txt", "2") - .message(parseBody(c3_1).getFullMessage()) - .create(); + RevCommit c3_2 = + commitBuilder().add("c.txt", "2").message(parseBody(c3_1).getFullMessage()).create(); pushHead(testRepo, "refs/for/master", false); PatchSet.Id ps3_2 = getPatchSetId(c3_2); for (PatchSet.Id ps : ImmutableList.of(ps1_1, ps2_1, ps3_2)) { - assertRelated(ps, + assertRelated( + ps, changeAndCommit(ps3_2, c3_2, 2), changeAndCommit(ps2_1, c2_1, 2), changeAndCommit(ps1_1, c1_1, 2)); } for (PatchSet.Id ps : ImmutableList.of(ps1_2, ps2_2, ps3_1)) { - assertRelated(ps, + assertRelated( + ps, changeAndCommit(ps3_1, c3_1, 2), changeAndCommit(ps2_2, c2_2, 2), changeAndCommit(ps1_2, c1_2, 2)); @@ -475,52 +383,32 @@ public class GetRelatedIT extends AbstractDaemonTest { // \---4,1---5,1 // \--6,1---7,1 - RevCommit c1_1 = commitBuilder() - .add("a.txt", "1") - .message("subject: 1") - .create(); - RevCommit c2_1 = commitBuilder() - .add("b.txt", "2") - .message("subject: 2") - .create(); - RevCommit c3_1 = commitBuilder() - .add("c.txt", "3") - .message("subject: 3") - .create(); + RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create(); + RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create(); + RevCommit c3_1 = commitBuilder().add("c.txt", "3").message("subject: 3").create(); pushHead(testRepo, "refs/for/master", false); PatchSet.Id ps1_1 = getPatchSetId(c1_1); PatchSet.Id ps2_1 = getPatchSetId(c2_1); PatchSet.Id ps3_1 = getPatchSetId(c3_1); testRepo.reset(c1_1); - RevCommit c4_1 = commitBuilder() - .add("d.txt", "4") - .message("subject: 4") - .create(); - RevCommit c5_1 = commitBuilder() - .add("e.txt", "5") - .message("subject: 5") - .create(); + RevCommit c4_1 = commitBuilder().add("d.txt", "4").message("subject: 4").create(); + RevCommit c5_1 = commitBuilder().add("e.txt", "5").message("subject: 5").create(); pushHead(testRepo, "refs/for/master", false); PatchSet.Id ps4_1 = getPatchSetId(c4_1); PatchSet.Id ps5_1 = getPatchSetId(c5_1); testRepo.reset(c1_1); - RevCommit c6_1 = commitBuilder() - .add("f.txt", "6") - .message("subject: 6") - .create(); - RevCommit c7_1 = commitBuilder() - .add("g.txt", "7") - .message("subject: 7") - .create(); + RevCommit c6_1 = commitBuilder().add("f.txt", "6").message("subject: 6").create(); + RevCommit c7_1 = commitBuilder().add("g.txt", "7").message("subject: 7").create(); pushHead(testRepo, "refs/for/master", false); PatchSet.Id ps6_1 = getPatchSetId(c6_1); PatchSet.Id ps7_1 = getPatchSetId(c7_1); // All changes are related to 1,1, keeping each of the parallel branches // intact. - assertRelated(ps1_1, + assertRelated( + ps1_1, changeAndCommit(ps7_1, c7_1, 1), changeAndCommit(ps6_1, c6_1, 1), changeAndCommit(ps5_1, c5_1, 1), @@ -531,7 +419,8 @@ public class GetRelatedIT extends AbstractDaemonTest { // The 2-3 branch is only related back to 1, not the other branches. for (PatchSet.Id ps : ImmutableList.of(ps2_1, ps3_1)) { - assertRelated(ps, + assertRelated( + ps, changeAndCommit(ps3_1, c3_1, 1), changeAndCommit(ps2_1, c2_1, 1), changeAndCommit(ps1_1, c1_1, 1)); @@ -539,7 +428,8 @@ public class GetRelatedIT extends AbstractDaemonTest { // The 4-5 branch is only related back to 1, not the other branches. for (PatchSet.Id ps : ImmutableList.of(ps4_1, ps5_1)) { - assertRelated(ps, + assertRelated( + ps, changeAndCommit(ps5_1, c5_1, 1), changeAndCommit(ps4_1, c4_1, 1), changeAndCommit(ps1_1, c1_1, 1)); @@ -547,7 +437,8 @@ public class GetRelatedIT extends AbstractDaemonTest { // The 6-7 branch is only related back to 1, not the other branches. for (PatchSet.Id ps : ImmutableList.of(ps6_1, ps7_1)) { - assertRelated(ps, + assertRelated( + ps, changeAndCommit(ps7_1, c7_1, 1), changeAndCommit(ps6_1, c6_1, 1), changeAndCommit(ps1_1, c1_1, 1)); @@ -559,30 +450,15 @@ public class GetRelatedIT extends AbstractDaemonTest { // 1,1---2,1---3,1 // \---2,E---/ - RevCommit c1_1 = commitBuilder() - .add("a.txt", "1") - .message("subject: 1") - .create(); - RevCommit c2_1 = commitBuilder() - .add("b.txt", "2") - .message("subject: 2") - .create(); - RevCommit c3_1 = commitBuilder() - .add("c.txt", "3") - .message("subject: 3") - .create(); + RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create(); + RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create(); + RevCommit c3_1 = commitBuilder().add("c.txt", "3").message("subject: 3").create(); pushHead(testRepo, "refs/for/master", false); Change ch2 = getChange(c2_1).change(); String changeId2 = ch2.getKey().get(); - gApi.changes() - .id(changeId2) - .edit() - .create(); - gApi.changes() - .id(changeId2) - .edit() - .modifyFile("a.txt", RawInputUtil.create(new byte[] {'a'})); + gApi.changes().id(changeId2).edit().create(); + gApi.changes().id(changeId2).edit().modifyFile("a.txt", RawInputUtil.create(new byte[] {'a'})); Optional edit = getEdit(changeId2); assertThat(edit).isPresent(); ObjectId editRev = ObjectId.fromString(edit.get().commit.commit); @@ -593,13 +469,15 @@ public class GetRelatedIT extends AbstractDaemonTest { PatchSet.Id ps3_1 = getPatchSetId(c3_1); for (PatchSet.Id ps : ImmutableList.of(ps1_1, ps2_1, ps3_1)) { - assertRelated(ps, + assertRelated( + ps, changeAndCommit(ps3_1, c3_1, 1), changeAndCommit(ps2_1, c2_1, 1), changeAndCommit(ps1_1, c1_1, 1)); } - assertRelated(ps2_edit, + assertRelated( + ps2_edit, changeAndCommit(ps3_1, c3_1, 1), changeAndCommit(new PatchSet.Id(ch2.getId(), 0), editRev, 1), changeAndCommit(ps1_1, c1_1, 1)); @@ -610,63 +488,42 @@ public class GetRelatedIT extends AbstractDaemonTest { // 1,1---2,1 // \---2,2 - RevCommit c1_1 = commitBuilder() - .add("a.txt", "1") - .message("subject: 1") - .create(); - RevCommit c2_1 = commitBuilder() - .add("b.txt", "2") - .message("subject: 2") - .create(); + RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create(); + RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create(); pushHead(testRepo, "refs/for/master", false); PatchSet.Id psId1_1 = getPatchSetId(c1_1); PatchSet.Id psId2_1 = getPatchSetId(c2_1); for (PatchSet.Id psId : ImmutableList.of(psId1_1, psId2_1)) { - assertRelated(psId, - changeAndCommit(psId2_1, c2_1, 1), - changeAndCommit(psId1_1, c1_1, 1)); + assertRelated(psId, changeAndCommit(psId2_1, c2_1, 1), changeAndCommit(psId1_1, c1_1, 1)); } // Pretend PS1,1 was pushed before the groups field was added. clearGroups(psId1_1); - indexer.index( - changeDataFactory.create(db, project, psId1_1.getParentKey())); + indexer.index(changeDataFactory.create(db, project, psId1_1.getParentKey())); // PS1,1 has no groups, so disappeared from related changes. assertRelated(psId2_1); - RevCommit c2_2 = testRepo.amend(c2_1) - .add("c.txt", "2") - .create(); + RevCommit c2_2 = testRepo.amend(c2_1).add("c.txt", "2").create(); testRepo.reset(c2_2); pushHead(testRepo, "refs/for/master", false); PatchSet.Id psId2_2 = getPatchSetId(c2_2); // Push updated the group for PS1,1, so it shows up in related changes even // though a new patch set was not pushed. - assertRelated(psId2_2, - changeAndCommit(psId2_2, c2_2, 2), - changeAndCommit(psId1_1, c1_1, 1)); + assertRelated(psId2_2, changeAndCommit(psId2_2, c2_2, 2), changeAndCommit(psId1_1, c1_1, 1)); } @Test @GerritConfig(name = "index.testReindexAfterUpdate", value = "false") public void getRelatedForStaleChange() throws Exception { - RevCommit c1_1 = commitBuilder() - .add("a.txt", "1") - .message("subject: 1") - .create(); + RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create(); - RevCommit c2_1 = commitBuilder() - .add("b.txt", "1") - .message("subject: 1") - .create(); + RevCommit c2_1 = commitBuilder().add("b.txt", "1").message("subject: 1").create(); pushHead(testRepo, "refs/for/master", false); - RevCommit c2_2 = testRepo.amend(c2_1) - .add("b.txt", "2") - .create(); + RevCommit c2_2 = testRepo.amend(c2_1).add("b.txt", "2").create(); testRepo.reset(c2_2); disableChangeIndexWrites(); @@ -680,18 +537,15 @@ public class GetRelatedIT extends AbstractDaemonTest { PatchSet.Id psId2_1 = getPatchSetId(c2_1); PatchSet.Id psId2_2 = new PatchSet.Id(psId2_1.changeId, psId2_1.get() + 1); - assertRelated(psId2_2, changeAndCommit(psId2_2, c2_2, 2), - changeAndCommit(psId1_1, c1_1, 1)); + assertRelated(psId2_2, changeAndCommit(psId2_2, c2_2, 2), changeAndCommit(psId1_1, c1_1, 1)); } private List getRelated(PatchSet.Id ps) throws Exception { return getRelated(ps.getParentKey(), ps.get()); } - private List getRelated(Change.Id changeId, int ps) - throws Exception { - String url = String.format("/changes/%d/revisions/%d/related", - changeId.get(), ps); + private List getRelated(Change.Id changeId, int ps) throws Exception { + String url = String.format("/changes/%d/revisions/%d/related", changeId.get(), ps); RestResponse r = adminRestSession.get(url); r.assertOK(); return newGson().fromJson(r.getReader(), RelatedInfo.class).changes; @@ -723,38 +577,35 @@ public class GetRelatedIT extends AbstractDaemonTest { } private void clearGroups(final PatchSet.Id psId) throws Exception { - try (BatchUpdate bu = updateFactory.create( - db, project, user(user), TimeUtil.nowTs())) { - bu.addOp(psId.getParentKey(), new BatchUpdate.Op() { - @Override - public boolean updateChange(ChangeContext ctx) throws OrmException { - PatchSet ps = psUtil.get(ctx.getDb(), ctx.getNotes(), psId); - psUtil.setGroups(ctx.getDb(), ctx.getUpdate(psId), ps, - ImmutableList. of()); - ctx.bumpLastUpdatedOn(false); - return true; - } - }); + try (BatchUpdate bu = updateFactory.create(db, project, user(user), TimeUtil.nowTs())) { + bu.addOp( + psId.getParentKey(), + new BatchUpdate.Op() { + @Override + public boolean updateChange(ChangeContext ctx) throws OrmException { + PatchSet ps = psUtil.get(ctx.getDb(), ctx.getNotes(), psId); + psUtil.setGroups(ctx.getDb(), ctx.getUpdate(psId), ps, ImmutableList.of()); + ctx.bumpLastUpdatedOn(false); + return true; + } + }); bu.execute(); } } - private void assertRelated(PatchSet.Id psId, ChangeAndCommit... expected) - throws Exception { + private void assertRelated(PatchSet.Id psId, ChangeAndCommit... expected) throws Exception { List actual = getRelated(psId); assertThat(actual).named("related to " + psId).hasSize(expected.length); for (int i = 0; i < actual.size(); i++) { String name = "index " + i + " related to " + psId; ChangeAndCommit a = actual.get(i); ChangeAndCommit e = expected[i]; - assertThat(a._changeNumber).named("change ID of " + name) - .isEqualTo(e._changeNumber); + assertThat(a._changeNumber).named("change ID of " + name).isEqualTo(e._changeNumber); // Don't bother checking changeId; assume _changeNumber is sufficient. - assertThat(a._revisionNumber).named("revision of " + name) - .isEqualTo(e._revisionNumber); - assertThat(a.commit.commit).named("commit of " + name) - .isEqualTo(e.commit.commit); - assertThat(a._currentRevisionNumber).named("current revision of " + name) + assertThat(a._revisionNumber).named("revision of " + name).isEqualTo(e._revisionNumber); + assertThat(a.commit.commit).named("commit of " + name).isEqualTo(e.commit.commit); + assertThat(a._currentRevisionNumber) + .named("current revision of " + name) .isEqualTo(e._currentRevisionNumber); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/PatchListCacheIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/PatchListCacheIT.java index 3b4b6a84d1..05dc219f73 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/PatchListCacheIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/PatchListCacheIT.java @@ -27,13 +27,11 @@ import com.google.gerrit.server.patch.PatchListCache; import com.google.gerrit.server.patch.PatchListEntry; import com.google.gerrit.server.patch.PatchListKey; import com.google.inject.Inject; - +import java.util.List; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.revwalk.RevCommit; import org.junit.Test; -import java.util.List; - @NoHttpd public class PatchListCacheIT extends AbstractDaemonTest { private static String SUBJECT_1 = "subject 1"; @@ -44,24 +42,16 @@ public class PatchListCacheIT extends AbstractDaemonTest { private static String FILE_C = "c.txt"; private static String FILE_D = "d.txt"; - @Inject - private PatchListCache patchListCache; + @Inject private PatchListCache patchListCache; @Test public void listPatchesAgainstBase() throws Exception { - commitBuilder() - .add(FILE_D, "4") - .message(SUBJECT_1) - .create(); + commitBuilder().add(FILE_D, "4").message(SUBJECT_1).create(); pushHead(testRepo, "refs/heads/master", false); // Change 1, 1 (+FILE_A, -FILE_D) - RevCommit c = commitBuilder() - .add(FILE_A, "1") - .rm(FILE_D) - .message(SUBJECT_2) - .insertChangeId() - .create(); + RevCommit c = + commitBuilder().add(FILE_A, "1").rm(FILE_D).message(SUBJECT_2).insertChangeId().create(); String id = getChangeId(testRepo, c).get(); pushHead(testRepo, "refs/for/master", false); @@ -73,9 +63,7 @@ public class PatchListCacheIT extends AbstractDaemonTest { assertDeleted(FILE_D, entries.get(2)); // Change 1,2 (+FILE_A, +FILE_B, -FILE_D) - c = amendBuilder() - .add(FILE_B, "2") - .create(); + c = amendBuilder().add(FILE_B, "2").create(); pushHead(testRepo, "refs/for/master", false); entries = getCurrentPatches(id); @@ -89,18 +77,11 @@ public class PatchListCacheIT extends AbstractDaemonTest { @Test public void listPatchesAgainstBaseWithRebase() throws Exception { - commitBuilder() - .add(FILE_D, "4") - .message(SUBJECT_1) - .create(); + commitBuilder().add(FILE_D, "4").message(SUBJECT_1).create(); pushHead(testRepo, "refs/heads/master", false); // Change 1,1 (+FILE_A, -FILE_D) - RevCommit c = commitBuilder() - .add(FILE_A, "1") - .rm(FILE_D) - .message(SUBJECT_2) - .create(); + RevCommit c = commitBuilder().add(FILE_A, "1").rm(FILE_D).message(SUBJECT_2).create(); String id = getChangeId(testRepo, c).get(); pushHead(testRepo, "refs/for/master", false); List entries = getCurrentPatches(id); @@ -111,10 +92,7 @@ public class PatchListCacheIT extends AbstractDaemonTest { // Change 2,1 (+FILE_B) testRepo.reset("HEAD~1"); - commitBuilder() - .add(FILE_B, "2") - .message(SUBJECT_3) - .create(); + commitBuilder().add(FILE_B, "2").message(SUBJECT_3).create(); pushHead(testRepo, "refs/for/master", false); // Change 1,2 (+FILE_A, -FILE_D)) @@ -131,37 +109,27 @@ public class PatchListCacheIT extends AbstractDaemonTest { @Test public void listPatchesAgainstOtherPatchSet() throws Exception { - commitBuilder() - .add(FILE_D, "4") - .message(SUBJECT_1) - .create(); + commitBuilder().add(FILE_D, "4").message(SUBJECT_1).create(); pushHead(testRepo, "refs/heads/master", false); // Change 1,1 (+FILE_A, +FILE_C, -FILE_D) - RevCommit a = commitBuilder() - .add(FILE_A, "1") - .add(FILE_C, "3") - .rm(FILE_D) - .message(SUBJECT_2) - .create(); + RevCommit a = + commitBuilder().add(FILE_A, "1").add(FILE_C, "3").rm(FILE_D).message(SUBJECT_2).create(); pushHead(testRepo, "refs/for/master", false); // Change 1,2 (+FILE_A, +FILE_B, -FILE_D) - RevCommit b = amendBuilder() - .add(FILE_B, "2") - .rm(FILE_C) - .create(); + RevCommit b = amendBuilder().add(FILE_B, "2").rm(FILE_C).create(); pushHead(testRepo, "refs/for/master", false); // Compare Change 1,1 with Change 1,2 (+FILE_B, -FILE_C) - List entries = getPatches(a, b); + List entries = getPatches(a, b); assertThat(entries).hasSize(3); assertModified(Patch.COMMIT_MSG, entries.get(0)); assertAdded(FILE_B, entries.get(1)); assertDeleted(FILE_C, entries.get(2)); // Compare Change 1,2 with Change 1,1 (-FILE_B, +FILE_C) - List entriesReverse = getPatches(b, a); + List entriesReverse = getPatches(b, a); assertThat(entriesReverse).hasSize(3); assertModified(Patch.COMMIT_MSG, entriesReverse.get(0)); assertDeleted(FILE_B, entriesReverse.get(1)); @@ -170,43 +138,31 @@ public class PatchListCacheIT extends AbstractDaemonTest { @Test public void listPatchesAgainstOtherPatchSetWithRebase() throws Exception { - commitBuilder() - .add(FILE_D, "4") - .message(SUBJECT_1) - .create(); + commitBuilder().add(FILE_D, "4").message(SUBJECT_1).create(); pushHead(testRepo, "refs/heads/master", false); // Change 1,1 (+FILE_A, -FILE_D) - RevCommit a = commitBuilder() - .add(FILE_A, "1") - .rm(FILE_D) - .message(SUBJECT_2) - .create(); + RevCommit a = commitBuilder().add(FILE_A, "1").rm(FILE_D).message(SUBJECT_2).create(); pushHead(testRepo, "refs/for/master", false); // Change 2,1 (+FILE_B) testRepo.reset("HEAD~1"); - commitBuilder() - .add(FILE_B, "2") - .message(SUBJECT_3) - .create(); + commitBuilder().add(FILE_B, "2").message(SUBJECT_3).create(); pushHead(testRepo, "refs/for/master", false); // Change 1,2 (+FILE_A, +FILE_C, -FILE_D) testRepo.cherryPick(a); - RevCommit b = amendBuilder() - .add(FILE_C, "2") - .create(); + RevCommit b = amendBuilder().add(FILE_C, "2").create(); pushHead(testRepo, "refs/for/master", false); // Compare Change 1,1 with Change 1,2 (+FILE_C) - List entries = getPatches(a, b); + List entries = getPatches(a, b); assertThat(entries).hasSize(2); assertModified(Patch.COMMIT_MSG, entries.get(0)); assertAdded(FILE_C, entries.get(1)); // Compare Change 1,2 with Change 1,1 (-FILE_C) - List entriesReverse = getPatches(b, a); + List entriesReverse = getPatches(b, a); assertThat(entriesReverse).hasSize(2); assertModified(Patch.COMMIT_MSG, entriesReverse.get(0)); assertDeleted(FILE_C, entriesReverse.get(1)); @@ -232,17 +188,13 @@ public class PatchListCacheIT extends AbstractDaemonTest { assertThat(e.getOldName()).isNull(); } - private List getCurrentPatches(String changeId) - throws Exception { - return patchListCache - .get(getKey(null, getCurrentRevisionId(changeId)), project) - .getPatches(); + private List getCurrentPatches(String changeId) throws Exception { + return patchListCache.get(getKey(null, getCurrentRevisionId(changeId)), project).getPatches(); } private List getPatches(ObjectId revisionIdA, ObjectId revisionIdB) throws Exception { - return patchListCache.get(getKey(revisionIdA, revisionIdB), project) - .getPatches(); + return patchListCache.get(getKey(revisionIdA, revisionIdB), project).getPatches(); } private PatchListKey getKey(ObjectId revisionIdA, ObjectId revisionIdB) { diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/SubmittedTogetherIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/SubmittedTogetherIT.java index 7dc8b98434..75bdf4d40b 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/SubmittedTogetherIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/SubmittedTogetherIT.java @@ -31,15 +31,13 @@ import com.google.gerrit.extensions.common.RevisionInfo; import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.testutil.ConfigSuite; - +import java.util.EnumSet; +import java.util.List; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.revwalk.RevCommit; import org.junit.Test; -import java.util.EnumSet; -import java.util.List; - public class SubmittedTogetherIT extends AbstractDaemonTest { @ConfigSuite.Config public static Config submitWholeTopicEnabled() { @@ -48,21 +46,13 @@ public class SubmittedTogetherIT extends AbstractDaemonTest { @Test public void doesNotIncludeCurrentFiles() throws Exception { - RevCommit c1_1 = commitBuilder() - .add("a.txt", "1") - .message("subject: 1") - .create(); - RevCommit c2_1 = commitBuilder() - .add("b.txt", "2") - .message("subject: 2") - .create(); + RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create(); + RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create(); String id2 = getChangeId(c2_1); pushHead(testRepo, "refs/for/master", false); SubmittedTogetherInfo info = - gApi.changes() - .id(id2) - .submittedTogether(EnumSet.of(NON_VISIBLE_CHANGES)); + gApi.changes().id(id2).submittedTogether(EnumSet.of(NON_VISIBLE_CHANGES)); assertThat(info.changes).hasSize(2); assertThat(info.changes.get(0).currentRevision).isEqualTo(c2_1.name()); assertThat(info.changes.get(1).currentRevision).isEqualTo(c1_1.name()); @@ -74,14 +64,8 @@ public class SubmittedTogetherIT extends AbstractDaemonTest { @Test public void returnsCurrentFilesIfOptionRequested() throws Exception { - RevCommit c1_1 = commitBuilder() - .add("a.txt", "1") - .message("subject: 1") - .create(); - RevCommit c2_1 = commitBuilder() - .add("b.txt", "2") - .message("subject: 2") - .create(); + RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create(); + RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create(); String id2 = getChangeId(c2_1); pushHead(testRepo, "refs/for/master", false); @@ -89,8 +73,7 @@ public class SubmittedTogetherIT extends AbstractDaemonTest { gApi.changes() .id(id2) .submittedTogether( - EnumSet.of(ListChangesOption.CURRENT_FILES), - EnumSet.of(NON_VISIBLE_CHANGES)); + EnumSet.of(ListChangesOption.CURRENT_FILES), EnumSet.of(NON_VISIBLE_CHANGES)); assertThat(info.changes).hasSize(2); assertThat(info.changes.get(0).currentRevision).isEqualTo(c2_1.name()); assertThat(info.changes.get(1).currentRevision).isEqualTo(c1_1.name()); @@ -106,15 +89,9 @@ public class SubmittedTogetherIT extends AbstractDaemonTest { @Test public void returnsAncestors() throws Exception { // Create two commits and push. - RevCommit c1_1 = commitBuilder() - .add("a.txt", "1") - .message("subject: 1") - .create(); + RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create(); String id1 = getChangeId(c1_1); - RevCommit c2_1 = commitBuilder() - .add("b.txt", "2") - .message("subject: 2") - .create(); + RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create(); String id2 = getChangeId(c2_1); pushHead(testRepo, "refs/for/master", false); @@ -137,18 +114,12 @@ public class SubmittedTogetherIT extends AbstractDaemonTest { public void respectsWholeTopicAndAncestors() throws Exception { RevCommit initialHead = getRemoteHead(); // Create two independent commits and push. - RevCommit c1_1 = commitBuilder() - .add("a.txt", "1") - .message("subject: 1") - .create(); + RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create(); String id1 = getChangeId(c1_1); pushHead(testRepo, "refs/for/master/" + name("connectingTopic"), false); testRepo.reset(initialHead); - RevCommit c2_1 = commitBuilder() - .add("b.txt", "2") - .message("subject: 2") - .create(); + RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create(); String id2 = getChangeId(c2_1); pushHead(testRepo, "refs/for/master/" + name("connectingTopic"), false); @@ -195,9 +166,8 @@ public class SubmittedTogetherIT extends AbstractDaemonTest { pushHead(testRepo, "refs/drafts/master/" + name("topic"), false); setApiUser(user); - SubmittedTogetherInfo result = gApi.changes() - .id(id1) - .submittedTogether(EnumSet.of(NON_VISIBLE_CHANGES)); + SubmittedTogetherInfo result = + gApi.changes().id(id1).submittedTogether(EnumSet.of(NON_VISIBLE_CHANGES)); if (isSubmitWholeTopicEnabled()) { assertThat(result.changes).hasSize(1); @@ -223,8 +193,7 @@ public class SubmittedTogetherIT extends AbstractDaemonTest { setApiUser(user); if (isSubmitWholeTopicEnabled()) { exception.expect(AuthException.class); - exception.expectMessage( - "change would be submitted with a change that you cannot see"); + exception.expectMessage("change would be submitted with a change that you cannot see"); gApi.changes().id(id1).submittedTogether(); } else { List result = gApi.changes().id(id1).submittedTogether(); @@ -286,9 +255,8 @@ public class SubmittedTogetherIT extends AbstractDaemonTest { String id = getChangeId(change); setApiUser(user); - SubmittedTogetherInfo result = gApi.changes() - .id(id) - .submittedTogether(EnumSet.of(NON_VISIBLE_CHANGES)); + SubmittedTogetherInfo result = + gApi.changes().id(id).submittedTogether(EnumSet.of(NON_VISIBLE_CHANGES)); if (isSubmitWholeTopicEnabled()) { assertThat(result.changes).hasSize(1); assertThat(result.changes.get(0).changeId).isEqualTo(id); @@ -303,25 +271,16 @@ public class SubmittedTogetherIT extends AbstractDaemonTest { public void topicChaining() throws Exception { RevCommit initialHead = getRemoteHead(); // Create two independent commits and push. - RevCommit c1_1 = commitBuilder() - .add("a.txt", "1") - .message("subject: 1") - .create(); + RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create(); String id1 = getChangeId(c1_1); pushHead(testRepo, "refs/for/master/" + name("connectingTopic"), false); testRepo.reset(initialHead); - RevCommit c2_1 = commitBuilder() - .add("b.txt", "2") - .message("subject: 2") - .create(); + RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create(); String id2 = getChangeId(c2_1); pushHead(testRepo, "refs/for/master/" + name("connectingTopic"), false); - RevCommit c3_1 = commitBuilder() - .add("b.txt", "2") - .message("subject: 2") - .create(); + RevCommit c3_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create(); String id3 = getChangeId(c3_1); pushHead(testRepo, "refs/for/master/" + name("unrelated-topic"), false); @@ -341,17 +300,25 @@ public class SubmittedTogetherIT extends AbstractDaemonTest { Project.NameKey p1 = createProject("a-new-project", null, false); TestRepository repo1 = cloneProject(p1); - RevCommit c1 = repo1.branch("HEAD").commit().insertChangeId() - .add("a.txt", "1") - .message("subject: 1") - .create(); + RevCommit c1 = + repo1 + .branch("HEAD") + .commit() + .insertChangeId() + .add("a.txt", "1") + .message("subject: 1") + .create(); String id1 = GitUtil.getChangeId(repo1, c1).get(); pushHead(repo1, "refs/for/master", false); - RevCommit c2 = repo1.branch("HEAD").commit().insertChangeId() - .add("b.txt", "2") - .message("subject: 2") - .create(); + RevCommit c2 = + repo1 + .branch("HEAD") + .commit() + .insertChangeId() + .add("b.txt", "2") + .message("subject: 2") + .create(); String id2 = GitUtil.getChangeId(repo1, c2).get(); pushHead(repo1, "refs/for/master", false); assertSubmittedTogether(id1); @@ -362,15 +329,9 @@ public class SubmittedTogetherIT extends AbstractDaemonTest { @TestProjectInput(submitType = SubmitType.CHERRY_PICK) public void testCherryPickWithoutAncestors() throws Exception { // Create two commits and push. - RevCommit c1_1 = commitBuilder() - .add("a.txt", "1") - .message("subject: 1") - .create(); + RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create(); String id1 = getChangeId(c1_1); - RevCommit c2_1 = commitBuilder() - .add("b.txt", "2") - .message("subject: 2") - .create(); + RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create(); String id2 = getChangeId(c2_1); pushHead(testRepo, "refs/for/master", false); @@ -381,15 +342,9 @@ public class SubmittedTogetherIT extends AbstractDaemonTest { @Test public void submissionIdSavedOnMergeInOneProject() throws Exception { // Create two commits and push. - RevCommit c1_1 = commitBuilder() - .add("a.txt", "1") - .message("subject: 1") - .create(); + RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create(); String id1 = getChangeId(c1_1); - RevCommit c2_1 = commitBuilder() - .add("b.txt", "2") - .message("subject: 2") - .create(); + RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create(); String id2 = getChangeId(c2_1); pushHead(testRepo, "refs/for/master", false); @@ -414,17 +369,10 @@ public class SubmittedTogetherIT extends AbstractDaemonTest { } private void submit(String changeId) throws Exception { - gApi.changes() - .id(changeId) - .current() - .submit(); + gApi.changes().id(changeId).current().submit(); } private void assertMerged(String changeId) throws Exception { - assertThat(gApi - .changes() - .id(changeId) - .get() - .status).isEqualTo(ChangeStatus.MERGED); + assertThat(gApi.changes().id(changeId).get().status).isEqualTo(ChangeStatus.MERGED); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/event/CommentAddedEventIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/event/CommentAddedEventIT.java index 8293bf9a76..56c55e44de 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/event/CommentAddedEventIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/event/CommentAddedEventIT.java @@ -35,7 +35,6 @@ import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gerrit.server.git.ProjectConfig; import com.google.gerrit.server.project.Util; import com.google.inject.Inject; - import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -43,17 +42,13 @@ import org.junit.Test; @NoHttpd public class CommentAddedEventIT extends AbstractDaemonTest { - @Inject - private DynamicSet source; + @Inject private DynamicSet source; - private final LabelType label = category("CustomLabel", - value(1, "Positive"), - value(0, "No score"), - value(-1, "Negative")); + private final LabelType label = + category("CustomLabel", value(1, "Positive"), value(0, "No score"), value(-1, "Negative")); - private final LabelType pLabel = category("CustomLabel2", - value(1, "Positive"), - value(0, "No score")); + private final LabelType pLabel = + category("CustomLabel2", value(1, "Positive"), value(0, "No score")); private RegistrationHandle eventListenerRegistration; private CommentAddedListener.Event lastCommentAddedEvent; @@ -61,20 +56,19 @@ public class CommentAddedEventIT extends AbstractDaemonTest { @Before public void setUp() throws Exception { ProjectConfig cfg = projectCache.checkedGet(project).getConfig(); - AccountGroup.UUID anonymousUsers = - systemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID(); - Util.allow(cfg, Permission.forLabel(label.getName()), -1, 1, anonymousUsers, - "refs/heads/*"); - Util.allow(cfg, Permission.forLabel(pLabel.getName()), 0, 1, anonymousUsers, - "refs/heads/*"); + AccountGroup.UUID anonymousUsers = systemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID(); + Util.allow(cfg, Permission.forLabel(label.getName()), -1, 1, anonymousUsers, "refs/heads/*"); + Util.allow(cfg, Permission.forLabel(pLabel.getName()), 0, 1, anonymousUsers, "refs/heads/*"); saveProjectConfig(project, cfg); - eventListenerRegistration = source.add(new CommentAddedListener() { - @Override - public void onCommentAdded(Event event) { - lastCommentAddedEvent = event; - } - }); + eventListenerRegistration = + source.add( + new CommentAddedListener() { + @Override + public void onCommentAdded(Event event) { + lastCommentAddedEvent = event; + } + }); } @After @@ -94,8 +88,7 @@ public class CommentAddedEventIT extends AbstractDaemonTest { */ private ApprovalValues getApprovalValues(LabelType label) { ApprovalValues res = new ApprovalValues(); - ApprovalInfo info = - lastCommentAddedEvent.getApprovals().get(label.getName()); + ApprovalInfo info = lastCommentAddedEvent.getApprovals().get(label.getName()); if (info != null) { res.value = info.value; } @@ -112,14 +105,13 @@ public class CommentAddedEventIT extends AbstractDaemonTest { // push a new change with -1 vote PushOneCommit.Result r = createChange(); - ReviewInput reviewInput = new ReviewInput().label( - label.getName(), (short)-1); + ReviewInput reviewInput = new ReviewInput().label(label.getName(), (short) -1); revision(r).review(reviewInput); ApprovalValues attr = getApprovalValues(label); assertThat(attr.oldValue).isEqualTo(0); assertThat(attr.value).isEqualTo(-1); - assertThat(lastCommentAddedEvent.getComment()).isEqualTo( - String.format("Patch Set 1: %s-1", label.getName())); + assertThat(lastCommentAddedEvent.getComment()) + .isEqualTo(String.format("Patch Set 1: %s-1", label.getName())); } @Test @@ -134,14 +126,13 @@ public class CommentAddedEventIT extends AbstractDaemonTest { // push a new revision with +1 vote ChangeInfo c = get(r.getChangeId()); r = amendChange(c.changeId); - reviewInput = new ReviewInput().label( - label.getName(), (short)1); + reviewInput = new ReviewInput().label(label.getName(), (short) 1); revision(r).review(reviewInput); ApprovalValues attr = getApprovalValues(label); assertThat(attr.oldValue).isEqualTo(0); assertThat(attr.value).isEqualTo(1); - assertThat(lastCommentAddedEvent.getComment()).isEqualTo( - String.format("Patch Set 2: %s+1", label.getName())); + assertThat(lastCommentAddedEvent.getComment()) + .isEqualTo(String.format("Patch Set 2: %s+1", label.getName())); } @Test @@ -158,8 +149,8 @@ public class CommentAddedEventIT extends AbstractDaemonTest { ApprovalValues attr = getApprovalValues(label); assertThat(attr.oldValue).isNull(); assertThat(attr.value).isEqualTo(0); - assertThat(lastCommentAddedEvent.getComment()).isEqualTo( - String.format("Patch Set 1:\n\n%s", label.getName())); + assertThat(lastCommentAddedEvent.getComment()) + .isEqualTo(String.format("Patch Set 1:\n\n%s", label.getName())); // transition from un-voted to -1 vote reviewInput = new ReviewInput().label(label.getName(), -1); @@ -167,8 +158,8 @@ public class CommentAddedEventIT extends AbstractDaemonTest { attr = getApprovalValues(label); assertThat(attr.oldValue).isEqualTo(0); assertThat(attr.value).isEqualTo(-1); - assertThat(lastCommentAddedEvent.getComment()).isEqualTo( - String.format("Patch Set 1: %s-1", label.getName())); + assertThat(lastCommentAddedEvent.getComment()) + .isEqualTo(String.format("Patch Set 1: %s-1", label.getName())); // transition vote from -1 to 0 reviewInput = new ReviewInput().label(label.getName(), 0); @@ -176,8 +167,8 @@ public class CommentAddedEventIT extends AbstractDaemonTest { attr = getApprovalValues(label); assertThat(attr.oldValue).isEqualTo(-1); assertThat(attr.value).isEqualTo(0); - assertThat(lastCommentAddedEvent.getComment()).isEqualTo( - String.format("Patch Set 1: -%s", label.getName())); + assertThat(lastCommentAddedEvent.getComment()) + .isEqualTo(String.format("Patch Set 1: -%s", label.getName())); // transition vote from 0 to 1 reviewInput = new ReviewInput().label(label.getName(), 1); @@ -185,8 +176,8 @@ public class CommentAddedEventIT extends AbstractDaemonTest { attr = getApprovalValues(label); assertThat(attr.oldValue).isEqualTo(0); assertThat(attr.value).isEqualTo(1); - assertThat(lastCommentAddedEvent.getComment()).isEqualTo( - String.format("Patch Set 1: %s+1", label.getName())); + assertThat(lastCommentAddedEvent.getComment()) + .isEqualTo(String.format("Patch Set 1: %s+1", label.getName())); // transition vote from 1 to -1 reviewInput = new ReviewInput().label(label.getName(), -1); @@ -194,17 +185,17 @@ public class CommentAddedEventIT extends AbstractDaemonTest { attr = getApprovalValues(label); assertThat(attr.oldValue).isEqualTo(1); assertThat(attr.value).isEqualTo(-1); - assertThat(lastCommentAddedEvent.getComment()).isEqualTo( - String.format("Patch Set 1: %s-1", label.getName())); + assertThat(lastCommentAddedEvent.getComment()) + .isEqualTo(String.format("Patch Set 1: %s-1", label.getName())); // review with message only, do not apply votes reviewInput = new ReviewInput().message(label.getName()); revision(r).review(reviewInput); attr = getApprovalValues(label); - assertThat(attr.oldValue).isNull(); // no vote change so not included + assertThat(attr.oldValue).isNull(); // no vote change so not included assertThat(attr.value).isEqualTo(-1); - assertThat(lastCommentAddedEvent.getComment()).isEqualTo( - String.format("Patch Set 1:\n\n%s", label.getName())); + assertThat(lastCommentAddedEvent.getComment()) + .isEqualTo(String.format("Patch Set 1:\n\n%s", label.getName())); } @Test @@ -221,9 +212,8 @@ public class CommentAddedEventIT extends AbstractDaemonTest { ApprovalValues labelAttr = getApprovalValues(label); assertThat(labelAttr.oldValue).isEqualTo(0); assertThat(labelAttr.value).isEqualTo(-1); - assertThat(lastCommentAddedEvent.getComment()).isEqualTo( - String.format("Patch Set 1: %s-1\n\n%s", - label.getName(), label.getName())); + assertThat(lastCommentAddedEvent.getComment()) + .isEqualTo(String.format("Patch Set 1: %s-1\n\n%s", label.getName(), label.getName())); // there should be 3 approval labels (label, pLabel, and CRVV) assertThat(lastCommentAddedEvent.getApprovals()).hasSize(3); @@ -249,9 +239,8 @@ public class CommentAddedEventIT extends AbstractDaemonTest { pLabelAttr = getApprovalValues(pLabel); assertThat(pLabelAttr.oldValue).isEqualTo(0); assertThat(pLabelAttr.value).isEqualTo(1); - assertThat(lastCommentAddedEvent.getComment()).isEqualTo( - String.format("Patch Set 1: %s+1\n\n%s", - pLabel.getName(), pLabel.getName())); + assertThat(lastCommentAddedEvent.getComment()) + .isEqualTo(String.format("Patch Set 1: %s+1\n\n%s", pLabel.getName(), pLabel.getName())); // check the approvals that were not voted on labelAttr = getApprovalValues(label); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/MailIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/MailIT.java index 8d93bbfc9e..55386f4899 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/MailIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/MailIT.java @@ -21,20 +21,17 @@ import com.google.gerrit.acceptance.NoHttpd; import com.google.gerrit.server.mail.receive.MailReceiver; import com.google.gerrit.testutil.ConfigSuite; import com.google.inject.Inject; - import com.icegreen.greenmail.junit.GreenMailRule; import com.icegreen.greenmail.user.GreenMailUser; import com.icegreen.greenmail.util.GreenMail; import com.icegreen.greenmail.util.GreenMailUtil; import com.icegreen.greenmail.util.ServerSetupTest; - +import javax.mail.internet.MimeMessage; import org.eclipse.jgit.lib.Config; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import javax.mail.internet.MimeMessage; - @NoHttpd @RunWith(ConfigSuite.class) public class MailIT extends AbstractDaemonTest { @@ -43,15 +40,12 @@ public class MailIT extends AbstractDaemonTest { private static final String USERNAME = "user@domain.com"; private static final String PASSWORD = "password"; - @Inject - private MailReceiver mailReceiver; + @Inject private MailReceiver mailReceiver; - @Inject - private GreenMail greenMail; + @Inject private GreenMail greenMail; @Rule - public final GreenMailRule mockPop3Server = new GreenMailRule( - ServerSetupTest.SMTP_POP3_IMAP); + public final GreenMailRule mockPop3Server = new GreenMailRule(ServerSetupTest.SMTP_POP3_IMAP); @ConfigSuite.Default public static Config pop3Config() { @@ -87,8 +81,7 @@ public class MailIT extends AbstractDaemonTest { // Check that the message is still present assertThat(mockPop3Server.getReceivedMessages().length).isEqualTo(1); // Mark the message for deletion - mailReceiver.requestDeletion( - mockPop3Server.getReceivedMessages()[0].getMessageID()); + mailReceiver.requestDeletion(mockPop3Server.getReceivedMessages()[0].getMessageID()); // Let Gerrit handle emails mailReceiver.handleEmails(false); // Check that the message was deleted @@ -96,9 +89,7 @@ public class MailIT extends AbstractDaemonTest { } private MimeMessage createSimpleMessage() { - return GreenMailUtil - .createTextEmail(USERNAME, "from@localhost.com", "subject", - "body", - greenMail.getImap().getServerSetup()); + return GreenMailUtil.createTextEmail( + USERNAME, "from@localhost.com", "subject", "body", greenMail.getImap().getServerSetup()); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/MailMetadataIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/MailMetadataIT.java index 7d59fb1ea3..ada222aac3 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/MailMetadataIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/MailMetadataIT.java @@ -26,11 +26,6 @@ import com.google.gerrit.server.mail.MailUtil; import com.google.gerrit.server.mail.send.EmailHeader; import com.google.gerrit.testutil.FakeEmailSender; import com.google.gerrit.testutil.TestTimeUtil; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - import java.sql.Timestamp; import java.time.ZoneId; import java.time.ZonedDateTime; @@ -39,6 +34,9 @@ import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; /** Tests the presence of required metadata in email headers, text and html. */ public class MailMetadataIT extends AbstractDaemonTest { @@ -59,16 +57,13 @@ public class MailMetadataIT extends AbstractDaemonTest { @Test public void metadataOnNewChange() throws Exception { PushOneCommit.Result newChange = createChange(); - gApi.changes() - .id(newChange.getChangeId()) - .addReviewer(user.getId().toString()); + gApi.changes().id(newChange.getChangeId()).addReviewer(user.getId().toString()); List emails = sender.getMessages(); assertThat(emails).hasSize(1); FakeEmailSender.Message message = emails.get(0); - String changeURL = "<" + canonicalWebUrl.get() + - newChange.getChange().getId().get() + ">"; + String changeURL = "<" + canonicalWebUrl.get() + newChange.getChange().getId().get() + ">"; Map expectedHeaders = new HashMap<>(); expectedHeaders.put("Gerrit-PatchSet", "1"); @@ -88,9 +83,7 @@ public class MailMetadataIT extends AbstractDaemonTest { @Test public void metadataOnNewComment() throws Exception { PushOneCommit.Result newChange = createChange(); - gApi.changes() - .id(newChange.getChangeId()) - .addReviewer(user.getId().toString()); + gApi.changes().id(newChange.getChangeId()).addReviewer(user.getId().toString()); sender.clear(); // Review change @@ -106,17 +99,14 @@ public class MailMetadataIT extends AbstractDaemonTest { assertThat(emails).hasSize(1); FakeEmailSender.Message message = emails.get(0); - String changeURL = "<" + canonicalWebUrl.get() + - newChange.getChange().getId().get() + ">"; + String changeURL = "<" + canonicalWebUrl.get() + newChange.getChange().getId().get() + ">"; Map expectedHeaders = new HashMap<>(); expectedHeaders.put("Gerrit-PatchSet", "1"); expectedHeaders.put("Gerrit-Change-Id", newChange.getChangeId()); expectedHeaders.put("Gerrit-MessageType", "comment"); - expectedHeaders.put("Gerrit-Commit", - newChange.getCommit().getId().name()); + expectedHeaders.put("Gerrit-Commit", newChange.getCommit().getId().name()); expectedHeaders.put("Gerrit-ChangeURL", changeURL); - expectedHeaders.put("Gerrit-Comment-Date", - Iterables.getLast(result).date); + expectedHeaders.put("Gerrit-Comment-Date", Iterables.getLast(result).date); assertHeaders(message.headers(), expectedHeaders); @@ -126,39 +116,44 @@ public class MailMetadataIT extends AbstractDaemonTest { assertTextFooter(message.body(), expectedHeaders); } - private static void assertHeaders(Map have, - Map want) throws Exception { + private static void assertHeaders(Map have, Map want) + throws Exception { for (Map.Entry entry : want.entrySet()) { if (entry.getValue() instanceof String) { - assertThat(have).containsEntry("X-" + entry.getKey(), - new EmailHeader.String((String) entry.getValue())); + assertThat(have) + .containsEntry( + "X-" + entry.getKey(), new EmailHeader.String((String) entry.getValue())); } else if (entry.getValue() instanceof Date) { - assertThat(have).containsEntry("X-" + entry.getKey(), - new EmailHeader.Date((Date) entry.getValue())); + assertThat(have) + .containsEntry("X-" + entry.getKey(), new EmailHeader.Date((Date) entry.getValue())); } else { - throw new Exception("Object has unsupported type: " + - entry.getValue().getClass().getName() + - " must be java.util.Date or java.lang.String for key " + - entry.getKey()); + throw new Exception( + "Object has unsupported type: " + + entry.getValue().getClass().getName() + + " must be java.util.Date or java.lang.String for key " + + entry.getKey()); } } } - private static void assertTextFooter(String body, - Map want) throws Exception { + private static void assertTextFooter(String body, Map want) throws Exception { for (Map.Entry entry : want.entrySet()) { if (entry.getValue() instanceof String) { assertThat(body).contains(entry.getKey() + ": " + entry.getValue()); } else if (entry.getValue() instanceof Timestamp) { - assertThat(body).contains(entry.getKey() + ": " + - MailUtil.rfcDateformatter.format(ZonedDateTime.ofInstant( - ((Timestamp) entry.getValue()).toInstant(), - ZoneId.of("UTC")))); + assertThat(body) + .contains( + entry.getKey() + + ": " + + MailUtil.rfcDateformatter.format( + ZonedDateTime.ofInstant( + ((Timestamp) entry.getValue()).toInstant(), ZoneId.of("UTC")))); } else { - throw new Exception("Object has unsupported type: " + - entry.getValue().getClass().getName() + - " must be java.util.Date or java.lang.String for key " + - entry.getKey()); + throw new Exception( + "Object has unsupported type: " + + entry.getValue().getClass().getName() + + " must be java.util.Date or java.lang.String for key " + + entry.getKey()); } } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/MailProcessorIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/MailProcessorIT.java index 0f6f3dbb09..c62839efa4 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/MailProcessorIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/MailProcessorIT.java @@ -32,111 +32,108 @@ import com.google.gerrit.server.mail.MailUtil; import com.google.gerrit.server.mail.receive.MailMessage; import com.google.gerrit.server.mail.receive.MailProcessor; import com.google.inject.Inject; - -import org.joda.time.DateTime; -import org.junit.Test; - import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.Collection; import java.util.HashMap; import java.util.List; +import org.joda.time.DateTime; +import org.junit.Test; public class MailProcessorIT extends AbstractDaemonTest { - @Inject - private MailProcessor mailProcessor; + @Inject private MailProcessor mailProcessor; @Test public void parseAndPersistChangeMessage() throws Exception { String changeId = createChangeWithReview(); ChangeInfo changeInfo = gApi.changes().id(changeId).get(); - List comments = gApi.changes().id(changeId) - .current().commentsAsList(); - String ts = MailUtil.rfcDateformatter.format(ZonedDateTime.ofInstant( - comments.get(0).updated.toInstant(), - ZoneId.of("UTC"))); + List comments = gApi.changes().id(changeId).current().commentsAsList(); + String ts = + MailUtil.rfcDateformatter.format( + ZonedDateTime.ofInstant(comments.get(0).updated.toInstant(), ZoneId.of("UTC"))); // Build Message MailMessage.Builder b = messageBuilderWithDefaultFields(); - String txt = newPlaintextBody(canonicalWebUrl.get() + "#/c/" + - changeInfo._number + "/1", "Test Message", null, null, null); + String txt = + newPlaintextBody( + canonicalWebUrl.get() + "#/c/" + changeInfo._number + "/1", + "Test Message", + null, + null, + null); b.textContent(txt + textFooterForChange(changeId, ts)); mailProcessor.process(b.build()); - Collection messages = - gApi.changes().id(changeId).get().messages; + Collection messages = gApi.changes().id(changeId).get().messages; assertThat(messages).hasSize(3); - assertThat(Iterables.getLast(messages).message) - .isEqualTo("Patch Set 1:\nTest Message"); - assertThat(Iterables.getLast(messages).tag) - .isEqualTo("mailMessageId=some id"); + assertThat(Iterables.getLast(messages).message).isEqualTo("Patch Set 1:\nTest Message"); + assertThat(Iterables.getLast(messages).tag).isEqualTo("mailMessageId=some id"); } @Test public void parseAndPersistInlineComment() throws Exception { String changeId = createChangeWithReview(); ChangeInfo changeInfo = gApi.changes().id(changeId).get(); - List comments = gApi.changes().id(changeId) - .current().commentsAsList(); - String ts = MailUtil.rfcDateformatter.format(ZonedDateTime.ofInstant( - comments.get(0).updated.toInstant(), - ZoneId.of("UTC"))); + List comments = gApi.changes().id(changeId).current().commentsAsList(); + String ts = + MailUtil.rfcDateformatter.format( + ZonedDateTime.ofInstant(comments.get(0).updated.toInstant(), ZoneId.of("UTC"))); // Build Message MailMessage.Builder b = messageBuilderWithDefaultFields(); - String txt = newPlaintextBody(canonicalWebUrl.get() + "#/c/" + - changeInfo._number + "/1", null, "Some Inline Comment", null, null); + String txt = + newPlaintextBody( + canonicalWebUrl.get() + "#/c/" + changeInfo._number + "/1", + null, + "Some Inline Comment", + null, + null); b.textContent(txt + textFooterForChange(changeId, ts)); mailProcessor.process(b.build()); // Assert messages - Collection messages = - gApi.changes().id(changeId).get().messages; + Collection messages = gApi.changes().id(changeId).get().messages; assertThat(messages).hasSize(3); - assertThat(Iterables.getLast(messages).message) - .isEqualTo("Patch Set 1:\n(1 comment)"); - assertThat(Iterables.getLast(messages).tag) - .isEqualTo("mailMessageId=some id"); + assertThat(Iterables.getLast(messages).message).isEqualTo("Patch Set 1:\n(1 comment)"); + assertThat(Iterables.getLast(messages).tag).isEqualTo("mailMessageId=some id"); // Assert comment comments = gApi.changes().id(changeId).current().commentsAsList(); assertThat(comments).hasSize(3); - assertThat(comments.get(2).message) - .isEqualTo("Some Inline Comment"); - assertThat(comments.get(2).tag) - .isEqualTo("mailMessageId=some id"); - assertThat(comments.get(2).inReplyTo) - .isEqualTo(comments.get(1).id); + assertThat(comments.get(2).message).isEqualTo("Some Inline Comment"); + assertThat(comments.get(2).tag).isEqualTo("mailMessageId=some id"); + assertThat(comments.get(2).inReplyTo).isEqualTo(comments.get(1).id); } @Test public void parseAndPersistFileComment() throws Exception { String changeId = createChangeWithReview(); ChangeInfo changeInfo = gApi.changes().id(changeId).get(); - List comments = gApi.changes().id(changeId) - .current().commentsAsList(); - String ts = MailUtil.rfcDateformatter.format(ZonedDateTime.ofInstant( - comments.get(0).updated.toInstant(), - ZoneId.of("UTC"))); + List comments = gApi.changes().id(changeId).current().commentsAsList(); + String ts = + MailUtil.rfcDateformatter.format( + ZonedDateTime.ofInstant(comments.get(0).updated.toInstant(), ZoneId.of("UTC"))); // Build Message MailMessage.Builder b = messageBuilderWithDefaultFields(); - String txt = newPlaintextBody(canonicalWebUrl.get() + "#/c/" + - changeInfo._number + "/1", null, null, "Some Comment on File 1", null); + String txt = + newPlaintextBody( + canonicalWebUrl.get() + "#/c/" + changeInfo._number + "/1", + null, + null, + "Some Comment on File 1", + null); b.textContent(txt + textFooterForChange(changeId, ts)); mailProcessor.process(b.build()); // Assert messages - Collection messages = - gApi.changes().id(changeId).get().messages; + Collection messages = gApi.changes().id(changeId).get().messages; assertThat(messages).hasSize(3); - assertThat(Iterables.getLast(messages).message) - .isEqualTo("Patch Set 1:\n(1 comment)"); - assertThat(Iterables.getLast(messages).tag) - .isEqualTo("mailMessageId=some id"); + assertThat(Iterables.getLast(messages).message).isEqualTo("Patch Set 1:\n(1 comment)"); + assertThat(Iterables.getLast(messages).tag).isEqualTo("mailMessageId=some id"); // Assert comment comments = gApi.changes().id(changeId).current().commentsAsList(); @@ -151,16 +148,20 @@ public class MailProcessorIT extends AbstractDaemonTest { public void parseAndPersistMessageTwice() throws Exception { String changeId = createChangeWithReview(); ChangeInfo changeInfo = gApi.changes().id(changeId).get(); - List comments = gApi.changes().id(changeId) - .current().commentsAsList(); - String ts = MailUtil.rfcDateformatter.format(ZonedDateTime.ofInstant( - comments.get(0).updated.toInstant(), - ZoneId.of("UTC"))); + List comments = gApi.changes().id(changeId).current().commentsAsList(); + String ts = + MailUtil.rfcDateformatter.format( + ZonedDateTime.ofInstant(comments.get(0).updated.toInstant(), ZoneId.of("UTC"))); // Build Message MailMessage.Builder b = messageBuilderWithDefaultFields(); - String txt = newPlaintextBody(canonicalWebUrl.get() + "#/c/" + - changeInfo._number + "/1", null, "Some Inline Comment", null, null); + String txt = + newPlaintextBody( + canonicalWebUrl.get() + "#/c/" + changeInfo._number + "/1", + null, + "Some Inline Comment", + null, + null); b.textContent(txt + textFooterForChange(changeId, ts)); mailProcessor.process(b.build()); @@ -177,17 +178,21 @@ public class MailProcessorIT extends AbstractDaemonTest { public void parseAndPersistMessageFromInactiveAccount() throws Exception { String changeId = createChangeWithReview(); ChangeInfo changeInfo = gApi.changes().id(changeId).get(); - List comments = gApi.changes().id(changeId) - .current().commentsAsList(); - String ts = MailUtil.rfcDateformatter.format(ZonedDateTime.ofInstant( - comments.get(0).updated.toInstant(), - ZoneId.of("UTC"))); + List comments = gApi.changes().id(changeId).current().commentsAsList(); + String ts = + MailUtil.rfcDateformatter.format( + ZonedDateTime.ofInstant(comments.get(0).updated.toInstant(), ZoneId.of("UTC"))); assertThat(comments).hasSize(2); // Build Message MailMessage.Builder b = messageBuilderWithDefaultFields(); - String txt = newPlaintextBody(canonicalWebUrl.get() + "#/c/" + - changeInfo._number + "/1", null, "Some Inline Comment", null, null); + String txt = + newPlaintextBody( + canonicalWebUrl.get() + "#/c/" + changeInfo._number + "/1", + null, + "Some Inline Comment", + null, + null); b.textContent(txt + textFooterForChange(changeId, ts)); // Set account state to inactive @@ -203,8 +208,7 @@ public class MailProcessorIT extends AbstractDaemonTest { gApi.accounts().id("user").setActive(true); } - private static CommentInput newComment(String path, Side side, int line, - String message) { + private static CommentInput newComment(String path, Side side, int line, String message) { CommentInput c = new CommentInput(); c.path = path; c.side = side; @@ -230,46 +234,58 @@ public class MailProcessorIT extends AbstractDaemonTest { * @param fc1 Comment in reply to a comment of file 1. * @return A string with all inline comments and the original quoted email. */ - private static String newPlaintextBody(String changeURL, String changeMessage, - String c1, String f1, String fc1) { - return (changeMessage == null ? "" : changeMessage + "\n") + - "> Foo Bar has posted comments on this change. ( \n" + - "> " + changeURL +" )\n" + - "> \n" + - "> Change subject: Test change\n" + - "> ...............................................................\n" + - "> \n" + - "> \n" + - "> Patch Set 1: Code-Review+1\n" + - "> \n" + - "> (3 comments)\n" + - "> \n" + - "> " + changeURL + "/gerrit-server/test.txt\n" + - "> File \n" + - "> gerrit-server/test.txt:\n" + - (f1 == null ? "" : f1 + "\n") + - "> \n" + - "> Patch Set #4:\n" + - "> " + changeURL + "/gerrit-server/test.txt\n" + - "> \n" + - "> Some comment" + - "> \n" + - (fc1 == null ? "" : fc1 + "\n") + - "> " + changeURL + "/gerrit-server/test.txt@2\n" + - "> PS1, Line 2: throw new Exception(\"Object has unsupported: \" +\n" + - "> : entry.getValue() +\n" + - "> : \" must be java.util.Date\");\n" + - "> Should entry.getKey() be included in this message?\n" + - "> \n" + - (c1 == null ? "" : c1 + "\n") + - "> \n"; + private static String newPlaintextBody( + String changeURL, String changeMessage, String c1, String f1, String fc1) { + return (changeMessage == null ? "" : changeMessage + "\n") + + "> Foo Bar has posted comments on this change. ( \n" + + "> " + + changeURL + + " )\n" + + "> \n" + + "> Change subject: Test change\n" + + "> ...............................................................\n" + + "> \n" + + "> \n" + + "> Patch Set 1: Code-Review+1\n" + + "> \n" + + "> (3 comments)\n" + + "> \n" + + "> " + + changeURL + + "/gerrit-server/test.txt\n" + + "> File \n" + + "> gerrit-server/test.txt:\n" + + (f1 == null ? "" : f1 + "\n") + + "> \n" + + "> Patch Set #4:\n" + + "> " + + changeURL + + "/gerrit-server/test.txt\n" + + "> \n" + + "> Some comment" + + "> \n" + + (fc1 == null ? "" : fc1 + "\n") + + "> " + + changeURL + + "/gerrit-server/test.txt@2\n" + + "> PS1, Line 2: throw new Exception(\"Object has unsupported: \" +\n" + + "> : entry.getValue() +\n" + + "> : \" must be java.util.Date\");\n" + + "> Should entry.getKey() be included in this message?\n" + + "> \n" + + (c1 == null ? "" : c1 + "\n") + + "> \n"; } private static String textFooterForChange(String changeId, String timestamp) { - return "Gerrit-Change-Id: " + changeId + "\n" + - "Gerrit-PatchSet: 1\n" + - "Gerrit-MessageType: comment\n" + - "Gerrit-Comment-Date: " + timestamp + "\n"; + return "Gerrit-Change-Id: " + + changeId + + "\n" + + "Gerrit-PatchSet: 1\n" + + "Gerrit-MessageType: comment\n" + + "Gerrit-Comment-Date: " + + timestamp + + "\n"; } private MailMessage.Builder messageBuilderWithDefaultFields() { @@ -287,8 +303,8 @@ public class MailProcessorIT extends AbstractDaemonTest { // Create change String file = "gerrit-server/test.txt"; String contents = "contents \nlorem \nipsum \nlorem"; - PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo, - "first subject", file, contents); + PushOneCommit push = + pushFactory.create(db, admin.getIdent(), testRepo, "first subject", file, contents); PushOneCommit.Result r = push.to("refs/for/master"); String changeId = r.getChangeId(); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/notedb/ChangeRebuilderIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/notedb/ChangeRebuilderIT.java index 2ce3d612db..04080af1cb 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/notedb/ChangeRebuilderIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/notedb/ChangeRebuilderIT.java @@ -89,7 +89,13 @@ import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.OrmRuntimeException; import com.google.inject.Inject; import com.google.inject.Provider; - +import java.sql.Timestamp; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.TimeUnit; import org.apache.http.Header; import org.apache.http.message.BasicHeader; import org.eclipse.jgit.junit.TestRepository; @@ -103,14 +109,6 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; -import java.sql.Timestamp; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.TimeUnit; - public class ChangeRebuilderIT extends AbstractDaemonTest { @ConfigSuite.Default public static Config defaultConfig() { @@ -126,38 +124,27 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { return cfg; } - @Inject - private AllUsersName allUsers; + @Inject private AllUsersName allUsers; - @Inject - private NoteDbChecker checker; + @Inject private NoteDbChecker checker; - @Inject - private Rebuild rebuildHandler; + @Inject private Rebuild rebuildHandler; - @Inject - private Provider dbProvider; + @Inject private Provider dbProvider; - @Inject - private CommentsUtil commentsUtil; + @Inject private CommentsUtil commentsUtil; - @Inject - private Provider postReview; + @Inject private Provider postReview; - @Inject - private TestChangeRebuilderWrapper rebuilderWrapper; + @Inject private TestChangeRebuilderWrapper rebuilderWrapper; - @Inject - private BatchUpdate.Factory batchUpdateFactory; + @Inject private BatchUpdate.Factory batchUpdateFactory; - @Inject - private Sequences seq; + @Inject private Sequences seq; - @Inject - private ChangeBundleReader bundleReader; + @Inject private ChangeBundleReader bundleReader; - @Inject - private PatchSetInfoFactory patchSetInfoFactory; + @Inject private PatchSetInfoFactory patchSetInfoFactory; @Before public void setUp() throws Exception { @@ -172,8 +159,7 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { } @SuppressWarnings("deprecation") - private void setNotesMigration(boolean writeChanges, boolean readChanges) - throws Exception { + private void setNotesMigration(boolean writeChanges, boolean readChanges) throws Exception { notesMigration.setWriteChanges(writeChanges); notesMigration.setReadChanges(readChanges); db = atrScope.reopenDb().getReviewDbProvider().get(); @@ -228,9 +214,9 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { Change c = TestChanges.newChange(project, user.getId(), seq.nextChangeId()); c.setCreatedOn(ts); c.setLastUpdatedOn(ts); - PatchSet ps = TestChanges.newPatchSet( - c.currentPatchSetId(), "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef", - user.getId()); + PatchSet ps = + TestChanges.newPatchSet( + c.currentPatchSetId(), "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef", user.getId()); ps.setCreatedOn(ts); db.changes().insert(Collections.singleton(c)); db.patchSets().insert(Collections.singleton(ps)); @@ -272,8 +258,7 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { Change.Id id = psId.getParentKey(); // Events need to be otherwise identical for the account ID to be compared. - ChangeMessage msg1 = - insertMessage(id, psId, user.getId(), TimeUtil.nowTs(), "message 1"); + ChangeMessage msg1 = insertMessage(id, psId, user.getId(), TimeUtil.nowTs(), "message 1"); insertMessage(id, psId, null, msg1.getWrittenOn(), "message 2"); checker.rebuildAndCheckChanges(id); @@ -286,14 +271,12 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { Change.Id id = psId1.getParentKey(); // Events need to be otherwise identical for the PatchSet.ID to be compared. - ChangeMessage msg1 = - insertMessage(id, null, user.getId(), TimeUtil.nowTs(), "message 1"); + ChangeMessage msg1 = insertMessage(id, null, user.getId(), TimeUtil.nowTs(), "message 1"); insertMessage(id, null, user.getId(), msg1.getWrittenOn(), "message 2"); PatchSet.Id psId2 = amendChange(r.getChangeId()).getPatchSetId(); - ChangeMessage msg3 = - insertMessage(id, null, user.getId(), TimeUtil.nowTs(), "message 3"); + ChangeMessage msg3 = insertMessage(id, null, user.getId(), TimeUtil.nowTs(), "message 3"); insertMessage(id, null, user.getId(), msg3.getWrittenOn(), "message 4"); checker.rebuildAndCheckChanges(id); @@ -339,9 +322,7 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { public void restApiNotFoundWhenNoteDbDisabled() throws Exception { PushOneCommit.Result r = createChange(); exception.expect(ResourceNotFoundException.class); - rebuildHandler.apply( - parseChangeResource(r.getChangeId()), - new Rebuild.Input()); + rebuildHandler.apply(parseChangeResource(r.getChangeId()), new Rebuild.Input()); } @Test @@ -351,9 +332,7 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { setNotesMigration(true, false); checker.assertNoChangeRef(project, id); - rebuildHandler.apply( - parseChangeResource(r.getChangeId()), - new Rebuild.Input()); + rebuildHandler.apply(parseChangeResource(r.getChangeId()), new Rebuild.Input()); checker.checkChanges(id); } @@ -384,32 +363,41 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { Change.Id id = r.getPatchSetId().getParentKey(); ObjectId changeMetaId = getMetaRef(project, changeMetaRef(id)); - assertThat(getUnwrappedDb().changes().get(id).getNoteDbState()).isEqualTo( - changeMetaId.name()); + assertThat(getUnwrappedDb().changes().get(id).getNoteDbState()).isEqualTo(changeMetaId.name()); putDraft(user, id, 1, "comment by user", null); - ObjectId userDraftsId = getMetaRef( - allUsers, refsDraftComments(id, user.getId())); - assertThat(getUnwrappedDb().changes().get(id).getNoteDbState()).isEqualTo( - changeMetaId.name() - + "," + user.getId() + "=" + userDraftsId.name()); + ObjectId userDraftsId = getMetaRef(allUsers, refsDraftComments(id, user.getId())); + assertThat(getUnwrappedDb().changes().get(id).getNoteDbState()) + .isEqualTo(changeMetaId.name() + "," + user.getId() + "=" + userDraftsId.name()); putDraft(admin, id, 2, "comment by admin", null); - ObjectId adminDraftsId = getMetaRef( - allUsers, refsDraftComments(id, admin.getId())); + ObjectId adminDraftsId = getMetaRef(allUsers, refsDraftComments(id, admin.getId())); assertThat(admin.getId().get()).isLessThan(user.getId().get()); - assertThat(getUnwrappedDb().changes().get(id).getNoteDbState()).isEqualTo( - changeMetaId.name() - + "," + admin.getId() + "=" + adminDraftsId.name() - + "," + user.getId() + "=" + userDraftsId.name()); + assertThat(getUnwrappedDb().changes().get(id).getNoteDbState()) + .isEqualTo( + changeMetaId.name() + + "," + + admin.getId() + + "=" + + adminDraftsId.name() + + "," + + user.getId() + + "=" + + userDraftsId.name()); putDraft(admin, id, 2, "revised comment by admin", null); - adminDraftsId = getMetaRef( - allUsers, refsDraftComments(id, admin.getId())); - assertThat(getUnwrappedDb().changes().get(id).getNoteDbState()).isEqualTo( - changeMetaId.name() - + "," + admin.getId() + "=" + adminDraftsId.name() - + "," + user.getId() + "=" + userDraftsId.name()); + adminDraftsId = getMetaRef(allUsers, refsDraftComments(id, admin.getId())); + assertThat(getUnwrappedDb().changes().get(id).getNoteDbState()) + .isEqualTo( + changeMetaId.name() + + "," + + admin.getId() + + "=" + + adminDraftsId.name() + + "," + + user.getId() + + "=" + + userDraftsId.name()); } @Test @@ -428,13 +416,12 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { // On next NoteDb read, the change is transparently rebuilt. setNotesMigration(true, true); - assertThat(gApi.changes().id(id.get()).info().topic) - .isEqualTo(name("a-topic")); + assertThat(gApi.changes().id(id.get()).info().topic).isEqualTo(name("a-topic")); assertChangeUpToDate(true, id); // Check that the bundles are equal. - ChangeBundle actual = ChangeBundle.fromNotes( - commentsUtil, notesFactory.create(dbProvider.get(), project, id)); + ChangeBundle actual = + ChangeBundle.fromNotes(commentsUtil, notesFactory.create(dbProvider.get(), project, id)); ChangeBundle expected = bundleReader.fromReviewDb(getUnwrappedDb(), id); assertThat(actual.differencesFrom(expected)).isEmpty(); } @@ -449,13 +436,11 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { // Update ReviewDb and NoteDb, then revert the corresponding NoteDb change // to simulate it failing. - NoteDbChangeState oldState = - NoteDbChangeState.parse(getUnwrappedDb().changes().get(id)); + NoteDbChangeState oldState = NoteDbChangeState.parse(getUnwrappedDb().changes().get(id)); String topic = name("a-topic"); gApi.changes().id(id.get()).topic(topic); try (Repository repo = repoManager.openRepository(project)) { - new TestRepository<>(repo) - .update(RefNames.changeMetaRef(id), oldState.getChangeMetaId()); + new TestRepository<>(repo).update(RefNames.changeMetaRef(id), oldState.getChangeMetaId()); } assertChangeUpToDate(false, id); @@ -465,21 +450,27 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { // executes. We simulate it here by using BatchUpdate directly and not going // through an API handler. final String msg = "message from BatchUpdate"; - try (BatchUpdate bu = batchUpdateFactory.create(db, project, - identifiedUserFactory.create(user.getId()), TimeUtil.nowTs())) { - bu.addOp(id, new BatchUpdate.Op() { - @Override - public boolean updateChange(ChangeContext ctx) throws OrmException { - PatchSet.Id psId = ctx.getChange().currentPatchSetId(); - ChangeMessage cm = new ChangeMessage( - new ChangeMessage.Key(id, ChangeUtil.messageUuid()), - ctx.getAccountId(), ctx.getWhen(), psId); - cm.setMessage(msg); - ctx.getDb().changeMessages().insert(Collections.singleton(cm)); - ctx.getUpdate(psId).setChangeMessage(msg); - return true; - } - }); + try (BatchUpdate bu = + batchUpdateFactory.create( + db, project, identifiedUserFactory.create(user.getId()), TimeUtil.nowTs())) { + bu.addOp( + id, + new BatchUpdate.Op() { + @Override + public boolean updateChange(ChangeContext ctx) throws OrmException { + PatchSet.Id psId = ctx.getChange().currentPatchSetId(); + ChangeMessage cm = + new ChangeMessage( + new ChangeMessage.Key(id, ChangeUtil.messageUuid()), + ctx.getAccountId(), + ctx.getWhen(), + psId); + cm.setMessage(msg); + ctx.getDb().changeMessages().insert(Collections.singleton(cm)); + ctx.getUpdate(psId).setChangeMessage(msg); + return true; + } + }); try { bu.execute(); fail("expected update to fail"); @@ -527,20 +518,18 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { // background. rebuilderWrapper.stealNextUpdate(); setNotesMigration(true, true); - assertThat(gApi.changes().id(id.get()).info().topic) - .isEqualTo(name("a-topic")); + assertThat(gApi.changes().id(id.get()).info().topic).isEqualTo(name("a-topic")); assertChangeUpToDate(true, id); // Check that the bundles are equal. - ChangeBundle actual = ChangeBundle.fromNotes( - commentsUtil, notesFactory.create(dbProvider.get(), project, id)); + ChangeBundle actual = + ChangeBundle.fromNotes(commentsUtil, notesFactory.create(dbProvider.get(), project, id)); ChangeBundle expected = bundleReader.fromReviewDb(getUnwrappedDb(), id); assertThat(actual.differencesFrom(expected)).isEmpty(); } @Test - public void rebuildReturnsCorrectResultEvenIfSavingToNoteDbFailed() - throws Exception { + public void rebuildReturnsCorrectResultEvenIfSavingToNoteDbFailed() throws Exception { setNotesMigration(true, true); PushOneCommit.Result r = createChange(); @@ -575,8 +564,7 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { } @Test - public void rebuildReturnsDraftResultWhenRebuildingInChangeNotesFails() - throws Exception { + public void rebuildReturnsDraftResultWhenRebuildingInChangeNotesFails() throws Exception { setNotesMigration(true, true); PushOneCommit.Result r = createChange(); @@ -584,24 +572,21 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { putDraft(user, id, 1, "comment by user", null); assertChangeUpToDate(true, id); - ObjectId oldMetaId = - getMetaRef(allUsers, refsDraftComments(id, user.getId())); + ObjectId oldMetaId = getMetaRef(allUsers, refsDraftComments(id, user.getId())); // Add a draft behind NoteDb's back. setNotesMigration(false, false); putDraft(user, id, 1, "second comment by user", null); setInvalidNoteDbState(id); assertDraftsUpToDate(false, id, user); - assertThat(getMetaRef(allUsers, refsDraftComments(id, user.getId()))) - .isEqualTo(oldMetaId); + assertThat(getMetaRef(allUsers, refsDraftComments(id, user.getId()))).isEqualTo(oldMetaId); // Force the next rebuild attempt to fail (in ChangeNotes). rebuilderWrapper.failNextUpdate(); setNotesMigration(true, true); ChangeNotes notes = notesFactory.create(dbProvider.get(), project, id); notes.getDraftComments(user.getId()); - assertThat(getMetaRef(allUsers, refsDraftComments(id, user.getId()))) - .isEqualTo(oldMetaId); + assertThat(getMetaRef(allUsers, refsDraftComments(id, user.getId()))).isEqualTo(oldMetaId); // Not up to date, but the actual returned state matches anyway. assertDraftsUpToDate(false, id, user); @@ -613,13 +598,11 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { notesFactory.create(dbProvider.get(), project, id); assertChangeUpToDate(true, id); assertDraftsUpToDate(true, id, user); - assertThat(getMetaRef(allUsers, refsDraftComments(id, user.getId()))) - .isNotEqualTo(oldMetaId); + assertThat(getMetaRef(allUsers, refsDraftComments(id, user.getId()))).isNotEqualTo(oldMetaId); } @Test - public void rebuildReturnsDraftResultWhenRebuildingInDraftCommentNotesFails() - throws Exception { + public void rebuildReturnsDraftResultWhenRebuildingInDraftCommentNotesFails() throws Exception { setNotesMigration(true, true); PushOneCommit.Result r = createChange(); @@ -627,8 +610,7 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { putDraft(user, id, 1, "comment by user", null); assertChangeUpToDate(true, id); - ObjectId oldMetaId = - getMetaRef(allUsers, refsDraftComments(id, user.getId())); + ObjectId oldMetaId = getMetaRef(allUsers, refsDraftComments(id, user.getId())); // Add a draft behind NoteDb's back. setNotesMigration(false, false); @@ -637,30 +619,28 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { ReviewDb db = getUnwrappedDb(); Change c = db.changes().get(id); // Leave change meta ID alone so DraftCommentNotes does the rebuild. - ObjectId badSha = - ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"); - NoteDbChangeState bogusState = new NoteDbChangeState( - id, - PrimaryStorage.REVIEW_DB, - Optional.of( - NoteDbChangeState.RefState.create( - NoteDbChangeState.parse(c).getChangeMetaId(), - ImmutableMap.of(user.getId(), badSha))), - Optional.empty()); + ObjectId badSha = ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"); + NoteDbChangeState bogusState = + new NoteDbChangeState( + id, + PrimaryStorage.REVIEW_DB, + Optional.of( + NoteDbChangeState.RefState.create( + NoteDbChangeState.parse(c).getChangeMetaId(), + ImmutableMap.of(user.getId(), badSha))), + Optional.empty()); c.setNoteDbState(bogusState.toString()); db.changes().update(Collections.singleton(c)); assertDraftsUpToDate(false, id, user); - assertThat(getMetaRef(allUsers, refsDraftComments(id, user.getId()))) - .isEqualTo(oldMetaId); + assertThat(getMetaRef(allUsers, refsDraftComments(id, user.getId()))).isEqualTo(oldMetaId); // Force the next rebuild attempt to fail (in DraftCommentNotes). rebuilderWrapper.failNextUpdate(); setNotesMigration(true, true); ChangeNotes notes = notesFactory.create(dbProvider.get(), project, id); notes.getDraftComments(user.getId()); - assertThat(getMetaRef(allUsers, refsDraftComments(id, user.getId()))) - .isEqualTo(oldMetaId); + assertThat(getMetaRef(allUsers, refsDraftComments(id, user.getId()))).isEqualTo(oldMetaId); // Not up to date, but the actual returned state matches anyway. assertChangeUpToDate(true, id); @@ -670,12 +650,10 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { assertThat(actual.differencesFrom(expected)).isEmpty(); // Another rebuild attempt succeeds - notesFactory.create(dbProvider.get(), project, id) - .getDraftComments(user.getId()); + notesFactory.create(dbProvider.get(), project, id).getDraftComments(user.getId()); assertChangeUpToDate(true, id); assertDraftsUpToDate(true, id, user); - assertThat(getMetaRef(allUsers, refsDraftComments(id, user.getId()))) - .isNotEqualTo(oldMetaId); + assertThat(getMetaRef(allUsers, refsDraftComments(id, user.getId()))).isNotEqualTo(oldMetaId); } @Test @@ -696,8 +674,7 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { // On next NoteDb read, the drafts are transparently rebuilt. setNotesMigration(true, true); - assertThat(gApi.changes().id(id.get()).current().drafts()) - .containsKey(PushOneCommit.FILE_NAME); + assertThat(gApi.changes().id(id.get()).current().drafts()).containsKey(PushOneCommit.FILE_NAME); assertDraftsUpToDate(true, id, user); } @@ -706,25 +683,26 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { // We don't have the code in our test harness to do signed pushes, so just // use a hard-coded cert. This cert was actually generated by C git 2.2.0 // (albeit not for sending to Gerrit). - String cert = "certificate version 0.1\n" - + "pusher Dave Borowitz 1433954361 -0700\n" - + "pushee git://localhost/repo.git\n" - + "nonce 1433954361-bde756572d665bba81d8\n" - + "\n" - + "0000000000000000000000000000000000000000" - + "b981a177396fb47345b7df3e4d3f854c6bea7" - + "s/heads/master\n" - + "-----BEGIN PGP SIGNATURE-----\n" - + "Version: GnuPG v1\n" - + "\n" - + "iQEcBAABAgAGBQJVeGg5AAoJEPfTicJkUdPkUggH/RKAeI9/i/LduuiqrL/SSdIa\n" - + "9tYaSqJKLbXz63M/AW4Sp+4u+dVCQvnAt/a35CVEnpZz6hN4Kn/tiswOWVJf4CO7\n" - + "htNubGs5ZMwvD6sLYqKAnrM3WxV/2TbbjzjZW6Jkidz3jz/WRT4SmjGYiEO7aA+V\n" - + "4ZdIS9f7sW5VsHHYlNThCA7vH8Uu48bUovFXyQlPTX0pToSgrWV3JnTxDNxfn3iG\n" - + "IL0zTY/qwVCdXgFownLcs6J050xrrBWIKqfcWr3u4D2aCLyR0v+S/KArr7ulZygY\n" - + "+SOklImn8TAZiNxhWtA6ens66IiammUkZYFv7SSzoPLFZT4dC84SmGPWgf94NoQ=\n" - + "=XFeC\n" - + "-----END PGP SIGNATURE-----\n"; + String cert = + "certificate version 0.1\n" + + "pusher Dave Borowitz 1433954361 -0700\n" + + "pushee git://localhost/repo.git\n" + + "nonce 1433954361-bde756572d665bba81d8\n" + + "\n" + + "0000000000000000000000000000000000000000" + + "b981a177396fb47345b7df3e4d3f854c6bea7" + + "s/heads/master\n" + + "-----BEGIN PGP SIGNATURE-----\n" + + "Version: GnuPG v1\n" + + "\n" + + "iQEcBAABAgAGBQJVeGg5AAoJEPfTicJkUdPkUggH/RKAeI9/i/LduuiqrL/SSdIa\n" + + "9tYaSqJKLbXz63M/AW4Sp+4u+dVCQvnAt/a35CVEnpZz6hN4Kn/tiswOWVJf4CO7\n" + + "htNubGs5ZMwvD6sLYqKAnrM3WxV/2TbbjzjZW6Jkidz3jz/WRT4SmjGYiEO7aA+V\n" + + "4ZdIS9f7sW5VsHHYlNThCA7vH8Uu48bUovFXyQlPTX0pToSgrWV3JnTxDNxfn3iG\n" + + "IL0zTY/qwVCdXgFownLcs6J050xrrBWIKqfcWr3u4D2aCLyR0v+S/KArr7ulZygY\n" + + "+SOklImn8TAZiNxhWtA6ens66IiammUkZYFv7SSzoPLFZT4dC84SmGPWgf94NoQ=\n" + + "=XFeC\n" + + "-----END PGP SIGNATURE-----\n"; PushOneCommit.Result r = createChange(); PatchSet.Id psId = r.getPatchSetId(); @@ -799,14 +777,20 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { } @Test - public void noteDbUsesOriginalSubjectFromPatchSetAndIgnoresChangeField() - throws Exception { + public void noteDbUsesOriginalSubjectFromPatchSetAndIgnoresChangeField() throws Exception { PushOneCommit.Result r = createChange(); String orig = r.getChange().change().getSubject(); - r = pushFactory.create( - db, admin.getIdent(), testRepo, orig + " v2", - PushOneCommit.FILE_NAME, "new contents", r.getChangeId()) - .to("refs/heads/master"); + r = + pushFactory + .create( + db, + admin.getIdent(), + testRepo, + orig + " v2", + PushOneCommit.FILE_NAME, + "new contents", + r.getChangeId()) + .to("refs/heads/master"); r.assertOkStatus(); PatchSet.Id psId = r.getPatchSetId(); @@ -831,8 +815,15 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { public void deleteDraftPS1WithNoOtherEntities() throws Exception { PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo); PushOneCommit.Result r = push.to("refs/drafts/master"); - push = pushFactory.create(db, admin.getIdent(), testRepo, - PushOneCommit.SUBJECT, "b.txt", "4711", r.getChangeId()); + push = + pushFactory.create( + db, + admin.getIdent(), + testRepo, + PushOneCommit.SUBJECT, + "b.txt", + "4711", + r.getChangeId()); r = push.to("refs/drafts/master"); PatchSet.Id psId = r.getPatchSetId(); Change.Id id = psId.getParentKey(); @@ -852,11 +843,14 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { Change change = r.getChange().change(); Change.Id id = change.getId(); - PatchLineComment comment = new PatchLineComment( - new PatchLineComment.Key( - new Patch.Key(new PatchSet.Id(id, 0), PushOneCommit.FILE_NAME), - "uuid"), - 0, user.getId(), null, TimeUtil.nowTs()); + PatchLineComment comment = + new PatchLineComment( + new PatchLineComment.Key( + new Patch.Key(new PatchSet.Id(id, 0), PushOneCommit.FILE_NAME), "uuid"), + 0, + user.getId(), + null, + TimeUtil.nowTs()); comment.setSide((short) 1); comment.setMessage("message"); comment.setStatus(PatchLineComment.Status.PUBLISHED); @@ -873,8 +867,14 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { @Test public void leadingSpacesInSubject() throws Exception { String subj = " " + PushOneCommit.SUBJECT; - PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo, - subj, PushOneCommit.FILE_NAME, PushOneCommit.FILE_CONTENT); + PushOneCommit push = + pushFactory.create( + db, + admin.getIdent(), + testRepo, + subj, + PushOneCommit.FILE_NAME, + PushOneCommit.FILE_CONTENT); PushOneCommit.Result r = push.to("refs/for/master"); r.assertOkStatus(); Change change = r.getChange().change(); @@ -906,11 +906,9 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { oldDb.changes().update(Collections.singleton(c)); c = oldDb.changes().get(c.getId()); - ChangeNotes newNotes = - notesFactory.createWithAutoRebuildingDisabled(c, null); + ChangeNotes newNotes = notesFactory.createWithAutoRebuildingDisabled(c, null); assertThat(newNotes.getChange().getTopic()).isNotEqualTo(topic); - assertThat(newNotes.getChange().getTopic()) - .isEqualTo(oldNotes.getChange().getTopic()); + assertThat(newNotes.getChange().getTopic()).isEqualTo(oldNotes.getChange().getTopic()); } @Test @@ -978,8 +976,7 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { // On next NoteDb read, change is rebuilt in-memory but not stored. setNotesMigration(false, true); - assertThat(gApi.changes().id(id.get()).info().topic) - .isEqualTo(name("a-topic")); + assertThat(gApi.changes().id(id.get()).info().topic).isEqualTo(name("a-topic")); assertChangeUpToDate(false, id); // Attempting to write directly causes failure. @@ -991,8 +988,7 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { } // Update was not written. - assertThat(gApi.changes().id(id.get()).info().topic) - .isEqualTo(name("a-topic")); + assertThat(gApi.changes().id(id.get()).info().topic).isEqualTo(name("a-topic")); assertChangeUpToDate(false, id); } @@ -1049,18 +1045,17 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { adminRestSession.postWithHeader(prefix + "review", ri, runAs).assertOK(); di.message = "draft with impersonation"; - adminRestSession.putWithHeader(prefix + "drafts", runAs, di) - .assertCreated(); + adminRestSession.putWithHeader(prefix + "drafts", runAs, di).assertCreated(); } finally { removeRunAs(); } List msgs = - Ordering.natural().onResultOf(ChangeMessage::getWrittenOn) + Ordering.natural() + .onResultOf(ChangeMessage::getWrittenOn) .sortedCopy(db.changeMessages().byChange(id)); assertThat(msgs).hasSize(3); - assertThat(msgs.get(1).getMessage()) - .endsWith("message without impersonation"); + assertThat(msgs.get(1).getMessage()).endsWith("message without impersonation"); assertThat(msgs.get(1).getAuthor()).isEqualTo(user.id); assertThat(msgs.get(1).getRealAuthor()).isEqualTo(user.id); assertThat(msgs.get(2).getMessage()).endsWith("message with impersonation"); @@ -1076,23 +1071,20 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { Ordering commentOrder = Ordering.natural().onResultOf(PatchLineComment::getWrittenOn); - List drafts = commentOrder.sortedCopy( - db.patchComments().draftByPatchSetAuthor(psId, user.id)); + List drafts = + commentOrder.sortedCopy(db.patchComments().draftByPatchSetAuthor(psId, user.id)); assertThat(drafts).hasSize(2); - assertThat(drafts.get(0).getMessage()) - .isEqualTo("draft without impersonation"); + assertThat(drafts.get(0).getMessage()).isEqualTo("draft without impersonation"); assertThat(drafts.get(0).getAuthor()).isEqualTo(user.id); assertThat(drafts.get(0).getRealAuthor()).isEqualTo(user.id); - assertThat(drafts.get(1).getMessage()) - .isEqualTo("draft with impersonation"); + assertThat(drafts.get(1).getMessage()).isEqualTo("draft with impersonation"); assertThat(drafts.get(1).getAuthor()).isEqualTo(user.id); assertThat(drafts.get(1).getRealAuthor()).isEqualTo(admin.id); - List pub = commentOrder.sortedCopy( - db.patchComments().publishedByPatchSet(psId)); + List pub = + commentOrder.sortedCopy(db.patchComments().publishedByPatchSet(psId)); assertThat(pub).hasSize(2); - assertThat(pub.get(0).getMessage()) - .isEqualTo("comment without impersonation"); + assertThat(pub.get(0).getMessage()).isEqualTo("comment without impersonation"); assertThat(pub.get(0).getAuthor()).isEqualTo(user.id); assertThat(pub.get(0).getRealAuthor()).isEqualTo(user.id); assertThat(pub.get(1).getMessage()).isEqualTo("comment with impersonation"); @@ -1150,22 +1142,24 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { PushOneCommit.Result r2 = amendChange(r1.getChangeId()); PatchSet.Id psId2 = r2.getPatchSetId(); - try (BatchUpdate bu = batchUpdateFactory.create(db, project, - identifiedUserFactory.create(user.getId()), TimeUtil.nowTs())) { - bu.addOp(id, new BatchUpdate.Op() { - @Override - public boolean updateChange(ChangeContext ctx) - throws PatchSetInfoNotAvailableException { - ctx.getChange().setCurrentPatchSet( - patchSetInfoFactory.get(ctx.getDb(), ctx.getNotes(), psId1)); - return true; - } - }); + try (BatchUpdate bu = + batchUpdateFactory.create( + db, project, identifiedUserFactory.create(user.getId()), TimeUtil.nowTs())) { + bu.addOp( + id, + new BatchUpdate.Op() { + @Override + public boolean updateChange(ChangeContext ctx) + throws PatchSetInfoNotAvailableException { + ctx.getChange() + .setCurrentPatchSet(patchSetInfoFactory.get(ctx.getDb(), ctx.getNotes(), psId1)); + return true; + } + }); bu.execute(); } ChangeNotes notes = notesFactory.create(db, project, id); - assertThat(psUtil.byChangeAsMap(db, notes).keySet()) - .containsExactly(psId1, psId2); + assertThat(psUtil.byChangeAsMap(db, notes).keySet()).containsExactly(psId1, psId2); assertThat(notes.getChange().currentPatchSetId()).isEqualTo(psId1); assertThat(db.changes().get(id).currentPatchSetId()).isEqualTo(psId1); @@ -1174,23 +1168,20 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { setNotesMigration(true, true); notes = notesFactory.create(db, project, id); - assertThat(psUtil.byChangeAsMap(db, notes).keySet()) - .containsExactly(psId1, psId2); + assertThat(psUtil.byChangeAsMap(db, notes).keySet()).containsExactly(psId1, psId2); assertThat(notes.getChange().currentPatchSetId()).isEqualTo(psId1); } @Test - public void resolveCommentsInheritsValueFromParentWhenUnspecified() - throws Exception { + public void resolveCommentsInheritsValueFromParentWhenUnspecified() throws Exception { PushOneCommit.Result r = createChange(); Change.Id id = r.getPatchSetId().getParentKey(); putDraft(user, id, 1, "comment", true); putDraft(user, id, 1, "newComment", null); - Map> comments = - gApi.changes().id(id.get()).current().drafts(); - for (List cList: comments.values()) { - for (CommentInfo ci: cList) { + Map> comments = gApi.changes().id(id.get()).current().drafts(); + for (List cList : comments.values()) { + for (CommentInfo ci : cList) { assertThat(ci.unresolved).isEqualTo(true); } } @@ -1209,8 +1200,7 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { ReviewDb db = getUnwrappedDb(); Change c = db.changes().get(id); NoteDbChangeState state = NoteDbChangeState.parse(c); - Timestamp until = - new Timestamp(TimeUtil.nowMs() + MILLISECONDS.convert(1, DAYS)); + Timestamp until = new Timestamp(TimeUtil.nowMs() + MILLISECONDS.convert(1, DAYS)); state = state.withReadOnlyUntil(until); c.setNoteDbState(state.toString()); db.changes().update(Collections.singleton(c)); @@ -1222,8 +1212,7 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { assertThat(e.getMessage()).contains("read-only until"); } - TestTimeUtil.setClock( - new Timestamp(until.getTime() + MILLISECONDS.convert(1, SECONDS))); + TestTimeUtil.setClock(new Timestamp(until.getTime() + MILLISECONDS.convert(1, SECONDS))); rebuilderWrapper.rebuild(db, id); } @@ -1231,8 +1220,7 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { Throwable cause = e.getCause(); assertThat(cause).isInstanceOf(UpdateException.class); assertThat(cause.getCause()).isInstanceOf(OrmException.class); - assertThat(cause.getCause()) - .hasMessage(NoteDbUpdateManager.CHANGES_READ_ONLY); + assertThat(cause.getCause()).hasMessage(NoteDbUpdateManager.CHANGES_READ_ONLY); } private void setInvalidNoteDbState(Change.Id id) throws Exception { @@ -1246,27 +1234,24 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { db.changes().update(Collections.singleton(c)); } - private void assertChangeUpToDate(boolean expected, Change.Id id) - throws Exception { + private void assertChangeUpToDate(boolean expected, Change.Id id) throws Exception { try (Repository repo = repoManager.openRepository(project)) { Change c = getUnwrappedDb().changes().get(id); assertThat(c).isNotNull(); assertThat(c.getNoteDbState()).isNotNull(); - assertThat(NoteDbChangeState.parse(c).isChangeUpToDate( - new RepoRefCache(repo))) + assertThat(NoteDbChangeState.parse(c).isChangeUpToDate(new RepoRefCache(repo))) .isEqualTo(expected); } } - private void assertDraftsUpToDate(boolean expected, Change.Id changeId, - TestAccount account) throws Exception { + private void assertDraftsUpToDate(boolean expected, Change.Id changeId, TestAccount account) + throws Exception { try (Repository repo = repoManager.openRepository(allUsers)) { Change c = getUnwrappedDb().changes().get(changeId); assertThat(c).isNotNull(); assertThat(c.getNoteDbState()).isNotNull(); NoteDbChangeState state = NoteDbChangeState.parse(c); - assertThat(state.areDraftsUpToDate( - new RepoRefCache(repo), account.getId())) + assertThat(state.areDraftsUpToDate(new RepoRefCache(repo), account.getId())) .isEqualTo(expected); } } @@ -1278,8 +1263,8 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { } } - private void putDraft(TestAccount account, Change.Id id, int line, String msg, - Boolean unresolved) throws Exception { + private void putDraft(TestAccount account, Change.Id id, int line, String msg, Boolean unresolved) + throws Exception { DraftInput in = new DraftInput(); in.line = line; in.message = msg; @@ -1293,8 +1278,8 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { } } - private void putComment(TestAccount account, Change.Id id, int line, - String msg, String inReplyTo) throws Exception { + private void putComment(TestAccount account, Change.Id id, int line, String msg, String inReplyTo) + throws Exception { CommentInput in = new CommentInput(); in.line = line; in.message = msg; @@ -1311,8 +1296,7 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { } } - private void publishDrafts(TestAccount account, Change.Id id) - throws Exception { + private void publishDrafts(TestAccount account, Change.Id id) throws Exception { ReviewInput rin = new ReviewInput(); rin.drafts = ReviewInput.DraftHandling.PUBLISH_ALL_REVISIONS; AcceptanceTestRequestScope.Context old = setApiUser(account); @@ -1323,11 +1307,11 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { } } - private ChangeMessage insertMessage(Change.Id id, PatchSet.Id psId, - Account.Id author, Timestamp ts, String message) throws Exception { - ChangeMessage msg = new ChangeMessage( - new ChangeMessage.Key(id, ChangeUtil.messageUuid()), - author, ts, psId); + private ChangeMessage insertMessage( + Change.Id id, PatchSet.Id psId, Account.Id author, Timestamp ts, String message) + throws Exception { + ChangeMessage msg = + new ChangeMessage(new ChangeMessage.Key(id, ChangeUtil.messageUuid()), author, ts, psId); msg.setMessage(message); db.changeMessages().insert(Collections.singleton(msg)); @@ -1347,20 +1331,19 @@ public class ChangeRebuilderIT extends AbstractDaemonTest { private void allowRunAs() throws Exception { ProjectConfig cfg = projectCache.checkedGet(allProjects).getConfig(); - Util.allow(cfg, GlobalCapability.RUN_AS, - systemGroupBackend.getGroup(REGISTERED_USERS).getUUID()); + Util.allow( + cfg, GlobalCapability.RUN_AS, systemGroupBackend.getGroup(REGISTERED_USERS).getUUID()); saveProjectConfig(allProjects, cfg); } private void removeRunAs() throws Exception { ProjectConfig cfg = projectCache.checkedGet(allProjects).getConfig(); - Util.remove(cfg, GlobalCapability.RUN_AS, - systemGroupBackend.getGroup(REGISTERED_USERS).getUUID()); + Util.remove( + cfg, GlobalCapability.RUN_AS, systemGroupBackend.getGroup(REGISTERED_USERS).getUUID()); saveProjectConfig(allProjects, cfg); } - private Map> getPublishedComments(Change.Id id) - throws Exception { + private Map> getPublishedComments(Change.Id id) throws Exception { return gApi.changes().id(id.get()).current().comments(); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/notedb/NoteDbPrimaryIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/notedb/NoteDbPrimaryIT.java index fc39a971b4..ef5e7cf3d0 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/notedb/NoteDbPrimaryIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/notedb/NoteDbPrimaryIT.java @@ -23,6 +23,9 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.concurrent.TimeUnit.SECONDS; import static java.util.stream.Collectors.toList; +import com.github.rholder.retry.Retryer; +import com.github.rholder.retry.RetryerBuilder; +import com.github.rholder.retry.StopStrategies; import com.google.common.base.Throwables; import com.google.common.collect.Iterables; import com.google.gerrit.acceptance.AbstractDaemonTest; @@ -53,22 +56,16 @@ import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.OrmRuntimeException; import com.google.inject.Inject; import com.google.inject.util.Providers; - -import com.github.rholder.retry.Retryer; -import com.github.rholder.retry.RetryerBuilder; -import com.github.rholder.retry.StopStrategies; - -import org.eclipse.jgit.lib.Config; -import org.eclipse.jgit.lib.Repository; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - import java.sql.Timestamp; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Optional; +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.lib.Repository; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; public class NoteDbPrimaryIT extends AbstractDaemonTest { @ConfigSuite.Default @@ -80,11 +77,9 @@ public class NoteDbPrimaryIT extends AbstractDaemonTest { return cfg; } - @Inject - private AllUsersName allUsers; + @Inject private AllUsersName allUsers; - @Inject - private TestChangeRebuilderWrapper rebuilderWrapper; + @Inject private TestChangeRebuilderWrapper rebuilderWrapper; private PrimaryStorageMigrator migrator; @@ -99,8 +94,7 @@ public class NoteDbPrimaryIT extends AbstractDaemonTest { private PrimaryStorageMigrator newMigrator( @Nullable Retryer ensureRebuiltRetryer) { return new PrimaryStorageMigrator( - cfg, Providers.of(db), repoManager, allUsers, rebuilderWrapper, - ensureRebuiltRetryer); + cfg, Providers.of(db), repoManager, allUsers, rebuilderWrapper, ensureRebuiltRetryer); } @After @@ -119,8 +113,7 @@ public class NoteDbPrimaryIT extends AbstractDaemonTest { ChangeInfo info = gApi.changes().id(id.get()).get(); assertThat(info.status).isEqualTo(ChangeStatus.MERGED); - ApprovalInfo approval = - Iterables.getOnlyElement(info.labels.get("Code-Review").all); + ApprovalInfo approval = Iterables.getOnlyElement(info.labels.get("Code-Review").all); assertThat(approval._accountId).isEqualTo(admin.id.get()); assertThat(approval.value).isEqualTo(2); assertThat(info.messages).hasSize(3); @@ -150,14 +143,12 @@ public class NoteDbPrimaryIT extends AbstractDaemonTest { din.message = "A comment"; gApi.changes().id(id.get()).current().createDraft(din); - CommentInfo di = Iterables.getOnlyElement( - gApi.changes().id(id.get()).current().drafts() - .get(PushOneCommit.FILE_NAME)); + CommentInfo di = + Iterables.getOnlyElement( + gApi.changes().id(id.get()).current().drafts().get(PushOneCommit.FILE_NAME)); assertThat(di.message).isEqualTo(din.message); - assertThat( - db.patchComments().draftByChangeFileAuthor(id, din.path, admin.id)) - .isEmpty(); + assertThat(db.patchComments().draftByChangeFileAuthor(id, din.path, admin.id)).isEmpty(); gApi.changes().id(id.get()).current().draft(di.id).delete(); assertThat(gApi.changes().id(id.get()).current().drafts()).isEmpty(); @@ -170,13 +161,11 @@ public class NoteDbPrimaryIT extends AbstractDaemonTest { setNoteDbPrimary(id); gApi.changes().id(id.get()).current().review(ReviewInput.approve()); - List approvals = - gApi.changes().id(id.get()).get().labels.get("Code-Review").all; + List approvals = gApi.changes().id(id.get()).get().labels.get("Code-Review").all; assertThat(approvals).hasSize(1); assertThat(approvals.get(0).value).isEqualTo(2); - gApi.changes().id(id.get()).reviewer(admin.id.toString()) - .deleteVote("Code-Review"); + gApi.changes().id(id.get()).reviewer(admin.id.toString()).deleteVote("Code-Review"); approvals = gApi.changes().id(id.get()).get().labels.get("Code-Review").all; assertThat(approvals).hasSize(1); @@ -190,8 +179,7 @@ public class NoteDbPrimaryIT extends AbstractDaemonTest { setNoteDbPrimary(id); gApi.changes().id(id.get()).current().review(ReviewInput.approve()); - List approvals = - gApi.changes().id(id.get()).get().labels.get("Code-Review").all; + List approvals = gApi.changes().id(id.get()).get().labels.get("Code-Review").all; assertThat(approvals).hasSize(1); assertThat(approvals.get(0).value).isEqualTo(2); @@ -241,25 +229,24 @@ public class NoteDbPrimaryIT extends AbstractDaemonTest { c.setNoteDbState(state.toString()); db.changes().update(Collections.singleton(c)); - assertThat(gApi.changes().id(id.get()).get().subject) - .isEqualTo(PushOneCommit.SUBJECT); + assertThat(gApi.changes().id(id.get()).get().subject).isEqualTo(PushOneCommit.SUBJECT); assertThat(gApi.changes().id(id.get()).get().topic).isNull(); try { gApi.changes().id(id.get()).topic("a-topic"); assert_().fail("expected read-only exception"); } catch (RestApiException e) { - Optional oe = Throwables.getCausalChain(e).stream() - .filter(x -> x instanceof OrmRuntimeException).findFirst(); - assertThat(oe.isPresent()) - .named("OrmRuntimeException in causal chain of " + e) - .isTrue(); + Optional oe = + Throwables.getCausalChain(e) + .stream() + .filter(x -> x instanceof OrmRuntimeException) + .findFirst(); + assertThat(oe.isPresent()).named("OrmRuntimeException in causal chain of " + e).isTrue(); assertThat(oe.get().getMessage()).contains("read-only"); } assertThat(gApi.changes().id(id.get()).get().topic).isNull(); TestTimeUtil.setClock(new Timestamp(until.getTime() + 1000)); - assertThat(gApi.changes().id(id.get()).get().subject) - .isEqualTo(PushOneCommit.SUBJECT); + assertThat(gApi.changes().id(id.get()).get().subject).isEqualTo(PushOneCommit.SUBJECT); gApi.changes().id(id.get()).topic("a-topic"); assertThat(gApi.changes().id(id.get()).get().topic).isEqualTo("a-topic"); } @@ -281,8 +268,7 @@ public class NoteDbPrimaryIT extends AbstractDaemonTest { } private void testMigrateToNoteDb(Change.Id id) throws Exception { - assertThat(PrimaryStorage.of(db.changes().get(id))) - .isEqualTo(PrimaryStorage.REVIEW_DB); + assertThat(PrimaryStorage.of(db.changes().get(id))).isEqualTo(PrimaryStorage.REVIEW_DB); migrator.migrateToNoteDbPrimary(id); assertNoteDbPrimary(id); @@ -300,11 +286,12 @@ public class NoteDbPrimaryIT extends AbstractDaemonTest { db.changes().update(Collections.singleton(c)); rebuilderWrapper.failNextUpdate(); - migrator = newMigrator( - RetryerBuilder. newBuilder() - .retryIfException() - .withStopStrategy(StopStrategies.neverStop()) - .build()); + migrator = + newMigrator( + RetryerBuilder.newBuilder() + .retryIfException() + .withStopStrategy(StopStrategies.neverStop()) + .build()); migrator.migrateToNoteDbPrimary(id); assertNoteDbPrimary(id); } @@ -318,11 +305,12 @@ public class NoteDbPrimaryIT extends AbstractDaemonTest { db.changes().update(Collections.singleton(c)); rebuilderWrapper.failNextUpdate(); - migrator = newMigrator( - RetryerBuilder. newBuilder() - .retryIfException() - .withStopStrategy(StopStrategies.stopAfterAttempt(1)) - .build()); + migrator = + newMigrator( + RetryerBuilder.newBuilder() + .retryIfException() + .withStopStrategy(StopStrategies.stopAfterAttempt(1)) + .build()); exception.expect(OrmException.class); exception.expectMessage("Retrying failed"); migrator.migrateToNoteDbPrimary(id); @@ -357,8 +345,7 @@ public class NoteDbPrimaryIT extends AbstractDaemonTest { Change c = db.changes().get(id); NoteDbChangeState state = NoteDbChangeState.parse(c); - Timestamp until = - new Timestamp(TimeUtil.nowMs() + MILLISECONDS.convert(1, DAYS)); + Timestamp until = new Timestamp(TimeUtil.nowMs() + MILLISECONDS.convert(1, DAYS)); state = state.withReadOnlyUntil(until); c.setNoteDbState(state.toString()); db.changes().update(Collections.singleton(c)); @@ -373,8 +360,7 @@ public class NoteDbPrimaryIT extends AbstractDaemonTest { PushOneCommit.Result r = createChange(); Change.Id id = r.getChange().getId(); - assertThat(PrimaryStorage.of(db.changes().get(id))) - .isEqualTo(PrimaryStorage.REVIEW_DB); + assertThat(PrimaryStorage.of(db.changes().get(id))).isEqualTo(PrimaryStorage.REVIEW_DB); migrator.migrateToNoteDbPrimary(id); assertNoteDbPrimary(id); @@ -386,15 +372,11 @@ public class NoteDbPrimaryIT extends AbstractDaemonTest { Change c = db.changes().get(id); assertThat(c).named("change " + id).isNotNull(); NoteDbChangeState state = NoteDbChangeState.parse(c); - assertThat(state.getPrimaryStorage()) - .named("storage of " + id) - .isEqualTo(REVIEW_DB); + assertThat(state.getPrimaryStorage()).named("storage of " + id).isEqualTo(REVIEW_DB); try (Repository changeRepo = repoManager.openRepository(c.getProject()); Repository allUsersRepo = repoManager.openRepository(allUsers)) { - assertThat( - state.isUpToDate( - new RepoRefCache(changeRepo), new RepoRefCache(allUsersRepo))) + assertThat(state.isUpToDate(new RepoRefCache(changeRepo), new RepoRefCache(allUsersRepo))) .named("change " + id + " up to date") .isTrue(); } @@ -404,13 +386,16 @@ public class NoteDbPrimaryIT extends AbstractDaemonTest { } private void assertNoteDbPrimary(Change.Id id) throws Exception { - assertThat(PrimaryStorage.of(db.changes().get(id))) - .isEqualTo(PrimaryStorage.NOTE_DB); + assertThat(PrimaryStorage.of(db.changes().get(id))).isEqualTo(PrimaryStorage.NOTE_DB); } private List getReviewers(Change.Id id) throws Exception { - return gApi.changes().id(id.get()).get() - .reviewers.values().stream() + return gApi.changes() + .id(id.get()) + .get() + .reviewers + .values() + .stream() .flatMap(Collection::stream) .map(a -> new Account.Id(a._accountId)) .collect(toList()); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/CustomLabelIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/CustomLabelIT.java index d6019cf425..38ff3c74ec 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/CustomLabelIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/CustomLabelIT.java @@ -37,7 +37,6 @@ import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gerrit.server.git.ProjectConfig; import com.google.gerrit.server.project.Util; import com.google.inject.Inject; - import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -45,17 +44,12 @@ import org.junit.Test; @NoHttpd public class CustomLabelIT extends AbstractDaemonTest { - @Inject - private DynamicSet source; + @Inject private DynamicSet source; - private final LabelType label = category("CustomLabel", - value(1, "Positive"), - value(0, "No score"), - value(-1, "Negative")); + private final LabelType label = + category("CustomLabel", value(1, "Positive"), value(0, "No score"), value(-1, "Negative")); - private final LabelType P = category("CustomLabel2", - value(1, "Positive"), - value(0, "No score")); + private final LabelType P = category("CustomLabel2", value(1, "Positive"), value(0, "No score")); private RegistrationHandle eventListenerRegistration; private CommentAddedListener.Event lastCommentAddedEvent; @@ -63,20 +57,19 @@ public class CustomLabelIT extends AbstractDaemonTest { @Before public void setUp() throws Exception { ProjectConfig cfg = projectCache.checkedGet(project).getConfig(); - AccountGroup.UUID anonymousUsers = - systemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID(); - Util.allow(cfg, Permission.forLabel(label.getName()), -1, 1, anonymousUsers, - "refs/heads/*"); - Util.allow(cfg, Permission.forLabel(P.getName()), 0, 1, anonymousUsers, - "refs/heads/*"); + AccountGroup.UUID anonymousUsers = systemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID(); + Util.allow(cfg, Permission.forLabel(label.getName()), -1, 1, anonymousUsers, "refs/heads/*"); + Util.allow(cfg, Permission.forLabel(P.getName()), 0, 1, anonymousUsers, "refs/heads/*"); saveProjectConfig(project, cfg); - eventListenerRegistration = source.add(new CommentAddedListener() { - @Override - public void onCommentAdded(Event event) { - lastCommentAddedEvent = event; - } - }); + eventListenerRegistration = + source.add( + new CommentAddedListener() { + @Override + public void onCommentAdded(Event event) { + lastCommentAddedEvent = event; + } + }); } @After @@ -145,9 +138,7 @@ public class CustomLabelIT extends AbstractDaemonTest { PushOneCommit.Result r = createChange(); AddReviewerInput in = new AddReviewerInput(); in.reviewer = user.email; - gApi.changes() - .id(r.getChangeId()) - .addReviewer(in); + gApi.changes().id(r.getChangeId()).addReviewer(in); ReviewInput input = new ReviewInput().label(P.getName(), 0); input.message = "foo"; @@ -159,8 +150,7 @@ public class CustomLabelIT extends AbstractDaemonTest { assertThat(q.disliked).isNull(); assertThat(q.rejected).isNull(); assertThat(q.blocking).isNull(); - assertThat(lastCommentAddedEvent.getComment()).isEqualTo( - "Patch Set 1:\n\n" + input.message); + assertThat(lastCommentAddedEvent.getComment()).isEqualTo("Patch Set 1:\n\n" + input.message); } @Test @@ -199,8 +189,7 @@ public class CustomLabelIT extends AbstractDaemonTest { in = new ReviewInput(); in.label(label.getName(), label.getMax().getValue()); exception.expect(ResourceConflictException.class); - exception.expectMessage( - "Voting on labels disallowed after submit: " + label.getName()); + exception.expectMessage("Voting on labels disallowed after submit: " + label.getName()); revision(r).review(in); } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/ProjectWatchIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/ProjectWatchIT.java index 43f66796b5..5677e6ee8c 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/ProjectWatchIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/ProjectWatchIT.java @@ -27,14 +27,12 @@ import com.google.gerrit.server.git.NotifyConfig; import com.google.gerrit.server.git.ProjectConfig; import com.google.gerrit.server.mail.Address; import com.google.gerrit.testutil.FakeEmailSender.Message; - +import java.util.EnumSet; +import java.util.List; import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository; import org.eclipse.jgit.junit.TestRepository; import org.junit.Test; -import java.util.EnumSet; -import java.util.List; - @NoHttpd @Sandboxed public class ProjectWatchIT extends AbstractDaemonTest { @@ -52,19 +50,23 @@ public class ProjectWatchIT extends AbstractDaemonTest { cfg.putNotifyConfig("watch", nc); saveProjectConfig(project, cfg); - PushOneCommit.Result r = pushFactory.create(db, admin.getIdent(), testRepo, - "original subject", "a", "a1") - .to("refs/for/master"); + PushOneCommit.Result r = + pushFactory + .create(db, admin.getIdent(), testRepo, "original subject", "a", "a1") + .to("refs/for/master"); r.assertOkStatus(); - r = pushFactory.create(db, admin.getIdent(), testRepo, - "super sekret subject", "a", "a2", r.getChangeId()) - .to("refs/for/master"); + r = + pushFactory + .create( + db, admin.getIdent(), testRepo, "super sekret subject", "a", "a2", r.getChangeId()) + .to("refs/for/master"); r.assertOkStatus(); - r = pushFactory.create(db, admin.getIdent(), testRepo, - "back to original subject", "a", "a3") - .to("refs/for/master"); + r = + pushFactory + .create(db, admin.getIdent(), testRepo, "back to original subject", "a", "a3") + .to("refs/for/master"); r.assertOkStatus(); List messages = sender.getMessages(); @@ -86,9 +88,10 @@ public class ProjectWatchIT extends AbstractDaemonTest { setApiUser(admin); TestRepository watchedRepo = cloneProject(new Project.NameKey(watchedProject), admin); - PushOneCommit.Result r = pushFactory - .create(db, admin.getIdent(), watchedRepo, "TRIGGER", "a", "a1") - .to("refs/for/master"); + PushOneCommit.Result r = + pushFactory + .create(db, admin.getIdent(), watchedRepo, "TRIGGER", "a", "a1") + .to("refs/for/master"); r.assertOkStatus(); // push a change to non-watched project -> should not trigger email @@ -96,8 +99,10 @@ public class ProjectWatchIT extends AbstractDaemonTest { String notWatchedProject = createProject("otherProject").get(); TestRepository notWatchedRepo = cloneProject(new Project.NameKey(notWatchedProject), admin); - r = pushFactory.create(db, admin.getIdent(), notWatchedRepo, - "DONT_TRIGGER", "a", "a1").to("refs/for/master"); + r = + pushFactory + .create(db, admin.getIdent(), notWatchedRepo, "DONT_TRIGGER", "a", "a1") + .to("refs/for/master"); r.assertOkStatus(); // assert email notification @@ -126,9 +131,10 @@ public class ProjectWatchIT extends AbstractDaemonTest { setApiUser(admin); TestRepository watchedRepo = cloneProject(new Project.NameKey(watchedProject), admin); - PushOneCommit.Result r = pushFactory - .create(db, admin.getIdent(), watchedRepo, "TRIGGER", "a.txt", "a1") - .to("refs/for/master"); + PushOneCommit.Result r = + pushFactory + .create(db, admin.getIdent(), watchedRepo, "TRIGGER", "a.txt", "a1") + .to("refs/for/master"); r.assertOkStatus(); // assert email notification for user @@ -147,8 +153,10 @@ public class ProjectWatchIT extends AbstractDaemonTest { // push a change to non-watched file -> should not trigger email // notification for user, only for user2 - r = pushFactory.create(db, admin.getIdent(), watchedRepo, - "TRIGGER_USER2", "b.txt", "b1").to("refs/for/master"); + r = + pushFactory + .create(db, admin.getIdent(), watchedRepo, "TRIGGER_USER2", "b.txt", "b1") + .to("refs/for/master"); r.assertOkStatus(); // assert email notification @@ -172,10 +180,10 @@ public class ProjectWatchIT extends AbstractDaemonTest { setApiUser(admin); TestRepository watchedRepo = cloneProject(new Project.NameKey(watchedProject), admin); - PushOneCommit.Result r = pushFactory - .create(db, admin.getIdent(), watchedRepo, - "Document multimaster setup", "a.txt", "a1") - .to("refs/for/master"); + PushOneCommit.Result r = + pushFactory + .create(db, admin.getIdent(), watchedRepo, "Document multimaster setup", "a.txt", "a1") + .to("refs/for/master"); r.assertOkStatus(); // assert email notification for user @@ -183,14 +191,16 @@ public class ProjectWatchIT extends AbstractDaemonTest { assertThat(messages).hasSize(1); Message m = messages.get(0); assertThat(m.rcpt()).containsExactly(user.emailAddress); - assertThat(m.body()) - .contains("Change subject: Document multimaster setup\n"); + assertThat(m.body()).contains("Change subject: Document multimaster setup\n"); assertThat(m.body()).contains("Gerrit-PatchSet: 1\n"); sender.clear(); // push a change without keyword -> should not trigger email notification - r = pushFactory.create(db, admin.getIdent(), watchedRepo, - "Cleanup cache implementation", "b.txt", "b1").to("refs/for/master"); + r = + pushFactory + .create( + db, admin.getIdent(), watchedRepo, "Cleanup cache implementation", "b.txt", "b1") + .to("refs/for/master"); r.assertOkStatus(); // assert email notification @@ -209,9 +219,10 @@ public class ProjectWatchIT extends AbstractDaemonTest { setApiUser(admin); TestRepository anyRepo = cloneProject(new Project.NameKey(anyProject), admin); - PushOneCommit.Result r = pushFactory - .create(db, admin.getIdent(), anyRepo, "TRIGGER", "a", "a1") - .to("refs/for/master"); + PushOneCommit.Result r = + pushFactory + .create(db, admin.getIdent(), anyRepo, "TRIGGER", "a", "a1") + .to("refs/for/master"); r.assertOkStatus(); // assert email notification @@ -237,9 +248,10 @@ public class ProjectWatchIT extends AbstractDaemonTest { setApiUser(admin); TestRepository anyRepo = cloneProject(new Project.NameKey(anyProject), admin); - PushOneCommit.Result r = pushFactory - .create(db, admin.getIdent(), anyRepo, "TRIGGER", "a.txt", "a1") - .to("refs/for/master"); + PushOneCommit.Result r = + pushFactory + .create(db, admin.getIdent(), anyRepo, "TRIGGER", "a.txt", "a1") + .to("refs/for/master"); r.assertOkStatus(); // assert email notification for user @@ -258,8 +270,10 @@ public class ProjectWatchIT extends AbstractDaemonTest { // push a change to non-watched file in any project -> should not trigger // email notification for user, only for user2 - r = pushFactory.create(db, admin.getIdent(), anyRepo, - "TRIGGER_USER2", "b.txt", "b1").to("refs/for/master"); + r = + pushFactory + .create(db, admin.getIdent(), anyRepo, "TRIGGER_USER2", "b.txt", "b1") + .to("refs/for/master"); r.assertOkStatus(); // assert email notification @@ -284,10 +298,10 @@ public class ProjectWatchIT extends AbstractDaemonTest { setApiUser(admin); TestRepository anyRepo = cloneProject(new Project.NameKey(anyProject), admin); - PushOneCommit.Result r = pushFactory - .create(db, admin.getIdent(), anyRepo, - "Document multimaster setup", "a.txt", "a1") - .to("refs/for/master"); + PushOneCommit.Result r = + pushFactory + .create(db, admin.getIdent(), anyRepo, "Document multimaster setup", "a.txt", "a1") + .to("refs/for/master"); r.assertOkStatus(); // assert email notification for user @@ -295,15 +309,16 @@ public class ProjectWatchIT extends AbstractDaemonTest { assertThat(messages).hasSize(1); Message m = messages.get(0); assertThat(m.rcpt()).containsExactly(user.emailAddress); - assertThat(m.body()) - .contains("Change subject: Document multimaster setup\n"); + assertThat(m.body()).contains("Change subject: Document multimaster setup\n"); assertThat(m.body()).contains("Gerrit-PatchSet: 1\n"); sender.clear(); // push a change without keyword to any project -> should not trigger email // notification - r = pushFactory.create(db, admin.getIdent(), anyRepo, - "Cleanup cache implementation", "b.txt", "b1").to("refs/for/master"); + r = + pushFactory + .create(db, admin.getIdent(), anyRepo, "Cleanup cache implementation", "b.txt", "b1") + .to("refs/for/master"); r.assertOkStatus(); // assert email notification diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/AbandonRestoreIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/AbandonRestoreIT.java index 09e03b6a80..f87b71b6ba 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/AbandonRestoreIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/AbandonRestoreIT.java @@ -24,12 +24,10 @@ import com.google.gerrit.acceptance.PushOneCommit.Result; import com.google.gerrit.acceptance.UseSsh; import com.google.gerrit.extensions.common.ChangeInfo; import com.google.gerrit.extensions.common.ChangeMessageInfo; - -import org.junit.Test; - import java.util.ArrayList; import java.util.List; import java.util.Locale; +import org.junit.Test; @NoHttpd @UseSsh @@ -41,10 +39,10 @@ public class AbandonRestoreIT extends AbstractDaemonTest { String commit = result.getCommit().name(); executeCmd(commit, "abandon", "'abandon it'"); executeCmd(commit, "restore", "'restore it'"); - assertChangeMessages(result.getChangeId(), ImmutableList.of( - "Uploaded patch set 1.", - "Abandoned\n\nabandon it", - "Restored\n\nrestore it")); + assertChangeMessages( + result.getChangeId(), + ImmutableList.of( + "Uploaded patch set 1.", "Abandoned\n\nabandon it", "Restored\n\nrestore it")); } @Test @@ -53,31 +51,25 @@ public class AbandonRestoreIT extends AbstractDaemonTest { String commit = result.getCommit().name(); executeCmd(commit, "abandon", null); executeCmd(commit, "restore", null); - assertChangeMessages(result.getChangeId(), ImmutableList.of( - "Uploaded patch set 1.", - "Abandoned", - "Restored")); + assertChangeMessages( + result.getChangeId(), ImmutableList.of("Uploaded patch set 1.", "Abandoned", "Restored")); } - private void executeCmd(String commit, String op, String message) - throws Exception { - StringBuilder command = new StringBuilder("gerrit review ") - .append(commit) - .append(" --") - .append(op); + private void executeCmd(String commit, String op, String message) throws Exception { + StringBuilder command = + new StringBuilder("gerrit review ").append(commit).append(" --").append(op); if (message != null) { command.append(" --message ").append(message); } String response = adminSshSession.exec(command.toString()); assert_() - .withFailureMessage(adminSshSession.getError()) - .that(adminSshSession.hasError()) - .isFalse(); + .withFailureMessage(adminSshSession.getError()) + .that(adminSshSession.hasError()) + .isFalse(); assertThat(response.toLowerCase(Locale.US)).doesNotContain("error"); } - private void assertChangeMessages(String changeId, List expected) - throws Exception { + private void assertChangeMessages(String changeId, List expected) throws Exception { ChangeInfo c = get(changeId); Iterable messages = c.messages; assertThat(messages).isNotNull(); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/BanCommitIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/BanCommitIT.java index f786bbabcb..ac3416a246 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/BanCommitIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/BanCommitIT.java @@ -22,31 +22,28 @@ import static org.eclipse.jgit.transport.RemoteRefUpdate.Status.REJECTED_OTHER_R import com.google.gerrit.acceptance.AbstractDaemonTest; import com.google.gerrit.acceptance.NoHttpd; import com.google.gerrit.acceptance.UseSsh; - +import java.util.Locale; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.transport.RemoteRefUpdate; import org.junit.Test; -import java.util.Locale; - @NoHttpd @UseSsh public class BanCommitIT extends AbstractDaemonTest { @Test public void banCommit() throws Exception { - RevCommit c = commitBuilder() - .add("a.txt", "some content") - .create(); + RevCommit c = commitBuilder().add("a.txt", "some content").create(); - String response = - adminSshSession.exec("gerrit ban-commit " + project.get() + " " + c.name()); - assert_().withFailureMessage(adminSshSession.getError()) - .that(adminSshSession.hasError()).isFalse(); + String response = adminSshSession.exec("gerrit ban-commit " + project.get() + " " + c.name()); + assert_() + .withFailureMessage(adminSshSession.getError()) + .that(adminSshSession.hasError()) + .isFalse(); assertThat(response.toLowerCase(Locale.US)).doesNotContain("error"); - RemoteRefUpdate u = pushHead(testRepo, "refs/heads/master", false) - .getRemoteUpdate("refs/heads/master"); + RemoteRefUpdate u = + pushHead(testRepo, "refs/heads/master", false).getRemoteUpdate("refs/heads/master"); assertThat(u).isNotNull(); assertThat(u.getStatus()).isEqualTo(REJECTED_OTHER_REASON); assertThat(u.getMessage()).startsWith("contains banned commit"); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/CreateProjectIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/CreateProjectIT.java index a45cb0ed77..c01c86bd86 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/CreateProjectIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/CreateProjectIT.java @@ -21,7 +21,6 @@ import com.google.gerrit.acceptance.AbstractDaemonTest; import com.google.gerrit.acceptance.UseSsh; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.project.ProjectState; - import org.junit.Test; @UseSsh @@ -32,12 +31,13 @@ public class CreateProjectIT extends AbstractDaemonTest { String newGroupName = "newGroup"; adminRestSession.put("/groups/" + newGroupName); String newProjectName = "newProject"; - adminSshSession.exec("gerrit create-project --branch master --owner " - + newGroupName + " " + newProjectName); - assert_().withFailureMessage(adminSshSession.getError()) - .that(adminSshSession.hasError()).isFalse(); - ProjectState projectState = - projectCache.get(new Project.NameKey(newProjectName)); + adminSshSession.exec( + "gerrit create-project --branch master --owner " + newGroupName + " " + newProjectName); + assert_() + .withFailureMessage(adminSshSession.getError()) + .that(adminSshSession.hasError()) + .isFalse(); + ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName)); assertThat(projectState).isNotNull(); } @@ -47,12 +47,13 @@ public class CreateProjectIT extends AbstractDaemonTest { adminRestSession.put("/groups/" + newGroupName); String wrongGroupName = "newG"; String newProjectName = "newProject"; - adminSshSession.exec("gerrit create-project --branch master --owner " - + wrongGroupName + " " + newProjectName); - assert_().withFailureMessage(adminSshSession.getError()) - .that(adminSshSession.hasError()).isTrue(); - ProjectState projectState = - projectCache.get(new Project.NameKey(newProjectName)); + adminSshSession.exec( + "gerrit create-project --branch master --owner " + wrongGroupName + " " + newProjectName); + assert_() + .withFailureMessage(adminSshSession.getError()) + .that(adminSshSession.hasError()) + .isTrue(); + ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName)); assertThat(projectState).isNull(); } } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/GarbageCollectionIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/GarbageCollectionIT.java index 7f003bf2eb..b1efb4a626 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/GarbageCollectionIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/GarbageCollectionIT.java @@ -27,25 +27,20 @@ import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.git.GarbageCollection; import com.google.gerrit.server.git.GarbageCollectionQueue; import com.google.inject.Inject; - -import org.junit.Before; -import org.junit.Test; - import java.util.Arrays; import java.util.Locale; +import org.junit.Before; +import org.junit.Test; @NoHttpd @UseSsh public class GarbageCollectionIT extends AbstractDaemonTest { - @Inject - private GarbageCollection.Factory garbageCollectionFactory; + @Inject private GarbageCollection.Factory garbageCollectionFactory; - @Inject - private GarbageCollectionQueue gcQueue; + @Inject private GarbageCollectionQueue gcQueue; - @Inject - private GcAssert gcAssert; + @Inject private GcAssert gcAssert; private Project.NameKey project2; private Project.NameKey project3; @@ -60,10 +55,11 @@ public class GarbageCollectionIT extends AbstractDaemonTest { @UseLocalDisk public void testGc() throws Exception { String response = - adminSshSession.exec("gerrit gc \"" + project.get() + "\" \"" - + project2.get() + "\""); - assert_().withFailureMessage(adminSshSession.getError()) - .that(adminSshSession.hasError()).isFalse(); + adminSshSession.exec("gerrit gc \"" + project.get() + "\" \"" + project2.get() + "\""); + assert_() + .withFailureMessage(adminSshSession.getError()) + .that(adminSshSession.hasError()) + .isFalse(); assertNoError(response); gcAssert.assertHasPackFile(project, project2); gcAssert.assertHasNoPackFile(allProjects, project3); @@ -73,8 +69,10 @@ public class GarbageCollectionIT extends AbstractDaemonTest { @UseLocalDisk public void testGcAll() throws Exception { String response = adminSshSession.exec("gerrit gc --all"); - assert_().withFailureMessage(adminSshSession.getError()) - .that(adminSshSession.hasError()).isFalse(); + assert_() + .withFailureMessage(adminSshSession.getError()) + .that(adminSshSession.hasError()) + .isFalse(); assertNoError(response); gcAssert.assertHasPackFile(allProjects, project, project2, project3); } @@ -85,21 +83,24 @@ public class GarbageCollectionIT extends AbstractDaemonTest { assertThat(userSshSession.hasError()).isTrue(); String error = userSshSession.getError(); assertThat(error).isNotNull(); - assertError("One of the following capabilities is required to access this" - + " resource: [runGC, maintainServer]", error); + assertError( + "One of the following capabilities is required to access this" + + " resource: [runGC, maintainServer]", + error); } @Test @UseLocalDisk public void testGcAlreadyScheduled() throws Exception { gcQueue.addAll(Arrays.asList(project)); - GarbageCollectionResult result = garbageCollectionFactory.create().run( - Arrays.asList(allProjects, project, project2, project3)); + GarbageCollectionResult result = + garbageCollectionFactory + .create() + .run(Arrays.asList(allProjects, project, project2, project3)); assertThat(result.hasErrors()).isTrue(); assertThat(result.getErrors()).hasSize(1); GarbageCollectionResult.Error error = result.getErrors().get(0); - assertThat(error.getType()).isEqualTo( - GarbageCollectionResult.Error.Type.GC_ALREADY_SCHEDULED); + assertThat(error.getType()).isEqualTo(GarbageCollectionResult.Error.Type.GC_ALREADY_SCHEDULED); assertThat(error.getProjectName()).isEqualTo(project); } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/QueryIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/QueryIT.java index 11595d04fb..5b7c3340dd 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/QueryIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/QueryIT.java @@ -29,12 +29,10 @@ import com.google.gerrit.extensions.api.changes.ReviewInput; import com.google.gerrit.extensions.client.Side; import com.google.gerrit.server.data.ChangeAttribute; import com.google.gson.Gson; - -import org.junit.Test; - import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import org.junit.Test; @NoHttpd @UseSsh @@ -62,8 +60,7 @@ public class QueryIT extends AbstractDaemonTest { assertThat(changes.get(1).project).isEqualTo(project.toString()); assertThat(changes.get(1).id).isEqualTo(changeId1); - changes = - executeSuccessfulQuery("--start=1 " + changeId1 + " OR " + changeId2); + changes = executeSuccessfulQuery("--start=1 " + changeId1 + " OR " + changeId2); assertThat(changes.size()).isEqualTo(1); assertThat(changes.get(0).project).isEqualTo(project.toString()); assertThat(changes.get(0).id).isEqualTo(changeId1); @@ -104,8 +101,7 @@ public class QueryIT extends AbstractDaemonTest { @Test public void commitMessageOptionJSON() throws Exception { String changeId = createChange().getChangeId(); - List changes = - executeSuccessfulQuery("--commit-message " + changeId); + List changes = executeSuccessfulQuery("--commit-message " + changeId); assertThat(changes.size()).isEqualTo(1); assertThat(changes.get(0).commitMessage).isNotNull(); assertThat(changes.get(0).commitMessage).contains(PushOneCommit.SUBJECT); @@ -131,7 +127,6 @@ public class QueryIT extends AbstractDaemonTest { assertThat(changes.get(0).currentPatchSet).isNotNull(); assertThat(changes.get(0).currentPatchSet.approvals).isNotNull(); assertThat(changes.get(0).currentPatchSet.approvals.size()).isEqualTo(1); - } @Test @@ -151,13 +146,11 @@ public class QueryIT extends AbstractDaemonTest { } @Test - public void shouldFailWithFilesWithoutPatchSetsOrCurrentPatchSetsOption() - throws Exception { + public void shouldFailWithFilesWithoutPatchSetsOrCurrentPatchSetsOption() throws Exception { String changeId = createChange().getChangeId(); adminSshSession.exec("gerrit query --files " + changeId); assertThat(adminSshSession.hasError()).isTrue(); - assertThat(adminSshSession.getError()).contains( - "needs --patch-sets or --current-patch-set"); + assertThat(adminSshSession.getError()).contains("needs --patch-sets or --current-patch-set"); } @Test @@ -176,9 +169,7 @@ public class QueryIT extends AbstractDaemonTest { assertThat(changes.get(0).patchSets.get(0).files.size()).isEqualTo(2); gApi.changes().id(changeId).current().review(ReviewInput.approve()); - changes = - executeSuccessfulQuery("--patch-sets --files --all-approvals " - + changeId); + changes = executeSuccessfulQuery("--patch-sets --files --all-approvals " + changeId); assertThat(changes.size()).isEqualTo(1); assertThat(changes.get(0).patchSets.get(0).files).isNotNull(); assertThat(changes.get(0).patchSets.get(0).files.size()).isEqualTo(2); @@ -213,13 +204,11 @@ public class QueryIT extends AbstractDaemonTest { review.comments.put(comment.path, Lists.newArrayList(comment)); gApi.changes().id(changeId).current().review(review); - List changes = - executeSuccessfulQuery("--current-patch-set " + changeId); + List changes = executeSuccessfulQuery("--current-patch-set " + changeId); assertThat(changes.size()).isEqualTo(1); assertThat(changes.get(0).currentPatchSet.comments).isNull(); - changes = - executeSuccessfulQuery("--current-patch-set --comments " + changeId); + changes = executeSuccessfulQuery("--current-patch-set --comments " + changeId); assertThat(changes.size()).isEqualTo(1); assertThat(changes.get(0).currentPatchSet.comments).isNotNull(); assertThat(changes.get(0).currentPatchSet.comments.size()).isEqualTo(1); @@ -238,8 +227,7 @@ public class QueryIT extends AbstractDaemonTest { review.comments.put(comment.path, Lists.newArrayList(comment)); gApi.changes().id(changeId).current().review(review); - List changes = - executeSuccessfulQuery("--patch-sets " + changeId); + List changes = executeSuccessfulQuery("--patch-sets " + changeId); assertThat(changes.size()).isEqualTo(1); assertThat(changes.get(0).patchSets.get(0).comments).isNull(); @@ -248,8 +236,7 @@ public class QueryIT extends AbstractDaemonTest { assertThat(changes.get(0).patchSets.get(0).comments).isNotNull(); assertThat(changes.get(0).patchSets.get(0).comments.size()).isEqualTo(1); - changes = - executeSuccessfulQuery("--patch-sets --comments --files " + changeId); + changes = executeSuccessfulQuery("--patch-sets --comments --files " + changeId); assertThat(changes.size()).isEqualTo(1); assertThat(changes.get(0).patchSets.get(0).comments).isNotNull(); assertThat(changes.get(0).patchSets.get(0).comments.size()).isEqualTo(1); @@ -257,9 +244,7 @@ public class QueryIT extends AbstractDaemonTest { assertThat(changes.get(0).patchSets.get(0).files.size()).isEqualTo(2); gApi.changes().id(changeId).current().review(ReviewInput.approve()); - changes = - executeSuccessfulQuery("--patch-sets --comments --files --all-approvals " - + changeId); + changes = executeSuccessfulQuery("--patch-sets --comments --files --all-approvals " + changeId); assertThat(changes.size()).isEqualTo(1); assertThat(changes.get(0).patchSets.get(0).comments).isNotNull(); assertThat(changes.get(0).patchSets.get(0).comments.size()).isEqualTo(1); @@ -325,17 +310,14 @@ public class QueryIT extends AbstractDaemonTest { userSession.close(); } - private List executeSuccessfulQuery(String params, - SshSession session) throws Exception { - String rawResponse = - session.exec("gerrit query --format=JSON " + params); - assert_().withFailureMessage(session.getError()) - .that(session.hasError()).isFalse(); + private List executeSuccessfulQuery(String params, SshSession session) + throws Exception { + String rawResponse = session.exec("gerrit query --format=JSON " + params); + assert_().withFailureMessage(session.getError()).that(session.hasError()).isFalse(); return getChanges(rawResponse); } - private List executeSuccessfulQuery(String params) - throws Exception { + private List executeSuccessfulQuery(String params) throws Exception { return executeSuccessfulQuery(params, adminSshSession); } diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/UploadArchiveIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/UploadArchiveIT.java index 2f0dcd3556..6e315de22f 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/UploadArchiveIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/UploadArchiveIT.java @@ -25,7 +25,11 @@ import com.google.gerrit.acceptance.NoHttpd; import com.google.gerrit.acceptance.PushOneCommit; import com.google.gerrit.acceptance.UseSsh; import com.google.gerrit.testutil.NoteDbMode; - +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.util.Set; +import java.util.TreeSet; import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream; import org.eclipse.jgit.transport.PacketLineIn; @@ -34,12 +38,6 @@ import org.eclipse.jgit.util.IO; import org.junit.Before; import org.junit.Test; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.InputStream; -import java.util.Set; -import java.util.TreeSet; - @NoHttpd @UseSsh public class UploadArchiveIT extends AbstractDaemonTest { @@ -58,7 +56,10 @@ public class UploadArchiveIT extends AbstractDaemonTest { } @Test - @GerritConfig(name = "download.archive", values = {"tar", "tbz2", "tgz", "txz"}) + @GerritConfig( + name = "download.archive", + values = {"tar", "tbz2", "tgz", "txz"} + ) public void zipFormatDisabled() throws Exception { archiveNotPermitted(); } @@ -70,8 +71,7 @@ public class UploadArchiveIT extends AbstractDaemonTest { String c = command(r, abbreviated); InputStream out = - adminSshSession.exec2("git-upload-archive " + project.get(), - argumentsToInputStream(c)); + adminSshSession.exec2("git-upload-archive " + project.get(), argumentsToInputStream(c)); // Wrap with PacketLineIn to read ACK bytes from output stream PacketLineIn in = new PacketLineIn(out); @@ -94,16 +94,20 @@ public class UploadArchiveIT extends AbstractDaemonTest { } assertThat(entryNames.size()).isEqualTo(1); - assertThat(Iterables.getOnlyElement(entryNames)).isEqualTo( - String.format("%s/%s", abbreviated, PushOneCommit.FILE_NAME)); + assertThat(Iterables.getOnlyElement(entryNames)) + .isEqualTo(String.format("%s/%s", abbreviated, PushOneCommit.FILE_NAME)); } private String command(PushOneCommit.Result r, String abbreviated) { - String c = "-f=zip " - + "-9 " - + "--prefix=" + abbreviated + "/ " - + r.getCommit().name() + " " - + PushOneCommit.FILE_NAME; + String c = + "-f=zip " + + "-9 " + + "--prefix=" + + abbreviated + + "/ " + + r.getCommit().name() + + " " + + PushOneCommit.FILE_NAME; return c; } @@ -113,8 +117,7 @@ public class UploadArchiveIT extends AbstractDaemonTest { String c = command(r, abbreviated); InputStream out = - adminSshSession.exec2("git-upload-archive " + project.get(), - argumentsToInputStream(c)); + adminSshSession.exec2("git-upload-archive " + project.get(), argumentsToInputStream(c)); // Wrap with PacketLineIn to read ACK bytes from output stream PacketLineIn in = new PacketLineIn(out); diff --git a/gerrit-antlr/src/main/java/com/google/gerrit/server/query/QueryParseException.java b/gerrit-antlr/src/main/java/com/google/gerrit/server/query/QueryParseException.java index 1f69ba7e03..80cffbb6d7 100644 --- a/gerrit-antlr/src/main/java/com/google/gerrit/server/query/QueryParseException.java +++ b/gerrit-antlr/src/main/java/com/google/gerrit/server/query/QueryParseException.java @@ -16,8 +16,8 @@ package com.google.gerrit.server.query; /** * Exception thrown when a search query is invalid. - *

- * NOTE: the message is visible to end users. + * + *

NOTE: the message is visible to end users. */ public class QueryParseException extends Exception { private static final long serialVersionUID = 1L; diff --git a/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/DefaultCacheFactory.java b/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/DefaultCacheFactory.java index ae999f6788..356695592d 100644 --- a/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/DefaultCacheFactory.java +++ b/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/DefaultCacheFactory.java @@ -29,10 +29,8 @@ import com.google.gerrit.server.cache.h2.H2CacheImpl.ValueHolder; import com.google.gerrit.server.config.ConfigUtil; import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; - -import org.eclipse.jgit.lib.Config; - import java.util.concurrent.TimeUnit; +import org.eclipse.jgit.lib.Config; public class DefaultCacheFactory implements MemoryCacheFactory { public static class Module extends LifecycleModule { @@ -50,7 +48,8 @@ public class DefaultCacheFactory implements MemoryCacheFactory { private final ForwardingRemovalListener.Factory forwardingRemovalListenerFactory; @Inject - public DefaultCacheFactory(@GerritServerConfig Config config, + public DefaultCacheFactory( + @GerritServerConfig Config config, ForwardingRemovalListener.Factory forwardingRemovalListenerFactory) { this.cfg = config; this.forwardingRemovalListenerFactory = forwardingRemovalListenerFactory; @@ -62,33 +61,29 @@ public class DefaultCacheFactory implements MemoryCacheFactory { } @Override - public LoadingCache build( - CacheBinding def, - CacheLoader loader) { + public LoadingCache build(CacheBinding def, CacheLoader loader) { return create(def, false).build(loader); } @SuppressWarnings("unchecked") - CacheBuilder create( - CacheBinding def, - boolean unwrapValueHolder) { - CacheBuilder builder = newCacheBuilder(); + CacheBuilder create(CacheBinding def, boolean unwrapValueHolder) { + CacheBuilder builder = newCacheBuilder(); builder.recordStats(); - builder.maximumWeight(cfg.getLong( - "cache", def.name(), "memoryLimit", - def.maximumWeight())); + builder.maximumWeight(cfg.getLong("cache", def.name(), "memoryLimit", def.maximumWeight())); builder = builder.removalListener(forwardingRemovalListenerFactory.create(def.name())); Weigher weigher = def.weigher(); if (weigher != null && unwrapValueHolder) { final Weigher impl = weigher; - weigher = (Weigher) new Weigher> () { - @Override - public int weigh(K key, ValueHolder value) { - return impl.weigh(key, value.value); - } - }; + weigher = + (Weigher) + new Weigher>() { + @Override + public int weigh(K key, ValueHolder value) { + return impl.weigh(key, value.value); + } + }; } else if (weigher == null) { weigher = unitWeight(); } @@ -96,10 +91,10 @@ public class DefaultCacheFactory implements MemoryCacheFactory { Long age = def.expireAfterWrite(TimeUnit.SECONDS); if (has(def.name(), "maxAge")) { - builder.expireAfterWrite(ConfigUtil.getTimeUnit(cfg, - "cache", def.name(), "maxAge", - age != null ? age : 0, - TimeUnit.SECONDS), TimeUnit.SECONDS); + builder.expireAfterWrite( + ConfigUtil.getTimeUnit( + cfg, "cache", def.name(), "maxAge", age != null ? age : 0, TimeUnit.SECONDS), + TimeUnit.SECONDS); } else if (age != null) { builder.expireAfterWrite(age, TimeUnit.SECONDS); } diff --git a/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java b/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java index f7381a39c8..393a74ba88 100644 --- a/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java +++ b/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java @@ -31,11 +31,6 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; import com.google.inject.TypeLiteral; - -import org.eclipse.jgit.lib.Config; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -46,11 +41,13 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import org.eclipse.jgit.lib.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Singleton class H2CacheFactory implements PersistentCacheFactory, LifecycleListener { - private static final Logger log = - LoggerFactory.getLogger(H2CacheFactory.class); + private static final Logger log = LoggerFactory.getLogger(H2CacheFactory.class); private final DefaultCacheFactory defaultFactory; private final Config config; @@ -77,17 +74,16 @@ class H2CacheFactory implements PersistentCacheFactory, LifecycleListener { this.cacheMap = cacheMap; if (cacheDir != null) { - executor = Executors.newFixedThreadPool( - 1, - new ThreadFactoryBuilder() - .setNameFormat("DiskCache-Store-%d") - .build()); - cleanup = Executors.newScheduledThreadPool( - 1, - new ThreadFactoryBuilder() - .setNameFormat("DiskCache-Prune-%d") - .setDaemon(true) - .build()); + executor = + Executors.newFixedThreadPool( + 1, new ThreadFactoryBuilder().setNameFormat("DiskCache-Store-%d").build()); + cleanup = + Executors.newScheduledThreadPool( + 1, + new ThreadFactoryBuilder() + .setNameFormat("DiskCache-Prune-%d") + .setDaemon(true) + .build()); } else { executor = null; cleanup = null; @@ -162,11 +158,14 @@ class H2CacheFactory implements PersistentCacheFactory, LifecycleListener { return defaultFactory.build(def); } - SqlStore store = newSqlStore(def.name(), def.keyType(), limit, - def.expireAfterWrite(TimeUnit.SECONDS)); - H2CacheImpl cache = new H2CacheImpl<>( - executor, store, def.keyType(), - (Cache>) defaultFactory.create(def, true).build()); + SqlStore store = + newSqlStore(def.name(), def.keyType(), limit, def.expireAfterWrite(TimeUnit.SECONDS)); + H2CacheImpl cache = + new H2CacheImpl<>( + executor, + store, + def.keyType(), + (Cache>) defaultFactory.create(def, true).build()); synchronized (caches) { caches.add(cache); } @@ -175,23 +174,21 @@ class H2CacheFactory implements PersistentCacheFactory, LifecycleListener { @SuppressWarnings("unchecked") @Override - public LoadingCache build( - CacheBinding def, - CacheLoader loader) { + public LoadingCache build(CacheBinding def, CacheLoader loader) { long limit = config.getLong("cache", def.name(), "diskLimit", def.diskLimit()); if (cacheDir == null || limit <= 0) { return defaultFactory.build(def, loader); } - SqlStore store = newSqlStore(def.name(), def.keyType(), limit, - def.expireAfterWrite(TimeUnit.SECONDS)); - Cache> mem = (Cache>) - defaultFactory.create(def, true) - .build((CacheLoader) new H2CacheImpl.Loader<>( - executor, store, loader)); - H2CacheImpl cache = new H2CacheImpl<>( - executor, store, def.keyType(), mem); + SqlStore store = + newSqlStore(def.name(), def.keyType(), limit, def.expireAfterWrite(TimeUnit.SECONDS)); + Cache> mem = + (Cache>) + defaultFactory + .create(def, true) + .build((CacheLoader) new H2CacheImpl.Loader<>(executor, store, loader)); + H2CacheImpl cache = new H2CacheImpl<>(executor, store, def.keyType(), mem); caches.add(cache); return cache; } @@ -210,10 +207,7 @@ class H2CacheFactory implements PersistentCacheFactory, LifecycleListener { } private SqlStore newSqlStore( - String name, - TypeLiteral keyType, - long maxSize, - Long expireAfterWrite) { + String name, TypeLiteral keyType, long maxSize, Long expireAfterWrite) { StringBuilder url = new StringBuilder(); url.append("jdbc:h2:").append(cacheDir.resolve(name).toUri()); if (h2CacheSize >= 0) { @@ -224,7 +218,10 @@ class H2CacheFactory implements PersistentCacheFactory, LifecycleListener { if (h2AutoServer) { url.append(";AUTO_SERVER=TRUE"); } - return new SqlStore<>(url.toString(), keyType, maxSize, + return new SqlStore<>( + url.toString(), + keyType, + maxSize, expireAfterWrite == null ? 0 : expireAfterWrite.longValue()); } } diff --git a/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java b/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java index 7e0523686f..bed6f38ca9 100644 --- a/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java +++ b/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java @@ -28,11 +28,6 @@ import com.google.common.hash.PrimitiveSink; import com.google.gerrit.common.TimeUtil; import com.google.gerrit.server.cache.PersistentCache; import com.google.inject.TypeLiteral; - -import org.h2.jdbc.JdbcSQLException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.io.InvalidClassException; import java.io.ObjectOutputStream; @@ -54,44 +49,44 @@ import java.util.concurrent.Executor; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; +import org.h2.jdbc.JdbcSQLException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Hybrid in-memory and database backed cache built on H2. - *

- * This cache can be used as either a recall cache, or a loading cache if a - * CacheLoader was supplied to its constructor at build time. Before creating an - * entry the in-memory cache is checked for the item, then the database is - * checked, and finally the CacheLoader is used to construct the item. This is - * mostly useful for CacheLoaders that are computationally intensive, such as - * the PatchListCache. - *

- * Cache stores and invalidations are performed on a background thread, hiding - * the latency associated with serializing the key and value pairs and writing - * them to the database log. - *

- * A BloomFilter is used around the database to reduce the number of SELECTs - * issued against the database for new cache items that have not been seen - * before, a common operation for the PatchListCache. The BloomFilter is sized - * when the cache starts to be 64,000 entries or double the number of items - * currently in the database table. - *

- * This cache does not export its items as a ConcurrentMap. + * + *

This cache can be used as either a recall cache, or a loading cache if a CacheLoader was + * supplied to its constructor at build time. Before creating an entry the in-memory cache is + * checked for the item, then the database is checked, and finally the CacheLoader is used to + * construct the item. This is mostly useful for CacheLoaders that are computationally intensive, + * such as the PatchListCache. + * + *

Cache stores and invalidations are performed on a background thread, hiding the latency + * associated with serializing the key and value pairs and writing them to the database log. + * + *

A BloomFilter is used around the database to reduce the number of SELECTs issued against the + * database for new cache items that have not been seen before, a common operation for the + * PatchListCache. The BloomFilter is sized when the cache starts to be 64,000 entries or double the + * number of items currently in the database table. + * + *

This cache does not export its items as a ConcurrentMap. * * @see H2CacheFactory */ -public class H2CacheImpl extends AbstractLoadingCache implements - PersistentCache { +public class H2CacheImpl extends AbstractLoadingCache implements PersistentCache { private static final Logger log = LoggerFactory.getLogger(H2CacheImpl.class); - private static final ImmutableSet OLD_CLASS_NAMES = ImmutableSet.of( - "com.google.gerrit.server.change.ChangeKind"); + private static final ImmutableSet OLD_CLASS_NAMES = + ImmutableSet.of("com.google.gerrit.server.change.ChangeKind"); private final Executor executor; private final SqlStore store; private final TypeLiteral keyType; private final Cache> mem; - H2CacheImpl(Executor executor, + H2CacheImpl( + Executor executor, SqlStore store, TypeLiteral keyType, Cache> mem) { @@ -134,8 +129,7 @@ public class H2CacheImpl extends AbstractLoadingCache implements } @Override - public V get(K key, Callable valueLoader) - throws ExecutionException { + public V get(K key, Callable valueLoader) throws ExecutionException { return mem.get(key, new LoadingCallable(key, valueLoader)).value; } @@ -287,8 +281,7 @@ public class H2CacheImpl extends AbstractLoadingCache implements @Override public void funnel(K from, PrimitiveSink into) { - try (ObjectOutputStream ser = - new ObjectOutputStream(new SinkOutputStream(into))) { + try (ObjectOutputStream ser = new ObjectOutputStream(new SinkOutputStream(into))) { ser.writeObject(from); ser.flush(); } catch (IOException err) { @@ -307,30 +300,30 @@ public class H2CacheImpl extends AbstractLoadingCache implements } static final KeyType OTHER = new KeyType<>(); - static final KeyType STRING = new KeyType() { - @Override - String columnType() { - return "VARCHAR(4096)"; - } + static final KeyType STRING = + new KeyType() { + @Override + String columnType() { + return "VARCHAR(4096)"; + } - @Override - String get(ResultSet rs, int col) throws SQLException { - return rs.getString(col); - } + @Override + String get(ResultSet rs, int col) throws SQLException { + return rs.getString(col); + } - @Override - void set(PreparedStatement ps, int col, String value) - throws SQLException { - ps.setString(col, value); - } + @Override + void set(PreparedStatement ps, int col, String value) throws SQLException { + ps.setString(col, value); + } - @SuppressWarnings("unchecked") - @Override - Funnel funnel() { - Funnel s = Funnels.unencodedCharsFunnel(); - return (Funnel) s; - } - }; + @SuppressWarnings("unchecked") + @Override + Funnel funnel() { + Funnel s = Funnels.unencodedCharsFunnel(); + return (Funnel) s; + } + }; } static class SqlStore { @@ -344,8 +337,7 @@ public class H2CacheImpl extends AbstractLoadingCache implements private volatile BloomFilter bloomFilter; private int estimatedSize; - SqlStore(String jdbcUrl, TypeLiteral keyType, long maxSize, - long expireAfterWrite) { + SqlStore(String jdbcUrl, TypeLiteral keyType, long maxSize, long expireAfterWrite) { this.url = jdbcUrl; this.keyType = KeyType.create(keyType); this.maxSize = maxSize; @@ -401,9 +393,11 @@ public class H2CacheImpl extends AbstractLoadingCache implements } } catch (JdbcSQLException e) { if (e.getCause() instanceof InvalidClassException) { - log.warn("Entries cached for " + url - + " have an incompatible class and can't be deserialized. " - + "Cache is flushed."); + log.warn( + "Entries cached for " + + url + + " have an incompatible class and can't be deserialized. " + + "Cache is flushed."); invalidateAll(); } else { throw e; @@ -464,8 +458,7 @@ public class H2CacheImpl extends AbstractLoadingCache implements private static boolean isOldClassNameError(Throwable t) { for (Throwable c : Throwables.getCausalChain(t)) { - if (c instanceof ClassNotFoundException - && OLD_CLASS_NAMES.contains(c.getMessage())) { + if (c instanceof ClassNotFoundException && OLD_CLASS_NAMES.contains(c.getMessage())) { return true; } } @@ -575,21 +568,22 @@ public class H2CacheImpl extends AbstractLoadingCache implements c = acquire(); try (Statement s = c.conn.createStatement()) { long used = 0; - try (ResultSet r = s.executeQuery("SELECT" - + " SUM(OCTET_LENGTH(k) + OCTET_LENGTH(v))" - + " FROM data")) { + try (ResultSet r = + s.executeQuery("SELECT" + " SUM(OCTET_LENGTH(k) + OCTET_LENGTH(v))" + " FROM data")) { used = r.next() ? r.getLong(1) : 0; } if (used <= maxSize) { return; } - try (ResultSet r = s.executeQuery("SELECT" - + " k" - + ",OCTET_LENGTH(k) + OCTET_LENGTH(v)" - + ",created" - + " FROM data" - + " ORDER BY accessed")) { + try (ResultSet r = + s.executeQuery( + "SELECT" + + " k" + + ",OCTET_LENGTH(k) + OCTET_LENGTH(v)" + + ",created" + + " FROM data" + + " ORDER BY accessed")) { while (maxSize < used && r.next()) { K key = keyType.get(r, 1); Timestamp created = r.getTimestamp(3); @@ -617,10 +611,12 @@ public class H2CacheImpl extends AbstractLoadingCache implements try { c = acquire(); try (Statement s = c.conn.createStatement(); - ResultSet r = s.executeQuery("SELECT" - + " COUNT(*)" - + ",SUM(OCTET_LENGTH(k) + OCTET_LENGTH(v))" - + " FROM data")) { + ResultSet r = + s.executeQuery( + "SELECT" + + " COUNT(*)" + + ",SUM(OCTET_LENGTH(k) + OCTET_LENGTH(v))" + + " FROM data")) { if (r.next()) { size = r.getLong(1); space = r.getLong(2); @@ -671,12 +667,15 @@ public class H2CacheImpl extends AbstractLoadingCache implements this.url = url; this.conn = org.h2.Driver.load().connect(url, null); try (Statement stmt = conn.createStatement()) { - stmt.execute("CREATE TABLE IF NOT EXISTS data" - + "(k " + type.columnType() + " NOT NULL PRIMARY KEY HASH" - + ",v OTHER NOT NULL" - + ",created TIMESTAMP NOT NULL" - + ",accessed TIMESTAMP NOT NULL" - + ")"); + stmt.execute( + "CREATE TABLE IF NOT EXISTS data" + + "(k " + + type.columnType() + + " NOT NULL PRIMARY KEY HASH" + + ",v OTHER NOT NULL" + + ",created TIMESTAMP NOT NULL" + + ",accessed TIMESTAMP NOT NULL" + + ")"); } } @@ -718,7 +717,7 @@ public class H2CacheImpl extends AbstractLoadingCache implements @Override public void write(int b) { - sink.putByte((byte)b); + sink.putByte((byte) b); } @Override diff --git a/gerrit-cache-h2/src/test/java/com/google/gerrit/server/cache/h2/H2CacheTest.java b/gerrit-cache-h2/src/test/java/com/google/gerrit/server/cache/h2/H2CacheTest.java index c999d719bc..87d5db3c94 100644 --- a/gerrit-cache-h2/src/test/java/com/google/gerrit/server/cache/h2/H2CacheTest.java +++ b/gerrit-cache-h2/src/test/java/com/google/gerrit/server/cache/h2/H2CacheTest.java @@ -24,13 +24,11 @@ import com.google.common.util.concurrent.MoreExecutors; import com.google.gerrit.server.cache.h2.H2CacheImpl.SqlStore; import com.google.gerrit.server.cache.h2.H2CacheImpl.ValueHolder; import com.google.inject.TypeLiteral; - -import org.junit.Before; -import org.junit.Test; - import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.atomic.AtomicBoolean; +import org.junit.Before; +import org.junit.Test; public class H2CacheTest { private static int dbCnt; @@ -43,13 +41,9 @@ public class H2CacheTest { mem = CacheBuilder.newBuilder().build(); TypeLiteral keyType = new TypeLiteral() {}; - SqlStore store = new SqlStore<>( - "jdbc:h2:mem:" + "Test_" + (++dbCnt), - keyType, - 1 << 20, - 0); - impl = - new H2CacheImpl<>(MoreExecutors.directExecutor(), store, keyType, mem); + SqlStore store = + new SqlStore<>("jdbc:h2:mem:" + "Test_" + (++dbCnt), keyType, 1 << 20, 0); + impl = new H2CacheImpl<>(MoreExecutors.directExecutor(), store, keyType, mem); } @Test @@ -57,26 +51,32 @@ public class H2CacheTest { assertNull(impl.getIfPresent("foo")); final AtomicBoolean called = new AtomicBoolean(); - assertTrue(impl.get("foo", new Callable() { - @Override - public Boolean call() throws Exception { - called.set(true); - return true; - } - })); + assertTrue( + impl.get( + "foo", + new Callable() { + @Override + public Boolean call() throws Exception { + called.set(true); + return true; + } + })); assertTrue("used Callable", called.get()); assertTrue("exists in cache", impl.getIfPresent("foo")); mem.invalidate("foo"); assertTrue("exists on disk", impl.getIfPresent("foo")); called.set(false); - assertTrue(impl.get("foo", new Callable() { - @Override - public Boolean call() throws Exception { - called.set(true); - return true; - } - })); + assertTrue( + impl.get( + "foo", + new Callable() { + @Override + public Boolean call() throws Exception { + called.set(true); + return true; + } + })); assertFalse("did not invoke Callable", called.get()); } } diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/FileUtil.java b/gerrit-common/src/main/java/com/google/gerrit/common/FileUtil.java index 83dc4d85bb..4c5583fb8c 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/FileUtil.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/FileUtil.java @@ -15,17 +15,15 @@ package com.google.gerrit.common; import com.google.common.annotations.GwtIncompatible; - -import org.eclipse.jgit.lib.Constants; -import org.eclipse.jgit.storage.file.FileBasedConfig; -import org.eclipse.jgit.util.IO; - import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.Arrays; +import org.eclipse.jgit.lib.Constants; +import org.eclipse.jgit.storage.file.FileBasedConfig; +import org.eclipse.jgit.util.IO; @GwtIncompatible("Unemulated classes in java.io, java.nio and JGit") public class FileUtil { @@ -73,10 +71,10 @@ public class FileUtil { /** * Get the last modified time of a path. - *

- * Equivalent to {@code File#lastModified()}, returning 0 on errors, including - * file not found. Callers that prefer exceptions can use {@link - * Files#getLastModifiedTime(Path, java.nio.file.LinkOption...)}. + * + *

Equivalent to {@code File#lastModified()}, returning 0 on errors, including file not found. + * Callers that prefer exceptions can use {@link Files#getLastModifiedTime(Path, + * java.nio.file.LinkOption...)}. * * @param p path. * @return last modified time, in milliseconds since epoch. @@ -100,6 +98,5 @@ public class FileUtil { } } - private FileUtil() { - } + private FileUtil() {} } diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/IoUtil.java b/gerrit-common/src/main/java/com/google/gerrit/common/IoUtil.java index 3422a78dcb..77a0a5f113 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/IoUtil.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/IoUtil.java @@ -16,7 +16,6 @@ package com.google.gerrit.common; import com.google.common.annotations.GwtIncompatible; import com.google.common.collect.Sets; - import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -32,8 +31,7 @@ import java.util.Set; @GwtIncompatible("Unemulated methods in Class and OutputStream") public final class IoUtil { - public static void copyWithThread(final InputStream src, - final OutputStream dst) { + public static void copyWithThread(final InputStream src, final OutputStream dst) { new Thread("IoUtil-Copy") { @Override public void run() { @@ -80,8 +78,7 @@ public final class IoUtil { if (have.add(url)) { addURL.invoke(cl, url); } - } catch (MalformedURLException | IllegalArgumentException | - IllegalAccessException e) { + } catch (MalformedURLException | IllegalArgumentException | IllegalAccessException e) { throw noAddURL("addURL " + path + " failed", e); } catch (InvocationTargetException e) { throw noAddURL("addURL " + path + " failed", e.getCause()); @@ -97,6 +94,6 @@ public final class IoUtil { String prefix = "Cannot extend classpath: "; return new UnsupportedOperationException(prefix + m, why); } - private IoUtil() { - } + + private IoUtil() {} } diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/Nullable.java b/gerrit-common/src/main/java/com/google/gerrit/common/Nullable.java index 46db282d84..f33687fa6f 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/Nullable.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/Nullable.java @@ -18,9 +18,6 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Retention; -/** - * Gerrit's own replacement for the javax.annotations.Nullable - */ +/** Gerrit's own replacement for the javax.annotations.Nullable */ @Retention(RUNTIME) -public @interface Nullable { -} +public @interface Nullable {} diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/PageLinks.java b/gerrit-common/src/main/java/com/google/gerrit/common/PageLinks.java index 795ec6a09d..692285f598 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/PageLinks.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/PageLinks.java @@ -125,7 +125,7 @@ public class PageLinks { } public static String projectQuery(Project.NameKey proj, Status status) { - return status(status) + " " + op("project", proj.get()); + return status(status) + " " + op("project", proj.get()); } public static String topicQuery(Status status, String topic) { @@ -135,12 +135,11 @@ public class PageLinks { case DRAFT: case MERGED: case NEW: - return toChangeQuery(op("topic", topic) + " (" + - status(Status.NEW) + " OR " + - status(Status.MERGED) + ")"); + return toChangeQuery( + op("topic", topic) + " (" + status(Status.NEW) + " OR " + status(Status.MERGED) + ")"); } return toChangeQuery(status(status) + " " + op("topic", topic)); -} + } public static String toGroup(AccountGroup.UUID uuid) { return ADMIN_GROUPS + "uuid-" + uuid; @@ -185,6 +184,5 @@ public class PageLinks { return value.matches("[^\u0000-\u0020!\"#$%&'():;?\\[\\]{}~]+"); } - protected PageLinks() { - } + protected PageLinks() {} } diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/PluginData.java b/gerrit-common/src/main/java/com/google/gerrit/common/PluginData.java index 4645158cc2..b14543d343 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/PluginData.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/PluginData.java @@ -15,7 +15,6 @@ package com.google.gerrit.common; import com.google.common.annotations.GwtIncompatible; - import java.nio.file.Path; import java.util.Objects; @@ -35,7 +34,8 @@ public class PluginData { public boolean equals(Object obj) { if (obj instanceof PluginData) { PluginData o = (PluginData) obj; - return Objects.equals(name, o.name) && Objects.equals(version, o.version) + return Objects.equals(name, o.name) + && Objects.equals(version, o.version) && Objects.equals(pluginPath, o.pluginPath); } return super.equals(obj); diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/ProjectAccessUtil.java b/gerrit-common/src/main/java/com/google/gerrit/common/ProjectAccessUtil.java index 5e297d4443..5be0878299 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/ProjectAccessUtil.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/ProjectAccessUtil.java @@ -16,7 +16,6 @@ package com.google.gerrit.common; import com.google.gerrit.common.data.AccessSection; import com.google.gerrit.common.data.Permission; - import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedHashMap; diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/ProjectUtil.java b/gerrit-common/src/main/java/com/google/gerrit/common/ProjectUtil.java index 0fba41e47b..bfd5ef9294 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/ProjectUtil.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/ProjectUtil.java @@ -28,6 +28,5 @@ public class ProjectUtil { return name; } - private ProjectUtil() { - } + private ProjectUtil() {} } diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/RawInputUtil.java b/gerrit-common/src/main/java/com/google/gerrit/common/RawInputUtil.java index edcd11183d..961f43a63a 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/RawInputUtil.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/RawInputUtil.java @@ -19,11 +19,9 @@ import static java.nio.charset.StandardCharsets.UTF_8; import com.google.common.annotations.GwtIncompatible; import com.google.common.base.Preconditions; import com.google.gerrit.extensions.restapi.RawInput; - import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; - import javax.servlet.http.HttpServletRequest; @GwtIncompatible("Unemulated classes in java.io and javax.servlet") diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/SiteLibraryLoaderUtil.java b/gerrit-common/src/main/java/com/google/gerrit/common/SiteLibraryLoaderUtil.java index bf87d7ba24..538565a202 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/SiteLibraryLoaderUtil.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/SiteLibraryLoaderUtil.java @@ -20,21 +20,18 @@ import com.google.common.annotations.GwtIncompatible; import com.google.common.collect.ComparisonChain; import com.google.common.collect.ImmutableList; import com.google.common.collect.Ordering; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.nio.file.DirectoryStream; import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.nio.file.Path; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @GwtIncompatible("Unemulated classes in java.nio and Guava") public final class SiteLibraryLoaderUtil { - private static final Logger log = - LoggerFactory.getLogger(SiteLibraryLoaderUtil.class); + private static final Logger log = LoggerFactory.getLogger(SiteLibraryLoaderUtil.class); public static void loadSiteLib(Path libdir) { try { @@ -45,14 +42,14 @@ public final class SiteLibraryLoaderUtil { } public static List listJars(Path dir) throws IOException { - DirectoryStream.Filter filter = new DirectoryStream.Filter() { - @Override - public boolean accept(Path entry) throws IOException { - String name = entry.getFileName().toString(); - return (name.endsWith(".jar") || name.endsWith(".zip")) - && Files.isRegularFile(entry); - } - }; + DirectoryStream.Filter filter = + new DirectoryStream.Filter() { + @Override + public boolean accept(Path entry) throws IOException { + String name = entry.getFileName().toString(); + return (name.endsWith(".jar") || name.endsWith(".zip")) && Files.isRegularFile(entry); + } + }; try (DirectoryStream jars = Files.newDirectoryStream(dir, filter)) { return new Ordering() { @Override @@ -69,6 +66,5 @@ public final class SiteLibraryLoaderUtil { } } - private SiteLibraryLoaderUtil() { - } + private SiteLibraryLoaderUtil() {} } diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/TimeUtil.java b/gerrit-common/src/main/java/com/google/gerrit/common/TimeUtil.java index ec91a81ab5..a8e40c6cb4 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/TimeUtil.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/TimeUtil.java @@ -15,10 +15,8 @@ package com.google.gerrit.common; import com.google.common.annotations.GwtIncompatible; - -import org.joda.time.DateTimeUtils; - import java.sql.Timestamp; +import org.joda.time.DateTimeUtils; /** Static utility methods for dealing with dates and times. */ @GwtIncompatible("Unemulated org.joda.time.DateTimeUtils") @@ -35,6 +33,5 @@ public class TimeUtil { return new Timestamp((t.getTime() / 1000) * 1000); } - private TimeUtil() { - } + private TimeUtil() {} } diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/audit/Audit.java b/gerrit-common/src/main/java/com/google/gerrit/common/audit/Audit.java index 90c7f75165..25e4caf67f 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/audit/Audit.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/audit/Audit.java @@ -22,8 +22,7 @@ import java.lang.annotation.Target; /** * Audit annotation for JSON/RPC interfaces. * - * Flag with @Audit all the JSON/RPC methods to - * be traced in audit-trail and submitted to the + *

Flag with @Audit all the JSON/RPC methods to be traced in audit-trail and submitted to the * AuditService. */ @Retention(RetentionPolicy.RUNTIME) diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/auth/SignInRequired.java b/gerrit-common/src/main/java/com/google/gerrit/common/auth/SignInRequired.java index 1b9011a78a..bcebf5c390 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/auth/SignInRequired.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/auth/SignInRequired.java @@ -21,12 +21,10 @@ import java.lang.annotation.Target; /** * Annotation indicating a service method requires a current user. - *

- * If there is no current user then - * {@code com.google.gerrit.common.errors.NotSignedInException} will be given to - * the callback's onFailure method. + * + *

If there is no current user then {@code com.google.gerrit.common.errors.NotSignedInException} + * will be given to the callback's onFailure method. */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) -public @interface SignInRequired { -} +public @interface SignInRequired {} diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/AccessSection.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/AccessSection.java index e8d1a3ba70..4e145144b6 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/AccessSection.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/AccessSection.java @@ -15,7 +15,6 @@ package com.google.gerrit.common.data; import com.google.gerrit.reviewdb.client.Project; - import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; @@ -23,15 +22,13 @@ import java.util.List; import java.util.Set; /** Portion of a {@link Project} describing access rules. */ -public class AccessSection extends RefConfigSection implements - Comparable { +public class AccessSection extends RefConfigSection implements Comparable { /** Special name given to the global capabilities; not a valid reference. */ public static final String GLOBAL_CAPABILITIES = "GLOBAL_CAPABILITIES"; protected List permissions; - protected AccessSection() { - } + protected AccessSection() {} public AccessSection(String refPattern) { super(refPattern); @@ -87,7 +84,7 @@ public class AccessSection extends RefConfigSection implements public void removePermission(String name) { if (permissions != null) { - for (Iterator itr = permissions.iterator(); itr.hasNext();) { + for (Iterator itr = permissions.iterator(); itr.hasNext(); ) { if (name.equalsIgnoreCase(itr.next().getName())) { itr.remove(); } @@ -128,7 +125,7 @@ public class AccessSection extends RefConfigSection implements if (!super.equals(obj) || !(obj instanceof AccessSection)) { return false; } - return new HashSet<>(getPermissions()).equals(new HashSet<>( - ((AccessSection) obj).getPermissions())); + return new HashSet<>(getPermissions()) + .equals(new HashSet<>(((AccessSection) obj).getPermissions())); } } diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/AccountInfo.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/AccountInfo.java index e8f9fd591c..d6ddddbe7f 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/AccountInfo.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/AccountInfo.java @@ -23,15 +23,13 @@ public class AccountInfo { protected String preferredEmail; protected String username; - protected AccountInfo() { - } + protected AccountInfo() {} /** * Create an 'Anonymous Coward' account info, when only the id is known. - *

- * This constructor should only be a last-ditch effort, when the usual account - * lookup has failed and a stale account id has been discovered in the data - * store. + * + *

This constructor should only be a last-ditch effort, when the usual account lookup has + * failed and a stale account id has been discovered in the data store. */ public AccountInfo(final Account.Id id) { this.id = id; diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/AccountSecurity.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/AccountSecurity.java index afd673497c..f71605820c 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/AccountSecurity.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/AccountSecurity.java @@ -21,7 +21,6 @@ import com.google.gwtjsonrpc.common.AsyncCallback; import com.google.gwtjsonrpc.common.RemoteJsonService; import com.google.gwtjsonrpc.common.RpcImpl; import com.google.gwtjsonrpc.common.RpcImpl.Version; - import java.util.List; import java.util.Set; @@ -32,6 +31,6 @@ public interface AccountSecurity extends RemoteJsonService { @Audit @SignInRequired - void deleteExternalIds(Set keys, - AsyncCallback> callback); + void deleteExternalIds( + Set keys, AsyncCallback> callback); } diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/AgreementInfo.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/AgreementInfo.java index 7464bd1acf..4fb40531d1 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/AgreementInfo.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/AgreementInfo.java @@ -21,8 +21,7 @@ public class AgreementInfo { public List accepted; public Map agreements; - public AgreementInfo() { - } + public AgreementInfo() {} public void setAccepted(List a) { accepted = a; diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/CommentDetail.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/CommentDetail.java index fa282caa11..ed7c79bfca 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/CommentDetail.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/CommentDetail.java @@ -17,7 +17,6 @@ package com.google.gerrit.common.data; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Comment; import com.google.gerrit.reviewdb.client.PatchSet; - import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -40,8 +39,7 @@ public class CommentDetail { this.idB = idB; } - protected CommentDetail() { - } + protected CommentDetail() {} public void include(Change.Id changeId, Comment p) { PatchSet.Id psId = new PatchSet.Id(changeId, p.key.patchSetId); @@ -86,13 +84,13 @@ public class CommentDetail { private static List get(Map> m, int i) { List r = m.get(i); - return r != null ? orderComments(r) : Collections. emptyList(); + return r != null ? orderComments(r) : Collections.emptyList(); } /** - * Order the comments based on their parent_uuid parent. It is possible to do this by - * iterating over the list only once but it's probably overkill since the number of comments - * on a given line will be small most of the time. + * Order the comments based on their parent_uuid parent. It is possible to do this by iterating + * over the list only once but it's probably overkill since the number of comments on a given line + * will be small most of the time. * * @param comments The list of comments for a given line. * @return The comments sorted as they should appear in the UI @@ -130,11 +128,9 @@ public class CommentDetail { return result; } - /** - * Add the comments to {@code outResult}, depth first - */ - private static void addChildren(Map> parentMap, - List children, List outResult) { + /** Add the comments to {@code outResult}, depth first */ + private static void addChildren( + Map> parentMap, List children, List outResult) { if (children != null) { for (Comment c : children) { outResult.add(c); diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/ContributorAgreement.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/ContributorAgreement.java index 17f640d708..2f8755e00e 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/ContributorAgreement.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/ContributorAgreement.java @@ -15,7 +15,6 @@ package com.google.gerrit.common.data; import com.google.gerrit.reviewdb.client.Project; - import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -28,8 +27,7 @@ public class ContributorAgreement implements Comparable { protected GroupReference autoVerify; protected String agreementUrl; - protected ContributorAgreement() { - } + protected ContributorAgreement() {} public ContributorAgreement(String name) { setName(name); @@ -95,7 +93,7 @@ public class ContributorAgreement implements Comparable { if (autoVerify != null) { ca.autoVerify = new GroupReference(); } - ca.agreementUrl = agreementUrl ; + ca.agreementUrl = agreementUrl; return ca; } } diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/FilenameComparator.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/FilenameComparator.java index 535130a1d5..9c34c97f8e 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/FilenameComparator.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/FilenameComparator.java @@ -15,7 +15,6 @@ package com.google.gerrit.common.data; import com.google.gerrit.reviewdb.client.Patch; - import java.util.Arrays; import java.util.Comparator; import java.util.HashSet; @@ -24,8 +23,8 @@ import java.util.Set; public class FilenameComparator implements Comparator { public static final FilenameComparator INSTANCE = new FilenameComparator(); - private static final Set cppHeaderSuffixes = new HashSet<>( - Arrays.asList(".h", ".hxx", ".hpp")); + private static final Set cppHeaderSuffixes = + new HashSet<>(Arrays.asList(".h", ".hxx", ".hpp")); private FilenameComparator() {} @@ -48,8 +47,7 @@ public class FilenameComparator implements Comparator { int s1 = path1.lastIndexOf('.'); int s2 = path2.lastIndexOf('.'); - if (s1 > 0 && s2 > 0 && - path1.substring(0, s1).equals(path2.substring(0, s2))) { + if (s1 > 0 && s2 > 0 && path1.substring(0, s1).equals(path2.substring(0, s2))) { String suffixA = path1.substring(s1); String suffixB = path2.substring(s2); // C++ and C: give priority to header files (.h/.hpp/...) diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/GarbageCollectionResult.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/GarbageCollectionResult.java index 0156b7dbfe..a6c534c431 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/GarbageCollectionResult.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/GarbageCollectionResult.java @@ -15,7 +15,6 @@ package com.google.gerrit.common.data; import com.google.gerrit.reviewdb.client.Project; - import java.util.ArrayList; import java.util.List; @@ -53,8 +52,7 @@ public class GarbageCollectionResult { protected Type type; protected Project.NameKey projectName; - protected Error() { - } + protected Error() {} public Error(Type type, Project.NameKey projectName) { this.type = type; diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/GitwebType.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/GitwebType.java index 0ec7701ec9..248de49b87 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/GitwebType.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/GitwebType.java @@ -157,10 +157,10 @@ public class GitwebType { /** * Replace standard path separator with custom configured path separator. * - * @param urlSegment URL segment (e.g. branch or project name) in which to - * replace the path separator. - * @return the segment with the standard path separator replaced by the custom - * {@link #getPathSeparator()}. + * @param urlSegment URL segment (e.g. branch or project name) in which to replace the path + * separator. + * @return the segment with the standard path separator replaced by the custom {@link + * #getPathSeparator()}. */ public String replacePathSeparator(String urlSegment) { if ('/' != pathSeparator) { diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/GlobalCapability.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/GlobalCapability.java index 31c2481d13..4c9b64a30d 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/GlobalCapability.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/GlobalCapability.java @@ -26,11 +26,10 @@ public class GlobalCapability { /** * Denotes the server's administrators. - *

- * This is similar to UNIX root, or Windows SYSTEM account. Any user that - * has this capability can perform almost any other action, or can grant - * themselves the power to perform any other action on the site. Most of - * the other capabilities and permissions fall-back to the predicate + * + *

This is similar to UNIX root, or Windows SYSTEM account. Any user that has this capability + * can perform almost any other action, or can grant themselves the power to perform any other + * action on the site. Most of the other capabilities and permissions fall-back to the predicate * "OR user has capability ADMINISTRATE_SERVER". */ public static final String ADMINISTRATE_SERVER = "administrateServer"; @@ -39,9 +38,8 @@ public class GlobalCapability { public static final String BATCH_CHANGES_LIMIT = "batchChangesLimit"; /** - * Default maximum number of changes that may be pushed in a batch, 0 means no - * limit. This is just used as a suggestion for prepopulating the field in the - * access UI. + * Default maximum number of changes that may be pushed in a batch, 0 means no limit. This is just + * used as a suggestion for prepopulating the field in the access UI. */ public static final int DEFAULT_MAX_BATCH_CHANGES_LIMIT = 0; @@ -56,12 +54,11 @@ public class GlobalCapability { /** * Denotes who may email change reviewers and watchers. - *

- * This can be used to deny build bots from emailing reviewers and people who - * watch the change. Instead, only the authors of the change and those who - * starred it will be emailed. The allow rules are evaluated before deny - * rules, however the default is to allow emailing, if no explicit rule is - * matched. + * + *

This can be used to deny build bots from emailing reviewers and people who watch the change. + * Instead, only the authors of the change and those who starred it will be emailed. The allow + * rules are evaluated before deny rules, however the default is to allow emailing, if no explicit + * rule is matched. */ public static final String EMAIL_REVIEWERS = "emailReviewers"; @@ -73,11 +70,10 @@ public class GlobalCapability { /** * Can perform limited server maintenance. - *

- * Includes tasks such as reindexing changes and flushing caches that may need - * to be performed regularly. Does not grant arbitrary - * read/write/ACL management permissions as does {@link - * #ADMINISTRATE_SERVER}. + * + *

Includes tasks such as reindexing changes and flushing caches that may need to be performed + * regularly. Does not grant arbitrary read/write/ACL management permissions as + * does {@link #ADMINISTRATE_SERVER}. */ public static final String MAINTAIN_SERVER = "maintainServer"; @@ -162,23 +158,18 @@ public class GlobalCapability { /** @return true if the capability should have a range attached. */ public static boolean hasRange(String varName) { - return QUERY_LIMIT.equalsIgnoreCase(varName) - || BATCH_CHANGES_LIMIT.equalsIgnoreCase(varName); + return QUERY_LIMIT.equalsIgnoreCase(varName) || BATCH_CHANGES_LIMIT.equalsIgnoreCase(varName); } /** @return the valid range for the capability if it has one, otherwise null. */ public static PermissionRange.WithDefaults getRange(String varName) { if (QUERY_LIMIT.equalsIgnoreCase(varName)) { return new PermissionRange.WithDefaults( - varName, - 0, Integer.MAX_VALUE, - 0, DEFAULT_MAX_QUERY_LIMIT); + varName, 0, Integer.MAX_VALUE, 0, DEFAULT_MAX_QUERY_LIMIT); } if (BATCH_CHANGES_LIMIT.equalsIgnoreCase(varName)) { return new PermissionRange.WithDefaults( - varName, - 0, Integer.MAX_VALUE, - 0, DEFAULT_MAX_BATCH_CHANGES_LIMIT); + varName, 0, Integer.MAX_VALUE, 0, DEFAULT_MAX_BATCH_CHANGES_LIMIT); } return null; } diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupDescription.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupDescription.java index 86b0b39cc7..62a85443d2 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupDescription.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupDescription.java @@ -17,13 +17,9 @@ package com.google.gerrit.common.data; import com.google.gerrit.common.Nullable; import com.google.gerrit.reviewdb.client.AccountGroup; -/** - * Group methods exposed by the GroupBackend. - */ +/** Group methods exposed by the GroupBackend. */ public class GroupDescription { - /** - * The Basic information required to be exposed by any Group. - */ + /** The Basic information required to be exposed by any Group. */ public interface Basic { /** @return the non-null UUID of the group. */ AccountGroup.UUID getGroupUUID(); @@ -32,31 +28,25 @@ public class GroupDescription { String getName(); /** - * @return optional email address to send to the group's members. If - * provided, Gerrit will use this email address to send - * change notifications to the group. + * @return optional email address to send to the group's members. If provided, Gerrit will use + * this email address to send change notifications to the group. */ @Nullable String getEmailAddress(); /** - * @return optional URL to information about the group. Typically a URL to a - * web page that permits users to apply to join the group, or manage - * their membership. + * @return optional URL to information about the group. Typically a URL to a web page that + * permits users to apply to join the group, or manage their membership. */ @Nullable String getUrl(); } - /** - * The extended information exposed by internal groups backed by an - * AccountGroup. - */ + /** The extended information exposed by internal groups backed by an AccountGroup. */ public interface Internal extends Basic { /** @return the backing AccountGroup. */ AccountGroup getAccountGroup(); } - private GroupDescription() { - } + private GroupDescription() {} } diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupDescriptions.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupDescriptions.java index 63b4a04656..b8e498f06c 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupDescriptions.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupDescriptions.java @@ -18,9 +18,7 @@ import com.google.gerrit.common.Nullable; import com.google.gerrit.common.PageLinks; import com.google.gerrit.reviewdb.client.AccountGroup; -/** - * Utility class for building GroupDescription objects. - */ +/** Utility class for building GroupDescription objects. */ public class GroupDescriptions { @Nullable @@ -62,6 +60,5 @@ public class GroupDescriptions { }; } - private GroupDescriptions() { - } + private GroupDescriptions() {} } diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupDetail.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupDetail.java index 2ba09378ad..cf4cfcd17a 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupDetail.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupDetail.java @@ -17,7 +17,6 @@ package com.google.gerrit.common.data; import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gerrit.reviewdb.client.AccountGroupById; import com.google.gerrit.reviewdb.client.AccountGroupMember; - import java.util.List; public class GroupDetail { @@ -25,8 +24,7 @@ public class GroupDetail { public List members; public List includes; - public GroupDetail() { - } + public GroupDetail() {} public void setGroup(AccountGroup g) { group = g; diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupInfo.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupInfo.java index 1acdd9a406..1f746c4b3c 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupInfo.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupInfo.java @@ -23,15 +23,13 @@ public class GroupInfo { protected String description; protected String url; - protected GroupInfo() { - } + protected GroupInfo() {} /** * Create an anonymous group info, when only the id is known. - *

- * This constructor should only be a last-ditch effort, when the usual group - * lookup has failed and a stale group id has been discovered in the data - * store. + * + *

This constructor should only be a last-ditch effort, when the usual group lookup has failed + * and a stale group id has been discovered in the data store. */ public GroupInfo(final AccountGroup.UUID uuid) { this.uuid = uuid; diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupReference.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupReference.java index 3362ba2ba4..8362281086 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupReference.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupReference.java @@ -28,18 +28,15 @@ public class GroupReference implements Comparable { } public static GroupReference fromString(String ref) { - String name = - ref.substring(ref.indexOf("[") + 1, ref.lastIndexOf("/")).trim(); - String uuid = - ref.substring(ref.lastIndexOf("/") + 1, ref.lastIndexOf("]")).trim(); + String name = ref.substring(ref.indexOf("[") + 1, ref.lastIndexOf("/")).trim(); + String uuid = ref.substring(ref.lastIndexOf("/") + 1, ref.lastIndexOf("]")).trim(); return new GroupReference(new AccountGroup.UUID(uuid), name); } protected String uuid; protected String name; - protected GroupReference() { - } + protected GroupReference() {} public GroupReference(AccountGroup.UUID uuid, String name) { setUUID(uuid); diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/HostPageData.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/HostPageData.java index 04dcec459b..517c520e88 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/HostPageData.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/HostPageData.java @@ -15,21 +15,20 @@ package com.google.gerrit.common.data; import com.google.gerrit.extensions.client.DiffPreferencesInfo; - import java.util.Date; import java.util.List; /** Data sent as part of the host page, to bootstrap the UI. */ public class HostPageData { /** - * Name of the cookie in which the XSRF token is sent from the server to the - * client during host page bootstrapping. + * Name of the cookie in which the XSRF token is sent from the server to the client during host + * page bootstrapping. */ public static final String XSRF_COOKIE_NAME = "XSRF_TOKEN"; /** - * Name of the HTTP header in which the client must send the XSRF token to the - * server on each request. + * Name of the HTTP header in which the client must send the XSRF token to the server on each + * request. */ public static final String XSRF_HEADER_NAME = "X-Gerrit-Auth"; diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelType.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelType.java index 7a8ac7796a..6d427e737c 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelType.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelType.java @@ -16,7 +16,6 @@ package com.google.gerrit.common.data; import com.google.gerrit.reviewdb.client.LabelId; import com.google.gerrit.reviewdb.client.PatchSetApproval; - import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -45,8 +44,7 @@ public class LabelType { public static String checkName(String name) { checkNameInternal(name); if ("SUBM".equals(name)) { - throw new IllegalArgumentException( - "Reserved label name \"" + name + "\""); + throw new IllegalArgumentException("Reserved label name \"" + name + "\""); } return name; } @@ -57,13 +55,12 @@ public class LabelType { } for (int i = 0; i < name.length(); i++) { char c = name.charAt(i); - if ((i == 0 && c == '-') || - !((c >= 'a' && c <= 'z') || - (c >= 'A' && c <= 'Z') || - (c >= '0' && c <= '9') || - c == '-')) { - throw new IllegalArgumentException( - "Illegal label name \"" + name + "\""); + if ((i == 0 && c == '-') + || !((c >= 'a' && c <= 'z') + || (c >= 'A' && c <= 'Z') + || (c >= '0' && c <= '9') + || c == '-')) { + throw new IllegalArgumentException("Illegal label name \"" + name + "\""); } } return name; @@ -74,12 +71,14 @@ public class LabelType { if (values.size() <= 1) { return Collections.unmodifiableList(values); } - Collections.sort(values, new Comparator() { - @Override - public int compare(LabelValue o1, LabelValue o2) { - return o1.getValue() - o2.getValue(); - } - }); + Collections.sort( + values, + new Comparator() { + @Override + public int compare(LabelValue o1, LabelValue o2) { + return o1.getValue() - o2.getValue(); + } + }); short min = values.get(0).getValue(); short max = values.get(values.size() - 1).getValue(); short v = min; @@ -117,8 +116,7 @@ public class LabelType { private transient List intList; private transient Map byValue; - protected LabelType() { - } + protected LabelType() {} public LabelType(String name, List valueList) { this.name = checkName(name); @@ -142,8 +140,7 @@ public class LabelType { setCopyAllScoresIfNoChange(DEF_COPY_ALL_SCORES_IF_NO_CHANGE); setCopyAllScoresIfNoCodeChange(DEF_COPY_ALL_SCORES_IF_NO_CODE_CHANGE); setCopyAllScoresOnTrivialRebase(DEF_COPY_ALL_SCORES_ON_TRIVIAL_REBASE); - setCopyAllScoresOnMergeFirstParentUpdate( - DEF_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE); + setCopyAllScoresOnMergeFirstParentUpdate(DEF_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE); setCopyMaxScore(DEF_COPY_MAX_SCORE); setCopyMinScore(DEF_COPY_MIN_SCORE); setAllowPostSubmit(DEF_ALLOW_POST_SUBMIT); @@ -237,8 +234,7 @@ public class LabelType { public void setCopyAllScoresOnMergeFirstParentUpdate( boolean copyAllScoresOnMergeFirstParentUpdate) { - this.copyAllScoresOnMergeFirstParentUpdate = - copyAllScoresOnMergeFirstParentUpdate; + this.copyAllScoresOnMergeFirstParentUpdate = copyAllScoresOnMergeFirstParentUpdate; } public boolean isCopyAllScoresOnTrivialRebase() { @@ -314,8 +310,10 @@ public class LabelType { LabelValue min = getMin(); LabelValue max = getMax(); if (min != null && max != null) { - sb.append(new PermissionRange(Permission.forLabel(name), min.getValue(), - max.getValue()).toString().trim()); + sb.append( + new PermissionRange(Permission.forLabel(name), min.getValue(), max.getValue()) + .toString() + .trim()); } else if (min != null) { sb.append(min.formatValue().trim()); } else if (max != null) { diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelTypes.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelTypes.java index 66f6a8e610..e76db303e7 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelTypes.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelTypes.java @@ -15,7 +15,6 @@ package com.google.gerrit.common.data; import com.google.gerrit.reviewdb.client.LabelId; - import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -28,12 +27,10 @@ public class LabelTypes { private transient volatile Map byLabel; private transient volatile Map positions; - protected LabelTypes() { - } + protected LabelTypes() {} public LabelTypes(final List approvals) { - labelTypes = - Collections.unmodifiableList(new ArrayList<>(approvals)); + labelTypes = Collections.unmodifiableList(new ArrayList<>(approvals)); } public List getLabelTypes() { diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelValue.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelValue.java index cd29e05b18..811e751f6b 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelValue.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelValue.java @@ -33,8 +33,7 @@ public class LabelValue { this.text = text; } - protected LabelValue() { - } + protected LabelValue() {} public short getValue() { return value; diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/ParameterizedString.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/ParameterizedString.java index a92af2b441..93b7f9010e 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/ParameterizedString.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/ParameterizedString.java @@ -40,7 +40,7 @@ public class ParameterizedString { private ParameterizedString(final Constant c) { pattern = c.text; rawPattern = c.text; - patternOps = Collections. singletonList(c); + patternOps = Collections.singletonList(c); parameters = Collections.emptyList(); } @@ -208,25 +208,31 @@ public class ParameterizedString { private static Map initFunctions() { HashMap m = new HashMap<>(); - m.put("toLowerCase", new Function() { - @Override - String apply(String a) { - return a.toLowerCase(); - } - }); - m.put("toUpperCase", new Function() { - @Override - String apply(String a) { - return a.toUpperCase(); - } - }); - m.put("localPart", new Function() { - @Override - String apply(String a) { - int at = a.indexOf('@'); - return at < 0 ? a : a.substring(0, at); - } - }); + m.put( + "toLowerCase", + new Function() { + @Override + String apply(String a) { + return a.toLowerCase(); + } + }); + m.put( + "toUpperCase", + new Function() { + @Override + String apply(String a) { + return a.toUpperCase(); + } + }); + m.put( + "localPart", + new Function() { + @Override + String apply(String a) { + int at = a.indexOf('@'); + return at < 0 ? a : a.substring(0, at); + } + }); return Collections.unmodifiableMap(m); } } diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/PatchScript.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/PatchScript.java index 5777396630..172be09b46 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/PatchScript.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/PatchScript.java @@ -21,18 +21,20 @@ import com.google.gerrit.prettify.common.SparseFileContent; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Patch; import com.google.gerrit.reviewdb.client.Patch.ChangeType; - -import org.eclipse.jgit.diff.Edit; - import java.util.List; +import org.eclipse.jgit.diff.Edit; public class PatchScript { public enum DisplayMethod { - NONE, DIFF, IMG + NONE, + DIFF, + IMG } public enum FileMode { - FILE, SYMLINK, GITLINK + FILE, + SYMLINK, + GITLINK } private Change.Key changeId; @@ -60,15 +62,31 @@ public class PatchScript { private transient String commitIdA; private transient String commitIdB; - public PatchScript(final Change.Key ck, final ChangeType ct, final String on, - final String nn, final FileMode om, final FileMode nm, - final List h, final DiffPreferencesInfo dp, - final SparseFileContent ca, final SparseFileContent cb, - final List e, final DisplayMethod ma, final DisplayMethod mb, - final String mta, final String mtb, final CommentDetail cd, - final List hist, final boolean hf, final boolean id, - final boolean idf, final boolean idt, boolean bin, - final String cma, final String cmb) { + public PatchScript( + final Change.Key ck, + final ChangeType ct, + final String on, + final String nn, + final FileMode om, + final FileMode nm, + final List h, + final DiffPreferencesInfo dp, + final SparseFileContent ca, + final SparseFileContent cb, + final List e, + final DisplayMethod ma, + final DisplayMethod mb, + final String mta, + final String mtb, + final CommentDetail cd, + final List hist, + final boolean hf, + final boolean id, + final boolean idf, + final boolean idt, + boolean bin, + final String cma, + final String cmb) { changeId = ck; changeType = ct; oldName = on; @@ -95,8 +113,7 @@ public class PatchScript { commitIdB = cmb; } - protected PatchScript() { - } + protected PatchScript() {} public Change.Key getChangeId() { return changeId; diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/Permission.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/Permission.java index 290b9f98ba..69a4044da9 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/Permission.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/Permission.java @@ -85,9 +85,7 @@ public class Permission implements Comparable { /** @return true if the name is recognized as a permission name. */ public static boolean isPermission(String varName) { - return isLabel(varName) - || isLabelAs(varName) - || NAMES_LC.contains(varName.toLowerCase()); + return isLabel(varName) || isLabelAs(varName) || NAMES_LC.contains(varName.toLowerCase()); } public static boolean hasRange(String varName) { @@ -134,8 +132,7 @@ public class Permission implements Comparable { protected boolean exclusiveGroup; protected List rules; - protected Permission() { - } + protected Permission() {} public Permission(String name) { this.name = name; @@ -182,7 +179,7 @@ public class Permission implements Comparable { public void removeRule(GroupReference group) { if (rules != null) { - for (Iterator itr = rules.iterator(); itr.hasNext();) { + for (Iterator itr = rules.iterator(); itr.hasNext(); ) { if (sameGroup(itr.next(), group)) { itr.remove(); } @@ -281,8 +278,7 @@ public class Permission implements Comparable { @Override public String toString() { StringBuilder bldr = new StringBuilder(); - bldr.append(name) - .append(" "); + bldr.append(name).append(" "); if (exclusiveGroup) { bldr.append("[exclusive] "); } diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/PermissionRange.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/PermissionRange.java index 8d09b881a5..8876c029c3 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/PermissionRange.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/PermissionRange.java @@ -22,8 +22,7 @@ public class PermissionRange implements Comparable { protected int defaultMin; protected int defaultMax; - protected WithDefaults() { - } + protected WithDefaults() {} public WithDefaults(String name, int min, int max, int defMin, int defMax) { super(name, min, max); @@ -62,8 +61,7 @@ public class PermissionRange implements Comparable { protected int min; protected int max; - protected PermissionRange() { - } + protected PermissionRange() {} public PermissionRange(String name, int min, int max) { this.name = name; diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/PermissionRule.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/PermissionRule.java index 6511d69488..92658303f1 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/PermissionRule.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/PermissionRule.java @@ -17,10 +17,14 @@ package com.google.gerrit.common.data; public class PermissionRule implements Comparable { public static final String FORCE_PUSH = "Force Push"; public static final String FORCE_EDIT = "Force Edit"; - public enum Action { - ALLOW, DENY, BLOCK, - INTERACTIVE, BATCH + public enum Action { + ALLOW, + DENY, + BLOCK, + + INTERACTIVE, + BATCH } protected Action action = Action.ALLOW; @@ -29,8 +33,7 @@ public class PermissionRule implements Comparable { protected int max; protected GroupReference group; - public PermissionRule() { - } + public PermissionRule() {} public PermissionRule(GroupReference group) { this.group = group; @@ -115,7 +118,6 @@ public class PermissionRule implements Comparable { } else if (getAction() == Action.BATCH || src.getAction() == Action.BATCH) { setAction(Action.BATCH); - } } @@ -265,8 +267,7 @@ public class PermissionRule implements Comparable { } public boolean hasRange() { - return (!(getMin() == null || getMin() == 0)) - || (!(getMax() == null || getMax() == 0)); + return (!(getMin() == null || getMin() == 0)) || (!(getMax() == null || getMax() == 0)); } public static int parseInt(String value) { @@ -281,9 +282,12 @@ public class PermissionRule implements Comparable { if (!(obj instanceof PermissionRule)) { return false; } - final PermissionRule other = (PermissionRule)obj; - return action.equals(other.action) && force == other.force - && min == other.min && max == other.max && group.equals(other.group); + final PermissionRule other = (PermissionRule) obj; + return action.equals(other.action) + && force == other.force + && min == other.min + && max == other.max + && group.equals(other.group); } @Override diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectAccess.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectAccess.java index a83f46c4d1..ea17525a6d 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectAccess.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectAccess.java @@ -16,7 +16,6 @@ package com.google.gerrit.common.data; import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gerrit.reviewdb.client.Project; - import java.util.List; import java.util.Map; import java.util.Set; @@ -34,8 +33,7 @@ public class ProjectAccess { protected Map groupInfo; protected List fileHistoryLinks; - public ProjectAccess() { - } + public ProjectAccess() {} public Project.NameKey getProjectName() { return projectName; diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectAdminService.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectAdminService.java index 652acacbab..e9a7c15ffc 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectAdminService.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectAdminService.java @@ -22,22 +22,28 @@ import com.google.gwtjsonrpc.common.AsyncCallback; import com.google.gwtjsonrpc.common.RemoteJsonService; import com.google.gwtjsonrpc.common.RpcImpl; import com.google.gwtjsonrpc.common.RpcImpl.Version; - import java.util.List; @RpcImpl(version = Version.V2_0) public interface ProjectAdminService extends RemoteJsonService { - void projectAccess(Project.NameKey projectName, - AsyncCallback callback); + void projectAccess(Project.NameKey projectName, AsyncCallback callback); @Audit @SignInRequired - void changeProjectAccess(Project.NameKey projectName, String baseRevision, - String message, List sections, Project.NameKey parentProjectName, + void changeProjectAccess( + Project.NameKey projectName, + String baseRevision, + String message, + List sections, + Project.NameKey parentProjectName, AsyncCallback callback); @SignInRequired - void reviewProjectAccess(Project.NameKey projectName, String baseRevision, - String message, List sections, Project.NameKey parentProjectName, + void reviewProjectAccess( + Project.NameKey projectName, + String baseRevision, + String message, + List sections, + Project.NameKey parentProjectName, AsyncCallback callback); } diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/RefConfigSection.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/RefConfigSection.java index f740464a50..f8aa6a0fb7 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/RefConfigSection.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/RefConfigSection.java @@ -31,8 +31,7 @@ public abstract class RefConfigSection { protected String name; - public RefConfigSection() { - } + public RefConfigSection() {} public RefConfigSection(String name) { setName(name); diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/SshHostKey.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/SshHostKey.java index 1d4e3c9568..bac92941b0 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/SshHostKey.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/SshHostKey.java @@ -20,8 +20,7 @@ public class SshHostKey { protected String hostKey; protected String fingerprint; - protected SshHostKey() { - } + protected SshHostKey() {} public SshHostKey(final String hi, final String hk, final String fp) { hostIdent = hi; diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/SubmitRecord.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/SubmitRecord.java index 3dc41fe8af..9151222cfa 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/SubmitRecord.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/SubmitRecord.java @@ -15,18 +15,14 @@ package com.google.gerrit.common.data; import com.google.gerrit.reviewdb.client.Account; - import java.util.Collection; import java.util.List; import java.util.Objects; import java.util.Optional; -/** - * Describes the state required to submit a change. - */ +/** Describes the state required to submit a change. */ public class SubmitRecord { - public static Optional findOkRecord( - Collection in) { + public static Optional findOkRecord(Collection in) { if (in == null) { return Optional.empty(); } @@ -51,8 +47,8 @@ public class SubmitRecord { /** * An internal server error occurred preventing computation. - *

- * Additional detail may be available in {@link SubmitRecord#errorMessage}. + * + *

Additional detail may be available in {@link SubmitRecord#errorMessage}. */ RULE_ERROR } @@ -68,35 +64,32 @@ public class SubmitRecord { /** * This label provides what is necessary for submission. - *

- * If provided, {@link Label#appliedBy} describes the user account - * that applied this label to the change. + * + *

If provided, {@link Label#appliedBy} describes the user account that applied this label + * to the change. */ OK, /** * This label prevents the change from being submitted. - *

- * If provided, {@link Label#appliedBy} describes the user account - * that applied this label to the change. + * + *

If provided, {@link Label#appliedBy} describes the user account that applied this label + * to the change. */ REJECT, - /** - * The label is required for submission, but has not been satisfied. - */ + /** The label is required for submission, but has not been satisfied. */ NEED, /** - * The label may be set, but it's neither necessary for submission - * nor does it block submission if set. + * The label may be set, but it's neither necessary for submission nor does it block + * submission if set. */ MAY, /** - * The label is required for submission, but is impossible to complete. - * The likely cause is access has not been granted correctly by the - * project owner or site administrator. + * The label is required for submission, but is impossible to complete. The likely cause is + * access has not been granted correctly by the project owner or site administrator. */ IMPOSSIBLE } diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/SubmitTypeRecord.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/SubmitTypeRecord.java index b6ce797ad8..a01d83d8c9 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/SubmitTypeRecord.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/SubmitTypeRecord.java @@ -16,17 +16,16 @@ package com.google.gerrit.common.data; import com.google.gerrit.extensions.client.SubmitType; -/** - * Describes the submit type for a change. - */ +/** Describes the submit type for a change. */ public class SubmitTypeRecord { public enum Status { /** The type was computed successfully */ OK, - /** An internal server error occurred preventing computation. - *

- * Additional detail may be available in {@link SubmitTypeRecord#errorMessage} + /** + * An internal server error occurred preventing computation. + * + *

Additional detail may be available in {@link SubmitTypeRecord#errorMessage} */ RULE_ERROR } @@ -45,9 +44,7 @@ public class SubmitTypeRecord { /** Submit type of the record; never null if {@link #status} is {@code OK}. */ public final SubmitType type; - /** - * Submit type of the record; always null if {@link #status} is {@code OK}. - */ + /** Submit type of the record; always null if {@link #status} is {@code OK}. */ public final String errorMessage; private SubmitTypeRecord(Status status, SubmitType type, String errorMessage) { diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/SubscribeSection.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/SubscribeSection.java index 3fdc331deb..a3468d7e06 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/SubscribeSection.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/SubscribeSection.java @@ -17,13 +17,11 @@ package com.google.gerrit.common.data; import com.google.common.annotations.GwtIncompatible; import com.google.gerrit.reviewdb.client.Branch; import com.google.gerrit.reviewdb.client.Project; - -import org.eclipse.jgit.transport.RefSpec; - import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; +import org.eclipse.jgit.transport.RefSpec; /** Portion of a {@link Project} describing superproject subscription rules. */ @GwtIncompatible("Unemulated org.eclipse.jgit.transport.RefSpec") @@ -58,8 +56,8 @@ public class SubscribeSection { } /** - * Determines if the branch could trigger a - * superproject update as allowed via this subscribe section. + * Determines if the branch could trigger a superproject update as allowed via this + * subscribe section. * * @param branch the branch to check * @return if the branch could trigger a superproject update diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/SystemInfoService.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/SystemInfoService.java index fb54ef17c9..d88b638682 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/SystemInfoService.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/SystemInfoService.java @@ -20,7 +20,6 @@ import com.google.gwtjsonrpc.common.RemoteJsonService; import com.google.gwtjsonrpc.common.RpcImpl; import com.google.gwtjsonrpc.common.RpcImpl.Version; import com.google.gwtjsonrpc.common.VoidResult; - import java.util.List; @RpcImpl(version = Version.V2_0) diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/errors/UpdateParentFailedException.java b/gerrit-common/src/main/java/com/google/gerrit/common/errors/UpdateParentFailedException.java index 320d05549d..ec8a811a8f 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/errors/UpdateParentFailedException.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/errors/UpdateParentFailedException.java @@ -20,8 +20,7 @@ public class UpdateParentFailedException extends Exception { public static final String MESSAGE = "Update Parent Project Failed: "; - public UpdateParentFailedException(final String message, - final Throwable why) { + public UpdateParentFailedException(final String message, final Throwable why) { super(MESSAGE + ": " + message, why); } } diff --git a/gerrit-common/src/test/java/com/google/gerrit/common/AutoValueTest.java b/gerrit-common/src/test/java/com/google/gerrit/common/AutoValueTest.java index 5febd80826..947fe4aa82 100644 --- a/gerrit-common/src/test/java/com/google/gerrit/common/AutoValueTest.java +++ b/gerrit-common/src/test/java/com/google/gerrit/common/AutoValueTest.java @@ -17,7 +17,6 @@ package com.google.gerrit.common; import static com.google.common.truth.Truth.assertThat; import com.google.auto.value.AutoValue; - import org.junit.Test; public class AutoValueTest { diff --git a/gerrit-common/src/test/java/com/google/gerrit/common/data/EncodePathSeparatorTest.java b/gerrit-common/src/test/java/com/google/gerrit/common/data/EncodePathSeparatorTest.java index 9c78390312..4c4c769d52 100644 --- a/gerrit-common/src/test/java/com/google/gerrit/common/data/EncodePathSeparatorTest.java +++ b/gerrit-common/src/test/java/com/google/gerrit/common/data/EncodePathSeparatorTest.java @@ -30,5 +30,4 @@ public class EncodePathSeparatorTest { gitwebType.setPathSeparator('!'); assertEquals("a!b", gitwebType.replacePathSeparator("a/b")); } - } diff --git a/gerrit-common/src/test/java/com/google/gerrit/common/data/FilenameComparatorTest.java b/gerrit-common/src/test/java/com/google/gerrit/common/data/FilenameComparatorTest.java index ef8f0a9ebe..ec71e05a16 100644 --- a/gerrit-common/src/test/java/com/google/gerrit/common/data/FilenameComparatorTest.java +++ b/gerrit-common/src/test/java/com/google/gerrit/common/data/FilenameComparatorTest.java @@ -23,43 +23,30 @@ public class FilenameComparatorTest { @Test public void basicPaths() { - assertThat(comparator.compare( - "abc/xyz/FileOne.java", "xyz/abc/FileTwo.java")).isLessThan(0); - assertThat(comparator.compare( - "abc/xyz/FileOne.java", "abc/xyz/FileOne.java")).isEqualTo(0); - assertThat(comparator.compare( - "zzz/yyy/FileOne.java", "abc/xyz/FileOne.java")).isGreaterThan(0); + assertThat(comparator.compare("abc/xyz/FileOne.java", "xyz/abc/FileTwo.java")).isLessThan(0); + assertThat(comparator.compare("abc/xyz/FileOne.java", "abc/xyz/FileOne.java")).isEqualTo(0); + assertThat(comparator.compare("zzz/yyy/FileOne.java", "abc/xyz/FileOne.java")).isGreaterThan(0); } @Test public void specialPaths() { - assertThat(comparator.compare( - "ABC/xyz/FileOne.java", "/COMMIT_MSG")).isGreaterThan(0); - assertThat(comparator.compare( - "/COMMIT_MSG", "ABC/xyz/FileOne.java")).isLessThan(0); + assertThat(comparator.compare("ABC/xyz/FileOne.java", "/COMMIT_MSG")).isGreaterThan(0); + assertThat(comparator.compare("/COMMIT_MSG", "ABC/xyz/FileOne.java")).isLessThan(0); - assertThat(comparator.compare( - "ABC/xyz/FileOne.java", "/MERGE_LIST")).isGreaterThan(0); - assertThat(comparator.compare( - "/MERGE_LIST", "ABC/xyz/FileOne.java")).isLessThan(0); + assertThat(comparator.compare("ABC/xyz/FileOne.java", "/MERGE_LIST")).isGreaterThan(0); + assertThat(comparator.compare("/MERGE_LIST", "ABC/xyz/FileOne.java")).isLessThan(0); - assertThat(comparator.compare( - "/COMMIT_MSG", "/MERGE_LIST")).isLessThan(0); - assertThat(comparator.compare( - "/MERGE_LIST", "/COMMIT_MSG")).isGreaterThan(0); + assertThat(comparator.compare("/COMMIT_MSG", "/MERGE_LIST")).isLessThan(0); + assertThat(comparator.compare("/MERGE_LIST", "/COMMIT_MSG")).isGreaterThan(0); - assertThat(comparator.compare( - "/COMMIT_MSG", "/COMMIT_MSG")).isEqualTo(0); - assertThat(comparator.compare( - "/MERGE_LIST", "/MERGE_LIST")).isEqualTo(0); + assertThat(comparator.compare("/COMMIT_MSG", "/COMMIT_MSG")).isEqualTo(0); + assertThat(comparator.compare("/MERGE_LIST", "/MERGE_LIST")).isEqualTo(0); } @Test public void cppExtensions() { assertThat(comparator.compare("abc/file.h", "abc/file.cc")).isLessThan(0); - assertThat(comparator.compare("abc/file.c", "abc/file.hpp")) - .isGreaterThan(0); - assertThat(comparator.compare("abc..xyz.file.h", "abc.xyz.file.cc")) - .isLessThan(0); + assertThat(comparator.compare("abc/file.c", "abc/file.hpp")).isGreaterThan(0); + assertThat(comparator.compare("abc..xyz.file.h", "abc.xyz.file.cc")).isLessThan(0); } -} \ No newline at end of file +} diff --git a/gerrit-common/src/test/java/com/google/gerrit/common/data/ParameterizedStringTest.java b/gerrit-common/src/test/java/com/google/gerrit/common/data/ParameterizedStringTest.java index b7fb17ffbb..0f067c4714 100644 --- a/gerrit-common/src/test/java/com/google/gerrit/common/data/ParameterizedStringTest.java +++ b/gerrit-common/src/test/java/com/google/gerrit/common/data/ParameterizedStringTest.java @@ -19,11 +19,9 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import com.google.common.collect.ImmutableMap; - -import org.junit.Test; - import java.util.HashMap; import java.util.Map; +import org.junit.Test; public class ParameterizedStringTest { @Test @@ -196,13 +194,13 @@ public class ParameterizedStringTest { assertEquals("FIRSTNAME LASTNAME", p.bind(a)[0]); assertEquals("firstname.lastname", p.bind(a)[1]); - assertEquals("hi, FIRSTNAME LASTNAME,your eamil address is 'firstname.lastname'.right?", p.replace(a)); + assertEquals( + "hi, FIRSTNAME LASTNAME,your eamil address is 'firstname.lastname'.right?", p.replace(a)); } @Test public void replaceToUpperCaseToLowerCase() { - final ParameterizedString p = - new ParameterizedString("${a.toUpperCase.toLowerCase}"); + final ParameterizedString p = new ParameterizedString("${a.toUpperCase.toLowerCase}"); assertEquals(1, p.getParameterNames().size()); assertTrue(p.getParameterNames().contains("a")); @@ -223,8 +221,7 @@ public class ParameterizedStringTest { @Test public void replaceToUpperCaseLocalName() { - final ParameterizedString p = - new ParameterizedString("${a.toUpperCase.localPart}"); + final ParameterizedString p = new ParameterizedString("${a.toUpperCase.localPart}"); assertEquals(1, p.getParameterNames().size()); assertTrue(p.getParameterNames().contains("a")); @@ -245,8 +242,7 @@ public class ParameterizedStringTest { @Test public void replaceToUpperCaseAnUndefinedMethod() { - final ParameterizedString p = - new ParameterizedString("${a.toUpperCase.anUndefinedMethod}"); + final ParameterizedString p = new ParameterizedString("${a.toUpperCase.anUndefinedMethod}"); assertEquals(1, p.getParameterNames().size()); assertTrue(p.getParameterNames().contains("a")); @@ -267,8 +263,7 @@ public class ParameterizedStringTest { @Test public void replaceLocalNameToUpperCase() { - final ParameterizedString p = - new ParameterizedString("${a.localPart.toUpperCase}"); + final ParameterizedString p = new ParameterizedString("${a.localPart.toUpperCase}"); assertEquals(1, p.getParameterNames().size()); assertTrue(p.getParameterNames().contains("a")); @@ -289,8 +284,7 @@ public class ParameterizedStringTest { @Test public void replaceLocalNameToLowerCase() { - final ParameterizedString p = - new ParameterizedString("${a.localPart.toLowerCase}"); + final ParameterizedString p = new ParameterizedString("${a.localPart.toLowerCase}"); assertEquals(1, p.getParameterNames().size()); assertTrue(p.getParameterNames().contains("a")); @@ -311,8 +305,7 @@ public class ParameterizedStringTest { @Test public void replaceLocalNameAnUndefinedMethod() { - final ParameterizedString p = - new ParameterizedString("${a.localPart.anUndefinedMethod}"); + final ParameterizedString p = new ParameterizedString("${a.localPart.anUndefinedMethod}"); assertEquals(1, p.getParameterNames().size()); assertTrue(p.getParameterNames().contains("a")); @@ -333,8 +326,7 @@ public class ParameterizedStringTest { @Test public void replaceToLowerCaseToUpperCase() { - final ParameterizedString p = - new ParameterizedString("${a.toLowerCase.toUpperCase}"); + final ParameterizedString p = new ParameterizedString("${a.toLowerCase.toUpperCase}"); assertEquals(1, p.getParameterNames().size()); assertTrue(p.getParameterNames().contains("a")); @@ -355,8 +347,7 @@ public class ParameterizedStringTest { @Test public void replaceToLowerCaseLocalName() { - final ParameterizedString p = - new ParameterizedString("${a.toLowerCase.localPart}"); + final ParameterizedString p = new ParameterizedString("${a.toLowerCase.localPart}"); assertEquals(1, p.getParameterNames().size()); assertTrue(p.getParameterNames().contains("a")); @@ -377,8 +368,7 @@ public class ParameterizedStringTest { @Test public void replaceToLowerCaseAnUndefinedMethod() { - final ParameterizedString p = - new ParameterizedString("${a.toLowerCase.anUndefinedMethod}"); + final ParameterizedString p = new ParameterizedString("${a.toLowerCase.anUndefinedMethod}"); assertEquals(1, p.getParameterNames().size()); assertTrue(p.getParameterNames().contains("a")); @@ -399,14 +389,14 @@ public class ParameterizedStringTest { @Test public void replaceSubmitTooltipWithVariables() { - ParameterizedString p = new ParameterizedString( - "Submit patch set ${patchSet} into ${branch}"); + ParameterizedString p = new ParameterizedString("Submit patch set ${patchSet} into ${branch}"); assertEquals(2, p.getParameterNames().size()); assertTrue(p.getParameterNames().contains("patchSet")); - Map params = ImmutableMap.of( - "patchSet", "42", - "branch", "foo"); + Map params = + ImmutableMap.of( + "patchSet", "42", + "branch", "foo"); assertNotNull(p.bind(params)); assertEquals(2, p.bind(params).length); assertEquals("42", p.bind(params)[0]); @@ -416,11 +406,11 @@ public class ParameterizedStringTest { @Test public void replaceSubmitTooltipWithoutVariables() { - ParameterizedString p = new ParameterizedString( - "Submit patch set 40 into master"); - Map params = ImmutableMap.of( - "patchSet", "42", - "branch", "foo"); + ParameterizedString p = new ParameterizedString("Submit patch set 40 into master"); + Map params = + ImmutableMap.of( + "patchSet", "42", + "branch", "foo"); assertEquals(0, p.bind(params).length); assertEquals("Submit patch set 40 into master", p.replace(params)); } diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java index f5cc2730d8..5feb91829f 100644 --- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java +++ b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java @@ -34,16 +34,6 @@ import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gwtorm.protobuf.ProtobufCodec; - -import org.eclipse.jgit.lib.Config; -import org.elasticsearch.common.xcontent.XContentBuilder; - -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.List; -import java.util.concurrent.TimeUnit; - import io.searchbox.client.JestClientFactory; import io.searchbox.client.JestResult; import io.searchbox.client.config.HttpClientConfig; @@ -53,10 +43,17 @@ import io.searchbox.core.Delete; import io.searchbox.indices.CreateIndex; import io.searchbox.indices.DeleteIndex; import io.searchbox.indices.IndicesExists; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.List; +import java.util.concurrent.TimeUnit; +import org.eclipse.jgit.lib.Config; +import org.elasticsearch.common.xcontent.XContentBuilder; abstract class AbstractElasticIndex implements Index { - protected static List decodeProtos(JsonObject doc, String fieldName, - ProtobufCodec codec) { + protected static List decodeProtos( + JsonObject doc, String fieldName, ProtobufCodec codec) { JsonArray field = doc.getAsJsonArray(fieldName); if (field == null) { return null; @@ -76,7 +73,8 @@ abstract class AbstractElasticIndex implements Index { protected final Gson gson; protected final ElasticQueryBuilder queryBuilder; - AbstractElasticIndex(@GerritServerConfig Config cfg, + AbstractElasticIndex( + @GerritServerConfig Config cfg, FillArgs fillArgs, SitePaths sitePaths, Schema schema, @@ -84,17 +82,18 @@ abstract class AbstractElasticIndex implements Index { this.fillArgs = fillArgs; this.sitePaths = sitePaths; this.schema = schema; - this.gson = new GsonBuilder() - .setFieldNamingPolicy(LOWER_CASE_WITH_UNDERSCORES).create(); + this.gson = new GsonBuilder().setFieldNamingPolicy(LOWER_CASE_WITH_UNDERSCORES).create(); this.queryBuilder = new ElasticQueryBuilder(); String protocol = getRequiredConfigOption(cfg, "protocol"); String hostname = getRequiredConfigOption(cfg, "hostname"); String port = getRequiredConfigOption(cfg, "port"); - this.indexName = String.format("%s%s%04d", - Strings.nullToEmpty(cfg.getString("index", null, "prefix")), - indexName, - schema.getVersion()); + this.indexName = + String.format( + "%s%s%04d", + Strings.nullToEmpty(cfg.getString("index", null, "prefix")), + indexName, + schema.getVersion()); // By default Elasticsearch has a 1s delay before changes are available in // the index. Setting refresh(true) on calls to the index makes the index @@ -110,12 +109,12 @@ abstract class AbstractElasticIndex implements Index { String url = buildUrl(protocol, hostname, port); JestClientFactory factory = new JestClientFactory(); - factory.setHttpClientConfig(new HttpClientConfig - .Builder(url) - .multiThreaded(true) - .discoveryEnabled(!refresh) - .discoveryFrequency(1L, TimeUnit.MINUTES) - .build()); + factory.setHttpClientConfig( + new HttpClientConfig.Builder(url) + .multiThreaded(true) + .discoveryEnabled(!refresh) + .discoveryFrequency(1L, TimeUnit.MINUTES) + .build()); client = (JestHttpClient) factory.getObject(); } @@ -139,33 +138,30 @@ abstract class AbstractElasticIndex implements Index { Bulk bulk = addActions(new Bulk.Builder(), c).refresh(refresh).build(); JestResult result = client.execute(bulk); if (!result.isSucceeded()) { - throw new IOException(String.format( - "Failed to delete change %s in index %s: %s", c, indexName, - result.getErrorMessage())); + throw new IOException( + String.format( + "Failed to delete change %s in index %s: %s", + c, indexName, result.getErrorMessage())); } } @Override public void deleteAll() throws IOException { // Delete the index, if it exists. - JestResult result = client.execute( - new IndicesExists.Builder(indexName).build()); + JestResult result = client.execute(new IndicesExists.Builder(indexName).build()); if (result.isSucceeded()) { - result = client.execute( - new DeleteIndex.Builder(indexName).build()); + result = client.execute(new DeleteIndex.Builder(indexName).build()); if (!result.isSucceeded()) { - throw new IOException(String.format( - "Failed to delete index %s: %s", indexName, - result.getErrorMessage())); + throw new IOException( + String.format("Failed to delete index %s: %s", indexName, result.getErrorMessage())); } } // Recreate the index. - result = client.execute( - new CreateIndex.Builder(indexName).settings(getMappings()).build()); + result = client.execute(new CreateIndex.Builder(indexName).settings(getMappings()).build()); if (!result.isSucceeded()) { - String error = String.format("Failed to create index %s: %s", - indexName, result.getErrorMessage()); + String error = + String.format("Failed to create index %s: %s", indexName, result.getErrorMessage()); throw new IOException(error); } } @@ -178,20 +174,13 @@ abstract class AbstractElasticIndex implements Index { protected Delete delete(String type, K c) { String id = c.toString(); - return new Delete.Builder(id) - .index(indexName) - .type(type) - .build(); + return new Delete.Builder(id).index(indexName).type(type).build(); } protected io.searchbox.core.Index insert(String type, V v) throws IOException { String id = getId(v); String doc = toDoc(v); - return new io.searchbox.core.Index.Builder(doc) - .index(indexName) - .type(type) - .id(id) - .build(); + return new io.searchbox.core.Index.Builder(doc).index(indexName).type(type).id(id).build(); } private String toDoc(V v) throws IOException { @@ -221,8 +210,13 @@ abstract class AbstractElasticIndex implements Index { return new URL(protocol, hostname, Integer.parseInt(port), "").toString(); } catch (MalformedURLException | NumberFormatException e) { throw new RuntimeException( - "Cannot build url to Elasticsearch from values: protocol=" + protocol - + " hostname=" + hostname + " port=" + port, e); + "Cannot build url to Elasticsearch from values: protocol=" + + protocol + + " hostname=" + + hostname + + " port=" + + port, + e); } } } diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticAccountIndex.java b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticAccountIndex.java index 3e91fb4ffc..0f8ec094d7 100644 --- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticAccountIndex.java +++ b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticAccountIndex.java @@ -41,28 +41,25 @@ import com.google.gwtorm.server.ResultSet; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - -import org.eclipse.jgit.lib.Config; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.search.builder.SearchSourceBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - import io.searchbox.client.JestResult; import io.searchbox.core.Bulk; import io.searchbox.core.Bulk.Builder; import io.searchbox.core.Search; import io.searchbox.core.search.sort.Sort; import io.searchbox.core.search.sort.Sort.Sorting; +import java.io.IOException; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import org.eclipse.jgit.lib.Config; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -public class ElasticAccountIndex extends - AbstractElasticIndex implements AccountIndex { +public class ElasticAccountIndex extends AbstractElasticIndex + implements AccountIndex { static class AccountMapping { MappingProperties accounts; @@ -74,8 +71,7 @@ public class ElasticAccountIndex extends static final String ACCOUNTS = "accounts"; static final String ACCOUNTS_PREFIX = ACCOUNTS + "_"; - private static final Logger log = - LoggerFactory.getLogger(ElasticAccountIndex.class); + private static final Logger log = LoggerFactory.getLogger(ElasticAccountIndex.class); private final AccountMapping mapping; private final Provider accountCache; @@ -94,23 +90,25 @@ public class ElasticAccountIndex extends @Override public void replace(AccountState as) throws IOException { - Bulk bulk = new Bulk.Builder() - .defaultIndex(indexName) - .defaultType(ACCOUNTS) - .addAction(insert(ACCOUNTS, as)) - .refresh(refresh) - .build(); + Bulk bulk = + new Bulk.Builder() + .defaultIndex(indexName) + .defaultType(ACCOUNTS) + .addAction(insert(ACCOUNTS, as)) + .refresh(refresh) + .build(); JestResult result = client.execute(bulk); if (!result.isSucceeded()) { throw new IOException( - String.format("Failed to replace account %s in index %s: %s", + String.format( + "Failed to replace account %s in index %s: %s", as.getAccount().getId(), indexName, result.getErrorMessage())); } } @Override - public DataSource getSource(Predicate p, - QueryOptions opts) throws QueryParseException { + public DataSource getSource(Predicate p, QueryOptions opts) + throws QueryParseException { return new QuerySource(p, opts); } @@ -121,8 +119,7 @@ public class ElasticAccountIndex extends @Override protected String getMappings() { - ImmutableMap mappings = - ImmutableMap.of("mappings", mapping); + ImmutableMap mappings = ImmutableMap.of("mappings", mapping); return gson.toJson(mappings); } @@ -135,24 +132,25 @@ public class ElasticAccountIndex extends private final Search search; private final Set fields; - QuerySource(Predicate p, QueryOptions opts) - throws QueryParseException { + QuerySource(Predicate p, QueryOptions opts) throws QueryParseException { QueryBuilder qb = queryBuilder.toQueryBuilder(p); fields = IndexUtils.accountFields(opts); - SearchSourceBuilder searchSource = new SearchSourceBuilder() - .query(qb) - .from(opts.start()) - .size(opts.limit()) - .fields(Lists.newArrayList(fields)); + SearchSourceBuilder searchSource = + new SearchSourceBuilder() + .query(qb) + .from(opts.start()) + .size(opts.limit()) + .fields(Lists.newArrayList(fields)); Sort sort = new Sort(AccountField.ID.getName(), Sorting.ASC); sort.setIgnoreUnmapped(); - search = new Search.Builder(searchSource.toString()) - .addType(ACCOUNTS) - .addIndex(indexName) - .addSort(ImmutableList.of(sort)) - .build(); + search = + new Search.Builder(searchSource.toString()) + .addType(ACCOUNTS) + .addIndex(indexName) + .addSort(ImmutableList.of(sort)) + .build(); } @Override @@ -210,8 +208,7 @@ public class ElasticAccountIndex extends source = json.getAsJsonObject().get("fields"); } - Account.Id id = new Account.Id( - source.getAsJsonObject().get(ID.getName()).getAsInt()); + Account.Id id = new Account.Id(source.getAsJsonObject().get(ID.getName()).getAsInt()); // Use the AccountCache rather than depending on any stored fields in the // document (of which there shouldn't be any). The most expensive part to // compute anyway is the effective group IDs, and we don't have a good way diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticChangeIndex.java b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticChangeIndex.java index 96cd1c4fdb..dc2668dd3b 100644 --- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticChangeIndex.java +++ b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticChangeIndex.java @@ -57,7 +57,17 @@ import com.google.gwtorm.server.ResultSet; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - +import io.searchbox.client.JestResult; +import io.searchbox.core.Bulk; +import io.searchbox.core.Bulk.Builder; +import io.searchbox.core.Search; +import io.searchbox.core.search.sort.Sort; +import io.searchbox.core.search.sort.Sort.Sorting; +import java.io.IOException; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Set; import org.apache.commons.codec.binary.Base64; import org.eclipse.jgit.lib.Config; import org.elasticsearch.index.query.QueryBuilder; @@ -65,24 +75,10 @@ import org.elasticsearch.search.builder.SearchSourceBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - -import io.searchbox.client.JestResult; -import io.searchbox.core.Bulk; -import io.searchbox.core.Bulk.Builder; -import io.searchbox.core.Search; -import io.searchbox.core.search.sort.Sort; -import io.searchbox.core.search.sort.Sort.Sorting; - /** Secondary index implementation using Elasticsearch. */ class ElasticChangeIndex extends AbstractElasticIndex implements ChangeIndex { - private static final Logger log = - LoggerFactory.getLogger(ElasticChangeIndex.class); + private static final Logger log = LoggerFactory.getLogger(ElasticChangeIndex.class); static class ChangeMapping { MappingProperties openChanges; @@ -134,18 +130,20 @@ class ElasticChangeIndex extends AbstractElasticIndex throw new IOException(e); } - Bulk bulk = new Bulk.Builder() - .defaultIndex(indexName) - .defaultType("changes") - .addAction(insert(insertIndex, cd)) - .addAction(delete(deleteIndex, cd.getId())) - .refresh(refresh) - .build(); + Bulk bulk = + new Bulk.Builder() + .defaultIndex(indexName) + .defaultType("changes") + .addAction(insert(insertIndex, cd)) + .addAction(delete(deleteIndex, cd.getId())) + .refresh(refresh) + .build(); JestResult result = client.execute(bulk); if (!result.isSucceeded()) { - throw new IOException(String.format( - "Failed to replace change %s in index %s: %s", cd.getId(), indexName, - result.getErrorMessage())); + throw new IOException( + String.format( + "Failed to replace change %s in index %s: %s", + cd.getId(), indexName, result.getErrorMessage())); } } @@ -165,9 +163,7 @@ class ElasticChangeIndex extends AbstractElasticIndex @Override protected Builder addActions(Builder builder, Id c) { - return builder - .addAction(delete(OPEN_CHANGES, c)) - .addAction(delete(OPEN_CHANGES, c)); + return builder.addAction(delete(OPEN_CHANGES, c)).addAction(delete(OPEN_CHANGES, c)); } @Override @@ -184,27 +180,30 @@ class ElasticChangeIndex extends AbstractElasticIndex private final Search search; private final Set fields; - QuerySource(List types, Predicate p, - QueryOptions opts) throws QueryParseException { - List sorts = ImmutableList.of( - new Sort(ChangeField.UPDATED.getName(), Sorting.DESC), - new Sort(ChangeField.LEGACY_ID.getName(), Sorting.DESC)); + QuerySource(List types, Predicate p, QueryOptions opts) + throws QueryParseException { + List sorts = + ImmutableList.of( + new Sort(ChangeField.UPDATED.getName(), Sorting.DESC), + new Sort(ChangeField.LEGACY_ID.getName(), Sorting.DESC)); for (Sort sort : sorts) { sort.setIgnoreUnmapped(); } QueryBuilder qb = queryBuilder.toQueryBuilder(p); fields = IndexUtils.changeFields(opts); - SearchSourceBuilder searchSource = new SearchSourceBuilder() - .query(qb) - .from(opts.start()) - .size(opts.limit()) - .fields(Lists.newArrayList(fields)); + SearchSourceBuilder searchSource = + new SearchSourceBuilder() + .query(qb) + .from(opts.start()) + .size(opts.limit()) + .fields(Lists.newArrayList(fields)); - search = new Search.Builder(searchSource.toString()) - .addType(types) - .addSort(sorts) - .addIndex(indexName) - .build(); + search = + new Search.Builder(searchSource.toString()) + .addType(types) + .addSort(sorts) + .addIndex(indexName) + .build(); } @Override @@ -271,27 +270,26 @@ class ElasticChangeIndex extends AbstractElasticIndex if (c == null) { int id = source.get(ChangeField.LEGACY_ID.getName()).getAsInt(); - String projectName = - source.get(ChangeField.PROJECT.getName()).getAsString(); + String projectName = source.get(ChangeField.PROJECT.getName()).getAsString(); if (projectName == null) { - return changeDataFactory.createOnlyWhenNoteDbDisabled( - db.get(), new Change.Id(id)); + return changeDataFactory.createOnlyWhenNoteDbDisabled(db.get(), new Change.Id(id)); } return changeDataFactory.create( db.get(), new Project.NameKey(projectName), new Change.Id(id)); } - ChangeData cd = changeDataFactory.create(db.get(), - ChangeProtoField.CODEC.decode(Base64.decodeBase64(c.getAsString()))); + ChangeData cd = + changeDataFactory.create( + db.get(), ChangeProtoField.CODEC.decode(Base64.decodeBase64(c.getAsString()))); // Patch sets. - cd.setPatchSets(decodeProtos( - source, ChangeField.PATCH_SET.getName(), PatchSetProtoField.CODEC)); + cd.setPatchSets( + decodeProtos(source, ChangeField.PATCH_SET.getName(), PatchSetProtoField.CODEC)); // Approvals. if (source.get(ChangeField.APPROVAL.getName()) != null) { - cd.setCurrentApprovals(decodeProtos(source, - ChangeField.APPROVAL.getName(), PatchSetApprovalProtoField.CODEC)); + cd.setCurrentApprovals( + decodeProtos(source, ChangeField.APPROVAL.getName(), PatchSetApprovalProtoField.CODEC)); } else if (fields.contains(ChangeField.APPROVAL.getName())) { cd.setCurrentApprovals(Collections.emptyList()); } @@ -320,12 +318,10 @@ class ElasticChangeIndex extends AbstractElasticIndex // Reviewed-by. if (source.get(ChangeField.REVIEWEDBY.getName()) != null) { - JsonArray reviewedBy = - source.get(ChangeField.REVIEWEDBY.getName()).getAsJsonArray(); + JsonArray reviewedBy = source.get(ChangeField.REVIEWEDBY.getName()).getAsJsonArray(); if (reviewedBy.size() > 0) { - Set accounts = - Sets.newHashSetWithExpectedSize(reviewedBy.size()); - for (int i = 0; i < reviewedBy.size() ; i++) { + Set accounts = Sets.newHashSetWithExpectedSize(reviewedBy.size()); + for (int i = 0; i < reviewedBy.size(); i++) { int aId = reviewedBy.get(i).getAsInt(); if (reviewedBy.size() == 1 && aId == ChangeField.NOT_REVIEWED) { break; @@ -340,41 +336,40 @@ class ElasticChangeIndex extends AbstractElasticIndex if (source.get(ChangeField.REVIEWER.getName()) != null) { cd.setReviewers( - ChangeField.parseReviewerFieldValues(FluentIterable - .from( - source.get(ChangeField.REVIEWER.getName()).getAsJsonArray()) - .transform(JsonElement::getAsString))); + ChangeField.parseReviewerFieldValues( + FluentIterable.from(source.get(ChangeField.REVIEWER.getName()).getAsJsonArray()) + .transform(JsonElement::getAsString))); } else if (fields.contains(ChangeField.REVIEWER.getName())) { cd.setReviewers(ReviewerSet.empty()); } - decodeSubmitRecords(source, + decodeSubmitRecords( + source, ChangeField.STORED_SUBMIT_RECORD_STRICT.getName(), - ChangeField.SUBMIT_RULE_OPTIONS_STRICT, cd); - decodeSubmitRecords(source, + ChangeField.SUBMIT_RULE_OPTIONS_STRICT, + cd); + decodeSubmitRecords( + source, ChangeField.STORED_SUBMIT_RECORD_LENIENT.getName(), - ChangeField.SUBMIT_RULE_OPTIONS_LENIENT, cd); + ChangeField.SUBMIT_RULE_OPTIONS_LENIENT, + cd); if (source.get(ChangeField.REF_STATE.getName()) != null) { - JsonArray refStates = - source.get(ChangeField.REF_STATE.getName()).getAsJsonArray(); - cd.setRefStates( - Iterables.transform( - refStates, e -> Base64.decodeBase64(e.getAsString()))); + JsonArray refStates = source.get(ChangeField.REF_STATE.getName()).getAsJsonArray(); + cd.setRefStates(Iterables.transform(refStates, e -> Base64.decodeBase64(e.getAsString()))); } if (source.get(ChangeField.REF_STATE_PATTERN.getName()) != null) { - JsonArray refStatePatterns = source.get( - ChangeField.REF_STATE_PATTERN.getName()).getAsJsonArray(); + JsonArray refStatePatterns = + source.get(ChangeField.REF_STATE_PATTERN.getName()).getAsJsonArray(); cd.setRefStatePatterns( - Iterables.transform( - refStatePatterns, e -> Base64.decodeBase64(e.getAsString()))); + Iterables.transform(refStatePatterns, e -> Base64.decodeBase64(e.getAsString()))); } return cd; } - private void decodeSubmitRecords(JsonObject doc, String fieldName, - SubmitRuleOptions opts, ChangeData out) { + private void decodeSubmitRecords( + JsonObject doc, String fieldName, SubmitRuleOptions opts, ChangeData out) { JsonArray records = doc.getAsJsonArray(fieldName); if (records == null) { return; @@ -383,7 +378,8 @@ class ElasticChangeIndex extends AbstractElasticIndex FluentIterable.from(records) .transform(i -> new String(decodeBase64(i.toString()), UTF_8)) .toList(), - opts, out); + opts, + out); } } } diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticGroupIndex.java b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticGroupIndex.java index f9c96d17af..94b39a0a36 100644 --- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticGroupIndex.java +++ b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticGroupIndex.java @@ -38,28 +38,24 @@ import com.google.gwtorm.server.ResultSet; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - -import org.eclipse.jgit.lib.Config; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.search.builder.SearchSourceBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - import io.searchbox.client.JestResult; import io.searchbox.core.Bulk; import io.searchbox.core.Bulk.Builder; import io.searchbox.core.Search; import io.searchbox.core.search.sort.Sort; import io.searchbox.core.search.sort.Sort.Sorting; +import java.io.IOException; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import org.eclipse.jgit.lib.Config; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -public class ElasticGroupIndex - extends AbstractElasticIndex +public class ElasticGroupIndex extends AbstractElasticIndex implements GroupIndex { static class GroupMapping { MappingProperties groups; @@ -72,8 +68,7 @@ public class ElasticGroupIndex static final String GROUPS = "groups"; static final String GROUPS_PREFIX = GROUPS + "_"; - private static final Logger log = - LoggerFactory.getLogger(ElasticGroupIndex.class); + private static final Logger log = LoggerFactory.getLogger(ElasticGroupIndex.class); private final GroupMapping mapping; private final Provider groupCache; @@ -92,23 +87,25 @@ public class ElasticGroupIndex @Override public void replace(AccountGroup group) throws IOException { - Bulk bulk = new Bulk.Builder() - .defaultIndex(indexName) - .defaultType(GROUPS) - .addAction(insert(GROUPS, group)) - .refresh(refresh) - .build(); + Bulk bulk = + new Bulk.Builder() + .defaultIndex(indexName) + .defaultType(GROUPS) + .addAction(insert(GROUPS, group)) + .refresh(refresh) + .build(); JestResult result = client.execute(bulk); if (!result.isSucceeded()) { throw new IOException( - String.format("Failed to replace group %s in index %s: %s", + String.format( + "Failed to replace group %s in index %s: %s", group.getGroupUUID().get(), indexName, result.getErrorMessage())); } } @Override - public DataSource getSource(Predicate p, - QueryOptions opts) throws QueryParseException { + public DataSource getSource(Predicate p, QueryOptions opts) + throws QueryParseException { return new QuerySource(p, opts); } @@ -119,8 +116,7 @@ public class ElasticGroupIndex @Override protected String getMappings() { - ImmutableMap mappings = - ImmutableMap.of("mappings", mapping); + ImmutableMap mappings = ImmutableMap.of("mappings", mapping); return gson.toJson(mappings); } @@ -133,24 +129,25 @@ public class ElasticGroupIndex private final Search search; private final Set fields; - QuerySource(Predicate p, QueryOptions opts) - throws QueryParseException { + QuerySource(Predicate p, QueryOptions opts) throws QueryParseException { QueryBuilder qb = queryBuilder.toQueryBuilder(p); fields = IndexUtils.groupFields(opts); - SearchSourceBuilder searchSource = new SearchSourceBuilder() - .query(qb) - .from(opts.start()) - .size(opts.limit()) - .fields(Lists.newArrayList(fields)); + SearchSourceBuilder searchSource = + new SearchSourceBuilder() + .query(qb) + .from(opts.start()) + .size(opts.limit()) + .fields(Lists.newArrayList(fields)); Sort sort = new Sort(GroupField.UUID.getName(), Sorting.ASC); sort.setIgnoreUnmapped(); - search = new Search.Builder(searchSource.toString()) - .addType(GROUPS) - .addIndex(indexName) - .addSort(ImmutableList.of(sort)) - .build(); + search = + new Search.Builder(searchSource.toString()) + .addType(GROUPS) + .addIndex(indexName) + .addSort(ImmutableList.of(sort)) + .build(); } @Override @@ -208,8 +205,9 @@ public class ElasticGroupIndex source = json.getAsJsonObject().get("fields"); } - AccountGroup.UUID uuid = new AccountGroup.UUID( - source.getAsJsonObject().get(GroupField.UUID.getName()).getAsString()); + AccountGroup.UUID uuid = + new AccountGroup.UUID( + source.getAsJsonObject().get(GroupField.UUID.getName()).getAsString()); // Use the GroupCache rather than depending on any stored fields in the // document (of which there shouldn't be any). return groupCache.get().get(uuid); diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticIndexModule.java b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticIndexModule.java index 49b8f53729..566e1596bb 100644 --- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticIndexModule.java +++ b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticIndexModule.java @@ -25,10 +25,8 @@ import com.google.gerrit.server.index.group.GroupIndex; import com.google.inject.Provides; import com.google.inject.Singleton; import com.google.inject.assistedinject.FactoryModuleBuilder; - -import org.eclipse.jgit.lib.Config; - import java.util.Map; +import org.eclipse.jgit.lib.Config; public class ElasticIndexModule extends LifecycleModule { private final int threads; @@ -52,16 +50,16 @@ public class ElasticIndexModule extends LifecycleModule { protected void configure() { install( new FactoryModuleBuilder() - .implement(AccountIndex.class, ElasticAccountIndex.class) - .build(AccountIndex.Factory.class)); + .implement(AccountIndex.class, ElasticAccountIndex.class) + .build(AccountIndex.Factory.class)); install( new FactoryModuleBuilder() .implement(ChangeIndex.class, ElasticChangeIndex.class) .build(ChangeIndex.Factory.class)); install( new FactoryModuleBuilder() - .implement(GroupIndex.class, ElasticGroupIndex.class) - .build(GroupIndex.Factory.class)); + .implement(GroupIndex.class, ElasticGroupIndex.class) + .build(GroupIndex.Factory.class)); install(new IndexModule(threads)); install(new SingleVersionModule(singleVersions)); diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticMapping.java b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticMapping.java index 45f686ffce..af74daf8c6 100644 --- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticMapping.java +++ b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticMapping.java @@ -18,7 +18,6 @@ import com.google.common.collect.ImmutableMap; import com.google.gerrit.server.index.FieldDef; import com.google.gerrit.server.index.FieldType; import com.google.gerrit.server.index.Schema; - import java.util.Map; class ElasticMapping { @@ -40,8 +39,7 @@ class ElasticMapping { || fieldType == FieldType.STORED_ONLY) { mapping.addString(name); } else { - throw new IllegalStateException( - "Unsupported field type: " + fieldType.getName()); + throw new IllegalStateException("Unsupported field type: " + fieldType.getName()); } } return mapping.build(); diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticQueryBuilder.java b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticQueryBuilder.java index 22f3d76fbe..d49349747c 100644 --- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticQueryBuilder.java +++ b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticQueryBuilder.java @@ -26,18 +26,15 @@ import com.google.gerrit.server.query.OrPredicate; import com.google.gerrit.server.query.Predicate; import com.google.gerrit.server.query.QueryParseException; import com.google.gerrit.server.query.change.AfterPredicate; - +import java.time.Instant; import org.apache.lucene.search.BooleanQuery; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; -import java.time.Instant; - public class ElasticQueryBuilder { - protected QueryBuilder toQueryBuilder(Predicate p) - throws QueryParseException { + protected QueryBuilder toQueryBuilder(Predicate p) throws QueryParseException { if (p instanceof AndPredicate) { return and(p); } else if (p instanceof OrPredicate) { @@ -51,8 +48,7 @@ public class ElasticQueryBuilder { } } - private BoolQueryBuilder and(Predicate p) - throws QueryParseException { + private BoolQueryBuilder and(Predicate p) throws QueryParseException { try { BoolQueryBuilder b = QueryBuilders.boolQuery(); for (Predicate c : p.getChildren()) { @@ -64,8 +60,7 @@ public class ElasticQueryBuilder { } } - private BoolQueryBuilder or(Predicate p) - throws QueryParseException { + private BoolQueryBuilder or(Predicate p) throws QueryParseException { try { BoolQueryBuilder q = QueryBuilders.boolQuery(); for (Predicate c : p.getChildren()) { @@ -77,8 +72,7 @@ public class ElasticQueryBuilder { } } - private QueryBuilder not(Predicate p) - throws QueryParseException { + private QueryBuilder not(Predicate p) throws QueryParseException { Predicate n = p.getChild(0); if (n instanceof TimestampRangePredicate) { return notTimestamp((TimestampRangePredicate) n); @@ -91,10 +85,9 @@ public class ElasticQueryBuilder { return q; } - private QueryBuilder fieldQuery(IndexPredicate p) - throws QueryParseException { + private QueryBuilder fieldQuery(IndexPredicate p) throws QueryParseException { FieldType type = p.getType(); - FieldDef field = p.getField(); + FieldDef field = p.getField(); String name = field.getName(); String value = p.getValue(); @@ -118,8 +111,7 @@ public class ElasticQueryBuilder { } } - private QueryBuilder intRangeQuery(IndexPredicate p) - throws QueryParseException { + private QueryBuilder intRangeQuery(IndexPredicate p) throws QueryParseException { if (p instanceof IntegerRangePredicate) { IntegerRangePredicate r = (IntegerRangePredicate) p; int minimum = r.getMinimumValue(); @@ -128,15 +120,12 @@ public class ElasticQueryBuilder { // Just fall back to a standard integer query. return QueryBuilders.termQuery(p.getField().getName(), minimum); } - return QueryBuilders.rangeQuery(p.getField().getName()) - .gte(minimum) - .lte(maximum); + return QueryBuilders.rangeQuery(p.getField().getName()).gte(minimum).lte(maximum); } throw new QueryParseException("not an integer range: " + p); } - private QueryBuilder notTimestamp(TimestampRangePredicate r) - throws QueryParseException { + private QueryBuilder notTimestamp(TimestampRangePredicate r) throws QueryParseException { if (r.getMinTimestamp().getTime() == 0) { return QueryBuilders.rangeQuery(r.getField().getName()) .gt(Instant.ofEpochMilli(r.getMaxTimestamp().getTime())); @@ -144,11 +133,9 @@ public class ElasticQueryBuilder { throw new QueryParseException("cannot negate: " + r); } - private QueryBuilder timestampQuery(IndexPredicate p) - throws QueryParseException { + private QueryBuilder timestampQuery(IndexPredicate p) throws QueryParseException { if (p instanceof TimestampRangePredicate) { - TimestampRangePredicate r = - (TimestampRangePredicate) p; + TimestampRangePredicate r = (TimestampRangePredicate) p; if (p instanceof AfterPredicate) { return QueryBuilders.rangeQuery(r.getField().getName()) .gte(Instant.ofEpochMilli(r.getMinTimestamp().getTime())); @@ -160,7 +147,7 @@ public class ElasticQueryBuilder { throw new QueryParseException("not a timestamp: " + p); } - private QueryBuilder exactQuery(IndexPredicate p){ + private QueryBuilder exactQuery(IndexPredicate p) { String name = p.getField().getName(); String value = p.getValue(); @@ -170,8 +157,7 @@ public class ElasticQueryBuilder { if (value.startsWith("^")) { value = value.substring(1); } - if (value.endsWith("$") && !value.endsWith("\\$") - && !value.endsWith("\\\\$")) { + if (value.endsWith("$") && !value.endsWith("\\$") && !value.endsWith("\\\\$")) { value = value.substring(0, value.length() - 1); } return QueryBuilders.regexpQuery(name + ".key", value); diff --git a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticQueryAccountsTest.java b/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticQueryAccountsTest.java index 68759dffbb..b7a317f4ad 100644 --- a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticQueryAccountsTest.java +++ b/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticQueryAccountsTest.java @@ -19,20 +19,17 @@ import com.google.gerrit.server.query.account.AbstractQueryAccountsTest; import com.google.gerrit.testutil.InMemoryModule; import com.google.inject.Guice; import com.google.inject.Injector; - +import java.util.concurrent.ExecutionException; import org.eclipse.jgit.lib.Config; import org.junit.After; import org.junit.AfterClass; import org.junit.BeforeClass; -import java.util.concurrent.ExecutionException; - public class ElasticQueryAccountsTest extends AbstractQueryAccountsTest { private static ElasticNodeInfo nodeInfo; @BeforeClass - public static void startIndexService() - throws InterruptedException, ExecutionException { + public static void startIndexService() throws InterruptedException, ExecutionException { if (nodeInfo != null) { // do not start Elasticsearch twice return; @@ -63,7 +60,6 @@ public class ElasticQueryAccountsTest extends AbstractQueryAccountsTest { Config elasticsearchConfig = new Config(config); InMemoryModule.setDefaults(elasticsearchConfig); ElasticTestUtils.configure(elasticsearchConfig, nodeInfo.port); - return Guice.createInjector( - new InMemoryModule(elasticsearchConfig, notesMigration)); + return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration)); } } diff --git a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticQueryChangesTest.java b/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticQueryChangesTest.java index 95dbe5bb44..beb7aa9865 100644 --- a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticQueryChangesTest.java +++ b/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticQueryChangesTest.java @@ -20,7 +20,7 @@ import com.google.gerrit.testutil.InMemoryModule; import com.google.gerrit.testutil.InMemoryRepositoryManager.Repo; import com.google.inject.Guice; import com.google.inject.Injector; - +import java.util.concurrent.ExecutionException; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.Config; import org.junit.After; @@ -28,14 +28,11 @@ import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; -import java.util.concurrent.ExecutionException; - public class ElasticQueryChangesTest extends AbstractQueryChangesTest { private static ElasticNodeInfo nodeInfo; @BeforeClass - public static void startIndexService() - throws InterruptedException, ExecutionException { + public static void startIndexService() throws InterruptedException, ExecutionException { if (nodeInfo != null) { // do not start Elasticsearch twice return; @@ -67,8 +64,7 @@ public class ElasticQueryChangesTest extends AbstractQueryChangesTest { Config elasticsearchConfig = new Config(config); InMemoryModule.setDefaults(elasticsearchConfig); ElasticTestUtils.configure(elasticsearchConfig, nodeInfo.port); - return Guice.createInjector( - new InMemoryModule(elasticsearchConfig, notesMigration)); + return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration)); } @Test @@ -78,5 +74,4 @@ public class ElasticQueryChangesTest extends AbstractQueryChangesTest { String nameEmail = user.asIdentifiedUser().getNameEmail(); assertQuery("owner: \"" + nameEmail + "\"\\"); } - } diff --git a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticQueryGroupsTest.java b/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticQueryGroupsTest.java index ebb56351f2..2c479f1cad 100644 --- a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticQueryGroupsTest.java +++ b/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticQueryGroupsTest.java @@ -19,20 +19,17 @@ import com.google.gerrit.server.query.group.AbstractQueryGroupsTest; import com.google.gerrit.testutil.InMemoryModule; import com.google.inject.Guice; import com.google.inject.Injector; - +import java.util.concurrent.ExecutionException; import org.eclipse.jgit.lib.Config; import org.junit.After; import org.junit.AfterClass; import org.junit.BeforeClass; -import java.util.concurrent.ExecutionException; - public class ElasticQueryGroupsTest extends AbstractQueryGroupsTest { private static ElasticNodeInfo nodeInfo; @BeforeClass - public static void startIndexService() - throws InterruptedException, ExecutionException { + public static void startIndexService() throws InterruptedException, ExecutionException { if (nodeInfo != null) { // do not start Elasticsearch twice return; @@ -63,7 +60,6 @@ public class ElasticQueryGroupsTest extends AbstractQueryGroupsTest { Config elasticsearchConfig = new Config(config); InMemoryModule.setDefaults(elasticsearchConfig); ElasticTestUtils.configure(elasticsearchConfig, nodeInfo.port); - return Guice.createInjector( - new InMemoryModule(elasticsearchConfig, notesMigration)); + return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration)); } } diff --git a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticTestUtils.java b/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticTestUtils.java index 959fd3c518..3a0e20b2d3 100644 --- a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticTestUtils.java +++ b/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticTestUtils.java @@ -37,23 +37,22 @@ import com.google.gerrit.server.query.change.ChangeData; import com.google.gson.FieldNamingPolicy; import com.google.gson.Gson; import com.google.gson.GsonBuilder; - +import java.io.File; +import java.nio.file.Path; +import java.util.Iterator; +import java.util.Map; +import java.util.concurrent.ExecutionException; import org.eclipse.jgit.lib.Config; import org.elasticsearch.action.admin.cluster.node.info.NodesInfoRequest; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.node.Node; import org.elasticsearch.node.NodeBuilder; -import java.io.File; -import java.nio.file.Path; -import java.util.Iterator; -import java.util.Map; -import java.util.concurrent.ExecutionException; - final class ElasticTestUtils { - static final Gson gson = new GsonBuilder() - .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) - .create(); + static final Gson gson = + new GsonBuilder() + .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) + .create(); static class ElasticNodeInfo { final Node node; @@ -75,41 +74,33 @@ final class ElasticTestUtils { config.setBoolean("index", "elasticsearch", "test", true); } - static ElasticNodeInfo startElasticsearchNode() - throws InterruptedException, ExecutionException { + static ElasticNodeInfo startElasticsearchNode() throws InterruptedException, ExecutionException { File elasticDir = Files.createTempDir(); Path elasticDirPath = elasticDir.toPath(); - Settings settings = Settings.settingsBuilder() - .put("cluster.name", "gerrit") - .put("node.name", "Gerrit Elasticsearch Test Node") - .put("node.local", true) - .put("discovery.zen.ping.multicast.enabled", false) - .put("index.store.fs.memory.enabled", true) - .put("index.gateway.type", "none") - .put("index.max_result_window", Integer.MAX_VALUE) - .put("gateway.type", "default") - .put("http.port", 0) - .put("discovery.zen.ping.unicast.hosts", "[\"localhost\"]") - .put("path.home", elasticDirPath.toAbsolutePath()) - .put("path.data", elasticDirPath.resolve("data").toAbsolutePath()) - .put("path.work", elasticDirPath.resolve("work").toAbsolutePath()) - .put("path.logs", elasticDirPath.resolve("logs").toAbsolutePath()) - .put("transport.tcp.connect_timeout", "60s") - .build(); + Settings settings = + Settings.settingsBuilder() + .put("cluster.name", "gerrit") + .put("node.name", "Gerrit Elasticsearch Test Node") + .put("node.local", true) + .put("discovery.zen.ping.multicast.enabled", false) + .put("index.store.fs.memory.enabled", true) + .put("index.gateway.type", "none") + .put("index.max_result_window", Integer.MAX_VALUE) + .put("gateway.type", "default") + .put("http.port", 0) + .put("discovery.zen.ping.unicast.hosts", "[\"localhost\"]") + .put("path.home", elasticDirPath.toAbsolutePath()) + .put("path.data", elasticDirPath.resolve("data").toAbsolutePath()) + .put("path.work", elasticDirPath.resolve("work").toAbsolutePath()) + .put("path.logs", elasticDirPath.resolve("logs").toAbsolutePath()) + .put("transport.tcp.connect_timeout", "60s") + .build(); // Start the node - Node node = NodeBuilder.nodeBuilder() - .settings(settings) - .node(); + Node node = NodeBuilder.nodeBuilder().settings(settings).node(); // Wait for it to be ready - node.client() - .admin() - .cluster() - .prepareHealth() - .setWaitForYellowStatus() - .execute() - .actionGet(); + node.client().admin().cluster().prepareHealth().setWaitForYellowStatus().execute().actionGet(); assertThat(node.isClosed()).isFalse(); return new ElasticNodeInfo(node, elasticDir, getHttpPort(node)); @@ -128,76 +119,67 @@ final class ElasticTestUtils { } static void createAllIndexes(ElasticNodeInfo nodeInfo) { - Schema changeSchema = - ChangeSchemaDefinitions.INSTANCE.getLatest(); + Schema changeSchema = ChangeSchemaDefinitions.INSTANCE.getLatest(); ChangeMapping openChangesMapping = new ChangeMapping(changeSchema); ChangeMapping closedChangesMapping = new ChangeMapping(changeSchema); openChangesMapping.closedChanges = null; closedChangesMapping.openChanges = null; - nodeInfo.node + nodeInfo + .node .client() .admin() .indices() - .prepareCreate( - String.format("%s%04d", CHANGES_PREFIX, changeSchema.getVersion())) + .prepareCreate(String.format("%s%04d", CHANGES_PREFIX, changeSchema.getVersion())) .addMapping(OPEN_CHANGES, gson.toJson(openChangesMapping)) .addMapping(CLOSED_CHANGES, gson.toJson(closedChangesMapping)) .execute() .actionGet(); - Schema accountSchema = - AccountSchemaDefinitions.INSTANCE.getLatest(); + Schema accountSchema = AccountSchemaDefinitions.INSTANCE.getLatest(); AccountMapping accountMapping = new AccountMapping(accountSchema); - nodeInfo.node + nodeInfo + .node .client() .admin() .indices() - .prepareCreate( - String.format( - "%s%04d", ACCOUNTS_PREFIX, accountSchema.getVersion())) + .prepareCreate(String.format("%s%04d", ACCOUNTS_PREFIX, accountSchema.getVersion())) .addMapping(ElasticAccountIndex.ACCOUNTS, gson.toJson(accountMapping)) .execute() .actionGet(); - Schema groupSchema = - GroupSchemaDefinitions.INSTANCE.getLatest(); + Schema groupSchema = GroupSchemaDefinitions.INSTANCE.getLatest(); GroupMapping groupMapping = new GroupMapping(groupSchema); - nodeInfo.node + nodeInfo + .node .client() .admin() .indices() - .prepareCreate( - String.format( - "%s%04d", GROUPS_PREFIX, groupSchema.getVersion())) + .prepareCreate(String.format("%s%04d", GROUPS_PREFIX, groupSchema.getVersion())) .addMapping(ElasticGroupIndex.GROUPS, gson.toJson(groupMapping)) .execute() .actionGet(); } - private static String getHttpPort(Node node) - throws InterruptedException, ExecutionException { - String nodes = node.client().admin().cluster() - .nodesInfo(new NodesInfoRequest("*")).get().toString(); - Gson gson = new GsonBuilder() - .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) - .create(); + private static String getHttpPort(Node node) throws InterruptedException, ExecutionException { + String nodes = + node.client().admin().cluster().nodesInfo(new NodesInfoRequest("*")).get().toString(); + Gson gson = + new GsonBuilder() + .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) + .create(); Info info = gson.fromJson(nodes, Info.class); if (info.nodes == null || info.nodes.size() != 1) { - throw new RuntimeException( - "Cannot extract local Elasticsearch http port"); + throw new RuntimeException("Cannot extract local Elasticsearch http port"); } Iterator values = info.nodes.values().iterator(); String httpAddress = values.next().httpAddress; if (Strings.isNullOrEmpty(httpAddress)) { - throw new RuntimeException( - "Cannot extract local Elasticsearch http port"); + throw new RuntimeException("Cannot extract local Elasticsearch http port"); } if (httpAddress.indexOf(':') < 0) { - throw new RuntimeException( - "Seems that port is not included in Elasticsearch http_address"); + throw new RuntimeException("Seems that port is not included in Elasticsearch http_address"); } - return httpAddress.substring(httpAddress.indexOf(':') + 1, - httpAddress.length()); + return httpAddress.substring(httpAddress.indexOf(':') + 1, httpAddress.length()); } private ElasticTestUtils() { diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/CapabilityScope.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/CapabilityScope.java index ee5a6d5aeb..cd4a830ff4 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/CapabilityScope.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/CapabilityScope.java @@ -19,12 +19,12 @@ public enum CapabilityScope { /** * Scope is assumed based on the context. * - * When {@code @RequiresCapability} is used within a plugin the scope of the - * capability is assumed to be that plugin. + *

When {@code @RequiresCapability} is used within a plugin the scope of the capability is + * assumed to be that plugin. * - * If {@code @RequiresCapability} is used within the core Gerrit Code Review - * server (and thus is outside of a plugin) the scope is the core server and - * will use {@code com.google.gerrit.common.data.GlobalCapability}. + *

If {@code @RequiresCapability} is used within the core Gerrit Code Review server (and thus + * is outside of a plugin) the scope is the core server and will use {@code + * com.google.gerrit.common.data.GlobalCapability}. */ CONTEXT, diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/Export.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/Export.java index 8cf743a37d..9badc8714b 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/Export.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/Export.java @@ -17,27 +17,25 @@ package com.google.gerrit.extensions.annotations; import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.google.inject.BindingAnnotation; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.Target; /** * Annotation applied to auto-registered, exported types. - *

- * Plugins or extensions using auto-registration should apply this annotation to - * any non-abstract class they want exported for access. - *

- * For SSH commands the {@literal @Export} annotation names the subcommand: + * + *

Plugins or extensions using auto-registration should apply this annotation to any non-abstract + * class they want exported for access. + * + *

For SSH commands the {@literal @Export} annotation names the subcommand: * *

  *   {@literal @Export("print")}
  *   class MyCommand extends SshCommand {
  * 
* - * For HTTP servlets, the {@literal @Export} annotation names the URL the - * servlet is bound to, relative to the plugin or extension's namespace within - * the Gerrit container. + * For HTTP servlets, the {@literal @Export} annotation names the URL the servlet is bound to, + * relative to the plugin or extension's namespace within the Gerrit container. * *
  *  {@literal @Export("/index.html")}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/Exports.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/Exports.java
index c48bcfb9c0..05fd5b2da6 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/Exports.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/Exports.java
@@ -21,6 +21,5 @@ public final class Exports {
     return new ExportImpl(name);
   }
 
-  private Exports() {
-  }
+  private Exports() {}
 }
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/ExtensionPoint.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/ExtensionPoint.java
index 4799f5e1ff..7bb120301a 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/ExtensionPoint.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/ExtensionPoint.java
@@ -18,24 +18,22 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 import com.google.gerrit.extensions.registration.DynamicSet;
 import com.google.inject.BindingAnnotation;
-
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
 /**
  * Annotation for interfaces that accept auto-registered implementations.
- * 

- * Interfaces that accept automatically registered implementations into their - * {@link DynamicSet} must be tagged with this annotation. - *

- * Plugins or extensions that implement an {@code @ExtensionPoint} interface - * should use the {@link Listen} annotation to automatically register. + * + *

Interfaces that accept automatically registered implementations into their {@link DynamicSet} + * must be tagged with this annotation. + * + *

Plugins or extensions that implement an {@code @ExtensionPoint} interface should use the + * {@link Listen} annotation to automatically register. * * @see Listen */ @Target({ElementType.TYPE}) @Retention(RUNTIME) @BindingAnnotation -public @interface ExtensionPoint { -} +public @interface ExtensionPoint {} diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/Listen.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/Listen.java index e4ba9316c4..2dc0c9165b 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/Listen.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/Listen.java @@ -17,23 +17,21 @@ package com.google.gerrit.extensions.annotations; import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.google.inject.BindingAnnotation; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.Target; /** * Annotation for auto-registered extension point implementations. - *

- * Plugins or extensions using auto-registration should apply this annotation to - * any non-abstract class that implements an unnamed extension point, such as a - * notification listener. Gerrit will automatically determine which extension - * points to apply based on the interfaces the type implements. + * + *

Plugins or extensions using auto-registration should apply this annotation to any non-abstract + * class that implements an unnamed extension point, such as a notification listener. Gerrit will + * automatically determine which extension points to apply based on the interfaces the type + * implements. * * @see Export */ @Target({ElementType.TYPE}) @Retention(RUNTIME) @BindingAnnotation -public @interface Listen { -} +public @interface Listen {} diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/PluginCanonicalWebUrl.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/PluginCanonicalWebUrl.java index 90295c8e9d..539ff4fdce 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/PluginCanonicalWebUrl.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/PluginCanonicalWebUrl.java @@ -17,16 +17,15 @@ package com.google.gerrit.extensions.annotations; import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.google.inject.BindingAnnotation; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.Target; /** * Annotation applied to a String containing the plugin canonical web URL. - *

- * A plugin or extension may receive this string by Guice injection to discover - * the canonical web URL under which the plugin is available: + * + *

A plugin or extension may receive this string by Guice injection to discover the canonical web + * URL under which the plugin is available: * *

  *  {@literal @Inject}
@@ -38,5 +37,4 @@ import java.lang.annotation.Target;
 @Target({ElementType.PARAMETER, ElementType.FIELD})
 @Retention(RUNTIME)
 @BindingAnnotation
-public @interface PluginCanonicalWebUrl {
-}
+public @interface PluginCanonicalWebUrl {}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/PluginData.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/PluginData.java
index 4893beff83..be9a9eb2b1 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/PluginData.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/PluginData.java
@@ -17,18 +17,17 @@ package com.google.gerrit.extensions.annotations;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 import com.google.inject.BindingAnnotation;
-
 import java.lang.annotation.Retention;
 
 /**
  * Local path where a plugin can store its own private data.
- * 

- * A plugin or extension may receive this string by Guice injection to discover - * a directory where it can store configuration or other data that is private: - *

- * This binding is on both {@link java.io.File} and {@link java.nio.file.Path}, - * pointing to the same location. The {@code File} version should be considered - * deprecated and may be removed in a future version. + * + *

A plugin or extension may receive this string by Guice injection to discover a directory where + * it can store configuration or other data that is private: + * + *

This binding is on both {@link java.io.File} and {@link java.nio.file.Path}, pointing to the + * same location. The {@code File} version should be considered deprecated and may be removed in a + * future version. * *

  * {@literal @Inject}
@@ -39,5 +38,4 @@ import java.lang.annotation.Retention;
  */
 @Retention(RUNTIME)
 @BindingAnnotation
-public @interface PluginData {
-}
+public @interface PluginData {}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/PluginName.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/PluginName.java
index efdd3c6cf4..8934605f27 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/PluginName.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/PluginName.java
@@ -17,16 +17,15 @@ package com.google.gerrit.extensions.annotations;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 import com.google.inject.BindingAnnotation;
-
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
 /**
  * Annotation applied to a String containing the plugin or extension name.
- * 

- * A plugin or extension may receive this string by Guice injection to discover - * the name that an administrator has installed the plugin or extension under: + * + *

A plugin or extension may receive this string by Guice injection to discover the name that an + * administrator has installed the plugin or extension under: * *

  *  {@literal @Inject}
@@ -38,5 +37,4 @@ import java.lang.annotation.Target;
 @Target({ElementType.PARAMETER, ElementType.FIELD})
 @Retention(RUNTIME)
 @BindingAnnotation
-public @interface PluginName {
-}
+public @interface PluginName {}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/RequiresAnyCapability.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/RequiresAnyCapability.java
index 8f97d77c51..f97abd9809 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/RequiresAnyCapability.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/RequiresAnyCapability.java
@@ -21,9 +21,9 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
 /**
- * Annotation on {@code com.google.gerrit.sshd.SshCommand} or
- * {@code com.google.gerrit.httpd.restapi.RestApiServlet} declaring a set of
- * capabilities of which at least one must be granted.
+ * Annotation on {@code com.google.gerrit.sshd.SshCommand} or {@code
+ * com.google.gerrit.httpd.restapi.RestApiServlet} declaring a set of capabilities of which at least
+ * one must be granted.
  */
 @Target({ElementType.TYPE})
 @Retention(RUNTIME)
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/RequiresCapability.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/RequiresCapability.java
index 511ae0c05c..7717c84d90 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/RequiresCapability.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/RequiresCapability.java
@@ -21,9 +21,8 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
 /**
- * Annotation on {@code com.google.gerrit.sshd.SshCommand} or
- * {@code com.google.gerrit.httpd.restapi.RestApiServlet} declaring a
- * capability must be granted.
+ * Annotation on {@code com.google.gerrit.sshd.SshCommand} or {@code
+ * com.google.gerrit.httpd.restapi.RestApiServlet} declaring a capability must be granted.
  */
 @Target({ElementType.TYPE})
 @Retention(RUNTIME)
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/RootRelative.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/RootRelative.java
index a812b53bf4..392cd0e2a2 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/RootRelative.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/RootRelative.java
@@ -17,21 +17,17 @@ package com.google.gerrit.extensions.annotations;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 import com.google.inject.BindingAnnotation;
-
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
 /**
- * Annotation applied to HttpServletRequest and HttpServletResponse
- * when they are inherited from Gerrit instead of being injected by
- * a plugin's ServletModule.  This means that the path returned by
- * 'javax.servlet.http.HttpServletRequest#getPathInfo()' is
- * relative to the Gerrit root instead of a path within the plugin's
- * URL space.
+ * Annotation applied to HttpServletRequest and HttpServletResponse when they are inherited from
+ * Gerrit instead of being injected by a plugin's ServletModule. This means that the path returned
+ * by 'javax.servlet.http.HttpServletRequest#getPathInfo()' is relative to the Gerrit root instead
+ * of a path within the plugin's URL space.
  */
 @Target({ElementType.PARAMETER, ElementType.FIELD})
 @Retention(RUNTIME)
 @BindingAnnotation
-public @interface RootRelative {
-}
+public @interface RootRelative {}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/GerritApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/GerritApi.java
index c2e37872d7..8dcc49dbc8 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/GerritApi.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/GerritApi.java
@@ -23,15 +23,19 @@ import com.google.gerrit.extensions.restapi.NotImplementedException;
 
 public interface GerritApi {
   Accounts accounts();
+
   Changes changes();
+
   Config config();
+
   Groups groups();
+
   Projects projects();
 
   /**
-   * A default implementation which allows source compatibility
-   * when adding new methods to the interface.
-   **/
+   * A default implementation which allows source compatibility when adding new methods to the
+   * interface.
+   */
   class NotImplemented implements GerritApi {
     @Override
     public Accounts accounts() {
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/access/ProjectAccessInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/access/ProjectAccessInfo.java
index 3274313a28..0922d955d3 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/access/ProjectAccessInfo.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/access/ProjectAccessInfo.java
@@ -15,7 +15,6 @@
 package com.google.gerrit.extensions.api.access;
 
 import com.google.gerrit.extensions.common.ProjectInfo;
-
 import java.util.Map;
 import java.util.Set;
 
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/AccountApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/AccountApi.java
index 767fce63db..025ac30e1a 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/AccountApi.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/AccountApi.java
@@ -27,7 +27,6 @@ import com.google.gerrit.extensions.common.GpgKeyInfo;
 import com.google.gerrit.extensions.common.SshKeyInfo;
 import com.google.gerrit.extensions.restapi.NotImplementedException;
 import com.google.gerrit.extensions.restapi.RestApiException;
-
 import java.util.List;
 import java.util.Map;
 import java.util.SortedSet;
@@ -36,32 +35,37 @@ public interface AccountApi {
   AccountInfo get() throws RestApiException;
 
   boolean getActive() throws RestApiException;
+
   void setActive(boolean active) throws RestApiException;
 
   String getAvatarUrl(int size) throws RestApiException;
 
   GeneralPreferencesInfo getPreferences() throws RestApiException;
-  GeneralPreferencesInfo setPreferences(GeneralPreferencesInfo in)
-      throws RestApiException;
+
+  GeneralPreferencesInfo setPreferences(GeneralPreferencesInfo in) throws RestApiException;
 
   DiffPreferencesInfo getDiffPreferences() throws RestApiException;
-  DiffPreferencesInfo setDiffPreferences(DiffPreferencesInfo in)
-      throws RestApiException;
+
+  DiffPreferencesInfo setDiffPreferences(DiffPreferencesInfo in) throws RestApiException;
 
   EditPreferencesInfo getEditPreferences() throws RestApiException;
-  EditPreferencesInfo setEditPreferences(EditPreferencesInfo in)
-      throws RestApiException;
+
+  EditPreferencesInfo setEditPreferences(EditPreferencesInfo in) throws RestApiException;
 
   List getWatchedProjects() throws RestApiException;
-  List setWatchedProjects(List in)
-      throws RestApiException;
-  void deleteWatchedProjects(List in)
-      throws RestApiException;
+
+  List setWatchedProjects(List in) throws RestApiException;
+
+  void deleteWatchedProjects(List in) throws RestApiException;
 
   void starChange(String changeId) throws RestApiException;
+
   void unstarChange(String changeId) throws RestApiException;
+
   void setStars(String changeId, StarsInput input) throws RestApiException;
+
   SortedSet getStars(String changeId) throws RestApiException;
+
   List getStarredChanges() throws RestApiException;
 
   void addEmail(EmailInput input) throws RestApiException;
@@ -69,26 +73,31 @@ public interface AccountApi {
   void setStatus(String status) throws RestApiException;
 
   List listSshKeys() throws RestApiException;
+
   SshKeyInfo addSshKey(String key) throws RestApiException;
+
   void deleteSshKey(int seq) throws RestApiException;
 
   Map listGpgKeys() throws RestApiException;
-  Map putGpgKeys(List add, List remove)
-      throws RestApiException;
+
+  Map putGpgKeys(List add, List remove) throws RestApiException;
+
   GpgKeyApi gpgKey(String id) throws RestApiException;
 
   List listAgreements() throws RestApiException;
+
   void signAgreement(String agreementName) throws RestApiException;
 
   void index() throws RestApiException;
 
   List getExternalIds() throws RestApiException;
+
   void deleteExternalIds(List externalIds) throws RestApiException;
 
   /**
-   * A default implementation which allows source compatibility
-   * when adding new methods to the interface.
-   **/
+   * A default implementation which allows source compatibility when adding new methods to the
+   * interface.
+   */
   class NotImplemented implements AccountApi {
     @Override
     public AccountInfo get() {
@@ -146,8 +155,7 @@ public interface AccountApi {
     }
 
     @Override
-    public List setWatchedProjects(
-        List in) {
+    public List setWatchedProjects(List in) {
       throw new NotImplementedException();
     }
 
@@ -207,8 +215,7 @@ public interface AccountApi {
     }
 
     @Override
-    public Map putGpgKeys(List add,
-        List remove) {
+    public Map putGpgKeys(List add, List remove) {
       throw new NotImplementedException();
     }
 
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/AccountInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/AccountInput.java
index 33baf93143..259838ba84 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/AccountInput.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/AccountInput.java
@@ -15,12 +15,10 @@
 package com.google.gerrit.extensions.api.accounts;
 
 import com.google.gerrit.extensions.restapi.DefaultInput;
-
 import java.util.List;
 
 public class AccountInput {
-  @DefaultInput
-  public String username;
+  @DefaultInput public String username;
   public String name;
   public String email;
   public String sshKey;
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/Accounts.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/Accounts.java
index 58f1b9bac4..eab3233b80 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/Accounts.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/Accounts.java
@@ -18,7 +18,6 @@ import com.google.gerrit.extensions.client.ListAccountsOption;
 import com.google.gerrit.extensions.common.AccountInfo;
 import com.google.gerrit.extensions.restapi.NotImplementedException;
 import com.google.gerrit.extensions.restapi.RestApiException;
-
 import java.util.Arrays;
 import java.util.EnumSet;
 import java.util.List;
@@ -26,23 +25,19 @@ import java.util.List;
 public interface Accounts {
   /**
    * Look up an account by ID.
-   * 

- * Note: This method eagerly reads the account. Methods that - * mutate the account do not necessarily re-read the account. Therefore, calling - * a getter method on an instance after calling a mutation method on that same - * instance is not guaranteed to reflect the mutation. It is not recommended - * to store references to {@code AccountApi} instances. * - * @param id any identifier supported by the REST API, including numeric ID, - * email, or username. + *

Note: This method eagerly reads the account. Methods that mutate the + * account do not necessarily re-read the account. Therefore, calling a getter method on an + * instance after calling a mutation method on that same instance is not guaranteed to reflect the + * mutation. It is not recommended to store references to {@code AccountApi} instances. + * + * @param id any identifier supported by the REST API, including numeric ID, email, or username. * @return API for accessing the account. * @throws RestApiException if an error occurred. */ AccountApi id(String id) throws RestApiException; - /** - * @see #id(String) - */ + /** @see #id(String) */ AccountApi id(int id) throws RestApiException; /** @@ -60,9 +55,8 @@ public interface Accounts { /** * Suggest users for a given query. - *

- * Example code: - * {@code suggestAccounts().withQuery("Reviewer").withLimit(5).get()} + * + *

Example code: {@code suggestAccounts().withQuery("Reviewer").withLimit(5).get()} * * @return API for setting parameters and getting result. */ @@ -70,19 +64,17 @@ public interface Accounts { /** * Suggest users for a given query. - *

- * Shortcut API for {@code suggestAccounts().withQuery(String)}. + * + *

Shortcut API for {@code suggestAccounts().withQuery(String)}. * * @see #suggestAccounts() */ - SuggestAccountsRequest suggestAccounts(String query) - throws RestApiException; + SuggestAccountsRequest suggestAccounts(String query) throws RestApiException; /** * Query users. - *

- * Example code: - * {@code query().withQuery("name:John email:example.com").withLimit(5).get()} + * + *

Example code: {@code query().withQuery("name:John email:example.com").withLimit(5).get()} * * @return API for setting parameters and getting result. */ @@ -90,16 +82,15 @@ public interface Accounts { /** * Query users. - *

- * Shortcut API for {@code query().withQuery(String)}. + * + *

Shortcut API for {@code query().withQuery(String)}. * * @see #query() */ QueryRequest query(String query) throws RestApiException; /** - * API for setting parameters and getting result. - * Used for {@code suggestAccounts()}. + * API for setting parameters and getting result. Used for {@code suggestAccounts()}. * * @see #suggestAccounts() */ @@ -107,9 +98,7 @@ public interface Accounts { private String query; private int limit; - /** - * Execute query and return a list of accounts. - */ + /** Execute query and return a list of accounts. */ public abstract List get() throws RestApiException; /** @@ -123,8 +112,7 @@ public interface Accounts { } /** - * Set limit for returned list of accounts. - * Optional; server-default is used when not provided. + * Set limit for returned list of accounts. Optional; server-default is used when not provided. */ public SuggestAccountsRequest withLimit(int limit) { this.limit = limit; @@ -141,8 +129,7 @@ public interface Accounts { } /** - * API for setting parameters and getting result. - * Used for {@code query()}. + * API for setting parameters and getting result. Used for {@code query()}. * * @see #query() */ @@ -150,12 +137,9 @@ public interface Accounts { private String query; private int limit; private int start; - private EnumSet options = - EnumSet.noneOf(ListAccountsOption.class); + private EnumSet options = EnumSet.noneOf(ListAccountsOption.class); - /** - * Execute query and return a list of accounts. - */ + /** Execute query and return a list of accounts. */ public abstract List get() throws RestApiException; /** @@ -169,18 +153,14 @@ public interface Accounts { } /** - * Set limit for returned list of accounts. - * Optional; server-default is used when not provided. + * Set limit for returned list of accounts. Optional; server-default is used when not provided. */ public QueryRequest withLimit(int limit) { this.limit = limit; return this; } - /** - * Set number of accounts to skip. - * Optional; no accounts are skipped when not provided. - */ + /** Set number of accounts to skip. Optional; no accounts are skipped when not provided. */ public QueryRequest withStart(int start) { this.start = start; return this; @@ -219,9 +199,9 @@ public interface Accounts { } /** - * A default implementation which allows source compatibility - * when adding new methods to the interface. - **/ + * A default implementation which allows source compatibility when adding new methods to the + * interface. + */ class NotImplemented implements Accounts { @Override public AccountApi id(String id) { diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/EmailInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/EmailInput.java index 5036731ce4..9d6b3c5e61 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/EmailInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/EmailInput.java @@ -19,8 +19,7 @@ import com.google.gerrit.extensions.restapi.DefaultInput; /** This entity contains information for registering a new email address. */ public class EmailInput { /* The email address. If provided, must match the email address from the URL. */ - @DefaultInput - public String email; + @DefaultInput public String email; /* Whether the new email address should become the preferred email address of * the user. Only supported if {@link #noConfirmation} is set or if the diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/GpgKeyApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/GpgKeyApi.java index 9bea6f9bb6..a8a761d8bb 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/GpgKeyApi.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/GpgKeyApi.java @@ -20,11 +20,12 @@ import com.google.gerrit.extensions.restapi.RestApiException; public interface GpgKeyApi { GpgKeyInfo get() throws RestApiException; + void delete() throws RestApiException; /** - * A default implementation which allows source compatibility - * when adding new methods to the interface. + * A default implementation which allows source compatibility when adding new methods to the + * interface. */ class NotImplemented implements GpgKeyApi { @Override diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/AbandonInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/AbandonInput.java index 62829f0b70..b3ba1e28d4 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/AbandonInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/AbandonInput.java @@ -15,13 +15,10 @@ package com.google.gerrit.extensions.api.changes; import com.google.gerrit.extensions.restapi.DefaultInput; - import java.util.Map; public class AbandonInput { - @DefaultInput - public String message; + @DefaultInput public String message; public NotifyHandling notify = NotifyHandling.ALL; public Map notifyDetails; } - diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ActionVisitor.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ActionVisitor.java index 6aa7f0ccfb..c120b78961 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ActionVisitor.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ActionVisitor.java @@ -21,45 +21,42 @@ import com.google.gerrit.extensions.common.RevisionInfo; /** * Extension point called during population of {@link ActionInfo} maps. - *

- * Each visitor may mutate the input {@link ActionInfo}, or filter it out of the - * map entirely. When multiple extensions are registered, the order in which - * they are executed is undefined. + * + *

Each visitor may mutate the input {@link ActionInfo}, or filter it out of the map entirely. + * When multiple extensions are registered, the order in which they are executed is undefined. */ @ExtensionPoint public interface ActionVisitor { /** * Visit a change-level action. - *

- * Callers may mutate the input {@link ActionInfo}, or return false to omit - * the action from the map entirely. Inputs other than the {@link ActionInfo} - * should be considered immutable. * - * @param name name of the action, as a key into the {@link ActionInfo} map - * returned by the REST API. + *

Callers may mutate the input {@link ActionInfo}, or return false to omit the action from the + * map entirely. Inputs other than the {@link ActionInfo} should be considered immutable. + * + * @param name name of the action, as a key into the {@link ActionInfo} map returned by the REST + * API. * @param actionInfo action being visited; caller may mutate. - * @param changeInfo information about the change to which this action - * belongs; caller should treat as immutable. + * @param changeInfo information about the change to which this action belongs; caller should + * treat as immutable. * @return true if the action should remain in the map, or false to omit it. */ boolean visit(String name, ActionInfo actionInfo, ChangeInfo changeInfo); /** * Visit a revision-level action. - *

- * Callers may mutate the input {@link ActionInfo}, or return false to omit - * the action from the map entirely. Inputs other than the {@link ActionInfo} - * should be considered immutable. * - * @param name name of the action, as a key into the {@link ActionInfo} map - * returned by the REST API. + *

Callers may mutate the input {@link ActionInfo}, or return false to omit the action from the + * map entirely. Inputs other than the {@link ActionInfo} should be considered immutable. + * + * @param name name of the action, as a key into the {@link ActionInfo} map returned by the REST + * API. * @param actionInfo action being visited; caller may mutate. - * @param changeInfo information about the change to which this action - * belongs; caller should treat as immutable. - * @param revisionInfo information about the revision to which this action - * belongs; caller should treat as immutable. + * @param changeInfo information about the change to which this action belongs; caller should + * treat as immutable. + * @param revisionInfo information about the revision to which this action belongs; caller should + * treat as immutable. * @return true if the action should remain in the map, or false to omit it. */ - boolean visit(String name, ActionInfo actionInfo, ChangeInfo changeInfo, - RevisionInfo revisionInfo); + boolean visit( + String name, ActionInfo actionInfo, ChangeInfo changeInfo, RevisionInfo revisionInfo); } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/AddReviewerInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/AddReviewerInput.java index a042757ecc..bc8b28aef0 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/AddReviewerInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/AddReviewerInput.java @@ -18,12 +18,10 @@ import static com.google.gerrit.extensions.client.ReviewerState.REVIEWER; import com.google.gerrit.extensions.client.ReviewerState; import com.google.gerrit.extensions.restapi.DefaultInput; - import java.util.Map; public class AddReviewerInput { - @DefaultInput - public String reviewer; + @DefaultInput public String reviewer; public Boolean confirmed; public ReviewerState state; public NotifyHandling notify; @@ -36,4 +34,4 @@ public class AddReviewerInput { public ReviewerState state() { return (state != null) ? state : REVIEWER; } -} \ No newline at end of file +} diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/AddReviewerResult.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/AddReviewerResult.java index 10f74ff842..a23281a17f 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/AddReviewerResult.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/AddReviewerResult.java @@ -16,46 +16,33 @@ package com.google.gerrit.extensions.api.changes; import com.google.gerrit.common.Nullable; import com.google.gerrit.extensions.common.AccountInfo; - import java.util.List; -/** - * Result object representing the outcome of a request to add a reviewer. - */ +/** Result object representing the outcome of a request to add a reviewer. */ public class AddReviewerResult { - /** - * The identifier of an account or group that was to be added as a reviewer. - */ + /** The identifier of an account or group that was to be added as a reviewer. */ public String input; - /** - * If non-null, a string describing why the reviewer could not be added. - */ - @Nullable - public String error; + /** If non-null, a string describing why the reviewer could not be added. */ + @Nullable public String error; /** - * Non-null and true if the reviewer cannot be added without explicit - * confirmation. This may be the case for groups of a certain size. + * Non-null and true if the reviewer cannot be added without explicit confirmation. This may be + * the case for groups of a certain size. */ - @Nullable - public Boolean confirm; + @Nullable public Boolean confirm; /** - * List of individual reviewers added to the change. The size of this - * list may be greater than one (e.g. when a group is added). Null if no - * reviewers were added. + * List of individual reviewers added to the change. The size of this list may be greater than one + * (e.g. when a group is added). Null if no reviewers were added. */ - @Nullable - public List reviewers; + @Nullable public List reviewers; /** - * List of accounts CCed on the change. The size of this list may be - * greater than one (e.g. when a group is CCed). Null if no accounts were CCed - * or if reviewers is non-null. + * List of accounts CCed on the change. The size of this list may be greater than one (e.g. when a + * group is CCed). Null if no accounts were CCed or if reviewers is non-null. */ - @Nullable - public List ccs; + @Nullable public List ccs; /** * Constructs a partially initialized result for the given reviewer. @@ -86,4 +73,4 @@ public class AddReviewerResult { this(reviewer); this.confirm = confirm; } -} \ No newline at end of file +} diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/AssigneeInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/AssigneeInput.java index 61b5b85c26..e17e1c9854 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/AssigneeInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/AssigneeInput.java @@ -17,6 +17,5 @@ package com.google.gerrit.extensions.api.changes; import com.google.gerrit.extensions.restapi.DefaultInput; public class AssigneeInput { - @DefaultInput - public String assignee; + @DefaultInput public String assignee; } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ChangeApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ChangeApi.java index efdf76402f..8d143267c4 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ChangeApi.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ChangeApi.java @@ -24,7 +24,6 @@ import com.google.gerrit.extensions.common.RobotCommentInfo; import com.google.gerrit.extensions.common.SuggestedReviewerInfo; import com.google.gerrit.extensions.restapi.NotImplementedException; import com.google.gerrit.extensions.restapi.RestApiException; - import java.util.EnumSet; import java.util.List; import java.util.Map; @@ -35,12 +34,11 @@ public interface ChangeApi { /** * Look up the current revision for the change. - *

- * Note: This method eagerly reads the revision. Methods that - * mutate the revision do not necessarily re-read the revision. Therefore, - * calling a getter method on an instance after calling a mutation method on - * that same instance is not guaranteed to reflect the mutation. It is not - * recommended to store references to {@code RevisionApi} instances. + * + *

Note: This method eagerly reads the revision. Methods that mutate the + * revision do not necessarily re-read the revision. Therefore, calling a getter method on an + * instance after calling a mutation method on that same instance is not guaranteed to reflect the + * mutation. It is not recommended to store references to {@code RevisionApi} instances. * * @return API for accessing the revision. * @throws RestApiException if an error occurred. @@ -63,24 +61,28 @@ public interface ChangeApi { /** * Look up the reviewer of the change. + * *

- * @param id ID of the account, can be a string of the format - * "Full Name <mail@example.com>", just the email address, a full name - * if it is unique, an account ID, a user name or 'self' for the - * calling user. + * + * @param id ID of the account, can be a string of the format "Full Name + * <mail@example.com>", just the email address, a full name if it is unique, an account + * ID, a user name or 'self' for the calling user. * @return API for accessing the reviewer. - * @throws RestApiException if id is not account ID or is a user that isn't - * known to be a reviewer for this change. + * @throws RestApiException if id is not account ID or is a user that isn't known to be a reviewer + * for this change. */ ReviewerApi reviewer(String id) throws RestApiException; void abandon() throws RestApiException; + void abandon(AbandonInput in) throws RestApiException; void restore() throws RestApiException; + void restore(RestoreInput in) throws RestApiException; void move(String destination) throws RestApiException; + void move(MoveInput in) throws RestApiException; /** @@ -101,31 +103,32 @@ public interface ChangeApi { ChangeInfo createMergePatchSet(MergePatchSetInput in) throws RestApiException; List submittedTogether() throws RestApiException; - SubmittedTogetherInfo submittedTogether( - EnumSet options) throws RestApiException; - SubmittedTogetherInfo submittedTogether( - EnumSet listOptions, - EnumSet submitOptions) throws RestApiException; - /** - * Publishes a draft change. - */ + SubmittedTogetherInfo submittedTogether(EnumSet options) + throws RestApiException; + + SubmittedTogetherInfo submittedTogether( + EnumSet listOptions, EnumSet submitOptions) + throws RestApiException; + + /** Publishes a draft change. */ void publish() throws RestApiException; - /** - * Deletes a change. - */ + /** Deletes a change. */ void delete() throws RestApiException; String topic() throws RestApiException; + void topic(String topic) throws RestApiException; IncludedInInfo includedIn() throws RestApiException; void addReviewer(AddReviewerInput in) throws RestApiException; + void addReviewer(String in) throws RestApiException; SuggestedReviewersRequest suggestReviewers() throws RestApiException; + SuggestedReviewersRequest suggestReviewers(String query) throws RestApiException; ChangeInfo get(EnumSet options) throws RestApiException; @@ -138,8 +141,8 @@ public interface ChangeApi { /** * Retrieve change edit when exists. * - * @deprecated Replaced by {@link ChangeApi#edit()} in combination with - * {@link ChangeEditApi#get()}. + * @deprecated Replaced by {@link ChangeApi#edit()} in combination with {@link + * ChangeEditApi#get()}. */ @Deprecated EditInfo getEdit() throws RestApiException; @@ -152,31 +155,24 @@ public interface ChangeApi { */ ChangeEditApi edit() throws RestApiException; - /** - * Set hashtags on a change - **/ + /** Set hashtags on a change */ void setHashtags(HashtagsInput input) throws RestApiException; /** * Get hashtags on a change. + * * @return hashtags * @throws RestApiException */ Set getHashtags() throws RestApiException; - /** - * Set the assignee of a change. - */ + /** Set the assignee of a change. */ AccountInfo setAssignee(AssigneeInput input) throws RestApiException; - /** - * Get the assignee of a change. - */ + /** Get the assignee of a change. */ AccountInfo getAssignee() throws RestApiException; - /** - * Get all past assignees. - */ + /** Get all past assignees. */ List getPastAssignees() throws RestApiException; /** @@ -189,8 +185,8 @@ public interface ChangeApi { /** * Get all published comments on a change. * - * @return comments in a map keyed by path; comments have the {@code revision} - * field set to indicate their patch set. + * @return comments in a map keyed by path; comments have the {@code revision} field set to + * indicate their patch set. * @throws RestApiException */ Map> comments() throws RestApiException; @@ -198,9 +194,8 @@ public interface ChangeApi { /** * Get all robot comments on a change. * - * @return robot comments in a map keyed by path; robot comments have the - * {@code revision} field set to indicate their patch set. - * + * @return robot comments in a map keyed by path; robot comments have the {@code revision} field + * set to indicate their patch set. * @throws RestApiException */ Map> robotComments() throws RestApiException; @@ -208,14 +203,16 @@ public interface ChangeApi { /** * Get all draft comments for the current user on a change. * - * @return drafts in a map keyed by path; comments have the {@code revision} - * field set to indicate their patch set. + * @return drafts in a map keyed by path; comments have the {@code revision} field set to indicate + * their patch set. * @throws RestApiException */ Map> drafts() throws RestApiException; ChangeInfo check() throws RestApiException; + ChangeInfo check(FixInput fix) throws RestApiException; + void index() throws RestApiException; abstract class SuggestedReviewersRequest { @@ -244,9 +241,9 @@ public interface ChangeApi { } /** - * A default implementation which allows source compatibility - * when adding new methods to the interface. - **/ + * A default implementation which allows source compatibility when adding new methods to the + * interface. + */ class NotImplemented implements ChangeApi { @Override public String id() { @@ -449,15 +446,13 @@ public interface ChangeApi { } @Override - public SubmittedTogetherInfo submittedTogether( - EnumSet options) { + public SubmittedTogetherInfo submittedTogether(EnumSet options) { throw new NotImplementedException(); } @Override public SubmittedTogetherInfo submittedTogether( - EnumSet a, - EnumSet b) { + EnumSet a, EnumSet b) { throw new NotImplementedException(); } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ChangeEditApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ChangeEditApi.java index da3c1fce93..33f17e9903 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ChangeEditApi.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ChangeEditApi.java @@ -19,116 +19,103 @@ import com.google.gerrit.extensions.restapi.BinaryResult; import com.google.gerrit.extensions.restapi.NotImplementedException; import com.google.gerrit.extensions.restapi.RawInput; import com.google.gerrit.extensions.restapi.RestApiException; - import java.util.Optional; /** - * An API for the change edit of a change. A change edit is similar to a patch - * set and will become one if it is published - * (by {@link #publish(PublishChangeEditInput)}). Whenever the descriptions - * below refer to files of a change edit, they actually refer to the files of - * the Git tree which is represented by the change edit. A change can have at - * most one change edit at each point in time. + * An API for the change edit of a change. A change edit is similar to a patch set and will become + * one if it is published (by {@link #publish(PublishChangeEditInput)}). Whenever the descriptions + * below refer to files of a change edit, they actually refer to the files of the Git tree which is + * represented by the change edit. A change can have at most one change edit at each point in time. */ public interface ChangeEditApi { /** * Retrieves details regarding the change edit. * - * @return an {@code Optional} containing details about the change edit if it - * exists, or {@code Optional.empty()} + * @return an {@code Optional} containing details about the change edit if it exists, or {@code + * Optional.empty()} * @throws RestApiException if the change edit couldn't be retrieved */ Optional get() throws RestApiException; /** - * Creates a new change edit. It has exactly the same Git tree as the current - * patch set of the change. + * Creates a new change edit. It has exactly the same Git tree as the current patch set of the + * change. * - * @throws RestApiException if the change edit couldn't be created or a change - * edit already exists + * @throws RestApiException if the change edit couldn't be created or a change edit already exists */ void create() throws RestApiException; /** * Deletes the change edit. * - * @throws RestApiException if the change edit couldn't be deleted or a change - * edit wasn't present + * @throws RestApiException if the change edit couldn't be deleted or a change edit wasn't present */ void delete() throws RestApiException; /** * Rebases the change edit on top of the latest patch set of this change. * - * @throws RestApiException if the change edit couldn't be rebased or a change - * edit wasn't present + * @throws RestApiException if the change edit couldn't be rebased or a change edit wasn't present */ void rebase() throws RestApiException; /** - * Publishes the change edit using default settings. See - * {@link #publish(PublishChangeEditInput)} for more details. + * Publishes the change edit using default settings. See {@link #publish(PublishChangeEditInput)} + * for more details. * - * @throws RestApiException if the change edit couldn't be published or a - * change edit wasn't present + * @throws RestApiException if the change edit couldn't be published or a change edit wasn't + * present */ void publish() throws RestApiException; /** - * Publishes the change edit. Publishing means that the change edit is turned - * into a regular patch set of the change. + * Publishes the change edit. Publishing means that the change edit is turned into a regular patch + * set of the change. * - * @param publishChangeEditInput a {@code PublishChangeEditInput} specifying - * the options which should be applied - * @throws RestApiException if the change edit couldn't be published or a - * change edit wasn't present + * @param publishChangeEditInput a {@code PublishChangeEditInput} specifying the options which + * should be applied + * @throws RestApiException if the change edit couldn't be published or a change edit wasn't + * present */ - void publish(PublishChangeEditInput publishChangeEditInput) - throws RestApiException; + void publish(PublishChangeEditInput publishChangeEditInput) throws RestApiException; /** * Retrieves the contents of the specified file from the change edit. * * @param filePath the path of the file - * @return an {@code Optional} containing the contents of the file as a - * {@code BinaryResult} if the file exists within the change edit, or - * {@code Optional.empty()} - * @throws RestApiException if the contents of the file couldn't be retrieved - * or a change edit wasn't present + * @return an {@code Optional} containing the contents of the file as a {@code BinaryResult} if + * the file exists within the change edit, or {@code Optional.empty()} + * @throws RestApiException if the contents of the file couldn't be retrieved or a change edit + * wasn't present */ Optional getFile(String filePath) throws RestApiException; /** - * Renames a file of the change edit or moves the file to another directory. - * If the change edit doesn't exist, it will be created based on the current - * patch set of the change. + * Renames a file of the change edit or moves the file to another directory. If the change edit + * doesn't exist, it will be created based on the current patch set of the change. * * @param oldFilePath the current file path * @param newFilePath the desired file path * @throws RestApiException if the file couldn't be renamed */ - void renameFile(String oldFilePath, String newFilePath) - throws RestApiException; + void renameFile(String oldFilePath, String newFilePath) throws RestApiException; /** - * Restores a file of the change edit to the state in which it was before the - * patch set on which the change edit is based. This includes the file content - * as well as the existence or non-existence of the file. If the change edit - * doesn't exist, it will be created based on the current patch set of the - * change. + * Restores a file of the change edit to the state in which it was before the patch set on which + * the change edit is based. This includes the file content as well as the existence or + * non-existence of the file. If the change edit doesn't exist, it will be created based on the + * current patch set of the change. * * @param filePath the path of the file - * @throws RestApiException if the file couldn't be restored to its previous - * state + * @throws RestApiException if the file couldn't be restored to its previous state */ void restoreFile(String filePath) throws RestApiException; /** - * Modify the contents of the specified file of the change edit. If no content - * is provided, the content of the file is erased but the file isn't deleted. - * If the change edit doesn't exist, it will be created based on the current - * patch set of the change. + * Modify the contents of the specified file of the change edit. If no content is provided, the + * content of the file is erased but the file isn't deleted. If the change edit doesn't exist, it + * will be created based on the current patch set of the change. * * @param filePath the path of the file which should be modified * @param newContent the desired content of the file @@ -137,8 +124,8 @@ public interface ChangeEditApi { void modifyFile(String filePath, RawInput newContent) throws RestApiException; /** - * Deletes the specified file from the change edit. If the change edit doesn't - * exist, it will be created based on the current patch set of the change. + * Deletes the specified file from the change edit. If the change edit doesn't exist, it will be + * created based on the current patch set of the change. * * @param filePath the path fo the file which should be deleted * @throws RestApiException if the file couldn't be deleted @@ -149,14 +136,14 @@ public interface ChangeEditApi { * Retrieves the commit message of the change edit. * * @return the commit message of the change edit - * @throws RestApiException if the commit message couldn't be retrieved or a - * change edit wasn't present + * @throws RestApiException if the commit message couldn't be retrieved or a change edit wasn't + * present */ String getCommitMessage() throws RestApiException; /** - * Modifies the commit message of the change edit. If the change edit doesn't - * exist, it will be created based on the current patch set of the change. + * Modifies the commit message of the change edit. If the change edit doesn't exist, it will be + * created based on the current patch set of the change. * * @param newCommitMessage the desired commit message * @throws RestApiException if the commit message couldn't be modified @@ -164,9 +151,9 @@ public interface ChangeEditApi { void modifyCommitMessage(String newCommitMessage) throws RestApiException; /** - * A default implementation which allows source compatibility - * when adding new methods to the interface. - **/ + * A default implementation which allows source compatibility when adding new methods to the + * interface. + */ class NotImplemented implements ChangeEditApi { @Override public Optional get() { @@ -233,5 +220,4 @@ public interface ChangeEditApi { throw new NotImplementedException(); } } - } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/Changes.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/Changes.java index f0d3bfab0d..8cac103f83 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/Changes.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/Changes.java @@ -19,7 +19,6 @@ import com.google.gerrit.extensions.common.ChangeInfo; import com.google.gerrit.extensions.common.ChangeInput; import com.google.gerrit.extensions.restapi.NotImplementedException; import com.google.gerrit.extensions.restapi.RestApiException; - import java.util.Arrays; import java.util.EnumSet; import java.util.List; @@ -27,12 +26,11 @@ import java.util.List; public interface Changes { /** * Look up a change by numeric ID. - *

- * Note: This method eagerly reads the change. Methods that - * mutate the change do not necessarily re-read the change. Therefore, calling - * a getter method on an instance after calling a mutation method on that same - * instance is not guaranteed to reflect the mutation. It is not recommended - * to store references to {@code ChangeApi} instances. + * + *

Note: This method eagerly reads the change. Methods that mutate the change + * do not necessarily re-read the change. Therefore, calling a getter method on an instance after + * calling a mutation method on that same instance is not guaranteed to reflect the mutation. It + * is not recommended to store references to {@code ChangeApi} instances. * * @param id change number. * @return API for accessing the change. @@ -44,8 +42,8 @@ public interface Changes { * Look up a change by string ID. * * @see #id(int) - * @param id any identifier supported by the REST API, including change - * number, Change-Id, or project~branch~Change-Id triplet. + * @param id any identifier supported by the REST API, including change number, Change-Id, or + * project~branch~Change-Id triplet. * @return API for accessing the change. * @throws RestApiException if an error occurred. */ @@ -56,12 +54,12 @@ public interface Changes { * * @see #id(int) */ - ChangeApi id(String project, String branch, String id) - throws RestApiException; + ChangeApi id(String project, String branch, String id) throws RestApiException; ChangeApi create(ChangeInput in) throws RestApiException; QueryRequest query(); + QueryRequest query(String query); abstract class QueryRequest { @@ -120,9 +118,7 @@ public interface Changes { @Override public String toString() { - StringBuilder sb = new StringBuilder(getClass().getSimpleName()) - .append('{') - .append(query); + StringBuilder sb = new StringBuilder(getClass().getSimpleName()).append('{').append(query); if (limit != 0) { sb.append(", limit=").append(limit); } @@ -137,9 +133,9 @@ public interface Changes { } /** - * A default implementation which allows source compatibility - * when adding new methods to the interface. - **/ + * A default implementation which allows source compatibility when adding new methods to the + * interface. + */ class NotImplemented implements Changes { @Override public ChangeApi id(int id) { diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/CommentApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/CommentApi.java index e4c27817fd..78f2b89e1b 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/CommentApi.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/CommentApi.java @@ -22,9 +22,9 @@ public interface CommentApi { CommentInfo get() throws RestApiException; /** - * A default implementation which allows source compatibility - * when adding new methods to the interface. - **/ + * A default implementation which allows source compatibility when adding new methods to the + * interface. + */ class NotImplemented implements CommentApi { @Override public CommentInfo get() { diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/DeleteReviewerInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/DeleteReviewerInput.java index bb942c75c3..34f550b4fc 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/DeleteReviewerInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/DeleteReviewerInput.java @@ -20,5 +20,6 @@ import java.util.Map; public class DeleteReviewerInput { /** Who to send email notifications to after the reviewer is deleted. */ public NotifyHandling notify = NotifyHandling.ALL; + public Map notifyDetails; } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/DeleteVoteInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/DeleteVoteInput.java index ee5463bb5e..ee10a1d6f5 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/DeleteVoteInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/DeleteVoteInput.java @@ -15,15 +15,14 @@ package com.google.gerrit.extensions.api.changes; import com.google.gerrit.extensions.restapi.DefaultInput; - import java.util.Map; /** Input passed to {@code DELETE /changes/[id]/reviewers/[id]/votes/[label]}. */ public class DeleteVoteInput { - @DefaultInput - public String label; + @DefaultInput public String label; /** Who to send email notifications to after vote is deleted. */ public NotifyHandling notify = NotifyHandling.ALL; + public Map notifyDetails; } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/DraftApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/DraftApi.java index f4c79bb5c1..d31e4ae284 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/DraftApi.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/DraftApi.java @@ -20,14 +20,14 @@ import com.google.gerrit.extensions.restapi.RestApiException; public interface DraftApi extends CommentApi { CommentInfo update(DraftInput in) throws RestApiException; + void delete() throws RestApiException; /** - * A default implementation which allows source compatibility - * when adding new methods to the interface. - **/ - class NotImplemented extends CommentApi.NotImplemented - implements DraftApi { + * A default implementation which allows source compatibility when adding new methods to the + * interface. + */ + class NotImplemented extends CommentApi.NotImplemented implements DraftApi { @Override public CommentInfo update(DraftInput in) { throw new NotImplementedException(); diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/DraftInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/DraftInput.java index 9d94f50903..b3c27867a4 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/DraftInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/DraftInput.java @@ -15,7 +15,6 @@ package com.google.gerrit.extensions.api.changes; import com.google.gerrit.extensions.client.Comment; - import java.util.Objects; public class DraftInput extends Comment { diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/FileApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/FileApi.java index a0ca4d02ac..a319cbe210 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/FileApi.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/FileApi.java @@ -23,25 +23,18 @@ import com.google.gerrit.extensions.restapi.RestApiException; public interface FileApi { BinaryResult content() throws RestApiException; - /** - * Diff against the revision's parent version of the file. - */ + /** Diff against the revision's parent version of the file. */ DiffInfo diff() throws RestApiException; - /** - * @param base revision id of the revision to be used as the - * diff base - */ + /** @param base revision id of the revision to be used as the diff base */ DiffInfo diff(String base) throws RestApiException; - /** - * @param parent 1-based parent number to diff against - */ + /** @param parent 1-based parent number to diff against */ DiffInfo diff(int parent) throws RestApiException; /** - * Creates a request to retrieve the diff. On the returned request formatting - * options for the diff can be set. + * Creates a request to retrieve the diff. On the returned request formatting options for the diff + * can be set. */ DiffRequest diffRequest() throws RestApiException; @@ -91,9 +84,9 @@ public interface FileApi { } /** - * A default implementation which allows source compatibility - * when adding new methods to the interface. - **/ + * A default implementation which allows source compatibility when adding new methods to the + * interface. + */ class NotImplemented implements FileApi { @Override public BinaryResult content() { diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/HashtagsInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/HashtagsInput.java index c0071611d3..8f66f127f1 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/HashtagsInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/HashtagsInput.java @@ -15,16 +15,13 @@ package com.google.gerrit.extensions.api.changes; import com.google.gerrit.extensions.restapi.DefaultInput; - import java.util.Set; public class HashtagsInput { - @DefaultInput - public Set add; + @DefaultInput public Set add; public Set remove; - public HashtagsInput(){ - } + public HashtagsInput() {} public HashtagsInput(Set add) { this.add = add; diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/IncludedInInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/IncludedInInfo.java index f1fc3ac5bb..d8760341f3 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/IncludedInInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/IncludedInInfo.java @@ -22,11 +22,10 @@ public class IncludedInInfo { public List tags; public Map> external; - public IncludedInInfo(List branches, - List tags, - Map> external) { + public IncludedInInfo( + List branches, List tags, Map> external) { this.branches = branches; this.tags = tags; this.external = external; } -} \ No newline at end of file +} diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/NotifyHandling.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/NotifyHandling.java index 888e6bf975..98ef31cb9d 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/NotifyHandling.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/NotifyHandling.java @@ -15,5 +15,8 @@ package com.google.gerrit.extensions.api.changes; public enum NotifyHandling { - NONE, OWNER, OWNER_REVIEWERS, ALL + NONE, + OWNER, + OWNER_REVIEWERS, + ALL } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/PublishChangeEditInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/PublishChangeEditInput.java index 66232818ca..acf6cebc3b 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/PublishChangeEditInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/PublishChangeEditInput.java @@ -20,5 +20,6 @@ import java.util.Map; public class PublishChangeEditInput { /** Who to send email notifications to after the change edit is published. */ public NotifyHandling notify = NotifyHandling.ALL; + public Map notifyDetails; -} \ No newline at end of file +} diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RecipientType.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RecipientType.java index e3b8a5368f..3ddc597463 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RecipientType.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RecipientType.java @@ -15,5 +15,7 @@ package com.google.gerrit.extensions.api.changes; public enum RecipientType { - TO, CC, BCC + TO, + CC, + BCC } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RestoreInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RestoreInput.java index a116dde542..c328a04442 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RestoreInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RestoreInput.java @@ -17,7 +17,5 @@ package com.google.gerrit.extensions.api.changes; import com.google.gerrit.extensions.restapi.DefaultInput; public class RestoreInput { - @DefaultInput - public String message; + @DefaultInput public String message; } - diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevertInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevertInput.java index 2c1c6887a4..893472eb75 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevertInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevertInput.java @@ -17,6 +17,5 @@ package com.google.gerrit.extensions.api.changes; import com.google.gerrit.extensions.restapi.DefaultInput; public class RevertInput { - @DefaultInput - public String message; + @DefaultInput public String message; } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewInput.java index c8bfed2a63..0eb076ed43 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewInput.java @@ -20,7 +20,6 @@ import com.google.gerrit.extensions.client.Comment; import com.google.gerrit.extensions.client.ReviewerState; import com.google.gerrit.extensions.common.FixSuggestionInfo; import com.google.gerrit.extensions.restapi.DefaultInput; - import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; @@ -28,8 +27,7 @@ import java.util.Map; /** Input passed to {@code POST /changes/[id]/revisions/[id]/review}. */ public class ReviewInput { - @DefaultInput - public String message; + @DefaultInput public String message; public String tag; @@ -38,49 +36,42 @@ public class ReviewInput { public Map> robotComments; /** - * If true require all labels to be within the user's permitted ranges based - * on access controls, attempting to use a label not granted to the user - * will fail the entire modify operation early. If false the operation will - * execute anyway, but the proposed labels given by the user will be - * modified to be the "best" value allowed by the access controls, or - * ignored if the label does not exist. + * If true require all labels to be within the user's permitted ranges based on access controls, + * attempting to use a label not granted to the user will fail the entire modify operation early. + * If false the operation will execute anyway, but the proposed labels given by the user will be + * modified to be the "best" value allowed by the access controls, or ignored if the label does + * not exist. */ public boolean strictLabels = true; /** - * How to process draft comments already in the database that were not also - * described in this input request. - *

- * Defaults to DELETE, unless {@link #onBehalfOf} is set, in which case it - * defaults to KEEP and any other value is disallowed. + * How to process draft comments already in the database that were not also described in this + * input request. + * + *

Defaults to DELETE, unless {@link #onBehalfOf} is set, in which case it defaults to KEEP and + * any other value is disallowed. */ public DraftHandling drafts; /** Who to send email notifications to after review is stored. */ public NotifyHandling notify = NotifyHandling.ALL; + public Map notifyDetails; - /** - * If true check to make sure that the comments being posted aren't already - * present. - */ + /** If true check to make sure that the comments being posted aren't already present. */ public boolean omitDuplicateComments; /** - * Account ID, name, email address or username of another user. The review - * will be posted/updated on behalf of this named user instead of the - * caller. Caller must have the labelAs-$NAME permission granted for each - * label that appears in {@link #labels}. This is in addition to the named - * user also needing to have permission to use the labels. - *

- * {@link #strictLabels} impacts how labels is processed for the named user, - * not the caller. + * Account ID, name, email address or username of another user. The review will be posted/updated + * on behalf of this named user instead of the caller. Caller must have the labelAs-$NAME + * permission granted for each label that appears in {@link #labels}. This is in addition to the + * named user also needing to have permission to use the labels. + * + *

{@link #strictLabels} impacts how labels is processed for the named user, not the caller. */ public String onBehalfOf; - /** - * Reviewers that should be added to this change. - */ + /** Reviewers that should be added to this change. */ public List reviewers; public enum DraftHandling { @@ -97,8 +88,7 @@ public class ReviewInput { PUBLISH_ALL_REVISIONS } - public static class CommentInput extends Comment { - } + public static class CommentInput extends Comment {} public static class RobotCommentInput extends CommentInput { public String robotId; @@ -139,8 +129,7 @@ public class ReviewInput { return reviewer(reviewer, REVIEWER, false); } - public ReviewInput reviewer(String reviewer, ReviewerState state, - boolean confirmed) { + public ReviewInput reviewer(String reviewer, ReviewerState state, boolean confirmed) { AddReviewerInput input = new AddReviewerInput(); input.reviewer = reviewer; input.state = state; diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewResult.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewResult.java index b9de2e15e2..d7729246c3 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewResult.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewResult.java @@ -15,24 +15,19 @@ package com.google.gerrit.extensions.api.changes; import com.google.gerrit.common.Nullable; - import java.util.Map; -/** - * Result object representing the outcome of a review request. - */ +/** Result object representing the outcome of a review request. */ public class ReviewResult { /** - * Map of labels to values after the review was posted. Null if any - * reviewer additions were rejected. + * Map of labels to values after the review was posted. Null if any reviewer additions were + * rejected. */ - @Nullable - public Map labels; + @Nullable public Map labels; /** - * Map of account or group identifier to outcome of adding as a reviewer. - * Null if no reviewer additions were requested. + * Map of account or group identifier to outcome of adding as a reviewer. Null if no reviewer + * additions were requested. */ - @Nullable - public Map reviewers; -} \ No newline at end of file + @Nullable public Map reviewers; +} diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewerApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewerApi.java index 10f5bc7132..078f828dc0 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewerApi.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewerApi.java @@ -16,21 +16,24 @@ package com.google.gerrit.extensions.api.changes; import com.google.gerrit.extensions.restapi.NotImplementedException; import com.google.gerrit.extensions.restapi.RestApiException; - import java.util.Map; public interface ReviewerApi { Map votes() throws RestApiException; + void deleteVote(String label) throws RestApiException; + void deleteVote(DeleteVoteInput input) throws RestApiException; + void remove() throws RestApiException; + void remove(DeleteReviewerInput input) throws RestApiException; /** - * A default implementation which allows source compatibility - * when adding new methods to the interface. - **/ + * A default implementation which allows source compatibility when adding new methods to the + * interface. + */ class NotImplemented implements ReviewerApi { @Override public Map votes() { diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewerInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewerInfo.java index c81f8aa490..af61481646 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewerInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewerInfo.java @@ -16,19 +16,14 @@ package com.google.gerrit.extensions.api.changes; import com.google.gerrit.common.Nullable; import com.google.gerrit.extensions.common.AccountInfo; - import java.util.Map; -/** - * Account and approval details for an added reviewer. - */ +/** Account and approval details for an added reviewer. */ public class ReviewerInfo extends AccountInfo { /** - * {@link Map} of label name to initial value for each approval the reviewer - * is responsible for. + * {@link Map} of label name to initial value for each approval the reviewer is responsible for. */ - @Nullable - public Map approvals; + @Nullable public Map approvals; public ReviewerInfo(Integer id) { super(id); @@ -38,4 +33,4 @@ public class ReviewerInfo extends AccountInfo { public String toString() { return username; } -} \ No newline at end of file +} diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevisionApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevisionApi.java index a763b77748..5dd4ba415f 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevisionApi.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevisionApi.java @@ -25,7 +25,6 @@ import com.google.gerrit.extensions.common.TestSubmitRuleInput; import com.google.gerrit.extensions.restapi.BinaryResult; import com.google.gerrit.extensions.restapi.NotImplementedException; import com.google.gerrit.extensions.restapi.RestApiException; - import java.util.List; import java.util.Map; import java.util.Set; @@ -34,56 +33,78 @@ public interface RevisionApi { void delete() throws RestApiException; String description() throws RestApiException; + void description(String description) throws RestApiException; void review(ReviewInput in) throws RestApiException; void submit() throws RestApiException; + void submit(SubmitInput in) throws RestApiException; + BinaryResult submitPreview() throws RestApiException; + BinaryResult submitPreview(String format) throws RestApiException; + void publish() throws RestApiException; + ChangeApi cherryPick(CherryPickInput in) throws RestApiException; + ChangeApi rebase() throws RestApiException; + ChangeApi rebase(RebaseInput in) throws RestApiException; + boolean canRebase() throws RestApiException; RevisionReviewerApi reviewer(String id) throws RestApiException; + void setReviewed(String path, boolean reviewed) throws RestApiException; + Set reviewed() throws RestApiException; Map files() throws RestApiException; + Map files(String base) throws RestApiException; + Map files(int parentNum) throws RestApiException; + FileApi file(String path); + MergeableInfo mergeable() throws RestApiException; + MergeableInfo mergeableOtherBranches() throws RestApiException; Map> comments() throws RestApiException; + Map> robotComments() throws RestApiException; + Map> drafts() throws RestApiException; List commentsAsList() throws RestApiException; + List draftsAsList() throws RestApiException; + List robotCommentsAsList() throws RestApiException; DraftApi createDraft(DraftInput in) throws RestApiException; + DraftApi draft(String id) throws RestApiException; CommentApi comment(String id) throws RestApiException; + RobotCommentApi robotComment(String id) throws RestApiException; String etag() throws RestApiException; - /** - * Returns patch of revision. - */ + /** Returns patch of revision. */ BinaryResult patch() throws RestApiException; + BinaryResult patch(String path) throws RestApiException; Map actions() throws RestApiException; SubmitType submitType() throws RestApiException; + SubmitType testSubmitType(TestSubmitRuleInput in) throws RestApiException; MergeListRequest getMergeList() throws RestApiException; @@ -114,9 +135,9 @@ public interface RevisionApi { } /** - * A default implementation which allows source compatibility - * when adding new methods to the interface. - **/ + * A default implementation which allows source compatibility when adding new methods to the + * interface. + */ class NotImplemented implements RevisionApi { @Override public void delete() { diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevisionReviewerApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevisionReviewerApi.java index 4e13f90502..681ef4f062 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevisionReviewerApi.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevisionReviewerApi.java @@ -16,7 +16,6 @@ package com.google.gerrit.extensions.api.changes; import com.google.gerrit.extensions.restapi.NotImplementedException; import com.google.gerrit.extensions.restapi.RestApiException; - import java.util.Map; public interface RevisionReviewerApi { @@ -27,9 +26,9 @@ public interface RevisionReviewerApi { void deleteVote(DeleteVoteInput input) throws RestApiException; /** - * A default implementation which allows source compatibility - * when adding new methods to the interface. - **/ + * A default implementation which allows source compatibility when adding new methods to the + * interface. + */ class NotImplemented implements RevisionReviewerApi { @Override public Map votes() { diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RobotCommentApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RobotCommentApi.java index 38d9f955e9..23e65aea46 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RobotCommentApi.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RobotCommentApi.java @@ -12,7 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. - package com.google.gerrit.extensions.api.changes; import com.google.gerrit.extensions.common.RobotCommentInfo; @@ -23,9 +22,9 @@ public interface RobotCommentApi { RobotCommentInfo get() throws RestApiException; /** - * A default implementation which allows source compatibility - * when adding new methods to the interface. - **/ + * A default implementation which allows source compatibility when adding new methods to the + * interface. + */ class NotImplemented implements RobotCommentApi { @Override public RobotCommentInfo get() { diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/StarsInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/StarsInput.java index d3dff98e81..1207d272e9 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/StarsInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/StarsInput.java @@ -20,8 +20,7 @@ public class StarsInput { public Set add; public Set remove; - public StarsInput() { - } + public StarsInput() {} public StarsInput(Set add) { this.add = add; diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/SubmitInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/SubmitInput.java index b1ad6e18b7..f820318af0 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/SubmitInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/SubmitInput.java @@ -18,8 +18,7 @@ import java.util.Map; public class SubmitInput { /** Not used anymore, kept for backward compatibility */ - @Deprecated - public boolean waitForMerge; + @Deprecated public boolean waitForMerge; public String onBehalfOf; diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/SubmittedTogetherInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/SubmittedTogetherInfo.java index 52b6904e9a..4e0e9641a0 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/SubmittedTogetherInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/SubmittedTogetherInfo.java @@ -14,7 +14,6 @@ package com.google.gerrit.extensions.api.changes; import com.google.gerrit.extensions.common.ChangeInfo; - import java.util.List; public class SubmittedTogetherInfo { diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/config/Config.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/config/Config.java index 3f4971e945..eb7288ddee 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/config/Config.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/config/Config.java @@ -17,15 +17,13 @@ package com.google.gerrit.extensions.api.config; import com.google.gerrit.extensions.restapi.NotImplementedException; public interface Config { - /** - * @return An API for getting server related configurations. - */ + /** @return An API for getting server related configurations. */ Server server(); /** - * A default implementation which allows source compatibility - * when adding new methods to the interface. - **/ + * A default implementation which allows source compatibility when adding new methods to the + * interface. + */ class NotImplemented implements Config { @Override public Server server() { diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/config/Server.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/config/Server.java index aa7ccddbe0..97f4af0142 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/config/Server.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/config/Server.java @@ -21,24 +21,23 @@ import com.google.gerrit.extensions.restapi.NotImplementedException; import com.google.gerrit.extensions.restapi.RestApiException; public interface Server { - /** - * @return Version of server. - */ + /** @return Version of server. */ String getVersion() throws RestApiException; ServerInfo getInfo() throws RestApiException; GeneralPreferencesInfo getDefaultPreferences() throws RestApiException; - GeneralPreferencesInfo setDefaultPreferences(GeneralPreferencesInfo in) - throws RestApiException; + + GeneralPreferencesInfo setDefaultPreferences(GeneralPreferencesInfo in) throws RestApiException; + DiffPreferencesInfo getDefaultDiffPreferences() throws RestApiException; - DiffPreferencesInfo setDefaultDiffPreferences(DiffPreferencesInfo in) - throws RestApiException; + + DiffPreferencesInfo setDefaultDiffPreferences(DiffPreferencesInfo in) throws RestApiException; /** - * A default implementation which allows source compatibility - * when adding new methods to the interface. - **/ + * A default implementation which allows source compatibility when adding new methods to the + * interface. + */ class NotImplemented implements Server { @Override public String getVersion() { @@ -56,8 +55,7 @@ public interface Server { } @Override - public GeneralPreferencesInfo setDefaultPreferences( - GeneralPreferencesInfo in) { + public GeneralPreferencesInfo setDefaultPreferences(GeneralPreferencesInfo in) { throw new NotImplementedException(); } @@ -67,8 +65,7 @@ public interface Server { } @Override - public DiffPreferencesInfo setDefaultDiffPreferences( - DiffPreferencesInfo in) { + public DiffPreferencesInfo setDefaultDiffPreferences(DiffPreferencesInfo in) { throw new NotImplementedException(); } } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/groups/GroupApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/groups/GroupApi.java index e651069849..93effe2471 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/groups/GroupApi.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/groups/GroupApi.java @@ -20,7 +20,6 @@ import com.google.gerrit.extensions.common.GroupInfo; import com.google.gerrit.extensions.common.GroupOptionsInfo; import com.google.gerrit.extensions.restapi.NotImplementedException; import com.google.gerrit.extensions.restapi.RestApiException; - import java.util.List; public interface GroupApi { @@ -94,8 +93,8 @@ public interface GroupApi { /** * Add members to a group. * - * @param members list of member identifiers, in any format accepted by - * {@link com.google.gerrit.extensions.api.accounts.Accounts#id(String)} + * @param members list of member identifiers, in any format accepted by {@link + * com.google.gerrit.extensions.api.accounts.Accounts#id(String)} * @throws RestApiException */ void addMembers(String... members) throws RestApiException; @@ -103,8 +102,8 @@ public interface GroupApi { /** * Remove members from a group. * - * @param members list of member identifiers, in any format accepted by - * {@link com.google.gerrit.extensions.api.accounts.Accounts#id(String)} + * @param members list of member identifiers, in any format accepted by {@link + * com.google.gerrit.extensions.api.accounts.Accounts#id(String)} * @throws RestApiException */ void removeMembers(String... members) throws RestApiException; @@ -120,8 +119,7 @@ public interface GroupApi { /** * Add groups to be included in this one. * - * @param groups list of group identifiers, in any format accepted by - * {@link Groups#id(String)} + * @param groups list of group identifiers, in any format accepted by {@link Groups#id(String)} * @throws RestApiException */ void addGroups(String... groups) throws RestApiException; @@ -129,8 +127,7 @@ public interface GroupApi { /** * Remove included groups from this one. * - * @param groups list of group identifiers, in any format accepted by - * {@link Groups#id(String)} + * @param groups list of group identifiers, in any format accepted by {@link Groups#id(String)} * @throws RestApiException */ void removeGroups(String... groups) throws RestApiException; @@ -146,16 +143,16 @@ public interface GroupApi { /** * Reindexes the group. * - * Only supported for internal groups. + *

Only supported for internal groups. * * @throws RestApiException */ void index() throws RestApiException; /** - * A default implementation which allows source compatibility - * when adding new methods to the interface. - **/ + * A default implementation which allows source compatibility when adding new methods to the + * interface. + */ class NotImplemented implements GroupApi { @Override public GroupInfo get() { @@ -213,8 +210,7 @@ public interface GroupApi { } @Override - public List members(boolean recursive) - throws RestApiException { + public List members(boolean recursive) throws RestApiException { throw new NotImplementedException(); } @@ -244,8 +240,7 @@ public interface GroupApi { } @Override - public List auditLog() - throws RestApiException { + public List auditLog() throws RestApiException { throw new NotImplementedException(); } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/groups/Groups.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/groups/Groups.java index e5491b57fc..c874061067 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/groups/Groups.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/groups/Groups.java @@ -18,7 +18,6 @@ import com.google.gerrit.extensions.client.ListGroupsOption; import com.google.gerrit.extensions.common.GroupInfo; import com.google.gerrit.extensions.restapi.NotImplementedException; import com.google.gerrit.extensions.restapi.RestApiException; - import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -29,15 +28,13 @@ import java.util.Map; public interface Groups { /** * Look up a group by ID. - *

- * Note: This method eagerly reads the group. Methods that - * mutate the group do not necessarily re-read the group. Therefore, calling a - * getter method on an instance after calling a mutation method on that same - * instance is not guaranteed to reflect the mutation. It is not recommended - * to store references to {@code groupApi} instances. * - * @param id any identifier supported by the REST API, including group name or - * UUID. + *

Note: This method eagerly reads the group. Methods that mutate the group do + * not necessarily re-read the group. Therefore, calling a getter method on an instance after + * calling a mutation method on that same instance is not guaranteed to reflect the mutation. It + * is not recommended to store references to {@code groupApi} instances. + * + * @param id any identifier supported by the REST API, including group name or UUID. * @return API for accessing the group. * @throws RestApiException if an error occurred. */ @@ -54,9 +51,8 @@ public interface Groups { /** * Query groups. - *

- * Example code: - * {@code query().withQuery("inname:test").withLimit(10).get()} + * + *

Example code: {@code query().withQuery("inname:test").withLimit(10).get()} * * @return API for setting parameters and getting result. */ @@ -64,16 +60,15 @@ public interface Groups { /** * Query groups. - *

- * Shortcut API for {@code query().withQuery(String)}. + * + *

Shortcut API for {@code query().withQuery(String)}. * * @see #query() */ QueryRequest query(String query); abstract class ListRequest { - private final EnumSet options = - EnumSet.noneOf(ListGroupsOption.class); + private final EnumSet options = EnumSet.noneOf(ListGroupsOption.class); private final List projects = new ArrayList<>(); private final List groups = new ArrayList<>(); @@ -201,8 +196,7 @@ public interface Groups { } /** - * API for setting parameters and getting result. - * Used for {@code query()}. + * API for setting parameters and getting result. Used for {@code query()}. * * @see #query() */ @@ -210,12 +204,9 @@ public interface Groups { private String query; private int limit; private int start; - private EnumSet options = - EnumSet.noneOf(ListGroupsOption.class); + private EnumSet options = EnumSet.noneOf(ListGroupsOption.class); - /** - * Execute query and returns the matched groups as list. - */ + /** Execute query and returns the matched groups as list. */ public abstract List get() throws RestApiException; /** @@ -229,18 +220,14 @@ public interface Groups { } /** - * Set limit for returned list of groups. - * Optional; server-default is used when not provided. + * Set limit for returned list of groups. Optional; server-default is used when not provided. */ public QueryRequest withLimit(int limit) { this.limit = limit; return this; } - /** - * Set number of groups to skip. - * Optional; no groups are skipped when not provided. - */ + /** Set number of groups to skip. Optional; no groups are skipped when not provided. */ public QueryRequest withStart(int start) { this.start = start; return this; @@ -279,9 +266,9 @@ public interface Groups { } /** - * A default implementation which allows source compatibility - * when adding new methods to the interface. - **/ + * A default implementation which allows source compatibility when adding new methods to the + * interface. + */ class NotImplemented implements Groups { @Override public GroupApi id(String id) { diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/BranchApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/BranchApi.java index 5c3143721f..bf939f16b6 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/BranchApi.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/BranchApi.java @@ -25,15 +25,13 @@ public interface BranchApi { void delete() throws RestApiException; - /** - * Returns the content of a file from the HEAD revision. - */ + /** Returns the content of a file from the HEAD revision. */ BinaryResult file(String path) throws RestApiException; /** - * A default implementation which allows source compatibility - * when adding new methods to the interface. - **/ + * A default implementation which allows source compatibility when adding new methods to the + * interface. + */ class NotImplemented implements BranchApi { @Override public BranchApi create(BranchInput in) { diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/BranchInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/BranchInfo.java index 8ef1b8ec50..1d89c9ecea 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/BranchInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/BranchInfo.java @@ -16,7 +16,6 @@ package com.google.gerrit.extensions.api.projects; import com.google.gerrit.extensions.common.ActionInfo; import com.google.gerrit.extensions.common.WebLinkInfo; - import java.util.List; import java.util.Map; diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/BranchInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/BranchInput.java index 506bcd451b..aaf69d9cc6 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/BranchInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/BranchInput.java @@ -17,7 +17,6 @@ package com.google.gerrit.extensions.api.projects; import com.google.gerrit.extensions.restapi.DefaultInput; public class BranchInput { - @DefaultInput - public String revision; + @DefaultInput public String revision; public String ref; } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ChildProjectApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ChildProjectApi.java index 574cb3ac17..88cca6668b 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ChildProjectApi.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ChildProjectApi.java @@ -20,12 +20,13 @@ import com.google.gerrit.extensions.restapi.RestApiException; public interface ChildProjectApi { ProjectInfo get() throws RestApiException; + ProjectInfo get(boolean recursive) throws RestApiException; /** - * A default implementation which allows source compatibility - * when adding new methods to the interface. - **/ + * A default implementation which allows source compatibility when adding new methods to the + * interface. + */ class NotImplemented implements ChildProjectApi { @Override public ProjectInfo get() { diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ConfigInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ConfigInfo.java index 81c999bcd3..cc91a4afe5 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ConfigInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ConfigInfo.java @@ -18,7 +18,6 @@ import com.google.gerrit.extensions.client.InheritableBoolean; import com.google.gerrit.extensions.client.ProjectState; import com.google.gerrit.extensions.client.SubmitType; import com.google.gerrit.extensions.common.ActionInfo; - import java.util.List; import java.util.Map; diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ConfigInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ConfigInput.java index 8ab13f6ef9..ae81ea5575 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ConfigInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ConfigInput.java @@ -17,7 +17,6 @@ package com.google.gerrit.extensions.api.projects; import com.google.gerrit.extensions.client.InheritableBoolean; import com.google.gerrit.extensions.client.ProjectState; import com.google.gerrit.extensions.client.SubmitType; - import java.util.Map; public class ConfigInput { diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/DeleteBranchesInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/DeleteBranchesInput.java index e8108a5a9e..d7b8c68708 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/DeleteBranchesInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/DeleteBranchesInput.java @@ -18,4 +18,4 @@ import java.util.List; public class DeleteBranchesInput { public List branches; -} \ No newline at end of file +} diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/DescriptionInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/DescriptionInput.java index d329510af9..322b0760b9 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/DescriptionInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/DescriptionInput.java @@ -17,7 +17,6 @@ package com.google.gerrit.extensions.api.projects; import com.google.gerrit.extensions.restapi.DefaultInput; public class DescriptionInput { - @DefaultInput - public String description; + @DefaultInput public String description; public String commitMessage; } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectApi.java index dd3d61e889..dc2f8998ad 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectApi.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectApi.java @@ -19,27 +19,33 @@ import com.google.gerrit.extensions.api.access.ProjectAccessInput; import com.google.gerrit.extensions.common.ProjectInfo; import com.google.gerrit.extensions.restapi.NotImplementedException; import com.google.gerrit.extensions.restapi.RestApiException; - import java.util.List; public interface ProjectApi { ProjectApi create() throws RestApiException; + ProjectApi create(ProjectInput in) throws RestApiException; + ProjectInfo get() throws RestApiException; String description() throws RestApiException; + void description(DescriptionInput in) throws RestApiException; ProjectAccessInfo access() throws RestApiException; + ProjectAccessInfo access(ProjectAccessInput p) throws RestApiException; ConfigInfo config() throws RestApiException; + ConfigInfo config(ConfigInput in) throws RestApiException; ListRefsRequest branches(); + ListRefsRequest tags(); void deleteBranches(DeleteBranchesInput in) throws RestApiException; + void deleteTags(DeleteTagsInput in) throws RestApiException; abstract class ListRefsRequest { @@ -88,17 +94,18 @@ public interface ProjectApi { } List children() throws RestApiException; + List children(boolean recursive) throws RestApiException; + ChildProjectApi child(String name) throws RestApiException; /** * Look up a branch by refname. - *

- * Note: This method eagerly reads the branch. Methods that - * mutate the branch do not necessarily re-read the branch. Therefore, calling - * a getter method on an instance after calling a mutation method on that same - * instance is not guaranteed to reflect the mutation. It is not recommended - * to store references to {@code BranchApi} instances. + * + *

Note: This method eagerly reads the branch. Methods that mutate the branch + * do not necessarily re-read the branch. Therefore, calling a getter method on an instance after + * calling a mutation method on that same instance is not guaranteed to reflect the mutation. It + * is not recommended to store references to {@code BranchApi} instances. * * @param ref branch name, with or without "refs/heads/" prefix. * @throws RestApiException if a problem occurred reading the project. @@ -108,7 +115,9 @@ public interface ProjectApi { /** * Look up a tag by refname. + * *

+ * * @param ref tag name, with or without "refs/tags/" prefix. * @throws RestApiException if a problem occurred reading the project. * @return API for accessing the tag. @@ -116,9 +125,9 @@ public interface ProjectApi { TagApi tag(String ref) throws RestApiException; /** - * A default implementation which allows source compatibility - * when adding new methods to the interface. - **/ + * A default implementation which allows source compatibility when adding new methods to the + * interface. + */ class NotImplemented implements ProjectApi { @Override public ProjectApi create() { diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectConfigEntryType.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectConfigEntryType.java index bc4674fb39..7daa9f2675 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectConfigEntryType.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectConfigEntryType.java @@ -15,5 +15,10 @@ package com.google.gerrit.extensions.api.projects; public enum ProjectConfigEntryType { - STRING, INT, LONG, BOOLEAN, LIST, ARRAY + STRING, + INT, + LONG, + BOOLEAN, + LIST, + ARRAY } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectInput.java index 1cbf54ca00..612c49ca22 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectInput.java @@ -16,7 +16,6 @@ package com.google.gerrit.extensions.api.projects; import com.google.gerrit.extensions.client.InheritableBoolean; import com.google.gerrit.extensions.client.SubmitType; - import java.util.List; import java.util.Map; diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/Projects.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/Projects.java index 79923487d8..bb9ebc98f9 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/Projects.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/Projects.java @@ -17,7 +17,6 @@ package com.google.gerrit.extensions.api.projects; import com.google.gerrit.extensions.common.ProjectInfo; import com.google.gerrit.extensions.restapi.NotImplementedException; import com.google.gerrit.extensions.restapi.RestApiException; - import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -27,12 +26,11 @@ import java.util.SortedMap; public interface Projects { /** * Look up a project by name. - *

- * Note: This method eagerly reads the project. Methods that - * mutate the project do not necessarily re-read the project. Therefore, - * calling a getter method on an instance after calling a mutation method on - * that same instance is not guaranteed to reflect the mutation. It is not - * recommended to store references to {@code ProjectApi} instances. + * + *

Note: This method eagerly reads the project. Methods that mutate the + * project do not necessarily re-read the project. Therefore, calling a getter method on an + * instance after calling a mutation method on that same instance is not guaranteed to reflect the + * mutation. It is not recommended to store references to {@code ProjectApi} instances. * * @param name project name. * @return API for accessing the project. @@ -62,7 +60,10 @@ public interface Projects { abstract class ListRequest { public enum FilterType { - CODE, PARENT_CANDIDATES, PERMISSIONS, ALL + CODE, + PARENT_CANDIDATES, + PERMISSIONS, + ALL } private final List branches = new ArrayList<>(); @@ -86,8 +87,7 @@ public interface Projects { return Collections.unmodifiableList(result); } - public abstract SortedMap getAsMap() - throws RestApiException; + public abstract SortedMap getAsMap() throws RestApiException; public ListRequest withDescription(boolean description) { this.description = description; @@ -172,9 +172,9 @@ public interface Projects { } /** - * A default implementation which allows source compatibility - * when adding new methods to the interface. - **/ + * A default implementation which allows source compatibility when adding new methods to the + * interface. + */ class NotImplemented implements Projects { @Override public ProjectApi name(String name) { diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/TagApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/TagApi.java index 97dbf159c3..ad30e03904 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/TagApi.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/TagApi.java @@ -25,9 +25,9 @@ public interface TagApi { void delete() throws RestApiException; /** - * A default implementation which allows source compatibility - * when adding new methods to the interface. - **/ + * A default implementation which allows source compatibility when adding new methods to the + * interface. + */ class NotImplemented implements TagApi { @Override public TagApi create(TagInput input) { diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/TagInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/TagInfo.java index b531d67e89..2b5778129d 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/TagInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/TagInfo.java @@ -26,8 +26,7 @@ public class TagInfo extends RefInfo { this.revision = revision; } - public TagInfo(String ref, String revision, String object, - String message, GitPerson tagger) { + public TagInfo(String ref, String revision, String object, String message, GitPerson tagger) { this(ref, revision); this.object = object; this.message = message; diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/TagInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/TagInput.java index 929d12e348..115bb88363 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/TagInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/TagInput.java @@ -17,8 +17,7 @@ package com.google.gerrit.extensions.api.projects; import com.google.gerrit.extensions.restapi.DefaultInput; public class TagInput { - @DefaultInput - public String ref; + @DefaultInput public String ref; public String revision; public String message; } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/auth/oauth/OAuthLoginProvider.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/auth/oauth/OAuthLoginProvider.java index 3fa7bb2799..4b38c63936 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/auth/oauth/OAuthLoginProvider.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/auth/oauth/OAuthLoginProvider.java @@ -15,27 +15,21 @@ package com.google.gerrit.extensions.auth.oauth; import com.google.gerrit.extensions.annotations.ExtensionPoint; - import java.io.IOException; @ExtensionPoint public interface OAuthLoginProvider { /** - * Performs a login with an OAuth2 provider for Git over HTTP - * communication. + * Performs a login with an OAuth2 provider for Git over HTTP communication. * - * An implementation of this interface must transmit the given - * user name and secret, which can be either an OAuth2 access token - * or a password, to the OAuth2 backend for verification. + *

An implementation of this interface must transmit the given user name and secret, which can + * be either an OAuth2 access token or a password, to the OAuth2 backend for verification. * * @param username the user's identifier. - * @param secret the secret to verify, e.g. a previously received - * access token or a password. - * - * @return information about the logged in user, at least - * external id, user name and email address. - * + * @param secret the secret to verify, e.g. a previously received access token or a password. + * @return information about the logged in user, at least external id, user name and email + * address. * @throws IOException if the login failed. */ OAuthUserInfo login(String username, String secret) throws IOException; diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/auth/oauth/OAuthServiceProvider.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/auth/oauth/OAuthServiceProvider.java index 9be2630792..417f55a4b7 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/auth/oauth/OAuthServiceProvider.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/auth/oauth/OAuthServiceProvider.java @@ -15,7 +15,6 @@ package com.google.gerrit.extensions.auth.oauth; import com.google.gerrit.extensions.annotations.ExtensionPoint; - import java.io.IOException; /* Contract that OAuth provider must implement */ @@ -23,8 +22,7 @@ import java.io.IOException; public interface OAuthServiceProvider { /** - * Returns the URL where you should redirect your users to authenticate - * your application. + * Returns the URL where you should redirect your users to authenticate your application. * * @return the OAuth service URL to redirect your users for authentication */ @@ -39,8 +37,8 @@ public interface OAuthServiceProvider { OAuthToken getAccessToken(OAuthVerifier verifier); /** - * After establishing of secure communication channel, this method supossed to - * access the protected resoure and retrieve the username. + * After establishing of secure communication channel, this method supossed to access the + * protected resoure and retrieve the username. * * @param token * @return OAuth user information @@ -56,8 +54,8 @@ public interface OAuthServiceProvider { String getVersion(); /** - * Returns the name of this service. This name is resented the user to choose - * between multiple service providers + * Returns the name of this service. This name is resented the user to choose between multiple + * service providers * * @return name of the service */ diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/auth/oauth/OAuthToken.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/auth/oauth/OAuthToken.java index 788f4201ce..b736262c25 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/auth/oauth/OAuthToken.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/auth/oauth/OAuthToken.java @@ -26,14 +26,14 @@ public class OAuthToken implements Serializable { private final String raw; /** - * Time of expiration of this token, or {@code Long#MAX_VALUE} if this - * token never expires, or time of expiration is unknown. + * Time of expiration of this token, or {@code Long#MAX_VALUE} if this token never expires, or + * time of expiration is unknown. */ private final long expiresAt; /** - * The identifier of the OAuth provider that issued this token - * in the form "plugin-name:provider-name", or {@code null}. + * The identifier of the OAuth provider that issued this token in the form + * "plugin-name:provider-name", or {@code null}. */ private final String providerId; @@ -41,8 +41,7 @@ public class OAuthToken implements Serializable { this(token, secret, raw, Long.MAX_VALUE, null); } - public OAuthToken(String token, String secret, String raw, - long expiresAt, String providerId) { + public OAuthToken(String token, String secret, String raw, long expiresAt, String providerId) { this.token = token; this.secret = secret; this.raw = raw; diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/auth/oauth/OAuthUserInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/auth/oauth/OAuthUserInfo.java index 388ce361e5..31dd1d1176 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/auth/oauth/OAuthUserInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/auth/oauth/OAuthUserInfo.java @@ -22,7 +22,8 @@ public class OAuthUserInfo { private final String displayName; private final String claimedIdentity; - public OAuthUserInfo(String externalId, + public OAuthUserInfo( + String externalId, String userName, String emailAddress, String displayName, diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/AccountFieldName.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/AccountFieldName.java index 07d9f37ed9..14c92f11da 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/AccountFieldName.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/AccountFieldName.java @@ -15,5 +15,7 @@ package com.google.gerrit.extensions.client; public enum AccountFieldName { - FULL_NAME, USER_NAME, REGISTER_NEW_EMAIL -} \ No newline at end of file + FULL_NAME, + USER_NAME, + REGISTER_NEW_EMAIL +} diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/AuthType.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/AuthType.java index 2056e255ea..7a8dda3770 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/AuthType.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/AuthType.java @@ -18,61 +18,61 @@ public enum AuthType { /** Login relies upon the OpenID standard */ OPENID, - /** Login relies upon the OpenID standard in Single Sign On mode */ + /** + * Login relies upon the OpenID standard in Single Sign On mode + */ OPENID_SSO, /** * Login relies upon the container/web server security. - *

- * The container or web server must populate an HTTP header with a unique name - * for the current user. Gerrit will implicitly trust the value of this header - * to supply the unique identity. + * + *

The container or web server must populate an HTTP header with a unique name for the current + * user. Gerrit will implicitly trust the value of this header to supply the unique identity. */ HTTP, /** * Login relies upon the container/web server security, but also uses LDAP. - *

- * Like {@link #HTTP}, the container or web server must populate an HTTP - * header with a unique name for the current user. Gerrit will implicitly - * trust the value of this header to supply the unique identity. - *

- * In addition to trusting the HTTP headers, Gerrit will obtain basic user - * registration (name and email) from LDAP, and some group memberships. + * + *

Like {@link #HTTP}, the container or web server must populate an HTTP header with a unique + * name for the current user. Gerrit will implicitly trust the value of this header to supply the + * unique identity. + * + *

In addition to trusting the HTTP headers, Gerrit will obtain basic user registration (name + * and email) from LDAP, and some group memberships. */ HTTP_LDAP, /** * Login via client SSL certificate. - *

- * This authentication type is actually kind of SSO. Gerrit will configure - * Jetty's SSL channel to request client's SSL certificate. For this - * authentication to work a Gerrit administrator has to import the root - * certificate of the trust chain used to issue the client's certificate - * into the <review-site>/etc/keystore. - *

- * After the authentication is done Gerrit will obtain basic user - * registration (name and email) from LDAP, and some group memberships. - * Therefore, the "_LDAP" suffix in the name of this authentication type. + * + *

This authentication type is actually kind of SSO. Gerrit will configure Jetty's SSL channel + * to request client's SSL certificate. For this authentication to work a Gerrit administrator has + * to import the root certificate of the trust chain used to issue the client's certificate into + * the <review-site>/etc/keystore. + * + *

After the authentication is done Gerrit will obtain basic user registration (name and email) + * from LDAP, and some group memberships. Therefore, the "_LDAP" suffix in the name of this + * authentication type. */ CLIENT_SSL_CERT_LDAP, /** * Login collects username and password through a web form, and binds to LDAP. - *

- * Unlike {@link #HTTP_LDAP}, Gerrit presents a sign-in dialog to the user and - * makes the connection to the LDAP server on their behalf. + * + *

Unlike {@link #HTTP_LDAP}, Gerrit presents a sign-in dialog to the user and makes the + * connection to the LDAP server on their behalf. */ LDAP, /** * Login collects username and password through a web form, and binds to LDAP. - *

- * Unlike {@link #HTTP_LDAP}, Gerrit presents a sign-in dialog to the user and - * makes the connection to the LDAP server on their behalf. - *

- * Unlike the more generic {@link #LDAP} mode, Gerrit can only query the - * directory via an actual authenticated user account. + * + *

Unlike {@link #HTTP_LDAP}, Gerrit presents a sign-in dialog to the user and makes the + * connection to the LDAP server on their behalf. + * + *

Unlike the more generic {@link #LDAP} mode, Gerrit can only query the directory via an + * actual authenticated user account. */ LDAP_BIND, diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/ChangeStatus.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/ChangeStatus.java index 661d2538c5..4ecde16cec 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/ChangeStatus.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/ChangeStatus.java @@ -20,16 +20,15 @@ public enum ChangeStatus { /** * Change is open and pending review, or review is in progress. * - *

- * This is the default state assigned to a change when it is first created - * in the database. A change stays in the NEW state throughout its review - * cycle, until the change is submitted or abandoned. + *

This is the default state assigned to a change when it is first created in the database. A + * change stays in the NEW state throughout its review cycle, until the change is submitted or + * abandoned. + * + *

Changes in the NEW state can be moved to: * - *

- * Changes in the NEW state can be moved to: *

    - *
  • {@link #MERGED} - when the Submit Patch Set action is used; - *
  • {@link #ABANDONED} - when the Abandon action is used. + *
  • {@link #MERGED} - when the Submit Patch Set action is used; + *
  • {@link #ABANDONED} - when the Abandon action is used. *
*/ NEW, @@ -37,17 +36,15 @@ public enum ChangeStatus { /** * Change is a draft change that only consists of draft patchsets. * - *

- * This is a change that is not meant to be submitted or reviewed yet. If - * the uploader publishes the change, it becomes a NEW change. - * Publishing is a one-way action, a change cannot return to DRAFT status. - * Draft changes are only visible to the uploader and those explicitly + *

This is a change that is not meant to be submitted or reviewed yet. If the uploader + * publishes the change, it becomes a NEW change. Publishing is a one-way action, a change cannot + * return to DRAFT status. Draft changes are only visible to the uploader and those explicitly * added as reviewers. Note that currently draft changes cannot be abandoned. * - *

- * Changes in the DRAFT state can be moved to: + *

Changes in the DRAFT state can be moved to: + * *

    - *
  • {@link #NEW} - when the change is published, it becomes a new change. + *
  • {@link #NEW} - when the change is published, it becomes a new change. *
*/ DRAFT, @@ -55,25 +52,22 @@ public enum ChangeStatus { /** * Change is closed, and submitted to its destination branch. * - *

- * Once a change has been merged, it cannot be further modified by adding a - * replacement patch set. Draft comments however may be published, - * supporting a post-submit review. + *

Once a change has been merged, it cannot be further modified by adding a replacement patch + * set. Draft comments however may be published, supporting a post-submit review. */ MERGED, /** * Change is closed, but was not submitted to its destination branch. * - *

- * Once a change has been abandoned, it cannot be further modified by adding - * a replacement patch set, and it cannot be merged. Draft comments however - * may be published, permitting reviewers to send constructive feedback. + *

Once a change has been abandoned, it cannot be further modified by adding a replacement + * patch set, and it cannot be merged. Draft comments however may be published, permitting + * reviewers to send constructive feedback. + * + *

Changes in the ABANDONED state can be moved to: * - *

- * Changes in the ABANDONED state can be moved to: *

    - *
  • {@link #NEW} - when the Restore action is used. + *
  • {@link #NEW} - when the Restore action is used. *
*/ ABANDONED diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/Comment.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/Comment.java index 0bf116a87b..5e9ca94d18 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/Comment.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/Comment.java @@ -20,8 +20,8 @@ import java.util.Objects; public abstract class Comment { /** * Patch set number containing this commit. - *

- * Only set in contexts where comments may come from multiple patch sets. + * + *

Only set in contexts where comments may come from multiple patch sets. */ public Integer patchSet; @@ -70,12 +70,16 @@ public abstract class Comment { @Override public String toString() { - return "Range{" + - "startLine=" + startLine + - ", startCharacter=" + startCharacter + - ", endLine=" + endLine + - ", endCharacter=" + endCharacter + - '}'; + return "Range{" + + "startLine=" + + startLine + + ", startCharacter=" + + startCharacter + + ", endLine=" + + endLine + + ", endCharacter=" + + endCharacter + + '}'; } } @@ -110,7 +114,6 @@ public abstract class Comment { @Override public int hashCode() { - return Objects.hash(patchSet, id, path, side, parent, line, range, - inReplyTo, updated, message); + return Objects.hash(patchSet, id, path, side, parent, line, range, inReplyTo, updated, message); } } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/DiffPreferencesInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/DiffPreferencesInfo.java index 3f5fa31f5a..0d5bdfa01b 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/DiffPreferencesInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/DiffPreferencesInfo.java @@ -32,8 +32,7 @@ public class DiffPreferencesInfo { public static final short WHOLE_FILE_CONTEXT = -1; /** Typical valid choices for the default context setting. */ - public static final short[] CONTEXT_CHOICES = - {3, 10, 25, 50, 75, 100, WHOLE_FILE_CONTEXT}; + public static final short[] CONTEXT_CHOICES = {3, 10, 25, 50, 75, 100, WHOLE_FILE_CONTEXT}; public enum Whitespace { IGNORE_NONE, diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/GeneralPreferencesInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/GeneralPreferencesInfo.java index 77d79fe92d..c8d272a81d 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/GeneralPreferencesInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/GeneralPreferencesInfo.java @@ -28,7 +28,11 @@ public class GeneralPreferencesInfo { /** Preferred method to download a change. */ public enum DownloadCommand { - REPO_DOWNLOAD, PULL, CHECKOUT, CHERRY_PICK, FORMAT_PATCH + REPO_DOWNLOAD, + PULL, + CHECKOUT, + CHERRY_PICK, + FORMAT_PATCH } public enum DateFormat { @@ -130,6 +134,7 @@ public class GeneralPreferencesInfo { public String downloadScheme; /** Type of download command the user prefers to use. */ public DownloadCommand downloadCommand; + public DateFormat dateFormat; public TimeFormat timeFormat; public Boolean expandInlineDiffs; diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/GerritTopMenu.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/GerritTopMenu.java index 0a5b033901..b7e1a5a38e 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/GerritTopMenu.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/GerritTopMenu.java @@ -15,7 +15,12 @@ package com.google.gerrit.extensions.client; public enum GerritTopMenu { - ALL, MY, PROJECTS, PEOPLE, PLUGINS, DOCUMENTATION; + ALL, + MY, + PROJECTS, + PEOPLE, + PLUGINS, + DOCUMENTATION; public final String menuName; diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/ProjectWatchInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/ProjectWatchInfo.java index 556dddc70f..3c20ff7e33 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/ProjectWatchInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/ProjectWatchInfo.java @@ -43,9 +43,14 @@ public class ProjectWatchInfo { @Override public int hashCode() { - return Objects - .hash(project, filter, notifyNewChanges, notifyNewPatchSets, - notifyAllComments, notifySubmittedChanges, notifyAbandonedChanges); + return Objects.hash( + project, + filter, + notifyNewChanges, + notifyNewPatchSets, + notifyAllComments, + notifySubmittedChanges, + notifyAbandonedChanges); } @Override @@ -53,8 +58,7 @@ public class ProjectWatchInfo { StringBuilder b = new StringBuilder(); b.append(project); if (filter != null) { - b.append("%filter=") - .append(filter); + b.append("%filter=").append(filter); } b.append("(notifyAbandonedChanges=") .append(toBoolean(notifyAbandonedChanges)) diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AccountExternalIdInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AccountExternalIdInfo.java index 3bcf387162..9c64fd0ae5 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AccountExternalIdInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AccountExternalIdInfo.java @@ -15,11 +15,9 @@ package com.google.gerrit.extensions.common; import com.google.common.collect.ComparisonChain; - import java.util.Objects; -public class AccountExternalIdInfo - implements Comparable { +public class AccountExternalIdInfo implements Comparable { public String identity; public String emailAddress; public Boolean trusted; @@ -35,7 +33,7 @@ public class AccountExternalIdInfo @Override public boolean equals(Object o) { - if (o instanceof AccountExternalIdInfo) { + if (o instanceof AccountExternalIdInfo) { AccountExternalIdInfo a = (AccountExternalIdInfo) o; return (Objects.equals(a.identity, identity)) && (Objects.equals(a.emailAddress, emailAddress)) diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AgreementInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AgreementInput.java index 060367be17..0c6cf2de81 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AgreementInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AgreementInput.java @@ -19,6 +19,5 @@ import com.google.gerrit.extensions.restapi.DefaultInput; /** This entity contains information for registering a new contributor agreement. */ public class AgreementInput { /* The agreement name. */ - @DefaultInput - public String name; + @DefaultInput public String name; } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AuthInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AuthInfo.java index 0a066c6706..9780dd76d4 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AuthInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AuthInfo.java @@ -17,7 +17,6 @@ package com.google.gerrit.extensions.common; import com.google.gerrit.extensions.client.AccountFieldName; import com.google.gerrit.extensions.client.AuthType; import com.google.gerrit.extensions.client.GitBasicAuthPolicy; - import java.util.List; public class AuthInfo { @@ -34,4 +33,4 @@ public class AuthInfo { public String httpPasswordUrl; public Boolean isGitBasicAuth; public GitBasicAuthPolicy gitBasicAuthPolicy; -} \ No newline at end of file +} diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AvatarInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AvatarInfo.java index 793aa2498c..00f18191ea 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AvatarInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AvatarInfo.java @@ -18,10 +18,8 @@ public class AvatarInfo { /** * Size in pixels the UI prefers an avatar image to be. * - * The web UI prefers avatar images to be square, both - * the height and width of the image should be this size. - * The height is the more important dimension to match - * than the width. + *

The web UI prefers avatar images to be square, both the height and width of the image should + * be this size. The height is the more important dimension to match than the width. */ public static final int DEFAULT_SIZE = 26; diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeConfigInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeConfigInfo.java index 963edcddf5..85a387d544 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeConfigInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeConfigInfo.java @@ -23,4 +23,4 @@ public class ChangeConfigInfo { public String replyTooltip; public int updateDelay; public Boolean submitWholeTopic; -} \ No newline at end of file +} diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeInfo.java index ba22094fd1..7061f314b8 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeInfo.java @@ -17,7 +17,6 @@ package com.google.gerrit.extensions.common; import com.google.gerrit.extensions.client.ChangeStatus; import com.google.gerrit.extensions.client.ReviewerState; import com.google.gerrit.extensions.client.SubmitType; - import java.sql.Timestamp; import java.util.Collection; import java.util.List; diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeInput.java index b033190c04..b50bcf3558 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeInput.java @@ -18,7 +18,6 @@ import com.google.gerrit.extensions.api.changes.NotifyHandling; import com.google.gerrit.extensions.api.changes.NotifyInfo; import com.google.gerrit.extensions.api.changes.RecipientType; import com.google.gerrit.extensions.client.ChangeStatus; - import java.util.Map; public class ChangeInput { @@ -34,5 +33,6 @@ public class ChangeInput { /** Who to send email notifications to after change is created. */ public NotifyHandling notify = NotifyHandling.ALL; + public Map notifyDetails; } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/CommentInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/CommentInfo.java index 166aaa2576..02a21339ec 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/CommentInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/CommentInfo.java @@ -15,7 +15,6 @@ package com.google.gerrit.extensions.common; import com.google.gerrit.extensions.client.Comment; - import java.util.Objects; public class CommentInfo extends Comment { @@ -26,8 +25,7 @@ public class CommentInfo extends Comment { public boolean equals(Object o) { if (super.equals(o)) { CommentInfo ci = (CommentInfo) o; - return Objects.equals(author, ci.author) - && Objects.equals(tag, ci.tag); + return Objects.equals(author, ci.author) && Objects.equals(tag, ci.tag); } return false; } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DiffWebLinkInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DiffWebLinkInfo.java index 71acca357a..9bcf2cf4c9 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DiffWebLinkInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DiffWebLinkInfo.java @@ -18,23 +18,27 @@ public class DiffWebLinkInfo extends WebLinkInfo { public Boolean showOnSideBySideDiffView; public Boolean showOnUnifiedDiffView; - public static DiffWebLinkInfo forSideBySideDiffView(String name, - String imageUrl, String url, String target) { + public static DiffWebLinkInfo forSideBySideDiffView( + String name, String imageUrl, String url, String target) { return new DiffWebLinkInfo(name, imageUrl, url, target, true, false); } - public static DiffWebLinkInfo forUnifiedDiffView(String name, - String imageUrl, String url, String target) { + public static DiffWebLinkInfo forUnifiedDiffView( + String name, String imageUrl, String url, String target) { return new DiffWebLinkInfo(name, imageUrl, url, target, false, true); } - public static DiffWebLinkInfo forSideBySideAndUnifiedDiffView(String name, - String imageUrl, String url, String target) { + public static DiffWebLinkInfo forSideBySideAndUnifiedDiffView( + String name, String imageUrl, String url, String target) { return new DiffWebLinkInfo(name, imageUrl, url, target, true, true); } - private DiffWebLinkInfo(String name, String imageUrl, String url, - String target, boolean showOnSideBySideDiffView, + private DiffWebLinkInfo( + String name, + String imageUrl, + String url, + String target, + boolean showOnSideBySideDiffView, boolean showOnUnifiedDiffView) { super(name, imageUrl, url, target); this.showOnSideBySideDiffView = showOnSideBySideDiffView ? true : null; diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DownloadInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DownloadInfo.java index 180e2d2b06..5ea5992b70 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DownloadInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DownloadInfo.java @@ -20,4 +20,4 @@ import java.util.Map; public class DownloadInfo { public Map schemes; public List archives; -} \ No newline at end of file +} diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DownloadSchemeInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DownloadSchemeInfo.java index 0e8ad65328..6f0b178bc8 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DownloadSchemeInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DownloadSchemeInfo.java @@ -22,4 +22,4 @@ public class DownloadSchemeInfo { public Boolean isAuthSupported; public Map commands; public Map cloneCommands; -} \ No newline at end of file +} diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GerritInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GerritInfo.java index 0c10ec7e4a..f904b06dce 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GerritInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GerritInfo.java @@ -15,7 +15,6 @@ package com.google.gerrit.extensions.common; import com.google.gerrit.extensions.client.UiType; - import java.util.Set; public class GerritInfo { diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GpgKeyInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GpgKeyInfo.java index 33adbeab2f..7a5c15b77e 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GpgKeyInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GpgKeyInfo.java @@ -19,23 +19,20 @@ import java.util.List; public class GpgKeyInfo { /** * Status of checking an object like a key or signature. - *

- * Order of values in this enum is significant: OK is "better" than BAD, etc. + * + *

Order of values in this enum is significant: OK is "better" than BAD, etc. */ public enum Status { /** Something is wrong with this key. */ BAD, /** - * Inspecting only this key found no problems, but the system does not fully - * trust the key's origin. + * Inspecting only this key found no problems, but the system does not fully trust the key's + * origin. */ OK, - /** - * This key is valid, and the system knows enough about the key and its - * origin to trust it. - */ + /** This key is valid, and the system knows enough about the key and its origin to trust it. */ TRUSTED; } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GroupAuditEventInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GroupAuditEventInfo.java index 1d8839fd5d..3e6f7625ce 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GroupAuditEventInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GroupAuditEventInfo.java @@ -18,15 +18,18 @@ import java.sql.Timestamp; public abstract class GroupAuditEventInfo { public enum Type { - ADD_USER, REMOVE_USER, ADD_GROUP, REMOVE_GROUP + ADD_USER, + REMOVE_USER, + ADD_GROUP, + REMOVE_GROUP } public Type type; public AccountInfo user; public Timestamp date; - public static UserMemberAuditEventInfo createAddUserEvent(AccountInfo user, - Timestamp date, AccountInfo member) { + public static UserMemberAuditEventInfo createAddUserEvent( + AccountInfo user, Timestamp date, AccountInfo member) { return new UserMemberAuditEventInfo(Type.ADD_USER, user, date, member); } @@ -35,8 +38,8 @@ public abstract class GroupAuditEventInfo { return new UserMemberAuditEventInfo(Type.REMOVE_USER, user, date, member); } - public static GroupMemberAuditEventInfo createAddGroupEvent(AccountInfo user, - Timestamp date, GroupInfo member) { + public static GroupMemberAuditEventInfo createAddGroupEvent( + AccountInfo user, Timestamp date, GroupInfo member) { return new GroupMemberAuditEventInfo(Type.ADD_GROUP, user, date, member); } @@ -45,8 +48,7 @@ public abstract class GroupAuditEventInfo { return new GroupMemberAuditEventInfo(Type.REMOVE_GROUP, user, date, member); } - protected GroupAuditEventInfo(Type type, AccountInfo user, - Timestamp date) { + protected GroupAuditEventInfo(Type type, AccountInfo user, Timestamp date) { this.type = type; this.user = user; this.date = date; @@ -55,8 +57,8 @@ public abstract class GroupAuditEventInfo { public static class UserMemberAuditEventInfo extends GroupAuditEventInfo { public AccountInfo member; - public UserMemberAuditEventInfo(Type type, AccountInfo user, - Timestamp date, AccountInfo member) { + public UserMemberAuditEventInfo( + Type type, AccountInfo user, Timestamp date, AccountInfo member) { super(type, user, date); this.member = member; } @@ -65,8 +67,8 @@ public abstract class GroupAuditEventInfo { public static class GroupMemberAuditEventInfo extends GroupAuditEventInfo { public GroupInfo member; - public GroupMemberAuditEventInfo(Type type, AccountInfo user, - Timestamp date, GroupInfo member) { + public GroupMemberAuditEventInfo( + Type type, AccountInfo user, Timestamp date, GroupInfo member) { super(type, user, date); this.member = member; } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/MergeInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/MergeInput.java index 598d61899a..c16a551bbe 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/MergeInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/MergeInput.java @@ -18,7 +18,8 @@ public class MergeInput { /** * {@code source} can be any Git object reference expression. * - * @see gitrevisions(7) + * @see gitrevisions(7) */ public String source; diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/MergeableInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/MergeableInfo.java index 50de74a5ac..7ec454ce68 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/MergeableInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/MergeableInfo.java @@ -15,7 +15,6 @@ package com.google.gerrit.extensions.common; import com.google.gerrit.extensions.client.SubmitType; - import java.util.List; public class MergeableInfo { diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/PluginConfigInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/PluginConfigInfo.java index 845f7cb7f4..2d1d84044a 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/PluginConfigInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/PluginConfigInfo.java @@ -19,4 +19,4 @@ import java.util.List; public class PluginConfigInfo { public Boolean hasAvatars; public List jsResourcePaths; -} \ No newline at end of file +} diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ProblemInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ProblemInfo.java index ff04fdcf80..59f9fc9d77 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ProblemInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ProblemInfo.java @@ -18,7 +18,8 @@ import java.util.Objects; public class ProblemInfo { public enum Status { - FIXED, FIX_FAILED + FIXED, + FIX_FAILED } public String message; @@ -43,11 +44,9 @@ public class ProblemInfo { @Override public String toString() { - StringBuilder sb = new StringBuilder(getClass().getSimpleName()) - .append('[').append(message); + StringBuilder sb = new StringBuilder(getClass().getSimpleName()).append('[').append(message); if (status != null || outcome != null) { - sb.append(" (").append(status).append(": ").append(outcome) - .append(')'); + sb.append(" (").append(status).append(": ").append(outcome).append(')'); } return sb.append(']').toString(); } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ProjectInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ProjectInfo.java index 4036740de7..d8e29efb2a 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ProjectInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ProjectInfo.java @@ -15,7 +15,6 @@ package com.google.gerrit.extensions.common; import com.google.gerrit.extensions.client.ProjectState; - import java.util.List; import java.util.Map; diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ReceiveInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ReceiveInfo.java index e66c242f07..9fcd92b449 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ReceiveInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ReceiveInfo.java @@ -16,4 +16,4 @@ package com.google.gerrit.extensions.common; public class ReceiveInfo { public Boolean enableSignedPush; -} \ No newline at end of file +} diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ReviewerUpdateInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ReviewerUpdateInfo.java index b3c9cb667e..eccdc64a56 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ReviewerUpdateInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ReviewerUpdateInfo.java @@ -15,7 +15,6 @@ package com.google.gerrit.extensions.common; import com.google.gerrit.extensions.client.ReviewerState; - import java.sql.Timestamp; public class ReviewerUpdateInfo { diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/RevisionInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/RevisionInfo.java index 5242c7e0e9..a3304156c5 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/RevisionInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/RevisionInfo.java @@ -15,7 +15,6 @@ package com.google.gerrit.extensions.common; import com.google.gerrit.extensions.client.ChangeKind; - import java.sql.Timestamp; import java.util.Map; diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ServerInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ServerInfo.java index 3dd8368c2c..aa4a63f1f2 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ServerInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ServerInfo.java @@ -28,4 +28,4 @@ public class ServerInfo { public Map urlAliases; public UserConfigInfo user; public ReceiveInfo receive; -} \ No newline at end of file +} diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SshdInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SshdInfo.java index 98d650c86a..fb9cb16043 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SshdInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SshdInfo.java @@ -14,5 +14,4 @@ package com.google.gerrit.extensions.common; -public class SshdInfo { -} \ No newline at end of file +public class SshdInfo {} diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SuggestInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SuggestInfo.java index 5b0dcbe902..91ca547dbc 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SuggestInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SuggestInfo.java @@ -16,4 +16,4 @@ package com.google.gerrit.extensions.common; public class SuggestInfo { public int from; -} \ No newline at end of file +} diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SuggestedReviewerInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SuggestedReviewerInfo.java index 697caf1f28..3b86e4269f 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SuggestedReviewerInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SuggestedReviewerInfo.java @@ -19,4 +19,4 @@ public class SuggestedReviewerInfo { public GroupBaseInfo group; public int count; public Boolean confirm; -} \ No newline at end of file +} diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/TestSubmitRuleInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/TestSubmitRuleInput.java index 96a1626f58..5373cf664a 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/TestSubmitRuleInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/TestSubmitRuleInput.java @@ -18,10 +18,10 @@ import com.google.gerrit.extensions.restapi.DefaultInput; public class TestSubmitRuleInput { public enum Filters { - RUN, SKIP + RUN, + SKIP } - @DefaultInput - public String rule; + @DefaultInput public String rule; public Filters filters; } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/UserConfigInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/UserConfigInfo.java index 501068915d..ec03dd029c 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/UserConfigInfo.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/UserConfigInfo.java @@ -16,4 +16,4 @@ package com.google.gerrit.extensions.common; public class UserConfigInfo { public String anonymousCowardName; -} \ No newline at end of file +} diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/CloneCommand.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/CloneCommand.java index f773380e5e..4e459edc2e 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/CloneCommand.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/CloneCommand.java @@ -22,8 +22,7 @@ public abstract class CloneCommand { * Returns the clone command for the given download scheme and project. * * @param scheme the download scheme for which the command should be returned - * @param project the name of the project for which the clone command - * should be returned + * @param project the name of the project for which the clone command should be returned * @return the clone command */ public abstract String getCommand(DownloadScheme scheme, String project); diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/DownloadCommand.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/DownloadCommand.java index 83f3fc4bfe..5660d046ba 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/DownloadCommand.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/DownloadCommand.java @@ -19,15 +19,12 @@ import com.google.gerrit.extensions.annotations.ExtensionPoint; @ExtensionPoint public abstract class DownloadCommand { /** - * Returns the download command for the given download scheme, project and - * ref. + * Returns the download command for the given download scheme, project and ref. * * @param scheme the download scheme for which the command should be returned - * @param project the name of the project for which the download command - * should be returned + * @param project the name of the project for which the download command should be returned * @param ref the change ref * @return the download command */ - public abstract String getCommand(DownloadScheme scheme, String project, - String ref); + public abstract String getCommand(DownloadScheme scheme, String project, String ref); } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/ExternalIncludedIn.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/ExternalIncludedIn.java index 9e12c8abcc..1b95778dab 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/ExternalIncludedIn.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/ExternalIncludedIn.java @@ -16,27 +16,25 @@ package com.google.gerrit.extensions.config; import com.google.common.collect.ListMultimap; import com.google.gerrit.extensions.annotations.ExtensionPoint; - import java.util.Collection; @ExtensionPoint public interface ExternalIncludedIn { /** - * Returns additional entries for IncludedInInfo as multimap where the - * key is the row title and the the values are a list of systems that include - * the given commit (e.g. names of servers on which this commit is deployed). + * Returns additional entries for IncludedInInfo as multimap where the key is the row title and + * the the values are a list of systems that include the given commit (e.g. names of servers on + * which this commit is deployed). * - * The tags and branches in which the commit is included are provided so that - * a RevWalk can be avoided when a system runs a certain tag or branch. + *

The tags and branches in which the commit is included are provided so that a RevWalk can be + * avoided when a system runs a certain tag or branch. * * @param project the name of the project - * @param commit the ID of the commit for which it should be checked if it is - * included + * @param commit the ID of the commit for which it should be checked if it is included * @param tags the tags that include the commit * @param branches the branches that include the commit * @return additional entries for IncludedInInfo */ - ListMultimap getIncludedIn(String project, String commit, - Collection tags, Collection branches); + ListMultimap getIncludedIn( + String project, String commit, Collection tags, Collection branches); } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/FactoryModule.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/FactoryModule.java index 226a6c2cbf..793a372067 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/FactoryModule.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/FactoryModule.java @@ -20,10 +20,9 @@ import com.google.inject.assistedinject.FactoryModuleBuilder; public abstract class FactoryModule extends AbstractModule { /** * Register an assisted injection factory. - *

- * This function provides an automatic way to define a factory that creates a - * concrete type through assisted injection. For example to configure the - * following assisted injection case: + * + *

This function provides an automatic way to define a factory that creates a concrete type + * through assisted injection. For example to configure the following assisted injection case: * *

    * public class Foo {
@@ -35,8 +34,8 @@ public abstract class FactoryModule extends AbstractModule {
    * }
    * 
* - * Just pass {@code Foo.Factory.class} to this method. The factory will be - * generated to return its one return type as declared in the creation method. + * Just pass {@code Foo.Factory.class} to this method. The factory will be generated to return its + * one return type as declared in the creation method. * * @param factory interface which specifies the bean factory method. */ diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/AgreementSignupListener.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/AgreementSignupListener.java index 5abfc382ae..798d046a02 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/AgreementSignupListener.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/AgreementSignupListener.java @@ -22,6 +22,7 @@ import com.google.gerrit.extensions.common.AccountInfo; public interface AgreementSignupListener { interface Event extends GerritEvent { AccountInfo getAccount(); + String getAgreementName(); } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/AssigneeChangedListener.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/AssigneeChangedListener.java index 022640c288..7fc0f032c5 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/AssigneeChangedListener.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/AssigneeChangedListener.java @@ -22,7 +22,8 @@ import com.google.gerrit.extensions.common.AccountInfo; @ExtensionPoint public interface AssigneeChangedListener { interface Event extends ChangeEvent { - @Nullable AccountInfo getOldAssignee(); + @Nullable + AccountInfo getOldAssignee(); } void onAssigneeChanged(Event event); diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ChangeEvent.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ChangeEvent.java index f0127109cf..0b510528b3 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ChangeEvent.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ChangeEvent.java @@ -16,12 +16,13 @@ package com.google.gerrit.extensions.events; import com.google.gerrit.extensions.common.AccountInfo; import com.google.gerrit.extensions.common.ChangeInfo; - import java.sql.Timestamp; /** Interface to be extended by Events with a Change. */ public interface ChangeEvent extends GerritEvent { ChangeInfo getChange(); + AccountInfo getWho(); + Timestamp getWhen(); } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/CommentAddedListener.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/CommentAddedListener.java index e8388a9876..071dac1beb 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/CommentAddedListener.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/CommentAddedListener.java @@ -16,7 +16,6 @@ package com.google.gerrit.extensions.events; import com.google.gerrit.extensions.annotations.ExtensionPoint; import com.google.gerrit.extensions.common.ApprovalInfo; - import java.util.Map; /** Notified whenever a comment is added to a change. */ @@ -24,7 +23,9 @@ import java.util.Map; public interface CommentAddedListener { interface Event extends RevisionEvent { String getComment(); + Map getApprovals(); + Map getOldApprovals(); } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/DraftPublishedListener.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/DraftPublishedListener.java index 1fc574b318..edbdcd8d56 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/DraftPublishedListener.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/DraftPublishedListener.java @@ -19,8 +19,7 @@ import com.google.gerrit.extensions.annotations.ExtensionPoint; /** Notified whenever a Draft is published. */ @ExtensionPoint public interface DraftPublishedListener { - interface Event extends RevisionEvent { - } + interface Event extends RevisionEvent {} void onDraftPublished(Event event); } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/GarbageCollectorListener.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/GarbageCollectorListener.java index f15dd4d525..edb3e696f9 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/GarbageCollectorListener.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/GarbageCollectorListener.java @@ -15,18 +15,14 @@ package com.google.gerrit.extensions.events; import com.google.gerrit.extensions.annotations.ExtensionPoint; - import java.util.Properties; -/** - * Notified whenever the garbage collector has run successfully on a project. - */ +/** Notified whenever the garbage collector has run successfully on a project. */ @ExtensionPoint public interface GarbageCollectorListener { interface Event extends ProjectEvent { /** - * @return Properties describing the result of the garbage collection - * performed by JGit. + * @return Properties describing the result of the garbage collection performed by JGit. * @see org.eclipse.jgit.api.GarbageCollectCommand#call() */ Properties getStatistics(); diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/GitReferenceUpdatedListener.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/GitReferenceUpdatedListener.java index 3f7dfbe47b..bf922f81b8 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/GitReferenceUpdatedListener.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/GitReferenceUpdatedListener.java @@ -23,15 +23,19 @@ import com.google.gerrit.extensions.common.AccountInfo; public interface GitReferenceUpdatedListener { interface Event extends ProjectEvent { String getRefName(); + String getOldObjectId(); + String getNewObjectId(); + boolean isCreate(); + boolean isDelete(); + boolean isNonFastForward(); - /** - * The updater, could be null if it's the server. - */ - @Nullable AccountInfo getUpdater(); + /** The updater, could be null if it's the server. */ + @Nullable + AccountInfo getUpdater(); } void onGitReferenceUpdated(Event event); diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/HashtagsEditedListener.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/HashtagsEditedListener.java index ad132673d3..9c8495d5ec 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/HashtagsEditedListener.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/HashtagsEditedListener.java @@ -15,7 +15,6 @@ package com.google.gerrit.extensions.events; import com.google.gerrit.extensions.annotations.ExtensionPoint; - import java.util.Collection; /** Notified whenever a Change's Hashtags are edited. */ @@ -23,7 +22,9 @@ import java.util.Collection; public interface HashtagsEditedListener { interface Event extends ChangeEvent { Collection getHashtags(); + Collection getAddedHashtags(); + Collection getRemovedHashtags(); } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/HeadUpdatedListener.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/HeadUpdatedListener.java index e11c85770c..d876426b8b 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/HeadUpdatedListener.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/HeadUpdatedListener.java @@ -21,6 +21,7 @@ import com.google.gerrit.extensions.annotations.ExtensionPoint; public interface HeadUpdatedListener { interface Event extends ProjectEvent { String getOldHeadName(); + String getNewHeadName(); } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/LifecycleListener.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/LifecycleListener.java index b3ed37b003..dae4b543a3 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/LifecycleListener.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/LifecycleListener.java @@ -15,7 +15,6 @@ package com.google.gerrit.extensions.events; import com.google.gerrit.extensions.annotations.ExtensionPoint; - import java.util.EventListener; /** Listener interested in server startup and shutdown events. */ diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/NewProjectCreatedListener.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/NewProjectCreatedListener.java index 07c0bf6c41..82ea51ddd8 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/NewProjectCreatedListener.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/NewProjectCreatedListener.java @@ -16,7 +16,6 @@ package com.google.gerrit.extensions.events; import com.google.gerrit.extensions.annotations.ExtensionPoint; - /** Notified whenever a project is created on the master. */ @ExtensionPoint public interface NewProjectCreatedListener { diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/PluginEventListener.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/PluginEventListener.java index dfcbdee50e..2ba2bd50b4 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/PluginEventListener.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/PluginEventListener.java @@ -18,7 +18,9 @@ package com.google.gerrit.extensions.events; public interface PluginEventListener { interface Event extends GerritEvent { String pluginName(); + String getType(); + String getData(); } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ProjectDeletedListener.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ProjectDeletedListener.java index 468950fbc1..dd55166c9b 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ProjectDeletedListener.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ProjectDeletedListener.java @@ -19,8 +19,7 @@ import com.google.gerrit.extensions.annotations.ExtensionPoint; /** Notified whenever a project is deleted on the master. */ @ExtensionPoint public interface ProjectDeletedListener { - interface Event extends ProjectEvent { - } + interface Event extends ProjectEvent {} void onProjectDeleted(Event event); } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ReviewerAddedListener.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ReviewerAddedListener.java index bb4ac9db93..b54b913641 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ReviewerAddedListener.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ReviewerAddedListener.java @@ -16,7 +16,6 @@ package com.google.gerrit.extensions.events; import com.google.gerrit.extensions.annotations.ExtensionPoint; import com.google.gerrit.extensions.common.AccountInfo; - import java.util.List; /** Notified whenever one or more Reviewers are added to a change. */ diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ReviewerDeletedListener.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ReviewerDeletedListener.java index 3c2f723f48..992b4c56a2 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ReviewerDeletedListener.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ReviewerDeletedListener.java @@ -17,7 +17,6 @@ package com.google.gerrit.extensions.events; import com.google.gerrit.extensions.annotations.ExtensionPoint; import com.google.gerrit.extensions.common.AccountInfo; import com.google.gerrit.extensions.common.ApprovalInfo; - import java.util.Map; /** Notified whenever a Reviewer is removed from a change. */ @@ -25,8 +24,11 @@ import java.util.Map; public interface ReviewerDeletedListener { interface Event extends ChangeEvent { AccountInfo getReviewer(); + String getComment(); + Map getNewApprovals(); + Map getOldApprovals(); } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/RevisionCreatedListener.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/RevisionCreatedListener.java index 8d148b7762..6ff537a36c 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/RevisionCreatedListener.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/RevisionCreatedListener.java @@ -19,8 +19,7 @@ import com.google.gerrit.extensions.annotations.ExtensionPoint; /** Notified whenever a Change Revision is created. */ @ExtensionPoint public interface RevisionCreatedListener { - interface Event extends RevisionEvent { - } + interface Event extends RevisionEvent {} void onRevisionCreated(Event event); } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/RevisionEvent.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/RevisionEvent.java index 27d1067b4e..f0cfa2c4b6 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/RevisionEvent.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/RevisionEvent.java @@ -20,4 +20,3 @@ import com.google.gerrit.extensions.common.RevisionInfo; public interface RevisionEvent extends ChangeEvent { RevisionInfo getRevision(); } - diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/UsageDataPublishedListener.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/UsageDataPublishedListener.java index 35d49b1b4a..8682b20640 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/UsageDataPublishedListener.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/UsageDataPublishedListener.java @@ -15,7 +15,6 @@ package com.google.gerrit.extensions.events; import com.google.gerrit.extensions.annotations.ExtensionPoint; - import java.sql.Timestamp; import java.util.List; @@ -25,19 +24,25 @@ public interface UsageDataPublishedListener { interface Event { MetaData getMetaData(); + Timestamp getInstant(); + List getData(); } interface Data { long getValue(); + String getProjectName(); } interface MetaData { String getName(); + String getUnitName(); + String getUnitSymbol(); + String getDescription(); } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/VoteDeletedListener.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/VoteDeletedListener.java index 01a83e30cf..cb7a01484d 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/VoteDeletedListener.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/VoteDeletedListener.java @@ -16,7 +16,6 @@ package com.google.gerrit.extensions.events; import com.google.gerrit.extensions.annotations.ExtensionPoint; import com.google.gerrit.extensions.common.ApprovalInfo; - import java.util.Map; /** Notified whenever a vote is removed from a change. */ @@ -24,8 +23,11 @@ import java.util.Map; public interface VoteDeletedListener { interface Event extends RevisionEvent { Map getOldApprovals(); + Map getApprovals(); + Map getRemoved(); + String getMessage(); } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItem.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItem.java index 52be97772a..477b666e2a 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItem.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItem.java @@ -23,16 +23,15 @@ import com.google.inject.TypeLiteral; import com.google.inject.binder.LinkedBindingBuilder; import com.google.inject.util.Providers; import com.google.inject.util.Types; - import java.util.concurrent.atomic.AtomicReference; /** * A single item that can be modified as plugins reload. - *

- * DynamicItems are always mapped as singletons in Guice. Items store a Provider - * internally, and resolve the provider to an instance on demand. This enables - * registrations to decide between singleton and non-singleton members. If - * multiple plugins try to provide the same Provider, an exception is thrown. + * + *

DynamicItems are always mapped as singletons in Guice. Items store a Provider internally, and + * resolve the provider to an instance on demand. This enables registrations to decide between + * singleton and non-singleton members. If multiple plugins try to provide the same Provider, an + * exception is thrown. */ public class DynamicItem { /** Pair of provider implementation and plugin providing it. */ @@ -48,8 +47,9 @@ public class DynamicItem { /** * Declare a singleton {@code DynamicItem} with a binder. - *

- * Items must be defined in a Guice module before they can be bound: + * + *

Items must be defined in a Guice module before they can be bound: + * *

    *   DynamicItem.itemOf(binder(), Interface.class);
    *   DynamicItem.bind(binder(), Interface.class).to(Impl.class);
@@ -64,8 +64,9 @@ public class DynamicItem {
 
   /**
    * Declare a singleton {@code DynamicItem} with a binder.
-   * 

- * Items must be defined in a Guice module before they can be bound: + * + *

Items must be defined in a Guice module before they can be bound: + * *

    *   DynamicSet.itemOf(binder(), new TypeLiteral<Thing<Foo>>() {});
    * 
@@ -75,29 +76,25 @@ public class DynamicItem { */ public static void itemOf(Binder binder, TypeLiteral member) { Key> key = keyFor(member); - binder.bind(key) - .toProvider(new DynamicItemProvider<>(member, key)) - .in(Scopes.SINGLETON); + binder.bind(key).toProvider(new DynamicItemProvider<>(member, key)).in(Scopes.SINGLETON); } /** * Construct a single {@code DynamicItem} with a fixed value. - *

- * Primarily useful for passing {@code DynamicItem}s to constructors in tests. + * + *

Primarily useful for passing {@code DynamicItem}s to constructors in tests. * * @param member type of item. * @param item item to store. */ public static DynamicItem itemOf(Class member, T item) { - return new DynamicItem<>( - keyFor(TypeLiteral.get(member)), - Providers.of(item), "gerrit"); + return new DynamicItem<>(keyFor(TypeLiteral.get(member)), Providers.of(item), "gerrit"); } @SuppressWarnings("unchecked") private static Key> keyFor(TypeLiteral member) { - return (Key>) Key.get( - Types.newParameterizedType(DynamicItem.class, member.getType())); + return (Key>) + Key.get(Types.newParameterizedType(DynamicItem.class, member.getType())); } /** @@ -118,8 +115,7 @@ public class DynamicItem { * @param type type of entry to store. * @return a binder to continue configuring the new item. */ - public static LinkedBindingBuilder bind(Binder binder, - TypeLiteral type) { + public static LinkedBindingBuilder bind(Binder binder, TypeLiteral type) { return binder.bind(type); } @@ -138,9 +134,8 @@ public class DynamicItem { /** * Get the configured item, or null. * - * @return the configured item instance; null if no implementation has been - * bound to the item. This is common if no plugin registered an - * implementation for the type. + * @return the configured item instance; null if no implementation has been bound to the item. + * This is common if no plugin registered an implementation for the type. */ public T get() { NamedProvider item = ref.get(); @@ -171,9 +166,10 @@ public class DynamicItem { while (!ref.compareAndSet(old, item)) { old = ref.get(); if (old != null && !"gerrit".equals(old.pluginName)) { - throw new ProvisionException(String.format( - "%s already provided by %s, ignoring plugin %s", - key.getTypeLiteral(), old.pluginName, pluginName)); + throw new ProvisionException( + String.format( + "%s already provided by %s, ignoring plugin %s", + key.getTypeLiteral(), old.pluginName, pluginName)); } } @@ -189,29 +185,27 @@ public class DynamicItem { /** * Set the element that may be hot-replaceable in the future. * - * @param key unique description from the item's Guice binding. This can be - * later obtained from the registration handle to facilitate matching - * with the new equivalent instance during a hot reload. + * @param key unique description from the item's Guice binding. This can be later obtained from + * the registration handle to facilitate matching with the new equivalent instance during a + * hot reload. * @param impl the item to set as our value right now. Must not be null. * @param pluginName the name of the plugin providing the item. * @return a handle that can remove this item later, or hot-swap the item. */ - public ReloadableRegistrationHandle set(Key key, Provider impl, - String pluginName) { + public ReloadableRegistrationHandle set(Key key, Provider impl, String pluginName) { final NamedProvider item = new NamedProvider<>(impl, pluginName); NamedProvider old = null; while (!ref.compareAndSet(old, item)) { old = ref.get(); - if (old != null - && !"gerrit".equals(old.pluginName) - && !pluginName.equals(old.pluginName)) { + if (old != null && !"gerrit".equals(old.pluginName) && !pluginName.equals(old.pluginName)) { // We allow to replace: // 1. Gerrit core items, e.g. websession cache // can be replaced by plugin implementation // 2. Reload of current plugin - throw new ProvisionException(String.format( - "%s already provided by %s, ignoring plugin %s", - this.key.getTypeLiteral(), old.pluginName, pluginName)); + throw new ProvisionException( + String.format( + "%s already provided by %s, ignoring plugin %s", + this.key.getTypeLiteral(), old.pluginName, pluginName)); } } return new ReloadableHandle(key, item, old); @@ -222,8 +216,7 @@ public class DynamicItem { private final NamedProvider item; private final NamedProvider defaultItem; - ReloadableHandle(Key handleKey, NamedProvider item, - NamedProvider defaultItem) { + ReloadableHandle(Key handleKey, NamedProvider item, NamedProvider defaultItem) { this.handleKey = handleKey; this.item = item; this.defaultItem = defaultItem; diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItemProvider.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItemProvider.java index 01551e605e..5b76741471 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItemProvider.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItemProvider.java @@ -21,15 +21,13 @@ import com.google.inject.Key; import com.google.inject.Provider; import com.google.inject.ProvisionException; import com.google.inject.TypeLiteral; - import java.util.List; class DynamicItemProvider implements Provider> { private final TypeLiteral type; private final Key> key; - @Inject - private Injector injector; + @Inject private Injector injector; DynamicItemProvider(TypeLiteral type, Key> key) { this.type = type; @@ -46,10 +44,11 @@ class DynamicItemProvider implements Provider> { if (bindings != null && bindings.size() == 1) { return bindings.get(0).getProvider(); } else if (bindings != null && bindings.size() > 1) { - throw new ProvisionException(String.format( - "Multiple providers bound for DynamicItem<%s>\n" - + "This is not allowed; check the server configuration.", - type)); + throw new ProvisionException( + String.format( + "Multiple providers bound for DynamicItem<%s>\n" + + "This is not allowed; check the server configuration.", + type)); } else { return null; } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicMap.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicMap.java index d3db2e9cfb..e0db0c7579 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicMap.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicMap.java @@ -21,7 +21,6 @@ import com.google.inject.ProvisionException; import com.google.inject.Scopes; import com.google.inject.TypeLiteral; import com.google.inject.util.Types; - import java.util.Collections; import java.util.Iterator; import java.util.Map; @@ -34,18 +33,18 @@ import java.util.concurrent.ConcurrentMap; /** * A map of members that can be modified as plugins reload. - *

- * Maps index their members by plugin name and export name. - *

- * DynamicMaps are always mapped as singletons in Guice. Maps store Providers - * internally, and resolve the provider to an instance on demand. This enables - * registrations to decide between singleton and non-singleton members. + * + *

Maps index their members by plugin name and export name. + * + *

DynamicMaps are always mapped as singletons in Guice. Maps store Providers internally, and + * resolve the provider to an instance on demand. This enables registrations to decide between + * singleton and non-singleton members. */ public abstract class DynamicMap implements Iterable> { /** * Declare a singleton {@code DynamicMap} with a binder. - *

- * Maps must be defined in a Guice module before they can be bound: + * + *

Maps must be defined in a Guice module before they can be bound: * *

    * DynamicMap.mapOf(binder(), Interface.class);
@@ -63,8 +62,8 @@ public abstract class DynamicMap implements Iterable> {
 
   /**
    * Declare a singleton {@code DynamicMap} with a binder.
-   * 

- * Maps must be defined in a Guice module before they can be bound: + * + *

Maps must be defined in a Guice module before they can be bound: * *

    * DynamicMap.mapOf(binder(), new TypeLiteral<Thing<Bar>>(){});
@@ -78,20 +77,20 @@ public abstract class DynamicMap implements Iterable> {
    */
   public static  void mapOf(Binder binder, TypeLiteral member) {
     @SuppressWarnings("unchecked")
-    Key> key = (Key>) Key.get(
-        Types.newParameterizedType(DynamicMap.class, member.getType()));
-    binder.bind(key)
-        .toProvider(new DynamicMapProvider<>(member))
-        .in(Scopes.SINGLETON);
+    Key> key =
+        (Key>)
+            Key.get(Types.newParameterizedType(DynamicMap.class, member.getType()));
+    binder.bind(key).toProvider(new DynamicMapProvider<>(member)).in(Scopes.SINGLETON);
   }
 
   final ConcurrentMap> items;
 
   DynamicMap() {
-    items = new ConcurrentHashMap<>(
-        16 /* initial size */,
-        0.75f /* load factor */,
-        1 /* concurrency level of 1, load/unload is single threaded */);
+    items =
+        new ConcurrentHashMap<>(
+            16 /* initial size */,
+            0.75f /* load factor */,
+            1 /* concurrency level of 1, load/unload is single threaded */);
   }
 
   /**
@@ -99,10 +98,10 @@ public abstract class DynamicMap implements Iterable> {
    *
    * @param pluginName local name of the plugin providing the item.
    * @param exportName name the plugin exports the item as.
-   * @return the implementation. Null if the plugin is not running, or if the
-   *         plugin does not export this name.
-   * @throws ProvisionException if the registered provider is unable to obtain
-   *         an instance of the requested implementation.
+   * @return the implementation. Null if the plugin is not running, or if the plugin does not export
+   *     this name.
+   * @throws ProvisionException if the registered provider is unable to obtain an instance of the
+   *     requested implementation.
    */
   public T get(String pluginName, String exportName) throws ProvisionException {
     Provider p = items.get(new NamePair(pluginName, exportName));
@@ -141,8 +140,7 @@ public abstract class DynamicMap implements Iterable> {
   /** Iterate through all entries in an undefined order. */
   @Override
   public Iterator> iterator() {
-    final Iterator>> i =
-        items.entrySet().iterator();
+    final Iterator>> i = items.entrySet().iterator();
     return new Iterator>() {
       @Override
       public boolean hasNext() {
@@ -179,7 +177,9 @@ public abstract class DynamicMap implements Iterable> {
 
   public interface Entry {
     String getPluginName();
+
     String getExportName();
+
     Provider getProvider();
   }
 
@@ -201,8 +201,7 @@ public abstract class DynamicMap implements Iterable> {
     public boolean equals(Object other) {
       if (other instanceof NamePair) {
         NamePair np = (NamePair) other;
-        return pluginName.equals(np.pluginName)
-            && exportName.equals(np.exportName);
+        return pluginName.equals(np.pluginName) && exportName.equals(np.exportName);
       }
       return false;
     }
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicMapProvider.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicMapProvider.java
index 8fcbdd97e1..420a3563ef 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicMapProvider.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicMapProvider.java
@@ -19,14 +19,12 @@ import com.google.inject.Inject;
 import com.google.inject.Injector;
 import com.google.inject.Provider;
 import com.google.inject.TypeLiteral;
-
 import java.util.List;
 
 class DynamicMapProvider implements Provider> {
   private final TypeLiteral type;
 
-  @Inject
-  private Injector injector;
+  @Inject private Injector injector;
 
   DynamicMapProvider(TypeLiteral type) {
     this.type = type;
@@ -34,8 +32,7 @@ class DynamicMapProvider implements Provider> {
 
   @Override
   public DynamicMap get() {
-    PrivateInternals_DynamicMapImpl m =
-        new PrivateInternals_DynamicMapImpl<>();
+    PrivateInternals_DynamicMapImpl m = new PrivateInternals_DynamicMapImpl<>();
     List> bindings = injector.findBindingsByType(type);
     if (bindings != null) {
       for (Binding b : bindings) {
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicSet.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicSet.java
index 6eb11bc030..926818e856 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicSet.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicSet.java
@@ -24,7 +24,6 @@ import com.google.inject.internal.UniqueAnnotations;
 import com.google.inject.name.Named;
 import com.google.inject.util.Providers;
 import com.google.inject.util.Types;
-
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
@@ -34,16 +33,17 @@ import java.util.concurrent.atomic.AtomicReference;
 
 /**
  * A set of members that can be modified as plugins reload.
- * 

- * DynamicSets are always mapped as singletons in Guice. Sets store Providers - * internally, and resolve the provider to an instance on demand. This enables - * registrations to decide between singleton and non-singleton members. + * + *

DynamicSets are always mapped as singletons in Guice. Sets store Providers internally, and + * resolve the provider to an instance on demand. This enables registrations to decide between + * singleton and non-singleton members. */ public class DynamicSet implements Iterable { /** * Declare a singleton {@code DynamicSet} with a binder. - *

- * Sets must be defined in a Guice module before they can be bound: + * + *

Sets must be defined in a Guice module before they can be bound: + * *

    *   DynamicSet.setOf(binder(), Interface.class);
    *   DynamicSet.bind(binder(), Interface.class).to(Impl.class);
@@ -59,8 +59,9 @@ public class DynamicSet implements Iterable {
 
   /**
    * Declare a singleton {@code DynamicSet} with a binder.
-   * 

- * Sets must be defined in a Guice module before they can be bound: + * + *

Sets must be defined in a Guice module before they can be bound: + * *

    *   DynamicSet.setOf(binder(), new TypeLiteral<Thing<Foo>>() {});
    * 
@@ -70,12 +71,11 @@ public class DynamicSet implements Iterable { */ public static void setOf(Binder binder, TypeLiteral member) { @SuppressWarnings("unchecked") - Key> key = (Key>) Key.get( - Types.newParameterizedType(DynamicSet.class, member.getType())); + Key> key = + (Key>) + Key.get(Types.newParameterizedType(DynamicSet.class, member.getType())); binder.disableCircularProxies(); - binder.bind(key) - .toProvider(new DynamicSetProvider<>(member)) - .in(Scopes.SINGLETON); + binder.bind(key).toProvider(new DynamicSetProvider<>(member)).in(Scopes.SINGLETON); } /** @@ -107,13 +107,10 @@ public class DynamicSet implements Iterable { * * @param binder a new binder created in the module. * @param type type of entries in the set. - * @param name {@code @Named} annotation to apply instead of a unique - * annotation. + * @param name {@code @Named} annotation to apply instead of a unique annotation. * @return a binder to continue configuring the new set member. */ - public static LinkedBindingBuilder bind(Binder binder, - Class type, - Named name) { + public static LinkedBindingBuilder bind(Binder binder, Class type, Named name) { binder.disableCircularProxies(); return bind(binder, TypeLiteral.get(type)); } @@ -123,20 +120,16 @@ public class DynamicSet implements Iterable { * * @param binder a new binder created in the module. * @param type type of entries in the set. - * @param name {@code @Named} annotation to apply instead of a unique - * annotation. + * @param name {@code @Named} annotation to apply instead of a unique annotation. * @return a binder to continue configuring the new set member. */ - public static LinkedBindingBuilder bind(Binder binder, - TypeLiteral type, - Named name) { + public static LinkedBindingBuilder bind(Binder binder, TypeLiteral type, Named name) { binder.disableCircularProxies(); return binder.bind(type).annotatedWith(name); } public static DynamicSet emptySet() { - return new DynamicSet<>( - Collections.>> emptySet()); + return new DynamicSet<>(Collections.>>emptySet()); } private final CopyOnWriteArrayList>> items; @@ -236,12 +229,12 @@ public class DynamicSet implements Iterable { /** * Add one new element that may be hot-replaceable in the future. * - * @param key unique description from the item's Guice binding. This can be - * later obtained from the registration handle to facilitate matching - * with the new equivalent instance during a hot reload. + * @param key unique description from the item's Guice binding. This can be later obtained from + * the registration handle to facilitate matching with the new equivalent instance during a + * hot reload. * @param item the item to add to the collection right now. Must not be null. - * @return a handle that can remove this item later, or hot-swap the item - * without it ever leaving the collection. + * @return a handle that can remove this item later, or hot-swap the item without it ever leaving + * the collection. */ public ReloadableRegistrationHandle add(Key key, Provider item) { AtomicReference> ref = new AtomicReference<>(item); @@ -254,9 +247,7 @@ public class DynamicSet implements Iterable { private final Key key; private final Provider item; - ReloadableHandle(AtomicReference> ref, - Key key, - Provider item) { + ReloadableHandle(AtomicReference> ref, Key key, Provider item) { this.ref = ref; this.key = key; this.item = item; diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicSetProvider.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicSetProvider.java index d8b027bcef..707c76aa1b 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicSetProvider.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicSetProvider.java @@ -19,7 +19,6 @@ import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Provider; import com.google.inject.TypeLiteral; - import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -28,8 +27,7 @@ import java.util.concurrent.atomic.AtomicReference; class DynamicSetProvider implements Provider> { private final TypeLiteral type; - @Inject - private Injector injector; + @Inject private Injector injector; DynamicSetProvider(TypeLiteral type) { this.type = type; @@ -40,9 +38,7 @@ class DynamicSetProvider implements Provider> { return new DynamicSet<>(find(injector, type)); } - private static List>> find( - Injector src, - TypeLiteral type) { + private static List>> find(Injector src, TypeLiteral type) { List> bindings = src.findBindingsByType(type); int cnt = bindings != null ? bindings.size() : 0; if (cnt == 0) { diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/PrivateInternals_DynamicMapImpl.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/PrivateInternals_DynamicMapImpl.java index e930a69459..5057529c97 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/PrivateInternals_DynamicMapImpl.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/PrivateInternals_DynamicMapImpl.java @@ -20,8 +20,7 @@ import com.google.inject.Provider; /** DO NOT USE */ public class PrivateInternals_DynamicMapImpl extends DynamicMap { - PrivateInternals_DynamicMapImpl() { - } + PrivateInternals_DynamicMapImpl() {} /** * Store one new element into the map. @@ -31,9 +30,7 @@ public class PrivateInternals_DynamicMapImpl extends DynamicMap { * @param item the item to add to the collection. Must not be null. * @return handle to remove the item at a later point in time. */ - public RegistrationHandle put( - String pluginName, String exportName, - final Provider item) { + public RegistrationHandle put(String pluginName, String exportName, final Provider item) { final NamePair key = new NamePair(pluginName, exportName); items.put(key, item); return new RegistrationHandle() { @@ -48,17 +45,14 @@ public class PrivateInternals_DynamicMapImpl extends DynamicMap { * Store one new element that may be hot-replaceable in the future. * * @param pluginName unique name of the plugin providing the export. - * @param key unique description from the item's Guice binding. This can be - * later obtained from the registration handle to facilitate matching - * with the new equivalent instance during a hot reload. The key must - * use an {@link Export} annotation. + * @param key unique description from the item's Guice binding. This can be later obtained from + * the registration handle to facilitate matching with the new equivalent instance during a + * hot reload. The key must use an {@link Export} annotation. * @param item the item to add to the collection right now. Must not be null. - * @return a handle that can remove this item later, or hot-swap the item - * without it ever leaving the collection. + * @return a handle that can remove this item later, or hot-swap the item without it ever leaving + * the collection. */ - public ReloadableRegistrationHandle put( - String pluginName, Key key, - Provider item) { + public ReloadableRegistrationHandle put(String pluginName, Key key, Provider item) { String exportName = ((Export) key.getAnnotation()).value(); NamePair np = new NamePair(pluginName, exportName); items.put(np, item); diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/PrivateInternals_DynamicTypes.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/PrivateInternals_DynamicTypes.java index 683e0b9d8c..e606079345 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/PrivateInternals_DynamicTypes.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/PrivateInternals_DynamicTypes.java @@ -20,7 +20,6 @@ import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Key; import com.google.inject.TypeLiteral; - import java.lang.reflect.ParameterizedType; import java.util.ArrayList; import java.util.Collections; @@ -36,7 +35,8 @@ public class PrivateInternals_DynamicTypes { TypeLiteral type = e.getKey().getTypeLiteral(); if (type.getRawType() == DynamicItem.class) { ParameterizedType p = (ParameterizedType) type.getType(); - m.put(TypeLiteral.get(p.getActualTypeArguments()[0]), + m.put( + TypeLiteral.get(p.getActualTypeArguments()[0]), (DynamicItem) e.getValue().getProvider().get()); } } @@ -52,7 +52,8 @@ public class PrivateInternals_DynamicTypes { TypeLiteral type = e.getKey().getTypeLiteral(); if (type.getRawType() == DynamicSet.class) { ParameterizedType p = (ParameterizedType) type.getType(); - m.put(TypeLiteral.get(p.getActualTypeArguments()[0]), + m.put( + TypeLiteral.get(p.getActualTypeArguments()[0]), (DynamicSet) e.getValue().getProvider().get()); } } @@ -68,7 +69,8 @@ public class PrivateInternals_DynamicTypes { TypeLiteral type = e.getKey().getTypeLiteral(); if (type.getRawType() == DynamicMap.class) { ParameterizedType p = (ParameterizedType) type.getType(); - m.put(TypeLiteral.get(p.getActualTypeArguments()[0]), + m.put( + TypeLiteral.get(p.getActualTypeArguments()[0]), (DynamicMap) e.getValue().getProvider().get()); } } @@ -79,8 +81,7 @@ public class PrivateInternals_DynamicTypes { } public static List attachItems( - Injector src, - Map, DynamicItem> items, String pluginName) { + Injector src, Map, DynamicItem> items, String pluginName) { if (src == null || items == null || items.isEmpty()) { return Collections.emptyList(); } @@ -106,8 +107,7 @@ public class PrivateInternals_DynamicTypes { } public static List attachSets( - Injector src, - Map, DynamicSet> sets) { + Injector src, Map, DynamicSet> sets) { if (src == null || sets == null || sets.isEmpty()) { return Collections.emptyList(); } @@ -135,9 +135,7 @@ public class PrivateInternals_DynamicTypes { } public static List attachMaps( - Injector src, - String groupName, - Map, DynamicMap> maps) { + Injector src, String groupName, Map, DynamicMap> maps) { if (src == null || maps == null || maps.isEmpty()) { return Collections.emptyList(); } @@ -169,8 +167,7 @@ public class PrivateInternals_DynamicTypes { return new LifecycleListener() { private List handles; - @Inject - private Injector self; + @Inject private Injector self; @Override public void start() { diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/AcceptsCreate.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/AcceptsCreate.java index 506f281d34..ba99a7d16f 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/AcceptsCreate.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/AcceptsCreate.java @@ -16,9 +16,9 @@ package com.google.gerrit.extensions.restapi; /** * Optional interface for {@link RestCollection}. - *

- * Collections that implement this interface can accept a {@code PUT} or - * {@code POST} when the parse method throws {@link ResourceNotFoundException}. + * + *

Collections that implement this interface can accept a {@code PUT} or {@code POST} when the + * parse method throws {@link ResourceNotFoundException}. */ public interface AcceptsCreate

{ /** @@ -26,8 +26,8 @@ public interface AcceptsCreate

{ * * @param parent parent collection handle. * @param id id of the resource being created. - * @return a view to perform the creation. The create method must embed the id - * into the newly returned view object, as it will not be passed. + * @return a view to perform the creation. The create method must embed the id into the newly + * returned view object, as it will not be passed. * @throws RestApiException the view cannot be constructed. */ RestModifyView create(P parent, IdString id) throws RestApiException; diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/AcceptsDelete.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/AcceptsDelete.java index 2f615c12d6..eb30140e20 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/AcceptsDelete.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/AcceptsDelete.java @@ -14,12 +14,11 @@ package com.google.gerrit.extensions.restapi; - /** * Optional interface for {@link RestCollection}. - *

- * Collections that implement this interface can accept a {@code DELETE} directly - * on the collection itself. + * + *

Collections that implement this interface can accept a {@code DELETE} directly on the + * collection itself. */ public interface AcceptsDelete

{ /** @@ -30,6 +29,5 @@ public interface AcceptsDelete

{ * @return a view to perform the deletion. * @throws RestApiException the view cannot be constructed. */ - RestModifyView delete(P parent, IdString id) - throws RestApiException; + RestModifyView delete(P parent, IdString id) throws RestApiException; } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/AcceptsPost.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/AcceptsPost.java index 470ea83fa5..ababfcbee5 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/AcceptsPost.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/AcceptsPost.java @@ -16,20 +16,19 @@ package com.google.gerrit.extensions.restapi; /** * Optional interface for {@link RestCollection}. - *

- * Collections that implement this interface can accept a {@code POST} directly - * on the collection itself when no id was given in the path. This interface is - * intended to be used with TopLevelResource collections. Nested collections - * often bind POST on the parent collection to the view implementation handling - * the insertion of a new member. + * + *

Collections that implement this interface can accept a {@code POST} directly on the collection + * itself when no id was given in the path. This interface is intended to be used with + * TopLevelResource collections. Nested collections often bind POST on the parent collection to the + * view implementation handling the insertion of a new member. */ public interface AcceptsPost

{ /** * Handle creation of a child resource by POST on the collection. * * @param parent parent collection handle. - * @return a view to perform the creation. The id of the newly created - * resource should be determined from the input body. + * @return a view to perform the creation. The id of the newly created resource should be + * determined from the input body. * @throws RestApiException the view cannot be constructed. */ RestModifyView post(P parent) throws RestApiException; diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/BinaryResult.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/BinaryResult.java index 4fc9ab6014..bdddfd903c 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/BinaryResult.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/BinaryResult.java @@ -29,11 +29,10 @@ import java.nio.charset.UnsupportedCharsetException; /** * Wrapper around a non-JSON result from a {@link RestView}. - *

- * Views may return this type to signal they want the server glue to write raw - * data to the client, instead of attempting automatic conversion to JSON. The - * create form is overloaded to handle plain text from a String, or binary data - * from a {@code byte[]} or {@code InputSteam}. + * + *

Views may return this type to signal they want the server glue to write raw data to the + * client, instead of attempting automatic conversion to JSON. The create form is overloaded to + * handle plain text from a String, or binary data from a {@code byte[]} or {@code InputSteam}. */ public abstract class BinaryResult implements Closeable { /** Default MIME type for unknown binary data. */ @@ -50,9 +49,8 @@ public abstract class BinaryResult implements Closeable { } /** - * Produce an {@code application/octet-stream} of unknown length by copying - * the InputStream until EOF. The server glue will automatically close this - * stream when copying is complete. + * Produce an {@code application/octet-stream} of unknown length by copying the InputStream until + * EOF. The server glue will automatically close this stream when copying is complete. */ public static BinaryResult create(InputStream data) { return new Stream(data); @@ -138,22 +136,21 @@ public abstract class BinaryResult implements Closeable { /** * Write or copy the result onto the specified output stream. * - * @param os stream to write result data onto. This stream will be closed by - * the caller after this method returns. - * @throws IOException if the data cannot be produced, or the OutputStream - * {@code os} throws any IOException during a write or flush call. + * @param os stream to write result data onto. This stream will be closed by the caller after this + * method returns. + * @throws IOException if the data cannot be produced, or the OutputStream {@code os} throws any + * IOException during a write or flush call. */ public abstract void writeTo(OutputStream os) throws IOException; /** * Return a copy of the result as a String. - *

- * The default version of this method copies the result into a temporary byte - * array and then tries to decode it using the configured encoding. + * + *

The default version of this method copies the result into a temporary byte array and then + * tries to decode it using the configured encoding. * * @return string version of the result. - * @throws IOException if the data cannot be produced or could not be - * decoded to a String. + * @throws IOException if the data cannot be produced or could not be decoded to a String. */ public String asString() throws IOException { long len = getContentLength(); @@ -169,8 +166,7 @@ public abstract class BinaryResult implements Closeable { /** Close the result and release any resources it holds. */ @Override - public void close() throws IOException { - } + public void close() throws IOException {} @Override public String toString() { @@ -180,20 +176,17 @@ public abstract class BinaryResult implements Closeable { getContentType(), getContentLength()); } return String.format( - "BinaryResult[Content-Type: %s, Content-Length: unknown]", - getContentType()); + "BinaryResult[Content-Type: %s, Content-Length: unknown]", getContentType()); } private static String decode(byte[] data, Charset enc) { try { - Charset cs = enc != null - ? enc - : UTF_8; + Charset cs = enc != null ? enc : UTF_8; return cs.newDecoder() - .onMalformedInput(CodingErrorAction.REPORT) - .onUnmappableCharacter(CodingErrorAction.REPORT) - .decode(ByteBuffer.wrap(data)) - .toString(); + .onMalformedInput(CodingErrorAction.REPORT) + .onUnmappableCharacter(CodingErrorAction.REPORT) + .decode(ByteBuffer.wrap(data)) + .toString(); } catch (UnsupportedCharsetException | CharacterCodingException e) { // Fallback to ISO-8850-1 style encoding. StringBuilder r = new StringBuilder(data.length); diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/CacheControl.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/CacheControl.java index d71732bf96..eda0cd5c30 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/CacheControl.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/CacheControl.java @@ -20,7 +20,9 @@ public class CacheControl { public enum Type { @SuppressWarnings("hiding") - NONE, PUBLIC, PRIVATE + NONE, + PUBLIC, + PRIVATE } public static final CacheControl NONE = new CacheControl(Type.NONE, 0, null); diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/ChildCollection.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/ChildCollection.java index 3bad9f807a..59aecc14c5 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/ChildCollection.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/ChildCollection.java @@ -14,7 +14,6 @@ package com.google.gerrit.extensions.restapi; - /** * Nested collection of {@link RestResource}s below a parent. * @@ -22,5 +21,4 @@ package com.google.gerrit.extensions.restapi; * @param type of resource operated on by each view. */ public interface ChildCollection

- extends RestView

, RestCollection { -} + extends RestView

, RestCollection {} diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/DefaultInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/DefaultInput.java index 83342d2aec..e26ce1fb1b 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/DefaultInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/DefaultInput.java @@ -23,5 +23,4 @@ import java.lang.annotation.Target; /** Applied to a String field to indicate the default input parameter. */ @Target({ElementType.FIELD}) @Retention(RUNTIME) -public @interface DefaultInput { -} +public @interface DefaultInput {} diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/ETagView.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/ETagView.java index 3b328294be..9ac170632a 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/ETagView.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/ETagView.java @@ -14,9 +14,7 @@ package com.google.gerrit.extensions.restapi; -/** - * A view which may change, although the underlying resource did not change - */ +/** A view which may change, although the underlying resource did not change */ public interface ETagView extends RestReadView { String getETag(R rsrc); } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/IdString.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/IdString.java index f0f7dea35c..58be3221a2 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/IdString.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/IdString.java @@ -16,8 +16,8 @@ package com.google.gerrit.extensions.restapi; /** * Resource identifier split out from a URL. - *

- * Identifiers are URL encoded and usually need to be decoded. + * + *

Identifiers are URL encoded and usually need to be decoded. */ public class IdString { /** Construct an identifier from an already encoded string. */ diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/MergeConflictException.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/MergeConflictException.java index a67db0f7bd..06d9024a8d 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/MergeConflictException.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/MergeConflictException.java @@ -16,8 +16,8 @@ package com.google.gerrit.extensions.restapi; /** * Indicates that a commit cannot be merged without conflicts. - *

- * Messages should be viewable by end users. + * + *

Messages should be viewable by end users. */ public class MergeConflictException extends ResourceConflictException { private static final long serialVersionUID = 1L; diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/NeedsParams.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/NeedsParams.java index 28dcc99edd..c6e215189d 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/NeedsParams.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/NeedsParams.java @@ -18,9 +18,8 @@ import com.google.common.collect.ListMultimap; /** * Optional interface for {@link RestCollection}. - *

- * Collections that implement this interface can get to know about the request - * parameters. + * + *

Collections that implement this interface can get to know about the request parameters. */ public interface NeedsParams { /** diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/PreconditionFailedException.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/PreconditionFailedException.java index 86204c8a78..1fa6cd021c 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/PreconditionFailedException.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/PreconditionFailedException.java @@ -14,14 +14,11 @@ package com.google.gerrit.extensions.restapi; -/** - * Resource state does not match request state (HTTP 412 Precondition failed). - */ +/** Resource state does not match request state (HTTP 412 Precondition failed). */ public class PreconditionFailedException extends RestApiException { private static final long serialVersionUID = 1L; - public PreconditionFailedException() { - } + public PreconditionFailedException() {} /** @param msg message to return to the client describing the error. */ public PreconditionFailedException(String msg) { diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RawInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RawInput.java index 4f195e48b9..37e11b26a2 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RawInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RawInput.java @@ -20,6 +20,8 @@ import java.io.InputStream; /** Raw data stream supplied by the body of a PUT or POST. */ public interface RawInput { String getContentType(); + long getContentLength(); + InputStream getInputStream() throws IOException; } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/ResourceConflictException.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/ResourceConflictException.java index aa503c16ce..a57accccea 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/ResourceConflictException.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/ResourceConflictException.java @@ -16,11 +16,11 @@ package com.google.gerrit.extensions.restapi; /** * Resource state does not permit requested operation (HTTP 409 Conflict). - *

- * {@link RestModifyView} implementations may fail with this exception when the - * named resource does not permit the modification to take place at this time. - * An example use is trying to abandon a change that is already merged. The - * change cannot be abandoned once merged so an operation would throw. + * + *

{@link RestModifyView} implementations may fail with this exception when the named resource + * does not permit the modification to take place at this time. An example use is trying to abandon + * a change that is already merged. The change cannot be abandoned once merged so an operation would + * throw. */ public class ResourceConflictException extends RestApiException { private static final long serialVersionUID = 1L; diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/ResourceNotFoundException.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/ResourceNotFoundException.java index 611812ae6a..e67682878b 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/ResourceNotFoundException.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/ResourceNotFoundException.java @@ -19,8 +19,7 @@ public class ResourceNotFoundException extends RestApiException { private static final long serialVersionUID = 1L; /** Requested resource is not found, failing portion not specified. */ - public ResourceNotFoundException() { - } + public ResourceNotFoundException() {} public ResourceNotFoundException(String msg) { super(msg); diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/Response.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/Response.java index 633efeaf27..8f2dd5fea1 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/Response.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/Response.java @@ -27,8 +27,7 @@ public abstract class Response { } public static Response withMustRevalidate(T value) { - return ok(value).caching( - CacheControl.PRIVATE(0, TimeUnit.SECONDS).setMustRevalidate()); + return ok(value).caching(CacheControl.PRIVATE(0, TimeUnit.SECONDS).setMustRevalidate()); } /** HTTP 201 Created: typically used when a new resource is made. */ @@ -66,10 +65,15 @@ public abstract class Response { } public abstract boolean isNone(); + public abstract int statusCode(); + public abstract T value(); + public abstract CacheControl caching(); + public abstract Response caching(CacheControl c); + @Override public abstract String toString(); @@ -116,8 +120,7 @@ public abstract class Response { } private static final class None extends Response { - private None() { - } + private None() {} @Override public boolean isNone() { @@ -169,8 +172,7 @@ public abstract class Response { @Override public boolean equals(Object o) { - return o instanceof Redirect - && ((Redirect) o).location.equals(location); + return o instanceof Redirect && ((Redirect) o).location.equals(location); } @Override @@ -198,8 +200,7 @@ public abstract class Response { @Override public boolean equals(Object o) { - return o instanceof Accepted - && ((Accepted) o).location.equals(location); + return o instanceof Accepted && ((Accepted) o).location.equals(location); } @Override diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestApiException.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestApiException.java index b6ba730b8a..28398a412c 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestApiException.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestApiException.java @@ -19,8 +19,7 @@ public class RestApiException extends Exception { private static final long serialVersionUID = 1L; private CacheControl caching = CacheControl.NONE; - public RestApiException() { - } + public RestApiException() {} public RestApiException(String msg) { super(msg); diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestApiModule.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestApiModule.java index 3567300d31..0db28917b8 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestApiModule.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestApiModule.java @@ -29,56 +29,49 @@ public abstract class RestApiModule extends FactoryModule { protected static final String DELETE = "DELETE"; protected static final String POST = "POST"; - protected - ReadViewBinder get(TypeLiteral> viewType) { + protected ReadViewBinder get(TypeLiteral> viewType) { return new ReadViewBinder<>(view(viewType, GET, "/")); } - protected - ModifyViewBinder put(TypeLiteral> viewType) { + protected ModifyViewBinder put(TypeLiteral> viewType) { return new ModifyViewBinder<>(view(viewType, PUT, "/")); } - protected - ModifyViewBinder post(TypeLiteral> viewType) { + protected ModifyViewBinder post(TypeLiteral> viewType) { return new ModifyViewBinder<>(view(viewType, POST, "/")); } - protected - ModifyViewBinder delete(TypeLiteral> viewType) { + protected ModifyViewBinder delete(TypeLiteral> viewType) { return new ModifyViewBinder<>(view(viewType, DELETE, "/")); } - protected - ReadViewBinder get(TypeLiteral> viewType, String name) { + protected ReadViewBinder get( + TypeLiteral> viewType, String name) { return new ReadViewBinder<>(view(viewType, GET, name)); } - protected - ModifyViewBinder put(TypeLiteral> viewType, String name) { + protected ModifyViewBinder put( + TypeLiteral> viewType, String name) { return new ModifyViewBinder<>(view(viewType, PUT, name)); } - protected - ModifyViewBinder post(TypeLiteral> viewType, String name) { + protected ModifyViewBinder post( + TypeLiteral> viewType, String name) { return new ModifyViewBinder<>(view(viewType, POST, name)); } - protected - ModifyViewBinder delete(TypeLiteral> viewType, String name) { + protected ModifyViewBinder delete( + TypeLiteral> viewType, String name) { return new ModifyViewBinder<>(view(viewType, DELETE, name)); } - protected

- ChildCollectionBinder

child(TypeLiteral> type, String name) { + protected

ChildCollectionBinder

child( + TypeLiteral> type, String name) { return new ChildCollectionBinder<>(view(type, GET, name)); } - protected - LinkedBindingBuilder> view( - TypeLiteral> viewType, - String method, - String name) { + protected LinkedBindingBuilder> view( + TypeLiteral> viewType, String method, String name) { return bind(viewType).annotatedWith(export(method, name)); } @@ -99,23 +92,21 @@ public abstract class RestApiModule extends FactoryModule { this.binder = binder; } - public > - ScopedBindingBuilder to(Class impl) { + public > ScopedBindingBuilder to(Class impl) { return binder.to(impl); } - public > - void toInstance(T impl) { + public > void toInstance(T impl) { binder.toInstance(impl); } - public > - ScopedBindingBuilder toProvider(Class> providerType) { + public > ScopedBindingBuilder toProvider( + Class> providerType) { return binder.toProvider(providerType); } - public > - ScopedBindingBuilder toProvider(Provider provider) { + public > ScopedBindingBuilder toProvider( + Provider provider) { return binder.toProvider(provider); } } @@ -127,23 +118,21 @@ public abstract class RestApiModule extends FactoryModule { this.binder = binder; } - public > - ScopedBindingBuilder to(Class impl) { + public > ScopedBindingBuilder to(Class impl) { return binder.to(impl); } - public > - void toInstance(T impl) { + public > void toInstance(T impl) { binder.toInstance(impl); } - public > - ScopedBindingBuilder toProvider(Class> providerType) { + public > ScopedBindingBuilder toProvider( + Class> providerType) { return binder.toProvider(providerType); } - public > - ScopedBindingBuilder toProvider(Provider provider) { + public > ScopedBindingBuilder toProvider( + Provider provider) { return binder.toProvider(provider); } } @@ -155,23 +144,22 @@ public abstract class RestApiModule extends FactoryModule { this.binder = binder; } - public > - ScopedBindingBuilder to(Class impl) { + public > ScopedBindingBuilder to( + Class impl) { return binder.to(impl); } - public > - void toInstance(T impl) { + public > void toInstance(T impl) { binder.toInstance(impl); } public > - ScopedBindingBuilder toProvider(Class> providerType) { + ScopedBindingBuilder toProvider(Class> providerType) { return binder.toProvider(providerType); } public > - ScopedBindingBuilder toProvider(Provider provider) { + ScopedBindingBuilder toProvider(Provider provider) { return binder.toProvider(provider); } } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestCollection.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestCollection.java index 96d0dbf129..46a4984b58 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestCollection.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestCollection.java @@ -18,9 +18,9 @@ import com.google.gerrit.extensions.registration.DynamicMap; /** * A collection of resources accessible through a REST API. - *

- * To build a collection declare a resource, the map in a module, and the - * collection itself accepting the map: + * + *

To build a collection declare a resource, the map in a module, and the collection itself + * accepting the map: * *

  * public class MyResource implements RestResource {
@@ -51,19 +51,18 @@ import com.google.gerrit.extensions.registration.DynamicMap;
  * }
  * 
* - *

- * To build a nested collection, implement {@link ChildCollection}. + *

To build a nested collection, implement {@link ChildCollection}. * - * @param

type of the parent resource. For a top level collection this - * should always be {@link TopLevelResource}. + * @param

type of the parent resource. For a top level collection this should always be {@link + * TopLevelResource}. * @param type of resource operated on by each view. */ public interface RestCollection

{ /** * Create a view to list the contents of the collection. - *

- * The returned view should accept the parent type to scope the search, and - * may want to take a "q" parameter option to narrow the results. + * + *

The returned view should accept the parent type to scope the search, and may want to take a + * "q" parameter option to narrow the results. * * @return view to list the collection. * @throws ResourceNotFoundException if the collection cannot be listed. @@ -75,20 +74,20 @@ public interface RestCollection

* Parse a path component into a resource handle. * * @param parent the handle to the collection. - * @param id string identifier supplied by the client. In a URL such as - * {@code /changes/1234/abandon} this string is {@code "1234"}. + * @param id string identifier supplied by the client. In a URL such as {@code + * /changes/1234/abandon} this string is {@code "1234"}. * @return a resource handle for the identified object. - * @throws ResourceNotFoundException the object does not exist, or the caller - * is not permitted to know if the resource exists. - * @throws Exception if the implementation had any errors converting to a - * resource handle. This results in an HTTP 500 Internal Server Error. + * @throws ResourceNotFoundException the object does not exist, or the caller is not permitted to + * know if the resource exists. + * @throws Exception if the implementation had any errors converting to a resource handle. This + * results in an HTTP 500 Internal Server Error. */ R parse(P parent, IdString id) throws ResourceNotFoundException, Exception; /** * Get the views that support this collection. - *

- * Within a resource the views are accessed as {@code RESOURCE/plugin~view}. + * + *

Within a resource the views are accessed as {@code RESOURCE/plugin~view}. * * @return map of views. */ diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestModifyView.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestModifyView.java index 2fa0278b7f..79053dd5a1 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestModifyView.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestModifyView.java @@ -16,10 +16,10 @@ package com.google.gerrit.extensions.restapi; /** * RestView that supports accepting input and changing a resource. - *

- * The input must be supplied as JSON as the body of the HTTP request. Modify - * views can be invoked by any HTTP method that is not {@code GET}, which - * includes {@code POST}, {@code PUT}, {@code DELETE}. + * + *

The input must be supplied as JSON as the body of the HTTP request. Modify views can be + * invoked by any HTTP method that is not {@code GET}, which includes {@code POST}, {@code PUT}, + * {@code DELETE}. * * @param type of the resource the view modifies. * @param type of input the JSON parser will parse the input into. @@ -30,17 +30,16 @@ public interface RestModifyView extends RestView { * * @param resource resource to modify. * @param input input after parsing from request. - * @return result to return to the client. Use {@link BinaryResult} to avoid - * automatic conversion to JSON. + * @return result to return to the client. Use {@link BinaryResult} to avoid automatic conversion + * to JSON. * @throws AuthException the client is not permitted to access this view. - * @throws BadRequestException the request was incorrectly specified and - * cannot be handled by this view. - * @throws ResourceConflictException the resource state does not permit this - * view to make the changes at this time. - * @throws Exception the implementation of the view failed. The exception will - * be logged and HTTP 500 Internal Server Error will be returned to - * the client. + * @throws BadRequestException the request was incorrectly specified and cannot be handled by this + * view. + * @throws ResourceConflictException the resource state does not permit this view to make the + * changes at this time. + * @throws Exception the implementation of the view failed. The exception will be logged and HTTP + * 500 Internal Server Error will be returned to the client. */ - Object apply(R resource, I input) throws AuthException, BadRequestException, - ResourceConflictException, Exception; + Object apply(R resource, I input) + throws AuthException, BadRequestException, ResourceConflictException, Exception; } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestReadView.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestReadView.java index 21e9ee040d..a3c31d3b71 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestReadView.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestReadView.java @@ -24,17 +24,16 @@ public interface RestReadView extends RestView { * Process the view operation by reading from the resource. * * @param resource resource to read. - * @return result to return to the client. Use {@link BinaryResult} to avoid - * automatic conversion to JSON. + * @return result to return to the client. Use {@link BinaryResult} to avoid automatic conversion + * to JSON. * @throws AuthException the client is not permitted to access this view. - * @throws BadRequestException the request was incorrectly specified and - * cannot be handled by this view. - * @throws ResourceConflictException the resource state does not permit this - * view to make the changes at this time. - * @throws Exception the implementation of the view failed. The exception will - * be logged and HTTP 500 Internal Server Error will be returned to - * the client. + * @throws BadRequestException the request was incorrectly specified and cannot be handled by this + * view. + * @throws ResourceConflictException the resource state does not permit this view to make the + * changes at this time. + * @throws Exception the implementation of the view failed. The exception will be logged and HTTP + * 500 Internal Server Error will be returned to the client. */ - Object apply(R resource) throws AuthException, BadRequestException, - ResourceConflictException, Exception; + Object apply(R resource) + throws AuthException, BadRequestException, ResourceConflictException, Exception; } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestResource.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestResource.java index 29c824f332..cc5d48d43b 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestResource.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestResource.java @@ -18,18 +18,15 @@ import java.sql.Timestamp; /** * Generic resource handle defining arguments to views. - *

- * Resource handle returned by {@link RestCollection} and passed to a - * {@link RestView} such as {@link RestReadView} or {@link RestModifyView}. + * + *

Resource handle returned by {@link RestCollection} and passed to a {@link RestView} such as + * {@link RestReadView} or {@link RestModifyView}. */ public interface RestResource { /** A resource with a last modification date. */ public interface HasLastModified { - /** - * @return time for the Last-Modified header. HTTP truncates the header - * value to seconds. - */ + /** @return time for the Last-Modified header. HTTP truncates the header value to seconds. */ Timestamp getLastModified(); } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestView.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestView.java index 36adf34814..447b959b58 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestView.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestView.java @@ -15,8 +15,7 @@ package com.google.gerrit.extensions.restapi; /** - * Any type of view, see {@link RestReadView} for reads, {@link RestModifyView} - * for updates, and {@link RestCollection} for nested collections. + * Any type of view, see {@link RestReadView} for reads, {@link RestModifyView} for updates, and + * {@link RestCollection} for nested collections. */ -public interface RestView { -} +public interface RestView {} diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/TopLevelResource.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/TopLevelResource.java index 8ddd2077c3..1c50f426e2 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/TopLevelResource.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/TopLevelResource.java @@ -18,6 +18,5 @@ package com.google.gerrit.extensions.restapi; public class TopLevelResource implements RestResource { public static final TopLevelResource INSTANCE = new TopLevelResource(); - private TopLevelResource() { - } + private TopLevelResource() {} } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/UnprocessableEntityException.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/UnprocessableEntityException.java index b63697f6f0..9ed83b2d17 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/UnprocessableEntityException.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/UnprocessableEntityException.java @@ -18,7 +18,7 @@ package com.google.gerrit.extensions.restapi; public class UnprocessableEntityException extends RestApiException { private static final long serialVersionUID = 1L; - public UnprocessableEntityException(String msg) { + public UnprocessableEntityException(String msg) { super(msg); } } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/Url.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/Url.java index debfa20ad3..9c69376eae 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/Url.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/Url.java @@ -24,17 +24,18 @@ import java.net.URLEncoder; public final class Url { /** * Encode a path segment, escaping characters not valid for a URL. - *

- * The following characters are not escaped: + * + *

The following characters are not escaped: + * *

    - *
  • {@code a..z, A..Z, 0..9} - *
  • {@code . - * _} + *
  • {@code a..z, A..Z, 0..9} + *
  • {@code . - * _} *
- *

- * ' ' (space) is encoded as '+'. - *

- * All other characters (including '/') are converted to the triplet "%xy" - * where "xy" is the hex representation of the character in UTF-8. + * + *

' ' (space) is encoded as '+'. + * + *

All other characters (including '/') are converted to the triplet "%xy" where "xy" is the + * hex representation of the character in UTF-8. * * @param component a string containing text to encode. * @return a string with all invalid URL characters escaped. @@ -62,6 +63,5 @@ public final class Url { return null; } - private Url() { - } + private Url() {} } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/systemstatus/MessageOfTheDay.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/systemstatus/MessageOfTheDay.java index 033e7b480f..180a0e6635 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/systemstatus/MessageOfTheDay.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/systemstatus/MessageOfTheDay.java @@ -15,7 +15,6 @@ package com.google.gerrit.extensions.systemstatus; import com.google.gerrit.extensions.annotations.ExtensionPoint; - import java.util.Calendar; import java.util.Date; import java.util.TimeZone; @@ -38,22 +37,17 @@ public abstract class MessageOfTheDay { /** * Unique identifier for this message. - *

- * Messages with the same identifier will be hidden from the user until - * redisplay has occurred. - *

* - * @return unique message identifier. This identifier should be unique within - * the server. + *

Messages with the same identifier will be hidden from the user until redisplay has occurred. + * + * @return unique message identifier. This identifier should be unique within the server. */ public abstract String getMessageId(); /** * When should the message be displayed? * - *

- * Default implementation returns {@code tomorrow at 00:00:00 GMT}. - *

+ *

Default implementation returns {@code tomorrow at 00:00:00 GMT}. * * @return a future date after which the message should be redisplayed. */ diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/systemstatus/ServerInformation.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/systemstatus/ServerInformation.java index 45aec57f85..ffbbadf5da 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/systemstatus/ServerInformation.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/systemstatus/ServerInformation.java @@ -19,21 +19,20 @@ public interface ServerInformation { /** Current state of the server. */ enum State { /** - * The server is starting up, and network connections are not yet being - * accepted. Plugins or extensions starting during this time are starting - * for the first time in this process. + * The server is starting up, and network connections are not yet being accepted. Plugins or + * extensions starting during this time are starting for the first time in this process. */ STARTUP, /** - * The server is running and handling requests. Plugins starting during this - * state may be reloading, or being installed into a running system. + * The server is running and handling requests. Plugins starting during this state may be + * reloading, or being installed into a running system. */ RUNNING, /** - * The server is attempting a graceful halt of operations and will exit (or - * be killed by the operating system) soon. + * The server is attempting a graceful halt of operations and will exit (or be killed by the + * operating system) soon. */ SHUTDOWN } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/BranchWebLink.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/BranchWebLink.java index 2a11012428..4b9676eb16 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/BranchWebLink.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/BranchWebLink.java @@ -21,18 +21,18 @@ import com.google.gerrit.extensions.common.WebLinkInfo; public interface BranchWebLink extends WebLink { /** - * {@link com.google.gerrit.extensions.common.WebLinkInfo} - * describing a link from a branch to an external service. + * {@link com.google.gerrit.extensions.common.WebLinkInfo} describing a link from a branch to an + * external service. * - *

In order for the web link to be visible - * {@link com.google.gerrit.extensions.common.WebLinkInfo#url} - * and {@link com.google.gerrit.extensions.common.WebLinkInfo#name} - * must be set.

+ *

In order for the web link to be visible {@link + * com.google.gerrit.extensions.common.WebLinkInfo#url} and {@link + * com.google.gerrit.extensions.common.WebLinkInfo#name} must be set. + * + *

* * @param projectName Name of the project * @param branchName Name of the branch - * @return WebLinkInfo that links to branch in external service, - * null if there should be no link. + * @return WebLinkInfo that links to branch in external service, null if there should be no link. */ WebLinkInfo getBranchWebLink(String projectName, String branchName); } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/DiffWebLink.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/DiffWebLink.java index ad535194ad..ab9eef7c06 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/DiffWebLink.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/DiffWebLink.java @@ -21,27 +21,33 @@ import com.google.gerrit.extensions.common.DiffWebLinkInfo; public interface DiffWebLink extends WebLink { /** - * {@link com.google.gerrit.extensions.common.DiffWebLinkInfo} - * describing a link from a file diff to an external service. + * {@link com.google.gerrit.extensions.common.DiffWebLinkInfo} describing a link from a file diff + * to an external service. * - *

In order for the web link to be visible - * {@link com.google.gerrit.extensions.common.WebLinkInfo#url} - * and {@link com.google.gerrit.extensions.common.WebLinkInfo#name} - * must be set.

+ *

In order for the web link to be visible {@link + * com.google.gerrit.extensions.common.WebLinkInfo#url} and {@link + * com.google.gerrit.extensions.common.WebLinkInfo#name} must be set. + * + *

* * @param projectName Name of the project * @param changeId ID of the change - * @param patchSetIdA Patch set ID of side A, null if no base - * patch set was selected + * @param patchSetIdA Patch set ID of side A, null if no base patch set was selected * @param revisionA Name of the revision of side A (e.g. branch or commit ID) * @param fileNameA Name of the file of side A * @param patchSetIdB Patch set ID of side B * @param revisionB Name of the revision of side B (e.g. branch or commit ID) * @param fileNameB Name of the file of side B - * @return WebLinkInfo that links to file diff in external service, - * null if there should be no link. + * @return WebLinkInfo that links to file diff in external service, null if there should be no + * link. */ - DiffWebLinkInfo getDiffLink(String projectName, int changeId, - Integer patchSetIdA, String revisionA, String fileNameA, - int patchSetIdB, String revisionB, String fileNameB); + DiffWebLinkInfo getDiffLink( + String projectName, + int changeId, + Integer patchSetIdA, + String revisionA, + String fileNameA, + int patchSetIdB, + String revisionB, + String fileNameB); } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/FileHistoryWebLink.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/FileHistoryWebLink.java index f9f9e58059..b3b09985ca 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/FileHistoryWebLink.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/FileHistoryWebLink.java @@ -18,20 +18,20 @@ import com.google.gerrit.extensions.common.WebLinkInfo; public interface FileHistoryWebLink extends WebLink { /** - * {@link com.google.gerrit.extensions.common.WebLinkInfo} - * describing a link from a file to an external service displaying - * a log for that file. + * {@link com.google.gerrit.extensions.common.WebLinkInfo} describing a link from a file to an + * external service displaying a log for that file. * - *

In order for the web link to be visible - * {@link com.google.gerrit.extensions.common.WebLinkInfo#url} - * and {@link com.google.gerrit.extensions.common.WebLinkInfo#name} - * must be set.

+ *

In order for the web link to be visible {@link + * com.google.gerrit.extensions.common.WebLinkInfo#url} and {@link + * com.google.gerrit.extensions.common.WebLinkInfo#name} must be set. + * + *

* * @param projectName Name of the project * @param revision Name of the revision (e.g. branch or commit ID) * @param fileName Name of the file - * @return WebLinkInfo that links to a log for the file in external - * service, null if there should be no link. + * @return WebLinkInfo that links to a log for the file in external service, null if there should + * be no link. */ WebLinkInfo getFileHistoryWebLink(String projectName, String revision, String fileName); } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/FileWebLink.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/FileWebLink.java index 9136b36da0..c03d606a27 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/FileWebLink.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/FileWebLink.java @@ -21,19 +21,19 @@ import com.google.gerrit.extensions.common.WebLinkInfo; public interface FileWebLink extends WebLink { /** - * {@link com.google.gerrit.extensions.common.WebLinkInfo} - * describing a link from a file to an external service. + * {@link com.google.gerrit.extensions.common.WebLinkInfo} describing a link from a file to an + * external service. * - *

In order for the web link to be visible - * {@link com.google.gerrit.extensions.common.WebLinkInfo#url} - * and {@link com.google.gerrit.extensions.common.WebLinkInfo#name} - * must be set.

+ *

In order for the web link to be visible {@link + * com.google.gerrit.extensions.common.WebLinkInfo#url} and {@link + * com.google.gerrit.extensions.common.WebLinkInfo#name} must be set. + * + *

* * @param projectName Name of the project * @param revision Name of the revision (e.g. branch or commit ID) * @param fileName Name of the file - * @return WebLinkInfo that links to project in external service, - * null if there should be no link. + * @return WebLinkInfo that links to project in external service, null if there should be no link. */ WebLinkInfo getFileWebLink(String projectName, String revision, String fileName); } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/GwtPlugin.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/GwtPlugin.java index e741a3f94d..e8041c4978 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/GwtPlugin.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/GwtPlugin.java @@ -19,8 +19,8 @@ public class GwtPlugin extends WebUiPlugin { private final String moduleName; /** - * @param moduleName name of GWT module. The resource - * {@code static/$MODULE/$MODULE.nocache.js} will be used. + * @param moduleName name of GWT module. The resource {@code static/$MODULE/$MODULE.nocache.js} + * will be used. */ public GwtPlugin(String moduleName) { this.moduleName = moduleName; diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/JavaScriptPlugin.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/JavaScriptPlugin.java index 4619a06a66..9517c347ff 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/JavaScriptPlugin.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/JavaScriptPlugin.java @@ -22,8 +22,8 @@ public class JavaScriptPlugin extends WebUiPlugin { private final String fileName; /** - * @param fileName of JavaScript source file under {@code static/} - * subdirectory within the plugin's JAR. + * @param fileName of JavaScript source file under {@code static/} subdirectory within the + * plugin's JAR. */ public JavaScriptPlugin(String fileName) { this.fileName = fileName; diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/ParentWebLink.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/ParentWebLink.java index 648dff89d7..dfc970d5b0 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/ParentWebLink.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/ParentWebLink.java @@ -21,18 +21,19 @@ import com.google.gerrit.extensions.common.WebLinkInfo; public interface ParentWebLink extends WebLink { /** - * {@link com.google.gerrit.extensions.common.WebLinkInfo} - * describing a link from a parent revision to an external service. + * {@link com.google.gerrit.extensions.common.WebLinkInfo} describing a link from a parent + * revision to an external service. * - *

In order for the web link to be visible - * {@link com.google.gerrit.extensions.common.WebLinkInfo#url} - * and {@link com.google.gerrit.extensions.common.WebLinkInfo#name} - * must be set.

+ *

In order for the web link to be visible {@link + * com.google.gerrit.extensions.common.WebLinkInfo#url} and {@link + * com.google.gerrit.extensions.common.WebLinkInfo#name} must be set. + * + *

* * @param projectName Name of the project * @param commit Commit sha1 of the parent revision - * @return WebLinkInfo that links to parent commit in external service, - * null if there should be no link. + * @return WebLinkInfo that links to parent commit in external service, null if there should be no + * link. */ WebLinkInfo getParentWebLink(String projectName, String commit); } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/PatchSetWebLink.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/PatchSetWebLink.java index 1ff4960464..93fe8e105c 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/PatchSetWebLink.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/PatchSetWebLink.java @@ -21,18 +21,19 @@ import com.google.gerrit.extensions.common.WebLinkInfo; public interface PatchSetWebLink extends WebLink { /** - * {@link com.google.gerrit.extensions.common.WebLinkInfo} - * describing a link from a patch set to an external service. + * {@link com.google.gerrit.extensions.common.WebLinkInfo} describing a link from a patch set to + * an external service. * - *

In order for the web link to be visible - * {@link com.google.gerrit.extensions.common.WebLinkInfo#url} - * and {@link com.google.gerrit.extensions.common.WebLinkInfo#name} - * must be set.

+ *

In order for the web link to be visible {@link + * com.google.gerrit.extensions.common.WebLinkInfo#url} and {@link + * com.google.gerrit.extensions.common.WebLinkInfo#name} must be set. + * + *

* * @param projectName Name of the project * @param commit Commit of the patch set - * @return WebLinkInfo that links to patch set in external service, - * null if there should be no link. + * @return WebLinkInfo that links to patch set in external service, null if there should be no + * link. */ WebLinkInfo getPatchSetWebLink(String projectName, String commit); } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/PrivateInternals_UiActionDescription.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/PrivateInternals_UiActionDescription.java index 6545db8eb2..977fdf4b46 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/PrivateInternals_UiActionDescription.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/PrivateInternals_UiActionDescription.java @@ -16,8 +16,8 @@ package com.google.gerrit.extensions.webui; /** * Internal implementation helper for Gerrit Code Review server. - *

- * Extensions and plugins should not invoke this class. + * + *

Extensions and plugins should not invoke this class. */ public class PrivateInternals_UiActionDescription { public static void setMethod(UiAction.Description d, String method) { @@ -28,6 +28,5 @@ public class PrivateInternals_UiActionDescription { d.setId(id); } - private PrivateInternals_UiActionDescription() { - } + private PrivateInternals_UiActionDescription() {} } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/ProjectWebLink.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/ProjectWebLink.java index 2f8e8023ad..f8201c4812 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/ProjectWebLink.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/ProjectWebLink.java @@ -21,17 +21,17 @@ import com.google.gerrit.extensions.common.WebLinkInfo; public interface ProjectWebLink extends WebLink { /** - * {@link com.google.gerrit.extensions.common.WebLinkInfo} - * describing a link from a project to an external service. + * {@link com.google.gerrit.extensions.common.WebLinkInfo} describing a link from a project to an + * external service. * - *

In order for the web link to be visible - * {@link com.google.gerrit.extensions.common.WebLinkInfo#url} - * and {@link com.google.gerrit.extensions.common.WebLinkInfo#name} - * must be set.

+ *

In order for the web link to be visible {@link + * com.google.gerrit.extensions.common.WebLinkInfo#url} and {@link + * com.google.gerrit.extensions.common.WebLinkInfo#name} must be set. + * + *

* * @param projectName Name of the project - * @return WebLinkInfo that links to project in external service, - * null if there should be no link. + * @return WebLinkInfo that links to project in external service, null if there should be no link. */ WebLinkInfo getProjectWeblink(String projectName); } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/TopMenu.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/TopMenu.java index 7ad12cd4cc..4d04efa8a3 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/TopMenu.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/TopMenu.java @@ -17,7 +17,6 @@ package com.google.gerrit.extensions.webui; import com.google.gerrit.extensions.annotations.ExtensionPoint; import com.google.gerrit.extensions.client.GerritTopMenu; import com.google.gerrit.extensions.client.MenuItem; - import java.util.List; @ExtensionPoint diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/UiAction.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/UiAction.java index 18076737e8..62c074e0d6 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/UiAction.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/UiAction.java @@ -21,13 +21,11 @@ public interface UiAction extends RestView { /** * Get the description of the action customized for the resource. * - * @param resource the resource the view would act upon if the action is - * invoked by the client. Information from the resource can be used to - * customize the description. - * @return a description of the action. The server will populate the - * {@code id} and {@code method} properties. If null the action will - * assumed unavailable and not presented. This is usually the same as - * {@code setVisible(false)}. + * @param resource the resource the view would act upon if the action is invoked by the client. + * Information from the resource can be used to customize the description. + * @return a description of the action. The server will populate the {@code id} and {@code method} + * properties. If null the action will assumed unavailable and not presented. This is usually + * the same as {@code setVisible(false)}. */ Description getDescription(R resource); @@ -83,8 +81,8 @@ public interface UiAction extends RestView { } /** - * Set if the action's button is visible on screen for the current client. - * If not visible the action description may not be sent to the client. + * Set if the action's button is visible on screen for the current client. If not visible the + * action description may not be sent to the client. */ public Description setVisible(boolean visible) { this.visible = visible; diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/UiResult.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/UiResult.java index 106db04536..9ca70d1abf 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/UiResult.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/UiResult.java @@ -54,6 +54,5 @@ public class UiResult { /** When true open {@link #url} in a new tab/window. */ protected Boolean openWindow; - private UiResult() { - } + private UiResult() {} } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/WebLink.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/WebLink.java index fd677ca8ca..7cbeff2194 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/WebLink.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/WebLink.java @@ -14,32 +14,17 @@ package com.google.gerrit.extensions.webui; - -/** - * Marks that the implementor has a method that provides - * a weblinkInfo - * - */ +/** Marks that the implementor has a method that provides a weblinkInfo */ public interface WebLink { - /** - * Class that holds target defaults for WebLink anchors. - */ + /** Class that holds target defaults for WebLink anchors. */ class Target { - /** - * Opens the link in a new window or tab - */ + /** Opens the link in a new window or tab */ public static final String BLANK = "_blank"; - /** - * Opens the link in the frame it was clicked. - */ + /** Opens the link in the frame it was clicked. */ public static final String SELF = "_self"; - /** - * Opens link in parent frame. - */ + /** Opens link in parent frame. */ public static final String PARENT = "_parent"; - /** - * Opens link in the full body of the window. - */ + /** Opens link in the full body of the window. */ public static final String TOP = "_top"; } } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/WebUiPlugin.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/WebUiPlugin.java index 5cd19815f8..051d336649 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/WebUiPlugin.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/WebUiPlugin.java @@ -20,10 +20,10 @@ import com.google.inject.Inject; /** * Specifies JavaScript to dynamically load into the web UI. - *

- * To automatically register (instead of writing a Guice module), declare the - * intention with {@code @Listen}, extend the correct class and define a - * constructor to configure the correct resource: + * + *

To automatically register (instead of writing a Guice module), declare the intention with + * {@code @Listen}, extend the correct class and define a constructor to configure the correct + * resource: * *

  * @Listen
@@ -49,7 +49,7 @@ public abstract class WebUiPlugin {
 
   private String pluginName;
 
-  /** @return installed name of the plugin that provides this UI feature.  */
+  /** @return installed name of the plugin that provides this UI feature. */
   public final String getPluginName() {
     return pluginName;
   }
diff --git a/gerrit-extension-api/src/test/java/com/google/gerrit/extensions/client/RangeTest.java b/gerrit-extension-api/src/test/java/com/google/gerrit/extensions/client/RangeTest.java
index 1bb771124f..f209e7c17a 100644
--- a/gerrit-extension-api/src/test/java/com/google/gerrit/extensions/client/RangeTest.java
+++ b/gerrit-extension-api/src/test/java/com/google/gerrit/extensions/client/RangeTest.java
@@ -14,7 +14,6 @@
 
 package com.google.gerrit.extensions.client;
 
-
 import static com.google.gerrit.extensions.client.RangeSubject.assertThat;
 
 import org.junit.Test;
@@ -75,8 +74,8 @@ public class RangeTest {
     assertThat(range).isInvalid();
   }
 
-  private Comment.Range createRange(int startLine, int startCharacter,
-      int endLine, int endCharacter) {
+  private Comment.Range createRange(
+      int startLine, int startCharacter, int endLine, int endCharacter) {
     Comment.Range range = new Comment.Range();
     range.startLine = startLine;
     range.startCharacter = startCharacter;
diff --git a/gerrit-extension-api/src/test/java/com/google/gerrit/extensions/registration/DynamicSetTest.java b/gerrit-extension-api/src/test/java/com/google/gerrit/extensions/registration/DynamicSetTest.java
index f18cdf3cd3..b6ff156dcf 100644
--- a/gerrit-extension-api/src/test/java/com/google/gerrit/extensions/registration/DynamicSetTest.java
+++ b/gerrit-extension-api/src/test/java/com/google/gerrit/extensions/registration/DynamicSetTest.java
@@ -18,7 +18,6 @@ import static com.google.common.truth.Truth.assertThat;
 
 import com.google.inject.Key;
 import com.google.inject.util.Providers;
-
 import org.junit.Test;
 
 public class DynamicSetTest {
diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/BouncyCastleUtil.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/BouncyCastleUtil.java
index ef065a173d..6dc74f2de8 100644
--- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/BouncyCastleUtil.java
+++ b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/BouncyCastleUtil.java
@@ -14,19 +14,18 @@
 
 package com.google.gerrit.gpg;
 
-import org.bouncycastle.jce.provider.BouncyCastleProvider;
-import org.bouncycastle.openpgp.PGPPublicKey;
-
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.security.Security;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.bouncycastle.openpgp.PGPPublicKey;
 
 /** Utility methods for Bouncy Castle. */
 public class BouncyCastleUtil {
   /**
    * Check for Bouncy Castle PGP support.
-   * 

- * As a side effect, adds {@link BouncyCastleProvider} as a security provider. + * + *

As a side effect, adds {@link BouncyCastleProvider} as a security provider. * * @return whether Bouncy Castle PGP support is enabled. */ @@ -35,22 +34,25 @@ public class BouncyCastleUtil { Class.forName(PGPPublicKey.class.getName()); addBouncyCastleProvider(); return true; - } catch (NoClassDefFoundError | ClassNotFoundException | SecurityException - | NoSuchMethodException | InstantiationException - | IllegalAccessException | InvocationTargetException + } catch (NoClassDefFoundError + | ClassNotFoundException + | SecurityException + | NoSuchMethodException + | InstantiationException + | IllegalAccessException + | InvocationTargetException | ClassCastException noBouncyCastle) { return false; } } - private static void addBouncyCastleProvider() throws ClassNotFoundException, - SecurityException, NoSuchMethodException, InstantiationException, - IllegalAccessException, InvocationTargetException { + private static void addBouncyCastleProvider() + throws ClassNotFoundException, SecurityException, NoSuchMethodException, + InstantiationException, IllegalAccessException, InvocationTargetException { Class clazz = Class.forName(BouncyCastleProvider.class.getName()); Constructor constructor = clazz.getConstructor(); Security.addProvider((java.security.Provider) constructor.newInstance()); } - private BouncyCastleUtil() { - } + private BouncyCastleUtil() {} } diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/CheckResult.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/CheckResult.java index 74184bd648..da891aab39 100644 --- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/CheckResult.java +++ b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/CheckResult.java @@ -15,7 +15,6 @@ package com.google.gerrit.gpg; import com.google.gerrit.extensions.common.GpgKeyInfo.Status; - import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -32,25 +31,24 @@ public class CheckResult { } static CheckResult trusted() { - return new CheckResult(Status.TRUSTED, Collections. emptyList()); + return new CheckResult(Status.TRUSTED, Collections.emptyList()); } static CheckResult create(Status status, String... problems) { - List problemList = problems.length > 0 - ? Collections.unmodifiableList(Arrays.asList(problems)) - : Collections. emptyList(); + List problemList = + problems.length > 0 + ? Collections.unmodifiableList(Arrays.asList(problems)) + : Collections.emptyList(); return new CheckResult(status, problemList); } static CheckResult create(Status status, List problems) { - return new CheckResult(status, - Collections.unmodifiableList(new ArrayList<>(problems))); + return new CheckResult(status, Collections.unmodifiableList(new ArrayList<>(problems))); } static CheckResult create(List problems) { return new CheckResult( - problems.isEmpty() ? Status.OK : Status.BAD, - Collections.unmodifiableList(problems)); + problems.isEmpty() ? Status.OK : Status.BAD, Collections.unmodifiableList(problems)); } private final Status status; @@ -86,8 +84,7 @@ public class CheckResult { @Override public String toString() { - StringBuilder sb = new StringBuilder(getClass().getSimpleName()) - .append('[').append(status); + StringBuilder sb = new StringBuilder(getClass().getSimpleName()).append('[').append(status); for (int i = 0; i < problems.size(); i++) { sb.append(i == 0 ? ": " : ", ").append(problems.get(i)); } diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/Fingerprint.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/Fingerprint.java index fa78f01561..c12ff8b0aa 100644 --- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/Fingerprint.java +++ b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/Fingerprint.java @@ -16,12 +16,11 @@ package com.google.gerrit.gpg; import static com.google.common.base.Preconditions.checkArgument; -import org.eclipse.jgit.util.NB; - import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.Map; +import org.eclipse.jgit.util.NB; public class Fingerprint { private final byte[] fp; @@ -30,10 +29,16 @@ public class Fingerprint { checkLength(fp); return String.format( "%04X %04X %04X %04X %04X %04X %04X %04X %04X %04X", - NB.decodeUInt16(fp, 0), NB.decodeUInt16(fp, 2), NB.decodeUInt16(fp, 4), - NB.decodeUInt16(fp, 6), NB.decodeUInt16(fp, 8), NB.decodeUInt16(fp, 10), - NB.decodeUInt16(fp, 12), NB.decodeUInt16(fp, 14), - NB.decodeUInt16(fp, 16), NB.decodeUInt16(fp, 18)); + NB.decodeUInt16(fp, 0), + NB.decodeUInt16(fp, 2), + NB.decodeUInt16(fp, 4), + NB.decodeUInt16(fp, 6), + NB.decodeUInt16(fp, 8), + NB.decodeUInt16(fp, 10), + NB.decodeUInt16(fp, 12), + NB.decodeUInt16(fp, 14), + NB.decodeUInt16(fp, 16), + NB.decodeUInt16(fp, 18)); } public static long getId(byte[] fp) { @@ -49,19 +54,16 @@ public class Fingerprint { } private static byte[] checkLength(byte[] fp) { - checkArgument(fp.length == 20, - "fingerprint must be 20 bytes, got %s", fp.length); + checkArgument(fp.length == 20, "fingerprint must be 20 bytes, got %s", fp.length); return fp; } /** * Wrap a fingerprint byte array. - *

- * The newly created Fingerprint object takes ownership of the byte array, - * which must not be subsequently modified. (Most callers, such as hex - * decoders and {@code - * org.bouncycastle.openpgp.PGPPublicKey#getFingerprint()}, already produce - * fresh byte arrays). + * + *

The newly created Fingerprint object takes ownership of the byte array, which must not be + * subsequently modified. (Most callers, such as hex decoders and {@code + * org.bouncycastle.openpgp.PGPPublicKey#getFingerprint()}, already produce fresh byte arrays). * * @param fp 20-byte fingerprint byte array to wrap. */ @@ -71,17 +73,19 @@ public class Fingerprint { /** * Wrap a portion of a fingerprint byte array. - *

- * Unlike {@link #Fingerprint(byte[])}, creates a new copy of the byte array. + * + *

Unlike {@link #Fingerprint(byte[])}, creates a new copy of the byte array. * * @param buf byte array to wrap; must have at least {@code off + 20} bytes. * @param off offset in buf. */ public Fingerprint(byte[] buf, int off) { int expected = 20 + off; - checkArgument(buf.length >= expected, + checkArgument( + buf.length >= expected, "fingerprint buffer must have at least %s bytes, got %s", - expected, buf.length); + expected, + buf.length); this.fp = new byte[20]; System.arraycopy(buf, off, fp, 0, 20); } diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/GerritPublicKeyChecker.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/GerritPublicKeyChecker.java index be929ed7e9..fe987f4247 100644 --- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/GerritPublicKeyChecker.java +++ b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/GerritPublicKeyChecker.java @@ -32,7 +32,12 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; import org.bouncycastle.openpgp.PGPException; import org.bouncycastle.openpgp.PGPPublicKey; import org.bouncycastle.openpgp.PGPSignature; @@ -42,22 +47,14 @@ import org.eclipse.jgit.transport.PushCertificateIdent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Collections; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; - /** * Checker for GPG public keys including Gerrit-specific checks. - *

- * For Gerrit, keys must contain a self-signed user ID certification matching a - * trusted external ID in the database, or an email address thereof. + * + *

For Gerrit, keys must contain a self-signed user ID certification matching a trusted external + * ID in the database, or an email address thereof. */ public class GerritPublicKeyChecker extends PublicKeyChecker { - private static final Logger log = - LoggerFactory.getLogger(GerritPublicKeyChecker.class); + private static final Logger log = LoggerFactory.getLogger(GerritPublicKeyChecker.class); @Singleton public static class Factory { @@ -68,7 +65,8 @@ public class GerritPublicKeyChecker extends PublicKeyChecker { private final ImmutableMap trusted; @Inject - Factory(@GerritServerConfig Config cfg, + Factory( + @GerritServerConfig Config cfg, Provider accountQueryProvider, IdentifiedUser.GenericFactory userFactory, @CanonicalWebUrl String webUrl) { @@ -79,8 +77,7 @@ public class GerritPublicKeyChecker extends PublicKeyChecker { String[] strs = cfg.getStringList("receive", null, "trustedKey"); if (strs.length != 0) { - Map fps = - Maps.newHashMapWithExpectedSize(strs.length); + Map fps = Maps.newHashMapWithExpectedSize(strs.length); for (String str : strs) { str = CharMatcher.whitespace().removeFrom(str).toUpperCase(); Fingerprint fp = new Fingerprint(BaseEncoding.base16().decode(str)); @@ -96,8 +93,7 @@ public class GerritPublicKeyChecker extends PublicKeyChecker { return new GerritPublicKeyChecker(this); } - public GerritPublicKeyChecker create(IdentifiedUser expectedUser, - PublicKeyStore store) { + public GerritPublicKeyChecker create(IdentifiedUser expectedUser, PublicKeyStore store) { GerritPublicKeyChecker checker = new GerritPublicKeyChecker(this); checker.setExpectedUser(expectedUser); checker.setStore(store); @@ -120,14 +116,13 @@ public class GerritPublicKeyChecker extends PublicKeyChecker { } } - /** - * Set the expected user for this checker. - *

- * If set, the top-level key passed to {@link #check(PGPPublicKey)} must - * belong to the given user. (Other keys checked in the course of verifying - * the web of trust are checked against the set of identities in the database - * belonging to the same user as the key.) - */ + /** + * Set the expected user for this checker. + * + *

If set, the top-level key passed to {@link #check(PGPPublicKey)} must belong to the given + * user. (Other keys checked in the course of verifying the web of trust are checked against the + * set of identities in the database belonging to the same user as the key.) + */ public GerritPublicKeyChecker setExpectedUser(IdentifiedUser expectedUser) { this.expectedUser = expectedUser; return this; @@ -147,12 +142,11 @@ public class GerritPublicKeyChecker extends PublicKeyChecker { } } - private CheckResult checkIdsForExpectedUser(PGPPublicKey key) - throws PGPException { + private CheckResult checkIdsForExpectedUser(PGPPublicKey key) throws PGPException { Set allowedUserIds = getAllowedUserIds(expectedUser); if (allowedUserIds.isEmpty()) { - return CheckResult.bad("No identities found for user; check " - + webUrl + "#" + PageLinks.SETTINGS_WEBIDENT); + return CheckResult.bad( + "No identities found for user; check " + webUrl + "#" + PageLinks.SETTINGS_WEBIDENT); } if (hasAllowedUserId(key, allowedUserIds)) { return CheckResult.trusted(); @@ -160,8 +154,7 @@ public class GerritPublicKeyChecker extends PublicKeyChecker { return CheckResult.bad(missingUserIds(allowedUserIds)); } - private CheckResult checkIdsForArbitraryUser(PGPPublicKey key) - throws PGPException, OrmException { + private CheckResult checkIdsForArbitraryUser(PGPPublicKey key) throws PGPException, OrmException { List accountStates = accountQueryProvider.get().byExternalId(toExtIdKey(key).get()); if (accountStates.isEmpty()) { @@ -179,8 +172,7 @@ public class GerritPublicKeyChecker extends PublicKeyChecker { if (hasAllowedUserId(key, allowedUserIds)) { return CheckResult.trusted(); } - return CheckResult.bad( - "Key does not contain any valid certifications for user's identities"); + return CheckResult.bad("Key does not contain any valid certifications for user's identities"); } private boolean hasAllowedUserId(PGPPublicKey key, Set allowedUserIds) @@ -202,12 +194,9 @@ public class GerritPublicKeyChecker extends PublicKeyChecker { return false; } - private Iterator getSignaturesForId(PGPPublicKey key, - String userId) { + private Iterator getSignaturesForId(PGPPublicKey key, String userId) { Iterator result = key.getSignaturesForID(userId); - return result != null - ? result - : Collections.emptyIterator(); + return result != null ? result : Collections.emptyIterator(); } private Set getAllowedUserIds(IdentifiedUser user) { @@ -224,12 +213,11 @@ public class GerritPublicKeyChecker extends PublicKeyChecker { private static boolean isAllowed(String userId, Set allowedUserIds) { return allowedUserIds.contains(userId) - || allowedUserIds.contains( - PushCertificateIdent.parse(userId).getEmailAddress()); + || allowedUserIds.contains(PushCertificateIdent.parse(userId).getEmailAddress()); } - private static boolean isValidCertification(PGPPublicKey key, - PGPSignature sig, String userId) throws PGPException { + private static boolean isValidCertification(PGPPublicKey key, PGPSignature sig, String userId) + throws PGPException { if (sig.getSignatureType() != PGPSignature.DEFAULT_CERTIFICATION && sig.getSignatureType() != PGPSignature.POSITIVE_CERTIFICATION) { return false; @@ -247,8 +235,9 @@ public class GerritPublicKeyChecker extends PublicKeyChecker { } private static String missingUserIds(Set allowedUserIds) { - StringBuilder sb = new StringBuilder("Key must contain a valid" - + " certification for one of the following identities:\n"); + StringBuilder sb = + new StringBuilder( + "Key must contain a valid" + " certification for one of the following identities:\n"); Iterator sorted = allowedUserIds.stream().sorted().iterator(); while (sorted.hasNext()) { sb.append(" ").append(sorted.next()); @@ -261,7 +250,6 @@ public class GerritPublicKeyChecker extends PublicKeyChecker { static AccountExternalId.Key toExtIdKey(PGPPublicKey key) { return new AccountExternalId.Key( - SCHEME_GPGKEY, - BaseEncoding.base16().encode(key.getFingerprint())); + SCHEME_GPGKEY, BaseEncoding.base16().encode(key.getFingerprint())); } } diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/GerritPushCertificateChecker.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/GerritPushCertificateChecker.java index 30983ac9a0..62d0df77ea 100644 --- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/GerritPushCertificateChecker.java +++ b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/GerritPushCertificateChecker.java @@ -19,10 +19,8 @@ import com.google.gerrit.server.config.AllUsersName; import com.google.gerrit.server.git.GitRepositoryManager; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - -import org.eclipse.jgit.lib.Repository; - import java.io.IOException; +import org.eclipse.jgit.lib.Repository; public class GerritPushCertificateChecker extends PushCertificateChecker { public interface Factory { diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/GpgModule.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/GpgModule.java index bbf61b81af..6d93184e7e 100644 --- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/GpgModule.java +++ b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/GpgModule.java @@ -17,7 +17,6 @@ package com.google.gerrit.gpg; import com.google.gerrit.extensions.config.FactoryModule; import com.google.gerrit.gpg.api.GpgApiModule; import com.google.gerrit.server.EnableSignedPush; - import org.eclipse.jgit.lib.Config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,17 +32,14 @@ public class GpgModule extends FactoryModule { @Override protected void configure() { - boolean configEnableSignedPush = - cfg.getBoolean("receive", null, "enableSignedPush", false); - boolean configEditGpgKeys = - cfg.getBoolean("gerrit", null, "editGpgKeys", true); + boolean configEnableSignedPush = cfg.getBoolean("receive", null, "enableSignedPush", false); + boolean configEditGpgKeys = cfg.getBoolean("gerrit", null, "editGpgKeys", true); boolean havePgp = BouncyCastleUtil.havePGP(); boolean enableSignedPush = configEnableSignedPush && havePgp; bindConstant().annotatedWith(EnableSignedPush.class).to(enableSignedPush); if (configEnableSignedPush && !havePgp) { - log.info("Bouncy Castle PGP not installed; signed push verification is" - + " disabled"); + log.info("Bouncy Castle PGP not installed; signed push verification is" + " disabled"); } if (enableSignedPush) { install(new SignedPushModule()); diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/PublicKeyChecker.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/PublicKeyChecker.java index 66e810cc33..c0ab26c2ac 100644 --- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/PublicKeyChecker.java +++ b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/PublicKeyChecker.java @@ -29,7 +29,16 @@ import static org.bouncycastle.openpgp.PGPSignature.DIRECT_KEY; import static org.bouncycastle.openpgp.PGPSignature.KEY_REVOCATION; import com.google.gerrit.extensions.common.GpgKeyInfo.Status; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; import org.bouncycastle.bcpg.SignatureSubpacket; import org.bouncycastle.bcpg.SignatureSubpacketTags; import org.bouncycastle.bcpg.sig.RevocationKey; @@ -43,21 +52,9 @@ import org.bouncycastle.openpgp.operator.bc.BcPGPContentVerifierBuilderProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; - /** Checker for GPG public keys for use in a push certificate. */ public class PublicKeyChecker { - private static final Logger log = - LoggerFactory.getLogger(PublicKeyChecker.class); + private static final Logger log = LoggerFactory.getLogger(PublicKeyChecker.class); // https://tools.ietf.org/html/rfc4880#section-5.2.3.13 private static final int COMPLETE_TRUST = 120; @@ -69,27 +66,22 @@ public class PublicKeyChecker { /** * Enable web-of-trust checks. - *

- * If enabled, a store must be set with {@link #setStore(PublicKeyStore)}. - * (These methods are separate since the store is a closeable resource that - * may not be available when reading trusted keys from a config.) * - * @param maxTrustDepth maximum depth to search while looking for a trusted - * key. - * @param trusted ultimately trusted key fingerprints, keyed by fingerprint; - * may not be empty. To construct a map, see {@link - * Fingerprint#byId(Iterable)}. + *

If enabled, a store must be set with {@link #setStore(PublicKeyStore)}. (These methods are + * separate since the store is a closeable resource that may not be available when reading trusted + * keys from a config.) + * + * @param maxTrustDepth maximum depth to search while looking for a trusted key. + * @param trusted ultimately trusted key fingerprints, keyed by fingerprint; may not be empty. To + * construct a map, see {@link Fingerprint#byId(Iterable)}. * @return a reference to this object. */ - public PublicKeyChecker enableTrust(int maxTrustDepth, - Map trusted) { + public PublicKeyChecker enableTrust(int maxTrustDepth, Map trusted) { if (maxTrustDepth <= 0) { - throw new IllegalArgumentException( - "maxTrustDepth must be positive, got: " + maxTrustDepth); + throw new IllegalArgumentException("maxTrustDepth must be positive, got: " + maxTrustDepth); } if (trusted == null || trusted.isEmpty()) { - throw new IllegalArgumentException( - "at least one trusted key is required"); + throw new IllegalArgumentException("at least one trusted key is required"); } this.maxTrustDepth = maxTrustDepth; this.trusted = trusted; @@ -113,9 +105,8 @@ public class PublicKeyChecker { /** * Set the effective time for checking the key. - *

- * If set, check whether the key should be considered valid (e.g. unexpired) - * as of this time. + * + *

If set, check whether the key should be considered valid (e.g. unexpired) as of this time. * * @param effectiveTime effective time. * @return a reference to this object. @@ -139,40 +130,36 @@ public class PublicKeyChecker { if (store == null) { throw new IllegalStateException("PublicKeyStore is required"); } - return check(key, 0, true, - trusted != null ? new HashSet() : null); + return check(key, 0, true, trusted != null ? new HashSet() : null); } /** * Perform custom checks. - *

- * Default implementation reports no problems, but may be overridden by - * subclasses. + * + *

Default implementation reports no problems, but may be overridden by subclasses. * * @param key the public key. - * @param depth the depth from the initial key passed to {@link #check( - * PGPPublicKey)}: 0 if this was the initial key, up to a maximum of - * {@code maxTrustDepth}. + * @param depth the depth from the initial key passed to {@link #check( PGPPublicKey)}: 0 if this + * was the initial key, up to a maximum of {@code maxTrustDepth}. * @return the result of the custom check. */ public CheckResult checkCustom(PGPPublicKey key, int depth) { return CheckResult.ok(); } - private CheckResult check(PGPPublicKey key, int depth, boolean expand, - Set seen) { + private CheckResult check(PGPPublicKey key, int depth, boolean expand, Set seen) { CheckResult basicResult = checkBasic(key, effectiveTime); CheckResult customResult = checkCustom(key, depth); CheckResult trustResult = checkWebOfTrust(key, store, depth, seen); if (!expand && !trustResult.isTrusted()) { - trustResult = CheckResult.create(trustResult.getStatus(), - "Key is not trusted"); + trustResult = CheckResult.create(trustResult.getStatus(), "Key is not trusted"); } - List problems = new ArrayList<>( - basicResult.getProblems().size() - + customResult.getProblems().size() - + trustResult.getProblems().size()); + List problems = + new ArrayList<>( + basicResult.getProblems().size() + + customResult.getProblems().size() + + trustResult.getProblems().size()); problems.addAll(basicResult.getProblems()); problems.addAll(customResult.getProblems()); problems.addAll(trustResult.getProblems()); @@ -210,13 +197,11 @@ public class PublicKeyChecker { return CheckResult.create(problems); } - private void gatherRevocationProblems(PGPPublicKey key, Date now, - List problems) { + private void gatherRevocationProblems(PGPPublicKey key, Date now, List problems) { try { List revocations = new ArrayList<>(); Map revokers = new HashMap<>(); - PGPSignature selfRevocation = - scanRevocations(key, now, revocations, revokers); + PGPSignature selfRevocation = scanRevocations(key, now, revocations, revokers); if (selfRevocation != null) { RevocationReason reason = getRevocationReason(selfRevocation); if (isRevocationValid(selfRevocation, reason, now)) { @@ -230,8 +215,8 @@ public class PublicKeyChecker { } } - private static boolean isRevocationValid(PGPSignature revocation, - RevocationReason reason, Date now) { + private static boolean isRevocationValid( + PGPSignature revocation, RevocationReason reason, Date now) { // RFC4880 states: // "If a key has been revoked because of a compromise, all signatures // created by that key are suspect. However, if it was merely superseded or @@ -244,8 +229,8 @@ public class PublicKeyChecker { || revocation.getCreationTime().before(now); } - private PGPSignature scanRevocations(PGPPublicKey key, Date now, - List revocations, Map revokers) + private PGPSignature scanRevocations( + PGPPublicKey key, Date now, List revocations, Map revokers) throws PGPException { @SuppressWarnings("unchecked") Iterator allSigs = key.getSignatures(); @@ -276,13 +261,11 @@ public class PublicKeyChecker { return null; } - private RevocationKey getRevocationKey(PGPPublicKey key, PGPSignature sig) - throws PGPException { + private RevocationKey getRevocationKey(PGPPublicKey key, PGPSignature sig) throws PGPException { if (sig.getKeyID() != key.getKeyID()) { return null; } - SignatureSubpacket sub = - sig.getHashedSubPackets().getSubpacket(REVOCATION_KEY); + SignatureSubpacket sub = sig.getHashedSubPackets().getSubpacket(REVOCATION_KEY); if (sub == null) { return null; } @@ -291,12 +274,13 @@ public class PublicKeyChecker { return null; } - return new RevocationKey(sub.isCritical(), sub.isLongLength(), - sub.getData()); + return new RevocationKey(sub.isCritical(), sub.isLongLength(), sub.getData()); } - private void checkRevocations(PGPPublicKey key, - List revocations, Map revokers, + private void checkRevocations( + PGPPublicKey key, + List revocations, + Map revokers, List problems) throws PGPException, IOException { for (PGPSignature revocation : revocations) { @@ -310,9 +294,12 @@ public class PublicKeyChecker { // Revoker is authorized and there is a revocation signature by this // revoker, but the key is not in the store so we can't verify the // signature. - log.info("Key " + Fingerprint.toString(key.getFingerprint()) - + " is revoked by " + Fingerprint.toString(rfp) - + ", which is not in the store. Assuming revocation is valid."); + log.info( + "Key " + + Fingerprint.toString(key.getFingerprint()) + + " is revoked by " + + Fingerprint.toString(rfp) + + ", which is not in the store. Assuming revocation is valid."); problems.add(reasonToString(getRevocationReason(revocation))); continue; } @@ -337,13 +324,11 @@ public class PublicKeyChecker { throw new IllegalArgumentException( "Expected KEY_REVOCATION signature, got " + sig.getSignatureType()); } - SignatureSubpacket sub = - sig.getHashedSubPackets().getSubpacket(REVOCATION_REASON); + SignatureSubpacket sub = sig.getHashedSubPackets().getSubpacket(REVOCATION_REASON); if (sub == null) { return null; } - return new RevocationReason(sub.isCritical(), sub.isLongLength(), - sub.getData()); + return new RevocationReason(sub.isCritical(), sub.isLongLength(), sub.getData()); } private static String reasonToString(RevocationReason reason) { @@ -365,9 +350,7 @@ public class PublicKeyChecker { r.append("retired and no longer valid"); break; default: - r.append("reason code ") - .append(Integer.toString(reason.getRevocationReason())) - .append(')'); + r.append("reason code ").append(Integer.toString(reason.getRevocationReason())).append(')'); break; } r.append(')'); @@ -378,8 +361,8 @@ public class PublicKeyChecker { return r.toString(); } - private CheckResult checkWebOfTrust(PGPPublicKey key, PublicKeyStore store, - int depth, Set seen) { + private CheckResult checkWebOfTrust( + PGPPublicKey key, PublicKeyStore store, int depth, Set seen) { if (trusted == null) { // Trust checking not configured, server trusts all OK keys. return CheckResult.trusted(); @@ -394,8 +377,7 @@ public class PublicKeyChecker { if (trustedFp != null && trustedFp.equals(fp)) { return CheckResult.trusted(); // Directly trusted. } else if (depth >= maxTrustDepth) { - return CheckResult.ok( - "No path of depth <= " + maxTrustDepth + " to a trusted key"); + return CheckResult.ok("No path of depth <= " + maxTrustDepth + " to a trusted key"); } List signerResults = new ArrayList<>(); @@ -419,8 +401,7 @@ public class PublicKeyChecker { PGPPublicKey signer = getSigner(store, sig, userId, key, signerResults); // TODO(dborowitz): Require self certification. - if (signer == null - || Arrays.equals(signer.getFingerprint(), key.getFingerprint())) { + if (signer == null || Arrays.equals(signer.getFingerprint(), key.getFingerprint())) { continue; } String subpacketProblem = checkTrustSubpacket(sig, depth); @@ -430,9 +411,9 @@ public class PublicKeyChecker { return CheckResult.trusted(); } } - signerResults.add(CheckResult.ok( - "Certification by " + keyToString(signer) - + " is valid, but key is not trusted")); + signerResults.add( + CheckResult.ok( + "Certification by " + keyToString(signer) + " is valid, but key is not trusted")); } } @@ -444,34 +425,39 @@ public class PublicKeyChecker { return CheckResult.create(OK, problems); } - private static PGPPublicKey getSigner(PublicKeyStore store, PGPSignature sig, - String userId, PGPPublicKey key, List results) { + private static PGPPublicKey getSigner( + PublicKeyStore store, + PGPSignature sig, + String userId, + PGPPublicKey key, + List results) { try { PGPPublicKeyRingCollection signers = store.get(sig.getKeyID()); if (!signers.getKeyRings().hasNext()) { - results.add(CheckResult.ok( - "Key " + keyIdToString(sig.getKeyID()) - + " used for certification is not in store")); + results.add( + CheckResult.ok( + "Key " + + keyIdToString(sig.getKeyID()) + + " used for certification is not in store")); return null; } PGPPublicKey signer = PublicKeyStore.getSigner(signers, sig, userId, key); if (signer == null) { - results.add(CheckResult.ok( - "Certification by " + keyIdToString(sig.getKeyID()) - + " is not valid")); + results.add( + CheckResult.ok("Certification by " + keyIdToString(sig.getKeyID()) + " is not valid")); return null; } return signer; } catch (PGPException | IOException e) { - results.add(CheckResult.ok( - "Error checking certification by " + keyIdToString(sig.getKeyID()))); + results.add( + CheckResult.ok("Error checking certification by " + keyIdToString(sig.getKeyID()))); return null; } } private String checkTrustSubpacket(PGPSignature sig, int depth) { - SignatureSubpacket trustSub = sig.getHashedSubPackets().getSubpacket( - SignatureSubpacketTags.TRUST_SIG); + SignatureSubpacket trustSub = + sig.getHashedSubPackets().getSubpacket(SignatureSubpacketTags.TRUST_SIG); if (trustSub == null || trustSub.getData().length != 2) { return "Certification is missing trust information"; } @@ -482,8 +468,7 @@ public class PublicKeyChecker { byte level = trustSub.getData()[0]; int required = depth + 1; if (level < required) { - return "Certification trusts to depth " + level - + ", but depth " + required + " is required"; + return "Certification trusts to depth " + level + ", but depth " + required + " is required"; } return null; } diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/PublicKeyStore.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/PublicKeyStore.java index b45bce5b06..144606a5f0 100644 --- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/PublicKeyStore.java +++ b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/PublicKeyStore.java @@ -17,6 +17,18 @@ package com.google.gerrit.gpg; import static com.google.common.base.Preconditions.checkState; import static org.eclipse.jgit.lib.Constants.OBJ_BLOB; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; import org.bouncycastle.bcpg.ArmoredInputStream; import org.bouncycastle.bcpg.ArmoredOutputStream; import org.bouncycastle.openpgp.PGPException; @@ -40,34 +52,19 @@ import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.util.NB; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; - /** * Store of GPG public keys in git notes. - *

- * Keys are stored in filenames based on their hex key ID, padded out to 40 - * characters to match the length of a SHA-1. (This is to easily reuse existing - * fanout code in {@link NoteMap}, and may be changed later after an appropriate - * transition.) - *

- * The contents of each file is an ASCII armored stream containing one or more - * public key rings matching the ID. Multiple keys are supported because forging - * a key ID is possible, but such a key cannot be used to verify signatures - * produced with the correct key. - *

- * No additional checks are performed on the key after reading; callers should - * only trust keys after checking with a {@link PublicKeyChecker}. + * + *

Keys are stored in filenames based on their hex key ID, padded out to 40 characters to match + * the length of a SHA-1. (This is to easily reuse existing fanout code in {@link NoteMap}, and may + * be changed later after an appropriate transition.) + * + *

The contents of each file is an ASCII armored stream containing one or more public key rings + * matching the ID. Multiple keys are supported because forging a key ID is possible, but such a key + * cannot be used to verify signatures produced with the correct key. + * + *

No additional checks are performed on the key after reading; callers should only trust keys + * after checking with a {@link PublicKeyChecker}. */ public class PublicKeyStore implements AutoCloseable { private static final ObjectId EMPTY_TREE = @@ -78,16 +75,18 @@ public class PublicKeyStore implements AutoCloseable { /** * Choose the public key that produced a signature. + * *

+ * * @param keyRings candidate keys. * @param sig signature object. * @param data signed payload. - * @return the key chosen from {@code keyRings} that was able to verify the - * signature, or {@code null} if none was found. + * @return the key chosen from {@code keyRings} that was able to verify the signature, or {@code + * null} if none was found. * @throws PGPException if an error occurred verifying the signature. */ - public static PGPPublicKey getSigner(Iterable keyRings, - PGPSignature sig, byte[] data) throws PGPException { + public static PGPPublicKey getSigner( + Iterable keyRings, PGPSignature sig, byte[] data) throws PGPException { for (PGPPublicKeyRing kr : keyRings) { PGPPublicKey k = kr.getPublicKey(); sig.init(new BcPGPContentVerifierBuilderProvider(), k); @@ -101,17 +100,20 @@ public class PublicKeyStore implements AutoCloseable { /** * Choose the public key that produced a certification. + * *

+ * * @param keyRings candidate keys. * @param sig signature object. * @param userId user ID being certified. * @param key key being certified. - * @return the key chosen from {@code keyRings} that was able to verify the - * certification, or {@code null} if none was found. + * @return the key chosen from {@code keyRings} that was able to verify the certification, or + * {@code null} if none was found. * @throws PGPException if an error occurred verifying the certification. */ - public static PGPPublicKey getSigner(Iterable keyRings, - PGPSignature sig, String userId, PGPPublicKey key) throws PGPException { + public static PGPPublicKey getSigner( + Iterable keyRings, PGPSignature sig, String userId, PGPPublicKey key) + throws PGPException { for (PGPPublicKeyRing kr : keyRings) { PGPPublicKey k = kr.getPublicKey(); sig.init(new BcPGPContentVerifierBuilderProvider(), k); @@ -165,39 +167,36 @@ public class PublicKeyStore implements AutoCloseable { /** * Read public keys with the given key ID. - *

- * Keys should not be trusted unless checked with {@link PublicKeyChecker}. - *

- * Multiple calls to this method use the same state of the key ref; to reread - * the ref, call {@link #close()} first. + * + *

Keys should not be trusted unless checked with {@link PublicKeyChecker}. + * + *

Multiple calls to this method use the same state of the key ref; to reread the ref, call + * {@link #close()} first. * * @param keyId key ID. * @return any keys found that could be successfully parsed. * @throws PGPException if an error occurred parsing the key data. * @throws IOException if an error occurred reading the repository data. */ - public PGPPublicKeyRingCollection get(long keyId) - throws PGPException, IOException { + public PGPPublicKeyRingCollection get(long keyId) throws PGPException, IOException { return new PGPPublicKeyRingCollection(get(keyId, null)); } /** * Read public key with the given fingerprint. - *

- * Keys should not be trusted unless checked with {@link PublicKeyChecker}. - *

- * Multiple calls to this method use the same state of the key ref; to reread - * the ref, call {@link #close()} first. + * + *

Keys should not be trusted unless checked with {@link PublicKeyChecker}. + * + *

Multiple calls to this method use the same state of the key ref; to reread the ref, call + * {@link #close()} first. * * @param fingerprint key fingerprint. * @return the key if found, or {@code null}. * @throws PGPException if an error occurred parsing the key data. * @throws IOException if an error occurred reading the repository data. */ - public PGPPublicKeyRing get(byte[] fingerprint) - throws PGPException, IOException { - List keyRings = - get(Fingerprint.getId(fingerprint), fingerprint); + public PGPPublicKeyRing get(byte[] fingerprint) throws PGPException, IOException { + List keyRings = get(Fingerprint.getId(fingerprint), fingerprint); return !keyRings.isEmpty() ? keyRings.get(0) : null; } @@ -217,21 +216,18 @@ public class PublicKeyStore implements AutoCloseable { try (InputStream in = reader.open(note.getData(), OBJ_BLOB).openStream()) { while (true) { @SuppressWarnings("unchecked") - Iterator it = - new BcPGPObjectFactory(new ArmoredInputStream(in)).iterator(); + Iterator it = new BcPGPObjectFactory(new ArmoredInputStream(in)).iterator(); if (!it.hasNext()) { break; } Object obj = it.next(); if (obj instanceof PGPPublicKeyRing) { PGPPublicKeyRing kr = (PGPPublicKeyRing) obj; - if (fp == null - || Arrays.equals(fp, kr.getPublicKey().getFingerprint())) { + if (fp == null || Arrays.equals(fp, kr.getPublicKey().getFingerprint())) { keys.add(kr); } } - checkState(!it.hasNext(), - "expected one PGP object per ArmoredInputStream"); + checkState(!it.hasNext(), "expected one PGP object per ArmoredInputStream"); } return keys; } @@ -239,9 +235,9 @@ public class PublicKeyStore implements AutoCloseable { /** * Add a public key to the store. - *

- * Multiple calls may be made to buffer keys in memory, and they are not saved - * until {@link #save(CommitBuilder)} is called. + * + *

Multiple calls may be made to buffer keys in memory, and they are not saved until {@link + * #save(CommitBuilder)} is called. * * @param keyRing a key ring containing exactly one public master key. */ @@ -256,8 +252,7 @@ public class PublicKeyStore implements AutoCloseable { // this master key, but that requires doing actual signature verification // here. The alternative is insane but harmless. if (numMaster != 1) { - throw new IllegalArgumentException( - "Exactly 1 master key is required, found " + numMaster); + throw new IllegalArgumentException("Exactly 1 master key is required, found " + numMaster); } Fingerprint fp = new Fingerprint(keyRing.getPublicKey().getFingerprint()); toAdd.put(fp, keyRing); @@ -266,9 +261,9 @@ public class PublicKeyStore implements AutoCloseable { /** * Remove a public key from the store. - *

- * Multiple calls may be made to buffer deletes in memory, and they are not - * saved until {@link #save(CommitBuilder)} is called. + * + *

Multiple calls may be made to buffer deletes in memory, and they are not saved until {@link + * #save(CommitBuilder)} is called. * * @param fingerprint the fingerprint of the key to remove. */ @@ -280,17 +275,15 @@ public class PublicKeyStore implements AutoCloseable { /** * Save pending keys to the store. - *

- * One commit is created and the ref updated. The pending list is cleared if - * and only if the ref update succeeds, which allows for easy retries in case - * of lock failure. * - * @param cb commit builder with at least author and identity populated; tree - * and parent are ignored. + *

One commit is created and the ref updated. The pending list is cleared if and only if the + * ref update succeeds, which allows for easy retries in case of lock failure. + * + * @param cb commit builder with at least author and identity populated; tree and parent are + * ignored. * @return result of the ref update. */ - public RefUpdate.Result save(CommitBuilder cb) - throws PGPException, IOException { + public RefUpdate.Result save(CommitBuilder cb) throws PGPException, IOException { if (toAdd.isEmpty() && toRemove.isEmpty()) { return RefUpdate.Result.NO_CHANGE; } @@ -309,8 +302,7 @@ public class PublicKeyStore implements AutoCloseable { deleteFromNotes(ins, fp); } cb.setTreeId(notes.writeTree(ins)); - if (cb.getTreeId().equals( - tip != null ? tip.getTree() : EMPTY_TREE)) { + if (cb.getTreeId().equals(tip != null ? tip.getTree() : EMPTY_TREE)) { return RefUpdate.Result.NO_CHANGE; } @@ -319,8 +311,7 @@ public class PublicKeyStore implements AutoCloseable { } if (cb.getMessage() == null) { int n = toAdd.size() + toRemove.size(); - cb.setMessage( - String.format("Update %d public key%s", n, n != 1 ? "s" : "")); + cb.setMessage(String.format("Update %d public key%s", n, n != 1 ? "s" : "")); } newTip = ins.insert(cb); ins.flush(); @@ -370,8 +361,7 @@ public class PublicKeyStore implements AutoCloseable { if (!replaced) { toWrite.add(keyRing); } - notes.set(keyObjectId(keyId), - ins.insert(OBJ_BLOB, keysToArmored(toWrite))); + notes.set(keyObjectId(keyId), ins.insert(OBJ_BLOB, keysToArmored(toWrite))); } private void deleteFromNotes(ObjectInserter ins, Fingerprint fp) @@ -387,20 +377,17 @@ public class PublicKeyStore implements AutoCloseable { if (toWrite.size() == existing.size()) { return; } else if (!toWrite.isEmpty()) { - notes.set(keyObjectId(keyId), - ins.insert(OBJ_BLOB, keysToArmored(toWrite))); + notes.set(keyObjectId(keyId), ins.insert(OBJ_BLOB, keysToArmored(toWrite))); } else { notes.remove(keyObjectId(keyId)); } } private static boolean sameKey(PGPPublicKeyRing kr1, PGPPublicKeyRing kr2) { - return Arrays.equals(kr1.getPublicKey().getFingerprint(), - kr2.getPublicKey().getFingerprint()); + return Arrays.equals(kr1.getPublicKey().getFingerprint(), kr2.getPublicKey().getFingerprint()); } - private static byte[] keysToArmored(List keys) - throws IOException { + private static byte[] keysToArmored(List keys) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(4096 * keys.size()); for (PGPPublicKeyRing kr : keys) { try (ArmoredOutputStream aout = new ArmoredOutputStream(out)) { diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/PushCertificateChecker.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/PushCertificateChecker.java index 0a0fff769f..95b89d08b8 100644 --- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/PushCertificateChecker.java +++ b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/PushCertificateChecker.java @@ -22,7 +22,10 @@ import static com.google.gerrit.gpg.PublicKeyStore.keyToString; import com.google.common.base.Joiner; import com.google.gerrit.extensions.common.GpgKeyInfo.Status; - +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import org.bouncycastle.bcpg.ArmoredInputStream; import org.bouncycastle.openpgp.PGPException; import org.bouncycastle.openpgp.PGPObjectFactory; @@ -38,15 +41,9 @@ import org.eclipse.jgit.transport.PushCertificate.NonceStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - /** Checker for push certificates. */ public abstract class PushCertificateChecker { - private static final Logger log = - LoggerFactory.getLogger(PushCertificateChecker.class); + private static final Logger log = LoggerFactory.getLogger(PushCertificateChecker.class); public static class Result { private final PGPPublicKey key; @@ -149,8 +146,8 @@ public abstract class PushCertificateChecker { /** * Get the repository that this checker should operate on. - *

- * This method is called once per call to {@link #check(PushCertificate)}. + * + *

This method is called once per call to {@link #check(PushCertificate)}. * * @return the repository. * @throws IOException if an error occurred reading the repository. @@ -159,16 +156,15 @@ public abstract class PushCertificateChecker { /** * @param repo a repository previously returned by {@link #getRepository()}. - * @return whether this repository should be closed before returning from - * {@link #check(PushCertificate)}. + * @return whether this repository should be closed before returning from {@link + * #check(PushCertificate)}. */ protected abstract boolean shouldClose(Repository repo); /** * Perform custom checks. - *

- * Default implementation reports no problems, but may be overridden by - * subclasses. + * + *

Default implementation reports no problems, but may be overridden by subclasses. * * @param repo a repository previously returned by {@link #getRepository()}. * @return the result of the custom check. @@ -178,8 +174,8 @@ public abstract class PushCertificateChecker { } private PGPSignature readSignature(PushCertificate cert) throws IOException { - ArmoredInputStream in = new ArmoredInputStream( - new ByteArrayInputStream(Constants.encode(cert.getSignature()))); + ArmoredInputStream in = + new ArmoredInputStream(new ByteArrayInputStream(Constants.encode(cert.getSignature()))); PGPObjectFactory factory = new BcPGPObjectFactory(in); Object obj; while ((obj = factory.nextObject()) != null) { @@ -193,32 +189,28 @@ public abstract class PushCertificateChecker { return null; } - private Result checkSignature(PGPSignature sig, PushCertificate cert, - PublicKeyStore store) throws PGPException, IOException { + private Result checkSignature(PGPSignature sig, PushCertificate cert, PublicKeyStore store) + throws PGPException, IOException { PGPPublicKeyRingCollection keys = store.get(sig.getKeyID()); if (!keys.getKeyRings().hasNext()) { - return new Result(null, - CheckResult.bad("No public keys found for key ID " - + keyIdToString(sig.getKeyID()))); - } - PGPPublicKey signer = - PublicKeyStore.getSigner(keys, sig, Constants.encode(cert.toText())); - if (signer == null) { - return new Result(null, - CheckResult.bad("Signature by " + keyIdToString(sig.getKeyID()) - + " is not valid")); - } - CheckResult result = publicKeyChecker - .setStore(store) - .setEffectiveTime(sig.getCreationTime()) - .check(signer); - if (!result.getProblems().isEmpty()) { - StringBuilder err = new StringBuilder("Invalid public key ") - .append(keyToString(signer)) - .append(":\n ") - .append(Joiner.on("\n ").join(result.getProblems())); return new Result( - signer, CheckResult.create(result.getStatus(), err.toString())); + null, + CheckResult.bad("No public keys found for key ID " + keyIdToString(sig.getKeyID()))); + } + PGPPublicKey signer = PublicKeyStore.getSigner(keys, sig, Constants.encode(cert.toText())); + if (signer == null) { + return new Result( + null, CheckResult.bad("Signature by " + keyIdToString(sig.getKeyID()) + " is not valid")); + } + CheckResult result = + publicKeyChecker.setStore(store).setEffectiveTime(sig.getCreationTime()).check(signer); + if (!result.getProblems().isEmpty()) { + StringBuilder err = + new StringBuilder("Invalid public key ") + .append(keyToString(signer)) + .append(":\n ") + .append(Joiner.on("\n ").join(result.getProblems())); + return new Result(signer, CheckResult.create(result.getStatus(), err.toString())); } return new Result(signer, result); } diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/SignedPushModule.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/SignedPushModule.java index bc027cdcf8..c32e1dfbc1 100644 --- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/SignedPushModule.java +++ b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/SignedPushModule.java @@ -29,7 +29,12 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.ProvisionException; import com.google.inject.Singleton; - +import java.io.IOException; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.transport.PreReceiveHook; @@ -39,16 +44,8 @@ import org.eclipse.jgit.transport.SignedPushConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.security.NoSuchAlgorithmException; -import java.security.SecureRandom; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - class SignedPushModule extends AbstractModule { - private static final Logger log = - LoggerFactory.getLogger(SignedPushModule.class); + private static final Logger log = LoggerFactory.getLogger(SignedPushModule.class); @Override protected void configure() { @@ -56,8 +53,7 @@ class SignedPushModule extends AbstractModule { throw new ProvisionException("Bouncy Castle PGP not installed"); } bind(PublicKeyStore.class).toProvider(StoreProvider.class); - DynamicSet.bind(binder(), ReceivePackInitializer.class) - .to(Initializer.class); + DynamicSet.bind(binder(), ReceivePackInitializer.class).to(Initializer.class); } @Singleton @@ -67,7 +63,8 @@ class SignedPushModule extends AbstractModule { private final ProjectCache projectCache; @Inject - Initializer(@GerritServerConfig Config cfg, + Initializer( + @GerritServerConfig Config cfg, @EnableSignedPush boolean enableSignedPush, SignedPushPreReceiveHook hook, ProjectCache projectCache) { @@ -95,9 +92,11 @@ class SignedPushModule extends AbstractModule { rp.setSignedPushConfig(null); return; } else if (signedPushConfig == null) { - log.error("receive.enableSignedPush is true for project {} but" - + " false in gerrit.config, so signed push verification is" - + " disabled", project.get()); + log.error( + "receive.enableSignedPush is true for project {} but" + + " false in gerrit.config, so signed push verification is" + + " disabled", + project.get()); rp.setSignedPushConfig(null); return; } @@ -119,8 +118,7 @@ class SignedPushModule extends AbstractModule { private final AllUsersName allUsers; @Inject - StoreProvider(GitRepositoryManager repoManager, - AllUsersName allUsers) { + StoreProvider(GitRepositoryManager repoManager, AllUsersName allUsers) { this.repoManager = repoManager; this.allUsers = allUsers; } @@ -159,5 +157,4 @@ class SignedPushModule extends AbstractModule { } return sb.toString(); } - } diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/SignedPushPreReceiveHook.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/SignedPushPreReceiveHook.java index 59157bdee4..2755b915a9 100644 --- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/SignedPushPreReceiveHook.java +++ b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/SignedPushPreReceiveHook.java @@ -19,20 +19,18 @@ import com.google.gerrit.server.util.MagicBranch; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.util.Collection; import org.eclipse.jgit.transport.PreReceiveHook; import org.eclipse.jgit.transport.PushCertificate; import org.eclipse.jgit.transport.ReceiveCommand; import org.eclipse.jgit.transport.ReceivePack; -import java.util.Collection; - /** * Pre-receive hook to check signed pushes. - *

- * If configured, prior to processing any push using - * {@link com.google.gerrit.server.git.ReceiveCommits}, requires that any push - * certificate present must be valid. + * + *

If configured, prior to processing any push using {@link + * com.google.gerrit.server.git.ReceiveCommits}, requires that any push certificate present must be + * valid. */ @Singleton public class SignedPushPreReceiveHook implements PreReceiveHook { @@ -47,8 +45,7 @@ public class SignedPushPreReceiveHook implements PreReceiveHook { } } - private Required() { - } + private Required() {} } private final Provider user; @@ -56,23 +53,19 @@ public class SignedPushPreReceiveHook implements PreReceiveHook { @Inject public SignedPushPreReceiveHook( - Provider user, - GerritPushCertificateChecker.Factory checkerFactory) { + Provider user, GerritPushCertificateChecker.Factory checkerFactory) { this.user = user; this.checkerFactory = checkerFactory; } @Override - public void onPreReceive(ReceivePack rp, - Collection commands) { + public void onPreReceive(ReceivePack rp, Collection commands) { PushCertificate cert = rp.getPushCertificate(); if (cert == null) { return; } - CheckResult result = checkerFactory.create(user.get()) - .setCheckNonce(true) - .check(cert) - .getCheckResult(); + CheckResult result = + checkerFactory.create(user.get()).setCheckNonce(true).check(cert).getCheckResult(); if (!isAllowed(result, commands)) { for (String problem : result.getProblems()) { rp.sendMessage(problem); @@ -81,8 +74,7 @@ public class SignedPushPreReceiveHook implements PreReceiveHook { } } - private static boolean isAllowed(CheckResult result, - Collection commands) { + private static boolean isAllowed(CheckResult result, Collection commands) { if (onlyMagicBranches(commands)) { // Only pushing magic branches: allow a valid push certificate even if the // key is not ultimately trusted. Assume anyone with Submit permission to @@ -102,8 +94,7 @@ public class SignedPushPreReceiveHook implements PreReceiveHook { return true; } - private static void reject(Collection commands, - String reason) { + private static void reject(Collection commands, String reason) { for (ReceiveCommand cmd : commands) { if (cmd.getResult() == ReceiveCommand.Result.NOT_ATTEMPTED) { cmd.setResult(ReceiveCommand.Result.REJECTED_OTHER_REASON, reason); diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/api/GpgApiAdapterImpl.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/api/GpgApiAdapterImpl.java index 6809234ed9..5c1fad5ca7 100644 --- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/api/GpgApiAdapterImpl.java +++ b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/api/GpgApiAdapterImpl.java @@ -29,14 +29,12 @@ import com.google.gerrit.server.account.AccountResource; import com.google.gerrit.server.api.accounts.GpgApiAdapter; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - -import org.bouncycastle.openpgp.PGPException; -import org.eclipse.jgit.transport.PushCertificate; -import org.eclipse.jgit.transport.PushCertificateParser; - import java.io.IOException; import java.util.List; import java.util.Map; +import org.bouncycastle.openpgp.PGPException; +import org.eclipse.jgit.transport.PushCertificate; +import org.eclipse.jgit.transport.PushCertificateParser; public class GpgApiAdapterImpl implements GpgApiAdapter { private final PostGpgKeys postGpgKeys; @@ -72,8 +70,8 @@ public class GpgApiAdapterImpl implements GpgApiAdapter { } @Override - public Map putGpgKeys(AccountResource account, - List add, List delete) + public Map putGpgKeys( + AccountResource account, List add, List delete) throws RestApiException, GpgException { PostGpgKeys.Input in = new PostGpgKeys.Input(); in.add = add; @@ -96,14 +94,12 @@ public class GpgApiAdapterImpl implements GpgApiAdapter { } @Override - public PushCertificateInfo checkPushCertificate(String certStr, - IdentifiedUser expectedUser) throws GpgException { + public PushCertificateInfo checkPushCertificate(String certStr, IdentifiedUser expectedUser) + throws GpgException { try { PushCertificate cert = PushCertificateParser.fromString(certStr); - PushCertificateChecker.Result result = pushCertCheckerFactory - .create(expectedUser) - .setCheckNonce(false) - .check(cert); + PushCertificateChecker.Result result = + pushCertCheckerFactory.create(expectedUser).setCheckNonce(false).check(cert); PushCertificateInfo info = new PushCertificateInfo(); info.certificate = certStr; info.key = GpgKeys.toJson(result.getPublicKey(), result.getCheckResult()); @@ -112,5 +108,4 @@ public class GpgApiAdapterImpl implements GpgApiAdapter { throw new GpgException(e); } } - } diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/api/GpgApiModule.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/api/GpgApiModule.java index e65ebf25c8..f7102d80c6 100644 --- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/api/GpgApiModule.java +++ b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/api/GpgApiModule.java @@ -30,7 +30,6 @@ import com.google.gerrit.gpg.server.PostGpgKeys; import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.account.AccountResource; import com.google.gerrit.server.api.accounts.GpgApiAdapter; - import java.util.List; import java.util.Map; @@ -72,8 +71,8 @@ public class GpgApiModule extends RestApiModule { } @Override - public Map putGpgKeys(AccountResource account, - List add, List delete) { + public Map putGpgKeys( + AccountResource account, List add, List delete) { throw new NotImplementedException(MSG); } @@ -83,8 +82,7 @@ public class GpgApiModule extends RestApiModule { } @Override - public PushCertificateInfo checkPushCertificate(String certStr, - IdentifiedUser expectedUser) { + public PushCertificateInfo checkPushCertificate(String certStr, IdentifiedUser expectedUser) { throw new NotImplementedException(MSG); } } diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/api/GpgKeyApiImpl.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/api/GpgKeyApiImpl.java index ab301840e8..e99f900aee 100644 --- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/api/GpgKeyApiImpl.java +++ b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/api/GpgKeyApiImpl.java @@ -23,10 +23,8 @@ import com.google.gerrit.gpg.server.GpgKeys; import com.google.gwtorm.server.OrmException; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - -import org.bouncycastle.openpgp.PGPException; - import java.io.IOException; +import org.bouncycastle.openpgp.PGPException; public class GpgKeyApiImpl implements GpgKeyApi { public interface Factory { @@ -38,10 +36,7 @@ public class GpgKeyApiImpl implements GpgKeyApi { private final GpgKey rsrc; @AssistedInject - GpgKeyApiImpl( - GpgKeys.Get get, - DeleteGpgKey delete, - @Assisted GpgKey rsrc) { + GpgKeyApiImpl(GpgKeys.Get get, DeleteGpgKey delete, @Assisted GpgKey rsrc) { this.get = get; this.delete = delete; this.rsrc = rsrc; diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/DeleteGpgKey.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/DeleteGpgKey.java index cac0e72785..1b797eb6e1 100644 --- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/DeleteGpgKey.java +++ b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/DeleteGpgKey.java @@ -29,19 +29,16 @@ import com.google.gerrit.server.account.AccountCache; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - +import java.io.IOException; +import java.util.Collections; import org.bouncycastle.openpgp.PGPException; import org.bouncycastle.openpgp.PGPPublicKey; import org.eclipse.jgit.lib.CommitBuilder; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.RefUpdate; -import java.io.IOException; -import java.util.Collections; - public class DeleteGpgKey implements RestModifyView { - public static class Input { - } + public static class Input {} private final Provider serverIdent; private final Provider db; @@ -49,7 +46,8 @@ public class DeleteGpgKey implements RestModifyView { private final AccountCache accountCache; @Inject - DeleteGpgKey(@GerritPersonIdent Provider serverIdent, + DeleteGpgKey( + @GerritPersonIdent Provider serverIdent, Provider db, Provider storeProvider, AccountCache accountCache) { @@ -61,12 +59,11 @@ public class DeleteGpgKey implements RestModifyView { @Override public Response apply(GpgKey rsrc, Input input) - throws ResourceConflictException, PGPException, OrmException, - IOException { + throws ResourceConflictException, PGPException, OrmException, IOException { PGPPublicKey key = rsrc.getKeyRing().getPublicKey(); - AccountExternalId.Key extIdKey = new AccountExternalId.Key( - AccountExternalId.SCHEME_GPGKEY, - BaseEncoding.base16().encode(key.getFingerprint())); + AccountExternalId.Key extIdKey = + new AccountExternalId.Key( + AccountExternalId.SCHEME_GPGKEY, BaseEncoding.base16().encode(key.getFingerprint())); db.get().accountExternalIds().deleteKeys(Collections.singleton(extIdKey)); accountCache.evict(rsrc.getUser().getAccountId()); @@ -75,8 +72,7 @@ public class DeleteGpgKey implements RestModifyView { CommitBuilder cb = new CommitBuilder(); PersonIdent committer = serverIdent.get(); - cb.setAuthor(rsrc.getUser().newCommitterIdent( - committer.getWhen(), committer.getTimeZone())); + cb.setAuthor(rsrc.getUser().newCommitterIdent(committer.getWhen(), committer.getTimeZone())); cb.setCommitter(committer); cb.setMessage("Delete public key " + keyIdToString(key.getKeyID())); @@ -94,8 +90,7 @@ public class DeleteGpgKey implements RestModifyView { case REJECTED_CURRENT_BRANCH: case RENAMED: default: - throw new ResourceConflictException( - "Failed to delete public key: " + saveResult); + throw new ResourceConflictException("Failed to delete public key: " + saveResult); } } return Response.none(); diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/GpgKey.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/GpgKey.java index 2fe7eb661c..aa6b6f4932 100644 --- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/GpgKey.java +++ b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/GpgKey.java @@ -18,7 +18,6 @@ import com.google.gerrit.extensions.restapi.RestView; import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.account.AccountResource; import com.google.inject.TypeLiteral; - import org.bouncycastle.openpgp.PGPPublicKeyRing; public class GpgKey extends AccountResource { diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/GpgKeys.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/GpgKeys.java index ddee18d0cb..9ade1450e3 100644 --- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/GpgKeys.java +++ b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/GpgKeys.java @@ -45,7 +45,12 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; import org.bouncycastle.bcpg.ArmoredOutputStream; import org.bouncycastle.openpgp.PGPException; import org.bouncycastle.openpgp.PGPPublicKey; @@ -54,16 +59,8 @@ import org.eclipse.jgit.util.NB; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - @Singleton -public class GpgKeys implements - ChildCollection { +public class GpgKeys implements ChildCollection { private static final Logger log = LoggerFactory.getLogger(GpgKeys.class); public static String MIME_TYPE = "application/pgp-keys"; @@ -75,7 +72,8 @@ public class GpgKeys implements private final GerritPublicKeyChecker.Factory checkerFactory; @Inject - GpgKeys(DynamicMap> views, + GpgKeys( + DynamicMap> views, Provider db, Provider self, Provider storeProvider, @@ -88,15 +86,13 @@ public class GpgKeys implements } @Override - public ListGpgKeys list() - throws ResourceNotFoundException, AuthException { + public ListGpgKeys list() throws ResourceNotFoundException, AuthException { return new ListGpgKeys(); } @Override public GpgKey parse(AccountResource parent, IdString id) - throws ResourceNotFoundException, PGPException, OrmException, - IOException { + throws ResourceNotFoundException, PGPException, OrmException, IOException { checkVisible(self, parent); String str = CharMatcher.whitespace().removeFrom(id.get()).toUpperCase(); if ((str.length() != 8 && str.length() != 40) @@ -118,8 +114,7 @@ public class GpgKeys implements throw new ResourceNotFoundException(id); } - static byte[] parseFingerprint(String str, - Iterable existingExtIds) + static byte[] parseFingerprint(String str, Iterable existingExtIds) throws ResourceNotFoundException { str = CharMatcher.whitespace().removeFrom(str).toUpperCase(); if ((str.length() != 8 && str.length() != 40) @@ -153,8 +148,7 @@ public class GpgKeys implements public class ListGpgKeys implements RestReadView { @Override public Map apply(AccountResource rsrc) - throws OrmException, PGPException, IOException, - ResourceNotFoundException { + throws OrmException, PGPException, IOException, ResourceNotFoundException { checkVisible(self, rsrc); Map keys = new HashMap<>(); try (PublicKeyStore store = storeProvider.get()) { @@ -165,18 +159,16 @@ public class GpgKeys implements for (PGPPublicKeyRing keyRing : store.get(keyId(fp))) { if (Arrays.equals(keyRing.getPublicKey().getFingerprint(), fp)) { found = true; - GpgKeyInfo info = toJson( - keyRing.getPublicKey(), - checkerFactory.create(rsrc.getUser(), store), - store); + GpgKeyInfo info = + toJson( + keyRing.getPublicKey(), checkerFactory.create(rsrc.getUser(), store), store); keys.put(info.id, info); info.id = null; break; } } if (!found) { - log.warn("No public key stored for fingerprint {}", - Fingerprint.toString(fp)); + log.warn("No public key stored for fingerprint {}", Fingerprint.toString(fp)); } } } @@ -190,8 +182,7 @@ public class GpgKeys implements private final GerritPublicKeyChecker.Factory checkerFactory; @Inject - Get(Provider storeProvider, - GerritPublicKeyChecker.Factory checkerFactory) { + Get(Provider storeProvider, GerritPublicKeyChecker.Factory checkerFactory) { this.storeProvider = storeProvider; this.checkerFactory = checkerFactory; } @@ -208,14 +199,13 @@ public class GpgKeys implements } @VisibleForTesting - public static FluentIterable getGpgExtIds(ReviewDb db, - Account.Id accountId) throws OrmException { + public static FluentIterable getGpgExtIds(ReviewDb db, Account.Id accountId) + throws OrmException { return FluentIterable.from(db.accountExternalIds().byAccount(accountId)) .filter(in -> in.isScheme(SCHEME_GPGKEY)); } - private Iterable getGpgExtIds(AccountResource rsrc) - throws OrmException { + private Iterable getGpgExtIds(AccountResource rsrc) throws OrmException { return getGpgExtIds(db.get(), rsrc.getUser().getAccountId()); } @@ -233,8 +223,7 @@ public class GpgKeys implements } } - public static GpgKeyInfo toJson(PGPPublicKey key, CheckResult checkResult) - throws IOException { + public static GpgKeyInfo toJson(PGPPublicKey key, CheckResult checkResult) throws IOException { GpgKeyInfo info = new GpgKeyInfo(); if (key != null) { @@ -261,8 +250,8 @@ public class GpgKeys implements return info; } - static GpgKeyInfo toJson(PGPPublicKey key, PublicKeyChecker checker, - PublicKeyStore store) throws IOException { + static GpgKeyInfo toJson(PGPPublicKey key, PublicKeyChecker checker, PublicKeyStore store) + throws IOException { return toJson(key, checker.setStore(store).check(key)); } diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/PostGpgKeys.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/PostGpgKeys.java index 20db31f5df..1c6fc3a203 100644 --- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/PostGpgKeys.java +++ b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/PostGpgKeys.java @@ -53,7 +53,14 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; import org.bouncycastle.bcpg.ArmoredInputStream; import org.bouncycastle.openpgp.PGPException; import org.bouncycastle.openpgp.PGPPublicKey; @@ -65,15 +72,6 @@ import org.eclipse.jgit.lib.RefUpdate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; - @Singleton public class PostGpgKeys implements RestModifyView { public static class Input { @@ -92,7 +90,8 @@ public class PostGpgKeys implements RestModifyView { private final Provider accountQueryProvider; @Inject - PostGpgKeys(@GerritPersonIdent Provider serverIdent, + PostGpgKeys( + @GerritPersonIdent Provider serverIdent, Provider db, Provider self, Provider storeProvider, @@ -112,8 +111,8 @@ public class PostGpgKeys implements RestModifyView { @Override public Map apply(AccountResource rsrc, Input input) - throws ResourceNotFoundException, BadRequestException, - ResourceConflictException, PGPException, OrmException, IOException { + throws ResourceNotFoundException, BadRequestException, ResourceConflictException, + PGPException, OrmException, IOException { GpgKeys.checkVisible(self, rsrc); List existingExtIds = @@ -130,12 +129,10 @@ public class PostGpgKeys implements RestModifyView { Account account = getAccountByExternalId(extIdKey.get()); if (account != null) { if (!account.getId().equals(rsrc.getUser().getAccountId())) { - throw new ResourceConflictException( - "GPG key already associated with another account"); + throw new ResourceConflictException("GPG key already associated with another account"); } } else { - newExtIds.add( - new AccountExternalId(rsrc.getUser().getAccountId(), extIdKey)); + newExtIds.add(new AccountExternalId(rsrc.getUser().getAccountId(), extIdKey)); } } @@ -143,24 +140,22 @@ public class PostGpgKeys implements RestModifyView { if (!newExtIds.isEmpty()) { db.get().accountExternalIds().insert(newExtIds); } - db.get().accountExternalIds().deleteKeys( - Iterables.transform(toRemove, fp -> toExtIdKey(fp.get()))); + db.get() + .accountExternalIds() + .deleteKeys(Iterables.transform(toRemove, fp -> toExtIdKey(fp.get()))); accountCache.evict(rsrc.getUser().getAccountId()); return toJson(newKeys, toRemove, store, rsrc.getUser()); } } - private Set readKeysToRemove(Input input, - List existingExtIds) { + private Set readKeysToRemove(Input input, List existingExtIds) { if (input.delete == null || input.delete.isEmpty()) { return ImmutableSet.of(); } - Set fingerprints = - Sets.newHashSetWithExpectedSize(input.delete.size()); + Set fingerprints = Sets.newHashSetWithExpectedSize(input.delete.size()); for (String id : input.delete) { try { - fingerprints.add(new Fingerprint( - GpgKeys.parseFingerprint(id, existingExtIds))); + fingerprints.add(new Fingerprint(GpgKeys.parseFingerprint(id, existingExtIds))); } catch (ResourceNotFoundException e) { // Skip removal. } @@ -168,8 +163,7 @@ public class PostGpgKeys implements RestModifyView { return fingerprints; } - private List readKeysToAdd(Input input, - Set toRemove) + private List readKeysToAdd(Input input, Set toRemove) throws BadRequestException, IOException { if (input.add == null || input.add.isEmpty()) { return ImmutableList.of(); @@ -184,10 +178,9 @@ public class PostGpgKeys implements RestModifyView { throw new BadRequestException("Expected exactly one PUBLIC KEY BLOCK"); } PGPPublicKeyRing keyRing = (PGPPublicKeyRing) objs.get(0); - if (toRemove.contains( - new Fingerprint(keyRing.getPublicKey().getFingerprint()))) { - throw new BadRequestException("Cannot both add and delete key: " - + keyToString(keyRing.getPublicKey())); + if (toRemove.contains(new Fingerprint(keyRing.getPublicKey().getFingerprint()))) { + throw new BadRequestException( + "Cannot both add and delete key: " + keyToString(keyRing.getPublicKey())); } keyRings.add(keyRing); } @@ -195,21 +188,20 @@ public class PostGpgKeys implements RestModifyView { return keyRings; } - private void storeKeys(AccountResource rsrc, List keyRings, - Set toRemove) throws BadRequestException, - ResourceConflictException, PGPException, IOException { + private void storeKeys( + AccountResource rsrc, List keyRings, Set toRemove) + throws BadRequestException, ResourceConflictException, PGPException, IOException { try (PublicKeyStore store = storeProvider.get()) { List addedKeys = new ArrayList<>(); for (PGPPublicKeyRing keyRing : keyRings) { PGPPublicKey key = keyRing.getPublicKey(); // Don't check web of trust; admins can fill in certifications later. - CheckResult result = checkerFactory.create(rsrc.getUser(), store) - .disableTrust() - .check(key); + CheckResult result = checkerFactory.create(rsrc.getUser(), store).disableTrust().check(key); if (!result.isOk()) { - throw new BadRequestException(String.format( - "Problems with public key %s:\n%s", - keyToString(key), Joiner.on('\n').join(result.getProblems()))); + throw new BadRequestException( + String.format( + "Problems with public key %s:\n%s", + keyToString(key), Joiner.on('\n').join(result.getProblems()))); } addedKeys.add(PublicKeyStore.keyToString(key)); store.add(keyRing); @@ -219,8 +211,7 @@ public class PostGpgKeys implements RestModifyView { } CommitBuilder cb = new CommitBuilder(); PersonIdent committer = serverIdent.get(); - cb.setAuthor(rsrc.getUser().newCommitterIdent( - committer.getWhen(), committer.getTimeZone())); + cb.setAuthor(rsrc.getUser().newCommitterIdent(committer.getWhen(), committer.getTimeZone())); cb.setCommitter(committer); RefUpdate.Result saveResult = store.save(cb); @@ -231,8 +222,10 @@ public class PostGpgKeys implements RestModifyView { try { addKeyFactory.create(rsrc.getUser(), addedKeys).send(); } catch (EmailException e) { - log.error("Cannot send GPG key added message to " - + rsrc.getUser().getAccount().getPreferredEmail(), e); + log.error( + "Cannot send GPG key added message to " + + rsrc.getUser().getAccount().getPreferredEmail(), + e); } break; case NO_CHANGE: @@ -245,22 +238,18 @@ public class PostGpgKeys implements RestModifyView { case RENAMED: default: // TODO(dborowitz): Backoff and retry on LOCK_FAILURE. - throw new ResourceConflictException( - "Failed to save public keys: " + saveResult); + throw new ResourceConflictException("Failed to save public keys: " + saveResult); } } } private AccountExternalId.Key toExtIdKey(byte[] fp) { return new AccountExternalId.Key( - AccountExternalId.SCHEME_GPGKEY, - BaseEncoding.base16().encode(fp)); + AccountExternalId.SCHEME_GPGKEY, BaseEncoding.base16().encode(fp)); } - private Account getAccountByExternalId(String externalId) - throws OrmException { - List accountStates = - accountQueryProvider.get().byExternalId(externalId); + private Account getAccountByExternalId(String externalId) throws OrmException { + List accountStates = accountQueryProvider.get().byExternalId(externalId); if (accountStates.isEmpty()) { return null; @@ -268,10 +257,9 @@ public class PostGpgKeys implements RestModifyView { if (accountStates.size() > 1) { StringBuilder msg = new StringBuilder(); - msg.append("GPG key ").append(externalId) - .append(" associated with multiple accounts: "); - Joiner.on(", ").appendTo(msg, - Lists.transform(accountStates, AccountState.ACCOUNT_ID_FUNCTION)); + msg.append("GPG key ").append(externalId).append(" associated with multiple accounts: "); + Joiner.on(", ") + .appendTo(msg, Lists.transform(accountStates, AccountState.ACCOUNT_ID_FUNCTION)); log.error(msg.toString()); throw new IllegalStateException(msg.toString()); } @@ -281,13 +269,14 @@ public class PostGpgKeys implements RestModifyView { private Map toJson( Collection keys, - Set deleted, PublicKeyStore store, IdentifiedUser user) + Set deleted, + PublicKeyStore store, + IdentifiedUser user) throws IOException { // Unlike when storing keys, include web-of-trust checks when producing // result JSON, so the user at least knows of any issues. PublicKeyChecker checker = checkerFactory.create(user, store); - Map infos = - Maps.newHashMapWithExpectedSize(keys.size() + deleted.size()); + Map infos = Maps.newHashMapWithExpectedSize(keys.size() + deleted.size()); for (PGPPublicKeyRing keyRing : keys) { PGPPublicKey key = keyRing.getPublicKey(); CheckResult result = checker.check(key); diff --git a/gerrit-gpg/src/test/java/com/google/gerrit/gpg/GerritPublicKeyCheckerTest.java b/gerrit-gpg/src/test/java/com/google/gerrit/gpg/GerritPublicKeyCheckerTest.java index e39c8ae5ba..011f54b877 100644 --- a/gerrit-gpg/src/test/java/com/google/gerrit/gpg/GerritPublicKeyCheckerTest.java +++ b/gerrit-gpg/src/test/java/com/google/gerrit/gpg/GerritPublicKeyCheckerTest.java @@ -52,7 +52,11 @@ import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Provider; import com.google.inject.util.Providers; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; import org.bouncycastle.openpgp.PGPPublicKey; import org.bouncycastle.openpgp.PGPPublicKeyRing; import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription; @@ -66,34 +70,21 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - /** Unit tests for {@link GerritPublicKeyChecker}. */ public class GerritPublicKeyCheckerTest { - @Inject - private AccountCache accountCache; + @Inject private AccountCache accountCache; - @Inject - private AccountManager accountManager; + @Inject private AccountManager accountManager; - @Inject - private GerritPublicKeyChecker.Factory checkerFactory; + @Inject private GerritPublicKeyChecker.Factory checkerFactory; - @Inject - private IdentifiedUser.GenericFactory userFactory; + @Inject private IdentifiedUser.GenericFactory userFactory; - @Inject - private InMemoryDatabase schemaFactory; + @Inject private InMemoryDatabase schemaFactory; - @Inject - private SchemaCreator schemaCreator; + @Inject private SchemaCreator schemaCreator; - @Inject - private ThreadLocalRequestContext requestContext; + @Inject private ThreadLocalRequestContext requestContext; private LifecycleManager lifecycle; private ReviewDb db; @@ -106,11 +97,14 @@ public class GerritPublicKeyCheckerTest { public void setUpInjector() throws Exception { Config cfg = InMemoryModule.newDefaultConfig(); cfg.setInt("receive", null, "maxTrustDepth", 2); - cfg.setStringList("receive", null, "trustedKey", ImmutableList.of( - Fingerprint.toString(keyB().getPublicKey().getFingerprint()), - Fingerprint.toString(keyD().getPublicKey().getFingerprint()))); - Injector injector = Guice.createInjector( - new InMemoryModule(cfg, new TestNotesMigration())); + cfg.setStringList( + "receive", + null, + "trustedKey", + ImmutableList.of( + Fingerprint.toString(keyB().getPublicKey().getFingerprint()), + Fingerprint.toString(keyD().getPublicKey().getFingerprint()))); + Injector injector = Guice.createInjector(new InMemoryModule(cfg, new TestNotesMigration())); lifecycle = new LifecycleManager(); lifecycle.add(injector); @@ -119,25 +113,25 @@ public class GerritPublicKeyCheckerTest { db = schemaFactory.open(); schemaCreator.create(db); - userId = - accountManager.authenticate(AuthRequest.forUser("user")).getAccountId(); + userId = accountManager.authenticate(AuthRequest.forUser("user")).getAccountId(); Account userAccount = db.accounts().get(userId); // Note: does not match any key in TestKeys. userAccount.setPreferredEmail("user@example.com"); db.accounts().update(ImmutableList.of(userAccount)); user = reloadUser(); - requestContext.setContext(new RequestContext() { - @Override - public CurrentUser getUser() { - return user; - } + requestContext.setContext( + new RequestContext() { + @Override + public CurrentUser getUser() { + return user; + } - @Override - public Provider getReviewDbProvider() { - return Providers.of(db); - } - }); + @Override + public Provider getReviewDbProvider() { + return Providers.of(db); + } + }); storeRepo = new InMemoryRepository(new DfsRepositoryDescription("repo")); store = new PublicKeyStore(storeRepo); @@ -175,86 +169,78 @@ public class GerritPublicKeyCheckerTest { @Test public void defaultGpgCertificationMatchesEmail() throws Exception { TestKey key = validKeyWithSecondUserId(); - PublicKeyChecker checker = checkerFactory.create(user, store) - .disableTrust(); + PublicKeyChecker checker = checkerFactory.create(user, store).disableTrust(); assertProblems( - checker.check(key.getPublicKey()), Status.BAD, + checker.check(key.getPublicKey()), + Status.BAD, "Key must contain a valid certification for one of the following " - + "identities:\n" - + " gerrit:user\n" - + " username:user"); + + "identities:\n" + + " gerrit:user\n" + + " username:user"); addExternalId("test", "test", "test5@example.com"); - checker = checkerFactory.create(user, store) - .disableTrust(); + checker = checkerFactory.create(user, store).disableTrust(); assertNoProblems(checker.check(key.getPublicKey())); } @Test public void defaultGpgCertificationDoesNotMatchEmail() throws Exception { addExternalId("test", "test", "nobody@example.com"); - PublicKeyChecker checker = checkerFactory.create(user, store) - .disableTrust(); + PublicKeyChecker checker = checkerFactory.create(user, store).disableTrust(); assertProblems( - checker.check(validKeyWithSecondUserId().getPublicKey()), Status.BAD, + checker.check(validKeyWithSecondUserId().getPublicKey()), + Status.BAD, "Key must contain a valid certification for one of the following " - + "identities:\n" - + " gerrit:user\n" - + " nobody@example.com\n" - + " test:test\n" - + " username:user"); + + "identities:\n" + + " gerrit:user\n" + + " nobody@example.com\n" + + " test:test\n" + + " username:user"); } @Test public void manualCertificationMatchesExternalId() throws Exception { addExternalId("foo", "myId", null); - PublicKeyChecker checker = checkerFactory.create(user, store) - .disableTrust(); + PublicKeyChecker checker = checkerFactory.create(user, store).disableTrust(); assertNoProblems(checker.check(validKeyWithSecondUserId().getPublicKey())); } @Test public void manualCertificationDoesNotMatchExternalId() throws Exception { addExternalId("foo", "otherId", null); - PublicKeyChecker checker = checkerFactory.create(user, store) - .disableTrust(); + PublicKeyChecker checker = checkerFactory.create(user, store).disableTrust(); assertProblems( - checker.check(validKeyWithSecondUserId().getPublicKey()), Status.BAD, + checker.check(validKeyWithSecondUserId().getPublicKey()), + Status.BAD, "Key must contain a valid certification for one of the following " - + "identities:\n" - + " foo:otherId\n" - + " gerrit:user\n" - + " username:user"); + + "identities:\n" + + " foo:otherId\n" + + " gerrit:user\n" + + " username:user"); } @Test public void noExternalIds() throws Exception { - db.accountExternalIds().delete( - db.accountExternalIds().byAccount(user.getAccountId())); + db.accountExternalIds().delete(db.accountExternalIds().byAccount(user.getAccountId())); reloadUser(); TestKey key = validKeyWithSecondUserId(); - PublicKeyChecker checker = checkerFactory.create(user, store) - .disableTrust(); + PublicKeyChecker checker = checkerFactory.create(user, store).disableTrust(); assertProblems( - checker.check(key.getPublicKey()), Status.BAD, - "No identities found for user; check" - + " http://test/#/settings/web-identities"); + checker.check(key.getPublicKey()), + Status.BAD, + "No identities found for user; check" + " http://test/#/settings/web-identities"); - checker = checkerFactory.create() - .setStore(store) - .disableTrust(); + checker = checkerFactory.create().setStore(store).disableTrust(); assertProblems( - checker.check(key.getPublicKey()), Status.BAD, - "Key is not associated with any users"); + checker.check(key.getPublicKey()), Status.BAD, "Key is not associated with any users"); - db.accountExternalIds().insert(Collections.singleton( - new AccountExternalId( - user.getAccountId(), toExtIdKey(key.getPublicKey())))); + db.accountExternalIds() + .insert( + Collections.singleton( + new AccountExternalId(user.getAccountId(), toExtIdKey(key.getPublicKey())))); reloadUser(); - assertProblems( - checker.check(key.getPublicKey()), Status.BAD, - "No identities found for user"); + assertProblems(checker.check(key.getPublicKey()), Status.BAD, "No identities found for user"); } @Test @@ -281,14 +267,11 @@ public class GerritPublicKeyCheckerTest { // Checker for B, checking B. Trust chain and IDs are correct, so the only // problem is with the key itself. PublicKeyChecker checkerB = checkerFactory.create(userB, store); - assertProblems( - checkerB.check(keyB.getPublicKey()), Status.BAD, - "Key is expired"); + assertProblems(checkerB.check(keyB.getPublicKey()), Status.BAD, "Key is expired"); } @Test - public void checkWithValidKeyButWrongExpectedUserInChecker() - throws Exception { + public void checkWithValidKeyButWrongExpectedUserInChecker() throws Exception { // A---Bx // \ // \---C---D @@ -307,7 +290,8 @@ public class GerritPublicKeyCheckerTest { // Checker for A, checking B. PublicKeyChecker checkerA = checkerFactory.create(user, store); assertProblems( - checkerA.check(keyB.getPublicKey()), Status.BAD, + checkerA.check(keyB.getPublicKey()), + Status.BAD, "Key is expired", "Key must contain a valid certification for one of the following" + " identities:\n" @@ -319,7 +303,8 @@ public class GerritPublicKeyCheckerTest { // Checker for B, checking A. PublicKeyChecker checkerB = checkerFactory.create(userB, store); assertProblems( - checkerB.check(keyA.getPublicKey()), Status.BAD, + checkerB.check(keyA.getPublicKey()), + Status.BAD, "Key must contain a valid certification for one of the following" + " identities:\n" + " gerrit:userB\n" @@ -338,9 +323,11 @@ public class GerritPublicKeyCheckerTest { PublicKeyChecker checker = checkerFactory.create(user, store); assertProblems( - checker.check(keyA.getPublicKey()), Status.OK, + checker.check(keyA.getPublicKey()), + Status.OK, "No path to a trusted key", - "Certification by " + keyToString(keyB.getPublicKey()) + "Certification by " + + keyToString(keyB.getPublicKey()) + " is valid, but key is not trusted", "Key D24FE467 used for certification is not in store"); } @@ -363,16 +350,14 @@ public class GerritPublicKeyCheckerTest { // This checker can check any key, so the only problems come from issues // with the keys themselves, not having invalid user IDs. - PublicKeyChecker checker = checkerFactory.create() - .setStore(store); + PublicKeyChecker checker = checkerFactory.create().setStore(store); assertNoProblems(checker.check(keyA.getPublicKey())); - assertProblems( - checker.check(keyB.getPublicKey()), Status.BAD, - "Key is expired"); + assertProblems(checker.check(keyB.getPublicKey()), Status.BAD, "Key is expired"); assertNoProblems(checker.check(keyC.getPublicKey())); assertNoProblems(checker.check(keyD.getPublicKey())); assertProblems( - checker.check(keyE.getPublicKey()), Status.BAD, + checker.check(keyE.getPublicKey()), + Status.BAD, "Key is expired", "No path to a trusted key"); } @@ -389,16 +374,16 @@ public class GerritPublicKeyCheckerTest { PGPPublicKeyRing keyRingB = keyB().getPublicKeyRing(); PGPPublicKey keyB = keyRingB.getPublicKey(); - keyB = PGPPublicKey.removeCertification( - keyB, (String) keyB.getUserIDs().next()); + keyB = PGPPublicKey.removeCertification(keyB, (String) keyB.getUserIDs().next()); keyRingB = PGPPublicKeyRing.insertPublicKey(keyRingB, keyB); add(keyRingB, addUser("userB")); PublicKeyChecker checkerA = checkerFactory.create(user, store); - assertProblems(checkerA.check(keyA.getPublicKey()), Status.OK, + assertProblems( + checkerA.check(keyA.getPublicKey()), + Status.OK, "No path to a trusted key", - "Certification by " + keyToString(keyB) - + " is valid, but key is not trusted", + "Certification by " + keyToString(keyB) + " is valid, but key is not trusted", "Key D24FE467 used for certification is not in store"); } @@ -408,13 +393,12 @@ public class GerritPublicKeyCheckerTest { newExtIds.add(new AccountExternalId(id, toExtIdKey(kr.getPublicKey()))); @SuppressWarnings("unchecked") - String userId = (String) Iterators.getOnlyElement( - kr.getPublicKey().getUserIDs(), null); + String userId = (String) Iterators.getOnlyElement(kr.getPublicKey().getUserIDs(), null); if (userId != null) { String email = PushCertificateIdent.parse(userId).getEmailAddress(); assertThat(email).contains("@"); - AccountExternalId mailto = new AccountExternalId( - id, new AccountExternalId.Key(SCHEME_MAILTO, email)); + AccountExternalId mailto = + new AccountExternalId(id, new AccountExternalId.Key(SCHEME_MAILTO, email)); mailto.setEmailAddress(email); newExtIds.add(mailto); } @@ -435,15 +419,13 @@ public class GerritPublicKeyCheckerTest { return k; } - private void assertProblems(CheckResult result, Status expectedStatus, - String first, String... rest) throws Exception { + private void assertProblems( + CheckResult result, Status expectedStatus, String first, String... rest) throws Exception { List expectedProblems = new ArrayList<>(); expectedProblems.add(first); expectedProblems.addAll(Arrays.asList(rest)); assertThat(result.getStatus()).isEqualTo(expectedStatus); - assertThat(result.getProblems()) - .containsExactlyElementsIn(expectedProblems) - .inOrder(); + assertThat(result.getProblems()).containsExactlyElementsIn(expectedProblems).inOrder(); } private void assertNoProblems(CheckResult result) { @@ -451,10 +433,9 @@ public class GerritPublicKeyCheckerTest { assertThat(result.getProblems()).isEmpty(); } - private void addExternalId(String scheme, String id, String email) - throws Exception { - AccountExternalId extId = new AccountExternalId(user.getAccountId(), - new AccountExternalId.Key(scheme, id)); + private void addExternalId(String scheme, String id, String email) throws Exception { + AccountExternalId extId = + new AccountExternalId(user.getAccountId(), new AccountExternalId.Key(scheme, id)); if (email != null) { extId.setEmailAddress(email); } diff --git a/gerrit-gpg/src/test/java/com/google/gerrit/gpg/PublicKeyCheckerTest.java b/gerrit-gpg/src/test/java/com/google/gerrit/gpg/PublicKeyCheckerTest.java index bd71bc546e..5da23a5abc 100644 --- a/gerrit-gpg/src/test/java/com/google/gerrit/gpg/PublicKeyCheckerTest.java +++ b/gerrit-gpg/src/test/java/com/google/gerrit/gpg/PublicKeyCheckerTest.java @@ -38,7 +38,15 @@ import static org.bouncycastle.openpgp.PGPSignature.DIRECT_KEY; import static org.junit.Assert.assertEquals; import com.google.gerrit.gpg.testutil.TestKey; - +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; import org.bouncycastle.openpgp.PGPPublicKey; import org.bouncycastle.openpgp.PGPPublicKeyRing; import org.bouncycastle.openpgp.PGPSignature; @@ -53,19 +61,8 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - public class PublicKeyCheckerTest { - @Rule - public ExpectedException thrown = ExpectedException.none(); + @Rule public ExpectedException thrown = ExpectedException.none(); private InMemoryRepository repo; private PublicKeyStore store; @@ -97,8 +94,7 @@ public class PublicKeyCheckerTest { public void keyExpiringInFuture() throws Exception { TestKey k = validKeyWithExpiration(); - PublicKeyChecker checker = new PublicKeyChecker() - .setStore(store); + PublicKeyChecker checker = new PublicKeyChecker().setStore(store); assertNoProblems(checker, k); checker.setEffectiveTime(parseDate("2015-07-10 12:00:00 -0400")); @@ -115,8 +111,7 @@ public class PublicKeyCheckerTest { @Test public void selfRevokedKeyIsRevoked() throws Exception { - assertProblems(selfRevokedKey(), - "Key is revoked (key material has been compromised)"); + assertProblems(selfRevokedKey(), "Key is revoked (key material has been compromised)"); } // Test keys specific to this test are at the bottom of this class. Each test @@ -165,8 +160,7 @@ public class PublicKeyCheckerTest { save(); PublicKeyChecker checker = newChecker(1, kd); - assertProblems(checker, ka, - "No path to a trusted key", notTrusted(kb), notTrusted(kc)); + assertProblems(checker, ka, "No path to a trusted key", notTrusted(kb), notTrusted(kc)); } @Test @@ -177,10 +171,8 @@ public class PublicKeyCheckerTest { save(); PublicKeyChecker checker = newChecker(10, keyA()); - assertProblems(checker, kf, - "No path to a trusted key", notTrusted(kg)); - assertProblems(checker, kg, - "No path to a trusted key", notTrusted(kf)); + assertProblems(checker, kf, "No path to a trusted key", notTrusted(kg)); + assertProblems(checker, kg, "No path to a trusted key", notTrusted(kf)); } @Test @@ -196,8 +188,7 @@ public class PublicKeyCheckerTest { // J trusts I to a depth of 1, so I itself is valid, but I's certification // of K is not valid. assertNoProblems(checker, ki); - assertProblems(checker, kh, - "No path to a trusted key", notTrusted(ki)); + assertProblems(checker, kh, "No path to a trusted key", notTrusted(ki)); } @Test @@ -206,9 +197,7 @@ public class PublicKeyCheckerTest { add(validKeyWithoutExpiration()); save(); - assertProblems(k, - "Key is revoked (key material has been compromised):" - + " test6 compromised"); + assertProblems(k, "Key is revoked (key material has been compromised):" + " test6 compromised"); PGPPublicKeyRing kr = removeRevokers(k.getPublicKeyRing()); store.add(kr); @@ -219,20 +208,17 @@ public class PublicKeyCheckerTest { } @Test - public void revokedKeyDueToCompromiseRevokesKeyRetroactively() - throws Exception { + public void revokedKeyDueToCompromiseRevokesKeyRetroactively() throws Exception { TestKey k = add(revokedCompromisedKey()); add(validKeyWithoutExpiration()); save(); - String problem = - "Key is revoked (key material has been compromised): test6 compromised"; + String problem = "Key is revoked (key material has been compromised): test6 compromised"; assertProblems(k, problem); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - PublicKeyChecker checker = new PublicKeyChecker() - .setStore(store) - .setEffectiveTime(df.parse("2010-01-01 12:00:00")); + PublicKeyChecker checker = + new PublicKeyChecker().setStore(store).setEffectiveTime(df.parse("2010-01-01 12:00:00")); assertProblems(checker, k, problem); } @@ -241,9 +227,7 @@ public class PublicKeyCheckerTest { TestKey k = add(revokedCompromisedKey()); save(); - assertProblems(k, - "Key is revoked (key material has been compromised):" - + " test6 compromised"); + assertProblems(k, "Key is revoked (key material has been compromised):" + " test6 compromised"); } @Test @@ -252,29 +236,26 @@ public class PublicKeyCheckerTest { add(validKeyWithoutExpiration()); save(); - assertProblems(k, - "Key is revoked (retired and no longer valid): test7 not used"); + assertProblems(k, "Key is revoked (retired and no longer valid): test7 not used"); } @Test - public void revokedKeyDueToNoLongerBeingUsedDoesNotRevokeKeyRetroactively() - throws Exception { + public void revokedKeyDueToNoLongerBeingUsedDoesNotRevokeKeyRetroactively() throws Exception { TestKey k = add(revokedNoLongerUsedKey()); add(validKeyWithoutExpiration()); save(); - assertProblems(k, - "Key is revoked (retired and no longer valid): test7 not used"); + assertProblems(k, "Key is revoked (retired and no longer valid): test7 not used"); - PublicKeyChecker checker = new PublicKeyChecker() - .setStore(store) - .setEffectiveTime(parseDate("2010-01-01 12:00:00 -0400")); + PublicKeyChecker checker = + new PublicKeyChecker() + .setStore(store) + .setEffectiveTime(parseDate("2010-01-01 12:00:00 -0400")); assertNoProblems(checker, k); } @Test - public void keyRevokedByExpiredKeyAfterExpirationIsNotRevoked() - throws Exception { + public void keyRevokedByExpiredKeyAfterExpirationIsNotRevoked() throws Exception { TestKey k = add(keyRevokedByExpiredKeyAfterExpiration()); add(expiredKey()); save(); @@ -284,15 +265,13 @@ public class PublicKeyCheckerTest { } @Test - public void keyRevokedByExpiredKeyBeforeExpirationIsRevoked() - throws Exception { + public void keyRevokedByExpiredKeyBeforeExpirationIsRevoked() throws Exception { TestKey k = add(keyRevokedByExpiredKeyBeforeExpiration()); add(expiredKey()); save(); PublicKeyChecker checker = new PublicKeyChecker().setStore(store); - assertProblems(checker, k, - "Key is revoked (retired and no longer valid): test9 not used"); + assertProblems(checker, k, "Key is revoked (retired and no longer valid): test9 not used"); // Set time between key creation and revocation. checker.setEffectiveTime(parseDate("2005-08-01 13:00:00 -0400")); @@ -318,9 +297,7 @@ public class PublicKeyCheckerTest { Fingerprint fp = new Fingerprint(k.getPublicKey().getFingerprint()); fps.put(fp.getId(), fp); } - return new PublicKeyChecker() - .enableTrust(maxTrustDepth, fps) - .setStore(store); + return new PublicKeyChecker().enableTrust(maxTrustDepth, fps).setStore(store); } private TestKey add(TestKey k) { @@ -351,16 +328,13 @@ public class PublicKeyCheckerTest { } } - private void assertProblems(PublicKeyChecker checker, TestKey k, - String first, String... rest) { - CheckResult result = checker.setStore(store) - .check(k.getPublicKey()); + private void assertProblems(PublicKeyChecker checker, TestKey k, String first, String... rest) { + CheckResult result = checker.setStore(store).check(k.getPublicKey()); assertEquals(list(first, rest), result.getProblems()); } private void assertNoProblems(PublicKeyChecker checker, TestKey k) { - CheckResult result = checker.setStore(store) - .check(k.getPublicKey()); + CheckResult result = checker.setStore(store).check(k.getPublicKey()); assertEquals(Collections.emptyList(), result.getProblems()); } @@ -373,21 +347,18 @@ public class PublicKeyCheckerTest { } private void assertProblems(PGPPublicKey k, String first, String... rest) { - CheckResult result = new PublicKeyChecker() - .setStore(store) - .check(k); + CheckResult result = new PublicKeyChecker().setStore(store).check(k); assertEquals(list(first, rest), result.getProblems()); } private void assertNoProblems(PGPPublicKey k) { - CheckResult result = new PublicKeyChecker() - .setStore(store) - .check(k); + CheckResult result = new PublicKeyChecker().setStore(store).check(k); assertEquals(Collections.emptyList(), result.getProblems()); } private static String notTrusted(TestKey k) { - return "Certification by " + keyToString(k.getPublicKey()) + return "Certification by " + + keyToString(k.getPublicKey()) + " is valid, but key is not trusted"; } diff --git a/gerrit-gpg/src/test/java/com/google/gerrit/gpg/PublicKeyStoreTest.java b/gerrit-gpg/src/test/java/com/google/gerrit/gpg/PublicKeyStoreTest.java index 3df11540ff..c9c0b188d5 100644 --- a/gerrit-gpg/src/test/java/com/google/gerrit/gpg/PublicKeyStoreTest.java +++ b/gerrit-gpg/src/test/java/com/google/gerrit/gpg/PublicKeyStoreTest.java @@ -27,7 +27,12 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import com.google.gerrit.gpg.testutil.TestKey; - +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; import org.bouncycastle.openpgp.PGPPublicKey; import org.bouncycastle.openpgp.PGPPublicKeyRing; import org.bouncycastle.openpgp.PGPPublicKeyRingCollection; @@ -43,21 +48,13 @@ import org.eclipse.jgit.revwalk.RevWalk; import org.junit.Before; import org.junit.Test; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import java.util.TreeSet; - public class PublicKeyStoreTest { private TestRepository tr; private PublicKeyStore store; @Before public void setUp() throws Exception { - tr = new TestRepository<>(new InMemoryRepository( - new DfsRepositoryDescription("pubkeys"))); + tr = new TestRepository<>(new InMemoryRepository(new DfsRepositoryDescription("pubkeys"))); store = new PublicKeyStore(tr.getRepository()); } @@ -70,8 +67,9 @@ public class PublicKeyStoreTest { @Test public void testKeyToString() throws Exception { PGPPublicKey key = validKeyWithoutExpiration().getPublicKey(); - assertEquals("46328A8C Testuser One " - + " (04AE A7ED 2F82 1133 E5B1 28D1 ED06 25DC 4632 8A8C)", + assertEquals( + "46328A8C Testuser One " + + " (04AE A7ED 2F82 1133 E5B1 28D1 ED06 25DC 4632 8A8C)", keyToString(key)); } @@ -80,8 +78,7 @@ public class PublicKeyStoreTest { PGPPublicKey key = validKeyWithoutExpiration().getPublicKey(); String objId = keyObjectId(key.getKeyID()).name(); assertEquals("ed0625dc46328a8c000000000000000000000000", objId); - assertEquals(keyIdToString(key.getKeyID()).toLowerCase(), - objId.substring(8, 16)); + assertEquals(keyIdToString(key.getKeyID()).toLowerCase(), objId.substring(8, 16)); } @Test @@ -89,14 +86,12 @@ public class PublicKeyStoreTest { TestKey key1 = validKeyWithoutExpiration(); tr.branch(REFS_GPG_KEYS) .commit() - .add(keyObjectId(key1.getKeyId()).name(), - key1.getPublicKeyArmored()) + .add(keyObjectId(key1.getKeyId()).name(), key1.getPublicKeyArmored()) .create(); TestKey key2 = validKeyWithExpiration(); tr.branch(REFS_GPG_KEYS) .commit() - .add(keyObjectId(key2.getKeyId()).name(), - key2.getPublicKeyArmored()) + .add(keyObjectId(key2.getKeyId()).name(), key2.getPublicKeyArmored()) .create(); assertKeys(key1.getKeyId(), key1); @@ -109,10 +104,11 @@ public class PublicKeyStoreTest { TestKey key2 = validKeyWithExpiration(); tr.branch(REFS_GPG_KEYS) .commit() - .add(keyObjectId(key1.getKeyId()).name(), + .add( + keyObjectId(key1.getKeyId()).name(), key1.getPublicKeyArmored() - // Mismatched for this key ID, but we can still read it out. - + key2.getPublicKeyArmored()) + // Mismatched for this key ID, but we can still read it out. + + key2.getPublicKeyArmored()) .create(); assertKeys(key1.getKeyId(), key1, key2); } @@ -147,12 +143,13 @@ public class PublicKeyStoreTest { try (ObjectReader reader = tr.getRepository().newObjectReader(); RevWalk rw = new RevWalk(reader)) { - NoteMap notes = NoteMap.read( - reader, tr.getRevWalk().parseCommit( - tr.getRepository().exactRef(REFS_GPG_KEYS).getObjectId())); - String contents = new String( - reader.open(notes.get(keyObjectId(key1.getKeyId()))).getBytes(), - UTF_8); + NoteMap notes = + NoteMap.read( + reader, + tr.getRevWalk() + .parseCommit(tr.getRepository().exactRef(REFS_GPG_KEYS).getObjectId())); + String contents = + new String(reader.open(notes.get(keyObjectId(key1.getKeyId()))).getBytes(), UTF_8); String header = "-----BEGIN PGP PUBLIC KEY BLOCK-----"; int i1 = contents.indexOf(header); assertTrue(i1 >= 0); @@ -169,7 +166,8 @@ public class PublicKeyStoreTest { store.add(keyRing); assertEquals(RefUpdate.Result.NEW, store.save(newCommitBuilder())); - assertUserIds(store.get(key5.getKeyId()).iterator().next(), + assertUserIds( + store.get(key5.getKeyId()).iterator().next(), "Testuser Five ", "foo:myId"); @@ -218,8 +216,7 @@ public class PublicKeyStoreTest { assertKeys(key1.getKeyId()); } - private void assertKeys(long keyId, TestKey... expected) - throws Exception { + private void assertKeys(long keyId, TestKey... expected) throws Exception { Set expectedStrings = new TreeSet<>(); for (TestKey k : expected) { expectedStrings.add(keyToString(k.getPublicKey())); @@ -232,12 +229,11 @@ public class PublicKeyStoreTest { assertEquals(expectedStrings, actualStrings); } - private void assertUserIds(PGPPublicKeyRing keyRing, String... expected) - throws Exception { + private void assertUserIds(PGPPublicKeyRing keyRing, String... expected) throws Exception { List actual = new ArrayList<>(); @SuppressWarnings("unchecked") - Iterator userIds = store.get(keyRing.getPublicKey().getKeyID()) - .iterator().next().getPublicKey().getUserIDs(); + Iterator userIds = + store.get(keyRing.getPublicKey().getKeyID()).iterator().next().getPublicKey().getUserIDs(); while (userIds.hasNext()) { actual.add(userIds.next()); } diff --git a/gerrit-gpg/src/test/java/com/google/gerrit/gpg/PushCertificateCheckerTest.java b/gerrit-gpg/src/test/java/com/google/gerrit/gpg/PushCertificateCheckerTest.java index 12a911e5bb..8b7900d948 100644 --- a/gerrit-gpg/src/test/java/com/google/gerrit/gpg/PushCertificateCheckerTest.java +++ b/gerrit-gpg/src/test/java/com/google/gerrit/gpg/PushCertificateCheckerTest.java @@ -23,7 +23,16 @@ import static java.nio.charset.StandardCharsets.UTF_8; import static org.junit.Assert.assertEquals; import com.google.gerrit.gpg.testutil.TestKey; - +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.List; import org.bouncycastle.bcpg.ArmoredOutputStream; import org.bouncycastle.bcpg.BCPGOutputStream; import org.bouncycastle.openpgp.PGPSignature; @@ -44,17 +53,6 @@ import org.eclipse.jgit.transport.SignedPushConfig; import org.junit.Before; import org.junit.Test; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.InputStreamReader; -import java.io.Reader; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Date; -import java.util.List; - public class PushCertificateCheckerTest { private InMemoryRepository repo; private PublicKeyStore store; @@ -99,23 +97,20 @@ public class PushCertificateCheckerTest { @Test public void validCert() throws Exception { - PushCertificate cert = - newSignedCert(validNonce(), validKeyWithoutExpiration()); + PushCertificate cert = newSignedCert(validNonce(), validKeyWithoutExpiration()); assertNoProblems(cert); } @Test public void invalidNonce() throws Exception { - PushCertificate cert = - newSignedCert("invalid-nonce", validKeyWithoutExpiration()); + PushCertificate cert = newSignedCert("invalid-nonce", validKeyWithoutExpiration()); assertProblems(cert, "Invalid nonce"); } @Test public void invalidNonceNotChecked() throws Exception { checker = newChecker(false); - PushCertificate cert = - newSignedCert("invalid-nonce", validKeyWithoutExpiration()); + PushCertificate cert = newSignedCert("invalid-nonce", validKeyWithoutExpiration()); assertNoProblems(cert); } @@ -123,57 +118,58 @@ public class PushCertificateCheckerTest { public void missingKey() throws Exception { TestKey key2 = validKeyWithExpiration(); PushCertificate cert = newSignedCert(validNonce(), key2); - assertProblems(cert, - "No public keys found for key ID " + keyIdToString(key2.getKeyId())); + assertProblems(cert, "No public keys found for key ID " + keyIdToString(key2.getKeyId())); } @Test public void invalidKey() throws Exception { TestKey key3 = expiredKey(); PushCertificate cert = newSignedCert(validNonce(), key3); - assertProblems(cert, - "Invalid public key " + keyToString(key3.getPublicKey()) - + ":\n Key is expired"); + assertProblems( + cert, "Invalid public key " + keyToString(key3.getPublicKey()) + ":\n Key is expired"); } @Test public void signatureByExpiredKeyBeforeExpiration() throws Exception { TestKey key3 = expiredKey(); - Date now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z") - .parse("2005-07-10 12:00:00 -0400"); + Date now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z").parse("2005-07-10 12:00:00 -0400"); PushCertificate cert = newSignedCert(validNonce(), key3, now); assertNoProblems(cert); } private String validNonce() { - return signedPushConfig.getNonceGenerator() + return signedPushConfig + .getNonceGenerator() .createNonce(repo, System.currentTimeMillis() / 1000); } - private PushCertificate newSignedCert(String nonce, TestKey signingKey) - throws Exception { + private PushCertificate newSignedCert(String nonce, TestKey signingKey) throws Exception { return newSignedCert(nonce, signingKey, null); } - private PushCertificate newSignedCert(String nonce, TestKey signingKey, - Date now) throws Exception { - PushCertificateIdent ident = new PushCertificateIdent( - signingKey.getFirstUserId(), System.currentTimeMillis(), -7 * 60); - String payload = "certificate version 0.1\n" - + "pusher " + ident.getRaw() + "\n" - + "pushee test://localhost/repo.git\n" - + "nonce " + nonce + "\n" - + "\n" - + "0000000000000000000000000000000000000000" - + " deadbeefdeadbeefdeadbeefdeadbeefdeadbeef" - + " refs/heads/master\n"; - PGPSignatureGenerator gen = new PGPSignatureGenerator( - new BcPGPContentSignerBuilder( - signingKey.getPublicKey().getAlgorithm(), PGPUtil.SHA1)); + private PushCertificate newSignedCert(String nonce, TestKey signingKey, Date now) + throws Exception { + PushCertificateIdent ident = + new PushCertificateIdent(signingKey.getFirstUserId(), System.currentTimeMillis(), -7 * 60); + String payload = + "certificate version 0.1\n" + + "pusher " + + ident.getRaw() + + "\n" + + "pushee test://localhost/repo.git\n" + + "nonce " + + nonce + + "\n" + + "\n" + + "0000000000000000000000000000000000000000" + + " deadbeefdeadbeefdeadbeefdeadbeefdeadbeef" + + " refs/heads/master\n"; + PGPSignatureGenerator gen = + new PGPSignatureGenerator( + new BcPGPContentSignerBuilder(signingKey.getPublicKey().getAlgorithm(), PGPUtil.SHA1)); if (now != null) { - PGPSignatureSubpacketGenerator subGen = - new PGPSignatureSubpacketGenerator(); + PGPSignatureSubpacketGenerator subGen = new PGPSignatureSubpacketGenerator(); subGen.setSignatureCreationTime(false, now); gen.setHashedSubpackets(subGen.generate()); } @@ -183,21 +179,17 @@ public class PushCertificateCheckerTest { PGPSignature sig = gen.generate(); ByteArrayOutputStream bout = new ByteArrayOutputStream(); - try (BCPGOutputStream out = new BCPGOutputStream( - new ArmoredOutputStream(bout))) { + try (BCPGOutputStream out = new BCPGOutputStream(new ArmoredOutputStream(bout))) { sig.encode(out); } String cert = payload + new String(bout.toByteArray(), UTF_8); - Reader reader = - new InputStreamReader(new ByteArrayInputStream(cert.getBytes(UTF_8))); - PushCertificateParser parser = - new PushCertificateParser(repo, signedPushConfig); + Reader reader = new InputStreamReader(new ByteArrayInputStream(cert.getBytes(UTF_8))); + PushCertificateParser parser = new PushCertificateParser(repo, signedPushConfig); return parser.parse(reader); } - private void assertProblems(PushCertificate cert, String first, - String... rest) throws Exception { + private void assertProblems(PushCertificate cert, String first, String... rest) throws Exception { List expected = new ArrayList<>(); expected.add(first); expected.addAll(Arrays.asList(rest)); diff --git a/gerrit-gpg/src/test/java/com/google/gerrit/gpg/testutil/TestKey.java b/gerrit-gpg/src/test/java/com/google/gerrit/gpg/testutil/TestKey.java index 494cb2d3ed..420dedfa74 100644 --- a/gerrit-gpg/src/test/java/com/google/gerrit/gpg/testutil/TestKey.java +++ b/gerrit-gpg/src/test/java/com/google/gerrit/gpg/testutil/TestKey.java @@ -16,6 +16,8 @@ package com.google.gerrit.gpg.testutil; import static com.google.gerrit.gpg.PublicKeyStore.keyIdToString; +import java.io.ByteArrayInputStream; +import java.io.IOException; import org.bouncycastle.bcpg.ArmoredInputStream; import org.bouncycastle.openpgp.PGPException; import org.bouncycastle.openpgp.PGPPrivateKey; @@ -28,9 +30,6 @@ import org.bouncycastle.openpgp.operator.bc.BcPBESecretKeyDecryptorBuilder; import org.bouncycastle.openpgp.operator.bc.BcPGPDigestCalculatorProvider; import org.eclipse.jgit.lib.Constants; -import java.io.ByteArrayInputStream; -import java.io.IOException; - public class TestKey { private final String pubArmored; private final String secArmored; @@ -82,15 +81,14 @@ public class TestKey { } public PGPPrivateKey getPrivateKey() throws PGPException { - return getSecretKey().extractPrivateKey( - new BcPBESecretKeyDecryptorBuilder(new BcPGPDigestCalculatorProvider()) - // All test keys have no passphrase. - .build(new char[0])); + return getSecretKey() + .extractPrivateKey( + new BcPBESecretKeyDecryptorBuilder(new BcPGPDigestCalculatorProvider()) + // All test keys have no passphrase. + .build(new char[0])); } - private static ArmoredInputStream newStream(String armored) - throws IOException { - return new ArmoredInputStream( - new ByteArrayInputStream(Constants.encode(armored))); + private static ArmoredInputStream newStream(String armored) throws IOException { + return new ArmoredInputStream(new ByteArrayInputStream(Constants.encode(armored))); } } diff --git a/gerrit-gpg/src/test/java/com/google/gerrit/gpg/testutil/TestKeys.java b/gerrit-gpg/src/test/java/com/google/gerrit/gpg/testutil/TestKeys.java index ad944c51d7..82d7ada80f 100644 --- a/gerrit-gpg/src/test/java/com/google/gerrit/gpg/testutil/TestKeys.java +++ b/gerrit-gpg/src/test/java/com/google/gerrit/gpg/testutil/TestKeys.java @@ -20,9 +20,7 @@ import com.google.common.collect.ImmutableList; public class TestKeys { public static ImmutableList allValidKeys() { return ImmutableList.of( - validKeyWithoutExpiration(), - validKeyWithExpiration(), - validKeyWithSecondUserId()); + validKeyWithoutExpiration(), validKeyWithExpiration(), validKeyWithSecondUserId()); } /** @@ -36,93 +34,94 @@ public class TestKeys { * */ public static TestKey validKeyWithoutExpiration() { - return new TestKey("-----BEGIN PGP PUBLIC KEY BLOCK-----\n" - + "Version: GnuPG v1\n" - + "\n" - + "mQENBFWdTIkBCADOaygDKjLuRX6LXAvBAYB91cmTf1MSlmEy+qsG3c9ijjQixPkr\n" - + "atdYkocrrT2S0R9UGjksTOI2WN5S0lQfLA1RSk63KURQE+OF+IfNqdD6nQdLBs1w\n" - + "va+GDj/uvuI05I0oXf/M7POdFphutrS4EUDBnFPj6ns/0C2sTRTxliD+Y9Y9a84V\n" - + "DfVVUbJB6wc3LP3L6ImT+cSM7dLq3hZHya+9FNeYPmPYnBrkJyqf2NDd38Sddsro\n" - + "7smw/GgCZHnnuVNS4C7NsHr6900VKC+JDtdx+fqptixcAEJWiGoQfWqU+hYmia3p\n" - + "9+Xw02+3FcjOT6ONUCmHX+xlz0pXW4iIYlPpABEBAAG0IFRlc3R1c2VyIE9uZSA8\n" - + "dGVzdDFAZXhhbXBsZS5jb20+iQE4BBMBAgAiBQJVnUyJAhsDBgsJCAcDAgYVCAIJ\n" - + "CgsEFgIDAQIeAQIXgAAKCRDtBiXcRjKKjHblB/9RaFO5+GTDIphAL/aVj2u+d8Lq\n" - + "yUpBrDp3P06QDGpKGFMAovBuh+NLH76VKNIzQLQC8rdTj651fLcLMuJ1enQ3Rblg\n" - + "RKr1oc+wqqtFHr4QyOQjE/N3C9GQjEzfqn4qnp5KtZxYFnlvU5NGehid7M1HTZMx\n" - + "jRcHbM9KQnsE5Z4fh4wmN5ynG+5nbaF4O9otPOpFzYRvIhxFmHscWyOgRaMZiYEX\n" - + "7Qkzze+scAlc9E/EWRJQIFcxnxV/SYIT4qCTT1g2aKA8OCBO/ZTOleH8SzvTODjy\n" - + "W0lGHnh/ZqH6XGVcGUaJZZ2uHTck1+czuVVShNcXPW1W20T6E9UqzHbJHN0guQEN\n" - + "BFWdTIkBCACoLVdPr3gpQwzI+2NGXjdtoyqYoPlgfeyI2M1XQD/7+rLZTbi14ZjN\n" - + "vYkS/+/oGtVEmiYOiAVTwmkjCYkKGDgNcCiJVekiPAN6JryVv488wRc999b5LpFE\n" - + "fhLGwI0YxjcS4KFFnpMC3wSb6tJUnHRLVoE5d8icdiaOpgYdp7uqWkSx2oxqHgIb\n" - + "nuyrk3ydEcS4ZeGD+w+taIxMc9F1DS9kiXALD7xWgUkmqZLEQoNgF6KlwCHXRd3m\n" - + "rBCo97sE95yKcq98ZMIWuQtTcEccZsN/6jlsei+9RI0tqs+FbZnIFm/go9zk11Vl\n" - + "IQ9QFSj6ruqoKrYvNZuDDLD1lHvZPD4/ABEBAAGJAR8EGAECAAkFAlWdTIkCGwwA\n" - + "CgkQ7QYl3EYyiox+HAf/Z/OCQO3jxALAcn3oUb1g/IlHm6qZv7RJOFUsj/16fGiF\n" - + "rRTP15zMXzyqV+L/LGV/owvOsdD/o7boZz4C/U98COx0Nl1jOrmPATOl+xqsgpEj\n" - + "Fhk+eAR7exO2XxW+u2g4cYoSMosIOX5w1GrdsxQeaZDwiSJMEOR2cVLs3YI19Ci/\n" - + "FuzActZ0wJNk0nlNF6l8CAbzwN6pM9OIc/iBIwDjz92KUco0NF8XKZnxqhH4wfHB\n" - + "PGkTx8RwOvELUTDMtvYnG5R0QtND0RbOnmp4ZVZmeOjKSLo1mZliUZB1H2PPSxrA\n" - + "0oLr8+wLntz1SU7uS4ddvhSQW+j2M/0pa352KUwmrw==\n" - + "=o/aU\n" - + "-----END PGP PUBLIC KEY BLOCK-----\n", + return new TestKey( + "-----BEGIN PGP PUBLIC KEY BLOCK-----\n" + + "Version: GnuPG v1\n" + + "\n" + + "mQENBFWdTIkBCADOaygDKjLuRX6LXAvBAYB91cmTf1MSlmEy+qsG3c9ijjQixPkr\n" + + "atdYkocrrT2S0R9UGjksTOI2WN5S0lQfLA1RSk63KURQE+OF+IfNqdD6nQdLBs1w\n" + + "va+GDj/uvuI05I0oXf/M7POdFphutrS4EUDBnFPj6ns/0C2sTRTxliD+Y9Y9a84V\n" + + "DfVVUbJB6wc3LP3L6ImT+cSM7dLq3hZHya+9FNeYPmPYnBrkJyqf2NDd38Sddsro\n" + + "7smw/GgCZHnnuVNS4C7NsHr6900VKC+JDtdx+fqptixcAEJWiGoQfWqU+hYmia3p\n" + + "9+Xw02+3FcjOT6ONUCmHX+xlz0pXW4iIYlPpABEBAAG0IFRlc3R1c2VyIE9uZSA8\n" + + "dGVzdDFAZXhhbXBsZS5jb20+iQE4BBMBAgAiBQJVnUyJAhsDBgsJCAcDAgYVCAIJ\n" + + "CgsEFgIDAQIeAQIXgAAKCRDtBiXcRjKKjHblB/9RaFO5+GTDIphAL/aVj2u+d8Lq\n" + + "yUpBrDp3P06QDGpKGFMAovBuh+NLH76VKNIzQLQC8rdTj651fLcLMuJ1enQ3Rblg\n" + + "RKr1oc+wqqtFHr4QyOQjE/N3C9GQjEzfqn4qnp5KtZxYFnlvU5NGehid7M1HTZMx\n" + + "jRcHbM9KQnsE5Z4fh4wmN5ynG+5nbaF4O9otPOpFzYRvIhxFmHscWyOgRaMZiYEX\n" + + "7Qkzze+scAlc9E/EWRJQIFcxnxV/SYIT4qCTT1g2aKA8OCBO/ZTOleH8SzvTODjy\n" + + "W0lGHnh/ZqH6XGVcGUaJZZ2uHTck1+czuVVShNcXPW1W20T6E9UqzHbJHN0guQEN\n" + + "BFWdTIkBCACoLVdPr3gpQwzI+2NGXjdtoyqYoPlgfeyI2M1XQD/7+rLZTbi14ZjN\n" + + "vYkS/+/oGtVEmiYOiAVTwmkjCYkKGDgNcCiJVekiPAN6JryVv488wRc999b5LpFE\n" + + "fhLGwI0YxjcS4KFFnpMC3wSb6tJUnHRLVoE5d8icdiaOpgYdp7uqWkSx2oxqHgIb\n" + + "nuyrk3ydEcS4ZeGD+w+taIxMc9F1DS9kiXALD7xWgUkmqZLEQoNgF6KlwCHXRd3m\n" + + "rBCo97sE95yKcq98ZMIWuQtTcEccZsN/6jlsei+9RI0tqs+FbZnIFm/go9zk11Vl\n" + + "IQ9QFSj6ruqoKrYvNZuDDLD1lHvZPD4/ABEBAAGJAR8EGAECAAkFAlWdTIkCGwwA\n" + + "CgkQ7QYl3EYyiox+HAf/Z/OCQO3jxALAcn3oUb1g/IlHm6qZv7RJOFUsj/16fGiF\n" + + "rRTP15zMXzyqV+L/LGV/owvOsdD/o7boZz4C/U98COx0Nl1jOrmPATOl+xqsgpEj\n" + + "Fhk+eAR7exO2XxW+u2g4cYoSMosIOX5w1GrdsxQeaZDwiSJMEOR2cVLs3YI19Ci/\n" + + "FuzActZ0wJNk0nlNF6l8CAbzwN6pM9OIc/iBIwDjz92KUco0NF8XKZnxqhH4wfHB\n" + + "PGkTx8RwOvELUTDMtvYnG5R0QtND0RbOnmp4ZVZmeOjKSLo1mZliUZB1H2PPSxrA\n" + + "0oLr8+wLntz1SU7uS4ddvhSQW+j2M/0pa352KUwmrw==\n" + + "=o/aU\n" + + "-----END PGP PUBLIC KEY BLOCK-----\n", "-----BEGIN PGP PRIVATE KEY BLOCK-----\n" - + "Version: GnuPG v1\n" - + "\n" - + "lQOYBFWdTIkBCADOaygDKjLuRX6LXAvBAYB91cmTf1MSlmEy+qsG3c9ijjQixPkr\n" - + "atdYkocrrT2S0R9UGjksTOI2WN5S0lQfLA1RSk63KURQE+OF+IfNqdD6nQdLBs1w\n" - + "va+GDj/uvuI05I0oXf/M7POdFphutrS4EUDBnFPj6ns/0C2sTRTxliD+Y9Y9a84V\n" - + "DfVVUbJB6wc3LP3L6ImT+cSM7dLq3hZHya+9FNeYPmPYnBrkJyqf2NDd38Sddsro\n" - + "7smw/GgCZHnnuVNS4C7NsHr6900VKC+JDtdx+fqptixcAEJWiGoQfWqU+hYmia3p\n" - + "9+Xw02+3FcjOT6ONUCmHX+xlz0pXW4iIYlPpABEBAAEAB/wLoOXEJ+Buo+OZHjpb\n" - + "SSZf8GdGs+mOJoKbSJvR6zT/rFsrikUvOPmgt8B9qWjKmJVXO5L09+/Wd/MuX0L1\n" - + "7plhdvowP1bl2/j5VyLvZx2qwKXkiCGStFzrBGp9nKtJp4Z8O69pb//ZXaiAtDJC\n" - + "HFa1kYT4VgFTevrXtg/z/C0np4Yjx0mZpw4nfISEeHCiYCyRa/B8R1+Pc4uIcoSo\n" - + "G3aq6Ow9m/LGvw0MRO5qHvqoF41TLPQpGKjKEsCBKHF1qh0tOOUHnLGrvbmdFnGr\n" - + "UXJpRkLdRTnj8ufvA4XVZhImzL+lD+ALtjlV14xh8nsNKYL42880GFl5Cl0OtBcE\n" - + "lgQBBADPJ6kHdvUYOe0zugRdukBSYLkZcYwRiphom7dZuavYICIu6B14ljEONzVD\n" - + "mPhi2lDOawZOURKwYd9S4K11XWLsTYe7XEwkc+1Fpvu4L/JqnJTTnnvbx05ZsqD5\n" - + "j9tybPlrTuLrf2ctfcC03Z55wfo6azsbf89yrr6QX0+l9dlkYQQA/xcMdQJ0Z5vm\n" - + "kvyaCPsQzJc/8noVO9PMv7xJm14gJWK7Px3y2eBidzpCbVVFnGWW6CPb3qKerB5U\n" - + "pwcF4gCFWyP9C2YtnB0hgqixIPfR+UO8gpqdY6MP8NPspoXouffRn+Zic/P6Cxje\n" - + "/MGxNQBeRtqb2IGh1xZ8v/8tmmmxHIkEAP74HkGETcXmlj3/6RlwTBUAovPARSn7\n" - + "LDtOCPezg6mQmble1BvnTnAwOHKJVqjx+3qsGqMe8OGGXAxZPSU1xSmOShBFrpDp\n" - + "xArE67arE17pT1lyD/gmHRuqnNMvgRrwz1mDm3G2ohWkCVixEiB+8vPQfbZrJBgQ\n" - + "WxOF4RCo2WWyRKa0IFRlc3R1c2VyIE9uZSA8dGVzdDFAZXhhbXBsZS5jb20+iQE4\n" - + "BBMBAgAiBQJVnUyJAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRDtBiXc\n" - + "RjKKjHblB/9RaFO5+GTDIphAL/aVj2u+d8LqyUpBrDp3P06QDGpKGFMAovBuh+NL\n" - + "H76VKNIzQLQC8rdTj651fLcLMuJ1enQ3RblgRKr1oc+wqqtFHr4QyOQjE/N3C9GQ\n" - + "jEzfqn4qnp5KtZxYFnlvU5NGehid7M1HTZMxjRcHbM9KQnsE5Z4fh4wmN5ynG+5n\n" - + "baF4O9otPOpFzYRvIhxFmHscWyOgRaMZiYEX7Qkzze+scAlc9E/EWRJQIFcxnxV/\n" - + "SYIT4qCTT1g2aKA8OCBO/ZTOleH8SzvTODjyW0lGHnh/ZqH6XGVcGUaJZZ2uHTck\n" - + "1+czuVVShNcXPW1W20T6E9UqzHbJHN0gnQOYBFWdTIkBCACoLVdPr3gpQwzI+2NG\n" - + "XjdtoyqYoPlgfeyI2M1XQD/7+rLZTbi14ZjNvYkS/+/oGtVEmiYOiAVTwmkjCYkK\n" - + "GDgNcCiJVekiPAN6JryVv488wRc999b5LpFEfhLGwI0YxjcS4KFFnpMC3wSb6tJU\n" - + "nHRLVoE5d8icdiaOpgYdp7uqWkSx2oxqHgIbnuyrk3ydEcS4ZeGD+w+taIxMc9F1\n" - + "DS9kiXALD7xWgUkmqZLEQoNgF6KlwCHXRd3mrBCo97sE95yKcq98ZMIWuQtTcEcc\n" - + "ZsN/6jlsei+9RI0tqs+FbZnIFm/go9zk11VlIQ9QFSj6ruqoKrYvNZuDDLD1lHvZ\n" - + "PD4/ABEBAAEAB/4kQnJauehcbRpqktjaqSGmP9HFSp+50CyZbLUJJM8m0uyQsZMr\n" - + "k9JQOZc+Q3RERNTKj7m41Fbhsj7c0Qd856/eJdp3kdBME0hko8lxN/X4EWGjeLYe\n" - + "z41+iPgfZhCF0Oa66TecPQ5RRihGPaDPoVPpkmMWMt9L7KVviBg1eJ6bobVIY5hu\n" - + "a7KFJHZQcCI1OvdJ0cx89KDSbnH8iMM6Kmw1bE3D2FEaWctuKLBo5PNRgyTJvdBd\n" - + "PSf56/Rc6csPqmOntQi2Yn8n47eCOTclHNuygSTJeHPpymVuWbhMq6fhJat/xA+V\n" - + "kyT8I2c45RQb0dKId+wEytjbKw8AI6Q3GXqhBADOhsr9M+JWc4MpD43mCDZACN4v\n" - + "RBRxSrJvO/V6HqQPmKYRmr9Gk3vxgF0zCf5zB1QeBiXpTpShxV87RIbUYReOyavp\n" - + "87zH6/SkRxQJiBEpQh5Fu5CoAaxGOivxbPqdWHrBY6jvqkrRoMPNiFJ6/ty5w9jx\n" - + "i9kGm9PelQGu2SdLNwQA0HbGo8sC8h5TSTEDCkFHRYzVYONx+32AlkCsJX9mEt0E\n" - + "nG8d97Ay24JsbnuXSq04FJrqzjOVyHLUffpXnAGELJZVNCIparSyqIaj43UG/oPc\n" - + "ICPmR7zI9G49ICUPSzI7+S2+BwjbiHRQcP0zmxbH92G4abYwKfk7dsDpGyVM+TkD\n" - + "/2nUiV0CRqnGipeiLWNjW/Md0ufkwqBvCWxrtxj0rQCyvBOVg3B6DocVNzgOOYa1\n" - + "ji3We5A9mSP40JBmMfk2veFrDdsGn4G+OpzMxKQtNfYemqjALfZ2zTdax0mXPXy6\n" - + "Gl0jUgSGrxGm8QnRLsrRx7G7ZKnvkcS+YsdQ8dbtzvJtQfiJAR8EGAECAAkFAlWd\n" - + "TIkCGwwACgkQ7QYl3EYyiox+HAf/Z/OCQO3jxALAcn3oUb1g/IlHm6qZv7RJOFUs\n" - + "j/16fGiFrRTP15zMXzyqV+L/LGV/owvOsdD/o7boZz4C/U98COx0Nl1jOrmPATOl\n" - + "+xqsgpEjFhk+eAR7exO2XxW+u2g4cYoSMosIOX5w1GrdsxQeaZDwiSJMEOR2cVLs\n" - + "3YI19Ci/FuzActZ0wJNk0nlNF6l8CAbzwN6pM9OIc/iBIwDjz92KUco0NF8XKZnx\n" - + "qhH4wfHBPGkTx8RwOvELUTDMtvYnG5R0QtND0RbOnmp4ZVZmeOjKSLo1mZliUZB1\n" - + "H2PPSxrA0oLr8+wLntz1SU7uS4ddvhSQW+j2M/0pa352KUwmrw==\n" - + "=MuAn\n" - + "-----END PGP PRIVATE KEY BLOCK-----\n"); + + "Version: GnuPG v1\n" + + "\n" + + "lQOYBFWdTIkBCADOaygDKjLuRX6LXAvBAYB91cmTf1MSlmEy+qsG3c9ijjQixPkr\n" + + "atdYkocrrT2S0R9UGjksTOI2WN5S0lQfLA1RSk63KURQE+OF+IfNqdD6nQdLBs1w\n" + + "va+GDj/uvuI05I0oXf/M7POdFphutrS4EUDBnFPj6ns/0C2sTRTxliD+Y9Y9a84V\n" + + "DfVVUbJB6wc3LP3L6ImT+cSM7dLq3hZHya+9FNeYPmPYnBrkJyqf2NDd38Sddsro\n" + + "7smw/GgCZHnnuVNS4C7NsHr6900VKC+JDtdx+fqptixcAEJWiGoQfWqU+hYmia3p\n" + + "9+Xw02+3FcjOT6ONUCmHX+xlz0pXW4iIYlPpABEBAAEAB/wLoOXEJ+Buo+OZHjpb\n" + + "SSZf8GdGs+mOJoKbSJvR6zT/rFsrikUvOPmgt8B9qWjKmJVXO5L09+/Wd/MuX0L1\n" + + "7plhdvowP1bl2/j5VyLvZx2qwKXkiCGStFzrBGp9nKtJp4Z8O69pb//ZXaiAtDJC\n" + + "HFa1kYT4VgFTevrXtg/z/C0np4Yjx0mZpw4nfISEeHCiYCyRa/B8R1+Pc4uIcoSo\n" + + "G3aq6Ow9m/LGvw0MRO5qHvqoF41TLPQpGKjKEsCBKHF1qh0tOOUHnLGrvbmdFnGr\n" + + "UXJpRkLdRTnj8ufvA4XVZhImzL+lD+ALtjlV14xh8nsNKYL42880GFl5Cl0OtBcE\n" + + "lgQBBADPJ6kHdvUYOe0zugRdukBSYLkZcYwRiphom7dZuavYICIu6B14ljEONzVD\n" + + "mPhi2lDOawZOURKwYd9S4K11XWLsTYe7XEwkc+1Fpvu4L/JqnJTTnnvbx05ZsqD5\n" + + "j9tybPlrTuLrf2ctfcC03Z55wfo6azsbf89yrr6QX0+l9dlkYQQA/xcMdQJ0Z5vm\n" + + "kvyaCPsQzJc/8noVO9PMv7xJm14gJWK7Px3y2eBidzpCbVVFnGWW6CPb3qKerB5U\n" + + "pwcF4gCFWyP9C2YtnB0hgqixIPfR+UO8gpqdY6MP8NPspoXouffRn+Zic/P6Cxje\n" + + "/MGxNQBeRtqb2IGh1xZ8v/8tmmmxHIkEAP74HkGETcXmlj3/6RlwTBUAovPARSn7\n" + + "LDtOCPezg6mQmble1BvnTnAwOHKJVqjx+3qsGqMe8OGGXAxZPSU1xSmOShBFrpDp\n" + + "xArE67arE17pT1lyD/gmHRuqnNMvgRrwz1mDm3G2ohWkCVixEiB+8vPQfbZrJBgQ\n" + + "WxOF4RCo2WWyRKa0IFRlc3R1c2VyIE9uZSA8dGVzdDFAZXhhbXBsZS5jb20+iQE4\n" + + "BBMBAgAiBQJVnUyJAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRDtBiXc\n" + + "RjKKjHblB/9RaFO5+GTDIphAL/aVj2u+d8LqyUpBrDp3P06QDGpKGFMAovBuh+NL\n" + + "H76VKNIzQLQC8rdTj651fLcLMuJ1enQ3RblgRKr1oc+wqqtFHr4QyOQjE/N3C9GQ\n" + + "jEzfqn4qnp5KtZxYFnlvU5NGehid7M1HTZMxjRcHbM9KQnsE5Z4fh4wmN5ynG+5n\n" + + "baF4O9otPOpFzYRvIhxFmHscWyOgRaMZiYEX7Qkzze+scAlc9E/EWRJQIFcxnxV/\n" + + "SYIT4qCTT1g2aKA8OCBO/ZTOleH8SzvTODjyW0lGHnh/ZqH6XGVcGUaJZZ2uHTck\n" + + "1+czuVVShNcXPW1W20T6E9UqzHbJHN0gnQOYBFWdTIkBCACoLVdPr3gpQwzI+2NG\n" + + "XjdtoyqYoPlgfeyI2M1XQD/7+rLZTbi14ZjNvYkS/+/oGtVEmiYOiAVTwmkjCYkK\n" + + "GDgNcCiJVekiPAN6JryVv488wRc999b5LpFEfhLGwI0YxjcS4KFFnpMC3wSb6tJU\n" + + "nHRLVoE5d8icdiaOpgYdp7uqWkSx2oxqHgIbnuyrk3ydEcS4ZeGD+w+taIxMc9F1\n" + + "DS9kiXALD7xWgUkmqZLEQoNgF6KlwCHXRd3mrBCo97sE95yKcq98ZMIWuQtTcEcc\n" + + "ZsN/6jlsei+9RI0tqs+FbZnIFm/go9zk11VlIQ9QFSj6ruqoKrYvNZuDDLD1lHvZ\n" + + "PD4/ABEBAAEAB/4kQnJauehcbRpqktjaqSGmP9HFSp+50CyZbLUJJM8m0uyQsZMr\n" + + "k9JQOZc+Q3RERNTKj7m41Fbhsj7c0Qd856/eJdp3kdBME0hko8lxN/X4EWGjeLYe\n" + + "z41+iPgfZhCF0Oa66TecPQ5RRihGPaDPoVPpkmMWMt9L7KVviBg1eJ6bobVIY5hu\n" + + "a7KFJHZQcCI1OvdJ0cx89KDSbnH8iMM6Kmw1bE3D2FEaWctuKLBo5PNRgyTJvdBd\n" + + "PSf56/Rc6csPqmOntQi2Yn8n47eCOTclHNuygSTJeHPpymVuWbhMq6fhJat/xA+V\n" + + "kyT8I2c45RQb0dKId+wEytjbKw8AI6Q3GXqhBADOhsr9M+JWc4MpD43mCDZACN4v\n" + + "RBRxSrJvO/V6HqQPmKYRmr9Gk3vxgF0zCf5zB1QeBiXpTpShxV87RIbUYReOyavp\n" + + "87zH6/SkRxQJiBEpQh5Fu5CoAaxGOivxbPqdWHrBY6jvqkrRoMPNiFJ6/ty5w9jx\n" + + "i9kGm9PelQGu2SdLNwQA0HbGo8sC8h5TSTEDCkFHRYzVYONx+32AlkCsJX9mEt0E\n" + + "nG8d97Ay24JsbnuXSq04FJrqzjOVyHLUffpXnAGELJZVNCIparSyqIaj43UG/oPc\n" + + "ICPmR7zI9G49ICUPSzI7+S2+BwjbiHRQcP0zmxbH92G4abYwKfk7dsDpGyVM+TkD\n" + + "/2nUiV0CRqnGipeiLWNjW/Md0ufkwqBvCWxrtxj0rQCyvBOVg3B6DocVNzgOOYa1\n" + + "ji3We5A9mSP40JBmMfk2veFrDdsGn4G+OpzMxKQtNfYemqjALfZ2zTdax0mXPXy6\n" + + "Gl0jUgSGrxGm8QnRLsrRx7G7ZKnvkcS+YsdQ8dbtzvJtQfiJAR8EGAECAAkFAlWd\n" + + "TIkCGwwACgkQ7QYl3EYyiox+HAf/Z/OCQO3jxALAcn3oUb1g/IlHm6qZv7RJOFUs\n" + + "j/16fGiFrRTP15zMXzyqV+L/LGV/owvOsdD/o7boZz4C/U98COx0Nl1jOrmPATOl\n" + + "+xqsgpEjFhk+eAR7exO2XxW+u2g4cYoSMosIOX5w1GrdsxQeaZDwiSJMEOR2cVLs\n" + + "3YI19Ci/FuzActZ0wJNk0nlNF6l8CAbzwN6pM9OIc/iBIwDjz92KUco0NF8XKZnx\n" + + "qhH4wfHBPGkTx8RwOvELUTDMtvYnG5R0QtND0RbOnmp4ZVZmeOjKSLo1mZliUZB1\n" + + "H2PPSxrA0oLr8+wLntz1SU7uS4ddvhSQW+j2M/0pa352KUwmrw==\n" + + "=MuAn\n" + + "-----END PGP PRIVATE KEY BLOCK-----\n"); } /** @@ -138,93 +137,93 @@ public class TestKeys { public static final TestKey validKeyWithExpiration() { return new TestKey( "-----BEGIN PGP PUBLIC KEY BLOCK-----\n" - + "Version: GnuPG v1\n" - + "\n" - + "mQENBFWdTP8BCADRxNpasIv0jtNXTK6VYIS2VJ2Xk0ZD6gtxeoXCpjQ+TsB9fxh3\n" - + "vAMPt2Zu5LqoGwygKOJj1zquG8xk7GUCCHJk3+qG8xxB1xGtSz2vLyfRm7fOZmHj\n" - + "3W/C/25lynSPDrfvcwvwA4PN8iP5EWbWU10L6WOZGMwwwtVDUSEouSOw2LEepxLV\n" - + "rkKuZcyHaivheDbUlZliwe9rGXd4hh1h4qyNQWG3q+ytlL28sVkOzUh6IMBTvqhe\n" - + "IRsvxvaVSLV8jRVKfUTqw0g57ft4ZD2/L46yUTXzr9aUCBjTNxvWLlyboqql/D8P\n" - + "inp51h3cvAg7NW5RdG1GEYmylH8SygT5utPxABEBAAG0IFRlc3R1c2VyIFR3byA8\n" - + "dGVzdDJAZXhhbXBsZS5jb20+iQE+BBMBAgAoBQJVnUz/AhsDBQld/A8ABgsJCAcD\n" - + "AgYVCAIJCgsEFgIDAQIeAQIXgAAKCRBFMRpvN4oK7UZqCACWwQL/YvBK4b0m+R0d\n" - + "UdvAXeBx7DwOAnAodis9ZVqChb7RxcZQxF1Ti9mtCBPPQGuEs5wE2Ocrrq+L13r6\n" - + "bgW+1WOB1tZSDVxwL1PnZFw/SyADRIDCZrOHiAkp82UnZwWAkk39GzNJtt1wTYDZ\n" - + "FMTFUr2SPscXk1k7muS+ZfEFwNPD4tODo/poJKDYEJ80Z5UXXFQLDtsfdeIXMFIT\n" - + "449CYoq8XBMBfvyWl/LLpw0r3JI6pV/YdH3Oeuz8XkkEVzRxaxB6Zmeo5jSwjR/T\n" - + "8TKDGwwiuwiiT3SfkFSVdcjKulRuXSRNs1Ouf7/UC3cq4bG2WXWa85X1+HQRm7iu\n" - + "RHSOuQENBFWdTP8BCADhhGxAA0pX5yBHwIgM1j0gw2h5nSsopDrO6t/sbRUcNxnR\n" - + "tBScgKZnP0sjRTYEUIwmZuseHMBohtVCuMaDt06qyZDvDk/98j3AeE5t2dgFnOIe\n" - + "qCrm/6aejbFcQOpxe6U29KJRCAxuwNtB15X1VH1Kj7B0gRSTu13n/5sUsi2lunoZ\n" - + "oIvpIe9tZH4aXitCY2MCQH+hTyCyNBzlEa44kWz6LxUsPdo7I6rXkTr6Ot7wQh+9\n" - + "7HCe042GIq65h0apgujyjhJidjch5ur1mngaSNSEyvbji2MGC+cd3wAIstG5a7xP\n" - + "d9MncY5Q/eH+hn96694k5bckottSyGm/3f2Ihfj1ABEBAAGJASUEGAECAA8FAlWd\n" - + "TP8CGwwFCV38DwAACgkQRTEabzeKCu1FNwgAif4eK2v7R3QubL2S6wmb1nsgRMgV\n" - + "YoxGBeUk2EK6WZ5IPor93ySd0ixRVNMRmJ8BLH3EMjZQTzkDG+BH6zFyxo6lLHw9\n" - + "NxQjI06tqQWgyyK0mEweVwB/zqtxiB4lNUpsNbqOZWnBJ3d6o1SsnD2Q3uwvP5fb\n" - + "fSIgdmUk3c0VMdgA+KzWjPD/PJIPujE+ckHhjn5cbDNw35/FuyhkLJfqlOG7SPvM\n" - + "NmCdJ1Pcqju9t7sf6b0BGPDOCL4gpuWKK7HJz9WxngNb3FSziLbyPLk13ynADO+v\n" - + "EOR44LPyXE9kVxPusazsXlt9ayTOhELhwzw7sGFFu8E17Cpn7GnVj3tN9A==\n" - + "=1e/A\n" - + "-----END PGP PUBLIC KEY BLOCK-----\n", + + "Version: GnuPG v1\n" + + "\n" + + "mQENBFWdTP8BCADRxNpasIv0jtNXTK6VYIS2VJ2Xk0ZD6gtxeoXCpjQ+TsB9fxh3\n" + + "vAMPt2Zu5LqoGwygKOJj1zquG8xk7GUCCHJk3+qG8xxB1xGtSz2vLyfRm7fOZmHj\n" + + "3W/C/25lynSPDrfvcwvwA4PN8iP5EWbWU10L6WOZGMwwwtVDUSEouSOw2LEepxLV\n" + + "rkKuZcyHaivheDbUlZliwe9rGXd4hh1h4qyNQWG3q+ytlL28sVkOzUh6IMBTvqhe\n" + + "IRsvxvaVSLV8jRVKfUTqw0g57ft4ZD2/L46yUTXzr9aUCBjTNxvWLlyboqql/D8P\n" + + "inp51h3cvAg7NW5RdG1GEYmylH8SygT5utPxABEBAAG0IFRlc3R1c2VyIFR3byA8\n" + + "dGVzdDJAZXhhbXBsZS5jb20+iQE+BBMBAgAoBQJVnUz/AhsDBQld/A8ABgsJCAcD\n" + + "AgYVCAIJCgsEFgIDAQIeAQIXgAAKCRBFMRpvN4oK7UZqCACWwQL/YvBK4b0m+R0d\n" + + "UdvAXeBx7DwOAnAodis9ZVqChb7RxcZQxF1Ti9mtCBPPQGuEs5wE2Ocrrq+L13r6\n" + + "bgW+1WOB1tZSDVxwL1PnZFw/SyADRIDCZrOHiAkp82UnZwWAkk39GzNJtt1wTYDZ\n" + + "FMTFUr2SPscXk1k7muS+ZfEFwNPD4tODo/poJKDYEJ80Z5UXXFQLDtsfdeIXMFIT\n" + + "449CYoq8XBMBfvyWl/LLpw0r3JI6pV/YdH3Oeuz8XkkEVzRxaxB6Zmeo5jSwjR/T\n" + + "8TKDGwwiuwiiT3SfkFSVdcjKulRuXSRNs1Ouf7/UC3cq4bG2WXWa85X1+HQRm7iu\n" + + "RHSOuQENBFWdTP8BCADhhGxAA0pX5yBHwIgM1j0gw2h5nSsopDrO6t/sbRUcNxnR\n" + + "tBScgKZnP0sjRTYEUIwmZuseHMBohtVCuMaDt06qyZDvDk/98j3AeE5t2dgFnOIe\n" + + "qCrm/6aejbFcQOpxe6U29KJRCAxuwNtB15X1VH1Kj7B0gRSTu13n/5sUsi2lunoZ\n" + + "oIvpIe9tZH4aXitCY2MCQH+hTyCyNBzlEa44kWz6LxUsPdo7I6rXkTr6Ot7wQh+9\n" + + "7HCe042GIq65h0apgujyjhJidjch5ur1mngaSNSEyvbji2MGC+cd3wAIstG5a7xP\n" + + "d9MncY5Q/eH+hn96694k5bckottSyGm/3f2Ihfj1ABEBAAGJASUEGAECAA8FAlWd\n" + + "TP8CGwwFCV38DwAACgkQRTEabzeKCu1FNwgAif4eK2v7R3QubL2S6wmb1nsgRMgV\n" + + "YoxGBeUk2EK6WZ5IPor93ySd0ixRVNMRmJ8BLH3EMjZQTzkDG+BH6zFyxo6lLHw9\n" + + "NxQjI06tqQWgyyK0mEweVwB/zqtxiB4lNUpsNbqOZWnBJ3d6o1SsnD2Q3uwvP5fb\n" + + "fSIgdmUk3c0VMdgA+KzWjPD/PJIPujE+ckHhjn5cbDNw35/FuyhkLJfqlOG7SPvM\n" + + "NmCdJ1Pcqju9t7sf6b0BGPDOCL4gpuWKK7HJz9WxngNb3FSziLbyPLk13ynADO+v\n" + + "EOR44LPyXE9kVxPusazsXlt9ayTOhELhwzw7sGFFu8E17Cpn7GnVj3tN9A==\n" + + "=1e/A\n" + + "-----END PGP PUBLIC KEY BLOCK-----\n", "-----BEGIN PGP PRIVATE KEY BLOCK-----\n" - + "Version: GnuPG v1\n" - + "\n" - + "lQOYBFWdTP8BCADRxNpasIv0jtNXTK6VYIS2VJ2Xk0ZD6gtxeoXCpjQ+TsB9fxh3\n" - + "vAMPt2Zu5LqoGwygKOJj1zquG8xk7GUCCHJk3+qG8xxB1xGtSz2vLyfRm7fOZmHj\n" - + "3W/C/25lynSPDrfvcwvwA4PN8iP5EWbWU10L6WOZGMwwwtVDUSEouSOw2LEepxLV\n" - + "rkKuZcyHaivheDbUlZliwe9rGXd4hh1h4qyNQWG3q+ytlL28sVkOzUh6IMBTvqhe\n" - + "IRsvxvaVSLV8jRVKfUTqw0g57ft4ZD2/L46yUTXzr9aUCBjTNxvWLlyboqql/D8P\n" - + "inp51h3cvAg7NW5RdG1GEYmylH8SygT5utPxABEBAAEAB/0WW33OVqzEBwj9b/3X\n" - + "i+75I/Gb+yVtDZ/km2NwSJie33PirE4mTNKitTBkt1oxmphw5Yqji4gEkI/rXcqy\n" - + "OcY/fCIZ+gVT+yE2MCPF7Se4Tnl7tSvPxoUn6mOQ09AygyYVjlSCY02EAL/WxwUH\n" - + "6OCs6VYlNiBlPg7O2vHGzlzAd1aMmlG3ytlhb0SIbilaJn/wlQ2SEGySjIAP1qRH\n" - + "UXsTfW7oAjdqAY1CbCWg/0FnMBF+DnChH634dbLrS2OefcB70l61trEfRcHbMNTv\n" - + "9nVxDDCpaIdxsOfgWpe0GMG1qddRAxBIOVjNUFOL22xEFyaXnt/uagUtKQ7yejci\n" - + "bgTFBADcuhsfQaBX1G095iG2qr8Rx2T5GqNf9oZA+rbweWegqIH7MUXHI1KKwwJx\n" - + "C+rR5AgnxTSP614XI/AWB/txdelm8z0jLobpS6B1vzM2vRQ7hpwjJ3UvUkoQ5uYL\n" - + "DjaBqQi0w1cPJA79H0Yujc1zgdhATymz0uDL1BC2bHLIMuhelwQA80p07G1w8HLQ\n" - + "bTdgNwtDBMKIw39/ZyQy8ppxmpD4J6zf25r95g3er0r+njrHsa+72LnvexbedpKA\n" - + "4eiDJPN+l5jJOEWfL2WtGcqJ01bdFBPcl73tuwDJJtieUlKZH0jRjykuuUX8F+tJ\n" - + "yrmVoIGtawoeLKq3hMMOK4xi+sh3OrcD+wXIU24eO3YfUde5bhyaQplNMU5smIU0\n" - + "+looOEmFsZcTONgoN+FKrnm2TY9d4FHZ+QgtnksWHmmLxQJPtp9rHJ5BgdxMBPcK\n" - + "3w5GXRuWlOmqmnAb6vp0Q0yzVDLKCcwba0S23m3tbjZsLDcI7MG/knsp9gtL676D\n" - + "AsrpeF2+Apj0OwG0IFRlc3R1c2VyIFR3byA8dGVzdDJAZXhhbXBsZS5jb20+iQE+\n" - + "BBMBAgAoBQJVnUz/AhsDBQld/A8ABgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK\n" - + "CRBFMRpvN4oK7UZqCACWwQL/YvBK4b0m+R0dUdvAXeBx7DwOAnAodis9ZVqChb7R\n" - + "xcZQxF1Ti9mtCBPPQGuEs5wE2Ocrrq+L13r6bgW+1WOB1tZSDVxwL1PnZFw/SyAD\n" - + "RIDCZrOHiAkp82UnZwWAkk39GzNJtt1wTYDZFMTFUr2SPscXk1k7muS+ZfEFwNPD\n" - + "4tODo/poJKDYEJ80Z5UXXFQLDtsfdeIXMFIT449CYoq8XBMBfvyWl/LLpw0r3JI6\n" - + "pV/YdH3Oeuz8XkkEVzRxaxB6Zmeo5jSwjR/T8TKDGwwiuwiiT3SfkFSVdcjKulRu\n" - + "XSRNs1Ouf7/UC3cq4bG2WXWa85X1+HQRm7iuRHSOnQOYBFWdTP8BCADhhGxAA0pX\n" - + "5yBHwIgM1j0gw2h5nSsopDrO6t/sbRUcNxnRtBScgKZnP0sjRTYEUIwmZuseHMBo\n" - + "htVCuMaDt06qyZDvDk/98j3AeE5t2dgFnOIeqCrm/6aejbFcQOpxe6U29KJRCAxu\n" - + "wNtB15X1VH1Kj7B0gRSTu13n/5sUsi2lunoZoIvpIe9tZH4aXitCY2MCQH+hTyCy\n" - + "NBzlEa44kWz6LxUsPdo7I6rXkTr6Ot7wQh+97HCe042GIq65h0apgujyjhJidjch\n" - + "5ur1mngaSNSEyvbji2MGC+cd3wAIstG5a7xPd9MncY5Q/eH+hn96694k5bckottS\n" - + "yGm/3f2Ihfj1ABEBAAEAB/wP5H+mcTTrhe+57sEHuo9bQDocG+3fMtesHlRCept6\n" - + "vg1VQG4Va2GOtCCs7yMz4aNGz4jxOdB7bUkZJyFiRehG0+ahWi5b9JbSegf46Nm2\n" - + "54vt4icH2WtaEB04JaD/91k4yrunnzwVEAVDmhhIzjf4KbEjPLeBA7rF7zb0Gexq\n" - + "mdxEGO/6KdeQ6KOxkpWEqIIdl/mAGsYCprHeKL/XL+KXYr92nEbUcltmt59TTnoo\n" - + "00BQCPuHCdpcUd5nuaxpCZLM+BEpxtj0sinz0ofuWU9RI4K00R01MKXWMucdOhTZ\n" - + "kUy5dMx8wA07xbjkE/nH86N76Mty133OB7G3lBBDfO4PBADulfLzbjXUnS1kTKeP\n" - + "j/HF1E9qafzTDS/QD55OVajDq66A6zaOazKbURHNZmIqpLO4715+iNtrZQUEP3e1\n" - + "mwngeizvAv9luA9kJ1YDTCfsS5H5cYzavhfwuqBu7fQBm/PQqZplQuPCxgXEIBaY\n" - + "M0uvR0I/FSwFrepRN2IA6dAkrwQA8fpJEg8C9OLFzDf0rxV3eWwEelemN4E50Obu\n" - + "nxtg9IJWZ+QIWkRVLJ8if5+p85s2ieCw8hzEF0FyNfWUnfW5eoN4/j50loR4EbZS\n" - + "qOpUJGwr8ezyQN8PpduDOe9OQnUYAv9FY9Rk46L4937GDF2w5gdxyNdKO8yG+Z3A\n" - + "6/0DLZsEAOQsRUXIl1XLjkdugfFQ8V9Fv3AYWJt+8zknwcQ+Z3uOtyY2muCi9hX2\n" - + "BtuPojjwmN6x8wntMaUkzYHVSdz/cdx+na7VNS2kZHfnECWZGR6IHyRTJN5612yi\n" - + "e4MIdTE+BgL1HPq+VIPlMBehEksC5qM0WSq8baMsacGMYeAL8ntoRuyJASUEGAEC\n" - + "AA8FAlWdTP8CGwwFCV38DwAACgkQRTEabzeKCu1FNwgAif4eK2v7R3QubL2S6wmb\n" - + "1nsgRMgVYoxGBeUk2EK6WZ5IPor93ySd0ixRVNMRmJ8BLH3EMjZQTzkDG+BH6zFy\n" - + "xo6lLHw9NxQjI06tqQWgyyK0mEweVwB/zqtxiB4lNUpsNbqOZWnBJ3d6o1SsnD2Q\n" - + "3uwvP5fbfSIgdmUk3c0VMdgA+KzWjPD/PJIPujE+ckHhjn5cbDNw35/FuyhkLJfq\n" - + "lOG7SPvMNmCdJ1Pcqju9t7sf6b0BGPDOCL4gpuWKK7HJz9WxngNb3FSziLbyPLk1\n" - + "3ynADO+vEOR44LPyXE9kVxPusazsXlt9ayTOhELhwzw7sGFFu8E17Cpn7GnVj3tN\n" - + "9A==\n" - + "=qbV3\n" - + "-----END PGP PRIVATE KEY BLOCK-----\n"); + + "Version: GnuPG v1\n" + + "\n" + + "lQOYBFWdTP8BCADRxNpasIv0jtNXTK6VYIS2VJ2Xk0ZD6gtxeoXCpjQ+TsB9fxh3\n" + + "vAMPt2Zu5LqoGwygKOJj1zquG8xk7GUCCHJk3+qG8xxB1xGtSz2vLyfRm7fOZmHj\n" + + "3W/C/25lynSPDrfvcwvwA4PN8iP5EWbWU10L6WOZGMwwwtVDUSEouSOw2LEepxLV\n" + + "rkKuZcyHaivheDbUlZliwe9rGXd4hh1h4qyNQWG3q+ytlL28sVkOzUh6IMBTvqhe\n" + + "IRsvxvaVSLV8jRVKfUTqw0g57ft4ZD2/L46yUTXzr9aUCBjTNxvWLlyboqql/D8P\n" + + "inp51h3cvAg7NW5RdG1GEYmylH8SygT5utPxABEBAAEAB/0WW33OVqzEBwj9b/3X\n" + + "i+75I/Gb+yVtDZ/km2NwSJie33PirE4mTNKitTBkt1oxmphw5Yqji4gEkI/rXcqy\n" + + "OcY/fCIZ+gVT+yE2MCPF7Se4Tnl7tSvPxoUn6mOQ09AygyYVjlSCY02EAL/WxwUH\n" + + "6OCs6VYlNiBlPg7O2vHGzlzAd1aMmlG3ytlhb0SIbilaJn/wlQ2SEGySjIAP1qRH\n" + + "UXsTfW7oAjdqAY1CbCWg/0FnMBF+DnChH634dbLrS2OefcB70l61trEfRcHbMNTv\n" + + "9nVxDDCpaIdxsOfgWpe0GMG1qddRAxBIOVjNUFOL22xEFyaXnt/uagUtKQ7yejci\n" + + "bgTFBADcuhsfQaBX1G095iG2qr8Rx2T5GqNf9oZA+rbweWegqIH7MUXHI1KKwwJx\n" + + "C+rR5AgnxTSP614XI/AWB/txdelm8z0jLobpS6B1vzM2vRQ7hpwjJ3UvUkoQ5uYL\n" + + "DjaBqQi0w1cPJA79H0Yujc1zgdhATymz0uDL1BC2bHLIMuhelwQA80p07G1w8HLQ\n" + + "bTdgNwtDBMKIw39/ZyQy8ppxmpD4J6zf25r95g3er0r+njrHsa+72LnvexbedpKA\n" + + "4eiDJPN+l5jJOEWfL2WtGcqJ01bdFBPcl73tuwDJJtieUlKZH0jRjykuuUX8F+tJ\n" + + "yrmVoIGtawoeLKq3hMMOK4xi+sh3OrcD+wXIU24eO3YfUde5bhyaQplNMU5smIU0\n" + + "+looOEmFsZcTONgoN+FKrnm2TY9d4FHZ+QgtnksWHmmLxQJPtp9rHJ5BgdxMBPcK\n" + + "3w5GXRuWlOmqmnAb6vp0Q0yzVDLKCcwba0S23m3tbjZsLDcI7MG/knsp9gtL676D\n" + + "AsrpeF2+Apj0OwG0IFRlc3R1c2VyIFR3byA8dGVzdDJAZXhhbXBsZS5jb20+iQE+\n" + + "BBMBAgAoBQJVnUz/AhsDBQld/A8ABgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK\n" + + "CRBFMRpvN4oK7UZqCACWwQL/YvBK4b0m+R0dUdvAXeBx7DwOAnAodis9ZVqChb7R\n" + + "xcZQxF1Ti9mtCBPPQGuEs5wE2Ocrrq+L13r6bgW+1WOB1tZSDVxwL1PnZFw/SyAD\n" + + "RIDCZrOHiAkp82UnZwWAkk39GzNJtt1wTYDZFMTFUr2SPscXk1k7muS+ZfEFwNPD\n" + + "4tODo/poJKDYEJ80Z5UXXFQLDtsfdeIXMFIT449CYoq8XBMBfvyWl/LLpw0r3JI6\n" + + "pV/YdH3Oeuz8XkkEVzRxaxB6Zmeo5jSwjR/T8TKDGwwiuwiiT3SfkFSVdcjKulRu\n" + + "XSRNs1Ouf7/UC3cq4bG2WXWa85X1+HQRm7iuRHSOnQOYBFWdTP8BCADhhGxAA0pX\n" + + "5yBHwIgM1j0gw2h5nSsopDrO6t/sbRUcNxnRtBScgKZnP0sjRTYEUIwmZuseHMBo\n" + + "htVCuMaDt06qyZDvDk/98j3AeE5t2dgFnOIeqCrm/6aejbFcQOpxe6U29KJRCAxu\n" + + "wNtB15X1VH1Kj7B0gRSTu13n/5sUsi2lunoZoIvpIe9tZH4aXitCY2MCQH+hTyCy\n" + + "NBzlEa44kWz6LxUsPdo7I6rXkTr6Ot7wQh+97HCe042GIq65h0apgujyjhJidjch\n" + + "5ur1mngaSNSEyvbji2MGC+cd3wAIstG5a7xPd9MncY5Q/eH+hn96694k5bckottS\n" + + "yGm/3f2Ihfj1ABEBAAEAB/wP5H+mcTTrhe+57sEHuo9bQDocG+3fMtesHlRCept6\n" + + "vg1VQG4Va2GOtCCs7yMz4aNGz4jxOdB7bUkZJyFiRehG0+ahWi5b9JbSegf46Nm2\n" + + "54vt4icH2WtaEB04JaD/91k4yrunnzwVEAVDmhhIzjf4KbEjPLeBA7rF7zb0Gexq\n" + + "mdxEGO/6KdeQ6KOxkpWEqIIdl/mAGsYCprHeKL/XL+KXYr92nEbUcltmt59TTnoo\n" + + "00BQCPuHCdpcUd5nuaxpCZLM+BEpxtj0sinz0ofuWU9RI4K00R01MKXWMucdOhTZ\n" + + "kUy5dMx8wA07xbjkE/nH86N76Mty133OB7G3lBBDfO4PBADulfLzbjXUnS1kTKeP\n" + + "j/HF1E9qafzTDS/QD55OVajDq66A6zaOazKbURHNZmIqpLO4715+iNtrZQUEP3e1\n" + + "mwngeizvAv9luA9kJ1YDTCfsS5H5cYzavhfwuqBu7fQBm/PQqZplQuPCxgXEIBaY\n" + + "M0uvR0I/FSwFrepRN2IA6dAkrwQA8fpJEg8C9OLFzDf0rxV3eWwEelemN4E50Obu\n" + + "nxtg9IJWZ+QIWkRVLJ8if5+p85s2ieCw8hzEF0FyNfWUnfW5eoN4/j50loR4EbZS\n" + + "qOpUJGwr8ezyQN8PpduDOe9OQnUYAv9FY9Rk46L4937GDF2w5gdxyNdKO8yG+Z3A\n" + + "6/0DLZsEAOQsRUXIl1XLjkdugfFQ8V9Fv3AYWJt+8zknwcQ+Z3uOtyY2muCi9hX2\n" + + "BtuPojjwmN6x8wntMaUkzYHVSdz/cdx+na7VNS2kZHfnECWZGR6IHyRTJN5612yi\n" + + "e4MIdTE+BgL1HPq+VIPlMBehEksC5qM0WSq8baMsacGMYeAL8ntoRuyJASUEGAEC\n" + + "AA8FAlWdTP8CGwwFCV38DwAACgkQRTEabzeKCu1FNwgAif4eK2v7R3QubL2S6wmb\n" + + "1nsgRMgVYoxGBeUk2EK6WZ5IPor93ySd0ixRVNMRmJ8BLH3EMjZQTzkDG+BH6zFy\n" + + "xo6lLHw9NxQjI06tqQWgyyK0mEweVwB/zqtxiB4lNUpsNbqOZWnBJ3d6o1SsnD2Q\n" + + "3uwvP5fbfSIgdmUk3c0VMdgA+KzWjPD/PJIPujE+ckHhjn5cbDNw35/FuyhkLJfq\n" + + "lOG7SPvMNmCdJ1Pcqju9t7sf6b0BGPDOCL4gpuWKK7HJz9WxngNb3FSziLbyPLk1\n" + + "3ynADO+vEOR44LPyXE9kVxPusazsXlt9ayTOhELhwzw7sGFFu8E17Cpn7GnVj3tN\n" + + "9A==\n" + + "=qbV3\n" + + "-----END PGP PRIVATE KEY BLOCK-----\n"); } /** @@ -239,93 +238,93 @@ public class TestKeys { public static final TestKey expiredKey() { return new TestKey( "-----BEGIN PGP PUBLIC KEY BLOCK-----\n" - + "Version: GnuPG v1\n" - + "\n" - + "mQENBELOp0UBCACxholOPWuKhK+TYb88nvLUSCMvTLIFEpb5u3Eavr0wiluEzq6H\n" - + "55nswAD3dQm8DWxA7yUlEYjPr5btpw7V9441bb1+qtgZMJ10RTdEb/WjyctdGA99\n" - + "uOKBEarWbt8W+w6lyJ9NXy5bS/x5EwHHfoTFp4ff6ffHI5hbx1a00K8oxmitgd0X\n" - + "Mx86UmauFNJYupZOZG9gEcP4RbRp7e2pm4Jy1WLEOeg9Fdgm5e5Hj2nMkCSZ9BKV\n" - + "cxuOllSVzM/Zp0/4+RS9R57jKo3/V74Whwh9yQNgL9UxdNk7L0eGqvaT3EjXxjOc\n" - + "RCeJiucGN/0W2iq+V01/QGspp4SKtAogWBozABEBAAG0IlRlc3R1c2VyIFRocmVl\n" - + "IDx0ZXN0M0BleGFtcGxlLmNvbT6JAT4EEwECACgFAkLOp0UCGwMFCQHhM4AGCwkI\n" - + "BwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEDzseBsX3hrNYg0H/2CMm5/JDQNSuRFC\n" - + "ECWLrcOeimuvwbmkonNzOkvKbGXl73GStISAksRWAHBQED1rEPC0NkFCDeVZO7df\n" - + "SYLlsqKwV6uSh05Ra0F5XeniC12YpAyzoQyCGRS2wLaS822j0zUPXA8XLaO2blCu\n" - + "R+8sNu/oecMRcFK4S9NaApi3vdqBNhLiN1/Lpqn1LfB8uIO+eaUf4PmCWbaPgzSk\n" - + "qcPfKZmocNXdgLV5Q80n3hc2y2nrl+vDW2M+eVZuDHAok2BOD9uGKFfLAbaXLbX5\n" - + "btBW2L0UHtoEyiqkRfD6lX2laSLQmA6+eup7e4GS+s0vXBuVh8XEYddV6Yjt8H7/\n" - + "2thO41K5AQ0EQs6nRQEIAM/833UHK1DuFlOm7/n18dRMvs7BkXvg+hPquKWMG3be\n" - + "eE4sh1NG5DbRCdo6iacZLarWr3FDz7J9+wswRhtHCh3pGHEuaJk52vRjQxlkNh5F\n" - + "p5u2R4WF546bWqX45xPdLfHVTPyWB9q7aVxE+6Q+MHa6lMoyTVnTVCOy3nshiihw\n" - + "dxLsxaga+QmaL0bAR+dRcO6ucj7TDQXz1AJAVp26c0LXV9iErhFuuybUZKT0a9Aj\n" - + "FoumMZ6l+k30sSdjSjpBMsNvPos0dTPPRXUMu77o5sj+pHa4o8WctgB3o7BHQELp\n" - + "KgujZ2sKC9Nm395u6Q4cqUWihzb/Y7rIRuNHJarI7vUAEQEAAYkBJQQYAQIADwUC\n" - + "Qs6nRQIbDAUJAeEzgAAKCRA87HgbF94azRiBB/4vAyOOjUjK3lDWjHGs7mvEWJI/\n" - + "1MeLlGPswCSInJBa+HMiMI4tzq+hu5ejGThojNbmnL96GdzfDkMlP4Feyxb2rjtb\n" - + "NrD/R5tlXHmjX/QLzep4LCeMziP80fu8qUeiOej/Ecdny0w365PlMdt10RaYR8VE\n" - + "ZX/DAie6JfElnfQcG5q8TIOH3i71qxV+kIoPqKWfQ0MXrNEJ3BYFfDGdUt8U1Kq9\n" - + "OuIHVRgGS7mMSyjgNqqp7MBeMY+PFFZaZel5yoYVjb9d3L8XvVv2eoa/jPj5FUEU\n" - + "kE9uxNmwaD1PiV8DvBTYI+eQL4qzfu+3NTG2SfgQYtj5oiGHw8aL3U6QHDJb\n" - + "=d/Xp\n" - + "-----END PGP PUBLIC KEY BLOCK-----\n", + + "Version: GnuPG v1\n" + + "\n" + + "mQENBELOp0UBCACxholOPWuKhK+TYb88nvLUSCMvTLIFEpb5u3Eavr0wiluEzq6H\n" + + "55nswAD3dQm8DWxA7yUlEYjPr5btpw7V9441bb1+qtgZMJ10RTdEb/WjyctdGA99\n" + + "uOKBEarWbt8W+w6lyJ9NXy5bS/x5EwHHfoTFp4ff6ffHI5hbx1a00K8oxmitgd0X\n" + + "Mx86UmauFNJYupZOZG9gEcP4RbRp7e2pm4Jy1WLEOeg9Fdgm5e5Hj2nMkCSZ9BKV\n" + + "cxuOllSVzM/Zp0/4+RS9R57jKo3/V74Whwh9yQNgL9UxdNk7L0eGqvaT3EjXxjOc\n" + + "RCeJiucGN/0W2iq+V01/QGspp4SKtAogWBozABEBAAG0IlRlc3R1c2VyIFRocmVl\n" + + "IDx0ZXN0M0BleGFtcGxlLmNvbT6JAT4EEwECACgFAkLOp0UCGwMFCQHhM4AGCwkI\n" + + "BwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEDzseBsX3hrNYg0H/2CMm5/JDQNSuRFC\n" + + "ECWLrcOeimuvwbmkonNzOkvKbGXl73GStISAksRWAHBQED1rEPC0NkFCDeVZO7df\n" + + "SYLlsqKwV6uSh05Ra0F5XeniC12YpAyzoQyCGRS2wLaS822j0zUPXA8XLaO2blCu\n" + + "R+8sNu/oecMRcFK4S9NaApi3vdqBNhLiN1/Lpqn1LfB8uIO+eaUf4PmCWbaPgzSk\n" + + "qcPfKZmocNXdgLV5Q80n3hc2y2nrl+vDW2M+eVZuDHAok2BOD9uGKFfLAbaXLbX5\n" + + "btBW2L0UHtoEyiqkRfD6lX2laSLQmA6+eup7e4GS+s0vXBuVh8XEYddV6Yjt8H7/\n" + + "2thO41K5AQ0EQs6nRQEIAM/833UHK1DuFlOm7/n18dRMvs7BkXvg+hPquKWMG3be\n" + + "eE4sh1NG5DbRCdo6iacZLarWr3FDz7J9+wswRhtHCh3pGHEuaJk52vRjQxlkNh5F\n" + + "p5u2R4WF546bWqX45xPdLfHVTPyWB9q7aVxE+6Q+MHa6lMoyTVnTVCOy3nshiihw\n" + + "dxLsxaga+QmaL0bAR+dRcO6ucj7TDQXz1AJAVp26c0LXV9iErhFuuybUZKT0a9Aj\n" + + "FoumMZ6l+k30sSdjSjpBMsNvPos0dTPPRXUMu77o5sj+pHa4o8WctgB3o7BHQELp\n" + + "KgujZ2sKC9Nm395u6Q4cqUWihzb/Y7rIRuNHJarI7vUAEQEAAYkBJQQYAQIADwUC\n" + + "Qs6nRQIbDAUJAeEzgAAKCRA87HgbF94azRiBB/4vAyOOjUjK3lDWjHGs7mvEWJI/\n" + + "1MeLlGPswCSInJBa+HMiMI4tzq+hu5ejGThojNbmnL96GdzfDkMlP4Feyxb2rjtb\n" + + "NrD/R5tlXHmjX/QLzep4LCeMziP80fu8qUeiOej/Ecdny0w365PlMdt10RaYR8VE\n" + + "ZX/DAie6JfElnfQcG5q8TIOH3i71qxV+kIoPqKWfQ0MXrNEJ3BYFfDGdUt8U1Kq9\n" + + "OuIHVRgGS7mMSyjgNqqp7MBeMY+PFFZaZel5yoYVjb9d3L8XvVv2eoa/jPj5FUEU\n" + + "kE9uxNmwaD1PiV8DvBTYI+eQL4qzfu+3NTG2SfgQYtj5oiGHw8aL3U6QHDJb\n" + + "=d/Xp\n" + + "-----END PGP PUBLIC KEY BLOCK-----\n", "-----BEGIN PGP PRIVATE KEY BLOCK-----\n" - + "Version: GnuPG v1\n" - + "\n" - + "lQOYBELOp0UBCACxholOPWuKhK+TYb88nvLUSCMvTLIFEpb5u3Eavr0wiluEzq6H\n" - + "55nswAD3dQm8DWxA7yUlEYjPr5btpw7V9441bb1+qtgZMJ10RTdEb/WjyctdGA99\n" - + "uOKBEarWbt8W+w6lyJ9NXy5bS/x5EwHHfoTFp4ff6ffHI5hbx1a00K8oxmitgd0X\n" - + "Mx86UmauFNJYupZOZG9gEcP4RbRp7e2pm4Jy1WLEOeg9Fdgm5e5Hj2nMkCSZ9BKV\n" - + "cxuOllSVzM/Zp0/4+RS9R57jKo3/V74Whwh9yQNgL9UxdNk7L0eGqvaT3EjXxjOc\n" - + "RCeJiucGN/0W2iq+V01/QGspp4SKtAogWBozABEBAAEAB/4hGI3ckkLMTjRVa7G1\n" - + "YYSv4sr8dHXz0CVpZXKOo+Stef3Z4pZTK/BcXOdROvaXooD+EheAs6Yn4fpnT+/K\n" - + "IB7ZAx6C0OL8vz17gbPuBFltMZ/COUwaCi/gFCUfWQgqRp/SdHaOfCIuTxpAkDSS\n" - + "tpmWJ8eDDSFudMpgweb+SrF9DkCwp+FgUbzDRzO1aqzuu8PGihCHQt/pkhNHQ63/\n" - + "srDDqk6lIxxZHhv9+ucr3plDuijkvAa5/QDudQlucKDLtTPSD40UcqYnpg/V/RJU\n" - + "eBK0ZXmCIHpG9beHW/xdlwrK3eY4Z2sVDMm9TeeHmRYOCr5wQCyeLpMdAt0Ijk6a\n" - + "nINhBADI2lRodgnLvUKbOvVocz8WQjG1IXlL8iXSNuuHONijPXZiWh7XdkNxr9fm\n" - + "jRqzvZzYsWGT6MnirX2eXaEWJsWJHxTxJuiuOk0V/iGnV/d+jFduoKXNmB5k/ZB3\n" - + "6zySi7+STKNyIvnMATVsRoI/cNUwfmx53m6trFg581CnSiA82QQA4kSPw9OXmTKj\n" - + "ctlHrWsapWu+66pDVZw62lW6lvrd7t+m8liNb6VJuTnwIKVXJOQtUo1+GSMs0+YK\n" - + "wnd9FGq4jT8l0qBO4K/8B1HxppLC2S0ntC+CusxWMUDbdC2xg+G2W3oLwq3iamgz\n" - + "LvPTy1Pzs9PqDd6FXIdzieFy6J8W1+sEAKS3vjh7Z/PIVULZhdaohAd5Igd67S/Z\n" - + "BMWYNbBuJTnnb7DiOllLZSd2lR7IAKPKsUd6UY8uskOxI81hI116zNx17mIGFIIq\n" - + "DdDgRbvzMNEgNlOxg/BD01kXOS4fhnT2F6ca3VGTgUtOdcdF3M9MtePWQLBzEDPz\n" - + "8nx3O20HDupuQmG0IlRlc3R1c2VyIFRocmVlIDx0ZXN0M0BleGFtcGxlLmNvbT6J\n" - + "AT4EEwECACgFAkLOp0UCGwMFCQHhM4AGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheA\n" - + "AAoJEDzseBsX3hrNYg0H/2CMm5/JDQNSuRFCECWLrcOeimuvwbmkonNzOkvKbGXl\n" - + "73GStISAksRWAHBQED1rEPC0NkFCDeVZO7dfSYLlsqKwV6uSh05Ra0F5XeniC12Y\n" - + "pAyzoQyCGRS2wLaS822j0zUPXA8XLaO2blCuR+8sNu/oecMRcFK4S9NaApi3vdqB\n" - + "NhLiN1/Lpqn1LfB8uIO+eaUf4PmCWbaPgzSkqcPfKZmocNXdgLV5Q80n3hc2y2nr\n" - + "l+vDW2M+eVZuDHAok2BOD9uGKFfLAbaXLbX5btBW2L0UHtoEyiqkRfD6lX2laSLQ\n" - + "mA6+eup7e4GS+s0vXBuVh8XEYddV6Yjt8H7/2thO41KdA5gEQs6nRQEIAM/833UH\n" - + "K1DuFlOm7/n18dRMvs7BkXvg+hPquKWMG3beeE4sh1NG5DbRCdo6iacZLarWr3FD\n" - + "z7J9+wswRhtHCh3pGHEuaJk52vRjQxlkNh5Fp5u2R4WF546bWqX45xPdLfHVTPyW\n" - + "B9q7aVxE+6Q+MHa6lMoyTVnTVCOy3nshiihwdxLsxaga+QmaL0bAR+dRcO6ucj7T\n" - + "DQXz1AJAVp26c0LXV9iErhFuuybUZKT0a9AjFoumMZ6l+k30sSdjSjpBMsNvPos0\n" - + "dTPPRXUMu77o5sj+pHa4o8WctgB3o7BHQELpKgujZ2sKC9Nm395u6Q4cqUWihzb/\n" - + "Y7rIRuNHJarI7vUAEQEAAQAH+gNBKDf7FDzwdM37Sz8Ej7OsPcIbekzPcOpV3mzM\n" - + "u/NIuOY0QSvW7KRE8hwFlXjVZocJU/Z4Qqw+12pN55LusiRUrOq8eKuJIbl4QikI\n" - + "Dea8XUqM+CKJPV3YZXs6YVdIuzrRBSLgsB/Glff5JlzkEjsRYVmmnto8edETL/MK\n" - + "S9ClJqQiFKE4b01+Eh9oB/DfxzsiEf/a+rdRnWRh/jtpEwgeXcfmjhf+0zrzChu2\n" - + "ylQQ5QOuwQNKJP6DvRu/W5pOaKH9tPDR31SccDJDdnDUzBD7oSsXl06DcfMNEa8q\n" - + "PaNHLDDRNnqTEhwYSJ4r2emDFMxg7Kky+aatUNjAYk9vkgMEANnvumgr6/KCLWKc\n" - + "D3fZE09N7BveGBBDQBYNGPFtx60WbKrSY3e2RSfgWbyEXkzwm1VlB2869T1we0rL\n" - + "z6eV/TK5rrJQxJFHZ/anMxbQY0sCiOgqi6PKT03RTpA2N803hTym+oypy+5T6BFM\n" - + "rtjXvwIZN/BgAE2JjA70crTAd1mvBAD0UFNAU9oE7K7sgDbni4EhxmDyaviBHfxV\n" - + "PJP1ICUXAcEzAsz2T/L5TqZUD+LfYIkbf8wk2/mPZFfrCrQgCrzWn7KV1SHXkhf4\n" - + "4Sg6Y6p0g0Jl3mWRPiQ6ALlOVQIkp5V8z4b0hTF2c4oct1Pzaeq+ZkahyvrhW06P\n" - + "iaucRZb+mwP/aVTpkd4n/FyKCcbf9/KniYJ+Ou1OunsBQr/jzN+r0PKCb8l/ksig\n" - + "i/M0NGetemq9CxYsJDAyJs1aO4SWgx5LbfcMmyXDuJ3sL0ztFLOES31Mih3ZJebg\n" - + "xPpj2bB/67i2zeYRcjxQ116y23gOa2TWM8EE4TW7F/mQjw4fIPJ93ClBMIkBJQQY\n" - + "AQIADwUCQs6nRQIbDAUJAeEzgAAKCRA87HgbF94azRiBB/4vAyOOjUjK3lDWjHGs\n" - + "7mvEWJI/1MeLlGPswCSInJBa+HMiMI4tzq+hu5ejGThojNbmnL96GdzfDkMlP4Fe\n" - + "yxb2rjtbNrD/R5tlXHmjX/QLzep4LCeMziP80fu8qUeiOej/Ecdny0w365PlMdt1\n" - + "0RaYR8VEZX/DAie6JfElnfQcG5q8TIOH3i71qxV+kIoPqKWfQ0MXrNEJ3BYFfDGd\n" - + "Ut8U1Kq9OuIHVRgGS7mMSyjgNqqp7MBeMY+PFFZaZel5yoYVjb9d3L8XvVv2eoa/\n" - + "jPj5FUEUkE9uxNmwaD1PiV8DvBTYI+eQL4qzfu+3NTG2SfgQYtj5oiGHw8aL3U6Q\n" - + "HDJb\n" - + "=RrXv\n" - + "-----END PGP PRIVATE KEY BLOCK-----\n"); + + "Version: GnuPG v1\n" + + "\n" + + "lQOYBELOp0UBCACxholOPWuKhK+TYb88nvLUSCMvTLIFEpb5u3Eavr0wiluEzq6H\n" + + "55nswAD3dQm8DWxA7yUlEYjPr5btpw7V9441bb1+qtgZMJ10RTdEb/WjyctdGA99\n" + + "uOKBEarWbt8W+w6lyJ9NXy5bS/x5EwHHfoTFp4ff6ffHI5hbx1a00K8oxmitgd0X\n" + + "Mx86UmauFNJYupZOZG9gEcP4RbRp7e2pm4Jy1WLEOeg9Fdgm5e5Hj2nMkCSZ9BKV\n" + + "cxuOllSVzM/Zp0/4+RS9R57jKo3/V74Whwh9yQNgL9UxdNk7L0eGqvaT3EjXxjOc\n" + + "RCeJiucGN/0W2iq+V01/QGspp4SKtAogWBozABEBAAEAB/4hGI3ckkLMTjRVa7G1\n" + + "YYSv4sr8dHXz0CVpZXKOo+Stef3Z4pZTK/BcXOdROvaXooD+EheAs6Yn4fpnT+/K\n" + + "IB7ZAx6C0OL8vz17gbPuBFltMZ/COUwaCi/gFCUfWQgqRp/SdHaOfCIuTxpAkDSS\n" + + "tpmWJ8eDDSFudMpgweb+SrF9DkCwp+FgUbzDRzO1aqzuu8PGihCHQt/pkhNHQ63/\n" + + "srDDqk6lIxxZHhv9+ucr3plDuijkvAa5/QDudQlucKDLtTPSD40UcqYnpg/V/RJU\n" + + "eBK0ZXmCIHpG9beHW/xdlwrK3eY4Z2sVDMm9TeeHmRYOCr5wQCyeLpMdAt0Ijk6a\n" + + "nINhBADI2lRodgnLvUKbOvVocz8WQjG1IXlL8iXSNuuHONijPXZiWh7XdkNxr9fm\n" + + "jRqzvZzYsWGT6MnirX2eXaEWJsWJHxTxJuiuOk0V/iGnV/d+jFduoKXNmB5k/ZB3\n" + + "6zySi7+STKNyIvnMATVsRoI/cNUwfmx53m6trFg581CnSiA82QQA4kSPw9OXmTKj\n" + + "ctlHrWsapWu+66pDVZw62lW6lvrd7t+m8liNb6VJuTnwIKVXJOQtUo1+GSMs0+YK\n" + + "wnd9FGq4jT8l0qBO4K/8B1HxppLC2S0ntC+CusxWMUDbdC2xg+G2W3oLwq3iamgz\n" + + "LvPTy1Pzs9PqDd6FXIdzieFy6J8W1+sEAKS3vjh7Z/PIVULZhdaohAd5Igd67S/Z\n" + + "BMWYNbBuJTnnb7DiOllLZSd2lR7IAKPKsUd6UY8uskOxI81hI116zNx17mIGFIIq\n" + + "DdDgRbvzMNEgNlOxg/BD01kXOS4fhnT2F6ca3VGTgUtOdcdF3M9MtePWQLBzEDPz\n" + + "8nx3O20HDupuQmG0IlRlc3R1c2VyIFRocmVlIDx0ZXN0M0BleGFtcGxlLmNvbT6J\n" + + "AT4EEwECACgFAkLOp0UCGwMFCQHhM4AGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheA\n" + + "AAoJEDzseBsX3hrNYg0H/2CMm5/JDQNSuRFCECWLrcOeimuvwbmkonNzOkvKbGXl\n" + + "73GStISAksRWAHBQED1rEPC0NkFCDeVZO7dfSYLlsqKwV6uSh05Ra0F5XeniC12Y\n" + + "pAyzoQyCGRS2wLaS822j0zUPXA8XLaO2blCuR+8sNu/oecMRcFK4S9NaApi3vdqB\n" + + "NhLiN1/Lpqn1LfB8uIO+eaUf4PmCWbaPgzSkqcPfKZmocNXdgLV5Q80n3hc2y2nr\n" + + "l+vDW2M+eVZuDHAok2BOD9uGKFfLAbaXLbX5btBW2L0UHtoEyiqkRfD6lX2laSLQ\n" + + "mA6+eup7e4GS+s0vXBuVh8XEYddV6Yjt8H7/2thO41KdA5gEQs6nRQEIAM/833UH\n" + + "K1DuFlOm7/n18dRMvs7BkXvg+hPquKWMG3beeE4sh1NG5DbRCdo6iacZLarWr3FD\n" + + "z7J9+wswRhtHCh3pGHEuaJk52vRjQxlkNh5Fp5u2R4WF546bWqX45xPdLfHVTPyW\n" + + "B9q7aVxE+6Q+MHa6lMoyTVnTVCOy3nshiihwdxLsxaga+QmaL0bAR+dRcO6ucj7T\n" + + "DQXz1AJAVp26c0LXV9iErhFuuybUZKT0a9AjFoumMZ6l+k30sSdjSjpBMsNvPos0\n" + + "dTPPRXUMu77o5sj+pHa4o8WctgB3o7BHQELpKgujZ2sKC9Nm395u6Q4cqUWihzb/\n" + + "Y7rIRuNHJarI7vUAEQEAAQAH+gNBKDf7FDzwdM37Sz8Ej7OsPcIbekzPcOpV3mzM\n" + + "u/NIuOY0QSvW7KRE8hwFlXjVZocJU/Z4Qqw+12pN55LusiRUrOq8eKuJIbl4QikI\n" + + "Dea8XUqM+CKJPV3YZXs6YVdIuzrRBSLgsB/Glff5JlzkEjsRYVmmnto8edETL/MK\n" + + "S9ClJqQiFKE4b01+Eh9oB/DfxzsiEf/a+rdRnWRh/jtpEwgeXcfmjhf+0zrzChu2\n" + + "ylQQ5QOuwQNKJP6DvRu/W5pOaKH9tPDR31SccDJDdnDUzBD7oSsXl06DcfMNEa8q\n" + + "PaNHLDDRNnqTEhwYSJ4r2emDFMxg7Kky+aatUNjAYk9vkgMEANnvumgr6/KCLWKc\n" + + "D3fZE09N7BveGBBDQBYNGPFtx60WbKrSY3e2RSfgWbyEXkzwm1VlB2869T1we0rL\n" + + "z6eV/TK5rrJQxJFHZ/anMxbQY0sCiOgqi6PKT03RTpA2N803hTym+oypy+5T6BFM\n" + + "rtjXvwIZN/BgAE2JjA70crTAd1mvBAD0UFNAU9oE7K7sgDbni4EhxmDyaviBHfxV\n" + + "PJP1ICUXAcEzAsz2T/L5TqZUD+LfYIkbf8wk2/mPZFfrCrQgCrzWn7KV1SHXkhf4\n" + + "4Sg6Y6p0g0Jl3mWRPiQ6ALlOVQIkp5V8z4b0hTF2c4oct1Pzaeq+ZkahyvrhW06P\n" + + "iaucRZb+mwP/aVTpkd4n/FyKCcbf9/KniYJ+Ou1OunsBQr/jzN+r0PKCb8l/ksig\n" + + "i/M0NGetemq9CxYsJDAyJs1aO4SWgx5LbfcMmyXDuJ3sL0ztFLOES31Mih3ZJebg\n" + + "xPpj2bB/67i2zeYRcjxQ116y23gOa2TWM8EE4TW7F/mQjw4fIPJ93ClBMIkBJQQY\n" + + "AQIADwUCQs6nRQIbDAUJAeEzgAAKCRA87HgbF94azRiBB/4vAyOOjUjK3lDWjHGs\n" + + "7mvEWJI/1MeLlGPswCSInJBa+HMiMI4tzq+hu5ejGThojNbmnL96GdzfDkMlP4Fe\n" + + "yxb2rjtbNrD/R5tlXHmjX/QLzep4LCeMziP80fu8qUeiOej/Ecdny0w365PlMdt1\n" + + "0RaYR8VEZX/DAie6JfElnfQcG5q8TIOH3i71qxV+kIoPqKWfQ0MXrNEJ3BYFfDGd\n" + + "Ut8U1Kq9OuIHVRgGS7mMSyjgNqqp7MBeMY+PFFZaZel5yoYVjb9d3L8XvVv2eoa/\n" + + "jPj5FUEUkE9uxNmwaD1PiV8DvBTYI+eQL4qzfu+3NTG2SfgQYtj5oiGHw8aL3U6Q\n" + + "HDJb\n" + + "=RrXv\n" + + "-----END PGP PRIVATE KEY BLOCK-----\n"); } /** @@ -340,98 +339,98 @@ public class TestKeys { public static final TestKey selfRevokedKey() { return new TestKey( "-----BEGIN PGP PUBLIC KEY BLOCK-----\n" - + "Version: GnuPG v1\n" - + "\n" - + "mQENBFWdTZwBCAC1jukp5mlitfq2sAmdtx1s1VbWh+buDbBY2kWcxbbssczozFUP\n" - + "Ii67wPwjRbn3GM5+jY3GMsqKIrdyDlxeTxGWoU/qa2YkCQzgFGD/XJBqkVpP6osm\n" - + "qFYSP0xST1iBkatkMHq5KMjrX2q2bGVLlchLF9eHrWSefMcfff1Vs/Y8F2RCo38y\n" - + "gH88mbcvgyC+zq6Q2T3h5RiLK2IaZDNsn3uUoIMYHxI6oYtXXMSXRJlLJvamXVrB\n" - + "7QAq8L8cNikJjZMz+bHtLtGDyVVp9tqo4yvMrHe6BYmBUte3tPYQlDVdEo7UqepR\n" - + "uT7JbBOGBoD+9ngDrDggPUBAoa0h3VNOTyoDABEBAAGJAR8EIAECAAkFAlWdVXkC\n" - + "HQIACgkQCFUqF3yoeCH4lgf/aBdTYqnwL1lreHbQaUXI0/B2zlMuoptoi/x+xjIB\n" - + "7RszzaN3w0n4/87kUN2koNtgNymv2ccKTR1PiX+obscJhsWzNbz3/Cjtr/IpEQRd\n" - + "E6qRptHDk0U2cHW4BYDSltndOktICdhWCWYLDxJHGjdyXqqqdEEFJ24u2fUJ3yF3\n" - + "NF2Bxa6llrmLb2fVeVYBzQSztQopKRWP9nt3ySoeJQqRWjNBN2j7cC93nrLHZTvB\n" - + "L/sWuTq5ecbXeeNVzxoBd21jmGrIUPNwGdDKdbTB0CjpLpVHOTwGByeRKQXhMlQB\n" - + "pK96wUpxxtShtOjNjN1s9GEyLHwDiHSuHNYs/AxxFzf9nbQhVGVzdHVzZXIgRm91\n" - + "ciA8dGVzdDRAZXhhbXBsZS5jb20+iQE4BBMBAgAiBQJVnU2cAhsDBgsJCAcDAgYV\n" - + "CAIJCgsEFgIDAQIeAQIXgAAKCRAIVSoXfKh4IXsHCACSm9RIdxxqibAaxh+nm6w5\n" - + "F5a6Hju5cdmkk9albDoQYh2eM8E5NdDq+r0qSSe2+ujDaQ4C95DZNJQESvIcHHHb\n" - + "9AECrBfS8Yk86rX8hxVeYQczMkB9LdBHximTSoOr8L/eAxBE/VXDwust6EAe6Q1A\n" - + "a3tlTTvCfcmw4PipvtP7F6UzFaq+QU6fvARpBATOcvVc2JU4JQOrxuNEQ2PKrSti\n" - + "75S5mnVWm0pRebM+EorWBtlA0eOAeLNqCp87UwLdvUyOTRZT4DJ51eTxfrFADXrI\n" - + "9/ejs3/YxCPYxaPicAlcldduuajU/s+9ifrUn0Npg2ILl8mQkNzqeerlBeecUV4E\n" - + "uQENBFWdTZwBCADEOsK+mFQ/2uds9znkmAqrk24waVBpyPGrTTXtXX0dKhtQAsh6\n" - + "QkZGkjLTnKxEsa9syqVckw+1JtCh44SP1gjqDUoShpBz5wIuksZ7q96Hx+F0TVG/\n" - + "njS6GrWvwKhL2Lb9hYfdlrZiYtOOi0iiOzud25H/Ms15kC8tuQm7NWtANJJF4Sxo\n" - + "Bxor6L/F4zunEkTL0L9/dp4qVrw23fJVKE38cSdxjB0u1qSDzLV/u0QJqlYxJAiE\n" - + "ciwQN2uVnTY1/XSpouMy6LvbYU7B2uU/WohNmH3RiN/fQ6jJm4x+fCZ8+zqXMiZn\n" - + "G2fPkwmxxK9cl64YnNGcTwsVt6BMbCHk9jHxABEBAAGJAR8EGAECAAkFAlWdTZwC\n" - + "GwwACgkQCFUqF3yoeCGOdwf/TmoxH3pFBm/MDhY5Ct5FO0KvsgQk2ZgDa68HyQ8j\n" - + "QYi1FUCtyDjsxf5KTfyvzpzcTpS7cyOwcJNtTj6UixwATkcivvYWYoOXghAsTo4f\n" - + "1+j/x6ECq1+nYE6NpcAN7VRJpYMk2UO2qlhHCesTPGzsHchL7mwiYdhGrdiWGTpd\n" - + "KI9WfOYDZZ9ZSw/QINJUyTRxrDnauOvVbhbAXc7jdKCkRQRZpsNlF//1Stg6nstj\n" - + "FJ7SrjVdsMJNlihT6fG5ujmrty1/6b1VCLkIQfW5cWvzRzTBFytq7i4PVKh3u7Oz\n" - + "tt9lf8s50zt2uBE/AKMkyE6IJLsBWpJPk7iFKkHGDx044Q==\n" - + "=477N\n" - + "-----END PGP PUBLIC KEY BLOCK-----\n", + + "Version: GnuPG v1\n" + + "\n" + + "mQENBFWdTZwBCAC1jukp5mlitfq2sAmdtx1s1VbWh+buDbBY2kWcxbbssczozFUP\n" + + "Ii67wPwjRbn3GM5+jY3GMsqKIrdyDlxeTxGWoU/qa2YkCQzgFGD/XJBqkVpP6osm\n" + + "qFYSP0xST1iBkatkMHq5KMjrX2q2bGVLlchLF9eHrWSefMcfff1Vs/Y8F2RCo38y\n" + + "gH88mbcvgyC+zq6Q2T3h5RiLK2IaZDNsn3uUoIMYHxI6oYtXXMSXRJlLJvamXVrB\n" + + "7QAq8L8cNikJjZMz+bHtLtGDyVVp9tqo4yvMrHe6BYmBUte3tPYQlDVdEo7UqepR\n" + + "uT7JbBOGBoD+9ngDrDggPUBAoa0h3VNOTyoDABEBAAGJAR8EIAECAAkFAlWdVXkC\n" + + "HQIACgkQCFUqF3yoeCH4lgf/aBdTYqnwL1lreHbQaUXI0/B2zlMuoptoi/x+xjIB\n" + + "7RszzaN3w0n4/87kUN2koNtgNymv2ccKTR1PiX+obscJhsWzNbz3/Cjtr/IpEQRd\n" + + "E6qRptHDk0U2cHW4BYDSltndOktICdhWCWYLDxJHGjdyXqqqdEEFJ24u2fUJ3yF3\n" + + "NF2Bxa6llrmLb2fVeVYBzQSztQopKRWP9nt3ySoeJQqRWjNBN2j7cC93nrLHZTvB\n" + + "L/sWuTq5ecbXeeNVzxoBd21jmGrIUPNwGdDKdbTB0CjpLpVHOTwGByeRKQXhMlQB\n" + + "pK96wUpxxtShtOjNjN1s9GEyLHwDiHSuHNYs/AxxFzf9nbQhVGVzdHVzZXIgRm91\n" + + "ciA8dGVzdDRAZXhhbXBsZS5jb20+iQE4BBMBAgAiBQJVnU2cAhsDBgsJCAcDAgYV\n" + + "CAIJCgsEFgIDAQIeAQIXgAAKCRAIVSoXfKh4IXsHCACSm9RIdxxqibAaxh+nm6w5\n" + + "F5a6Hju5cdmkk9albDoQYh2eM8E5NdDq+r0qSSe2+ujDaQ4C95DZNJQESvIcHHHb\n" + + "9AECrBfS8Yk86rX8hxVeYQczMkB9LdBHximTSoOr8L/eAxBE/VXDwust6EAe6Q1A\n" + + "a3tlTTvCfcmw4PipvtP7F6UzFaq+QU6fvARpBATOcvVc2JU4JQOrxuNEQ2PKrSti\n" + + "75S5mnVWm0pRebM+EorWBtlA0eOAeLNqCp87UwLdvUyOTRZT4DJ51eTxfrFADXrI\n" + + "9/ejs3/YxCPYxaPicAlcldduuajU/s+9ifrUn0Npg2ILl8mQkNzqeerlBeecUV4E\n" + + "uQENBFWdTZwBCADEOsK+mFQ/2uds9znkmAqrk24waVBpyPGrTTXtXX0dKhtQAsh6\n" + + "QkZGkjLTnKxEsa9syqVckw+1JtCh44SP1gjqDUoShpBz5wIuksZ7q96Hx+F0TVG/\n" + + "njS6GrWvwKhL2Lb9hYfdlrZiYtOOi0iiOzud25H/Ms15kC8tuQm7NWtANJJF4Sxo\n" + + "Bxor6L/F4zunEkTL0L9/dp4qVrw23fJVKE38cSdxjB0u1qSDzLV/u0QJqlYxJAiE\n" + + "ciwQN2uVnTY1/XSpouMy6LvbYU7B2uU/WohNmH3RiN/fQ6jJm4x+fCZ8+zqXMiZn\n" + + "G2fPkwmxxK9cl64YnNGcTwsVt6BMbCHk9jHxABEBAAGJAR8EGAECAAkFAlWdTZwC\n" + + "GwwACgkQCFUqF3yoeCGOdwf/TmoxH3pFBm/MDhY5Ct5FO0KvsgQk2ZgDa68HyQ8j\n" + + "QYi1FUCtyDjsxf5KTfyvzpzcTpS7cyOwcJNtTj6UixwATkcivvYWYoOXghAsTo4f\n" + + "1+j/x6ECq1+nYE6NpcAN7VRJpYMk2UO2qlhHCesTPGzsHchL7mwiYdhGrdiWGTpd\n" + + "KI9WfOYDZZ9ZSw/QINJUyTRxrDnauOvVbhbAXc7jdKCkRQRZpsNlF//1Stg6nstj\n" + + "FJ7SrjVdsMJNlihT6fG5ujmrty1/6b1VCLkIQfW5cWvzRzTBFytq7i4PVKh3u7Oz\n" + + "tt9lf8s50zt2uBE/AKMkyE6IJLsBWpJPk7iFKkHGDx044Q==\n" + + "=477N\n" + + "-----END PGP PUBLIC KEY BLOCK-----\n", "-----BEGIN PGP PRIVATE KEY BLOCK-----\n" - + "Version: GnuPG v1\n" - + "\n" - + "lQOYBFWdTZwBCAC1jukp5mlitfq2sAmdtx1s1VbWh+buDbBY2kWcxbbssczozFUP\n" - + "Ii67wPwjRbn3GM5+jY3GMsqKIrdyDlxeTxGWoU/qa2YkCQzgFGD/XJBqkVpP6osm\n" - + "qFYSP0xST1iBkatkMHq5KMjrX2q2bGVLlchLF9eHrWSefMcfff1Vs/Y8F2RCo38y\n" - + "gH88mbcvgyC+zq6Q2T3h5RiLK2IaZDNsn3uUoIMYHxI6oYtXXMSXRJlLJvamXVrB\n" - + "7QAq8L8cNikJjZMz+bHtLtGDyVVp9tqo4yvMrHe6BYmBUte3tPYQlDVdEo7UqepR\n" - + "uT7JbBOGBoD+9ngDrDggPUBAoa0h3VNOTyoDABEBAAEAB/4jqeZoOiACaV/Nygeh\n" - + "iOpJSiDsNDbrFRpKYdnhwT69APIQ2q5sshi+/dopbZVpkeBiIJk0UR7TAp3JVEPV\n" - + "rK92SMqjcCRYuMRkMeyZzMt7e4DjiN17ov6BSBjMZFSs4vnpTNKWk4ngHlaebe15\n" - + "6vq0sYK/XpKQxU7yAzQjxR190P/F+QEL98zVG/9uqM8PupfdSm4Smp2cIpfta+JD\n" - + "mO23HC6jAEm2RFwklovzgK3rbIjyiMuowIkAKx5xxRvpxMHf1l566b9zJrRi0xau\n" - + "vp4J/lnBJtTMzCbsaaFxhrj23xvTXaWR+UkaGPCv7wheXQ9K7NAHwmH8YrR+cZx7\n" - + "KbDlBADUTHZ+OhNslx/rkjRWrFuK9p49x7qxQc26kcqlGPbW6KOAMdUpwneQbhCG\n" - + "a36E/GAZgsgQ4SUqn37EVCtd2Y9Dp0inPAujcZXSwgDHev6ea7fzbxT9KLtEgvQN\n" - + "0vrFJDCPIt0wzGqNDw4wgFjF2rAafBO//Wu5K5QLW4hfzSguRQQA2u6DpVja/FYY\n" - + "UHVh2HLiB8th4T+qogOsBe5mKEsGRPXtAh7QzJu36C4PJyHeNlmlMx+15cCFnovj\n" - + "6cLpGn6ZP4okLyq2+VsW7wh/Vir+UZHoAO/cZRlOc1PsaQconcxxq30SsbaRQrAd\n" - + "YargKlXU7HMFiK34nkidBV6vVW0+P6cD/jYRInM983KXqX5bYvqsM1Zyvvlu6otD\n" - + "nG0F/nQYT7oaKKR46quDa+xHMxK8/Vu1+TabzY8XapnoYFaFvrl/d2rUBEZSoury\n" - + "z2yfTyeomft9MGGQsCGAJ95bVDT+jBoohnYwfwdC7HG3qk0aK/TxFyUqvMOX7SFe\n" - + "YT55n3HlD9InST+0IVRlc3R1c2VyIEZvdXIgPHRlc3Q0QGV4YW1wbGUuY29tPokB\n" - + "OAQTAQIAIgUCVZ1NnAIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQCFUq\n" - + "F3yoeCF7BwgAkpvUSHccaomwGsYfp5usOReWuh47uXHZpJPWpWw6EGIdnjPBOTXQ\n" - + "6vq9Kkkntvrow2kOAveQ2TSUBEryHBxx2/QBAqwX0vGJPOq1/IcVXmEHMzJAfS3Q\n" - + "R8Ypk0qDq/C/3gMQRP1Vw8LrLehAHukNQGt7ZU07wn3JsOD4qb7T+xelMxWqvkFO\n" - + "n7wEaQQEznL1XNiVOCUDq8bjRENjyq0rYu+UuZp1VptKUXmzPhKK1gbZQNHjgHiz\n" - + "agqfO1MC3b1Mjk0WU+AyedXk8X6xQA16yPf3o7N/2MQj2MWj4nAJXJXXbrmo1P7P\n" - + "vYn61J9DaYNiC5fJkJDc6nnq5QXnnFFeBJ0DmARVnU2cAQgAxDrCvphUP9rnbPc5\n" - + "5JgKq5NuMGlQacjxq0017V19HSobUALIekJGRpIy05ysRLGvbMqlXJMPtSbQoeOE\n" - + "j9YI6g1KEoaQc+cCLpLGe6veh8fhdE1Rv540uhq1r8CoS9i2/YWH3Za2YmLTjotI\n" - + "ojs7nduR/zLNeZAvLbkJuzVrQDSSReEsaAcaK+i/xeM7pxJEy9C/f3aeKla8Nt3y\n" - + "VShN/HEncYwdLtakg8y1f7tECapWMSQIhHIsEDdrlZ02Nf10qaLjMui722FOwdrl\n" - + "P1qITZh90Yjf30OoyZuMfnwmfPs6lzImZxtnz5MJscSvXJeuGJzRnE8LFbegTGwh\n" - + "5PYx8QARAQABAAf8CeTumd6jbN7USXXDyQdzjkguR6mfwN29dcY8YF4U52oOm3+w\n" - + "bR23XmqTvoDJXONatZEYOm093wP4hBktP3Vq2KZX5Ew9r2JoBUIoWOcHHvCQqSUW\n" - + "6KMJBJNBMv3zXnOscmcPvTgStS5HfYn/XRLAhEqkd2ov2x/OiS8p0vM0F7YYSOdu\n" - + "X6/nHeBCM5QSJl00kgcaeQYdIGL0bPv9DnoeAC2/yITEvtvs+MHZ7FjH8A45QjWn\n" - + "DwfVoLg7WOc3wJtqJ55/r/2pylrWz0YYM8s6I3gbDilCF+Wb8tEIOaWJEwY73J1/\n" - + "KQG5qlO3/hBlO80DtzNmi3ylRUuzGhTxQfvemwQA3EuZ+E48LJ3dwtdJhh5mFlWI\n" - + "Ket21e5v1mqMxuLhf5/2CYcifM08u3EsEUdIr7egF25Sea8otqmCYcG8FuB37VY/\n" - + "Hd4G/+YVVaaAB8EU6u64YfSswhzr0R2qWVLtkJr0EAephzdPdoUEtKDSdTxnXiDV\n" - + "3vSqLWtZekScLa979uMEAOQIodJwxSvveKQWILjK67ZJr56X8YQZWA6rFsr1xMY0\n" - + "N0GH+5k0k+tr4wT3H9uk9ZM1Z11G3c01mhzCNg5roFoKtftKUZRKxmbfjjDmAofl\n" - + "bA6EZ0WHLdOwDLLTuXK09IsjjSHq0YHOxIlgFzIreuoxtz27bEEGhVFQg7xb0Lgb\n" - + "A/9LP8i32L7/CHsuN0q4YjhJkkaB6JWUQMFqWwoAXALG3rnw/CGRYHmHpiAuSeHR\n" - + "dSlZzndVi5poNC/d27msTx7ZuWlN7nOyywHBCTWV/nstm2I9rDhrHK7Axgq0Vv0y\n" - + "bWAurUmEgDJHU3ZpsNVt4e30FooXIDLR4cnpRM7tILv39D4giQEfBBgBAgAJBQJV\n" - + "nU2cAhsMAAoJEAhVKhd8qHghjncH/05qMR96RQZvzA4WOQreRTtCr7IEJNmYA2uv\n" - + "B8kPI0GItRVArcg47MX+Sk38r86c3E6Uu3MjsHCTbU4+lIscAE5HIr72FmKDl4IQ\n" - + "LE6OH9fo/8ehAqtfp2BOjaXADe1USaWDJNlDtqpYRwnrEzxs7B3IS+5sImHYRq3Y\n" - + "lhk6XSiPVnzmA2WfWUsP0CDSVMk0caw52rjr1W4WwF3O43SgpEUEWabDZRf/9UrY\n" - + "Op7LYxSe0q41XbDCTZYoU+nxubo5q7ctf+m9VQi5CEH1uXFr80c0wRcrau4uD1So\n" - + "d7uzs7bfZX/LOdM7drgRPwCjJMhOiCS7AVqST5O4hSpBxg8dOOE=\n" - + "=5aNq\n" - + "-----END PGP PRIVATE KEY BLOCK-----\n"); + + "Version: GnuPG v1\n" + + "\n" + + "lQOYBFWdTZwBCAC1jukp5mlitfq2sAmdtx1s1VbWh+buDbBY2kWcxbbssczozFUP\n" + + "Ii67wPwjRbn3GM5+jY3GMsqKIrdyDlxeTxGWoU/qa2YkCQzgFGD/XJBqkVpP6osm\n" + + "qFYSP0xST1iBkatkMHq5KMjrX2q2bGVLlchLF9eHrWSefMcfff1Vs/Y8F2RCo38y\n" + + "gH88mbcvgyC+zq6Q2T3h5RiLK2IaZDNsn3uUoIMYHxI6oYtXXMSXRJlLJvamXVrB\n" + + "7QAq8L8cNikJjZMz+bHtLtGDyVVp9tqo4yvMrHe6BYmBUte3tPYQlDVdEo7UqepR\n" + + "uT7JbBOGBoD+9ngDrDggPUBAoa0h3VNOTyoDABEBAAEAB/4jqeZoOiACaV/Nygeh\n" + + "iOpJSiDsNDbrFRpKYdnhwT69APIQ2q5sshi+/dopbZVpkeBiIJk0UR7TAp3JVEPV\n" + + "rK92SMqjcCRYuMRkMeyZzMt7e4DjiN17ov6BSBjMZFSs4vnpTNKWk4ngHlaebe15\n" + + "6vq0sYK/XpKQxU7yAzQjxR190P/F+QEL98zVG/9uqM8PupfdSm4Smp2cIpfta+JD\n" + + "mO23HC6jAEm2RFwklovzgK3rbIjyiMuowIkAKx5xxRvpxMHf1l566b9zJrRi0xau\n" + + "vp4J/lnBJtTMzCbsaaFxhrj23xvTXaWR+UkaGPCv7wheXQ9K7NAHwmH8YrR+cZx7\n" + + "KbDlBADUTHZ+OhNslx/rkjRWrFuK9p49x7qxQc26kcqlGPbW6KOAMdUpwneQbhCG\n" + + "a36E/GAZgsgQ4SUqn37EVCtd2Y9Dp0inPAujcZXSwgDHev6ea7fzbxT9KLtEgvQN\n" + + "0vrFJDCPIt0wzGqNDw4wgFjF2rAafBO//Wu5K5QLW4hfzSguRQQA2u6DpVja/FYY\n" + + "UHVh2HLiB8th4T+qogOsBe5mKEsGRPXtAh7QzJu36C4PJyHeNlmlMx+15cCFnovj\n" + + "6cLpGn6ZP4okLyq2+VsW7wh/Vir+UZHoAO/cZRlOc1PsaQconcxxq30SsbaRQrAd\n" + + "YargKlXU7HMFiK34nkidBV6vVW0+P6cD/jYRInM983KXqX5bYvqsM1Zyvvlu6otD\n" + + "nG0F/nQYT7oaKKR46quDa+xHMxK8/Vu1+TabzY8XapnoYFaFvrl/d2rUBEZSoury\n" + + "z2yfTyeomft9MGGQsCGAJ95bVDT+jBoohnYwfwdC7HG3qk0aK/TxFyUqvMOX7SFe\n" + + "YT55n3HlD9InST+0IVRlc3R1c2VyIEZvdXIgPHRlc3Q0QGV4YW1wbGUuY29tPokB\n" + + "OAQTAQIAIgUCVZ1NnAIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQCFUq\n" + + "F3yoeCF7BwgAkpvUSHccaomwGsYfp5usOReWuh47uXHZpJPWpWw6EGIdnjPBOTXQ\n" + + "6vq9Kkkntvrow2kOAveQ2TSUBEryHBxx2/QBAqwX0vGJPOq1/IcVXmEHMzJAfS3Q\n" + + "R8Ypk0qDq/C/3gMQRP1Vw8LrLehAHukNQGt7ZU07wn3JsOD4qb7T+xelMxWqvkFO\n" + + "n7wEaQQEznL1XNiVOCUDq8bjRENjyq0rYu+UuZp1VptKUXmzPhKK1gbZQNHjgHiz\n" + + "agqfO1MC3b1Mjk0WU+AyedXk8X6xQA16yPf3o7N/2MQj2MWj4nAJXJXXbrmo1P7P\n" + + "vYn61J9DaYNiC5fJkJDc6nnq5QXnnFFeBJ0DmARVnU2cAQgAxDrCvphUP9rnbPc5\n" + + "5JgKq5NuMGlQacjxq0017V19HSobUALIekJGRpIy05ysRLGvbMqlXJMPtSbQoeOE\n" + + "j9YI6g1KEoaQc+cCLpLGe6veh8fhdE1Rv540uhq1r8CoS9i2/YWH3Za2YmLTjotI\n" + + "ojs7nduR/zLNeZAvLbkJuzVrQDSSReEsaAcaK+i/xeM7pxJEy9C/f3aeKla8Nt3y\n" + + "VShN/HEncYwdLtakg8y1f7tECapWMSQIhHIsEDdrlZ02Nf10qaLjMui722FOwdrl\n" + + "P1qITZh90Yjf30OoyZuMfnwmfPs6lzImZxtnz5MJscSvXJeuGJzRnE8LFbegTGwh\n" + + "5PYx8QARAQABAAf8CeTumd6jbN7USXXDyQdzjkguR6mfwN29dcY8YF4U52oOm3+w\n" + + "bR23XmqTvoDJXONatZEYOm093wP4hBktP3Vq2KZX5Ew9r2JoBUIoWOcHHvCQqSUW\n" + + "6KMJBJNBMv3zXnOscmcPvTgStS5HfYn/XRLAhEqkd2ov2x/OiS8p0vM0F7YYSOdu\n" + + "X6/nHeBCM5QSJl00kgcaeQYdIGL0bPv9DnoeAC2/yITEvtvs+MHZ7FjH8A45QjWn\n" + + "DwfVoLg7WOc3wJtqJ55/r/2pylrWz0YYM8s6I3gbDilCF+Wb8tEIOaWJEwY73J1/\n" + + "KQG5qlO3/hBlO80DtzNmi3ylRUuzGhTxQfvemwQA3EuZ+E48LJ3dwtdJhh5mFlWI\n" + + "Ket21e5v1mqMxuLhf5/2CYcifM08u3EsEUdIr7egF25Sea8otqmCYcG8FuB37VY/\n" + + "Hd4G/+YVVaaAB8EU6u64YfSswhzr0R2qWVLtkJr0EAephzdPdoUEtKDSdTxnXiDV\n" + + "3vSqLWtZekScLa979uMEAOQIodJwxSvveKQWILjK67ZJr56X8YQZWA6rFsr1xMY0\n" + + "N0GH+5k0k+tr4wT3H9uk9ZM1Z11G3c01mhzCNg5roFoKtftKUZRKxmbfjjDmAofl\n" + + "bA6EZ0WHLdOwDLLTuXK09IsjjSHq0YHOxIlgFzIreuoxtz27bEEGhVFQg7xb0Lgb\n" + + "A/9LP8i32L7/CHsuN0q4YjhJkkaB6JWUQMFqWwoAXALG3rnw/CGRYHmHpiAuSeHR\n" + + "dSlZzndVi5poNC/d27msTx7ZuWlN7nOyywHBCTWV/nstm2I9rDhrHK7Axgq0Vv0y\n" + + "bWAurUmEgDJHU3ZpsNVt4e30FooXIDLR4cnpRM7tILv39D4giQEfBBgBAgAJBQJV\n" + + "nU2cAhsMAAoJEAhVKhd8qHghjncH/05qMR96RQZvzA4WOQreRTtCr7IEJNmYA2uv\n" + + "B8kPI0GItRVArcg47MX+Sk38r86c3E6Uu3MjsHCTbU4+lIscAE5HIr72FmKDl4IQ\n" + + "LE6OH9fo/8ehAqtfp2BOjaXADe1USaWDJNlDtqpYRwnrEzxs7B3IS+5sImHYRq3Y\n" + + "lhk6XSiPVnzmA2WfWUsP0CDSVMk0caw52rjr1W4WwF3O43SgpEUEWabDZRf/9UrY\n" + + "Op7LYxSe0q41XbDCTZYoU+nxubo5q7ctf+m9VQi5CEH1uXFr80c0wRcrau4uD1So\n" + + "d7uzs7bfZX/LOdM7drgRPwCjJMhOiCS7AVqST5O4hSpBxg8dOOE=\n" + + "=5aNq\n" + + "-----END PGP PRIVATE KEY BLOCK-----\n"); } /** @@ -446,106 +445,107 @@ public class TestKeys { * */ public static TestKey validKeyWithSecondUserId() { - return new TestKey("-----BEGIN PGP PUBLIC KEY BLOCK-----\n" - + "Version: GnuPG v1\n" - + "\n" - + "mQENBFW6jd4BCACrf+BZS3lntuWq2DWPOG07/BUWhx3RSoiS3JBuKEDmlsjswKcp\n" - + "JHT+p2tqH52XbujMlzNjAQcZjJwfOMt6Fg7zd3F8cwYQdCE/W5dpMs/mqdeEz6GL\n" - + "VJDZ0Y5wwz54ZQHp91Xq6uejxt5qffeTQk5cToQZ0RVx3iwBc+2P3iYJqMFmJzj8\n" - + "djabEoF4D50iI5tY8moE83VcXJ5Y4xn+5Z5AThmlfrMP6gIdG0b4lEe1tsnJC6AG\n" - + "GUU6VkzK6E1Tp93Y0brtWpJKi9Gt6eUqvWhZtPEdFVCFbLTpezUdRFEuaFbGg5pn\n" - + "9K/DceahFmquDJOHVgawt6erlq/ie7QEEld/ABEBAAG0IVRlc3R1c2VyIEZpdmUg\n" - + "PHRlc3Q1QGV4YW1wbGUuY29tPokBOAQTAQIAIgUCVbqN3gIbAwYLCQgHAwIGFQgC\n" - + "CQoLBBYCAwECHgECF4AACgkQUCS7RJjFHb+/MAf9FKZatGcuOIoYqwGQQneyc63v\n" - + "3H/PyhvYF1nuKNftmhqIiUHec9RaUHQkgam6LRoonkDfIpNlQVRv2XBV2VOAOFVO\n" - + "RyQ/Tv7/xtpqGZqivV0yn2ZXbCceA627Vz7gP4gkO0ZJ0JsYJTc/5wO+nVG5Lohu\n" - + "/zdUofEbFAvcXs+Z1uXnUDdeGn47Lf1xZ2XOHOI0aQW4DdNaFoAd+AOTe0W3iB6W\n" - + "paCIGno69CyNHNnWjJCSD33oLVaXyvbgw5UoyITvSqRnPyLGIc6dsqDLT59ok0Fk\n" - + "t4jtiGu9aze4n59GbtSjmWQgzbLCQWhK9K7UCcSLYNKXVyMha2WapBO156V027QI\n" - + "Zm9vOm15SWSJATgEEwECACIFAlW6jwYCGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4B\n" - + "AheAAAoJEFAku0SYxR2/zZUH/1BwPsResHLDSmo6UdQyQGxvV0NcwBqGAPSLHr+S\n" - + "PHEaHEIYvOywNfWXquYrECa/5iIrXuTQmCH0q8WRcz1UapDCeD8Ui82r+3O8m6gk\n" - + "hIR5VAeza+x/fGWhG342PvtpDU7JycDA3KMCTWtcAM89tFhffzuEQ3f5p5cMTtZk\n" - + "/23iegXbHd61vojYO17QYEj+qp9l0VNiyFymPL3qr5bVj/xn/mXFj+asj0L2ypIj\n" - + "zC36FkhzW5EX2xgV9Cl9zu7kLMTm+yM+jxbMLskYkG8z/D+xBQsoX8tEIPlxHLhB\n" - + "miEmVuZrp91ArRMWa3B7PYz7hQzs+M/bxKXcmWxacggTOvy5AQ0EVbqN3gEIAOlq\n" - + "mwdiXW0BQP/iQvIweP1taNypAvdjI2fpnXkUfBT5X/+E/RjYOHQEAzy8nEkS+Y0l\n" - + "MLwKt3S0IVRvdeXxlpL6Tl+P8DkcD5H+uvACrg9rtgbbNSoQtc9/3bknG9hea6xi\n" - + "6SBH1k9Y2RInIrwWslfKmuNkyZVhxPKypasBsvyhOWLlpCngGiCa74KJ1th1WKa2\n" - + "aaDqcbieBTc1mtsXR6kBhJZqK+JYBoHriUQMs7nyXxn2qyv6Lehs/tHlrBZ7j16S\n" - + "faQzYoBi1edVrpFr/CuGk6RNKxG9vi/uAA9q2cLCMjjyfMH4g0G2l0HuDPQLA9wi\n" - + "BfusEC+OceaeFKtS9ykAEQEAAYkBHwQYAQIACQUCVbqN3gIbDAAKCRBQJLtEmMUd\n" - + "vw/DB/9Qx9m1eSdddqz/fk16wJf7Ncr2teVvdQOjRf/qo43KDKxEzeepjgypG1br\n" - + "St7U4/MlPygJLBDB4pXp0kaKt+S/aqLpEGSGzQ1FysM8oY6K0e1Kbf6nMaQS8ATG\n" - + "aD377FrUJ42NV4JS+NGlwaM9PhpRVm5n8iCzRs9HtlTyfCBkNGDjGOSdWcah2m6T\n" - + "fEQdD+XVDN1ZC8zAnc8FW28YOTeTjX079okP6ZCjLJ16VZ7eiHFkrNbS9Dl4SPNK\n" - + "eElvsZLBaf8t4RQXFFKwRq4BW+zS8zm9E2H6bZ9yGrmgIREzyRPpwU98g8yrabu0\n" - + "54w16Vp/SVViJs7nTMSug0WREyd2\n" - + "=ldwB\n" - + "-----END PGP PUBLIC KEY BLOCK-----\n", + return new TestKey( + "-----BEGIN PGP PUBLIC KEY BLOCK-----\n" + + "Version: GnuPG v1\n" + + "\n" + + "mQENBFW6jd4BCACrf+BZS3lntuWq2DWPOG07/BUWhx3RSoiS3JBuKEDmlsjswKcp\n" + + "JHT+p2tqH52XbujMlzNjAQcZjJwfOMt6Fg7zd3F8cwYQdCE/W5dpMs/mqdeEz6GL\n" + + "VJDZ0Y5wwz54ZQHp91Xq6uejxt5qffeTQk5cToQZ0RVx3iwBc+2P3iYJqMFmJzj8\n" + + "djabEoF4D50iI5tY8moE83VcXJ5Y4xn+5Z5AThmlfrMP6gIdG0b4lEe1tsnJC6AG\n" + + "GUU6VkzK6E1Tp93Y0brtWpJKi9Gt6eUqvWhZtPEdFVCFbLTpezUdRFEuaFbGg5pn\n" + + "9K/DceahFmquDJOHVgawt6erlq/ie7QEEld/ABEBAAG0IVRlc3R1c2VyIEZpdmUg\n" + + "PHRlc3Q1QGV4YW1wbGUuY29tPokBOAQTAQIAIgUCVbqN3gIbAwYLCQgHAwIGFQgC\n" + + "CQoLBBYCAwECHgECF4AACgkQUCS7RJjFHb+/MAf9FKZatGcuOIoYqwGQQneyc63v\n" + + "3H/PyhvYF1nuKNftmhqIiUHec9RaUHQkgam6LRoonkDfIpNlQVRv2XBV2VOAOFVO\n" + + "RyQ/Tv7/xtpqGZqivV0yn2ZXbCceA627Vz7gP4gkO0ZJ0JsYJTc/5wO+nVG5Lohu\n" + + "/zdUofEbFAvcXs+Z1uXnUDdeGn47Lf1xZ2XOHOI0aQW4DdNaFoAd+AOTe0W3iB6W\n" + + "paCIGno69CyNHNnWjJCSD33oLVaXyvbgw5UoyITvSqRnPyLGIc6dsqDLT59ok0Fk\n" + + "t4jtiGu9aze4n59GbtSjmWQgzbLCQWhK9K7UCcSLYNKXVyMha2WapBO156V027QI\n" + + "Zm9vOm15SWSJATgEEwECACIFAlW6jwYCGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4B\n" + + "AheAAAoJEFAku0SYxR2/zZUH/1BwPsResHLDSmo6UdQyQGxvV0NcwBqGAPSLHr+S\n" + + "PHEaHEIYvOywNfWXquYrECa/5iIrXuTQmCH0q8WRcz1UapDCeD8Ui82r+3O8m6gk\n" + + "hIR5VAeza+x/fGWhG342PvtpDU7JycDA3KMCTWtcAM89tFhffzuEQ3f5p5cMTtZk\n" + + "/23iegXbHd61vojYO17QYEj+qp9l0VNiyFymPL3qr5bVj/xn/mXFj+asj0L2ypIj\n" + + "zC36FkhzW5EX2xgV9Cl9zu7kLMTm+yM+jxbMLskYkG8z/D+xBQsoX8tEIPlxHLhB\n" + + "miEmVuZrp91ArRMWa3B7PYz7hQzs+M/bxKXcmWxacggTOvy5AQ0EVbqN3gEIAOlq\n" + + "mwdiXW0BQP/iQvIweP1taNypAvdjI2fpnXkUfBT5X/+E/RjYOHQEAzy8nEkS+Y0l\n" + + "MLwKt3S0IVRvdeXxlpL6Tl+P8DkcD5H+uvACrg9rtgbbNSoQtc9/3bknG9hea6xi\n" + + "6SBH1k9Y2RInIrwWslfKmuNkyZVhxPKypasBsvyhOWLlpCngGiCa74KJ1th1WKa2\n" + + "aaDqcbieBTc1mtsXR6kBhJZqK+JYBoHriUQMs7nyXxn2qyv6Lehs/tHlrBZ7j16S\n" + + "faQzYoBi1edVrpFr/CuGk6RNKxG9vi/uAA9q2cLCMjjyfMH4g0G2l0HuDPQLA9wi\n" + + "BfusEC+OceaeFKtS9ykAEQEAAYkBHwQYAQIACQUCVbqN3gIbDAAKCRBQJLtEmMUd\n" + + "vw/DB/9Qx9m1eSdddqz/fk16wJf7Ncr2teVvdQOjRf/qo43KDKxEzeepjgypG1br\n" + + "St7U4/MlPygJLBDB4pXp0kaKt+S/aqLpEGSGzQ1FysM8oY6K0e1Kbf6nMaQS8ATG\n" + + "aD377FrUJ42NV4JS+NGlwaM9PhpRVm5n8iCzRs9HtlTyfCBkNGDjGOSdWcah2m6T\n" + + "fEQdD+XVDN1ZC8zAnc8FW28YOTeTjX079okP6ZCjLJ16VZ7eiHFkrNbS9Dl4SPNK\n" + + "eElvsZLBaf8t4RQXFFKwRq4BW+zS8zm9E2H6bZ9yGrmgIREzyRPpwU98g8yrabu0\n" + + "54w16Vp/SVViJs7nTMSug0WREyd2\n" + + "=ldwB\n" + + "-----END PGP PUBLIC KEY BLOCK-----\n", "-----BEGIN PGP PRIVATE KEY BLOCK-----\n" - + "Version: GnuPG v1\n" - + "\n" - + "lQOYBFW6jd4BCACrf+BZS3lntuWq2DWPOG07/BUWhx3RSoiS3JBuKEDmlsjswKcp\n" - + "JHT+p2tqH52XbujMlzNjAQcZjJwfOMt6Fg7zd3F8cwYQdCE/W5dpMs/mqdeEz6GL\n" - + "VJDZ0Y5wwz54ZQHp91Xq6uejxt5qffeTQk5cToQZ0RVx3iwBc+2P3iYJqMFmJzj8\n" - + "djabEoF4D50iI5tY8moE83VcXJ5Y4xn+5Z5AThmlfrMP6gIdG0b4lEe1tsnJC6AG\n" - + "GUU6VkzK6E1Tp93Y0brtWpJKi9Gt6eUqvWhZtPEdFVCFbLTpezUdRFEuaFbGg5pn\n" - + "9K/DceahFmquDJOHVgawt6erlq/ie7QEEld/ABEBAAEAB/9MIlrQiWb+Gf3fWFh+\n" - + "mkg0Bva9p4IfNX1n5S7hGFGnjGzqXaRX6W1e16gh1qM5ZO1IVh9j5kLmnrt4SNhb\n" - + "/Irqnq3s14trpoJUBC81bm9JMUESHrLSjdo4OIWJncOP4xd0bG7h+SKYXGLE1+Me\n" - + "pqLu65RNebqRcFYM1xAxfCdaxatcz+LrW5ZX+6T/Gh/VCHRkkzzVIZO1dDBbyU2C\n" - + "JrNcfHSvNrjzfqYHtwfsk/lwcuY9pqkYcuwZ2IM+iWKit+WyCR2BzOpG/Sva1t8b\n" - + "7B7ituQCFMCv5IiaAoaSKX/t/0ucWCoT1ttih8LdwgEE0kgij/ZUfRxCiL9HmtLy\n" - + "ad9BBADBGYWv6NiTQiBG7+MZ+twCjlSL7vq8iENhQYZShGHF9z+ju7m8U1dteLny\n" - + "pC3NcNfCgWyy+8lRn1e6Oe6m7xL83LL3HJT5nIy9mpsCw/TIrrkzkoE+VpkEIL/o\n" - + "Yeoxauah4SU7laVD29aAQZ3TqwSwx0sJwPjsj73WjjqtzJfFkQQA410ghqMbQZN1\n" - + "yJzXgVAj162ZwTi961N5iYmqTiBtqGz1UfaNBJWdJMkCmhMTsiOtm1h4zUQRuEH+\n" - + "yq1xhKOGf15dB/cLSMj2KpVVlvgLoVmYDugSER8Q23juilY7iaf0bqo9q1sTHpn9\n" - + "O7Oin/9J3sz+ic45vDh4aa74sOzfhA8EAJwAFEWLrGSxtnYJR5vQNstHIH1wtQ5G\n" - + "ZUZ57y9CbDkKrfCQvd0JOBjfUDz+N8qiamNIqfhQBtlhIDYgtswiG+iGP/2G0l6S\n" - + "j9DHNe2CYPUKgy+zQiRnyNGE2XUfcE+HuNDfu3AryPqaD8vLLw8TnsAgis3bRGg+\n" - + "hhrAC1NyKfDXTg20IVRlc3R1c2VyIEZpdmUgPHRlc3Q1QGV4YW1wbGUuY29tPokB\n" - + "OAQTAQIAIgUCVbqN3gIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQUCS7\n" - + "RJjFHb+/MAf9FKZatGcuOIoYqwGQQneyc63v3H/PyhvYF1nuKNftmhqIiUHec9Ra\n" - + "UHQkgam6LRoonkDfIpNlQVRv2XBV2VOAOFVORyQ/Tv7/xtpqGZqivV0yn2ZXbCce\n" - + "A627Vz7gP4gkO0ZJ0JsYJTc/5wO+nVG5Lohu/zdUofEbFAvcXs+Z1uXnUDdeGn47\n" - + "Lf1xZ2XOHOI0aQW4DdNaFoAd+AOTe0W3iB6WpaCIGno69CyNHNnWjJCSD33oLVaX\n" - + "yvbgw5UoyITvSqRnPyLGIc6dsqDLT59ok0Fkt4jtiGu9aze4n59GbtSjmWQgzbLC\n" - + "QWhK9K7UCcSLYNKXVyMha2WapBO156V0250DmARVuo3eAQgA6WqbB2JdbQFA/+JC\n" - + "8jB4/W1o3KkC92MjZ+mdeRR8FPlf/4T9GNg4dAQDPLycSRL5jSUwvAq3dLQhVG91\n" - + "5fGWkvpOX4/wORwPkf668AKuD2u2Bts1KhC1z3/duScb2F5rrGLpIEfWT1jZEici\n" - + "vBayV8qa42TJlWHE8rKlqwGy/KE5YuWkKeAaIJrvgonW2HVYprZpoOpxuJ4FNzWa\n" - + "2xdHqQGElmor4lgGgeuJRAyzufJfGfarK/ot6Gz+0eWsFnuPXpJ9pDNigGLV51Wu\n" - + "kWv8K4aTpE0rEb2+L+4AD2rZwsIyOPJ8wfiDQbaXQe4M9AsD3CIF+6wQL45x5p4U\n" - + "q1L3KQARAQABAAf8C+2DsJPpPEnFHY5dZ2zssd6mbihA2414YLYCcw6F7Lh1nGQa\n" - + "XuulruAJnk/xGJbco8bTv7g4ecE+tsbfWnnG/QnHeYCsgO6bKRXATcWFSYpyidUn\n" - + "2VdzQwBAv1ZtSNhCXlPLn/erzvA2X4QadUwfnvbehWJAHt8ZJmHUr3FtyRUHEdCK\n" - + "2EXsBWnzPCcqHZOMvcbSINSqBFGzVXkOZsMFvPTNIUYRHz8NbJT/OPiOmyBshXpS\n" - + "t8w3QqZhBcTT3NZo3kgxN1RygaTa10ytB2cxTCVuD8hmUBaV9gakdfMYkVJds7/T\n" - + "ZY3It68F0vitBnqpppZQ+NFgr/vwVg0p3gbmAQQA79zsWPvyIqYvyJhmiKvLIpev\n" - + "569ho8tC9xx+IZ5WnjN8ZADlb9brAdA9cqGfBgZkpZUhngCRVOYUIco+m2NYkEJm\n" - + "BsSTTM77dqU55DRloJ3FtBwCPXHkwg9P/FHMMYYGyLpQTSB92hXk8yomo+ozX7kx\n" - + "DtUHZIrir/rr0lQe+GkEAPkep9V5jBmfHMArnfji7Nfb1/ZjrSAaK+rtqczgm+6j\n" - + "ubY/0DpM/6gm+/8X27WFw2m45ncH3qNvOe4Qm40EmgmHkXsdQyU0Fv7uXc9nBYoo\n" - + "G6s7DWLY4VAqWwPsvbqgpSp/qdGn9nlcJjjY1HtfU7HM3xysT7TJ2YVhYHlJdjDB\n" - + "A/0alBcYtHvaCJaRLWX4UiashbfETWAf/4oHlERjkXj64qOdsGnD6CD99t9x91Ue\n" - + "pClPsLDFvY8/HxWX7STA9pQZAa2ZdJd8b58Rgy9TBShw2mbz2S6Cbw77pP/WEjtJ\n" - + "pJuS2gDp70H01fYRaw7YH32CfUr1VeEv7hTjk/SNVteIZkkOiQEfBBgBAgAJBQJV\n" - + "uo3eAhsMAAoJEFAku0SYxR2/D8MH/1DH2bV5J112rP9+TXrAl/s1yva15W91A6NF\n" - + "/+qjjcoMrETN56mODKkbVutK3tTj8yU/KAksEMHilenSRoq35L9qoukQZIbNDUXK\n" - + "wzyhjorR7Upt/qcxpBLwBMZoPfvsWtQnjY1XglL40aXBoz0+GlFWbmfyILNGz0e2\n" - + "VPJ8IGQ0YOMY5J1ZxqHabpN8RB0P5dUM3VkLzMCdzwVbbxg5N5ONfTv2iQ/pkKMs\n" - + "nXpVnt6IcWSs1tL0OXhI80p4SW+xksFp/y3hFBcUUrBGrgFb7NLzOb0TYfptn3Ia\n" - + "uaAhETPJE+nBT3yDzKtpu7TnjDXpWn9JVWImzudMxK6DRZETJ3Y=\n" - + "=uND5\n" - + "-----END PGP PRIVATE KEY BLOCK-----\n"); + + "Version: GnuPG v1\n" + + "\n" + + "lQOYBFW6jd4BCACrf+BZS3lntuWq2DWPOG07/BUWhx3RSoiS3JBuKEDmlsjswKcp\n" + + "JHT+p2tqH52XbujMlzNjAQcZjJwfOMt6Fg7zd3F8cwYQdCE/W5dpMs/mqdeEz6GL\n" + + "VJDZ0Y5wwz54ZQHp91Xq6uejxt5qffeTQk5cToQZ0RVx3iwBc+2P3iYJqMFmJzj8\n" + + "djabEoF4D50iI5tY8moE83VcXJ5Y4xn+5Z5AThmlfrMP6gIdG0b4lEe1tsnJC6AG\n" + + "GUU6VkzK6E1Tp93Y0brtWpJKi9Gt6eUqvWhZtPEdFVCFbLTpezUdRFEuaFbGg5pn\n" + + "9K/DceahFmquDJOHVgawt6erlq/ie7QEEld/ABEBAAEAB/9MIlrQiWb+Gf3fWFh+\n" + + "mkg0Bva9p4IfNX1n5S7hGFGnjGzqXaRX6W1e16gh1qM5ZO1IVh9j5kLmnrt4SNhb\n" + + "/Irqnq3s14trpoJUBC81bm9JMUESHrLSjdo4OIWJncOP4xd0bG7h+SKYXGLE1+Me\n" + + "pqLu65RNebqRcFYM1xAxfCdaxatcz+LrW5ZX+6T/Gh/VCHRkkzzVIZO1dDBbyU2C\n" + + "JrNcfHSvNrjzfqYHtwfsk/lwcuY9pqkYcuwZ2IM+iWKit+WyCR2BzOpG/Sva1t8b\n" + + "7B7ituQCFMCv5IiaAoaSKX/t/0ucWCoT1ttih8LdwgEE0kgij/ZUfRxCiL9HmtLy\n" + + "ad9BBADBGYWv6NiTQiBG7+MZ+twCjlSL7vq8iENhQYZShGHF9z+ju7m8U1dteLny\n" + + "pC3NcNfCgWyy+8lRn1e6Oe6m7xL83LL3HJT5nIy9mpsCw/TIrrkzkoE+VpkEIL/o\n" + + "Yeoxauah4SU7laVD29aAQZ3TqwSwx0sJwPjsj73WjjqtzJfFkQQA410ghqMbQZN1\n" + + "yJzXgVAj162ZwTi961N5iYmqTiBtqGz1UfaNBJWdJMkCmhMTsiOtm1h4zUQRuEH+\n" + + "yq1xhKOGf15dB/cLSMj2KpVVlvgLoVmYDugSER8Q23juilY7iaf0bqo9q1sTHpn9\n" + + "O7Oin/9J3sz+ic45vDh4aa74sOzfhA8EAJwAFEWLrGSxtnYJR5vQNstHIH1wtQ5G\n" + + "ZUZ57y9CbDkKrfCQvd0JOBjfUDz+N8qiamNIqfhQBtlhIDYgtswiG+iGP/2G0l6S\n" + + "j9DHNe2CYPUKgy+zQiRnyNGE2XUfcE+HuNDfu3AryPqaD8vLLw8TnsAgis3bRGg+\n" + + "hhrAC1NyKfDXTg20IVRlc3R1c2VyIEZpdmUgPHRlc3Q1QGV4YW1wbGUuY29tPokB\n" + + "OAQTAQIAIgUCVbqN3gIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQUCS7\n" + + "RJjFHb+/MAf9FKZatGcuOIoYqwGQQneyc63v3H/PyhvYF1nuKNftmhqIiUHec9Ra\n" + + "UHQkgam6LRoonkDfIpNlQVRv2XBV2VOAOFVORyQ/Tv7/xtpqGZqivV0yn2ZXbCce\n" + + "A627Vz7gP4gkO0ZJ0JsYJTc/5wO+nVG5Lohu/zdUofEbFAvcXs+Z1uXnUDdeGn47\n" + + "Lf1xZ2XOHOI0aQW4DdNaFoAd+AOTe0W3iB6WpaCIGno69CyNHNnWjJCSD33oLVaX\n" + + "yvbgw5UoyITvSqRnPyLGIc6dsqDLT59ok0Fkt4jtiGu9aze4n59GbtSjmWQgzbLC\n" + + "QWhK9K7UCcSLYNKXVyMha2WapBO156V0250DmARVuo3eAQgA6WqbB2JdbQFA/+JC\n" + + "8jB4/W1o3KkC92MjZ+mdeRR8FPlf/4T9GNg4dAQDPLycSRL5jSUwvAq3dLQhVG91\n" + + "5fGWkvpOX4/wORwPkf668AKuD2u2Bts1KhC1z3/duScb2F5rrGLpIEfWT1jZEici\n" + + "vBayV8qa42TJlWHE8rKlqwGy/KE5YuWkKeAaIJrvgonW2HVYprZpoOpxuJ4FNzWa\n" + + "2xdHqQGElmor4lgGgeuJRAyzufJfGfarK/ot6Gz+0eWsFnuPXpJ9pDNigGLV51Wu\n" + + "kWv8K4aTpE0rEb2+L+4AD2rZwsIyOPJ8wfiDQbaXQe4M9AsD3CIF+6wQL45x5p4U\n" + + "q1L3KQARAQABAAf8C+2DsJPpPEnFHY5dZ2zssd6mbihA2414YLYCcw6F7Lh1nGQa\n" + + "XuulruAJnk/xGJbco8bTv7g4ecE+tsbfWnnG/QnHeYCsgO6bKRXATcWFSYpyidUn\n" + + "2VdzQwBAv1ZtSNhCXlPLn/erzvA2X4QadUwfnvbehWJAHt8ZJmHUr3FtyRUHEdCK\n" + + "2EXsBWnzPCcqHZOMvcbSINSqBFGzVXkOZsMFvPTNIUYRHz8NbJT/OPiOmyBshXpS\n" + + "t8w3QqZhBcTT3NZo3kgxN1RygaTa10ytB2cxTCVuD8hmUBaV9gakdfMYkVJds7/T\n" + + "ZY3It68F0vitBnqpppZQ+NFgr/vwVg0p3gbmAQQA79zsWPvyIqYvyJhmiKvLIpev\n" + + "569ho8tC9xx+IZ5WnjN8ZADlb9brAdA9cqGfBgZkpZUhngCRVOYUIco+m2NYkEJm\n" + + "BsSTTM77dqU55DRloJ3FtBwCPXHkwg9P/FHMMYYGyLpQTSB92hXk8yomo+ozX7kx\n" + + "DtUHZIrir/rr0lQe+GkEAPkep9V5jBmfHMArnfji7Nfb1/ZjrSAaK+rtqczgm+6j\n" + + "ubY/0DpM/6gm+/8X27WFw2m45ncH3qNvOe4Qm40EmgmHkXsdQyU0Fv7uXc9nBYoo\n" + + "G6s7DWLY4VAqWwPsvbqgpSp/qdGn9nlcJjjY1HtfU7HM3xysT7TJ2YVhYHlJdjDB\n" + + "A/0alBcYtHvaCJaRLWX4UiashbfETWAf/4oHlERjkXj64qOdsGnD6CD99t9x91Ue\n" + + "pClPsLDFvY8/HxWX7STA9pQZAa2ZdJd8b58Rgy9TBShw2mbz2S6Cbw77pP/WEjtJ\n" + + "pJuS2gDp70H01fYRaw7YH32CfUr1VeEv7hTjk/SNVteIZkkOiQEfBBgBAgAJBQJV\n" + + "uo3eAhsMAAoJEFAku0SYxR2/D8MH/1DH2bV5J112rP9+TXrAl/s1yva15W91A6NF\n" + + "/+qjjcoMrETN56mODKkbVutK3tTj8yU/KAksEMHilenSRoq35L9qoukQZIbNDUXK\n" + + "wzyhjorR7Upt/qcxpBLwBMZoPfvsWtQnjY1XglL40aXBoz0+GlFWbmfyILNGz0e2\n" + + "VPJ8IGQ0YOMY5J1ZxqHabpN8RB0P5dUM3VkLzMCdzwVbbxg5N5ONfTv2iQ/pkKMs\n" + + "nXpVnt6IcWSs1tL0OXhI80p4SW+xksFp/y3hFBcUUrBGrgFb7NLzOb0TYfptn3Ia\n" + + "uaAhETPJE+nBT3yDzKtpu7TnjDXpWn9JVWImzudMxK6DRZETJ3Y=\n" + + "=uND5\n" + + "-----END PGP PRIVATE KEY BLOCK-----\n"); } /** * A key revoked by a valid key, due to key compromise. - *

- * Revoked by {@link #validKeyWithoutExpiration()}. + * + *

Revoked by {@link #validKeyWithoutExpiration()}. * *

    * pub   2048R/3434B39F 2015-10-20 [revoked: 2015-10-20]
@@ -554,119 +554,120 @@ public class TestKeys {
    * 
*/ public static TestKey revokedCompromisedKey() throws Exception { - return new TestKey("-----BEGIN PGP PUBLIC KEY BLOCK-----\n" - + "Version: GnuPG v1\n" - + "\n" - + "mQENBFYmpXkBCACqaLz51DcWQmfOJnat9iHSySfSHwbKfVvoN43Ba2cf/D/PadRc\n" - + "HLgc+91k2yk1kV1LnMdvUGj5zZ84ZqrQx3f1WeItnzZpqxtmQS/GSxCp9EY/s7w6\n" - + "5i86R/k9Tzgvk0B7dKZJXbM/OWxxDkkxHWE3Un9wreX7bDU5b9D2knHRiNFqH9ZJ\n" - + "KqDIFZqH9WTUxNZcHz20sTCRIMfvsAwf2vRU5N5xTu4Mbk6JFc7BAj7h1f/mYEPo\n" - + "CTyB1jV/DSDVdn1FjJVocSg6W/CvsYF9hKFYjJHl4VXdePTpnOjHhJLL0QWk0TMe\n" - + "xYeUi/xDr5DeMxTmi7F7BFaQEF+KmUM46e+9ABEBAAGJATAEIAECABoFAlYmq1gT\n" - + "HQJ0ZXN0NiBjb21wcm9taXNlZAAKCRDtBiXcRjKKjIm6B/9YwkyG4w+9KUNESywM\n" - + "bxC2WWGWrFcQGoKxixzt0uT251UY8qxa1IED0wnLsIQmffTQcnrK3B9svd4HhQlk\n" - + "pheKQ3w5iluLeGmGljhDBdAVyS07jYoFUGTXjwzPAgJ3Dxzul8Q8Zj+fOmRcfsP9\n" - + "72kl6g2yEEbevnydWIiOj/vWHVLFb54G8bwXTNwH/FXQsHuPYxXZifwyDwdwEQMq\n" - + "0VTZcrukgeJ+VbSSuq+uX4I3+kJw5hL49KYAQltQBmTo3yhuY/Q+LkgcBv/umtY/\n" - + "DrUqSCBV1bTnfq5SfaObkUu22HWjrtSFSjnXYyh+wyTG3AXG3N9VPrjGQIJIW1j6\n" - + "9QM0iQE3BB8BAgAhBQJWJqYUFwyAAQSup+0vghEz5bEo0e0GJdxGMoqMAgcAAAoJ\n" - + "EIxP0o40NLOfYd4H/3GpfxfJ+nMzBChn1JqFrKOqqYiOO4sUwubXzpRO33V2jUrU\n" - + "V75PTWG/6NlgDbPfKFcU0qZud6M2EQxSS9/I20i/MpRB7qJnWMM/6HxdMDJ0o/pN\n" - + "4ImIGj38QTIWx0DS9n3bwlcobl7ZlM8g2N1kv5jQPEuurffeJRS4ny4pEvCCm2IS\n" - + "SGOuB0DVtYHGDrJLQ0k4mDkEJuU8fP5un8mN8I8eAINlsTFpsTswMXMiptZTm5SI\n" - + "5QZlG3m5MvvckngYdhynvCWc6JHGt1EHXlI4A5Qetr/4FbNE4uYcEEhyzBy4WQfi\n" - + "QCPiIzzm3O4cMnr9N+5HzYqRhu2OveYm86G2Rxq0IFRlc3R1c2VyIFNpeCA8dGVz\n" - + "dDZAZXhhbXBsZS5jb20+iQE4BBMBAgAiBQJWJqV5AhsDBgsJCAcDAgYVCAIJCgsE\n" - + "FgIDAQIeAQIXgAAKCRCMT9KONDSzn2XtB/4wl4ctc3cW9Fwp17cktFi6md8fjRiR\n" - + "wE/ruVKIKmAHzeMLBoZn4LZVunyNCRGLZfP+MUs4JhLkp8ioTzUB7xPl9k94FXel\n" - + "bObn9F0T7htjFLiFAOMeykneylk2kalTt6IBKtaOPn+V6onBwO+YHbwt+xLMhAWj\n" - + "Z/WA0TIC1RIukdzWErhd+9lG8B9kupGC5bPo/AgCPoajPhS1qLrth+lCsNJXT/Rt\n" - + "k6Jx5omypxMXPzgzNtULMFONszaRnHnrCHQg/yJZDCw3ffW5ShfyfWdFM65jgEKo\n" - + "nMKLzy9XV+BM6IJQlgHCBAP8WHKSf4qMG4/hEWLrwA/bTQ7w0DSV88msuQENBFYm\n" - + "pXkBCACzIMFDC6kcV58uvF3XwOrS3DmKNPDNzO/4Ay/iOxZbm+9NP8QWEEm+AzCt\n" - + "ZMfYdZ8C3DjuzxkhcacI/E5agZICds6bs0+VS7VKEeNYp/UrTF9pkZNXseCrJPgr\n" - + "U31eoGVc5bE5c0TGLhAjbMKtR5LZFMpAXgpA7hXJSSuAXGs8gjkJkYSJYnJwIOyd\n" - + "xOi5jmnE/U5QuMjBG0bwxFXxkaDa5mcebJ/6C8mgkKyATbQkCe7YJGl1JLK4vY28\n" - + "ybSMhMDtZiwgvKzd+HcQr+xUQvmgSMApJaMxKPHRA1IrP/STXUEAjcGfk/HCz/0j\n" - + "7mJG2cvCxeOMAmp/pTzhSoXiqUNlABEBAAGJAR8EGAECAAkFAlYmpXkCGwwACgkQ\n" - + "jE/SjjQ0s5/kVAf/QvHOhuoBSlSxPcgvnvCl8V3zbNR1P9lgjYGwMsvLhwCT7Wvm\n" - + "mkUKvtT913uER93N8xJD2svGhKabpiPj9/eo0p3p64dicijsP1UQfpmWKPa/V9sv\n" - + "zep08cpDl/eczSiLqgcTXCoZeewWXoQGqqoXnwa4lwQv4Zvj7TTCN2wRzoGwbRcm\n" - + "G2hmc27uOwA+hXbF+bLe6HOZR/7U93j8a22g2X9OgST/QCsLgyiUSw3YYaEan9tn\n" - + "wuEgAEY/rchOvgeXe5Sl0wTFLHH6OS4BBGgc1LRKnSCM2dgZqvhOOxOvuuieBWY6\n" - + "tULvIEIjNNP8Qizfc4u2O8h7HP2b3yYSrp9MMQ==\n" - + "=Dxr7\n" - + "-----END PGP PUBLIC KEY BLOCK-----\n", + return new TestKey( + "-----BEGIN PGP PUBLIC KEY BLOCK-----\n" + + "Version: GnuPG v1\n" + + "\n" + + "mQENBFYmpXkBCACqaLz51DcWQmfOJnat9iHSySfSHwbKfVvoN43Ba2cf/D/PadRc\n" + + "HLgc+91k2yk1kV1LnMdvUGj5zZ84ZqrQx3f1WeItnzZpqxtmQS/GSxCp9EY/s7w6\n" + + "5i86R/k9Tzgvk0B7dKZJXbM/OWxxDkkxHWE3Un9wreX7bDU5b9D2knHRiNFqH9ZJ\n" + + "KqDIFZqH9WTUxNZcHz20sTCRIMfvsAwf2vRU5N5xTu4Mbk6JFc7BAj7h1f/mYEPo\n" + + "CTyB1jV/DSDVdn1FjJVocSg6W/CvsYF9hKFYjJHl4VXdePTpnOjHhJLL0QWk0TMe\n" + + "xYeUi/xDr5DeMxTmi7F7BFaQEF+KmUM46e+9ABEBAAGJATAEIAECABoFAlYmq1gT\n" + + "HQJ0ZXN0NiBjb21wcm9taXNlZAAKCRDtBiXcRjKKjIm6B/9YwkyG4w+9KUNESywM\n" + + "bxC2WWGWrFcQGoKxixzt0uT251UY8qxa1IED0wnLsIQmffTQcnrK3B9svd4HhQlk\n" + + "pheKQ3w5iluLeGmGljhDBdAVyS07jYoFUGTXjwzPAgJ3Dxzul8Q8Zj+fOmRcfsP9\n" + + "72kl6g2yEEbevnydWIiOj/vWHVLFb54G8bwXTNwH/FXQsHuPYxXZifwyDwdwEQMq\n" + + "0VTZcrukgeJ+VbSSuq+uX4I3+kJw5hL49KYAQltQBmTo3yhuY/Q+LkgcBv/umtY/\n" + + "DrUqSCBV1bTnfq5SfaObkUu22HWjrtSFSjnXYyh+wyTG3AXG3N9VPrjGQIJIW1j6\n" + + "9QM0iQE3BB8BAgAhBQJWJqYUFwyAAQSup+0vghEz5bEo0e0GJdxGMoqMAgcAAAoJ\n" + + "EIxP0o40NLOfYd4H/3GpfxfJ+nMzBChn1JqFrKOqqYiOO4sUwubXzpRO33V2jUrU\n" + + "V75PTWG/6NlgDbPfKFcU0qZud6M2EQxSS9/I20i/MpRB7qJnWMM/6HxdMDJ0o/pN\n" + + "4ImIGj38QTIWx0DS9n3bwlcobl7ZlM8g2N1kv5jQPEuurffeJRS4ny4pEvCCm2IS\n" + + "SGOuB0DVtYHGDrJLQ0k4mDkEJuU8fP5un8mN8I8eAINlsTFpsTswMXMiptZTm5SI\n" + + "5QZlG3m5MvvckngYdhynvCWc6JHGt1EHXlI4A5Qetr/4FbNE4uYcEEhyzBy4WQfi\n" + + "QCPiIzzm3O4cMnr9N+5HzYqRhu2OveYm86G2Rxq0IFRlc3R1c2VyIFNpeCA8dGVz\n" + + "dDZAZXhhbXBsZS5jb20+iQE4BBMBAgAiBQJWJqV5AhsDBgsJCAcDAgYVCAIJCgsE\n" + + "FgIDAQIeAQIXgAAKCRCMT9KONDSzn2XtB/4wl4ctc3cW9Fwp17cktFi6md8fjRiR\n" + + "wE/ruVKIKmAHzeMLBoZn4LZVunyNCRGLZfP+MUs4JhLkp8ioTzUB7xPl9k94FXel\n" + + "bObn9F0T7htjFLiFAOMeykneylk2kalTt6IBKtaOPn+V6onBwO+YHbwt+xLMhAWj\n" + + "Z/WA0TIC1RIukdzWErhd+9lG8B9kupGC5bPo/AgCPoajPhS1qLrth+lCsNJXT/Rt\n" + + "k6Jx5omypxMXPzgzNtULMFONszaRnHnrCHQg/yJZDCw3ffW5ShfyfWdFM65jgEKo\n" + + "nMKLzy9XV+BM6IJQlgHCBAP8WHKSf4qMG4/hEWLrwA/bTQ7w0DSV88msuQENBFYm\n" + + "pXkBCACzIMFDC6kcV58uvF3XwOrS3DmKNPDNzO/4Ay/iOxZbm+9NP8QWEEm+AzCt\n" + + "ZMfYdZ8C3DjuzxkhcacI/E5agZICds6bs0+VS7VKEeNYp/UrTF9pkZNXseCrJPgr\n" + + "U31eoGVc5bE5c0TGLhAjbMKtR5LZFMpAXgpA7hXJSSuAXGs8gjkJkYSJYnJwIOyd\n" + + "xOi5jmnE/U5QuMjBG0bwxFXxkaDa5mcebJ/6C8mgkKyATbQkCe7YJGl1JLK4vY28\n" + + "ybSMhMDtZiwgvKzd+HcQr+xUQvmgSMApJaMxKPHRA1IrP/STXUEAjcGfk/HCz/0j\n" + + "7mJG2cvCxeOMAmp/pTzhSoXiqUNlABEBAAGJAR8EGAECAAkFAlYmpXkCGwwACgkQ\n" + + "jE/SjjQ0s5/kVAf/QvHOhuoBSlSxPcgvnvCl8V3zbNR1P9lgjYGwMsvLhwCT7Wvm\n" + + "mkUKvtT913uER93N8xJD2svGhKabpiPj9/eo0p3p64dicijsP1UQfpmWKPa/V9sv\n" + + "zep08cpDl/eczSiLqgcTXCoZeewWXoQGqqoXnwa4lwQv4Zvj7TTCN2wRzoGwbRcm\n" + + "G2hmc27uOwA+hXbF+bLe6HOZR/7U93j8a22g2X9OgST/QCsLgyiUSw3YYaEan9tn\n" + + "wuEgAEY/rchOvgeXe5Sl0wTFLHH6OS4BBGgc1LRKnSCM2dgZqvhOOxOvuuieBWY6\n" + + "tULvIEIjNNP8Qizfc4u2O8h7HP2b3yYSrp9MMQ==\n" + + "=Dxr7\n" + + "-----END PGP PUBLIC KEY BLOCK-----\n", "-----BEGIN PGP PRIVATE KEY BLOCK-----\n" - + "Version: GnuPG v1\n" - + "\n" - + "lQOYBFYmpXkBCACqaLz51DcWQmfOJnat9iHSySfSHwbKfVvoN43Ba2cf/D/PadRc\n" - + "HLgc+91k2yk1kV1LnMdvUGj5zZ84ZqrQx3f1WeItnzZpqxtmQS/GSxCp9EY/s7w6\n" - + "5i86R/k9Tzgvk0B7dKZJXbM/OWxxDkkxHWE3Un9wreX7bDU5b9D2knHRiNFqH9ZJ\n" - + "KqDIFZqH9WTUxNZcHz20sTCRIMfvsAwf2vRU5N5xTu4Mbk6JFc7BAj7h1f/mYEPo\n" - + "CTyB1jV/DSDVdn1FjJVocSg6W/CvsYF9hKFYjJHl4VXdePTpnOjHhJLL0QWk0TMe\n" - + "xYeUi/xDr5DeMxTmi7F7BFaQEF+KmUM46e+9ABEBAAEAB/wOspbuA1A3AsY6QRYG\n" - + "Xg6/w+rD1Do9N7+4ESaQUqej2hlU1d9jjHSSx2RqgP6WaLG/xkdrQeez9/iuICjG\n" - + "dhXSGw0He05xobjswl2RAENxLSjr8KAhAl57a97C23TQoaYzn7WB6Wt+3gCM5bsJ\n" - + "WevbHinwuYb2/ve+OvcudSYM+Nhtpv0DoTaizhi9wzc3g/XLbturlpdCffbw4y+h\n" - + "gBPd/t3cc/0Ams8Wi2RlmDOoe73ls23nBHcNomgydyIYBn7U5Z3v3YkPNp9VBiXx\n" - + "rC4mDtB1ugucMhqjRNAYqinaLP35CiBTU/IB0WLu7ZyytnjY5frly1ShAG8wFL0B\n" - + "MOMxBADJjGy1NwGSd/7eMeYyYThyhXDxo5so91/O1+RLnSUVv/Nz6VOPp2TtuVN5\n" - + "uTJkpSXtUFyWbf8mkQiFz4++vHW5E/Q6+KomXRalK7JeBzeFMtax64ykQHID9cSu\n" - + "TaSHBhOEEeZZuf6BlulYEJEBHYK6EFlPJn+cpZtTFaqDoKh22QQA2HKjfyeppNre\n" - + "WRFJ9h1x1hBlSRR+XIPYmDmZUjL37jQUlw8iF+txPclfyNBw2I2Om+Jhcf25peOx\n" - + "ow4yvjt8r3qDjNhI2zLE9u4zrQ9xU8CUingT0t4k3NO2vigpKlmp1/w2IHSMctry\n" - + "v1v3+BAS8qGIYDY1lgI7QBvle5hxGYUD/00zMyHOIgYg/cM5sR0qafesoj9kRff5\n" - + "UMnSy1dw+pGMv6GqKGbcZDoC060hUO9GhQRPZXF8PlYzD30lOLS2Uw4mPXjOmQVv\n" - + "lDiyl/vLkfkVfP/alYH0FW6mErDrjtHhrZewqDm3iPLGMVGfGCJsL+N37VBSe+jr\n" - + "4rZCnjk/Jo5JRoKJATcEHwECACEFAlYmphQXDIABBK6n7S+CETPlsSjR7QYl3EYy\n" - + "iowCBwAACgkQjE/SjjQ0s59h3gf/cal/F8n6czMEKGfUmoWso6qpiI47ixTC5tfO\n" - + "lE7fdXaNStRXvk9NYb/o2WANs98oVxTSpm53ozYRDFJL38jbSL8ylEHuomdYwz/o\n" - + "fF0wMnSj+k3giYgaPfxBMhbHQNL2fdvCVyhuXtmUzyDY3WS/mNA8S66t994lFLif\n" - + "LikS8IKbYhJIY64HQNW1gcYOsktDSTiYOQQm5Tx8/m6fyY3wjx4Ag2WxMWmxOzAx\n" - + "cyKm1lOblIjlBmUbebky+9ySeBh2HKe8JZzokca3UQdeUjgDlB62v/gVs0Ti5hwQ\n" - + "SHLMHLhZB+JAI+IjPObc7hwyev037kfNipGG7Y695ibzobZHGrQgVGVzdHVzZXIg\n" - + "U2l4IDx0ZXN0NkBleGFtcGxlLmNvbT6JATgEEwECACIFAlYmpXkCGwMGCwkIBwMC\n" - + "BhUIAgkKCwQWAgMBAh4BAheAAAoJEIxP0o40NLOfZe0H/jCXhy1zdxb0XCnXtyS0\n" - + "WLqZ3x+NGJHAT+u5UogqYAfN4wsGhmfgtlW6fI0JEYtl8/4xSzgmEuSnyKhPNQHv\n" - + "E+X2T3gVd6Vs5uf0XRPuG2MUuIUA4x7KSd7KWTaRqVO3ogEq1o4+f5XqicHA75gd\n" - + "vC37EsyEBaNn9YDRMgLVEi6R3NYSuF372UbwH2S6kYLls+j8CAI+hqM+FLWouu2H\n" - + "6UKw0ldP9G2TonHmibKnExc/ODM21QswU42zNpGceesIdCD/IlkMLDd99blKF/J9\n" - + "Z0UzrmOAQqicwovPL1dX4EzoglCWAcIEA/xYcpJ/iowbj+ERYuvAD9tNDvDQNJXz\n" - + "yaydA5gEVialeQEIALMgwUMLqRxXny68XdfA6tLcOYo08M3M7/gDL+I7Flub700/\n" - + "xBYQSb4DMK1kx9h1nwLcOO7PGSFxpwj8TlqBkgJ2zpuzT5VLtUoR41in9StMX2mR\n" - + "k1ex4Ksk+CtTfV6gZVzlsTlzRMYuECNswq1HktkUykBeCkDuFclJK4BcazyCOQmR\n" - + "hIlicnAg7J3E6LmOacT9TlC4yMEbRvDEVfGRoNrmZx5sn/oLyaCQrIBNtCQJ7tgk\n" - + "aXUksri9jbzJtIyEwO1mLCC8rN34dxCv7FRC+aBIwCklozEo8dEDUis/9JNdQQCN\n" - + "wZ+T8cLP/SPuYkbZy8LF44wCan+lPOFKheKpQ2UAEQEAAQAH/A1Os+Tb9yiGnuoN\n" - + "LuiSKa/YEgNBOxmC7dnuPK6xJpBQNZc200WzWJMf8AwVpl4foNxIyYb+Rjbsl1Ts\n" - + "z5JcOWFq+57oE5O7D+EMkqf5tFZO4nC4kqprac41HSW02mW/A0DDRKcIt/WEIwlK\n" - + "sWzHmjJ736moAtl/holRYQS0ePgB8bUPDQcFovH6X3SUxlPGTYD1DEX+WNvYRk3r\n" - + "pa9YXH65qbG9CEJIFTmwZIRDl+CBtBlN/fKadyMJr9fXtv7Fu9hNsK1K1pUtLqCa\n" - + "nc22Zak+o+LCPlZ8vmw/UmOGtp2iZlEragmh2rOywp0dHF7gsdlgoafQf8Q4NIag\n" - + "TFyHf1kEAMSOKUUwLBEmPnDVfoEOt5spQLVtlF8sh/Okk9zVazWmw0n/b1Ef72z6\n" - + "EZqCW9/XhH5pXfKJeV+08hroHI6a5UESa7/xOIx50TaQdRqjwGciMnH2LJcpIU/L\n" - + "f0cGXcnTLKt4Z2GeSPKFTj4VzwmwH5F/RYdc5eiVb7VNoy9DC5RZBADpTVH5pklS\n" - + "44VDJIcwSNy1LBEU3oj+Nu+sufCimJ5B7HLokoJtm6q8VQRga5hN1TZkdQcLy+b2\n" - + "wzxHYoIsIsYFfG/mqLZ3LJNDFqze1/Kj987DYSUGeNYexMN2Fkzbo35Jf0cpOiao\n" - + "390JFOS7qecUak5/yJ/V4xy8/nds37617QP9GWlFBykDoESBC2AIz8wXcpUBVNeH\n" - + "BNSthmC+PJPhsS6jTQuipqtXUZBgZBrMHp/bA8gTOkI4rPXycH3+ACbuQMAjbFny\n" - + "Kt69lPHD8VWw/82E4EY2J9LmHli+2BcATz89ouC4kqC5zF90qJseviSZPihpnFxA\n" - + "1UqMU2ZjsPb4CM9C/YkBHwQYAQIACQUCVialeQIbDAAKCRCMT9KONDSzn+RUB/9C\n" - + "8c6G6gFKVLE9yC+e8KXxXfNs1HU/2WCNgbAyy8uHAJPta+aaRQq+1P3Xe4RH3c3z\n" - + "EkPay8aEppumI+P396jSnenrh2JyKOw/VRB+mZYo9r9X2y/N6nTxykOX95zNKIuq\n" - + "BxNcKhl57BZehAaqqhefBriXBC/hm+PtNMI3bBHOgbBtFyYbaGZzbu47AD6FdsX5\n" - + "st7oc5lH/tT3ePxrbaDZf06BJP9AKwuDKJRLDdhhoRqf22fC4SAARj+tyE6+B5d7\n" - + "lKXTBMUscfo5LgEEaBzUtEqdIIzZ2Bmq+E47E6+66J4FZjq1Qu8gQiM00/xCLN9z\n" - + "i7Y7yHsc/ZvfJhKun0wx\n" - + "=M/kw\n" - + "-----END PGP PRIVATE KEY BLOCK-----\n"); + + "Version: GnuPG v1\n" + + "\n" + + "lQOYBFYmpXkBCACqaLz51DcWQmfOJnat9iHSySfSHwbKfVvoN43Ba2cf/D/PadRc\n" + + "HLgc+91k2yk1kV1LnMdvUGj5zZ84ZqrQx3f1WeItnzZpqxtmQS/GSxCp9EY/s7w6\n" + + "5i86R/k9Tzgvk0B7dKZJXbM/OWxxDkkxHWE3Un9wreX7bDU5b9D2knHRiNFqH9ZJ\n" + + "KqDIFZqH9WTUxNZcHz20sTCRIMfvsAwf2vRU5N5xTu4Mbk6JFc7BAj7h1f/mYEPo\n" + + "CTyB1jV/DSDVdn1FjJVocSg6W/CvsYF9hKFYjJHl4VXdePTpnOjHhJLL0QWk0TMe\n" + + "xYeUi/xDr5DeMxTmi7F7BFaQEF+KmUM46e+9ABEBAAEAB/wOspbuA1A3AsY6QRYG\n" + + "Xg6/w+rD1Do9N7+4ESaQUqej2hlU1d9jjHSSx2RqgP6WaLG/xkdrQeez9/iuICjG\n" + + "dhXSGw0He05xobjswl2RAENxLSjr8KAhAl57a97C23TQoaYzn7WB6Wt+3gCM5bsJ\n" + + "WevbHinwuYb2/ve+OvcudSYM+Nhtpv0DoTaizhi9wzc3g/XLbturlpdCffbw4y+h\n" + + "gBPd/t3cc/0Ams8Wi2RlmDOoe73ls23nBHcNomgydyIYBn7U5Z3v3YkPNp9VBiXx\n" + + "rC4mDtB1ugucMhqjRNAYqinaLP35CiBTU/IB0WLu7ZyytnjY5frly1ShAG8wFL0B\n" + + "MOMxBADJjGy1NwGSd/7eMeYyYThyhXDxo5so91/O1+RLnSUVv/Nz6VOPp2TtuVN5\n" + + "uTJkpSXtUFyWbf8mkQiFz4++vHW5E/Q6+KomXRalK7JeBzeFMtax64ykQHID9cSu\n" + + "TaSHBhOEEeZZuf6BlulYEJEBHYK6EFlPJn+cpZtTFaqDoKh22QQA2HKjfyeppNre\n" + + "WRFJ9h1x1hBlSRR+XIPYmDmZUjL37jQUlw8iF+txPclfyNBw2I2Om+Jhcf25peOx\n" + + "ow4yvjt8r3qDjNhI2zLE9u4zrQ9xU8CUingT0t4k3NO2vigpKlmp1/w2IHSMctry\n" + + "v1v3+BAS8qGIYDY1lgI7QBvle5hxGYUD/00zMyHOIgYg/cM5sR0qafesoj9kRff5\n" + + "UMnSy1dw+pGMv6GqKGbcZDoC060hUO9GhQRPZXF8PlYzD30lOLS2Uw4mPXjOmQVv\n" + + "lDiyl/vLkfkVfP/alYH0FW6mErDrjtHhrZewqDm3iPLGMVGfGCJsL+N37VBSe+jr\n" + + "4rZCnjk/Jo5JRoKJATcEHwECACEFAlYmphQXDIABBK6n7S+CETPlsSjR7QYl3EYy\n" + + "iowCBwAACgkQjE/SjjQ0s59h3gf/cal/F8n6czMEKGfUmoWso6qpiI47ixTC5tfO\n" + + "lE7fdXaNStRXvk9NYb/o2WANs98oVxTSpm53ozYRDFJL38jbSL8ylEHuomdYwz/o\n" + + "fF0wMnSj+k3giYgaPfxBMhbHQNL2fdvCVyhuXtmUzyDY3WS/mNA8S66t994lFLif\n" + + "LikS8IKbYhJIY64HQNW1gcYOsktDSTiYOQQm5Tx8/m6fyY3wjx4Ag2WxMWmxOzAx\n" + + "cyKm1lOblIjlBmUbebky+9ySeBh2HKe8JZzokca3UQdeUjgDlB62v/gVs0Ti5hwQ\n" + + "SHLMHLhZB+JAI+IjPObc7hwyev037kfNipGG7Y695ibzobZHGrQgVGVzdHVzZXIg\n" + + "U2l4IDx0ZXN0NkBleGFtcGxlLmNvbT6JATgEEwECACIFAlYmpXkCGwMGCwkIBwMC\n" + + "BhUIAgkKCwQWAgMBAh4BAheAAAoJEIxP0o40NLOfZe0H/jCXhy1zdxb0XCnXtyS0\n" + + "WLqZ3x+NGJHAT+u5UogqYAfN4wsGhmfgtlW6fI0JEYtl8/4xSzgmEuSnyKhPNQHv\n" + + "E+X2T3gVd6Vs5uf0XRPuG2MUuIUA4x7KSd7KWTaRqVO3ogEq1o4+f5XqicHA75gd\n" + + "vC37EsyEBaNn9YDRMgLVEi6R3NYSuF372UbwH2S6kYLls+j8CAI+hqM+FLWouu2H\n" + + "6UKw0ldP9G2TonHmibKnExc/ODM21QswU42zNpGceesIdCD/IlkMLDd99blKF/J9\n" + + "Z0UzrmOAQqicwovPL1dX4EzoglCWAcIEA/xYcpJ/iowbj+ERYuvAD9tNDvDQNJXz\n" + + "yaydA5gEVialeQEIALMgwUMLqRxXny68XdfA6tLcOYo08M3M7/gDL+I7Flub700/\n" + + "xBYQSb4DMK1kx9h1nwLcOO7PGSFxpwj8TlqBkgJ2zpuzT5VLtUoR41in9StMX2mR\n" + + "k1ex4Ksk+CtTfV6gZVzlsTlzRMYuECNswq1HktkUykBeCkDuFclJK4BcazyCOQmR\n" + + "hIlicnAg7J3E6LmOacT9TlC4yMEbRvDEVfGRoNrmZx5sn/oLyaCQrIBNtCQJ7tgk\n" + + "aXUksri9jbzJtIyEwO1mLCC8rN34dxCv7FRC+aBIwCklozEo8dEDUis/9JNdQQCN\n" + + "wZ+T8cLP/SPuYkbZy8LF44wCan+lPOFKheKpQ2UAEQEAAQAH/A1Os+Tb9yiGnuoN\n" + + "LuiSKa/YEgNBOxmC7dnuPK6xJpBQNZc200WzWJMf8AwVpl4foNxIyYb+Rjbsl1Ts\n" + + "z5JcOWFq+57oE5O7D+EMkqf5tFZO4nC4kqprac41HSW02mW/A0DDRKcIt/WEIwlK\n" + + "sWzHmjJ736moAtl/holRYQS0ePgB8bUPDQcFovH6X3SUxlPGTYD1DEX+WNvYRk3r\n" + + "pa9YXH65qbG9CEJIFTmwZIRDl+CBtBlN/fKadyMJr9fXtv7Fu9hNsK1K1pUtLqCa\n" + + "nc22Zak+o+LCPlZ8vmw/UmOGtp2iZlEragmh2rOywp0dHF7gsdlgoafQf8Q4NIag\n" + + "TFyHf1kEAMSOKUUwLBEmPnDVfoEOt5spQLVtlF8sh/Okk9zVazWmw0n/b1Ef72z6\n" + + "EZqCW9/XhH5pXfKJeV+08hroHI6a5UESa7/xOIx50TaQdRqjwGciMnH2LJcpIU/L\n" + + "f0cGXcnTLKt4Z2GeSPKFTj4VzwmwH5F/RYdc5eiVb7VNoy9DC5RZBADpTVH5pklS\n" + + "44VDJIcwSNy1LBEU3oj+Nu+sufCimJ5B7HLokoJtm6q8VQRga5hN1TZkdQcLy+b2\n" + + "wzxHYoIsIsYFfG/mqLZ3LJNDFqze1/Kj987DYSUGeNYexMN2Fkzbo35Jf0cpOiao\n" + + "390JFOS7qecUak5/yJ/V4xy8/nds37617QP9GWlFBykDoESBC2AIz8wXcpUBVNeH\n" + + "BNSthmC+PJPhsS6jTQuipqtXUZBgZBrMHp/bA8gTOkI4rPXycH3+ACbuQMAjbFny\n" + + "Kt69lPHD8VWw/82E4EY2J9LmHli+2BcATz89ouC4kqC5zF90qJseviSZPihpnFxA\n" + + "1UqMU2ZjsPb4CM9C/YkBHwQYAQIACQUCVialeQIbDAAKCRCMT9KONDSzn+RUB/9C\n" + + "8c6G6gFKVLE9yC+e8KXxXfNs1HU/2WCNgbAyy8uHAJPta+aaRQq+1P3Xe4RH3c3z\n" + + "EkPay8aEppumI+P396jSnenrh2JyKOw/VRB+mZYo9r9X2y/N6nTxykOX95zNKIuq\n" + + "BxNcKhl57BZehAaqqhefBriXBC/hm+PtNMI3bBHOgbBtFyYbaGZzbu47AD6FdsX5\n" + + "st7oc5lH/tT3ePxrbaDZf06BJP9AKwuDKJRLDdhhoRqf22fC4SAARj+tyE6+B5d7\n" + + "lKXTBMUscfo5LgEEaBzUtEqdIIzZ2Bmq+E47E6+66J4FZjq1Qu8gQiM00/xCLN9z\n" + + "i7Y7yHsc/ZvfJhKun0wx\n" + + "=M/kw\n" + + "-----END PGP PRIVATE KEY BLOCK-----\n"); } /** * A key revoked by a valid key, due to no longer being used. - *

- * Revoked by {@link #validKeyWithoutExpiration()}. + * + *

Revoked by {@link #validKeyWithoutExpiration()}. * *

    * pub   2048R/3D6C52D0 2015-10-20 [revoked: 2015-10-20]
@@ -675,119 +676,120 @@ public class TestKeys {
    * 
*/ public static TestKey revokedNoLongerUsedKey() throws Exception { - return new TestKey("-----BEGIN PGP PUBLIC KEY BLOCK-----\n" - + "Version: GnuPG v1\n" - + "\n" - + "mQENBFYmq3EBCAC9ssY6QhFsnZqKEPlQrx8Zomblj8qV93/B448isOT2L6OVY7UC\n" - + "kKPj6afW5UDkYeyZSmLZfTrpePcbAB8FB3uvd/AS9mHC+6zuBlwlkl9xIXlwUXQP\n" - + "KER4LKYNTP21AM+/vTJm4+u26tlZECIZlez31KEeqM30EAm+/pO8VkEp8+1ImfLv\n" - + "otndIjMoq9gxJvn6KZeexJT2eKCsSa20vVsmAhuFjLZitU3lEjIROfDiyHUZ2cZ+\n" - + "qynfppJCKlHJRu/T9L/yxDFVUFDFSajNzSfjG1g3FEveDITyAhRetVfZbhyJptnV\n" - + "jfiHSQkLamPsBmMoKfP+aO5SfsTHTJvxgLUdABEBAAGJAS0EIAECABcFAlYmq8AQ\n" - + "HQN0ZXN0NyBub3QgdXNlZAAKCRDtBiXcRjKKjPKqB/sF+ypJZaZ5M4jFdoH/YA3s\n" - + "4+VkA/NbLKcrlMI0lbnIrax02jdyTo7rBUJfTwuBs5QeQ25+VfaBcz9fWSv4Z8Bk\n" - + "9+w61bQZLQkExZ9W7hnhaapyR0aT0rY48KGtHOPNoMQu9Si+RnRiI024jMUUjrau\n" - + "w/exgCteY261VtCPRgyZOlpbX43rsBhF8ott0ZzSfLwaNTHhsjFsD1uH6TSFO8La\n" - + "/H1nO31sORlY3+rCGiQVuYIJD1qI7bEjDHYO0nq/f7JjfYKmVBg9grwLsX3h1qZ2\n" - + "L3Yz+0eCi7/6T/Sm7PavQ+EGL7+WBXX3qJpwc+EFNHs6VxQp86k6csba0c5mNcaQ\n" - + "iQE3BB8BAgAhBQJWJqusFwyAAQSup+0vghEz5bEo0e0GJdxGMoqMAgcAAAoJEPrS\n" - + "q+I9bFLQ2BYH/jm+t7pZuv8WqZdb8FiBa9CFfhcSKjYarMHjBw7GxWZJMd5VR4DC\n" - + "r4T/ZSAGRKBRKQ2uXrkm9H0NPDp0c/UKCHtQMFDnqTk7B63mwSR1d7W0qaRPXYQ1\n" - + "bbatnzkEDOj0e+rX6aiqVRMo/q6uMNUFl6UMrUZPSNB5PVRQWPnQ7K11mw3vg0e5\n" - + "ycqJbyFvER6EtyDUXGBo8a5/4bK8VBNBMTAIy6GeGpeSM5b7cpQk7/j4dXugCJAV\n" - + "fhFNUOgLduoIKM4u+VcFjk3Km/YxOtGi1dLqCbTX/0LiCRA9mgQpyNVyA+Sm48LM\n" - + "LUkbcrN/F3SHX1ao/5lm19r8Biu1ziQnLgC0IlRlc3R1c2VyIFNldmVuIDx0ZXN0\n" - + "N0BleGFtcGxlLmNvbT6JATgEEwECACIFAlYmq3ECGwMGCwkIBwMCBhUIAgkKCwQW\n" - + "AgMBAh4BAheAAAoJEPrSq+I9bFLQvjQH/0K7aBsGU2U/rm4I+u+uPa6BnFTYQJqg\n" - + "034pwdD0WfM3M/XgVh7ERjnR9ZViCMVej+K3kW5d2DNaXu5vVpcD6L6jjWwiJHBw\n" - + "LIcmpqQrL0TdoCr4F4FKQnBbcH1fNvP8A/hLDHB3k3ERPvEFIo1AkVuK4s/v7yZY\n" - + "HAowX0r4ok4ndu/wAc0HI1FkApkAfh18JDTuui53dkKhnkDp7Xnfm/ElAZYjB7Se\n" - + "ivxOD9vdhViWSx1VhttPZo5hSyJrEYaJ5u9hsXNUN85DxgLqCmS1v8n3pN1lVY/Q\n" - + "TYXtgocakQgHGEG0Tl6a3xpNkn9ihnyCr80mHCxXTyUUBGfygccelB+5AQ0EViar\n" - + "cQEIAKxwXb6HGV9QjepADyWW7GMxc2JVZ7pZM2sdf8wrgnQqV2G1rc9gAgwTX4jt\n" - + "OY0vSKT1vBq09ZXS3qpYHi/Wwft0KkaX/a7e6vKabDSfhilxC2LuGz2+56f6UOzj\n" - + "ggwf5k4LFTQvkDUZumwPjoeC2hqQO3Q/9PW39C6GnvsCr5L0MRdO3PbVJM7lJaOk\n" - + "MbGwgysErWgiZXKlxMpIvffIsLC4BAxnjXaCy6zHuBcPMPaRMs7sDRBzeuTV2wnX\n" - + "Sd+IXZgdpd1hF7VkuXenzwOqvBGS66C3ILW0ZTFaOtgrloIkTvtYEcJFWvxqWl2F\n" - + "+JQ5V6eu2aJ3HIGyr9L1R8MUA6EAEQEAAYkBHwQYAQIACQUCViarcQIbDAAKCRD6\n" - + "0qviPWxS0M0PB/9Rbk4/pNW67+uE1lwtaIG7uFiMbJqu8jK6MkD8GdayflroWEZA\n" - + "x0Xow9HL8UaRfeRPTZMrDRpjl+fJIXT5qnlB0FPmzSXAKr3piC8migBcbp5m6hWh\n" - + "c3ScAqWOeMt9j0TTWHh4hKS8Q+lK392ht65cI/kpFhxm9EEaXmajplNL/2G3PVrl\n" - + "fFUgCdOn2DYdVSgJsfBhkcoiy17G3vqtb+We6ulhziae4SIrkUSqdYmRjiFyvqZz\n" - + "tmMEoF6CQNCUb1NK0TsSDeIdDacYjUwyq0Qj6TaXrWcbC3kW0GtWoFTNIiX4q9bN\n" - + "+B6paw/s8P7XCWznTBRdlFWWgrhcpzQ8fefC\n" - + "=CHer\n" - + "-----END PGP PUBLIC KEY BLOCK-----\n", + return new TestKey( + "-----BEGIN PGP PUBLIC KEY BLOCK-----\n" + + "Version: GnuPG v1\n" + + "\n" + + "mQENBFYmq3EBCAC9ssY6QhFsnZqKEPlQrx8Zomblj8qV93/B448isOT2L6OVY7UC\n" + + "kKPj6afW5UDkYeyZSmLZfTrpePcbAB8FB3uvd/AS9mHC+6zuBlwlkl9xIXlwUXQP\n" + + "KER4LKYNTP21AM+/vTJm4+u26tlZECIZlez31KEeqM30EAm+/pO8VkEp8+1ImfLv\n" + + "otndIjMoq9gxJvn6KZeexJT2eKCsSa20vVsmAhuFjLZitU3lEjIROfDiyHUZ2cZ+\n" + + "qynfppJCKlHJRu/T9L/yxDFVUFDFSajNzSfjG1g3FEveDITyAhRetVfZbhyJptnV\n" + + "jfiHSQkLamPsBmMoKfP+aO5SfsTHTJvxgLUdABEBAAGJAS0EIAECABcFAlYmq8AQ\n" + + "HQN0ZXN0NyBub3QgdXNlZAAKCRDtBiXcRjKKjPKqB/sF+ypJZaZ5M4jFdoH/YA3s\n" + + "4+VkA/NbLKcrlMI0lbnIrax02jdyTo7rBUJfTwuBs5QeQ25+VfaBcz9fWSv4Z8Bk\n" + + "9+w61bQZLQkExZ9W7hnhaapyR0aT0rY48KGtHOPNoMQu9Si+RnRiI024jMUUjrau\n" + + "w/exgCteY261VtCPRgyZOlpbX43rsBhF8ott0ZzSfLwaNTHhsjFsD1uH6TSFO8La\n" + + "/H1nO31sORlY3+rCGiQVuYIJD1qI7bEjDHYO0nq/f7JjfYKmVBg9grwLsX3h1qZ2\n" + + "L3Yz+0eCi7/6T/Sm7PavQ+EGL7+WBXX3qJpwc+EFNHs6VxQp86k6csba0c5mNcaQ\n" + + "iQE3BB8BAgAhBQJWJqusFwyAAQSup+0vghEz5bEo0e0GJdxGMoqMAgcAAAoJEPrS\n" + + "q+I9bFLQ2BYH/jm+t7pZuv8WqZdb8FiBa9CFfhcSKjYarMHjBw7GxWZJMd5VR4DC\n" + + "r4T/ZSAGRKBRKQ2uXrkm9H0NPDp0c/UKCHtQMFDnqTk7B63mwSR1d7W0qaRPXYQ1\n" + + "bbatnzkEDOj0e+rX6aiqVRMo/q6uMNUFl6UMrUZPSNB5PVRQWPnQ7K11mw3vg0e5\n" + + "ycqJbyFvER6EtyDUXGBo8a5/4bK8VBNBMTAIy6GeGpeSM5b7cpQk7/j4dXugCJAV\n" + + "fhFNUOgLduoIKM4u+VcFjk3Km/YxOtGi1dLqCbTX/0LiCRA9mgQpyNVyA+Sm48LM\n" + + "LUkbcrN/F3SHX1ao/5lm19r8Biu1ziQnLgC0IlRlc3R1c2VyIFNldmVuIDx0ZXN0\n" + + "N0BleGFtcGxlLmNvbT6JATgEEwECACIFAlYmq3ECGwMGCwkIBwMCBhUIAgkKCwQW\n" + + "AgMBAh4BAheAAAoJEPrSq+I9bFLQvjQH/0K7aBsGU2U/rm4I+u+uPa6BnFTYQJqg\n" + + "034pwdD0WfM3M/XgVh7ERjnR9ZViCMVej+K3kW5d2DNaXu5vVpcD6L6jjWwiJHBw\n" + + "LIcmpqQrL0TdoCr4F4FKQnBbcH1fNvP8A/hLDHB3k3ERPvEFIo1AkVuK4s/v7yZY\n" + + "HAowX0r4ok4ndu/wAc0HI1FkApkAfh18JDTuui53dkKhnkDp7Xnfm/ElAZYjB7Se\n" + + "ivxOD9vdhViWSx1VhttPZo5hSyJrEYaJ5u9hsXNUN85DxgLqCmS1v8n3pN1lVY/Q\n" + + "TYXtgocakQgHGEG0Tl6a3xpNkn9ihnyCr80mHCxXTyUUBGfygccelB+5AQ0EViar\n" + + "cQEIAKxwXb6HGV9QjepADyWW7GMxc2JVZ7pZM2sdf8wrgnQqV2G1rc9gAgwTX4jt\n" + + "OY0vSKT1vBq09ZXS3qpYHi/Wwft0KkaX/a7e6vKabDSfhilxC2LuGz2+56f6UOzj\n" + + "ggwf5k4LFTQvkDUZumwPjoeC2hqQO3Q/9PW39C6GnvsCr5L0MRdO3PbVJM7lJaOk\n" + + "MbGwgysErWgiZXKlxMpIvffIsLC4BAxnjXaCy6zHuBcPMPaRMs7sDRBzeuTV2wnX\n" + + "Sd+IXZgdpd1hF7VkuXenzwOqvBGS66C3ILW0ZTFaOtgrloIkTvtYEcJFWvxqWl2F\n" + + "+JQ5V6eu2aJ3HIGyr9L1R8MUA6EAEQEAAYkBHwQYAQIACQUCViarcQIbDAAKCRD6\n" + + "0qviPWxS0M0PB/9Rbk4/pNW67+uE1lwtaIG7uFiMbJqu8jK6MkD8GdayflroWEZA\n" + + "x0Xow9HL8UaRfeRPTZMrDRpjl+fJIXT5qnlB0FPmzSXAKr3piC8migBcbp5m6hWh\n" + + "c3ScAqWOeMt9j0TTWHh4hKS8Q+lK392ht65cI/kpFhxm9EEaXmajplNL/2G3PVrl\n" + + "fFUgCdOn2DYdVSgJsfBhkcoiy17G3vqtb+We6ulhziae4SIrkUSqdYmRjiFyvqZz\n" + + "tmMEoF6CQNCUb1NK0TsSDeIdDacYjUwyq0Qj6TaXrWcbC3kW0GtWoFTNIiX4q9bN\n" + + "+B6paw/s8P7XCWznTBRdlFWWgrhcpzQ8fefC\n" + + "=CHer\n" + + "-----END PGP PUBLIC KEY BLOCK-----\n", "-----BEGIN PGP PRIVATE KEY BLOCK-----\n" - + "Version: GnuPG v1\n" - + "\n" - + "lQOYBFYmq3EBCAC9ssY6QhFsnZqKEPlQrx8Zomblj8qV93/B448isOT2L6OVY7UC\n" - + "kKPj6afW5UDkYeyZSmLZfTrpePcbAB8FB3uvd/AS9mHC+6zuBlwlkl9xIXlwUXQP\n" - + "KER4LKYNTP21AM+/vTJm4+u26tlZECIZlez31KEeqM30EAm+/pO8VkEp8+1ImfLv\n" - + "otndIjMoq9gxJvn6KZeexJT2eKCsSa20vVsmAhuFjLZitU3lEjIROfDiyHUZ2cZ+\n" - + "qynfppJCKlHJRu/T9L/yxDFVUFDFSajNzSfjG1g3FEveDITyAhRetVfZbhyJptnV\n" - + "jfiHSQkLamPsBmMoKfP+aO5SfsTHTJvxgLUdABEBAAEAB/9AdCtFJSidcolNKwpC\n" - + "/1V+VL9IdYxcWx02CDccjuUkvrgCrL+WcQW2jS/hZMChOKJ2zR78DcBEDr1LF8Xy\n" - + "ZAIC8yoHj15VLUUrFM8fVvYFzt1fq9VWxxRIjscW0teLNgzgdYzYB84RtwcFa2Vi\n" - + "sx2ycTUTYUClEgP1uLMCtX3rnibJh4vR+lVgnDtKSoh4CLAlW6grAAVdw5sSuV7Q\n" - + "i9EJcPezGw1RvBU5PooqNDG6kyw/QqsAS4q3WP4uVJKK1e7S9oqXFEN8k/zfllI0\n" - + "SSkoyP2flzz71rJF/wQMfJ8uf/CelKXd+gPO4FbCWiZSTLe20JR23qiOyvZkfCwg\n" - + "eFmzBADIJUzspDrg5yaqE+HMc8U3O9G9FHoDSweZTbhiq3aK0BqMAn34u0ps6chy\n" - + "VMO6aPWVzgcSHNfTlzpjuN9lwDoimYBH5vZa1HlCHt5eeqTORixkxSerOmILabTi\n" - + "QWq5JPdJwYZiSvK45G5k3G37RTd6/QyhTlRYXj59RXYajrYngwQA8qMZRkRYcTop\n" - + "aG+5M0x44k6NgIyH7Ap+2vRPpDdUlHs+z+6iRvoutkSfKHeZUYBQjgt+tScfn1hM\n" - + "BRB+x146ecmSVh/Dh8yu6uCrhitFlKpyJqNptZo5o+sH41zjefpMd/bc8rtHTw3n\n" - + "GiFl57ZbXbze2O8UimUVgRI2DtOebt8EAJHM/8vZahzF0chzL4sNVAb8FcNYxAyn\n" - + "95VpnWeAtKX7f0bqUvIN4BNV++o6JdMNvBoYEQpKeQIda7QM59hNiS8f/bxkRikF\n" - + "OiHB5YGy2zRX5T1G5rVQ0YqrOu959eEwdGZmOQ8GOqq5B/NoHXUtotV6SGE3R+Tl\n" - + "grlV4U5/PT0fM3KJATcEHwECACEFAlYmq6wXDIABBK6n7S+CETPlsSjR7QYl3EYy\n" - + "iowCBwAACgkQ+tKr4j1sUtDYFgf+Ob63ulm6/xapl1vwWIFr0IV+FxIqNhqsweMH\n" - + "DsbFZkkx3lVHgMKvhP9lIAZEoFEpDa5euSb0fQ08OnRz9QoIe1AwUOepOTsHrebB\n" - + "JHV3tbSppE9dhDVttq2fOQQM6PR76tfpqKpVEyj+rq4w1QWXpQytRk9I0Hk9VFBY\n" - + "+dDsrXWbDe+DR7nJyolvIW8RHoS3INRcYGjxrn/hsrxUE0ExMAjLoZ4al5Izlvty\n" - + "lCTv+Ph1e6AIkBV+EU1Q6At26ggozi75VwWOTcqb9jE60aLV0uoJtNf/QuIJED2a\n" - + "BCnI1XID5KbjwswtSRtys38XdIdfVqj/mWbX2vwGK7XOJCcuALQiVGVzdHVzZXIg\n" - + "U2V2ZW4gPHRlc3Q3QGV4YW1wbGUuY29tPokBOAQTAQIAIgUCViarcQIbAwYLCQgH\n" - + "AwIGFQgCCQoLBBYCAwECHgECF4AACgkQ+tKr4j1sUtC+NAf/QrtoGwZTZT+ubgj6\n" - + "7649roGcVNhAmqDTfinB0PRZ8zcz9eBWHsRGOdH1lWIIxV6P4reRbl3YM1pe7m9W\n" - + "lwPovqONbCIkcHAshyampCsvRN2gKvgXgUpCcFtwfV828/wD+EsMcHeTcRE+8QUi\n" - + "jUCRW4riz+/vJlgcCjBfSviiTid27/ABzQcjUWQCmQB+HXwkNO66Lnd2QqGeQOnt\n" - + "ed+b8SUBliMHtJ6K/E4P292FWJZLHVWG209mjmFLImsRhonm72Gxc1Q3zkPGAuoK\n" - + "ZLW/yfek3WVVj9BNhe2ChxqRCAcYQbROXprfGk2Sf2KGfIKvzSYcLFdPJRQEZ/KB\n" - + "xx6UH50DmARWJqtxAQgArHBdvocZX1CN6kAPJZbsYzFzYlVnulkzax1/zCuCdCpX\n" - + "YbWtz2ACDBNfiO05jS9IpPW8GrT1ldLeqlgeL9bB+3QqRpf9rt7q8ppsNJ+GKXEL\n" - + "Yu4bPb7np/pQ7OOCDB/mTgsVNC+QNRm6bA+Oh4LaGpA7dD/09bf0Loae+wKvkvQx\n" - + "F07c9tUkzuUlo6QxsbCDKwStaCJlcqXEyki998iwsLgEDGeNdoLLrMe4Fw8w9pEy\n" - + "zuwNEHN65NXbCddJ34hdmB2l3WEXtWS5d6fPA6q8EZLroLcgtbRlMVo62CuWgiRO\n" - + "+1gRwkVa/GpaXYX4lDlXp67ZonccgbKv0vVHwxQDoQARAQABAAf5Ae8xa1mPns1E\n" - + "B5yCrvzDl79Dw0F1rED46IWIW/ghpVTzmFHV6ngcvcRFM5TZquxHXSuxLv7YVxRq\n" - + "UVszXNJaEwyJYYkDRwAS1E2IKN+gknwapm2eWkchySAajUsQt+XEYHFpDPtQRlA3\n" - + "Z6PrCOPJDOLmT9Zcf0R6KurGrhvTGrZkKU6ZCFqZWETfZy5cPfq2qxtw3YEUI+eT\n" - + "09AgMmPJ9nDPI3cA69tvy/phVFgpglsS76qgd6uFJ5kcDoIB+YepmJoHnzJeowYt\n" - + "lvnmmyGqmVS/KCgvILaD0c73Dp2X0BN64hSZHa3nUU67WbKJzo2OXr+yr0hvofcf\n" - + "8vhKJe5+2wQAy+rRKSAOPaFiKT8ZenRucx1pTJLoB8JdediOdR4dtXB2Z59Ze7N3\n" - + "sedfrJn1ao+jJEpnKeudlDq7oa9THd7ZojN4gBF/lz0duzfertuQ/MrHaTPeK8YI\n" - + "dEPg3SgYVOLDBptaKmo0xr2f6aslGLPHgxCgzOcLuuUNGKJSigZvhdMEANh7VKsX\n" - + "nb5shZh+KRET84us/uu74q4iIfc8Q10oXuN9+IPlqfAIclo4uMhvo5rtI9ApFtxs\n" - + "oZzqqc+gt+OAbn/fHeb61eT36BA+r61Ka+erxkpWU5r1BPVIqq+biTY/HHchqroJ\n" - + "aw81qWudO9h5a0yP1alDiBSwhZWIMCKzp6Q7A/472amrSzgs7u8ToQ/2THDxaMf3\n" - + "Se0HgMrIT1/+5es2CWiEoZGSZTXlimDYXJULu/DFC7ia7kXOLrMsO85bEi7SHagA\n" - + "eO+mAw3xP3OuNkZDt9x4qtal28fNIz22DH5qg2wtsGdCWXz5C6OdcrtQ736kNxa2\n" - + "5QemZ/0VWxHPnvXz40RtiQEfBBgBAgAJBQJWJqtxAhsMAAoJEPrSq+I9bFLQzQ8H\n" - + "/1FuTj+k1brv64TWXC1ogbu4WIxsmq7yMroyQPwZ1rJ+WuhYRkDHRejD0cvxRpF9\n" - + "5E9NkysNGmOX58khdPmqeUHQU+bNJcAqvemILyaKAFxunmbqFaFzdJwCpY54y32P\n" - + "RNNYeHiEpLxD6Urf3aG3rlwj+SkWHGb0QRpeZqOmU0v/Ybc9WuV8VSAJ06fYNh1V\n" - + "KAmx8GGRyiLLXsbe+q1v5Z7q6WHOJp7hIiuRRKp1iZGOIXK+pnO2YwSgXoJA0JRv\n" - + "U0rROxIN4h0NpxiNTDKrRCPpNpetZxsLeRbQa1agVM0iJfir1s34HqlrD+zw/tcJ\n" - + "bOdMFF2UVZaCuFynNDx958I=\n" - + "=aoJv\n" - + "-----END PGP PRIVATE KEY BLOCK-----\n"); + + "Version: GnuPG v1\n" + + "\n" + + "lQOYBFYmq3EBCAC9ssY6QhFsnZqKEPlQrx8Zomblj8qV93/B448isOT2L6OVY7UC\n" + + "kKPj6afW5UDkYeyZSmLZfTrpePcbAB8FB3uvd/AS9mHC+6zuBlwlkl9xIXlwUXQP\n" + + "KER4LKYNTP21AM+/vTJm4+u26tlZECIZlez31KEeqM30EAm+/pO8VkEp8+1ImfLv\n" + + "otndIjMoq9gxJvn6KZeexJT2eKCsSa20vVsmAhuFjLZitU3lEjIROfDiyHUZ2cZ+\n" + + "qynfppJCKlHJRu/T9L/yxDFVUFDFSajNzSfjG1g3FEveDITyAhRetVfZbhyJptnV\n" + + "jfiHSQkLamPsBmMoKfP+aO5SfsTHTJvxgLUdABEBAAEAB/9AdCtFJSidcolNKwpC\n" + + "/1V+VL9IdYxcWx02CDccjuUkvrgCrL+WcQW2jS/hZMChOKJ2zR78DcBEDr1LF8Xy\n" + + "ZAIC8yoHj15VLUUrFM8fVvYFzt1fq9VWxxRIjscW0teLNgzgdYzYB84RtwcFa2Vi\n" + + "sx2ycTUTYUClEgP1uLMCtX3rnibJh4vR+lVgnDtKSoh4CLAlW6grAAVdw5sSuV7Q\n" + + "i9EJcPezGw1RvBU5PooqNDG6kyw/QqsAS4q3WP4uVJKK1e7S9oqXFEN8k/zfllI0\n" + + "SSkoyP2flzz71rJF/wQMfJ8uf/CelKXd+gPO4FbCWiZSTLe20JR23qiOyvZkfCwg\n" + + "eFmzBADIJUzspDrg5yaqE+HMc8U3O9G9FHoDSweZTbhiq3aK0BqMAn34u0ps6chy\n" + + "VMO6aPWVzgcSHNfTlzpjuN9lwDoimYBH5vZa1HlCHt5eeqTORixkxSerOmILabTi\n" + + "QWq5JPdJwYZiSvK45G5k3G37RTd6/QyhTlRYXj59RXYajrYngwQA8qMZRkRYcTop\n" + + "aG+5M0x44k6NgIyH7Ap+2vRPpDdUlHs+z+6iRvoutkSfKHeZUYBQjgt+tScfn1hM\n" + + "BRB+x146ecmSVh/Dh8yu6uCrhitFlKpyJqNptZo5o+sH41zjefpMd/bc8rtHTw3n\n" + + "GiFl57ZbXbze2O8UimUVgRI2DtOebt8EAJHM/8vZahzF0chzL4sNVAb8FcNYxAyn\n" + + "95VpnWeAtKX7f0bqUvIN4BNV++o6JdMNvBoYEQpKeQIda7QM59hNiS8f/bxkRikF\n" + + "OiHB5YGy2zRX5T1G5rVQ0YqrOu959eEwdGZmOQ8GOqq5B/NoHXUtotV6SGE3R+Tl\n" + + "grlV4U5/PT0fM3KJATcEHwECACEFAlYmq6wXDIABBK6n7S+CETPlsSjR7QYl3EYy\n" + + "iowCBwAACgkQ+tKr4j1sUtDYFgf+Ob63ulm6/xapl1vwWIFr0IV+FxIqNhqsweMH\n" + + "DsbFZkkx3lVHgMKvhP9lIAZEoFEpDa5euSb0fQ08OnRz9QoIe1AwUOepOTsHrebB\n" + + "JHV3tbSppE9dhDVttq2fOQQM6PR76tfpqKpVEyj+rq4w1QWXpQytRk9I0Hk9VFBY\n" + + "+dDsrXWbDe+DR7nJyolvIW8RHoS3INRcYGjxrn/hsrxUE0ExMAjLoZ4al5Izlvty\n" + + "lCTv+Ph1e6AIkBV+EU1Q6At26ggozi75VwWOTcqb9jE60aLV0uoJtNf/QuIJED2a\n" + + "BCnI1XID5KbjwswtSRtys38XdIdfVqj/mWbX2vwGK7XOJCcuALQiVGVzdHVzZXIg\n" + + "U2V2ZW4gPHRlc3Q3QGV4YW1wbGUuY29tPokBOAQTAQIAIgUCViarcQIbAwYLCQgH\n" + + "AwIGFQgCCQoLBBYCAwECHgECF4AACgkQ+tKr4j1sUtC+NAf/QrtoGwZTZT+ubgj6\n" + + "7649roGcVNhAmqDTfinB0PRZ8zcz9eBWHsRGOdH1lWIIxV6P4reRbl3YM1pe7m9W\n" + + "lwPovqONbCIkcHAshyampCsvRN2gKvgXgUpCcFtwfV828/wD+EsMcHeTcRE+8QUi\n" + + "jUCRW4riz+/vJlgcCjBfSviiTid27/ABzQcjUWQCmQB+HXwkNO66Lnd2QqGeQOnt\n" + + "ed+b8SUBliMHtJ6K/E4P292FWJZLHVWG209mjmFLImsRhonm72Gxc1Q3zkPGAuoK\n" + + "ZLW/yfek3WVVj9BNhe2ChxqRCAcYQbROXprfGk2Sf2KGfIKvzSYcLFdPJRQEZ/KB\n" + + "xx6UH50DmARWJqtxAQgArHBdvocZX1CN6kAPJZbsYzFzYlVnulkzax1/zCuCdCpX\n" + + "YbWtz2ACDBNfiO05jS9IpPW8GrT1ldLeqlgeL9bB+3QqRpf9rt7q8ppsNJ+GKXEL\n" + + "Yu4bPb7np/pQ7OOCDB/mTgsVNC+QNRm6bA+Oh4LaGpA7dD/09bf0Loae+wKvkvQx\n" + + "F07c9tUkzuUlo6QxsbCDKwStaCJlcqXEyki998iwsLgEDGeNdoLLrMe4Fw8w9pEy\n" + + "zuwNEHN65NXbCddJ34hdmB2l3WEXtWS5d6fPA6q8EZLroLcgtbRlMVo62CuWgiRO\n" + + "+1gRwkVa/GpaXYX4lDlXp67ZonccgbKv0vVHwxQDoQARAQABAAf5Ae8xa1mPns1E\n" + + "B5yCrvzDl79Dw0F1rED46IWIW/ghpVTzmFHV6ngcvcRFM5TZquxHXSuxLv7YVxRq\n" + + "UVszXNJaEwyJYYkDRwAS1E2IKN+gknwapm2eWkchySAajUsQt+XEYHFpDPtQRlA3\n" + + "Z6PrCOPJDOLmT9Zcf0R6KurGrhvTGrZkKU6ZCFqZWETfZy5cPfq2qxtw3YEUI+eT\n" + + "09AgMmPJ9nDPI3cA69tvy/phVFgpglsS76qgd6uFJ5kcDoIB+YepmJoHnzJeowYt\n" + + "lvnmmyGqmVS/KCgvILaD0c73Dp2X0BN64hSZHa3nUU67WbKJzo2OXr+yr0hvofcf\n" + + "8vhKJe5+2wQAy+rRKSAOPaFiKT8ZenRucx1pTJLoB8JdediOdR4dtXB2Z59Ze7N3\n" + + "sedfrJn1ao+jJEpnKeudlDq7oa9THd7ZojN4gBF/lz0duzfertuQ/MrHaTPeK8YI\n" + + "dEPg3SgYVOLDBptaKmo0xr2f6aslGLPHgxCgzOcLuuUNGKJSigZvhdMEANh7VKsX\n" + + "nb5shZh+KRET84us/uu74q4iIfc8Q10oXuN9+IPlqfAIclo4uMhvo5rtI9ApFtxs\n" + + "oZzqqc+gt+OAbn/fHeb61eT36BA+r61Ka+erxkpWU5r1BPVIqq+biTY/HHchqroJ\n" + + "aw81qWudO9h5a0yP1alDiBSwhZWIMCKzp6Q7A/472amrSzgs7u8ToQ/2THDxaMf3\n" + + "Se0HgMrIT1/+5es2CWiEoZGSZTXlimDYXJULu/DFC7ia7kXOLrMsO85bEi7SHagA\n" + + "eO+mAw3xP3OuNkZDt9x4qtal28fNIz22DH5qg2wtsGdCWXz5C6OdcrtQ736kNxa2\n" + + "5QemZ/0VWxHPnvXz40RtiQEfBBgBAgAJBQJWJqtxAhsMAAoJEPrSq+I9bFLQzQ8H\n" + + "/1FuTj+k1brv64TWXC1ogbu4WIxsmq7yMroyQPwZ1rJ+WuhYRkDHRejD0cvxRpF9\n" + + "5E9NkysNGmOX58khdPmqeUHQU+bNJcAqvemILyaKAFxunmbqFaFzdJwCpY54y32P\n" + + "RNNYeHiEpLxD6Urf3aG3rlwj+SkWHGb0QRpeZqOmU0v/Ybc9WuV8VSAJ06fYNh1V\n" + + "KAmx8GGRyiLLXsbe+q1v5Z7q6WHOJp7hIiuRRKp1iZGOIXK+pnO2YwSgXoJA0JRv\n" + + "U0rROxIN4h0NpxiNTDKrRCPpNpetZxsLeRbQa1agVM0iJfir1s34HqlrD+zw/tcJ\n" + + "bOdMFF2UVZaCuFynNDx958I=\n" + + "=aoJv\n" + + "-----END PGP PRIVATE KEY BLOCK-----\n"); } /** * Key revoked by an expired key, after that key's expiration. - *

- * Revoked by {@link #expiredKey()}. + * + *

Revoked by {@link #expiredKey()}. * *

    * pub   2048R/78BF7D7E 2005-08-01 [revoked: 2015-10-20]
@@ -796,119 +798,120 @@ public class TestKeys {
    * 
*/ public static TestKey keyRevokedByExpiredKeyAfterExpiration() throws Exception { - return new TestKey("-----BEGIN PGP PUBLIC KEY BLOCK-----\n" - + "Version: GnuPG v1\n" - + "\n" - + "mQENBELuRwABCAC56yhFKybBtuKT4nyb7RdLE98pZR54aGjcDcKH3VKVyBF8Z4Kx\n" - + "ptd7Sre0mLPCQiNWVOmCT+JG7GKVE6YeFmyXDUnhX9w4+HAeDEh23S4u9JvwWaF+\n" - + "wlJ6jLq/oe5gdT1F6Y2yqNpQ6CztOw52Ko9KSYz7/1zBMPcCkl/4k15ee4iebVdq\n" - + "c7qT5Qt49Poiozh0DI5prPQ624uckHkz2mXshjWQVuHWwrkIkCJZ2I/KQN2kBjKw\n" - + "/ALxumaWmiB9lQ0nIwLuGzHCh0Xg5RxuCrK8fJp47Aza3ikVuYlNzSxhJVav3OtK\n" - + "gftBihQXUlY3Uy/4QTCeH/BdVs5OALtXL3VhABEBAAGJAS0EIAECABcFAlYmr4kQ\n" - + "HQN0ZXN0OCBub3QgdXNlZAAKCRA87HgbF94azQJ5B/0TeQk7TSChNp+NqCKPTuw0\n" - + "wpflDyc+5ru/Gcs4r358cWzgiLUb3M0Q1+M8CF13BFQdrxT05vjheI9o5PCn3b//\n" - + "AHV8m+QFSnRi2J3QslbvuOqOnipz7vc7lyZ7q1sWNC33YN+ZcGZiMuu5HJi9iadf\n" - + "ZL7AdInpUb4Zb+XKphbMokDcN3yw7rqSMMcx+rKytUAqUnt9qvaSLrIH/zeazxlp\n" - + "YG4jaN53WPfLCcGG+Rw56mW+eCQD2rmzaNHCw8Qr+19sokXLB7OML+rd1wNwZT4q\n" - + "stWnL+nOj8ZkbFV0w3zClDYaARr7H+vTckwVStyDVRbnpRitSAtJwbRDzZBaS4Vx\n" - + "iQE3BB8BAgAhBQJC7lUQFwyAAR2e63ndOLBJk52crzzseBsX3hrNAgcAAAoJEAAa\n" - + "34t4v31+AS4H/0x3Y9E3q9DR5FCuYTXG4BHyrALo2WKoP0CfUWL98Fw9Txl0hF+9\n" - + "5wriNlnmd2zvM0quHs78x4/xehQO88cw0lqPx3RARq/ju5/VbOjoNlcHvfGYZiEd\n" - + "yWOwHu7O8sZrenFDjeDglD6NArrjncOcC51XIPSSTLvVQpSauQ1FS4tan5Q4aWMb\n" - + "s4DzE+Vqu2xMkO/X9toYAZKzyWP29OckpouMbt3GUnS6/o0A8Z7jVX+XOIk3XolP\n" - + "Li9tzTQB12Xl23mgFvearDoguR2Bu2SbmTJtdiXz8L3S54kGvxVqak5uOP2dagzU\n" - + "vBiqR4SVoAdGoXt6TI6mpA+qdYmPMG8v21S0IlRlc3R1c2VyIEVpZ2h0IDx0ZXN0\n" - + "OEBleGFtcGxlLmNvbT6JATgEEwECACIFAkLuRwACGwMGCwkIBwMCBhUIAgkKCwQW\n" - + "AgMBAh4BAheAAAoJEAAa34t4v31+8/sIAIuqd+dU8k9c5VQ12k7IfZGGYQHF2Mk/\n" - + "8FNuP7hFP/VOXBK3QIxIfGEOHbDX6uIxudYMaDmn2UJbdIqJd8NuQByh1gqXdX/x\n" - + "nteUa+4e7U6uTjkp/Ij5UzRed8suINA3NzVOy6qwCu3DTOXIZcjiOZtOA5GTqG6Z\n" - + "naDP0hwDssJp+LXIYTJgsvneJQFGSdQhhJSv19oV0JPSbb6Zc7gEIHtPcaJHjuZQ\n" - + "Ev+TRcRrI9HPTF0MvgOYgIDo2sbcSFV+8moKsHMC+j1Hmuuqgm/1yKGIZrt0V75s\n" - + "D9HYu0tiS3+Wlsry3y1hg/2XBQbwgh6sT/jWkpWar7+uzNxO5GdFYrC5AQ0EQu5H\n" - + "AAEIALPFTedbfyK+9B35Uo9cPsmFa3mT3qp/bAQtnOjiTTTiIO3tu0ALnaBjf6On\n" - + "fAV1HmGz6hRMRK4LGyHkNTaGDNNPoXO7+t9DWycSHmsCL5d5zp7VevQE8MPR8zHK\n" - + "Il2YQlCzdy5TWSUhunKd4guDNZ9GiOS6NQ9feYZ9DQ1kzC8nnu7jLkR2zNT02sYU\n" - + "kuOCZUktQhVNszUlavdIFjvToZo3RPcdb/E3kTTy2R9xi89AXjWZf3lSAZe3igkL\n" - + "jhwsd+u3RRx0ptOJym7zYl5ZdUZk4QrS7FPI6zEBpjawbS4/r6uEW89P3QAkanDI\n" - + "ridIAZP8awLZU3uSPtMwPIJpao0AEQEAAYkBHwQYAQIACQUCQu5HAAIbDAAKCRAA\n" - + "Gt+LeL99fqpHB/wOXhdMNtgeVW38bLk8YhcEB23FW6fDjFjBJb9m/yqRTh5CIeG2\n" - + "bm29ofT4PTamPb8Gt+YuDLnQQ3K2jURakxNDcYwiurvR/oHVdxsBRU7Px7UPeZk3\n" - + "BG5VnIJRT198dF7MWFJ+x5wHbNXwM8DDvUwTjXLH/TlGl1XIheSTHCYd9Pra4ejE\n" - + "ockkrDaZlPCQdTwY+P7K2ieb5tsqNpJkQeBrglF2bemY/CtQHnM9qwa6ZJqkyYNR\n" - + "F1nkSYn36BPuNpytYw1CaQV9GbePugPHtshECLwA160QzqISQUcJlKXttUqUGnoO\n" - + "0d0PyzZT3676mQwmFoebMR9vACAeHjvDxD4F\n" - + "=ihWb\n" - + "-----END PGP PUBLIC KEY BLOCK-----\n", + return new TestKey( + "-----BEGIN PGP PUBLIC KEY BLOCK-----\n" + + "Version: GnuPG v1\n" + + "\n" + + "mQENBELuRwABCAC56yhFKybBtuKT4nyb7RdLE98pZR54aGjcDcKH3VKVyBF8Z4Kx\n" + + "ptd7Sre0mLPCQiNWVOmCT+JG7GKVE6YeFmyXDUnhX9w4+HAeDEh23S4u9JvwWaF+\n" + + "wlJ6jLq/oe5gdT1F6Y2yqNpQ6CztOw52Ko9KSYz7/1zBMPcCkl/4k15ee4iebVdq\n" + + "c7qT5Qt49Poiozh0DI5prPQ624uckHkz2mXshjWQVuHWwrkIkCJZ2I/KQN2kBjKw\n" + + "/ALxumaWmiB9lQ0nIwLuGzHCh0Xg5RxuCrK8fJp47Aza3ikVuYlNzSxhJVav3OtK\n" + + "gftBihQXUlY3Uy/4QTCeH/BdVs5OALtXL3VhABEBAAGJAS0EIAECABcFAlYmr4kQ\n" + + "HQN0ZXN0OCBub3QgdXNlZAAKCRA87HgbF94azQJ5B/0TeQk7TSChNp+NqCKPTuw0\n" + + "wpflDyc+5ru/Gcs4r358cWzgiLUb3M0Q1+M8CF13BFQdrxT05vjheI9o5PCn3b//\n" + + "AHV8m+QFSnRi2J3QslbvuOqOnipz7vc7lyZ7q1sWNC33YN+ZcGZiMuu5HJi9iadf\n" + + "ZL7AdInpUb4Zb+XKphbMokDcN3yw7rqSMMcx+rKytUAqUnt9qvaSLrIH/zeazxlp\n" + + "YG4jaN53WPfLCcGG+Rw56mW+eCQD2rmzaNHCw8Qr+19sokXLB7OML+rd1wNwZT4q\n" + + "stWnL+nOj8ZkbFV0w3zClDYaARr7H+vTckwVStyDVRbnpRitSAtJwbRDzZBaS4Vx\n" + + "iQE3BB8BAgAhBQJC7lUQFwyAAR2e63ndOLBJk52crzzseBsX3hrNAgcAAAoJEAAa\n" + + "34t4v31+AS4H/0x3Y9E3q9DR5FCuYTXG4BHyrALo2WKoP0CfUWL98Fw9Txl0hF+9\n" + + "5wriNlnmd2zvM0quHs78x4/xehQO88cw0lqPx3RARq/ju5/VbOjoNlcHvfGYZiEd\n" + + "yWOwHu7O8sZrenFDjeDglD6NArrjncOcC51XIPSSTLvVQpSauQ1FS4tan5Q4aWMb\n" + + "s4DzE+Vqu2xMkO/X9toYAZKzyWP29OckpouMbt3GUnS6/o0A8Z7jVX+XOIk3XolP\n" + + "Li9tzTQB12Xl23mgFvearDoguR2Bu2SbmTJtdiXz8L3S54kGvxVqak5uOP2dagzU\n" + + "vBiqR4SVoAdGoXt6TI6mpA+qdYmPMG8v21S0IlRlc3R1c2VyIEVpZ2h0IDx0ZXN0\n" + + "OEBleGFtcGxlLmNvbT6JATgEEwECACIFAkLuRwACGwMGCwkIBwMCBhUIAgkKCwQW\n" + + "AgMBAh4BAheAAAoJEAAa34t4v31+8/sIAIuqd+dU8k9c5VQ12k7IfZGGYQHF2Mk/\n" + + "8FNuP7hFP/VOXBK3QIxIfGEOHbDX6uIxudYMaDmn2UJbdIqJd8NuQByh1gqXdX/x\n" + + "nteUa+4e7U6uTjkp/Ij5UzRed8suINA3NzVOy6qwCu3DTOXIZcjiOZtOA5GTqG6Z\n" + + "naDP0hwDssJp+LXIYTJgsvneJQFGSdQhhJSv19oV0JPSbb6Zc7gEIHtPcaJHjuZQ\n" + + "Ev+TRcRrI9HPTF0MvgOYgIDo2sbcSFV+8moKsHMC+j1Hmuuqgm/1yKGIZrt0V75s\n" + + "D9HYu0tiS3+Wlsry3y1hg/2XBQbwgh6sT/jWkpWar7+uzNxO5GdFYrC5AQ0EQu5H\n" + + "AAEIALPFTedbfyK+9B35Uo9cPsmFa3mT3qp/bAQtnOjiTTTiIO3tu0ALnaBjf6On\n" + + "fAV1HmGz6hRMRK4LGyHkNTaGDNNPoXO7+t9DWycSHmsCL5d5zp7VevQE8MPR8zHK\n" + + "Il2YQlCzdy5TWSUhunKd4guDNZ9GiOS6NQ9feYZ9DQ1kzC8nnu7jLkR2zNT02sYU\n" + + "kuOCZUktQhVNszUlavdIFjvToZo3RPcdb/E3kTTy2R9xi89AXjWZf3lSAZe3igkL\n" + + "jhwsd+u3RRx0ptOJym7zYl5ZdUZk4QrS7FPI6zEBpjawbS4/r6uEW89P3QAkanDI\n" + + "ridIAZP8awLZU3uSPtMwPIJpao0AEQEAAYkBHwQYAQIACQUCQu5HAAIbDAAKCRAA\n" + + "Gt+LeL99fqpHB/wOXhdMNtgeVW38bLk8YhcEB23FW6fDjFjBJb9m/yqRTh5CIeG2\n" + + "bm29ofT4PTamPb8Gt+YuDLnQQ3K2jURakxNDcYwiurvR/oHVdxsBRU7Px7UPeZk3\n" + + "BG5VnIJRT198dF7MWFJ+x5wHbNXwM8DDvUwTjXLH/TlGl1XIheSTHCYd9Pra4ejE\n" + + "ockkrDaZlPCQdTwY+P7K2ieb5tsqNpJkQeBrglF2bemY/CtQHnM9qwa6ZJqkyYNR\n" + + "F1nkSYn36BPuNpytYw1CaQV9GbePugPHtshECLwA160QzqISQUcJlKXttUqUGnoO\n" + + "0d0PyzZT3676mQwmFoebMR9vACAeHjvDxD4F\n" + + "=ihWb\n" + + "-----END PGP PUBLIC KEY BLOCK-----\n", "-----BEGIN PGP PRIVATE KEY BLOCK-----\n" - + "Version: GnuPG v1\n" - + "\n" - + "lQOYBELuRwABCAC56yhFKybBtuKT4nyb7RdLE98pZR54aGjcDcKH3VKVyBF8Z4Kx\n" - + "ptd7Sre0mLPCQiNWVOmCT+JG7GKVE6YeFmyXDUnhX9w4+HAeDEh23S4u9JvwWaF+\n" - + "wlJ6jLq/oe5gdT1F6Y2yqNpQ6CztOw52Ko9KSYz7/1zBMPcCkl/4k15ee4iebVdq\n" - + "c7qT5Qt49Poiozh0DI5prPQ624uckHkz2mXshjWQVuHWwrkIkCJZ2I/KQN2kBjKw\n" - + "/ALxumaWmiB9lQ0nIwLuGzHCh0Xg5RxuCrK8fJp47Aza3ikVuYlNzSxhJVav3OtK\n" - + "gftBihQXUlY3Uy/4QTCeH/BdVs5OALtXL3VhABEBAAEAB/wLr88oGuxsoqIHRQZL\n" - + "eGm9jc4aQGmcDMcjpwdGilhrwyfrO6f84hWbQdD+rJcnI8hsH7oOd5ZMGkWfpJyt\n" - + "eUAh9iNB5ChYGfDVSLUg6KojqDtprj6vNMihvLkr/OI6xL/hZksikwfnLFMPpgXU\n" - + "knwPocQ3nn+egsUSL7CR8/SLiIm4MC0brer6jhDxB5LKweExNlfTe4c0MDeYTsWt\n" - + "0WGzNPlvRZQXRotJzqemt3wdNZXUnCKR0n7pSQ8EhZr2O6NXr+mUgp6PIOE/3un2\n" - + "YGiBEf5uy3qEFe7FjEGIHz+Z3ySRdUDfHOk82TKAzynoJIxRUvLIYVNw4eFB3l5U\n" - + "s1w5BADUzfciG7RVLa8UFKJfqQ/5M06QmdS1v1/hMQXg38+3vKe8RgfSSnMJ08Sc\n" - + "eAEsmugwpNXAxgRKHcmWzN3NMBHhE3KiyiogWaMGqmSo6swFpu0+dwMvZSxMlfD+\n" - + "ka/BWt8YsUdrqW06ow39aTgCV+icbNRV81C7NKe7u0X1JDx2CQQA36gbdo62h/Wd\n" - + "gJI8kdz/se3xrt8x6RoWvOnWPNmsZR5XkDqAMTL1dWiEEA/dQTphMcgAe9z3WaP+\n" - + "F1TPAfounbiurGCcS3kxJ5tY7ojyU7nYz4DA/V2OU0C/LUoLXhttG5HM+m/i3qn4\n" - + "K9bBoWIQY1ijliS7cTSwNqd6IHaQGpkEAMnp5GwSGhY+kUuLw06hmH4xnsuf6agz\n" - + "AfhbPylB2nf/ZaX6dt6/mFEAkvQNahcoWEskfS3LGCD8jHm8PvF8K0mciXPDweq2\n" - + "gW3/irE0RXNwn3Oa222VSvcgUlocBm9InkfvpFXh20OYFe3dFH7uYkwUqIHJeXjw\n" - + "TjpXUX/vC5QJQOyJATcEHwECACEFAkLuVRAXDIABHZ7red04sEmTnZyvPOx4Gxfe\n" - + "Gs0CBwAACgkQABrfi3i/fX4BLgf/THdj0Ter0NHkUK5hNcbgEfKsAujZYqg/QJ9R\n" - + "Yv3wXD1PGXSEX73nCuI2WeZ3bO8zSq4ezvzHj/F6FA7zxzDSWo/HdEBGr+O7n9Vs\n" - + "6Og2Vwe98ZhmIR3JY7Ae7s7yxmt6cUON4OCUPo0CuuOdw5wLnVcg9JJMu9VClJq5\n" - + "DUVLi1qflDhpYxuzgPMT5Wq7bEyQ79f22hgBkrPJY/b05ySmi4xu3cZSdLr+jQDx\n" - + "nuNVf5c4iTdeiU8uL23NNAHXZeXbeaAW95qsOiC5HYG7ZJuZMm12JfPwvdLniQa/\n" - + "FWpqTm44/Z1qDNS8GKpHhJWgB0ahe3pMjqakD6p1iY8wby/bVLQiVGVzdHVzZXIg\n" - + "RWlnaHQgPHRlc3Q4QGV4YW1wbGUuY29tPokBOAQTAQIAIgUCQu5HAAIbAwYLCQgH\n" - + "AwIGFQgCCQoLBBYCAwECHgECF4AACgkQABrfi3i/fX7z+wgAi6p351TyT1zlVDXa\n" - + "Tsh9kYZhAcXYyT/wU24/uEU/9U5cErdAjEh8YQ4dsNfq4jG51gxoOafZQlt0iol3\n" - + "w25AHKHWCpd1f/Ge15Rr7h7tTq5OOSn8iPlTNF53yy4g0Dc3NU7LqrAK7cNM5chl\n" - + "yOI5m04DkZOobpmdoM/SHAOywmn4tchhMmCy+d4lAUZJ1CGElK/X2hXQk9Jtvplz\n" - + "uAQge09xokeO5lAS/5NFxGsj0c9MXQy+A5iAgOjaxtxIVX7yagqwcwL6PUea66qC\n" - + "b/XIoYhmu3RXvmwP0di7S2JLf5aWyvLfLWGD/ZcFBvCCHqxP+NaSlZqvv67M3E7k\n" - + "Z0VisJ0DmARC7kcAAQgAs8VN51t/Ir70HflSj1w+yYVreZPeqn9sBC2c6OJNNOIg\n" - + "7e27QAudoGN/o6d8BXUeYbPqFExErgsbIeQ1NoYM00+hc7v630NbJxIeawIvl3nO\n" - + "ntV69ATww9HzMcoiXZhCULN3LlNZJSG6cp3iC4M1n0aI5Lo1D195hn0NDWTMLyee\n" - + "7uMuRHbM1PTaxhSS44JlSS1CFU2zNSVq90gWO9OhmjdE9x1v8TeRNPLZH3GLz0Be\n" - + "NZl/eVIBl7eKCQuOHCx367dFHHSm04nKbvNiXll1RmThCtLsU8jrMQGmNrBtLj+v\n" - + "q4Rbz0/dACRqcMiuJ0gBk/xrAtlTe5I+0zA8gmlqjQARAQABAAf+JNVkZOcGYaQm\n" - + "eI3BMMaBxuCjaMG3ec+p3iFKaR0VHKTIgneXSkQXA+nfGTUT4DpjAznN2GLYH6D+\n" - + "6i7MCGPm9NT4C7KUcHJoltTLjrlf7vVyNHEhRCZO/pBh9+2mpO6xh799x+wj88u5\n" - + "XAqlah50OjJFkjfk70VsrPWqWvgwLejkaQpGbE+pdL+vjy+ol5FHzidzmJvsXDR1\n" - + "I1as0vBu5g2XPpexyVanmHJglZdZX07OPYQBhxQKuPXT/2/IRnXsXEpitk4IyJT0\n" - + "U5D/iedEUldhBByep1lBcJnAap0CP7iuu2CYhRp6V2wVvdweNPng5Eo7f7LNyjnX\n" - + "UMAeaeCjAQQA1A0iKtg3Grxc9+lpFl1znc2/kO3p6ixM13uUvci+yGFNJJninnxo\n" - + "99KXEzqqVD0zerjiyyegQmzpITE/+hFIOJZInxEH08WQwZstV/KYeRSJkXf0Um48\n" - + "E+Zrh8fpJVW1w3ZCw9Ee2yE6fEhAA4w66+50pM+vBXanWOrG1HDrkxEEANkHc2Rz\n" - + "YJsO4v63xo/7/njLSQ31miOglb99ACKBA0Yl/jvj2KqLcomKILqvK3DKP+BHNq86\n" - + "LUBUglyKjKuj0wkSWT0tCnfgLzysUpowcoyFhJ36KzAz8hjqIn3TQpMF21HvkZdG\n" - + "Mtkcyhu5UDvbfOuWOBaKIeNQWCWv1rNzMme9A/9zU1+esEhKwGWEqa3/B/Te/xQh\n" - + "alk180n74sTZid6lXD8o8cEei0CUq7zBSV0P8v6kk8PP9/XyLRl3Rqa95fESUWrL\n" - + "xD6TBY1JlHBZS+N6rN/7Ilf5EXSELmnbDFsVxkNGp4elKxajvZxC6uEWYBu62AYy\n" - + "wS0dj8mZR3faCEps90YXiQEfBBgBAgAJBQJC7kcAAhsMAAoJEAAa34t4v31+qkcH\n" - + "/A5eF0w22B5VbfxsuTxiFwQHbcVbp8OMWMElv2b/KpFOHkIh4bZubb2h9Pg9NqY9\n" - + "vwa35i4MudBDcraNRFqTE0NxjCK6u9H+gdV3GwFFTs/HtQ95mTcEblWcglFPX3x0\n" - + "XsxYUn7HnAds1fAzwMO9TBONcsf9OUaXVciF5JMcJh30+trh6MShySSsNpmU8JB1\n" - + "PBj4/sraJ5vm2yo2kmRB4GuCUXZt6Zj8K1Aecz2rBrpkmqTJg1EXWeRJiffoE+42\n" - + "nK1jDUJpBX0Zt4+6A8e2yEQIvADXrRDOohJBRwmUpe21SpQaeg7R3Q/LNlPfrvqZ\n" - + "DCYWh5sxH28AIB4eO8PEPgU=\n" - + "=cSfw\n" - + "-----END PGP PRIVATE KEY BLOCK-----\n"); + + "Version: GnuPG v1\n" + + "\n" + + "lQOYBELuRwABCAC56yhFKybBtuKT4nyb7RdLE98pZR54aGjcDcKH3VKVyBF8Z4Kx\n" + + "ptd7Sre0mLPCQiNWVOmCT+JG7GKVE6YeFmyXDUnhX9w4+HAeDEh23S4u9JvwWaF+\n" + + "wlJ6jLq/oe5gdT1F6Y2yqNpQ6CztOw52Ko9KSYz7/1zBMPcCkl/4k15ee4iebVdq\n" + + "c7qT5Qt49Poiozh0DI5prPQ624uckHkz2mXshjWQVuHWwrkIkCJZ2I/KQN2kBjKw\n" + + "/ALxumaWmiB9lQ0nIwLuGzHCh0Xg5RxuCrK8fJp47Aza3ikVuYlNzSxhJVav3OtK\n" + + "gftBihQXUlY3Uy/4QTCeH/BdVs5OALtXL3VhABEBAAEAB/wLr88oGuxsoqIHRQZL\n" + + "eGm9jc4aQGmcDMcjpwdGilhrwyfrO6f84hWbQdD+rJcnI8hsH7oOd5ZMGkWfpJyt\n" + + "eUAh9iNB5ChYGfDVSLUg6KojqDtprj6vNMihvLkr/OI6xL/hZksikwfnLFMPpgXU\n" + + "knwPocQ3nn+egsUSL7CR8/SLiIm4MC0brer6jhDxB5LKweExNlfTe4c0MDeYTsWt\n" + + "0WGzNPlvRZQXRotJzqemt3wdNZXUnCKR0n7pSQ8EhZr2O6NXr+mUgp6PIOE/3un2\n" + + "YGiBEf5uy3qEFe7FjEGIHz+Z3ySRdUDfHOk82TKAzynoJIxRUvLIYVNw4eFB3l5U\n" + + "s1w5BADUzfciG7RVLa8UFKJfqQ/5M06QmdS1v1/hMQXg38+3vKe8RgfSSnMJ08Sc\n" + + "eAEsmugwpNXAxgRKHcmWzN3NMBHhE3KiyiogWaMGqmSo6swFpu0+dwMvZSxMlfD+\n" + + "ka/BWt8YsUdrqW06ow39aTgCV+icbNRV81C7NKe7u0X1JDx2CQQA36gbdo62h/Wd\n" + + "gJI8kdz/se3xrt8x6RoWvOnWPNmsZR5XkDqAMTL1dWiEEA/dQTphMcgAe9z3WaP+\n" + + "F1TPAfounbiurGCcS3kxJ5tY7ojyU7nYz4DA/V2OU0C/LUoLXhttG5HM+m/i3qn4\n" + + "K9bBoWIQY1ijliS7cTSwNqd6IHaQGpkEAMnp5GwSGhY+kUuLw06hmH4xnsuf6agz\n" + + "AfhbPylB2nf/ZaX6dt6/mFEAkvQNahcoWEskfS3LGCD8jHm8PvF8K0mciXPDweq2\n" + + "gW3/irE0RXNwn3Oa222VSvcgUlocBm9InkfvpFXh20OYFe3dFH7uYkwUqIHJeXjw\n" + + "TjpXUX/vC5QJQOyJATcEHwECACEFAkLuVRAXDIABHZ7red04sEmTnZyvPOx4Gxfe\n" + + "Gs0CBwAACgkQABrfi3i/fX4BLgf/THdj0Ter0NHkUK5hNcbgEfKsAujZYqg/QJ9R\n" + + "Yv3wXD1PGXSEX73nCuI2WeZ3bO8zSq4ezvzHj/F6FA7zxzDSWo/HdEBGr+O7n9Vs\n" + + "6Og2Vwe98ZhmIR3JY7Ae7s7yxmt6cUON4OCUPo0CuuOdw5wLnVcg9JJMu9VClJq5\n" + + "DUVLi1qflDhpYxuzgPMT5Wq7bEyQ79f22hgBkrPJY/b05ySmi4xu3cZSdLr+jQDx\n" + + "nuNVf5c4iTdeiU8uL23NNAHXZeXbeaAW95qsOiC5HYG7ZJuZMm12JfPwvdLniQa/\n" + + "FWpqTm44/Z1qDNS8GKpHhJWgB0ahe3pMjqakD6p1iY8wby/bVLQiVGVzdHVzZXIg\n" + + "RWlnaHQgPHRlc3Q4QGV4YW1wbGUuY29tPokBOAQTAQIAIgUCQu5HAAIbAwYLCQgH\n" + + "AwIGFQgCCQoLBBYCAwECHgECF4AACgkQABrfi3i/fX7z+wgAi6p351TyT1zlVDXa\n" + + "Tsh9kYZhAcXYyT/wU24/uEU/9U5cErdAjEh8YQ4dsNfq4jG51gxoOafZQlt0iol3\n" + + "w25AHKHWCpd1f/Ge15Rr7h7tTq5OOSn8iPlTNF53yy4g0Dc3NU7LqrAK7cNM5chl\n" + + "yOI5m04DkZOobpmdoM/SHAOywmn4tchhMmCy+d4lAUZJ1CGElK/X2hXQk9Jtvplz\n" + + "uAQge09xokeO5lAS/5NFxGsj0c9MXQy+A5iAgOjaxtxIVX7yagqwcwL6PUea66qC\n" + + "b/XIoYhmu3RXvmwP0di7S2JLf5aWyvLfLWGD/ZcFBvCCHqxP+NaSlZqvv67M3E7k\n" + + "Z0VisJ0DmARC7kcAAQgAs8VN51t/Ir70HflSj1w+yYVreZPeqn9sBC2c6OJNNOIg\n" + + "7e27QAudoGN/o6d8BXUeYbPqFExErgsbIeQ1NoYM00+hc7v630NbJxIeawIvl3nO\n" + + "ntV69ATww9HzMcoiXZhCULN3LlNZJSG6cp3iC4M1n0aI5Lo1D195hn0NDWTMLyee\n" + + "7uMuRHbM1PTaxhSS44JlSS1CFU2zNSVq90gWO9OhmjdE9x1v8TeRNPLZH3GLz0Be\n" + + "NZl/eVIBl7eKCQuOHCx367dFHHSm04nKbvNiXll1RmThCtLsU8jrMQGmNrBtLj+v\n" + + "q4Rbz0/dACRqcMiuJ0gBk/xrAtlTe5I+0zA8gmlqjQARAQABAAf+JNVkZOcGYaQm\n" + + "eI3BMMaBxuCjaMG3ec+p3iFKaR0VHKTIgneXSkQXA+nfGTUT4DpjAznN2GLYH6D+\n" + + "6i7MCGPm9NT4C7KUcHJoltTLjrlf7vVyNHEhRCZO/pBh9+2mpO6xh799x+wj88u5\n" + + "XAqlah50OjJFkjfk70VsrPWqWvgwLejkaQpGbE+pdL+vjy+ol5FHzidzmJvsXDR1\n" + + "I1as0vBu5g2XPpexyVanmHJglZdZX07OPYQBhxQKuPXT/2/IRnXsXEpitk4IyJT0\n" + + "U5D/iedEUldhBByep1lBcJnAap0CP7iuu2CYhRp6V2wVvdweNPng5Eo7f7LNyjnX\n" + + "UMAeaeCjAQQA1A0iKtg3Grxc9+lpFl1znc2/kO3p6ixM13uUvci+yGFNJJninnxo\n" + + "99KXEzqqVD0zerjiyyegQmzpITE/+hFIOJZInxEH08WQwZstV/KYeRSJkXf0Um48\n" + + "E+Zrh8fpJVW1w3ZCw9Ee2yE6fEhAA4w66+50pM+vBXanWOrG1HDrkxEEANkHc2Rz\n" + + "YJsO4v63xo/7/njLSQ31miOglb99ACKBA0Yl/jvj2KqLcomKILqvK3DKP+BHNq86\n" + + "LUBUglyKjKuj0wkSWT0tCnfgLzysUpowcoyFhJ36KzAz8hjqIn3TQpMF21HvkZdG\n" + + "Mtkcyhu5UDvbfOuWOBaKIeNQWCWv1rNzMme9A/9zU1+esEhKwGWEqa3/B/Te/xQh\n" + + "alk180n74sTZid6lXD8o8cEei0CUq7zBSV0P8v6kk8PP9/XyLRl3Rqa95fESUWrL\n" + + "xD6TBY1JlHBZS+N6rN/7Ilf5EXSELmnbDFsVxkNGp4elKxajvZxC6uEWYBu62AYy\n" + + "wS0dj8mZR3faCEps90YXiQEfBBgBAgAJBQJC7kcAAhsMAAoJEAAa34t4v31+qkcH\n" + + "/A5eF0w22B5VbfxsuTxiFwQHbcVbp8OMWMElv2b/KpFOHkIh4bZubb2h9Pg9NqY9\n" + + "vwa35i4MudBDcraNRFqTE0NxjCK6u9H+gdV3GwFFTs/HtQ95mTcEblWcglFPX3x0\n" + + "XsxYUn7HnAds1fAzwMO9TBONcsf9OUaXVciF5JMcJh30+trh6MShySSsNpmU8JB1\n" + + "PBj4/sraJ5vm2yo2kmRB4GuCUXZt6Zj8K1Aecz2rBrpkmqTJg1EXWeRJiffoE+42\n" + + "nK1jDUJpBX0Zt4+6A8e2yEQIvADXrRDOohJBRwmUpe21SpQaeg7R3Q/LNlPfrvqZ\n" + + "DCYWh5sxH28AIB4eO8PEPgU=\n" + + "=cSfw\n" + + "-----END PGP PRIVATE KEY BLOCK-----\n"); } /** * Key revoked by an expired key, before that key's expiration. - *

- * Revoked by {@link #expiredKey()}. + * + *

Revoked by {@link #expiredKey()}. * *

    * pub   2048R/C43BF2E1 2005-08-01 [revoked: 2005-08-01]
@@ -917,112 +920,113 @@ public class TestKeys {
    * 
*/ public static TestKey keyRevokedByExpiredKeyBeforeExpiration() throws Exception { - return new TestKey("-----BEGIN PGP PUBLIC KEY BLOCK-----\n" - + "Version: GnuPG v1\n" - + "\n" - + "mQENBELuRwABCADnf2z5dqp3BMFlpd6iUs5dhROrslfzswak1LmbGirK2IPIl4NX\n" - + "arAi76xXK9BcF/Cqcj/X/WqFKBd/qMGxwdvwbSN6PVBP6T1jvuVgrPTjd4x5xPUD\n" - + "xZ5VPy9hgQXs+1mugTkHYVTU8GI1eGpZ8Oj3PJIgVyqGxGkjWmcz5APbVIRan6L1\n" - + "482bZTidH9Nd9YnYlXNgiJcaOPAVBwO/j/myocQCIohvIo4IT8vc/ODhRgfwA0gD\n" - + "GVK+tXwT4f4x3qjG/YRpOOZZjBS09B/gJ9QfEnR6WNxg/Tm3T0uipoISOhR+cP/V\n" - + "e5o/73SM+w+WlILk/xpbbOfyCxD4Q3lb8EZFABEBAAGJAS0EIAECABcFAkLuYyAQ\n" - + "HQN0ZXN0OSBub3QgdXNlZAAKCRA87HgbF94azV2BB/9Rc1j3XOxKbDyUFAORAGnE\n" - + "ezQtpOmQhaSUhFC35GFOdTg4eX53FTFSXLJQleTVzvE+eVkQI5tvUZ+SqHoyjnhU\n" - + "DpWlmfRUQy4GTUjUTkpFOK07TVTjhUQwaAxN13UZgByopVKc7hLf+uh1xkRJIqAJ\n" - + "Tx6LIFZiSIGwStDO6TJlhl1e8h45J3rAV4N+DsGpMy9S4uYOU7erJDupdXK739/l\n" - + "VBsP2SeT85iuAv+4A9Jq3+iq+cjK9q3QZCw1O6iI2v3seAWCI6HH3tVw4THr+M6T\n" - + "EdTGmyESjdAl+f7/uK0QNfqIMpvUf+AvMakrLi7WOeDs8mpUIjonpeQVLfz6I0Zo\n" - + "iQE3BB8BAgAhBQJC7lUQFwyAAR2e63ndOLBJk52crzzseBsX3hrNAgcAAAoJEGBA\n" - + "hmHEO/LhHjUH/R/7+iNBLAfKYbpprkWy/8eXVEJhxfh6DI/ppsKLIA+687gX74R9\n" - + "6CM5k6fZDjeND26ZEA0rDZmYrbnGUfsu55aeM0/+jiSOZJ2uTlrLXiHMurbNY0pT\n" - + "xv215muhumPBzuL1jsAK2Kc/4oE7Z46jaStsPCvDOcx9PW76wR8/uCPvHVz5H/A7\n" - + "3erXAloC43jupXwZB32VZq8L0kZNVfuEsjHUcu3GUoZdGfTb4/Qq5a1FK+CGhwWC\n" - + "OwpUWZEIUImwUv4FNE4iNFYEHaHLU9fotmIxIkH8TC4NcO+GvkEyMyJ6NVkBBDP2\n" - + "EarncWAJxDBlx1CO4ET+/ULvzDnAcYuTc6G0IVRlc3R1c2VyIE5pbmUgPHRlc3Q5\n" - + "QGV4YW1wbGUuY29tPokBOAQTAQIAIgUCQu5HAAIbAwYLCQgHAwIGFQgCCQoLBBYC\n" - + "AwECHgECF4AACgkQYECGYcQ78uG78ggA1TjeOZtaXjXNG8Bx2sl4W+ypylWWB6yc\n" - + "IeR0suLhVlisZ33yOtV4MsvZw0TJNyYmFXiskPTyOcP8RJjS+a41IHc33i13MUnN\n" - + "RI5cqhqsWRhf9chlm7XqXtqv57IjojG9vgSUeZdXSTMdHIDDHAjJ/ryBXflzprSw\n" - + "2Sab8OXjLkyo9z6ZytFyfXSc8TNiWU6Duollh/bWIsgPETIe2wGn8LcFiVMfPpsI\n" - + "RhkphOdTJb+W/zQwLHUcS22A4xsJtBxIXTH/QSG3lAaw8IRbl25EIpaEAF+gExCr\n" - + "QM0haAVMmGgYYWpMHXrDhB7ff3kAiqD2qmhSySA6NLmTO+6qGPYJg7kBDQRC7kcA\n" - + "AQgA2wqE3DypQhTcYl26dXc9DZzABRQa6KFRqQbhmUBz95cQpAamQjrwOyl2fg84\n" - + "b9o9t+DuZcdLzLF/gPVSznOcNUV9mJNdLAxBPPOMUrP/+Snb83FkNpCscrXhIqSf\n" - + "BU5D+FOb3bEI2WTJ7lLe8oCrWPE3JIDVCrpAWgZk9puAk1Z7ZFaHsS6ezsZP0YIM\n" - + "qTWdoX0zHMPMnr9GG08c0mniXtvfcgtOCeIRU4WZws28sGYCoLeQXsHVDal+gcLp\n" - + "1enPh6dfEWBJuhhBBajzm53fzV2a7khEdffggVVylHPLpvms2nIqoearDQtVNpSK\n" - + "uhNiykJSMIUn/Y6g5LMySmL+MwARAQABiQEfBBgBAgAJBQJC7kcAAhsMAAoJEGBA\n" - + "hmHEO/LhdwcH/0wAxT1NGaR2boMjpTouVUcnEcEzHc0dSwuu+06mLRggSdAfBC8C\n" - + "9fdlAYHQ5tp1sRuPwLfQZjo8wLxJ+wLASnIPLaGrtpEHkIKvDwHqwkOXvXeGD/Bh\n" - + "40NbJUa7Ec3Jpo+FPFlM8hDsUyHf8IhUAdRd4d+znOVEaZ6S7c1RrtoVTUqzi59n\n" - + "nC6ZewL/Jp+znKZlMTM3X1onAGhd+/XdrS52LM8pE3xRjbTLTYWcjnjyLbm0yoO8\n" - + "G3yCfIibAaII4a/jGON2X9ZUwaFNIqJ4iIc8Nme86rD/flXsu6Zv+NXVQWylrIG/\n" - + "REW68wsnWjwTtrPG8bqo6cCsOzqGYVt81eU=\n" - + "=FnZg\n" - + "-----END PGP PUBLIC KEY BLOCK-----\n", + return new TestKey( + "-----BEGIN PGP PUBLIC KEY BLOCK-----\n" + + "Version: GnuPG v1\n" + + "\n" + + "mQENBELuRwABCADnf2z5dqp3BMFlpd6iUs5dhROrslfzswak1LmbGirK2IPIl4NX\n" + + "arAi76xXK9BcF/Cqcj/X/WqFKBd/qMGxwdvwbSN6PVBP6T1jvuVgrPTjd4x5xPUD\n" + + "xZ5VPy9hgQXs+1mugTkHYVTU8GI1eGpZ8Oj3PJIgVyqGxGkjWmcz5APbVIRan6L1\n" + + "482bZTidH9Nd9YnYlXNgiJcaOPAVBwO/j/myocQCIohvIo4IT8vc/ODhRgfwA0gD\n" + + "GVK+tXwT4f4x3qjG/YRpOOZZjBS09B/gJ9QfEnR6WNxg/Tm3T0uipoISOhR+cP/V\n" + + "e5o/73SM+w+WlILk/xpbbOfyCxD4Q3lb8EZFABEBAAGJAS0EIAECABcFAkLuYyAQ\n" + + "HQN0ZXN0OSBub3QgdXNlZAAKCRA87HgbF94azV2BB/9Rc1j3XOxKbDyUFAORAGnE\n" + + "ezQtpOmQhaSUhFC35GFOdTg4eX53FTFSXLJQleTVzvE+eVkQI5tvUZ+SqHoyjnhU\n" + + "DpWlmfRUQy4GTUjUTkpFOK07TVTjhUQwaAxN13UZgByopVKc7hLf+uh1xkRJIqAJ\n" + + "Tx6LIFZiSIGwStDO6TJlhl1e8h45J3rAV4N+DsGpMy9S4uYOU7erJDupdXK739/l\n" + + "VBsP2SeT85iuAv+4A9Jq3+iq+cjK9q3QZCw1O6iI2v3seAWCI6HH3tVw4THr+M6T\n" + + "EdTGmyESjdAl+f7/uK0QNfqIMpvUf+AvMakrLi7WOeDs8mpUIjonpeQVLfz6I0Zo\n" + + "iQE3BB8BAgAhBQJC7lUQFwyAAR2e63ndOLBJk52crzzseBsX3hrNAgcAAAoJEGBA\n" + + "hmHEO/LhHjUH/R/7+iNBLAfKYbpprkWy/8eXVEJhxfh6DI/ppsKLIA+687gX74R9\n" + + "6CM5k6fZDjeND26ZEA0rDZmYrbnGUfsu55aeM0/+jiSOZJ2uTlrLXiHMurbNY0pT\n" + + "xv215muhumPBzuL1jsAK2Kc/4oE7Z46jaStsPCvDOcx9PW76wR8/uCPvHVz5H/A7\n" + + "3erXAloC43jupXwZB32VZq8L0kZNVfuEsjHUcu3GUoZdGfTb4/Qq5a1FK+CGhwWC\n" + + "OwpUWZEIUImwUv4FNE4iNFYEHaHLU9fotmIxIkH8TC4NcO+GvkEyMyJ6NVkBBDP2\n" + + "EarncWAJxDBlx1CO4ET+/ULvzDnAcYuTc6G0IVRlc3R1c2VyIE5pbmUgPHRlc3Q5\n" + + "QGV4YW1wbGUuY29tPokBOAQTAQIAIgUCQu5HAAIbAwYLCQgHAwIGFQgCCQoLBBYC\n" + + "AwECHgECF4AACgkQYECGYcQ78uG78ggA1TjeOZtaXjXNG8Bx2sl4W+ypylWWB6yc\n" + + "IeR0suLhVlisZ33yOtV4MsvZw0TJNyYmFXiskPTyOcP8RJjS+a41IHc33i13MUnN\n" + + "RI5cqhqsWRhf9chlm7XqXtqv57IjojG9vgSUeZdXSTMdHIDDHAjJ/ryBXflzprSw\n" + + "2Sab8OXjLkyo9z6ZytFyfXSc8TNiWU6Duollh/bWIsgPETIe2wGn8LcFiVMfPpsI\n" + + "RhkphOdTJb+W/zQwLHUcS22A4xsJtBxIXTH/QSG3lAaw8IRbl25EIpaEAF+gExCr\n" + + "QM0haAVMmGgYYWpMHXrDhB7ff3kAiqD2qmhSySA6NLmTO+6qGPYJg7kBDQRC7kcA\n" + + "AQgA2wqE3DypQhTcYl26dXc9DZzABRQa6KFRqQbhmUBz95cQpAamQjrwOyl2fg84\n" + + "b9o9t+DuZcdLzLF/gPVSznOcNUV9mJNdLAxBPPOMUrP/+Snb83FkNpCscrXhIqSf\n" + + "BU5D+FOb3bEI2WTJ7lLe8oCrWPE3JIDVCrpAWgZk9puAk1Z7ZFaHsS6ezsZP0YIM\n" + + "qTWdoX0zHMPMnr9GG08c0mniXtvfcgtOCeIRU4WZws28sGYCoLeQXsHVDal+gcLp\n" + + "1enPh6dfEWBJuhhBBajzm53fzV2a7khEdffggVVylHPLpvms2nIqoearDQtVNpSK\n" + + "uhNiykJSMIUn/Y6g5LMySmL+MwARAQABiQEfBBgBAgAJBQJC7kcAAhsMAAoJEGBA\n" + + "hmHEO/LhdwcH/0wAxT1NGaR2boMjpTouVUcnEcEzHc0dSwuu+06mLRggSdAfBC8C\n" + + "9fdlAYHQ5tp1sRuPwLfQZjo8wLxJ+wLASnIPLaGrtpEHkIKvDwHqwkOXvXeGD/Bh\n" + + "40NbJUa7Ec3Jpo+FPFlM8hDsUyHf8IhUAdRd4d+znOVEaZ6S7c1RrtoVTUqzi59n\n" + + "nC6ZewL/Jp+znKZlMTM3X1onAGhd+/XdrS52LM8pE3xRjbTLTYWcjnjyLbm0yoO8\n" + + "G3yCfIibAaII4a/jGON2X9ZUwaFNIqJ4iIc8Nme86rD/flXsu6Zv+NXVQWylrIG/\n" + + "REW68wsnWjwTtrPG8bqo6cCsOzqGYVt81eU=\n" + + "=FnZg\n" + + "-----END PGP PUBLIC KEY BLOCK-----\n", "-----BEGIN PGP PRIVATE KEY BLOCK-----\n" - + "Version: GnuPG v1\n" - + "\n" - + "lQOYBELuRwABCADnf2z5dqp3BMFlpd6iUs5dhROrslfzswak1LmbGirK2IPIl4NX\n" - + "arAi76xXK9BcF/Cqcj/X/WqFKBd/qMGxwdvwbSN6PVBP6T1jvuVgrPTjd4x5xPUD\n" - + "xZ5VPy9hgQXs+1mugTkHYVTU8GI1eGpZ8Oj3PJIgVyqGxGkjWmcz5APbVIRan6L1\n" - + "482bZTidH9Nd9YnYlXNgiJcaOPAVBwO/j/myocQCIohvIo4IT8vc/ODhRgfwA0gD\n" - + "GVK+tXwT4f4x3qjG/YRpOOZZjBS09B/gJ9QfEnR6WNxg/Tm3T0uipoISOhR+cP/V\n" - + "e5o/73SM+w+WlILk/xpbbOfyCxD4Q3lb8EZFABEBAAEAB/9GTcWLkUU9tf0B4LjX\n" - + "NSyk7ChIKXZadVEcN9pSR0Udq1mCTrk9kBID2iPNqWmyvjaBnQbUkoqJ+93/EAIa\n" - + "+NPRlWOD2SEN07ioFS5WCNCqUAEibfU2+woVu4WpJ+TjzoWy4F2wZxe7P3Gj6Xjq\n" - + "7aXih8uc9Lveh8GiUe8rrCCbt+BH1RzuV/khZw+2ZDPMCx7yfcfKobc3NWx75WLh\n" - + "pki512fawSC6eJHRI50ilPrqAmmhcccfwPji9P+oPj2S6wlhe5kp3R5yU85fWy3b\n" - + "C8AtLTfZIn4v6NAtBaurGEjRjzeNEGMJHxnRPWvFc4iD+xvPg6SNPJM/bbTE+yZ3\n" - + "16W1BADxjAQLMuGpemaVmOpZ3K02hcNjwniEK2QPp11BnfoQCIwegON+sUD/6AuZ\n" - + "S1vOVvS3//eGbPaMM45FK/SQAVHpC9IOL4Tql0C8B6csRhFL824yPfc3WDb4kayQ\n" - + "T5oLjlJ0W2r7tWcBcREEzZT6gNi4KI7C4oFF6tU9lsQJuQyAbwQA9Vl6VW/7oG0W\n" - + "CC+lcHJc+4rxUB3yak7d4mEccTNb+crOBRH/7dKZOe7A6Fz+ra++MmucDUzsAx0K\n" - + "MGT9Xoi5+CBBaNr+Y2lB9fF20N7eRNzQ3Xrz2OPl4cmU4gfECTZ1vZaKlmB+Vt8C\n" - + "E/nn49QGRI+BNBOdW+2aEpPoENczFosEAJXi5Cn2l0jOswDD7FU2PER1wfVY629i\n" - + "bICunudOSo64GKQslKkQWktc57DgdOQnH15qW1nVO7Z4H0GBxjSTRCu7Z7q08/qM\n" - + "ueWIvJ85HcFhOCl+vITOn0fZV0p8/IwsWz8G9h5bb2QgMAwDSdhnLuK/cXaGM09w\n" - + "n6k8O2rCvDtXRjqJATcEHwECACEFAkLuVRAXDIABHZ7red04sEmTnZyvPOx4Gxfe\n" - + "Gs0CBwAACgkQYECGYcQ78uEeNQf9H/v6I0EsB8phummuRbL/x5dUQmHF+HoMj+mm\n" - + "wosgD7rzuBfvhH3oIzmTp9kON40PbpkQDSsNmZitucZR+y7nlp4zT/6OJI5kna5O\n" - + "WsteIcy6ts1jSlPG/bXma6G6Y8HO4vWOwArYpz/igTtnjqNpK2w8K8M5zH09bvrB\n" - + "Hz+4I+8dXPkf8Dvd6tcCWgLjeO6lfBkHfZVmrwvSRk1V+4SyMdRy7cZShl0Z9Nvj\n" - + "9CrlrUUr4IaHBYI7ClRZkQhQibBS/gU0TiI0VgQdoctT1+i2YjEiQfxMLg1w74a+\n" - + "QTIzIno1WQEEM/YRqudxYAnEMGXHUI7gRP79Qu/MOcBxi5NzobQhVGVzdHVzZXIg\n" - + "TmluZSA8dGVzdDlAZXhhbXBsZS5jb20+iQE4BBMBAgAiBQJC7kcAAhsDBgsJCAcD\n" - + "AgYVCAIJCgsEFgIDAQIeAQIXgAAKCRBgQIZhxDvy4bvyCADVON45m1peNc0bwHHa\n" - + "yXhb7KnKVZYHrJwh5HSy4uFWWKxnffI61Xgyy9nDRMk3JiYVeKyQ9PI5w/xEmNL5\n" - + "rjUgdzfeLXcxSc1EjlyqGqxZGF/1yGWbtepe2q/nsiOiMb2+BJR5l1dJMx0cgMMc\n" - + "CMn+vIFd+XOmtLDZJpvw5eMuTKj3PpnK0XJ9dJzxM2JZToO6iWWH9tYiyA8RMh7b\n" - + "AafwtwWJUx8+mwhGGSmE51Mlv5b/NDAsdRxLbYDjGwm0HEhdMf9BIbeUBrDwhFuX\n" - + "bkQiloQAX6ATEKtAzSFoBUyYaBhhakwdesOEHt9/eQCKoPaqaFLJIDo0uZM77qoY\n" - + "9gmDnQOYBELuRwABCADbCoTcPKlCFNxiXbp1dz0NnMAFFBrooVGpBuGZQHP3lxCk\n" - + "BqZCOvA7KXZ+Dzhv2j234O5lx0vMsX+A9VLOc5w1RX2Yk10sDEE884xSs//5Kdvz\n" - + "cWQ2kKxyteEipJ8FTkP4U5vdsQjZZMnuUt7ygKtY8TckgNUKukBaBmT2m4CTVntk\n" - + "VoexLp7Oxk/RggypNZ2hfTMcw8yev0YbTxzSaeJe299yC04J4hFThZnCzbywZgKg\n" - + "t5BewdUNqX6BwunV6c+Hp18RYEm6GEEFqPObnd/NXZruSER19+CBVXKUc8um+aza\n" - + "ciqh5qsNC1U2lIq6E2LKQlIwhSf9jqDkszJKYv4zABEBAAEAB/0c76POOw6aazUT\n" - + "TZHUnhQ+WHHJefbKuoeWI7w+dD7y+02NzaRoZW7XnJ+fAZW8Dlb5k/O1FayUIEgE\n" - + "GjnT336dpE4g5NQkfdifG7Fy5NKGRkWx6viJI3g/OHsYX3+ebNDFMmO0gq7067/9\n" - + "WuHsTpvUMRwkF1zi1j4AETjZ7IBXdjuSCSu8OhEwr3d+WXibEmY5ec/d24l/APJx\n" - + "c3RMHw9PiDQeAKrByS6N10/yFgRpnouVx3wC7zFmhVewNV476Nyg34OvRoc+lCtk\n" - + "ixKdua6KuUJzGRWxgw+q2JD4goXxe0v2qU2KSU63gOYi0kg9tpwpn98lDNQykgmJ\n" - + "aQYdNIZJBADdlbkg9qbH1DREs7UF4jXN/SoYRbTh9639GfA4zkbfPmh/RmVIIEKd\n" - + "QN7qWK/Xy1bUS9vDzRfFgmoYGtqMmygOOFsVtfm8Y18lSXopN/3vhtai+dn+04Ef\n" - + "dl1irmGvm3p7y9Jh3s6uYTEJok0MywA7qBHvgSTVtc1PcZc6j6Bz1QQA/Q+nqyZY\n" - + "fLimt4KVYO1y6kSHgEqzggLTxyfGMW5RplTA0V1zCwjM6S+QWNqRxVNdB9Kkzn+S\n" - + "YDKHLYs8lXO2zvf8Yk9M7glgqvT4rJ51Zn2rc6lg1YUwFBXup5idTsuZwtqkvvKJ\n" - + "eS7L3cSBCqJMRjk47Y3V8zkrrN/HcYmyFecD/A+HPf4eSweUS025Bb+eCk4gTHbR\n" - + "uwmnKq7npk2XY4m0A/QdYF9dEWlpadsAr+ZwNQB3f21nQgKG0BudfL4FmpeW9RMt\n" - + "35aSIaV7RkxYOt5HEvjFRvLbeL1YYaj+D0dvz8SP1AUPvpWIVlQ03OjRlPyrPW50\n" - + "LoqyP8PTb6svnHvmQseJAR8EGAECAAkFAkLuRwACGwwACgkQYECGYcQ78uF3Bwf/\n" - + "TADFPU0ZpHZugyOlOi5VRycRwTMdzR1LC677TqYtGCBJ0B8ELwL192UBgdDm2nWx\n" - + "G4/At9BmOjzAvEn7AsBKcg8toau2kQeQgq8PAerCQ5e9d4YP8GHjQ1slRrsRzcmm\n" - + "j4U8WUzyEOxTId/wiFQB1F3h37Oc5URpnpLtzVGu2hVNSrOLn2ecLpl7Av8mn7Oc\n" - + "pmUxMzdfWicAaF379d2tLnYszykTfFGNtMtNhZyOePItubTKg7wbfIJ8iJsBogjh\n" - + "r+MY43Zf1lTBoU0ioniIhzw2Z7zqsP9+Vey7pm/41dVBbKWsgb9ERbrzCydaPBO2\n" - + "s8bxuqjpwKw7OoZhW3zV5Q==\n" - + "=JxsF\n" - + "-----END PGP PRIVATE KEY BLOCK-----\n"); + + "Version: GnuPG v1\n" + + "\n" + + "lQOYBELuRwABCADnf2z5dqp3BMFlpd6iUs5dhROrslfzswak1LmbGirK2IPIl4NX\n" + + "arAi76xXK9BcF/Cqcj/X/WqFKBd/qMGxwdvwbSN6PVBP6T1jvuVgrPTjd4x5xPUD\n" + + "xZ5VPy9hgQXs+1mugTkHYVTU8GI1eGpZ8Oj3PJIgVyqGxGkjWmcz5APbVIRan6L1\n" + + "482bZTidH9Nd9YnYlXNgiJcaOPAVBwO/j/myocQCIohvIo4IT8vc/ODhRgfwA0gD\n" + + "GVK+tXwT4f4x3qjG/YRpOOZZjBS09B/gJ9QfEnR6WNxg/Tm3T0uipoISOhR+cP/V\n" + + "e5o/73SM+w+WlILk/xpbbOfyCxD4Q3lb8EZFABEBAAEAB/9GTcWLkUU9tf0B4LjX\n" + + "NSyk7ChIKXZadVEcN9pSR0Udq1mCTrk9kBID2iPNqWmyvjaBnQbUkoqJ+93/EAIa\n" + + "+NPRlWOD2SEN07ioFS5WCNCqUAEibfU2+woVu4WpJ+TjzoWy4F2wZxe7P3Gj6Xjq\n" + + "7aXih8uc9Lveh8GiUe8rrCCbt+BH1RzuV/khZw+2ZDPMCx7yfcfKobc3NWx75WLh\n" + + "pki512fawSC6eJHRI50ilPrqAmmhcccfwPji9P+oPj2S6wlhe5kp3R5yU85fWy3b\n" + + "C8AtLTfZIn4v6NAtBaurGEjRjzeNEGMJHxnRPWvFc4iD+xvPg6SNPJM/bbTE+yZ3\n" + + "16W1BADxjAQLMuGpemaVmOpZ3K02hcNjwniEK2QPp11BnfoQCIwegON+sUD/6AuZ\n" + + "S1vOVvS3//eGbPaMM45FK/SQAVHpC9IOL4Tql0C8B6csRhFL824yPfc3WDb4kayQ\n" + + "T5oLjlJ0W2r7tWcBcREEzZT6gNi4KI7C4oFF6tU9lsQJuQyAbwQA9Vl6VW/7oG0W\n" + + "CC+lcHJc+4rxUB3yak7d4mEccTNb+crOBRH/7dKZOe7A6Fz+ra++MmucDUzsAx0K\n" + + "MGT9Xoi5+CBBaNr+Y2lB9fF20N7eRNzQ3Xrz2OPl4cmU4gfECTZ1vZaKlmB+Vt8C\n" + + "E/nn49QGRI+BNBOdW+2aEpPoENczFosEAJXi5Cn2l0jOswDD7FU2PER1wfVY629i\n" + + "bICunudOSo64GKQslKkQWktc57DgdOQnH15qW1nVO7Z4H0GBxjSTRCu7Z7q08/qM\n" + + "ueWIvJ85HcFhOCl+vITOn0fZV0p8/IwsWz8G9h5bb2QgMAwDSdhnLuK/cXaGM09w\n" + + "n6k8O2rCvDtXRjqJATcEHwECACEFAkLuVRAXDIABHZ7red04sEmTnZyvPOx4Gxfe\n" + + "Gs0CBwAACgkQYECGYcQ78uEeNQf9H/v6I0EsB8phummuRbL/x5dUQmHF+HoMj+mm\n" + + "wosgD7rzuBfvhH3oIzmTp9kON40PbpkQDSsNmZitucZR+y7nlp4zT/6OJI5kna5O\n" + + "WsteIcy6ts1jSlPG/bXma6G6Y8HO4vWOwArYpz/igTtnjqNpK2w8K8M5zH09bvrB\n" + + "Hz+4I+8dXPkf8Dvd6tcCWgLjeO6lfBkHfZVmrwvSRk1V+4SyMdRy7cZShl0Z9Nvj\n" + + "9CrlrUUr4IaHBYI7ClRZkQhQibBS/gU0TiI0VgQdoctT1+i2YjEiQfxMLg1w74a+\n" + + "QTIzIno1WQEEM/YRqudxYAnEMGXHUI7gRP79Qu/MOcBxi5NzobQhVGVzdHVzZXIg\n" + + "TmluZSA8dGVzdDlAZXhhbXBsZS5jb20+iQE4BBMBAgAiBQJC7kcAAhsDBgsJCAcD\n" + + "AgYVCAIJCgsEFgIDAQIeAQIXgAAKCRBgQIZhxDvy4bvyCADVON45m1peNc0bwHHa\n" + + "yXhb7KnKVZYHrJwh5HSy4uFWWKxnffI61Xgyy9nDRMk3JiYVeKyQ9PI5w/xEmNL5\n" + + "rjUgdzfeLXcxSc1EjlyqGqxZGF/1yGWbtepe2q/nsiOiMb2+BJR5l1dJMx0cgMMc\n" + + "CMn+vIFd+XOmtLDZJpvw5eMuTKj3PpnK0XJ9dJzxM2JZToO6iWWH9tYiyA8RMh7b\n" + + "AafwtwWJUx8+mwhGGSmE51Mlv5b/NDAsdRxLbYDjGwm0HEhdMf9BIbeUBrDwhFuX\n" + + "bkQiloQAX6ATEKtAzSFoBUyYaBhhakwdesOEHt9/eQCKoPaqaFLJIDo0uZM77qoY\n" + + "9gmDnQOYBELuRwABCADbCoTcPKlCFNxiXbp1dz0NnMAFFBrooVGpBuGZQHP3lxCk\n" + + "BqZCOvA7KXZ+Dzhv2j234O5lx0vMsX+A9VLOc5w1RX2Yk10sDEE884xSs//5Kdvz\n" + + "cWQ2kKxyteEipJ8FTkP4U5vdsQjZZMnuUt7ygKtY8TckgNUKukBaBmT2m4CTVntk\n" + + "VoexLp7Oxk/RggypNZ2hfTMcw8yev0YbTxzSaeJe299yC04J4hFThZnCzbywZgKg\n" + + "t5BewdUNqX6BwunV6c+Hp18RYEm6GEEFqPObnd/NXZruSER19+CBVXKUc8um+aza\n" + + "ciqh5qsNC1U2lIq6E2LKQlIwhSf9jqDkszJKYv4zABEBAAEAB/0c76POOw6aazUT\n" + + "TZHUnhQ+WHHJefbKuoeWI7w+dD7y+02NzaRoZW7XnJ+fAZW8Dlb5k/O1FayUIEgE\n" + + "GjnT336dpE4g5NQkfdifG7Fy5NKGRkWx6viJI3g/OHsYX3+ebNDFMmO0gq7067/9\n" + + "WuHsTpvUMRwkF1zi1j4AETjZ7IBXdjuSCSu8OhEwr3d+WXibEmY5ec/d24l/APJx\n" + + "c3RMHw9PiDQeAKrByS6N10/yFgRpnouVx3wC7zFmhVewNV476Nyg34OvRoc+lCtk\n" + + "ixKdua6KuUJzGRWxgw+q2JD4goXxe0v2qU2KSU63gOYi0kg9tpwpn98lDNQykgmJ\n" + + "aQYdNIZJBADdlbkg9qbH1DREs7UF4jXN/SoYRbTh9639GfA4zkbfPmh/RmVIIEKd\n" + + "QN7qWK/Xy1bUS9vDzRfFgmoYGtqMmygOOFsVtfm8Y18lSXopN/3vhtai+dn+04Ef\n" + + "dl1irmGvm3p7y9Jh3s6uYTEJok0MywA7qBHvgSTVtc1PcZc6j6Bz1QQA/Q+nqyZY\n" + + "fLimt4KVYO1y6kSHgEqzggLTxyfGMW5RplTA0V1zCwjM6S+QWNqRxVNdB9Kkzn+S\n" + + "YDKHLYs8lXO2zvf8Yk9M7glgqvT4rJ51Zn2rc6lg1YUwFBXup5idTsuZwtqkvvKJ\n" + + "eS7L3cSBCqJMRjk47Y3V8zkrrN/HcYmyFecD/A+HPf4eSweUS025Bb+eCk4gTHbR\n" + + "uwmnKq7npk2XY4m0A/QdYF9dEWlpadsAr+ZwNQB3f21nQgKG0BudfL4FmpeW9RMt\n" + + "35aSIaV7RkxYOt5HEvjFRvLbeL1YYaj+D0dvz8SP1AUPvpWIVlQ03OjRlPyrPW50\n" + + "LoqyP8PTb6svnHvmQseJAR8EGAECAAkFAkLuRwACGwwACgkQYECGYcQ78uF3Bwf/\n" + + "TADFPU0ZpHZugyOlOi5VRycRwTMdzR1LC677TqYtGCBJ0B8ELwL192UBgdDm2nWx\n" + + "G4/At9BmOjzAvEn7AsBKcg8toau2kQeQgq8PAerCQ5e9d4YP8GHjQ1slRrsRzcmm\n" + + "j4U8WUzyEOxTId/wiFQB1F3h37Oc5URpnpLtzVGu2hVNSrOLn2ecLpl7Av8mn7Oc\n" + + "pmUxMzdfWicAaF379d2tLnYszykTfFGNtMtNhZyOePItubTKg7wbfIJ8iJsBogjh\n" + + "r+MY43Zf1lTBoU0ioniIhzw2Z7zqsP9+Vey7pm/41dVBbKWsgb9ERbrzCydaPBO2\n" + + "s8bxuqjpwKw7OoZhW3zV5Q==\n" + + "=JxsF\n" + + "-----END PGP PRIVATE KEY BLOCK-----\n"); } } diff --git a/gerrit-gpg/src/test/java/com/google/gerrit/gpg/testutil/TestTrustKeys.java b/gerrit-gpg/src/test/java/com/google/gerrit/gpg/testutil/TestTrustKeys.java index 55bb9c2e47..a469075843 100644 --- a/gerrit-gpg/src/test/java/com/google/gerrit/gpg/testutil/TestTrustKeys.java +++ b/gerrit-gpg/src/test/java/com/google/gerrit/gpg/testutil/TestTrustKeys.java @@ -16,9 +16,10 @@ package com.google.gerrit.gpg.testutil; /** * Test keys specific to web-of-trust checks. - *

- * In the following diagrams, the notation M---N indicates N trusts - * M, and an 'x' indicates the key is expired. + * + *

In the following diagrams, the notation M---N indicates N trusts M, and an 'x' + * indicates the key is expired. + * *

* *

@@ -37,1011 +38,1002 @@ package com.google.gerrit.gpg.testutil;
  */
 public class TestTrustKeys {
   /**
-   * pub   2048R/9FD0D396 2010-08-29
-   *       Key fingerprint = E401 17FC 4BF4 17BD 8F93  DEB1 D25A D07A 9FD0 D396
-   * uid                  Testuser A <testa@example.com>
-   * sub   2048R/F5C099DB 2010-08-29
+   * pub 2048R/9FD0D396 2010-08-29 Key fingerprint = E401 17FC 4BF4 17BD 8F93 DEB1 D25A D07A 9FD0
+   * D396 uid Testuser A <testa@example.com> sub 2048R/F5C099DB 2010-08-29
    */
   public static TestKey keyA() throws Exception {
-    return new TestKey("-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
-        + "Version: GnuPG v1\n"
-        + "\n"
-        + "mQENBEx6npoBCACp0vHePNPeLzm0HM35i70bRChyZXu/ARxOHZHNbh6hWJkq5saI\n"
-        + "zuzZoaqXAr3xZwHftTULlkgoJIt40x6VCT8EBnUHTkOqoHTsFnXg2kNuhFvmn0OX\n"
-        + "7RQFlR1SGoQG4fEy6t/GlOwEknpNSIMLkbDMP2FzEkLVWtlIe2hqqawVIgqzyO3k\n"
-        + "HaQxW8gWyyTx0qeSdSi4DyFZIzdyu/aZa7sj/MhO3DB3UwubW6yE+PMcAVrJD+0d\n"
-        + "EToMT7i8Erncc+xEzuXAoQUHaQfOXV4DG5qSgVpKaLxJ/ABWUri0eMPhj0cT4iDx\n"
-        + "eNTL7cZ4h72B1uJs8byDN74PHrypNiVE+IRHABEBAAG0HlRlc3R1c2VyIEEgPHRl\n"
-        + "c3RhQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTHqemgIbAwYLCQgHAwIGFQgCCQoL\n"
-        + "BBYCAwECHgECF4AACgkQ0lrQep/Q05ZxMAf+OoRzXWbGfv7kZb7xdrVyAUTAV4bU\n"
-        + "UvLoJZUIQ1ckPBcty2LUvY7l9efgp3c57nvTD6U98dVnsKfaW4PT0CRXlpl1IFyh\n"
-        + "kgbInFS5rO+cJMQn1KyC+FfiwyGNii630SwiHyWRG5+XQ6Iptx9JELwWUMCLJxFp\n"
-        + "B8DZQKlNnvdl+YUgEeQOkWTXfTSaBATdXHiZhskiumnTOGO24jSg8CrZc5O/n6fC\n"
-        + "CgEsAFWL7fnO0ii6EW1JH5btLHPxL9QI+5DJIypgOhGI1lqZW9KrpfmJ3w6N1Gek\n"
-        + "GBda98DmzxxxZ9iyq1cELAAiQMjkvws67cOs/hwXNn9YaK74dzhb49MLGIkBIAQQ\n"
-        + "AQIACgUCTHqf0QMFAXgACgkQV2Bph7AH1JCO/Qf+PBJqeWS7p32+K5r1cA7AeCB2\n"
-        + "pcHs78wLjnSxuimf0l+JItb9JQAKjzcdZTKVGkUivkq3zhsPCCtssgSav2wlG59F\n"
-        + "TaqtpGOxvGjc8TKWHW1TrPhV86wh0yUempKTMWfdZ0RAJVG3krAj60bzUsQNK41/\n"
-        + "0EZi4JI+sm/TRlwQcmEzdaGxhFSJqiJyaBWbPL8AQNA2iRyjMKNeGCrgapEl2IkW\n"
-        + "2ST+/yUPI/485LS0uU1+TLB+NhiJ6j5PoiVqYD+ul8WJ+cy1vvcp1GCQpbRv1yXY\n"
-        + "4GB1mw0JPIinVE1q+eKKQxN38zARPqyupiIuBQaqX9NCHCAdNtFc3kJQ7Nm83YkB\n"
-        + "IAQQAQIACgUCTHqkCwMFAXgACgkQZB8Rk9JP5GfGVQgArMBVQo3AD56p4g5A+DRA\n"
-        + "h0KdQMt4hs/dl+2GLAi+nK0wwuHrHvr9kcZNiQNMtu+YiwvxMpJ/JvXRwOp4wbEx\n"
-        + "6P6Uzp18R2sqbV4agnL5tXFZXfsa3OR2NLm56Ox1ReHnZtAcC6qa1nHqt9z2sTt1\n"
-        + "vh7IfK8GDU/3M3z4XBXPpmpZPAczqujuO/yshz84O6oc3noXfRUJRklbkhNC3WyS\n"
-        + "u5+3nupq4GwIYehQQpxBTD9xXj4hl3KfUnctg/MkgUGweEK3oZ22kObTLJttTP9t\n"
-        + "9q/hLkVyDtFhGorcsYbNZyupm3xhddzYovkReePwOO4WA7VeRqRdiYDU1UjIKvv4\n"
-        + "TrkBDQRMep6aAQgA3NQtBhS8yiEGN8rT4hGtuuprVd5jQVprLz4ImcI2+Gt71+CR\n"
-        + "gv/BZ0zzFp3VPjTGRusungJYkKKOGpEpERiqEG1X/ZyL7EzoyT+iKIMDsVJgmyDN\n"
-        + "cryHTejlKA8Z6GQ1hPlOIws22oLq5zQXxD9pzMDuabHl/s/bYlU5qXc7LhxdtrmT\n"
-        + "b2uBP9a+eneWKrz8OfgtS5m9DgqJ6Bjl0TvbeVJgKHX42pqzJlBTCn3hJjJosy8x\n"
-        + "4qTbqMraENnl9y+qynM7atoHX6TPWsD7vWtWvi+FA5OWGEe3rof8o/sJSj05DQUn\n"
-        + "i8mmSiCYW/tUklPPXOvPRP0GZ/GhBzIUtE3jBwARAQABiQEfBBgBAgAJBQJMep6a\n"
-        + "AhsMAAoJENJa0Hqf0NOW/gkH/jm9FL+S53NjrthdbNjffryhp7KhTmYAsRk3Hc3X\n"
-        + "4TBj3upecarJynpvsz5HlLi/OxDRR6L2yfjKk6/2iKAbV56mdnnu5xG3TG8++naL\n"
-        + "7n/s9TGBhgknb6+vGhSMZ/1dpQ6wkiyuEmgKJo8DzHAh3k3VATHiBeSD7fNSsgtK\n"
-        + "gzK0hi53IFRFDDPYiCca+SS6/pA2zF56JWGETiIa8rSHIQaK4hNJ38vgKOZM80vQ\n"
-        + "fp+CxvJkYY71Yc94oQByaQzrXod7xnukp5SXe/N3BYTFCWoaSTRUI/THRywWwKqa\n"
-        + "rUsttYrqs/EQSy0X3kZ7CAm04uzA8csNyxapEVRvJxbrt5I=\n"
-        + "=DAMW\n"
-        + "-----END PGP PUBLIC KEY BLOCK-----\n",
+    return new TestKey(
+        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "mQENBEx6npoBCACp0vHePNPeLzm0HM35i70bRChyZXu/ARxOHZHNbh6hWJkq5saI\n"
+            + "zuzZoaqXAr3xZwHftTULlkgoJIt40x6VCT8EBnUHTkOqoHTsFnXg2kNuhFvmn0OX\n"
+            + "7RQFlR1SGoQG4fEy6t/GlOwEknpNSIMLkbDMP2FzEkLVWtlIe2hqqawVIgqzyO3k\n"
+            + "HaQxW8gWyyTx0qeSdSi4DyFZIzdyu/aZa7sj/MhO3DB3UwubW6yE+PMcAVrJD+0d\n"
+            + "EToMT7i8Erncc+xEzuXAoQUHaQfOXV4DG5qSgVpKaLxJ/ABWUri0eMPhj0cT4iDx\n"
+            + "eNTL7cZ4h72B1uJs8byDN74PHrypNiVE+IRHABEBAAG0HlRlc3R1c2VyIEEgPHRl\n"
+            + "c3RhQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTHqemgIbAwYLCQgHAwIGFQgCCQoL\n"
+            + "BBYCAwECHgECF4AACgkQ0lrQep/Q05ZxMAf+OoRzXWbGfv7kZb7xdrVyAUTAV4bU\n"
+            + "UvLoJZUIQ1ckPBcty2LUvY7l9efgp3c57nvTD6U98dVnsKfaW4PT0CRXlpl1IFyh\n"
+            + "kgbInFS5rO+cJMQn1KyC+FfiwyGNii630SwiHyWRG5+XQ6Iptx9JELwWUMCLJxFp\n"
+            + "B8DZQKlNnvdl+YUgEeQOkWTXfTSaBATdXHiZhskiumnTOGO24jSg8CrZc5O/n6fC\n"
+            + "CgEsAFWL7fnO0ii6EW1JH5btLHPxL9QI+5DJIypgOhGI1lqZW9KrpfmJ3w6N1Gek\n"
+            + "GBda98DmzxxxZ9iyq1cELAAiQMjkvws67cOs/hwXNn9YaK74dzhb49MLGIkBIAQQ\n"
+            + "AQIACgUCTHqf0QMFAXgACgkQV2Bph7AH1JCO/Qf+PBJqeWS7p32+K5r1cA7AeCB2\n"
+            + "pcHs78wLjnSxuimf0l+JItb9JQAKjzcdZTKVGkUivkq3zhsPCCtssgSav2wlG59F\n"
+            + "TaqtpGOxvGjc8TKWHW1TrPhV86wh0yUempKTMWfdZ0RAJVG3krAj60bzUsQNK41/\n"
+            + "0EZi4JI+sm/TRlwQcmEzdaGxhFSJqiJyaBWbPL8AQNA2iRyjMKNeGCrgapEl2IkW\n"
+            + "2ST+/yUPI/485LS0uU1+TLB+NhiJ6j5PoiVqYD+ul8WJ+cy1vvcp1GCQpbRv1yXY\n"
+            + "4GB1mw0JPIinVE1q+eKKQxN38zARPqyupiIuBQaqX9NCHCAdNtFc3kJQ7Nm83YkB\n"
+            + "IAQQAQIACgUCTHqkCwMFAXgACgkQZB8Rk9JP5GfGVQgArMBVQo3AD56p4g5A+DRA\n"
+            + "h0KdQMt4hs/dl+2GLAi+nK0wwuHrHvr9kcZNiQNMtu+YiwvxMpJ/JvXRwOp4wbEx\n"
+            + "6P6Uzp18R2sqbV4agnL5tXFZXfsa3OR2NLm56Ox1ReHnZtAcC6qa1nHqt9z2sTt1\n"
+            + "vh7IfK8GDU/3M3z4XBXPpmpZPAczqujuO/yshz84O6oc3noXfRUJRklbkhNC3WyS\n"
+            + "u5+3nupq4GwIYehQQpxBTD9xXj4hl3KfUnctg/MkgUGweEK3oZ22kObTLJttTP9t\n"
+            + "9q/hLkVyDtFhGorcsYbNZyupm3xhddzYovkReePwOO4WA7VeRqRdiYDU1UjIKvv4\n"
+            + "TrkBDQRMep6aAQgA3NQtBhS8yiEGN8rT4hGtuuprVd5jQVprLz4ImcI2+Gt71+CR\n"
+            + "gv/BZ0zzFp3VPjTGRusungJYkKKOGpEpERiqEG1X/ZyL7EzoyT+iKIMDsVJgmyDN\n"
+            + "cryHTejlKA8Z6GQ1hPlOIws22oLq5zQXxD9pzMDuabHl/s/bYlU5qXc7LhxdtrmT\n"
+            + "b2uBP9a+eneWKrz8OfgtS5m9DgqJ6Bjl0TvbeVJgKHX42pqzJlBTCn3hJjJosy8x\n"
+            + "4qTbqMraENnl9y+qynM7atoHX6TPWsD7vWtWvi+FA5OWGEe3rof8o/sJSj05DQUn\n"
+            + "i8mmSiCYW/tUklPPXOvPRP0GZ/GhBzIUtE3jBwARAQABiQEfBBgBAgAJBQJMep6a\n"
+            + "AhsMAAoJENJa0Hqf0NOW/gkH/jm9FL+S53NjrthdbNjffryhp7KhTmYAsRk3Hc3X\n"
+            + "4TBj3upecarJynpvsz5HlLi/OxDRR6L2yfjKk6/2iKAbV56mdnnu5xG3TG8++naL\n"
+            + "7n/s9TGBhgknb6+vGhSMZ/1dpQ6wkiyuEmgKJo8DzHAh3k3VATHiBeSD7fNSsgtK\n"
+            + "gzK0hi53IFRFDDPYiCca+SS6/pA2zF56JWGETiIa8rSHIQaK4hNJ38vgKOZM80vQ\n"
+            + "fp+CxvJkYY71Yc94oQByaQzrXod7xnukp5SXe/N3BYTFCWoaSTRUI/THRywWwKqa\n"
+            + "rUsttYrqs/EQSy0X3kZ7CAm04uzA8csNyxapEVRvJxbrt5I=\n"
+            + "=DAMW\n"
+            + "-----END PGP PUBLIC KEY BLOCK-----\n",
         "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
-        + "Version: GnuPG v1\n"
-        + "\n"
-        + "lQOYBEx6npoBCACp0vHePNPeLzm0HM35i70bRChyZXu/ARxOHZHNbh6hWJkq5saI\n"
-        + "zuzZoaqXAr3xZwHftTULlkgoJIt40x6VCT8EBnUHTkOqoHTsFnXg2kNuhFvmn0OX\n"
-        + "7RQFlR1SGoQG4fEy6t/GlOwEknpNSIMLkbDMP2FzEkLVWtlIe2hqqawVIgqzyO3k\n"
-        + "HaQxW8gWyyTx0qeSdSi4DyFZIzdyu/aZa7sj/MhO3DB3UwubW6yE+PMcAVrJD+0d\n"
-        + "EToMT7i8Erncc+xEzuXAoQUHaQfOXV4DG5qSgVpKaLxJ/ABWUri0eMPhj0cT4iDx\n"
-        + "eNTL7cZ4h72B1uJs8byDN74PHrypNiVE+IRHABEBAAEAB/9BbaG9Bz9zd0tqjrx2\n"
-        + "u/VQR3qz1FCQXtuqZu8RMC+B5zIf2si71clf8c7ZHnfSxWZt65Ez1SMYwDeyBdje\n"
-        + "/7B1Gw3Ekk00tFxHx0GEL2NSdZE4sbynkHIp0nD4/HlIc41rmh08E405F7wiAWFn\n"
-        + "uCpfDr47SNpR/A4BxHYOvi8r9pBxn/fXiHluqYROit0Z4tfKDCvQ47k+wqVD5nOt\n"
-        + "BEbHDfEwUMibgTuJ1qPyHf6HDlSdTQSfYV8QW1/UbHWus9QikfjGfLJpX0Rv3UG+\n"
-        + "WXHmowpRDVixj74UQCYXQ/AZi/OBlcS8PRY6EZV4RLyEWlZrdzKViNLOTUbJNHvA\n"
-        + "ZAQVBADQND7CIO6z4k8e9Z8Lf4iLWP9iIbH9R7ArTZr2mX1vkwp+sk0BNQurL/BQ\n"
-        + "jUHOJZnouwkc+C3pQi/JvGvAe1fLHPA0+NKe/tcuDXMk+L1HH6XmDgKtByac41AR\n"
-        + "txxqhaECNeK9OKXAXaEvenkGFMcqQV3QMiF2q5VlmFxSSXydEwQA0M8tCowz0iZF\n"
-        + "i3fGuuZDTN3Ut4u6Uf9FiLcR4ye2Aa5ppO8vlNjObNqpHz0UqdDjB+e3O/n7BUx3\n"
-        + "A5PRZNQvcMbhgr2U3zjWvFMHS3YuxbuIaZ1Vj69vpOAGkUc98v4i0/3Lk7Lijpto\n"
-        + "n40S0eCVo+eccHA4HRvS5XSdNGHVJn0EAMzfBt3DalOlHm+PrAiZdVdp5IfbJwJv\n"
-        + "xkyI++0p4VaYTZhOxjswTs6vgv30FBmHAlx1FzoUOKLaOhxPyLgamFd9YG+ab4DK\n"
-        + "chc4TxIj3kkx3/m6JufW8DWhKyAJNZ/MW+Iqop5pUIeTbOBlNyaflK+XxjkP71rP\n"
-        + "2gZx4pjYjK5EPDy0HlRlc3R1c2VyIEEgPHRlc3RhQGV4YW1wbGUuY29tPokBOAQT\n"
-        + "AQIAIgUCTHqemgIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ0lrQep/Q\n"
-        + "05ZxMAf+OoRzXWbGfv7kZb7xdrVyAUTAV4bUUvLoJZUIQ1ckPBcty2LUvY7l9efg\n"
-        + "p3c57nvTD6U98dVnsKfaW4PT0CRXlpl1IFyhkgbInFS5rO+cJMQn1KyC+FfiwyGN\n"
-        + "ii630SwiHyWRG5+XQ6Iptx9JELwWUMCLJxFpB8DZQKlNnvdl+YUgEeQOkWTXfTSa\n"
-        + "BATdXHiZhskiumnTOGO24jSg8CrZc5O/n6fCCgEsAFWL7fnO0ii6EW1JH5btLHPx\n"
-        + "L9QI+5DJIypgOhGI1lqZW9KrpfmJ3w6N1GekGBda98DmzxxxZ9iyq1cELAAiQMjk\n"
-        + "vws67cOs/hwXNn9YaK74dzhb49MLGJ0DmARMep6aAQgA3NQtBhS8yiEGN8rT4hGt\n"
-        + "uuprVd5jQVprLz4ImcI2+Gt71+CRgv/BZ0zzFp3VPjTGRusungJYkKKOGpEpERiq\n"
-        + "EG1X/ZyL7EzoyT+iKIMDsVJgmyDNcryHTejlKA8Z6GQ1hPlOIws22oLq5zQXxD9p\n"
-        + "zMDuabHl/s/bYlU5qXc7LhxdtrmTb2uBP9a+eneWKrz8OfgtS5m9DgqJ6Bjl0Tvb\n"
-        + "eVJgKHX42pqzJlBTCn3hJjJosy8x4qTbqMraENnl9y+qynM7atoHX6TPWsD7vWtW\n"
-        + "vi+FA5OWGEe3rof8o/sJSj05DQUni8mmSiCYW/tUklPPXOvPRP0GZ/GhBzIUtE3j\n"
-        + "BwARAQABAAf+KQOPSS3Y0oHHsd0N9VLrPWgEf3JKZPzyI1gWKNiVdRYhbjrbS8VM\n"
-        + "mm8ERxMRY/hRSyKrCdXNtS87zVtgkThPfbWRPh0xL7YpFhenena63Ng78RPqlIDH\n"
-        + "cITs6r/DRBI4jnXvOTr/+R2Pm1llgKF2ePzsSt0rpmPcjyrdBsiKSUnLGxm4tGtW\n"
-        + "wVoEjy3+MRN2ULyTO8Pe4URKTtUkkb23iuQuJZy+k+SfH+H0/3oEb8ERRE3UXNG7\n"
-        + "BIbaj71nsx8+H8+x8ffRm1s5Unn86AJ418oEhxNzQk59NnrrlJ4HH9NNbjjzI3JE\n"
-        + "intSQKhFJsvMARdzX062yartQtnm1v6jwQQA65rpMMHCoh9pxvL6yagw3WjQLEPw\n"
-        + "vOGpD9ossBvcv/SfAe7SgJsx6J6X0IIW6EKIjyRhWTIfK/rVR0cmUFTGStib+y22\n"
-        + "BPcQmt/Oiw9rdUfOmDrnosPC0SB+19tKw1v1AfW5swpJnGBCkGz9UfX4Fr/eTS3e\n"
-        + "2KaMq+r1KALSUVkEAO/x0SWOiBRH3X1ETNE9nLTP6u2W3TAvrd+dXyP7JjXWZPB8\n"
-        + "NOwT7qidvUlhTbxdR7xWNI1W924Ywwgs43cAPGyq95pjdzhvi0Xxab7124UK+MS3\n"
-        + "V4WBvjOYYW8pkdMOydRLETXSkco2mDCRTiVKe3Zi7p+lKlVJj4xrFUPUnetfBADH\n"
-        + "EPwYeeZ8sQnW644J75eoph2e5KLRJaOy5GMPRLNmq+ODtJxdoIGpfQnEA35nSlze\n"
-        + "Ea+1UvLBlWyF+p08bNfnXHp3j5ugucAYbVEs4ptUwTB3vFt7eJ8rkx9GYcuBFiwm\n"
-        + "H47rg7QmS1mWDLyX6v2pI9brsb1SCgBL+oi9CyjypkjqiQEfBBgBAgAJBQJMep6a\n"
-        + "AhsMAAoJENJa0Hqf0NOW/gkH/jm9FL+S53NjrthdbNjffryhp7KhTmYAsRk3Hc3X\n"
-        + "4TBj3upecarJynpvsz5HlLi/OxDRR6L2yfjKk6/2iKAbV56mdnnu5xG3TG8++naL\n"
-        + "7n/s9TGBhgknb6+vGhSMZ/1dpQ6wkiyuEmgKJo8DzHAh3k3VATHiBeSD7fNSsgtK\n"
-        + "gzK0hi53IFRFDDPYiCca+SS6/pA2zF56JWGETiIa8rSHIQaK4hNJ38vgKOZM80vQ\n"
-        + "fp+CxvJkYY71Yc94oQByaQzrXod7xnukp5SXe/N3BYTFCWoaSTRUI/THRywWwKqa\n"
-        + "rUsttYrqs/EQSy0X3kZ7CAm04uzA8csNyxapEVRvJxbrt5I=\n"
-        + "=FLdD\n"
-        + "-----END PGP PRIVATE KEY BLOCK-----\n");
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "lQOYBEx6npoBCACp0vHePNPeLzm0HM35i70bRChyZXu/ARxOHZHNbh6hWJkq5saI\n"
+            + "zuzZoaqXAr3xZwHftTULlkgoJIt40x6VCT8EBnUHTkOqoHTsFnXg2kNuhFvmn0OX\n"
+            + "7RQFlR1SGoQG4fEy6t/GlOwEknpNSIMLkbDMP2FzEkLVWtlIe2hqqawVIgqzyO3k\n"
+            + "HaQxW8gWyyTx0qeSdSi4DyFZIzdyu/aZa7sj/MhO3DB3UwubW6yE+PMcAVrJD+0d\n"
+            + "EToMT7i8Erncc+xEzuXAoQUHaQfOXV4DG5qSgVpKaLxJ/ABWUri0eMPhj0cT4iDx\n"
+            + "eNTL7cZ4h72B1uJs8byDN74PHrypNiVE+IRHABEBAAEAB/9BbaG9Bz9zd0tqjrx2\n"
+            + "u/VQR3qz1FCQXtuqZu8RMC+B5zIf2si71clf8c7ZHnfSxWZt65Ez1SMYwDeyBdje\n"
+            + "/7B1Gw3Ekk00tFxHx0GEL2NSdZE4sbynkHIp0nD4/HlIc41rmh08E405F7wiAWFn\n"
+            + "uCpfDr47SNpR/A4BxHYOvi8r9pBxn/fXiHluqYROit0Z4tfKDCvQ47k+wqVD5nOt\n"
+            + "BEbHDfEwUMibgTuJ1qPyHf6HDlSdTQSfYV8QW1/UbHWus9QikfjGfLJpX0Rv3UG+\n"
+            + "WXHmowpRDVixj74UQCYXQ/AZi/OBlcS8PRY6EZV4RLyEWlZrdzKViNLOTUbJNHvA\n"
+            + "ZAQVBADQND7CIO6z4k8e9Z8Lf4iLWP9iIbH9R7ArTZr2mX1vkwp+sk0BNQurL/BQ\n"
+            + "jUHOJZnouwkc+C3pQi/JvGvAe1fLHPA0+NKe/tcuDXMk+L1HH6XmDgKtByac41AR\n"
+            + "txxqhaECNeK9OKXAXaEvenkGFMcqQV3QMiF2q5VlmFxSSXydEwQA0M8tCowz0iZF\n"
+            + "i3fGuuZDTN3Ut4u6Uf9FiLcR4ye2Aa5ppO8vlNjObNqpHz0UqdDjB+e3O/n7BUx3\n"
+            + "A5PRZNQvcMbhgr2U3zjWvFMHS3YuxbuIaZ1Vj69vpOAGkUc98v4i0/3Lk7Lijpto\n"
+            + "n40S0eCVo+eccHA4HRvS5XSdNGHVJn0EAMzfBt3DalOlHm+PrAiZdVdp5IfbJwJv\n"
+            + "xkyI++0p4VaYTZhOxjswTs6vgv30FBmHAlx1FzoUOKLaOhxPyLgamFd9YG+ab4DK\n"
+            + "chc4TxIj3kkx3/m6JufW8DWhKyAJNZ/MW+Iqop5pUIeTbOBlNyaflK+XxjkP71rP\n"
+            + "2gZx4pjYjK5EPDy0HlRlc3R1c2VyIEEgPHRlc3RhQGV4YW1wbGUuY29tPokBOAQT\n"
+            + "AQIAIgUCTHqemgIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ0lrQep/Q\n"
+            + "05ZxMAf+OoRzXWbGfv7kZb7xdrVyAUTAV4bUUvLoJZUIQ1ckPBcty2LUvY7l9efg\n"
+            + "p3c57nvTD6U98dVnsKfaW4PT0CRXlpl1IFyhkgbInFS5rO+cJMQn1KyC+FfiwyGN\n"
+            + "ii630SwiHyWRG5+XQ6Iptx9JELwWUMCLJxFpB8DZQKlNnvdl+YUgEeQOkWTXfTSa\n"
+            + "BATdXHiZhskiumnTOGO24jSg8CrZc5O/n6fCCgEsAFWL7fnO0ii6EW1JH5btLHPx\n"
+            + "L9QI+5DJIypgOhGI1lqZW9KrpfmJ3w6N1GekGBda98DmzxxxZ9iyq1cELAAiQMjk\n"
+            + "vws67cOs/hwXNn9YaK74dzhb49MLGJ0DmARMep6aAQgA3NQtBhS8yiEGN8rT4hGt\n"
+            + "uuprVd5jQVprLz4ImcI2+Gt71+CRgv/BZ0zzFp3VPjTGRusungJYkKKOGpEpERiq\n"
+            + "EG1X/ZyL7EzoyT+iKIMDsVJgmyDNcryHTejlKA8Z6GQ1hPlOIws22oLq5zQXxD9p\n"
+            + "zMDuabHl/s/bYlU5qXc7LhxdtrmTb2uBP9a+eneWKrz8OfgtS5m9DgqJ6Bjl0Tvb\n"
+            + "eVJgKHX42pqzJlBTCn3hJjJosy8x4qTbqMraENnl9y+qynM7atoHX6TPWsD7vWtW\n"
+            + "vi+FA5OWGEe3rof8o/sJSj05DQUni8mmSiCYW/tUklPPXOvPRP0GZ/GhBzIUtE3j\n"
+            + "BwARAQABAAf+KQOPSS3Y0oHHsd0N9VLrPWgEf3JKZPzyI1gWKNiVdRYhbjrbS8VM\n"
+            + "mm8ERxMRY/hRSyKrCdXNtS87zVtgkThPfbWRPh0xL7YpFhenena63Ng78RPqlIDH\n"
+            + "cITs6r/DRBI4jnXvOTr/+R2Pm1llgKF2ePzsSt0rpmPcjyrdBsiKSUnLGxm4tGtW\n"
+            + "wVoEjy3+MRN2ULyTO8Pe4URKTtUkkb23iuQuJZy+k+SfH+H0/3oEb8ERRE3UXNG7\n"
+            + "BIbaj71nsx8+H8+x8ffRm1s5Unn86AJ418oEhxNzQk59NnrrlJ4HH9NNbjjzI3JE\n"
+            + "intSQKhFJsvMARdzX062yartQtnm1v6jwQQA65rpMMHCoh9pxvL6yagw3WjQLEPw\n"
+            + "vOGpD9ossBvcv/SfAe7SgJsx6J6X0IIW6EKIjyRhWTIfK/rVR0cmUFTGStib+y22\n"
+            + "BPcQmt/Oiw9rdUfOmDrnosPC0SB+19tKw1v1AfW5swpJnGBCkGz9UfX4Fr/eTS3e\n"
+            + "2KaMq+r1KALSUVkEAO/x0SWOiBRH3X1ETNE9nLTP6u2W3TAvrd+dXyP7JjXWZPB8\n"
+            + "NOwT7qidvUlhTbxdR7xWNI1W924Ywwgs43cAPGyq95pjdzhvi0Xxab7124UK+MS3\n"
+            + "V4WBvjOYYW8pkdMOydRLETXSkco2mDCRTiVKe3Zi7p+lKlVJj4xrFUPUnetfBADH\n"
+            + "EPwYeeZ8sQnW644J75eoph2e5KLRJaOy5GMPRLNmq+ODtJxdoIGpfQnEA35nSlze\n"
+            + "Ea+1UvLBlWyF+p08bNfnXHp3j5ugucAYbVEs4ptUwTB3vFt7eJ8rkx9GYcuBFiwm\n"
+            + "H47rg7QmS1mWDLyX6v2pI9brsb1SCgBL+oi9CyjypkjqiQEfBBgBAgAJBQJMep6a\n"
+            + "AhsMAAoJENJa0Hqf0NOW/gkH/jm9FL+S53NjrthdbNjffryhp7KhTmYAsRk3Hc3X\n"
+            + "4TBj3upecarJynpvsz5HlLi/OxDRR6L2yfjKk6/2iKAbV56mdnnu5xG3TG8++naL\n"
+            + "7n/s9TGBhgknb6+vGhSMZ/1dpQ6wkiyuEmgKJo8DzHAh3k3VATHiBeSD7fNSsgtK\n"
+            + "gzK0hi53IFRFDDPYiCca+SS6/pA2zF56JWGETiIa8rSHIQaK4hNJ38vgKOZM80vQ\n"
+            + "fp+CxvJkYY71Yc94oQByaQzrXod7xnukp5SXe/N3BYTFCWoaSTRUI/THRywWwKqa\n"
+            + "rUsttYrqs/EQSy0X3kZ7CAm04uzA8csNyxapEVRvJxbrt5I=\n"
+            + "=FLdD\n"
+            + "-----END PGP PRIVATE KEY BLOCK-----\n");
   }
 
   /**
-   * pub   2048R/B007D490 2010-08-29 [expired: 2011-08-29]
-   *       Key fingerprint = 355D 5B98 FECE 6199 83CD  C91D 5760 6987 B007 D490
-   * uid                  Testuser B <testb@example.com>
+   * pub 2048R/B007D490 2010-08-29 [expired: 2011-08-29] Key fingerprint = 355D 5B98 FECE 6199 83CD
+   * C91D 5760 6987 B007 D490 uid Testuser B <testb@example.com>
    */
   public static TestKey keyB() throws Exception {
-    return new TestKey("-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
-        + "Version: GnuPG v1\n"
-        + "\n"
-        + "mQENBEx6ntMBCADG7j/nuI+VvvNbPY9nnfLrAc3KTj0Z+DMxxUMYoZNLjTw1szQ0\n"
-        + "PuKKACiiSA9Oyj4R0aIhWdIR9iYxp6gQdje3yewzoqMwE+t5onYDpdX9QDFXyEzF\n"
-        + "UPWCjA7OSji1G6fyWakiYxKseqyRXOdHXI5TqMikBalmSpwwvmik0cfRGO+l6qvM\n"
-        + "mVJlcn6mkZB0d8WOPV8j8rFxmVSPn9SVP9L8HaFWv1uI9EY3zXbfNeDNgNeTWIMY\n"
-        + "75saINBA2LALBQ54u52GoSbaR8ukZYAjjkif3WIFI8B9xREwjUBLFy3E357aGyLZ\n"
-        + "jE8nsmPk4MDxDaeDNoSHJjcxtDWQJBub3u1zABEBAAG0HlRlc3R1c2VyIEIgPHRl\n"
-        + "c3RiQGV4YW1wbGUuY29tPokBPgQTAQIAKAUCTHqe0wIbAwUJAeEzgAYLCQgHAwIG\n"
-        + "FQgCCQoLBBYCAwECHgECF4AACgkQV2Bph7AH1JD0nQf/Vm+/Mvl99/y3Qw10S6et\n"
-        + "H6NYWDUeAKXe9mfXBJ39HdtlF50jZ5NzSwksAOSQtQZJ3tQQeElXB29cZDvAscva\n"
-        + "RiTtt+KUxDZSYbEHrC0EO7w0Wi5ltwaWdXnoitMOgPZ/grL7UpUbL8rB1evfLbhm\n"
-        + "AqC/6kgHuXeY/7EAzwU3o0wKbmfx1sh8AyQSi4unUwIDCV1RIAP0+ZfJSg0WwGoS\n"
-        + "JB5+lKajtIE6kMn9m8CWM66/zxSCY3XLcoXvjVxCYPwwgYSyje8dDxxOI+x7uj2I\n"
-        + "IjM5RHQ9hTsR7NQ9JUTFmpKZlcdah93NZLKJAFLUtOPjMa5d5t2O0ZOxZ5ftlhHp\n"
-        + "Q7kBDQRMep7TAQgAwOuLBXnACIsd879ld/vLcn8umpKV8MIUjrqOMjR0rNKpCUDw\n"
-        + "LxL4uVh3q/ksESHnQPPqxFYkgeA66SYrx4jwZjbZ5vv9BW99LHe8lSahqrJA9A9g\n"
-        + "5iw5hH+2ZWrGlu3P65UdQUJW+JaDx1IIBt3BbmdGDuKF/ESsy9qxEKq7tKqHI2JL\n"
-        + "Ed+6OIwWblU7ZogfiNpgZJ0lapxTe84mGsD0TowGTu5re/8wIJf1f2q4PuG+L9OZ\n"
-        + "0ZD5i9s1MAxdw4OD+705owPCQnqsr18nH9aUBHWJn9NCXb3jL7QGaId84Yq8SRlK\n"
-        + "wHSRtHLLJoowJ5fXw5UbZcUtRUergxFRwae87wARAQABiQElBBgBAgAPBQJMep7T\n"
-        + "AhsMBQkB4TOAAAoJEFdgaYewB9SQMbsH/iu1HY7OMJxd8EkfxairRNec/v9uEvYQ\n"
-        + "XqfEPw/Hihdef1TY8vB69ymAPd89e1PRDj1m+0/RivO045qFP7lbWMkjKeR9dXXe\n"
-        + "UzIEsTUJ1CNnA7C3fo11NBVg59E0d84bMKQx7n4AZkljgKFKghUb6OJZiWRdh+8W\n"
-        + "0I95JI2R7nMYw3L8/sSGxt+Vjhs9acB1DldbyYbJitYA4fhVZQH9zgeuhQqdCULQ\n"
-        + "ZexpkQqvG0o4iJKO4yeJNHdeM+NwH38wXfzydtEv6Dxz/YZSTwt08p97l6DQ//H7\n"
-        + "wek1LcqeX47YFa9Ftns8Y8fjh4S8Kyi1F6BhZKbsdDqg2hA+0AFv7LA=\n"
-        + "=tmW1\n"
-        + "-----END PGP PUBLIC KEY BLOCK-----\n",
+    return new TestKey(
+        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "mQENBEx6ntMBCADG7j/nuI+VvvNbPY9nnfLrAc3KTj0Z+DMxxUMYoZNLjTw1szQ0\n"
+            + "PuKKACiiSA9Oyj4R0aIhWdIR9iYxp6gQdje3yewzoqMwE+t5onYDpdX9QDFXyEzF\n"
+            + "UPWCjA7OSji1G6fyWakiYxKseqyRXOdHXI5TqMikBalmSpwwvmik0cfRGO+l6qvM\n"
+            + "mVJlcn6mkZB0d8WOPV8j8rFxmVSPn9SVP9L8HaFWv1uI9EY3zXbfNeDNgNeTWIMY\n"
+            + "75saINBA2LALBQ54u52GoSbaR8ukZYAjjkif3WIFI8B9xREwjUBLFy3E357aGyLZ\n"
+            + "jE8nsmPk4MDxDaeDNoSHJjcxtDWQJBub3u1zABEBAAG0HlRlc3R1c2VyIEIgPHRl\n"
+            + "c3RiQGV4YW1wbGUuY29tPokBPgQTAQIAKAUCTHqe0wIbAwUJAeEzgAYLCQgHAwIG\n"
+            + "FQgCCQoLBBYCAwECHgECF4AACgkQV2Bph7AH1JD0nQf/Vm+/Mvl99/y3Qw10S6et\n"
+            + "H6NYWDUeAKXe9mfXBJ39HdtlF50jZ5NzSwksAOSQtQZJ3tQQeElXB29cZDvAscva\n"
+            + "RiTtt+KUxDZSYbEHrC0EO7w0Wi5ltwaWdXnoitMOgPZ/grL7UpUbL8rB1evfLbhm\n"
+            + "AqC/6kgHuXeY/7EAzwU3o0wKbmfx1sh8AyQSi4unUwIDCV1RIAP0+ZfJSg0WwGoS\n"
+            + "JB5+lKajtIE6kMn9m8CWM66/zxSCY3XLcoXvjVxCYPwwgYSyje8dDxxOI+x7uj2I\n"
+            + "IjM5RHQ9hTsR7NQ9JUTFmpKZlcdah93NZLKJAFLUtOPjMa5d5t2O0ZOxZ5ftlhHp\n"
+            + "Q7kBDQRMep7TAQgAwOuLBXnACIsd879ld/vLcn8umpKV8MIUjrqOMjR0rNKpCUDw\n"
+            + "LxL4uVh3q/ksESHnQPPqxFYkgeA66SYrx4jwZjbZ5vv9BW99LHe8lSahqrJA9A9g\n"
+            + "5iw5hH+2ZWrGlu3P65UdQUJW+JaDx1IIBt3BbmdGDuKF/ESsy9qxEKq7tKqHI2JL\n"
+            + "Ed+6OIwWblU7ZogfiNpgZJ0lapxTe84mGsD0TowGTu5re/8wIJf1f2q4PuG+L9OZ\n"
+            + "0ZD5i9s1MAxdw4OD+705owPCQnqsr18nH9aUBHWJn9NCXb3jL7QGaId84Yq8SRlK\n"
+            + "wHSRtHLLJoowJ5fXw5UbZcUtRUergxFRwae87wARAQABiQElBBgBAgAPBQJMep7T\n"
+            + "AhsMBQkB4TOAAAoJEFdgaYewB9SQMbsH/iu1HY7OMJxd8EkfxairRNec/v9uEvYQ\n"
+            + "XqfEPw/Hihdef1TY8vB69ymAPd89e1PRDj1m+0/RivO045qFP7lbWMkjKeR9dXXe\n"
+            + "UzIEsTUJ1CNnA7C3fo11NBVg59E0d84bMKQx7n4AZkljgKFKghUb6OJZiWRdh+8W\n"
+            + "0I95JI2R7nMYw3L8/sSGxt+Vjhs9acB1DldbyYbJitYA4fhVZQH9zgeuhQqdCULQ\n"
+            + "ZexpkQqvG0o4iJKO4yeJNHdeM+NwH38wXfzydtEv6Dxz/YZSTwt08p97l6DQ//H7\n"
+            + "wek1LcqeX47YFa9Ftns8Y8fjh4S8Kyi1F6BhZKbsdDqg2hA+0AFv7LA=\n"
+            + "=tmW1\n"
+            + "-----END PGP PUBLIC KEY BLOCK-----\n",
         "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
-        + "Version: GnuPG v1\n"
-        + "\n"
-        + "lQOYBEx6ntMBCADG7j/nuI+VvvNbPY9nnfLrAc3KTj0Z+DMxxUMYoZNLjTw1szQ0\n"
-        + "PuKKACiiSA9Oyj4R0aIhWdIR9iYxp6gQdje3yewzoqMwE+t5onYDpdX9QDFXyEzF\n"
-        + "UPWCjA7OSji1G6fyWakiYxKseqyRXOdHXI5TqMikBalmSpwwvmik0cfRGO+l6qvM\n"
-        + "mVJlcn6mkZB0d8WOPV8j8rFxmVSPn9SVP9L8HaFWv1uI9EY3zXbfNeDNgNeTWIMY\n"
-        + "75saINBA2LALBQ54u52GoSbaR8ukZYAjjkif3WIFI8B9xREwjUBLFy3E357aGyLZ\n"
-        + "jE8nsmPk4MDxDaeDNoSHJjcxtDWQJBub3u1zABEBAAEAB/wPPV1Om92pc9F3jJsZ\n"
-        + "2F3YZxukLfjnA76tnMEWd/pYGrUhdV3AdY4r/aB0njSeApxdXRlLQ3L2cUxdGCJQ\n"
-        + "mzM1ies7IXCC/w5WaShwAG+zpmFL/5+cq3vDc9tb2Q/IasVOVFQYEE2el7SfW5Cp\n"
-        + "mjZFGR8V1wvdNvC0Q0IHrmfdECYSeftzZBEj7CcoGc2pF5zpCG0XQxq7K6cEeSf5\n"
-        + "TKf//UVHgyBCIso6mzgP5k6DGw2d64843CPhhlHEbirUu/wNnbm1SqJ5xFL2VatH\n"
-        + "w7ij4V/hbgnP0GQkbY5+p/PU74P7fx/Ee8D8mF2HmEKRy6ZQY/SAnrjsAURBYR5S\n"
-        + "GF5RBADfhOYEgseWr81lq6Y1oM4YQz+pXRIZk34BagOJsL767B7+uwhvmxBJKIOS\n"
-        + "nRIxfV8GlvT22hrbqsRRyusoIlo2ZUat94IMAL6Oqm6VFm71PT3z9+ukWK43FIXf\n"
-        + "Bsz4swSV001398e3jpSizI6fGW7LRxvnua+NPN+xJLmDVcsPvwQA49ajm48NorD9\n"
-        + "bIWG87+2ScNTVOnHKryR+/LrGWA0f3G6LUsHZPKHNBdFZ4yza2QtEKw95L3K9D4y\n"
-        + "jIeKGwSRYJPb5oh5tSge58pxwP88eI9J4dL+XF1nsG0vYF9B41+qG1TCsPyUJTp6\n"
-        + "ry7NAgWrbpsZpjB0yJ1kFva3iS/hD00EAMu66p1CtsosoDHhekvRZp8a3svd+8uf\n"
-        + "YEKkEKXZuNNmJJktJBSA2FK1RKl9bV8wuG0Pi1/k39egLO3QTjruWUbSggT+aibR\n"
-        + "RW3hU7G+Z5IBOU3p+kTFLat6+TBg0XhCjJ+Eq366nZy1QIfqTCixIaDwrutZd6DC\n"
-        + "BXOjdoG6ZvLcQia0HlRlc3R1c2VyIEIgPHRlc3RiQGV4YW1wbGUuY29tPokBPgQT\n"
-        + "AQIAKAUCTHqe0wIbAwUJAeEzgAYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ\n"
-        + "V2Bph7AH1JD0nQf/Vm+/Mvl99/y3Qw10S6etH6NYWDUeAKXe9mfXBJ39HdtlF50j\n"
-        + "Z5NzSwksAOSQtQZJ3tQQeElXB29cZDvAscvaRiTtt+KUxDZSYbEHrC0EO7w0Wi5l\n"
-        + "twaWdXnoitMOgPZ/grL7UpUbL8rB1evfLbhmAqC/6kgHuXeY/7EAzwU3o0wKbmfx\n"
-        + "1sh8AyQSi4unUwIDCV1RIAP0+ZfJSg0WwGoSJB5+lKajtIE6kMn9m8CWM66/zxSC\n"
-        + "Y3XLcoXvjVxCYPwwgYSyje8dDxxOI+x7uj2IIjM5RHQ9hTsR7NQ9JUTFmpKZlcda\n"
-        + "h93NZLKJAFLUtOPjMa5d5t2O0ZOxZ5ftlhHpQ50DmARMep7TAQgAwOuLBXnACIsd\n"
-        + "879ld/vLcn8umpKV8MIUjrqOMjR0rNKpCUDwLxL4uVh3q/ksESHnQPPqxFYkgeA6\n"
-        + "6SYrx4jwZjbZ5vv9BW99LHe8lSahqrJA9A9g5iw5hH+2ZWrGlu3P65UdQUJW+JaD\n"
-        + "x1IIBt3BbmdGDuKF/ESsy9qxEKq7tKqHI2JLEd+6OIwWblU7ZogfiNpgZJ0lapxT\n"
-        + "e84mGsD0TowGTu5re/8wIJf1f2q4PuG+L9OZ0ZD5i9s1MAxdw4OD+705owPCQnqs\n"
-        + "r18nH9aUBHWJn9NCXb3jL7QGaId84Yq8SRlKwHSRtHLLJoowJ5fXw5UbZcUtRUer\n"
-        + "gxFRwae87wARAQABAAf8DAVBKsyswfuFGMB2vpSiVxaEnV3/2LoHFOOb45XwJSqV\n"
-        + "HL3+mThJ5iaUglMqw0CFC7+HA8fIS41grlFSDgNC02OcjS9rUxDg0En/pp17Gks0\n"
-        + "D+D7bSwZQ1+/yi7ug836lBe89GmBSMj8GgnK9T6RBGOL8nZ72b2ftK4CNWMmAfo4\n"
-        + "NZUy+rnnziV5WoYrkFZhl3dMMd3nITILBy9eYUoiKJl8O1b8amhrNkB/PEMAV7jc\n"
-        + "260XEQ9fgzMMe5/oT8pzIOGyrB+QO5rMu9pGVJ1qeMzTiZjjHXE2CEaEbvEk0F4l\n"
-        + "6w2gp5C6O5GoMpCOPwCy7dOYX5ETdO4Ppjnrob2XEQQAwus5q+EFoBVG8vfEf56x\n"
-        + "czkC15+0VcMe/IM8l/ur/oF1NUlAnPCq7WfgdELvGNszW7R+A625yXJJf7LJE/y/\n"
-        + "5GUGHAK60FUa0ElbVEn0A6kDcvll0dM6rKPQvFguaFpBKXre6k17cdOrf9hasfJk\n"
-        + "+lzaHlh9hJgoM30pAwG4+n8EAP1f+TEkEfVFo4Uy84eO6xVkYVndopDU1gCpfW1a\n"
-        + "84SA2PNjU3vkdIoFsEvOmf1xlfYeDYn37dikFPEZDsHBUzELDMewAXRgmVvnMJrj\n"
-        + "8Zq4FbEQSVjyz3qJOGk5V999qqoVMRXdnlQs5IXgZauPsnIqi5TRQZOMhbaiOVBO\n"
-        + "kqWRBAC9FhxypA3t9j1zGTFDppWmcBxpVzGGsgmzGO+WTVyk6szbZgTsf2+R+gTJ\n"
-        + "ZKVVzE6Mu+iZmPbrn/x7LWzKJuavRz0xSrvCYbIxYyheFz5LOPFHLF181h1g79gY\n"
-        + "E5Tz7uwu3jIldM7rY5RhxS6V5GGDVSfA+/Dsk6Iaujs6Hs7y30C0iQElBBgBAgAP\n"
-        + "BQJMep7TAhsMBQkB4TOAAAoJEFdgaYewB9SQMbsH/iu1HY7OMJxd8EkfxairRNec\n"
-        + "/v9uEvYQXqfEPw/Hihdef1TY8vB69ymAPd89e1PRDj1m+0/RivO045qFP7lbWMkj\n"
-        + "KeR9dXXeUzIEsTUJ1CNnA7C3fo11NBVg59E0d84bMKQx7n4AZkljgKFKghUb6OJZ\n"
-        + "iWRdh+8W0I95JI2R7nMYw3L8/sSGxt+Vjhs9acB1DldbyYbJitYA4fhVZQH9zgeu\n"
-        + "hQqdCULQZexpkQqvG0o4iJKO4yeJNHdeM+NwH38wXfzydtEv6Dxz/YZSTwt08p97\n"
-        + "l6DQ//H7wek1LcqeX47YFa9Ftns8Y8fjh4S8Kyi1F6BhZKbsdDqg2hA+0AFv7LA=\n"
-        + "=uFLT\n"
-        + "-----END PGP PRIVATE KEY BLOCK-----\n");
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "lQOYBEx6ntMBCADG7j/nuI+VvvNbPY9nnfLrAc3KTj0Z+DMxxUMYoZNLjTw1szQ0\n"
+            + "PuKKACiiSA9Oyj4R0aIhWdIR9iYxp6gQdje3yewzoqMwE+t5onYDpdX9QDFXyEzF\n"
+            + "UPWCjA7OSji1G6fyWakiYxKseqyRXOdHXI5TqMikBalmSpwwvmik0cfRGO+l6qvM\n"
+            + "mVJlcn6mkZB0d8WOPV8j8rFxmVSPn9SVP9L8HaFWv1uI9EY3zXbfNeDNgNeTWIMY\n"
+            + "75saINBA2LALBQ54u52GoSbaR8ukZYAjjkif3WIFI8B9xREwjUBLFy3E357aGyLZ\n"
+            + "jE8nsmPk4MDxDaeDNoSHJjcxtDWQJBub3u1zABEBAAEAB/wPPV1Om92pc9F3jJsZ\n"
+            + "2F3YZxukLfjnA76tnMEWd/pYGrUhdV3AdY4r/aB0njSeApxdXRlLQ3L2cUxdGCJQ\n"
+            + "mzM1ies7IXCC/w5WaShwAG+zpmFL/5+cq3vDc9tb2Q/IasVOVFQYEE2el7SfW5Cp\n"
+            + "mjZFGR8V1wvdNvC0Q0IHrmfdECYSeftzZBEj7CcoGc2pF5zpCG0XQxq7K6cEeSf5\n"
+            + "TKf//UVHgyBCIso6mzgP5k6DGw2d64843CPhhlHEbirUu/wNnbm1SqJ5xFL2VatH\n"
+            + "w7ij4V/hbgnP0GQkbY5+p/PU74P7fx/Ee8D8mF2HmEKRy6ZQY/SAnrjsAURBYR5S\n"
+            + "GF5RBADfhOYEgseWr81lq6Y1oM4YQz+pXRIZk34BagOJsL767B7+uwhvmxBJKIOS\n"
+            + "nRIxfV8GlvT22hrbqsRRyusoIlo2ZUat94IMAL6Oqm6VFm71PT3z9+ukWK43FIXf\n"
+            + "Bsz4swSV001398e3jpSizI6fGW7LRxvnua+NPN+xJLmDVcsPvwQA49ajm48NorD9\n"
+            + "bIWG87+2ScNTVOnHKryR+/LrGWA0f3G6LUsHZPKHNBdFZ4yza2QtEKw95L3K9D4y\n"
+            + "jIeKGwSRYJPb5oh5tSge58pxwP88eI9J4dL+XF1nsG0vYF9B41+qG1TCsPyUJTp6\n"
+            + "ry7NAgWrbpsZpjB0yJ1kFva3iS/hD00EAMu66p1CtsosoDHhekvRZp8a3svd+8uf\n"
+            + "YEKkEKXZuNNmJJktJBSA2FK1RKl9bV8wuG0Pi1/k39egLO3QTjruWUbSggT+aibR\n"
+            + "RW3hU7G+Z5IBOU3p+kTFLat6+TBg0XhCjJ+Eq366nZy1QIfqTCixIaDwrutZd6DC\n"
+            + "BXOjdoG6ZvLcQia0HlRlc3R1c2VyIEIgPHRlc3RiQGV4YW1wbGUuY29tPokBPgQT\n"
+            + "AQIAKAUCTHqe0wIbAwUJAeEzgAYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ\n"
+            + "V2Bph7AH1JD0nQf/Vm+/Mvl99/y3Qw10S6etH6NYWDUeAKXe9mfXBJ39HdtlF50j\n"
+            + "Z5NzSwksAOSQtQZJ3tQQeElXB29cZDvAscvaRiTtt+KUxDZSYbEHrC0EO7w0Wi5l\n"
+            + "twaWdXnoitMOgPZ/grL7UpUbL8rB1evfLbhmAqC/6kgHuXeY/7EAzwU3o0wKbmfx\n"
+            + "1sh8AyQSi4unUwIDCV1RIAP0+ZfJSg0WwGoSJB5+lKajtIE6kMn9m8CWM66/zxSC\n"
+            + "Y3XLcoXvjVxCYPwwgYSyje8dDxxOI+x7uj2IIjM5RHQ9hTsR7NQ9JUTFmpKZlcda\n"
+            + "h93NZLKJAFLUtOPjMa5d5t2O0ZOxZ5ftlhHpQ50DmARMep7TAQgAwOuLBXnACIsd\n"
+            + "879ld/vLcn8umpKV8MIUjrqOMjR0rNKpCUDwLxL4uVh3q/ksESHnQPPqxFYkgeA6\n"
+            + "6SYrx4jwZjbZ5vv9BW99LHe8lSahqrJA9A9g5iw5hH+2ZWrGlu3P65UdQUJW+JaD\n"
+            + "x1IIBt3BbmdGDuKF/ESsy9qxEKq7tKqHI2JLEd+6OIwWblU7ZogfiNpgZJ0lapxT\n"
+            + "e84mGsD0TowGTu5re/8wIJf1f2q4PuG+L9OZ0ZD5i9s1MAxdw4OD+705owPCQnqs\n"
+            + "r18nH9aUBHWJn9NCXb3jL7QGaId84Yq8SRlKwHSRtHLLJoowJ5fXw5UbZcUtRUer\n"
+            + "gxFRwae87wARAQABAAf8DAVBKsyswfuFGMB2vpSiVxaEnV3/2LoHFOOb45XwJSqV\n"
+            + "HL3+mThJ5iaUglMqw0CFC7+HA8fIS41grlFSDgNC02OcjS9rUxDg0En/pp17Gks0\n"
+            + "D+D7bSwZQ1+/yi7ug836lBe89GmBSMj8GgnK9T6RBGOL8nZ72b2ftK4CNWMmAfo4\n"
+            + "NZUy+rnnziV5WoYrkFZhl3dMMd3nITILBy9eYUoiKJl8O1b8amhrNkB/PEMAV7jc\n"
+            + "260XEQ9fgzMMe5/oT8pzIOGyrB+QO5rMu9pGVJ1qeMzTiZjjHXE2CEaEbvEk0F4l\n"
+            + "6w2gp5C6O5GoMpCOPwCy7dOYX5ETdO4Ppjnrob2XEQQAwus5q+EFoBVG8vfEf56x\n"
+            + "czkC15+0VcMe/IM8l/ur/oF1NUlAnPCq7WfgdELvGNszW7R+A625yXJJf7LJE/y/\n"
+            + "5GUGHAK60FUa0ElbVEn0A6kDcvll0dM6rKPQvFguaFpBKXre6k17cdOrf9hasfJk\n"
+            + "+lzaHlh9hJgoM30pAwG4+n8EAP1f+TEkEfVFo4Uy84eO6xVkYVndopDU1gCpfW1a\n"
+            + "84SA2PNjU3vkdIoFsEvOmf1xlfYeDYn37dikFPEZDsHBUzELDMewAXRgmVvnMJrj\n"
+            + "8Zq4FbEQSVjyz3qJOGk5V999qqoVMRXdnlQs5IXgZauPsnIqi5TRQZOMhbaiOVBO\n"
+            + "kqWRBAC9FhxypA3t9j1zGTFDppWmcBxpVzGGsgmzGO+WTVyk6szbZgTsf2+R+gTJ\n"
+            + "ZKVVzE6Mu+iZmPbrn/x7LWzKJuavRz0xSrvCYbIxYyheFz5LOPFHLF181h1g79gY\n"
+            + "E5Tz7uwu3jIldM7rY5RhxS6V5GGDVSfA+/Dsk6Iaujs6Hs7y30C0iQElBBgBAgAP\n"
+            + "BQJMep7TAhsMBQkB4TOAAAoJEFdgaYewB9SQMbsH/iu1HY7OMJxd8EkfxairRNec\n"
+            + "/v9uEvYQXqfEPw/Hihdef1TY8vB69ymAPd89e1PRDj1m+0/RivO045qFP7lbWMkj\n"
+            + "KeR9dXXeUzIEsTUJ1CNnA7C3fo11NBVg59E0d84bMKQx7n4AZkljgKFKghUb6OJZ\n"
+            + "iWRdh+8W0I95JI2R7nMYw3L8/sSGxt+Vjhs9acB1DldbyYbJitYA4fhVZQH9zgeu\n"
+            + "hQqdCULQZexpkQqvG0o4iJKO4yeJNHdeM+NwH38wXfzydtEv6Dxz/YZSTwt08p97\n"
+            + "l6DQ//H7wek1LcqeX47YFa9Ftns8Y8fjh4S8Kyi1F6BhZKbsdDqg2hA+0AFv7LA=\n"
+            + "=uFLT\n"
+            + "-----END PGP PRIVATE KEY BLOCK-----\n");
   }
 
   /**
-   * pub   2048R/D24FE467 2010-08-29
-   *       Key fingerprint = 6C21 10AC F4FC 1C7B F270  C00E 641F 1193 D24F E467
-   * uid                  Testuser C <testc@example.com>
-   * sub   2048R/DBECD4FA 2010-08-29
+   * pub 2048R/D24FE467 2010-08-29 Key fingerprint = 6C21 10AC F4FC 1C7B F270 C00E 641F 1193 D24F
+   * E467 uid Testuser C <testc@example.com> sub 2048R/DBECD4FA 2010-08-29
    */
   public static TestKey keyC() throws Exception {
-    return new TestKey("-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
-        + "Version: GnuPG v1\n"
-        + "\n"
-        + "mQENBEx6nuMBCADd077pyfsDGbGhHh+7xzipWihMJRrzQnpbSeVJIxA/Js+Z2MW8\n"
-        + "9J98AgnjONjGVlLqtp11O8Bp9xgdoGYWvFl2CrooQrCe+70JORHE30MJT+61mgLQ\n"
-        + "jm9l2WmIIcuzNwoTOKqWlXuaRIKddXMVbwr++Enl/9znx81FCf1KioDijeeHzVZb\n"
-        + "IjELLCtLlhwhGlYNy6LfNhSY+rNHOomIM9CUXkGZU7JvTe3M1plUzYYIFu3tttZI\n"
-        + "b6e1FSfR60yZ/f88fLacloc3fSrPWA261R/gHuFfLCdTt/I3EcYE+x33LZnSSOgz\n"
-        + "v/JtAuFlCaF/oNRTJHeRbALeri+FxBYule15ABEBAAG0HlRlc3R1c2VyIEMgPHRl\n"
-        + "c3RjQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTHqe4wIbAwYLCQgHAwIGFQgCCQoL\n"
-        + "BBYCAwECHgECF4AACgkQZB8Rk9JP5GcEIgf/cMvYBwH8ENrWec366Txaaeh/TO6n\n"
-        + "4v4P2LUR4/hcrNpHx3+9ikznkyF/b8OCsOE+KstvOO6i9vuRGVBPmfoALVv8iCGs\n"
-        + "5MXZJskjACXOqQav0I7ZY5rDJxuOKq6DrxtpHNxK8n0D1PEZllyk/OZVBAcjL2vu\n"
-        + "WC6ujP3jbMKaV0+heFqOVIghQjdA4McLH2u1XLOGEZdp7hLfmTnClmfzbnslFBSQ\n"
-        + "xU2g3jCq2k2zAPhn+jOGCL0987QGj1e6pHRXdUxcfnLRyNadRied0HO/clIb8vdt\n"
-        + "UaexujHjgg+1KDxj4PBAftN2lRtnnsSG9z4T31aTFz5YVG+pq8UXk9ohCokBIAQQ\n"
-        + "AQIACgUCTHqkKQMFAngACgkQqZHi1Q/dNnexiQf/ba9LcR76+tVvos1cxrGO3VkD\n"
-        + "3R1pvIWsb37/NTypWCvrFhsy4OUEy3bVCfJcqfwdY3Q2XixB9kuKo3qCSom1EjGg\n"
-        + "Qhr5ZsrB3qYqaa6S0AeVusmIwArEr9uuMUDjXhKlUALDX8HfXWGy2UmjNJkkT8Jm\n"
-        + "GtISS4KOfXUuZY04DttvbukEnyxAiLU9V0BnzrI9DARh0gEjqjUZAVyP5lOXJJxt\n"
-        + "sau95mOe8E61GELXPkxDLrnCboX7ys2OxcFO6S7q1xJPkki2SVq0y0k5oY/3jktw\n"
-        + "jO8uC3n7NiyW+BYJK6+zj3u3iA+o0YGm+i6F7aneJEaJrFqRj9L1vbojvuH0cYkB\n"
-        + "IAQQAQIACgUCTHqkOwMFAngACgkQOwm5f0tDh+7dSQf+PnEUftNSOuLVLoJ+2tyD\n"
-        + "DPJpcLIavNCyNR3hCGL86NXRUxOrmYgDVVv8pJuYB6aUTm69rFFZlzNwqQN5pBiX\n"
-        + "Zr3NM1jgJT6gKfXddcg1p/X2S9+xn4RN92R0fn0kEjM65fpE1Do+YWHOuHDZEOrx\n"
-        + "L8OaSo8lr19+r27fn09/HBhz2lOyTYzsdTjHeWdxPVQ3JNiVX11k7iKsttdYtM/V\n"
-        + "mAHzzd54Kvt5So/2qLIAcfSmUe9DQAdmcEcJQpQ2veND9uwccX7tH0cH4n9Cp16o\n"
-        + "quJ2pxWzOvKR3zxSw+cRxyIS4VjT6k+UsG3Lw55QZgdb5IEaJfezPj+tOhQlQz0f\n"
-        + "VrkBDQRMep7jAQgAw+67ahlOGnkF6mTtmg6MOGzAbRQ11MNrORnNtGOccNgtlgrO\n"
-        + "Y8TBqw1HkJ56v26E1FxfRh69CUGkYVXx0tMw0QbI+unX35ce5hJD4aWa8bOA1vfw\n"
-        + "474p/NpI+czWsFvcdOu5K6xIGXHShaQQyf2FQ9QeIFrU60qfaBL5jzuLyujCACqU\n"
-        + "46QGgBgeUjaT54LjrWSdn/Jtsbpv0MPv3Ea8fMdtSMkkBsDkF55jaJDFYq+xbs+e\n"
-        + "IKBjTwtSvrUisnLAC0Z9YY21GXGI3DGYqpVXz+Fe5xMTX1a6K3VKEmxmX2m/ebhm\n"
-        + "1p6EqjAJguOjJbJJQHKHMOol0zU6ANB6SgP26wARAQABiQEfBBgBAgAJBQJMep7j\n"
-        + "AhsMAAoJEGQfEZPST+Rn7AcH/32HACPLdxINsi8OSWa8OccMG5XEUvHTZjmdwVT2\n"
-        + "czMss8nwgifU9D4hEVRu1MWpiyxUgegW94wuSh4PWIVOVd18PmzAYc73aYgonakb\n"
-        + "M+MDIqGVvAH8QtHo79sqZ9vrkQaQXB3Y8cq+WxDQZyl8KLXP2icmq1Rl6Q6+i9oS\n"
-        + "pFe88Wr0cGaTblkfDbbWcih3C6tKAfcFwLLg8u4jYfXjZg/E9eAJf0dIFcQSQoHd\n"
-        + "O8hVXaZwx/rYXA8UFwAuROo2nu6SIof1lrH92p+now95d5zUZ5BYnKVd3uXsln0j\n"
-        + "z585UPQKS2J8PUy9IirmahgTyEYFwO64kZ2B4hYOE2g+rYw=\n"
-        + "=LtMR\n"
-        + "-----END PGP PUBLIC KEY BLOCK-----\n",
+    return new TestKey(
+        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "mQENBEx6nuMBCADd077pyfsDGbGhHh+7xzipWihMJRrzQnpbSeVJIxA/Js+Z2MW8\n"
+            + "9J98AgnjONjGVlLqtp11O8Bp9xgdoGYWvFl2CrooQrCe+70JORHE30MJT+61mgLQ\n"
+            + "jm9l2WmIIcuzNwoTOKqWlXuaRIKddXMVbwr++Enl/9znx81FCf1KioDijeeHzVZb\n"
+            + "IjELLCtLlhwhGlYNy6LfNhSY+rNHOomIM9CUXkGZU7JvTe3M1plUzYYIFu3tttZI\n"
+            + "b6e1FSfR60yZ/f88fLacloc3fSrPWA261R/gHuFfLCdTt/I3EcYE+x33LZnSSOgz\n"
+            + "v/JtAuFlCaF/oNRTJHeRbALeri+FxBYule15ABEBAAG0HlRlc3R1c2VyIEMgPHRl\n"
+            + "c3RjQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTHqe4wIbAwYLCQgHAwIGFQgCCQoL\n"
+            + "BBYCAwECHgECF4AACgkQZB8Rk9JP5GcEIgf/cMvYBwH8ENrWec366Txaaeh/TO6n\n"
+            + "4v4P2LUR4/hcrNpHx3+9ikznkyF/b8OCsOE+KstvOO6i9vuRGVBPmfoALVv8iCGs\n"
+            + "5MXZJskjACXOqQav0I7ZY5rDJxuOKq6DrxtpHNxK8n0D1PEZllyk/OZVBAcjL2vu\n"
+            + "WC6ujP3jbMKaV0+heFqOVIghQjdA4McLH2u1XLOGEZdp7hLfmTnClmfzbnslFBSQ\n"
+            + "xU2g3jCq2k2zAPhn+jOGCL0987QGj1e6pHRXdUxcfnLRyNadRied0HO/clIb8vdt\n"
+            + "UaexujHjgg+1KDxj4PBAftN2lRtnnsSG9z4T31aTFz5YVG+pq8UXk9ohCokBIAQQ\n"
+            + "AQIACgUCTHqkKQMFAngACgkQqZHi1Q/dNnexiQf/ba9LcR76+tVvos1cxrGO3VkD\n"
+            + "3R1pvIWsb37/NTypWCvrFhsy4OUEy3bVCfJcqfwdY3Q2XixB9kuKo3qCSom1EjGg\n"
+            + "Qhr5ZsrB3qYqaa6S0AeVusmIwArEr9uuMUDjXhKlUALDX8HfXWGy2UmjNJkkT8Jm\n"
+            + "GtISS4KOfXUuZY04DttvbukEnyxAiLU9V0BnzrI9DARh0gEjqjUZAVyP5lOXJJxt\n"
+            + "sau95mOe8E61GELXPkxDLrnCboX7ys2OxcFO6S7q1xJPkki2SVq0y0k5oY/3jktw\n"
+            + "jO8uC3n7NiyW+BYJK6+zj3u3iA+o0YGm+i6F7aneJEaJrFqRj9L1vbojvuH0cYkB\n"
+            + "IAQQAQIACgUCTHqkOwMFAngACgkQOwm5f0tDh+7dSQf+PnEUftNSOuLVLoJ+2tyD\n"
+            + "DPJpcLIavNCyNR3hCGL86NXRUxOrmYgDVVv8pJuYB6aUTm69rFFZlzNwqQN5pBiX\n"
+            + "Zr3NM1jgJT6gKfXddcg1p/X2S9+xn4RN92R0fn0kEjM65fpE1Do+YWHOuHDZEOrx\n"
+            + "L8OaSo8lr19+r27fn09/HBhz2lOyTYzsdTjHeWdxPVQ3JNiVX11k7iKsttdYtM/V\n"
+            + "mAHzzd54Kvt5So/2qLIAcfSmUe9DQAdmcEcJQpQ2veND9uwccX7tH0cH4n9Cp16o\n"
+            + "quJ2pxWzOvKR3zxSw+cRxyIS4VjT6k+UsG3Lw55QZgdb5IEaJfezPj+tOhQlQz0f\n"
+            + "VrkBDQRMep7jAQgAw+67ahlOGnkF6mTtmg6MOGzAbRQ11MNrORnNtGOccNgtlgrO\n"
+            + "Y8TBqw1HkJ56v26E1FxfRh69CUGkYVXx0tMw0QbI+unX35ce5hJD4aWa8bOA1vfw\n"
+            + "474p/NpI+czWsFvcdOu5K6xIGXHShaQQyf2FQ9QeIFrU60qfaBL5jzuLyujCACqU\n"
+            + "46QGgBgeUjaT54LjrWSdn/Jtsbpv0MPv3Ea8fMdtSMkkBsDkF55jaJDFYq+xbs+e\n"
+            + "IKBjTwtSvrUisnLAC0Z9YY21GXGI3DGYqpVXz+Fe5xMTX1a6K3VKEmxmX2m/ebhm\n"
+            + "1p6EqjAJguOjJbJJQHKHMOol0zU6ANB6SgP26wARAQABiQEfBBgBAgAJBQJMep7j\n"
+            + "AhsMAAoJEGQfEZPST+Rn7AcH/32HACPLdxINsi8OSWa8OccMG5XEUvHTZjmdwVT2\n"
+            + "czMss8nwgifU9D4hEVRu1MWpiyxUgegW94wuSh4PWIVOVd18PmzAYc73aYgonakb\n"
+            + "M+MDIqGVvAH8QtHo79sqZ9vrkQaQXB3Y8cq+WxDQZyl8KLXP2icmq1Rl6Q6+i9oS\n"
+            + "pFe88Wr0cGaTblkfDbbWcih3C6tKAfcFwLLg8u4jYfXjZg/E9eAJf0dIFcQSQoHd\n"
+            + "O8hVXaZwx/rYXA8UFwAuROo2nu6SIof1lrH92p+now95d5zUZ5BYnKVd3uXsln0j\n"
+            + "z585UPQKS2J8PUy9IirmahgTyEYFwO64kZ2B4hYOE2g+rYw=\n"
+            + "=LtMR\n"
+            + "-----END PGP PUBLIC KEY BLOCK-----\n",
         "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
-        + "Version: GnuPG v1\n"
-        + "\n"
-        + "lQOYBEx6nuMBCADd077pyfsDGbGhHh+7xzipWihMJRrzQnpbSeVJIxA/Js+Z2MW8\n"
-        + "9J98AgnjONjGVlLqtp11O8Bp9xgdoGYWvFl2CrooQrCe+70JORHE30MJT+61mgLQ\n"
-        + "jm9l2WmIIcuzNwoTOKqWlXuaRIKddXMVbwr++Enl/9znx81FCf1KioDijeeHzVZb\n"
-        + "IjELLCtLlhwhGlYNy6LfNhSY+rNHOomIM9CUXkGZU7JvTe3M1plUzYYIFu3tttZI\n"
-        + "b6e1FSfR60yZ/f88fLacloc3fSrPWA261R/gHuFfLCdTt/I3EcYE+x33LZnSSOgz\n"
-        + "v/JtAuFlCaF/oNRTJHeRbALeri+FxBYule15ABEBAAEAB/sFPLoJDG1eV5QpqEZf\n"
-        + "m/QMOTOn8ZJ9xraQvXFvV7zgVXxJBvTLMbuACrnHnoiCrULS+w8Dt66Nfz7s4yQJ\n"
-        + "5SDtFX2AlMDVWL7wBEPgF1UpN6ox1CzSa6HOaygaUFGeKHO20WDjV4HmBLhQkKIa\n"
-        + "vKbghHA/4Nm1s1z3BHB8GtdGZ1VHc+s1DhPK5w+WHqYpLYjpNmI9yJg3gclEqEG9\n"
-        + "XzBqTZm9mPJRBdDMOD0xLa4nUD3Dkrjimqod3X7EuXE6sT2DuGVa1nuynk/8gIyO\n"
-        + "uS6crY7YJzEQUtQJ2n3y/h+QnZFo9UFuIVpgsxhBDsCnYNFWNR91Q0IM6PohHvqx\n"
-        + "BtFhBADsax1Bc0obP+bIkeAXltGlUYqm3bjOgVZ87XR0qe4TGwXGe8T1Yjfc8rj0\n"
-        + "cfBYCud201r/05CgchojMnTWlFLg308bSIZ9YvN3oOVay8nZ7h62dUIs45zebw3R\n"
-        + "SHwvjE5Sm/VWIdLrUUW1aGfk/VPudNMMMu2C64ev8DF/iwYjoQQA8DM+9oPvFJPA\n"
-        + "kLYg71tP2iIE5GbFqkiIEx59eQUxTsn6ubEfREjI99QliAdcKbyRHc3jc68NopLB\n"
-        + "41L7ny0j6VKuEszOYhhQ0qQK/jlI461aG14qHAylhuQTLrjpsUPE+WelBm9bxli0\n"
-        + "gA8F81WLOvJ2HzuMYVrj3tjGl3AHetkEAI77VKxGCGRzK63qBnmLwQEvqbphpgxH\n"
-        + "ANNAsg5HuWtDUgk85t2nrIgL1kfhu++CfP9duN/qU4dw/bgJaKOamWTfLBwST8qe\n"
-        + "3F8omovi1vLzHVpmvQp6Ly4wggJ4Gl/n0DNFopKw20V8ZTiRYtuLS43H7VsczE+8\n"
-        + "NKjy01EgHDMAP8O0HlRlc3R1c2VyIEMgPHRlc3RjQGV4YW1wbGUuY29tPokBOAQT\n"
-        + "AQIAIgUCTHqe4wIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQZB8Rk9JP\n"
-        + "5GcEIgf/cMvYBwH8ENrWec366Txaaeh/TO6n4v4P2LUR4/hcrNpHx3+9ikznkyF/\n"
-        + "b8OCsOE+KstvOO6i9vuRGVBPmfoALVv8iCGs5MXZJskjACXOqQav0I7ZY5rDJxuO\n"
-        + "Kq6DrxtpHNxK8n0D1PEZllyk/OZVBAcjL2vuWC6ujP3jbMKaV0+heFqOVIghQjdA\n"
-        + "4McLH2u1XLOGEZdp7hLfmTnClmfzbnslFBSQxU2g3jCq2k2zAPhn+jOGCL0987QG\n"
-        + "j1e6pHRXdUxcfnLRyNadRied0HO/clIb8vdtUaexujHjgg+1KDxj4PBAftN2lRtn\n"
-        + "nsSG9z4T31aTFz5YVG+pq8UXk9ohCp0DmARMep7jAQgAw+67ahlOGnkF6mTtmg6M\n"
-        + "OGzAbRQ11MNrORnNtGOccNgtlgrOY8TBqw1HkJ56v26E1FxfRh69CUGkYVXx0tMw\n"
-        + "0QbI+unX35ce5hJD4aWa8bOA1vfw474p/NpI+czWsFvcdOu5K6xIGXHShaQQyf2F\n"
-        + "Q9QeIFrU60qfaBL5jzuLyujCACqU46QGgBgeUjaT54LjrWSdn/Jtsbpv0MPv3Ea8\n"
-        + "fMdtSMkkBsDkF55jaJDFYq+xbs+eIKBjTwtSvrUisnLAC0Z9YY21GXGI3DGYqpVX\n"
-        + "z+Fe5xMTX1a6K3VKEmxmX2m/ebhm1p6EqjAJguOjJbJJQHKHMOol0zU6ANB6SgP2\n"
-        + "6wARAQABAAf9HIsMy8S/92SmE018vQgILrgjwursz1Vgq22HkBNALm2acSnwgzbz\n"
-        + "V8M+0mH5U9ClPSKae+aXzLS+s7IHi++u7uSO0YQmKgZ5PonD+ygFoyxumo0oOfqc\n"
-        + "DJ/oKFaforWJ2jv05S3bRbRVN5l9G0/5jWC7ZXnrXBOqQUkdCLFjXhMPq3zg2Yy3\n"
-        + "XSU83dVteOtrYRZqv33umZNCdk44z6kQOvh9tgSCL/aZ3d7AqjRK99I/IYY1IuVN\n"
-        + "qreFriVcJ0EzlnbPCnva+ReWAd2zt5VEClGu9J0CVnHmZNlwfmbFSiUN1hiMonkr\n"
-        + "sFImlw3adfJ7dsi/GzCC4147ep6jXw7QwQQAzwkeRWR9xc3ndrnXqUbQmgQkAD3D\n"
-        + "p2cwPygyLr0UDBDVX0z+8GKeBhNs3KIFXwUs6GxmDodHh0t4HUJeVLs7ur5ZATqo\n"
-        + "Bx50cSUOoaeSHRFVwicdJRtVgTTQ4UwwmKcLLJe2fWv6hnmyInK7Lp8ThLGQgqo8\n"
-        + "UWg3cdfzCvhKSvsEAPJFYhsFA/E92xUpzP8oYs3AA4mUXB+F0eObe9gqv8lAE6SX\n"
-        + "gB5kWhcd+MGddUGJuJV2LRrgOx3nXu3m3n35AH6iAY4Qi9URPzi/K659oefUU1c5\n"
-        + "BFArHX9bN1k1cOvH28tpQ38eAxaMygLqyR5Q5VbtZ5tYqLKCvHVs3I8lekDRA/4i\n"
-        + "e0vlu34qenppPANPm+Vq/7cSlG3XY4ioxwC/j6Y+92u90DXbbGatOg1SqGSwn1VP\n"
-        + "S034m7bDCNoWOXL0yAcbXrLZV74AyfvVOYOs/WtehehzWeTQRT5lkxX5+xGc1/h6\n"
-        + "9HQvsKKnUK8n1oc5aM5xzRVkU9+kcmqYqXqyOHnIbDbPiQEfBBgBAgAJBQJMep7j\n"
-        + "AhsMAAoJEGQfEZPST+Rn7AcH/32HACPLdxINsi8OSWa8OccMG5XEUvHTZjmdwVT2\n"
-        + "czMss8nwgifU9D4hEVRu1MWpiyxUgegW94wuSh4PWIVOVd18PmzAYc73aYgonakb\n"
-        + "M+MDIqGVvAH8QtHo79sqZ9vrkQaQXB3Y8cq+WxDQZyl8KLXP2icmq1Rl6Q6+i9oS\n"
-        + "pFe88Wr0cGaTblkfDbbWcih3C6tKAfcFwLLg8u4jYfXjZg/E9eAJf0dIFcQSQoHd\n"
-        + "O8hVXaZwx/rYXA8UFwAuROo2nu6SIof1lrH92p+now95d5zUZ5BYnKVd3uXsln0j\n"
-        + "z585UPQKS2J8PUy9IirmahgTyEYFwO64kZ2B4hYOE2g+rYw=\n"
-        + "=5pIh\n"
-        + "-----END PGP PRIVATE KEY BLOCK-----\n");
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "lQOYBEx6nuMBCADd077pyfsDGbGhHh+7xzipWihMJRrzQnpbSeVJIxA/Js+Z2MW8\n"
+            + "9J98AgnjONjGVlLqtp11O8Bp9xgdoGYWvFl2CrooQrCe+70JORHE30MJT+61mgLQ\n"
+            + "jm9l2WmIIcuzNwoTOKqWlXuaRIKddXMVbwr++Enl/9znx81FCf1KioDijeeHzVZb\n"
+            + "IjELLCtLlhwhGlYNy6LfNhSY+rNHOomIM9CUXkGZU7JvTe3M1plUzYYIFu3tttZI\n"
+            + "b6e1FSfR60yZ/f88fLacloc3fSrPWA261R/gHuFfLCdTt/I3EcYE+x33LZnSSOgz\n"
+            + "v/JtAuFlCaF/oNRTJHeRbALeri+FxBYule15ABEBAAEAB/sFPLoJDG1eV5QpqEZf\n"
+            + "m/QMOTOn8ZJ9xraQvXFvV7zgVXxJBvTLMbuACrnHnoiCrULS+w8Dt66Nfz7s4yQJ\n"
+            + "5SDtFX2AlMDVWL7wBEPgF1UpN6ox1CzSa6HOaygaUFGeKHO20WDjV4HmBLhQkKIa\n"
+            + "vKbghHA/4Nm1s1z3BHB8GtdGZ1VHc+s1DhPK5w+WHqYpLYjpNmI9yJg3gclEqEG9\n"
+            + "XzBqTZm9mPJRBdDMOD0xLa4nUD3Dkrjimqod3X7EuXE6sT2DuGVa1nuynk/8gIyO\n"
+            + "uS6crY7YJzEQUtQJ2n3y/h+QnZFo9UFuIVpgsxhBDsCnYNFWNR91Q0IM6PohHvqx\n"
+            + "BtFhBADsax1Bc0obP+bIkeAXltGlUYqm3bjOgVZ87XR0qe4TGwXGe8T1Yjfc8rj0\n"
+            + "cfBYCud201r/05CgchojMnTWlFLg308bSIZ9YvN3oOVay8nZ7h62dUIs45zebw3R\n"
+            + "SHwvjE5Sm/VWIdLrUUW1aGfk/VPudNMMMu2C64ev8DF/iwYjoQQA8DM+9oPvFJPA\n"
+            + "kLYg71tP2iIE5GbFqkiIEx59eQUxTsn6ubEfREjI99QliAdcKbyRHc3jc68NopLB\n"
+            + "41L7ny0j6VKuEszOYhhQ0qQK/jlI461aG14qHAylhuQTLrjpsUPE+WelBm9bxli0\n"
+            + "gA8F81WLOvJ2HzuMYVrj3tjGl3AHetkEAI77VKxGCGRzK63qBnmLwQEvqbphpgxH\n"
+            + "ANNAsg5HuWtDUgk85t2nrIgL1kfhu++CfP9duN/qU4dw/bgJaKOamWTfLBwST8qe\n"
+            + "3F8omovi1vLzHVpmvQp6Ly4wggJ4Gl/n0DNFopKw20V8ZTiRYtuLS43H7VsczE+8\n"
+            + "NKjy01EgHDMAP8O0HlRlc3R1c2VyIEMgPHRlc3RjQGV4YW1wbGUuY29tPokBOAQT\n"
+            + "AQIAIgUCTHqe4wIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQZB8Rk9JP\n"
+            + "5GcEIgf/cMvYBwH8ENrWec366Txaaeh/TO6n4v4P2LUR4/hcrNpHx3+9ikznkyF/\n"
+            + "b8OCsOE+KstvOO6i9vuRGVBPmfoALVv8iCGs5MXZJskjACXOqQav0I7ZY5rDJxuO\n"
+            + "Kq6DrxtpHNxK8n0D1PEZllyk/OZVBAcjL2vuWC6ujP3jbMKaV0+heFqOVIghQjdA\n"
+            + "4McLH2u1XLOGEZdp7hLfmTnClmfzbnslFBSQxU2g3jCq2k2zAPhn+jOGCL0987QG\n"
+            + "j1e6pHRXdUxcfnLRyNadRied0HO/clIb8vdtUaexujHjgg+1KDxj4PBAftN2lRtn\n"
+            + "nsSG9z4T31aTFz5YVG+pq8UXk9ohCp0DmARMep7jAQgAw+67ahlOGnkF6mTtmg6M\n"
+            + "OGzAbRQ11MNrORnNtGOccNgtlgrOY8TBqw1HkJ56v26E1FxfRh69CUGkYVXx0tMw\n"
+            + "0QbI+unX35ce5hJD4aWa8bOA1vfw474p/NpI+czWsFvcdOu5K6xIGXHShaQQyf2F\n"
+            + "Q9QeIFrU60qfaBL5jzuLyujCACqU46QGgBgeUjaT54LjrWSdn/Jtsbpv0MPv3Ea8\n"
+            + "fMdtSMkkBsDkF55jaJDFYq+xbs+eIKBjTwtSvrUisnLAC0Z9YY21GXGI3DGYqpVX\n"
+            + "z+Fe5xMTX1a6K3VKEmxmX2m/ebhm1p6EqjAJguOjJbJJQHKHMOol0zU6ANB6SgP2\n"
+            + "6wARAQABAAf9HIsMy8S/92SmE018vQgILrgjwursz1Vgq22HkBNALm2acSnwgzbz\n"
+            + "V8M+0mH5U9ClPSKae+aXzLS+s7IHi++u7uSO0YQmKgZ5PonD+ygFoyxumo0oOfqc\n"
+            + "DJ/oKFaforWJ2jv05S3bRbRVN5l9G0/5jWC7ZXnrXBOqQUkdCLFjXhMPq3zg2Yy3\n"
+            + "XSU83dVteOtrYRZqv33umZNCdk44z6kQOvh9tgSCL/aZ3d7AqjRK99I/IYY1IuVN\n"
+            + "qreFriVcJ0EzlnbPCnva+ReWAd2zt5VEClGu9J0CVnHmZNlwfmbFSiUN1hiMonkr\n"
+            + "sFImlw3adfJ7dsi/GzCC4147ep6jXw7QwQQAzwkeRWR9xc3ndrnXqUbQmgQkAD3D\n"
+            + "p2cwPygyLr0UDBDVX0z+8GKeBhNs3KIFXwUs6GxmDodHh0t4HUJeVLs7ur5ZATqo\n"
+            + "Bx50cSUOoaeSHRFVwicdJRtVgTTQ4UwwmKcLLJe2fWv6hnmyInK7Lp8ThLGQgqo8\n"
+            + "UWg3cdfzCvhKSvsEAPJFYhsFA/E92xUpzP8oYs3AA4mUXB+F0eObe9gqv8lAE6SX\n"
+            + "gB5kWhcd+MGddUGJuJV2LRrgOx3nXu3m3n35AH6iAY4Qi9URPzi/K659oefUU1c5\n"
+            + "BFArHX9bN1k1cOvH28tpQ38eAxaMygLqyR5Q5VbtZ5tYqLKCvHVs3I8lekDRA/4i\n"
+            + "e0vlu34qenppPANPm+Vq/7cSlG3XY4ioxwC/j6Y+92u90DXbbGatOg1SqGSwn1VP\n"
+            + "S034m7bDCNoWOXL0yAcbXrLZV74AyfvVOYOs/WtehehzWeTQRT5lkxX5+xGc1/h6\n"
+            + "9HQvsKKnUK8n1oc5aM5xzRVkU9+kcmqYqXqyOHnIbDbPiQEfBBgBAgAJBQJMep7j\n"
+            + "AhsMAAoJEGQfEZPST+Rn7AcH/32HACPLdxINsi8OSWa8OccMG5XEUvHTZjmdwVT2\n"
+            + "czMss8nwgifU9D4hEVRu1MWpiyxUgegW94wuSh4PWIVOVd18PmzAYc73aYgonakb\n"
+            + "M+MDIqGVvAH8QtHo79sqZ9vrkQaQXB3Y8cq+WxDQZyl8KLXP2icmq1Rl6Q6+i9oS\n"
+            + "pFe88Wr0cGaTblkfDbbWcih3C6tKAfcFwLLg8u4jYfXjZg/E9eAJf0dIFcQSQoHd\n"
+            + "O8hVXaZwx/rYXA8UFwAuROo2nu6SIof1lrH92p+now95d5zUZ5BYnKVd3uXsln0j\n"
+            + "z585UPQKS2J8PUy9IirmahgTyEYFwO64kZ2B4hYOE2g+rYw=\n"
+            + "=5pIh\n"
+            + "-----END PGP PRIVATE KEY BLOCK-----\n");
   }
 
   /**
-   * pub   2048R/0FDD3677 2010-08-29
-   *       Key fingerprint = C96C 5E9D 669C 448A D1B9  BEB5 A991 E2D5 0FDD 3677
-   * uid                  Testuser D <testd@example.com>
-   * sub   2048R/CAB81AE0 2010-08-29
+   * pub 2048R/0FDD3677 2010-08-29 Key fingerprint = C96C 5E9D 669C 448A D1B9 BEB5 A991 E2D5 0FDD
+   * 3677 uid Testuser D <testd@example.com> sub 2048R/CAB81AE0 2010-08-29
    */
   public static TestKey keyD() throws Exception {
-    return new TestKey("-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
-        + "Version: GnuPG v1\n"
-        + "\n"
-        + "mQENBEx6nwkBCADuztv2tGhjPljwW46qEhth7ZnkdhYXuctZ6lNQuy5LMaEECE3C\n"
-        + "jvVKY+nBrgsLY2Trts+q+mdooBWvxy/qe5PAQTcPR83KjVS4fYwNMBgeRxBEZAZg\n"
-        + "DFwRRCsRrHost+cMgtzLocQ+vL3+9yTRAIe/WmYwbEDXg/c9JSC7kQbZqaAaOshO\n"
-        + "cIOyeB8/QoYee0fEnBzHMmcd0SB1YpwIvRG6v61lXmgpQ9CbovvXO6ZZyEyCX784\n"
-        + "9xprzqP1y03DPrbhuhBAY8EMf3KGJA1dEcU4+lbGEgmlOe2YSbWoLs7mRLFcq5xx\n"
-        + "JroYMtvXF04k4ZHNZAnT3IZc+lJyCqOp4vXpABEBAAG0HlRlc3R1c2VyIEQgPHRl\n"
-        + "c3RkQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTHqfCQIbAwYLCQgHAwIGFQgCCQoL\n"
-        + "BBYCAwECHgECF4AACgkQqZHi1Q/dNne/0wgApuPzh4J8p2quCK1ScsJHlgGRojGq\n"
-        + "IDPhZFtPn0p2IAkqr5sAhvZAjd3u9A2DqQ7pwOX7gnGRE7dSrK69IAjfbRMc5k16\n"
-        + "aBK2ADq2YgPEmTToots1A0Tj+LaCFOXYUtEkgAC+RfFIkCdt8z86GIr0kg19Q/vY\n"
-        + "I/LtvThAk28D8yIfDnW49Mc4GGq+qvrOytBaGu3dzW0mjYWGEyl0fdSjNqtKyWN7\n"
-        + "Qw70Kqysaoy1KiPRAgwiPQfMCEx6pVaXuAfgRKaJ18kCNOldpajLgQv6yeY7mhgu\n"
-        + "Q3Qe7xQlAtVObxskcTH2CWggl2dPqSMNieLK0g/ER8PIReGDCBXNSJ4qYbkBDQRM\n"
-        + "ep8JAQgAw/o1nhJPLGlIfEMzOGU0Jjj+DwEyB3QIEEc+WKRvgtGsJ4cbZdaGWBJq\n"
-        + "jSo7e9XC9jA2ih0+Gld0vWV7S0LZ84xXxQeadC+AZBFR+b9ga4aUFIji8Tdi2dWX\n"
-        + "QmY76hHIaF8rs6aJB7lRig735VRLxVHOb194t9KLUzZiEKqd71BvLQyuLqAfTEsT\n"
-        + "GRHgmydaxZbGXz+Z57jbQgm11CQEHX1dtS8uqWb64xrV5GAeuEhRj4R6Yiy7OPNi\n"
-        + "xXHxryH2Jd34pA0cGHYVcTgVjXuZ9FFP2SnXuxABONGAIaJuqg7ozYBa2kOdr0DN\n"
-        + "5Pxy5ocR7R2ZoN0pYD5+Cc7oGHjuCQARAQABiQEfBBgBAgAJBQJMep8JAhsMAAoJ\n"
-        + "EKmR4tUP3TZ369QIAKPlfX2TUfhP3otYiaa24zBJ/cvGljGiSfX0KrausBHH161j\n"
-        + "lraJfLzpe7vSOZhwZwgIY/eKoErAkJwVnX1+dLuOcHaqRDi5gnLqa6Yg9a2LWb4z\n"
-        + "rvgsvbiNUs1o9htOcvcpv7e3UUUcRa8lO+aNkO+VoI6DI8RJ3wIfJayboePRXdfr\n"
-        + "8g9of0jSdIOzlaaBPxA2wYSWXm4kv7QXzZooxuGqhn0+JKuq2+oO9y5QUig+c3oG\n"
-        + "a5mpVblmv5ZL6Gc36kCbeEC8j6JkNT4wnceQwpNUNYtPU186cjy3rAD4C58w0Uvp\n"
-        + "HZZSTc0syLOShQr//We39LUNaX6WF3NmyF8K/OM=\n"
-        + "=YDhQ\n"
-        + "-----END PGP PUBLIC KEY BLOCK-----\n",
+    return new TestKey(
+        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "mQENBEx6nwkBCADuztv2tGhjPljwW46qEhth7ZnkdhYXuctZ6lNQuy5LMaEECE3C\n"
+            + "jvVKY+nBrgsLY2Trts+q+mdooBWvxy/qe5PAQTcPR83KjVS4fYwNMBgeRxBEZAZg\n"
+            + "DFwRRCsRrHost+cMgtzLocQ+vL3+9yTRAIe/WmYwbEDXg/c9JSC7kQbZqaAaOshO\n"
+            + "cIOyeB8/QoYee0fEnBzHMmcd0SB1YpwIvRG6v61lXmgpQ9CbovvXO6ZZyEyCX784\n"
+            + "9xprzqP1y03DPrbhuhBAY8EMf3KGJA1dEcU4+lbGEgmlOe2YSbWoLs7mRLFcq5xx\n"
+            + "JroYMtvXF04k4ZHNZAnT3IZc+lJyCqOp4vXpABEBAAG0HlRlc3R1c2VyIEQgPHRl\n"
+            + "c3RkQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTHqfCQIbAwYLCQgHAwIGFQgCCQoL\n"
+            + "BBYCAwECHgECF4AACgkQqZHi1Q/dNne/0wgApuPzh4J8p2quCK1ScsJHlgGRojGq\n"
+            + "IDPhZFtPn0p2IAkqr5sAhvZAjd3u9A2DqQ7pwOX7gnGRE7dSrK69IAjfbRMc5k16\n"
+            + "aBK2ADq2YgPEmTToots1A0Tj+LaCFOXYUtEkgAC+RfFIkCdt8z86GIr0kg19Q/vY\n"
+            + "I/LtvThAk28D8yIfDnW49Mc4GGq+qvrOytBaGu3dzW0mjYWGEyl0fdSjNqtKyWN7\n"
+            + "Qw70Kqysaoy1KiPRAgwiPQfMCEx6pVaXuAfgRKaJ18kCNOldpajLgQv6yeY7mhgu\n"
+            + "Q3Qe7xQlAtVObxskcTH2CWggl2dPqSMNieLK0g/ER8PIReGDCBXNSJ4qYbkBDQRM\n"
+            + "ep8JAQgAw/o1nhJPLGlIfEMzOGU0Jjj+DwEyB3QIEEc+WKRvgtGsJ4cbZdaGWBJq\n"
+            + "jSo7e9XC9jA2ih0+Gld0vWV7S0LZ84xXxQeadC+AZBFR+b9ga4aUFIji8Tdi2dWX\n"
+            + "QmY76hHIaF8rs6aJB7lRig735VRLxVHOb194t9KLUzZiEKqd71BvLQyuLqAfTEsT\n"
+            + "GRHgmydaxZbGXz+Z57jbQgm11CQEHX1dtS8uqWb64xrV5GAeuEhRj4R6Yiy7OPNi\n"
+            + "xXHxryH2Jd34pA0cGHYVcTgVjXuZ9FFP2SnXuxABONGAIaJuqg7ozYBa2kOdr0DN\n"
+            + "5Pxy5ocR7R2ZoN0pYD5+Cc7oGHjuCQARAQABiQEfBBgBAgAJBQJMep8JAhsMAAoJ\n"
+            + "EKmR4tUP3TZ369QIAKPlfX2TUfhP3otYiaa24zBJ/cvGljGiSfX0KrausBHH161j\n"
+            + "lraJfLzpe7vSOZhwZwgIY/eKoErAkJwVnX1+dLuOcHaqRDi5gnLqa6Yg9a2LWb4z\n"
+            + "rvgsvbiNUs1o9htOcvcpv7e3UUUcRa8lO+aNkO+VoI6DI8RJ3wIfJayboePRXdfr\n"
+            + "8g9of0jSdIOzlaaBPxA2wYSWXm4kv7QXzZooxuGqhn0+JKuq2+oO9y5QUig+c3oG\n"
+            + "a5mpVblmv5ZL6Gc36kCbeEC8j6JkNT4wnceQwpNUNYtPU186cjy3rAD4C58w0Uvp\n"
+            + "HZZSTc0syLOShQr//We39LUNaX6WF3NmyF8K/OM=\n"
+            + "=YDhQ\n"
+            + "-----END PGP PUBLIC KEY BLOCK-----\n",
         "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
-        + "Version: GnuPG v1\n"
-        + "\n"
-        + "lQOYBEx6nwkBCADuztv2tGhjPljwW46qEhth7ZnkdhYXuctZ6lNQuy5LMaEECE3C\n"
-        + "jvVKY+nBrgsLY2Trts+q+mdooBWvxy/qe5PAQTcPR83KjVS4fYwNMBgeRxBEZAZg\n"
-        + "DFwRRCsRrHost+cMgtzLocQ+vL3+9yTRAIe/WmYwbEDXg/c9JSC7kQbZqaAaOshO\n"
-        + "cIOyeB8/QoYee0fEnBzHMmcd0SB1YpwIvRG6v61lXmgpQ9CbovvXO6ZZyEyCX784\n"
-        + "9xprzqP1y03DPrbhuhBAY8EMf3KGJA1dEcU4+lbGEgmlOe2YSbWoLs7mRLFcq5xx\n"
-        + "JroYMtvXF04k4ZHNZAnT3IZc+lJyCqOp4vXpABEBAAEAB/0Yf+FiLHz/HYDbW9FF\n"
-        + "kmj7wXgFz7WRho6dsWQNxr5HmZZWxxFPMgJpONnc9GGOsApFAnLIrDraqX3AFFPO\n"
-        + "nxH36djfuPKcYqZ77Olm2vXGeWzqT0a2KN5zKQawH/1CxDUwe+Zx/60V8KAfXbSJ\n"
-        + "up+ymnAcbKa0VYYSYFI82/KTdthJ1jFMNtXkaLskpM8TrDBCgd38m8Dpb5GCrDVY\n"
-        + "faZgkHokTTrvaTcx7ebGOxlOcbfzOPMJyFiz6lHf4JGr5ZVQXymaAG18kRDFxXHm\n"
-        + "AskOJIxnMdcy2IzNximht2CIgRuGznyPoeh/j8KFONKIKf3N6dVfV12uIvGOVV+D\n"
-        + "/ZQZBAD2dennp3Z4IsOWkgHTG3bloOVcIY5n+WvliQY/5G3psKdKeaGZxt6MhMSj\n"
-        + "sJEiUgveYTt5PxvQc5jmFEyjEQJmDAHo3RbycdFVvICrKIhKFyIlcVFCOSwDvLAW\n"
-        + "aZhu/m47jGnnYZ+bDzZl4X8L7Zu8e3TStEiVhjYTRqJfdEdMVQQA+A0ehIhIa1mJ\n"
-        + "ytGKWQVxn9BwKTP583vf2qPzul7yDEsYdGfoA0QGUicVwV4NNK3vK3FQM9MBSevp\n"
-        + "JFpxh2bRS/tgd5tFDyRqekTcagMqTxnJoIpCPUvj5D+WXsS1Kwrcm7OpWoNHOcjD\n"
-        + "Hbhk/966QALO+T6BTVLx32/72jtQ10UD/RsqQfRDzlQUOd6ZYOlH5qCb1+f8f3qJ\n"
-        + "yUmudrmjj8unBK3QbBVrxZ1h9AyaI5evFmsMlLKdTp0y49CmrSQmgEnUYzvBDjse\n"
-        + "/jYanpRKnt69HeZFilHLIF+HBbQfSM66UVXVoJSNTJIsncVa0IcGoZTpCUVOng3/\n"
-        + "MLfW4sh9NX1yRIi0HlRlc3R1c2VyIEQgPHRlc3RkQGV4YW1wbGUuY29tPokBOAQT\n"
-        + "AQIAIgUCTHqfCQIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQqZHi1Q/d\n"
-        + "Nne/0wgApuPzh4J8p2quCK1ScsJHlgGRojGqIDPhZFtPn0p2IAkqr5sAhvZAjd3u\n"
-        + "9A2DqQ7pwOX7gnGRE7dSrK69IAjfbRMc5k16aBK2ADq2YgPEmTToots1A0Tj+LaC\n"
-        + "FOXYUtEkgAC+RfFIkCdt8z86GIr0kg19Q/vYI/LtvThAk28D8yIfDnW49Mc4GGq+\n"
-        + "qvrOytBaGu3dzW0mjYWGEyl0fdSjNqtKyWN7Qw70Kqysaoy1KiPRAgwiPQfMCEx6\n"
-        + "pVaXuAfgRKaJ18kCNOldpajLgQv6yeY7mhguQ3Qe7xQlAtVObxskcTH2CWggl2dP\n"
-        + "qSMNieLK0g/ER8PIReGDCBXNSJ4qYZ0DmARMep8JAQgAw/o1nhJPLGlIfEMzOGU0\n"
-        + "Jjj+DwEyB3QIEEc+WKRvgtGsJ4cbZdaGWBJqjSo7e9XC9jA2ih0+Gld0vWV7S0LZ\n"
-        + "84xXxQeadC+AZBFR+b9ga4aUFIji8Tdi2dWXQmY76hHIaF8rs6aJB7lRig735VRL\n"
-        + "xVHOb194t9KLUzZiEKqd71BvLQyuLqAfTEsTGRHgmydaxZbGXz+Z57jbQgm11CQE\n"
-        + "HX1dtS8uqWb64xrV5GAeuEhRj4R6Yiy7OPNixXHxryH2Jd34pA0cGHYVcTgVjXuZ\n"
-        + "9FFP2SnXuxABONGAIaJuqg7ozYBa2kOdr0DN5Pxy5ocR7R2ZoN0pYD5+Cc7oGHju\n"
-        + "CQARAQABAAf/QiN/k9y+/pB7h4BQWXCCNIIYb6zqGuzUSdYZWuYHwiEL1f05SFmp\n"
-        + "VjDE5+ZAU+8U0Gv+BAeRbWdlfQOyI/ioQJL1DggeXqanUF4uCbjGDBPLhtCZsmmM\n"
-        + "QVLdrOl+v+SHe33e7E7AQSyQMaUSkUEtHycYIasZPQRfw9H/L3u9OEWXkMUbPso5\n"
-        + "L0A0StkcsM1isYfC8ApnF4zSTWHO9uqnc+qE4qChCqsGvaSIyLKEpVe4F0vEkbrq\n"
-        + "3usVp3cxJd9apN+JjMoC9dHJcQahgfJZ1jzgJ3rueRxrGZV+keo8VmyrDGFCerX9\n"
-        + "6Ke3RPMHN/evCHyPMtHC82QKYuy4ZTvldwQAyzbNKIIpNjyHRc/hXLMBUtnW0VYS\n"
-        + "dELA1VBMmT/d6Xx6pI9gg9HCjDx+DuQRych7ShxrYLL1pNQD8jwEJhZIeUpSgIFD\n"
-        + "BXdwkiGbmdrU5N0tBhxp8kRcqcGbL68zC9S0X2hNju6Dxu9hbG8ZAdYaCdAavVy0\n"
-        + "O6E66+T0cLRBinsEAPbiL/0rpV15DdITwD3hvzhYDyURE+yxQZe9ngS1uoui3mGn\n"
-        + "bLc/L/nbHf2Z91ViSsUaqJjpb2/eDsJtGJ9pFlFLTndujkA62CktJytD9DIYLlYD\n"
-        + "huXlsKvZkNZEZNDKLC5Tg8YR/28Opz0/ZFzfVuJAQqg7+iWkxklG3SvN71RLA/9x\n"
-        + "wun1AEw6tLJ2R2j8+yXIt8UaWExqAviT/JgZELVXdCTqcYuOmktsM2z+2D+OyUtP\n"
-        + "7+Yyz7MGQKMAU+V/1uOK4YqwUJrcGy501o9Of+xm+5DASsK1oM5e9sBdmNewdLHL\n"
-        + "ZJEllURrEC6zCE/4zzs7qUfakH4l4ZJgjRL6va+ED0HfiQEfBBgBAgAJBQJMep8J\n"
-        + "AhsMAAoJEKmR4tUP3TZ369QIAKPlfX2TUfhP3otYiaa24zBJ/cvGljGiSfX0Krau\n"
-        + "sBHH161jlraJfLzpe7vSOZhwZwgIY/eKoErAkJwVnX1+dLuOcHaqRDi5gnLqa6Yg\n"
-        + "9a2LWb4zrvgsvbiNUs1o9htOcvcpv7e3UUUcRa8lO+aNkO+VoI6DI8RJ3wIfJayb\n"
-        + "oePRXdfr8g9of0jSdIOzlaaBPxA2wYSWXm4kv7QXzZooxuGqhn0+JKuq2+oO9y5Q\n"
-        + "Uig+c3oGa5mpVblmv5ZL6Gc36kCbeEC8j6JkNT4wnceQwpNUNYtPU186cjy3rAD4\n"
-        + "C58w0UvpHZZSTc0syLOShQr//We39LUNaX6WF3NmyF8K/OM=\n"
-        + "=e1xT\n"
-        + "-----END PGP PRIVATE KEY BLOCK-----\n");
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "lQOYBEx6nwkBCADuztv2tGhjPljwW46qEhth7ZnkdhYXuctZ6lNQuy5LMaEECE3C\n"
+            + "jvVKY+nBrgsLY2Trts+q+mdooBWvxy/qe5PAQTcPR83KjVS4fYwNMBgeRxBEZAZg\n"
+            + "DFwRRCsRrHost+cMgtzLocQ+vL3+9yTRAIe/WmYwbEDXg/c9JSC7kQbZqaAaOshO\n"
+            + "cIOyeB8/QoYee0fEnBzHMmcd0SB1YpwIvRG6v61lXmgpQ9CbovvXO6ZZyEyCX784\n"
+            + "9xprzqP1y03DPrbhuhBAY8EMf3KGJA1dEcU4+lbGEgmlOe2YSbWoLs7mRLFcq5xx\n"
+            + "JroYMtvXF04k4ZHNZAnT3IZc+lJyCqOp4vXpABEBAAEAB/0Yf+FiLHz/HYDbW9FF\n"
+            + "kmj7wXgFz7WRho6dsWQNxr5HmZZWxxFPMgJpONnc9GGOsApFAnLIrDraqX3AFFPO\n"
+            + "nxH36djfuPKcYqZ77Olm2vXGeWzqT0a2KN5zKQawH/1CxDUwe+Zx/60V8KAfXbSJ\n"
+            + "up+ymnAcbKa0VYYSYFI82/KTdthJ1jFMNtXkaLskpM8TrDBCgd38m8Dpb5GCrDVY\n"
+            + "faZgkHokTTrvaTcx7ebGOxlOcbfzOPMJyFiz6lHf4JGr5ZVQXymaAG18kRDFxXHm\n"
+            + "AskOJIxnMdcy2IzNximht2CIgRuGznyPoeh/j8KFONKIKf3N6dVfV12uIvGOVV+D\n"
+            + "/ZQZBAD2dennp3Z4IsOWkgHTG3bloOVcIY5n+WvliQY/5G3psKdKeaGZxt6MhMSj\n"
+            + "sJEiUgveYTt5PxvQc5jmFEyjEQJmDAHo3RbycdFVvICrKIhKFyIlcVFCOSwDvLAW\n"
+            + "aZhu/m47jGnnYZ+bDzZl4X8L7Zu8e3TStEiVhjYTRqJfdEdMVQQA+A0ehIhIa1mJ\n"
+            + "ytGKWQVxn9BwKTP583vf2qPzul7yDEsYdGfoA0QGUicVwV4NNK3vK3FQM9MBSevp\n"
+            + "JFpxh2bRS/tgd5tFDyRqekTcagMqTxnJoIpCPUvj5D+WXsS1Kwrcm7OpWoNHOcjD\n"
+            + "Hbhk/966QALO+T6BTVLx32/72jtQ10UD/RsqQfRDzlQUOd6ZYOlH5qCb1+f8f3qJ\n"
+            + "yUmudrmjj8unBK3QbBVrxZ1h9AyaI5evFmsMlLKdTp0y49CmrSQmgEnUYzvBDjse\n"
+            + "/jYanpRKnt69HeZFilHLIF+HBbQfSM66UVXVoJSNTJIsncVa0IcGoZTpCUVOng3/\n"
+            + "MLfW4sh9NX1yRIi0HlRlc3R1c2VyIEQgPHRlc3RkQGV4YW1wbGUuY29tPokBOAQT\n"
+            + "AQIAIgUCTHqfCQIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQqZHi1Q/d\n"
+            + "Nne/0wgApuPzh4J8p2quCK1ScsJHlgGRojGqIDPhZFtPn0p2IAkqr5sAhvZAjd3u\n"
+            + "9A2DqQ7pwOX7gnGRE7dSrK69IAjfbRMc5k16aBK2ADq2YgPEmTToots1A0Tj+LaC\n"
+            + "FOXYUtEkgAC+RfFIkCdt8z86GIr0kg19Q/vYI/LtvThAk28D8yIfDnW49Mc4GGq+\n"
+            + "qvrOytBaGu3dzW0mjYWGEyl0fdSjNqtKyWN7Qw70Kqysaoy1KiPRAgwiPQfMCEx6\n"
+            + "pVaXuAfgRKaJ18kCNOldpajLgQv6yeY7mhguQ3Qe7xQlAtVObxskcTH2CWggl2dP\n"
+            + "qSMNieLK0g/ER8PIReGDCBXNSJ4qYZ0DmARMep8JAQgAw/o1nhJPLGlIfEMzOGU0\n"
+            + "Jjj+DwEyB3QIEEc+WKRvgtGsJ4cbZdaGWBJqjSo7e9XC9jA2ih0+Gld0vWV7S0LZ\n"
+            + "84xXxQeadC+AZBFR+b9ga4aUFIji8Tdi2dWXQmY76hHIaF8rs6aJB7lRig735VRL\n"
+            + "xVHOb194t9KLUzZiEKqd71BvLQyuLqAfTEsTGRHgmydaxZbGXz+Z57jbQgm11CQE\n"
+            + "HX1dtS8uqWb64xrV5GAeuEhRj4R6Yiy7OPNixXHxryH2Jd34pA0cGHYVcTgVjXuZ\n"
+            + "9FFP2SnXuxABONGAIaJuqg7ozYBa2kOdr0DN5Pxy5ocR7R2ZoN0pYD5+Cc7oGHju\n"
+            + "CQARAQABAAf/QiN/k9y+/pB7h4BQWXCCNIIYb6zqGuzUSdYZWuYHwiEL1f05SFmp\n"
+            + "VjDE5+ZAU+8U0Gv+BAeRbWdlfQOyI/ioQJL1DggeXqanUF4uCbjGDBPLhtCZsmmM\n"
+            + "QVLdrOl+v+SHe33e7E7AQSyQMaUSkUEtHycYIasZPQRfw9H/L3u9OEWXkMUbPso5\n"
+            + "L0A0StkcsM1isYfC8ApnF4zSTWHO9uqnc+qE4qChCqsGvaSIyLKEpVe4F0vEkbrq\n"
+            + "3usVp3cxJd9apN+JjMoC9dHJcQahgfJZ1jzgJ3rueRxrGZV+keo8VmyrDGFCerX9\n"
+            + "6Ke3RPMHN/evCHyPMtHC82QKYuy4ZTvldwQAyzbNKIIpNjyHRc/hXLMBUtnW0VYS\n"
+            + "dELA1VBMmT/d6Xx6pI9gg9HCjDx+DuQRych7ShxrYLL1pNQD8jwEJhZIeUpSgIFD\n"
+            + "BXdwkiGbmdrU5N0tBhxp8kRcqcGbL68zC9S0X2hNju6Dxu9hbG8ZAdYaCdAavVy0\n"
+            + "O6E66+T0cLRBinsEAPbiL/0rpV15DdITwD3hvzhYDyURE+yxQZe9ngS1uoui3mGn\n"
+            + "bLc/L/nbHf2Z91ViSsUaqJjpb2/eDsJtGJ9pFlFLTndujkA62CktJytD9DIYLlYD\n"
+            + "huXlsKvZkNZEZNDKLC5Tg8YR/28Opz0/ZFzfVuJAQqg7+iWkxklG3SvN71RLA/9x\n"
+            + "wun1AEw6tLJ2R2j8+yXIt8UaWExqAviT/JgZELVXdCTqcYuOmktsM2z+2D+OyUtP\n"
+            + "7+Yyz7MGQKMAU+V/1uOK4YqwUJrcGy501o9Of+xm+5DASsK1oM5e9sBdmNewdLHL\n"
+            + "ZJEllURrEC6zCE/4zzs7qUfakH4l4ZJgjRL6va+ED0HfiQEfBBgBAgAJBQJMep8J\n"
+            + "AhsMAAoJEKmR4tUP3TZ369QIAKPlfX2TUfhP3otYiaa24zBJ/cvGljGiSfX0Krau\n"
+            + "sBHH161jlraJfLzpe7vSOZhwZwgIY/eKoErAkJwVnX1+dLuOcHaqRDi5gnLqa6Yg\n"
+            + "9a2LWb4zrvgsvbiNUs1o9htOcvcpv7e3UUUcRa8lO+aNkO+VoI6DI8RJ3wIfJayb\n"
+            + "oePRXdfr8g9of0jSdIOzlaaBPxA2wYSWXm4kv7QXzZooxuGqhn0+JKuq2+oO9y5Q\n"
+            + "Uig+c3oGa5mpVblmv5ZL6Gc36kCbeEC8j6JkNT4wnceQwpNUNYtPU186cjy3rAD4\n"
+            + "C58w0UvpHZZSTc0syLOShQr//We39LUNaX6WF3NmyF8K/OM=\n"
+            + "=e1xT\n"
+            + "-----END PGP PRIVATE KEY BLOCK-----\n");
   }
 
   /**
-   * pub   2048R/4B4387EE 2010-08-29 [expired: 2011-08-29]
-   *       Key fingerprint = F01D 677C 8BDB 854E 1054  406E 3B09 B97F 4B43 87EE
-   * uid                  Testuser E <teste@example.com>
+   * pub 2048R/4B4387EE 2010-08-29 [expired: 2011-08-29] Key fingerprint = F01D 677C 8BDB 854E 1054
+   * 406E 3B09 B97F 4B43 87EE uid Testuser E <teste@example.com>
    */
   public static TestKey keyE() throws Exception {
-    return new TestKey("-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
-        + "Version: GnuPG v1\n"
-        + "\n"
-        + "mQENBEx6nxoBCADjYOWOFa7ZBJpRuNspRoXBTK0LiK5zqN894b87LgIYEgUM6q5J\n"
-        + "yLNo43x7V+ow1/7BEq0JUAMSQ3uRn2jqXiJskSXvwlFYcTVFb0gY09CSD0ptHvda\n"
-        + "zqYOuM/MU1l9jqmlM+pDw/z0pLTKYmAHi6pKJ64pqccMHPUZHpLywyzSNX+JM86I\n"
-        + "K5KAsyGArtgpT9vfci3idNeXjhMR8rfLPDFbdGvGFOZrYv0cfgTbBpVEWeHjs2FR\n"
-        + "4vHG133AdjdZcvA9Y9VW34ZLeiyBEeFix7+HPVS82rko2kQxZu1UZRu340maKDAo\n"
-        + "+UVirgo0FQ8nNUR+c9oNKgiZtO39IAPJv/WZABEBAAG0HlRlc3R1c2VyIEUgPHRl\n"
-        + "c3RlQGV4YW1wbGUuY29tPokBPgQTAQIAKAUCTHqfGgIbAwUJAeEzgAYLCQgHAwIG\n"
-        + "FQgCCQoLBBYCAwECHgECF4AACgkQOwm5f0tDh+6Fowf9FZgntlW4qc7BHe8zYJ0q\n"
-        + "zoLZrHwCFcaeO3kz53y5Lz3+plMuqVDjoQDOt8DxsPHrXWKiu0qBTjZ28ztN3ef6\n"
-        + "f0MpguTGclvFroevUct0xiyox5r1DfMT8JRvqsojE1XPscR2zJzIgEg3OCPuksT9\n"
-        + "EsHsF+/3RBbsXbQgDpW38g0GzIJI4AiQ/yvG2ON9awN2kzIWoBkthVCGy54lCTGj\n"
-        + "yPhatE7Zu2ABNcerIDstupWww2Psec6pGbPPci8ojc90fzalk3UMXcXHD7m8cTJS\n"
-        + "kgHScOzTElIQqOA1+w6uiHy2oAn+qW7534j6p9Tj+DrSIzUXBedGjXZevaKaurVy\n"
-        + "KLkBDQRMep8aAQgAn5r6toYnEzwDeig8r+t89vqOFtohYcmtyeLeTiTTdAz/xWBW\n"
-        + "HUlqV8sglQ9aINpGtBf37v13RhtU3WkUv8cZMQoRM8P2H3cKDNwkucFO6uKSEQO5\n"
-        + "FdzTm4C4WaoE7QiTRbiekwh7O54mz4Wup6LHuEFQEcSpdRUp8w/qaJIHG9EJad1q\n"
-        + "UEsKNnITW+mWHY3+ccK1hgqPwOPqO3/8QtaipekKOYAtOb+57c1jtDFBZnYIkant\n"
-        + "oKs+kRw0DykXFTyFOMYqaleBMcVG+u7ljwAq18L8Ev+qVIpBIZ5eQ5+6p1w9B69h\n"
-        + "RH0Ebn50ebpoqKOXhN4/bu/wq596y0o4xDB0GQARAQABiQElBBgBAgAPBQJMep8a\n"
-        + "AhsMBQkB4TOAAAoJEDsJuX9LQ4fu0/wH/35/22xina8ktbvGV/kB0pH2LBqeXN/b\n"
-        + "CLdA+CDzfwMDzqG0kU39EJ3Fbux7fj4uMaeiYfbO9U85+NOuDmeH41B2dM9S1AzE\n"
-        + "H+/OiCp/Zf1fdd1qXhsA4Xe5vc/VD9oso9OrZK5CM5u0TPmYFijfVDPNgag6mPnD\n"
-        + "zd8JCsuEj4VEy6NF1KcoCc8edQ8AZ4L6ZQ6qiV24gxLnh8xImVr5YjBKDUCdrl79\n"
-        + "0u4wekfgapSx9Sw9Ycz5dFOL07OOHPiKZwUG0f8td6oJX4Ddxset5JAm1pPcLQHR\n"
-        + "6PRx0hI/Tz7rsAI6O37/BEM15+MVGIgOSLL/SRIpOa0L8qmuUhhS6Bg=\n"
-        + "=uA5x\n"
-        + "-----END PGP PUBLIC KEY BLOCK-----\n",
+    return new TestKey(
+        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "mQENBEx6nxoBCADjYOWOFa7ZBJpRuNspRoXBTK0LiK5zqN894b87LgIYEgUM6q5J\n"
+            + "yLNo43x7V+ow1/7BEq0JUAMSQ3uRn2jqXiJskSXvwlFYcTVFb0gY09CSD0ptHvda\n"
+            + "zqYOuM/MU1l9jqmlM+pDw/z0pLTKYmAHi6pKJ64pqccMHPUZHpLywyzSNX+JM86I\n"
+            + "K5KAsyGArtgpT9vfci3idNeXjhMR8rfLPDFbdGvGFOZrYv0cfgTbBpVEWeHjs2FR\n"
+            + "4vHG133AdjdZcvA9Y9VW34ZLeiyBEeFix7+HPVS82rko2kQxZu1UZRu340maKDAo\n"
+            + "+UVirgo0FQ8nNUR+c9oNKgiZtO39IAPJv/WZABEBAAG0HlRlc3R1c2VyIEUgPHRl\n"
+            + "c3RlQGV4YW1wbGUuY29tPokBPgQTAQIAKAUCTHqfGgIbAwUJAeEzgAYLCQgHAwIG\n"
+            + "FQgCCQoLBBYCAwECHgECF4AACgkQOwm5f0tDh+6Fowf9FZgntlW4qc7BHe8zYJ0q\n"
+            + "zoLZrHwCFcaeO3kz53y5Lz3+plMuqVDjoQDOt8DxsPHrXWKiu0qBTjZ28ztN3ef6\n"
+            + "f0MpguTGclvFroevUct0xiyox5r1DfMT8JRvqsojE1XPscR2zJzIgEg3OCPuksT9\n"
+            + "EsHsF+/3RBbsXbQgDpW38g0GzIJI4AiQ/yvG2ON9awN2kzIWoBkthVCGy54lCTGj\n"
+            + "yPhatE7Zu2ABNcerIDstupWww2Psec6pGbPPci8ojc90fzalk3UMXcXHD7m8cTJS\n"
+            + "kgHScOzTElIQqOA1+w6uiHy2oAn+qW7534j6p9Tj+DrSIzUXBedGjXZevaKaurVy\n"
+            + "KLkBDQRMep8aAQgAn5r6toYnEzwDeig8r+t89vqOFtohYcmtyeLeTiTTdAz/xWBW\n"
+            + "HUlqV8sglQ9aINpGtBf37v13RhtU3WkUv8cZMQoRM8P2H3cKDNwkucFO6uKSEQO5\n"
+            + "FdzTm4C4WaoE7QiTRbiekwh7O54mz4Wup6LHuEFQEcSpdRUp8w/qaJIHG9EJad1q\n"
+            + "UEsKNnITW+mWHY3+ccK1hgqPwOPqO3/8QtaipekKOYAtOb+57c1jtDFBZnYIkant\n"
+            + "oKs+kRw0DykXFTyFOMYqaleBMcVG+u7ljwAq18L8Ev+qVIpBIZ5eQ5+6p1w9B69h\n"
+            + "RH0Ebn50ebpoqKOXhN4/bu/wq596y0o4xDB0GQARAQABiQElBBgBAgAPBQJMep8a\n"
+            + "AhsMBQkB4TOAAAoJEDsJuX9LQ4fu0/wH/35/22xina8ktbvGV/kB0pH2LBqeXN/b\n"
+            + "CLdA+CDzfwMDzqG0kU39EJ3Fbux7fj4uMaeiYfbO9U85+NOuDmeH41B2dM9S1AzE\n"
+            + "H+/OiCp/Zf1fdd1qXhsA4Xe5vc/VD9oso9OrZK5CM5u0TPmYFijfVDPNgag6mPnD\n"
+            + "zd8JCsuEj4VEy6NF1KcoCc8edQ8AZ4L6ZQ6qiV24gxLnh8xImVr5YjBKDUCdrl79\n"
+            + "0u4wekfgapSx9Sw9Ycz5dFOL07OOHPiKZwUG0f8td6oJX4Ddxset5JAm1pPcLQHR\n"
+            + "6PRx0hI/Tz7rsAI6O37/BEM15+MVGIgOSLL/SRIpOa0L8qmuUhhS6Bg=\n"
+            + "=uA5x\n"
+            + "-----END PGP PUBLIC KEY BLOCK-----\n",
         "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
-        + "Version: GnuPG v1\n"
-        + "\n"
-        + "lQOYBEx6nxoBCADjYOWOFa7ZBJpRuNspRoXBTK0LiK5zqN894b87LgIYEgUM6q5J\n"
-        + "yLNo43x7V+ow1/7BEq0JUAMSQ3uRn2jqXiJskSXvwlFYcTVFb0gY09CSD0ptHvda\n"
-        + "zqYOuM/MU1l9jqmlM+pDw/z0pLTKYmAHi6pKJ64pqccMHPUZHpLywyzSNX+JM86I\n"
-        + "K5KAsyGArtgpT9vfci3idNeXjhMR8rfLPDFbdGvGFOZrYv0cfgTbBpVEWeHjs2FR\n"
-        + "4vHG133AdjdZcvA9Y9VW34ZLeiyBEeFix7+HPVS82rko2kQxZu1UZRu340maKDAo\n"
-        + "+UVirgo0FQ8nNUR+c9oNKgiZtO39IAPJv/WZABEBAAEAB/4xKKzYqDVyM/2NN5Mi\n"
-        + "fF3EqegruzRESzlgrqLij5LiU1sGLOLbjunC/pPWMu6t+rTYV0pT3hmb5D0eAcH0\n"
-        + "EcANiuAR0wg1P9yNk36Z54mLWoTzzKMb3dunCSvb+BU8AREKZ4v5dLEGz2lK7DPo\n"
-        + "zbhWaffMiClBpC0VbjfFBo91LrVUVnhRglBYKdPLQm/Lhw5cNCYOw194ZturO+cC\n"
-        + "iQZhGSy52HMoMs4Wr470CeFZvvWaiDCirVLcj4UhMsVANFKsahMARm9c+QrGrkRP\n"
-        + "+654f8M9ptapcQYpGOMmaeZVnpocONXOTkiJd7Hhr4PRUY+QS8C8F0LbmL2ERQbL\n"
-        + "F65RBADkIelztY/8Xy2S0jsW7+xF2ziz9riOR87G6b0wrXDdFz4GHPzLvwsdXOeN\n"
-        + "cODic14d9bf5jtXr9hgbAzx55ANDjOl3jK5qil8Z9qwsrNK9Mz0wT1acQXBwf/5D\n"
-        + "hI/whBK1FsH7Y+wdX64XA3EXmclxB8GZf1JsGXF3jNH30vyS7QQA/ydoMMw8ja9L\n"
-        + "j6MxHtVHcE4A4j6tFljLDuf8icOwwNUfb7SsHTDjUI2+30ZJOv+qISrthsASCSj3\n"
-        + "AN87CGdVR62Xe923DNdW8/moKKDILNaESyOi27qhI5qWrVRgNB5QwbQcSoClUxbj\n"
-        + "V7YZSfrZkiI+GE1gh1QPMOVyCUmqu90D+wc0x0wUj8emX/4xbbujOa5RAvNcNvnD\n"
-        + "mOB2CfPWD10TEeOOlHBhuoy2/GdIl76W0szJaxnzcV82VArllSciCBzpSfkExDZ6\n"
-        + "08hA8GpOsuOmAAPwXWZsb8YZbJeM0ULMgUCGHgvUj1/pGsCVA6c7sPAdkCfAFlmO\n"
-        + "smC9bvpS2VHZPuG0HlRlc3R1c2VyIEUgPHRlc3RlQGV4YW1wbGUuY29tPokBPgQT\n"
-        + "AQIAKAUCTHqfGgIbAwUJAeEzgAYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ\n"
-        + "Owm5f0tDh+6Fowf9FZgntlW4qc7BHe8zYJ0qzoLZrHwCFcaeO3kz53y5Lz3+plMu\n"
-        + "qVDjoQDOt8DxsPHrXWKiu0qBTjZ28ztN3ef6f0MpguTGclvFroevUct0xiyox5r1\n"
-        + "DfMT8JRvqsojE1XPscR2zJzIgEg3OCPuksT9EsHsF+/3RBbsXbQgDpW38g0GzIJI\n"
-        + "4AiQ/yvG2ON9awN2kzIWoBkthVCGy54lCTGjyPhatE7Zu2ABNcerIDstupWww2Ps\n"
-        + "ec6pGbPPci8ojc90fzalk3UMXcXHD7m8cTJSkgHScOzTElIQqOA1+w6uiHy2oAn+\n"
-        + "qW7534j6p9Tj+DrSIzUXBedGjXZevaKaurVyKJ0DmARMep8aAQgAn5r6toYnEzwD\n"
-        + "eig8r+t89vqOFtohYcmtyeLeTiTTdAz/xWBWHUlqV8sglQ9aINpGtBf37v13RhtU\n"
-        + "3WkUv8cZMQoRM8P2H3cKDNwkucFO6uKSEQO5FdzTm4C4WaoE7QiTRbiekwh7O54m\n"
-        + "z4Wup6LHuEFQEcSpdRUp8w/qaJIHG9EJad1qUEsKNnITW+mWHY3+ccK1hgqPwOPq\n"
-        + "O3/8QtaipekKOYAtOb+57c1jtDFBZnYIkantoKs+kRw0DykXFTyFOMYqaleBMcVG\n"
-        + "+u7ljwAq18L8Ev+qVIpBIZ5eQ5+6p1w9B69hRH0Ebn50ebpoqKOXhN4/bu/wq596\n"
-        + "y0o4xDB0GQARAQABAAf7Bk9bQCIXo2QJAyhaFd5qh10qhu7CyRnvG/8zKMW98mWd\n"
-        + "KxF+9hNz99qZBCuiNZBLoU0dST6OG6By/3nrDxXxAgZS3cgOj/nl1NJTRWDGHPUu\n"
-        + "LywFgj7Dwu8Y2rqlDTX8lJIS+t8n+BhtkmDHoesGmFtErh8nT/CxQuHLM60qSMgv\n"
-        + "6mSmtOkM+2KfiA5z2o1fDWXjDieW+hdgDPxkaB835wfuDn/Dsn1ch1XHON0xSyTo\n"
-        + "+c35nFXoK1pAXaoalAxZNxcXCAM3NhU37Ih4GejM0K7sSgK72HmgxtNYF77DrTIM\n"
-        + "m5+3960ri1JUuEaJ7ZcqbpKxy/GDldNCYBTx07QMzQQAyYQ+ujT9Pj8zfp1jMLRs\n"
-        + "Xn9GsvYawjo+AIZuHeUmmIXfEoyNmsEUoGHnz9ROLnJzanW5XEStiTys8tHJPIkz\n"
-        + "zL0Ce0oUF93ln0z/jQBIKaSzYB7PMmYCd7ueF94aKqAOrQ/QBb+6JsVjGAtLUoTv\n"
-        + "ey09hGYMogiBV1r0MB2Rsa8EAMrB5VKVQF6+q0XuP6ljFQRaumi4lH7PoQ65E7UD\n"
-        + "6YpyQpLBOE7dV+fHizdUuwsD/wyAOu0EskV1ZLXvXzyk10r3PRoFdpHOvijwZBGt\n"
-        + "jiOiVvK1vkQKDMBczOe74+DaknKn6HzgCsXmLgfk+P8BtLOJnCYsbS9IbnImy2vi\n"
-        + "aJC3A/9wOOK+po8C7JPHVIEfxbe7nwHOoi/h7T4uPrlq/gcQRquqGhQ16nDGYZvX\n"
-        + "ny9aPQ3NcvDR69RM2AaXav03bHVxfhVEyGjP5jLZz7956e4LlnKrsuEhDLfiv30i\n"
-        + "qCC7zNHNA99s5u25vt8AuPVVHfSQ++jifabfv5lU4FHqmK8/4EAoiQElBBgBAgAP\n"
-        + "BQJMep8aAhsMBQkB4TOAAAoJEDsJuX9LQ4fu0/wH/35/22xina8ktbvGV/kB0pH2\n"
-        + "LBqeXN/bCLdA+CDzfwMDzqG0kU39EJ3Fbux7fj4uMaeiYfbO9U85+NOuDmeH41B2\n"
-        + "dM9S1AzEH+/OiCp/Zf1fdd1qXhsA4Xe5vc/VD9oso9OrZK5CM5u0TPmYFijfVDPN\n"
-        + "gag6mPnDzd8JCsuEj4VEy6NF1KcoCc8edQ8AZ4L6ZQ6qiV24gxLnh8xImVr5YjBK\n"
-        + "DUCdrl790u4wekfgapSx9Sw9Ycz5dFOL07OOHPiKZwUG0f8td6oJX4Ddxset5JAm\n"
-        + "1pPcLQHR6PRx0hI/Tz7rsAI6O37/BEM15+MVGIgOSLL/SRIpOa0L8qmuUhhS6Bg=\n"
-        + "=HTKj\n"
-        + "-----END PGP PRIVATE KEY BLOCK-----\n");
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "lQOYBEx6nxoBCADjYOWOFa7ZBJpRuNspRoXBTK0LiK5zqN894b87LgIYEgUM6q5J\n"
+            + "yLNo43x7V+ow1/7BEq0JUAMSQ3uRn2jqXiJskSXvwlFYcTVFb0gY09CSD0ptHvda\n"
+            + "zqYOuM/MU1l9jqmlM+pDw/z0pLTKYmAHi6pKJ64pqccMHPUZHpLywyzSNX+JM86I\n"
+            + "K5KAsyGArtgpT9vfci3idNeXjhMR8rfLPDFbdGvGFOZrYv0cfgTbBpVEWeHjs2FR\n"
+            + "4vHG133AdjdZcvA9Y9VW34ZLeiyBEeFix7+HPVS82rko2kQxZu1UZRu340maKDAo\n"
+            + "+UVirgo0FQ8nNUR+c9oNKgiZtO39IAPJv/WZABEBAAEAB/4xKKzYqDVyM/2NN5Mi\n"
+            + "fF3EqegruzRESzlgrqLij5LiU1sGLOLbjunC/pPWMu6t+rTYV0pT3hmb5D0eAcH0\n"
+            + "EcANiuAR0wg1P9yNk36Z54mLWoTzzKMb3dunCSvb+BU8AREKZ4v5dLEGz2lK7DPo\n"
+            + "zbhWaffMiClBpC0VbjfFBo91LrVUVnhRglBYKdPLQm/Lhw5cNCYOw194ZturO+cC\n"
+            + "iQZhGSy52HMoMs4Wr470CeFZvvWaiDCirVLcj4UhMsVANFKsahMARm9c+QrGrkRP\n"
+            + "+654f8M9ptapcQYpGOMmaeZVnpocONXOTkiJd7Hhr4PRUY+QS8C8F0LbmL2ERQbL\n"
+            + "F65RBADkIelztY/8Xy2S0jsW7+xF2ziz9riOR87G6b0wrXDdFz4GHPzLvwsdXOeN\n"
+            + "cODic14d9bf5jtXr9hgbAzx55ANDjOl3jK5qil8Z9qwsrNK9Mz0wT1acQXBwf/5D\n"
+            + "hI/whBK1FsH7Y+wdX64XA3EXmclxB8GZf1JsGXF3jNH30vyS7QQA/ydoMMw8ja9L\n"
+            + "j6MxHtVHcE4A4j6tFljLDuf8icOwwNUfb7SsHTDjUI2+30ZJOv+qISrthsASCSj3\n"
+            + "AN87CGdVR62Xe923DNdW8/moKKDILNaESyOi27qhI5qWrVRgNB5QwbQcSoClUxbj\n"
+            + "V7YZSfrZkiI+GE1gh1QPMOVyCUmqu90D+wc0x0wUj8emX/4xbbujOa5RAvNcNvnD\n"
+            + "mOB2CfPWD10TEeOOlHBhuoy2/GdIl76W0szJaxnzcV82VArllSciCBzpSfkExDZ6\n"
+            + "08hA8GpOsuOmAAPwXWZsb8YZbJeM0ULMgUCGHgvUj1/pGsCVA6c7sPAdkCfAFlmO\n"
+            + "smC9bvpS2VHZPuG0HlRlc3R1c2VyIEUgPHRlc3RlQGV4YW1wbGUuY29tPokBPgQT\n"
+            + "AQIAKAUCTHqfGgIbAwUJAeEzgAYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ\n"
+            + "Owm5f0tDh+6Fowf9FZgntlW4qc7BHe8zYJ0qzoLZrHwCFcaeO3kz53y5Lz3+plMu\n"
+            + "qVDjoQDOt8DxsPHrXWKiu0qBTjZ28ztN3ef6f0MpguTGclvFroevUct0xiyox5r1\n"
+            + "DfMT8JRvqsojE1XPscR2zJzIgEg3OCPuksT9EsHsF+/3RBbsXbQgDpW38g0GzIJI\n"
+            + "4AiQ/yvG2ON9awN2kzIWoBkthVCGy54lCTGjyPhatE7Zu2ABNcerIDstupWww2Ps\n"
+            + "ec6pGbPPci8ojc90fzalk3UMXcXHD7m8cTJSkgHScOzTElIQqOA1+w6uiHy2oAn+\n"
+            + "qW7534j6p9Tj+DrSIzUXBedGjXZevaKaurVyKJ0DmARMep8aAQgAn5r6toYnEzwD\n"
+            + "eig8r+t89vqOFtohYcmtyeLeTiTTdAz/xWBWHUlqV8sglQ9aINpGtBf37v13RhtU\n"
+            + "3WkUv8cZMQoRM8P2H3cKDNwkucFO6uKSEQO5FdzTm4C4WaoE7QiTRbiekwh7O54m\n"
+            + "z4Wup6LHuEFQEcSpdRUp8w/qaJIHG9EJad1qUEsKNnITW+mWHY3+ccK1hgqPwOPq\n"
+            + "O3/8QtaipekKOYAtOb+57c1jtDFBZnYIkantoKs+kRw0DykXFTyFOMYqaleBMcVG\n"
+            + "+u7ljwAq18L8Ev+qVIpBIZ5eQ5+6p1w9B69hRH0Ebn50ebpoqKOXhN4/bu/wq596\n"
+            + "y0o4xDB0GQARAQABAAf7Bk9bQCIXo2QJAyhaFd5qh10qhu7CyRnvG/8zKMW98mWd\n"
+            + "KxF+9hNz99qZBCuiNZBLoU0dST6OG6By/3nrDxXxAgZS3cgOj/nl1NJTRWDGHPUu\n"
+            + "LywFgj7Dwu8Y2rqlDTX8lJIS+t8n+BhtkmDHoesGmFtErh8nT/CxQuHLM60qSMgv\n"
+            + "6mSmtOkM+2KfiA5z2o1fDWXjDieW+hdgDPxkaB835wfuDn/Dsn1ch1XHON0xSyTo\n"
+            + "+c35nFXoK1pAXaoalAxZNxcXCAM3NhU37Ih4GejM0K7sSgK72HmgxtNYF77DrTIM\n"
+            + "m5+3960ri1JUuEaJ7ZcqbpKxy/GDldNCYBTx07QMzQQAyYQ+ujT9Pj8zfp1jMLRs\n"
+            + "Xn9GsvYawjo+AIZuHeUmmIXfEoyNmsEUoGHnz9ROLnJzanW5XEStiTys8tHJPIkz\n"
+            + "zL0Ce0oUF93ln0z/jQBIKaSzYB7PMmYCd7ueF94aKqAOrQ/QBb+6JsVjGAtLUoTv\n"
+            + "ey09hGYMogiBV1r0MB2Rsa8EAMrB5VKVQF6+q0XuP6ljFQRaumi4lH7PoQ65E7UD\n"
+            + "6YpyQpLBOE7dV+fHizdUuwsD/wyAOu0EskV1ZLXvXzyk10r3PRoFdpHOvijwZBGt\n"
+            + "jiOiVvK1vkQKDMBczOe74+DaknKn6HzgCsXmLgfk+P8BtLOJnCYsbS9IbnImy2vi\n"
+            + "aJC3A/9wOOK+po8C7JPHVIEfxbe7nwHOoi/h7T4uPrlq/gcQRquqGhQ16nDGYZvX\n"
+            + "ny9aPQ3NcvDR69RM2AaXav03bHVxfhVEyGjP5jLZz7956e4LlnKrsuEhDLfiv30i\n"
+            + "qCC7zNHNA99s5u25vt8AuPVVHfSQ++jifabfv5lU4FHqmK8/4EAoiQElBBgBAgAP\n"
+            + "BQJMep8aAhsMBQkB4TOAAAoJEDsJuX9LQ4fu0/wH/35/22xina8ktbvGV/kB0pH2\n"
+            + "LBqeXN/bCLdA+CDzfwMDzqG0kU39EJ3Fbux7fj4uMaeiYfbO9U85+NOuDmeH41B2\n"
+            + "dM9S1AzEH+/OiCp/Zf1fdd1qXhsA4Xe5vc/VD9oso9OrZK5CM5u0TPmYFijfVDPN\n"
+            + "gag6mPnDzd8JCsuEj4VEy6NF1KcoCc8edQ8AZ4L6ZQ6qiV24gxLnh8xImVr5YjBK\n"
+            + "DUCdrl790u4wekfgapSx9Sw9Ycz5dFOL07OOHPiKZwUG0f8td6oJX4Ddxset5JAm\n"
+            + "1pPcLQHR6PRx0hI/Tz7rsAI6O37/BEM15+MVGIgOSLL/SRIpOa0L8qmuUhhS6Bg=\n"
+            + "=HTKj\n"
+            + "-----END PGP PRIVATE KEY BLOCK-----\n");
   }
 
   /**
-   * pub   2048R/31FA48C4 2010-09-01
-   *       Key fingerprint = 85CE F045 8113 42DA 14A4  42AA 4A9F AC70 31FA 48C4
-   * uid                  Testuser F <testf@example.com>
-   * sub   2048R/50FF7D5C 2010-09-01
+   * pub 2048R/31FA48C4 2010-09-01 Key fingerprint = 85CE F045 8113 42DA 14A4 42AA 4A9F AC70 31FA
+   * 48C4 uid Testuser F <testf@example.com> sub 2048R/50FF7D5C 2010-09-01
    */
   public static TestKey keyF() throws Exception {
-    return new TestKey("-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
-        + "Version: GnuPG v1\n"
-        + "\n"
-        + "mQENBEx+aQkBCADycHmQ8wC4GzaDIvw4uv6/HiTWOUmuLcT06PpsvNBdR2sQ6Vyy\n"
-        + "w1SAnaPmskdgxE7TXpDrwIWPmIkg8KzSfPAap6qZy5zyE1ABQa9yD9v6wsew+lM5\n"
-        + "3UdBO6HQodpWSJMbeR48mUQ96z72B7Lb2GvhFLxvcn5od9jQhbQXfb2k67l33hgR\n"
-        + "D427lxXa+qnmL9pMRGhRw6QATFX+icHxsPfpKnzuk0aY3feJm4+jr4RgHP4djH3i\n"
-        + "NZbv3ibZ24Dj3CK07PwbhqUhZwMqueWbo3ChYjLkRGT/UosNTN0EbHjqBMl4N9OT\n"
-        + "Pl2CM6kuzuaLz3ZeAf48B29GX4rAXfuJTKBbABEBAAG0HlRlc3R1c2VyIEYgPHRl\n"
-        + "c3RmQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTH5pCQIbAwYLCQgHAwIGFQgCCQoL\n"
-        + "BBYCAwECHgECF4AACgkQSp+scDH6SMRfqggAh//U/l4JuwFgWx14mo0SB9YWU81L\n"
-        + "EgUYUd2MUzvX4p/HIFQa0c7stj68Za40+O0tG/J0RCMNb7piM9JFii+MQZzOVuza\n"
-        + "4bbO59D9qboc7Anvx9hGlfIdinT+n5rwX9kZvD2D7GMskm8ZgovkvNwNKcW+5W/4\n"
-        + "ciWqCJKE/Fp9XsooJgN94pJfgDQ2WBL5KDx1aGt4wZXhH2Atl6a6oVZJIH4SaizD\n"
-        + "jau7F4vc7hBfbcDhxFcrVX1QMpzpl352cIx6KVw4FRWvQ8VKkga4JiQwosfvCT2Z\n"
-        + "pdMwy3cARynv8BWLc4Uexf88QIeClP9ZhoVeMqvHMfUb3d6Q5362VdZqI4kBIAQQ\n"
-        + "AQIACgUCTH5xcgMFCngACgkQiptSk+LTK6UqsAgAlsEmzC3Xxv4o5ui95AFbWZGi\n"
-        + "es5rI9WoW2P+6OqVUy1E8+5HdlJ8wUbU1H7JAdFTjY9rH3vKXCXsTetF4z0cupER\n"
-        + "Rkx06M9/jl5OSw8i9bPNNJFobHwiiNO00ctC1tT5oUVXVsfPQHlEbMofv8jehfgC\n"
-        + "gMqH/ve/aafKFfYCZkNHugRgLzxeDpXp3IdyXoSAFGiULnGvMDN7n61QOvEYOw2Z\n"
-        + "i63ql+bL2oj4G+/bNOkdYkuIBN4F/P45P7xy80MSOvkMH7IG/aFTKMNQGWSykKwI\n"
-        + "FRkC+y+F5Oqf/WD30GvbSA7q013sb6nHYvsaHS/48cgIJ5TSVd0LTlrF9uv43bkB\n"
-        + "DQRMfmkJAQgAzc1uAF4x16Cx4GtHI0Hvm+v7bUEUtBw2XzyOKu883XC5JmGcY18y\n"
-        + "YItRpchAtmacDpu0/2925/mWF7aS9RMgSYI/1D9LaTeimISM3iGFY35kt78NGZwJ\n"
-        + "DeCPJPI1sbOU0njfrCPTbOQuRDJ6evaBNX9HYArSEp0ygruJdOUYgnepCt4A7W95\n"
-        + "EKp9KPo7XV1K8y86vrKbgpJ+NnEi7dzMqVxnhO4wAWqb6HYcKLrEc2gVnLtzHkBl\n"
-        + "Y/6dOP15jgQKql1/yQIXae/WGT24n/VeaKqrbSmDNkhW5eW5o1Bkgy/M98oNHXd0\n"
-        + "nVrT8Lyf6un5TwMy+vk0l5AjMMtIZKS0GQARAQABiQEfBBgBAgAJBQJMfmkJAhsM\n"
-        + "AAoJEEqfrHAx+kjEvDAH/iO6BHQfFa+kqjfYD3NE+FNosXv3jiXOU7SCD2MG3AwD\n"
-        + "YqM+v1n4UvvMLLdEbtboht1Btys1vuyNM3RAmR45oh9Dfuc4SKtVzSCkKs85jNvH\n"
-        + "7Ik8gxZ9ARzJbawNzTLFyLwDdcdX42Umuvh49Pn7Nc7FDYcZLffEcTh9sZ7KyxLY\n"
-        + "qcjtnblx5oOQnYnpBbM61GvgNXC8Z+g9fg0oHRouKXKE/HDKbsN0siEf9XJFJTKd\n"
-        + "Eg1NgoyKWdaV4+pU/fTzZUvvDqOSRx8he5w64dvW9o7WdARq/3vPvHgy0O8fMTSI\n"
-        + "tmcHxCU8l0jptJz181N36Uhmjyc9oC4dn9ceSn6VDbg=\n"
-        + "=WDx2\n"
-        + "-----END PGP PUBLIC KEY BLOCK-----\n",
+    return new TestKey(
+        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "mQENBEx+aQkBCADycHmQ8wC4GzaDIvw4uv6/HiTWOUmuLcT06PpsvNBdR2sQ6Vyy\n"
+            + "w1SAnaPmskdgxE7TXpDrwIWPmIkg8KzSfPAap6qZy5zyE1ABQa9yD9v6wsew+lM5\n"
+            + "3UdBO6HQodpWSJMbeR48mUQ96z72B7Lb2GvhFLxvcn5od9jQhbQXfb2k67l33hgR\n"
+            + "D427lxXa+qnmL9pMRGhRw6QATFX+icHxsPfpKnzuk0aY3feJm4+jr4RgHP4djH3i\n"
+            + "NZbv3ibZ24Dj3CK07PwbhqUhZwMqueWbo3ChYjLkRGT/UosNTN0EbHjqBMl4N9OT\n"
+            + "Pl2CM6kuzuaLz3ZeAf48B29GX4rAXfuJTKBbABEBAAG0HlRlc3R1c2VyIEYgPHRl\n"
+            + "c3RmQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTH5pCQIbAwYLCQgHAwIGFQgCCQoL\n"
+            + "BBYCAwECHgECF4AACgkQSp+scDH6SMRfqggAh//U/l4JuwFgWx14mo0SB9YWU81L\n"
+            + "EgUYUd2MUzvX4p/HIFQa0c7stj68Za40+O0tG/J0RCMNb7piM9JFii+MQZzOVuza\n"
+            + "4bbO59D9qboc7Anvx9hGlfIdinT+n5rwX9kZvD2D7GMskm8ZgovkvNwNKcW+5W/4\n"
+            + "ciWqCJKE/Fp9XsooJgN94pJfgDQ2WBL5KDx1aGt4wZXhH2Atl6a6oVZJIH4SaizD\n"
+            + "jau7F4vc7hBfbcDhxFcrVX1QMpzpl352cIx6KVw4FRWvQ8VKkga4JiQwosfvCT2Z\n"
+            + "pdMwy3cARynv8BWLc4Uexf88QIeClP9ZhoVeMqvHMfUb3d6Q5362VdZqI4kBIAQQ\n"
+            + "AQIACgUCTH5xcgMFCngACgkQiptSk+LTK6UqsAgAlsEmzC3Xxv4o5ui95AFbWZGi\n"
+            + "es5rI9WoW2P+6OqVUy1E8+5HdlJ8wUbU1H7JAdFTjY9rH3vKXCXsTetF4z0cupER\n"
+            + "Rkx06M9/jl5OSw8i9bPNNJFobHwiiNO00ctC1tT5oUVXVsfPQHlEbMofv8jehfgC\n"
+            + "gMqH/ve/aafKFfYCZkNHugRgLzxeDpXp3IdyXoSAFGiULnGvMDN7n61QOvEYOw2Z\n"
+            + "i63ql+bL2oj4G+/bNOkdYkuIBN4F/P45P7xy80MSOvkMH7IG/aFTKMNQGWSykKwI\n"
+            + "FRkC+y+F5Oqf/WD30GvbSA7q013sb6nHYvsaHS/48cgIJ5TSVd0LTlrF9uv43bkB\n"
+            + "DQRMfmkJAQgAzc1uAF4x16Cx4GtHI0Hvm+v7bUEUtBw2XzyOKu883XC5JmGcY18y\n"
+            + "YItRpchAtmacDpu0/2925/mWF7aS9RMgSYI/1D9LaTeimISM3iGFY35kt78NGZwJ\n"
+            + "DeCPJPI1sbOU0njfrCPTbOQuRDJ6evaBNX9HYArSEp0ygruJdOUYgnepCt4A7W95\n"
+            + "EKp9KPo7XV1K8y86vrKbgpJ+NnEi7dzMqVxnhO4wAWqb6HYcKLrEc2gVnLtzHkBl\n"
+            + "Y/6dOP15jgQKql1/yQIXae/WGT24n/VeaKqrbSmDNkhW5eW5o1Bkgy/M98oNHXd0\n"
+            + "nVrT8Lyf6un5TwMy+vk0l5AjMMtIZKS0GQARAQABiQEfBBgBAgAJBQJMfmkJAhsM\n"
+            + "AAoJEEqfrHAx+kjEvDAH/iO6BHQfFa+kqjfYD3NE+FNosXv3jiXOU7SCD2MG3AwD\n"
+            + "YqM+v1n4UvvMLLdEbtboht1Btys1vuyNM3RAmR45oh9Dfuc4SKtVzSCkKs85jNvH\n"
+            + "7Ik8gxZ9ARzJbawNzTLFyLwDdcdX42Umuvh49Pn7Nc7FDYcZLffEcTh9sZ7KyxLY\n"
+            + "qcjtnblx5oOQnYnpBbM61GvgNXC8Z+g9fg0oHRouKXKE/HDKbsN0siEf9XJFJTKd\n"
+            + "Eg1NgoyKWdaV4+pU/fTzZUvvDqOSRx8he5w64dvW9o7WdARq/3vPvHgy0O8fMTSI\n"
+            + "tmcHxCU8l0jptJz181N36Uhmjyc9oC4dn9ceSn6VDbg=\n"
+            + "=WDx2\n"
+            + "-----END PGP PUBLIC KEY BLOCK-----\n",
         "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
-        + "Version: GnuPG v1\n"
-        + "\n"
-        + "lQOYBEx+aQkBCADycHmQ8wC4GzaDIvw4uv6/HiTWOUmuLcT06PpsvNBdR2sQ6Vyy\n"
-        + "w1SAnaPmskdgxE7TXpDrwIWPmIkg8KzSfPAap6qZy5zyE1ABQa9yD9v6wsew+lM5\n"
-        + "3UdBO6HQodpWSJMbeR48mUQ96z72B7Lb2GvhFLxvcn5od9jQhbQXfb2k67l33hgR\n"
-        + "D427lxXa+qnmL9pMRGhRw6QATFX+icHxsPfpKnzuk0aY3feJm4+jr4RgHP4djH3i\n"
-        + "NZbv3ibZ24Dj3CK07PwbhqUhZwMqueWbo3ChYjLkRGT/UosNTN0EbHjqBMl4N9OT\n"
-        + "Pl2CM6kuzuaLz3ZeAf48B29GX4rAXfuJTKBbABEBAAEAB/4vTP+C5s5snS6ZDlHc\n"
-        + "datvOV/hhgLYn2huiigV4A7dLCp4/bbOz+pkP51zTLQ9bn+coLYwsPq+Bfo3OY3W\n"
-        + "cXbdFHpmEEJaPqdc32ZuICcAuVEBuA1V3FTjJtHO5U02iWleMlbSZurYE9ZQZTch\n"
-        + "yotdulB7hACivENKh9OXw7ok+1GZVvBGA8tpIwzLZo0Pkb2lDQHaL0GXAjlMNzwg\n"
-        + "cCPFtzjNu6K4g58nuYrjGiE+yWPMJgfo4fTGXcapqXgvh1tKIVxwr2YQSyEOqfMH\n"
-        + "8EwgBj5NPwv0UXAivQUkTaguUJXrlJLtS3mp45nCEAlGT4PNoMyPdvPEf62gND7C\n"
-        + "y9K1BAD493ADPAx9pWCSQI9wp4ARUelTzwHgZ6fRVIzmwO6MuZN1PrtiOLCwY5Jw\n"
-        + "r+97VvMmem7Ya3khP4vz0IiN7p1oCR5nJazk2eRaQNuim0aB0lqrTsli8OXtBlgQ\n"
-        + "5WtLcRi5798Jw8coczc5OftZKhu1SbQZ1VdDdmTbMTAsSRtMjQQA+UnU6FYJZBjE\n"
-        + "NHNheV6+k45HXHubcCm4Ka3kJK88zbZzyt+nrBLEtElosxDCqT8WbiAH7qmpnd/r\n"
-        + "ly7ryIX08etuWVYnx0Xa02cKQ6TzNcbxijeGQYGHIE0RK29nRo8zRWVmbCydqJz1\n"
-        + "5cHgcvoTu7DWWjM5QEZlLPQytJeAyocEAM6AiWDXYVZVnCB9w0wwK/9cX0v3tfYv\n"
-        + "QrJZCT3/YKxJWnMZ+LgHYO0w1B0YwGEeVTnmXODDy5mRh9lxV1aZnwKCwMR1tXTx\n"
-        + "G1potBR0GJxI2xpMb/MJPxeJCAZPu8NncRpl/8v0stiGnkpYCNR/k3JV5jEXq0u6\n"
-        + "4pDSzRGehOHnOqu0HlRlc3R1c2VyIEYgPHRlc3RmQGV4YW1wbGUuY29tPokBOAQT\n"
-        + "AQIAIgUCTH5pCQIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQSp+scDH6\n"
-        + "SMRfqggAh//U/l4JuwFgWx14mo0SB9YWU81LEgUYUd2MUzvX4p/HIFQa0c7stj68\n"
-        + "Za40+O0tG/J0RCMNb7piM9JFii+MQZzOVuza4bbO59D9qboc7Anvx9hGlfIdinT+\n"
-        + "n5rwX9kZvD2D7GMskm8ZgovkvNwNKcW+5W/4ciWqCJKE/Fp9XsooJgN94pJfgDQ2\n"
-        + "WBL5KDx1aGt4wZXhH2Atl6a6oVZJIH4SaizDjau7F4vc7hBfbcDhxFcrVX1QMpzp\n"
-        + "l352cIx6KVw4FRWvQ8VKkga4JiQwosfvCT2ZpdMwy3cARynv8BWLc4Uexf88QIeC\n"
-        + "lP9ZhoVeMqvHMfUb3d6Q5362VdZqI50DmARMfmkJAQgAzc1uAF4x16Cx4GtHI0Hv\n"
-        + "m+v7bUEUtBw2XzyOKu883XC5JmGcY18yYItRpchAtmacDpu0/2925/mWF7aS9RMg\n"
-        + "SYI/1D9LaTeimISM3iGFY35kt78NGZwJDeCPJPI1sbOU0njfrCPTbOQuRDJ6evaB\n"
-        + "NX9HYArSEp0ygruJdOUYgnepCt4A7W95EKp9KPo7XV1K8y86vrKbgpJ+NnEi7dzM\n"
-        + "qVxnhO4wAWqb6HYcKLrEc2gVnLtzHkBlY/6dOP15jgQKql1/yQIXae/WGT24n/Ve\n"
-        + "aKqrbSmDNkhW5eW5o1Bkgy/M98oNHXd0nVrT8Lyf6un5TwMy+vk0l5AjMMtIZKS0\n"
-        + "GQARAQABAAf/T22JFmhESUnSTOBqeK+Sd/WIOJ7lDCxVScVXwzdJINfIBYmnr2yG\n"
-        + "x18NuHOEkkEg2rx6ixksZZRcurMynZZvoB8+Xj69bpLT1JRXv8VlM0SNP6NjPW6M\n"
-        + "ygfQhzxZv8ck2WRgQxIin8SjHJv0zG9F5+1DEUyrzhZQb8dMYkqm/nbZ1FDnMu4F\n"
-        + "1qUZxKx0hU70tAXfywtpH9NQs8jwenUjiXA00k6A48BF7gartYtcGnEG9mk+Z+lh\n"
-        + "/uD+z5j3/ym9XqOJPpFIWhMYTLueSD5yrCT34VdIc1xBOjjtxBsCCbgSFZaewCpB\n"
-        + "5usRr2I4+CK3vbAMny5Hk+/RYZdFQkCA5wQA2JusdhwqPjfzxtcxz13Vu1ZzKR41\n"
-        + "kkno/boGh5afBlf7kL/5FXDhGVVvHMvXtQntU1kHgOcE8b2Jfy38gNGkd3TAh4Oj\n"
-        + "fLavcYyn+9tEkjRVdOeU0P9fszDA1cW5Gjuv6GkbCUSQrv68TKp/mWiTlYm+FT3a\n"
-        + "RSIz2gEyOZNkTzsEAPM6sU/VOwpJ2ppOa5+290sptjSbRNYjKlQ66nHZnbafzLz5\n"
-        + "tKpRc0BzG/N2lXwlVl5+3oXSSSbWhJscA8EFwSnAx8Id10zW5NAEfxNuqxxEXlJg\n"
-        + "kOhqwJ1JMz32xlZFRZYxSdXSycYrX/AhV7I7RQxgC48X9udMb8LIXYq0lzy7A/9p\n"
-        + "Skd2Me9JotuTN3OaR42hXozLx+yERBBEWuI3WXovWRD8b8gCfWL3P40d2UVnjFmP\n"
-        + "TZ8p9aHAd2srWgaPSZaSsHtIyI6dQGScMEOKEaCJxYvF/wuvx/MABDatcaJhMaAc\n"
-        + "W/0w+gb8Lr2hbuRhBSP754V3Amma6LxsmLRAwB6ioT7NiQEfBBgBAgAJBQJMfmkJ\n"
-        + "AhsMAAoJEEqfrHAx+kjEvDAH/iO6BHQfFa+kqjfYD3NE+FNosXv3jiXOU7SCD2MG\n"
-        + "3AwDYqM+v1n4UvvMLLdEbtboht1Btys1vuyNM3RAmR45oh9Dfuc4SKtVzSCkKs85\n"
-        + "jNvH7Ik8gxZ9ARzJbawNzTLFyLwDdcdX42Umuvh49Pn7Nc7FDYcZLffEcTh9sZ7K\n"
-        + "yxLYqcjtnblx5oOQnYnpBbM61GvgNXC8Z+g9fg0oHRouKXKE/HDKbsN0siEf9XJF\n"
-        + "JTKdEg1NgoyKWdaV4+pU/fTzZUvvDqOSRx8he5w64dvW9o7WdARq/3vPvHgy0O8f\n"
-        + "MTSItmcHxCU8l0jptJz181N36Uhmjyc9oC4dn9ceSn6VDbg=\n"
-        + "=ZLpl\n"
-        + "-----END PGP PRIVATE KEY BLOCK-----\n");
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "lQOYBEx+aQkBCADycHmQ8wC4GzaDIvw4uv6/HiTWOUmuLcT06PpsvNBdR2sQ6Vyy\n"
+            + "w1SAnaPmskdgxE7TXpDrwIWPmIkg8KzSfPAap6qZy5zyE1ABQa9yD9v6wsew+lM5\n"
+            + "3UdBO6HQodpWSJMbeR48mUQ96z72B7Lb2GvhFLxvcn5od9jQhbQXfb2k67l33hgR\n"
+            + "D427lxXa+qnmL9pMRGhRw6QATFX+icHxsPfpKnzuk0aY3feJm4+jr4RgHP4djH3i\n"
+            + "NZbv3ibZ24Dj3CK07PwbhqUhZwMqueWbo3ChYjLkRGT/UosNTN0EbHjqBMl4N9OT\n"
+            + "Pl2CM6kuzuaLz3ZeAf48B29GX4rAXfuJTKBbABEBAAEAB/4vTP+C5s5snS6ZDlHc\n"
+            + "datvOV/hhgLYn2huiigV4A7dLCp4/bbOz+pkP51zTLQ9bn+coLYwsPq+Bfo3OY3W\n"
+            + "cXbdFHpmEEJaPqdc32ZuICcAuVEBuA1V3FTjJtHO5U02iWleMlbSZurYE9ZQZTch\n"
+            + "yotdulB7hACivENKh9OXw7ok+1GZVvBGA8tpIwzLZo0Pkb2lDQHaL0GXAjlMNzwg\n"
+            + "cCPFtzjNu6K4g58nuYrjGiE+yWPMJgfo4fTGXcapqXgvh1tKIVxwr2YQSyEOqfMH\n"
+            + "8EwgBj5NPwv0UXAivQUkTaguUJXrlJLtS3mp45nCEAlGT4PNoMyPdvPEf62gND7C\n"
+            + "y9K1BAD493ADPAx9pWCSQI9wp4ARUelTzwHgZ6fRVIzmwO6MuZN1PrtiOLCwY5Jw\n"
+            + "r+97VvMmem7Ya3khP4vz0IiN7p1oCR5nJazk2eRaQNuim0aB0lqrTsli8OXtBlgQ\n"
+            + "5WtLcRi5798Jw8coczc5OftZKhu1SbQZ1VdDdmTbMTAsSRtMjQQA+UnU6FYJZBjE\n"
+            + "NHNheV6+k45HXHubcCm4Ka3kJK88zbZzyt+nrBLEtElosxDCqT8WbiAH7qmpnd/r\n"
+            + "ly7ryIX08etuWVYnx0Xa02cKQ6TzNcbxijeGQYGHIE0RK29nRo8zRWVmbCydqJz1\n"
+            + "5cHgcvoTu7DWWjM5QEZlLPQytJeAyocEAM6AiWDXYVZVnCB9w0wwK/9cX0v3tfYv\n"
+            + "QrJZCT3/YKxJWnMZ+LgHYO0w1B0YwGEeVTnmXODDy5mRh9lxV1aZnwKCwMR1tXTx\n"
+            + "G1potBR0GJxI2xpMb/MJPxeJCAZPu8NncRpl/8v0stiGnkpYCNR/k3JV5jEXq0u6\n"
+            + "4pDSzRGehOHnOqu0HlRlc3R1c2VyIEYgPHRlc3RmQGV4YW1wbGUuY29tPokBOAQT\n"
+            + "AQIAIgUCTH5pCQIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQSp+scDH6\n"
+            + "SMRfqggAh//U/l4JuwFgWx14mo0SB9YWU81LEgUYUd2MUzvX4p/HIFQa0c7stj68\n"
+            + "Za40+O0tG/J0RCMNb7piM9JFii+MQZzOVuza4bbO59D9qboc7Anvx9hGlfIdinT+\n"
+            + "n5rwX9kZvD2D7GMskm8ZgovkvNwNKcW+5W/4ciWqCJKE/Fp9XsooJgN94pJfgDQ2\n"
+            + "WBL5KDx1aGt4wZXhH2Atl6a6oVZJIH4SaizDjau7F4vc7hBfbcDhxFcrVX1QMpzp\n"
+            + "l352cIx6KVw4FRWvQ8VKkga4JiQwosfvCT2ZpdMwy3cARynv8BWLc4Uexf88QIeC\n"
+            + "lP9ZhoVeMqvHMfUb3d6Q5362VdZqI50DmARMfmkJAQgAzc1uAF4x16Cx4GtHI0Hv\n"
+            + "m+v7bUEUtBw2XzyOKu883XC5JmGcY18yYItRpchAtmacDpu0/2925/mWF7aS9RMg\n"
+            + "SYI/1D9LaTeimISM3iGFY35kt78NGZwJDeCPJPI1sbOU0njfrCPTbOQuRDJ6evaB\n"
+            + "NX9HYArSEp0ygruJdOUYgnepCt4A7W95EKp9KPo7XV1K8y86vrKbgpJ+NnEi7dzM\n"
+            + "qVxnhO4wAWqb6HYcKLrEc2gVnLtzHkBlY/6dOP15jgQKql1/yQIXae/WGT24n/Ve\n"
+            + "aKqrbSmDNkhW5eW5o1Bkgy/M98oNHXd0nVrT8Lyf6un5TwMy+vk0l5AjMMtIZKS0\n"
+            + "GQARAQABAAf/T22JFmhESUnSTOBqeK+Sd/WIOJ7lDCxVScVXwzdJINfIBYmnr2yG\n"
+            + "x18NuHOEkkEg2rx6ixksZZRcurMynZZvoB8+Xj69bpLT1JRXv8VlM0SNP6NjPW6M\n"
+            + "ygfQhzxZv8ck2WRgQxIin8SjHJv0zG9F5+1DEUyrzhZQb8dMYkqm/nbZ1FDnMu4F\n"
+            + "1qUZxKx0hU70tAXfywtpH9NQs8jwenUjiXA00k6A48BF7gartYtcGnEG9mk+Z+lh\n"
+            + "/uD+z5j3/ym9XqOJPpFIWhMYTLueSD5yrCT34VdIc1xBOjjtxBsCCbgSFZaewCpB\n"
+            + "5usRr2I4+CK3vbAMny5Hk+/RYZdFQkCA5wQA2JusdhwqPjfzxtcxz13Vu1ZzKR41\n"
+            + "kkno/boGh5afBlf7kL/5FXDhGVVvHMvXtQntU1kHgOcE8b2Jfy38gNGkd3TAh4Oj\n"
+            + "fLavcYyn+9tEkjRVdOeU0P9fszDA1cW5Gjuv6GkbCUSQrv68TKp/mWiTlYm+FT3a\n"
+            + "RSIz2gEyOZNkTzsEAPM6sU/VOwpJ2ppOa5+290sptjSbRNYjKlQ66nHZnbafzLz5\n"
+            + "tKpRc0BzG/N2lXwlVl5+3oXSSSbWhJscA8EFwSnAx8Id10zW5NAEfxNuqxxEXlJg\n"
+            + "kOhqwJ1JMz32xlZFRZYxSdXSycYrX/AhV7I7RQxgC48X9udMb8LIXYq0lzy7A/9p\n"
+            + "Skd2Me9JotuTN3OaR42hXozLx+yERBBEWuI3WXovWRD8b8gCfWL3P40d2UVnjFmP\n"
+            + "TZ8p9aHAd2srWgaPSZaSsHtIyI6dQGScMEOKEaCJxYvF/wuvx/MABDatcaJhMaAc\n"
+            + "W/0w+gb8Lr2hbuRhBSP754V3Amma6LxsmLRAwB6ioT7NiQEfBBgBAgAJBQJMfmkJ\n"
+            + "AhsMAAoJEEqfrHAx+kjEvDAH/iO6BHQfFa+kqjfYD3NE+FNosXv3jiXOU7SCD2MG\n"
+            + "3AwDYqM+v1n4UvvMLLdEbtboht1Btys1vuyNM3RAmR45oh9Dfuc4SKtVzSCkKs85\n"
+            + "jNvH7Ik8gxZ9ARzJbawNzTLFyLwDdcdX42Umuvh49Pn7Nc7FDYcZLffEcTh9sZ7K\n"
+            + "yxLYqcjtnblx5oOQnYnpBbM61GvgNXC8Z+g9fg0oHRouKXKE/HDKbsN0siEf9XJF\n"
+            + "JTKdEg1NgoyKWdaV4+pU/fTzZUvvDqOSRx8he5w64dvW9o7WdARq/3vPvHgy0O8f\n"
+            + "MTSItmcHxCU8l0jptJz181N36Uhmjyc9oC4dn9ceSn6VDbg=\n"
+            + "=ZLpl\n"
+            + "-----END PGP PRIVATE KEY BLOCK-----\n");
   }
 
   /**
-   * pub   2048R/E2D32BA5 2010-09-01
-   *       Key fingerprint = CB2B 665B 88DA D56A 7009  C15D 8A9B 5293 E2D3 2BA5
-   * uid                  Testuser G <testg@example.com>
-   * sub   2048R/829DAE8D 2010-09-01
+   * pub 2048R/E2D32BA5 2010-09-01 Key fingerprint = CB2B 665B 88DA D56A 7009 C15D 8A9B 5293 E2D3
+   * 2BA5 uid Testuser G <testg@example.com> sub 2048R/829DAE8D 2010-09-01
    */
   public static TestKey keyG() throws Exception {
-    return new TestKey("-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
-        + "Version: GnuPG v1\n"
-        + "\n"
-        + "mQENBEx+aRYBCAC77YjBScTjRFHtZvk0yyAy8KAXopbCdMBQs7S7iidFMMxhs0Uu\n"
-        + "D7GeleyVusLFJfEM0Ul0b0pLgfJx9j3cot4BTl71OqnawHp4ktuqFyTjhhYy8kBe\n"
-        + "4mliNP36WW7fYXh+f5SZqDQ6rgyoJCOmiUlosb6CM2yUPH3oDtOKg/9Z0iMUcXfQ\n"
-        + "y+bxRKSQmDtiSIS7hwUZmQoo30iAZNygMBLnYyVau3YFan+xyBMCFLa2/pfE0qaU\n"
-        + "QMy67XP8uP7DXlepfc4Lk/qa/2WnAqmuTT2ty9MG+X8M8LuiPuMWfOEx8ICUWB9s\n"
-        + "kCCMWCagS7EUIPhp6AOqjMqEWGOyLmclkGCJABEBAAG0HlRlc3R1c2VyIEcgPHRl\n"
-        + "c3RnQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTH5pFgIbAwYLCQgHAwIGFQgCCQoL\n"
-        + "BBYCAwECHgECF4AACgkQiptSk+LTK6VSwQf/WnIYkLZoARZIUfH61EDlkUPv8+6G\n"
-        + "1YY3YgFFMjeOKybu47eU3QtATEaKHphvKqFtxdNyEtmti1Zx7Cq2LzReY1KoQQ5E\n"
-        + "OlKeyxVmXAuAqoRWesxuG318rVTrozCqSdKPCHLcC26M5sO+Gd2sKbA4DjoSyfrE\n"
-        + "zEOVS1NA9dtZ7WBMXr8gjH//ob7dvuptSAlADaLYYaJugcmbzkRGRbfiCQHqv30I\n"
-        + "+81d7RAeSx8XS38YEWm2IvBLpiS/d7A/2AQ25SHxf+QMMWt83+uOuEVa9rEOraid\n"
-        + "ZC6T8vnSRu1TKkX/60LnJvAw9tigmedi21O6Gpz3H3uGyjuk9o18+m8dJokBIAQQ\n"
-        + "AQIACgUCTH5xfAMFCngACgkQSp+scDH6SMT42gf9H7K0jp6PF1vD5t90bcjtnP/t\n"
-        + "CkOXgfL3lJK/l0KMkoDzyO5z898PP8IAnAj1veJ2fNPsRP903/3K8kd9/31kBriC\n"
-        + "poTVPWBmeLut16TgSDxAQPDLsBPcKe2VadhszOQwhfmdsUlCXwXcwbiAjweXwKh+\n"
-        + "00UoW1GLnPw0T387ttCjHsLe972SVUPFxb6NUkA7val62qxDKg+6MRcf6tDs8sN8\n"
-        + "orhYgh9VJcI3Iw8qK1wHI0CenNie0U5xEkZ5U6W4lfhnL5sggjoAeVeAVLiQ4eiP\n"
-        + "sFrq4TOYq9qfuThYiRaSuTLXzuWG5NVs7NyXxOGFSkwzXrQsBo+LuPwjSCERLbkB\n"
-        + "DQRMfmkWAQgA1O0I9vfZNSRuYTx++SkJccXXqL4neVWEnQ4Ws9tzfSG0Rch3Gb/d\n"
-        + "+ckDtJhlQOdaayTVX7h5k8tTGx0myg6OjG2UM6i+aTgFAzwGnBh/N3p5tTaJhRCF\n"
-        + "x1IapX0N7ijq6rQPPCISc3CUZhCVBTnp5dk3c0/hNxsyYXlI1AwuoMabygzTFN/c\n"
-        + "b1bXp0UTTVrdN+Sj5hHVDvpxyaljLa77I0V+lI3bCil9VhQ9h/TP4C2iK3ZdXOMb\n"
-        + "uW7ANhd+I9LWulmExZIiD9RIsHvB3bDu32g1847uT+DUynKETbZWlZS0Q93Aly1N\n"
-        + "lBIkvOCVCBt+VatzZ8oBV8vbk5R41W1HywARAQABiQEfBBgBAgAJBQJMfmkWAhsM\n"
-        + "AAoJEIqbUpPi0yul/doH+wR+o6UCdD6OZxGMx7d0a7yDJqQFkFf2DRsJvY2suug0\n"
-        + "CMJZRWiA+hIin5P6Brn/eb5nTdWgzlrHxkvb68YkevHALdOvmrYNQFXbb9uWGgEf\n"
-        + "3qERdI8ayJsSTqYsTqyuh9YVz21kADxTHN3JkJ4evjHpyz0Xbtq+oDADg+uswj1b\n"
-        + "ihHthFif54vNMEIW9rX9T7ufhXKamr4LuGwKTPTxV8gEPW4h4ZoQwFKV2qOjR+su\n"
-        + "tHnuXVL24kTnv8CHXUVzJXVTNz7i7fAJTgWc9drH6Ktp3XHfLDBwzT5/5ZhyxGJk\n"
-        + "Qq2Jm/Q8mNkXi34H2DeQ3VPtjtMLr9JR9pf6ivmvUag=\n"
-        + "=34GE\n"
-        + "-----END PGP PUBLIC KEY BLOCK-----\n",
+    return new TestKey(
+        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "mQENBEx+aRYBCAC77YjBScTjRFHtZvk0yyAy8KAXopbCdMBQs7S7iidFMMxhs0Uu\n"
+            + "D7GeleyVusLFJfEM0Ul0b0pLgfJx9j3cot4BTl71OqnawHp4ktuqFyTjhhYy8kBe\n"
+            + "4mliNP36WW7fYXh+f5SZqDQ6rgyoJCOmiUlosb6CM2yUPH3oDtOKg/9Z0iMUcXfQ\n"
+            + "y+bxRKSQmDtiSIS7hwUZmQoo30iAZNygMBLnYyVau3YFan+xyBMCFLa2/pfE0qaU\n"
+            + "QMy67XP8uP7DXlepfc4Lk/qa/2WnAqmuTT2ty9MG+X8M8LuiPuMWfOEx8ICUWB9s\n"
+            + "kCCMWCagS7EUIPhp6AOqjMqEWGOyLmclkGCJABEBAAG0HlRlc3R1c2VyIEcgPHRl\n"
+            + "c3RnQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTH5pFgIbAwYLCQgHAwIGFQgCCQoL\n"
+            + "BBYCAwECHgECF4AACgkQiptSk+LTK6VSwQf/WnIYkLZoARZIUfH61EDlkUPv8+6G\n"
+            + "1YY3YgFFMjeOKybu47eU3QtATEaKHphvKqFtxdNyEtmti1Zx7Cq2LzReY1KoQQ5E\n"
+            + "OlKeyxVmXAuAqoRWesxuG318rVTrozCqSdKPCHLcC26M5sO+Gd2sKbA4DjoSyfrE\n"
+            + "zEOVS1NA9dtZ7WBMXr8gjH//ob7dvuptSAlADaLYYaJugcmbzkRGRbfiCQHqv30I\n"
+            + "+81d7RAeSx8XS38YEWm2IvBLpiS/d7A/2AQ25SHxf+QMMWt83+uOuEVa9rEOraid\n"
+            + "ZC6T8vnSRu1TKkX/60LnJvAw9tigmedi21O6Gpz3H3uGyjuk9o18+m8dJokBIAQQ\n"
+            + "AQIACgUCTH5xfAMFCngACgkQSp+scDH6SMT42gf9H7K0jp6PF1vD5t90bcjtnP/t\n"
+            + "CkOXgfL3lJK/l0KMkoDzyO5z898PP8IAnAj1veJ2fNPsRP903/3K8kd9/31kBriC\n"
+            + "poTVPWBmeLut16TgSDxAQPDLsBPcKe2VadhszOQwhfmdsUlCXwXcwbiAjweXwKh+\n"
+            + "00UoW1GLnPw0T387ttCjHsLe972SVUPFxb6NUkA7val62qxDKg+6MRcf6tDs8sN8\n"
+            + "orhYgh9VJcI3Iw8qK1wHI0CenNie0U5xEkZ5U6W4lfhnL5sggjoAeVeAVLiQ4eiP\n"
+            + "sFrq4TOYq9qfuThYiRaSuTLXzuWG5NVs7NyXxOGFSkwzXrQsBo+LuPwjSCERLbkB\n"
+            + "DQRMfmkWAQgA1O0I9vfZNSRuYTx++SkJccXXqL4neVWEnQ4Ws9tzfSG0Rch3Gb/d\n"
+            + "+ckDtJhlQOdaayTVX7h5k8tTGx0myg6OjG2UM6i+aTgFAzwGnBh/N3p5tTaJhRCF\n"
+            + "x1IapX0N7ijq6rQPPCISc3CUZhCVBTnp5dk3c0/hNxsyYXlI1AwuoMabygzTFN/c\n"
+            + "b1bXp0UTTVrdN+Sj5hHVDvpxyaljLa77I0V+lI3bCil9VhQ9h/TP4C2iK3ZdXOMb\n"
+            + "uW7ANhd+I9LWulmExZIiD9RIsHvB3bDu32g1847uT+DUynKETbZWlZS0Q93Aly1N\n"
+            + "lBIkvOCVCBt+VatzZ8oBV8vbk5R41W1HywARAQABiQEfBBgBAgAJBQJMfmkWAhsM\n"
+            + "AAoJEIqbUpPi0yul/doH+wR+o6UCdD6OZxGMx7d0a7yDJqQFkFf2DRsJvY2suug0\n"
+            + "CMJZRWiA+hIin5P6Brn/eb5nTdWgzlrHxkvb68YkevHALdOvmrYNQFXbb9uWGgEf\n"
+            + "3qERdI8ayJsSTqYsTqyuh9YVz21kADxTHN3JkJ4evjHpyz0Xbtq+oDADg+uswj1b\n"
+            + "ihHthFif54vNMEIW9rX9T7ufhXKamr4LuGwKTPTxV8gEPW4h4ZoQwFKV2qOjR+su\n"
+            + "tHnuXVL24kTnv8CHXUVzJXVTNz7i7fAJTgWc9drH6Ktp3XHfLDBwzT5/5ZhyxGJk\n"
+            + "Qq2Jm/Q8mNkXi34H2DeQ3VPtjtMLr9JR9pf6ivmvUag=\n"
+            + "=34GE\n"
+            + "-----END PGP PUBLIC KEY BLOCK-----\n",
         "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
-        + "Version: GnuPG v1\n"
-        + "\n"
-        + "lQOXBEx+aRYBCAC77YjBScTjRFHtZvk0yyAy8KAXopbCdMBQs7S7iidFMMxhs0Uu\n"
-        + "D7GeleyVusLFJfEM0Ul0b0pLgfJx9j3cot4BTl71OqnawHp4ktuqFyTjhhYy8kBe\n"
-        + "4mliNP36WW7fYXh+f5SZqDQ6rgyoJCOmiUlosb6CM2yUPH3oDtOKg/9Z0iMUcXfQ\n"
-        + "y+bxRKSQmDtiSIS7hwUZmQoo30iAZNygMBLnYyVau3YFan+xyBMCFLa2/pfE0qaU\n"
-        + "QMy67XP8uP7DXlepfc4Lk/qa/2WnAqmuTT2ty9MG+X8M8LuiPuMWfOEx8ICUWB9s\n"
-        + "kCCMWCagS7EUIPhp6AOqjMqEWGOyLmclkGCJABEBAAEAB/QJiwZmylg1MkL2y0Pc\n"
-        + "anQ4If//M0J0nXkmn/mNjHZyDQhT7caVkDZ01ygsck9xs3uKKxaP0xbyvqaRIvAB\n"
-        + "REQBzPkFevUlJqERfmOpP4OgCi8WZzbdmqG/WvGKxP/cWBbGVbQ2GVSNpkj+QNeO\n"
-        + "nWoc5unFstbQsEG0hww2/Hz7EppYoBvDrDLY1EPKzr0r6sk1O5gk3VWOqMEJVCh+\n"
-        + "K7EV4pPGmzMrfZQ0jSwRpr0HhzzhDYR7+QUbxr4OS5PoSJDFh0+A5kqFagyupe7A\n"
-        + "96L3Lh7wJBQJsOe5xjOu3lkFp+3vU+Mq7VzO9Fnp9BCwjb4mEjI39bJdGeeOVCWR\n"
-        + "sYEEAMjmftMhIHrjGRlbZVrLcZY8Du4CFQqImb2Tluo/6siIEurVp4F2swZFm7fw\n"
-        + "B2v09GGJ6zKpauJuxlbwo3CFnxbk24W39F/SixZLggLPtNOXdSrLIQrQ1AXu5ucQ\n"
-        + "oCnXS5FaVkD3Rtd53hSMIf2xJiSRKGp/1X9hga/phScud7URBADveDh1oEmwl3gc\n"
-        + "gorhABLYV7cPrARteQRV13tYWcuAZ6WjqNlbbW2mzBE7KTh4bgTzIX0uQ6SZ7bPl\n"
-        + "RmuKQHrdOO9vFGiSf3zDnIg8fhqSyy2SNrC/e7teuaguGCrg5GrP5izBAsiwvXbt\n"
-        + "ST3OG7c8Ky717JGTiUeTJoe4IaET+QP/SB4uQzVTrbXjBNtq1KqL/CT7l2ABnXsn\n"
-        + "psaVwHOMmY/wP+PiazMEDvLInDAu7R8oLNGqYR+7UYmYeAGmWgrc0L3yFVC01tTG\n"
-        + "bk7Yt/V5KRKVO2I9x+2CP0v0EqW4BNOJzbx5TJ5lBFLMTvbviOdsoDXw0S98HIHB\n"
-        + "T1bFFmhVeulCDLQeVGVzdHVzZXIgRyA8dGVzdGdAZXhhbXBsZS5jb20+iQE4BBMB\n"
-        + "AgAiBQJMfmkWAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRCKm1KT4tMr\n"
-        + "pVLBB/9achiQtmgBFkhR8frUQOWRQ+/z7obVhjdiAUUyN44rJu7jt5TdC0BMRooe\n"
-        + "mG8qoW3F03IS2a2LVnHsKrYvNF5jUqhBDkQ6Up7LFWZcC4CqhFZ6zG4bfXytVOuj\n"
-        + "MKpJ0o8IctwLbozmw74Z3awpsDgOOhLJ+sTMQ5VLU0D121ntYExevyCMf/+hvt2+\n"
-        + "6m1ICUANothhom6ByZvOREZFt+IJAeq/fQj7zV3tEB5LHxdLfxgRabYi8EumJL93\n"
-        + "sD/YBDblIfF/5Awxa3zf6464RVr2sQ6tqJ1kLpPy+dJG7VMqRf/rQucm8DD22KCZ\n"
-        + "52LbU7oanPcfe4bKO6T2jXz6bx0mnQOYBEx+aRYBCADU7Qj299k1JG5hPH75KQlx\n"
-        + "xdeovid5VYSdDhaz23N9IbRFyHcZv935yQO0mGVA51prJNVfuHmTy1MbHSbKDo6M\n"
-        + "bZQzqL5pOAUDPAacGH83enm1NomFEIXHUhqlfQ3uKOrqtA88IhJzcJRmEJUFOenl\n"
-        + "2TdzT+E3GzJheUjUDC6gxpvKDNMU39xvVtenRRNNWt035KPmEdUO+nHJqWMtrvsj\n"
-        + "RX6UjdsKKX1WFD2H9M/gLaIrdl1c4xu5bsA2F34j0ta6WYTFkiIP1Eiwe8HdsO7f\n"
-        + "aDXzju5P4NTKcoRNtlaVlLRD3cCXLU2UEiS84JUIG35Vq3NnygFXy9uTlHjVbUfL\n"
-        + "ABEBAAEAB/48KLaaNJ+xhJgNMA797crF0uyiOAumG/PqfeMLMQs5xQ6OktuXsl6Q\n"
-        + "pus9mLsu8c7Zq9//efsbt1xFMmDVwPQkmAdB60DVMKc16T1C2CcFcTy25vBG4Mqz\n"
-        + "bK6rqCAJ9JSe+H2/cy78X8gF6FR6VAkSUGN62IxcyfnbkW1yv/hiowZ5pQpGVjBH\n"
-        + "sjfu+6HGZhdJIyzrjnVjTJhXNCodtKq1lQGuL2t3ZB6osOXEsFtsI6lQF2s6QZZd\n"
-        + "MUOpSO+X1Rb5TCpWpR/Yj43sH6Tq7LZWEml9fV4wKe2PQWmFW+L8eZCwbYEz6GgZ\n"
-        + "w2pMoMxxOZJsOMOq4LFs4r9qaNQI+sU1BADZhx42JjqBIUsq0OhQcCizjCbPURNw\n"
-        + "7HRfPV8SQkldzmccVzGwFIKQqAVglNdT9AQefUQzx84CRqmWaROXaypkulOB79gM\n"
-        + "R/C/aXOdWz9/dGJ9fT/gcgq1vg9zt7dPE5QIYlhmNdfQPt6R50bUTXe22N2UYL98\n"
-        + "n1pQrhAdlsbT3QQA+pWPXQE4k3Hm7pwCycM2d4TmOIfB6YiaxjMNsZiepV4bqWPX\n"
-        + "iaHh0gw1f8Av6zmMncQELKRspA8Zrj3ZzB/OvNwfpgpqmjS0LyH4u8fGttm7y3In\n"
-        + "/NxZO33omf5vdB2yptzE6DegtsvS94ux6zp01SuzgCXjQbiSjb/VDL0/A8cD/1sQ\n"
-        + "PQGP1yrhn8aX/HAxgJv8cdI6ZnrSUW+G8RnhX281dl5a9so8APchhqeXspYFX6DJ\n"
-        + "Br6MqNkX69a7jthdLZCxaa3hGInr+A/nPVkNEHhjQ8a/kI+28ChRWndofme10hje\n"
-        + "QISFfGuMf6ULK9uo4d1MzGlstfcNRecizfniKby3SBmJAR8EGAECAAkFAkx+aRYC\n"
-        + "GwwACgkQiptSk+LTK6X92gf7BH6jpQJ0Po5nEYzHt3RrvIMmpAWQV/YNGwm9jay6\n"
-        + "6DQIwllFaID6EiKfk/oGuf95vmdN1aDOWsfGS9vrxiR68cAt06+atg1AVdtv25Ya\n"
-        + "AR/eoRF0jxrImxJOpixOrK6H1hXPbWQAPFMc3cmQnh6+MenLPRdu2r6gMAOD66zC\n"
-        + "PVuKEe2EWJ/ni80wQhb2tf1Pu5+Fcpqavgu4bApM9PFXyAQ9biHhmhDAUpXao6NH\n"
-        + "6y60ee5dUvbiROe/wIddRXMldVM3PuLt8AlOBZz12sfoq2ndcd8sMHDNPn/lmHLE\n"
-        + "YmRCrYmb9DyY2ReLfgfYN5DdU+2O0wuv0lH2l/qK+a9RqA==\n"
-        + "=T1WV\n"
-        + "-----END PGP PRIVATE KEY BLOCK-----\n");
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "lQOXBEx+aRYBCAC77YjBScTjRFHtZvk0yyAy8KAXopbCdMBQs7S7iidFMMxhs0Uu\n"
+            + "D7GeleyVusLFJfEM0Ul0b0pLgfJx9j3cot4BTl71OqnawHp4ktuqFyTjhhYy8kBe\n"
+            + "4mliNP36WW7fYXh+f5SZqDQ6rgyoJCOmiUlosb6CM2yUPH3oDtOKg/9Z0iMUcXfQ\n"
+            + "y+bxRKSQmDtiSIS7hwUZmQoo30iAZNygMBLnYyVau3YFan+xyBMCFLa2/pfE0qaU\n"
+            + "QMy67XP8uP7DXlepfc4Lk/qa/2WnAqmuTT2ty9MG+X8M8LuiPuMWfOEx8ICUWB9s\n"
+            + "kCCMWCagS7EUIPhp6AOqjMqEWGOyLmclkGCJABEBAAEAB/QJiwZmylg1MkL2y0Pc\n"
+            + "anQ4If//M0J0nXkmn/mNjHZyDQhT7caVkDZ01ygsck9xs3uKKxaP0xbyvqaRIvAB\n"
+            + "REQBzPkFevUlJqERfmOpP4OgCi8WZzbdmqG/WvGKxP/cWBbGVbQ2GVSNpkj+QNeO\n"
+            + "nWoc5unFstbQsEG0hww2/Hz7EppYoBvDrDLY1EPKzr0r6sk1O5gk3VWOqMEJVCh+\n"
+            + "K7EV4pPGmzMrfZQ0jSwRpr0HhzzhDYR7+QUbxr4OS5PoSJDFh0+A5kqFagyupe7A\n"
+            + "96L3Lh7wJBQJsOe5xjOu3lkFp+3vU+Mq7VzO9Fnp9BCwjb4mEjI39bJdGeeOVCWR\n"
+            + "sYEEAMjmftMhIHrjGRlbZVrLcZY8Du4CFQqImb2Tluo/6siIEurVp4F2swZFm7fw\n"
+            + "B2v09GGJ6zKpauJuxlbwo3CFnxbk24W39F/SixZLggLPtNOXdSrLIQrQ1AXu5ucQ\n"
+            + "oCnXS5FaVkD3Rtd53hSMIf2xJiSRKGp/1X9hga/phScud7URBADveDh1oEmwl3gc\n"
+            + "gorhABLYV7cPrARteQRV13tYWcuAZ6WjqNlbbW2mzBE7KTh4bgTzIX0uQ6SZ7bPl\n"
+            + "RmuKQHrdOO9vFGiSf3zDnIg8fhqSyy2SNrC/e7teuaguGCrg5GrP5izBAsiwvXbt\n"
+            + "ST3OG7c8Ky717JGTiUeTJoe4IaET+QP/SB4uQzVTrbXjBNtq1KqL/CT7l2ABnXsn\n"
+            + "psaVwHOMmY/wP+PiazMEDvLInDAu7R8oLNGqYR+7UYmYeAGmWgrc0L3yFVC01tTG\n"
+            + "bk7Yt/V5KRKVO2I9x+2CP0v0EqW4BNOJzbx5TJ5lBFLMTvbviOdsoDXw0S98HIHB\n"
+            + "T1bFFmhVeulCDLQeVGVzdHVzZXIgRyA8dGVzdGdAZXhhbXBsZS5jb20+iQE4BBMB\n"
+            + "AgAiBQJMfmkWAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRCKm1KT4tMr\n"
+            + "pVLBB/9achiQtmgBFkhR8frUQOWRQ+/z7obVhjdiAUUyN44rJu7jt5TdC0BMRooe\n"
+            + "mG8qoW3F03IS2a2LVnHsKrYvNF5jUqhBDkQ6Up7LFWZcC4CqhFZ6zG4bfXytVOuj\n"
+            + "MKpJ0o8IctwLbozmw74Z3awpsDgOOhLJ+sTMQ5VLU0D121ntYExevyCMf/+hvt2+\n"
+            + "6m1ICUANothhom6ByZvOREZFt+IJAeq/fQj7zV3tEB5LHxdLfxgRabYi8EumJL93\n"
+            + "sD/YBDblIfF/5Awxa3zf6464RVr2sQ6tqJ1kLpPy+dJG7VMqRf/rQucm8DD22KCZ\n"
+            + "52LbU7oanPcfe4bKO6T2jXz6bx0mnQOYBEx+aRYBCADU7Qj299k1JG5hPH75KQlx\n"
+            + "xdeovid5VYSdDhaz23N9IbRFyHcZv935yQO0mGVA51prJNVfuHmTy1MbHSbKDo6M\n"
+            + "bZQzqL5pOAUDPAacGH83enm1NomFEIXHUhqlfQ3uKOrqtA88IhJzcJRmEJUFOenl\n"
+            + "2TdzT+E3GzJheUjUDC6gxpvKDNMU39xvVtenRRNNWt035KPmEdUO+nHJqWMtrvsj\n"
+            + "RX6UjdsKKX1WFD2H9M/gLaIrdl1c4xu5bsA2F34j0ta6WYTFkiIP1Eiwe8HdsO7f\n"
+            + "aDXzju5P4NTKcoRNtlaVlLRD3cCXLU2UEiS84JUIG35Vq3NnygFXy9uTlHjVbUfL\n"
+            + "ABEBAAEAB/48KLaaNJ+xhJgNMA797crF0uyiOAumG/PqfeMLMQs5xQ6OktuXsl6Q\n"
+            + "pus9mLsu8c7Zq9//efsbt1xFMmDVwPQkmAdB60DVMKc16T1C2CcFcTy25vBG4Mqz\n"
+            + "bK6rqCAJ9JSe+H2/cy78X8gF6FR6VAkSUGN62IxcyfnbkW1yv/hiowZ5pQpGVjBH\n"
+            + "sjfu+6HGZhdJIyzrjnVjTJhXNCodtKq1lQGuL2t3ZB6osOXEsFtsI6lQF2s6QZZd\n"
+            + "MUOpSO+X1Rb5TCpWpR/Yj43sH6Tq7LZWEml9fV4wKe2PQWmFW+L8eZCwbYEz6GgZ\n"
+            + "w2pMoMxxOZJsOMOq4LFs4r9qaNQI+sU1BADZhx42JjqBIUsq0OhQcCizjCbPURNw\n"
+            + "7HRfPV8SQkldzmccVzGwFIKQqAVglNdT9AQefUQzx84CRqmWaROXaypkulOB79gM\n"
+            + "R/C/aXOdWz9/dGJ9fT/gcgq1vg9zt7dPE5QIYlhmNdfQPt6R50bUTXe22N2UYL98\n"
+            + "n1pQrhAdlsbT3QQA+pWPXQE4k3Hm7pwCycM2d4TmOIfB6YiaxjMNsZiepV4bqWPX\n"
+            + "iaHh0gw1f8Av6zmMncQELKRspA8Zrj3ZzB/OvNwfpgpqmjS0LyH4u8fGttm7y3In\n"
+            + "/NxZO33omf5vdB2yptzE6DegtsvS94ux6zp01SuzgCXjQbiSjb/VDL0/A8cD/1sQ\n"
+            + "PQGP1yrhn8aX/HAxgJv8cdI6ZnrSUW+G8RnhX281dl5a9so8APchhqeXspYFX6DJ\n"
+            + "Br6MqNkX69a7jthdLZCxaa3hGInr+A/nPVkNEHhjQ8a/kI+28ChRWndofme10hje\n"
+            + "QISFfGuMf6ULK9uo4d1MzGlstfcNRecizfniKby3SBmJAR8EGAECAAkFAkx+aRYC\n"
+            + "GwwACgkQiptSk+LTK6X92gf7BH6jpQJ0Po5nEYzHt3RrvIMmpAWQV/YNGwm9jay6\n"
+            + "6DQIwllFaID6EiKfk/oGuf95vmdN1aDOWsfGS9vrxiR68cAt06+atg1AVdtv25Ya\n"
+            + "AR/eoRF0jxrImxJOpixOrK6H1hXPbWQAPFMc3cmQnh6+MenLPRdu2r6gMAOD66zC\n"
+            + "PVuKEe2EWJ/ni80wQhb2tf1Pu5+Fcpqavgu4bApM9PFXyAQ9biHhmhDAUpXao6NH\n"
+            + "6y60ee5dUvbiROe/wIddRXMldVM3PuLt8AlOBZz12sfoq2ndcd8sMHDNPn/lmHLE\n"
+            + "YmRCrYmb9DyY2ReLfgfYN5DdU+2O0wuv0lH2l/qK+a9RqA==\n"
+            + "=T1WV\n"
+            + "-----END PGP PRIVATE KEY BLOCK-----\n");
   }
 
   /**
-   * pub   2048R/080E5723 2010-09-01
-   *       Key fingerprint = 2957 ABE4 937D A84A 2E5D  31DB 65C4 33C4 080E 5723
-   * uid                  Testuser H <testh@example.com>
-   * sub   2048R/68C7C262 2010-09-01
+   * pub 2048R/080E5723 2010-09-01 Key fingerprint = 2957 ABE4 937D A84A 2E5D 31DB 65C4 33C4 080E
+   * 5723 uid Testuser H <testh@example.com> sub 2048R/68C7C262 2010-09-01
    */
   public static TestKey keyH() throws Exception {
-    return new TestKey("-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
-        + "Version: GnuPG v1\n"
-        + "\n"
-        + "mQENBEx+aSUBCADzpZ1h9awUQR1ChzrMhtoE1ltyTlJpS1G5HFEov9QNxVDTjpB8\n"
-        + "PMdb20NNdk/7g6E+ETpCBJGPoC4/TPFDiqe+UI7cRrRZJVbInkCbflYycLTUt9qW\n"
-        + "5c7IuyZA1+cSYaKp3jYccFZfIWvfTWDLWyUozTs9t1TsI28s3r5fBPvrZ+F1nYv/\n"
-        + "xpSkx3Zsxnn7QJTnd63rZdp0RdfJmF2rXERwR6XVtuLj5CqrFoLxy6OrSOl4am4J\n"
-        + "C2HRWhskB21LpdRtloY8bz0DOn6W6JUFRmSxQ1kbPClOXaiNhzMI0fD/KFnHImgR\n"
-        + "IKbbQyHHsKHBjNyn+zTIm5zUL6JMZMf9PoSZABEBAAG0HlRlc3R1c2VyIEggPHRl\n"
-        + "c3RoQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTH5pJQIbAwYLCQgHAwIGFQgCCQoL\n"
-        + "BBYCAwECHgECF4AACgkQZcQzxAgOVyORcAf/QaHVlyhlBnU4edujW2uG/PFrZvwK\n"
-        + "fqOKW0QqQ7kVN8okKhnFv4y11IwLIzL9mOLYe2+Zyv3I3bz4X8Xw+MsBF6sMWLLf\n"
-        + "9ieu4Wz/5ScVu0PxY36kgV0AQRiLXk802Vk4t9jElCp9qx/dDln7f3879LLb3wNt\n"
-        + "fajne8EH0hjR4E3joPoG+IXSvSzWcPoZTmAZOKHPcRS8iqy0Ao8/UuQWYCedI/4R\n"
-        + "S1IJaByk8mmkMkqqV0kuPyDkvGpqhfh9zFYh97LuKcJktRTEBp3YMvuGcBDBwofG\n"
-        + "vYIVEMr7Ci5rowRQO/sxJfI1zNSWterWC46v6tOb9IvenOgP0/dQxlU82YkBIAQQ\n"
-        + "AQIACgUCTH5xmAMFAXgACgkQ0CLaOl6a7dCYuQf/V2i3Ih5Dqze0Rz5zoTD56/J7\n"
-        + "0SA4/SFm5eDUirY5B9BohkyxoMVG04uyjUmVs62ree7N0IASmeiF/wkBUZ/r/rr/\n"
-        + "0ntGj43y+1JpuSEohZOfgZJryDKRqyVWhRbeBj0g/SzxIQ1lEt2iHFvdSlfFVd+a\n"
-        + "SH1uDDjT/ZATKfAXcgeajUirWorJRaldue7O4oFe67fMLy36ewvpaMVZ+SpxH4CC\n"
-        + "Owq4Ls3dIAg2C5GQK8G0G7FwT1M26EPg66C79EGYkaxprgrilWE6l7QHc484TY1L\n"
-        + "ys04qKoPRnBinmrRxgRyyimvDN/+nd1jdM6nMe1gVLL3s5Vgo0fJMwNhDZMtdrkB\n"
-        + "DQRMfmklAQgAyajPVMt+OXO1ow7xzb0aZYNa5Xdv+w50JzVeWI0boPOuOmq6RCc1\n"
-        + "3NhOmBzx3CKH6zbSRoLBCZWM3cs1EQbl+8noaxq6YQVWiaROX8U7CThYA50jONP/\n"
-        + "qEk655QFsP8Bq96Z5AT/MflxEMayOtQywUFREF4/olhXvJOdurZfQPGnIis35NUc\n"
-        + "IaubI+gGVsluqWBohLOgqzyF7GMlv+Y2JZE5JKGSTO7ZosyI+OCNdZ6X2CJdDPZ1\n"
-        + "325QHYkmqiMJtb73AYTXurL7NNTxdxQVOnfvwXXW4mgHwPEHr8PU30+2xgo1ktrr\n"
-        + "rpFsd0o2UFhybTe7w1z2sAO1gP5s1bbGlwARAQABiQEfBBgBAgAJBQJMfmklAhsM\n"
-        + "AAoJEGXEM8QIDlcjqkQIAI78nwAgO5EgrUDoFikH6d36Kie9SHleaYcSX2c95Vqc\n"
-        + "umuiSAhaulGX0gM/jwvZkoawSyWIq+O2sPSc9F7VzdYdEnWVj2J5BpVx83TRPrTu\n"
-        + "72tsJ97op6JZz+Q8HwTLYJBmyW3/TEKh+iRL9CBtfTVywodZa58j41vCkx37NFPw\n"
-        + "plglT/Se1/US1rWYTH3Kfqo5zNARLUYzAdcxEpjwXWOvqnybn86KfMwqiOunz8eq\n"
-        + "MnTQYECfUrhX2WrbEAjCSc6/LfrTv/S+cO0rvulO/R97gG99pZdWSUjZypU5KLbp\n"
-        + "MBh0qq2wQxO2iagNXE6ms3kV/XihvCpXo9RArmldmW0=\n"
-        + "=lddL\n"
-        + "-----END PGP PUBLIC KEY BLOCK-----\n",
+    return new TestKey(
+        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "mQENBEx+aSUBCADzpZ1h9awUQR1ChzrMhtoE1ltyTlJpS1G5HFEov9QNxVDTjpB8\n"
+            + "PMdb20NNdk/7g6E+ETpCBJGPoC4/TPFDiqe+UI7cRrRZJVbInkCbflYycLTUt9qW\n"
+            + "5c7IuyZA1+cSYaKp3jYccFZfIWvfTWDLWyUozTs9t1TsI28s3r5fBPvrZ+F1nYv/\n"
+            + "xpSkx3Zsxnn7QJTnd63rZdp0RdfJmF2rXERwR6XVtuLj5CqrFoLxy6OrSOl4am4J\n"
+            + "C2HRWhskB21LpdRtloY8bz0DOn6W6JUFRmSxQ1kbPClOXaiNhzMI0fD/KFnHImgR\n"
+            + "IKbbQyHHsKHBjNyn+zTIm5zUL6JMZMf9PoSZABEBAAG0HlRlc3R1c2VyIEggPHRl\n"
+            + "c3RoQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTH5pJQIbAwYLCQgHAwIGFQgCCQoL\n"
+            + "BBYCAwECHgECF4AACgkQZcQzxAgOVyORcAf/QaHVlyhlBnU4edujW2uG/PFrZvwK\n"
+            + "fqOKW0QqQ7kVN8okKhnFv4y11IwLIzL9mOLYe2+Zyv3I3bz4X8Xw+MsBF6sMWLLf\n"
+            + "9ieu4Wz/5ScVu0PxY36kgV0AQRiLXk802Vk4t9jElCp9qx/dDln7f3879LLb3wNt\n"
+            + "fajne8EH0hjR4E3joPoG+IXSvSzWcPoZTmAZOKHPcRS8iqy0Ao8/UuQWYCedI/4R\n"
+            + "S1IJaByk8mmkMkqqV0kuPyDkvGpqhfh9zFYh97LuKcJktRTEBp3YMvuGcBDBwofG\n"
+            + "vYIVEMr7Ci5rowRQO/sxJfI1zNSWterWC46v6tOb9IvenOgP0/dQxlU82YkBIAQQ\n"
+            + "AQIACgUCTH5xmAMFAXgACgkQ0CLaOl6a7dCYuQf/V2i3Ih5Dqze0Rz5zoTD56/J7\n"
+            + "0SA4/SFm5eDUirY5B9BohkyxoMVG04uyjUmVs62ree7N0IASmeiF/wkBUZ/r/rr/\n"
+            + "0ntGj43y+1JpuSEohZOfgZJryDKRqyVWhRbeBj0g/SzxIQ1lEt2iHFvdSlfFVd+a\n"
+            + "SH1uDDjT/ZATKfAXcgeajUirWorJRaldue7O4oFe67fMLy36ewvpaMVZ+SpxH4CC\n"
+            + "Owq4Ls3dIAg2C5GQK8G0G7FwT1M26EPg66C79EGYkaxprgrilWE6l7QHc484TY1L\n"
+            + "ys04qKoPRnBinmrRxgRyyimvDN/+nd1jdM6nMe1gVLL3s5Vgo0fJMwNhDZMtdrkB\n"
+            + "DQRMfmklAQgAyajPVMt+OXO1ow7xzb0aZYNa5Xdv+w50JzVeWI0boPOuOmq6RCc1\n"
+            + "3NhOmBzx3CKH6zbSRoLBCZWM3cs1EQbl+8noaxq6YQVWiaROX8U7CThYA50jONP/\n"
+            + "qEk655QFsP8Bq96Z5AT/MflxEMayOtQywUFREF4/olhXvJOdurZfQPGnIis35NUc\n"
+            + "IaubI+gGVsluqWBohLOgqzyF7GMlv+Y2JZE5JKGSTO7ZosyI+OCNdZ6X2CJdDPZ1\n"
+            + "325QHYkmqiMJtb73AYTXurL7NNTxdxQVOnfvwXXW4mgHwPEHr8PU30+2xgo1ktrr\n"
+            + "rpFsd0o2UFhybTe7w1z2sAO1gP5s1bbGlwARAQABiQEfBBgBAgAJBQJMfmklAhsM\n"
+            + "AAoJEGXEM8QIDlcjqkQIAI78nwAgO5EgrUDoFikH6d36Kie9SHleaYcSX2c95Vqc\n"
+            + "umuiSAhaulGX0gM/jwvZkoawSyWIq+O2sPSc9F7VzdYdEnWVj2J5BpVx83TRPrTu\n"
+            + "72tsJ97op6JZz+Q8HwTLYJBmyW3/TEKh+iRL9CBtfTVywodZa58j41vCkx37NFPw\n"
+            + "plglT/Se1/US1rWYTH3Kfqo5zNARLUYzAdcxEpjwXWOvqnybn86KfMwqiOunz8eq\n"
+            + "MnTQYECfUrhX2WrbEAjCSc6/LfrTv/S+cO0rvulO/R97gG99pZdWSUjZypU5KLbp\n"
+            + "MBh0qq2wQxO2iagNXE6ms3kV/XihvCpXo9RArmldmW0=\n"
+            + "=lddL\n"
+            + "-----END PGP PUBLIC KEY BLOCK-----\n",
         "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
-        + "Version: GnuPG v1\n"
-        + "\n"
-        + "lQOYBEx+aSUBCADzpZ1h9awUQR1ChzrMhtoE1ltyTlJpS1G5HFEov9QNxVDTjpB8\n"
-        + "PMdb20NNdk/7g6E+ETpCBJGPoC4/TPFDiqe+UI7cRrRZJVbInkCbflYycLTUt9qW\n"
-        + "5c7IuyZA1+cSYaKp3jYccFZfIWvfTWDLWyUozTs9t1TsI28s3r5fBPvrZ+F1nYv/\n"
-        + "xpSkx3Zsxnn7QJTnd63rZdp0RdfJmF2rXERwR6XVtuLj5CqrFoLxy6OrSOl4am4J\n"
-        + "C2HRWhskB21LpdRtloY8bz0DOn6W6JUFRmSxQ1kbPClOXaiNhzMI0fD/KFnHImgR\n"
-        + "IKbbQyHHsKHBjNyn+zTIm5zUL6JMZMf9PoSZABEBAAEAB/wPPOigp4d9VcwxbLkz\n"
-        + "8OwiONDLz5OuY6hHCjsWMBcgTFqffI9TQc7bExW8ur1KVuNm+RdaaSQ8ZhF2YobF\n"
-        + "SV7v02R36NEfMStiDSmvv+E+stdQZXY9kT5TRgcgr5ATUXllo9DhCvKP7Qxs0Q9Q\n"
-        + "cJEcoedGVxiv0xCBLyYbVbm2sW+GJYjq0R5loaOy/Swbt5vOKQsajU8iyA4czSE8\n"
-        + "Ryr63OtwZ1TZsxekj//HKcngnptYY/FT5TPe4uzw8g1tJTIg/OZXrm8CahWzpfE3\n"
-        + "q8lGafhd0GjLftA9ffIHF0cAUs7HklMrgIKGdVPXfQmPzqDpmH5FO2y6QmqTG0v6\n"
-        + "JYW9BAD4Iobwh80MT3JZhJ0jGYMdi07cRyFN+hRwVKgNcBTdx3QGpGJatcyumD0C\n"
-        + "Yn/aXAn+XUkewSgYhdj9sSRodnWGoavdWELxUQkktsdiFg2/rnqmpqRXTGfR/tDh\n"
-        + "ohD2JaPrsavmUF6ShT3stGp8nUN+n6Bhd+QosaCZm5TC1CtA7QQA+16rrNNdP8XN\n"
-        + "MvpQRqJM5ljH0haqR/yD8vdCCZjk23hBk3YsXwSrhSbPzMeZC2FcDqkQTraTxrSG\n"
-        + "U0+xK3NjKKtbzCjQFH4cy4zdNMUX04OWopLGOEnnvTYukGtXT4lZQ9qm8ZBPh5a4\n"
-        + "cXfWy3ovjvRbxUuFOWm0gOfIoRcuWN0D/isTjqPmjihCuWkKTfa3xoq+dD7ynYhg\n"
-        + "Yu3UKfCqbNVor59ZrB4AkQiaVIDLKim3E1XDMS+IukmTuNVXpJeqK32tAYbEduHM\n"
-        + "7kwEq7SgVh34QvryKjCC/EUkDcjSQ+xlUaKl8QKYOdwtH97zZYK6QixB4uNQ6CuM\n"
-        + "75dqTZ6iQw7jQA+0HlRlc3R1c2VyIEggPHRlc3RoQGV4YW1wbGUuY29tPokBOAQT\n"
-        + "AQIAIgUCTH5pJQIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQZcQzxAgO\n"
-        + "VyORcAf/QaHVlyhlBnU4edujW2uG/PFrZvwKfqOKW0QqQ7kVN8okKhnFv4y11IwL\n"
-        + "IzL9mOLYe2+Zyv3I3bz4X8Xw+MsBF6sMWLLf9ieu4Wz/5ScVu0PxY36kgV0AQRiL\n"
-        + "Xk802Vk4t9jElCp9qx/dDln7f3879LLb3wNtfajne8EH0hjR4E3joPoG+IXSvSzW\n"
-        + "cPoZTmAZOKHPcRS8iqy0Ao8/UuQWYCedI/4RS1IJaByk8mmkMkqqV0kuPyDkvGpq\n"
-        + "hfh9zFYh97LuKcJktRTEBp3YMvuGcBDBwofGvYIVEMr7Ci5rowRQO/sxJfI1zNSW\n"
-        + "terWC46v6tOb9IvenOgP0/dQxlU82Z0DmARMfmklAQgAyajPVMt+OXO1ow7xzb0a\n"
-        + "ZYNa5Xdv+w50JzVeWI0boPOuOmq6RCc13NhOmBzx3CKH6zbSRoLBCZWM3cs1EQbl\n"
-        + "+8noaxq6YQVWiaROX8U7CThYA50jONP/qEk655QFsP8Bq96Z5AT/MflxEMayOtQy\n"
-        + "wUFREF4/olhXvJOdurZfQPGnIis35NUcIaubI+gGVsluqWBohLOgqzyF7GMlv+Y2\n"
-        + "JZE5JKGSTO7ZosyI+OCNdZ6X2CJdDPZ1325QHYkmqiMJtb73AYTXurL7NNTxdxQV\n"
-        + "OnfvwXXW4mgHwPEHr8PU30+2xgo1ktrrrpFsd0o2UFhybTe7w1z2sAO1gP5s1bbG\n"
-        + "lwARAQABAAf8C3vFcrqz0Wm5ajOrqV+fZTB5uJ94jP9htengGYLPk/bMcR8qxD7H\n"
-        + "XnAi6Z6cV0DQJKDWkJVZkMYnY2ny96lA53mz9oVrH6NCLkxg+istFXVT7cDBBLdt\n"
-        + "05N3+z/+ovmiirr+YHG4Zowh2Ca4d4kl6sNhbmEvlnsZY++0B7Hi8ru2KgFBag2g\n"
-        + "wDmeVt2+ANJNfJ4uIHUEG+sDSDL4+rxQlBTMhxfVY5+zjbvzPlTf2jyAgDa5zGN2\n"
-        + "vRjB33Z0lbdZTeW7HsJcDsXaS77lKnQeWMmHSvpOXvFSIjnrWpxcMpg8hGY5e5UC\n"
-        + "zLCk+nucY/Od1NbtFYu/e7fl9/n3YnT7AQQA0v/t43Ut3go9vRlb47NN/KpJYL1N\n"
-        + "hh9F/SRzFwWxS+79CiZkf/bgmdJe4XkkS7QJMv+nXhtcko/gfzoaCrvIWIAyvhYa\n"
-        + "7tEbqH+iZ0eaLrQf7bu89Jmp2UNRT1EHLzm38eJ8gg7eNu+SjIhs3wART1KB7GvT\n"
-        + "YmpN5caJA2t2OaEEAPSq7CbvlPDc0qomQSs+NrDnhAv89mQEeksZRmhVa0o4Z7EO\n"
-        + "84DzM+Vxho5fn9h0LtxthhuKWKT8uYN/Qu4Y42cKQuRgMx09+GGwc4GWSC6gJPeP\n"
-        + "oKVJCdZx0l9u8fWQb37gnyH34WDxPvdQx3e4iw/dvruNzu17zmPndkdcyEU3BACD\n"
-        + "yXo21SEflFcfrO16VsITXWc9yweKTSD8Mq7wg2GG6eJPopgtwCLZSlYjnehxD2w2\n"
-        + "38lyr6jGPyITvalVwH6R//676Q2osbQ948Dv2ZcxaTlyla4RyY6E33hsnV9m8ZmM\n"
-        + "PUoNJvFSkKCuPy1N5zaYgUAPKwbEkc3qG+bZm+x2WU2biQEfBBgBAgAJBQJMfmkl\n"
-        + "AhsMAAoJEGXEM8QIDlcjqkQIAI78nwAgO5EgrUDoFikH6d36Kie9SHleaYcSX2c9\n"
-        + "5VqcumuiSAhaulGX0gM/jwvZkoawSyWIq+O2sPSc9F7VzdYdEnWVj2J5BpVx83TR\n"
-        + "PrTu72tsJ97op6JZz+Q8HwTLYJBmyW3/TEKh+iRL9CBtfTVywodZa58j41vCkx37\n"
-        + "NFPwplglT/Se1/US1rWYTH3Kfqo5zNARLUYzAdcxEpjwXWOvqnybn86KfMwqiOun\n"
-        + "z8eqMnTQYECfUrhX2WrbEAjCSc6/LfrTv/S+cO0rvulO/R97gG99pZdWSUjZypU5\n"
-        + "KLbpMBh0qq2wQxO2iagNXE6ms3kV/XihvCpXo9RArmldmW0=\n"
-        + "=voB9\n"
-        + "-----END PGP PRIVATE KEY BLOCK-----\n");
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "lQOYBEx+aSUBCADzpZ1h9awUQR1ChzrMhtoE1ltyTlJpS1G5HFEov9QNxVDTjpB8\n"
+            + "PMdb20NNdk/7g6E+ETpCBJGPoC4/TPFDiqe+UI7cRrRZJVbInkCbflYycLTUt9qW\n"
+            + "5c7IuyZA1+cSYaKp3jYccFZfIWvfTWDLWyUozTs9t1TsI28s3r5fBPvrZ+F1nYv/\n"
+            + "xpSkx3Zsxnn7QJTnd63rZdp0RdfJmF2rXERwR6XVtuLj5CqrFoLxy6OrSOl4am4J\n"
+            + "C2HRWhskB21LpdRtloY8bz0DOn6W6JUFRmSxQ1kbPClOXaiNhzMI0fD/KFnHImgR\n"
+            + "IKbbQyHHsKHBjNyn+zTIm5zUL6JMZMf9PoSZABEBAAEAB/wPPOigp4d9VcwxbLkz\n"
+            + "8OwiONDLz5OuY6hHCjsWMBcgTFqffI9TQc7bExW8ur1KVuNm+RdaaSQ8ZhF2YobF\n"
+            + "SV7v02R36NEfMStiDSmvv+E+stdQZXY9kT5TRgcgr5ATUXllo9DhCvKP7Qxs0Q9Q\n"
+            + "cJEcoedGVxiv0xCBLyYbVbm2sW+GJYjq0R5loaOy/Swbt5vOKQsajU8iyA4czSE8\n"
+            + "Ryr63OtwZ1TZsxekj//HKcngnptYY/FT5TPe4uzw8g1tJTIg/OZXrm8CahWzpfE3\n"
+            + "q8lGafhd0GjLftA9ffIHF0cAUs7HklMrgIKGdVPXfQmPzqDpmH5FO2y6QmqTG0v6\n"
+            + "JYW9BAD4Iobwh80MT3JZhJ0jGYMdi07cRyFN+hRwVKgNcBTdx3QGpGJatcyumD0C\n"
+            + "Yn/aXAn+XUkewSgYhdj9sSRodnWGoavdWELxUQkktsdiFg2/rnqmpqRXTGfR/tDh\n"
+            + "ohD2JaPrsavmUF6ShT3stGp8nUN+n6Bhd+QosaCZm5TC1CtA7QQA+16rrNNdP8XN\n"
+            + "MvpQRqJM5ljH0haqR/yD8vdCCZjk23hBk3YsXwSrhSbPzMeZC2FcDqkQTraTxrSG\n"
+            + "U0+xK3NjKKtbzCjQFH4cy4zdNMUX04OWopLGOEnnvTYukGtXT4lZQ9qm8ZBPh5a4\n"
+            + "cXfWy3ovjvRbxUuFOWm0gOfIoRcuWN0D/isTjqPmjihCuWkKTfa3xoq+dD7ynYhg\n"
+            + "Yu3UKfCqbNVor59ZrB4AkQiaVIDLKim3E1XDMS+IukmTuNVXpJeqK32tAYbEduHM\n"
+            + "7kwEq7SgVh34QvryKjCC/EUkDcjSQ+xlUaKl8QKYOdwtH97zZYK6QixB4uNQ6CuM\n"
+            + "75dqTZ6iQw7jQA+0HlRlc3R1c2VyIEggPHRlc3RoQGV4YW1wbGUuY29tPokBOAQT\n"
+            + "AQIAIgUCTH5pJQIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQZcQzxAgO\n"
+            + "VyORcAf/QaHVlyhlBnU4edujW2uG/PFrZvwKfqOKW0QqQ7kVN8okKhnFv4y11IwL\n"
+            + "IzL9mOLYe2+Zyv3I3bz4X8Xw+MsBF6sMWLLf9ieu4Wz/5ScVu0PxY36kgV0AQRiL\n"
+            + "Xk802Vk4t9jElCp9qx/dDln7f3879LLb3wNtfajne8EH0hjR4E3joPoG+IXSvSzW\n"
+            + "cPoZTmAZOKHPcRS8iqy0Ao8/UuQWYCedI/4RS1IJaByk8mmkMkqqV0kuPyDkvGpq\n"
+            + "hfh9zFYh97LuKcJktRTEBp3YMvuGcBDBwofGvYIVEMr7Ci5rowRQO/sxJfI1zNSW\n"
+            + "terWC46v6tOb9IvenOgP0/dQxlU82Z0DmARMfmklAQgAyajPVMt+OXO1ow7xzb0a\n"
+            + "ZYNa5Xdv+w50JzVeWI0boPOuOmq6RCc13NhOmBzx3CKH6zbSRoLBCZWM3cs1EQbl\n"
+            + "+8noaxq6YQVWiaROX8U7CThYA50jONP/qEk655QFsP8Bq96Z5AT/MflxEMayOtQy\n"
+            + "wUFREF4/olhXvJOdurZfQPGnIis35NUcIaubI+gGVsluqWBohLOgqzyF7GMlv+Y2\n"
+            + "JZE5JKGSTO7ZosyI+OCNdZ6X2CJdDPZ1325QHYkmqiMJtb73AYTXurL7NNTxdxQV\n"
+            + "OnfvwXXW4mgHwPEHr8PU30+2xgo1ktrrrpFsd0o2UFhybTe7w1z2sAO1gP5s1bbG\n"
+            + "lwARAQABAAf8C3vFcrqz0Wm5ajOrqV+fZTB5uJ94jP9htengGYLPk/bMcR8qxD7H\n"
+            + "XnAi6Z6cV0DQJKDWkJVZkMYnY2ny96lA53mz9oVrH6NCLkxg+istFXVT7cDBBLdt\n"
+            + "05N3+z/+ovmiirr+YHG4Zowh2Ca4d4kl6sNhbmEvlnsZY++0B7Hi8ru2KgFBag2g\n"
+            + "wDmeVt2+ANJNfJ4uIHUEG+sDSDL4+rxQlBTMhxfVY5+zjbvzPlTf2jyAgDa5zGN2\n"
+            + "vRjB33Z0lbdZTeW7HsJcDsXaS77lKnQeWMmHSvpOXvFSIjnrWpxcMpg8hGY5e5UC\n"
+            + "zLCk+nucY/Od1NbtFYu/e7fl9/n3YnT7AQQA0v/t43Ut3go9vRlb47NN/KpJYL1N\n"
+            + "hh9F/SRzFwWxS+79CiZkf/bgmdJe4XkkS7QJMv+nXhtcko/gfzoaCrvIWIAyvhYa\n"
+            + "7tEbqH+iZ0eaLrQf7bu89Jmp2UNRT1EHLzm38eJ8gg7eNu+SjIhs3wART1KB7GvT\n"
+            + "YmpN5caJA2t2OaEEAPSq7CbvlPDc0qomQSs+NrDnhAv89mQEeksZRmhVa0o4Z7EO\n"
+            + "84DzM+Vxho5fn9h0LtxthhuKWKT8uYN/Qu4Y42cKQuRgMx09+GGwc4GWSC6gJPeP\n"
+            + "oKVJCdZx0l9u8fWQb37gnyH34WDxPvdQx3e4iw/dvruNzu17zmPndkdcyEU3BACD\n"
+            + "yXo21SEflFcfrO16VsITXWc9yweKTSD8Mq7wg2GG6eJPopgtwCLZSlYjnehxD2w2\n"
+            + "38lyr6jGPyITvalVwH6R//676Q2osbQ948Dv2ZcxaTlyla4RyY6E33hsnV9m8ZmM\n"
+            + "PUoNJvFSkKCuPy1N5zaYgUAPKwbEkc3qG+bZm+x2WU2biQEfBBgBAgAJBQJMfmkl\n"
+            + "AhsMAAoJEGXEM8QIDlcjqkQIAI78nwAgO5EgrUDoFikH6d36Kie9SHleaYcSX2c9\n"
+            + "5VqcumuiSAhaulGX0gM/jwvZkoawSyWIq+O2sPSc9F7VzdYdEnWVj2J5BpVx83TR\n"
+            + "PrTu72tsJ97op6JZz+Q8HwTLYJBmyW3/TEKh+iRL9CBtfTVywodZa58j41vCkx37\n"
+            + "NFPwplglT/Se1/US1rWYTH3Kfqo5zNARLUYzAdcxEpjwXWOvqnybn86KfMwqiOun\n"
+            + "z8eqMnTQYECfUrhX2WrbEAjCSc6/LfrTv/S+cO0rvulO/R97gG99pZdWSUjZypU5\n"
+            + "KLbpMBh0qq2wQxO2iagNXE6ms3kV/XihvCpXo9RArmldmW0=\n"
+            + "=voB9\n"
+            + "-----END PGP PRIVATE KEY BLOCK-----\n");
   }
 
   /**
-   * pub   2048R/5E9AEDD0 2010-09-01
-   *       Key fingerprint = 818D 5D0B 4AE2 A4FE A4C3  C44D D022 DA3A 5E9A EDD0
-   * uid                  Testuser I <testi@example.com>
-   * sub   2048R/0884E452 2010-09-01
+   * pub 2048R/5E9AEDD0 2010-09-01 Key fingerprint = 818D 5D0B 4AE2 A4FE A4C3 C44D D022 DA3A 5E9A
+   * EDD0 uid Testuser I <testi@example.com> sub 2048R/0884E452 2010-09-01
    */
   public static TestKey keyI() throws Exception {
-    return new TestKey("-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
-        + "Version: GnuPG v1\n"
-        + "\n"
-        + "mQENBEx+aTEBCAC6dFperkew4ZowIfEyAjScjPBggcbw5XUXxLCF0nBRjWH+HvuI\n"
-        + "CGwznRyeuTiy5yyB9/CcvTLTkEs8qIyJUJoikm7QpaVVL6imVq1HD1xcOJpV1FV1\n"
-        + "eFu562xCRDUqD6KQf54N04V9TMDyubhPkQYbx1H2gq+uBEo9d1w6AsSMgaUn3xH/\n"
-        + "xYe+INxcP6jFT2OKc36x+8ipP6pc8Hba1X90JwadOcJlwEyJfJKs7hYHTaYn+I6+\n"
-        + "4w0Y//WebhT4ocsYIiOYrENQUcic+vL3fkwwJCloyDBCGxr7w7Gn4Pe3peTCl4Sp\n"
-        + "vIIoYnHPW4h3Nyh8qAlBNDw7dCPS9LP7wRdNABEBAAG0HlRlc3R1c2VyIEkgPHRl\n"
-        + "c3RpQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTH5pMQIbAwYLCQgHAwIGFQgCCQoL\n"
-        + "BBYCAwECHgECF4AACgkQ0CLaOl6a7dAjNQf/fLmGeKgaesawP53UeioQ8hgDEFKP\n"
-        + "BddNQP248NpReZ1rg3h8Q21PQJVKrtDYn94WJi5NTqUtk9rtx9SiqKaEc3wzIpLc\n"
-        + "nIYrgGLWot5nq+5V1nY9t9QAiJJDrmm2/3tX+jTWW6CpuLih7IsD+gJmpZkY6PfM\n"
-        + "T+teKEeh5E1XBbu10fwDwMJta+043/TiljInjER1f/b41EnSjI6YXFnxnyiLeDgD\n"
-        + "A1QIIzB/W2ccGqphzJriDETDJhKFZIeqvjylZofgCLyMRSyZtsu+b4pfBK3hMpu5\n"
-        + "aaYylaM1BWOpAiqUmGUKqxN/o9EGx4wvsMxK6xgiZe5UdQPaoDcFCsEMg4kBIAQQ\n"
-        + "AQIACgUCTH5xrAMFAXgACgkQoTk8RsLmoZiu2Af8D4PnyWkosYYkcmU4T7CvIHGW\n"
-        + "Qnx4KsnYWaAqYrYrorL6R+f8SZ5caGwj05UOvHnqx/Ij0a1Zv4MpEuzB0se1XkyQ\n"
-        + "eCLdAIKVodfiepsCHyqW6/mc9LV2qKS1HF5x5LwDkI1atOuPt/O14fch4E0beTbl\n"
-        + "FXzGo7YdpH8RunV8l+i3FxxTcUtUkij3Ro4EMwVF/6YG8gBOd08GxWspEQWBH3GK\n"
-        + "k7Repj4IPwXCoEfU1H+XJNPaM5cnt+L87QfbhNOWmHmWhhrOmZg160joODON8w8x\n"
-        + "j3gma9Cp6luPDEQC3XnsEup3BdCdIciG5JS6JA/2GDeulg+eS4x9Xkmmp6nzObkB\n"
-        + "DQRMfmkxAQgAxeT+bUBbADga+lYtkmtYVbuG7uWjwdg9TR6qWKD7n37mcu6OgNNl\n"
-        + "rPaHoClvOL20fcArZ8wT/FbjvDI6ZHn22YA19OvAR+Eqmf3D7qTmebchnCu955Pk\n"
-        + "X7AOOpKfX48qoYq8BoskZDnbFidm5YKfIin3CNDdlQbd3na+ihGCuv0KoGzefuAH\n"
-        + "cITeYEUESh7HLzQ9/pMES9eCgdTEkwYD5NJjfkLnj2kZtDsSiNnENZ0TIlyKOBMn\n"
-        + "ixgsARDjLrkqyTg79thWALiqVBXUKn2NBtMkK5xTDc/7q3nIw4InYMIrLtntSu1w\n"
-        + "pn1gXbdg1HFl5BgqEB9Fp0k02YvrSiiVswARAQABiQEfBBgBAgAJBQJMfmkxAhsM\n"
-        + "AAoJENAi2jpemu3QFPoH/1ynX1j1QWL8TfJFPoB3vXivwGURs3J7LsywHTRjpQVQ\n"
-        + "vxQvKTzB1+woUxtEbdjKgMbvY/ShHSlEZKVV9l3ZihrNewHA1GMHrDtBGXcNRP9B\n"
-        + "RfJHTrDzjUxrEEwu4QIq71o4tS89NvQmlYYi7O4ThtVB4hYSwl436+vAT9ybIQkU\n"
-        + "OjCkYrKye6JHs1K4BnVuWcOVujQwW4H8QFbddcWF49uN6DSqrwDFsjFog6wL7u6V\n"
-        + "UL5upRBP/RZWA4HKJVF2tS0Ptr6xLTmf4Tp5n10CGFYkPcRp9biVyeVRJBW4uZf0\n"
-        + "EDsn9J5rNG0pWtgnhAEi6smoT4fADTOzpOovUiTSQhQ=\n"
-        + "=SiG3\n"
-        + "-----END PGP PUBLIC KEY BLOCK-----\n",
+    return new TestKey(
+        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "mQENBEx+aTEBCAC6dFperkew4ZowIfEyAjScjPBggcbw5XUXxLCF0nBRjWH+HvuI\n"
+            + "CGwznRyeuTiy5yyB9/CcvTLTkEs8qIyJUJoikm7QpaVVL6imVq1HD1xcOJpV1FV1\n"
+            + "eFu562xCRDUqD6KQf54N04V9TMDyubhPkQYbx1H2gq+uBEo9d1w6AsSMgaUn3xH/\n"
+            + "xYe+INxcP6jFT2OKc36x+8ipP6pc8Hba1X90JwadOcJlwEyJfJKs7hYHTaYn+I6+\n"
+            + "4w0Y//WebhT4ocsYIiOYrENQUcic+vL3fkwwJCloyDBCGxr7w7Gn4Pe3peTCl4Sp\n"
+            + "vIIoYnHPW4h3Nyh8qAlBNDw7dCPS9LP7wRdNABEBAAG0HlRlc3R1c2VyIEkgPHRl\n"
+            + "c3RpQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTH5pMQIbAwYLCQgHAwIGFQgCCQoL\n"
+            + "BBYCAwECHgECF4AACgkQ0CLaOl6a7dAjNQf/fLmGeKgaesawP53UeioQ8hgDEFKP\n"
+            + "BddNQP248NpReZ1rg3h8Q21PQJVKrtDYn94WJi5NTqUtk9rtx9SiqKaEc3wzIpLc\n"
+            + "nIYrgGLWot5nq+5V1nY9t9QAiJJDrmm2/3tX+jTWW6CpuLih7IsD+gJmpZkY6PfM\n"
+            + "T+teKEeh5E1XBbu10fwDwMJta+043/TiljInjER1f/b41EnSjI6YXFnxnyiLeDgD\n"
+            + "A1QIIzB/W2ccGqphzJriDETDJhKFZIeqvjylZofgCLyMRSyZtsu+b4pfBK3hMpu5\n"
+            + "aaYylaM1BWOpAiqUmGUKqxN/o9EGx4wvsMxK6xgiZe5UdQPaoDcFCsEMg4kBIAQQ\n"
+            + "AQIACgUCTH5xrAMFAXgACgkQoTk8RsLmoZiu2Af8D4PnyWkosYYkcmU4T7CvIHGW\n"
+            + "Qnx4KsnYWaAqYrYrorL6R+f8SZ5caGwj05UOvHnqx/Ij0a1Zv4MpEuzB0se1XkyQ\n"
+            + "eCLdAIKVodfiepsCHyqW6/mc9LV2qKS1HF5x5LwDkI1atOuPt/O14fch4E0beTbl\n"
+            + "FXzGo7YdpH8RunV8l+i3FxxTcUtUkij3Ro4EMwVF/6YG8gBOd08GxWspEQWBH3GK\n"
+            + "k7Repj4IPwXCoEfU1H+XJNPaM5cnt+L87QfbhNOWmHmWhhrOmZg160joODON8w8x\n"
+            + "j3gma9Cp6luPDEQC3XnsEup3BdCdIciG5JS6JA/2GDeulg+eS4x9Xkmmp6nzObkB\n"
+            + "DQRMfmkxAQgAxeT+bUBbADga+lYtkmtYVbuG7uWjwdg9TR6qWKD7n37mcu6OgNNl\n"
+            + "rPaHoClvOL20fcArZ8wT/FbjvDI6ZHn22YA19OvAR+Eqmf3D7qTmebchnCu955Pk\n"
+            + "X7AOOpKfX48qoYq8BoskZDnbFidm5YKfIin3CNDdlQbd3na+ihGCuv0KoGzefuAH\n"
+            + "cITeYEUESh7HLzQ9/pMES9eCgdTEkwYD5NJjfkLnj2kZtDsSiNnENZ0TIlyKOBMn\n"
+            + "ixgsARDjLrkqyTg79thWALiqVBXUKn2NBtMkK5xTDc/7q3nIw4InYMIrLtntSu1w\n"
+            + "pn1gXbdg1HFl5BgqEB9Fp0k02YvrSiiVswARAQABiQEfBBgBAgAJBQJMfmkxAhsM\n"
+            + "AAoJENAi2jpemu3QFPoH/1ynX1j1QWL8TfJFPoB3vXivwGURs3J7LsywHTRjpQVQ\n"
+            + "vxQvKTzB1+woUxtEbdjKgMbvY/ShHSlEZKVV9l3ZihrNewHA1GMHrDtBGXcNRP9B\n"
+            + "RfJHTrDzjUxrEEwu4QIq71o4tS89NvQmlYYi7O4ThtVB4hYSwl436+vAT9ybIQkU\n"
+            + "OjCkYrKye6JHs1K4BnVuWcOVujQwW4H8QFbddcWF49uN6DSqrwDFsjFog6wL7u6V\n"
+            + "UL5upRBP/RZWA4HKJVF2tS0Ptr6xLTmf4Tp5n10CGFYkPcRp9biVyeVRJBW4uZf0\n"
+            + "EDsn9J5rNG0pWtgnhAEi6smoT4fADTOzpOovUiTSQhQ=\n"
+            + "=SiG3\n"
+            + "-----END PGP PUBLIC KEY BLOCK-----\n",
         "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
-        + "Version: GnuPG v1\n"
-        + "\n"
-        + "lQOYBEx+aTEBCAC6dFperkew4ZowIfEyAjScjPBggcbw5XUXxLCF0nBRjWH+HvuI\n"
-        + "CGwznRyeuTiy5yyB9/CcvTLTkEs8qIyJUJoikm7QpaVVL6imVq1HD1xcOJpV1FV1\n"
-        + "eFu562xCRDUqD6KQf54N04V9TMDyubhPkQYbx1H2gq+uBEo9d1w6AsSMgaUn3xH/\n"
-        + "xYe+INxcP6jFT2OKc36x+8ipP6pc8Hba1X90JwadOcJlwEyJfJKs7hYHTaYn+I6+\n"
-        + "4w0Y//WebhT4ocsYIiOYrENQUcic+vL3fkwwJCloyDBCGxr7w7Gn4Pe3peTCl4Sp\n"
-        + "vIIoYnHPW4h3Nyh8qAlBNDw7dCPS9LP7wRdNABEBAAEAB/oCD6EKLvjXgItlqdm/\n"
-        + "X+OWMYHDCtuRCMW7+2gEw/TxfLeGJaOHWxAouwUIArEEb/hjdaRfIg4wdJUxmyPX\n"
-        + "WyNqUdupkjdXNa7RNaesIi0ilrdZOn7NlHWJCCXwKt2R0jd2p8PDED6CWaE1+76I\n"
-        + "/IuwOHDTD8MABke3KvHDXMxjzdeuRbm670Aqz6zTVY+BZG1GH63Ef5JEyezMgAU5\n"
-        + "42+v+OgD0W0/jCxF7jt2ddP9QiOzu0q65mI4qlOuSebxjH8P7ye0LU9EuWVgAcwc\n"
-        + "YJh2lk3eH8bCWTwlIHj4+8MYgY5i510I5xfY3sWuylw/qtFP9vYjisrysadcUExc\n"
-        + "QUxFBADXQSCmvtgRoSLiGfQv2y2qInx67eJw8pUXFEIJKdOFOhX4vogT9qPWQAms\n"
-        + "/vSshcsAPgpZJZ8MNeGpMGLAGm8y4D2zWWd9YLNmVXsPu7EyrDpXlKHCFnsQfOGN\n"
-        + "c5j8u4CHBn1cS/Yk53S+6Yge2jvnOjVNFmxB0ocs0Y5zbdTJYwQA3b+hQebH7NNr\n"
-        + "FlPwthRZS0TiX5+qkE9tE/0mpRrUN3iS9bnF0IXRmHFp7Hz+EsVbA2Re2A5HIHnQ\n"
-        + "/BSpAsSHRhjU3MH4gzwfg9W43eZGVfofSY6IlUCIcd1bGjSAjJgmfhjU7ofS59i/\n"
-        + "DjzP1jBfXdjOEUQULTkXjHPqO7j4048D/jqMwZNY3AawTMjqKr9nGK49aWv/OVdy\n"
-        + "6xGn4dRJNk3gnnIvjAEFy5+HHbUCJ2lA3X2AssQ9tvbuyDnoSL5/G+zEYtyRuAC5\n"
-        + "9TLQQRmy4qjsYC5TwfoUwFbgqRsmGUcjj2wtE+gb1S8P/zudYrEqOD3K60Y5qXcn\n"
-        + "S3PHgJ++5TzFQba0HlRlc3R1c2VyIEkgPHRlc3RpQGV4YW1wbGUuY29tPokBOAQT\n"
-        + "AQIAIgUCTH5pMQIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ0CLaOl6a\n"
-        + "7dAjNQf/fLmGeKgaesawP53UeioQ8hgDEFKPBddNQP248NpReZ1rg3h8Q21PQJVK\n"
-        + "rtDYn94WJi5NTqUtk9rtx9SiqKaEc3wzIpLcnIYrgGLWot5nq+5V1nY9t9QAiJJD\n"
-        + "rmm2/3tX+jTWW6CpuLih7IsD+gJmpZkY6PfMT+teKEeh5E1XBbu10fwDwMJta+04\n"
-        + "3/TiljInjER1f/b41EnSjI6YXFnxnyiLeDgDA1QIIzB/W2ccGqphzJriDETDJhKF\n"
-        + "ZIeqvjylZofgCLyMRSyZtsu+b4pfBK3hMpu5aaYylaM1BWOpAiqUmGUKqxN/o9EG\n"
-        + "x4wvsMxK6xgiZe5UdQPaoDcFCsEMg50DmARMfmkxAQgAxeT+bUBbADga+lYtkmtY\n"
-        + "VbuG7uWjwdg9TR6qWKD7n37mcu6OgNNlrPaHoClvOL20fcArZ8wT/FbjvDI6ZHn2\n"
-        + "2YA19OvAR+Eqmf3D7qTmebchnCu955PkX7AOOpKfX48qoYq8BoskZDnbFidm5YKf\n"
-        + "Iin3CNDdlQbd3na+ihGCuv0KoGzefuAHcITeYEUESh7HLzQ9/pMES9eCgdTEkwYD\n"
-        + "5NJjfkLnj2kZtDsSiNnENZ0TIlyKOBMnixgsARDjLrkqyTg79thWALiqVBXUKn2N\n"
-        + "BtMkK5xTDc/7q3nIw4InYMIrLtntSu1wpn1gXbdg1HFl5BgqEB9Fp0k02YvrSiiV\n"
-        + "swARAQABAAf/VXp4O5CUvh9956vZu2kKmt2Jhx9CALT6pZkdU3MVvOr/d517iEHH\n"
-        + "pVJHevLqy8OFdtvO4+LOryyI6f14I3ZbHc+3frdmMqYb1LA8NZScyO5FYkOyn5jO\n"
-        + "CFbvjnVOyeP5MhXO6bSoX3JuI7+ZPoGRYxxlTDWLwJdatoDsBI9TvJhVekyAchTH\n"
-        + "Tyt3NQIvLXqHvKU/8WAgclBKeL/y/idep1BrJ4cIJ+EFp0agEG0WpRRUAYjwfE3P\n"
-        + "aSEV0NOoB8rapPW3XuEjO+ZTht+NYvqgPIdTjwXZGFPYnwvEuz772Th4pO3o/PdF\n"
-        + "2cljvRn3qo+lSVnJ0Ki2pb+LukJSIdfHgQQA1DBdm29a/3dBla2y6wxlSXW/3WBp\n"
-        + "51Vpd8SBuwdVrNNQMwPmf1L93YskJnUKSTo7MwgrYZFWf7QzgfD/cHXr8QK2C1TP\n"
-        + "czUC0/uFCm8pPQoOt/osp3PjDAzGgUAMFXCgLtb04P2JqbFvtse5oTFWrKqmscTG\n"
-        + "KnEBkzfgy37U0iMEAO7BEgXCYvqyztHmQATqJfbpxgQGqk738UW6qWwG8mK6aT5V\n"
-        + "OidZvrWqJ3WeIKmEhoJlY2Ky1ZTuJfeQuVucqzNWlZy2yzDijs+t3v4pFGajv4nV\n"
-        + "ivGvlb/O/QoHBuF/9K36lIIqcZstfa2UIYRqkkdEz2JHWJsr81VvCw2Gb38xA/sG\n"
-        + "hqErrIgSBPRCJObM/gb9rJ6dbA5SNY5trc778EjS1myhyPhGOaOmYbdQMONUqLo2\n"
-        + "q1UZo1G7oaI1Um9v5MXN1yZNX/kvx1TMldZEEixrhCIob81eXSpEUfs+Mz2RqvqT\n"
-        + "YsYquYQNPrPXWZQwTJV6fpsBQUMeE/pmlisaSAijHkXPiQEfBBgBAgAJBQJMfmkx\n"
-        + "AhsMAAoJENAi2jpemu3QFPoH/1ynX1j1QWL8TfJFPoB3vXivwGURs3J7LsywHTRj\n"
-        + "pQVQvxQvKTzB1+woUxtEbdjKgMbvY/ShHSlEZKVV9l3ZihrNewHA1GMHrDtBGXcN\n"
-        + "RP9BRfJHTrDzjUxrEEwu4QIq71o4tS89NvQmlYYi7O4ThtVB4hYSwl436+vAT9yb\n"
-        + "IQkUOjCkYrKye6JHs1K4BnVuWcOVujQwW4H8QFbddcWF49uN6DSqrwDFsjFog6wL\n"
-        + "7u6VUL5upRBP/RZWA4HKJVF2tS0Ptr6xLTmf4Tp5n10CGFYkPcRp9biVyeVRJBW4\n"
-        + "uZf0EDsn9J5rNG0pWtgnhAEi6smoT4fADTOzpOovUiTSQhQ=\n"
-        + "=RcWw\n"
-        + "-----END PGP PRIVATE KEY BLOCK-----\n");
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "lQOYBEx+aTEBCAC6dFperkew4ZowIfEyAjScjPBggcbw5XUXxLCF0nBRjWH+HvuI\n"
+            + "CGwznRyeuTiy5yyB9/CcvTLTkEs8qIyJUJoikm7QpaVVL6imVq1HD1xcOJpV1FV1\n"
+            + "eFu562xCRDUqD6KQf54N04V9TMDyubhPkQYbx1H2gq+uBEo9d1w6AsSMgaUn3xH/\n"
+            + "xYe+INxcP6jFT2OKc36x+8ipP6pc8Hba1X90JwadOcJlwEyJfJKs7hYHTaYn+I6+\n"
+            + "4w0Y//WebhT4ocsYIiOYrENQUcic+vL3fkwwJCloyDBCGxr7w7Gn4Pe3peTCl4Sp\n"
+            + "vIIoYnHPW4h3Nyh8qAlBNDw7dCPS9LP7wRdNABEBAAEAB/oCD6EKLvjXgItlqdm/\n"
+            + "X+OWMYHDCtuRCMW7+2gEw/TxfLeGJaOHWxAouwUIArEEb/hjdaRfIg4wdJUxmyPX\n"
+            + "WyNqUdupkjdXNa7RNaesIi0ilrdZOn7NlHWJCCXwKt2R0jd2p8PDED6CWaE1+76I\n"
+            + "/IuwOHDTD8MABke3KvHDXMxjzdeuRbm670Aqz6zTVY+BZG1GH63Ef5JEyezMgAU5\n"
+            + "42+v+OgD0W0/jCxF7jt2ddP9QiOzu0q65mI4qlOuSebxjH8P7ye0LU9EuWVgAcwc\n"
+            + "YJh2lk3eH8bCWTwlIHj4+8MYgY5i510I5xfY3sWuylw/qtFP9vYjisrysadcUExc\n"
+            + "QUxFBADXQSCmvtgRoSLiGfQv2y2qInx67eJw8pUXFEIJKdOFOhX4vogT9qPWQAms\n"
+            + "/vSshcsAPgpZJZ8MNeGpMGLAGm8y4D2zWWd9YLNmVXsPu7EyrDpXlKHCFnsQfOGN\n"
+            + "c5j8u4CHBn1cS/Yk53S+6Yge2jvnOjVNFmxB0ocs0Y5zbdTJYwQA3b+hQebH7NNr\n"
+            + "FlPwthRZS0TiX5+qkE9tE/0mpRrUN3iS9bnF0IXRmHFp7Hz+EsVbA2Re2A5HIHnQ\n"
+            + "/BSpAsSHRhjU3MH4gzwfg9W43eZGVfofSY6IlUCIcd1bGjSAjJgmfhjU7ofS59i/\n"
+            + "DjzP1jBfXdjOEUQULTkXjHPqO7j4048D/jqMwZNY3AawTMjqKr9nGK49aWv/OVdy\n"
+            + "6xGn4dRJNk3gnnIvjAEFy5+HHbUCJ2lA3X2AssQ9tvbuyDnoSL5/G+zEYtyRuAC5\n"
+            + "9TLQQRmy4qjsYC5TwfoUwFbgqRsmGUcjj2wtE+gb1S8P/zudYrEqOD3K60Y5qXcn\n"
+            + "S3PHgJ++5TzFQba0HlRlc3R1c2VyIEkgPHRlc3RpQGV4YW1wbGUuY29tPokBOAQT\n"
+            + "AQIAIgUCTH5pMQIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ0CLaOl6a\n"
+            + "7dAjNQf/fLmGeKgaesawP53UeioQ8hgDEFKPBddNQP248NpReZ1rg3h8Q21PQJVK\n"
+            + "rtDYn94WJi5NTqUtk9rtx9SiqKaEc3wzIpLcnIYrgGLWot5nq+5V1nY9t9QAiJJD\n"
+            + "rmm2/3tX+jTWW6CpuLih7IsD+gJmpZkY6PfMT+teKEeh5E1XBbu10fwDwMJta+04\n"
+            + "3/TiljInjER1f/b41EnSjI6YXFnxnyiLeDgDA1QIIzB/W2ccGqphzJriDETDJhKF\n"
+            + "ZIeqvjylZofgCLyMRSyZtsu+b4pfBK3hMpu5aaYylaM1BWOpAiqUmGUKqxN/o9EG\n"
+            + "x4wvsMxK6xgiZe5UdQPaoDcFCsEMg50DmARMfmkxAQgAxeT+bUBbADga+lYtkmtY\n"
+            + "VbuG7uWjwdg9TR6qWKD7n37mcu6OgNNlrPaHoClvOL20fcArZ8wT/FbjvDI6ZHn2\n"
+            + "2YA19OvAR+Eqmf3D7qTmebchnCu955PkX7AOOpKfX48qoYq8BoskZDnbFidm5YKf\n"
+            + "Iin3CNDdlQbd3na+ihGCuv0KoGzefuAHcITeYEUESh7HLzQ9/pMES9eCgdTEkwYD\n"
+            + "5NJjfkLnj2kZtDsSiNnENZ0TIlyKOBMnixgsARDjLrkqyTg79thWALiqVBXUKn2N\n"
+            + "BtMkK5xTDc/7q3nIw4InYMIrLtntSu1wpn1gXbdg1HFl5BgqEB9Fp0k02YvrSiiV\n"
+            + "swARAQABAAf/VXp4O5CUvh9956vZu2kKmt2Jhx9CALT6pZkdU3MVvOr/d517iEHH\n"
+            + "pVJHevLqy8OFdtvO4+LOryyI6f14I3ZbHc+3frdmMqYb1LA8NZScyO5FYkOyn5jO\n"
+            + "CFbvjnVOyeP5MhXO6bSoX3JuI7+ZPoGRYxxlTDWLwJdatoDsBI9TvJhVekyAchTH\n"
+            + "Tyt3NQIvLXqHvKU/8WAgclBKeL/y/idep1BrJ4cIJ+EFp0agEG0WpRRUAYjwfE3P\n"
+            + "aSEV0NOoB8rapPW3XuEjO+ZTht+NYvqgPIdTjwXZGFPYnwvEuz772Th4pO3o/PdF\n"
+            + "2cljvRn3qo+lSVnJ0Ki2pb+LukJSIdfHgQQA1DBdm29a/3dBla2y6wxlSXW/3WBp\n"
+            + "51Vpd8SBuwdVrNNQMwPmf1L93YskJnUKSTo7MwgrYZFWf7QzgfD/cHXr8QK2C1TP\n"
+            + "czUC0/uFCm8pPQoOt/osp3PjDAzGgUAMFXCgLtb04P2JqbFvtse5oTFWrKqmscTG\n"
+            + "KnEBkzfgy37U0iMEAO7BEgXCYvqyztHmQATqJfbpxgQGqk738UW6qWwG8mK6aT5V\n"
+            + "OidZvrWqJ3WeIKmEhoJlY2Ky1ZTuJfeQuVucqzNWlZy2yzDijs+t3v4pFGajv4nV\n"
+            + "ivGvlb/O/QoHBuF/9K36lIIqcZstfa2UIYRqkkdEz2JHWJsr81VvCw2Gb38xA/sG\n"
+            + "hqErrIgSBPRCJObM/gb9rJ6dbA5SNY5trc778EjS1myhyPhGOaOmYbdQMONUqLo2\n"
+            + "q1UZo1G7oaI1Um9v5MXN1yZNX/kvx1TMldZEEixrhCIob81eXSpEUfs+Mz2RqvqT\n"
+            + "YsYquYQNPrPXWZQwTJV6fpsBQUMeE/pmlisaSAijHkXPiQEfBBgBAgAJBQJMfmkx\n"
+            + "AhsMAAoJENAi2jpemu3QFPoH/1ynX1j1QWL8TfJFPoB3vXivwGURs3J7LsywHTRj\n"
+            + "pQVQvxQvKTzB1+woUxtEbdjKgMbvY/ShHSlEZKVV9l3ZihrNewHA1GMHrDtBGXcN\n"
+            + "RP9BRfJHTrDzjUxrEEwu4QIq71o4tS89NvQmlYYi7O4ThtVB4hYSwl436+vAT9yb\n"
+            + "IQkUOjCkYrKye6JHs1K4BnVuWcOVujQwW4H8QFbddcWF49uN6DSqrwDFsjFog6wL\n"
+            + "7u6VUL5upRBP/RZWA4HKJVF2tS0Ptr6xLTmf4Tp5n10CGFYkPcRp9biVyeVRJBW4\n"
+            + "uZf0EDsn9J5rNG0pWtgnhAEi6smoT4fADTOzpOovUiTSQhQ=\n"
+            + "=RcWw\n"
+            + "-----END PGP PRIVATE KEY BLOCK-----\n");
   }
 
   /**
-   * pub   2048R/C2E6A198 2010-09-01
-   *       Key fingerprint = 83AB CE4D 6845 D6DA F7FB  AA47 A139 3C46 C2E6 A198
-   * uid                  Testuser J <testj@example.com>
-   * sub   2048R/863E8ABF 2010-09-01
+   * pub 2048R/C2E6A198 2010-09-01 Key fingerprint = 83AB CE4D 6845 D6DA F7FB AA47 A139 3C46 C2E6
+   * A198 uid Testuser J <testj@example.com> sub 2048R/863E8ABF 2010-09-01
    */
   public static TestKey keyJ() throws Exception {
-    return new TestKey("-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
-        + "Version: GnuPG v1\n"
-        + "\n"
-        + "mQENBEx+aUgBCADczNio9UWnUggUZkdqJye57497oD9vNo9rmtR+i1TkMpVeWaMH\n"
-        + "UWrm1twzIPV9D4lAWLJoG2cYF6nXG1JxsKc9mOIZ6O1WfsopMUU0p+EfU8H/cvdM\n"
-        + "/iccYS6OnNL4/xR1R7hlA4+b/jaOZfzdS3i5jwOf+TtCk7c5qOuFhraiVQ9H1G86\n"
-        + "+LsiWVeXEFc/FXxnESRmbaZFNJrAdJl23eKXRC6az0S5FwMVBvUhRpLwIGDbVT/0\n"
-        + "/QwaNUOq3bYwudPREFLg/1HtBuxNhRdV6mCrit+tsPan9o0/WtsHuq8n4/pqOKBc\n"
-        + "RRmOIQR9SEohE2TuVT3XVFpMXa4a4CBuNXjTABEBAAG0HlRlc3R1c2VyIEogPHRl\n"
-        + "c3RqQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTH5pSAIbAwYLCQgHAwIGFQgCCQoL\n"
-        + "BBYCAwECHgECF4AACgkQoTk8RsLmoZi0BggAlnbCwmwaLwcpU9YcOE9/8KF56dIs\n"
-        + "XhdxzqdP91UmhVT0df1OBhgTqFkKprBLCT+B9yBClsnyXMatkvuhQG6C7lw9toMO\n"
-        + "TITRPZoFJe3Ezi+HRRPqAPubIcSgeILuilvFhkoUOgoC1ubmVPgcGBLb8tdvI3bA\n"
-        + "svq+n2jaYUlgL5N6ZNRNakc07e8vH5SeKiD8ZntJlTU49fkxzlawtDaI3+GhyUiB\n"
-        + "0Ah8pl143DFNAq8CfvQCPKwX4WFPkEflh0LlgaEPJUZ/H6KxKXXF8SC9cD2VIii8\n"
-        + "Yrue8y9T+j5y699A0GCptb1IKrgxbfhgD//3g3l1eXsEwn2cwFNCt7pZFLkBDQRM\n"
-        + "fmlIAQgA3E2pM6oDJGgfxbqSfykuRtTbiAi7JEd1DNvEe6gJ7qkBLM4ipILBD0qR\n"
-        + "qCwL37E4/3nMsZjA7GIFLQj2DrFW3aEEKwR/zdh7R67lo9CunCY+FPWTuOkCG8Sh\n"
-        + "3RLpbAV6I61NG/wDznW30vmKNJDgPpkzYj8u0T4MtpywEgxTxCqWZKCufWDRfNAy\n"
-        + "IBLt+piG+bcYKfw9pS8PvXPQMNIi4U2pu3hb/BHC3Y1A8FVpEe4CFV7rWb/K2Ydx\n"
-        + "eBxwwxm9sBxF+vhlI+ZEeb9JxGH6jYlc6twD4e6p3KqusAKLKiLsS5uLQnpMGGZ8\n"
-        + "vcpTSfyHjG2QHc3qG9S/yDCZjhhe2QARAQABiQEfBBgBAgAJBQJMfmlIAhsMAAoJ\n"
-        + "EKE5PEbC5qGYClMIANTdZ+/g/FPl1Lm0tO1CSnHVHekeGNA9n3L6SGiSZQJjEDo0\n"
-        + "gsye5xgxh5JGKf7CqbEFfeLC9Jx5W5EN4dVFudncIlC/SutfRzdt5W8CLXMl0c41\n"
-        + "5FmtpWNStk3MglkcjE5PrRRrSiRc45S0e2kIPb8eiVKg98/rCToC9+Qn3pMi/fcM\n"
-        + "LVpYE+dhvB5EhOSwBWWgvWXzeLhv5CnBKxH0ItHhNwvt8qPOHgQAJKPc6dV888xn\n"
-        + "Sew62LFefHPnGTHLP8RRgVIvZBG5IoovxSz89QGHQZiC4xv00I7zNwmtr6eEcl+y\n"
-        + "BkUK9QWITEBHUDqR+cbVa2dRr3fUHwRP7G2G+ow=\n"
-        + "=ucAX\n"
-        + "-----END PGP PUBLIC KEY BLOCK-----\n",
+    return new TestKey(
+        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "mQENBEx+aUgBCADczNio9UWnUggUZkdqJye57497oD9vNo9rmtR+i1TkMpVeWaMH\n"
+            + "UWrm1twzIPV9D4lAWLJoG2cYF6nXG1JxsKc9mOIZ6O1WfsopMUU0p+EfU8H/cvdM\n"
+            + "/iccYS6OnNL4/xR1R7hlA4+b/jaOZfzdS3i5jwOf+TtCk7c5qOuFhraiVQ9H1G86\n"
+            + "+LsiWVeXEFc/FXxnESRmbaZFNJrAdJl23eKXRC6az0S5FwMVBvUhRpLwIGDbVT/0\n"
+            + "/QwaNUOq3bYwudPREFLg/1HtBuxNhRdV6mCrit+tsPan9o0/WtsHuq8n4/pqOKBc\n"
+            + "RRmOIQR9SEohE2TuVT3XVFpMXa4a4CBuNXjTABEBAAG0HlRlc3R1c2VyIEogPHRl\n"
+            + "c3RqQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTH5pSAIbAwYLCQgHAwIGFQgCCQoL\n"
+            + "BBYCAwECHgECF4AACgkQoTk8RsLmoZi0BggAlnbCwmwaLwcpU9YcOE9/8KF56dIs\n"
+            + "XhdxzqdP91UmhVT0df1OBhgTqFkKprBLCT+B9yBClsnyXMatkvuhQG6C7lw9toMO\n"
+            + "TITRPZoFJe3Ezi+HRRPqAPubIcSgeILuilvFhkoUOgoC1ubmVPgcGBLb8tdvI3bA\n"
+            + "svq+n2jaYUlgL5N6ZNRNakc07e8vH5SeKiD8ZntJlTU49fkxzlawtDaI3+GhyUiB\n"
+            + "0Ah8pl143DFNAq8CfvQCPKwX4WFPkEflh0LlgaEPJUZ/H6KxKXXF8SC9cD2VIii8\n"
+            + "Yrue8y9T+j5y699A0GCptb1IKrgxbfhgD//3g3l1eXsEwn2cwFNCt7pZFLkBDQRM\n"
+            + "fmlIAQgA3E2pM6oDJGgfxbqSfykuRtTbiAi7JEd1DNvEe6gJ7qkBLM4ipILBD0qR\n"
+            + "qCwL37E4/3nMsZjA7GIFLQj2DrFW3aEEKwR/zdh7R67lo9CunCY+FPWTuOkCG8Sh\n"
+            + "3RLpbAV6I61NG/wDznW30vmKNJDgPpkzYj8u0T4MtpywEgxTxCqWZKCufWDRfNAy\n"
+            + "IBLt+piG+bcYKfw9pS8PvXPQMNIi4U2pu3hb/BHC3Y1A8FVpEe4CFV7rWb/K2Ydx\n"
+            + "eBxwwxm9sBxF+vhlI+ZEeb9JxGH6jYlc6twD4e6p3KqusAKLKiLsS5uLQnpMGGZ8\n"
+            + "vcpTSfyHjG2QHc3qG9S/yDCZjhhe2QARAQABiQEfBBgBAgAJBQJMfmlIAhsMAAoJ\n"
+            + "EKE5PEbC5qGYClMIANTdZ+/g/FPl1Lm0tO1CSnHVHekeGNA9n3L6SGiSZQJjEDo0\n"
+            + "gsye5xgxh5JGKf7CqbEFfeLC9Jx5W5EN4dVFudncIlC/SutfRzdt5W8CLXMl0c41\n"
+            + "5FmtpWNStk3MglkcjE5PrRRrSiRc45S0e2kIPb8eiVKg98/rCToC9+Qn3pMi/fcM\n"
+            + "LVpYE+dhvB5EhOSwBWWgvWXzeLhv5CnBKxH0ItHhNwvt8qPOHgQAJKPc6dV888xn\n"
+            + "Sew62LFefHPnGTHLP8RRgVIvZBG5IoovxSz89QGHQZiC4xv00I7zNwmtr6eEcl+y\n"
+            + "BkUK9QWITEBHUDqR+cbVa2dRr3fUHwRP7G2G+ow=\n"
+            + "=ucAX\n"
+            + "-----END PGP PUBLIC KEY BLOCK-----\n",
         "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
-        + "Version: GnuPG v1\n"
-        + "\n"
-        + "lQOYBEx+aUgBCADczNio9UWnUggUZkdqJye57497oD9vNo9rmtR+i1TkMpVeWaMH\n"
-        + "UWrm1twzIPV9D4lAWLJoG2cYF6nXG1JxsKc9mOIZ6O1WfsopMUU0p+EfU8H/cvdM\n"
-        + "/iccYS6OnNL4/xR1R7hlA4+b/jaOZfzdS3i5jwOf+TtCk7c5qOuFhraiVQ9H1G86\n"
-        + "+LsiWVeXEFc/FXxnESRmbaZFNJrAdJl23eKXRC6az0S5FwMVBvUhRpLwIGDbVT/0\n"
-        + "/QwaNUOq3bYwudPREFLg/1HtBuxNhRdV6mCrit+tsPan9o0/WtsHuq8n4/pqOKBc\n"
-        + "RRmOIQR9SEohE2TuVT3XVFpMXa4a4CBuNXjTABEBAAEAB/9sW1MQR53xKP6yFCeD\n"
-        + "3sdOJlSB1PiMeXgU1JznpTT58CEBdnfdRYVy14qkxM30m8U9gMm88YW8exBscgoZ\n"
-        + "pRnNztNW58phokNPx9AwsRp3p0ETPbZDYI6NDNwuPKQEchn2HEZPvFmjsjPP2hkn\n"
-        + "+Lu8RIUA4uzEFX3bnBxJIP1L2AztqyTgHDfXS4/nqerO/cheXhN7j1TUyRO4hinp\n"
-        + "C3WXaxm2kpQXFP2ktq2eu7YPFoW6I6HzHVDN2Z7fD/NzfmR2h4gcIaSDEjIs893N\n"
-        + "b3hsYiOTYwVFX9TBWLr9rSWyrjR4sWelFuMZpjQ53qq+rBm/+8knoNtoWgZFhbR0\n"
-        + "WJyRBADlBuX8kveqLl31QShgw+6TwTHXI40GiCA6DHwZiTstOO6d2KDNq2nHdtuo\n"
-        + "HBvSKYP4a2na39JKb7YfuSMg16QvxQNd7BQWz+NzbGLQEGuX455OD3TE74ZfVElo\n"
-        + "2H/i51hSjOdWihJVNBGlcDYPgb7oLLTbPdKXxptRM1+wrk2//QQA9s3pw2O3lSbV\n"
-        + "U8JyL/FhdyhDvRDuiNBPnB4O/Ynnzz8YSFwSdSE/u8FpguFWdh+UdSrdwE+Ux8kj\n"
-        + "W/miXaqTxUeKnpzOkiO5O2fLvAeriO3rU9KfBER03+NJo4weSorLXzeU4SWkw63N\n"
-        + "OiY3fc67Nj+l8qi1tmoEJyHUomuy7Q8EAOfBvMzGsQQJ12k+4gOSXN9DTWUa85P6\n"
-        + "IphFHC2cpTDy30IRR55sI6Mf3GpC+KzxEyw7WXjlTensEJAHMpyVVRhv6uF0eMaY\n"
-        + "+QGS+vyCgtUfGIwM5Teu6NjeqyShJDTC8qnM+75JgCNu6gZ2F2iTeY+tM3zE1auq\n"
-        + "po1pUACVm7qwR6u0HlRlc3R1c2VyIEogPHRlc3RqQGV4YW1wbGUuY29tPokBOAQT\n"
-        + "AQIAIgUCTH5pSAIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQoTk8RsLm\n"
-        + "oZi0BggAlnbCwmwaLwcpU9YcOE9/8KF56dIsXhdxzqdP91UmhVT0df1OBhgTqFkK\n"
-        + "prBLCT+B9yBClsnyXMatkvuhQG6C7lw9toMOTITRPZoFJe3Ezi+HRRPqAPubIcSg\n"
-        + "eILuilvFhkoUOgoC1ubmVPgcGBLb8tdvI3bAsvq+n2jaYUlgL5N6ZNRNakc07e8v\n"
-        + "H5SeKiD8ZntJlTU49fkxzlawtDaI3+GhyUiB0Ah8pl143DFNAq8CfvQCPKwX4WFP\n"
-        + "kEflh0LlgaEPJUZ/H6KxKXXF8SC9cD2VIii8Yrue8y9T+j5y699A0GCptb1IKrgx\n"
-        + "bfhgD//3g3l1eXsEwn2cwFNCt7pZFJ0DmARMfmlIAQgA3E2pM6oDJGgfxbqSfyku\n"
-        + "RtTbiAi7JEd1DNvEe6gJ7qkBLM4ipILBD0qRqCwL37E4/3nMsZjA7GIFLQj2DrFW\n"
-        + "3aEEKwR/zdh7R67lo9CunCY+FPWTuOkCG8Sh3RLpbAV6I61NG/wDznW30vmKNJDg\n"
-        + "PpkzYj8u0T4MtpywEgxTxCqWZKCufWDRfNAyIBLt+piG+bcYKfw9pS8PvXPQMNIi\n"
-        + "4U2pu3hb/BHC3Y1A8FVpEe4CFV7rWb/K2YdxeBxwwxm9sBxF+vhlI+ZEeb9JxGH6\n"
-        + "jYlc6twD4e6p3KqusAKLKiLsS5uLQnpMGGZ8vcpTSfyHjG2QHc3qG9S/yDCZjhhe\n"
-        + "2QARAQABAAf7BUTPxk/u/vi935DpBXoXRKHZnLM3bFuIexCGQ74rQqR2qazUMH8o\n"
-        + "SFEsaBJpm2WyR47J5WqSHNi5SxPT2AUdNFeh/39hxY61Q6SuBFED+WMRbHrKbURR\n"
-        + "WjPiFuwus02eAkAYFWfBFY0n9/BcAhicQa90MTRj+RZb/EHa+GDdbgDatpwEK22z\n"
-        + "pPb3t/D2TC7ModizelngBN7bdp4Vqna/vMLhsiE+FqL+Ob0KiLkDxtcjZljc9xLK\n"
-        + "B7ZuGH/AZfhF08OAxUcsJdu5cF3viBT+HeSI4OUvdfxPFX98U/SFfuW4mPdHPEI9\n"
-        + "438pdjDUIpJFtcnROtZdS2o6C9ohHa5BUwQA52P8AKKRfg7LpaFMvtKkNORnscac\n"
-        + "1qvXLqAXaMeSsvyU5o1GNvSgbhFzDcXbAFJcXdOo2XgT7JzW/6v1uW9AuQPAkYhr\n"
-        + "ep0uE3mewlzWHZR41MQRaMGN4l80RN6ju4c/Ei+OMHYp2DUfZFDBXbxwWpN8tNoR\n"
-        + "S1X+rOL5RsQgkrcEAPO7zthR+GQnIgJC3c9Las9JkPywCxddjoWZoyt6yITVjIso\n"
-        + "IGD0SJppAkOS3Vdb+raydLuN7HmbpPFnvzyc+RdSt+YCGUObrHb/z9MfahzDNG3S\n"
-        + "VwUQEIl+L6glhwscQOCz80MCcYMFMk4TiankvChRFF5Wil//8QnaonH4bcrvA/46\n"
-        + "VB+ZaEdR+Z8IkYIf7oHLJNEwaH+kRTBQ2x5F9Gnwr9SL6AXAkNkvYD4in/+Bw35r\n"
-        + "o9zGirQQvNrvH3JlZ5PWp1/9rRl2Tefaaf8P2ij/Ky2poBLAhPwK56JXHLt5v+BZ\n"
-        + "mQwhY+teJnbfCwiiS0OeWtpVY/tDVU7wYOd2RIhVfkUziQEfBBgBAgAJBQJMfmlI\n"
-        + "AhsMAAoJEKE5PEbC5qGYClMIANTdZ+/g/FPl1Lm0tO1CSnHVHekeGNA9n3L6SGiS\n"
-        + "ZQJjEDo0gsye5xgxh5JGKf7CqbEFfeLC9Jx5W5EN4dVFudncIlC/SutfRzdt5W8C\n"
-        + "LXMl0c415FmtpWNStk3MglkcjE5PrRRrSiRc45S0e2kIPb8eiVKg98/rCToC9+Qn\n"
-        + "3pMi/fcMLVpYE+dhvB5EhOSwBWWgvWXzeLhv5CnBKxH0ItHhNwvt8qPOHgQAJKPc\n"
-        + "6dV888xnSew62LFefHPnGTHLP8RRgVIvZBG5IoovxSz89QGHQZiC4xv00I7zNwmt\n"
-        + "r6eEcl+yBkUK9QWITEBHUDqR+cbVa2dRr3fUHwRP7G2G+ow=\n"
-        + "=NiQI\n"
-        + "-----END PGP PRIVATE KEY BLOCK-----\n");
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "lQOYBEx+aUgBCADczNio9UWnUggUZkdqJye57497oD9vNo9rmtR+i1TkMpVeWaMH\n"
+            + "UWrm1twzIPV9D4lAWLJoG2cYF6nXG1JxsKc9mOIZ6O1WfsopMUU0p+EfU8H/cvdM\n"
+            + "/iccYS6OnNL4/xR1R7hlA4+b/jaOZfzdS3i5jwOf+TtCk7c5qOuFhraiVQ9H1G86\n"
+            + "+LsiWVeXEFc/FXxnESRmbaZFNJrAdJl23eKXRC6az0S5FwMVBvUhRpLwIGDbVT/0\n"
+            + "/QwaNUOq3bYwudPREFLg/1HtBuxNhRdV6mCrit+tsPan9o0/WtsHuq8n4/pqOKBc\n"
+            + "RRmOIQR9SEohE2TuVT3XVFpMXa4a4CBuNXjTABEBAAEAB/9sW1MQR53xKP6yFCeD\n"
+            + "3sdOJlSB1PiMeXgU1JznpTT58CEBdnfdRYVy14qkxM30m8U9gMm88YW8exBscgoZ\n"
+            + "pRnNztNW58phokNPx9AwsRp3p0ETPbZDYI6NDNwuPKQEchn2HEZPvFmjsjPP2hkn\n"
+            + "+Lu8RIUA4uzEFX3bnBxJIP1L2AztqyTgHDfXS4/nqerO/cheXhN7j1TUyRO4hinp\n"
+            + "C3WXaxm2kpQXFP2ktq2eu7YPFoW6I6HzHVDN2Z7fD/NzfmR2h4gcIaSDEjIs893N\n"
+            + "b3hsYiOTYwVFX9TBWLr9rSWyrjR4sWelFuMZpjQ53qq+rBm/+8knoNtoWgZFhbR0\n"
+            + "WJyRBADlBuX8kveqLl31QShgw+6TwTHXI40GiCA6DHwZiTstOO6d2KDNq2nHdtuo\n"
+            + "HBvSKYP4a2na39JKb7YfuSMg16QvxQNd7BQWz+NzbGLQEGuX455OD3TE74ZfVElo\n"
+            + "2H/i51hSjOdWihJVNBGlcDYPgb7oLLTbPdKXxptRM1+wrk2//QQA9s3pw2O3lSbV\n"
+            + "U8JyL/FhdyhDvRDuiNBPnB4O/Ynnzz8YSFwSdSE/u8FpguFWdh+UdSrdwE+Ux8kj\n"
+            + "W/miXaqTxUeKnpzOkiO5O2fLvAeriO3rU9KfBER03+NJo4weSorLXzeU4SWkw63N\n"
+            + "OiY3fc67Nj+l8qi1tmoEJyHUomuy7Q8EAOfBvMzGsQQJ12k+4gOSXN9DTWUa85P6\n"
+            + "IphFHC2cpTDy30IRR55sI6Mf3GpC+KzxEyw7WXjlTensEJAHMpyVVRhv6uF0eMaY\n"
+            + "+QGS+vyCgtUfGIwM5Teu6NjeqyShJDTC8qnM+75JgCNu6gZ2F2iTeY+tM3zE1auq\n"
+            + "po1pUACVm7qwR6u0HlRlc3R1c2VyIEogPHRlc3RqQGV4YW1wbGUuY29tPokBOAQT\n"
+            + "AQIAIgUCTH5pSAIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQoTk8RsLm\n"
+            + "oZi0BggAlnbCwmwaLwcpU9YcOE9/8KF56dIsXhdxzqdP91UmhVT0df1OBhgTqFkK\n"
+            + "prBLCT+B9yBClsnyXMatkvuhQG6C7lw9toMOTITRPZoFJe3Ezi+HRRPqAPubIcSg\n"
+            + "eILuilvFhkoUOgoC1ubmVPgcGBLb8tdvI3bAsvq+n2jaYUlgL5N6ZNRNakc07e8v\n"
+            + "H5SeKiD8ZntJlTU49fkxzlawtDaI3+GhyUiB0Ah8pl143DFNAq8CfvQCPKwX4WFP\n"
+            + "kEflh0LlgaEPJUZ/H6KxKXXF8SC9cD2VIii8Yrue8y9T+j5y699A0GCptb1IKrgx\n"
+            + "bfhgD//3g3l1eXsEwn2cwFNCt7pZFJ0DmARMfmlIAQgA3E2pM6oDJGgfxbqSfyku\n"
+            + "RtTbiAi7JEd1DNvEe6gJ7qkBLM4ipILBD0qRqCwL37E4/3nMsZjA7GIFLQj2DrFW\n"
+            + "3aEEKwR/zdh7R67lo9CunCY+FPWTuOkCG8Sh3RLpbAV6I61NG/wDznW30vmKNJDg\n"
+            + "PpkzYj8u0T4MtpywEgxTxCqWZKCufWDRfNAyIBLt+piG+bcYKfw9pS8PvXPQMNIi\n"
+            + "4U2pu3hb/BHC3Y1A8FVpEe4CFV7rWb/K2YdxeBxwwxm9sBxF+vhlI+ZEeb9JxGH6\n"
+            + "jYlc6twD4e6p3KqusAKLKiLsS5uLQnpMGGZ8vcpTSfyHjG2QHc3qG9S/yDCZjhhe\n"
+            + "2QARAQABAAf7BUTPxk/u/vi935DpBXoXRKHZnLM3bFuIexCGQ74rQqR2qazUMH8o\n"
+            + "SFEsaBJpm2WyR47J5WqSHNi5SxPT2AUdNFeh/39hxY61Q6SuBFED+WMRbHrKbURR\n"
+            + "WjPiFuwus02eAkAYFWfBFY0n9/BcAhicQa90MTRj+RZb/EHa+GDdbgDatpwEK22z\n"
+            + "pPb3t/D2TC7ModizelngBN7bdp4Vqna/vMLhsiE+FqL+Ob0KiLkDxtcjZljc9xLK\n"
+            + "B7ZuGH/AZfhF08OAxUcsJdu5cF3viBT+HeSI4OUvdfxPFX98U/SFfuW4mPdHPEI9\n"
+            + "438pdjDUIpJFtcnROtZdS2o6C9ohHa5BUwQA52P8AKKRfg7LpaFMvtKkNORnscac\n"
+            + "1qvXLqAXaMeSsvyU5o1GNvSgbhFzDcXbAFJcXdOo2XgT7JzW/6v1uW9AuQPAkYhr\n"
+            + "ep0uE3mewlzWHZR41MQRaMGN4l80RN6ju4c/Ei+OMHYp2DUfZFDBXbxwWpN8tNoR\n"
+            + "S1X+rOL5RsQgkrcEAPO7zthR+GQnIgJC3c9Las9JkPywCxddjoWZoyt6yITVjIso\n"
+            + "IGD0SJppAkOS3Vdb+raydLuN7HmbpPFnvzyc+RdSt+YCGUObrHb/z9MfahzDNG3S\n"
+            + "VwUQEIl+L6glhwscQOCz80MCcYMFMk4TiankvChRFF5Wil//8QnaonH4bcrvA/46\n"
+            + "VB+ZaEdR+Z8IkYIf7oHLJNEwaH+kRTBQ2x5F9Gnwr9SL6AXAkNkvYD4in/+Bw35r\n"
+            + "o9zGirQQvNrvH3JlZ5PWp1/9rRl2Tefaaf8P2ij/Ky2poBLAhPwK56JXHLt5v+BZ\n"
+            + "mQwhY+teJnbfCwiiS0OeWtpVY/tDVU7wYOd2RIhVfkUziQEfBBgBAgAJBQJMfmlI\n"
+            + "AhsMAAoJEKE5PEbC5qGYClMIANTdZ+/g/FPl1Lm0tO1CSnHVHekeGNA9n3L6SGiS\n"
+            + "ZQJjEDo0gsye5xgxh5JGKf7CqbEFfeLC9Jx5W5EN4dVFudncIlC/SutfRzdt5W8C\n"
+            + "LXMl0c415FmtpWNStk3MglkcjE5PrRRrSiRc45S0e2kIPb8eiVKg98/rCToC9+Qn\n"
+            + "3pMi/fcMLVpYE+dhvB5EhOSwBWWgvWXzeLhv5CnBKxH0ItHhNwvt8qPOHgQAJKPc\n"
+            + "6dV888xnSew62LFefHPnGTHLP8RRgVIvZBG5IoovxSz89QGHQZiC4xv00I7zNwmt\n"
+            + "r6eEcl+yBkUK9QWITEBHUDqR+cbVa2dRr3fUHwRP7G2G+ow=\n"
+            + "=NiQI\n"
+            + "-----END PGP PRIVATE KEY BLOCK-----\n");
   }
 
-  private TestTrustKeys() {
-  }
+  private TestTrustKeys() {}
 }
diff --git a/gerrit-gwtdebug/src/main/java/com/google/gerrit/gwtdebug/GerritGwtDebugLauncher.java b/gerrit-gwtdebug/src/main/java/com/google/gerrit/gwtdebug/GerritGwtDebugLauncher.java
index 4282534a32..4edff0e821 100644
--- a/gerrit-gwtdebug/src/main/java/com/google/gerrit/gwtdebug/GerritGwtDebugLauncher.java
+++ b/gerrit-gwtdebug/src/main/java/com/google/gerrit/gwtdebug/GerritGwtDebugLauncher.java
@@ -17,12 +17,10 @@ package com.google.gerrit.gwtdebug;
 import com.google.gerrit.pgm.Daemon;
 import com.google.gwt.dev.codeserver.CodeServer;
 import com.google.gwt.dev.codeserver.Options;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import java.util.ArrayList;
 import java.util.List;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 class GerritGwtDebugLauncher {
   private static final Logger log = LoggerFactory.getLogger(GerritGwtDebugLauncher.class);
@@ -55,8 +53,7 @@ class GerritGwtDebugLauncher {
     }
 
     Options options = new Options();
-    if (!options.parseArgs(sdmLauncherOptions.toArray(
-        new String[sdmLauncherOptions.size()]))) {
+    if (!options.parseArgs(sdmLauncherOptions.toArray(new String[sdmLauncherOptions.size()]))) {
       log.error("Failed to parse codeserver arguments");
       return 1;
     }
@@ -64,8 +61,9 @@ class GerritGwtDebugLauncher {
     CodeServer.main(options);
 
     try {
-      int r = new Daemon().main(daemonLauncherOptions.toArray(
-          new String[daemonLauncherOptions.size()]));
+      int r =
+          new Daemon()
+              .main(daemonLauncherOptions.toArray(new String[daemonLauncherOptions.size()]));
       if (r != 0) {
         log.error("Daemon exited with return code: " + r);
         return 1;
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/ClippyCss.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/ClippyCss.java
index 05a1861f8c..0d340ff2ad 100644
--- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/ClippyCss.java
+++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/ClippyCss.java
@@ -18,6 +18,8 @@ import com.google.gwt.resources.client.CssResource;
 
 public interface ClippyCss extends CssResource {
   String label();
+
   String copier();
+
   String swf();
 }
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/CopyableLabel.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/CopyableLabel.java
index 8d54b2f991..2d0f8332bb 100644
--- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/CopyableLabel.java
+++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/CopyableLabel.java
@@ -44,11 +44,10 @@ import com.google.gwtexpui.user.client.UserAgent;
 
 /**
  * Label which permits the user to easily copy the complete content.
- * 

- * If the Flash plugin is available a "movie" is embedded that provides - * one-click copying of the content onto the system clipboard. The label (if - * visible) can also be clicked, switching from a label to an input box, - * allowing the user to copy the text with a keyboard shortcut. + * + *

If the Flash plugin is available a "movie" is embedded that provides one-click copying of the + * content onto the system clipboard. The label (if visible) can also be clicked, switching from a + * label to an input box, allowing the user to copy the text with a keyboard shortcut. */ public class CopyableLabel extends Composite implements HasText { private static final int SWF_WIDTH = 110; @@ -96,8 +95,8 @@ public class CopyableLabel extends Composite implements HasText { * Create a new label * * @param str initial content - * @param showLabel if true, the content is shown, if false it is hidden from - * view and only the copy icon is displayed. + * @param showLabel if true, the content is shown, if false it is hidden from view and only the + * copy icon is displayed. */ public CopyableLabel(final String str, final boolean showLabel) { content = new FlowPanel(); @@ -109,37 +108,42 @@ public class CopyableLabel extends Composite implements HasText { if (showLabel) { textLabel = new InlineLabel(getText()); textLabel.setStyleName(ClippyResources.I.css().label()); - textLabel.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - showTextBox(); - } - }); + textLabel.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + showTextBox(); + } + }); content.add(textLabel); } if (UserAgent.hasJavaScriptClipboard()) { - copier = new Button(new SafeHtmlBuilder() - .openElement("img") - .setAttribute("src", ClippyResources.I.clipboard().getSafeUri().asString()) - .setWidth(14) - .setHeight(14) - .closeSelf()); + copier = + new Button( + new SafeHtmlBuilder() + .openElement("img") + .setAttribute("src", ClippyResources.I.clipboard().getSafeUri().asString()) + .setWidth(14) + .setHeight(14) + .closeSelf()); copier.setStyleName(ClippyResources.I.css().copier()); Tooltip.addStyle(copier); Tooltip.setLabel(copier, CopyableLabelText.I.tooltip()); - copier.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - copy(); - } - }); - copier.addMouseOutHandler(new MouseOutHandler() { - @Override - public void onMouseOut(MouseOutEvent event) { - Tooltip.setLabel(copier, CopyableLabelText.I.tooltip()); - } - }); + copier.addClickHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + copy(); + } + }); + copier.addMouseOutHandler( + new MouseOutHandler() { + @Override + public void onMouseOut(MouseOutEvent event) { + Tooltip.setLabel(copier, CopyableLabelText.I.tooltip()); + } + }); FlowPanel p = new FlowPanel(); p.getElement().getStyle().setDisplay(Display.INLINE_BLOCK); @@ -153,8 +157,8 @@ public class CopyableLabel extends Composite implements HasText { /** * Change the text which is displayed in the clickable label. * - * @param text the new preview text, should be shorter than the original text - * which would be copied to the clipboard. + * @param text the new preview text, should be shorter than the original text which would be + * copied to the clipboard. */ public void setPreviewText(final String text) { if (textLabel != null) { @@ -163,8 +167,7 @@ public class CopyableLabel extends Composite implements HasText { } private void embedMovie() { - if (copier == null && flashEnabled && !text.isEmpty() - && UserAgent.Flash.isInstalled()) { + if (copier == null && flashEnabled && !text.isEmpty() && UserAgent.Flash.isInstalled()) { final String flashVars = "text=" + URL.encodeQueryString(getText()); final SafeHtmlBuilder h = new SafeHtmlBuilder(); @@ -223,47 +226,54 @@ public class CopyableLabel extends Composite implements HasText { textBox.setText(getText()); textBox.setVisibleLength(visibleLen); textBox.setReadOnly(true); - textBox.addKeyPressHandler(new KeyPressHandler() { - @Override - public void onKeyPress(final KeyPressEvent event) { - if (event.isControlKeyDown() || event.isMetaKeyDown()) { - switch (event.getCharCode()) { - case 'c': - case 'x': - textBox.addKeyUpHandler(new KeyUpHandler() { - @Override - public void onKeyUp(final KeyUpEvent event) { - Scheduler.get().scheduleDeferred(new Command() { - @Override - public void execute() { - hideTextBox(); - } - }); - } - }); - break; + textBox.addKeyPressHandler( + new KeyPressHandler() { + @Override + public void onKeyPress(final KeyPressEvent event) { + if (event.isControlKeyDown() || event.isMetaKeyDown()) { + switch (event.getCharCode()) { + case 'c': + case 'x': + textBox.addKeyUpHandler( + new KeyUpHandler() { + @Override + public void onKeyUp(final KeyUpEvent event) { + Scheduler.get() + .scheduleDeferred( + new Command() { + @Override + public void execute() { + hideTextBox(); + } + }); + } + }); + break; + } + } } - } - } - }); - textBox.addBlurHandler(new BlurHandler() { - @Override - public void onBlur(final BlurEvent event) { - hideTextBox(); - } - }); + }); + textBox.addBlurHandler( + new BlurHandler() { + @Override + public void onBlur(final BlurEvent event) { + hideTextBox(); + } + }); content.insert(textBox, 1); } textLabel.setVisible(false); textBox.setVisible(true); - Scheduler.get().scheduleDeferred(new Command() { - @Override - public void execute() { - textBox.selectAll(); - textBox.setFocus(true); - } - }); + Scheduler.get() + .scheduleDeferred( + new Command() { + @Override + public void execute() { + textBox.selectAll(); + textBox.setFocus(true); + } + }); } private void hideTextBox() { @@ -283,9 +293,7 @@ public class CopyableLabel extends Composite implements HasText { t.selectAll(); boolean ok = execCommand("copy"); - Tooltip.setLabel(copier, ok - ? CopyableLabelText.I.copied() - : CopyableLabelText.I.failed()); + Tooltip.setLabel(copier, ok ? CopyableLabelText.I.copied() : CopyableLabelText.I.failed()); if (!ok) { // Disable JavaScript clipboard and try flash movie in another instance. UserAgent.disableJavaScriptClipboard(); @@ -303,6 +311,5 @@ public class CopyableLabel extends Composite implements HasText { } } - private static native boolean nativeExec(String c) - /*-{ return !! $doc.execCommand(c) }-*/; + private static native boolean nativeExec(String c) /*-{ return !! $doc.execCommand(c) }-*/; } diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/CopyableLabelText.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/CopyableLabelText.java index 8e4d090fd7..ff36541913 100644 --- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/CopyableLabelText.java +++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/CopyableLabelText.java @@ -21,6 +21,8 @@ interface CopyableLabelText extends Constants { CopyableLabelText I = GWT.create(CopyableLabelText.class); String tooltip(); + String copied(); + String failed(); } diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/css/rebind/CssLinker.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/css/rebind/CssLinker.java index 753d25ffdd..1066dd4e56 100644 --- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/css/rebind/CssLinker.java +++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/css/rebind/CssLinker.java @@ -25,7 +25,6 @@ import com.google.gwt.core.ext.linker.PublicResource; import com.google.gwt.core.ext.linker.impl.StandardLinkerContext; import com.google.gwt.core.ext.linker.impl.StandardStylesheetReference; import com.google.gwt.dev.util.Util; - import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; @@ -39,19 +38,19 @@ public class CssLinker extends AbstractLinker { } @Override - public ArtifactSet link(final TreeLogger logger, final LinkerContext context, - final ArtifactSet artifacts) throws UnableToCompleteException { + public ArtifactSet link( + final TreeLogger logger, final LinkerContext context, final ArtifactSet artifacts) + throws UnableToCompleteException { final ArtifactSet returnTo = new ArtifactSet(); int index = 0; final HashMap css = new HashMap<>(); - for (final StandardStylesheetReference ssr : artifacts - . find(StandardStylesheetReference.class)) { + for (final StandardStylesheetReference ssr : + artifacts.find(StandardStylesheetReference.class)) { css.put(ssr.getSrc(), null); } - for (final PublicResource pr : artifacts - . find(PublicResource.class)) { + for (final PublicResource pr : artifacts.find(PublicResource.class)) { if (css.containsKey(pr.getPartialPath())) { css.put(pr.getPartialPath(), new CssPubRsrc(name(logger, pr), pr)); } @@ -112,8 +111,7 @@ public class CssLinker extends AbstractLinker { } @Override - public InputStream getContents(final TreeLogger logger) - throws UnableToCompleteException { + public InputStream getContents(final TreeLogger logger) throws UnableToCompleteException { return src.getContents(logger); } diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/DocWidget.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/DocWidget.java index c59a4ea7cc..320010eb59 100644 --- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/DocWidget.java +++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/DocWidget.java @@ -27,8 +27,7 @@ import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.Widget; -public class DocWidget extends Widget - implements HasKeyPressHandlers, HasMouseMoveHandlers { +public class DocWidget extends Widget implements HasKeyPressHandlers, HasMouseMoveHandlers { private static DocWidget me; public static DocWidget get() { diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/GlobalKey.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/GlobalKey.java index daf5d61394..39613139e1 100644 --- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/GlobalKey.java +++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/GlobalKey.java @@ -26,14 +26,14 @@ import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.ui.PopupPanel; import com.google.gwt.user.client.ui.Widget; - public class GlobalKey { - public static final KeyPressHandler STOP_PROPAGATION = new KeyPressHandler() { - @Override - public void onKeyPress(final KeyPressEvent event) { - event.stopPropagation(); - } - }; + public static final KeyPressHandler STOP_PROPAGATION = + new KeyPressHandler() { + @Override + public void onKeyPress(final KeyPressEvent event) { + event.stopPropagation(); + } + }; private static State global; static State active; @@ -46,24 +46,27 @@ public class GlobalKey { private static void initEvents() { if (active == null) { - DocWidget.get().addKeyPressHandler(new KeyPressHandler() { - @Override - public void onKeyPress(final KeyPressEvent event) { - final KeyCommandSet s = active.live; - if (s != active.all) { - active.live = active.all; - restoreTimer.cancel(); - } - s.onKeyPress(event); - } - }); + DocWidget.get() + .addKeyPressHandler( + new KeyPressHandler() { + @Override + public void onKeyPress(final KeyPressEvent event) { + final KeyCommandSet s = active.live; + if (s != active.all) { + active.live = active.all; + restoreTimer.cancel(); + } + s.onKeyPress(event); + } + }); - restoreTimer = new Timer() { - @Override - public void run() { - active.live = active.all; - } - }; + restoreTimer = + new Timer() { + @Override + public void run() { + active.live = active.all; + } + }; global = new State(null); active = global; @@ -72,12 +75,13 @@ public class GlobalKey { private static void initDialog() { if (restoreGlobal == null) { - restoreGlobal = new CloseHandler() { - @Override - public void onClose(final CloseEvent event) { - active = global; - } - }; + restoreGlobal = + new CloseHandler() { + @Override + public void onClose(final CloseEvent event) { + active = global; + } + }; } } @@ -94,18 +98,19 @@ public class GlobalKey { active = new State(panel); active.add(new HidePopupPanelCommand(0, KeyCodes.KEY_ESCAPE, panel)); panel.addCloseHandler(restoreGlobal); - panel.addDomHandler(new KeyDownHandler() { - @Override - public void onKeyDown(KeyDownEvent event) { - if (event.getNativeKeyCode() == KeyCodes.KEY_ESCAPE) { - panel.hide(); - } - } - }, KeyDownEvent.getType()); + panel.addDomHandler( + new KeyDownHandler() { + @Override + public void onKeyDown(KeyDownEvent event) { + if (event.getNativeKeyCode() == KeyCodes.KEY_ESCAPE) { + panel.hide(); + } + } + }, + KeyDownEvent.getType()); } - public static HandlerRegistration addApplication(final Widget widget, - final KeyCommand appKey) { + public static HandlerRegistration addApplication(final Widget widget, final KeyCommand appKey) { initEvents(); final State state = stateFor(widget); state.add(appKey); @@ -117,8 +122,7 @@ public class GlobalKey { }; } - public static HandlerRegistration add(final Widget widget, - final KeyCommandSet cmdSet) { + public static HandlerRegistration add(final Widget widget, final KeyCommandSet cmdSet) { initEvents(); final State state = stateFor(widget); state.add(cmdSet); @@ -147,8 +151,7 @@ public class GlobalKey { } } - private GlobalKey() { - } + private GlobalKey() {} static class State { final Widget root; diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyCommand.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyCommand.java index a0fee2b682..2e9b652fd5 100644 --- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyCommand.java +++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyCommand.java @@ -19,7 +19,6 @@ import com.google.gwt.event.dom.client.KeyPressHandler; import com.google.gwtexpui.safehtml.client.SafeHtml; import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder; - public abstract class KeyCommand implements KeyPressHandler { public static final int M_CTRL = 1 << 16; public static final int M_ALT = 2 << 16; @@ -27,9 +26,7 @@ public abstract class KeyCommand implements KeyPressHandler { public static final int M_SHIFT = 8 << 16; public static boolean same(final KeyCommand a, final KeyCommand b) { - return a.getClass() == b.getClass() - && a.helpText.equals(b.helpText) - && a.sibling == b.sibling; + return a.getClass() == b.getClass() && a.helpText.equals(b.helpText) && a.sibling == b.sibling; } final int keyMask; diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyCommandSet.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyCommandSet.java index e0a18aa2e0..734dd4eb77 100644 --- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyCommandSet.java +++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyCommandSet.java @@ -16,7 +16,6 @@ package com.google.gwtexpui.globalkey.client; import com.google.gwt.event.dom.client.KeyPressEvent; import com.google.gwt.event.dom.client.KeyPressHandler; - import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -65,8 +64,7 @@ public class KeyCommandSet implements KeyPressHandler { public void add(final KeyCommand k) { assert !map.containsKey(k.keyMask) - : "Key " + k.describeKeyStroke().asString() - + " already registered"; + : "Key " + k.describeKeyStroke().asString() + " already registered"; if (!map.containsKey(k.keyMask)) { map.put(k.keyMask, k); } @@ -103,7 +101,7 @@ public class KeyCommandSet implements KeyPressHandler { s.filter(filter); } } - for (final Iterator i = map.values().iterator(); i.hasNext();) { + for (final Iterator i = map.values().iterator(); i.hasNext(); ) { final KeyCommand kc = i.next(); if (!filter.include(kc)) { i.remove(); @@ -118,7 +116,7 @@ public class KeyCommandSet implements KeyPressHandler { } public Collection getSets() { - return sets != null ? sets : Collections. emptyList(); + return sets != null ? sets : Collections.emptyList(); } @Override diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyConstants.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyConstants.java index 2b5984d9b0..209b170941 100644 --- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyConstants.java +++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyConstants.java @@ -21,20 +21,32 @@ public interface KeyConstants extends Constants { KeyConstants I = GWT.create(KeyConstants.class); String applicationSection(); + String showHelp(); + String closeCurrentDialog(); String keyboardShortcuts(); + String closeButton(); + String orOtherKey(); + String thenOtherKey(); String keyCtrl(); + String keyAlt(); + String keyMeta(); + String keyShift(); + String keyEnter(); + String keyEsc(); + String keyLeft(); + String keyRight(); } diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyCss.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyCss.java index d19018de8f..658af57545 100644 --- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyCss.java +++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyCss.java @@ -18,12 +18,20 @@ import com.google.gwt.resources.client.CssResource; public interface KeyCss extends CssResource { String helpPopup(); + String helpHeader(); + String helpHeaderGlue(); + String helpTable(); + String helpTableGlue(); + String helpGroup(); + String helpKeyStroke(); + String helpSeparator(); + String helpKey(); } diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyHelpPopup.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyHelpPopup.java index a85d7047cd..0ec9d10a17 100644 --- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyHelpPopup.java +++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyHelpPopup.java @@ -31,7 +31,6 @@ import com.google.gwt.user.client.ui.HasHorizontalAlignment; import com.google.gwt.user.client.ui.PopupPanel; import com.google.gwtexpui.safehtml.client.SafeHtml; import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder; - import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -41,22 +40,21 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; - -public class KeyHelpPopup extends PopupPanel implements - KeyPressHandler, KeyDownHandler { +public class KeyHelpPopup extends PopupPanel implements KeyPressHandler, KeyDownHandler { private final FocusPanel focus; public KeyHelpPopup() { - super(true/* autohide */, true/* modal */); + super(true /* autohide */, true /* modal */); setStyleName(KeyResources.I.css().helpPopup()); final Anchor closer = new Anchor(KeyConstants.I.closeButton()); - closer.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - hide(); - } - }); + closer.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + hide(); + } + }); final Grid header = new Grid(1, 3); header.setStyleName(KeyResources.I.css().helpHeader()); @@ -70,8 +68,7 @@ public class KeyHelpPopup extends PopupPanel implements final Grid lists = new Grid(0, 7); lists.setStyleName(KeyResources.I.css().helpTable()); populate(lists); - lists.getCellFormatter().addStyleName(0, 3, - KeyResources.I.css().helpTableGlue()); + lists.getCellFormatter().addStyleName(0, 3, KeyResources.I.css().helpTableGlue()); final FlowPanel body = new FlowPanel(); body.add(header); @@ -129,8 +126,8 @@ public class KeyHelpPopup extends PopupPanel implements } /** - * @return an ordered collection of KeyCommandSet, combining sets which share - * the same name, so that each set name appears at most once. + * @return an ordered collection of KeyCommandSet, combining sets which share the same name, so + * that each set name appears at most once. */ private static Collection combinedSetsByName() { LinkedHashMap byName = new LinkedHashMap<>(); @@ -145,8 +142,7 @@ public class KeyHelpPopup extends PopupPanel implements return byName.values(); } - private int formatGroup(final Grid lists, int row, final int col, - final KeyCommandSet set) { + private int formatGroup(final Grid lists, int row, final int col, final KeyCommandSet set) { if (set.isEmpty()) { return row; } @@ -155,15 +151,14 @@ public class KeyHelpPopup extends PopupPanel implements lists.resizeRows(row + 1); } lists.setText(row, col + 2, set.getName()); - lists.getCellFormatter().addStyleName(row, col + 2, - KeyResources.I.css().helpGroup()); + lists.getCellFormatter().addStyleName(row, col + 2, KeyResources.I.css().helpGroup()); row++; return formatKeys(lists, row, col, set, null); } - private int formatKeys(final Grid lists, int row, final int col, - final KeyCommandSet set, final SafeHtml prefix) { + private int formatKeys( + final Grid lists, int row, final int col, final KeyCommandSet set, final SafeHtml prefix) { final CellFormatter fmt = lists.getCellFormatter(); final List keys = sort(set); if (lists.getRowCount() < row + keys.size()) { @@ -171,7 +166,8 @@ public class KeyHelpPopup extends PopupPanel implements } Map rows = new HashMap<>(); - FORMAT_KEYS: for (int i = 0; i < keys.size(); i++) { + FORMAT_KEYS: + for (int i = 0; i < keys.size(); i++) { final KeyCommand k = keys.get(i); if (rows.containsKey(k)) { continue; @@ -234,12 +230,14 @@ public class KeyHelpPopup extends PopupPanel implements private List sort(final KeyCommandSet set) { final List keys = new ArrayList<>(set.getKeys()); - Collections.sort(keys, new Comparator() { - @Override - public int compare(KeyCommand arg0, KeyCommand arg1) { - return arg0.getHelpText().compareTo(arg1.getHelpText()); - } - }); + Collections.sort( + keys, + new Comparator() { + @Override + public int compare(KeyCommand arg0, KeyCommand arg1) { + return arg0.getHelpText().compareTo(arg1.getHelpText()); + } + }); return keys; } } diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/ShowHelpCommand.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/ShowHelpCommand.java index b7ea69f4c8..c2272c5935 100644 --- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/ShowHelpCommand.java +++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/ShowHelpCommand.java @@ -49,22 +49,24 @@ public class ShowHelpCommand extends KeyCommand { } final KeyHelpPopup help = new KeyHelpPopup(); - help.addCloseHandler(new CloseHandler() { - @Override - public void onClose(final CloseEvent event) { - current = null; - BUS.fireEvent(new FocusEvent() {}); - } - }); + help.addCloseHandler( + new CloseHandler() { + @Override + public void onClose(final CloseEvent event) { + current = null; + BUS.fireEvent(new FocusEvent() {}); + } + }); current = help; - help.setPopupPositionAndShow(new PositionCallback() { - @Override - public void setPosition(final int pWidth, final int pHeight) { - final int left = (Window.getClientWidth() - pWidth) >> 1; - final int wLeft = Window.getScrollLeft(); - final int wTop = Window.getScrollTop(); - help.setPopupPosition(wLeft + left, wTop + 50); - } - }); + help.setPopupPositionAndShow( + new PositionCallback() { + @Override + public void setPosition(final int pWidth, final int pHeight) { + final int left = (Window.getClientWidth() - pWidth) >> 1; + final int wLeft = Window.getScrollLeft(); + final int wTop = Window.getScrollTop(); + help.setPopupPosition(wLeft + left, wTop + 50); + } + }); } } diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/linker/server/UserAgentRule.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/linker/server/UserAgentRule.java index a33f605e20..8f7bedeb00 100644 --- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/linker/server/UserAgentRule.java +++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/linker/server/UserAgentRule.java @@ -18,16 +18,15 @@ import static java.util.regex.Pattern.compile; import java.util.regex.Matcher; import java.util.regex.Pattern; - import javax.servlet.http.HttpServletRequest; /** * Selects the value for the {@code user.agent} property. - *

- * Examines the {@code User-Agent} HTTP request header, and tries to match it to - * known {@code user.agent} values. - *

- * Ported from JavaScript in {@code com.google.gwt.user.UserAgent.gwt.xml}. + * + *

Examines the {@code User-Agent} HTTP request header, and tries to match it to known {@code + * user.agent} values. + * + *

Ported from JavaScript in {@code com.google.gwt.user.UserAgent.gwt.xml}. */ public class UserAgentRule { private static final Pattern msie = compile(".*msie ([0-11]+)\\.([0-11]+).*"); @@ -89,7 +88,6 @@ public class UserAgentRule { } private int makeVersion(Matcher result) { - return (Integer.parseInt(result.group(1)) * 1000) - + Integer.parseInt(result.group(2)); + return (Integer.parseInt(result.group(1)) * 1000) + Integer.parseInt(result.group(2)); } } diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/progress/client/ProgressBar.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/progress/client/ProgressBar.java index 931e84ee38..bc183236ba 100644 --- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/progress/client/ProgressBar.java +++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/progress/client/ProgressBar.java @@ -20,10 +20,10 @@ import com.google.gwt.user.client.ui.Label; /** * A simple progress bar with a text label. - *

- * The bar is 200 pixels wide and 20 pixels high. To keep the implementation - * simple and lightweight this dimensions are fixed and shouldn't be modified by - * style overrides in client code or CSS. + * + *

The bar is 200 pixels wide and 20 pixels high. To keep the implementation simple and + * lightweight this dimensions are fixed and shouldn't be modified by style overrides in client code + * or CSS. */ public class ProgressBar extends Composite { static { diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/progress/client/ProgressCss.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/progress/client/ProgressCss.java index 9de2748f90..ec27490063 100644 --- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/progress/client/ProgressCss.java +++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/progress/client/ProgressCss.java @@ -18,6 +18,8 @@ import com.google.gwt.resources.client.CssResource; public interface ProgressCss extends CssResource { String container(); + String text(); + String bar(); } diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/AttMap.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/AttMap.java index a84835e991..eb141f1572 100644 --- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/AttMap.java +++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/AttMap.java @@ -21,6 +21,7 @@ import java.util.HashMap; class AttMap { private static final Tag ANY = new AnyTag(); private static final HashMap TAGS; + static { final Tag src = new SrcTag(); TAGS = new HashMap<>(); @@ -108,8 +109,7 @@ class AttMap { private static class AnyTag implements Tag { @Override - public void assertSafe(String name, String value) { - } + public void assertSafe(String name, String value) {} } private static class AnchorTag implements Tag { diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/FindReplace.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/FindReplace.java index 487e613840..4fb32465fd 100644 --- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/FindReplace.java +++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/FindReplace.java @@ -18,19 +18,15 @@ import com.google.gwt.regexp.shared.RegExp; /** A Find/Replace pair used against the {@link SafeHtml} block of text. */ public interface FindReplace { - /** - * @return regular expression to match substrings with; should be treated as - * immutable. - */ + /** @return regular expression to match substrings with; should be treated as immutable. */ RegExp pattern(); /** * Find and replace a single instance of this pattern in an input. - *

- * WARNING: No XSS sanitization is done on the return value of this - * method, e.g. this value may be passed directly to - * {@link SafeHtml#replaceAll(String, String)}. Implementations must sanitize output - * appropriately. + * + *

WARNING: No XSS sanitization is done on the return value of this method, e.g. this + * value may be passed directly to {@link SafeHtml#replaceAll(String, String)}. Implementations + * must sanitize output appropriately. * * @param input input string. * @return result of regular expression replacement. diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/HighlightSuggestOracle.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/HighlightSuggestOracle.java index 525a837a7e..25cad1d3c6 100644 --- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/HighlightSuggestOracle.java +++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/HighlightSuggestOracle.java @@ -15,7 +15,6 @@ package com.google.gwtexpui.safehtml.client; import com.google.gwt.user.client.ui.SuggestOracle; - import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -24,13 +23,11 @@ import java.util.List; /** * A suggestion oracle that tries to highlight the matched text. - *

- * Suggestions supplied by the implementation of - * {@link #onRequestSuggestions(Request, Callback)} are modified to wrap all - * occurrences of the - * {@link com.google.gwt.user.client.ui.SuggestOracle.Request#getQuery()} - * substring in HTML {@code <strong>} tags, so they can be emphasized to - * the user. + * + *

Suggestions supplied by the implementation of {@link #onRequestSuggestions(Request, Callback)} + * are modified to wrap all occurrences of the {@link + * com.google.gwt.user.client.ui.SuggestOracle.Request#getQuery()} substring in HTML {@code + * <strong>} tags, so they can be emphasized to the user. */ public abstract class HighlightSuggestOracle extends SuggestOracle { private static String escape(String ds) { @@ -44,19 +41,20 @@ public abstract class HighlightSuggestOracle extends SuggestOracle { @Override public final void requestSuggestions(Request request, Callback cb) { - onRequestSuggestions(request, new Callback() { - @Override - public void onSuggestionsReady(final Request request, - final Response response) { - final String qpat = getQueryPattern(request.getQuery()); - final boolean html = isHTML(); - final ArrayList r = new ArrayList<>(); - for (final Suggestion s : response.getSuggestions()) { - r.add(new BoldSuggestion(qpat, s, html)); - } - cb.onSuggestionsReady(request, new Response(r)); - } - }); + onRequestSuggestions( + request, + new Callback() { + @Override + public void onSuggestionsReady(final Request request, final Response response) { + final String qpat = getQueryPattern(request.getQuery()); + final boolean html = isHTML(); + final ArrayList r = new ArrayList<>(); + for (final Suggestion s : response.getSuggestions()) { + r.add(new BoldSuggestion(qpat, s, html)); + } + cb.onSuggestionsReady(request, new Response(r)); + } + }); } protected String getQueryPattern(final String query) { @@ -64,10 +62,9 @@ public abstract class HighlightSuggestOracle extends SuggestOracle { } /** - * @return true if - * {@link com.google.gwt.user.client.ui.SuggestOracle.Suggestion#getDisplayString()} - * returns HTML; false if the text must be escaped before evaluating - * in an HTML like context. + * @return true if {@link + * com.google.gwt.user.client.ui.SuggestOracle.Suggestion#getDisplayString()} returns HTML; + * false if the text must be escaped before evaluating in an HTML like context. */ protected boolean isHTML() { return false; @@ -114,17 +111,19 @@ public abstract class HighlightSuggestOracle extends SuggestOracle { } /** - * Split the query by whitespace and filter out query terms which are - * substrings of other query terms. + * Split the query by whitespace and filter out query terms which are substrings of other query + * terms. */ private static List splitQuery(String query) { List queryTerms = Arrays.asList(query.split("\\s+")); - Collections.sort(queryTerms, new Comparator() { - @Override - public int compare(String s1, String s2) { - return Integer.compare(s2.length(), s1.length()); - } - }); + Collections.sort( + queryTerms, + new Comparator() { + @Override + public int compare(String s1, String s2) { + return Integer.compare(s2.length(), s1.length()); + } + }); List result = new ArrayList<>(); for (String s : queryTerms) { @@ -143,7 +142,7 @@ public abstract class HighlightSuggestOracle extends SuggestOracle { } private static native String sgi(String inString, String pat, String newHtml) - /*-{ return inString.replace(RegExp(pat, 'gi'), newHtml); }-*/; + /*-{ return inString.replace(RegExp(pat, 'gi'), newHtml); }-*/ ; @Override public String getDisplayString() { diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/LinkFindReplace.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/LinkFindReplace.java index 464cbe9def..cf0e51db7b 100644 --- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/LinkFindReplace.java +++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/LinkFindReplace.java @@ -18,14 +18,15 @@ import com.google.gwt.regexp.shared.RegExp; /** * A Find/Replace pair whose replacement string is a link. - *

- * It is safe to pass arbitrary user-provided links to this class. Links are - * sanitized as follows: + * + *

It is safe to pass arbitrary user-provided links to this class. Links are sanitized as + * follows: + * *

    - *
  • Only http(s) and mailto links are supported; any other scheme results in - * an {@link IllegalArgumentException} from {@link #replace(String)}. - *
  • Special characters in the link after regex replacement are escaped with - * {@link SafeHtmlBuilder}.
  • + *
  • Only http(s) and mailto links are supported; any other scheme results in an {@link + * IllegalArgumentException} from {@link #replace(String)}. + *
  • Special characters in the link after regex replacement are escaped with {@link + * SafeHtmlBuilder}. *
*/ public class LinkFindReplace implements FindReplace { @@ -43,13 +44,12 @@ public class LinkFindReplace implements FindReplace { private RegExp pat; private String link; - protected LinkFindReplace() { - } + protected LinkFindReplace() {} /** * @param find regular expression pattern to match substrings with. - * @param link replacement link href. Capture groups within - * {@code find} can be referenced with {@code $n}. + * @param link replacement link href. Capture groups within {@code find} can be referenced with + * {@code $n}. */ public LinkFindReplace(String find, String link) { this.pat = RegExp.compile(find); @@ -65,8 +65,7 @@ public class LinkFindReplace implements FindReplace { public String replace(String input) { String href = pat.replace(input, link); if (!hasValidScheme(href)) { - throw new IllegalArgumentException( - "Invalid scheme (" + toString() + "): " + href); + throw new IllegalArgumentException("Invalid scheme (" + toString() + "): " + href); } return new SafeHtmlBuilder() .openAnchor() diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/RawFindReplace.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/RawFindReplace.java index 96026ad421..dc39af6e3b 100644 --- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/RawFindReplace.java +++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/RawFindReplace.java @@ -18,20 +18,19 @@ import com.google.gwt.regexp.shared.RegExp; /** * A Find/Replace pair whose replacement string is arbitrary HTML. - *

- * WARNING: This class is not safe used with user-provided patterns. + * + *

WARNING: This class is not safe used with user-provided patterns. */ public class RawFindReplace implements FindReplace { private RegExp pat; private String replace; - protected RawFindReplace() { - } + protected RawFindReplace() {} /** * @param find regular expression pattern to match substrings with. - * @param replace replacement expression. Capture groups within - * {@code find} can be referenced with {@code $n}. + * @param replace replacement expression. Capture groups within {@code find} can be referenced + * with {@code $n}. */ public RawFindReplace(String find, String replace) { this.pat = RegExp.compile(find); diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/SafeHtml.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/SafeHtml.java index 10c2a784ac..51a5a0cf9c 100644 --- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/SafeHtml.java +++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/SafeHtml.java @@ -24,14 +24,12 @@ import com.google.gwt.user.client.ui.HTMLTable; import com.google.gwt.user.client.ui.HasHTML; import com.google.gwt.user.client.ui.InlineHTML; import com.google.gwt.user.client.ui.Widget; - import java.util.Iterator; import java.util.List; /** Immutable string safely placed as HTML without further escaping. */ @SuppressWarnings("serial") -public abstract class SafeHtml - implements com.google.gwt.safehtml.shared.SafeHtml { +public abstract class SafeHtml implements com.google.gwt.safehtml.shared.SafeHtml { public static final SafeHtmlResources RESOURCES; static { @@ -40,42 +38,43 @@ public abstract class SafeHtml RESOURCES.css().ensureInjected(); } else { - RESOURCES = new SafeHtmlResources() { - @Override - public SafeHtmlCss css() { - return new SafeHtmlCss() { + RESOURCES = + new SafeHtmlResources() { @Override - public String wikiList() { - return "wikiList"; - } + public SafeHtmlCss css() { + return new SafeHtmlCss() { + @Override + public String wikiList() { + return "wikiList"; + } - @Override - public String wikiPreFormat() { - return "wikiPreFormat"; - } + @Override + public String wikiPreFormat() { + return "wikiPreFormat"; + } - @Override - public String wikiQuote() { - return "wikiQuote"; - } + @Override + public String wikiQuote() { + return "wikiQuote"; + } - @Override - public boolean ensureInjected() { - return false; - } + @Override + public boolean ensureInjected() { + return false; + } - @Override - public String getName() { - return null; - } + @Override + public String getName() { + return null; + } - @Override - public String getText() { - return null; + @Override + public String getText() { + return null; + } + }; } }; - } - }; } } @@ -112,8 +111,8 @@ public abstract class SafeHtml } /** Set the inner HTML of a table cell. */ - public static T set(final T t, final int row, - final int col, final SafeHtml str) { + public static T set( + final T t, final int row, final int col, final SafeHtml str) { t.setHTML(row, col, str.asString()); return t; } @@ -127,25 +126,18 @@ public abstract class SafeHtml /** Convert bare http:// and https:// URLs into <a href> tags. */ public SafeHtml linkify() { - final String part = "(?:" + - "[a-zA-Z0-9$_+!*'%;:@=?#/~-]" + - "|&(?!lt;|gt;)" + - "|[.,](?!(?:\\s|$))" + - ")"; + final String part = + "(?:" + "[a-zA-Z0-9$_+!*'%;:@=?#/~-]" + "|&(?!lt;|gt;)" + "|[.,](?!(?:\\s|$))" + ")"; return replaceAll( - "(https?://" + - part + "{2,}" + - "(?:[(]" + part + "*" + "[)])*" + - part + "*" + - ")", + "(https?://" + part + "{2,}" + "(?:[(]" + part + "*" + "[)])*" + part + "*" + ")", "$1"); } /** * Apply {@link #linkify()}, and "\n\n" to <p>. - *

- * Lines that start with whitespace are assumed to be preformatted, and are - * formatted by the {@link SafeHtmlCss#wikiPreFormat()} CSS class. + * + *

Lines that start with whitespace are assumed to be preformatted, and are formatted by the + * {@link SafeHtmlCss#wikiPreFormat()} CSS class. */ public SafeHtml wikify() { final SafeHtmlBuilder r = new SafeHtmlBuilder(); @@ -242,25 +234,23 @@ public abstract class SafeHtml } private static boolean isPreFormat(final String p) { - return p.contains("\n ") || p.contains("\n\t") || p.startsWith(" ") - || p.startsWith("\t"); + return p.contains("\n ") || p.contains("\n\t") || p.startsWith(" ") || p.startsWith("\t"); } private static boolean isList(final String p) { - return p.contains("\n- ") || p.contains("\n* ") || p.startsWith("- ") - || p.startsWith("* "); + return p.contains("\n- ") || p.contains("\n* ") || p.startsWith("- ") || p.startsWith("* "); } /** * Replace first occurrence of {@code regex} with {@code repl} . - *

- * WARNING: This replacement is being performed against an otherwise - * safe HTML string. The caller must ensure that the replacement does not - * introduce cross-site scripting attack entry points. + * + *

WARNING: This replacement is being performed against an otherwise safe HTML string. + * The caller must ensure that the replacement does not introduce cross-site scripting attack + * entry points. * * @param regex regular expression pattern to match the substring with. - * @param repl replacement expression. Capture groups within - * {@code regex} can be referenced with {@code $n}. + * @param repl replacement expression. Capture groups within {@code regex} can be referenced with + * {@code $n}. * @return a new string, after the replacement has been made. */ public SafeHtml replaceFirst(final String regex, final String repl) { @@ -269,14 +259,14 @@ public abstract class SafeHtml /** * Replace each occurrence of {@code regex} with {@code repl} . - *

- * WARNING: This replacement is being performed against an otherwise - * safe HTML string. The caller must ensure that the replacement does not - * introduce cross-site scripting attack entry points. + * + *

WARNING: This replacement is being performed against an otherwise safe HTML string. + * The caller must ensure that the replacement does not introduce cross-site scripting attack + * entry points. * * @param regex regular expression pattern to match substrings with. - * @param repl replacement expression. Capture groups within - * {@code regex} can be referenced with {@code $n}. + * @param repl replacement expression. Capture groups within {@code regex} can be referenced with + * {@code $n}. * @return a new string, after the replacements have been made. */ public SafeHtml replaceAll(final String regex, final String repl) { diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/SafeHtmlBuilder.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/SafeHtmlBuilder.java index 0e7f7eb940..f54149b3ec 100644 --- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/SafeHtmlBuilder.java +++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/SafeHtmlBuilder.java @@ -16,9 +16,7 @@ package com.google.gwtexpui.safehtml.client; import com.google.gwt.core.client.GWT; -/** - * Safely constructs a {@link SafeHtml}, escaping user provided content. - */ +/** Safely constructs a {@link SafeHtml}, escaping user provided content. */ @SuppressWarnings("serial") public class SafeHtmlBuilder extends SafeHtml { private static final Impl impl; @@ -163,10 +161,9 @@ public class SafeHtmlBuilder extends SafeHtml { /** * Open an element, appending "{@code }" to the buffer. - *

- * After the element is open the attributes may be manipulated until the next - * {@code append}, {@code openElement}, {@code closeSelf} or - * {@code closeElement} call. + * + *

After the element is open the attributes may be manipulated until the next {@code append}, + * {@code openElement}, {@code closeSelf} or {@code closeElement} call. * * @param tagName name of the HTML element to open. */ @@ -187,9 +184,8 @@ public class SafeHtmlBuilder extends SafeHtml { * Get an attribute of the last opened element. * * @param name name of the attribute to read. - * @return the attribute value, as a string. The empty string if the attribute - * has not been assigned a value. The returned string is the raw - * (unescaped) value. + * @return the attribute value, as a string. The empty string if the attribute has not been + * assigned a value. The returned string is the raw (unescaped) value. */ public String getAttribute(final String name) { assert isAttributeName(name); @@ -201,8 +197,8 @@ public class SafeHtmlBuilder extends SafeHtml { * Set an attribute of the last opened element. * * @param name name of the attribute to set. - * @param value value to assign; any existing value is replaced. The value is - * escaped (if necessary) during the assignment. + * @param value value to assign; any existing value is replaced. The value is escaped (if + * necessary) during the assignment. */ public SafeHtmlBuilder setAttribute(final String name, final String value) { assert isAttributeName(name); @@ -223,10 +219,10 @@ public class SafeHtmlBuilder extends SafeHtml { /** * Append a new value into a whitespace delimited attribute. - *

- * If the attribute is not yet assigned, this method sets the attribute. If - * the attribute is already assigned, the new value is appended onto the end, - * after appending a single space to delimit the values. + * + *

If the attribute is not yet assigned, this method sets the attribute. If the attribute is + * already assigned, the new value is appended onto the end, after appending a single space to + * delimit the values. * * @param name name of the attribute to append onto. * @param value additional value to append. @@ -257,9 +253,8 @@ public class SafeHtmlBuilder extends SafeHtml { /** * Add an additional CSS class name to this element. - *

- * If no CSS class name has been specified yet, this method initializes it to - * the single name. + * + *

If no CSS class name has been specified yet, this method initializes it to the single name. */ public SafeHtmlBuilder addStyleName(final String style) { assert isCssName(style); @@ -419,8 +414,7 @@ public class SafeHtmlBuilder extends SafeHtml { b.cb.append(escape(in)); } - private static native String escape(String src) - /*-{ return src.replace(/&/g,'&') + private static native String escape(String src) /*-{ return src.replace(/&/g,'&') .replace(/>/g,'>') .replace(/ - * GWT compiled JavaScript and ImageBundles can be cached indefinitely by a - * browser and/or an edge proxy, as they never contain user-specific data and - * are named by a unique checksum. If their content is ever modified then the - * URL changes, so user agents would request a different resource. We force - * these resources to have very long expiration times. - *

- * To use, add the following block to your {@code web.xml}: + * + *

GWT compiled JavaScript and ImageBundles can be cached indefinitely by a browser and/or an + * edge proxy, as they never contain user-specific data and are named by a unique checksum. If their + * content is ever modified then the URL changes, so user agents would request a different resource. + * We force these resources to have very long expiration times. + * + *

To use, add the following block to your {@code web.xml}: * *

  * <filter>
@@ -50,16 +48,15 @@ import javax.servlet.http.HttpServletResponse;
  */
 public class CacheControlFilter implements Filter {
   @Override
-  public void init(final FilterConfig config) {
-  }
+  public void init(final FilterConfig config) {}
 
   @Override
-  public void destroy() {
-  }
+  public void destroy() {}
 
   @Override
-  public void doFilter(final ServletRequest sreq, final ServletResponse srsp,
-      final FilterChain chain) throws IOException, ServletException {
+  public void doFilter(
+      final ServletRequest sreq, final ServletResponse srsp, final FilterChain chain)
+      throws IOException, ServletException {
     final HttpServletRequest req = (HttpServletRequest) sreq;
     final HttpServletResponse rsp = (HttpServletResponse) srsp;
     final String pathInfo = pathInfo(req);
@@ -73,8 +70,7 @@ public class CacheControlFilter implements Filter {
     chain.doFilter(req, rsp);
   }
 
-  private static boolean cacheForever(final String pathInfo,
-      final HttpServletRequest req) {
+  private static boolean cacheForever(final String pathInfo, final HttpServletRequest req) {
     if (pathInfo.endsWith(".cache.html")
         || pathInfo.endsWith(".cache.gif")
         || pathInfo.endsWith(".cache.png")
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/server/CacheHeaders.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/server/CacheHeaders.java
index d94f24396e..0e5e425cfd 100644
--- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/server/CacheHeaders.java
+++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/server/CacheHeaders.java
@@ -18,7 +18,6 @@ import static java.util.concurrent.TimeUnit.DAYS;
 import static java.util.concurrent.TimeUnit.SECONDS;
 
 import java.util.concurrent.TimeUnit;
-
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
@@ -41,15 +40,14 @@ public class CacheHeaders {
 
   /**
    * Permit caching the response for up to the age specified.
-   * 

- * If the request is on a secure connection (e.g. SSL) private caching is - * used. This allows the user-agent to cache the response, but requests - * intermediate proxies to not cache. This may offer better protection for - * Set-Cookie headers. - *

- * If the request is on plaintext (insecure), public caching is used. This may - * allow an intermediate proxy to cache the response, including any Set-Cookie - * header that may have also been included. + * + *

If the request is on a secure connection (e.g. SSL) private caching is used. This allows the + * user-agent to cache the response, but requests intermediate proxies to not cache. This may + * offer better protection for Set-Cookie headers. + * + *

If the request is on plaintext (insecure), public caching is used. This may allow an + * intermediate proxy to cache the response, including any Set-Cookie header that may have also + * been included. * * @param req current request. * @param res response being returned. @@ -57,22 +55,20 @@ public class CacheHeaders { * @param unit time unit for age, usually {@link TimeUnit#SECONDS}. */ public static void setCacheable( - HttpServletRequest req, HttpServletResponse res, - long age, TimeUnit unit) { + HttpServletRequest req, HttpServletResponse res, long age, TimeUnit unit) { setCacheable(req, res, age, unit, false); } /** * Permit caching the response for up to the age specified. - *

- * If the request is on a secure connection (e.g. SSL) private caching is - * used. This allows the user-agent to cache the response, but requests - * intermediate proxies to not cache. This may offer better protection for - * Set-Cookie headers. - *

- * If the request is on plaintext (insecure), public caching is used. This may - * allow an intermediate proxy to cache the response, including any Set-Cookie - * header that may have also been included. + * + *

If the request is on a secure connection (e.g. SSL) private caching is used. This allows the + * user-agent to cache the response, but requests intermediate proxies to not cache. This may + * offer better protection for Set-Cookie headers. + * + *

If the request is on plaintext (insecure), public caching is used. This may allow an + * intermediate proxy to cache the response, including any Set-Cookie header that may have also + * been included. * * @param req current request. * @param res response being returned. @@ -81,8 +77,11 @@ public class CacheHeaders { * @param mustRevalidate true if the client must validate the cached entity. */ public static void setCacheable( - HttpServletRequest req, HttpServletResponse res, - long age, TimeUnit unit, boolean mustRevalidate) { + HttpServletRequest req, + HttpServletResponse res, + long age, + TimeUnit unit, + boolean mustRevalidate) { if (req.isSecure()) { setCacheablePrivate(res, age, unit, mustRevalidate); } else { @@ -92,18 +91,18 @@ public class CacheHeaders { /** * Allow the response to be cached by proxies and user-agents. - *

- * If the response includes a Set-Cookie header the cookie may be cached by a - * proxy and returned to multiple browsers behind the same proxy. This is - * insecure for authenticated connections. + * + *

If the response includes a Set-Cookie header the cookie may be cached by a proxy and + * returned to multiple browsers behind the same proxy. This is insecure for authenticated + * connections. * * @param res response being returned. * @param age how long the response can be cached. * @param unit time unit for age, usually {@link TimeUnit#SECONDS}. * @param mustRevalidate true if the client must validate the cached entity. */ - public static void setCacheablePublic(HttpServletResponse res, - long age, TimeUnit unit, boolean mustRevalidate) { + public static void setCacheablePublic( + HttpServletResponse res, long age, TimeUnit unit, boolean mustRevalidate) { long now = System.currentTimeMillis(); long sec = maxAgeSeconds(age, unit); @@ -120,8 +119,8 @@ public class CacheHeaders { * @param unit time unit for age, usually {@link TimeUnit#SECONDS}. * @param mustRevalidate true if the client must validate the cached entity. */ - public static void setCacheablePrivate(HttpServletResponse res, - long age, TimeUnit unit, boolean mustRevalidate) { + public static void setCacheablePrivate( + HttpServletResponse res, long age, TimeUnit unit, boolean mustRevalidate) { long now = System.currentTimeMillis(); res.setDateHeader("Expires", now); res.setDateHeader("Date", now); @@ -129,22 +128,21 @@ public class CacheHeaders { } public static boolean hasCacheHeader(HttpServletResponse res) { - return res.containsHeader("Cache-Control") - || res.containsHeader("Expires"); + return res.containsHeader("Cache-Control") || res.containsHeader("Expires"); } - private static void cache(HttpServletResponse res, - String type, long age, TimeUnit unit, boolean revalidate) { - res.setHeader("Cache-Control", String.format( - "%s, max-age=%d%s", - type, maxAgeSeconds(age, unit), - revalidate ? ", must-revalidate" : "")); + private static void cache( + HttpServletResponse res, String type, long age, TimeUnit unit, boolean revalidate) { + res.setHeader( + "Cache-Control", + String.format( + "%s, max-age=%d%s", + type, maxAgeSeconds(age, unit), revalidate ? ", must-revalidate" : "")); } private static long maxAgeSeconds(long age, TimeUnit unit) { return Math.min(unit.toSeconds(age), MAX_CACHE_DURATION); } - private CacheHeaders() { - } + private CacheHeaders() {} } diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/AutoCenterDialogBox.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/AutoCenterDialogBox.java index 54d8eca6f2..7c165e5946 100644 --- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/AutoCenterDialogBox.java +++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/AutoCenterDialogBox.java @@ -39,14 +39,16 @@ public class AutoCenterDialogBox extends DialogBox { @Override public void show() { if (recenter == null) { - recenter = Window.addResizeHandler(new ResizeHandler() { - @Override - public void onResize(final ResizeEvent event) { - final int w = event.getWidth(); - final int h = event.getHeight(); - AutoCenterDialogBox.this.onResize(w, h); - } - }); + recenter = + Window.addResizeHandler( + new ResizeHandler() { + @Override + public void onResize(final ResizeEvent event) { + final int w = event.getWidth(); + final int h = event.getHeight(); + AutoCenterDialogBox.this.onResize(w, h); + } + }); } super.show(); } @@ -62,9 +64,9 @@ public class AutoCenterDialogBox extends DialogBox { /** * Invoked when the outer browser window resizes. - *

- * Subclasses may override (but should ensure they still call super.onResize) - * to implement custom logic when a window resize occurs. + * + *

Subclasses may override (but should ensure they still call super.onResize) to implement + * custom logic when a window resize occurs. * * @param width new browser window width * @param height new browser window height diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/Tooltip.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/Tooltip.java index 7939697585..b5ce046f58 100644 --- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/Tooltip.java +++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/Tooltip.java @@ -62,7 +62,7 @@ public class Tooltip { * @param text message to display on hover. */ public static void setLabel(UIObject o, String text) { - setLabel(o.getElement(), text); + setLabel(o.getElement(), text); } /** @@ -75,6 +75,5 @@ public class Tooltip { e.setAttribute("aria-label", text != null ? text : ""); } - private Tooltip() { - } + private Tooltip() {} } diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/UserAgent.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/UserAgent.java index bbef44986d..1660a62c27 100644 --- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/UserAgent.java +++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/UserAgent.java @@ -19,12 +19,12 @@ import com.google.gwt.user.client.Window; /** * User agent feature tests we don't create permutations for. - *

- * Some features aren't worth creating full permutations in GWT for, as each new - * boolean permutation (only two settings) doubles the compile time required. If - * the setting only affects a couple of lines of JavaScript code, the slightly - * larger cache files for user agents that lack the functionality requested is - * trivial compared to the time developers lose building their application. + * + *

Some features aren't worth creating full permutations in GWT for, as each new boolean + * permutation (only two settings) doubles the compile time required. If the setting only affects a + * couple of lines of JavaScript code, the slightly larger cache files for user agents that lack the + * functionality requested is trivial compared to the time developers lose building their + * application. */ public class UserAgent { private static boolean jsClip = guessJavaScriptClipboard(); @@ -38,7 +38,7 @@ public class UserAgent { } private static native boolean nativeHasCopy() - /*-{ return $doc['queryCommandSupported'] && $doc.queryCommandSupported('copy') }-*/; + /*-{ return $doc['queryCommandSupported'] && $doc.queryCommandSupported('copy') }-*/ ; private static boolean guessJavaScriptClipboard() { String ua = Window.Navigator.getUserAgent(); @@ -93,9 +93,9 @@ public class UserAgent { /** * Does the browser have ShockwaveFlash plugin installed? - *

- * This method may still return true if the user has disabled Flash or set - * the plugin to "click to run". + * + *

This method may still return true if the user has disabled Flash or set the plugin to + * "click to run". */ public static boolean isInstalled() { if (!checked) { @@ -105,8 +105,7 @@ public class UserAgent { return installed; } - private static native boolean hasFlash() - /*-{ + private static native boolean hasFlash() /*-{ if (navigator.plugins && navigator.plugins.length) { if (navigator.plugins['Shockwave Flash']) return true; if (navigator.plugins['Shockwave Flash 2.0']) return true; @@ -126,18 +125,17 @@ public class UserAgent { /** * Test for and disallow running this application in an <iframe>. - *

- * If the application is running within an iframe this method requests a - * browser generated redirect to pop the application out of the iframe into - * the top level window, and then aborts execution by throwing an exception. - * This is call should be placed early within the module's onLoad() method, - * before any real UI can be initialized that an attacking site could try to - * snip out and present in a confusing context. - *

- * If the break out works, execution will restart automatically in a proper - * top level window, where the script has full control over the display. If - * the break out fails, execution will abort and stop immediately, preventing - * UI widgets from being created, leaving the user with an empty frame. + * + *

If the application is running within an iframe this method requests a browser generated + * redirect to pop the application out of the iframe into the top level window, and then aborts + * execution by throwing an exception. This is call should be placed early within the module's + * onLoad() method, before any real UI can be initialized that an attacking site could try to snip + * out and present in a confusing context. + * + *

If the break out works, execution will restart automatically in a proper top level window, + * where the script has full control over the display. If the break out fails, execution will + * abort and stop immediately, preventing UI widgets from being created, leaving the user with an + * empty frame. */ public static void assertNotInIFrame() { if (GWT.isScript() && amInsideIFrame()) { @@ -146,16 +144,13 @@ public class UserAgent { } } - private static native boolean amInsideIFrame() - /*-{ return top.location != $wnd.location; }-*/; + private static native boolean amInsideIFrame() /*-{ return top.location != $wnd.location; }-*/; - private static native void bustOutOfIFrame(String newloc) - /*-{ top.location.href = newloc }-*/; + private static native void bustOutOfIFrame(String newloc) /*-{ top.location.href = newloc }-*/; /** - * Test if Gerrit is running on a mobile browser. This check could be - * incomplete, but should cover most cases. Regexes shamelessly borrowed from - * CodeMirror. + * Test if Gerrit is running on a mobile browser. This check could be incomplete, but should cover + * most cases. Regexes shamelessly borrowed from CodeMirror. */ public static native boolean isMobile() /*-{ var ua = $wnd.navigator.userAgent; @@ -164,13 +159,10 @@ public class UserAgent { || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(ua); }-*/; - /** - * Check if the height of the browser view is greater than its width. - */ + /** Check if the height of the browser view is greater than its width. */ public static boolean isPortrait() { return Window.getClientHeight() > Window.getClientWidth(); } - private UserAgent() { - } + private UserAgent() {} } diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/View.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/View.java index f826fd0eca..b15d2fd997 100644 --- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/View.java +++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/View.java @@ -19,13 +19,11 @@ import com.google.gwt.user.client.ui.Widget; /** * Widget to display within a {@link ViewSite}. - *

- * Implementations must override {@code protected void onLoad()} and - * arrange for {@link #display()} to be invoked once the DOM within the view is - * consistent for presentation to the user. Typically this means that the - * subclass can start RPCs within {@code onLoad()} and then invoke - * {@code display()} from within the AsyncCallback's - * {@code onSuccess(Object)} method. + * + *

Implementations must override {@code protected void onLoad()} and arrange for {@link + * #display()} to be invoked once the DOM within the view is consistent for presentation to the + * user. Typically this means that the subclass can start RPCs within {@code onLoad()} and then + * invoke {@code display()} from within the AsyncCallback's {@code onSuccess(Object)} method. */ public abstract class View extends Composite { ViewSite site; diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/ViewSite.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/ViewSite.java index 629b6b345f..ca712c38c3 100644 --- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/ViewSite.java +++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/ViewSite.java @@ -20,13 +20,12 @@ import com.google.gwt.user.client.ui.SimplePanel; /** * Hosts a single {@link View}. - *

- * View instances are attached inside of an invisible DOM node, permitting their - * {@code onLoad()} method to be invoked and to update the DOM prior to the - * elements being made visible in the UI. - *

- * Complaint View instances must invoke {@link View#display()} once the DOM is - * ready for presentation. + * + *

View instances are attached inside of an invisible DOM node, permitting their {@code onLoad()} + * method to be invoked and to update the DOM prior to the elements being made visible in the UI. + * + *

Complaint View instances must invoke {@link View#display()} once the DOM is ready for + * presentation. */ public class ViewSite extends Composite { private final FlowPanel main; @@ -46,10 +45,9 @@ public class ViewSite extends Composite { /** * Set the next view to display. - *

- * The view will be attached to the DOM tree within a hidden container, - * permitting its {@code onLoad()} method to execute and update the DOM - * without the user seeing the result. + * + *

The view will be attached to the DOM tree within a hidden container, permitting its {@code + * onLoad()} method to execute and update the DOM without the user seeing the result. * * @param view the next view to display. */ @@ -69,8 +67,7 @@ public class ViewSite extends Composite { * * @param view the view being displayed. */ - protected void onShowView(final V view) { - } + protected void onShowView(final V view) {} @SuppressWarnings("unchecked") final void swap(final View v) { diff --git a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/LinkFindReplaceTest.java b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/LinkFindReplaceTest.java index 964a7d5877..a77c5b4fed 100644 --- a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/LinkFindReplaceTest.java +++ b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/LinkFindReplaceTest.java @@ -21,8 +21,7 @@ import org.junit.Test; import org.junit.rules.ExpectedException; public class LinkFindReplaceTest { - @Rule - public ExpectedException exception = ExpectedException.none(); + @Rule public ExpectedException exception = ExpectedException.none(); @Test public void noEscaping() { @@ -36,10 +35,8 @@ public class LinkFindReplaceTest { @Test public void backreference() { - LinkFindReplace l = new LinkFindReplace( - "(bug|issue)\\s*([0-9]+)", "/bug?id=$2"); - assertThat(l.replace("issue 123")) - .isEqualTo("issue 123"); + LinkFindReplace l = new LinkFindReplace("(bug|issue)\\s*([0-9]+)", "/bug?id=$2"); + assertThat(l.replace("issue 123")).isEqualTo("issue 123"); } @Test @@ -64,14 +61,13 @@ public class LinkFindReplaceTest { @Test public void invalidSchemeWithBackreference() { exception.expect(IllegalArgumentException.class); - new LinkFindReplace(".*(script:[^;]*)", "java$1") - .replace("Look at this script: alert(1);"); + new LinkFindReplace(".*(script:[^;]*)", "java$1").replace("Look at this script: alert(1);"); } @Test public void replaceEscaping() { assertThat(new LinkFindReplace("find", "a\"&'<>b").replace("find")) - .isEqualTo("find"); + .isEqualTo("find"); } @Test @@ -79,7 +75,6 @@ public class LinkFindReplaceTest { String rawFind = ""bold""; LinkFindReplace a = new LinkFindReplace(rawFind, "/bold"); assertThat(a.pattern().getSource()).isEqualTo(rawFind); - assertThat(a.replace(rawFind)) - .isEqualTo("" + rawFind + ""); + assertThat(a.replace(rawFind)).isEqualTo("" + rawFind + ""); } } diff --git a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtmlBuilderTest.java b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtmlBuilderTest.java index ff34a3fae2..17b0a4d7f3 100644 --- a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtmlBuilderTest.java +++ b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtmlBuilderTest.java @@ -21,8 +21,7 @@ import org.junit.Test; import org.junit.rules.ExpectedException; public class SafeHtmlBuilderTest { - @Rule - public ExpectedException exception = ExpectedException.none(); + @Rule public ExpectedException exception = ExpectedException.none(); @Test public void empty() { @@ -130,12 +129,15 @@ public class SafeHtmlBuilderTest { final SafeHtmlBuilder b = new SafeHtmlBuilder(); assertThat(b).isSameAs(b.append((Object) null)); assertThat(b.asString()).isEmpty(); - assertThat(b).isSameAs(b.append(new Object() { - @Override - public String toString() { - return "foobar"; - } - })); + assertThat(b) + .isSameAs( + b.append( + new Object() { + @Override + public String toString() { + return "foobar"; + } + })); assertThat(b.asString()).isEqualTo("foobar"); } diff --git a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_LinkifyTest.java b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_LinkifyTest.java index 9d310c6ec8..b42878beed 100644 --- a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_LinkifyTest.java +++ b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_LinkifyTest.java @@ -24,9 +24,10 @@ public class SafeHtml_LinkifyTest { final SafeHtml o = html("A http://go.here/ B"); final SafeHtml n = o.linkify(); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - "A http://go.here/ B"); + assertThat(n.asString()) + .isEqualTo( + "A http://go.here/ B"); } @Test @@ -34,9 +35,10 @@ public class SafeHtml_LinkifyTest { final SafeHtml o = html("A https://go.here/ B"); final SafeHtml n = o.linkify(); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - "A https://go.here/ B"); + assertThat(n.asString()) + .isEqualTo( + "A https://go.here/ B"); } @Test @@ -44,9 +46,10 @@ public class SafeHtml_LinkifyTest { final SafeHtml o = html("A (http://go.here/) B"); final SafeHtml n = o.linkify(); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - "A (http://go.here/) B"); + assertThat(n.asString()) + .isEqualTo( + "A (http://go.here/) B"); } @Test @@ -54,9 +57,10 @@ public class SafeHtml_LinkifyTest { final SafeHtml o = html("A http://go.here/#m() B"); final SafeHtml n = o.linkify(); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - "A http://go.here/#m() B"); + assertThat(n.asString()) + .isEqualTo( + "A http://go.here/#m() B"); } @Test @@ -64,9 +68,10 @@ public class SafeHtml_LinkifyTest { final SafeHtml o = html("A B"); final SafeHtml n = o.linkify(); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - "A <http://go.here/> B"); + assertThat(n.asString()) + .isEqualTo( + "A <http://go.here/> B"); } @Test @@ -74,9 +79,10 @@ public class SafeHtml_LinkifyTest { final SafeHtml o = html("A http://go.here/foo B"); final SafeHtml n = o.linkify(); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - "A http://go.here/foo B"); + assertThat(n.asString()) + .isEqualTo( + "A http://go.here/foo B"); } @Test @@ -84,9 +90,10 @@ public class SafeHtml_LinkifyTest { final SafeHtml o = html("A http://go.here/. B"); final SafeHtml n = o.linkify(); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - "A http://go.here/. B"); + assertThat(n.asString()) + .isEqualTo( + "A http://go.here/. B"); } @Test @@ -94,9 +101,10 @@ public class SafeHtml_LinkifyTest { final SafeHtml o = html("A http://go.here/, B"); final SafeHtml n = o.linkify(); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - "A http://go.here/, B"); + assertThat(n.asString()) + .isEqualTo( + "A http://go.here/, B"); } @Test @@ -104,9 +112,10 @@ public class SafeHtml_LinkifyTest { final SafeHtml o = html("A http://go.here/.. B"); final SafeHtml n = o.linkify(); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - "A http://go.here/.. B"); + assertThat(n.asString()) + .isEqualTo( + "A http://go.here/.. B"); } private static SafeHtml html(String text) { diff --git a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_ReplaceTest.java b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_ReplaceTest.java index 65a13a7755..19e707ae75 100644 --- a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_ReplaceTest.java +++ b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_ReplaceTest.java @@ -16,67 +16,63 @@ package com.google.gwtexpui.safehtml.client; import static com.google.common.truth.Truth.assertThat; -import org.junit.Test; - import java.util.Arrays; import java.util.Collections; import java.util.List; +import org.junit.Test; public class SafeHtml_ReplaceTest { @Test public void replaceEmpty() { SafeHtml o = html("A\nissue42\nB"); assertThat(o.replaceAll(null)).isSameAs(o); - assertThat(o.replaceAll(Collections. emptyList())).isSameAs(o); + assertThat(o.replaceAll(Collections.emptyList())).isSameAs(o); } @Test public void replaceOneLink() { SafeHtml o = html("A\nissue 42\nB"); - SafeHtml n = o.replaceAll(repls( - new RawFindReplace("(issue\\s(\\d+))", "$1"))); + SafeHtml n = + o.replaceAll(repls(new RawFindReplace("(issue\\s(\\d+))", "$1"))); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - "A\nissue 42\nB"); + assertThat(n.asString()).isEqualTo("A\nissue 42\nB"); } @Test public void replaceNoLeadingOrTrailingText() { SafeHtml o = html("issue 42"); - SafeHtml n = o.replaceAll(repls( - new RawFindReplace("(issue\\s(\\d+))", "$1"))); + SafeHtml n = + o.replaceAll(repls(new RawFindReplace("(issue\\s(\\d+))", "$1"))); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - "issue 42"); + assertThat(n.asString()).isEqualTo("issue 42"); } @Test public void replaceTwoLinks() { SafeHtml o = html("A\nissue 42\nissue 9918\nB"); - SafeHtml n = o.replaceAll(repls( - new RawFindReplace("(issue\\s(\\d+))", "$1"))); + SafeHtml n = + o.replaceAll(repls(new RawFindReplace("(issue\\s(\\d+))", "$1"))); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - "A\n" - + "issue 42\n" - + "issue 9918\n" - + "B"); + assertThat(n.asString()) + .isEqualTo( + "A\n" + "issue 42\n" + "issue 9918\n" + "B"); } @Test public void replaceInOrder() { SafeHtml o = html("A\nissue 42\nReally GWTEXPUI-9918 is better\nB"); - SafeHtml n = o.replaceAll(repls( - new RawFindReplace("(GWTEXPUI-(\\d+))", - "$1"), - new RawFindReplace("(issue\\s+(\\d+))", - "$1"))); + SafeHtml n = + o.replaceAll( + repls( + new RawFindReplace("(GWTEXPUI-(\\d+))", "$1"), + new RawFindReplace("(issue\\s+(\\d+))", "$1"))); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - "A\n" - + "issue 42\n" - + "Really GWTEXPUI-9918 is better\n" - + "B"); + assertThat(n.asString()) + .isEqualTo( + "A\n" + + "issue 42\n" + + "Really GWTEXPUI-9918 is better\n" + + "B"); } @Test diff --git a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyListTest.java b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyListTest.java index eb7d038464..d69b36cacf 100644 --- a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyListTest.java +++ b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyListTest.java @@ -31,12 +31,8 @@ public class SafeHtml_WikifyListTest { final SafeHtml o = html("A\n\n* line 1\n* 2nd line"); final SafeHtml n = o.wikify(); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - "

A

" - + BEGIN_LIST - + item("line 1") - + item("2nd line") - + END_LIST); + assertThat(n.asString()) + .isEqualTo("

A

" + BEGIN_LIST + item("line 1") + item("2nd line") + END_LIST); } @Test @@ -44,13 +40,9 @@ public class SafeHtml_WikifyListTest { final SafeHtml o = html("A\n\n* line 1\n* 2nd line\n\nB"); final SafeHtml n = o.wikify(); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - "

A

" - + BEGIN_LIST - + item("line 1") - + item("2nd line") - + END_LIST - + "

B

"); + assertThat(n.asString()) + .isEqualTo( + "

A

" + BEGIN_LIST + item("line 1") + item("2nd line") + END_LIST + "

B

"); } @Test @@ -58,43 +50,45 @@ public class SafeHtml_WikifyListTest { final SafeHtml o = html("* line 1\n* 2nd line\n\nB"); final SafeHtml n = o.wikify(); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - BEGIN_LIST - + item("line 1") - + item("2nd line") - + END_LIST - + "

B

"); + assertThat(n.asString()) + .isEqualTo(BEGIN_LIST + item("line 1") + item("2nd line") + END_LIST + "

B

"); } @Test public void bulletList4() { - final SafeHtml o = html("To see this bug, you have to:\n" // - + "* Be on IMAP or EAS (not on POP)\n"// - + "* Be very unlucky\n"); + final SafeHtml o = + html( + "To see this bug, you have to:\n" // + + "* Be on IMAP or EAS (not on POP)\n" // + + "* Be very unlucky\n"); final SafeHtml n = o.wikify(); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - "

To see this bug, you have to:

" - + BEGIN_LIST - + item("Be on IMAP or EAS (not on POP)") - + item("Be very unlucky") - + END_LIST); + assertThat(n.asString()) + .isEqualTo( + "

To see this bug, you have to:

" + + BEGIN_LIST + + item("Be on IMAP or EAS (not on POP)") + + item("Be very unlucky") + + END_LIST); } @Test public void bulletList5() { - final SafeHtml o = html("To see this bug,\n" // - + "you have to:\n" // - + "* Be on IMAP or EAS (not on POP)\n"// - + "* Be very unlucky\n"); + final SafeHtml o = + html( + "To see this bug,\n" // + + "you have to:\n" // + + "* Be on IMAP or EAS (not on POP)\n" // + + "* Be very unlucky\n"); final SafeHtml n = o.wikify(); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - "

To see this bug, you have to:

" - + BEGIN_LIST - + item("Be on IMAP or EAS (not on POP)") - + item("Be very unlucky") - + END_LIST); + assertThat(n.asString()) + .isEqualTo( + "

To see this bug, you have to:

" + + BEGIN_LIST + + item("Be on IMAP or EAS (not on POP)") + + item("Be very unlucky") + + END_LIST); } @Test @@ -102,12 +96,8 @@ public class SafeHtml_WikifyListTest { final SafeHtml o = html("A\n\n- line 1\n- 2nd line"); final SafeHtml n = o.wikify(); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - "

A

" - + BEGIN_LIST - + item("line 1") - + item("2nd line") - + END_LIST); + assertThat(n.asString()) + .isEqualTo("

A

" + BEGIN_LIST + item("line 1") + item("2nd line") + END_LIST); } @Test @@ -115,13 +105,9 @@ public class SafeHtml_WikifyListTest { final SafeHtml o = html("A\n\n- line 1\n- 2nd line\n\nB"); final SafeHtml n = o.wikify(); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - "

A

" - + BEGIN_LIST - + item("line 1") - + item("2nd line") - + END_LIST - + "

B

"); + assertThat(n.asString()) + .isEqualTo( + "

A

" + BEGIN_LIST + item("line 1") + item("2nd line") + END_LIST + "

B

"); } @Test @@ -129,12 +115,8 @@ public class SafeHtml_WikifyListTest { final SafeHtml o = html("- line 1\n- 2nd line\n\nB"); final SafeHtml n = o.wikify(); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - BEGIN_LIST - + item("line 1") - + item("2nd line") - + END_LIST - + "

B

"); + assertThat(n.asString()) + .isEqualTo(BEGIN_LIST + item("line 1") + item("2nd line") + END_LIST + "

B

"); } private static SafeHtml html(String text) { diff --git a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyPreformatTest.java b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyPreformatTest.java index 897cf40270..2544c68800 100644 --- a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyPreformatTest.java +++ b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyPreformatTest.java @@ -31,12 +31,8 @@ public class SafeHtml_WikifyPreformatTest { final SafeHtml o = html("A\n\n This is pre\n formatted"); final SafeHtml n = o.wikify(); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - "

A

" - + "

" - + pre(" This is pre") - + pre(" formatted") - + "

"); + assertThat(n.asString()) + .isEqualTo("

A

" + "

" + pre(" This is pre") + pre(" formatted") + "

"); } @Test @@ -44,13 +40,14 @@ public class SafeHtml_WikifyPreformatTest { final SafeHtml o = html("A\n\n This is pre\n formatted\n\nbut this is not"); final SafeHtml n = o.wikify(); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - "

A

" - + "

" - + pre(" This is pre") - + pre(" formatted") - + "

" - + "

but this is not

"); + assertThat(n.asString()) + .isEqualTo( + "

A

" + + "

" + + pre(" This is pre") + + pre(" formatted") + + "

" + + "

but this is not

"); } @Test @@ -58,14 +55,15 @@ public class SafeHtml_WikifyPreformatTest { final SafeHtml o = html("A\n\n Q\n \n S\n\nB"); final SafeHtml n = o.wikify(); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - "

A

" - + "

" - + pre(" Q") - + pre(" <R>") - + pre(" S") - + "

" - + "

B

"); + assertThat(n.asString()) + .isEqualTo( + "

A

" + + "

" + + pre(" Q") + + pre(" <R>") + + pre(" S") + + "

" + + "

B

"); } @Test @@ -73,13 +71,8 @@ public class SafeHtml_WikifyPreformatTest { final SafeHtml o = html(" Q\n \n S\n\nB"); final SafeHtml n = o.wikify(); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - "

" - + pre(" Q") - + pre(" <R>") - + pre(" S") - + "

" - + "

B

"); + assertThat(n.asString()) + .isEqualTo("

" + pre(" Q") + pre(" <R>") + pre(" S") + "

" + "

B

"); } private static SafeHtml html(String text) { diff --git a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyQuoteTest.java b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyQuoteTest.java index d0c3ad2b0b..20084475bd 100644 --- a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyQuoteTest.java +++ b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyQuoteTest.java @@ -31,9 +31,7 @@ public class SafeHtml_WikifyQuoteTest { final SafeHtml o = html("> I'm happy\n > with quotes!\n\nSee above."); final SafeHtml n = o.wikify(); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - quote("I'm happy\nwith quotes!") - + "

See above.

"); + assertThat(n.asString()).isEqualTo(quote("I'm happy\nwith quotes!") + "

See above.

"); } @Test @@ -41,10 +39,8 @@ public class SafeHtml_WikifyQuoteTest { final SafeHtml o = html("See this said:\n\n > a quoted\n > string block\n\nOK?"); final SafeHtml n = o.wikify(); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - "

See this said:

" - + quote("a quoted\nstring block") - + "

OK?

"); + assertThat(n.asString()) + .isEqualTo("

See this said:

" + quote("a quoted\nstring block") + "

OK?

"); } @Test diff --git a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyTest.java b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyTest.java index c8341f45aa..166af97ffc 100644 --- a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyTest.java +++ b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyTest.java @@ -64,9 +64,10 @@ public class SafeHtml_WikifyTest { final SafeHtml o = html("A http://go.here/ B"); final SafeHtml n = o.wikify(); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - "

A http://go.here/ B

"); + assertThat(n.asString()) + .isEqualTo( + "

A http://go.here/ B

"); } @Test @@ -74,9 +75,10 @@ public class SafeHtml_WikifyTest { final SafeHtml o = html("A https://go.here/ B"); final SafeHtml n = o.wikify(); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - "

A https://go.here/ B

"); + assertThat(n.asString()) + .isEqualTo( + "

A https://go.here/ B

"); } @Test @@ -84,9 +86,10 @@ public class SafeHtml_WikifyTest { final SafeHtml o = html("A (http://go.here/) B"); final SafeHtml n = o.wikify(); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - "

A (http://go.here/) B

"); + assertThat(n.asString()) + .isEqualTo( + "

A (http://go.here/) B

"); } @Test @@ -94,9 +97,10 @@ public class SafeHtml_WikifyTest { final SafeHtml o = html("A http://go.here/#m() B"); final SafeHtml n = o.wikify(); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - "

A http://go.here/#m() B

"); + assertThat(n.asString()) + .isEqualTo( + "

A http://go.here/#m() B

"); } @Test @@ -104,9 +108,10 @@ public class SafeHtml_WikifyTest { final SafeHtml o = html("A B"); final SafeHtml n = o.wikify(); assertThat(o).isNotSameAs(n); - assertThat(n.asString()).isEqualTo( - "

A <http://go.here/> B

"); + assertThat(n.asString()) + .isEqualTo( + "

A <http://go.here/> B

"); } private static SafeHtml html(String text) { diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/AccountFormatter.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/AccountFormatter.java index 1b41f621c2..3058971b3a 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/AccountFormatter.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/AccountFormatter.java @@ -25,13 +25,14 @@ public class AccountFormatter { /** * Formats an account as a name and an email address. - *

- * Example output: + * + *

Example output: + * *

    - *
  • {@code A U. Thor <author@example.com>}: full populated
  • - *
  • {@code A U. Thor (12)}: missing email address
  • - *
  • {@code Anonymous Coward <author@example.com>}: missing name
  • - *
  • {@code Anonymous Coward (12)}: missing name and email address
  • + *
  • {@code A U. Thor <author@example.com>}: full populated + *
  • {@code A U. Thor (12)}: missing email address + *
  • {@code Anonymous Coward <author@example.com>}: missing name + *
  • {@code Anonymous Coward (12)}: missing name and email address *
*/ public String nameEmail(AccountInfo info) { @@ -51,9 +52,9 @@ public class AccountFormatter { /** * Formats an account name. - *

- * If the account has a full name, it returns only the full name. Otherwise it - * returns a longer form that includes the email address. + * + *

If the account has a full name, it returns only the full name. Otherwise it returns a longer + * form that includes the email address. */ public String name(AccountInfo ai) { if (ai.name() != null && !ai.name().trim().isEmpty()) { diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/CommonConstants.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/CommonConstants.java index 5d0b93fe78..e769730a0f 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/CommonConstants.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/CommonConstants.java @@ -21,16 +21,26 @@ public interface CommonConstants extends Constants { CommonConstants C = GWT.create(CommonConstants.class); String inTheFuture(); + String month(); + String months(); + String year(); + String years(); String oneSecondAgo(); + String oneMinuteAgo(); + String oneHourAgo(); + String oneDayAgo(); + String oneWeekAgo(); + String oneMonthAgo(); + String oneYearAgo(); } diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/CommonMessages.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/CommonMessages.java index 5a5b4a37f6..5314254e9d 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/CommonMessages.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/CommonMessages.java @@ -21,13 +21,20 @@ public interface CommonMessages extends Messages { CommonMessages M = GWT.create(CommonMessages.class); String secondsAgo(long seconds); + String minutesAgo(long minutes); + String hoursAgo(long hours); + String daysAgo(long days); + String weeksAgo(long weeks); + String monthsAgo(long months); + String yearsAgo(long years); + String years0MonthsAgo(long years, String yearLabel); - String yearsMonthsAgo(long years, String yearLabel, long months, - String monthLabel); + + String yearsMonthsAgo(long years, String yearLabel, long months, String monthLabel); } diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/DateFormatter.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/DateFormatter.java index b3577378d8..32f79d7f09 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/DateFormatter.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/DateFormatter.java @@ -16,7 +16,6 @@ package com.google.gerrit.client; import com.google.gerrit.client.info.GeneralPreferences; import com.google.gwt.i18n.client.DateTimeFormat; - import java.util.Date; public class DateFormatter { diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/GerritUiExtensionPoint.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/GerritUiExtensionPoint.java index eb1071849e..66a3b6b294 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/GerritUiExtensionPoint.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/GerritUiExtensionPoint.java @@ -34,9 +34,13 @@ public enum GerritUiExtensionPoint { PROFILE_SCREEN_BOTTOM, /* ProjectInfoScreen */ - PROJECT_INFO_SCREEN_TOP, PROJECT_INFO_SCREEN_BOTTOM; + PROJECT_INFO_SCREEN_TOP, + PROJECT_INFO_SCREEN_BOTTOM; public enum Key { - ACCOUNT_INFO, CHANGE_INFO, PROJECT_NAME, REVISION_INFO + ACCOUNT_INFO, + CHANGE_INFO, + PROJECT_NAME, + REVISION_INFO } } diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/RelativeDateFormatter.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/RelativeDateFormatter.java index 2165db2f45..3045180307 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/RelativeDateFormatter.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/RelativeDateFormatter.java @@ -20,8 +20,8 @@ import static com.google.gerrit.client.CommonMessages.M; import java.util.Date; /** - * Formatter to format timestamps relative to the current time using time units - * in the format defined by {@code git log --relative-date}. + * Formatter to format timestamps relative to the current time using time units in the format + * defined by {@code git log --relative-date}. */ public class RelativeDateFormatter { static final long SECOND_IN_MILLIS = 1000; @@ -34,8 +34,8 @@ public class RelativeDateFormatter { /** * @param when {@link Date} to format - * @return age of given {@link Date} compared to now formatted in the same - * relative format as returned by {@code git log --relative-date} + * @return age of given {@link Date} compared to now formatted in the same relative format as + * returned by {@code git log --relative-date} */ @SuppressWarnings("boxing") public static String format(Date when) { diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/Resources.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/Resources.java index c8e23e5546..67627c3d98 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/Resources.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/Resources.java @@ -18,9 +18,7 @@ import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.ImageResource; public interface Resources extends ClientBundle { - /** - * silk icons (CC-BY3.0): http://famfamfam.com/lab/icons/silk/ - */ + /** silk icons (CC-BY3.0): http://famfamfam.com/lab/icons/silk/ */ @Source("note_add.png") ImageResource addFileComment(); @@ -98,10 +96,7 @@ public interface Resources extends ClientBundle { @Source("help.png") ImageResource question(); - /** - * tango icon library (public domain): - * http://tango.freedesktop.org/Tango_Icon_Library - */ + /** tango icon library (public domain): http://tango.freedesktop.org/Tango_Icon_Library */ @Source("goNext.png") ImageResource goNext(); @@ -118,18 +113,14 @@ public interface Resources extends ClientBundle { @Source("merge.png") ImageResource merge(); - /** - * contributed by the artist under Apache2.0 - */ + /** contributed by the artist under Apache2.0 */ @Source("sideBySideDiff.png") ImageResource sideBySideDiff(); @Source("unifiedDiff.png") ImageResource unifiedDiff(); - /** - * contributed by the artist under CC-BY3.0 - */ + /** contributed by the artist under CC-BY3.0 */ @Source("diffy26.png") ImageResource gerritAvatar26(); } diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AccountInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AccountInfo.java index 76797992c5..dc372855ea 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AccountInfo.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AccountInfo.java @@ -19,7 +19,6 @@ import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArray; import com.google.gwt.core.client.JsArrayString; import com.google.gwtjsonrpc.client.impl.ser.JavaSqlTimestamp_JsonSerializer; - import java.sql.Timestamp; public class AccountInfo extends JavaScriptObject { @@ -28,10 +27,13 @@ public class AccountInfo extends JavaScriptObject { } public final native int _accountId() /*-{ return this._account_id || 0; }-*/; + public final native String name() /*-{ return this.name; }-*/; + public final native String email() /*-{ return this.email; }-*/; - public final native JsArrayString secondaryEmails() - /*-{ return this.secondary_emails; }-*/; + + public final native JsArrayString secondaryEmails() /*-{ return this.secondary_emails; }-*/; + public final native String username() /*-{ return this.username; }-*/; public final Timestamp registeredOn() { @@ -44,17 +46,17 @@ public class AccountInfo extends JavaScriptObject { } private native String registeredOnRaw() /*-{ return this.registered_on; }-*/; + private native Timestamp _getRegisteredOn() /*-{ return this._cts; }-*/; + private native void _setRegisteredOn(Timestamp ts) /*-{ this._cts = ts; }-*/; /** - * @return true if the server supplied avatar information about this account. - * The information may be an empty list, indicating no avatars are - * available, such as when no plugin is installed. This method returns - * false if the server did not check on avatars for the account. + * @return true if the server supplied avatar information about this account. The information may + * be an empty list, indicating no avatars are available, such as when no plugin is installed. + * This method returns false if the server did not check on avatars for the account. */ - public final native boolean hasAvatarInfo() - /*-{ return this.hasOwnProperty('avatars') }-*/; + public final native boolean hasAvatarInfo() /*-{ return this.hasOwnProperty('avatars') }-*/; public final AvatarInfo avatar(int sz) { JsArray a = avatars(); @@ -67,29 +69,30 @@ public class AccountInfo extends JavaScriptObject { return null; } - private native JsArray avatars() - /*-{ return this.avatars }-*/; + private native JsArray avatars() /*-{ return this.avatars }-*/; public final native void name(String n) /*-{ this.name = n }-*/; + public final native void email(String e) /*-{ this.email = e }-*/; + public final native void username(String n) /*-{ this.username = n }-*/; - public static native AccountInfo create(int id, String name, - String email, String username) /*-{ + public static native AccountInfo create(int id, String name, String email, String username) /*-{ return {'_account_id': id, 'name': name, 'email': email, 'username': username}; }-*/; - protected AccountInfo() { - } + protected AccountInfo() {} public static class AvatarInfo extends JavaScriptObject { public static final int DEFAULT_SIZE = 26; + public final native String url() /*-{ return this.url }-*/; + public final native int height() /*-{ return this.height || 0 }-*/; + public final native int width() /*-{ return this.width || 0 }-*/; - protected AvatarInfo() { - } + protected AvatarInfo() {} } } diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/ActionInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/ActionInfo.java index 3b283ec78d..d09d5b7d6e 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/ActionInfo.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/ActionInfo.java @@ -19,11 +19,14 @@ import com.google.gwt.core.client.JavaScriptObject; public class ActionInfo extends JavaScriptObject { public final native String id() /*-{ return this.id; }-*/; + public final native String method() /*-{ return this.method; }-*/; + public final native String label() /*-{ return this.label; }-*/; + public final native String title() /*-{ return this.title; }-*/; + public final native boolean enabled() /*-{ return this.enabled || false; }-*/; - protected ActionInfo() { - } + protected ActionInfo() {} } diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AgreementInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AgreementInfo.java index 5fb2f4892d..04fba4f2a5 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AgreementInfo.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AgreementInfo.java @@ -18,10 +18,12 @@ import com.google.gwt.core.client.JavaScriptObject; public class AgreementInfo extends JavaScriptObject { public final native String name() /*-{ return this.name; }-*/; + public final native String description() /*-{ return this.description; }-*/; + public final native String url() /*-{ return this.url; }-*/; + public final native GroupInfo autoVerifyGroup() /*-{ return this.auto_verify_group; }-*/; - protected AgreementInfo() { - } + protected AgreementInfo() {} } diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AuthInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AuthInfo.java index ca3912cbf7..9ae74aca81 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AuthInfo.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AuthInfo.java @@ -21,7 +21,6 @@ import com.google.gerrit.extensions.client.GitBasicAuthPolicy; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArray; import com.google.gwt.core.client.JsArrayString; - import java.util.ArrayList; import java.util.List; @@ -33,6 +32,7 @@ public class AuthInfo extends JavaScriptObject { public final boolean isLdap() { return authType() == AuthType.LDAP || authType() == AuthType.LDAP_BIND; } + public final boolean isOpenId() { return authType() == AuthType.OPENID; } @@ -74,9 +74,7 @@ public class AuthInfo extends JavaScriptObject { } public final boolean siteHasUsernames() { - if (isCustomExtension() - && httpPasswordUrl() != null - && !canEdit(AccountFieldName.USER_NAME)) { + if (isCustomExtension() && httpPasswordUrl() != null && !canEdit(AccountFieldName.USER_NAME)) { return false; } return true; @@ -94,23 +92,33 @@ public class AuthInfo extends JavaScriptObject { } public final native boolean useContributorAgreements() - /*-{ return this.use_contributor_agreements || false; }-*/; - public final native String loginUrl() /*-{ return this.login_url; }-*/; - public final native String loginText() /*-{ return this.login_text; }-*/; - public final native String switchAccountUrl() /*-{ return this.switch_account_url; }-*/; - public final native String registerUrl() /*-{ return this.register_url; }-*/; - public final native String registerText() /*-{ return this.register_text; }-*/; - public final native String editFullNameUrl() /*-{ return this.edit_full_name_url; }-*/; - public final native String httpPasswordUrl() /*-{ return this.http_password_url; }-*/; - public final native boolean isGitBasicAuth() /*-{ return this.is_git_basic_auth || false; }-*/; - private native String gitBasicAuthPolicyRaw() - /*-{ return this.git_basic_auth_policy; }-*/; - private native String authTypeRaw() /*-{ return this.auth_type; }-*/; - private native JsArrayString _editableAccountFields() - /*-{ return this.editable_account_fields; }-*/; - private native JsArray _contributorAgreements() - /*-{ return this.contributor_agreements; }-*/; + /*-{ return this.use_contributor_agreements || false; }-*/ ; - protected AuthInfo() { - } + public final native String loginUrl() /*-{ return this.login_url; }-*/; + + public final native String loginText() /*-{ return this.login_text; }-*/; + + public final native String switchAccountUrl() /*-{ return this.switch_account_url; }-*/; + + public final native String registerUrl() /*-{ return this.register_url; }-*/; + + public final native String registerText() /*-{ return this.register_text; }-*/; + + public final native String editFullNameUrl() /*-{ return this.edit_full_name_url; }-*/; + + public final native String httpPasswordUrl() /*-{ return this.http_password_url; }-*/; + + public final native boolean isGitBasicAuth() /*-{ return this.is_git_basic_auth || false; }-*/; + + private native String gitBasicAuthPolicyRaw() /*-{ return this.git_basic_auth_policy; }-*/; + + private native String authTypeRaw() /*-{ return this.auth_type; }-*/; + + private native JsArrayString _editableAccountFields() + /*-{ return this.editable_account_fields; }-*/ ; + + private native JsArray _contributorAgreements() + /*-{ return this.contributor_agreements; }-*/ ; + + protected AuthInfo() {} } diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/ChangeInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/ChangeInfo.java index 054bfdd33e..0de8b6835c 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/ChangeInfo.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/ChangeInfo.java @@ -28,7 +28,6 @@ import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArray; import com.google.gwt.core.client.JsArrayString; import com.google.gwtjsonrpc.client.impl.ser.JavaSqlTimestamp_JsonSerializer; - import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collections; @@ -72,6 +71,7 @@ public class ChangeInfo extends JavaScriptObject { } private native Timestamp _getCts() /*-{ return this._cts; }-*/; + private native void _setCts(Timestamp ts) /*-{ this._cts = ts; }-*/; public final Timestamp updated() { @@ -105,46 +105,75 @@ public class ChangeInfo extends JavaScriptObject { } public final native String id() /*-{ return this.id; }-*/; + public final native String project() /*-{ return this.project; }-*/; + public final native String branch() /*-{ return this.branch; }-*/; + public final native String topic() /*-{ return this.topic; }-*/; + public final native String changeId() /*-{ return this.change_id; }-*/; + public final native boolean mergeable() /*-{ return this.mergeable ? true : false; }-*/; + public final native int insertions() /*-{ return this.insertions; }-*/; + public final native int deletions() /*-{ return this.deletions; }-*/; + private native String statusRaw() /*-{ return this.status; }-*/; + public final native String subject() /*-{ return this.subject; }-*/; + public final native AccountInfo owner() /*-{ return this.owner; }-*/; + public final native AccountInfo assignee() /*-{ return this.assignee; }-*/; + private native String createdRaw() /*-{ return this.created; }-*/; + private native String updatedRaw() /*-{ return this.updated; }-*/; + private native String submittedRaw() /*-{ return this.submitted; }-*/; + public final native boolean starred() /*-{ return this.starred ? true : false; }-*/; + public final native boolean reviewed() /*-{ return this.reviewed ? true : false; }-*/; + public final native NativeMap allLabels() /*-{ return this.labels; }-*/; + public final native LabelInfo label(String n) /*-{ return this.labels[n]; }-*/; + public final native String currentRevision() /*-{ return this.current_revision; }-*/; + public final native void setCurrentRevision(String r) /*-{ this.current_revision = r; }-*/; + public final native NativeMap revisions() /*-{ return this.revisions; }-*/; + public final native RevisionInfo revision(String n) /*-{ return this.revisions[n]; }-*/; + public final native JsArray messages() /*-{ return this.messages; }-*/; + public final native void setEdit(EditInfo edit) /*-{ this.edit = edit; }-*/; + public final native EditInfo edit() /*-{ return this.edit; }-*/; + public final native boolean hasEdit() /*-{ return this.hasOwnProperty('edit') }-*/; + public final native JsArrayString hashtags() /*-{ return this.hashtags; }-*/; public final native boolean hasPermittedLabels() - /*-{ return this.hasOwnProperty('permitted_labels') }-*/; + /*-{ return this.hasOwnProperty('permitted_labels') }-*/ ; + public final native NativeMap permittedLabels() - /*-{ return this.permitted_labels; }-*/; + /*-{ return this.permitted_labels; }-*/ ; + public final native JsArrayString permittedValues(String n) - /*-{ return this.permitted_labels[n]; }-*/; + /*-{ return this.permitted_labels[n]; }-*/ ; public final native JsArray removableReviewers() - /*-{ return this.removable_reviewers; }-*/; + /*-{ return this.removable_reviewers; }-*/ ; + + private native NativeMap> _reviewers() /*-{ return this.reviewers; }-*/; - private native NativeMap> _reviewers() - /*-{ return this.reviewers; }-*/; public final Map> reviewers() { NativeMap> reviewers = _reviewers(); Map> result = new HashMap<>(); @@ -161,11 +190,12 @@ public class ChangeInfo extends JavaScriptObject { } public final native boolean hasActions() /*-{ return this.hasOwnProperty('actions') }-*/; + public final native NativeMap actions() /*-{ return this.actions; }-*/; public final native int _number() /*-{ return this._number; }-*/; - public final native boolean _more_changes() - /*-{ return this._more_changes ? true : false; }-*/; + + public final native boolean _more_changes() /*-{ return this._more_changes ? true : false; }-*/; public final SubmitType submitType() { String submitType = _submitType(); @@ -174,6 +204,7 @@ public class ChangeInfo extends JavaScriptObject { } return SubmitType.valueOf(submitType); } + private native String _submitType() /*-{ return this.submit_type; }-*/; public final boolean submittable() { @@ -181,12 +212,11 @@ public class ChangeInfo extends JavaScriptObject { return _submittable(); } - private native boolean _submittable() - /*-{ return this.submittable ? true : false; }-*/; + private native boolean _submittable() /*-{ return this.submittable ? true : false; }-*/; /** - * @return the index of the missing label or -1 - * if no label is missing, or if more than one label is missing. + * @return the index of the missing label or -1 if no label is missing, or if more than one label + * is missing. */ public final int getMissingLabelIndex() { int i = -1; @@ -225,8 +255,7 @@ public class ChangeInfo extends JavaScriptObject { return ret; } - protected ChangeInfo() { - } + protected ChangeInfo() {} public static class LabelInfo extends JavaScriptObject { public final SubmitRecord.Label.Status status() { @@ -242,13 +271,17 @@ public class ChangeInfo extends JavaScriptObject { } public final native String name() /*-{ return this._name; }-*/; + public final native AccountInfo approved() /*-{ return this.approved; }-*/; + public final native AccountInfo rejected() /*-{ return this.rejected; }-*/; public final native AccountInfo recommended() /*-{ return this.recommended; }-*/; + public final native AccountInfo disliked() /*-{ return this.disliked; }-*/; public final native JsArray all() /*-{ return this.all; }-*/; + public final ApprovalInfo forUser(int user) { JsArray all = all(); for (int i = 0; all != null && i < all.length(); i++) { @@ -260,16 +293,20 @@ public class ChangeInfo extends JavaScriptObject { } private native NativeMap _values() /*-{ return this.values; }-*/; + public final Set values() { return Natives.keys(_values()); } + public final native String valueText(String n) /*-{ return this.values[n]; }-*/; public final native boolean optional() /*-{ return this.optional ? true : false; }-*/; + public final native boolean blocking() /*-{ return this.blocking ? true : false; }-*/; + public final native short defaultValue() /*-{ return this.default_value; }-*/; - public final native short _value() - /*-{ + + public final native short _value() /*-{ if (this.value) return this.value; if (this.disliked) return -1; if (this.recommended) return 1; @@ -297,45 +334,50 @@ public class ChangeInfo extends JavaScriptObject { return Short.parseShort(formatted); } - protected LabelInfo() { - } + protected LabelInfo() {} } public static class ApprovalInfo extends AccountInfo { public final native boolean hasValue() /*-{ return this.hasOwnProperty('value'); }-*/; + public final native short value() /*-{ return this.value || 0; }-*/; - public final native VotingRangeInfo permittedVotingRange() /*-{ return this.permitted_voting_range; }-*/; + public final native VotingRangeInfo + permittedVotingRange() /*-{ return this.permitted_voting_range; }-*/; - protected ApprovalInfo() { - } + protected ApprovalInfo() {} } public static class VotingRangeInfo extends AccountInfo { public final native short min() /*-{ return this.min || 0; }-*/; + public final native short max() /*-{ return this.max || 0; }-*/; - protected VotingRangeInfo() { - } + protected VotingRangeInfo() {} } public static class EditInfo extends JavaScriptObject { public final native String name() /*-{ return this.name; }-*/; + public final native String setName(String n) /*-{ this.name = n; }-*/; + public final native String baseRevision() /*-{ return this.base_revision; }-*/; + public final native CommitInfo commit() /*-{ return this.commit; }-*/; public final native boolean hasActions() /*-{ return this.hasOwnProperty('actions') }-*/; + public final native NativeMap actions() /*-{ return this.actions; }-*/; public final native boolean hasFetch() /*-{ return this.hasOwnProperty('fetch') }-*/; + public final native NativeMap fetch() /*-{ return this.fetch; }-*/; public final native boolean hasFiles() /*-{ return this.hasOwnProperty('files') }-*/; + public final native NativeMap files() /*-{ return this.files; }-*/; - protected EditInfo() { - } + protected EditInfo() {} } public static class RevisionInfo extends JavaScriptObject { @@ -344,55 +386,74 @@ public class ChangeInfo extends JavaScriptObject { revisionInfo.takeFromEdit(edit); return revisionInfo; } + public static RevisionInfo forParent(int number, CommitInfo commit) { RevisionInfo revisionInfo = createObject().cast(); revisionInfo.takeFromParent(number, commit); return revisionInfo; } + private native void takeFromEdit(EditInfo edit) /*-{ this._number = 0; this.name = edit.name; this.commit = edit.commit; this.edit_base = edit.base_revision; }-*/; + private native void takeFromParent(int number, CommitInfo commit) /*-{ this._number = number; this.commit = commit; this.name = this._number; }-*/; + public final native int _number() /*-{ return this._number; }-*/; + public final native String name() /*-{ return this.name; }-*/; + public final native boolean draft() /*-{ return this.draft || false; }-*/; + public final native AccountInfo uploader() /*-{ return this.uploader; }-*/; + public final native boolean isEdit() /*-{ return this._number == 0; }-*/; + public final native CommitInfo commit() /*-{ return this.commit; }-*/; + public final native void setCommit(CommitInfo c) /*-{ this.commit = c; }-*/; + public final native String editBase() /*-{ return this.edit_base; }-*/; public final native boolean hasFiles() /*-{ return this.hasOwnProperty('files') }-*/; + public final native NativeMap files() /*-{ return this.files; }-*/; public final native boolean hasActions() /*-{ return this.hasOwnProperty('actions') }-*/; + public final native NativeMap actions() /*-{ return this.actions; }-*/; public final native boolean hasFetch() /*-{ return this.hasOwnProperty('fetch') }-*/; + public final native NativeMap fetch() /*-{ return this.fetch; }-*/; - public final native boolean hasPushCertificate() /*-{ return this.hasOwnProperty('push_certificate'); }-*/; - public final native PushCertificateInfo pushCertificate() /*-{ return this.push_certificate; }-*/; + public final native boolean + hasPushCertificate() /*-{ return this.hasOwnProperty('push_certificate'); }-*/; + + public final native PushCertificateInfo + pushCertificate() /*-{ return this.push_certificate; }-*/; public static void sortRevisionInfoByNumber(JsArray list) { final int editParent = findEditParent(list); - Collections.sort(Natives.asList(list), new Comparator() { - @Override - public int compare(RevisionInfo a, RevisionInfo b) { - return num(a) - num(b); - } + Collections.sort( + Natives.asList(list), + new Comparator() { + @Override + public int compare(RevisionInfo a, RevisionInfo b) { + return num(a) - num(b); + } - private int num(RevisionInfo r) { - return !r.isEdit() ? 2 * (r._number() - 1) + 1 : 2 * editParent; - } - }); + private int num(RevisionInfo r) { + return !r.isEdit() ? 2 * (r._number() - 1) + 1 : 2 * editParent; + } + }); } public static int findEditParent(JsArray list) { @@ -400,8 +461,7 @@ public class ChangeInfo extends JavaScriptObject { return r == null ? -1 : r._number(); } - public static RevisionInfo findEditParentRevision( - JsArray list) { + public static RevisionInfo findEditParentRevision(JsArray list) { for (int i = 0; i < list.length(); i++) { // edit under revisions? RevisionInfo editInfo = list.get(i); @@ -429,67 +489,77 @@ public class ChangeInfo extends JavaScriptObject { return commit().parents().length() > 1; } - protected RevisionInfo () { - } + protected RevisionInfo() {} } public static class FetchInfo extends JavaScriptObject { public final native String url() /*-{ return this.url }-*/; + public final native String ref() /*-{ return this.ref }-*/; + public final native NativeMap commands() /*-{ return this.commands }-*/; + public final native String command(String n) /*-{ return this.commands[n]; }-*/; - protected FetchInfo () { - } + protected FetchInfo() {} } public static class CommitInfo extends JavaScriptObject { public final native String commit() /*-{ return this.commit; }-*/; + public final native JsArray parents() /*-{ return this.parents; }-*/; + public final native GitPerson author() /*-{ return this.author; }-*/; + public final native GitPerson committer() /*-{ return this.committer; }-*/; + public final native String subject() /*-{ return this.subject; }-*/; + public final native String message() /*-{ return this.message; }-*/; + public final native JsArray webLinks() /*-{ return this.web_links; }-*/; - protected CommitInfo() { - } + protected CommitInfo() {} } public static class GitPerson extends JavaScriptObject { public final native String name() /*-{ return this.name; }-*/; + public final native String email() /*-{ return this.email; }-*/; + private native String dateRaw() /*-{ return this.date; }-*/; public final Timestamp date() { return JavaSqlTimestamp_JsonSerializer.parseTimestamp(dateRaw()); } - protected GitPerson() { - } + protected GitPerson() {} } public static class MessageInfo extends JavaScriptObject { public final native AccountInfo author() /*-{ return this.author; }-*/; + public final native String message() /*-{ return this.message; }-*/; + public final native int _revisionNumber() /*-{ return this._revision_number || 0; }-*/; + public final native String tag() /*-{ return this.tag; }-*/; + private native String dateRaw() /*-{ return this.date; }-*/; public final Timestamp date() { return JavaSqlTimestamp_JsonSerializer.parseTimestamp(dateRaw()); } - protected MessageInfo() { - } + protected MessageInfo() {} } public static class MergeableInfo extends JavaScriptObject { public final native String submitType() /*-{ return this.submit_type }-*/; + public final native boolean mergeable() /*-{ return this.mergeable }-*/; - protected MergeableInfo() { - } + protected MergeableInfo() {} } public static class IncludedInInfo extends JavaScriptObject { @@ -498,11 +568,13 @@ public class ChangeInfo extends JavaScriptObject { } public final native JsArrayString branches() /*-{ return this.branches; }-*/; + public final native JsArrayString tags() /*-{ return this.tags; }-*/; + public final native JsArrayString external(String n) /*-{ return this.external[n]; }-*/; + private native NativeMap external() /*-{ return this.external; }-*/; - protected IncludedInInfo() { - } + protected IncludedInInfo() {} } } diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/DownloadInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/DownloadInfo.java index 183e6af6ff..8d56a1cf05 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/DownloadInfo.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/DownloadInfo.java @@ -19,7 +19,6 @@ import com.google.gerrit.client.rpc.NativeString; import com.google.gerrit.client.rpc.Natives; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArrayString; - import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -39,11 +38,12 @@ public class DownloadInfo extends JavaScriptObject { } public final native DownloadSchemeInfo scheme(String n) /*-{ return this.schemes[n]; }-*/; + private native NativeMap _schemes() /*-{ return this.schemes; }-*/; + private native JsArrayString _archives() /*-{ return this.archives; }-*/; - protected DownloadInfo() { - } + protected DownloadInfo() {} public static class DownloadSchemeInfo extends JavaScriptObject { public final List commandNames() { @@ -53,8 +53,7 @@ public class DownloadInfo extends JavaScriptObject { public final Set commands(String project) { Set commands = new HashSet<>(); for (String commandName : commandNames()) { - commands.add(new DownloadCommandInfo(commandName, command(commandName, - project))); + commands.add(new DownloadCommandInfo(commandName, command(commandName, project))); } return commands; } @@ -75,14 +74,14 @@ public class DownloadInfo extends JavaScriptObject { List commandNames = cloneCommandNames(); List commands = new ArrayList<>(commandNames.size()); for (String commandName : commandNames) { - commands.add(new DownloadCommandInfo(commandName, cloneCommand( - commandName, project))); + commands.add(new DownloadCommandInfo(commandName, cloneCommand(commandName, project))); } return commands; } public final String cloneCommand(String commandName, String project) { - return cloneCommand(commandName).replaceAll("\\$\\{project\\}", project) + return cloneCommand(commandName) + .replaceAll("\\$\\{project\\}", project) .replaceAll("\\$\\{project-base-name\\}", projectBaseName(project)); } @@ -91,16 +90,22 @@ public class DownloadInfo extends JavaScriptObject { } public final native String name() /*-{ return this.name; }-*/; + public final native String url() /*-{ return this.url; }-*/; + public final native boolean isAuthRequired() /*-{ return this.is_auth_required || false; }-*/; + public final native boolean isAuthSupported() /*-{ return this.is_auth_supported || false; }-*/; + public final native String command(String n) /*-{ return this.commands[n]; }-*/; + public final native String cloneCommand(String n) /*-{ return this.clone_commands[n]; }-*/; + private native NativeMap _commands() /*-{ return this.commands; }-*/; + private native NativeMap _cloneCommands() /*-{ return this.clone_commands; }-*/; - protected DownloadSchemeInfo() { - } + protected DownloadSchemeInfo() {} } public static class DownloadCommandInfo { diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/FileInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/FileInfo.java index e557470584..345a260cee 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/FileInfo.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/FileInfo.java @@ -19,37 +19,44 @@ import com.google.gerrit.common.data.FilenameComparator; import com.google.gerrit.reviewdb.client.Patch; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArray; - import java.util.Collections; import java.util.Comparator; public class FileInfo extends JavaScriptObject { public final native String path() /*-{ return this.path; }-*/; + public final native String oldPath() /*-{ return this.old_path; }-*/; + public final native int linesInserted() /*-{ return this.lines_inserted || 0; }-*/; + public final native int linesDeleted() /*-{ return this.lines_deleted || 0; }-*/; + public final native boolean binary() /*-{ return this.binary || false; }-*/; + public final native String status() /*-{ return this.status; }-*/; // JSNI methods cannot have 'long' as a parameter type or a return type and // it's suggested to use double in this case: // http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html#important public final long size() { - return (long)_size(); + return (long) _size(); } + private native double _size() /*-{ return this.size || 0; }-*/; public final long sizeDelta() { - return (long)_sizeDelta(); + return (long) _sizeDelta(); } + private native double _sizeDelta() /*-{ return this.size_delta || 0; }-*/; public final native int _row() /*-{ return this._row }-*/; + public final native void _row(int r) /*-{ this._row = r }-*/; public static void sortFileInfoByPath(JsArray list) { - Collections.sort(Natives.asList(list), - Comparator.comparing(FileInfo::path, FilenameComparator.INSTANCE)); + Collections.sort( + Natives.asList(list), Comparator.comparing(FileInfo::path, FilenameComparator.INSTANCE)); } public static String getFileName(String path) { @@ -66,6 +73,5 @@ public class FileInfo extends JavaScriptObject { return s >= 0 ? fileName.substring(s + 1) : fileName; } - protected FileInfo() { - } + protected FileInfo() {} } diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GeneralPreferences.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GeneralPreferences.java index 9c751ed031..6f91440eb5 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GeneralPreferences.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GeneralPreferences.java @@ -27,7 +27,6 @@ import com.google.gerrit.extensions.client.GeneralPreferencesInfo.ReviewCategory import com.google.gerrit.extensions.client.GeneralPreferencesInfo.TimeFormat; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArray; - import java.util.HashMap; import java.util.List; import java.util.Map; @@ -38,8 +37,7 @@ public class GeneralPreferences extends JavaScriptObject { } public static GeneralPreferences createDefault() { - GeneralPreferencesInfo d = - GeneralPreferencesInfo.defaults(); + GeneralPreferencesInfo d = GeneralPreferencesInfo.defaults(); GeneralPreferences p = createObject().cast(); p.changesPerPage(d.changesPerPage); p.showSiteHeader(d.showSiteHeader); @@ -62,167 +60,154 @@ public class GeneralPreferences extends JavaScriptObject { } public final int changesPerPage() { - int changesPerPage = - get("changes_per_page", GeneralPreferencesInfo.DEFAULT_PAGESIZE); - return 0 < changesPerPage - ? changesPerPage - : GeneralPreferencesInfo.DEFAULT_PAGESIZE; + int changesPerPage = get("changes_per_page", GeneralPreferencesInfo.DEFAULT_PAGESIZE); + return 0 < changesPerPage ? changesPerPage : GeneralPreferencesInfo.DEFAULT_PAGESIZE; } - private native short get(String n, int d) - /*-{ return this.hasOwnProperty(n) ? this[n] : d }-*/; - public final native boolean showSiteHeader() - /*-{ return this.show_site_header || false }-*/; + private native short get(String n, int d) /*-{ return this.hasOwnProperty(n) ? this[n] : d }-*/; + + public final native boolean showSiteHeader() /*-{ return this.show_site_header || false }-*/; public final native boolean useFlashClipboard() - /*-{ return this.use_flash_clipboard || false }-*/; + /*-{ return this.use_flash_clipboard || false }-*/ ; - public final native String downloadScheme() - /*-{ return this.download_scheme }-*/; + public final native String downloadScheme() /*-{ return this.download_scheme }-*/; public final DownloadCommand downloadCommand() { String s = downloadCommandRaw(); return s != null ? DownloadCommand.valueOf(s) : null; } - private native String downloadCommandRaw() - /*-{ return this.download_command }-*/; + + private native String downloadCommandRaw() /*-{ return this.download_command }-*/; public final DateFormat dateFormat() { String s = dateFormatRaw(); return s != null ? DateFormat.valueOf(s) : null; } - private native String dateFormatRaw() - /*-{ return this.date_format }-*/; + + private native String dateFormatRaw() /*-{ return this.date_format }-*/; public final TimeFormat timeFormat() { String s = timeFormatRaw(); return s != null ? TimeFormat.valueOf(s) : null; } - private native String timeFormatRaw() - /*-{ return this.time_format }-*/; + + private native String timeFormatRaw() /*-{ return this.time_format }-*/; public final native boolean highlightAssigneeInChangeTable() - /*-{ return this.highlight_assignee_in_change_table || false }-*/; + /*-{ return this.highlight_assignee_in_change_table || false }-*/ ; public final native boolean relativeDateInChangeTable() - /*-{ return this.relative_date_in_change_table || false }-*/; + /*-{ return this.relative_date_in_change_table || false }-*/ ; public final native boolean sizeBarInChangeTable() - /*-{ return this.size_bar_in_change_table || false }-*/; + /*-{ return this.size_bar_in_change_table || false }-*/ ; public final native boolean legacycidInChangeTable() - /*-{ return this.legacycid_in_change_table || false }-*/; + /*-{ return this.legacycid_in_change_table || false }-*/ ; public final native boolean muteCommonPathPrefixes() - /*-{ return this.mute_common_path_prefixes || false }-*/; + /*-{ return this.mute_common_path_prefixes || false }-*/ ; - public final native boolean signedOffBy() - /*-{ return this.signed_off_by || false }-*/; + public final native boolean signedOffBy() /*-{ return this.signed_off_by || false }-*/; public final ReviewCategoryStrategy reviewCategoryStrategy() { String s = reviewCategeoryStrategyRaw(); return s != null ? ReviewCategoryStrategy.valueOf(s) : ReviewCategoryStrategy.NONE; } - private native String reviewCategeoryStrategyRaw() - /*-{ return this.review_category_strategy }-*/; + + private native String reviewCategeoryStrategyRaw() /*-{ return this.review_category_strategy }-*/; public final DiffView diffView() { String s = diffViewRaw(); return s != null ? DiffView.valueOf(s) : null; } - private native String diffViewRaw() - /*-{ return this.diff_view }-*/; + + private native String diffViewRaw() /*-{ return this.diff_view }-*/; public final EmailStrategy emailStrategy() { String s = emailStrategyRaw(); return s != null ? EmailStrategy.valueOf(s) : null; } - private native String emailStrategyRaw() - /*-{ return this.email_strategy }-*/; + private native String emailStrategyRaw() /*-{ return this.email_strategy }-*/; public final DefaultBase defaultBaseForMerges() { String s = defaultBaseForMergesRaw(); return s != null ? DefaultBase.valueOf(s) : null; } - private native String defaultBaseForMergesRaw() - /*-{ return this.default_base_for_merges }-*/; + private native String defaultBaseForMergesRaw() /*-{ return this.default_base_for_merges }-*/; - public final native JsArray my() - /*-{ return this.my; }-*/; + public final native JsArray my() /*-{ return this.my; }-*/; - public final native void changesPerPage(int n) - /*-{ this.changes_per_page = n }-*/; + public final native void changesPerPage(int n) /*-{ this.changes_per_page = n }-*/; - public final native void showSiteHeader(boolean s) - /*-{ this.show_site_header = s }-*/; + public final native void showSiteHeader(boolean s) /*-{ this.show_site_header = s }-*/; - public final native void useFlashClipboard(boolean u) - /*-{ this.use_flash_clipboard = u }-*/; + public final native void useFlashClipboard(boolean u) /*-{ this.use_flash_clipboard = u }-*/; - public final native void downloadScheme(String d) - /*-{ this.download_scheme = d }-*/; + public final native void downloadScheme(String d) /*-{ this.download_scheme = d }-*/; public final void downloadCommand(DownloadCommand d) { downloadCommandRaw(d != null ? d.toString() : null); } - public final native void downloadCommandRaw(String d) - /*-{ this.download_command = d }-*/; + + public final native void downloadCommandRaw(String d) /*-{ this.download_command = d }-*/; public final void dateFormat(DateFormat f) { dateFormatRaw(f != null ? f.toString() : null); } - private native void dateFormatRaw(String f) - /*-{ this.date_format = f }-*/; + + private native void dateFormatRaw(String f) /*-{ this.date_format = f }-*/; public final void timeFormat(TimeFormat f) { timeFormatRaw(f != null ? f.toString() : null); } - private native void timeFormatRaw(String f) - /*-{ this.time_format = f }-*/; + + private native void timeFormatRaw(String f) /*-{ this.time_format = f }-*/; public final native void highlightAssigneeInChangeTable(boolean d) - /*-{ this.highlight_assignee_in_change_table = d }-*/; + /*-{ this.highlight_assignee_in_change_table = d }-*/ ; public final native void relativeDateInChangeTable(boolean d) - /*-{ this.relative_date_in_change_table = d }-*/; + /*-{ this.relative_date_in_change_table = d }-*/ ; public final native void sizeBarInChangeTable(boolean s) - /*-{ this.size_bar_in_change_table = s }-*/; + /*-{ this.size_bar_in_change_table = s }-*/ ; public final native void legacycidInChangeTable(boolean s) - /*-{ this.legacycid_in_change_table = s }-*/; + /*-{ this.legacycid_in_change_table = s }-*/ ; public final native void muteCommonPathPrefixes(boolean s) - /*-{ this.mute_common_path_prefixes = s }-*/; + /*-{ this.mute_common_path_prefixes = s }-*/ ; - public final native void signedOffBy(boolean s) - /*-{ this.signed_off_by = s }-*/; + public final native void signedOffBy(boolean s) /*-{ this.signed_off_by = s }-*/; public final void reviewCategoryStrategy(ReviewCategoryStrategy s) { reviewCategoryStrategyRaw(s != null ? s.toString() : null); } + private native void reviewCategoryStrategyRaw(String s) - /*-{ this.review_category_strategy = s }-*/; + /*-{ this.review_category_strategy = s }-*/ ; public final void diffView(DiffView d) { diffViewRaw(d != null ? d.toString() : null); } - private native void diffViewRaw(String d) - /*-{ this.diff_view = d }-*/; + + private native void diffViewRaw(String d) /*-{ this.diff_view = d }-*/; public final void emailStrategy(EmailStrategy s) { emailStrategyRaw(s != null ? s.toString() : null); } - private native void emailStrategyRaw(String s) - /*-{ this.email_strategy = s }-*/; + + private native void emailStrategyRaw(String s) /*-{ this.email_strategy = s }-*/; public final void defaultBaseForMerges(DefaultBase b) { defaultBaseForMergesRaw(b != null ? b.toString() : null); } - private native void defaultBaseForMergesRaw(String b) - /*-{ this.default_base_for_merges = b }-*/; + + private native void defaultBaseForMergesRaw(String b) /*-{ this.default_base_for_merges = b }-*/; public final void setMyMenus(List myMenus) { initMy(); @@ -230,7 +215,9 @@ public class GeneralPreferences extends JavaScriptObject { addMy(n); } } + final native void initMy() /*-{ this.my = []; }-*/; + final native void addMy(TopMenuItem m) /*-{ this.my.push(m); }-*/; public final Map urlAliases() { @@ -242,6 +229,7 @@ public class GeneralPreferences extends JavaScriptObject { } private native String urlAliasToken(String m) /*-{ return this.url_aliases[m]; }-*/; + private native NativeMap _urlAliases() /*-{ return this.url_aliases; }-*/; public final void setUrlAliases(Map urlAliases) { @@ -250,9 +238,10 @@ public class GeneralPreferences extends JavaScriptObject { putUrlAlias(e.getKey(), e.getValue()); } } + private native void putUrlAlias(String m, String t) /*-{ this.url_aliases[m] = t; }-*/; + private native void initUrlAliases() /*-{ this.url_aliases = {}; }-*/; - protected GeneralPreferences() { - } + protected GeneralPreferences() {} } diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GerritInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GerritInfo.java index a111896178..78ca417a4b 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GerritInfo.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GerritInfo.java @@ -18,7 +18,6 @@ import com.google.gerrit.extensions.client.UiType; import com.google.gerrit.reviewdb.client.Project; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArrayString; - import java.util.ArrayList; import java.util.List; @@ -40,14 +39,21 @@ public class GerritInfo extends JavaScriptObject { } public final native String allProjects() /*-{ return this.all_projects; }-*/; + public final native String allUsers() /*-{ return this.all_users; }-*/; + public final native boolean docSearch() /*-{ return this.doc_search; }-*/; + public final native String docUrl() /*-{ return this.doc_url; }-*/; + public final native boolean editGpgKeys() /*-{ return this.edit_gpg_keys || false; }-*/; + public final native String reportBugUrl() /*-{ return this.report_bug_url; }-*/; + public final native String reportBugText() /*-{ return this.report_bug_text; }-*/; private native JsArrayString _webUis() /*-{ return this.web_uis; }-*/; + public final List webUis() { JsArrayString webUis = _webUis(); List result = new ArrayList<>(webUis.length()); @@ -60,6 +66,5 @@ public class GerritInfo extends JavaScriptObject { return result; } - protected GerritInfo() { - } + protected GerritInfo() {} } diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GpgKeyInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GpgKeyInfo.java index 7955347871..fd4fde70f4 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GpgKeyInfo.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GpgKeyInfo.java @@ -19,15 +19,21 @@ import com.google.gwt.core.client.JsArrayString; public class GpgKeyInfo extends JavaScriptObject { public enum Status { - BAD, OK, TRUSTED; + BAD, + OK, + TRUSTED; } public final native String id() /*-{ return this.id; }-*/; + public final native String fingerprint() /*-{ return this.fingerprint; }-*/; + public final native JsArrayString userIds() /*-{ return this.user_ids; }-*/; + public final native String key() /*-{ return this.key; }-*/; private native String statusRaw() /*-{ return this.status; }-*/; + public final Status status() { String s = statusRaw(); if (s == null) { @@ -36,10 +42,9 @@ public class GpgKeyInfo extends JavaScriptObject { return Status.valueOf(s); } - public final native boolean hasProblems() - /*-{ return this.hasOwnProperty('problems'); }-*/; + public final native boolean hasProblems() /*-{ return this.hasOwnProperty('problems'); }-*/; + public final native JsArrayString problems() /*-{ return this.problems; }-*/; - protected GpgKeyInfo() { - } + protected GpgKeyInfo() {} } diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GroupBaseInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GroupBaseInfo.java index deed44dcf6..94905c092e 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GroupBaseInfo.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GroupBaseInfo.java @@ -24,8 +24,8 @@ public class GroupBaseInfo extends JavaScriptObject { } public final native String id() /*-{ return this.id; }-*/; + public final native String name() /*-{ return this.name; }-*/; - protected GroupBaseInfo() { - } + protected GroupBaseInfo() {} } diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GroupInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GroupInfo.java index fa051a1ce3..9bf3411a0e 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GroupInfo.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GroupInfo.java @@ -25,21 +25,29 @@ public class GroupInfo extends GroupBaseInfo { } public final native GroupOptionsInfo options() /*-{ return this.options; }-*/; + public final native String description() /*-{ return this.description; }-*/; + public final native String url() /*-{ return this.url; }-*/; + public final native String owner() /*-{ return this.owner; }-*/; + public final native void owner(String o) /*-{ if(o)this.owner=o; }-*/; + public final native JsArray members() /*-{ return this.members; }-*/; + public final native JsArray includes() /*-{ return this.includes; }-*/; private native int group_id() /*-{ return this.group_id; }-*/; + private native String owner_id() /*-{ return this.owner_id; }-*/; + private native void owner_id(String o) /*-{ if(o)this.owner_id=o; }-*/; public final AccountGroup.UUID getOwnerUUID() { String owner = owner_id(); if (owner != null) { - return new AccountGroup.UUID(URL.decodeQueryString(owner)); + return new AccountGroup.UUID(URL.decodeQueryString(owner)); } return null; } @@ -48,13 +56,12 @@ public class GroupInfo extends GroupBaseInfo { owner_id(URL.encodeQueryString(uuid.get())); } - protected GroupInfo() { - } + protected GroupInfo() {} public static class GroupOptionsInfo extends JavaScriptObject { - public final native boolean isVisibleToAll() /*-{ return this['visible_to_all'] ? true : false; }-*/; + public final native boolean + isVisibleToAll() /*-{ return this['visible_to_all'] ? true : false; }-*/; - protected GroupOptionsInfo() { - } + protected GroupOptionsInfo() {} } } diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/OAuthTokenInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/OAuthTokenInfo.java index 08fd130286..d96adaa8dc 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/OAuthTokenInfo.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/OAuthTokenInfo.java @@ -16,16 +16,19 @@ package com.google.gerrit.client.info; import com.google.gwt.core.client.JavaScriptObject; - public class OAuthTokenInfo extends JavaScriptObject { - protected OAuthTokenInfo() { - } + protected OAuthTokenInfo() {} public final native String username() /*-{ return this.username; }-*/; + public final native String resourceHost() /*-{ return this.resource_host; }-*/; + public final native String accessToken() /*-{ return this.access_token; }-*/; + public final native String providerId() /*-{ return this.provider_id; }-*/; + public final native String expiresAt() /*-{ return this.expires_at; }-*/; + public final native String type() /*-{ return this.type; }-*/; } diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/PushCertificateInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/PushCertificateInfo.java index ebfec1a36a..fb5d932d75 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/PushCertificateInfo.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/PushCertificateInfo.java @@ -18,8 +18,8 @@ import com.google.gwt.core.client.JavaScriptObject; public class PushCertificateInfo extends JavaScriptObject { public final native String certificate() /*-{ return this.certificate; }-*/; + public final native GpgKeyInfo key() /*-{ return this.key; }-*/; - protected PushCertificateInfo() { - } + protected PushCertificateInfo() {} } diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/ServerInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/ServerInfo.java index be8d076b14..028659182d 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/ServerInfo.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/ServerInfo.java @@ -19,19 +19,26 @@ import com.google.gerrit.client.rpc.NativeString; import com.google.gerrit.client.rpc.Natives; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArrayString; - import java.util.HashMap; import java.util.Map; public class ServerInfo extends JavaScriptObject { public final native AuthInfo auth() /*-{ return this.auth; }-*/; + public final native ChangeConfigInfo change() /*-{ return this.change; }-*/; + public final native DownloadInfo download() /*-{ return this.download; }-*/; + public final native GerritInfo gerrit() /*-{ return this.gerrit; }-*/; + public final native PluginConfigInfo plugin() /*-{ return this.plugin; }-*/; + public final native SshdInfo sshd() /*-{ return this.sshd; }-*/; + public final native SuggestInfo suggest() /*-{ return this.suggest; }-*/; + public final native UserConfigInfo user() /*-{ return this.user; }-*/; + public final native ReceiveInfo receive() /*-{ return this.receive; }-*/; public final Map urlAliases() { @@ -43,64 +50,65 @@ public class ServerInfo extends JavaScriptObject { } public final native String urlAliasToken(String n) /*-{ return this.url_aliases[n]; }-*/; - private native NativeMap _urlAliases() /*-{ return this.url_aliases; }-*/; + private native NativeMap _urlAliases() /*-{ return this.url_aliases; }-*/; public final boolean hasSshd() { return sshd() != null; } - protected ServerInfo() { - } + protected ServerInfo() {} public static class ChangeConfigInfo extends JavaScriptObject { public final native boolean allowDrafts() /*-{ return this.allow_drafts || false; }-*/; + public final native boolean allowBlame() /*-{ return this.allow_blame || false; }-*/; + public final native int largeChange() /*-{ return this.large_change || 0; }-*/; + public final native String replyLabel() /*-{ return this.reply_label; }-*/; + public final native String replyTooltip() /*-{ return this.reply_tooltip; }-*/; + public final native boolean showAssignee() /*-{ return this.show_assignee || false; }-*/; + public final native int updateDelay() /*-{ return this.update_delay || 0; }-*/; + public final native boolean isSubmitWholeTopicEnabled() /*-{ return this.submit_whole_topic; }-*/; - protected ChangeConfigInfo() { - } + protected ChangeConfigInfo() {} } public static class PluginConfigInfo extends JavaScriptObject { public final native boolean hasAvatars() /*-{ return this.has_avatars || false; }-*/; + public final native JsArrayString jsResourcePaths() /*-{ return this.js_resource_paths || []; }-*/; - protected PluginConfigInfo() { - } + protected PluginConfigInfo() {} } public static class SshdInfo extends JavaScriptObject { - protected SshdInfo() { - } + protected SshdInfo() {} } public static class SuggestInfo extends JavaScriptObject { public final native int from() /*-{ return this.from || 0; }-*/; - protected SuggestInfo() { - } + protected SuggestInfo() {} } public static class UserConfigInfo extends JavaScriptObject { public final native String anonymousCowardName() /*-{ return this.anonymous_coward_name; }-*/; - protected UserConfigInfo() { - } + protected UserConfigInfo() {} } public static class ReceiveInfo extends JavaScriptObject { public final native boolean enableSignedPush() - /*-{ return this.enable_signed_push || false; }-*/; + /*-{ return this.enable_signed_push || false; }-*/ ; - protected ReceiveInfo() { - } + protected ReceiveInfo() {} } } diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/TopMenu.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/TopMenu.java index bad04751d7..7e25af2d86 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/TopMenu.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/TopMenu.java @@ -19,8 +19,7 @@ import com.google.gwt.core.client.JsArray; public class TopMenu extends JavaScriptObject { - protected TopMenu() { - } + protected TopMenu() {} public final native String getName() /*-{ return this.name; }-*/; diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/TopMenuItem.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/TopMenuItem.java index 54cde9ce94..3a286a28c6 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/TopMenuItem.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/TopMenuItem.java @@ -25,13 +25,16 @@ public class TopMenuItem extends JavaScriptObject { } public final native String getName() /*-{ return this.name; }-*/; + public final native String getUrl() /*-{ return this.url; }-*/; + public final native String getTarget() /*-{ return this.target; }-*/; + public final native String getId() /*-{ return this.id; }-*/; public final native void name(String n) /*-{ this.name = n }-*/; + public final native void url(String u) /*-{ this.url = u }-*/; - protected TopMenuItem() { - } + protected TopMenuItem() {} } diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/TopMenuList.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/TopMenuList.java index d51e778eed..d7df1f7b39 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/TopMenuList.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/TopMenuList.java @@ -18,6 +18,5 @@ import com.google.gwt.core.client.JsArray; public class TopMenuList extends JsArray { - protected TopMenuList() { - } + protected TopMenuList() {} } diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/WebLinkInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/WebLinkInfo.java index 367486bd89..bcf3dde13b 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/WebLinkInfo.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/WebLinkInfo.java @@ -21,12 +21,14 @@ import com.google.gwt.user.client.ui.Image; public class WebLinkInfo extends JavaScriptObject { public final native String name() /*-{ return this.name; }-*/; + public final native String imageUrl() /*-{ return this.image_url; }-*/; + public final native String url() /*-{ return this.url; }-*/; + public final native String target() /*-{ return this.target; }-*/; - protected WebLinkInfo() { - } + protected WebLinkInfo() {} public final Anchor toAnchor() { Anchor a = new Anchor(); diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/rpc/NativeMap.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/rpc/NativeMap.java index 1f003de605..43ff60c0b2 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/rpc/NativeMap.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/rpc/NativeMap.java @@ -17,7 +17,6 @@ package com.google.gerrit.client.rpc; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArray; import com.google.gwt.user.client.rpc.AsyncCallback; - import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -30,21 +29,18 @@ public class NativeMap extends JavaScriptObject { } /** - * Loop through the result map's entries and copy the key strings into the - * "name" property of the corresponding child object. This only runs on the - * top level map of the result, and requires the children to be JSON objects - * and not a JSON primitive (e.g. boolean or string). + * Loop through the result map's entries and copy the key strings into the "name" property of the + * corresponding child object. This only runs on the top level map of the result, and requires the + * children to be JSON objects and not a JSON primitive (e.g. boolean or string). */ - public static > AsyncCallback copyKeysIntoChildren( - AsyncCallback callback) { + public static > + AsyncCallback copyKeysIntoChildren(AsyncCallback callback) { return copyKeysIntoChildren("name", callback); } /** Loop through the result map and set asProperty on the children. */ - public static > AsyncCallback copyKeysIntoChildren( - final String asProperty, AsyncCallback callback) { + public static > + AsyncCallback copyKeysIntoChildren(final String asProperty, AsyncCallback callback) { return new TransformCallback(callback) { @Override protected M transform(M result) { @@ -54,8 +50,7 @@ public class NativeMap extends JavaScriptObject { }; } - protected NativeMap() { - } + protected NativeMap() {} public final Set keySet() { return Natives.keys(this); @@ -68,8 +63,7 @@ public class NativeMap extends JavaScriptObject { return sorted; } - public final native JsArray values() - /*-{ + public final native JsArray values() /*-{ var s = this; var v = []; var i = 0; @@ -94,10 +88,10 @@ public class NativeMap extends JavaScriptObject { } public final native T get(String n) /*-{ return this[n]; }-*/; + public final native void put(String n, T v) /*-{ this[n] = v; }-*/; - public final native void copyKeysIntoChildren(String p) - /*-{ + public final native void copyKeysIntoChildren(String p) /*-{ var s = this; for (var k in s) { if (s.hasOwnProperty(k)) { diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/rpc/NativeString.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/rpc/NativeString.java index 572d454267..a4b90c3859 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/rpc/NativeString.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/rpc/NativeString.java @@ -34,13 +34,11 @@ public final class NativeString extends JavaScriptObject { return wrap0(TYPE, s); } - private static native NativeString wrap0(JavaScriptObject T, String s) - /*-{ return new T(s) }-*/; + private static native NativeString wrap0(JavaScriptObject T, String s) /*-{ return new T(s) }-*/; public native String asString() /*-{ return this.s; }-*/; - public static AsyncCallback - unwrap(final AsyncCallback cb) { + public static AsyncCallback unwrap(final AsyncCallback cb) { return new AsyncCallback() { @Override public void onSuccess(NativeString result) { @@ -59,8 +57,7 @@ public final class NativeString extends JavaScriptObject { } private static native boolean is(JavaScriptObject T, JavaScriptObject o) - /*-{ return o instanceof T }-*/; + /*-{ return o instanceof T }-*/ ; - protected NativeString() { - } + protected NativeString() {} } diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/rpc/Natives.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/rpc/Natives.java index dcd96da20b..ebaa63b685 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/rpc/Natives.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/rpc/Natives.java @@ -18,7 +18,6 @@ import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArray; import com.google.gwt.core.client.JsArrayString; import com.google.gwt.json.client.JSONObject; - import java.util.AbstractList; import java.util.Collections; import java.util.List; @@ -26,8 +25,8 @@ import java.util.Set; public class Natives { /** - * Get the names of defined properties on the object. The returned set - * iterates in the native iteration order, which may match the source order. + * Get the names of defined properties on the object. The returned set iterates in the native + * iteration order, which may match the source order. */ public static Set keys(JavaScriptObject obj) { if (obj != null) { @@ -60,8 +59,7 @@ public class Natives { }; } - public static List asList( - final JsArray arr) { + public static List asList(final JsArray arr) { if (arr == null) { return null; } @@ -105,6 +103,5 @@ public class Natives { return arr; } - private Natives() { - } + private Natives() {} } diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/ui/HighlightSuggestion.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/ui/HighlightSuggestion.java index 10e20bfc7d..513f5705f9 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/ui/HighlightSuggestion.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/ui/HighlightSuggestion.java @@ -33,7 +33,7 @@ public class HighlightSuggestion implements Suggestion { int start = 0; int keyLen = keyword.length(); SafeHtmlBuilder builder = new SafeHtmlBuilder(); - for (;;) { + for (; ; ) { int index = value.indexOf(keyword, start); if (index == -1) { builder.appendEscaped(value.substring(start)); diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/ui/RemoteSuggestOracle.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/ui/RemoteSuggestOracle.java index 5a6918a791..d66d6a60b2 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/ui/RemoteSuggestOracle.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/ui/RemoteSuggestOracle.java @@ -19,14 +19,13 @@ import com.google.gwt.user.client.ui.SuggestOracle; /** * Delegates to a slow SuggestOracle, such as a remote server API. - *

- * A response is only supplied to the UI if no requests were made after the - * oracle begin that request. - *

- * When a request is made while the delegate is still processing a prior request - * all intermediate requests are discarded and the most recent request is - * queued. The pending request's response is discarded and the most recent - * request is started. + * + *

A response is only supplied to the UI if no requests were made after the oracle begin that + * request. + * + *

When a request is made while the delegate is still processing a prior request all intermediate + * requests are discarded and the most recent request is queued. The pending request's response is + * discarded and the most recent request is started. */ public class RemoteSuggestOracle extends SuggestOracle { private final SuggestOracle oracle; @@ -47,7 +46,7 @@ public class RemoteSuggestOracle extends SuggestOracle { @Override public void requestSuggestions(Request req, Callback cb) { - if (!serveSuggestions){ + if (!serveSuggestions) { return; } @@ -56,18 +55,19 @@ public class RemoteSuggestOracle extends SuggestOracle { if (requestRetentionTimer != null) { requestRetentionTimer.cancel(); } - requestRetentionTimer = new Timer() { - @Override - public void run() { - Query q = new Query(req, cb); - if (query == null) { - query = q; - q.start(); - } else { - query = q; - } - } - }; + requestRetentionTimer = + new Timer() { + @Override + public void run() { + Query q = new Query(req, cb); + if (query == null) { + query = q; + q.start(); + } else { + query = q; + } + } + }; requestRetentionTimer.schedule(200); } diff --git a/gerrit-gwtui-common/src/test/java/com/google/gerrit/client/RelativeDateFormatterTest.java b/gerrit-gwtui-common/src/test/java/com/google/gerrit/client/RelativeDateFormatterTest.java index 23183f21aa..937fc96219 100644 --- a/gerrit-gwtui-common/src/test/java/com/google/gerrit/client/RelativeDateFormatterTest.java +++ b/gerrit-gwtui-common/src/test/java/com/google/gerrit/client/RelativeDateFormatterTest.java @@ -21,15 +21,13 @@ import static com.google.gerrit.client.RelativeDateFormatter.SECOND_IN_MILLIS; import static com.google.gerrit.client.RelativeDateFormatter.YEAR_IN_MILLIS; import static org.junit.Assert.assertEquals; +import java.util.Date; import org.eclipse.jgit.util.RelativeDateFormatter; import org.junit.Test; -import java.util.Date; - public class RelativeDateFormatterTest { - private static void assertFormat(long ageFromNow, long timeUnit, - String expectedFormat) { + private static void assertFormat(long ageFromNow, long timeUnit, String expectedFormat) { Date d = new Date(System.currentTimeMillis() - ageFromNow * timeUnit); String s = RelativeDateFormatter.format(d); assertEquals(expectedFormat, s); diff --git a/gerrit-gwtui-common/src/test/java/com/google/gerrit/client/ui/HighlightSuggestionTest.java b/gerrit-gwtui-common/src/test/java/com/google/gerrit/client/ui/HighlightSuggestionTest.java index 44ed50b6f1..9bf2d95236 100644 --- a/gerrit-gwtui-common/src/test/java/com/google/gerrit/client/ui/HighlightSuggestionTest.java +++ b/gerrit-gwtui-common/src/test/java/com/google/gerrit/client/ui/HighlightSuggestionTest.java @@ -25,9 +25,7 @@ public class HighlightSuggestionTest { String keyword = "key"; String value = "somethingkeysomething"; HighlightSuggestion suggestion = new HighlightSuggestion(keyword, value); - assertEquals( - "somethingkeysomething", - suggestion.getDisplayString()); + assertEquals("somethingkeysomething", suggestion.getDisplayString()); assertEquals(value, suggestion.getReplacementString()); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/AvatarImage.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/AvatarImage.java index 4ca1721a70..107d6634b7 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/AvatarImage.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/AvatarImage.java @@ -43,11 +43,9 @@ public class AvatarImage extends Image implements LoadHandler { * An avatar image for the given account using the requested size. * * @param account The account in which we are interested - * @param size A requested size. Note that the size can be ignored depending - * on the avatar provider. A size <= 0 indicates to let the provider - * decide a default size. - * @param addPopup show avatar popup with user info on hovering over the - * avatar image + * @param size A requested size. Note that the size can be ignored depending on the avatar + * provider. A size <= 0 indicates to let the provider decide a default size. + * @param addPopup show avatar popup with user info on hovering over the avatar image */ public AvatarImage(AccountInfo account, int size, boolean addPopup) { addLoadHandler(this); @@ -84,10 +82,9 @@ public class AvatarImage extends Image implements LoadHandler { return; } - // TODO Kill /accounts/*/avatar URL. + // TODO Kill /accounts/*/avatar URL. String u = account.email(); - if (Gerrit.isSignedIn() - && u.equals(Gerrit.getUserAccount().email())) { + if (Gerrit.isSignedIn() && u.equals(Gerrit.getUserAccount().email())) { u = "self"; } RestApi api = new RestApi("/accounts/").id(u).view("avatar"); @@ -114,8 +111,7 @@ public class AvatarImage extends Image implements LoadHandler { } private static boolean isGerritServer(AccountInfo account) { - return account._accountId() == 0 - && Util.C.messageNoAuthor().equals(account.name()); + return account._accountId() == 0 && Util.C.messageNoAuthor().equals(account.name()); } private static class PopupHandler implements MouseOverHandler, MouseOutHandler { @@ -133,18 +129,22 @@ public class AvatarImage extends Image implements LoadHandler { private UserPopupPanel createPopupPanel(AccountInfo account) { UserPopupPanel popup = new UserPopupPanel(account, false, false); - popup.addDomHandler(new MouseOverHandler() { - @Override - public void onMouseOver(MouseOverEvent event) { - scheduleShow(); - } - }, MouseOverEvent.getType()); - popup.addDomHandler(new MouseOutHandler() { - @Override - public void onMouseOut(MouseOutEvent event) { - scheduleHide(); - } - }, MouseOutEvent.getType()); + popup.addDomHandler( + new MouseOverHandler() { + @Override + public void onMouseOver(MouseOverEvent event) { + scheduleShow(); + } + }, + MouseOverEvent.getType()); + popup.addDomHandler( + new MouseOutHandler() { + @Override + public void onMouseOut(MouseOutEvent event) { + scheduleHide(); + } + }, + MouseOutEvent.getType()); return popup; } @@ -163,22 +163,21 @@ public class AvatarImage extends Image implements LoadHandler { hideTimer.cancel(); hideTimer = null; } - if ((popup != null && popup.isShowing() && popup.isVisible()) - || showTimer != null) { + if ((popup != null && popup.isShowing() && popup.isVisible()) || showTimer != null) { return; } - showTimer = new Timer() { - @Override - public void run() { - if (popup == null) { - popup = createPopupPanel(account); - } - if (!popup.isShowing() || !popup.isVisible()) { - popup.showRelativeTo(target); - } - - } - }; + showTimer = + new Timer() { + @Override + public void run() { + if (popup == null) { + popup = createPopupPanel(account); + } + if (!popup.isShowing() || !popup.isVisible()) { + popup.showRelativeTo(target); + } + } + }; showTimer.schedule(600); } @@ -187,16 +186,16 @@ public class AvatarImage extends Image implements LoadHandler { showTimer.cancel(); showTimer = null; } - if (popup == null || !popup.isShowing() || !popup.isVisible() - || hideTimer != null) { + if (popup == null || !popup.isShowing() || !popup.isVisible() || hideTimer != null) { return; } - hideTimer = new Timer() { - @Override - public void run() { - popup.hide(); - } - }; + hideTimer = + new Timer() { + @Override + public void run() { + popup.hide(); + } + }; hideTimer.schedule(50); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ConfirmationCallback.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ConfirmationCallback.java index 8fef111f7c..cc30873f22 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ConfirmationCallback.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ConfirmationCallback.java @@ -15,21 +15,19 @@ package com.google.gerrit.client; /** - * Interface that a caller must implement to react on the result of a - * {@link ConfirmationDialog}. + * Interface that a caller must implement to react on the result of a {@link ConfirmationDialog}. */ public abstract class ConfirmationCallback { /** - * Called when the {@link ConfirmationDialog} is finished with OK. - * To be overwritten by subclasses. + * Called when the {@link ConfirmationDialog} is finished with OK. To be overwritten by + * subclasses. */ public abstract void onOk(); /** - * Called when the {@link ConfirmationDialog} is finished with Cancel. - * To be overwritten by subclasses. + * Called when the {@link ConfirmationDialog} is finished with Cancel. To be overwritten by + * subclasses. */ - public void onCancel() { - } + public void onCancel() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ConfirmationDialog.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ConfirmationDialog.java index ab3ff5dffc..58865fa967 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ConfirmationDialog.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ConfirmationDialog.java @@ -28,9 +28,9 @@ public class ConfirmationDialog extends AutoCenterDialogBox { private Button cancelButton; private Button okButton; - public ConfirmationDialog(final String dialogTitle, final SafeHtml message, - final ConfirmationCallback callback) { - super(/* auto hide */false, /* modal */true); + public ConfirmationDialog( + final String dialogTitle, final SafeHtml message, final ConfirmationCallback callback) { + super(/* auto hide */ false, /* modal */ true); setGlassEnabled(true); setText(dialogTitle); @@ -38,25 +38,27 @@ public class ConfirmationDialog extends AutoCenterDialogBox { okButton = new Button(); okButton.setText(Gerrit.C.confirmationDialogOk()); - okButton.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - hide(); - callback.onOk(); - } - }); + okButton.addClickHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + hide(); + callback.onOk(); + } + }); buttons.add(okButton); cancelButton = new Button(); cancelButton.getElement().getStyle().setProperty("marginLeft", "300px"); cancelButton.setText(Gerrit.C.confirmationDialogCancel()); - cancelButton.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - hide(); - callback.onCancel(); - } - }); + cancelButton.addClickHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + hide(); + callback.onCancel(); + } + }); buttons.add(cancelButton); final FlowPanel center = new FlowPanel(); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/DiffObject.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/DiffObject.java index 0a1aadd3c8..1b0f4ca1e3 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/DiffObject.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/DiffObject.java @@ -19,30 +19,28 @@ import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.PatchSet; /** - * Represent an object that can be diffed. This can be either a regular patch - * set, the base of a patch set, the parent of a merge, the auto-merge of a - * merge or an edit patch set. + * Represent an object that can be diffed. This can be either a regular patch set, the base of a + * patch set, the parent of a merge, the auto-merge of a merge or an edit patch set. */ public class DiffObject { public static final String AUTO_MERGE = "AutoMerge"; /** * Parses a string that represents a diff object. - *

- * The following string representations are supported: + * + *

The following string representations are supported: + * *

    - *
  • a positive integer: represents a patch set - *
  • a negative integer: represents a parent of a merge patch set - *
  • '0': represents the edit patch set - *
  • empty string or null: represents the parent of a 1-parent patch set, - * also called base - *
  • 'AutoMerge': represents the auto-merge of a merge patch set + *
  • a positive integer: represents a patch set + *
  • a negative integer: represents a parent of a merge patch set + *
  • '0': represents the edit patch set + *
  • empty string or null: represents the parent of a 1-parent patch set, also called base + *
  • 'AutoMerge': represents the auto-merge of a merge patch set *
* * @param changeId the ID of the change to which the diff object belongs * @param str the string representation of the diff object - * @return the parsed diff object, {@code null} if str cannot be parsed as - * diff object + * @return the parsed diff object, {@code null} if str cannot be parsed as diff object */ public static DiffObject parse(Change.Id changeId, String str) { if (str == null || str.isEmpty()) { @@ -60,23 +58,17 @@ public class DiffObject { } } - /** - * Create a DiffObject that represents the parent of a 1-parent patch set. - */ + /** Create a DiffObject that represents the parent of a 1-parent patch set. */ public static DiffObject base() { return new DiffObject(false); } - /** - * Create a DiffObject that represents the auto-merge for a merge patch set. - */ + /** Create a DiffObject that represents the auto-merge for a merge patch set. */ public static DiffObject autoMerge() { return new DiffObject(true); } - /** - * Create a DiffObject that represents a patch set. - */ + /** Create a DiffObject that represents a patch set. */ public static DiffObject patchSet(PatchSet.Id psId) { return new DiffObject(psId); } @@ -121,10 +113,9 @@ public class DiffObject { /** * Returns the DiffObject as PatchSet.Id. * - * @return PatchSet.Id with an id > 0 for a regular patch set; PatchSet.Id - * with an id < 0 for a parent of a merge; PatchSet.Id with id == 0 - * for an edit patch set; {@code null} for the base of a 1-parent - * patch set and for the auto-merge of a merge patch set + * @return PatchSet.Id with an id > 0 for a regular patch set; PatchSet.Id with an id < 0 for a + * parent of a merge; PatchSet.Id with id == 0 for an edit patch set; {@code null} for the + * base of a 1-parent patch set and for the auto-merge of a merge patch set */ public PatchSet.Id asPatchSetId() { return psId; @@ -133,8 +124,7 @@ public class DiffObject { /** * Returns the parent number for a parent of a merge. * - * @return 1-based parent number, 0 if this DiffObject is not a parent of a - * merge + * @return 1-based parent number, 0 if this DiffObject is not a parent of a merge */ public int getParentNum() { if (!isParent()) { @@ -145,24 +135,23 @@ public class DiffObject { } /** - * Returns a string representation of this DiffObject that can be used in - * URLs. - *

- * The following string representations are returned: + * Returns a string representation of this DiffObject that can be used in URLs. + * + *

The following string representations are returned: + * *

    - *
  • a positive integer for a patch set - *
  • a negative integer for a parent of a merge patch set - *
  • '0' for the edit patch set - *
  • {@code null} for the parent of a 1-parent patch set, also called base - *
  • 'AutoMerge' for the auto-merge of a merge patch set + *
  • a positive integer for a patch set + *
  • a negative integer for a parent of a merge patch set + *
  • '0' for the edit patch set + *
  • {@code null} for the parent of a 1-parent patch set, also called base + *
  • 'AutoMerge' for the auto-merge of a merge patch set *
* * @return string representation of this DiffObject */ public String asString() { if (autoMerge) { - if (Gerrit.getUserPreferences() - .defaultBaseForMerges() != DefaultBase.AUTO_MERGE) { + if (Gerrit.getUserPreferences().defaultBaseForMerges() != DefaultBase.AUTO_MERGE) { return AUTO_MERGE; } return null; diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/DiffWebLinkInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/DiffWebLinkInfo.java index d52838d3a5..fe7016f854 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/DiffWebLinkInfo.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/DiffWebLinkInfo.java @@ -18,11 +18,10 @@ import com.google.gerrit.client.info.WebLinkInfo; public class DiffWebLinkInfo extends WebLinkInfo { public final native boolean showOnSideBySideDiffView() - /*-{ return this.show_on_side_by_side_diff_view || false; }-*/; + /*-{ return this.show_on_side_by_side_diff_view || false; }-*/ ; public final native boolean showOnUnifiedDiffView() - /*-{ return this.show_on_unified_diff_view || false; }-*/; + /*-{ return this.show_on_unified_diff_view || false; }-*/ ; - protected DiffWebLinkInfo() { - } + protected DiffWebLinkInfo() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java index 79876e701c..f5f2bdefac 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java @@ -108,13 +108,12 @@ import com.google.gwtexpui.user.client.UserAgent; import com.google.gwtorm.client.KeyUtil; public class Dispatcher { - public static String toPatch(DiffObject diffBase, - PatchSet.Id revision, String fileName) { + public static String toPatch(DiffObject diffBase, PatchSet.Id revision, String fileName) { return toPatch("", diffBase, revision, fileName, null, 0); } - public static String toPatch(DiffObject diffBase, - PatchSet.Id revision, String fileName, DisplaySide side, int line) { + public static String toPatch( + DiffObject diffBase, PatchSet.Id revision, String fileName, DisplaySide side, int line) { return toPatch("", diffBase, revision, fileName, side, line); } @@ -122,13 +121,11 @@ public class Dispatcher { return toPatch("sidebyside", diffBase, id); } - public static String toSideBySide(DiffObject diffBase, PatchSet.Id revision, - String fileName) { + public static String toSideBySide(DiffObject diffBase, PatchSet.Id revision, String fileName) { return toPatch("sidebyside", diffBase, revision, fileName, null, 0); } - public static String toUnified(DiffObject diffBase, - PatchSet.Id revision, String fileName) { + public static String toUnified(DiffObject diffBase, PatchSet.Id revision, String fileName) { return toPatch("unified", diffBase, revision, fileName, null, 0); } @@ -148,8 +145,13 @@ public class Dispatcher { return toPatch("edit", DiffObject.base(), revision, fileName, null, line); } - private static String toPatch(String type, DiffObject diffBase, - PatchSet.Id revision, String fileName, DisplaySide side, int line) { + private static String toPatch( + String type, + DiffObject diffBase, + PatchSet.Id revision, + String fileName, + DisplaySide side, + int line) { Change.Id c = revision.getParentKey(); StringBuilder p = new StringBuilder(); p.append("/c/").append(c).append("/"); @@ -157,8 +159,7 @@ public class Dispatcher { p.append(diffBase.asString()).append(".."); } p.append(revision.getId()).append("/").append(KeyUtil.encode(fileName)); - if (type != null && !type.isEmpty() - && (!"sidebyside".equals(type) || preferUnified())) { + if (type != null && !type.isEmpty() && (!"sidebyside".equals(type) || preferUnified())) { p.append(",").append(type); } if (side == DisplaySide.A && line > 0) { @@ -252,7 +253,8 @@ public class Dispatcher { || matchExact("register", token) || matchExact(REGISTER, token) || matchPrefix("/register/", token) - || matchPrefix("/VE/", token) || matchPrefix("VE,", token) + || matchPrefix("/VE/", token) + || matchPrefix("VE,", token) || matchPrefix("/SignInFailure,", token)) { settings(token); @@ -325,27 +327,28 @@ public class Dispatcher { rest = rest.substring(c); if (matchPrefix(DASHBOARDS, rest)) { final String dashboardId = skip(rest); - GerritCallback cb = new GerritCallback() { - @Override - public void onSuccess(DashboardInfo result) { - if (matchPrefix("/dashboard/", result.url())) { - String params = skip(result.url()).substring(1); - ProjectDashboardScreen dash = new ProjectDashboardScreen( - new Project.NameKey(project), params); - Gerrit.display(token, dash); - } - } + GerritCallback cb = + new GerritCallback() { + @Override + public void onSuccess(DashboardInfo result) { + if (matchPrefix("/dashboard/", result.url())) { + String params = skip(result.url()).substring(1); + ProjectDashboardScreen dash = + new ProjectDashboardScreen(new Project.NameKey(project), params); + Gerrit.display(token, dash); + } + } - @Override - public void onFailure(Throwable caught) { - if ("default".equals(dashboardId) && RestApi.isNotFound(caught)) { - Gerrit.display(toChangeQuery( - PageLinks.projectQuery(new Project.NameKey(project)))); - } else { - super.onFailure(caught); - } - } - }; + @Override + public void onFailure(Throwable caught) { + if ("default".equals(dashboardId) && RestApi.isNotFound(caught)) { + Gerrit.display( + toChangeQuery(PageLinks.projectQuery(new Project.NameKey(project)))); + } else { + super.onFailure(caught); + } + } + }; if ("default".equals(dashboardId)) { DashboardList.getDefault(new Project.NameKey(project), cb); return; @@ -389,14 +392,15 @@ public class Dispatcher { if (rest.isEmpty()) { FileTable.Mode mode = FileTable.Mode.REVIEW; - if (panel != null - && (panel.equals("edit") || panel.startsWith("edit/"))) { + if (panel != null && (panel.equals("edit") || panel.startsWith("edit/"))) { mode = FileTable.Mode.EDIT; panel = null; } - Gerrit.display(token, panel == null - ? new ChangeScreen(id, DiffObject.base(), null, false, mode) - : new NotFoundScreen()); + Gerrit.display( + token, + panel == null + ? new ChangeScreen(id, DiffObject.base(), null, false, mode) + : new NotFoundScreen()); return; } @@ -439,10 +443,9 @@ public class Dispatcher { patch(token, base, p, side, line, panel); } else { if (panel == null) { - Gerrit.display(token, - new ChangeScreen(id, - base, - String.valueOf(ps.get()), false, FileTable.Mode.REVIEW)); + Gerrit.display( + token, + new ChangeScreen(id, base, String.valueOf(ps.get()), false, FileTable.Mode.REVIEW)); } else { Gerrit.display(token, new NotFoundScreen()); } @@ -450,9 +453,7 @@ public class Dispatcher { } private static PatchSet.Id toPsId(Change.Id id, String psIdStr) { - return new PatchSet.Id(id, psIdStr.equals("edit") - ? 0 - : Integer.parseInt(psIdStr)); + return new PatchSet.Id(id, psIdStr.equals("edit") ? 0 : Integer.parseInt(psIdStr)); } private static void extension(final String token) { @@ -464,19 +465,15 @@ public class Dispatcher { } } - private static void patch(String token, - DiffObject base, - Patch.Key id, - DisplaySide side, - int line, - String panelType) { + private static void patch( + String token, DiffObject base, Patch.Key id, DisplaySide side, int line, String panelType) { String panel = panelType; if (panel == null) { int c = token.lastIndexOf(','); panel = 0 <= c ? token.substring(c + 1) : ""; } - if ("".equals(panel) || /* DEPRECATED URL */"cm".equals(panel)) { + if ("".equals(panel) || /* DEPRECATED URL */ "cm".equals(panel)) { if (preferUnified()) { unified(token, base, id, side, line); } else { @@ -502,300 +499,305 @@ public class Dispatcher { || (UserAgent.isPortrait() && UserAgent.isMobile()); } - private static void unified(final String token, final DiffObject base, - final Patch.Key id, final DisplaySide side, final int line) { - GWT.runAsync(new AsyncSplit(token) { - @Override - public void onSuccess() { - Gerrit.display(token, new Unified(base, - DiffObject.patchSet(id.getParentKey()), id.get(), side, line)); - } - }); - } - - private static void codemirror(final String token, final DiffObject base, - final Patch.Key id, final DisplaySide side, final int line) { - GWT.runAsync(new AsyncSplit(token) { - @Override - public void onSuccess() { - Gerrit.display(token, new SideBySide(base, - DiffObject.patchSet(id.getParentKey()), id.get(), side, line)); - } - }); - } - - private static void codemirrorForEdit(final String token, final Patch.Key id, + private static void unified( + final String token, + final DiffObject base, + final Patch.Key id, + final DisplaySide side, final int line) { - GWT.runAsync(new AsyncSplit(token) { - @Override - public void onSuccess() { - Gerrit.display(token, new EditScreen(id, line)); - } - }); + GWT.runAsync( + new AsyncSplit(token) { + @Override + public void onSuccess() { + Gerrit.display( + token, + new Unified(base, DiffObject.patchSet(id.getParentKey()), id.get(), side, line)); + } + }); + } + + private static void codemirror( + final String token, + final DiffObject base, + final Patch.Key id, + final DisplaySide side, + final int line) { + GWT.runAsync( + new AsyncSplit(token) { + @Override + public void onSuccess() { + Gerrit.display( + token, + new SideBySide(base, DiffObject.patchSet(id.getParentKey()), id.get(), side, line)); + } + }); + } + + private static void codemirrorForEdit(final String token, final Patch.Key id, final int line) { + GWT.runAsync( + new AsyncSplit(token) { + @Override + public void onSuccess() { + Gerrit.display(token, new EditScreen(id, line)); + } + }); } private static void settings(String token) { - GWT.runAsync(new AsyncSplit(token) { - @Override - public void onSuccess() { - Gerrit.display(token, select()); - } - - private Screen select() { - if (matchExact(SETTINGS, token)) { - return new MyProfileScreen(); - } - - if (matchExact(SETTINGS_PREFERENCES, token)) { - return new MyPreferencesScreen(); - } - - if (matchExact(SETTINGS_DIFF_PREFERENCES, token)) { - return new MyDiffPreferencesScreen(); - } - - if (matchExact(SETTINGS_EDIT_PREFERENCES, token)) { - return new MyEditPreferencesScreen(); - } - - if (matchExact(SETTINGS_PROJECTS, token)) { - return new MyWatchedProjectsScreen(); - } - - if (matchExact(SETTINGS_CONTACT, token)) { - return new MyContactInformationScreen(); - } - - if (matchExact(SETTINGS_SSHKEYS, token)) { - return new MySshKeysScreen(); - } - - if (matchExact(SETTINGS_GPGKEYS, token) - && Gerrit.info().gerrit().editGpgKeys()) { - return new MyGpgKeysScreen(); - } - - if (matchExact(SETTINGS_WEBIDENT, token)) { - return new MyIdentitiesScreen(); - } - - if (matchExact(SETTINGS_HTTP_PASSWORD, token)) { - return new MyPasswordScreen(); - } - - if (matchExact(SETTINGS_OAUTH_TOKEN, token) - && Gerrit.info().auth().isOAuth() - && Gerrit.info().auth().isGitBasicAuth()) { - return new MyOAuthTokenScreen(); - } - - if (matchExact(MY_GROUPS, token) - || matchExact(SETTINGS_MYGROUPS, token)) { - return new MyGroupsScreen(); - } - - if (matchExact(SETTINGS_AGREEMENTS, token) - && Gerrit.info().auth().useContributorAgreements()) { - return new MyAgreementsScreen(); - } - - if (matchExact(REGISTER, token) - || matchExact("/register/", token) - || matchExact("register", token)) { - return new RegisterScreen(MINE); - } else if (matchPrefix("/register/", token)) { - return new RegisterScreen("/" + skip(token)); - } - - if (matchPrefix("/VE/", token) || matchPrefix("VE,", token)) { - return new ValidateEmailScreen(skip(token)); - } - - if (matchExact(SETTINGS_NEW_AGREEMENT, token)) { - return new NewAgreementScreen(); - } - - if (matchPrefix(SETTINGS_NEW_AGREEMENT + "/", token)) { - return new NewAgreementScreen(skip(token)); - } - - if (matchPrefix(SETTINGS_EXTENSION, token)) { - ExtensionSettingsScreen view = - new ExtensionSettingsScreen(skip(token)); - if (view.isFound()) { - return view; + GWT.runAsync( + new AsyncSplit(token) { + @Override + public void onSuccess() { + Gerrit.display(token, select()); } - return new NotFoundScreen(); - } - return new NotFoundScreen(); - } - }); + private Screen select() { + if (matchExact(SETTINGS, token)) { + return new MyProfileScreen(); + } + + if (matchExact(SETTINGS_PREFERENCES, token)) { + return new MyPreferencesScreen(); + } + + if (matchExact(SETTINGS_DIFF_PREFERENCES, token)) { + return new MyDiffPreferencesScreen(); + } + + if (matchExact(SETTINGS_EDIT_PREFERENCES, token)) { + return new MyEditPreferencesScreen(); + } + + if (matchExact(SETTINGS_PROJECTS, token)) { + return new MyWatchedProjectsScreen(); + } + + if (matchExact(SETTINGS_CONTACT, token)) { + return new MyContactInformationScreen(); + } + + if (matchExact(SETTINGS_SSHKEYS, token)) { + return new MySshKeysScreen(); + } + + if (matchExact(SETTINGS_GPGKEYS, token) && Gerrit.info().gerrit().editGpgKeys()) { + return new MyGpgKeysScreen(); + } + + if (matchExact(SETTINGS_WEBIDENT, token)) { + return new MyIdentitiesScreen(); + } + + if (matchExact(SETTINGS_HTTP_PASSWORD, token)) { + return new MyPasswordScreen(); + } + + if (matchExact(SETTINGS_OAUTH_TOKEN, token) + && Gerrit.info().auth().isOAuth() + && Gerrit.info().auth().isGitBasicAuth()) { + return new MyOAuthTokenScreen(); + } + + if (matchExact(MY_GROUPS, token) || matchExact(SETTINGS_MYGROUPS, token)) { + return new MyGroupsScreen(); + } + + if (matchExact(SETTINGS_AGREEMENTS, token) + && Gerrit.info().auth().useContributorAgreements()) { + return new MyAgreementsScreen(); + } + + if (matchExact(REGISTER, token) + || matchExact("/register/", token) + || matchExact("register", token)) { + return new RegisterScreen(MINE); + } else if (matchPrefix("/register/", token)) { + return new RegisterScreen("/" + skip(token)); + } + + if (matchPrefix("/VE/", token) || matchPrefix("VE,", token)) { + return new ValidateEmailScreen(skip(token)); + } + + if (matchExact(SETTINGS_NEW_AGREEMENT, token)) { + return new NewAgreementScreen(); + } + + if (matchPrefix(SETTINGS_NEW_AGREEMENT + "/", token)) { + return new NewAgreementScreen(skip(token)); + } + + if (matchPrefix(SETTINGS_EXTENSION, token)) { + ExtensionSettingsScreen view = new ExtensionSettingsScreen(skip(token)); + if (view.isFound()) { + return view; + } + return new NotFoundScreen(); + } + + return new NotFoundScreen(); + } + }); } private static void admin(String token) { - GWT.runAsync(new AsyncSplit(token) { - @Override - public void onSuccess() { - if (matchExact(ADMIN_GROUPS, token) - || matchExact("/admin/groups", token)) { - Gerrit.display(token, new GroupListScreen()); - - } else if (matchPrefix(ADMIN_GROUPS, token)) { - String rest = skip(token); - if (rest.startsWith("?")) { - Gerrit.display(token, new GroupListScreen(rest.substring(1))); - } else { - group(); - } - - } else if (matchPrefix("/admin/groups", token)) { - String rest = skip(token); - if (rest.startsWith("?")) { - Gerrit.display(token, new GroupListScreen(rest.substring(1))); - } - - } else if (matchExact(ADMIN_PROJECTS, token) - || matchExact("/admin/projects", token)) { - Gerrit.display(token, new ProjectListScreen()); - - } else if (matchPrefix(ADMIN_PROJECTS, token)) { - String rest = skip(token); - if (rest.startsWith("?")) { - Gerrit.display(token, new ProjectListScreen(rest.substring(1))); - } else { - Gerrit.display(token, selectProject()); - } - - } else if (matchPrefix("/admin/projects", token)) { - String rest = skip(token); - if (rest.startsWith("?")) { - Gerrit.display(token, new ProjectListScreen(rest.substring(1))); - } - - } else if (matchPrefix(ADMIN_PLUGINS, token) - || matchExact("/admin/plugins", token)) { - Gerrit.display(token, new PluginListScreen()); - - } else if (matchExact(ADMIN_CREATE_PROJECT, token) - || matchExact("/admin/create-project", token)) { - Gerrit.display(token, new CreateProjectScreen()); - - } else if (matchExact(ADMIN_CREATE_GROUP, token) - || matchExact("/admin/create-group", token)) { - Gerrit.display(token, new CreateGroupScreen()); - - } else { - Gerrit.display(token, new NotFoundScreen()); - } - } - - private void group() { - final String panel; - final String group; - - if (matchPrefix("/admin/groups/uuid-", token)) { - String p = skip(token); - int c = p.indexOf(','); - if (c < 0) { - group = p; - panel = null; - } else { - group = p.substring(0, c); - panel = p.substring(c + 1); - } - } else if (matchPrefix(ADMIN_GROUPS, token)) { - String p = skip(token); - int c = p.indexOf(','); - if (c < 0) { - group = p; - panel = null; - } else { - group = p.substring(0, c); - panel = p.substring(c + 1); - } - } else { - Gerrit.display(token, new NotFoundScreen()); - return; - } - - GroupApi.getGroupDetail(group, new GerritCallback() { + GWT.runAsync( + new AsyncSplit(token) { @Override - public void onSuccess(GroupInfo group) { - if (panel == null || panel.isEmpty()) { - // The token does not say which group screen should be shown, - // as default for internal groups show the members, as default - // for external and system groups show the info screen (since - // for external and system groups the members cannot be - // shown in the web UI). - // - if (AccountGroup.isInternalGroup(group.getGroupUUID())) { - String newToken = - toGroup(group.getGroupId(), AccountGroupScreen.MEMBERS); - Gerrit.display(newToken, - new AccountGroupMembersScreen(group, newToken)); + public void onSuccess() { + if (matchExact(ADMIN_GROUPS, token) || matchExact("/admin/groups", token)) { + Gerrit.display(token, new GroupListScreen()); + + } else if (matchPrefix(ADMIN_GROUPS, token)) { + String rest = skip(token); + if (rest.startsWith("?")) { + Gerrit.display(token, new GroupListScreen(rest.substring(1))); } else { - String newToken = - toGroup(group.getGroupId(), AccountGroupScreen.INFO); - Gerrit.display(newToken, - new AccountGroupInfoScreen(group, newToken)); + group(); } - } else if (AccountGroupScreen.INFO.equals(panel)) { - Gerrit.display(token, new AccountGroupInfoScreen(group, token)); - } else if (AccountGroupScreen.MEMBERS.equals(panel)) { - Gerrit.display(token, new AccountGroupMembersScreen(group, token)); - } else if (AccountGroupScreen.AUDIT_LOG.equals(panel)) { - Gerrit.display(token, new AccountGroupAuditLogScreen(group, token)); + + } else if (matchPrefix("/admin/groups", token)) { + String rest = skip(token); + if (rest.startsWith("?")) { + Gerrit.display(token, new GroupListScreen(rest.substring(1))); + } + + } else if (matchExact(ADMIN_PROJECTS, token) || matchExact("/admin/projects", token)) { + Gerrit.display(token, new ProjectListScreen()); + + } else if (matchPrefix(ADMIN_PROJECTS, token)) { + String rest = skip(token); + if (rest.startsWith("?")) { + Gerrit.display(token, new ProjectListScreen(rest.substring(1))); + } else { + Gerrit.display(token, selectProject()); + } + + } else if (matchPrefix("/admin/projects", token)) { + String rest = skip(token); + if (rest.startsWith("?")) { + Gerrit.display(token, new ProjectListScreen(rest.substring(1))); + } + + } else if (matchPrefix(ADMIN_PLUGINS, token) || matchExact("/admin/plugins", token)) { + Gerrit.display(token, new PluginListScreen()); + + } else if (matchExact(ADMIN_CREATE_PROJECT, token) + || matchExact("/admin/create-project", token)) { + Gerrit.display(token, new CreateProjectScreen()); + + } else if (matchExact(ADMIN_CREATE_GROUP, token) + || matchExact("/admin/create-group", token)) { + Gerrit.display(token, new CreateGroupScreen()); + } else { Gerrit.display(token, new NotFoundScreen()); } } - }); - } - private Screen selectProject() { - if (matchPrefix(ADMIN_PROJECTS, token)) { - String rest = skip(token); - int c = rest.lastIndexOf(','); - if (c < 0) { - return new ProjectInfoScreen(Project.NameKey.parse(rest)); - } else if (c == 0) { + private void group() { + final String panel; + final String group; + + if (matchPrefix("/admin/groups/uuid-", token)) { + String p = skip(token); + int c = p.indexOf(','); + if (c < 0) { + group = p; + panel = null; + } else { + group = p.substring(0, c); + panel = p.substring(c + 1); + } + } else if (matchPrefix(ADMIN_GROUPS, token)) { + String p = skip(token); + int c = p.indexOf(','); + if (c < 0) { + group = p; + panel = null; + } else { + group = p.substring(0, c); + panel = p.substring(c + 1); + } + } else { + Gerrit.display(token, new NotFoundScreen()); + return; + } + + GroupApi.getGroupDetail( + group, + new GerritCallback() { + @Override + public void onSuccess(GroupInfo group) { + if (panel == null || panel.isEmpty()) { + // The token does not say which group screen should be shown, + // as default for internal groups show the members, as default + // for external and system groups show the info screen (since + // for external and system groups the members cannot be + // shown in the web UI). + // + if (AccountGroup.isInternalGroup(group.getGroupUUID())) { + String newToken = toGroup(group.getGroupId(), AccountGroupScreen.MEMBERS); + Gerrit.display(newToken, new AccountGroupMembersScreen(group, newToken)); + } else { + String newToken = toGroup(group.getGroupId(), AccountGroupScreen.INFO); + Gerrit.display(newToken, new AccountGroupInfoScreen(group, newToken)); + } + } else if (AccountGroupScreen.INFO.equals(panel)) { + Gerrit.display(token, new AccountGroupInfoScreen(group, token)); + } else if (AccountGroupScreen.MEMBERS.equals(panel)) { + Gerrit.display(token, new AccountGroupMembersScreen(group, token)); + } else if (AccountGroupScreen.AUDIT_LOG.equals(panel)) { + Gerrit.display(token, new AccountGroupAuditLogScreen(group, token)); + } else { + Gerrit.display(token, new NotFoundScreen()); + } + } + }); + } + + private Screen selectProject() { + if (matchPrefix(ADMIN_PROJECTS, token)) { + String rest = skip(token); + int c = rest.lastIndexOf(','); + if (c < 0) { + return new ProjectInfoScreen(Project.NameKey.parse(rest)); + } else if (c == 0) { + return new NotFoundScreen(); + } + + int q = rest.lastIndexOf('?'); + if (q > 0 && rest.lastIndexOf(',', q) > 0) { + c = rest.substring(0, q - 1).lastIndexOf(','); + } + + Project.NameKey k = Project.NameKey.parse(rest.substring(0, c)); + String panel = rest.substring(c + 1); + + if (ProjectScreen.INFO.equals(panel)) { + return new ProjectInfoScreen(k); + } + + if (ProjectScreen.BRANCHES.equals(panel) + || matchPrefix(ProjectScreen.BRANCHES, panel)) { + return new ProjectBranchesScreen(k); + } + + if (ProjectScreen.TAGS.equals(panel) || matchPrefix(ProjectScreen.TAGS, panel)) { + return new ProjectTagsScreen(k); + } + + if (ProjectScreen.ACCESS.equals(panel)) { + return new ProjectAccessScreen(k); + } + + if (ProjectScreen.DASHBOARDS.equals(panel)) { + return new ProjectDashboardsScreen(k); + } + } return new NotFoundScreen(); } - - int q = rest.lastIndexOf('?'); - if (q > 0 && rest.lastIndexOf(',', q) > 0) { - c = rest.substring(0, q - 1).lastIndexOf(','); - } - - Project.NameKey k = Project.NameKey.parse(rest.substring(0, c)); - String panel = rest.substring(c + 1); - - if (ProjectScreen.INFO.equals(panel)) { - return new ProjectInfoScreen(k); - } - - if (ProjectScreen.BRANCHES.equals(panel) - || matchPrefix(ProjectScreen.BRANCHES, panel)) { - return new ProjectBranchesScreen(k); - } - - if (ProjectScreen.TAGS.equals(panel) - || matchPrefix(ProjectScreen.TAGS, panel)) { - return new ProjectTagsScreen(k); - } - - if (ProjectScreen.ACCESS.equals(panel)) { - return new ProjectAccessScreen(k); - } - - if (ProjectScreen.DASHBOARDS.equals(panel)) { - return new ProjectDashboardsScreen(k); - } - } - return new NotFoundScreen(); - } - }); + }); } private static boolean matchExact(String want, String token) { @@ -827,8 +829,7 @@ public class Dispatcher { @Override public final void onFailure(Throwable reason) { - if (!isReloadUi - && "HTTP download failed with status 404".equals(reason.getMessage())) { + if (!isReloadUi && "HTTP download failed with status 404".equals(reason.getMessage())) { // The server was upgraded since we last download the main script, // so the pointers to the splits aren't valid anymore. Force the // page to reload itself and pick up the new code. @@ -841,11 +842,12 @@ public class Dispatcher { } private static void docSearch(final String token) { - GWT.runAsync(new AsyncSplit(token) { - @Override - public void onSuccess() { - Gerrit.display(token, new DocScreen(skip(token))); - } - }); + GWT.runAsync( + new AsyncSplit(token) { + @Override + public void onSuccess() { + Gerrit.display(token, new DocScreen(skip(token))); + } + }); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ErrorDialog.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ErrorDialog.java index 87cb4b34b5..e8807126c4 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ErrorDialog.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ErrorDialog.java @@ -37,7 +37,7 @@ public class ErrorDialog extends PopupPanel { private final Button closey; protected ErrorDialog() { - super(/* auto hide */false, /* modal */true); + super(/* auto hide */ false, /* modal */ true); setGlassEnabled(true); getGlassElement().addClassName(Gerrit.RESOURCES.css().errorDialogGlass()); @@ -51,22 +51,24 @@ public class ErrorDialog extends PopupPanel { closey = new Button(); closey.setText(Gerrit.C.errorDialogContinue()); - closey.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - hide(); - } - }); - closey.addKeyPressHandler(new KeyPressHandler() { - @Override - public void onKeyPress(KeyPressEvent event) { - // if the close button is triggered by a key we need to consume the key - // event, otherwise the key event would be propagated to the parent - // screen and eventually trigger some unwanted action there after the - // error dialog was closed - event.stopPropagation(); - } - }); + closey.addClickHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + hide(); + } + }); + closey.addKeyPressHandler( + new KeyPressHandler() { + @Override + public void onKeyPress(KeyPressEvent event) { + // if the close button is triggered by a key we need to consume the key + // event, otherwise the key event would be propagated to the parent + // screen and eventually trigger some unwanted action there after the + // error dialog was closed + event.stopPropagation(); + } + }); buttons.add(closey); final FlowPanel center = new FlowPanel(); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/FormatUtil.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/FormatUtil.java index 3f0daa28d8..730726436e 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/FormatUtil.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/FormatUtil.java @@ -18,7 +18,6 @@ import com.google.gerrit.client.change.Resources; import com.google.gerrit.client.info.AccountInfo; import com.google.gerrit.client.info.GeneralPreferences; import com.google.gwt.i18n.client.NumberFormat; - import java.util.Date; /** Misc. formatting functions. */ @@ -60,13 +59,14 @@ public class FormatUtil { /** * Formats an account as a name and an email address. - *

- * Example output: + * + *

Example output: + * *

    - *
  • {@code A U. Thor <author@example.com>}: full populated
  • - *
  • {@code A U. Thor (12)}: missing email address
  • - *
  • {@code Anonymous Coward <author@example.com>}: missing name
  • - *
  • {@code Anonymous Coward (12)}: missing name and email address
  • + *
  • {@code A U. Thor <author@example.com>}: full populated + *
  • {@code A U. Thor (12)}: missing email address + *
  • {@code Anonymous Coward <author@example.com>}: missing name + *
  • {@code Anonymous Coward (12)}: missing name and email address *
*/ public static String nameEmail(AccountInfo info) { @@ -75,9 +75,9 @@ public class FormatUtil { /** * Formats an account name. - *

- * If the account has a full name, it returns only the full name. Otherwise it - * returns a longer form that includes the email address. + * + *

If the account has a full name, it returns only the full name. Otherwise it returns a longer + * form that includes the email address. */ public static String name(AccountInfo info) { return createAccountFormatter().name(info); @@ -121,7 +121,9 @@ public class FormatUtil { int exp = (int) (Math.log(Math.abs(bytes)) / Math.log(1024)); return (bytes > 0 && !abs ? "+" : "") + NumberFormat.getFormat("#.0").format(bytes / Math.pow(1024, exp)) - + " " + "KMGTPE".charAt(exp - 1) + "iB"; + + " " + + "KMGTPE".charAt(exp - 1) + + "iB"; } public static String formatPercentage(long size, long delta) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java index 68b8ec8d78..410ba3e85e 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java @@ -94,7 +94,6 @@ import com.google.gwtjsonrpc.client.JsonDefTarget; import com.google.gwtjsonrpc.client.JsonUtil; import com.google.gwtjsonrpc.client.XsrfManager; import com.google.gwtorm.client.KeyUtil; - import java.util.HashMap; import java.util.List; import java.util.Map; @@ -102,8 +101,7 @@ import java.util.Map; public class Gerrit implements EntryPoint { public static final GerritConstants C = GWT.create(GerritConstants.class); public static final GerritMessages M = GWT.create(GerritMessages.class); - public static final GerritResources RESOURCES = - GWT.create(GerritResources.class); + public static final GerritResources RESOURCES = GWT.create(GerritResources.class); public static final SystemInfoService SYSTEM_SVC; public static final EventBus EVENT_BUS = GWT.create(SimpleEventBus.class); public static final Themer THEMER = GWT.create(Themer.class); @@ -166,10 +164,9 @@ public class Gerrit implements EntryPoint { /** * Load the screen at the given location, displaying when ready. - *

- * If the URL is not already pointing at this location, a new item will be - * added to the browser's history when the screen is fully loaded and - * displayed on the UI. + * + *

If the URL is not already pointing at this location, a new item will be added to the + * browser's history when the screen is fully loaded and displayed on the UI. * * @param token location to parse, load, and render. */ @@ -182,14 +179,14 @@ public class Gerrit implements EntryPoint { /** * Load the screen passed, assuming token can be used to locate it. - *

- * The screen is loaded in the background. When it is ready to be visible a - * new item will be added to the browser's history, the screen will be made - * visible, and the window title may be updated. - *

- * If {@link Screen#isRequiresSignIn()} is true and the user is not signed in - * yet the screen instance will be discarded, sign-in will take place, and - * will redirect to this location upon success. + * + *

The screen is loaded in the background. When it is ready to be visible a new item will be + * added to the browser's history, the screen will be made visible, and the window title may be + * updated. + * + *

If {@link Screen#isRequiresSignIn()} is true and the user is not signed in yet the screen + * instance will be discarded, sign-in will take place, and will redirect to this location upon + * success. * * @param token location that refers to {@code view}. * @param view the view to load. @@ -213,11 +210,10 @@ public class Gerrit implements EntryPoint { /** * Update the current history token after a screen change. - *

- * The caller has already updated the UI, but wants to publish a different - * history token for the current browser state. This really only makes sense - * if the caller is a {@code TabPanel} and is firing an event when the tab - * changed to a different part. + * + *

The caller has already updated the UI, but wants to publish a different history token for + * the current browser state. This really only makes sense if the caller is a {@code TabPanel} and + * is firing an event when the tab changed to a different part. * * @param token new location that is already visible. */ @@ -296,7 +292,10 @@ public class Gerrit implements EntryPoint { return xGerritAuth; } - /** @return the preferences of the currently signed in user, the default preferences if not signed in */ + /** + * @return the preferences of the currently signed in user, the default preferences if not signed + * in + */ public static GeneralPreferences getUserPreferences() { return myPrefs; } @@ -396,17 +395,18 @@ public class Gerrit implements EntryPoint { private void setXsrfToken() { xGerritAuth = Cookies.getCookie(XSRF_COOKIE_NAME); - JsonUtil.setDefaultXsrfManager(new XsrfManager() { - @Override - public String getToken(JsonDefTarget proxy) { - return xGerritAuth; - } + JsonUtil.setDefaultXsrfManager( + new XsrfManager() { + @Override + public String getToken(JsonDefTarget proxy) { + return xGerritAuth; + } - @Override - public void setToken(JsonDefTarget proxy, String token) { - // Ignore the request, we always rely upon the cookie. - } - }); + @Override + public void setToken(JsonDefTarget proxy, String token) { + // Ignore the request, we always rely upon the cookie. + } + }); } @Override @@ -416,103 +416,117 @@ public class Gerrit implements EntryPoint { } setXsrfToken(); - KeyUtil.setEncoderImpl(new KeyUtil.Encoder() { - @Override - public String encode(String e) { - e = URL.encodeQueryString(e); - e = fixPathImpl(e); - e = fixColonImpl(e); - e = fixDoubleQuote(e); - return e; - } + KeyUtil.setEncoderImpl( + new KeyUtil.Encoder() { + @Override + public String encode(String e) { + e = URL.encodeQueryString(e); + e = fixPathImpl(e); + e = fixColonImpl(e); + e = fixDoubleQuote(e); + return e; + } - @Override - public String decode(final String e) { - return URL.decodeQueryString(e); - } + @Override + public String decode(final String e) { + return URL.decodeQueryString(e); + } - private native String fixPathImpl(String path) - /*-{ return path.replace(/%2F/g, "/"); }-*/; + private native String fixPathImpl(String path) + /*-{ return path.replace(/%2F/g, "/"); }-*/ ; - private native String fixColonImpl(String path) - /*-{ return path.replace(/%3A/g, ":"); }-*/; + private native String fixColonImpl(String path) + /*-{ return path.replace(/%3A/g, ":"); }-*/ ; - private native String fixDoubleQuote(String path) - /*-{ return path.replace(/%22/g, '"'); }-*/; - }); + private native String fixDoubleQuote(String path) + /*-{ return path.replace(/%22/g, '"'); }-*/ ; + }); initHostname(); Window.setTitle(M.windowTitle1(myHost)); RpcStatus.INSTANCE = new RpcStatus(); CallbackGroup cbg = new CallbackGroup(); - getDocIndex(cbg.add(new GerritCallback() { - @Override - public void onSuccess(DocInfo indexInfo) { - hasDocumentation = indexInfo != null; - docUrl = selfRedirect("/Documentation/"); - } - })); - ConfigServerApi.serverInfo(cbg.add(new GerritCallback() { - @Override - public void onSuccess(ServerInfo info) { - myServerInfo = info; - urlAliasMatcher = new UrlAliasMatcher(info.urlAliases()); - String du = info.gerrit().docUrl(); - if (du != null && !du.isEmpty()) { - hasDocumentation = true; - docUrl = du; - } - docSearch = info.gerrit().docSearch(); - } - })); - HostPageDataService hpd = GWT.create(HostPageDataService.class); - hpd.load(cbg.addFinal(new GerritCallback() { - @Override - public void onSuccess(final HostPageData result) { - Document.get().getElementById("gerrit_hostpagedata").removeFromParent(); - myTheme = result.theme; - isNoteDbEnabled = result.isNoteDbEnabled; - if (result.accountDiffPref != null) { - myAccountDiffPref = result.accountDiffPref; - } - if (result.accountDiffPref != null) { - // TODO: Support options on the GetDetail REST endpoint so that it can - // also return the preferences. Then we can fetch everything with a - // single request and we don't need the callback group anymore. - CallbackGroup cbg = new CallbackGroup(); - AccountApi.self().view("detail") - .get(cbg.add(new GerritCallback() { - @Override - public void onSuccess(AccountInfo result) { - myAccount = result; + getDocIndex( + cbg.add( + new GerritCallback() { + @Override + public void onSuccess(DocInfo indexInfo) { + hasDocumentation = indexInfo != null; + docUrl = selfRedirect("/Documentation/"); + } + })); + ConfigServerApi.serverInfo( + cbg.add( + new GerritCallback() { + @Override + public void onSuccess(ServerInfo info) { + myServerInfo = info; + urlAliasMatcher = new UrlAliasMatcher(info.urlAliases()); + String du = info.gerrit().docUrl(); + if (du != null && !du.isEmpty()) { + hasDocumentation = true; + docUrl = du; } - })); - AccountApi.self().view("preferences") - .get(cbg.add(new GerritCallback() { - @Override - public void onSuccess(GeneralPreferences prefs) { - myPrefs = prefs; - onModuleLoad2(result); - } - })); - AccountApi.getEditPreferences( - cbg.addFinal(new GerritCallback() { - @Override - public void onSuccess(EditPreferences prefs) { - EditPreferencesInfo prefsInfo = new EditPreferencesInfo(); - prefs.copyTo(prefsInfo); - editPrefs = prefsInfo; - } - })); - } else { - myAccount = AccountInfo.create(0, null, null, null); - myPrefs = GeneralPreferences.createDefault(); - editPrefs = null; - onModuleLoad2(result); - } - } - })); + docSearch = info.gerrit().docSearch(); + } + })); + HostPageDataService hpd = GWT.create(HostPageDataService.class); + hpd.load( + cbg.addFinal( + new GerritCallback() { + @Override + public void onSuccess(final HostPageData result) { + Document.get().getElementById("gerrit_hostpagedata").removeFromParent(); + myTheme = result.theme; + isNoteDbEnabled = result.isNoteDbEnabled; + if (result.accountDiffPref != null) { + myAccountDiffPref = result.accountDiffPref; + } + if (result.accountDiffPref != null) { + // TODO: Support options on the GetDetail REST endpoint so that it can + // also return the preferences. Then we can fetch everything with a + // single request and we don't need the callback group anymore. + CallbackGroup cbg = new CallbackGroup(); + AccountApi.self() + .view("detail") + .get( + cbg.add( + new GerritCallback() { + @Override + public void onSuccess(AccountInfo result) { + myAccount = result; + } + })); + AccountApi.self() + .view("preferences") + .get( + cbg.add( + new GerritCallback() { + @Override + public void onSuccess(GeneralPreferences prefs) { + myPrefs = prefs; + onModuleLoad2(result); + } + })); + AccountApi.getEditPreferences( + cbg.addFinal( + new GerritCallback() { + @Override + public void onSuccess(EditPreferences prefs) { + EditPreferencesInfo prefsInfo = new EditPreferencesInfo(); + prefs.copyTo(prefsInfo); + editPrefs = prefsInfo; + } + })); + } else { + myAccount = AccountInfo.create(0, null, null, null); + myPrefs = GeneralPreferences.createDefault(); + editPrefs = null; + onModuleLoad2(result); + } + } + })); } private native boolean canLoadInIFrame() /*-{ @@ -562,8 +576,7 @@ public class Gerrit implements EntryPoint { if (info().gerrit().webUis().contains(UiType.POLYGERRIT)) { btmmenu.add(new InlineLabel(" | ")); - uiSwitcherLink = new Anchor(C.newUi(), - getUiSwitcherUrl(History.getToken())); + uiSwitcherLink = new Anchor(C.newUi(), getUiSwitcherUrl(History.getToken())); uiSwitcherLink.setStyleName(""); btmmenu.add(uiSwitcherLink); } @@ -571,9 +584,7 @@ public class Gerrit implements EntryPoint { String reportBugUrl = info().gerrit().reportBugUrl(); if (reportBugUrl != null) { String reportBugText = info().gerrit().reportBugText(); - Anchor a = new Anchor( - reportBugText == null ? C.reportBug() : reportBugText, - reportBugUrl); + Anchor a = new Anchor(reportBugText == null ? C.reportBug() : reportBugText, reportBugUrl); a.setTarget("_blank"); a.setStyleName(""); btmmenu.add(new InlineLabel(" | ")); @@ -621,29 +632,29 @@ public class Gerrit implements EntryPoint { siteHeader = RootPanel.get("gerrit_header"); siteFooter = RootPanel.get("gerrit_footer"); - body = new ViewSite() { - @Override - protected void onShowView(Screen view) { - String token = view.getToken(); - History.newItem(token, false); - dispatchHistoryHooks(token); + body = + new ViewSite() { + @Override + protected void onShowView(Screen view) { + String token = view.getToken(); + History.newItem(token, false); + dispatchHistoryHooks(token); - if (view instanceof ChangeListScreen) { - lastChangeListToken = token; - } + if (view instanceof ChangeListScreen) { + lastChangeListToken = token; + } - super.onShowView(view); - view.onShowView(); - lastViewToken = token; - } - }; + super.onShowView(view); + view.onShowView(); + lastViewToken = token; + } + }; gBody.add(body); JsonUtil.addRpcStartHandler(RpcStatus.INSTANCE); JsonUtil.addRpcCompleteHandler(RpcStatus.INSTANCE); - gStarting.getElement().getParentElement().removeChild( - gStarting.getElement()); + gStarting.getElement().getParentElement().removeChild(gStarting.getElement()); RootPanel.detachNow(gStarting); ApiGlue.init(); @@ -651,28 +662,28 @@ public class Gerrit implements EntryPoint { populateBottomMenu(bottomMenu, hpd); refreshMenuBar(); - History.addValueChangeHandler(new ValueChangeHandler() { - @Override - public void onValueChange(ValueChangeEvent event) { - display(event.getValue()); - } - }); + History.addValueChangeHandler( + new ValueChangeHandler() { + @Override + public void onValueChange(ValueChangeEvent event) { + display(event.getValue()); + } + }); JumpKeys.register(body); saveDefaultTheme(); if (hpd.messages != null) { new MessageOfTheDayBar(hpd.messages).show(); } - PluginLoader.load(hpd.plugins, + PluginLoader.load( + hpd.plugins, hpd.pluginsLoadTimeout, new GerritCallback() { @Override public void onSuccess(VoidResult result) { String token = History.getToken(); if (token.isEmpty()) { - token = isSignedIn() - ? PageLinks.MINE - : PageLinks.toChangeQuery("status:open"); + token = isSignedIn() ? PageLinks.MINE : PageLinks.toChangeQuery("status:open"); } display(token); } @@ -680,7 +691,8 @@ public class Gerrit implements EntryPoint { } private void saveDefaultTheme() { - THEMER.init(Document.get().getElementById("gerrit_sitecss"), + THEMER.init( + Document.get().getElementById("gerrit_sitecss"), Document.get().getElementById("gerrit_header"), Document.get().getElementById("gerrit_footer")); } @@ -735,14 +747,14 @@ public class Gerrit implements EntryPoint { projectsBar.addItem(new ProjectLinkMenuItem(C.menuProjectsTags(), ProjectScreen.TAGS)); projectsBar.addItem(new ProjectLinkMenuItem(C.menuProjectsAccess(), ProjectScreen.ACCESS)); final LinkMenuItem dashboardsMenuItem = - new ProjectLinkMenuItem(C.menuProjectsDashboards(), - ProjectScreen.DASHBOARDS) { - @Override - protected boolean match(String token) { - return super.match(token) || - (!getTargetHistoryToken().isEmpty() && ("/admin" + token).startsWith(getTargetHistoryToken())); - } - }; + new ProjectLinkMenuItem(C.menuProjectsDashboards(), ProjectScreen.DASHBOARDS) { + @Override + protected boolean match(String token) { + return super.match(token) + || (!getTargetHistoryToken().isEmpty() + && ("/admin" + token).startsWith(getTargetHistoryToken())); + } + }; projectsBar.addItem(dashboardsMenuItem); menuLeft.add(projectsBar, C.menuProjects()); @@ -755,27 +767,34 @@ public class Gerrit implements EntryPoint { final LinkMenuBar pluginsBar = new LinkMenuBar(); menuBars.put(GerritTopMenu.PLUGINS.menuName, pluginsBar); - AccountCapabilities.all(new GerritCallback() { - @Override - public void onSuccess(AccountCapabilities result) { - if (result.canPerform(CREATE_PROJECT)) { - insertLink(projectsBar, C.menuProjectsCreate(), - PageLinks.ADMIN_CREATE_PROJECT, - projectsBar.getWidgetIndex(dashboardsMenuItem) + 1); - } - if (result.canPerform(CREATE_GROUP)) { - insertLink(peopleBar, C.menuPeopleGroupsCreate(), - PageLinks.ADMIN_CREATE_GROUP, - peopleBar.getWidgetIndex(groupsListMenuItem) + 1); - } - if (result.canPerform(VIEW_PLUGINS)) { - insertLink(pluginsBar, C.menuPluginsInstalled(), - PageLinks.ADMIN_PLUGINS, 0); - menuLeft.insert(pluginsBar, C.menuPlugins(), - menuLeft.getWidgetIndex(peopleBar) + 1); - } - } - }, CREATE_PROJECT, CREATE_GROUP, VIEW_PLUGINS); + AccountCapabilities.all( + new GerritCallback() { + @Override + public void onSuccess(AccountCapabilities result) { + if (result.canPerform(CREATE_PROJECT)) { + insertLink( + projectsBar, + C.menuProjectsCreate(), + PageLinks.ADMIN_CREATE_PROJECT, + projectsBar.getWidgetIndex(dashboardsMenuItem) + 1); + } + if (result.canPerform(CREATE_GROUP)) { + insertLink( + peopleBar, + C.menuPeopleGroupsCreate(), + PageLinks.ADMIN_CREATE_GROUP, + peopleBar.getWidgetIndex(groupsListMenuItem) + 1); + } + if (result.canPerform(VIEW_PLUGINS)) { + insertLink(pluginsBar, C.menuPluginsInstalled(), PageLinks.ADMIN_PLUGINS, 0); + menuLeft.insert( + pluginsBar, C.menuPlugins(), menuLeft.getWidgetIndex(peopleBar) + 1); + } + } + }, + CREATE_PROJECT, + CREATE_GROUP, + VIEW_PLUGINS); } if (hasDocumentation) { @@ -798,48 +817,55 @@ public class Gerrit implements EntryPoint { break; case OPENID: - menuRight.addItem(C.menuRegister(), new Command() { - @Override - public void execute() { - String t = History.getToken(); - if (t == null) { - t = ""; - } - doSignIn(PageLinks.REGISTER + t); - } - }); - menuRight.addItem(C.menuSignIn(), new Command() { - @Override - public void execute() { - doSignIn(History.getToken()); - } - }); + menuRight.addItem( + C.menuRegister(), + new Command() { + @Override + public void execute() { + String t = History.getToken(); + if (t == null) { + t = ""; + } + doSignIn(PageLinks.REGISTER + t); + } + }); + menuRight.addItem( + C.menuSignIn(), + new Command() { + @Override + public void execute() { + doSignIn(History.getToken()); + } + }); break; case OAUTH: - menuRight.addItem(C.menuSignIn(), new Command() { - @Override - public void execute() { - doSignIn(History.getToken()); - } - }); + menuRight.addItem( + C.menuSignIn(), + new Command() { + @Override + public void execute() { + doSignIn(History.getToken()); + } + }); break; case OPENID_SSO: - menuRight.addItem(C.menuSignIn(), new Command() { - @Override - public void execute() { - doSignIn(History.getToken()); - } - }); + menuRight.addItem( + C.menuSignIn(), + new Command() { + @Override + public void execute() { + doSignIn(History.getToken()); + } + }); break; case HTTP: case HTTP_LDAP: if (authInfo.loginUrl() != null) { - String signinText = authInfo.loginText() == null - ? C.menuSignIn() - : authInfo.loginText(); + String signinText = + authInfo.loginText() == null ? C.menuSignIn() : authInfo.loginText(); menuRight.add(anchor(signinText, authInfo.loginUrl())); } break; @@ -848,17 +874,18 @@ public class Gerrit implements EntryPoint { case LDAP_BIND: case CUSTOM_EXTENSION: if (authInfo.registerUrl() != null) { - String registerText = authInfo.registerText() == null - ? C.menuRegister() - : authInfo.registerText(); + String registerText = + authInfo.registerText() == null ? C.menuRegister() : authInfo.registerText(); menuRight.add(anchor(registerText, authInfo.registerUrl())); } - menuRight.addItem(C.menuSignIn(), new Command() { - @Override - public void execute() { - doSignIn(History.getToken()); - } - }); + menuRight.addItem( + C.menuSignIn(), + new Command() { + @Override + public void execute() { + doSignIn(History.getToken()); + } + }); break; case DEVELOPMENT_BECOME_ANY_ACCOUNT: @@ -866,36 +893,38 @@ public class Gerrit implements EntryPoint { break; } } - ConfigServerApi.topMenus(new GerritCallback() { - @Override - public void onSuccess(TopMenuList result) { - List topMenuExtensions = Natives.asList(result); - for (TopMenu menu : topMenuExtensions) { - String name = menu.getName(); - LinkMenuBar existingBar = menuBars.get(name); - LinkMenuBar bar = - existingBar != null ? existingBar : new LinkMenuBar(); - for (TopMenuItem item : Natives.asList(menu.getItems())) { - addMenuLink(bar, item); + ConfigServerApi.topMenus( + new GerritCallback() { + @Override + public void onSuccess(TopMenuList result) { + List topMenuExtensions = Natives.asList(result); + for (TopMenu menu : topMenuExtensions) { + String name = menu.getName(); + LinkMenuBar existingBar = menuBars.get(name); + LinkMenuBar bar = existingBar != null ? existingBar : new LinkMenuBar(); + for (TopMenuItem item : Natives.asList(menu.getItems())) { + addMenuLink(bar, item); + } + if (existingBar == null) { + menuBars.put(name, bar); + menuLeft.add(bar, name); + } + } } - if (existingBar == null) { - menuBars.put(name, bar); - menuLeft.add(bar, name); - } - } - } - }); + }); } public static void refreshUserPreferences() { if (isSignedIn()) { - AccountApi.self().view("preferences") - .get(new GerritCallback() { - @Override - public void onSuccess(GeneralPreferences prefs) { - setUserPreferences(prefs); - } - }); + AccountApi.self() + .view("preferences") + .get( + new GerritCallback() { + @Override + public void onSuccess(GeneralPreferences prefs) { + setUserPreferences(prefs); + } + }); } else { setUserPreferences(GeneralPreferences.createDefault()); } @@ -924,29 +953,28 @@ public class Gerrit implements EntryPoint { } private static void getDocIndex(final AsyncCallback cb) { - RequestBuilder req = - new RequestBuilder(RequestBuilder.HEAD, GWT.getHostPageBaseURL() - + INDEX); - req.setCallback(new RequestCallback() { - @Override - public void onResponseReceived(Request req, Response resp) { - switch (resp.getStatusCode()) { - case Response.SC_OK: - case Response.SC_MOVED_PERMANENTLY: - case Response.SC_MOVED_TEMPORARILY: - cb.onSuccess(DocInfo.create()); - break; - default: - cb.onSuccess(null); - break; - } - } + RequestBuilder req = new RequestBuilder(RequestBuilder.HEAD, GWT.getHostPageBaseURL() + INDEX); + req.setCallback( + new RequestCallback() { + @Override + public void onResponseReceived(Request req, Response resp) { + switch (resp.getStatusCode()) { + case Response.SC_OK: + case Response.SC_MOVED_PERMANENTLY: + case Response.SC_MOVED_TEMPORARILY: + cb.onSuccess(DocInfo.create()); + break; + default: + cb.onSuccess(null); + break; + } + } - @Override - public void onError(Request request, Throwable e) { - cb.onFailure(e); - } - }); + @Override + public void onError(Request request, Throwable e) { + cb.onFailure(e); + } + }); try { req.send(); } catch (RequestException e) { @@ -956,8 +984,7 @@ public class Gerrit implements EntryPoint { private static void whoAmI(boolean canLogOut) { AccountInfo account = getUserAccount(); - final UserPopupPanel userPopup = - new UserPopupPanel(account, canLogOut, true); + final UserPopupPanel userPopup = new UserPopupPanel(account, canLogOut, true); final FlowPanel userSummaryPanel = new FlowPanel(); class PopupHandler implements KeyDownHandler, ClickHandler { private void showHidePopup() { @@ -1006,49 +1033,48 @@ public class Gerrit implements EntryPoint { return a; } - private static LinkMenuItem addLink(final LinkMenuBar m, final String text, - final String historyToken) { + private static LinkMenuItem addLink( + final LinkMenuBar m, final String text, final String historyToken) { LinkMenuItem i = new LinkMenuItem(text, historyToken); m.addItem(i); return i; } - private static void insertLink(final LinkMenuBar m, final String text, - final String historyToken, final int beforeIndex) { + private static void insertLink( + final LinkMenuBar m, final String text, final String historyToken, final int beforeIndex) { m.insertItem(new LinkMenuItem(text, historyToken), beforeIndex); } private static LinkMenuItem addProjectLink(LinkMenuBar m, TopMenuItem item) { - LinkMenuItem i = new ProjectLinkMenuItem(item.getName(), item.getUrl()) { - @Override - protected void onScreenLoad(Project.NameKey project) { - String p = - panel.replace(PROJECT_NAME_MENU_VAR, - URL.encodeQueryString(project.get())); - if (!panel.startsWith("/x/") && !isAbsolute(panel)) { - UrlBuilder builder = new UrlBuilder(); - builder.setProtocol(Location.getProtocol()); - builder.setHost(Location.getHost()); - String port = Location.getPort(); - if (port != null && !port.isEmpty()) { - builder.setPort(Integer.parseInt(port)); + LinkMenuItem i = + new ProjectLinkMenuItem(item.getName(), item.getUrl()) { + @Override + protected void onScreenLoad(Project.NameKey project) { + String p = panel.replace(PROJECT_NAME_MENU_VAR, URL.encodeQueryString(project.get())); + if (!panel.startsWith("/x/") && !isAbsolute(panel)) { + UrlBuilder builder = new UrlBuilder(); + builder.setProtocol(Location.getProtocol()); + builder.setHost(Location.getHost()); + String port = Location.getPort(); + if (port != null && !port.isEmpty()) { + builder.setPort(Integer.parseInt(port)); + } + builder.setPath(Location.getPath()); + p = builder.buildString() + p; } - builder.setPath(Location.getPath()); - p = builder.buildString() + p; + getElement().setPropertyString("href", p); } - getElement().setPropertyString("href", p); - } - @Override - public void go() { - String href = getElement().getPropertyString("href"); - if (href.startsWith("#")) { - super.go(); - } else { - Window.open(href, getElement().getPropertyString("target"), ""); + @Override + public void go() { + String href = getElement().getPropertyString("href"); + if (href.startsWith("#")) { + super.go(); + } else { + Window.open(href, getElement().getPropertyString("target"), ""); + } } - } - }; + }; if (item.getTarget() != null && !item.getTarget().isEmpty()) { i.getElement().setAttribute("target", item.getTarget()); } @@ -1059,8 +1085,7 @@ public class Gerrit implements EntryPoint { return i; } - private static void addDocLink(final LinkMenuBar m, final String text, - final String href) { + private static void addDocLink(final LinkMenuBar m, final String text, final String href) { final Anchor atag = anchor(text, docUrl + href); atag.setTarget("_blank"); m.add(atag); @@ -1075,18 +1100,17 @@ public class Gerrit implements EntryPoint { } private static void addExtensionLink(LinkMenuBar m, TopMenuItem item) { - if (item.getUrl().startsWith("#") - && (item.getTarget() == null || item.getTarget().isEmpty())) { - LinkMenuItem a = - new LinkMenuItem(item.getName(), item.getUrl().substring(1)); + if (item.getUrl().startsWith("#") && (item.getTarget() == null || item.getTarget().isEmpty())) { + LinkMenuItem a = new LinkMenuItem(item.getName(), item.getUrl().substring(1)); if (item.getId() != null) { a.getElement().setAttribute("id", item.getId()); } m.addItem(a); } else { - Anchor atag = anchor(item.getName(), isAbsolute(item.getUrl()) - ? item.getUrl() - : selfRedirect(item.getUrl())); + Anchor atag = + anchor( + item.getName(), + isAbsolute(item.getUrl()) ? item.getUrl() : selfRedirect(item.getUrl())); if (item.getTarget() != null && !item.getTarget().isEmpty()) { atag.setTarget(item.getTarget()); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritConstants.java index b1448638bf..7d22e9b9c3 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritConstants.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritConstants.java @@ -18,37 +18,51 @@ import com.google.gwt.i18n.client.Constants; public interface GerritConstants extends Constants { String menuSignIn(); + String menuRegister(); + String reportBug(); + String loadingPlugins(); String signInDialogTitle(); + String signInDialogGoAnonymous(); String linkIdentityDialogTitle(); + String registerDialogTitle(); + String loginTypeUnsupported(); String errorTitle(); + String errorDialogContinue(); + String warnTitle(); String confirmationDialogOk(); + String confirmationDialogCancel(); String branchCreationDialogTitle(); + String branchCreationConfirmationMessage(); String branchDeletionDialogTitle(); + String branchDeletionConfirmationMessage(); String newUi(); String notSignedInTitle(); + String notSignedInBody(); String notFoundTitle(); + String notFoundBody(); + String noSuchAccountTitle(); String noSuchGroupTitle(); @@ -58,78 +72,124 @@ public interface GerritConstants extends Constants { String labelNotApplicable(); String menuAll(); + String menuAllOpen(); + String menuAllMerged(); + String menuAllAbandoned(); String menuMine(); + String menuMyChanges(); + String menuMyDrafts(); + String menuMyWatchedChanges(); + String menuMyStarredChanges(); + String menuMyDraftComments(); String menuDiff(); + String menuDiffCommit(); + String menuDiffPreferences(); + String menuDiffPatchSets(); + String menuDiffFiles(); String menuProjects(); + String menuProjectsList(); + String menuProjectsInfo(); + String menuProjectsBranches(); + String menuProjectsTags(); + String menuProjectsAccess(); + String menuProjectsDashboards(); + String menuProjectsCreate(); String menuPeople(); + String menuPeopleGroupsList(); + String menuPeopleGroupsCreate(); String menuPlugins(); + String menuPluginsInstalled(); String menuDocumentation(); + String menuDocumentationTOC(); + String menuDocumentationSearch(); + String menuDocumentationUpload(); + String menuDocumentationAccess(); + String menuDocumentationAPI(); + String menuDocumentationProjectOwnerGuide(); String searchHint(); + String searchButton(); String rpcStatusWorking(); String sectionNavigation(); + String sectionActions(); + String keySearch(); + String keyEditor(); + String keyHelp(); String sectionJumping(); + String jumpAllOpen(); + String jumpAllMerged(); + String jumpAllAbandoned(); + String jumpMine(); + String jumpMineDrafts(); + String jumpMineWatched(); + String jumpMineStarred(); + String jumpMineDraftComments(); String projectAccessError(); + String projectAccessProposeForReviewHint(); String userCannotVoteToolTip(); String stringListPanelAdd(); + String stringListPanelDelete(); + String stringListPanelUp(); + String stringListPanelDown(); String searchDropdownChanges(); + String searchDropdownDoc(); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritCss.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritCss.java index 30f33f1d24..968104c557 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritCss.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritCss.java @@ -18,143 +18,282 @@ import com.google.gwt.resources.client.CssResource; public interface GerritCss extends CssResource { String accountDashboard(); + String accountInfoBlock(); + String accountLinkPanel(); + String accountPassword(); + String accountUsername(); + String activeRow(); + String addBranch(); + String addMemberTextBox(); + String addSshKeyPanel(); + String addWatchPanel(); + String avatarInfoPanel(); + String bottomheader(); + String branchTableDeleteButton(); + String branchTablePrevNextLinks(); + String cAPPROVAL(); + String cASSIGNEE(); + String cASSIGNEDTOME(); + String cLastUpdate(); + String cOWNER(); + String cSIZE(); + String cSUBJECT(); + String cSTATUS(); + String changeSize(); + String changeTable(); + String changeTablePrevNextLinks(); + String commentedActionDialog(); + String commentedActionMessage(); + String contributorAgreementAlreadySubmitted(); + String contributorAgreementButton(); + String contributorAgreementLegal(); + String contributorAgreementShortDescription(); + String createProjectPanel(); + String dataCell(); + String dataCellHidden(); + String dataHeader(); + String dataHeaderHidden(); + String downloadBox(); + String downloadBoxTable(); + String downloadBoxTableCommandColumn(); + String downloadBoxSpacer(); + String downloadBoxScheme(); + String downloadBoxCopyLabel(); + String downloadLink(); + String downloadLinkCopyLabel(); + String downloadLinkHeader(); + String downloadLinkHeaderGap(); + String downloadLinkList(); + String downloadLink_Active(); + String editHeadButton(); + String emptySection(); + String errorDialog(); + String errorDialogButtons(); + String errorDialogErrorType(); + String errorDialogGlass(); + String errorDialogTitle(); + String extensionPanel(); + String loadingPluginsDialog(); + String gerritBody(); + String gerritTopMenu(); + String greenCheckClass(); + String groupDescriptionPanel(); + String groupIncludesTable(); + String groupMembersTable(); + String groupName(); + String groupNamePanel(); + String groupNameTextBox(); + String groupOptionsPanel(); + String groupOwnerPanel(); + String groupOwnerTextBox(); + String groupUUIDPanel(); + String header(); + String iconCell(); + String iconHeader(); + String identityUntrustedExternalId(); + String infoBlock(); + String inputFieldTypeHint(); + String labelNotApplicable(); + String leftMostCell(); + String link(); + String linkMenuBar(); + String linkMenuItemNotLast(); + String maxObjectSizeLimitEffectiveLabel(); + String menuBarUserName(); + String menuBarUserNameAvatar(); + String menuBarUserNameFocusPanel(); + String menuBarUserNamePanel(); + String menuItem(); + String menuScreenMenuBar(); + String needsReview(); + String negscore(); + String oauthExpires(); + String oauthInfoBlock(); + String oauthPanel(); + String oauthPanelCookieEntry(); + String oauthPanelCookieHeading(); + String oauthPanelNetRCEntry(); + String oauthPanelNetRCHeading(); + String oauthToken(); + String pagingLink(); + String patchSetActions(); + String pluginProjectConfigInheritedValue(); + String pluginsTable(); + String posscore(); + String projectActions(); + String projectFilterLabel(); + String projectFilterPanel(); + String projectNameColumn(); + String queryIcon(); + String rebaseContentPanel(); + String rebaseSuggestBox(); + String registerScreenExplain(); + String registerScreenNextLinks(); + String registerScreenSection(); + String rpcStatus(); + String screen(); + String screenHeader(); + String searchPanel(); + String suggestBoxPopup(); + String sectionHeader(); + String singleLine(); + String smallHeading(); + String specialBranchDataCell(); + String specialBranchIconCell(); + String sshHostKeyPanel(); + String sshHostKeyPanelFingerprintData(); + String sshHostKeyPanelHeading(); + String sshHostKeyPanelKnownHostEntry(); + String sshKeyPanelEncodedKey(); + String sshKeyPanelInvalid(); + String sshKeyTable(); + String stringListPanelButtons(); + String topmenu(); + String topmenuMenuLeft(); + String topmenuMenuRight(); + String topmenuTDglue(); + String topmenuTDmenu(); + String topmost(); + String userInfoPopup(); + String usernameField(); + String watchedProjectFilter(); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritMessages.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritMessages.java index 58442b8ba4..980529a3d7 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritMessages.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritMessages.java @@ -18,21 +18,31 @@ import com.google.gwt.i18n.client.Messages; public interface GerritMessages extends Messages { String windowTitle1(String hostname); + String windowTitle2(String section, String hostname); + String poweredBy(String version); String noSuchAccountMessage(String who); + String noSuchGroupMessage(String who); + String nameAlreadyUsedBody(String alreadyUsedName); String branchCreationFailed(String branchName, String error); + String invalidBranchName(String branchName); + String invalidRevision(String revision); + String branchCreationNotAllowedUnderRefnamePrefix(String refnamePrefix); + String branchAlreadyExists(String branchName); + String branchCreationConflict(String branchName, String existingBranchName); String pluginFailed(String scriptPath); + String cannotDownloadPlugin(String scriptPath); String parentUpdateFailed(String message); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/JumpKeys.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/JumpKeys.java index e38cf7d6e7..b8195805b7 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/JumpKeys.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/JumpKeys.java @@ -40,56 +40,64 @@ public class JumpKeys { static void register(final Widget body) { final KeyCommandSet jumps = new KeyCommandSet(); - jumps.add(new KeyCommand(0, 'o', Gerrit.C.jumpAllOpen()) { - @Override - public void onKeyPress(final KeyPressEvent event) { - Gerrit.display(PageLinks.toChangeQuery("status:open")); - } - }); - jumps.add(new KeyCommand(0, 'm', Gerrit.C.jumpAllMerged()) { - @Override - public void onKeyPress(final KeyPressEvent event) { - Gerrit.display(PageLinks.toChangeQuery("status:merged")); - } - }); - jumps.add(new KeyCommand(0, 'a', Gerrit.C.jumpAllAbandoned()) { - @Override - public void onKeyPress(final KeyPressEvent event) { - Gerrit.display(PageLinks.toChangeQuery("status:abandoned")); - } - }); + jumps.add( + new KeyCommand(0, 'o', Gerrit.C.jumpAllOpen()) { + @Override + public void onKeyPress(final KeyPressEvent event) { + Gerrit.display(PageLinks.toChangeQuery("status:open")); + } + }); + jumps.add( + new KeyCommand(0, 'm', Gerrit.C.jumpAllMerged()) { + @Override + public void onKeyPress(final KeyPressEvent event) { + Gerrit.display(PageLinks.toChangeQuery("status:merged")); + } + }); + jumps.add( + new KeyCommand(0, 'a', Gerrit.C.jumpAllAbandoned()) { + @Override + public void onKeyPress(final KeyPressEvent event) { + Gerrit.display(PageLinks.toChangeQuery("status:abandoned")); + } + }); if (Gerrit.isSignedIn()) { - jumps.add(new KeyCommand(0, 'i', Gerrit.C.jumpMine()) { - @Override - public void onKeyPress(final KeyPressEvent event) { - Gerrit.display(PageLinks.MINE); - } - }); - jumps.add(new KeyCommand(0, 'd', Gerrit.C.jumpMineDrafts()) { - @Override - public void onKeyPress(final KeyPressEvent event) { - Gerrit.display(PageLinks.toChangeQuery("owner:self is:draft")); - } - }); - jumps.add(new KeyCommand(0, 'c', Gerrit.C.jumpMineDraftComments()) { - @Override - public void onKeyPress(final KeyPressEvent event) { - Gerrit.display(PageLinks.toChangeQuery("has:draft")); - } - }); - jumps.add(new KeyCommand(0, 'w', Gerrit.C.jumpMineWatched()) { - @Override - public void onKeyPress(final KeyPressEvent event) { - Gerrit.display(PageLinks.toChangeQuery("is:watched status:open")); - } - }); - jumps.add(new KeyCommand(0, 's', Gerrit.C.jumpMineStarred()) { - @Override - public void onKeyPress(final KeyPressEvent event) { - Gerrit.display(PageLinks.toChangeQuery("is:starred")); - } - }); + jumps.add( + new KeyCommand(0, 'i', Gerrit.C.jumpMine()) { + @Override + public void onKeyPress(final KeyPressEvent event) { + Gerrit.display(PageLinks.MINE); + } + }); + jumps.add( + new KeyCommand(0, 'd', Gerrit.C.jumpMineDrafts()) { + @Override + public void onKeyPress(final KeyPressEvent event) { + Gerrit.display(PageLinks.toChangeQuery("owner:self is:draft")); + } + }); + jumps.add( + new KeyCommand(0, 'c', Gerrit.C.jumpMineDraftComments()) { + @Override + public void onKeyPress(final KeyPressEvent event) { + Gerrit.display(PageLinks.toChangeQuery("has:draft")); + } + }); + jumps.add( + new KeyCommand(0, 'w', Gerrit.C.jumpMineWatched()) { + @Override + public void onKeyPress(final KeyPressEvent event) { + Gerrit.display(PageLinks.toChangeQuery("is:watched status:open")); + } + }); + jumps.add( + new KeyCommand(0, 's', Gerrit.C.jumpMineStarred()) { + @Override + public void onKeyPress(final KeyPressEvent event) { + Gerrit.display(PageLinks.toChangeQuery("is:starred")); + } + }); } keys = new KeyCommandSet(Gerrit.C.sectionJumping()); @@ -98,6 +106,5 @@ public class JumpKeys { activeHandler = GlobalKey.add(body, keys); } - private JumpKeys() { - } + private JumpKeys() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/MessageOfTheDayBar.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/MessageOfTheDayBar.java index de1bd93380..36fa6e8279 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/MessageOfTheDayBar.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/MessageOfTheDayBar.java @@ -28,13 +28,13 @@ import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwtexpui.safehtml.client.SafeHtml; import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder; - import java.util.ArrayList; import java.util.List; /** Displays pending messages from the server. */ class MessageOfTheDayBar extends Composite { interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); private final List motd; diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/NotSignedInDialog.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/NotSignedInDialog.java index a372f035bd..cd5197a069 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/NotSignedInDialog.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/NotSignedInDialog.java @@ -33,7 +33,7 @@ public class NotSignedInDialog extends PopupPanel implements CloseHandler paramSuggester = Arrays.asList( - new ParamSuggester(Arrays.asList("project:", "p:", "parentproject:"), - new ProjectNameSuggestOracle()), - new ParamSuggester(Arrays.asList( - "owner:", "o:", "reviewer:", "r:", "commentby:", "reviewedby:", - "author:", "committer:", "from:", "assignee:"), - new AccountSuggestOracle() { - @Override - public void onRequestSuggestions(final Request request, final Callback done) { - super.onRequestSuggestions(request, new Callback() { + private static final List paramSuggester = + Arrays.asList( + new ParamSuggester( + Arrays.asList("project:", "p:", "parentproject:"), new ProjectNameSuggestOracle()), + new ParamSuggester( + Arrays.asList( + "owner:", + "o:", + "reviewer:", + "r:", + "commentby:", + "reviewedby:", + "author:", + "committer:", + "from:", + "assignee:"), + new AccountSuggestOracle() { @Override - public void onSuggestionsReady(final Request request, - final Response response) { - if ("self".startsWith(request.getQuery())) { - final ArrayList r = - new ArrayList<>(response.getSuggestions().size() + 1); - r.addAll(response.getSuggestions()); - r.add(new SuggestOracle.Suggestion() { - @Override - public String getDisplayString() { - return getReplacementString(); - } - @Override - public String getReplacementString() { - return "self"; - } - }); - response.setSuggestions(r); - } - done.onSuggestionsReady(request, response); + public void onRequestSuggestions(final Request request, final Callback done) { + super.onRequestSuggestions( + request, + new Callback() { + @Override + public void onSuggestionsReady( + final Request request, final Response response) { + if ("self".startsWith(request.getQuery())) { + final ArrayList r = + new ArrayList<>(response.getSuggestions().size() + 1); + r.addAll(response.getSuggestions()); + r.add( + new SuggestOracle.Suggestion() { + @Override + public String getDisplayString() { + return getReplacementString(); + } + + @Override + public String getReplacementString() { + return "self"; + } + }); + response.setSuggestions(r); + } + done.onSuggestionsReady(request, response); + } + }); } - }); - } - }), - new ParamSuggester(Arrays.asList("ownerin:", "reviewerin:"), - new AccountGroupSuggestOracle())); + }), + new ParamSuggester( + Arrays.asList("ownerin:", "reviewerin:"), new AccountGroupSuggestOracle())); private static final TreeSet suggestions = new TreeSet<>(); @@ -216,12 +229,14 @@ public class SearchSuggestOracle extends HighlightSuggestOracle { private static class SearchSuggestion implements SuggestOracle.Suggestion { private final String suggestion; private final String fullQuery; + SearchSuggestion(String suggestion, String fullQuery) { this.suggestion = suggestion; // Add a space to the query if it is a complete operation (e.g. // "status:open") so the user can keep on typing. this.fullQuery = fullQuery.endsWith(":") ? fullQuery : fullQuery + " "; } + @Override public String getDisplayString() { return suggestion; @@ -237,8 +252,7 @@ public class SearchSuggestOracle extends HighlightSuggestOracle { private final List operators; private final SuggestOracle parameterSuggestionOracle; - ParamSuggester(final List operators, - final SuggestOracle parameterSuggestionOracle) { + ParamSuggester(final List operators, final SuggestOracle parameterSuggestionOracle) { this.operators = operators; this.parameterSuggestionOracle = parameterSuggestionOracle; } @@ -248,8 +262,7 @@ public class SearchSuggestOracle extends HighlightSuggestOracle { return operator != null && query.length() > operator.length(); } - private String getApplicableOperator(final String lastWord, - final List operators) { + private String getApplicableOperator(final String lastWord, final List operators) { for (final String operator : operators) { if (lastWord.startsWith(operator)) { return operator; @@ -264,16 +277,17 @@ public class SearchSuggestOracle extends HighlightSuggestOracle { new Request(lastWord.substring(operator.length()), request.getLimit()), new Callback() { @Override - public void onSuggestionsReady(final Request req, - final Response response) { + public void onSuggestionsReady(final Request req, final Response response) { final String query = request.getQuery(); final List r = new ArrayList<>(response.getSuggestions().size()); - for (final SearchSuggestOracle.Suggestion s : response - .getSuggestions()) { - r.add(new SearchSuggestion(s.getDisplayString(), - query.substring(0, query.length() - lastWord.length()) + - operator + quoteIfNeeded(s.getReplacementString()))); + for (final SearchSuggestOracle.Suggestion s : response.getSuggestions()) { + r.add( + new SearchSuggestion( + s.getDisplayString(), + query.substring(0, query.length() - lastWord.length()) + + operator + + quoteIfNeeded(s.getReplacementString()))); } done.onSuggestionsReady(request, new Response(r)); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/StringListPanel.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/StringListPanel.java index bc36654157..1a1f7bd32a 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/StringListPanel.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/StringListPanel.java @@ -35,7 +35,6 @@ import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.ImageResourceRenderer; import com.google.gwtexpui.globalkey.client.NpTextBox; - import java.util.ArrayList; import java.util.List; @@ -47,8 +46,7 @@ public class StringListPanel extends FlowPanel implements HasEnabled { private Image info; protected FocusWidget widget; - public StringListPanel(String title, List fieldNames, FocusWidget w, - boolean autoSort) { + public StringListPanel(String title, List fieldNames, FocusWidget w, boolean autoSort) { widget = w; if (title != null) { titlePanel = new HorizontalPanel(); @@ -64,13 +62,14 @@ public class StringListPanel extends FlowPanel implements HasEnabled { buttonPanel.setStyleName(Gerrit.RESOURCES.css().stringListPanelButtons()); deleteButton = new Button(Gerrit.C.stringListPanelDelete()); deleteButton.setEnabled(false); - deleteButton.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - widget.setEnabled(true); - t.deleteChecked(); - } - }); + deleteButton.addClickHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + widget.setEnabled(true); + t.deleteChecked(); + } + }); buttonPanel.add(deleteButton); add(buttonPanel); } @@ -110,8 +109,7 @@ public class StringListPanel extends FlowPanel implements HasEnabled { StringListTable(List names, boolean autoSort) { this.autoSort = autoSort; - addButton = - new Button(new ImageResourceRenderer().render(Gerrit.RESOURCES.listAdd())); + addButton = new Button(new ImageResourceRenderer().render(Gerrit.RESOURCES.listAdd())); addButton.setTitle(Gerrit.C.stringListPanelAdd()); OnEditEnabler e = new OnEditEnabler(addButton); inputs = new ArrayList<>(); @@ -125,15 +123,16 @@ public class StringListPanel extends FlowPanel implements HasEnabled { NpTextBox input = new NpTextBox(); input.setVisibleLength(35); - input.addKeyPressHandler(new KeyPressHandler() { - @Override - public void onKeyPress(KeyPressEvent event) { - if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) { - widget.setEnabled(true); - add(); - } - } - }); + input.addKeyPressHandler( + new KeyPressHandler() { + @Override + public void onKeyPress(KeyPressEvent event) { + if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) { + widget.setEnabled(true); + add(); + } + } + }); inputs.add(input); fmt.addStyleName(1, i + 1, Gerrit.RESOURCES.css().dataHeader()); table.setWidget(1, i + 1, input); @@ -141,13 +140,14 @@ public class StringListPanel extends FlowPanel implements HasEnabled { } addButton.setEnabled(false); - addButton.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - widget.setEnabled(true); - add(); - } - }); + addButton.addClickHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + widget.setEnabled(true); + add(); + } + }); fmt.addStyleName(1, 0, Gerrit.RESOURCES.css().iconHeader()); fmt.addStyleName(1, 0, Gerrit.RESOURCES.css().leftMostCell()); table.setWidget(1, 0, addButton); @@ -194,12 +194,13 @@ public class StringListPanel extends FlowPanel implements HasEnabled { fmt.addStyleName(row, 0, Gerrit.RESOURCES.css().iconCell()); fmt.addStyleName(row, 0, Gerrit.RESOURCES.css().leftMostCell()); CheckBox checkBox = new CheckBox(); - checkBox.addValueChangeHandler(new ValueChangeHandler() { - @Override - public void onValueChange(ValueChangeEvent event) { - enableDelete(); - } - }); + checkBox.addValueChangeHandler( + new ValueChangeHandler() { + @Override + public void onValueChange(ValueChangeEvent event) { + enableDelete(); + } + }); table.setWidget(row, 0, checkBox); for (int i = 0; i < values.size(); i++) { fmt.addStyleName(row, i + 1, Gerrit.RESOURCES.css().dataCell()); @@ -211,30 +212,31 @@ public class StringListPanel extends FlowPanel implements HasEnabled { Image down = new Image(Gerrit.RESOURCES.arrowDown()); down.setTitle(Gerrit.C.stringListPanelDown()); - down.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - moveDown(row); - } - }); + down.addClickHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + moveDown(row); + } + }); table.setWidget(row, values.size() + 1, down); Image up = new Image(Gerrit.RESOURCES.arrowUp()); up.setTitle(Gerrit.C.stringListPanelUp()); - up.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - moveUp(row); - } - }); + up.addClickHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + moveUp(row); + } + }); table.setWidget(row, values.size() + 2, up); } } @Override protected void onCellSingleClick(Event event, int row, int column) { - if (column == inputs.size() + 1 && row >= 2 - && row < table.getRowCount() - 2) { + if (column == inputs.size() + 1 && row >= 2 && row < table.getRowCount() - 2) { moveDown(row); } else if (column == inputs.size() + 2 && row > 2) { moveUp(row); @@ -265,8 +267,7 @@ public class StringListPanel extends FlowPanel implements HasEnabled { private void updateNavigationLinks() { if (!autoSort) { for (int row = 2; row < table.getRowCount(); row++) { - table.getWidget(row, inputs.size() + 1).setVisible( - row < table.getRowCount() - 1); + table.getWidget(row, inputs.size() + 1).setVisible(row < table.getRowCount() - 1); table.getWidget(row, inputs.size() + 2).setVisible(row > 2); } } @@ -286,7 +287,7 @@ public class StringListPanel extends FlowPanel implements HasEnabled { if (autoSort) { for (int row = 1; row < table.getRowCount(); row++) { int compareResult = v.get(0).compareTo(table.getText(row, 1)); - if (compareResult < 0) { + if (compareResult < 0) { insertPos = row; break; } else if (compareResult == 0) { @@ -320,8 +321,7 @@ public class StringListPanel extends FlowPanel implements HasEnabled { } @Override - protected void onOpenRow(int row) { - } + protected void onOpenRow(int row) {} @Override protected Object getRowItemKey(List item) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Themer.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Themer.java index ceb50a8c8e..d87c0b8646 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Themer.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Themer.java @@ -20,8 +20,7 @@ import com.google.gwt.dom.client.StyleElement; public class Themer { public static class ThemerIE extends Themer { - protected ThemerIE() { - } + protected ThemerIE() {} @Override protected String getCssText(StyleElement el) { @@ -41,12 +40,12 @@ public class Themer { protected String headerHtml; protected String footerHtml; - protected Themer() { - } + protected Themer() {} public void set(ThemeInfo theme) { if (theme != null) { - set(theme.css() != null ? theme.css() : cssText, + set( + theme.css() != null ? theme.css() : cssText, theme.header() != null ? theme.header() : headerHtml, theme.footer() != null ? theme.footer() : footerHtml); } else { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/UrlAliasMatcher.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/UrlAliasMatcher.java index f4ba870e13..acaaf46c04 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/UrlAliasMatcher.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/UrlAliasMatcher.java @@ -15,7 +15,6 @@ package com.google.gerrit.client; import com.google.gwt.regexp.shared.RegExp; - import java.util.HashMap; import java.util.Map; diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/UserPopupPanel.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/UserPopupPanel.java index 092479675e..40116af9d3 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/UserPopupPanel.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/UserPopupPanel.java @@ -27,9 +27,12 @@ import com.google.gwt.user.client.ui.Widget; public class UserPopupPanel extends PopupPanel { interface Binder extends UiBinder {} + private static final Binder binder = GWT.create(Binder.class); - @UiField(provided = true) AvatarImage avatar; + @UiField(provided = true) + AvatarImage avatar; + @UiField Label userName; @UiField Label userEmail; @UiField Element userLinks; @@ -37,9 +40,8 @@ public class UserPopupPanel extends PopupPanel { @UiField AnchorElement logout; @UiField InlineHyperlink settings; - public UserPopupPanel(AccountInfo account, boolean canLogOut, - boolean showSettingsLink) { - super(/* auto hide */true, /* modal */false); + public UserPopupPanel(AccountInfo account, boolean canLogOut, boolean showSettingsLink) { + super(/* auto hide */ true, /* modal */ false); avatar = new AvatarImage(account, 100, false); setWidget(binder.createAndBindUi(this)); setStyleName(Gerrit.RESOURCES.css().userInfoPopup()); @@ -52,8 +54,7 @@ public class UserPopupPanel extends PopupPanel { if (showSettingsLink) { if (Gerrit.info().auth().switchAccountUrl() != null) { switchAccount.setHref(Gerrit.info().auth().switchAccountUrl()); - } else if (Gerrit.info().auth().isDev() - || Gerrit.info().auth().isOpenId()) { + } else if (Gerrit.info().auth().isDev() || Gerrit.info().auth().isOpenId()) { switchAccount.setHref(Gerrit.selfRedirect("/login")); } else { switchAccount.removeFromParent(); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/VoidResult.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/VoidResult.java index d7bcd0cac8..810ebe79c3 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/VoidResult.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/VoidResult.java @@ -17,8 +17,7 @@ package com.google.gerrit.client; import com.google.gwt.core.client.JavaScriptObject; public final class VoidResult extends JavaScriptObject { - protected VoidResult() { - } + protected VoidResult() {} public static VoidResult create() { return createObject().cast(); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/access/AccessMap.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/access/AccessMap.java index 629f725fc0..39a52e3ccd 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/access/AccessMap.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/access/AccessMap.java @@ -18,14 +18,12 @@ import com.google.gerrit.client.rpc.NativeMap; import com.google.gerrit.client.rpc.RestApi; import com.google.gerrit.reviewdb.client.Project; import com.google.gwt.user.client.rpc.AsyncCallback; - import java.util.Collections; import java.util.Set; /** Access rights available from {@code /access/}. */ public class AccessMap extends NativeMap { - public static void get(Set projects, - AsyncCallback callback) { + public static void get(Set projects, AsyncCallback callback) { RestApi api = new RestApi("/access/"); for (Project.NameKey p : projects) { api.addParameter("project", p.get()); @@ -33,21 +31,21 @@ public class AccessMap extends NativeMap { api.get(NativeMap.copyKeysIntoChildren(callback)); } - public static void get(final Project.NameKey project, - final AsyncCallback cb) { - get(Collections.singleton(project), new AsyncCallback() { - @Override - public void onSuccess(AccessMap result) { - cb.onSuccess(result.get(project.get())); - } + public static void get(final Project.NameKey project, final AsyncCallback cb) { + get( + Collections.singleton(project), + new AsyncCallback() { + @Override + public void onSuccess(AccessMap result) { + cb.onSuccess(result.get(project.get())); + } - @Override - public void onFailure(Throwable caught) { - cb.onFailure(caught); - } - }); + @Override + public void onFailure(Throwable caught) { + cb.onFailure(caught); + } + }); } - protected AccessMap() { - } + protected AccessMap() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/access/ProjectAccessInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/access/ProjectAccessInfo.java index ae93a83e29..b115c7d229 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/access/ProjectAccessInfo.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/access/ProjectAccessInfo.java @@ -18,9 +18,10 @@ import com.google.gwt.core.client.JavaScriptObject; public class ProjectAccessInfo extends JavaScriptObject { public final native boolean canAddRefs() /*-{ return this.can_add ? true : false; }-*/; + public final native boolean isOwner() /*-{ return this.is_owner ? true : false; }-*/; + public final native boolean configVisible() /*-{ return this.config_visible ? true : false; }-*/; - protected ProjectAccessInfo() { - } + protected ProjectAccessInfo() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountApi.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountApi.java index 9aca859bc6..7e23b6c563 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountApi.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountApi.java @@ -27,14 +27,10 @@ import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArray; import com.google.gwt.core.client.JsArrayString; import com.google.gwt.user.client.rpc.AsyncCallback; - import java.util.HashSet; import java.util.Set; -/** - * A collection of static methods which work on the Gerrit REST API for specific - * accounts. - */ +/** A collection of static methods which work on the Gerrit REST API for specific accounts. */ public class AccountApi { public static RestApi self() { return new RestApi("/accounts/").view("self"); @@ -46,23 +42,20 @@ public class AccountApi { } /** Put the account edit preferences */ - public static void putEditPreferences(EditPreferences in, - AsyncCallback cb) { + public static void putEditPreferences(EditPreferences in, AsyncCallback cb) { self().view("preferences.edit").put(in, cb); } - public static void suggest(String query, int limit, - AsyncCallback> cb) { + public static void suggest(String query, int limit, AsyncCallback> cb) { new RestApi("/accounts/") - .addParameterTrue("suggest") - .addParameter("q", query) - .addParameter("n", limit) - .background() - .get(cb); + .addParameterTrue("suggest") + .addParameter("q", query) + .addParameter("n", limit) + .background() + .get(cb); } - public static void putDiffPreferences(DiffPreferences in, - AsyncCallback cb) { + public static void putDiffPreferences(DiffPreferences in, AsyncCallback cb) { self().view("preferences.diff").put(in, cb); } @@ -72,8 +65,7 @@ public class AccountApi { } /** Set the username */ - public static void setUsername(String account, String username, - AsyncCallback cb) { + public static void setUsername(String account, String username, AsyncCallback cb) { UsernameInput input = UsernameInput.create(); input.username(username); new RestApi("/accounts/").id(account).view("username").put(input, cb); @@ -85,50 +77,42 @@ public class AccountApi { } /** Set the account name */ - public static void setName(String account, String name, - AsyncCallback cb) { + public static void setName(String account, String name, AsyncCallback cb) { AccountNameInput input = AccountNameInput.create(); input.name(name); new RestApi("/accounts/").id(account).view("name").put(input, cb); } /** Retrieve email addresses */ - public static void getEmails(String account, - AsyncCallback> cb) { + public static void getEmails(String account, AsyncCallback> cb) { new RestApi("/accounts/").id(account).view("emails").get(cb); } /** Register a new email address */ - public static void registerEmail(String account, String email, - AsyncCallback cb) { + public static void registerEmail(String account, String email, AsyncCallback cb) { JavaScriptObject in = JavaScriptObject.createObject(); - new RestApi("/accounts/").id(account).view("emails").id(email) - .ifNoneMatch().put(in, cb); + new RestApi("/accounts/").id(account).view("emails").id(email).ifNoneMatch().put(in, cb); } /** Set preferred email address */ - public static void setPreferredEmail(String account, String email, - AsyncCallback cb) { - new RestApi("/accounts/").id(account).view("emails") - .id(email).view("preferred").put(cb); + public static void setPreferredEmail( + String account, String email, AsyncCallback cb) { + new RestApi("/accounts/").id(account).view("emails").id(email).view("preferred").put(cb); } /** Retrieve SSH keys */ - public static void getSshKeys(String account, - AsyncCallback> cb) { + public static void getSshKeys(String account, AsyncCallback> cb) { new RestApi("/accounts/").id(account).view("sshkeys").get(cb); } /** Add a new SSH keys */ - public static void addSshKey(String account, String sshPublicKey, - AsyncCallback cb) { - new RestApi("/accounts/").id(account).view("sshkeys") - .post(sshPublicKey, cb); + public static void addSshKey(String account, String sshPublicKey, AsyncCallback cb) { + new RestApi("/accounts/").id(account).view("sshkeys").post(sshPublicKey, cb); } /** Retrieve Watched Projects */ - public static void getWatchedProjects(String account, - AsyncCallback> cb) { + public static void getWatchedProjects( + String account, AsyncCallback> cb) { new RestApi("/accounts/").id(account).view("watched.projects").get(cb); } @@ -175,53 +159,46 @@ public class AccountApi { } /** - * Delete SSH keys. For each key to be deleted a separate DELETE request is - * fired to the server. The {@code onSuccess} method of the provided callback - * is invoked once after all requests succeeded. If any request fails the - * callbacks' {@code onFailure} method is invoked. In a failure case it can be - * that still some of the keys were successfully deleted. + * Delete SSH keys. For each key to be deleted a separate DELETE request is fired to the server. + * The {@code onSuccess} method of the provided callback is invoked once after all requests + * succeeded. If any request fails the callbacks' {@code onFailure} method is invoked. In a + * failure case it can be that still some of the keys were successfully deleted. */ - public static void deleteSshKeys(String account, - Set sequenceNumbers, AsyncCallback cb) { + public static void deleteSshKeys( + String account, Set sequenceNumbers, AsyncCallback cb) { CallbackGroup group = new CallbackGroup(); for (int seq : sequenceNumbers) { - new RestApi("/accounts/").id(account).view("sshkeys").id(seq) - .delete(group.add(cb)); + new RestApi("/accounts/").id(account).view("sshkeys").id(seq).delete(group.add(cb)); cb = CallbackGroup.emptyCallback(); } group.done(); } /** Retrieve the HTTP password */ - public static void getHttpPassword(String account, - AsyncCallback cb) { + public static void getHttpPassword(String account, AsyncCallback cb) { new RestApi("/accounts/").id(account).view("password.http").get(cb); } /** Generate a new HTTP password */ - public static void generateHttpPassword(String account, - AsyncCallback cb) { + public static void generateHttpPassword(String account, AsyncCallback cb) { HttpPasswordInput in = HttpPasswordInput.create(); in.generate(true); new RestApi("/accounts/").id(account).view("password.http").put(in, cb); } /** Clear HTTP password */ - public static void clearHttpPassword(String account, - AsyncCallback cb) { + public static void clearHttpPassword(String account, AsyncCallback cb) { new RestApi("/accounts/").id(account).view("password.http").delete(cb); } /** Enter a contributor agreement */ - public static void enterAgreement(String account, String name, - AsyncCallback cb) { + public static void enterAgreement(String account, String name, AsyncCallback cb) { AgreementInput in = AgreementInput.create(); in.name(name); new RestApi("/accounts/").id(account).view("agreements").put(in, cb); } - private static JsArray projectWatchArrayFromSet( - Set set) { + private static JsArray projectWatchArrayFromSet(Set set) { JsArray jsArray = JsArray.createArray().cast(); for (ProjectWatchInfo p : set) { jsArray.push(p); @@ -236,8 +213,7 @@ public class AccountApi { return createObject().cast(); } - protected AgreementInput() { - } + protected AgreementInput() {} } private static class HttpPasswordInput extends JavaScriptObject { @@ -247,8 +223,7 @@ public class AccountApi { return createObject().cast(); } - protected HttpPasswordInput() { - } + protected HttpPasswordInput() {} } private static class UsernameInput extends JavaScriptObject { @@ -258,8 +233,7 @@ public class AccountApi { return createObject().cast(); } - protected UsernameInput() { - } + protected UsernameInput() {} } private static class AccountNameInput extends JavaScriptObject { @@ -269,29 +243,24 @@ public class AccountApi { return createObject().cast(); } - protected AccountNameInput() { - } + protected AccountNameInput() {} } - public static void addGpgKey(String account, String armored, - AsyncCallback> cb) { - new RestApi("/accounts/") - .id(account) - .view("gpgkeys") - .post(GpgKeysInput.add(armored), cb); + public static void addGpgKey( + String account, String armored, AsyncCallback> cb) { + new RestApi("/accounts/").id(account).view("gpgkeys").post(GpgKeysInput.add(armored), cb); } - public static void deleteGpgKeys(String account, - Iterable fingerprints, AsyncCallback> cb) { + public static void deleteGpgKeys( + String account, Iterable fingerprints, AsyncCallback> cb) { new RestApi("/accounts/") - .id(account) - .view("gpgkeys") - .post(GpgKeysInput.delete(fingerprints), cb); + .id(account) + .view("gpgkeys") + .post(GpgKeysInput.delete(fingerprints), cb); } /** List contributor agreements */ - public static void getAgreements(String account, - AsyncCallback> cb) { + public static void getAgreements(String account, AsyncCallback> cb) { new RestApi("/accounts/").id(account).view("agreements").get(cb); } @@ -308,12 +277,10 @@ public class AccountApi { return {'add': keys}; }-*/; - private static native GpgKeysInput createWithDelete( - JsArrayString fingerprints) /*-{ + private static native GpgKeysInput createWithDelete(JsArrayString fingerprints) /*-{ return {'delete': fingerprints}; }-*/; - protected GpgKeysInput() { - } + protected GpgKeysInput() {} } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountCapabilities.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountCapabilities.java index 42399ee1bc..d317881c3d 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountCapabilities.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountCapabilities.java @@ -18,17 +18,13 @@ import com.google.gerrit.client.rpc.RestApi; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.user.client.rpc.AsyncCallback; -/** Capabilities the caller has from {@code /accounts/self/capabilities}. */ +/** Capabilities the caller has from {@code /accounts/self/capabilities}. */ public class AccountCapabilities extends JavaScriptObject { public static void all(AsyncCallback cb, String... filter) { - new RestApi("/accounts/self/capabilities") - .addParameter("q", filter) - .get(cb); + new RestApi("/accounts/self/capabilities").addParameter("q", filter).get(cb); } - protected AccountCapabilities() { - } + protected AccountCapabilities() {} - public final native boolean canPerform(String name) - /*-{ return this[name] ? true : false; }-*/; + public final native boolean canPerform(String name) /*-{ return this[name] ? true : false; }-*/; } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.java index 06d5df5c46..8ad55e83c9 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.java @@ -20,157 +20,276 @@ public interface AccountConstants extends Constants { String settingsHeading(); String changeAvatar(); + String fullName(); + String preferredEmail(); + String registeredOn(); + String accountId(); String diffViewLabel(); + String maximumPageSizeFieldLabel(); + String dateFormatLabel(); + String contextWholeFile(); + String showSiteHeader(); + String useFlashClipboard(); + String reviewCategoryLabel(); + String messageShowInReviewCategoryNone(); + String messageShowInReviewCategoryName(); + String messageShowInReviewCategoryEmail(); + String messageShowInReviewCategoryUsername(); + String messageShowInReviewCategoryAbbrev(); + String buttonSaveChanges(); + String highlightAssigneeInChangeTable(); + String showRelativeDateInChangeTable(); + String showSizeBarInChangeTable(); + String showLegacycidInChangeTable(); + String muteCommonPathPrefixes(); + String signedOffBy(); + String myMenu(); + String myMenuInfo(); + String myMenuName(); + String myMenuUrl(); + String myMenuReset(); String tabAccountSummary(); + String tabAgreements(); + String tabContactInformation(); + String tabDiffPreferences(); + String tabEditPreferences(); + String tabGpgKeys(); + String tabHttpAccess(); + String tabMyGroups(); + String tabOAuthToken(); + String tabPreferences(); + String tabSshKeys(); + String tabWatchedProjects(); + String tabWebIdentities(); String buttonShowAddSshKey(); + String buttonCloseAddSshKey(); + String buttonDeleteSshKey(); + String buttonClearSshKeyInput(); + String buttonAddSshKey(); String userName(); + String password(); + String buttonSetUserName(); + String confirmSetUserNameTitle(); + String confirmSetUserName(); + String buttonClearPassword(); + String buttonGeneratePassword(); + String linkObtainPassword(); + String linkEditFullName(); + String linkReloadContact(); + String invalidUserName(); + String invalidUserEmail(); String labelOAuthToken(); + String labelOAuthExpires(); + String labelOAuthNetRCEntry(); + String labelOAuthGitCookie(); + String labelOAuthExpired(); String sshKeyInvalid(); + String sshKeyAlgorithm(); + String sshKeyKey(); + String sshKeyComment(); + String sshKeyStatus(); String addSshKeyPanelHeader(); + String addSshKeyHelpTitle(); + String addSshKeyHelp(); + String sshJavaAppletNotAvailable(); + String invalidSshKeyError(); String sshHostKeyTitle(); + String sshHostKeyFingerprint(); + String sshHostKeyKnownHostEntry(); String gpgKeyId(); + String gpgKeyFingerprint(); + String gpgKeyUserIds(); String webIdStatus(); + String webIdEmail(); + String webIdIdentity(); + String untrustedProvider(); + String buttonDeleteIdentity(); + String buttonLinkIdentity(); String buttonWatchProject(); + String defaultProjectName(); + String defaultFilter(); + String buttonBrowseProjects(); + String projects(); + String projectsClose(); + String projectListOpen(); + String watchedProjectName(); + String watchedProjectFilter(); + String watchedProjectColumnEmailNotifications(); + String watchedProjectColumnNewChanges(); + String watchedProjectColumnNewPatchSets(); + String watchedProjectColumnAllComments(); + String watchedProjectColumnSubmittedChanges(); + String watchedProjectColumnAbandonedChanges(); String contactFieldFullName(); + String contactFieldEmail(); + String buttonOpenRegisterNewEmail(); + String buttonSendRegisterNewEmail(); + String buttonCancel(); + String titleRegisterNewEmail(); + String descRegisterNewEmail(); + String errorDialogTitleRegisterNewEmail(); String newAgreement(); + String agreementName(); + String agreementDescription(); String newAgreementSelectTypeHeading(); + String newAgreementNoneAvailable(); + String newAgreementReviewLegalHeading(); + String newAgreementReviewContactHeading(); + String newAgreementCompleteHeading(); + String newAgreementIAGREE(); + String newAgreementAlreadySubmitted(); + String buttonSubmitNewAgreement(); String welcomeToGerritCodeReview(); + String welcomeReviewContact(); + String welcomeContactFrom(); + String welcomeUsernameHeading(); + String welcomeSshKeyHeading(); + String welcomeSshKeyText(); + String welcomeAgreementHeading(); + String welcomeAgreementText(); + String welcomeAgreementLater(); + String welcomeContinue(); String messageEnabled(); + String messageCCMeOnMyComments(); + String messageDisabled(); + String emailFieldLabel(); String defaultBaseForMerges(); + String autoMerge(); + String firstParent(); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountMessages.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountMessages.java index b398c0f366..4cff1e2e32 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountMessages.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountMessages.java @@ -18,7 +18,10 @@ import com.google.gwt.i18n.client.Messages; public interface AccountMessages extends Messages { String lines(short cnt); + String rowsPerPage(int cnt); + String changeScreenServerDefault(String d); + String enterIAGREE(String iagree); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ContactPanelShort.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ContactPanelShort.java index 0b8fe3ee21..da0357f875 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ContactPanelShort.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ContactPanelShort.java @@ -88,12 +88,13 @@ class ContactPanelShort extends Composite { registerNewEmail = new Button(Util.C.buttonOpenRegisterNewEmail()); registerNewEmail.setEnabled(false); - registerNewEmail.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - doRegisterNewEmail(); - } - }); + registerNewEmail.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + doRegisterNewEmail(); + } + }); final FlowPanel emailLine = new FlowPanel(); emailLine.add(emailPick); if (canRegisterNewEmail()) { @@ -112,21 +113,23 @@ class ContactPanelShort extends Composite { nameLine.add(nameTxt); if (Gerrit.info().auth().editFullNameUrl() != null) { Button edit = new Button(Util.C.linkEditFullName()); - edit.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - Window.open(Gerrit.info().auth().editFullNameUrl(), "_blank", null); - } - }); + edit.addClickHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + Window.open(Gerrit.info().auth().editFullNameUrl(), "_blank", null); + } + }); nameLine.add(edit); } Button reload = new Button(Util.C.linkReloadContact()); - reload.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - Window.Location.replace(Gerrit.loginRedirect(PageLinks.SETTINGS_CONTACT)); - } - }); + reload.addClickHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + Window.Location.replace(Gerrit.loginRedirect(PageLinks.SETTINGS_CONTACT)); + } + }); nameLine.add(reload); row(infoPlainText, row++, Util.C.contactFieldFullName(), nameLine); } else { @@ -136,35 +139,39 @@ class ContactPanelShort extends Composite { infoPlainText.getCellFormatter().addStyleName(0, 0, Gerrit.RESOURCES.css().topmost()); infoPlainText.getCellFormatter().addStyleName(0, 1, Gerrit.RESOURCES.css().topmost()); - infoPlainText.getCellFormatter().addStyleName(row - 1, 0, Gerrit.RESOURCES.css().bottomheader()); + infoPlainText + .getCellFormatter() + .addStyleName(row - 1, 0, Gerrit.RESOURCES.css().bottomheader()); save = new Button(Util.C.buttonSaveChanges()); save.setEnabled(false); - save.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - doSave(); - } - }); + save.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + doSave(); + } + }); - emailPick.addChangeHandler(new ChangeHandler() { - @Override - public void onChange(final ChangeEvent event) { - final int idx = emailPick.getSelectedIndex(); - final String v = 0 <= idx ? emailPick.getValue(idx) : null; - if (Util.C.buttonOpenRegisterNewEmail().equals(v)) { - for (int i = 0; i < emailPick.getItemCount(); i++) { - if (currentEmail.equals(emailPick.getValue(i))) { - emailPick.setSelectedIndex(i); - break; + emailPick.addChangeHandler( + new ChangeHandler() { + @Override + public void onChange(final ChangeEvent event) { + final int idx = emailPick.getSelectedIndex(); + final String v = 0 <= idx ? emailPick.getValue(idx) : null; + if (Util.C.buttonOpenRegisterNewEmail().equals(v)) { + for (int i = 0; i < emailPick.getItemCount(); i++) { + if (currentEmail.equals(emailPick.getValue(i))) { + emailPick.setSelectedIndex(i); + break; + } + } + doRegisterNewEmail(); + } else { + save.setEnabled(true); } } - doRegisterNewEmail(); - } else { - save.setEnabled(true); - } - } - }); + }); onEditEnabler = new OnEditEnabler(save, nameTxt); } @@ -197,32 +204,37 @@ class ContactPanelShort extends Composite { haveEmails = false; CallbackGroup group = new CallbackGroup(); - AccountApi.getName("self", group.add(new GerritCallback() { + AccountApi.getName( + "self", + group.add( + new GerritCallback() { - @Override - public void onSuccess(NativeString result) { - nameTxt.setText(result.asString()); - haveAccount = true; - } + @Override + public void onSuccess(NativeString result) { + nameTxt.setText(result.asString()); + haveAccount = true; + } - @Override - public void onFailure(Throwable caught) { - } - })); + @Override + public void onFailure(Throwable caught) {} + })); - AccountApi.getEmails("self", group.addFinal(new GerritCallback>() { - @Override - public void onSuccess(JsArray result) { - for (EmailInfo i : Natives.asList(result)) { - emailPick.addItem(i.email()); - if (i.isPreferred()) { - currentEmail = i.email(); - } - } - haveEmails = true; - postLoad(); - } - })); + AccountApi.getEmails( + "self", + group.addFinal( + new GerritCallback>() { + @Override + public void onSuccess(JsArray result) { + for (EmailInfo i : Natives.asList(result)) { + emailPick.addItem(i.email()); + if (i.isPreferred()) { + currentEmail = i.email(); + } + } + haveEmails = true; + postLoad(); + } + })); } private void postLoad() { @@ -235,11 +247,9 @@ class ContactPanelShort extends Composite { display(); } - void display() { - } + void display() {} - protected void row(final Grid info, final int row, final String name, - final Widget field) { + protected void row(final Grid info, final int row, final String name, final Widget field) { info.setText(row, labelIdx, name); info.setWidget(row, fieldIdx, field); info.getCellFormatter().addStyleName(row, 0, Gerrit.RESOURCES.css().header()); @@ -266,66 +276,72 @@ class ContactPanelShort extends Composite { final Button register = new Button(Util.C.buttonSendRegisterNewEmail()); final Button cancel = new Button(Util.C.buttonCancel()); final FormPanel form = new FormPanel(); - form.addSubmitHandler(new FormPanel.SubmitHandler() { - @Override - public void onSubmit(final SubmitEvent event) { - event.cancel(); - final String addr = inEmail.getText().trim(); - if (!addr.contains("@")) { - new ErrorDialog(Util.C.invalidUserEmail()).center(); - return; - } - - inEmail.setEnabled(false); - register.setEnabled(false); - AccountApi.registerEmail("self", addr, new GerritCallback() { + form.addSubmitHandler( + new FormPanel.SubmitHandler() { @Override - public void onSuccess(EmailInfo result) { - box.hide(); - if (Gerrit.info().auth().isDev()) { - currentEmail = addr; - if (emailPick.getItemCount() == 0) { - AccountInfo me = Gerrit.getUserAccount(); - me.email(addr); - onSaveSuccess(me); - } else { - save.setEnabled(true); - } - updateEmailList(); + public void onSubmit(final SubmitEvent event) { + event.cancel(); + final String addr = inEmail.getText().trim(); + if (!addr.contains("@")) { + new ErrorDialog(Util.C.invalidUserEmail()).center(); + return; } - } - @Override - public void onFailure(final Throwable caught) { - inEmail.setEnabled(true); - register.setEnabled(true); - if (caught.getMessage().startsWith(EmailException.MESSAGE)) { - final ErrorDialog d = - new ErrorDialog(caught.getMessage().substring( - EmailException.MESSAGE.length())); - d.setText(Util.C.errorDialogTitleRegisterNewEmail()); - d.center(); - } else { - super.onFailure(caught); - } + inEmail.setEnabled(false); + register.setEnabled(false); + AccountApi.registerEmail( + "self", + addr, + new GerritCallback() { + @Override + public void onSuccess(EmailInfo result) { + box.hide(); + if (Gerrit.info().auth().isDev()) { + currentEmail = addr; + if (emailPick.getItemCount() == 0) { + AccountInfo me = Gerrit.getUserAccount(); + me.email(addr); + onSaveSuccess(me); + } else { + save.setEnabled(true); + } + updateEmailList(); + } + } + + @Override + public void onFailure(final Throwable caught) { + inEmail.setEnabled(true); + register.setEnabled(true); + if (caught.getMessage().startsWith(EmailException.MESSAGE)) { + final ErrorDialog d = + new ErrorDialog( + caught.getMessage().substring(EmailException.MESSAGE.length())); + d.setText(Util.C.errorDialogTitleRegisterNewEmail()); + d.center(); + } else { + super.onFailure(caught); + } + } + }); } }); - } - }); form.setWidget(body); - register.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - form.submit(); - } - }); - cancel.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - box.hide(); - } - }); + register.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + form.submit(); + } + }); + cancel.addClickHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + box.hide(); + } + }); final FlowPanel buttons = new FlowPanel(); buttons.setStyleName(Gerrit.RESOURCES.css().patchSetActions()); @@ -370,38 +386,43 @@ class ContactPanelShort extends Composite { CallbackGroup group = new CallbackGroup(); if (currentEmail != null && !newEmail.equals(currentEmail)) { - AccountApi.setPreferredEmail("self", newEmail, - group.add(new GerritCallback() { - @Override - public void onSuccess(NativeString result) { - } - })); + AccountApi.setPreferredEmail( + "self", + newEmail, + group.add( + new GerritCallback() { + @Override + public void onSuccess(NativeString result) {} + })); } - AccountApi.setName("self", newName, - group.add(new GerritCallback() { - @Override - public void onSuccess(NativeString result) { - } + AccountApi.setName( + "self", + newName, + group.add( + new GerritCallback() { + @Override + public void onSuccess(NativeString result) {} - @Override - public void onFailure(Throwable caught) { - save.setEnabled(true); - registerNewEmail.setEnabled(true); - super.onFailure(caught); - } - })); + @Override + public void onFailure(Throwable caught) { + save.setEnabled(true); + registerNewEmail.setEnabled(true); + super.onFailure(caught); + } + })); group.done(); - group.addListener(new GerritCallback() { - @Override - public void onSuccess(Void result) { - currentEmail = newEmail; - AccountInfo me = Gerrit.getUserAccount(); - me.email(currentEmail); - me.name(newName); - onSaveSuccess(me); - registerNewEmail.setEnabled(true); - } - }); + group.addListener( + new GerritCallback() { + @Override + public void onSuccess(Void result) { + currentEmail = newEmail; + AccountInfo me = Gerrit.getUserAccount(); + me.email(currentEmail); + me.name(newName); + onSaveSuccess(me); + registerNewEmail.setEnabled(true); + } + }); } void onSaveSuccess(AccountInfo result) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/DiffPreferences.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/DiffPreferences.java index 423d05f526..286d29a0c5 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/DiffPreferences.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/DiffPreferences.java @@ -126,52 +126,101 @@ public class DiffPreferences extends JavaScriptObject { } public final native void tabSize(int t) /*-{ this.tab_size = t }-*/; + public final native void lineLength(int c) /*-{ this.line_length = c }-*/; + public final native void context(int c) /*-{ this.context = c }-*/; + public final native void cursorBlinkRate(int r) /*-{ this.cursor_blink_rate = r }-*/; + public final native void intralineDifference(Boolean i) /*-{ this.intraline_difference = i }-*/; + public final native void showLineEndings(Boolean s) /*-{ this.show_line_endings = s }-*/; + public final native void showTabs(Boolean s) /*-{ this.show_tabs = s }-*/; - public final native void showWhitespaceErrors(Boolean s) /*-{ this.show_whitespace_errors = s }-*/; + + public final native void showWhitespaceErrors( + Boolean s) /*-{ this.show_whitespace_errors = s }-*/; + public final native void syntaxHighlighting(Boolean s) /*-{ this.syntax_highlighting = s }-*/; + public final native void hideTopMenu(Boolean s) /*-{ this.hide_top_menu = s }-*/; - public final native void autoHideDiffTableHeader(Boolean s) /*-{ this.auto_hide_diff_table_header = s }-*/; + + public final native void autoHideDiffTableHeader( + Boolean s) /*-{ this.auto_hide_diff_table_header = s }-*/; + public final native void hideLineNumbers(Boolean s) /*-{ this.hide_line_numbers = s }-*/; + public final native void expandAllComments(Boolean e) /*-{ this.expand_all_comments = e }-*/; + public final native void manualReview(Boolean r) /*-{ this.manual_review = r }-*/; + public final native void renderEntireFile(Boolean r) /*-{ this.render_entire_file = r }-*/; + public final native void retainHeader(Boolean r) /*-{ this.retain_header = r }-*/; + public final native void hideEmptyPane(Boolean s) /*-{ this.hide_empty_pane = s }-*/; + public final native void skipUnchanged(Boolean s) /*-{ this.skip_unchanged = s }-*/; + public final native void skipUncommented(Boolean s) /*-{ this.skip_uncommented = s }-*/; + public final native void skipDeleted(Boolean s) /*-{ this.skip_deleted = s }-*/; + public final native void matchBrackets(Boolean m) /*-{ this.match_brackets = m }-*/; + public final native void lineWrapping(Boolean w) /*-{ this.line_wrapping = w }-*/; - public final native boolean intralineDifference() /*-{ return this.intraline_difference || false }-*/; + + public final native boolean + intralineDifference() /*-{ return this.intraline_difference || false }-*/; + public final native boolean showLineEndings() /*-{ return this.show_line_endings || false }-*/; + public final native boolean showTabs() /*-{ return this.show_tabs || false }-*/; - public final native boolean showWhitespaceErrors() /*-{ return this.show_whitespace_errors || false }-*/; - public final native boolean syntaxHighlighting() /*-{ return this.syntax_highlighting || false }-*/; + + public final native boolean + showWhitespaceErrors() /*-{ return this.show_whitespace_errors || false }-*/; + + public final native boolean + syntaxHighlighting() /*-{ return this.syntax_highlighting || false }-*/; + public final native boolean hideTopMenu() /*-{ return this.hide_top_menu || false }-*/; - public final native boolean autoHideDiffTableHeader() /*-{ return this.auto_hide_diff_table_header || false }-*/; + + public final native boolean + autoHideDiffTableHeader() /*-{ return this.auto_hide_diff_table_header || false }-*/; + public final native boolean hideLineNumbers() /*-{ return this.hide_line_numbers || false }-*/; - public final native boolean expandAllComments() /*-{ return this.expand_all_comments || false }-*/; + + public final native boolean + expandAllComments() /*-{ return this.expand_all_comments || false }-*/; + public final native boolean manualReview() /*-{ return this.manual_review || false }-*/; + public final native boolean renderEntireFile() /*-{ return this.render_entire_file || false }-*/; + public final native boolean hideEmptyPane() /*-{ return this.hide_empty_pane || false }-*/; + public final native boolean retainHeader() /*-{ return this.retain_header || false }-*/; + public final native boolean skipUnchanged() /*-{ return this.skip_unchanged || false }-*/; + public final native boolean skipUncommented() /*-{ return this.skip_uncommented || false }-*/; + public final native boolean skipDeleted() /*-{ return this.skip_deleted || false }-*/; + public final native boolean matchBrackets() /*-{ return this.match_brackets || false }-*/; + public final native boolean lineWrapping() /*-{ return this.line_wrapping || false }-*/; private native void setThemeRaw(String i) /*-{ this.theme = i }-*/; + private native void setIgnoreWhitespaceRaw(String i) /*-{ this.ignore_whitespace = i }-*/; + private native String ignoreWhitespaceRaw() /*-{ return this.ignore_whitespace }-*/; + private native String themeRaw() /*-{ return this.theme }-*/; + private native int get(String n, int d) /*-{ return this.hasOwnProperty(n) ? this[n] : d }-*/; - protected DiffPreferences() { - } + protected DiffPreferences() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/EditPreferences.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/EditPreferences.java index ae89607d6a..8fcea85ed8 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/EditPreferences.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/EditPreferences.java @@ -62,37 +62,54 @@ public class EditPreferences extends JavaScriptObject { public final void theme(Theme i) { setThemeRaw(i != null ? i.toString() : Theme.DEFAULT.toString()); } + private native void setThemeRaw(String i) /*-{ this.theme = i }-*/; public final void keyMapType(KeyMapType i) { setkeyMapTypeRaw(i != null ? i.toString() : KeyMapType.DEFAULT.toString()); } + private native void setkeyMapTypeRaw(String i) /*-{ this.key_map_type = i }-*/; public final native void tabSize(int t) /*-{ this.tab_size = t }-*/; + public final native void lineLength(int c) /*-{ this.line_length = c }-*/; + public final native void indentUnit(int c) /*-{ this.indent_unit = c }-*/; + public final native void cursorBlinkRate(int r) /*-{ this.cursor_blink_rate = r }-*/; + public final native void hideTopMenu(boolean s) /*-{ this.hide_top_menu = s }-*/; + public final native void showTabs(boolean s) /*-{ this.show_tabs = s }-*/; - public final native void showWhitespaceErrors(boolean s) /*-{ this.show_whitespace_errors = s }-*/; + + public final native void showWhitespaceErrors( + boolean s) /*-{ this.show_whitespace_errors = s }-*/; + public final native void syntaxHighlighting(boolean s) /*-{ this.syntax_highlighting = s }-*/; + public final native void hideLineNumbers(boolean s) /*-{ this.hide_line_numbers = s }-*/; + public final native void matchBrackets(boolean m) /*-{ this.match_brackets = m }-*/; + public final native void lineWrapping(boolean w) /*-{ this.line_wrapping = w }-*/; + public final native void autoCloseBrackets(boolean c) /*-{ this.auto_close_brackets = c }-*/; + public final native void showBase(boolean s) /*-{ this.show_base = s }-*/; public final Theme theme() { String s = themeRaw(); return s != null ? Theme.valueOf(s) : Theme.DEFAULT; } + private native String themeRaw() /*-{ return this.theme }-*/; public final KeyMapType keyMapType() { String s = keyMapTypeRaw(); return s != null ? KeyMapType.valueOf(s) : KeyMapType.DEFAULT; } + private native String keyMapTypeRaw() /*-{ return this.key_map_type }-*/; public final int tabSize() { @@ -112,16 +129,27 @@ public class EditPreferences extends JavaScriptObject { } public final native boolean hideTopMenu() /*-{ return this.hide_top_menu || false }-*/; + public final native boolean showTabs() /*-{ return this.show_tabs || false }-*/; - public final native boolean showWhitespaceErrors() /*-{ return this.show_whitespace_errors || false }-*/; - public final native boolean syntaxHighlighting() /*-{ return this.syntax_highlighting || false }-*/; + + public final native boolean + showWhitespaceErrors() /*-{ return this.show_whitespace_errors || false }-*/; + + public final native boolean + syntaxHighlighting() /*-{ return this.syntax_highlighting || false }-*/; + public final native boolean hideLineNumbers() /*-{ return this.hide_line_numbers || false }-*/; + public final native boolean matchBrackets() /*-{ return this.match_brackets || false }-*/; + public final native boolean lineWrapping() /*-{ return this.line_wrapping || false }-*/; - public final native boolean autoCloseBrackets() /*-{ return this.auto_close_brackets || false }-*/; + + public final native boolean + autoCloseBrackets() /*-{ return this.auto_close_brackets || false }-*/; + public final native boolean showBase() /*-{ return this.show_base || false }-*/; + private native int get(String n, int d) /*-{ return this.hasOwnProperty(n) ? this[n] : d }-*/; - protected EditPreferences() { - } + protected EditPreferences() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/EmailInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/EmailInfo.java index d0bbd8c46a..9c324be2e4 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/EmailInfo.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/EmailInfo.java @@ -18,9 +18,11 @@ import com.google.gwt.core.client.JavaScriptObject; public class EmailInfo extends JavaScriptObject { public final native String email() /*-{ return this.email; }-*/; - public final native boolean isPreferred() /*-{ return this['preferred'] ? true : false; }-*/; - public final native boolean isConfirmationPending() /*-{ return this['pending_confirmation'] ? true : false; }-*/; - protected EmailInfo() { - } + public final native boolean isPreferred() /*-{ return this['preferred'] ? true : false; }-*/; + + public final native boolean + isConfirmationPending() /*-{ return this['pending_confirmation'] ? true : false; }-*/; + + protected EmailInfo() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyAgreementsScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyAgreementsScreen.java index cd7c141537..4592b62954 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyAgreementsScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyAgreementsScreen.java @@ -25,7 +25,6 @@ import com.google.gerrit.common.data.ContributorAgreement; import com.google.gwt.core.client.JsArray; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter; - import java.util.List; public class MyAgreementsScreen extends SettingsScreen { @@ -44,12 +43,13 @@ public class MyAgreementsScreen extends SettingsScreen { protected void onLoad() { super.onLoad(); AccountApi.getAgreements( - "self", new ScreenLoadCallback>(this) { - @Override - public void preDisplay(JsArray result) { - agreements.display(Natives.asList(result)); - } - }); + "self", + new ScreenLoadCallback>(this) { + @Override + public void preDisplay(JsArray result) { + agreements.display(Natives.asList(result)); + } + }); } private static class AgreementTable extends FancyFlexTable { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyContactInformationScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyContactInformationScreen.java index 4c1016a4f1..d5884f4c8d 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyContactInformationScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyContactInformationScreen.java @@ -20,12 +20,13 @@ public class MyContactInformationScreen extends SettingsScreen { @Override protected void onInitUI() { super.onInitUI(); - panel = new ContactPanelShort() { - @Override - void display() { - MyContactInformationScreen.this.display(); - } - }; + panel = + new ContactPanelShort() { + @Override + void display() { + MyContactInformationScreen.this.display(); + } + }; add(panel); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyGpgKeysScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyGpgKeysScreen.java index 99d791b6a4..0dc1dab8a4 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyGpgKeysScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyGpgKeysScreen.java @@ -39,7 +39,6 @@ import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwtexpui.clippy.client.CopyableLabel; import com.google.gwtexpui.globalkey.client.NpTextArea; - import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -47,9 +46,12 @@ import java.util.List; public class MyGpgKeysScreen extends SettingsScreen { interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); - @UiField(provided = true) GpgKeyTable keys; + @UiField(provided = true) + GpgKeyTable keys; + @UiField Button deleteKey; @UiField Button addKey; @@ -105,39 +107,45 @@ public class MyGpgKeysScreen extends SettingsScreen { } private void refreshKeys() { - AccountApi.self().view("gpgkeys").get(NativeMap.copyKeysIntoChildren("id", - new GerritCallback>() { - @Override - public void onSuccess(NativeMap result) { - List list = Natives.asList(result.values()); - // TODO(dborowitz): Sort on something more meaningful, like - // created date? - Collections.sort(list, new Comparator() { - @Override - public int compare(GpgKeyInfo a, GpgKeyInfo b) { - return a.id().compareTo(b.id()); - } - }); - keys.clear(); - keyText.setText(""); - errorPanel.setVisible(false); - addButton.setEnabled(true); - if (!list.isEmpty()) { - keys.setVisible(true); - for (GpgKeyInfo k : list) { - keys.addOneKey(k); - } - showKeyTable(true); - showAddKeyBlock(false); - } else { - keys.setVisible(false); - showAddKeyBlock(true); - showKeyTable(false); - } + AccountApi.self() + .view("gpgkeys") + .get( + NativeMap.copyKeysIntoChildren( + "id", + new GerritCallback>() { + @Override + public void onSuccess(NativeMap result) { + List list = Natives.asList(result.values()); + // TODO(dborowitz): Sort on something more meaningful, like + // created date? + Collections.sort( + list, + new Comparator() { + @Override + public int compare(GpgKeyInfo a, GpgKeyInfo b) { + return a.id().compareTo(b.id()); + } + }); + keys.clear(); + keyText.setText(""); + errorPanel.setVisible(false); + addButton.setEnabled(true); + if (!list.isEmpty()) { + keys.setVisible(true); + for (GpgKeyInfo k : list) { + keys.addOneKey(k); + } + showKeyTable(true); + showAddKeyBlock(false); + } else { + keys.setVisible(false); + showAddKeyBlock(true); + showKeyTable(false); + } - display(); - } - })); + display(); + } + })); } private void showAddKeyBlock(boolean show) { @@ -157,7 +165,9 @@ public class MyGpgKeysScreen extends SettingsScreen { } addButton.setEnabled(false); keyText.setEnabled(false); - AccountApi.addGpgKey("self", keyText.getText(), + AccountApi.addGpgKey( + "self", + keyText.getText(), new AsyncCallback>() { @Override public void onSuccess(NativeMap result) { @@ -178,8 +188,7 @@ public class MyGpgKeysScreen extends SettingsScreen { errorText.setText(sce.getMessage()); } } else { - errorText.setText( - "Unexpected error saving key: " + caught.getMessage()); + errorText.setText("Unexpected error saving key: " + caught.getMessage()); } errorPanel.setVisible(true); } @@ -201,12 +210,13 @@ public class MyGpgKeysScreen extends SettingsScreen { fmt.addStyleName(0, 2, Gerrit.RESOURCES.css().dataHeader()); fmt.addStyleName(0, 3, Gerrit.RESOURCES.css().dataHeader()); - updateDeleteHandler = new ValueChangeHandler() { - @Override - public void onValueChange(ValueChangeEvent event) { - updateDeleteButton(); - } - }; + updateDeleteHandler = + new ValueChangeHandler() { + @Override + public void onValueChange(ValueChangeEvent event) { + updateDeleteButton(); + } + }; } private void addOneKey(GpgKeyInfo k) { @@ -253,7 +263,9 @@ public class MyGpgKeysScreen extends SettingsScreen { toDelete.add(getRowItem(row).fingerprint()); } } - AccountApi.deleteGpgKeys("self", toDelete, + AccountApi.deleteGpgKeys( + "self", + toDelete, new GerritCallback>() { @Override public void onSuccess(NativeMap result) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyGroupsScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyGroupsScreen.java index f6ac36a2f9..e9112de1bb 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyGroupsScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyGroupsScreen.java @@ -31,12 +31,13 @@ public class MyGroupsScreen extends SettingsScreen { @Override protected void onLoad() { super.onLoad(); - GroupList.my(new ScreenLoadCallback(this) { - @Override - protected void preDisplay(GroupList result) { - groups.display(result); - groups.finishDisplay(); - } - }); + GroupList.my( + new ScreenLoadCallback(this) { + @Override + protected void preDisplay(GroupList result) { + groups.display(result); + groups.finishDisplay(); + } + }); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyIdentitiesScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyIdentitiesScreen.java index b638575e4b..aa65986a3c 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyIdentitiesScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyIdentitiesScreen.java @@ -30,7 +30,6 @@ import com.google.gwt.user.client.Window.Location; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter; - import java.util.Collections; import java.util.Comparator; import java.util.HashSet; @@ -50,23 +49,24 @@ public class MyIdentitiesScreen extends SettingsScreen { deleteIdentity = new Button(Util.C.buttonDeleteIdentity()); deleteIdentity.setEnabled(false); - deleteIdentity.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - identites.deleteChecked(); - } - }); + deleteIdentity.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + identites.deleteChecked(); + } + }); add(deleteIdentity); - if (Gerrit.info().auth().isOpenId() - || Gerrit.info().auth().isOAuth()) { + if (Gerrit.info().auth().isOpenId() || Gerrit.info().auth().isOAuth()) { Button linkIdentity = new Button(Util.C.buttonLinkIdentity()); - linkIdentity.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - Location.assign(Gerrit.loginRedirect(History.getToken()) + "?link"); - } - }); + linkIdentity.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + Location.assign(Gerrit.loginRedirect(History.getToken()) + "?link"); + } + }); add(linkIdentity); } } @@ -74,8 +74,8 @@ public class MyIdentitiesScreen extends SettingsScreen { @Override protected void onLoad() { super.onLoad(); - Util.ACCOUNT_SEC - .myExternalIds(new ScreenLoadCallback>(this) { + Util.ACCOUNT_SEC.myExternalIds( + new ScreenLoadCallback>(this) { @Override public void preDisplay(final List result) { identites.display(result); @@ -98,12 +98,13 @@ public class MyIdentitiesScreen extends SettingsScreen { fmt.addStyleName(0, 3, Gerrit.RESOURCES.css().dataHeader()); fmt.addStyleName(0, 4, Gerrit.RESOURCES.css().dataHeader()); - updateDeleteHandler = new ValueChangeHandler() { - @Override - public void onValueChange(ValueChangeEvent event) { - updateDeleteButton(); - } - }; + updateDeleteHandler = + new ValueChangeHandler() { + @Override + public void onValueChange(ValueChangeEvent event) { + updateDeleteButton(); + } + }; } void deleteChecked() { @@ -125,11 +126,12 @@ public class MyIdentitiesScreen extends SettingsScreen { updateDeleteButton(); } else { deleteIdentity.setEnabled(false); - Util.ACCOUNT_SEC.deleteExternalIds(keys, + Util.ACCOUNT_SEC.deleteExternalIds( + keys, new GerritCallback>() { @Override public void onSuccess(final Set removed) { - for (int row = 1; row < table.getRowCount();) { + for (int row = 1; row < table.getRowCount(); ) { final AccountExternalId k = getRowItem(row); if (k != null && removed.contains(k.getKey())) { table.removeRow(row); @@ -168,16 +170,18 @@ public class MyIdentitiesScreen extends SettingsScreen { } void display(final List result) { - Collections.sort(result, new Comparator() { - @Override - public int compare(AccountExternalId a, AccountExternalId b) { - return emailOf(a).compareTo(emailOf(b)); - } + Collections.sort( + result, + new Comparator() { + @Override + public int compare(AccountExternalId a, AccountExternalId b) { + return emailOf(a).compareTo(emailOf(b)); + } - private String emailOf(final AccountExternalId a) { - return a.getEmailAddress() != null ? a.getEmailAddress() : ""; - } - }); + private String emailOf(final AccountExternalId a) { + return a.getEmailAddress() != null ? a.getEmailAddress() : ""; + } + }); while (1 < table.getRowCount()) { table.removeRow(table.getRowCount() - 1); @@ -211,8 +215,7 @@ public class MyIdentitiesScreen extends SettingsScreen { table.setText(row, 2, ""); } else { table.setText(row, 2, Util.C.untrustedProvider()); - fmt.addStyleName(row, 2, Gerrit.RESOURCES.css() - .identityUntrustedExternalId()); + fmt.addStyleName(row, 2, Gerrit.RESOURCES.css().identityUntrustedExternalId()); } if (k.getEmailAddress() != null && k.getEmailAddress().length() > 0) { table.setText(row, 3, k.getEmailAddress()); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyOAuthTokenScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyOAuthTokenScreen.java index a4c92fee17..5836763ee4 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyOAuthTokenScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyOAuthTokenScreen.java @@ -27,7 +27,6 @@ import com.google.gwt.user.client.ui.HTMLTable.CellFormatter; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Widget; import com.google.gwtexpui.clippy.client.CopyableLabel; - import java.util.Date; public class MyOAuthTokenScreen extends SettingsScreen { @@ -73,7 +72,7 @@ public class MyOAuthTokenScreen extends SettingsScreen { Label netrcLabel = new Label(Util.C.labelOAuthNetRCEntry()); netrcLabel.setStyleName(Gerrit.RESOURCES.css().oauthPanelNetRCHeading()); flow.add(netrcLabel); - netrcValue= new CopyableLabel(""); + netrcValue = new CopyableLabel(""); netrcValue.setStyleName(Gerrit.RESOURCES.css().oauthPanelNetRCEntry()); flow.add(netrcValue); @@ -101,41 +100,46 @@ public class MyOAuthTokenScreen extends SettingsScreen { @Override protected void onLoad() { super.onLoad(); - AccountApi.self().view("preferences") - .get(new ScreenLoadCallback(this) { - @Override - protected void preDisplay(GeneralPreferences prefs) { - display(prefs); - } - }); + AccountApi.self() + .view("preferences") + .get( + new ScreenLoadCallback(this) { + @Override + protected void preDisplay(GeneralPreferences prefs) { + display(prefs); + } + }); } private void display(final GeneralPreferences prefs) { - AccountApi.self().view("oauthtoken") - .get(new GerritCallback() { - @Override - public void onSuccess(OAuthTokenInfo tokenInfo) { - tokenLabel.setText(tokenInfo.accessToken()); - expiresLabel.setText(getExpiresAt(tokenInfo, prefs)); - netrcValue.setText(getNetRC(tokenInfo)); - cookieValue.setText(getCookie(tokenInfo)); - flow.setVisible(true); - expiredNote.setVisible(false); - } - @Override - public void onFailure(Throwable caught) { - if (isNoSuchEntity(caught) || isSigninFailure(caught)) { - tokenLabel.setText(""); - expiresLabel.setText(""); - netrcValue.setText(""); - cookieValue.setText(""); - flow.setVisible(false); - expiredNote.setVisible(true); - } else { - showFailure(caught); - } - } - }); + AccountApi.self() + .view("oauthtoken") + .get( + new GerritCallback() { + @Override + public void onSuccess(OAuthTokenInfo tokenInfo) { + tokenLabel.setText(tokenInfo.accessToken()); + expiresLabel.setText(getExpiresAt(tokenInfo, prefs)); + netrcValue.setText(getNetRC(tokenInfo)); + cookieValue.setText(getCookie(tokenInfo)); + flow.setVisible(true); + expiredNote.setVisible(false); + } + + @Override + public void onFailure(Throwable caught) { + if (isNoSuchEntity(caught) || isSigninFailure(caught)) { + tokenLabel.setText(""); + expiresLabel.setText(""); + netrcValue.setText(""); + cookieValue.setText(""); + flow.setVisible(false); + expiredNote.setVisible(true); + } else { + showFailure(caught); + } + } + }); } private static long getExpiresAt(OAuthTokenInfo tokenInfo) { @@ -155,16 +159,14 @@ public class MyOAuthTokenScreen extends SettingsScreen { return getExpiresAt(tokenInfo) / 1000L; } - private static String getExpiresAt(OAuthTokenInfo tokenInfo, - GeneralPreferences prefs) { + private static String getExpiresAt(OAuthTokenInfo tokenInfo, GeneralPreferences prefs) { long expiresAt = getExpiresAt(tokenInfo); if (expiresAt == Long.MAX_VALUE) { return ""; } String dateFormat = prefs.dateFormat().getLongFormat(); String timeFormat = prefs.timeFormat().getFormat(); - DateTimeFormat formatter = DateTimeFormat.getFormat( - dateFormat + " " + timeFormat); + DateTimeFormat formatter = DateTimeFormat.getFormat(dateFormat + " " + timeFormat); return formatter.format(new Date(expiresAt)); } @@ -193,5 +195,4 @@ public class MyOAuthTokenScreen extends SettingsScreen { } return sb.toString(); } - } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyPasswordScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyPasswordScreen.java index 01772f8f8f..184575d83b 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyPasswordScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyPasswordScreen.java @@ -56,20 +56,22 @@ public class MyPasswordScreen extends SettingsScreen { password.addStyleName(Gerrit.RESOURCES.css().accountPassword()); generatePassword = new Button(Util.C.buttonGeneratePassword()); - generatePassword.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - doGeneratePassword(); - } - }); + generatePassword.addClickHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + doGeneratePassword(); + } + }); clearPassword = new Button(Util.C.buttonClearPassword()); - clearPassword.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - doClearPassword(); - } - }); + clearPassword.addClickHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + doClearPassword(); + } + }); final Grid userInfo = new Grid(2, 2); final CellFormatter fmt = userInfo.getCellFormatter(); @@ -104,43 +106,46 @@ public class MyPasswordScreen extends SettingsScreen { } enableUI(false); - AccountApi.getUsername("self", new GerritCallback() { - @Override - public void onSuccess(NativeString user) { - Gerrit.getUserAccount().username(user.asString()); - refreshHttpPassword(); - } + AccountApi.getUsername( + "self", + new GerritCallback() { + @Override + public void onSuccess(NativeString user) { + Gerrit.getUserAccount().username(user.asString()); + refreshHttpPassword(); + } - @Override - public void onFailure(final Throwable caught) { - if (RestApi.isNotFound(caught)) { - Gerrit.getUserAccount().username(null); - display(); - } else { - super.onFailure(caught); - } - } - }); + @Override + public void onFailure(final Throwable caught) { + if (RestApi.isNotFound(caught)) { + Gerrit.getUserAccount().username(null); + display(); + } else { + super.onFailure(caught); + } + } + }); } private void refreshHttpPassword() { - AccountApi.getHttpPassword("self", new ScreenLoadCallback( - this) { - @Override - protected void preDisplay(NativeString httpPassword) { - display(httpPassword.asString()); - } + AccountApi.getHttpPassword( + "self", + new ScreenLoadCallback(this) { + @Override + protected void preDisplay(NativeString httpPassword) { + display(httpPassword.asString()); + } - @Override - public void onFailure(final Throwable caught) { - if (RestApi.isNotFound(caught)) { - display(null); - display(); - } else { - super.onFailure(caught); - } - } - }); + @Override + public void onFailure(final Throwable caught) { + if (RestApi.isNotFound(caught)) { + display(null); + display(); + } else { + super.onFailure(caught); + } + } + }); } private void display(String pass) { @@ -149,8 +154,7 @@ public class MyPasswordScreen extends SettingsScreen { enableUI(true); } - private void row(final Grid info, final int row, final String name, - final Widget field) { + private void row(final Grid info, final int row, final String name, final Widget field) { final CellFormatter fmt = info.getCellFormatter(); if (LocaleInfo.getCurrentLocale().isRTL()) { info.setText(row, 1, name); @@ -166,7 +170,8 @@ public class MyPasswordScreen extends SettingsScreen { private void doGeneratePassword() { if (Gerrit.getUserAccount().username() != null) { enableUI(false); - AccountApi.generateHttpPassword("self", + AccountApi.generateHttpPassword( + "self", new GerritCallback() { @Override public void onSuccess(NativeString newPassword) { @@ -184,7 +189,8 @@ public class MyPasswordScreen extends SettingsScreen { private void doClearPassword() { if (Gerrit.getUserAccount().username() != null) { enableUI(false); - AccountApi.clearHttpPassword("self", + AccountApi.clearHttpPassword( + "self", new GerritCallback() { @Override public void onSuccess(VoidResult result) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyPreferencesScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyPreferencesScreen.java index 3bfc7da8c1..1f20d8e793 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyPreferencesScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyPreferencesScreen.java @@ -41,7 +41,6 @@ import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Grid; import com.google.gwt.user.client.ui.ListBox; import com.google.gwtexpui.user.client.UserAgent; - import java.util.ArrayList; import java.util.Arrays; import java.util.Date; @@ -95,24 +94,19 @@ public class MyPreferencesScreen extends SettingsScreen { GeneralPreferencesInfo.ReviewCategoryStrategy.ABBREV.name()); emailStrategy = new ListBox(); - emailStrategy - .addItem( - Util.C.messageCCMeOnMyComments(), - GeneralPreferencesInfo.EmailStrategy.CC_ON_OWN_COMMENTS - .name()); - emailStrategy.addItem(Util.C.messageEnabled(), - GeneralPreferencesInfo.EmailStrategy.ENABLED.name()); - emailStrategy - .addItem( - Util.C.messageDisabled(), - GeneralPreferencesInfo.EmailStrategy.DISABLED - .name()); + emailStrategy.addItem( + Util.C.messageCCMeOnMyComments(), + GeneralPreferencesInfo.EmailStrategy.CC_ON_OWN_COMMENTS.name()); + emailStrategy.addItem( + Util.C.messageEnabled(), GeneralPreferencesInfo.EmailStrategy.ENABLED.name()); + emailStrategy.addItem( + Util.C.messageDisabled(), GeneralPreferencesInfo.EmailStrategy.DISABLED.name()); defaultBaseForMerges = new ListBox(); - defaultBaseForMerges.addItem(Util.C.autoMerge(), - GeneralPreferencesInfo.DefaultBase.AUTO_MERGE.name()); - defaultBaseForMerges.addItem(Util.C.firstParent(), - GeneralPreferencesInfo.DefaultBase.FIRST_PARENT.name()); + defaultBaseForMerges.addItem( + Util.C.autoMerge(), GeneralPreferencesInfo.DefaultBase.AUTO_MERGE.name()); + defaultBaseForMerges.addItem( + Util.C.firstParent(), GeneralPreferencesInfo.DefaultBase.FIRST_PARENT.name()); diffView = new ListBox(); diffView.addItem( @@ -124,8 +118,7 @@ public class MyPreferencesScreen extends SettingsScreen { Date now = new Date(); dateFormat = new ListBox(); - for (GeneralPreferencesInfo.DateFormat fmt - : GeneralPreferencesInfo.DateFormat.values()) { + for (GeneralPreferencesInfo.DateFormat fmt : GeneralPreferencesInfo.DateFormat.values()) { StringBuilder r = new StringBuilder(); r.append(DateTimeFormat.getFormat(fmt.getShortFormat()).format(now)); r.append(" ; "); @@ -134,8 +127,7 @@ public class MyPreferencesScreen extends SettingsScreen { } timeFormat = new ListBox(); - for (GeneralPreferencesInfo.TimeFormat fmt - : GeneralPreferencesInfo.TimeFormat.values()) { + for (GeneralPreferencesInfo.TimeFormat fmt : GeneralPreferencesInfo.TimeFormat.values()) { StringBuilder r = new StringBuilder(); r.append(DateTimeFormat.getFormat(fmt.getFormat()).format(now)); timeFormat.addItem(r.toString(), fmt.name()); @@ -230,12 +222,13 @@ public class MyPreferencesScreen extends SettingsScreen { save = new Button(Util.C.buttonSaveChanges()); save.setEnabled(false); - save.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - doSave(); - } - }); + save.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + doSave(); + } + }); myMenus = new MyMenuPanel(save); add(myMenus); @@ -268,13 +261,15 @@ public class MyPreferencesScreen extends SettingsScreen { extensionPanel.addStyleName(Gerrit.RESOURCES.css().extensionPanel()); add(extensionPanel); - AccountApi.self().view("preferences") - .get(new ScreenLoadCallback(this) { - @Override - public void preDisplay(GeneralPreferences prefs) { - display(prefs); - } - }); + AccountApi.self() + .view("preferences") + .get( + new ScreenLoadCallback(this) { + @Override + public void preDisplay(GeneralPreferences prefs) { + display(prefs); + } + }); } private void enable(final boolean on) { @@ -299,9 +294,13 @@ public class MyPreferencesScreen extends SettingsScreen { showSiteHeader.setValue(p.showSiteHeader()); useFlashClipboard.setValue(p.useFlashClipboard()); setListBox(maximumPageSize, DEFAULT_PAGESIZE, p.changesPerPage()); - setListBox(dateFormat, GeneralPreferencesInfo.DateFormat.STD, // + setListBox( + dateFormat, + GeneralPreferencesInfo.DateFormat.STD, // p.dateFormat()); - setListBox(timeFormat, GeneralPreferencesInfo.TimeFormat.HHMM_12, // + setListBox( + timeFormat, + GeneralPreferencesInfo.TimeFormat.HHMM_12, // p.timeFormat()); highlightAssigneeInChangeTable.setValue(p.highlightAssigneeInChangeTable()); relativeDateInChangeTable.setValue(p.relativeDateInChangeTable()); @@ -309,16 +308,14 @@ public class MyPreferencesScreen extends SettingsScreen { legacycidInChangeTable.setValue(p.legacycidInChangeTable()); muteCommonPathPrefixes.setValue(p.muteCommonPathPrefixes()); signedOffBy.setValue(p.signedOffBy()); - setListBox(reviewCategoryStrategy, + setListBox( + reviewCategoryStrategy, GeneralPreferencesInfo.ReviewCategoryStrategy.NONE, p.reviewCategoryStrategy()); - setListBox(diffView, - GeneralPreferencesInfo.DiffView.SIDE_BY_SIDE, - p.diffView()); - setListBox(emailStrategy, - GeneralPreferencesInfo.EmailStrategy.ENABLED, - p.emailStrategy()); - setListBox(defaultBaseForMerges, + setListBox(diffView, GeneralPreferencesInfo.DiffView.SIDE_BY_SIDE, p.diffView()); + setListBox(emailStrategy, GeneralPreferencesInfo.EmailStrategy.ENABLED, p.emailStrategy()); + setListBox( + defaultBaseForMerges, GeneralPreferencesInfo.DefaultBase.FIRST_PARENT, p.defaultBaseForMerges()); display(p.my()); @@ -332,20 +329,19 @@ public class MyPreferencesScreen extends SettingsScreen { myMenus.display(values); } - private void setListBox(final ListBox f, final int defaultValue, - final int currentValue) { + private void setListBox(final ListBox f, final int defaultValue, final int currentValue) { setListBox(f, String.valueOf(defaultValue), String.valueOf(currentValue)); } - private > void setListBox(final ListBox f, - final T defaultValue, final T currentValue) { - setListBox(f, + private > void setListBox( + final ListBox f, final T defaultValue, final T currentValue) { + setListBox( + f, defaultValue != null ? defaultValue.name() : "", currentValue != null ? currentValue.name() : ""); } - private void setListBox(final ListBox f, final String defaultValue, - final String currentValue) { + private void setListBox(final ListBox f, final String defaultValue, final String currentValue) { final int n = f.getItemCount(); for (int i = 0; i < n; i++) { if (f.getValue(i).equals(currentValue)) { @@ -366,8 +362,7 @@ public class MyPreferencesScreen extends SettingsScreen { return defaultValue; } - private > T getListBox(final ListBox f, - final T defaultValue, T[] all) { + private > T getListBox(final ListBox f, final T defaultValue, T[] all) { final int idx = f.getSelectedIndex(); if (0 <= idx) { String v = f.getValue(idx); @@ -388,32 +383,42 @@ public class MyPreferencesScreen extends SettingsScreen { p.showSiteHeader(showSiteHeader.getValue()); p.useFlashClipboard(useFlashClipboard.getValue()); p.changesPerPage(getListBox(maximumPageSize, DEFAULT_PAGESIZE)); - p.dateFormat(getListBox(dateFormat, - GeneralPreferencesInfo.DateFormat.STD, - GeneralPreferencesInfo.DateFormat.values())); - p.timeFormat(getListBox(timeFormat, - GeneralPreferencesInfo.TimeFormat.HHMM_12, - GeneralPreferencesInfo.TimeFormat.values())); + p.dateFormat( + getListBox( + dateFormat, + GeneralPreferencesInfo.DateFormat.STD, + GeneralPreferencesInfo.DateFormat.values())); + p.timeFormat( + getListBox( + timeFormat, + GeneralPreferencesInfo.TimeFormat.HHMM_12, + GeneralPreferencesInfo.TimeFormat.values())); p.highlightAssigneeInChangeTable(highlightAssigneeInChangeTable.getValue()); p.relativeDateInChangeTable(relativeDateInChangeTable.getValue()); p.sizeBarInChangeTable(sizeBarInChangeTable.getValue()); p.legacycidInChangeTable(legacycidInChangeTable.getValue()); p.muteCommonPathPrefixes(muteCommonPathPrefixes.getValue()); p.signedOffBy(signedOffBy.getValue()); - p.reviewCategoryStrategy(getListBox(reviewCategoryStrategy, - ReviewCategoryStrategy.NONE, - ReviewCategoryStrategy.values())); - p.diffView(getListBox(diffView, - GeneralPreferencesInfo.DiffView.SIDE_BY_SIDE, - GeneralPreferencesInfo.DiffView.values())); + p.reviewCategoryStrategy( + getListBox( + reviewCategoryStrategy, ReviewCategoryStrategy.NONE, ReviewCategoryStrategy.values())); + p.diffView( + getListBox( + diffView, + GeneralPreferencesInfo.DiffView.SIDE_BY_SIDE, + GeneralPreferencesInfo.DiffView.values())); - p.emailStrategy(getListBox(emailStrategy, - GeneralPreferencesInfo.EmailStrategy.ENABLED, - GeneralPreferencesInfo.EmailStrategy.values())); + p.emailStrategy( + getListBox( + emailStrategy, + GeneralPreferencesInfo.EmailStrategy.ENABLED, + GeneralPreferencesInfo.EmailStrategy.values())); - p.defaultBaseForMerges(getListBox(defaultBaseForMerges, - GeneralPreferencesInfo.DefaultBase.FIRST_PARENT, - GeneralPreferencesInfo.DefaultBase.values())); + p.defaultBaseForMerges( + getListBox( + defaultBaseForMerges, + GeneralPreferencesInfo.DefaultBase.FIRST_PARENT, + GeneralPreferencesInfo.DefaultBase.values())); List items = new ArrayList<>(); for (List v : myMenus.getValues()) { @@ -424,45 +429,48 @@ public class MyPreferencesScreen extends SettingsScreen { enable(false); save.setEnabled(false); - AccountApi.self().view("preferences") - .put(p, new GerritCallback() { - @Override - public void onSuccess(GeneralPreferences prefs) { - Gerrit.setUserPreferences(prefs); - enable(true); - display(prefs); - } + AccountApi.self() + .view("preferences") + .put( + p, + new GerritCallback() { + @Override + public void onSuccess(GeneralPreferences prefs) { + Gerrit.setUserPreferences(prefs); + enable(true); + display(prefs); + } - @Override - public void onFailure(Throwable caught) { - enable(true); - save.setEnabled(true); - super.onFailure(caught); - } - }); + @Override + public void onFailure(Throwable caught) { + enable(true); + save.setEnabled(true); + super.onFailure(caught); + } + }); } private class MyMenuPanel extends StringListPanel { MyMenuPanel(Button save) { - super(Util.C.myMenu(), Arrays.asList(Util.C.myMenuName(), - Util.C.myMenuUrl()), save, false); + super(Util.C.myMenu(), Arrays.asList(Util.C.myMenuName(), Util.C.myMenuUrl()), save, false); setInfo(Util.C.myMenuInfo()); Button resetButton = new Button(Util.C.myMenuReset()); - resetButton.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - ConfigServerApi.defaultPreferences( - new GerritCallback() { - @Override - public void onSuccess(GeneralPreferences p) { - MyPreferencesScreen.this.display(p.my()); - widget.setEnabled(true); - } - }); - } - }); + resetButton.addClickHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + ConfigServerApi.defaultPreferences( + new GerritCallback() { + @Override + public void onSuccess(GeneralPreferences p) { + MyPreferencesScreen.this.display(p.my()); + widget.setEnabled(true); + } + }); + } + }); buttonPanel.add(resetButton); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyProfileScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyProfileScreen.java index 0dfea4fc00..9d676630d1 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyProfileScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyProfileScreen.java @@ -93,25 +93,26 @@ public class MyProfileScreen extends SettingsScreen { private void infoRow(final int row, final String name) { info.setText(row, labelIdx, name); - info.getCellFormatter().addStyleName(row, 0, - Gerrit.RESOURCES.css().header()); + info.getCellFormatter().addStyleName(row, 0, Gerrit.RESOURCES.css().header()); } void display(AccountInfo account) { if (Gerrit.info().plugin().hasAvatars()) { avatar.setAccount(account, 93, false); - new RestApi("/accounts/").id("self").view("avatar.change.url") - .get(new AsyncCallback() { - @Override - public void onSuccess(NativeString changeUrl) { - changeAvatar.setHref(changeUrl.asString()); - changeAvatar.setVisible(true); - } + new RestApi("/accounts/") + .id("self") + .view("avatar.change.url") + .get( + new AsyncCallback() { + @Override + public void onSuccess(NativeString changeUrl) { + changeAvatar.setHref(changeUrl.asString()); + changeAvatar.setVisible(true); + } - @Override - public void onFailure(Throwable caught) { - } - }); + @Override + public void onFailure(Throwable caught) {} + }); } int row = 0; diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MySshKeysScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MySshKeysScreen.java index b1d6d82889..6ba63aa044 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MySshKeysScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MySshKeysScreen.java @@ -20,12 +20,13 @@ public class MySshKeysScreen extends SettingsScreen { @Override protected void onInitUI() { super.onInitUI(); - panel = new SshPanel() { - @Override - void display() { - MySshKeysScreen.this.display(); - } - }; + panel = + new SshPanel() { + @Override + void display() { + MySshKeysScreen.this.display(); + } + }; add(panel); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyWatchedProjectsScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyWatchedProjectsScreen.java index ce5cfd3aa0..9fd4f7bcbe 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyWatchedProjectsScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyWatchedProjectsScreen.java @@ -76,28 +76,27 @@ public class MyWatchedProjectsScreen extends SettingsScreen { fp.add(addNew); add(fp); - /* bottom table */ add(watchesTab); add(delSel); - /* popup */ - projectsPopup = new ProjectListPopup() { - @Override - protected void onMovePointerTo(String projectName) { - // prevent user input from being overwritten by simply poping up - if (!projectsPopup.isPoppingUp() || "".equals(nameBox.getText())) { - nameBox.setText(projectName); - } - } + projectsPopup = + new ProjectListPopup() { + @Override + protected void onMovePointerTo(String projectName) { + // prevent user input from being overwritten by simply poping up + if (!projectsPopup.isPoppingUp() || "".equals(nameBox.getText())) { + nameBox.setText(projectName); + } + } - @Override - protected void openRow(String projectName) { - nameBox.setText(projectName); - doAddNew(); - } - }; + @Override + protected void openRow(String projectName) { + nameBox.setText(projectName); + doAddNew(); + } + }; projectsPopup.initPopup(Util.C.projects(), PageLinks.SETTINGS_PROJECTS); } @@ -105,57 +104,64 @@ public class MyWatchedProjectsScreen extends SettingsScreen { nameBox = new RemoteSuggestBox(new ProjectNameSuggestOracle()); nameBox.setVisibleLength(50); nameBox.setHintText(Util.C.defaultProjectName()); - nameBox.addSelectionHandler(new SelectionHandler() { - @Override - public void onSelection(SelectionEvent event) { - doAddNew(); - } - }); + nameBox.addSelectionHandler( + new SelectionHandler() { + @Override + public void onSelection(SelectionEvent event) { + doAddNew(); + } + }); filterTxt = new HintTextBox(); filterTxt.setVisibleLength(50); filterTxt.setHintText(Util.C.defaultFilter()); - filterTxt.addKeyPressHandler(new KeyPressHandler() { - @Override - public void onKeyPress(KeyPressEvent event) { - if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) { - doAddNew(); - } - } - }); + filterTxt.addKeyPressHandler( + new KeyPressHandler() { + @Override + public void onKeyPress(KeyPressEvent event) { + if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) { + doAddNew(); + } + } + }); addNew = new Button(Util.C.buttonWatchProject()); - addNew.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - doAddNew(); - } - }); + addNew.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + doAddNew(); + } + }); browse = new Button(Util.C.buttonBrowseProjects()); - browse.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - int top = grid.getAbsoluteTop() - 50; // under page header - // Try to place it to the right of everything else, but not - // right justified - int left = - 5 + Math.max(grid.getAbsoluteLeft() + grid.getOffsetWidth(), - watchesTab.getAbsoluteLeft() + watchesTab.getOffsetWidth()); - projectsPopup.setPreferredCoordinates(top, left); - projectsPopup.displayPopup(); - } - }); + browse.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + int top = grid.getAbsoluteTop() - 50; // under page header + // Try to place it to the right of everything else, but not + // right justified + int left = + 5 + + Math.max( + grid.getAbsoluteLeft() + grid.getOffsetWidth(), + watchesTab.getAbsoluteLeft() + watchesTab.getOffsetWidth()); + projectsPopup.setPreferredCoordinates(top, left); + projectsPopup.displayPopup(); + } + }); watchesTab = new MyWatchesTable(); delSel = new Button(Util.C.buttonDeleteSshKey()); - delSel.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - watchesTab.deleteChecked(); - } - }); + delSel.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + watchesTab.deleteChecked(); + } + }); } @Override @@ -177,8 +183,7 @@ public class MyWatchedProjectsScreen extends SettingsScreen { } String filter = filterTxt.getText(); - if (filter == null || filter.isEmpty() - || filter.equals(Util.C.defaultFilter())) { + if (filter == null || filter.isEmpty() || filter.equals(Util.C.defaultFilter())) { filter = null; } @@ -186,12 +191,13 @@ public class MyWatchedProjectsScreen extends SettingsScreen { nameBox.setEnabled(false); filterTxt.setEnabled(false); - final ProjectWatchInfo projectWatchInfo = JavaScriptObject - .createObject().cast(); + final ProjectWatchInfo projectWatchInfo = JavaScriptObject.createObject().cast(); projectWatchInfo.project(projectName); projectWatchInfo.filter(filterTxt.getText()); - AccountApi.updateWatchedProject("self", projectWatchInfo, + AccountApi.updateWatchedProject( + "self", + projectWatchInfo, new GerritCallback>() { @Override public void onSuccess(JsArray watchedProjects) { @@ -214,13 +220,14 @@ public class MyWatchedProjectsScreen extends SettingsScreen { } protected void populateWatches() { - AccountApi.getWatchedProjects("self", + AccountApi.getWatchedProjects( + "self", new GerritCallback>() { - @Override - public void onSuccess(JsArray watchedProjects) { - display(); - watchesTab.display(watchedProjects); - } - }); + @Override + public void onSuccess(JsArray watchedProjects) { + display(); + watchesTab.display(watchedProjects); + } + }); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyWatchesTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyWatchesTable.java index 3647baf50d..5e45b683fb 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyWatchesTable.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyWatchesTable.java @@ -27,7 +27,6 @@ import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Label; - import java.util.HashSet; import java.util.Set; @@ -64,7 +63,9 @@ public class MyWatchesTable extends FancyFlexTable { public void deleteChecked() { final Set infos = getCheckedProjectWatchInfos(); if (!infos.isEmpty()) { - AccountApi.deleteWatchedProjects("self", infos, + AccountApi.deleteWatchedProjects( + "self", + infos, new GerritCallback>() { @Override public void onSuccess(JsArray watchedProjects) { @@ -75,7 +76,7 @@ public class MyWatchesTable extends FancyFlexTable { } protected void remove(Set infos) { - for (int row = 1; row < table.getRowCount();) { + for (int row = 1; row < table.getRowCount(); ) { final ProjectWatchInfo k = getRowItem(row); if (k != null && infos.contains(k)) { table.removeRow(row); @@ -126,8 +127,7 @@ public class MyWatchesTable extends FancyFlexTable { protected void populate(final int row, final ProjectWatchInfo info) { final FlowPanel fp = new FlowPanel(); - fp.add(new ProjectLink(info.project(), - new Project.NameKey(info.project()))); + fp.add(new ProjectLink(info.project(), new Project.NameKey(info.project()))); if (info.filter() != null) { Label filter = new Label(info.filter()); filter.setStyleName(Gerrit.RESOURCES.css().watchedProjectFilter()); @@ -155,34 +155,37 @@ public class MyWatchesTable extends FancyFlexTable { setRowItem(row, info); } - protected void addNotifyButton(final ProjectWatchInfo.Type type, - final ProjectWatchInfo info, final int row, final int col) { + protected void addNotifyButton( + final ProjectWatchInfo.Type type, final ProjectWatchInfo info, final int row, final int col) { final CheckBox cbox = new CheckBox(); - cbox.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - final Boolean oldVal = info.notify(type); - info.notify(type, cbox.getValue()); - cbox.setEnabled(false); + cbox.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + final Boolean oldVal = info.notify(type); + info.notify(type, cbox.getValue()); + cbox.setEnabled(false); - AccountApi.updateWatchedProject("self", info, - new GerritCallback>() { - @Override - public void onSuccess(JsArray watchedProjects) { - cbox.setEnabled(true); - } + AccountApi.updateWatchedProject( + "self", + info, + new GerritCallback>() { + @Override + public void onSuccess(JsArray watchedProjects) { + cbox.setEnabled(true); + } - @Override - public void onFailure(Throwable caught) { - cbox.setEnabled(true); - info.notify(type, oldVal); - cbox.setValue(oldVal); - super.onFailure(caught); - } - }); - } - }); + @Override + public void onFailure(Throwable caught) { + cbox.setEnabled(true); + info.notify(type, oldVal); + cbox.setValue(oldVal); + super.onFailure(caught); + } + }); + } + }); cbox.setValue(info.notify(type)); table.setWidget(row, col, cbox); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/NewAgreementScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/NewAgreementScreen.java index e7fa14c5a7..afba2e232c 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/NewAgreementScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/NewAgreementScreen.java @@ -43,7 +43,6 @@ import com.google.gwt.user.client.ui.Panel; import com.google.gwt.user.client.ui.RadioButton; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwtexpui.globalkey.client.NpTextBox; - import java.util.HashSet; import java.util.List; import java.util.Set; @@ -75,18 +74,19 @@ public class NewAgreementScreen extends AccountScreen { protected void onLoad() { super.onLoad(); AccountApi.getAgreements( - "self", new GerritCallback>() { - @Override - public void onSuccess(JsArray result) { - if (isAttached()) { - mySigned = new HashSet<>(); - for (AgreementInfo info: Natives.asList(result)) { - mySigned.add(info.name()); + "self", + new GerritCallback>() { + @Override + public void onSuccess(JsArray result) { + if (isAttached()) { + mySigned = new HashSet<>(); + for (AgreementInfo info : Natives.asList(result)) { + mySigned.add(info.name()); + } + postRPC(); + } } - postRPC(); - } - } - }); + }); available = Gerrit.info().auth().contributorAgreements(); postRPC(); @@ -102,8 +102,7 @@ public class NewAgreementScreen extends AccountScreen { formBody.add(radios); agreementGroup = new FlowPanel(); - agreementGroup - .add(new SmallHeading(Util.C.newAgreementReviewLegalHeading())); + agreementGroup.add(new SmallHeading(Util.C.newAgreementReviewLegalHeading())); agreementHtml = new HTML(); agreementHtml.setStyleName(Gerrit.RESOURCES.css().contributorAgreementLegal()); @@ -120,12 +119,13 @@ public class NewAgreementScreen extends AccountScreen { fp.add(new InlineLabel(Util.M.enterIAGREE(Util.C.newAgreementIAGREE()))); finalGroup.add(fp); submit = new Button(Util.C.buttonSubmitNewAgreement()); - submit.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - doSign(); - } - }); + submit.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + doSign(); + } + }); finalGroup.add(submit); formBody.add(finalGroup); new OnEditEnabler(submit, yesIAgreeBox); @@ -167,12 +167,13 @@ public class NewAgreementScreen extends AccountScreen { l.setStyleName(Gerrit.RESOURCES.css().contributorAgreementAlreadySubmitted()); radios.add(l); } else { - r.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - showCLA(cla); - } - }); + r.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + showCLA(cla); + } + }); } if (cla.description() != null && !cla.description().equals("")) { @@ -186,9 +187,7 @@ public class NewAgreementScreen extends AccountScreen { private void doSign() { submit.setEnabled(false); - if (current == null - || !Util.C.newAgreementIAGREE() - .equalsIgnoreCase(yesIAgreeBox.getText())) { + if (current == null || !Util.C.newAgreementIAGREE().equalsIgnoreCase(yesIAgreeBox.getText())) { yesIAgreeBox.setText(""); yesIAgreeBox.setFocus(true); return; @@ -197,7 +196,9 @@ public class NewAgreementScreen extends AccountScreen { } private void doEnterAgreement() { - AccountApi.enterAgreement("self", current.name(), + AccountApi.enterAgreement( + "self", + current.name(), new GerritCallback() { @Override public void onSuccess(NativeString result) { @@ -222,23 +223,25 @@ public class NewAgreementScreen extends AccountScreen { url = GWT.getHostPageBaseURL() + url; } final RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, url); - rb.setCallback(new RequestCallback() { - @Override - public void onError(Request request, Throwable exception) { - new ErrorDialog(exception).center(); - } + rb.setCallback( + new RequestCallback() { + @Override + public void onError(Request request, Throwable exception) { + new ErrorDialog(exception).center(); + } - @Override - public void onResponseReceived(Request request, Response response) { - final String ct = response.getHeader("Content-Type"); - if (response.getStatusCode() == 200 && ct != null - && (ct.equals("text/html") || ct.startsWith("text/html;"))) { - agreementHtml.setHTML(response.getText()); - } else { - new ErrorDialog(response.getStatusText()).center(); - } - } - }); + @Override + public void onResponseReceived(Request request, Response response) { + final String ct = response.getHeader("Content-Type"); + if (response.getStatusCode() == 200 + && ct != null + && (ct.equals("text/html") || ct.startsWith("text/html;"))) { + agreementHtml.setHTML(response.getText()); + } else { + new ErrorDialog(response.getStatusText()).center(); + } + } + }); try { rb.send(); } catch (RequestException e) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ProjectWatchInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ProjectWatchInfo.java index e43ec0ca7c..fab25ae1c4 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ProjectWatchInfo.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ProjectWatchInfo.java @@ -26,9 +26,11 @@ public class ProjectWatchInfo extends JavaScriptObject { } public final native String project() /*-{ return this.project; }-*/; + public final native String filter() /*-{ return this.filter; }-*/; public final native void project(String s) /*-{ this.project = s; }-*/; + public final native void filter(String s) /*-{ this.filter = s; }-*/; public final void notify(ProjectWatchInfo.Type t, Boolean b) { @@ -61,19 +63,35 @@ public class ProjectWatchInfo extends JavaScriptObject { return Boolean.valueOf(b); } - private native boolean notifyNewChanges() /*-{ return this['notify_new_changes'] ? true : false; }-*/; - private native boolean notifyNewPatchSets() /*-{ return this['notify_new_patch_sets'] ? true : false; }-*/; - private native boolean notifyAllComments() /*-{ return this['notify_all_comments'] ? true : false; }-*/; - private native boolean notifySubmittedChanges() /*-{ return this['notify_submitted_changes'] ? true : false; }-*/; - private native boolean notifyAbandonedChanges() /*-{ return this['notify_abandoned_changes'] ? true : false; }-*/; + private native boolean + notifyNewChanges() /*-{ return this['notify_new_changes'] ? true : false; }-*/; - private native void notifyNewChanges(boolean b) /*-{ this['notify_new_changes'] = b ? true : null; }-*/; - private native void notifyNewPatchSets(boolean b) /*-{ this['notify_new_patch_sets'] = b ? true : null; }-*/; - private native void notifyAllComments(boolean b) /*-{ this['notify_all_comments'] = b ? true : null; }-*/; - private native void notifySubmittedChanges(boolean b) /*-{ this['notify_submitted_changes'] = b ? true : null; }-*/; - private native void notifyAbandonedChanges(boolean b) /*-{ this['notify_abandoned_changes'] = b ? true : null; }-*/; + private native boolean + notifyNewPatchSets() /*-{ return this['notify_new_patch_sets'] ? true : false; }-*/; - protected ProjectWatchInfo() { + private native boolean + notifyAllComments() /*-{ return this['notify_all_comments'] ? true : false; }-*/; - } + private native boolean + notifySubmittedChanges() /*-{ return this['notify_submitted_changes'] ? true : false; }-*/; + + private native boolean + notifyAbandonedChanges() /*-{ return this['notify_abandoned_changes'] ? true : false; }-*/; + + private native void notifyNewChanges( + boolean b) /*-{ this['notify_new_changes'] = b ? true : null; }-*/; + + private native void notifyNewPatchSets( + boolean b) /*-{ this['notify_new_patch_sets'] = b ? true : null; }-*/; + + private native void notifyAllComments( + boolean b) /*-{ this['notify_all_comments'] = b ? true : null; }-*/; + + private native void notifySubmittedChanges( + boolean b) /*-{ this['notify_submitted_changes'] = b ? true : null; }-*/; + + private native void notifyAbandonedChanges( + boolean b) /*-{ this['notify_abandoned_changes'] = b ? true : null; }-*/; + + protected ProjectWatchInfo() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/RegisterScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/RegisterScreen.java index 73557aafcb..d3d217c960 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/RegisterScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/RegisterScreen.java @@ -54,19 +54,20 @@ public class RegisterScreen extends AccountScreen { final HTML whereFrom = new HTML(Util.C.welcomeContactFrom()); whereFrom.setStyleName(Gerrit.RESOURCES.css().registerScreenExplain()); contactGroup.add(whereFrom); - contactGroup.add(new ContactPanelShort() { - @Override - protected void display(AccountInfo account) { - super.display(account); + contactGroup.add( + new ContactPanelShort() { + @Override + protected void display(AccountInfo account) { + super.display(account); - if ("".equals(nameTxt.getText())) { - // No name? Encourage the user to provide us something. - // - nameTxt.setFocus(true); - save.setEnabled(true); - } - } - }); + if ("".equals(nameTxt.getText())) { + // No name? Encourage the user to provide us something. + // + nameTxt.setFocus(true); + save.setEnabled(true); + } + } + }); formBody.add(contactGroup); if (Gerrit.getUserAccount().username() == null @@ -106,11 +107,12 @@ public class RegisterScreen extends AccountScreen { final HTML whySshKey = new HTML(Util.C.welcomeSshKeyText()); whySshKey.setStyleName(Gerrit.RESOURCES.css().registerScreenExplain()); sshKeyGroup.add(whySshKey); - sshKeyGroup.add(new SshPanel() { - { - setKeyTableVisible(false); - } - }); + sshKeyGroup.add( + new SshPanel() { + { + setKeyTableVisible(false); + } + }); formBody.add(sshKeyGroup); } @@ -124,10 +126,8 @@ public class RegisterScreen extends AccountScreen { whyAgreement.setStyleName(Gerrit.RESOURCES.css().registerScreenExplain()); agreementGroup.add(whyAgreement); - choices.add(new InlineHyperlink(Util.C.newAgreement(), - PageLinks.SETTINGS_NEW_AGREEMENT)); - choices - .add(new InlineHyperlink(Util.C.welcomeAgreementLater(), nextToken)); + choices.add(new InlineHyperlink(Util.C.newAgreement(), PageLinks.SETTINGS_NEW_AGREEMENT)); + choices.add(new InlineHyperlink(Util.C.welcomeAgreementLater(), nextToken)); formBody.add(agreementGroup); } else { choices.add(new InlineHyperlink(Util.C.welcomeContinue(), nextToken)); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/SettingsScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/SettingsScreen.java index ee7407e6ef..49ce13e3e4 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/SettingsScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/SettingsScreen.java @@ -21,7 +21,6 @@ import com.google.gerrit.client.api.ExtensionSettingsScreen; import com.google.gerrit.client.rpc.Natives; import com.google.gerrit.client.ui.MenuScreen; import com.google.gerrit.common.PageLinks; - import java.util.HashSet; import java.util.Set; @@ -47,8 +46,7 @@ public abstract class SettingsScreen extends MenuScreen { if (Gerrit.info().auth().isHttpPasswordSettingsEnabled()) { linkByGerrit(Util.C.tabHttpAccess(), PageLinks.SETTINGS_HTTP_PASSWORD); } - if (Gerrit.info().auth().isOAuth() - && Gerrit.info().auth().isGitBasicAuth()) { + if (Gerrit.info().auth().isOAuth() && Gerrit.info().auth().isGitBasicAuth()) { linkByGerrit(Util.C.tabOAuthToken(), PageLinks.SETTINGS_OAUTH_TOKEN); } if (Gerrit.info().gerrit().editGpgKeys()) { @@ -72,8 +70,7 @@ public abstract class SettingsScreen extends MenuScreen { for (String pluginName : ExtensionSettingsScreen.Definition.plugins()) { for (ExtensionSettingsScreen.Definition def : Natives.asList(ExtensionSettingsScreen.Definition.get(pluginName))) { - linkByPlugin(pluginName, def.getMenu(), - PageLinks.toSettings(pluginName, def.getPath())); + linkByPlugin(pluginName, def.getMenu(), PageLinks.toSettings(pluginName, def.getPath())); } } } @@ -96,11 +93,9 @@ public abstract class SettingsScreen extends MenuScreen { setPageTitle(Util.C.settingsHeading()); } - protected ExtensionPanel createExtensionPoint( - GerritUiExtensionPoint extensionPoint) { + protected ExtensionPanel createExtensionPoint(GerritUiExtensionPoint extensionPoint) { ExtensionPanel extensionPanel = new ExtensionPanel(extensionPoint); - extensionPanel.putObject(GerritUiExtensionPoint.Key.ACCOUNT_INFO, - Gerrit.getUserAccount()); + extensionPanel.putObject(GerritUiExtensionPoint.Key.ACCOUNT_INFO, Gerrit.getUserAccount()); return extensionPanel; } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/SshKeyInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/SshKeyInfo.java index a4fed8b8b6..23b3d2d9a2 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/SshKeyInfo.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/SshKeyInfo.java @@ -18,12 +18,16 @@ import com.google.gwt.core.client.JavaScriptObject; public class SshKeyInfo extends JavaScriptObject { public final native int seq() /*-{ return this.seq || 0; }-*/; + public final native String sshPublicKey() /*-{ return this.ssh_public_key; }-*/; + public final native String encodedKey() /*-{ return this.encoded_key; }-*/; + public final native String algorithm() /*-{ return this.algorithm; }-*/; + public final native String comment() /*-{ return this.comment; }-*/; + public final native boolean isValid() /*-{ return this['valid'] ? true : false; }-*/; - protected SshKeyInfo() { - } + protected SshKeyInfo() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/SshPanel.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/SshPanel.java index 37ad764b41..0cf30de555 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/SshPanel.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/SshPanel.java @@ -42,7 +42,6 @@ import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwtexpui.clippy.client.CopyableLabel; import com.google.gwtexpui.globalkey.client.NpTextArea; import com.google.gwtjsonrpc.client.RemoteJsonException; - import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -66,12 +65,13 @@ class SshPanel extends Composite { final FlowPanel body = new FlowPanel(); showAddKeyBlock = new Button(Util.C.buttonShowAddSshKey()); - showAddKeyBlock.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - showAddKeyBlock(true); - } - }); + showAddKeyBlock.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + showAddKeyBlock(true); + } + }); keys = new SshKeyTable(); body.add(keys); @@ -79,12 +79,13 @@ class SshPanel extends Composite { final FlowPanel fp = new FlowPanel(); deleteKey = new Button(Util.C.buttonDeleteSshKey()); deleteKey.setEnabled(false); - deleteKey.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - keys.deleteChecked(); - } - }); + deleteKey.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + keys.deleteChecked(); + } + }); fp.add(deleteKey); fp.add(showAddKeyBlock); body.add(fp); @@ -110,35 +111,37 @@ class SshPanel extends Composite { addKeyBlock.add(buttons); clearNew = new Button(Util.C.buttonClearSshKeyInput()); - clearNew.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - addTxt.setText(""); - addTxt.setFocus(true); - } - }); + clearNew.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + addTxt.setText(""); + addTxt.setFocus(true); + } + }); buttons.add(clearNew); addNew = new Button(Util.C.buttonAddSshKey()); - addNew.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - doAddNew(); - } - }); + addNew.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + doAddNew(); + } + }); buttons.add(addNew); closeAddKeyBlock = new Button(Util.C.buttonCloseAddSshKey()); - closeAddKeyBlock.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - showAddKeyBlock(false); - } - }); + closeAddKeyBlock.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + showAddKeyBlock(false); + } + }); buttons.add(closeAddKeyBlock); buttons.setCellWidth(closeAddKeyBlock, "100%"); - buttons.setCellHorizontalAlignment(closeAddKeyBlock, - HasHorizontalAlignment.ALIGN_RIGHT); + buttons.setCellHorizontalAlignment(closeAddKeyBlock, HasHorizontalAlignment.ALIGN_RIGHT); body.add(addKeyBlock); @@ -158,39 +161,42 @@ class SshPanel extends Composite { final String txt = addTxt.getText(); if (txt != null && txt.length() > 0) { addNew.setEnabled(false); - AccountApi.addSshKey("self", txt, new GerritCallback() { - @Override - public void onSuccess(final SshKeyInfo k) { - addNew.setEnabled(true); - addTxt.setText(""); - keys.addOneKey(k); - if (!keys.isVisible()) { - showAddKeyBlock(false); - setKeyTableVisible(true); - keys.updateDeleteButton(); - } - } + AccountApi.addSshKey( + "self", + txt, + new GerritCallback() { + @Override + public void onSuccess(final SshKeyInfo k) { + addNew.setEnabled(true); + addTxt.setText(""); + keys.addOneKey(k); + if (!keys.isVisible()) { + showAddKeyBlock(false); + setKeyTableVisible(true); + keys.updateDeleteButton(); + } + } - @Override - public void onFailure(final Throwable caught) { - addNew.setEnabled(true); + @Override + public void onFailure(final Throwable caught) { + addNew.setEnabled(true); - if (isInvalidSshKey(caught)) { - new ErrorDialog(Util.C.invalidSshKeyError()).center(); + if (isInvalidSshKey(caught)) { + new ErrorDialog(Util.C.invalidSshKeyError()).center(); - } else { - super.onFailure(caught); - } - } + } else { + super.onFailure(caught); + } + } - private boolean isInvalidSshKey(final Throwable caught) { - if (caught instanceof InvalidSshKeyException) { - return true; - } - return caught instanceof RemoteJsonException - && InvalidSshKeyException.MESSAGE.equals(caught.getMessage()); - } - }); + private boolean isInvalidSshKey(final Throwable caught) { + if (caught instanceof InvalidSshKeyException) { + return true; + } + return caught instanceof RemoteJsonException + && InvalidSshKeyException.MESSAGE.equals(caught.getMessage()); + } + }); } } @@ -198,37 +204,39 @@ class SshPanel extends Composite { protected void onLoad() { super.onLoad(); refreshSshKeys(); - Gerrit.SYSTEM_SVC.daemonHostKeys(new GerritCallback>() { - @Override - public void onSuccess(final List result) { - serverKeys.clear(); - for (final SshHostKey keyInfo : result) { - serverKeys.add(new SshHostKeyPanel(keyInfo)); - } - if (++loadCount == 2) { - display(); - } - } - }); + Gerrit.SYSTEM_SVC.daemonHostKeys( + new GerritCallback>() { + @Override + public void onSuccess(final List result) { + serverKeys.clear(); + for (final SshHostKey keyInfo : result) { + serverKeys.add(new SshHostKeyPanel(keyInfo)); + } + if (++loadCount == 2) { + display(); + } + } + }); } private void refreshSshKeys() { - AccountApi.getSshKeys("self", new GerritCallback>() { - @Override - public void onSuccess(JsArray result) { - keys.display(Natives.asList(result)); - if (result.length() == 0 && keys.isVisible()) { - showAddKeyBlock(true); - } - if (++loadCount == 2) { - display(); - } - } - }); + AccountApi.getSshKeys( + "self", + new GerritCallback>() { + @Override + public void onSuccess(JsArray result) { + keys.display(Natives.asList(result)); + if (result.length() == 0 && keys.isVisible()) { + showAddKeyBlock(true); + } + if (++loadCount == 2) { + display(); + } + } + }); } - void display() { - } + void display() {} private void showAddKeyBlock(final boolean show) { showAddKeyBlock.setVisible(!show); @@ -252,12 +260,13 @@ class SshPanel extends Composite { fmt.addStyleName(0, 4, Gerrit.RESOURCES.css().dataHeader()); fmt.addStyleName(0, 5, Gerrit.RESOURCES.css().dataHeader()); - updateDeleteHandler = new ValueChangeHandler() { - @Override - public void onValueChange(ValueChangeEvent event) { - updateDeleteButton(); - } - }; + updateDeleteHandler = + new ValueChangeHandler() { + @Override + public void onValueChange(ValueChangeEvent event) { + updateDeleteButton(); + } + }; } void deleteChecked() { @@ -272,11 +281,13 @@ class SshPanel extends Composite { updateDeleteButton(); } else { deleteKey.setEnabled(false); - AccountApi.deleteSshKeys("self", sequenceNumbers, + AccountApi.deleteSshKeys( + "self", + sequenceNumbers, new GerritCallback() { @Override public void onSuccess(VoidResult result) { - for (int row = 1; row < table.getRowCount();) { + for (int row = 1; row < table.getRowCount(); ) { final SshKeyInfo k = getRowItem(row); if (k != null && sequenceNumbers.contains(k.seq())) { table.removeRow(row); @@ -285,7 +296,7 @@ class SshPanel extends Composite { } } if (table.getRowCount() == 1) { - display(Collections. emptyList()); + display(Collections.emptyList()); } else { updateDeleteButton(); } @@ -329,7 +340,9 @@ class SshPanel extends Composite { table.setWidget(row, 1, sel); if (k.isValid()) { table.setText(row, 2, ""); - fmt.removeStyleName(row, 2, // + fmt.removeStyleName( + row, + 2, // Gerrit.RESOURCES.css().sshKeyPanelInvalid()); } else { table.setText(row, 2, Util.C.sshKeyInvalid()); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/UsernameField.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/UsernameField.java index d70121bd5b..839a3e60cd 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/UsernameField.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/UsernameField.java @@ -59,24 +59,26 @@ class UsernameField extends Composite { userNameTxt.addKeyPressHandler(new UserNameValidator()); userNameTxt.addStyleName(Gerrit.RESOURCES.css().accountUsername()); userNameTxt.setVisibleLength(16); - userNameTxt.addKeyPressHandler(new KeyPressHandler() { - @Override - public void onKeyPress(KeyPressEvent event) { - if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) { - confirmSetUserName(); - } - } - }); + userNameTxt.addKeyPressHandler( + new KeyPressHandler() { + @Override + public void onKeyPress(KeyPressEvent event) { + if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) { + confirmSetUserName(); + } + } + }); setUserName = new Button(Util.C.buttonSetUserName()); setUserName.setVisible(canEditUserName()); setUserName.setEnabled(false); - setUserName.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - confirmSetUserName(); - } - }); + setUserName.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + confirmSetUserName(); + } + }); new OnEditEnabler(setUserName, userNameTxt); userNameLbl.setVisible(false); @@ -92,14 +94,15 @@ class UsernameField extends Composite { private void confirmSetUserName() { new ConfirmationDialog( - Util.C.confirmSetUserNameTitle(), - new SafeHtmlBuilder().append(Util.C.confirmSetUserName()), - new ConfirmationCallback() { - @Override - public void onOk() { - doSetUserName(); - } - }).center(); + Util.C.confirmSetUserNameTitle(), + new SafeHtmlBuilder().append(Util.C.confirmSetUserName()), + new ConfirmationCallback() { + @Override + public void onOk() { + doSetUserName(); + } + }) + .center(); } private void doSetUserName() { @@ -115,27 +118,29 @@ class UsernameField extends Composite { } final String newUserName = newName; - AccountApi.setUsername("self", newUserName, + AccountApi.setUsername( + "self", + newUserName, new GerritCallback() { - @Override - public void onSuccess(NativeString result) { - Gerrit.getUserAccount().username(newUserName); - userNameLbl.setText(newUserName); - userNameLbl.setVisible(true); - userNameTxt.setVisible(false); - setUserName.setVisible(false); - } + @Override + public void onSuccess(NativeString result) { + Gerrit.getUserAccount().username(newUserName); + userNameLbl.setText(newUserName); + userNameLbl.setVisible(true); + userNameTxt.setVisible(false); + setUserName.setVisible(false); + } - @Override - public void onFailure(Throwable caught) { - enableUI(true); - if (RestApi.isExpected(422 /* Unprocessable Entity */)) { - new ErrorDialog(Util.C.invalidUserName()).center(); - } else { - super.onFailure(caught); - } - } - }); + @Override + public void onFailure(Throwable caught) { + enableUI(true); + if (RestApi.isExpected(422 /* Unprocessable Entity */)) { + new ErrorDialog(Util.C.invalidUserName()).center(); + } else { + super.onFailure(caught); + } + } + }); } private void enableUI(final boolean on) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ValidateEmailScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ValidateEmailScreen.java index b79723b872..990798c997 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ValidateEmailScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ValidateEmailScreen.java @@ -37,11 +37,11 @@ public class ValidateEmailScreen extends AccountScreen { @Override protected void onLoad() { super.onLoad(); - ConfigServerApi.confirmEmail(magicToken, + ConfigServerApi.confirmEmail( + magicToken, new ScreenLoadCallback(this) { @Override - protected void preDisplay(final VoidResult result) { - } + protected void preDisplay(final VoidResult result) {} @Override protected void postDisplay() { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/actions/ActionButton.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/actions/ActionButton.java index 39849c4c1d..85937dbece 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/actions/ActionButton.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/actions/ActionButton.java @@ -43,8 +43,7 @@ public class ActionButton extends Button implements ClickHandler { this(project, null, null, null, null, action); } - public ActionButton(Project.NameKey project, BranchInfo branch, - ActionInfo action) { + public ActionButton(Project.NameKey project, BranchInfo branch, ActionInfo action) { this(project, branch, null, null, null, action); } @@ -52,18 +51,18 @@ public class ActionButton extends Button implements ClickHandler { this(null, null, change, null, null, action); } - public ActionButton(ChangeInfo change, RevisionInfo revision, - ActionInfo action) { + public ActionButton(ChangeInfo change, RevisionInfo revision, ActionInfo action) { this(null, null, change, null, revision, action); } - private ActionButton(Project.NameKey project, BranchInfo branch, - ChangeInfo change, EditInfo edit, RevisionInfo revision, + private ActionButton( + Project.NameKey project, + BranchInfo branch, + ChangeInfo change, + EditInfo edit, + RevisionInfo revision, ActionInfo action) { - super(new SafeHtmlBuilder() - .openDiv() - .append(action.label()) - .closeDiv()); + super(new SafeHtmlBuilder().openDiv().append(action.label()).closeDiv()); setStyleName(""); setTitle(action.title()); setEnabled(action.enabled()); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccessSectionEditor.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccessSectionEditor.java index af0b1f5b91..afa0de6e27 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccessSectionEditor.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccessSectionEditor.java @@ -44,46 +44,36 @@ import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.ValueListBox; - import java.util.ArrayList; import java.util.Collections; import java.util.List; -public class AccessSectionEditor extends Composite implements - Editor, ValueAwareEditor { - interface Binder extends UiBinder { - } +public class AccessSectionEditor extends Composite + implements Editor, ValueAwareEditor { + interface Binder extends UiBinder {} private static final Binder uiBinder = GWT.create(Binder.class); - @UiField - ValueEditor name; + @UiField ValueEditor name; - @UiField - FlowPanel permissionContainer; + @UiField FlowPanel permissionContainer; ListEditor permissions; - @UiField - DivElement addContainer; + @UiField DivElement addContainer; + @UiField(provided = true) @Editor.Ignore ValueListBox permissionSelector; - @UiField - SpanElement deletedName; + @UiField SpanElement deletedName; - @UiField - Anchor deleteSection; + @UiField Anchor deleteSection; - @UiField - DivElement normal; - @UiField - DivElement deleted; + @UiField DivElement normal; + @UiField DivElement deleted; - @UiField - SpanElement sectionType; - @UiField - SpanElement sectionName; + @UiField SpanElement sectionType; + @UiField SpanElement sectionName; private final ProjectAccess projectAccess; private AccessSection value; @@ -93,16 +83,16 @@ public class AccessSectionEditor extends Composite implements public AccessSectionEditor(ProjectAccess access) { projectAccess = access; - permissionSelector = new ValueListBox<>( - new PermissionNameRenderer(access.getCapabilities())); - permissionSelector.addValueChangeHandler(new ValueChangeHandler() { - @Override - public void onValueChange(ValueChangeEvent event) { - if (!Util.C.addPermission().equals(event.getValue())) { - onAddPermission(event.getValue()); - } - } - }); + permissionSelector = new ValueListBox<>(new PermissionNameRenderer(access.getCapabilities())); + permissionSelector.addValueChangeHandler( + new ValueChangeHandler() { + @Override + public void onValueChange(ValueChangeEvent event) { + if (!Util.C.addPermission().equals(event.getValue())) { + onAddPermission(event.getValue()); + } + } + }); initWidget(uiBinder.createAndBindUi(this)); permissions = ListEditor.of(new PermissionEditorSource()); @@ -122,8 +112,7 @@ public class AccessSectionEditor extends Composite implements void onDeleteSection(@SuppressWarnings("unused") ClickEvent event) { isDeleted = true; - if (name.isVisible() - && RefConfigSection.isValid(name.getValue())) { + if (name.isVisible() && RefConfigSection.isValid(name.getValue())) { deletedName.setInnerText(Util.M.deletedReference(name.getValue())); } else { @@ -159,12 +148,14 @@ public class AccessSectionEditor extends Composite implements void editRefPattern() { name.edit(); - Scheduler.get().scheduleDeferred(new ScheduledCommand() { - @Override - public void execute() { - name.setFocus(true); - } - }); + Scheduler.get() + .scheduleDeferred( + new ScheduledCommand() { + @Override + public void execute() { + name.setFocus(true); + } + }); } void enableEditing() { @@ -246,8 +237,7 @@ public class AccessSectionEditor extends Composite implements } } - private void addPermission(final String permissionName, - final List permissionList) { + private void addPermission(final String permissionName, final List permissionList) { if (value.getPermission(permissionName) != null) { return; } @@ -273,19 +263,16 @@ public class AccessSectionEditor extends Composite implements } @Override - public void onPropertyChange(String... paths) { - } + public void onPropertyChange(String... paths) {} @Override - public void setDelegate(EditorDelegate delegate) { - } + public void setDelegate(EditorDelegate delegate) {} private class PermissionEditorSource extends EditorSource { @Override public PermissionEditor create(int index) { PermissionEditor subEditor = - new PermissionEditor(projectAccess, readOnly, value, - projectAccess.getLabelTypes()); + new PermissionEditor(projectAccess, readOnly, value, projectAccess.getLabelTypes()); permissionContainer.insert(subEditor, index); return subEditor; } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupAuditLogScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupAuditLogScreen.java index 7a32f0143f..16a51e119f 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupAuditLogScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupAuditLogScreen.java @@ -32,7 +32,6 @@ import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gwt.core.client.JsArray; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter; - import java.util.List; public class AccountGroupAuditLogScreen extends AccountGroupScreen { @@ -52,7 +51,8 @@ public class AccountGroupAuditLogScreen extends AccountGroupScreen { @Override protected void display(GroupInfo group, boolean canModify) { - GroupApi.getAuditLog(group.getGroupUUID(), + GroupApi.getAuditLog( + group.getGroupUUID(), new GerritCallback>() { @Override public void onSuccess(JsArray result) { @@ -112,9 +112,8 @@ public class AccountGroupAuditLogScreen extends AccountGroupScreen { case REMOVE_GROUP: GroupInfo member = auditEvent.memberAsGroup(); if (AccountGroup.isInternalGroup(member.getGroupUUID())) { - table.setWidget(row, 3, - new Hyperlink(member.name(), - Dispatcher.toGroup(member.getGroupUUID()))); + table.setWidget( + row, 3, new Hyperlink(member.name(), Dispatcher.toGroup(member.getGroupUUID()))); fmt.getElement(row, 3).setTitle(null); } else if (member.url() != null) { Anchor a = new Anchor(); @@ -125,8 +124,7 @@ public class AccountGroupAuditLogScreen extends AccountGroupScreen { fmt.getElement(row, 3).setTitle(null); } else { table.setText(row, 3, member.name()); - fmt.getElement(row, 3).setTitle( - "UUID " + member.getGroupUUID().get()); + fmt.getElement(row, 3).setTitle("UUID " + member.getGroupUUID().get()); } break; } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupInfoScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupInfoScreen.java index 22a57a4a1b..b1d9873673 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupInfoScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupInfoScreen.java @@ -88,24 +88,27 @@ public class AccountGroupInfoScreen extends AccountGroupScreen { saveName = new Button(Util.C.buttonRenameGroup()); saveName.setEnabled(false); - saveName.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - final String newName = groupNameTxt.getText().trim(); - GroupApi.renameGroup(getGroupUUID(), newName, - new GerritCallback() { - @Override - public void onSuccess(final com.google.gerrit.client.VoidResult result) { - saveName.setEnabled(false); - setPageTitle(Util.M.group(newName)); - groupNameTxt.setText(newName); - if (getGroupUUID().equals(getOwnerGroupUUID())) { - ownerTxt.setText(newName); - } - } - }); - } - }); + saveName.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + final String newName = groupNameTxt.getText().trim(); + GroupApi.renameGroup( + getGroupUUID(), + newName, + new GerritCallback() { + @Override + public void onSuccess(final com.google.gerrit.client.VoidResult result) { + saveName.setEnabled(false); + setPageTitle(Util.M.group(newName)); + groupNameTxt.setText(newName); + if (getGroupUUID().equals(getOwnerGroupUUID())) { + ownerTxt.setText(newName); + } + } + }); + } + }); groupNamePanel.add(saveName); add(groupNamePanel); } @@ -123,24 +126,27 @@ public class AccountGroupInfoScreen extends AccountGroupScreen { saveOwner = new Button(Util.C.buttonChangeGroupOwner()); saveOwner.setEnabled(false); - saveOwner.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - final String newOwner = ownerTxt.getText().trim(); - if (newOwner.length() > 0) { - AccountGroup.UUID ownerUuid = accountGroupOracle.getUUID(newOwner); - String ownerId = ownerUuid != null ? ownerUuid.get() : newOwner; - GroupApi.setGroupOwner(getGroupUUID(), ownerId, - new GerritCallback() { - @Override - public void onSuccess(final GroupInfo result) { - updateOwnerGroup(result); - saveOwner.setEnabled(false); - } - }); - } - } - }); + saveOwner.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + final String newOwner = ownerTxt.getText().trim(); + if (newOwner.length() > 0) { + AccountGroup.UUID ownerUuid = accountGroupOracle.getUUID(newOwner); + String ownerId = ownerUuid != null ? ownerUuid.get() : newOwner; + GroupApi.setGroupOwner( + getGroupUUID(), + ownerId, + new GerritCallback() { + @Override + public void onSuccess(final GroupInfo result) { + updateOwnerGroup(result); + saveOwner.setEnabled(false); + } + }); + } + } + }); ownerPanel.add(saveOwner); add(ownerPanel); } @@ -157,19 +163,22 @@ public class AccountGroupInfoScreen extends AccountGroupScreen { saveDesc = new Button(Util.C.buttonSaveDescription()); saveDesc.setEnabled(false); - saveDesc.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - final String txt = descTxt.getText().trim(); - GroupApi.setGroupDescription(getGroupUUID(), txt, - new GerritCallback() { - @Override - public void onSuccess(final VoidResult result) { - saveDesc.setEnabled(false); - } - }); - } - }); + saveDesc.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + final String txt = descTxt.getText().trim(); + GroupApi.setGroupDescription( + getGroupUUID(), + txt, + new GerritCallback() { + @Override + public void onSuccess(final VoidResult result) { + saveDesc.setEnabled(false); + } + }); + } + }); vp.add(saveDesc); add(vp); } @@ -187,18 +196,21 @@ public class AccountGroupInfoScreen extends AccountGroupScreen { saveGroupOptions = new Button(Util.C.buttonSaveGroupOptions()); saveGroupOptions.setEnabled(false); - saveGroupOptions.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - GroupApi.setGroupOptions(getGroupUUID(), - visibleToAllCheckBox.getValue(), new GerritCallback() { - @Override - public void onSuccess(final VoidResult result) { - saveGroupOptions.setEnabled(false); - } - }); - } - }); + saveGroupOptions.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + GroupApi.setGroupOptions( + getGroupUUID(), + visibleToAllCheckBox.getValue(), + new GerritCallback() { + @Override + public void onSuccess(final VoidResult result) { + saveGroupOptions.setEnabled(false); + } + }); + } + }); groupOptionsPanel.add(saveGroupOptions); add(groupOptionsPanel); @@ -211,9 +223,10 @@ public class AccountGroupInfoScreen extends AccountGroupScreen { protected void display(final GroupInfo group, final boolean canModify) { groupUUIDLabel.setText(group.getGroupUUID().get()); groupNameTxt.setText(group.name()); - ownerTxt.setText(group.owner() != null - ? group.owner() - : Util.M.deletedReference(group.getOwnerUUID().get())); + ownerTxt.setText( + group.owner() != null + ? group.owner() + : Util.M.deletedReference(group.getOwnerUUID().get())); descTxt.setText(group.description()); visibleToAllCheckBox.setValue(group.options().isVisibleToAll()); setMembersTabVisible(AccountGroup.isInternalGroup(group.getGroupUUID())); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupMembersScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupMembersScreen.java index eacff7bc09..7aab6c36fc 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupMembersScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupMembersScreen.java @@ -39,7 +39,6 @@ import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Panel; - import java.util.Comparator; import java.util.HashSet; import java.util.List; @@ -79,30 +78,30 @@ public class AccountGroupMembersScreen extends AccountGroupScreen { includes.setEnabled(canModify); } - private void initMemberList() { - addMemberBox = new AddMemberBox( - Util.C.buttonAddGroupMember(), - Util.C.defaultAccountName(), - new AccountSuggestOracle()); + addMemberBox = + new AddMemberBox( + Util.C.buttonAddGroupMember(), Util.C.defaultAccountName(), new AccountSuggestOracle()); - addMemberBox.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - doAddNewMember(); - } - }); + addMemberBox.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + doAddNewMember(); + } + }); members = new MemberTable(); members.addStyleName(Gerrit.RESOURCES.css().groupMembersTable()); delMember = new Button(Util.C.buttonDeleteGroupMembers()); - delMember.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - members.deleteChecked(); - } - }); + delMember.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + members.deleteChecked(); + } + }); memberPanel = new FlowPanel(); memberPanel.add(new SmallHeading(Util.C.headingMembers())); @@ -115,26 +114,30 @@ public class AccountGroupMembersScreen extends AccountGroupScreen { private void initIncludeList() { accountGroupSuggestOracle = new AccountGroupSuggestOracle(); addIncludeBox = - new AddMemberBox(Util.C.buttonAddIncludedGroup(), - Util.C.defaultAccountGroupName(), accountGroupSuggestOracle); + new AddMemberBox( + Util.C.buttonAddIncludedGroup(), + Util.C.defaultAccountGroupName(), + accountGroupSuggestOracle); - addIncludeBox.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - doAddNewInclude(); - } - }); + addIncludeBox.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + doAddNewInclude(); + } + }); includes = new IncludeTable(); includes.addStyleName(Gerrit.RESOURCES.css().groupIncludesTable()); delInclude = new Button(Util.C.buttonDeleteIncludedGroup()); - delInclude.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - includes.deleteChecked(); - } - }); + delInclude.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + includes.deleteChecked(); + } + }); includePanel = new FlowPanel(); includePanel.add(new SmallHeading(Util.C.headingIncludedGroups())); @@ -174,7 +177,9 @@ public class AccountGroupMembersScreen extends AccountGroupScreen { } addMemberBox.setEnabled(false); - GroupApi.addMember(getGroupUUID(), nameEmail, + GroupApi.addMember( + getGroupUUID(), + nameEmail, new GerritCallback() { @Override public void onSuccess(final AccountInfo memberInfo) { @@ -203,7 +208,9 @@ public class AccountGroupMembersScreen extends AccountGroupScreen { } addIncludeBox.setEnabled(false); - GroupApi.addIncludedGroup(getGroupUUID(), uuid.get(), + GroupApi.addIncludedGroup( + getGroupUUID(), + uuid.get(), new GerritCallback() { @Override public void onSuccess(final GroupInfo result) { @@ -252,11 +259,13 @@ public class AccountGroupMembersScreen extends AccountGroupScreen { } } if (!ids.isEmpty()) { - GroupApi.removeMembers(getGroupUUID(), ids, + GroupApi.removeMembers( + getGroupUUID(), + ids, new GerritCallback() { @Override public void onSuccess(final VoidResult result) { - for (int row = 1; row < table.getRowCount();) { + for (int row = 1; row < table.getRowCount(); ) { final AccountInfo i = getRowItem(row); if (i != null && ids.contains(i._accountId())) { table.removeRow(row); @@ -283,26 +292,27 @@ public class AccountGroupMembersScreen extends AccountGroupScreen { } void insert(AccountInfo info) { - Comparator c = new Comparator() { - @Override - public int compare(AccountInfo a, AccountInfo b) { - int cmp = nullToEmpty(a.name()).compareTo(nullToEmpty(b.name())); - if (cmp != 0) { - return cmp; - } + Comparator c = + new Comparator() { + @Override + public int compare(AccountInfo a, AccountInfo b) { + int cmp = nullToEmpty(a.name()).compareTo(nullToEmpty(b.name())); + if (cmp != 0) { + return cmp; + } - cmp = nullToEmpty(a.email()).compareTo(nullToEmpty(b.email())); - if (cmp != 0) { - return cmp; - } + cmp = nullToEmpty(a.email()).compareTo(nullToEmpty(b.email())); + if (cmp != 0) { + return cmp; + } - return a._accountId() - b._accountId(); - } + return a._accountId() - b._accountId(); + } - public String nullToEmpty(String str) { - return str == null ? "" : str; - } - }; + public String nullToEmpty(String str) { + return str == null ? "" : str; + } + }; int insertPos = getInsertRow(c, info); if (insertPos >= 0) { table.insertRow(insertPos); @@ -359,11 +369,13 @@ public class AccountGroupMembersScreen extends AccountGroupScreen { } } if (!ids.isEmpty()) { - GroupApi.removeIncludedGroups(getGroupUUID(), ids, + GroupApi.removeIncludedGroups( + getGroupUUID(), + ids, new GerritCallback() { @Override public void onSuccess(final VoidResult result) { - for (int row = 1; row < table.getRowCount();) { + for (int row = 1; row < table.getRowCount(); ) { final GroupInfo i = getRowItem(row); if (i != null && ids.contains(i.getGroupUUID())) { table.removeRow(row); @@ -390,20 +402,21 @@ public class AccountGroupMembersScreen extends AccountGroupScreen { } void insert(GroupInfo info) { - Comparator c = new Comparator() { - @Override - public int compare(GroupInfo a, GroupInfo b) { - int cmp = nullToEmpty(a.name()).compareTo(nullToEmpty(b.name())); - if (cmp != 0) { - return cmp; - } - return a.getGroupUUID().compareTo(b.getGroupUUID()); - } + Comparator c = + new Comparator() { + @Override + public int compare(GroupInfo a, GroupInfo b) { + int cmp = nullToEmpty(a.name()).compareTo(nullToEmpty(b.name())); + if (cmp != 0) { + return cmp; + } + return a.getGroupUUID().compareTo(b.getGroupUUID()); + } - private String nullToEmpty(@Nullable String str) { - return (str == null) ? "" : str; - } - }; + private String nullToEmpty(@Nullable String str) { + return (str == null) ? "" : str; + } + }; int insertPos = getInsertRow(c, info); if (insertPos >= 0) { table.insertRow(insertPos); @@ -420,8 +433,7 @@ public class AccountGroupMembersScreen extends AccountGroupScreen { table.setWidget(row, 1, checkBox); checkBox.setEnabled(enabled); if (AccountGroup.isInternalGroup(uuid)) { - table.setWidget(row, 2, - new Hyperlink(i.name(), Dispatcher.toGroup(uuid))); + table.setWidget(row, 2, new Hyperlink(i.name(), Dispatcher.toGroup(uuid))); fmt.getElement(row, 2).setTitle(null); table.setText(row, 3, i.description()); } else if (i.url() != null) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupScreen.java index 0f27f57448..e655a2d24b 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupScreen.java @@ -41,7 +41,9 @@ public abstract class AccountGroupScreen extends MenuScreen { this.auditLogTabToken = getTabToken(token, AUDIT_LOG); link(Util.C.groupTabGeneral(), getTabToken(token, INFO)); - link(Util.C.groupTabMembers(), membersTabToken, + link( + Util.C.groupTabMembers(), + membersTabToken, AccountGroup.isInternalGroup(group.getGroupUUID())); } @@ -57,17 +59,21 @@ public abstract class AccountGroupScreen extends MenuScreen { super.onLoad(); setPageTitle(Util.M.group(group.name())); display(); - GroupApi.isGroupOwner(group.name(), new GerritCallback() { - @Override - public void onSuccess(Boolean result) { - if (result) { - link(Util.C.groupTabAuditLog(), auditLogTabToken, - AccountGroup.isInternalGroup(group.getGroupUUID())); - setToken(token); - } - display(group, result); - } - }); + GroupApi.isGroupOwner( + group.name(), + new GerritCallback() { + @Override + public void onSuccess(Boolean result) { + if (result) { + link( + Util.C.groupTabAuditLog(), + auditLogTabToken, + AccountGroup.isInternalGroup(group.getGroupUUID())); + setToken(token); + } + display(group, result); + } + }); } protected abstract void display(GroupInfo group, boolean canModify); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.java index 322af1bd99..39676a1583 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.java @@ -15,149 +15,252 @@ package com.google.gerrit.client.admin; import com.google.gwt.i18n.client.Constants; - import java.util.Map; public interface AdminConstants extends Constants { String defaultAccountName(); + String defaultAccountGroupName(); + String defaultBranchName(); + String defaultRevisionSpec(); String buttonDeleteIncludedGroup(); + String buttonAddIncludedGroup(); + String buttonDeleteGroupMembers(); + String buttonAddGroupMember(); + String buttonSaveDescription(); + String buttonRenameGroup(); + String buttonCreateGroup(); + String buttonCreateProject(); + String buttonChangeGroupOwner(); + String buttonChangeGroupType(); + String buttonSelectGroup(); + String buttonSaveChanges(); + String checkBoxEmptyCommit(); + String checkBoxPermissionsOnly(); + String useContentMerge(); + String useContributorAgreements(); + String useSignedOffBy(); + String createNewChangeForAllNotInTarget(); + String enableSignedPush(); + String requireSignedPush(); + String requireChangeID(); + String rejectImplicitMerges(); + String headingMaxObjectSizeLimit(); + String headingGroupOptions(); + String isVisibleToAll(); + String buttonSaveGroupOptions(); + String suggestedGroupLabel(); + String parentSuggestions(); String buttonBrowseProjects(); + String projects(); + String projectRepoBrowser(); + String headingGroupUUID(); + String headingOwner(); + String headingDescription(); + String headingProjectOptions(); + String headingProjectCommands(); + String headingCommands(); + String headingMembers(); + String headingIncludedGroups(); + String noMembersInfo(); + String headingExternalGroup(); + String headingCreateGroup(); + String headingParentProjectName(); + String columnProjectName(); + String headingAgreements(); + String headingAuditLog(); String headingProjectSubmitType(); + String projectSubmitType_FAST_FORWARD_ONLY(); + String projectSubmitType_MERGE_ALWAYS(); + String projectSubmitType_MERGE_IF_NECESSARY(); + String projectSubmitType_REBASE_IF_NECESSARY(); + String projectSubmitType_REBASE_ALWAYS(); + String projectSubmitType_CHERRY_PICK(); String headingProjectState(); + String projectState_ACTIVE(); + String projectState_READ_ONLY(); + String projectState_HIDDEN(); String columnMember(); + String columnEmailAddress(); + String columnGroupName(); + String columnGroupDescription(); + String columnGroupType(); + String columnGroupNotifications(); + String columnGroupVisibleToAll(); String columnDate(); + String columnType(); + String columnByUser(); String typeAdded(); + String typeRemoved(); String columnBranchName(); + String columnBranchRevision(); + String initialRevision(); + String buttonAddBranch(); + String buttonDeleteBranch(); + String saveHeadButton(); + String cancelHeadButton(); + String columnTagName(); String groupItemHelp(); String groupListTitle(); + String groupFilter(); + String createGroupTitle(); + String groupTabGeneral(); + String groupTabMembers(); + String groupTabAuditLog(); + String projectListTitle(); + String projectFilter(); + String createProjectTitle(); + String projectListQueryLink(); String plugins(); + String pluginEnabled(); + String pluginDisabled(); + String pluginSettingsToolTip(); String columnPluginName(); + String columnPluginSettings(); + String columnPluginVersion(); + String columnPluginStatus(); String noGroupSelected(); + String errorNoMatchingGroups(); + String errorNoGitRepository(); String addPermission(); - Map permissionNames(); + + Map permissionNames(); String refErrorEmpty(); + String refErrorBeginSlash(); + String refErrorDoubleSlash(); + String refErrorNoSpace(); + String refErrorPrintable(); + String errorsMustBeFixed(); String sectionTypeReference(); + String sectionTypeSection(); + Map sectionNames(); String pagedListPrev(); + String pagedListNext(); String buttonCreate(); + String buttonCreateDescription(); + String buttonCreateChange(); + String buttonCreateChangeDescription(); + String buttonEditConfig(); + String buttonEditConfigDescription(); + String editConfigMessage(); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminCss.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminCss.java index 55a9bf33a4..53b2e720cd 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminCss.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminCss.java @@ -18,9 +18,11 @@ import com.google.gwt.resources.client.CssResource; public interface AdminCss extends CssResource { String deleteIcon(); + String undoIcon(); String deleted(); + String deletedBorder(); String deleteSectionHover(); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminMessages.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminMessages.java index 05ffa9a8a4..d1c7b1d1ef 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminMessages.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminMessages.java @@ -18,17 +18,26 @@ import com.google.gwt.i18n.client.Messages; public interface AdminMessages extends Messages { String group(String name); + String label(String name); + String labelAs(String name); + String project(String name); + String deletedGroup(int id); String deletedReference(String name); + String deletedSection(String name); String effectiveMaxObjectSizeLimit(String effectiveMaxObjectSizeLimit); + String globalMaxObjectSizeLimit(String globalMaxObjectSizeLimit); + String pluginProjectOptionsTitle(String pluginName); + String pluginProjectInheritedValue(String value); + String pluginProjectInheritedListValue(String value); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminResources.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminResources.java index 688a59fa3f..dfbfbb6f7d 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminResources.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminResources.java @@ -24,19 +24,14 @@ public interface AdminResources extends ClientBundle { @Source("admin.css") AdminCss css(); - /** - * unknown origin - * TODO replace icons - */ + /** unknown origin TODO replace icons */ @Source("deleteNormal.png") ImageResource deleteNormal(); @Source("deleteHover.png") ImageResource deleteHover(); - /** - * silk icons (CC-BY3.0): http://famfamfam.com/lab/icons/silk/ - */ + /** silk icons (CC-BY3.0): http://famfamfam.com/lab/icons/silk/ */ @Source("arrow_undo.png") ImageResource undoNormal(); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/CreateChangeAction.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/CreateChangeAction.java index ad8a595698..6ac4a68449 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/CreateChangeAction.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/CreateChangeAction.java @@ -37,23 +37,26 @@ class CreateChangeAction { @Override public void onSend() { - ChangeApi.createChange(project, getDestinationBranch(), - getDestinationTopic(), - message.getText(), null, - new GerritCallback() { - @Override - public void onSuccess(ChangeInfo result) { - sent = true; - hide(); - Gerrit.display(PageLinks.toChange(result.legacyId())); - } + ChangeApi.createChange( + project, + getDestinationBranch(), + getDestinationTopic(), + message.getText(), + null, + new GerritCallback() { + @Override + public void onSuccess(ChangeInfo result) { + sent = true; + hide(); + Gerrit.display(PageLinks.toChange(result.legacyId())); + } - @Override - public void onFailure(Throwable caught) { - enableButtons(true); - super.onFailure(caught); - } - }); + @Override + public void onFailure(Throwable caught) { + enableButtons(true); + super.onFailure(caught); + } + }); } @Override @@ -61,7 +64,6 @@ class CreateChangeAction { super.onClose(event); b.setEnabled(true); } - }.center(); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/CreateGroupScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/CreateGroupScreen.java index 4efaa61285..262c1f1495 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/CreateGroupScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/CreateGroupScreen.java @@ -53,16 +53,18 @@ public class CreateGroupScreen extends Screen { @Override protected void onLoad() { super.onLoad(); - AccountCapabilities.all(new GerritCallback() { - @Override - public void onSuccess(AccountCapabilities ac) { - if (ac.canPerform(CREATE_GROUP)) { - display(); - } else { - Gerrit.display(PageLinks.ADMIN_CREATE_GROUP, new NotFoundScreen()); - } - } - }, CREATE_GROUP); + AccountCapabilities.all( + new GerritCallback() { + @Override + public void onSuccess(AccountCapabilities ac) { + if (ac.canPerform(CREATE_GROUP)) { + display(); + } else { + Gerrit.display(PageLinks.ADMIN_CREATE_GROUP, new NotFoundScreen()); + } + } + }, + CREATE_GROUP); } @Override @@ -77,43 +79,48 @@ public class CreateGroupScreen extends Screen { addPanel.setStyleName(Gerrit.RESOURCES.css().addSshKeyPanel()); addPanel.add(new SmallHeading(Util.C.headingCreateGroup())); - addTxt = new NpTextBox() { - @Override - public void onBrowserEvent(Event event) { - super.onBrowserEvent(event); - if (event.getTypeInt() == Event.ONPASTE) { - Scheduler.get().scheduleDeferred(new ScheduledCommand() { - @Override - public void execute() { - if (addTxt.getValue().trim().length() != 0) { - addNew.setEnabled(true); - } + addTxt = + new NpTextBox() { + @Override + public void onBrowserEvent(Event event) { + super.onBrowserEvent(event); + if (event.getTypeInt() == Event.ONPASTE) { + Scheduler.get() + .scheduleDeferred( + new ScheduledCommand() { + @Override + public void execute() { + if (addTxt.getValue().trim().length() != 0) { + addNew.setEnabled(true); + } + } + }); } - }); - } - } - }; + } + }; addTxt.sinkEvents(Event.ONPASTE); addTxt.setVisibleLength(60); - addTxt.addKeyPressHandler(new KeyPressHandler() { - @Override - public void onKeyPress(KeyPressEvent event) { - if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) { - doCreateGroup(); - } - } - }); + addTxt.addKeyPressHandler( + new KeyPressHandler() { + @Override + public void onKeyPress(KeyPressEvent event) { + if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) { + doCreateGroup(); + } + } + }); addPanel.add(addTxt); addNew = new Button(Util.C.buttonCreateGroup()); addNew.setEnabled(false); - addNew.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - doCreateGroup(); - } - }); + addNew.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + doCreateGroup(); + } + }); addPanel.add(addNew); add(addPanel); @@ -127,18 +134,19 @@ public class CreateGroupScreen extends Screen { } addNew.setEnabled(false); - GroupApi.createGroup(newName, new GerritCallback() { - @Override - public void onSuccess(final GroupInfo result) { - History.newItem(Dispatcher.toGroup(result.getGroupId(), - AccountGroupScreen.MEMBERS)); - } + GroupApi.createGroup( + newName, + new GerritCallback() { + @Override + public void onSuccess(final GroupInfo result) { + History.newItem(Dispatcher.toGroup(result.getGroupId(), AccountGroupScreen.MEMBERS)); + } - @Override - public void onFailure(Throwable caught) { - super.onFailure(caught); - addNew.setEnabled(true); - } - }); + @Override + public void onFailure(Throwable caught) { + super.onFailure(caught); + addNew.setEnabled(true); + } + }); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/CreateProjectScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/CreateProjectScreen.java index 3132531a0e..5e9367921d 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/CreateProjectScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/CreateProjectScreen.java @@ -71,16 +71,18 @@ public class CreateProjectScreen extends Screen { @Override protected void onLoad() { super.onLoad(); - AccountCapabilities.all(new GerritCallback() { - @Override - public void onSuccess(AccountCapabilities ac) { - if (ac.canPerform(CREATE_PROJECT)) { - display(); - } else { - Gerrit.display(PageLinks.ADMIN_CREATE_PROJECT, new NotFoundScreen()); - } - } - }, CREATE_PROJECT); + AccountCapabilities.all( + new GerritCallback() { + @Override + public void onSuccess(AccountCapabilities ac) { + if (ac.canPerform(CREATE_PROJECT)) { + display(); + } else { + Gerrit.display(PageLinks.ADMIN_CREATE_PROJECT, new NotFoundScreen()); + } + } + }, + CREATE_PROJECT); } @Override @@ -96,15 +98,16 @@ public class CreateProjectScreen extends Screen { addCreateProjectPanel(); /* popup */ - projectsPopup = new ProjectListPopup() { - @Override - protected void onMovePointerTo(String projectName) { - // prevent user input from being overwritten by simply poping up - if (!projectsPopup.isPoppingUp() || "".equals(parent.getText())) { - parent.setText(projectName); - } - } - }; + projectsPopup = + new ProjectListPopup() { + @Override + protected void onMovePointerTo(String projectName) { + // prevent user input from being overwritten by simply poping up + if (!projectsPopup.isPoppingUp() || "".equals(parent.getText())) { + parent.setText(projectName); + } + } + }; projectsPopup.initPopup(Util.C.projects(), PageLinks.ADMIN_PROJECTS); } @@ -131,61 +134,68 @@ public class CreateProjectScreen extends Screen { } private void initCreateTxt() { - project = new NpTextBox() { - @Override - public void onBrowserEvent(Event event) { - super.onBrowserEvent(event); - if (event.getTypeInt() == Event.ONPASTE) { - Scheduler.get().scheduleDeferred(new ScheduledCommand() { - @Override - public void execute() { - if (project.getValue().trim().length() != 0) { - create.setEnabled(true); - } + project = + new NpTextBox() { + @Override + public void onBrowserEvent(Event event) { + super.onBrowserEvent(event); + if (event.getTypeInt() == Event.ONPASTE) { + Scheduler.get() + .scheduleDeferred( + new ScheduledCommand() { + @Override + public void execute() { + if (project.getValue().trim().length() != 0) { + create.setEnabled(true); + } + } + }); } - }); - } - } - }; + } + }; project.sinkEvents(Event.ONPASTE); project.setVisibleLength(50); - project.addKeyPressHandler(new KeyPressHandler() { - @Override - public void onKeyPress(KeyPressEvent event) { - if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) { - doCreateProject(); - } - } - }); + project.addKeyPressHandler( + new KeyPressHandler() { + @Override + public void onKeyPress(KeyPressEvent event) { + if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) { + doCreateProject(); + } + } + }); new OnEditEnabler(create, project); } private void initCreateButton() { create = new Button(Util.C.buttonCreateProject()); create.setEnabled(false); - create.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - doCreateProject(); - } - }); + create.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + doCreateProject(); + } + }); browse = new Button(Util.C.buttonBrowseProjects()); - browse.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - int top = grid.getAbsoluteTop() - 50; // under page header - // Try to place it to the right of everything else, but not - // right justified - int left = - 5 + Math.max( - grid.getAbsoluteLeft() + grid.getOffsetWidth(), - suggestedParentsTab.getAbsoluteLeft() - + suggestedParentsTab.getOffsetWidth()); - projectsPopup.setPreferredCoordinates(top, left); - projectsPopup.displayPopup(); - } - }); + browse.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + int top = grid.getAbsoluteTop() - 50; // under page header + // Try to place it to the right of everything else, but not + // right justified + int left = + 5 + + Math.max( + grid.getAbsoluteLeft() + grid.getOffsetWidth(), + suggestedParentsTab.getAbsoluteLeft() + + suggestedParentsTab.getOffsetWidth()); + projectsPopup.setPreferredCoordinates(top, left); + projectsPopup.displayPopup(); + } + }); } private void initParentBox() { @@ -194,40 +204,43 @@ public class CreateProjectScreen extends Screen { } private void initSuggestedParents() { - suggestedParentsTab = new ProjectsTable() { - { - table.setText(0, 1, Util.C.parentSuggestions()); - } - - @Override - protected void populate(final int row, final ProjectInfo k) { - final Anchor projectLink = new Anchor(k.name()); - projectLink.addClickHandler(new ClickHandler() { + suggestedParentsTab = + new ProjectsTable() { + { + table.setText(0, 1, Util.C.parentSuggestions()); + } @Override - public void onClick(ClickEvent event) { - parent.setText(getRowItem(row).name()); + protected void populate(final int row, final ProjectInfo k) { + final Anchor projectLink = new Anchor(k.name()); + projectLink.addClickHandler( + new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + parent.setText(getRowItem(row).name()); + } + }); + + table.setWidget(row, 2, projectLink); + table.setText(row, 3, k.description()); + + setRowItem(row, k); } - }); - - table.setWidget(row, 2, projectLink); - table.setText(row, 3, k.description()); - - setRowItem(row, k); - } - }; + }; suggestedParentsTab.setVisible(false); - ProjectMap.parentCandidates(new GerritCallback() { - @Override - public void onSuccess(ProjectMap list) { - if (!list.isEmpty()) { - suggestedParentsTab.setVisible(true); - suggestedParentsTab.display(list); - suggestedParentsTab.finishDisplay(); - } - } - }); + ProjectMap.parentCandidates( + new GerritCallback() { + @Override + public void onSuccess(ProjectMap list) { + if (!list.isEmpty()) { + suggestedParentsTab.setVisible(true); + suggestedParentsTab.display(list); + suggestedParentsTab.finishDisplay(); + } + } + }); } private void addGrid(final VerticalPanel fp) { @@ -251,13 +264,18 @@ public class CreateProjectScreen extends Screen { } enableForm(false); - ProjectApi.createProject(projectName, parentName, emptyCommit.getValue(), - permissionsOnly.getValue(), new AsyncCallback() { + ProjectApi.createProject( + projectName, + parentName, + emptyCommit.getValue(), + permissionsOnly.getValue(), + new AsyncCallback() { @Override public void onSuccess(VoidResult result) { String nameWithoutSuffix = ProjectUtil.stripGitSuffix(projectName); - History.newItem(Dispatcher.toProjectAdmin(new Project.NameKey( - nameWithoutSuffix), ProjectScreen.INFO)); + History.newItem( + Dispatcher.toProjectAdmin( + new Project.NameKey(nameWithoutSuffix), ProjectScreen.INFO)); } @Override diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/EditConfigAction.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/EditConfigAction.java index 3e6086ba92..fdbf3d9af7 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/EditConfigAction.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/EditConfigAction.java @@ -27,12 +27,17 @@ public class EditConfigAction { static void call(final Button b, final String project) { b.setEnabled(false); - ChangeApi.createChange(project, RefNames.REFS_CONFIG, null, - Util.C.editConfigMessage(), null, new GerritCallback() { + ChangeApi.createChange( + project, + RefNames.REFS_CONFIG, + null, + Util.C.editConfigMessage(), + null, + new GerritCallback() { @Override public void onSuccess(ChangeInfo result) { - Gerrit.display(Dispatcher.toEditScreen( - new PatchSet.Id(result.legacyId(), 1), "project.config")); + Gerrit.display( + Dispatcher.toEditScreen(new PatchSet.Id(result.legacyId(), 1), "project.config")); } @Override diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupListScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupListScreen.java index 86222ce55f..3faa0674a3 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupListScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupListScreen.java @@ -122,22 +122,24 @@ public class GroupListScreen extends Screen { hp.add(filterLabel); filterTxt = new NpTextBox(); filterTxt.setValue(match); - filterTxt.addKeyUpHandler(new KeyUpHandler() { - @Override - public void onKeyUp(KeyUpEvent event) { - Query q = new Query(filterTxt.getValue()) - .open(event.getNativeKeyCode() == KeyCodes.KEY_ENTER); - if (match.equals(q.qMatch)) { - q.start(start); - } - if (q.open || !match.equals(q.qMatch)) { - if (query == null) { - q.run(); + filterTxt.addKeyUpHandler( + new KeyUpHandler() { + @Override + public void onKeyUp(KeyUpEvent event) { + Query q = + new Query(filterTxt.getValue()) + .open(event.getNativeKeyCode() == KeyCodes.KEY_ENTER); + if (match.equals(q.qMatch)) { + q.start(start); + } + if (q.open || !match.equals(q.qMatch)) { + if (query == null) { + q.run(); + } + query = q; + } } - query = q; - } - } - }); + }); hp.add(filterTxt); add(hp); } @@ -178,7 +180,10 @@ public class GroupListScreen extends Screen { Query run() { int limit = open ? 1 : pageSize + 1; - GroupMap.match(qMatch, limit, qStart, + GroupMap.match( + qMatch, + limit, + qStart, new GerritCallback() { @Override public void onSuccess(GroupMap result) { @@ -197,8 +202,7 @@ public class GroupListScreen extends Screen { private void showMap(GroupMap result) { if (open && !result.isEmpty()) { - Gerrit.display(PageLinks.toGroup( - result.values().get(0).getGroupUUID())); + Gerrit.display(PageLinks.toGroup(result.values().get(0).getGroupUUID())); return; } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupReferenceBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupReferenceBox.java index d6d0fe3eec..db138a9503 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupReferenceBox.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupReferenceBox.java @@ -29,9 +29,11 @@ import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Focusable; -public class GroupReferenceBox extends Composite implements - LeafValueEditor, HasSelectionHandlers, - HasCloseHandlers, Focusable { +public class GroupReferenceBox extends Composite + implements LeafValueEditor, + HasSelectionHandlers, + HasCloseHandlers, + Focusable { private final AccountGroupSuggestOracle oracle; private final RemoteSuggestBox suggestBox; @@ -40,20 +42,21 @@ public class GroupReferenceBox extends Composite implements suggestBox = new RemoteSuggestBox(oracle); initWidget(suggestBox); - suggestBox.addSelectionHandler(new SelectionHandler() { - @Override - public void onSelection(SelectionEvent event) { - SelectionEvent.fire(GroupReferenceBox.this, - toValue(event.getSelectedItem())); - } - }); - suggestBox.addCloseHandler(new CloseHandler() { - @Override - public void onClose(CloseEvent event) { - suggestBox.setText(""); - CloseEvent.fire(GroupReferenceBox.this, GroupReferenceBox.this); - } - }); + suggestBox.addSelectionHandler( + new SelectionHandler() { + @Override + public void onSelection(SelectionEvent event) { + SelectionEvent.fire(GroupReferenceBox.this, toValue(event.getSelectedItem())); + } + }); + suggestBox.addCloseHandler( + new CloseHandler() { + @Override + public void onClose(CloseEvent event) { + suggestBox.setText(""); + CloseEvent.fire(GroupReferenceBox.this, GroupReferenceBox.this); + } + }); } public void setVisibleLength(int len) { @@ -61,14 +64,12 @@ public class GroupReferenceBox extends Composite implements } @Override - public HandlerRegistration addSelectionHandler( - SelectionHandler handler) { + public HandlerRegistration addSelectionHandler(SelectionHandler handler) { return addHandler(handler, SelectionEvent.getType()); } @Override - public HandlerRegistration addCloseHandler( - CloseHandler handler) { + public HandlerRegistration addCloseHandler(CloseHandler handler) { return addHandler(handler, CloseEvent.getType()); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupTable.java index 94d15bdc1f..9b8f50b4e5 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupTable.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupTable.java @@ -34,12 +34,10 @@ import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter; import com.google.gwt.user.client.ui.HTMLTable.Cell; import com.google.gwt.user.client.ui.Image; - import java.util.Collections; import java.util.Comparator; import java.util.List; - public class GroupTable extends NavigationTable { private static final int NUM_COLS = 3; @@ -54,16 +52,18 @@ public class GroupTable extends NavigationTable { table.setText(0, 1, C.columnGroupName()); table.setText(0, 2, C.columnGroupDescription()); table.setText(0, 3, C.columnGroupVisibleToAll()); - table.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - final Cell cell = table.getCellForEvent(event); - if (cell != null && cell.getCellIndex() != 1 - && getRowItem(cell.getRowIndex()) != null) { - movePointerTo(cell.getRowIndex()); - } - } - }); + table.addClickHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + final Cell cell = table.getCellForEvent(event); + if (cell != null + && cell.getCellIndex() != 1 + && getRowItem(cell.getRowIndex()) != null) { + movePointerTo(cell.getRowIndex()); + } + } + }); final FlexCellFormatter fmt = table.getFlexCellFormatter(); for (int i = 1; i <= NUM_COLS; i++) { @@ -107,12 +107,14 @@ public class GroupTable extends NavigationTable { table.removeRow(table.getRowCount() - 1); } - Collections.sort(list, new Comparator() { - @Override - public int compare(GroupInfo a, GroupInfo b) { - return a.name().compareTo(b.name()); - } - }); + Collections.sort( + list, + new Comparator() { + @Override + public int compare(GroupInfo a, GroupInfo b) { + return a.name().compareTo(b.name()); + } + }); for (GroupInfo group : list.subList(fromIndex, toIndex)) { final int row = table.getRowCount(); table.insertRow(row); @@ -124,8 +126,11 @@ public class GroupTable extends NavigationTable { void populate(final int row, final GroupInfo k, final String toHighlight) { if (k.url() != null) { if (isInteralGroup(k)) { - table.setWidget(row, 1, new HighlightingInlineHyperlink(k.name(), - Dispatcher.toGroup(k.getGroupId()), toHighlight)); + table.setWidget( + row, + 1, + new HighlightingInlineHyperlink( + k.name(), Dispatcher.toGroup(k.getGroupId()), toHighlight)); } else { Anchor link = new Anchor(); link.setHTML(Util.highlight(k.name(), toHighlight)); @@ -150,7 +155,6 @@ public class GroupTable extends NavigationTable { } private boolean isInteralGroup(final GroupInfo groupInfo) { - return groupInfo != null - && groupInfo.url().startsWith("#" + PageLinks.ADMIN_GROUPS); + return groupInfo != null && groupInfo.url().startsWith("#" + PageLinks.ADMIN_GROUPS); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PaginatedProjectScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PaginatedProjectScreen.java index 66738c0566..75c3cb6898 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PaginatedProjectScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PaginatedProjectScreen.java @@ -40,8 +40,7 @@ abstract class PaginatedProjectScreen extends ProjectScreen { match = URL.decodeQueryString(kv[1]); } - if ("skip".equals(kv[0]) - && URL.decodeQueryString(kv[1]).matches("^[\\d]+")) { + if ("skip".equals(kv[0]) && URL.decodeQueryString(kv[1]).matches("^[\\d]+")) { start = Integer.parseInt(URL.decodeQueryString(kv[1])); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PermissionEditor.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PermissionEditor.java index 025176c5e2..d254c7d1b7 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PermissionEditor.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PermissionEditor.java @@ -56,15 +56,13 @@ import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.ValueLabel; - import java.util.ArrayList; import java.util.List; import java.util.Map; -public class PermissionEditor extends Composite implements Editor, - ValueAwareEditor { - interface Binder extends UiBinder { - } +public class PermissionEditor extends Composite + implements Editor, ValueAwareEditor { + interface Binder extends UiBinder {} private static final Binder uiBinder = GWT.create(Binder.class); @@ -76,34 +74,22 @@ public class PermissionEditor extends Composite implements Editor, @Path("name") ValueLabel deletedName; - @UiField - CheckBox exclusiveGroup; + @UiField CheckBox exclusiveGroup; - @UiField - FlowPanel ruleContainer; + @UiField FlowPanel ruleContainer; ListEditor rules; - @UiField - DivElement addContainer; - @UiField - DivElement addStage1; - @UiField - DivElement addStage2; - @UiField - Anchor beginAddRule; - @UiField - @Editor.Ignore - GroupReferenceBox groupToAdd; - @UiField - Button addRule; + @UiField DivElement addContainer; + @UiField DivElement addStage1; + @UiField DivElement addStage2; + @UiField Anchor beginAddRule; + @UiField @Editor.Ignore GroupReferenceBox groupToAdd; + @UiField Button addRule; - @UiField - Anchor deletePermission; + @UiField Anchor deletePermission; - @UiField - DivElement normal; - @UiField - DivElement deleted; + @UiField DivElement normal; + @UiField DivElement deleted; private final Project.NameKey projectName; private final Map groupInfo; @@ -114,10 +100,8 @@ public class PermissionEditor extends Composite implements Editor, private PermissionRange.WithDefaults validRange; private boolean isDeleted; - public PermissionEditor(ProjectAccess projectAccess, - boolean readOnly, - AccessSection section, - LabelTypes labelTypes) { + public PermissionEditor( + ProjectAccess projectAccess, boolean readOnly, AccessSection section, LabelTypes labelTypes) { this.readOnly = readOnly; this.section = section; this.projectName = projectAccess.getProjectName(); @@ -134,8 +118,7 @@ public class PermissionEditor extends Composite implements Editor, rules = ListEditor.of(new RuleEditorSource()); exclusiveGroup.setEnabled(!readOnly); - exclusiveGroup.setVisible(RefConfigSection - .isValid(section.getName())); + exclusiveGroup.setVisible(RefConfigSection.isValid(section.getName())); if (readOnly) { addContainer.removeFromParent(); @@ -179,12 +162,14 @@ public class PermissionEditor extends Composite implements Editor, addStage1.getStyle().setDisplay(Display.NONE); addStage2.getStyle().setDisplay(Display.BLOCK); - Scheduler.get().scheduleDeferred(new ScheduledCommand() { - @Override - public void execute() { - groupToAdd.setFocus(true); - } - }); + Scheduler.get() + .scheduleDeferred( + new ScheduledCommand() { + @Override + public void execute() { + groupToAdd.setFocus(true); + } + }); } @UiHandler("addRule") @@ -206,8 +191,7 @@ public class PermissionEditor extends Composite implements Editor, } @UiHandler("groupToAdd") - void onAbortAddGroup( - @SuppressWarnings("unused") CloseEvent event) { + void onAbortAddGroup(@SuppressWarnings("unused") CloseEvent event) { hideAddGroup(); } @@ -244,19 +228,20 @@ public class PermissionEditor extends Composite implements Editor, // addRule.setEnabled(false); GroupMap.suggestAccountGroupForProject( - projectName.get(), ref.getName(), 1, + projectName.get(), + ref.getName(), + 1, new GerritCallback() { @Override public void onSuccess(GroupMap result) { addRule.setEnabled(true); if (result.values().length() == 1) { - addGroup(new GroupReference( - result.values().get(0).getGroupUUID(), - result.values().get(0).name())); + addGroup( + new GroupReference( + result.values().get(0).getGroupUUID(), result.values().get(0).name())); } else { groupToAdd.setFocus(true); - new ErrorDialog(Gerrit.M.noSuchGroupMessage(ref.getName())) - .center(); + new ErrorDialog(Gerrit.M.noSuchGroupMessage(ref.getName())).center(); } } @@ -280,10 +265,13 @@ public class PermissionEditor extends Composite implements Editor, if (Permission.hasRange(value.getName())) { LabelType lt = labelTypes.byLabel(value.getLabel()); if (lt != null) { - validRange = new PermissionRange.WithDefaults( - value.getName(), - lt.getMin().getValue(), lt.getMax().getValue(), - lt.getMin().getValue(), lt.getMax().getValue()); + validRange = + new PermissionRange.WithDefaults( + value.getName(), + lt.getMin().getValue(), + lt.getMax().getValue(), + lt.getMin().getValue(), + lt.getMax().getValue()); } } else if (GlobalCapability.isCapability(value.getName())) { validRange = GlobalCapability.getRange(value.getName()); @@ -305,8 +293,7 @@ public class PermissionEditor extends Composite implements Editor, List keep = new ArrayList<>(src.size()); for (int i = 0; i < src.size(); i++) { - PermissionRuleEditor e = - (PermissionRuleEditor) ruleContainer.getWidget(i); + PermissionRuleEditor e = (PermissionRuleEditor) ruleContainer.getWidget(i); if (!e.isDeleted()) { keep.add(src.get(i)); } @@ -315,12 +302,10 @@ public class PermissionEditor extends Composite implements Editor, } @Override - public void onPropertyChange(String... paths) { - } + public void onPropertyChange(String... paths) {} @Override - public void setDelegate(EditorDelegate delegate) { - } + public void setDelegate(EditorDelegate delegate) {} private class RuleEditorSource extends EditorSource { @Override diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PermissionNameRenderer.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PermissionNameRenderer.java index 7ca8f0f4c0..c6a36b0c4c 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PermissionNameRenderer.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PermissionNameRenderer.java @@ -16,7 +16,6 @@ package com.google.gerrit.client.admin; import com.google.gerrit.common.data.Permission; import com.google.gwt.text.shared.Renderer; - import java.io.IOException; import java.util.HashMap; import java.util.Map; diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PermissionRuleEditor.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PermissionRuleEditor.java index be5bdcb034..476404a6fe 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PermissionRuleEditor.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PermissionRuleEditor.java @@ -47,16 +47,14 @@ import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.UIObject; import com.google.gwt.user.client.ui.ValueListBox; - import java.io.IOException; import java.util.Arrays; import java.util.List; import java.util.Map; -public class PermissionRuleEditor extends Composite implements - Editor, ValueAwareEditor { - interface Binder extends UiBinder { - } +public class PermissionRuleEditor extends Composite + implements Editor, ValueAwareEditor { + interface Binder extends UiBinder {} private static final Binder uiBinder = GWT.create(Binder.class); @@ -69,32 +67,25 @@ public class PermissionRuleEditor extends Composite implements @UiField(provided = true) RangeBox max; - @UiField - CheckBox force; + @UiField CheckBox force; - @UiField - Anchor groupNameLink; - @UiField - SpanElement groupNameSpan; - @UiField - SpanElement deletedGroupName; + @UiField Anchor groupNameLink; + @UiField SpanElement groupNameSpan; + @UiField SpanElement deletedGroupName; - @UiField - Anchor deleteRule; + @UiField Anchor deleteRule; - @UiField - DivElement normal; - @UiField - DivElement deleted; + @UiField DivElement normal; + @UiField DivElement deleted; - @UiField - SpanElement rangeEditor; + @UiField SpanElement rangeEditor; private Map groupInfo; private boolean isDeleted; private HandlerRegistration clickHandler; - public PermissionRuleEditor(boolean readOnly, + public PermissionRuleEditor( + boolean readOnly, Map groupInfo, AccessSection section, Permission permission, @@ -103,8 +94,8 @@ public class PermissionRuleEditor extends Composite implements action = new ValueListBox<>(actionRenderer); if (validRange != null && 10 < validRange.getRangeSize()) { - min = new RangeBox.Box(); - max = new RangeBox.Box(); + min = new RangeBox.Box(); + max = new RangeBox.Box(); } else if (validRange != null) { RangeBox.List minList = new RangeBox.List(); @@ -126,16 +117,16 @@ public class PermissionRuleEditor extends Composite implements if (GlobalCapability.PRIORITY.equals(permission.getName())) { action.setValue(PermissionRule.Action.INTERACTIVE); - action.setAcceptableValues(Arrays.asList( - PermissionRule.Action.INTERACTIVE, - PermissionRule.Action.BATCH)); + action.setAcceptableValues( + Arrays.asList(PermissionRule.Action.INTERACTIVE, PermissionRule.Action.BATCH)); } else { action.setValue(PermissionRule.Action.ALLOW); - action.setAcceptableValues(Arrays.asList( - PermissionRule.Action.ALLOW, - PermissionRule.Action.DENY, - PermissionRule.Action.BLOCK)); + action.setAcceptableValues( + Arrays.asList( + PermissionRule.Action.ALLOW, + PermissionRule.Action.DENY, + PermissionRule.Action.BLOCK)); } } @@ -200,9 +191,8 @@ public class PermissionRuleEditor extends Composite implements } GroupReference ref = value.getGroup(); - GroupInfo info = groupInfo != null && ref.getUUID() != null - ? groupInfo.get(ref.getUUID()) - : null; + GroupInfo info = + groupInfo != null && ref.getUUID() != null ? groupInfo.get(ref.getUUID()) : null; boolean link; if (ref.getUUID() != null && AccountGroup.isInternalGroup(ref.getUUID())) { @@ -211,14 +201,16 @@ public class PermissionRuleEditor extends Composite implements groupNameLink.setHref("#" + token); groupNameLink.setTitle(info != null ? info.getDescription() : null); groupNameLink.setTarget(null); - clickHandler = groupNameLink.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - event.preventDefault(); - event.stopPropagation(); - Gerrit.display(token); - } - }); + clickHandler = + groupNameLink.addClickHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + event.preventDefault(); + event.stopPropagation(); + Gerrit.display(token); + } + }); link = true; } else if (info != null && info.getUrl() != null) { groupNameLink.setText(ref.getName()); @@ -238,27 +230,22 @@ public class PermissionRuleEditor extends Composite implements } @Override - public void setDelegate(EditorDelegate delegate) { - } + public void setDelegate(EditorDelegate delegate) {} @Override - public void flush() { - } + public void flush() {} @Override - public void onPropertyChange(String... paths) { - } + public void onPropertyChange(String... paths) {} - private static class ActionRenderer implements - Renderer { + private static class ActionRenderer implements Renderer { @Override public String render(PermissionRule.Action object) { return object != null ? object.toString() : ""; } @Override - public void render(PermissionRule.Action object, Appendable appendable) - throws IOException { + public void render(PermissionRule.Action object, Appendable appendable) throws IOException { appendable.append(render(object)); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PluginListScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PluginListScreen.java index 4dcb52faed..dcd214cd72 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PluginListScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PluginListScreen.java @@ -42,12 +42,13 @@ public class PluginListScreen extends PluginScreen { @Override protected void onLoad() { super.onLoad(); - PluginMap.all(new ScreenLoadCallback(this) { - @Override - protected void preDisplay(final PluginMap result) { - pluginTable.display(result); - } - }); + PluginMap.all( + new ScreenLoadCallback(this) { + @Override + protected void preDisplay(final PluginMap result) { + pluginTable.display(result); + } + }); } private void initPluginList() { @@ -91,8 +92,8 @@ public class PluginListScreen extends PluginScreen { if (plugin.disabled() || plugin.indexUrl() == null) { table.setText(row, 1, plugin.name()); } else { - table.setWidget(row, 1, new Anchor(plugin.name(), - Gerrit.selfRedirect(plugin.indexUrl()), "_blank")); + table.setWidget( + row, 1, new Anchor(plugin.name(), Gerrit.selfRedirect(plugin.indexUrl()), "_blank")); if (new ExtensionScreen(plugin.name() + "/settings").isFound()) { InlineHyperlink adminScreenLink = new InlineHyperlink(); @@ -104,9 +105,7 @@ public class PluginListScreen extends PluginScreen { } table.setText(row, 3, plugin.version()); - table.setText(row, 4, plugin.disabled() - ? Util.C.pluginDisabled() - : Util.C.pluginEnabled()); + table.setText(row, 4, plugin.disabled() ? Util.C.pluginDisabled() : Util.C.pluginEnabled()); final FlexCellFormatter fmt = table.getFlexCellFormatter(); fmt.addStyleName(row, 1, Gerrit.RESOURCES.css().dataCell()); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectAccessEditor.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectAccessEditor.java index f29619ad5d..05142c49f6 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectAccessEditor.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectAccessEditor.java @@ -38,39 +38,29 @@ import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.Image; - import java.util.ArrayList; import java.util.List; -public class ProjectAccessEditor extends Composite implements - Editor, ValueAwareEditor { - interface Binder extends UiBinder { - } +public class ProjectAccessEditor extends Composite + implements Editor, ValueAwareEditor { + interface Binder extends UiBinder {} private static final Binder uiBinder = GWT.create(Binder.class); - @UiField - DivElement inheritsFrom; + @UiField DivElement inheritsFrom; - @UiField - Hyperlink parentProject; + @UiField Hyperlink parentProject; - @UiField - @Editor.Ignore - ParentProjectBox parentProjectBox; + @UiField @Editor.Ignore ParentProjectBox parentProjectBox; - @UiField - DivElement history; + @UiField DivElement history; - @UiField - FlowPanel webLinkPanel; + @UiField FlowPanel webLinkPanel; - @UiField - FlowPanel localContainer; + @UiField FlowPanel localContainer; ListEditor local; - @UiField - Anchor addSection; + @UiField Anchor addSection; private ProjectAccess value; @@ -139,12 +129,10 @@ public class ProjectAccessEditor extends Composite implements } @Override - public void onPropertyChange(String... paths) { - } + public void onPropertyChange(String... paths) {} @Override - public void setDelegate(EditorDelegate delegate) { - } + public void setDelegate(EditorDelegate delegate) {} void setEditing(final boolean editing) { this.editing = editing; diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectAccessScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectAccessScreen.java index 634520754b..ded0b0590b 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectAccessScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectAccessScreen.java @@ -48,7 +48,6 @@ import com.google.gwt.user.client.ui.UIObject; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwtexpui.globalkey.client.NpTextArea; import com.google.gwtjsonrpc.client.RemoteJsonException; - import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -57,45 +56,34 @@ import java.util.Map; import java.util.Set; public class ProjectAccessScreen extends ProjectScreen { - interface Binder extends UiBinder { - } + interface Binder extends UiBinder {} private static final Binder uiBinder = GWT.create(Binder.class); - interface Driver extends SimpleBeanEditorDriver< // - ProjectAccess, // - ProjectAccessEditor> { - } + interface Driver + extends SimpleBeanEditorDriver< // + ProjectAccess, // + ProjectAccessEditor> {} - @UiField - DivElement editTools; + @UiField DivElement editTools; - @UiField - Button edit; + @UiField Button edit; - @UiField - Button cancel1; + @UiField Button cancel1; - @UiField - Button cancel2; + @UiField Button cancel2; - @UiField - VerticalPanel error; + @UiField VerticalPanel error; - @UiField - ProjectAccessEditor accessEditor; + @UiField ProjectAccessEditor accessEditor; - @UiField - DivElement commitTools; + @UiField DivElement commitTools; - @UiField - NpTextArea commitMessage; + @UiField NpTextArea commitMessage; - @UiField - Button commit; + @UiField Button commit; - @UiField - Button review; + @UiField Button review; private Driver driver; @@ -122,24 +110,27 @@ public class ProjectAccessScreen extends ProjectScreen { super.onLoad(); CallbackGroup cbs = new CallbackGroup(); ConfigServerApi.capabilities( - cbs.add(new AsyncCallback>() { - @Override - public void onSuccess(NativeMap result) { - capabilityMap = result; - } + cbs.add( + new AsyncCallback>() { + @Override + public void onSuccess(NativeMap result) { + capabilityMap = result; + } - @Override - public void onFailure(Throwable caught) { - // Handled by ScreenLoadCallback.onFailure(). - } - })); - Util.PROJECT_SVC.projectAccess(getProjectKey(), - cbs.addFinal(new ScreenLoadCallback(this) { - @Override - public void preDisplay(ProjectAccess access) { - displayReadOnly(access); - } - })); + @Override + public void onFailure(Throwable caught) { + // Handled by ScreenLoadCallback.onFailure(). + } + })); + Util.PROJECT_SVC.projectAccess( + getProjectKey(), + cbs.addFinal( + new ScreenLoadCallback(this) { + @Override + public void preDisplay(ProjectAccess access) { + displayReadOnly(access); + } + })); savedPanel = ACCESS; } @@ -178,8 +169,8 @@ public class ProjectAccessScreen extends ProjectScreen { ProjectAccess mock = new ProjectAccess(); mock.setProjectName(access.getProjectName()); mock.setRevision(access.getRevision()); - mock.setLocal(Collections. emptyList()); - mock.setOwnerOf(Collections. emptySet()); + mock.setLocal(Collections.emptyList()); + mock.setOwnerOf(Collections.emptySet()); driver.edit(mock); } @@ -229,8 +220,7 @@ public class ProjectAccessScreen extends ProjectScreen { } } - private Set getDiffs(ProjectAccess wantedAccess, - ProjectAccess newAccess) { + private Set getDiffs(ProjectAccess wantedAccess, ProjectAccess newAccess) { List wantedSections = mergeSections(removeEmptyPermissionsAndSections(wantedAccess.getLocal())); List newSections = @@ -255,10 +245,12 @@ public class ProjectAccessScreen extends ProjectScreen { error.clear(); enable(true); if (caught instanceof RemoteJsonException - && caught.getMessage().startsWith( - UpdateParentFailedException.MESSAGE)) { - new ErrorDialog(Gerrit.M.parentUpdateFailed(caught.getMessage() - .substring(UpdateParentFailedException.MESSAGE.length() + 1))) + && caught.getMessage().startsWith(UpdateParentFailedException.MESSAGE)) { + new ErrorDialog( + Gerrit.M.parentUpdateFailed( + caught + .getMessage() + .substring(UpdateParentFailedException.MESSAGE.length() + 1))) .center(); } else { super.onFailure(caught); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectBranchesScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectBranchesScreen.java index 31edefcbeb..729b43f960 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectBranchesScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectBranchesScreen.java @@ -66,7 +66,6 @@ import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Widget; import com.google.gwtexpui.globalkey.client.NpTextBox; import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder; - import java.util.HashSet; import java.util.List; import java.util.Set; @@ -96,7 +95,8 @@ public class ProjectBranchesScreen extends PaginatedProjectScreen { protected void onLoad() { super.onLoad(); addPanel.setVisible(false); - AccessMap.get(getProjectKey(), + AccessMap.get( + getProjectKey(), new GerritCallback() { @Override public void onSuccess(ProjectAccessInfo result) { @@ -134,38 +134,41 @@ public class ProjectBranchesScreen extends PaginatedProjectScreen { nameTxtBox = new HintTextBox(); nameTxtBox.setVisibleLength(texBoxLength); nameTxtBox.setHintText(Util.C.defaultBranchName()); - nameTxtBox.addKeyPressHandler(new KeyPressHandler() { - @Override - public void onKeyPress(KeyPressEvent event) { - if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) { - doAddNewBranch(); - } - } - }); + nameTxtBox.addKeyPressHandler( + new KeyPressHandler() { + @Override + public void onKeyPress(KeyPressEvent event) { + if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) { + doAddNewBranch(); + } + } + }); addGrid.setText(0, 0, Util.C.columnBranchName() + ":"); addGrid.setWidget(0, 1, nameTxtBox); irevTxtBox = new HintTextBox(); irevTxtBox.setVisibleLength(texBoxLength); irevTxtBox.setHintText(Util.C.defaultRevisionSpec()); - irevTxtBox.addKeyPressHandler(new KeyPressHandler() { - @Override - public void onKeyPress(KeyPressEvent event) { - if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) { - doAddNewBranch(); - } - } - }); + irevTxtBox.addKeyPressHandler( + new KeyPressHandler() { + @Override + public void onKeyPress(KeyPressEvent event) { + if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) { + doAddNewBranch(); + } + } + }); addGrid.setText(1, 0, Util.C.initialRevision() + ":"); addGrid.setWidget(1, 1, irevTxtBox); addBranch = new Button(Util.C.buttonAddBranch()); - addBranch.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - doAddNewBranch(); - } - }); + addBranch.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + doAddNewBranch(); + } + }); addPanel.add(addGrid); addPanel.add(addBranch); @@ -173,12 +176,13 @@ public class ProjectBranchesScreen extends PaginatedProjectScreen { delBranch = new Button(Util.C.buttonDeleteBranch()); delBranch.setStyleName(Gerrit.RESOURCES.css().branchTableDeleteButton()); - delBranch.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - branchTable.deleteChecked(); - } - }); + delBranch.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + branchTable.deleteChecked(); + } + }); HorizontalPanel buttons = new HorizontalPanel(); buttons.setStyleName(Gerrit.RESOURCES.css().branchTablePrevNextLinks()); buttons.add(delBranch); @@ -198,20 +202,21 @@ public class ProjectBranchesScreen extends PaginatedProjectScreen { hp.add(filterLabel); filterTxt = new NpTextBox(); filterTxt.setValue(match); - filterTxt.addKeyUpHandler(new KeyUpHandler() { - @Override - public void onKeyUp(KeyUpEvent event) { - Query q = new Query(filterTxt.getValue()); - if (match.equals(q.qMatch)) { - q.start(start); - } else { - if (query == null) { - q.run(); + filterTxt.addKeyUpHandler( + new KeyUpHandler() { + @Override + public void onKeyUp(KeyUpEvent event) { + Query q = new Query(filterTxt.getValue()); + if (match.equals(q.qMatch)) { + q.start(start); + } else { + if (query == null) { + q.run(); + } + query = q; + } } - query = q; - } - } - }); + }); hp.add(filterTxt); add(hp); } @@ -226,18 +231,23 @@ public class ProjectBranchesScreen extends PaginatedProjectScreen { final String rev = irevTxtBox.getText().trim(); if ("".equals(rev)) { irevTxtBox.setText("HEAD"); - Scheduler.get().scheduleDeferred(new ScheduledCommand() { - @Override - public void execute() { - irevTxtBox.selectAll(); - irevTxtBox.setFocus(true); - } - }); + Scheduler.get() + .scheduleDeferred( + new ScheduledCommand() { + @Override + public void execute() { + irevTxtBox.selectAll(); + irevTxtBox.setFocus(true); + } + }); return; } addBranch.setEnabled(false); - ProjectApi.createBranch(getProjectKey(), branchName, rev, + ProjectApi.createBranch( + getProjectKey(), + branchName, + rev, new GerritCallback() { @Override public void onSuccess(BranchInfo branch) { @@ -267,13 +277,15 @@ public class ProjectBranchesScreen extends PaginatedProjectScreen { b.closeElement("p"); ConfirmationDialog confirmationDialog = - new ConfirmationDialog(Gerrit.C.branchCreationDialogTitle(), - b.toSafeHtml(), new ConfirmationCallback() { - @Override - public void onOk() { - //do nothing - } - }); + new ConfirmationDialog( + Gerrit.C.branchCreationDialogTitle(), + b.toSafeHtml(), + new ConfirmationCallback() { + @Override + public void onOk() { + //do nothing + } + }); confirmationDialog.center(); confirmationDialog.setCancelVisible(false); } @@ -298,19 +310,21 @@ public class ProjectBranchesScreen extends PaginatedProjectScreen { fmt.addStyleName(0, 3, Gerrit.RESOURCES.css().dataHeader()); fmt.addStyleName(0, 4, Gerrit.RESOURCES.css().dataHeader()); - updateDeleteHandler = new ValueChangeHandler() { - @Override - public void onValueChange(ValueChangeEvent event) { - updateDeleteButton(); - } - }; + updateDeleteHandler = + new ValueChangeHandler() { + @Override + public void onValueChange(ValueChangeEvent event) { + updateDeleteButton(); + } + }; } Set getCheckedRefs() { Set refs = new HashSet<>(); for (int row = 1; row < table.getRowCount(); row++) { final BranchInfo k = getRowItem(row); - if (k != null && table.getWidget(row, 1) instanceof CheckBox + if (k != null + && table.getWidget(row, 1) instanceof CheckBox && ((CheckBox) table.getWidget(row, 1)).getValue()) { refs.add(k.ref()); } @@ -321,8 +335,7 @@ public class ProjectBranchesScreen extends PaginatedProjectScreen { void setChecked(Set refs) { for (int row = 1; row < table.getRowCount(); row++) { final BranchInfo k = getRowItem(row); - if (k != null && refs.contains(k.ref()) && - table.getWidget(row, 1) instanceof CheckBox) { + if (k != null && refs.contains(k.ref()) && table.getWidget(row, 1) instanceof CheckBox) { ((CheckBox) table.getWidget(row, 1)).setValue(true); } } @@ -354,23 +367,27 @@ public class ProjectBranchesScreen extends PaginatedProjectScreen { delBranch.setEnabled(false); ConfirmationDialog confirmationDialog = - new ConfirmationDialog(Gerrit.C.branchDeletionDialogTitle(), - b.toSafeHtml(), new ConfirmationCallback() { - @Override - public void onOk() { - deleteBranches(refs); - } + new ConfirmationDialog( + Gerrit.C.branchDeletionDialogTitle(), + b.toSafeHtml(), + new ConfirmationCallback() { + @Override + public void onOk() { + deleteBranches(refs); + } - @Override - public void onCancel() { - branchTable.updateDeleteButton(); - } - }); + @Override + public void onCancel() { + branchTable.updateDeleteButton(); + } + }); confirmationDialog.center(); } private void deleteBranches(final Set branches) { - ProjectApi.deleteBranches(getProjectKey(), branches, + ProjectApi.deleteBranches( + getProjectKey(), + branches, new GerritCallback() { @Override public void onSuccess(VoidResult result) { @@ -443,8 +460,7 @@ public class ProjectBranchesScreen extends PaginatedProjectScreen { final FlexCellFormatter fmt = table.getFlexCellFormatter(); String iconCellStyle = Gerrit.RESOURCES.css().iconCell(); String dataCellStyle = Gerrit.RESOURCES.css().dataCell(); - if (RefNames.REFS_CONFIG.equals(k.getShortName()) - || "HEAD".equals(k.getShortName())) { + if (RefNames.REFS_CONFIG.equals(k.getShortName()) || "HEAD".equals(k.getShortName())) { iconCellStyle = Gerrit.RESOURCES.css().specialBranchIconCell(); dataCellStyle = Gerrit.RESOURCES.css().specialBranchDataCell(); fmt.setStyleName(row, 0, iconCellStyle); @@ -457,9 +473,9 @@ public class ProjectBranchesScreen extends PaginatedProjectScreen { setRowItem(row, k); } - private void setHeadRevision(final int row, final int column, - final String rev) { - AccessMap.get(getProjectKey(), + private void setHeadRevision(final int row, final int column, final String rev) { + AccessMap.get( + getProjectKey(), new GerritCallback() { @Override public void onSuccess(ProjectAccessInfo result) { @@ -493,47 +509,52 @@ public class ProjectBranchesScreen extends PaginatedProjectScreen { OnEditEnabler e = new OnEditEnabler(save); e.listenTo(input); - edit.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - l.setVisible(false); - edit.setVisible(false); - input.setVisible(true); - save.setVisible(true); - cancel.setVisible(true); - } - }); - save.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - save.setEnabled(false); - ProjectApi.setHead(getProjectKey(), input.getValue().trim(), - new GerritCallback() { + edit.addClickHandler( + new ClickHandler() { @Override - public void onSuccess(NativeString result) { - Gerrit.display(PageLinks.toProjectBranches(getProjectKey())); - } - - @Override - public void onFailure(Throwable caught) { - super.onFailure(caught); - save.setEnabled(true); + public void onClick(ClickEvent event) { + l.setVisible(false); + edit.setVisible(false); + input.setVisible(true); + save.setVisible(true); + cancel.setVisible(true); + } + }); + save.addClickHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + save.setEnabled(false); + ProjectApi.setHead( + getProjectKey(), + input.getValue().trim(), + new GerritCallback() { + @Override + public void onSuccess(NativeString result) { + Gerrit.display(PageLinks.toProjectBranches(getProjectKey())); + } + + @Override + public void onFailure(Throwable caught) { + super.onFailure(caught); + save.setEnabled(true); + } + }); + } + }); + cancel.addClickHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + l.setVisible(true); + edit.setVisible(true); + input.setVisible(false); + input.setValue(headRevision); + save.setVisible(false); + save.setEnabled(false); + cancel.setVisible(false); } }); - } - }); - cancel.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - l.setVisible(true); - edit.setVisible(true); - input.setVisible(false); - input.setValue(headRevision); - save.setVisible(false); - save.setEnabled(false); - cancel.setVisible(false); - } - }); p.add(l); p.add(edit); @@ -600,19 +621,23 @@ public class ProjectBranchesScreen extends PaginatedProjectScreen { Query run() { // Retrieve one more branch than page size to determine if there are more // branches to display - ProjectApi.getBranches(getProjectKey(), pageSize + 1, qStart, qMatch, - new ScreenLoadCallback>(ProjectBranchesScreen.this) { - @Override - public void preDisplay(JsArray result) { - if (!isAttached()) { - // View has been disposed. - } else if (query == Query.this) { - query = null; - showList(result); - } else { - query.run(); - } - } + ProjectApi.getBranches( + getProjectKey(), + pageSize + 1, + qStart, + qMatch, + new ScreenLoadCallback>(ProjectBranchesScreen.this) { + @Override + public void preDisplay(JsArray result) { + if (!isAttached()) { + // View has been disposed. + } else if (query == Query.this) { + query = null; + showList(result); + } else { + query.run(); + } + } }); return this; } @@ -626,8 +651,7 @@ public class ProjectBranchesScreen extends PaginatedProjectScreen { branchTable.display(Natives.asList(result)); next.setVisible(false); } else { - branchTable.displaySubset(Natives.asList(result), 0, - result.length() - 1); + branchTable.displaySubset(Natives.asList(result), 0, result.length() - 1); setupNavigationLink(next, qMatch, qStart + pageSize); } if (qStart > 0) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectDashboardsScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectDashboardsScreen.java index f77986175b..52fe33996f 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectDashboardsScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectDashboardsScreen.java @@ -33,13 +33,14 @@ public class ProjectDashboardsScreen extends ProjectScreen { @Override protected void onLoad() { super.onLoad(); - DashboardList.all(getProjectKey(), + DashboardList.all( + getProjectKey(), new ScreenLoadCallback>(this) { - @Override - protected void preDisplay(JsArray result) { - dashes.display(result); - } - }); + @Override + protected void preDisplay(JsArray result) { + dashes.display(result); + } + }); savedPanel = DASHBOARDS; } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectInfoScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectInfoScreen.java index 24c2da7b2b..e2203d52a5 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectInfoScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectInfoScreen.java @@ -62,7 +62,6 @@ import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import com.google.gwtexpui.globalkey.client.NpTextArea; import com.google.gwtexpui.globalkey.client.NpTextBox; - import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -111,17 +110,17 @@ public class ProjectInfoScreen extends ProjectScreen { Resources.I.style().ensureInjected(); saveProject = new Button(Util.C.buttonSaveChanges()); saveProject.setStyleName(""); - saveProject.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - doSave(); - } - }); + saveProject.addClickHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + doSave(); + } + }); ExtensionPanel extensionPanelTop = new ExtensionPanel(GerritUiExtensionPoint.PROJECT_INFO_SCREEN_TOP); - extensionPanelTop.put(GerritUiExtensionPoint.Key.PROJECT_NAME, - getProjectKey().get()); + extensionPanelTop.put(GerritUiExtensionPoint.Key.PROJECT_NAME, getProjectKey().get()); add(extensionPanelTop); add(new ProjectDownloadPanel(getProjectKey().get(), true)); @@ -139,8 +138,7 @@ public class ProjectInfoScreen extends ProjectScreen { ExtensionPanel extensionPanelBottom = new ExtensionPanel(GerritUiExtensionPoint.PROJECT_INFO_SCREEN_BOTTOM); - extensionPanelBottom.put(GerritUiExtensionPoint.Key.PROJECT_NAME, - getProjectKey().get()); + extensionPanelBottom.put(GerritUiExtensionPoint.Key.PROJECT_NAME, getProjectKey().get()); add(extensionPanelBottom); } @@ -150,23 +148,27 @@ public class ProjectInfoScreen extends ProjectScreen { Project.NameKey project = getProjectKey(); CallbackGroup cbg = new CallbackGroup(); - AccessMap.get(project, - cbg.add(new GerritCallback() { - @Override - public void onSuccess(ProjectAccessInfo result) { - isOwner = result.isOwner(); - configVisible = result.configVisible(); - enableForm(); - saveProject.setVisible(isOwner); - } - })); - ProjectApi.getConfig(project, - cbg.addFinal(new ScreenLoadCallback(this) { - @Override - public void preDisplay(ConfigInfo result) { - display(result); - } - })); + AccessMap.get( + project, + cbg.add( + new GerritCallback() { + @Override + public void onSuccess(ProjectAccessInfo result) { + isOwner = result.isOwner(); + configVisible = result.configVisible(); + enableForm(); + saveProject.setVisible(isOwner); + } + })); + ProjectApi.getConfig( + project, + cbg.addFinal( + new ScreenLoadCallback(this) { + @Override + public void preDisplay(ConfigInfo result) { + display(result); + } + })); savedPanel = INFO; } @@ -227,12 +229,13 @@ public class ProjectInfoScreen extends ProjectScreen { for (final SubmitType type : SubmitType.values()) { submitType.addItem(Util.toLongString(type), type.name()); } - submitType.addChangeHandler(new ChangeHandler() { - @Override - public void onChange(ChangeEvent event) { - setEnabledForUseContentMerge(); - } - }); + submitType.addChangeHandler( + new ChangeHandler() { + @Override + public void onChange(ChangeEvent event) { + setEnabledForUseContentMerge(); + } + }); saveEnabler.listenTo(submitType); grid.add(Util.C.headingProjectSubmitType(), submitType); @@ -281,14 +284,13 @@ public class ProjectInfoScreen extends ProjectScreen { } /** - * Enables the {@link #contentMerge} checkbox if the selected submit type - * allows the usage of content merge. - * If the submit type (currently only 'Fast Forward Only') does not allow - * content merge the useContentMerge checkbox gets disabled. + * Enables the {@link #contentMerge} checkbox if the selected submit type allows the usage of + * content merge. If the submit type (currently only 'Fast Forward Only') does not allow content + * merge the useContentMerge checkbox gets disabled. */ private void setEnabledForUseContentMerge() { - if (SubmitType.FAST_FORWARD_ONLY.equals(SubmitType - .valueOf(submitType.getValue(submitType.getSelectedIndex())))) { + if (SubmitType.FAST_FORWARD_ONLY.equals( + SubmitType.valueOf(submitType.getValue(submitType.getSelectedIndex())))) { contentMerge.setEnabled(false); InheritedBooleanInfo b = InheritedBooleanInfo.create(); b.setConfiguredValue(InheritableBoolean.FALSE); @@ -362,8 +364,9 @@ public class ProjectInfoScreen extends ProjectScreen { } box.removeItem(inheritedIndex); } else { - box.setItemText(inheritedIndex, InheritableBoolean.INHERIT.name() + " (" - + inheritedBoolean.inheritedValue() + ")"); + box.setItemText( + inheritedIndex, + InheritableBoolean.INHERIT.name() + " (" + inheritedBoolean.inheritedValue() + ")"); } } } @@ -420,8 +423,7 @@ public class ProjectInfoScreen extends ProjectScreen { LabeledWidgetsGrid g = new LabeledWidgetsGrid(); g.addHeader(new SmallHeading(Util.M.pluginProjectOptionsTitle(pluginName))); pluginOptionsPanel.add(g); - NativeMap pluginConfig = - info.pluginConfig(pluginName); + NativeMap pluginConfig = info.pluginConfig(pluginName); pluginConfig.copyKeysIntoChildren("name"); for (ConfigParameterInfo param : Natives.asList(pluginConfig.values())) { HasEnabled w; @@ -454,18 +456,12 @@ public class ProjectInfoScreen extends ProjectScreen { enableForm(); } - private TextBox renderTextBox(LabeledWidgetsGrid g, - ConfigParameterInfo param) { - NpTextBox textBox = param.type().equals("STRING") - ? new NpTextBox() - : new NpIntTextBox(); + private TextBox renderTextBox(LabeledWidgetsGrid g, ConfigParameterInfo param) { + NpTextBox textBox = param.type().equals("STRING") ? new NpTextBox() : new NpIntTextBox(); if (param.inheritable()) { textBox.setValue(param.configuredValue()); - Label inheritedLabel = - new Label(Util.M.pluginProjectInheritedValue(param - .inheritedValue())); - inheritedLabel.setStyleName(Gerrit.RESOURCES.css() - .pluginProjectConfigInheritedValue()); + Label inheritedLabel = new Label(Util.M.pluginProjectInheritedValue(param.inheritedValue())); + inheritedLabel.setStyleName(Gerrit.RESOURCES.css().pluginProjectConfigInheritedValue()); HorizontalPanel p = new HorizontalPanel(); p.add(textBox); p.add(inheritedLabel); @@ -478,8 +474,7 @@ public class ProjectInfoScreen extends ProjectScreen { return textBox; } - private CheckBox renderCheckBox(LabeledWidgetsGrid g, - ConfigParameterInfo param) { + private CheckBox renderCheckBox(LabeledWidgetsGrid g, ConfigParameterInfo param) { CheckBox checkBox = new CheckBox(getDisplayName(param)); checkBox.setValue(Boolean.parseBoolean(param.value())); HorizontalPanel p = new HorizontalPanel(); @@ -494,20 +489,18 @@ public class ProjectInfoScreen extends ProjectScreen { warningImg.setTitle(param.warning()); p.add(warningImg); } - g.add((String)null, p); + g.add((String) null, p); saveEnabler.listenTo(checkBox); return checkBox; } - private ListBox renderListBox(LabeledWidgetsGrid g, - ConfigParameterInfo param) { + private ListBox renderListBox(LabeledWidgetsGrid g, ConfigParameterInfo param) { if (param.permittedValues() == null) { return null; } ListBox listBox = new ListBox(); if (param.inheritable()) { - listBox.addItem( - Util.M.pluginProjectInheritedListValue(param.inheritedValue())); + listBox.addItem(Util.M.pluginProjectInheritedListValue(param.inheritedValue())); if (param.configuredValue() == null) { listBox.setSelectedIndex(0); } @@ -539,10 +532,8 @@ public class ProjectInfoScreen extends ProjectScreen { // since the listBox is disabled the inherited value cannot be // seen and we have to display it explicitly Label inheritedLabel = - new Label(Util.M.pluginProjectInheritedValue(param - .inheritedValue())); - inheritedLabel.setStyleName(Gerrit.RESOURCES.css() - .pluginProjectConfigInheritedValue()); + new Label(Util.M.pluginProjectInheritedValue(param.inheritedValue())); + inheritedLabel.setStyleName(Gerrit.RESOURCES.css().pluginProjectConfigInheritedValue()); HorizontalPanel p = new HorizontalPanel(); p.add(listBox); p.add(inheritedLabel); @@ -555,11 +546,9 @@ public class ProjectInfoScreen extends ProjectScreen { return listBox; } - private StringListPanel renderStringListPanel(LabeledWidgetsGrid g, - ConfigParameterInfo param) { + private StringListPanel renderStringListPanel(LabeledWidgetsGrid g, ConfigParameterInfo param) { StringListPanel p = - new StringListPanel(null, Arrays.asList(getDisplayName(param)), - saveProject, false); + new StringListPanel(null, Arrays.asList(getDisplayName(param)), saveProject, false); List> values = new ArrayList<>(); for (String v : Natives.asList(param.values())) { values.add(Arrays.asList(v)); @@ -617,8 +606,7 @@ public class ProjectInfoScreen extends ProjectScreen { actionsGrid.add(Util.C.headingCommands(), actionsPanel); for (String id : actions.keySet()) { - actionsPanel.add(new ActionButton(getProjectKey(), - actions.get(id))); + actionsPanel.add(new ActionButton(getProjectKey(), actions.get(id))); } // TODO: The user should have create permission on the branch referred to by @@ -636,12 +624,13 @@ public class ProjectInfoScreen extends ProjectScreen { final Button createChange = new Button(Util.C.buttonCreateChange()); createChange.setStyleName(""); createChange.setTitle(Util.C.buttonCreateChangeDescription()); - createChange.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - CreateChangeAction.call(createChange, getProjectKey().get()); - } - }); + createChange.addClickHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + CreateChangeAction.call(createChange, getProjectKey().get()); + } + }); return createChange; } @@ -649,30 +638,37 @@ public class ProjectInfoScreen extends ProjectScreen { final Button editConfig = new Button(Util.C.buttonEditConfig()); editConfig.setStyleName(""); editConfig.setTitle(Util.C.buttonEditConfigDescription()); - editConfig.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - EditConfigAction.call(editConfig, getProjectKey().get()); - } - }); + editConfig.addClickHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + EditConfigAction.call(editConfig, getProjectKey().get()); + } + }); return editConfig; } private void doSave() { enableForm(false); saveProject.setEnabled(false); - InheritableBoolean esp = enableSignedPush != null - ? getBool(enableSignedPush) : null; - InheritableBoolean rsp = requireSignedPush != null - ? getBool(requireSignedPush) : null; - ProjectApi.setConfig(getProjectKey(), descTxt.getText().trim(), - getBool(contributorAgreements), getBool(contentMerge), - getBool(signedOffBy), getBool(newChangeForAllNotInTarget), getBool(requireChangeID), - esp, rsp, getBool(rejectImplicitMerges), + InheritableBoolean esp = enableSignedPush != null ? getBool(enableSignedPush) : null; + InheritableBoolean rsp = requireSignedPush != null ? getBool(requireSignedPush) : null; + ProjectApi.setConfig( + getProjectKey(), + descTxt.getText().trim(), + getBool(contributorAgreements), + getBool(contentMerge), + getBool(signedOffBy), + getBool(newChangeForAllNotInTarget), + getBool(requireChangeID), + esp, + rsp, + getBool(rejectImplicitMerges), maxObjectSizeLimit.getText().trim(), SubmitType.valueOf(submitType.getValue(submitType.getSelectedIndex())), ProjectState.valueOf(state.getValue(state.getSelectedIndex())), - getPluginConfigValues(), new GerritCallback() { + getPluginConfigValues(), + new GerritCallback() { @Override public void onSuccess(ConfigInfo result) { enableForm(); @@ -696,24 +692,26 @@ public class ProjectInfoScreen extends ProjectScreen { for (Entry e2 : e.getValue().entrySet()) { HasEnabled widget = e2.getValue(); if (widget instanceof TextBox) { - values.put(e2.getKey(), ConfigParameterValue.create() - .value(((TextBox) widget).getValue().trim())); + values.put( + e2.getKey(), + ConfigParameterValue.create().value(((TextBox) widget).getValue().trim())); } else if (widget instanceof CheckBox) { - values.put(e2.getKey(), ConfigParameterValue.create() - .value(Boolean.toString(((CheckBox) widget).getValue()))); + values.put( + e2.getKey(), + ConfigParameterValue.create() + .value(Boolean.toString(((CheckBox) widget).getValue()))); } else if (widget instanceof ListBox) { ListBox listBox = (ListBox) widget; // the inherited value is at index 0, // if it is selected no value should be set on this project - String value = listBox.getSelectedIndex() > 0 - ? listBox.getValue(listBox.getSelectedIndex()) : null; - values.put(e2.getKey(), ConfigParameterValue.create() - .value(value)); + String value = + listBox.getSelectedIndex() > 0 ? listBox.getValue(listBox.getSelectedIndex()) : null; + values.put(e2.getKey(), ConfigParameterValue.create().value(value)); } else if (widget instanceof StringListPanel) { - values.put(e2.getKey(), - ConfigParameterValue.create().values( - ((StringListPanel) widget).getValues(0) - .toArray(new String[] {}))); + values.put( + e2.getKey(), + ConfigParameterValue.create() + .values(((StringListPanel) widget).getValues(0).toArray(new String[] {}))); } else { throw new UnsupportedOperationException("unsupported widget type"); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectListScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectListScreen.java index 98eeb02ddf..63455b566b 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectListScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectListScreen.java @@ -38,7 +38,6 @@ import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.Label; import com.google.gwtexpui.globalkey.client.NpTextBox; - import java.util.List; public class ProjectListScreen extends PaginatedProjectScreen { @@ -81,74 +80,75 @@ public class ProjectListScreen extends PaginatedProjectScreen { next = PagingHyperlink.createNext(); next.setVisible(false); - projects = new ProjectsTable() { - @Override - protected void initColumnHeaders() { - super.initColumnHeaders(); - table.setText(0, ProjectsTable.C_REPO_BROWSER, - Util.C.projectRepoBrowser()); - table.getFlexCellFormatter(). - addStyleName(0, ProjectsTable.C_REPO_BROWSER, - Gerrit.RESOURCES.css().dataHeader()); - } - - @Override - protected void onOpenRow(final int row) { - History.newItem(link(getRowItem(row))); - } - - private String link(final ProjectInfo item) { - return Dispatcher.toProject(item.name_key()); - } - - @Override - protected void insert(int row, ProjectInfo k) { - super.insert(row, k); - table.getFlexCellFormatter().addStyleName(row, - ProjectsTable.C_REPO_BROWSER, Gerrit.RESOURCES.css().dataCell()); - } - - @Override - protected void populate(final int row, final ProjectInfo k) { - Image state = new Image(); - switch (k.state()) { - case HIDDEN: - state.setResource(Gerrit.RESOURCES.redNot()); - state.setTitle(Util.toLongString(k.state())); - table.setWidget(row, ProjectsTable.C_STATE, state); - break; - case READ_ONLY: - state.setResource(Gerrit.RESOURCES.readOnly()); - state.setTitle(Util.toLongString(k.state())); - table.setWidget(row, ProjectsTable.C_STATE, state); - break; - case ACTIVE: - default: - // Intentionally left blank, do not show an icon when active. - break; - } - - FlowPanel fp = new FlowPanel(); - fp.add(new ProjectSearchLink(k.name_key())); - fp.add(new HighlightingInlineHyperlink(k.name(), link(k), match)); - table.setWidget(row, ProjectsTable.C_NAME, fp); - table.setText(row, ProjectsTable.C_DESCRIPTION, k.description()); - addWebLinks(row, k); - - setRowItem(row, k); - } - - private void addWebLinks(int row, ProjectInfo k) { - List webLinks = Natives.asList(k.webLinks()); - if (webLinks != null && !webLinks.isEmpty()) { - FlowPanel p = new FlowPanel(); - table.setWidget(row, ProjectsTable.C_REPO_BROWSER, p); - for (WebLinkInfo weblink : webLinks) { - p.add(weblink.toAnchor()); + projects = + new ProjectsTable() { + @Override + protected void initColumnHeaders() { + super.initColumnHeaders(); + table.setText(0, ProjectsTable.C_REPO_BROWSER, Util.C.projectRepoBrowser()); + table + .getFlexCellFormatter() + .addStyleName(0, ProjectsTable.C_REPO_BROWSER, Gerrit.RESOURCES.css().dataHeader()); } - } - } - }; + + @Override + protected void onOpenRow(final int row) { + History.newItem(link(getRowItem(row))); + } + + private String link(final ProjectInfo item) { + return Dispatcher.toProject(item.name_key()); + } + + @Override + protected void insert(int row, ProjectInfo k) { + super.insert(row, k); + table + .getFlexCellFormatter() + .addStyleName(row, ProjectsTable.C_REPO_BROWSER, Gerrit.RESOURCES.css().dataCell()); + } + + @Override + protected void populate(final int row, final ProjectInfo k) { + Image state = new Image(); + switch (k.state()) { + case HIDDEN: + state.setResource(Gerrit.RESOURCES.redNot()); + state.setTitle(Util.toLongString(k.state())); + table.setWidget(row, ProjectsTable.C_STATE, state); + break; + case READ_ONLY: + state.setResource(Gerrit.RESOURCES.readOnly()); + state.setTitle(Util.toLongString(k.state())); + table.setWidget(row, ProjectsTable.C_STATE, state); + break; + case ACTIVE: + default: + // Intentionally left blank, do not show an icon when active. + break; + } + + FlowPanel fp = new FlowPanel(); + fp.add(new ProjectSearchLink(k.name_key())); + fp.add(new HighlightingInlineHyperlink(k.name(), link(k), match)); + table.setWidget(row, ProjectsTable.C_NAME, fp); + table.setText(row, ProjectsTable.C_DESCRIPTION, k.description()); + addWebLinks(row, k); + + setRowItem(row, k); + } + + private void addWebLinks(int row, ProjectInfo k) { + List webLinks = Natives.asList(k.webLinks()); + if (webLinks != null && !webLinks.isEmpty()) { + FlowPanel p = new FlowPanel(); + table.setWidget(row, ProjectsTable.C_REPO_BROWSER, p); + for (WebLinkInfo weblink : webLinks) { + p.add(weblink.toAnchor()); + } + } + } + }; projects.setSavePointerId(PageLinks.ADMIN_PROJECTS); add(projects); @@ -167,22 +167,24 @@ public class ProjectListScreen extends PaginatedProjectScreen { hp.add(filterLabel); filterTxt = new NpTextBox(); filterTxt.setValue(match); - filterTxt.addKeyUpHandler(new KeyUpHandler() { - @Override - public void onKeyUp(KeyUpEvent event) { - Query q = new Query(filterTxt.getValue()) - .open(event.getNativeKeyCode() == KeyCodes.KEY_ENTER); - if (match.equals(q.qMatch)) { - q.start(start); - } - if (q.open || !match.equals(q.qMatch)) { - if (query == null) { - q.run(); + filterTxt.addKeyUpHandler( + new KeyUpHandler() { + @Override + public void onKeyUp(KeyUpEvent event) { + Query q = + new Query(filterTxt.getValue()) + .open(event.getNativeKeyCode() == KeyCodes.KEY_ENTER); + if (match.equals(q.qMatch)) { + q.start(start); + } + if (q.open || !match.equals(q.qMatch)) { + if (query == null) { + q.run(); + } + query = q; + } } - query = q; - } - } - }); + }); hp.add(filterTxt); add(hp); } @@ -223,7 +225,10 @@ public class ProjectListScreen extends PaginatedProjectScreen { Query run() { int limit = open ? 1 : pageSize + 1; - ProjectMap.match(qMatch, limit, qStart, + ProjectMap.match( + qMatch, + limit, + qStart, new GerritCallback() { @Override public void onSuccess(ProjectMap result) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectTagsScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectTagsScreen.java index 2db0eff537..41f89f9e99 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectTagsScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectTagsScreen.java @@ -34,7 +34,6 @@ import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.InlineHTML; import com.google.gwt.user.client.ui.Label; import com.google.gwtexpui.globalkey.client.NpTextBox; - import java.util.List; public class ProjectTagsScreen extends PaginatedProjectScreen { @@ -89,18 +88,19 @@ public class ProjectTagsScreen extends PaginatedProjectScreen { hp.add(filterLabel); filterTxt = new NpTextBox(); filterTxt.setValue(match); - filterTxt.addKeyUpHandler(new KeyUpHandler() { - @Override - public void onKeyUp(KeyUpEvent event) { - Query q = new Query(filterTxt.getValue()); - if (match.equals(q.qMatch)) { - q.start(start); - } else if (query == null) { - q.run(); - query = q; - } - } - }); + filterTxt.addKeyUpHandler( + new KeyUpHandler() { + @Override + public void onKeyUp(KeyUpEvent event) { + Query q = new Query(filterTxt.getValue()); + if (match.equals(q.qMatch)) { + q.start(start); + } else if (query == null) { + q.run(); + query = q; + } + } + }); hp.add(filterTxt); add(hp); } @@ -189,7 +189,11 @@ public class ProjectTagsScreen extends PaginatedProjectScreen { Query run() { // Retrieve one more tag than page size to determine if there are more // tags to display - ProjectApi.getTags(getProjectKey(), pageSize + 1, qStart, qMatch, + ProjectApi.getTags( + getProjectKey(), + pageSize + 1, + qStart, + qMatch, new ScreenLoadCallback>(ProjectTagsScreen.this) { @Override public void preDisplay(JsArray result) { @@ -215,8 +219,7 @@ public class ProjectTagsScreen extends PaginatedProjectScreen { tagsTable.display(Natives.asList(result)); next.setVisible(false); } else { - tagsTable.displaySubset(Natives.asList(result), 0, - result.length() - 1); + tagsTable.displaySubset(Natives.asList(result), 0, result.length() - 1); setupNavigationLink(next, qMatch, qStart + pageSize); } if (qStart > 0) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/RangeBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/RangeBox.java index b5495284ff..063a60c4f2 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/RangeBox.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/RangeBox.java @@ -21,11 +21,9 @@ import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.IntegerBox; import com.google.gwt.user.client.ui.ValueBoxBase.TextAlignment; import com.google.gwt.user.client.ui.ValueListBox; - import java.io.IOException; -abstract class RangeBox extends Composite implements - IsEditor> { +abstract class RangeBox extends Composite implements IsEditor> { static final RangeRenderer rangeRenderer = new RangeRenderer(); private static class RangeRenderer implements Renderer { @@ -38,8 +36,7 @@ abstract class RangeBox extends Composite implements } @Override - public void render(Integer object, Appendable appendable) - throws IOException { + public void render(Integer object, Appendable appendable) throws IOException { appendable.append(render(object)); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/RefPatternBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/RefPatternBox.java index e8e88cc81d..a979ba7cb1 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/RefPatternBox.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/RefPatternBox.java @@ -21,73 +21,75 @@ import com.google.gwt.text.shared.Parser; import com.google.gwt.text.shared.Renderer; import com.google.gwt.user.client.ui.ValueBox; import com.google.gwtexpui.globalkey.client.GlobalKey; - import java.io.IOException; import java.text.ParseException; public class RefPatternBox extends ValueBox { - private static final Renderer RENDERER = new Renderer() { - @Override - public String render(String ref) { - return ref; - } - - @Override - public void render(String ref, Appendable dst) throws IOException { - dst.append(render(ref)); - } - }; - - private static final Parser PARSER = new Parser() { - @Override - public String parse(CharSequence text) throws ParseException { - String ref = text.toString(); - - if (ref.isEmpty()) { - throw new ParseException(Util.C.refErrorEmpty(), 0); - } - - if (ref.charAt(0) == '/') { - throw new ParseException(Util.C.refErrorBeginSlash(), 0); - } - - if (ref.charAt(0) == '^') { - if (!ref.startsWith("^refs/")) { - ref = "^refs/heads/" + ref.substring(1); - } - } else if (!ref.startsWith("refs/")) { - ref = "refs/heads/" + ref; - } - - for (int i = 0; i < ref.length(); i++) { - final char c = ref.charAt(i); - - if (c == '/' && 0 < i && ref.charAt(i - 1) == '/') { - throw new ParseException(Util.C.refErrorDoubleSlash(), i); + private static final Renderer RENDERER = + new Renderer() { + @Override + public String render(String ref) { + return ref; } - if (c == ' ') { - throw new ParseException(Util.C.refErrorNoSpace(), i); + @Override + public void render(String ref, Appendable dst) throws IOException { + dst.append(render(ref)); } + }; - if (c < ' ') { - throw new ParseException(Util.C.refErrorPrintable(), i); + private static final Parser PARSER = + new Parser() { + @Override + public String parse(CharSequence text) throws ParseException { + String ref = text.toString(); + + if (ref.isEmpty()) { + throw new ParseException(Util.C.refErrorEmpty(), 0); + } + + if (ref.charAt(0) == '/') { + throw new ParseException(Util.C.refErrorBeginSlash(), 0); + } + + if (ref.charAt(0) == '^') { + if (!ref.startsWith("^refs/")) { + ref = "^refs/heads/" + ref.substring(1); + } + } else if (!ref.startsWith("refs/")) { + ref = "refs/heads/" + ref; + } + + for (int i = 0; i < ref.length(); i++) { + final char c = ref.charAt(i); + + if (c == '/' && 0 < i && ref.charAt(i - 1) == '/') { + throw new ParseException(Util.C.refErrorDoubleSlash(), i); + } + + if (c == ' ') { + throw new ParseException(Util.C.refErrorNoSpace(), i); + } + + if (c < ' ') { + throw new ParseException(Util.C.refErrorPrintable(), i); + } + } + return ref; } - } - return ref; - } - }; + }; public RefPatternBox() { super(Document.get().createTextInputElement(), RENDERER, PARSER); addKeyPressHandler(GlobalKey.STOP_PROPAGATION); - addKeyPressHandler(new KeyPressHandler() { - @Override - public void onKeyPress(KeyPressEvent event) { - if (event.getCharCode() == ' ') { - event.preventDefault(); - } - } - }); + addKeyPressHandler( + new KeyPressHandler() { + @Override + public void onKeyPress(KeyPressEvent event) { + if (event.getCharCode() == ' ') { + event.preventDefault(); + } + } + }); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ValueEditor.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ValueEditor.java index 60b11c2606..ad614e5516 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ValueEditor.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ValueEditor.java @@ -37,30 +37,24 @@ import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.ValueBoxBase; import com.google.gwt.user.client.ui.Widget; - import java.text.ParseException; import java.util.List; -public class ValueEditor extends Composite implements HasEditorErrors, - IsEditor>, LeafValueEditor, Focusable { - interface Binder extends UiBinder> { - } +public class ValueEditor extends Composite + implements HasEditorErrors, IsEditor>, LeafValueEditor, Focusable { + interface Binder extends UiBinder> {} static final Binder uiBinder = GWT.create(Binder.class); - @UiField - SimplePanel textPanel; + @UiField SimplePanel textPanel; private Label textLabel; private StartEditHandlers startHandlers; - @UiField - Image editIcon; + @UiField Image editIcon; - @UiField - SimplePanel editPanel; + @UiField SimplePanel editPanel; - @UiField - DivElement errorLabel; + @UiField DivElement errorLabel; private ValueBoxBase editChild; private ValueBoxEditor editProxy; diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ActionContext.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ActionContext.java index a4fbb85715..7e1db46e9d 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ActionContext.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ActionContext.java @@ -142,33 +142,39 @@ public class ActionContext extends JavaScriptObject { }; }-*/; - static final native ActionContext create(RestApi f)/*-{ + static final native ActionContext create(RestApi f) /*-{ return new $wnd.Gerrit.ActionContext(f); }-*/; final native void set(ActionInfo a) /*-{ this.action=a; }-*/; + final native void set(ChangeInfo c) /*-{ this.change=c; }-*/; + final native void set(EditInfo e) /*-{ this.edit=e; }-*/; + final native void set(Project.NameKey p) /*-{ this.project=p; }-*/; + final native void set(BranchInfo b) /*-{ this.branch=b }-*/; + final native void set(RevisionInfo r) /*-{ this.revision=r; }-*/; final native void button(ActionButton b) /*-{ this._b=b; }-*/; + final native ActionButton button() /*-{ return this._b; }-*/; public final native boolean has_popup() /*-{ return this.hasOwnProperty('_p') }-*/; + public final native void hide() /*-{ this.hide(); }-*/; - protected ActionContext() { - } + protected ActionContext() {} static final void get(RestApi api, JavaScriptObject cb) { api.get(wrap(cb)); } /** - * The same as {@link #get(RestApi, JavaScriptObject)} but without converting - * a {@link NativeString} result to String. + * The same as {@link #get(RestApi, JavaScriptObject)} but without converting a {@link + * NativeString} result to String. */ static final void getRaw(RestApi api, final JavaScriptObject cb) { api.get(wrapRaw(cb)); @@ -183,8 +189,8 @@ public class ActionContext extends JavaScriptObject { } /** - * The same as {@link #post(RestApi, JavaScriptObject, JavaScriptObject)} but - * without converting a {@link NativeString} result to String. + * The same as {@link #post(RestApi, JavaScriptObject, JavaScriptObject)} but without converting a + * {@link NativeString} result to String. */ static final void postRaw(RestApi api, JavaScriptObject in, JavaScriptObject cb) { if (NativeString.is(in)) { @@ -199,8 +205,8 @@ public class ActionContext extends JavaScriptObject { } /** - * The same as {@link #post(RestApi, String, JavaScriptObject)} but without - * converting a {@link NativeString} result to String. + * The same as {@link #post(RestApi, String, JavaScriptObject)} but without converting a {@link + * NativeString} result to String. */ static final void postRaw(RestApi api, String in, JavaScriptObject cb) { api.post(in, wrapRaw(cb)); @@ -211,8 +217,8 @@ public class ActionContext extends JavaScriptObject { } /** - * The same as {@link #put(RestApi, JavaScriptObject)} but without converting - * a {@link NativeString} result to String. + * The same as {@link #put(RestApi, JavaScriptObject)} but without converting a {@link + * NativeString} result to String. */ static final void putRaw(RestApi api, JavaScriptObject cb) { api.put(wrapRaw(cb)); @@ -227,8 +233,8 @@ public class ActionContext extends JavaScriptObject { } /** - * The same as {@link #put(RestApi, JavaScriptObject, JavaScriptObject)} but - * without converting a {@link NativeString} result to String. + * The same as {@link #put(RestApi, JavaScriptObject, JavaScriptObject)} but without converting a + * {@link NativeString} result to String. */ static final void putRaw(RestApi api, JavaScriptObject in, JavaScriptObject cb) { if (NativeString.is(in)) { @@ -243,8 +249,8 @@ public class ActionContext extends JavaScriptObject { } /** - * The same as {@link #put(RestApi, String, JavaScriptObject)} but without - * converting a {@link NativeString} result to String. + * The same as {@link #put(RestApi, String, JavaScriptObject)} but without converting a {@link + * NativeString} result to String. */ static final void putRaw(RestApi api, String in, JavaScriptObject cb) { api.put(in, wrapRaw(cb)); @@ -255,8 +261,8 @@ public class ActionContext extends JavaScriptObject { } /** - * The same as {@link #delete(RestApi, JavaScriptObject)} but without - * converting a {@link NativeString} result to String. + * The same as {@link #delete(RestApi, JavaScriptObject)} but without converting a {@link + * NativeString} result to String. */ static final void deleteRaw(RestApi api, JavaScriptObject cb) { api.delete(wrapRaw(cb)); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ApiGlue.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ApiGlue.java index 626252ade1..1555f5651d 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ApiGlue.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ApiGlue.java @@ -286,8 +286,12 @@ public class ApiGlue { } static final native void invoke(JavaScriptObject f) /*-{ f(); }-*/; + static final native void invoke(JavaScriptObject f, JavaScriptObject a) /*-{ f(a); }-*/; - static final native void invoke(JavaScriptObject f, JavaScriptObject a, JavaScriptObject b) /*-{ f(a,b) }-*/; + + static final native void invoke( + JavaScriptObject f, JavaScriptObject a, JavaScriptObject b) /*-{ f(a,b) }-*/; + static final native void invoke(JavaScriptObject f, String a) /*-{ f(a); }-*/; public static final void fireEvent(String event, String a) { @@ -312,8 +316,7 @@ public class ApiGlue { } static final native JsArray getEventHandlers(String e) - /*-{ return $wnd.Gerrit.events[e] || [] }-*/; + /*-{ return $wnd.Gerrit.events[e] || [] }-*/ ; - private ApiGlue() { - } + private ApiGlue() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ChangeGlue.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ChangeGlue.java index 1e77773063..6bba95813e 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ChangeGlue.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ChangeGlue.java @@ -38,10 +38,7 @@ public class ChangeGlue { return true; } - public static void onAction( - ChangeInfo change, - ActionInfo action, - ActionButton button) { + public static void onAction(ChangeInfo change, ActionInfo action, ActionButton button) { RestApi api = ChangeApi.change(change.legacyId().get()).view(action.id()); JavaScriptObject f = get(action.id()); if (f != null) { @@ -59,10 +56,8 @@ public class ChangeGlue { return $wnd.Gerrit.change_actions[id]; }-*/; - private static native boolean invoke(JavaScriptObject h, - ChangeInfo a, RevisionInfo r) - /*-{ return h(a,r) }-*/; + private static native boolean invoke(JavaScriptObject h, ChangeInfo a, RevisionInfo r) + /*-{ return h(a,r) }-*/ ; - private ChangeGlue() { - } + private ChangeGlue() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/DefaultActions.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/DefaultActions.java index 55c40f87bb..74668c16e6 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/DefaultActions.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/DefaultActions.java @@ -64,8 +64,7 @@ class DefaultActions { }; } - private static void invoke(ActionInfo action, RestApi api, - AsyncCallback cb) { + private static void invoke(ActionInfo action, RestApi api, AsyncCallback cb) { if ("GET".equalsIgnoreCase(action.method())) { api.get(cb); } else if ("PUT".equalsIgnoreCase(action.method())) { @@ -77,18 +76,19 @@ class DefaultActions { } } - private DefaultActions() { - } + private DefaultActions() {} private static class UiResult extends JavaScriptObject { static native UiResult alert(String m) /*-{ return {'alert':m} }-*/; + static native UiResult none() /*-{ return {} }-*/; final native String alert() /*-{ return this.alert }-*/; + final native String redirectUrl() /*-{ return this.url }-*/; + final native boolean openWindow() /*-{ return this.open_window || false }-*/; - protected UiResult() { - } + protected UiResult() {} } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/EditGlue.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/EditGlue.java index b7e3df33a2..2d9a76a056 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/EditGlue.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/EditGlue.java @@ -24,13 +24,8 @@ import com.google.gwt.core.client.JavaScriptObject; public class EditGlue { public static void onAction( - ChangeInfo change, - EditInfo edit, - ActionInfo action, - ActionButton button) { - RestApi api = ChangeApi.edit( - change.legacyId().get()) - .view(action.id()); + ChangeInfo change, EditInfo edit, ActionInfo action, ActionButton button) { + RestApi api = ChangeApi.edit(change.legacyId().get()).view(action.id()); JavaScriptObject f = get(action.id()); if (f != null) { @@ -49,6 +44,5 @@ public class EditGlue { return $wnd.Gerrit.edit_actions[id]; }-*/; - private EditGlue() { - } + private EditGlue() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ExtensionPanel.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ExtensionPanel.java index e20c577c15..087336362c 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ExtensionPanel.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ExtensionPanel.java @@ -21,15 +21,13 @@ import com.google.gwt.core.client.JsArray; import com.google.gwt.dom.client.Element; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.SimplePanel; - import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; public class ExtensionPanel extends FlowPanel { - private static final Logger logger = - Logger.getLogger(ExtensionPanel.class.getName()); + private static final Logger logger = Logger.getLogger(ExtensionPanel.class.getName()); private final GerritUiExtensionPoint extensionPoint; private final List contexts; @@ -79,10 +77,14 @@ public class ExtensionPanel extends FlowPanel { try { ctx.onLoad(); } catch (RuntimeException e) { - logger.log(Level.SEVERE, + logger.log( + Level.SEVERE, "Failed to load extension panel for extension point " - + extensionPoint.name() + " from plugin " + ctx.getPluginName() - + ": " + e.getMessage()); + + extensionPoint.name() + + " from plugin " + + ctx.getPluginName() + + ": " + + e.getMessage()); } } } @@ -99,6 +101,7 @@ public class ExtensionPanel extends FlowPanel { static class Definition extends JavaScriptObject { static final JavaScriptObject TYPE = init(); + private static native JavaScriptObject init() /*-{ function PanelDefinition(n, c) { this.pluginName = n; @@ -107,36 +110,35 @@ public class ExtensionPanel extends FlowPanel { return PanelDefinition; }-*/; - static native JsArray get(String i) - /*-{ return $wnd.Gerrit.panels[i] || [] }-*/; + static native JsArray get(String i) /*-{ return $wnd.Gerrit.panels[i] || [] }-*/; - protected Definition() { - } + protected Definition() {} } static class Context extends JavaScriptObject { - static final Context create( - Definition def, - SimplePanel panel) { + static final Context create(Definition def, SimplePanel panel) { return create(TYPE, def, panel.getElement()); } final native void onLoad() /*-{ this._d.onLoad(this) }-*/; + final native JsArray unload() /*-{ return this._u }-*/; + final native String getPluginName() /*-{ return this._d.pluginName; }-*/; final native void put(String k, String v) /*-{ this.p[k] = v; }-*/; + final native void putInt(String k, int v) /*-{ this.p[k] = v; }-*/; + final native void putBoolean(String k, boolean v) /*-{ this.p[k] = v; }-*/; + final native void putObject(String k, JavaScriptObject v) /*-{ this.p[k] = v; }-*/; - private static native Context create( - JavaScriptObject T, - Definition d, - Element e) - /*-{ return new T(d,e) }-*/; + private static native Context create(JavaScriptObject T, Definition d, Element e) + /*-{ return new T(d,e) }-*/ ; private static final JavaScriptObject TYPE = init(); + private static native JavaScriptObject init() /*-{ var T = function(d,e) { this._d = d; @@ -150,7 +152,6 @@ public class ExtensionPanel extends FlowPanel { return T; }-*/; - protected Context() { - } + protected Context() {} } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ExtensionScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ExtensionScreen.java index 19dbe06c48..ff495b901b 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ExtensionScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ExtensionScreen.java @@ -73,6 +73,7 @@ public class ExtensionScreen extends Screen { static class Definition extends JavaScriptObject { static final JavaScriptObject TYPE = init(); + private static native JavaScriptObject init() /*-{ function ScreenDefinition(r, c) { this.pattern = r; @@ -81,11 +82,9 @@ public class ExtensionScreen extends Screen { return ScreenDefinition; }-*/; - static native JsArray get(String n) - /*-{ return $wnd.Gerrit.screens[n] || [] }-*/; + static native JsArray get(String n) /*-{ return $wnd.Gerrit.screens[n] || [] }-*/; - final native JsArrayString match(String t) - /*-{ + final native JsArrayString match(String t) /*-{ var p = this.pattern; if (p instanceof $wnd.RegExp) { var m = p.exec(t); @@ -94,30 +93,24 @@ public class ExtensionScreen extends Screen { return p == t ? [t] : null; }-*/; - protected Definition() { - } + protected Definition() {} } static class Context extends JavaScriptObject { - static final Context create( - Definition def, - ExtensionScreen view, - JsArrayString match) { + static final Context create(Definition def, ExtensionScreen view, JsArrayString match) { return create(TYPE, def, view, view.getBody().getElement(), match); } final native void onLoad() /*-{ this._d.onLoad(this) }-*/; + final native JsArray unload() /*-{ return this._u }-*/; private static native Context create( - JavaScriptObject T, - Definition d, - ExtensionScreen s, - Element e, - JsArrayString m) - /*-{ return new T(d,s,e,m) }-*/; + JavaScriptObject T, Definition d, ExtensionScreen s, Element e, JsArrayString m) + /*-{ return new T(d,s,e,m) }-*/ ; private static final JavaScriptObject TYPE = init(); + private static native JavaScriptObject init() /*-{ var T = function(d,s,e,m) { this._d = d; @@ -136,7 +129,6 @@ public class ExtensionScreen extends Screen { return T; }-*/; - protected Context() { - } + protected Context() {} } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ExtensionSettingsScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ExtensionSettingsScreen.java index 1d7259b9dc..e7d1ed1c16 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ExtensionSettingsScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ExtensionSettingsScreen.java @@ -21,7 +21,6 @@ import com.google.gerrit.client.rpc.Natives; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArray; import com.google.gwt.dom.client.Element; - import java.util.Set; /** SettingsScreen contributed by a plugin. */ @@ -75,6 +74,7 @@ public class ExtensionSettingsScreen extends SettingsScreen { public static class Definition extends JavaScriptObject { static final JavaScriptObject TYPE = init(); + private static native JavaScriptObject init() /*-{ function SettingsScreenDefinition(p, m, c) { this.path = p; @@ -85,43 +85,39 @@ public class ExtensionSettingsScreen extends SettingsScreen { }-*/; public static native JsArray get(String n) - /*-{ return $wnd.Gerrit.settingsScreens[n] || [] }-*/; + /*-{ return $wnd.Gerrit.settingsScreens[n] || [] }-*/ ; public static final Set plugins() { return Natives.keys(settingsScreens()); } private static native NativeMap settingsScreens() - /*-{ return $wnd.Gerrit.settingsScreens; }-*/; + /*-{ return $wnd.Gerrit.settingsScreens; }-*/ ; public final native String getPath() /*-{ return this.path; }-*/; + public final native String getMenu() /*-{ return this.menu; }-*/; - final native boolean matches(String t) - /*-{ return this.path == t; }-*/; + final native boolean matches(String t) /*-{ return this.path == t; }-*/; - protected Definition() { - } + protected Definition() {} } static class Context extends JavaScriptObject { - static final Context create( - Definition def, - ExtensionSettingsScreen view) { + static final Context create(Definition def, ExtensionSettingsScreen view) { return create(TYPE, def, view, view.getBody().getElement()); } final native void onLoad() /*-{ this._d.onLoad(this) }-*/; + final native JsArray unload() /*-{ return this._u }-*/; private static native Context create( - JavaScriptObject T, - Definition d, - ExtensionSettingsScreen s, - Element e) - /*-{ return new T(d,s,e) }-*/; + JavaScriptObject T, Definition d, ExtensionSettingsScreen s, Element e) + /*-{ return new T(d,s,e) }-*/ ; private static final JavaScriptObject TYPE = init(); + private static native JavaScriptObject init() /*-{ var T = function(d,s,e) { this._d = d; @@ -138,7 +134,6 @@ public class ExtensionSettingsScreen extends SettingsScreen { return T; }-*/; - protected Context() { - } + protected Context() {} } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/HtmlTemplate.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/HtmlTemplate.java index 6af244aea7..ba9c659b7f 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/HtmlTemplate.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/HtmlTemplate.java @@ -84,11 +84,7 @@ final class HtmlTemplate { return new SafeHtmlBuilder().append(opts.str(id)).asString(); } - private static Node parseHtml( - String html, - IdMap ids, - ReplacementMap opts, - boolean wantElements) { + private static Node parseHtml(String html, IdMap ids, ReplacementMap opts, boolean wantElements) { Element div = Document.get().createDivElement(); div.setInnerHTML(html); if (!ids.isEmpty()) { @@ -101,10 +97,7 @@ final class HtmlTemplate { } private static void attachHandlers( - Element e, - IdMap ids, - ReplacementMap opts, - boolean wantElements) { + Element e, IdMap ids, ReplacementMap opts, boolean wantElements) { if (e.getId() != null) { String key = ids.get(e.getId()); if (key != null) { @@ -116,7 +109,7 @@ final class HtmlTemplate { opts.map(key).attachHandlers(e); } } - for (Element c = e.getFirstChildElement(); c != null;) { + for (Element c = e.getFirstChildElement(); c != null; ) { attachHandlers(c, ids, opts, wantElements); c = c.getNextSiblingElement(); } @@ -124,7 +117,9 @@ final class HtmlTemplate { private static class ReplacementMap extends JavaScriptObject { final native ReplacementMap map(String n) /*-{ return this[n] }-*/; + final native String str(String n) /*-{ return ''+this[n] }-*/; + final native void attachHandlers(Element e) /*-{ for (var k in this) { var f = this[k]; @@ -133,25 +128,26 @@ final class HtmlTemplate { } }-*/; - protected ReplacementMap() { - } + protected ReplacementMap() {} } private static class IdMap extends JavaScriptObject { final native String get(String i) /*-{ return this[i] }-*/; + final native void remove(String i) /*-{ delete this[i] }-*/; + final native void put(String i, String k) /*-{ this[i] = k }-*/; + final native void put(String k, Element e) /*-{ this[k] = e }-*/; + final native boolean isEmpty() /*-{ for (var i in this) return false; return true; }-*/; - protected IdMap() { - } + protected IdMap() {} } - private HtmlTemplate() { - } + private HtmlTemplate() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/Plugin.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/Plugin.java index fb549eebfd..29787b8f38 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/Plugin.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/Plugin.java @@ -27,16 +27,21 @@ final class Plugin extends JavaScriptObject { } native String url() /*-{ return this._scriptUrl }-*/; + native String name() /*-{ return this.name }-*/; native boolean loaded() /*-{ return this._success || this._failure != null }-*/; + native Exception failure() /*-{ return this._failure }-*/; + native void failure(Exception e) /*-{ this._failure = e }-*/; + native boolean success() /*-{ return this._success || false }-*/; + native void _initialized() /*-{ this._success = true }-*/; private static native Plugin create(JavaScriptObject T, String u, String n) - /*-{ return new T(u,n) }-*/; + /*-{ return new T(u,n) }-*/ ; private static native JavaScriptObject createType() /*-{ function Plugin(u, n) { @@ -90,6 +95,5 @@ final class Plugin extends JavaScriptObject { }; }-*/; - protected Plugin() { - } + protected Plugin() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/PluginLoader.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/PluginLoader.java index ceb0eeea15..1c59dacbd7 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/PluginLoader.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/PluginLoader.java @@ -27,15 +27,14 @@ import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.DialogBox; import com.google.gwtexpui.progress.client.ProgressBar; - import java.util.List; /** Loads JavaScript plugins with a progress meter visible. */ public class PluginLoader extends DialogBox { private static PluginLoader self; - public static void load(List plugins, - int loadTimeout, AsyncCallback callback) { + public static void load( + List plugins, int loadTimeout, AsyncCallback callback) { if (plugins == null || plugins.isEmpty()) { callback.onSuccess(VoidResult.create()); } else { @@ -59,7 +58,7 @@ public class PluginLoader extends DialogBox { private boolean visible; private PluginLoader(int loadTimeout, AsyncCallback cb) { - super(/* auto hide */false, /* modal */true); + super(/* auto hide */ false, /* modal */ true); callback = cb; this.loadTimeout = loadTimeout; progress = new ProgressBar(Gerrit.C.loadingPlugins()); @@ -73,43 +72,46 @@ public class PluginLoader extends DialogBox { Plugin plugin = Plugin.create(url); plugins().put(url, plugin); ScriptInjector.fromUrl(url) - .setWindow(ScriptInjector.TOP_WINDOW) - .setCallback(new LoadCallback(plugin)) - .inject(); + .setWindow(ScriptInjector.TOP_WINDOW) + .setCallback(new LoadCallback(plugin)) + .inject(); } } private void startTimers() { - show = new Timer() { - @Override - public void run() { - setText(Window.getTitle()); - setWidget(progress); - setGlassEnabled(true); - getGlassElement().addClassName(Gerrit.RESOURCES.css().errorDialogGlass()); - hide(true); - center(); - visible = true; - } - }; + show = + new Timer() { + @Override + public void run() { + setText(Window.getTitle()); + setWidget(progress); + setGlassEnabled(true); + getGlassElement().addClassName(Gerrit.RESOURCES.css().errorDialogGlass()); + hide(true); + center(); + visible = true; + } + }; show.schedule(500); - update = new Timer() { - private int cycle; + update = + new Timer() { + private int cycle; - @Override - public void run() { - progress.setValue(100 * ++cycle * 250 / loadTimeout); - } - }; + @Override + public void run() { + progress.setValue(100 * ++cycle * 250 / loadTimeout); + } + }; update.scheduleRepeating(250); - timeout = new Timer() { - @Override - public void run() { - finish(); - } - }; + timeout = + new Timer() { + @Override + public void run() { + finish(); + } + }; timeout.schedule(loadTimeout); } @@ -166,8 +168,7 @@ public class PluginLoader extends DialogBox { return failed; } - private static native NativeMap plugins() - /*-{ return $wnd.Gerrit.plugins }-*/; + private static native NativeMap plugins() /*-{ return $wnd.Gerrit.plugins }-*/; private class LoadCallback implements Callback { private final Plugin plugin; @@ -177,8 +178,7 @@ public class PluginLoader extends DialogBox { } @Override - public void onSuccess(Void result) { - } + public void onSuccess(Void result) {} @Override public void onFailure(Exception reason) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/PluginName.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/PluginName.java index 330ec15a65..7cf4fbb3d1 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/PluginName.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/PluginName.java @@ -21,11 +21,10 @@ import com.google.gwt.core.client.JsArrayString; /** * Determines the name a plugin has been installed under. * - * This implementation guesses the name a plugin runs under by looking at the - * JavaScript call stack and identifying the URL of the script file calling - * {@code Gerrit.install()}. The simple approach applied here is looking at - * the source URLs and extracting the name out of the string, e.g.: - * {@code "http://localhost:8080/plugins/[name]/static/foo.js"}. + *

This implementation guesses the name a plugin runs under by looking at the JavaScript call + * stack and identifying the URL of the script file calling {@code Gerrit.install()}. The simple + * approach applied here is looking at the source URLs and extracting the name out of the string, + * e.g.: {@code "http://localhost:8080/plugins/[name]/static/foo.js"}. */ class PluginName { private static final String UNKNOWN = ""; @@ -35,7 +34,7 @@ class PluginName { } static String getCallerUrl() { - return GWT. create(PluginName.class).findCallerUrl(); + return GWT.create(PluginName.class).findCallerUrl(); } static String fromUrl(String url) { @@ -74,10 +73,9 @@ class PluginName { } protected static final native JavaScriptException makeException() - /*-{ try { null.a() } catch (e) { return e } }-*/; + /*-{ try { null.a() } catch (e) { return e } }-*/ ; - private static native boolean hasStack(JavaScriptException e) - /*-{ return !!e.stack }-*/; + private static native boolean hasStack(JavaScriptException e) /*-{ return !!e.stack }-*/; /** Extracts URL from the stack frame. */ static class PluginNameMoz extends PluginName { @@ -104,6 +102,6 @@ class PluginName { } private static native JsArrayString getStack(JavaScriptException e) - /*-{ return e.stack ? e.stack.split('\n') : [] }-*/; + /*-{ return e.stack ? e.stack.split('\n') : [] }-*/ ; } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/PopupHelper.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/PopupHelper.java index 5f28e14290..173b369e8d 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/PopupHelper.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/PopupHelper.java @@ -46,15 +46,16 @@ class PopupHelper { final PopupPanel p = new PopupPanel(true); p.setStyleName(Resources.I.style().popup()); p.addAutoHidePartner(activatingButton.getElement()); - p.addCloseHandler(new CloseHandler() { - @Override - public void onClose(CloseEvent event) { - activatingButton.unlink(); - if (popup == p) { - popup = null; - } - } - }); + p.addCloseHandler( + new CloseHandler() { + @Override + public void onClose(CloseEvent event) { + activatingButton.unlink(); + if (popup == p) { + popup = null; + } + } + }); p.add(panel); p.showRelativeTo(activatingButton); GlobalKey.dialog(p); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ProjectGlue.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ProjectGlue.java index f9084d9147..92070f8d63 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ProjectGlue.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ProjectGlue.java @@ -24,13 +24,8 @@ import com.google.gwt.core.client.JavaScriptObject; public class ProjectGlue { public static void onAction( - Project.NameKey project, - BranchInfo branch, - ActionInfo action, - ActionButton button) { - RestApi api = ProjectApi.project(project) - .view("branches").id(branch.ref()) - .view(action.id()); + Project.NameKey project, BranchInfo branch, ActionInfo action, ActionButton button) { + RestApi api = ProjectApi.project(project).view("branches").id(branch.ref()).view(action.id()); JavaScriptObject f = branchAction(action.id()); if (f != null) { ActionContext c = ActionContext.create(api); @@ -44,10 +39,7 @@ public class ProjectGlue { } } - public static void onAction( - Project.NameKey project, - ActionInfo action, - ActionButton button) { + public static void onAction(Project.NameKey project, ActionInfo action, ActionButton button) { RestApi api = ProjectApi.project(project).view(action.id()); JavaScriptObject f = projectAction(action.id()); if (f != null) { @@ -69,6 +61,5 @@ public class ProjectGlue { return $wnd.Gerrit.branch_actions[id]; }-*/; - private ProjectGlue() { - } + private ProjectGlue() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/RevisionGlue.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/RevisionGlue.java index 50ebce7a03..2d3b39360f 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/RevisionGlue.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/RevisionGlue.java @@ -24,14 +24,8 @@ import com.google.gwt.core.client.JavaScriptObject; public class RevisionGlue { public static void onAction( - ChangeInfo change, - RevisionInfo revision, - ActionInfo action, - ActionButton button) { - RestApi api = ChangeApi.revision( - change.legacyId().get(), - revision.name()) - .view(action.id()); + ChangeInfo change, RevisionInfo revision, ActionInfo action, ActionButton button) { + RestApi api = ChangeApi.revision(change.legacyId().get(), revision.name()).view(action.id()); JavaScriptObject f = get(action.id()); if (f != null) { @@ -50,6 +44,5 @@ public class RevisionGlue { return $wnd.Gerrit.revision_actions[id]; }-*/; - private RevisionGlue() { - } + private RevisionGlue() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/auth/openid/OpenIdConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/auth/openid/OpenIdConstants.java index 3bfb2970ac..2c21b74ed5 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/auth/openid/OpenIdConstants.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/auth/openid/OpenIdConstants.java @@ -18,6 +18,8 @@ import com.google.gwt.i18n.client.Constants; public interface OpenIdConstants extends Constants { String nameGoogle(); + String nameLaunchpad(); + String nameYahoo(); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/blame/BlameInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/blame/BlameInfo.java index bbd939a69a..77fddebe7c 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/blame/BlameInfo.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/blame/BlameInfo.java @@ -20,12 +20,14 @@ import com.google.gwt.core.client.JsArray; public class BlameInfo extends JavaScriptObject { public final native String author() /*-{ return this.author; }-*/; + public final native String id() /*-{ return this.id; }-*/; + public final native String commitMsg() /*-{ return this.commit_msg; }-*/; + public final native int time() /*-{ return this.time; }-*/; + public final native JsArray ranges() /*-{ return this.ranges; }-*/; - protected BlameInfo() { - } - + protected BlameInfo() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/AbandonAction.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/AbandonAction.java index e93bcd9535..b445b75b22 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/AbandonAction.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/AbandonAction.java @@ -32,12 +32,15 @@ class AbandonAction extends ActionMessageBox { @Override void send(String message) { - ChangeApi.abandon(id.get(), message, new GerritCallback() { - @Override - public void onSuccess(ChangeInfo result) { - Gerrit.display(PageLinks.toChange(id)); - hide(); - } - }); + ChangeApi.abandon( + id.get(), + message, + new GerritCallback() { + @Override + public void onSuccess(ChangeInfo result) { + Gerrit.display(PageLinks.toChange(id)); + hide(); + } + }); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ActionMessageBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ActionMessageBox.java index 396bc8abdf..5b3ee292d6 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ActionMessageBox.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ActionMessageBox.java @@ -33,6 +33,7 @@ import com.google.gwtexpui.globalkey.client.NpTextArea; abstract class ActionMessageBox extends Composite { interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); interface Style extends CssResource { @@ -64,14 +65,15 @@ abstract class ActionMessageBox extends Composite { final PopupPanel p = new PopupPanel(true); p.setStyleName(style.popup()); p.addAutoHidePartner(activatingButton.getElement()); - p.addCloseHandler(new CloseHandler() { - @Override - public void onClose(CloseEvent event) { - if (popup == p) { - popup = null; - } - } - }); + p.addCloseHandler( + new CloseHandler() { + @Override + public void onClose(CloseEvent event) { + if (popup == p) { + popup = null; + } + } + }); p.add(this); p.showRelativeTo(activatingButton); GlobalKey.dialog(p); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Actions.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Actions.java index 779c32b790..c24f4fbd89 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Actions.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Actions.java @@ -31,7 +31,6 @@ import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder; - import java.util.TreeSet; class Actions extends Composite { @@ -52,6 +51,7 @@ class Actions extends Composite { }; interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); @UiField Button cherrypick; @@ -102,17 +102,15 @@ class Actions extends Composite { initChangeActions(info, hasUser); - NativeMap actionMap = revInfo.hasActions() - ? revInfo.actions() - : NativeMap. create(); + NativeMap actionMap = + revInfo.hasActions() ? revInfo.actions() : NativeMap.create(); actionMap.copyKeysIntoChildren("id"); reloadRevisionActions(actionMap); } private void initChangeActions(ChangeInfo info, boolean hasUser) { - NativeMap actions = info.hasActions() - ? info.actions() - : NativeMap. create(); + NativeMap actions = + info.hasActions() ? info.actions() : NativeMap.create(); actions.copyKeysIntoChildren("id"); if (hasUser) { @@ -135,10 +133,7 @@ class Actions extends Composite { ActionInfo action = actions.get("submit"); submit.setTitle(action.title()); submit.setEnabled(action.enabled()); - submit.setHTML(new SafeHtmlBuilder() - .openDiv() - .append(action.label()) - .closeDiv()); + submit.setHTML(new SafeHtmlBuilder().openDiv().append(action.label()).closeDiv()); submit.setEnabled(action.enabled()); } submit.setVisible(canSubmit); @@ -173,8 +168,7 @@ class Actions extends Composite { @UiHandler("followUp") void onFollowUp(@SuppressWarnings("unused") ClickEvent e) { if (followUpAction == null) { - followUpAction = new FollowUpAction(followUp, project, - branch, topic, key); + followUpAction = new FollowUpAction(followUp, project, branch, topic, key); } followUpAction.show(); } @@ -197,8 +191,8 @@ class Actions extends Composite { @UiHandler("rebase") void onRebase(@SuppressWarnings("unused") ClickEvent e) { - RebaseAction.call(rebase, project, changeInfo.branch(), changeId, revision, - rebaseParentNotCurrent); + RebaseAction.call( + rebase, project, changeInfo.branch(), changeId, revision, rebaseParentNotCurrent); } @UiHandler("submit") diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/AddFileAction.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/AddFileAction.java index 195623a1b3..514b4adcc0 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/AddFileAction.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/AddFileAction.java @@ -32,8 +32,12 @@ class AddFileAction { private AddFileBox addBox; private PopupPanel popup; - AddFileAction(Change.Id changeId, RevisionInfo revision, - ChangeScreen.Style style, Widget addButton, FileTable files) { + AddFileAction( + Change.Id changeId, + RevisionInfo revision, + ChangeScreen.Style style, + Widget addButton, + FileTable files) { this.changeId = changeId; this.revision = revision; this.style = style; @@ -56,14 +60,15 @@ class AddFileAction { final PopupPanel p = new PopupPanel(true); p.setStyleName(style.replyBox()); p.addAutoHidePartner(addButton.getElement()); - p.addCloseHandler(new CloseHandler() { - @Override - public void onClose(CloseEvent event) { - if (popup == p) { - popup = null; - } - } - }); + p.addCloseHandler( + new CloseHandler() { + @Override + public void onClose(CloseEvent event) { + if (popup == p) { + popup = null; + } + } + }); p.add(addBox); p.showRelativeTo(addButton); GlobalKey.dialog(p); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/AddFileBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/AddFileBox.java index f747e0d157..21bb590ff1 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/AddFileBox.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/AddFileBox.java @@ -37,6 +37,7 @@ import com.google.gwt.user.client.ui.Widget; class AddFileBox extends Composite { interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); private final Change.Id changeId; @@ -55,19 +56,21 @@ class AddFileBox extends Composite { this.fileTable = files; path = new RemoteSuggestBox(new PathSuggestOracle(changeId, revision)); - path.addSelectionHandler(new SelectionHandler() { - @Override - public void onSelection(SelectionEvent event) { - open(event.getSelectedItem()); - } - }); - path.addCloseHandler(new CloseHandler() { - @Override - public void onClose(CloseEvent event) { - hide(); - fileTable.registerKeys(); - } - }); + path.addSelectionHandler( + new SelectionHandler() { + @Override + public void onSelection(SelectionEvent event) { + open(event.getSelectedItem()); + } + }); + path.addCloseHandler( + new CloseHandler() { + @Override + public void onClose(CloseEvent event) { + hide(); + fileTable.registerKeys(); + } + }); initWidget(uiBinder.createAndBindUi(this)); } @@ -87,9 +90,7 @@ class AddFileBox extends Composite { private void open(String path) { hide(); - Gerrit.display(Dispatcher.toEditScreen( - new PatchSet.Id(changeId, revision._number()), - path)); + Gerrit.display(Dispatcher.toEditScreen(new PatchSet.Id(changeId, revision._number()), path)); } @UiHandler("cancel") diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Assignee.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Assignee.java index 7d6b1c3f81..c7f6fae4a8 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Assignee.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Assignee.java @@ -45,12 +45,9 @@ import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.UIObject; -/** - * Edit assignee using auto-completion. - */ +/** Edit assignee using auto-completion. */ public class Assignee extends Composite { - interface Binder extends UiBinder { - } + interface Binder extends UiBinder {} private static final Binder uiBinder = GWT.create(Binder.class); @@ -59,6 +56,7 @@ public class Assignee extends Composite { @UiField Image editAssigneeIcon; @UiField Element form; @UiField Element error; + @UiField(provided = true) RemoteSuggestBox suggestBox; @@ -72,26 +70,30 @@ public class Assignee extends Composite { suggestBox = new RemoteSuggestBox(assigneeSuggestOracle); suggestBox.setVisibleLength(55); suggestBox.setHintText(Util.C.approvalTableEditAssigneeHint()); - suggestBox.addCloseHandler(new CloseHandler() { - @Override - public void onClose(CloseEvent event) { - Assignee.this.onCancel(null); - } - }); - suggestBox.addSelectionHandler(new SelectionHandler() { - @Override - public void onSelection(SelectionEvent event) { - editAssignee(event.getSelectedItem()); - } - }); + suggestBox.addCloseHandler( + new CloseHandler() { + @Override + public void onClose(CloseEvent event) { + Assignee.this.onCancel(null); + } + }); + suggestBox.addSelectionHandler( + new SelectionHandler() { + @Override + public void onSelection(SelectionEvent event) { + editAssignee(event.getSelectedItem()); + } + }); initWidget(uiBinder.createAndBindUi(this)); - editAssigneeIcon.addDomHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - onOpenForm(); - } - }, ClickEvent.getType()); + editAssigneeIcon.addDomHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + onOpenForm(); + } + }, + ClickEvent.getType()); } void set(ChangeInfo info) { @@ -140,7 +142,8 @@ public class Assignee extends Composite { private void editAssignee(final String assignee) { if (assignee.trim().isEmpty()) { - ChangeApi.deleteAssignee(changeId.get(), + ChangeApi.deleteAssignee( + changeId.get(), new GerritCallback() { @Override public void onSuccess(AccountInfo result) { @@ -154,14 +157,17 @@ public class Assignee extends Composite { new NotSignedInDialog().center(); } else { UIObject.setVisible(error, true); - error.setInnerText(err instanceof StatusCodeException - ? ((StatusCodeException) err).getEncodedResponse() - : err.getMessage()); + error.setInnerText( + err instanceof StatusCodeException + ? ((StatusCodeException) err).getEncodedResponse() + : err.getMessage()); } } }); } else { - ChangeApi.setAssignee(changeId.get(), assignee, + ChangeApi.setAssignee( + changeId.get(), + assignee, new GerritCallback() { @Override public void onSuccess(AccountInfo result) { @@ -179,9 +185,10 @@ public class Assignee extends Composite { new NotSignedInDialog().center(); } else { UIObject.setVisible(error, true); - error.setInnerText(err instanceof StatusCodeException - ? ((StatusCodeException) err).getEncodedResponse() - : err.getMessage()); + error.setInnerText( + err instanceof StatusCodeException + ? ((StatusCodeException) err).getEncodedResponse() + : err.getMessage()); } } }); @@ -191,25 +198,27 @@ public class Assignee extends Composite { private void setAssignee(AccountInfo assignee) { currentAssignee = assignee; assigneeLink.setText(assignee != null ? getName(assignee) : null); - assigneeLink.setTargetHistoryToken(assignee != null - ? PageLinks.toAssigneeQuery(assignee.name() != null - ? assignee.name() - : assignee.email() != null - ? assignee.email() - : String.valueOf(assignee._accountId())) - : ""); + assigneeLink.setTargetHistoryToken( + assignee != null + ? PageLinks.toAssigneeQuery( + assignee.name() != null + ? assignee.name() + : assignee.email() != null + ? assignee.email() + : String.valueOf(assignee._accountId())) + : ""); } private Reviewers getReviewers() { - Element e = DOM.getParent(getElement()); - for (e = DOM.getParent(e); e != null; e = DOM.getParent(e)) { - EventListener l = DOM.getEventListener(e); - if (l instanceof ChangeScreen) { - ChangeScreen screen = (ChangeScreen) l; - return screen.reviewers; - } + Element e = DOM.getParent(getElement()); + for (e = DOM.getParent(e); e != null; e = DOM.getParent(e)) { + EventListener l = DOM.getEventListener(e); + if (l instanceof ChangeScreen) { + ChangeScreen screen = (ChangeScreen) l; + return screen.reviewers; } - return null; + } + return null; } private String getName(AccountInfo info) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/AssigneeSuggestOracle.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/AssigneeSuggestOracle.java index 47d7541f82..964f7adbb8 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/AssigneeSuggestOracle.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/AssigneeSuggestOracle.java @@ -21,7 +21,6 @@ import com.google.gerrit.client.rpc.Natives; import com.google.gerrit.client.ui.AccountSuggestOracle.AccountSuggestion; import com.google.gerrit.client.ui.SuggestAfterTypingNCharsOracle; import com.google.gwt.core.client.JsArray; - import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -30,7 +29,9 @@ import java.util.List; public class AssigneeSuggestOracle extends SuggestAfterTypingNCharsOracle { @Override protected void _onRequestSuggestions(Request req, Callback cb) { - AccountApi.suggest(req.getQuery(), req.getLimit(), + AccountApi.suggest( + req.getQuery(), + req.getLimit(), new GerritCallback>() { @Override public void onSuccess(JsArray result) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeConstants.java index 99f3b9f245..bd211b7f9b 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeConstants.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeConstants.java @@ -18,39 +18,66 @@ import com.google.gwt.i18n.client.Constants; public interface ChangeConstants extends Constants { String previousChange(); + String nextChange(); + String openChange(); + String reviewedFileTitle(); + String editFileInline(); + String removeFileInline(); + String restoreFileInline(); String openLastFile(); + String openCommitMessage(); String patchSet(); + String commit(); + String date(); + String author(); + String draft(); String notAvailable(); + String relatedChanges(); + String relatedChangesTooltip(); + String conflictingChanges(); + String conflictingChangesTooltip(); + String cherryPicks(); + String cherryPicksTooltip(); + String sameTopic(); + String sameTopicTooltip(); + String submittedTogether(); + String submittedTogetherTooltip(); + String noChanges(); + String indirectAncestor(); + String merged(); + String abandoned(); String deleteChangeEdit(); + String deleteChange(); + String deleteDraftRevision(); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeMessages.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeMessages.java index 2a8dacfd61..4eead56e8a 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeMessages.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeMessages.java @@ -18,17 +18,30 @@ import com.google.gwt.i18n.client.Messages; public interface ChangeMessages extends Messages { String patchSets(String currentlyViewedPatchSet, int currentPatchSet); + String changeWithNoRevisions(int changeId); + String relatedChanges(int count); + String relatedChanges(String count); + String conflictingChanges(int count); + String conflictingChanges(String count); + String cherryPicks(int count); + String cherryPicks(String count); + String sameTopic(int count); + String sameTopic(String count); + String submittedTogether(int count); + String submittedTogether(String count); + String editPatchSet(int patchSet); + String failedToLoadFileList(String error); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen.java index 794425ed4d..60576a60ae 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen.java @@ -101,9 +101,6 @@ import com.google.gwtexpui.globalkey.client.KeyCommand; import com.google.gwtexpui.globalkey.client.KeyCommandSet; import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder; import com.google.gwtorm.client.KeyUtil; - -import net.codemirror.lib.CodeMirror; - import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collections; @@ -111,28 +108,42 @@ import java.util.EnumSet; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; +import net.codemirror.lib.CodeMirror; public class ChangeScreen extends Screen { - private static final Logger logger = - Logger.getLogger(ChangeScreen.class.getName()); + private static final Logger logger = Logger.getLogger(ChangeScreen.class.getName()); interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); interface Style extends CssResource { String avatar(); + String hashtagName(); + String hashtagIcon(); + String highlight(); + String labelName(); + String label_may(); + String label_need(); + String label_ok(); + String label_reject(); + String label_user(); + String pushCertStatus(); + String replyBox(); + String selected(); + String notCurrentPatchSet(); } @@ -241,8 +252,12 @@ public class ChangeScreen extends Screen { private DeleteFileAction deleteFileAction; private RenameFileAction renameFileAction; - public ChangeScreen(Change.Id changeId, DiffObject base, String revision, - boolean openReplyBox, FileTable.Mode mode) { + public ChangeScreen( + Change.Id changeId, + DiffObject base, + String revision, + boolean openReplyBox, + FileTable.Mode mode) { this.changeId = changeId; this.base = base; this.revision = normalize(revision); @@ -253,9 +268,7 @@ public class ChangeScreen extends Screen { } PatchSet.Id getPatchSetId() { - return new PatchSet.Id( - changeInfo.legacyId(), - changeInfo.revisions().get(revision)._number()); + return new PatchSet.Id(changeInfo.legacyId(), changeInfo.revisions().get(revision)._number()); } @Override @@ -263,62 +276,68 @@ public class ChangeScreen extends Screen { super.onLoad(); CallbackGroup group = new CallbackGroup(); if (Gerrit.isSignedIn()) { - ChangeList.query("change:" + changeId.get() + " has:draft", - Collections. emptySet(), - group.add(new AsyncCallback() { - @Override - public void onSuccess(ChangeList result) { - hasDraftComments = result.length() > 0; - } + ChangeList.query( + "change:" + changeId.get() + " has:draft", + Collections.emptySet(), + group.add( + new AsyncCallback() { + @Override + public void onSuccess(ChangeList result) { + hasDraftComments = result.length() > 0; + } - @Override - public void onFailure(Throwable caught) { - } - })); - ChangeApi.editWithFiles(changeId.get(), group.add( - new AsyncCallback() { - @Override - public void onSuccess(EditInfo result) { - edit = result; - } + @Override + public void onFailure(Throwable caught) {} + })); + ChangeApi.editWithFiles( + changeId.get(), + group.add( + new AsyncCallback() { + @Override + public void onSuccess(EditInfo result) { + edit = result; + } - @Override - public void onFailure(Throwable caught) { - } - })); + @Override + public void onFailure(Throwable caught) {} + })); } - loadChangeInfo(true, group.addFinal( - new GerritCallback() { - @Override - public void onSuccess(final ChangeInfo info) { - info.init(); - addExtensionPoints(info, initCurrentRevision(info)); - - final RevisionInfo rev = info.revision(revision); - CallbackGroup group = new CallbackGroup(); - loadCommit(rev, group); - - group.addListener(new GerritCallback() { + loadChangeInfo( + true, + group.addFinal( + new GerritCallback() { @Override - public void onSuccess(Void result) { - if (base.isBase() && rev.isMerge()) { - base = DiffObject.parse(info.legacyId(), - Gerrit.getUserPreferences() - .defaultBaseForMerges().getBase()); - } - loadConfigInfo(info, base); - JsArray mAr = info.messages(); - for (int i = 0; i < mAr.length(); i++) { - if (mAr.get(i).tag() != null) { - hideTaggedComments.setVisible(true); - break; - } - } + public void onSuccess(final ChangeInfo info) { + info.init(); + addExtensionPoints(info, initCurrentRevision(info)); + + final RevisionInfo rev = info.revision(revision); + CallbackGroup group = new CallbackGroup(); + loadCommit(rev, group); + + group.addListener( + new GerritCallback() { + @Override + public void onSuccess(Void result) { + if (base.isBase() && rev.isMerge()) { + base = + DiffObject.parse( + info.legacyId(), + Gerrit.getUserPreferences().defaultBaseForMerges().getBase()); + } + loadConfigInfo(info, base); + JsArray mAr = info.messages(); + for (int i = 0; i < mAr.length(); i++) { + if (mAr.get(i).tag() != null) { + hideTaggedComments.setVisible(true); + break; + } + } + } + }); + group.done(); } - }); - group.done(); - } - })); + })); } private RevisionInfo initCurrentRevision(ChangeInfo info) { @@ -361,28 +380,35 @@ public class ChangeScreen extends Screen { } private void addExtensionPoints(ChangeInfo change, RevisionInfo rev) { - addExtensionPoint(GerritUiExtensionPoint.CHANGE_SCREEN_HEADER, - headerExtension, change, rev); - addExtensionPoint(GerritUiExtensionPoint.CHANGE_SCREEN_HEADER_RIGHT_OF_BUTTONS, - headerExtensionMiddle, change, rev); - addExtensionPoint(GerritUiExtensionPoint.CHANGE_SCREEN_HEADER_RIGHT_OF_POP_DOWNS, - headerExtensionRight, change, rev); + addExtensionPoint(GerritUiExtensionPoint.CHANGE_SCREEN_HEADER, headerExtension, change, rev); addExtensionPoint( - GerritUiExtensionPoint.CHANGE_SCREEN_BELOW_CHANGE_INFO_BLOCK, - changeExtension, change, rev); + GerritUiExtensionPoint.CHANGE_SCREEN_HEADER_RIGHT_OF_BUTTONS, + headerExtensionMiddle, + change, + rev); + addExtensionPoint( + GerritUiExtensionPoint.CHANGE_SCREEN_HEADER_RIGHT_OF_POP_DOWNS, + headerExtensionRight, + change, + rev); + addExtensionPoint( + GerritUiExtensionPoint.CHANGE_SCREEN_BELOW_CHANGE_INFO_BLOCK, changeExtension, change, rev); addExtensionPoint( GerritUiExtensionPoint.CHANGE_SCREEN_BELOW_RELATED_INFO_BLOCK, - relatedExtension, change, rev); + relatedExtension, + change, + rev); addExtensionPoint( - GerritUiExtensionPoint.CHANGE_SCREEN_BELOW_COMMIT_INFO_BLOCK, - commitExtension, change, rev); + GerritUiExtensionPoint.CHANGE_SCREEN_BELOW_COMMIT_INFO_BLOCK, commitExtension, change, rev); addExtensionPoint( GerritUiExtensionPoint.CHANGE_SCREEN_HISTORY_RIGHT_OF_BUTTONS, - historyExtensionRight, change, rev); + historyExtensionRight, + change, + rev); } - private void addExtensionPoint(GerritUiExtensionPoint extensionPoint, - Panel p, ChangeInfo change, RevisionInfo rev) { + private void addExtensionPoint( + GerritUiExtensionPoint extensionPoint, Panel p, ChangeInfo change, RevisionInfo rev) { ExtensionPanel extensionPanel = new ExtensionPanel(extensionPoint); extensionPanel.putObject(GerritUiExtensionPoint.Key.CHANGE_INFO, change); extensionPanel.putObject(GerritUiExtensionPoint.Key.REVISION_INFO, rev); @@ -395,9 +421,8 @@ public class ChangeScreen extends Screen { void loadChangeInfo(boolean fg, AsyncCallback cb) { RestApi call = ChangeApi.detail(changeId.get()); - EnumSet opts = EnumSet.of( - ListChangesOption.ALL_REVISIONS, - ListChangesOption.CHANGE_ACTIONS); + EnumSet opts = + EnumSet.of(ListChangesOption.ALL_REVISIONS, ListChangesOption.CHANGE_ACTIONS); if (enableSignedPush()) { opts.add(ListChangesOption.PUSH_CERTIFICATES); } @@ -411,13 +436,14 @@ public class ChangeScreen extends Screen { void loadRevisionInfo() { RestApi call = ChangeApi.actions(changeId.get(), revision); call.background(); - call.get(new GerritCallback>() { - @Override - public void onSuccess(NativeMap actionMap) { - actionMap.copyKeysIntoChildren("id"); - renderRevisionInfo(changeInfo, actionMap); - } - }); + call.get( + new GerritCallback>() { + @Override + public void onSuccess(NativeMap actionMap) { + actionMap.copyKeysIntoChildren("id"); + renderRevisionInfo(changeInfo, actionMap); + } + }); } @Override @@ -450,10 +476,8 @@ public class ChangeScreen extends Screen { private void initReplyButton(ChangeInfo info, String revision) { if (!info.revision(revision).isEdit()) { reply.setTitle(Gerrit.info().change().replyLabel()); - reply.setHTML(new SafeHtmlBuilder() - .openDiv() - .append(Gerrit.info().change().replyLabel()) - .closeDiv()); + reply.setHTML( + new SafeHtmlBuilder().openDiv().append(Gerrit.info().change().replyLabel()).closeDiv()); if (hasDraftComments || lc.hasReplyComment()) { reply.setStyleName(style.highlight()); } @@ -462,7 +486,8 @@ public class ChangeScreen extends Screen { } private void gotoSibling(int offset) { - if (offset > 0 && changeInfo.currentRevision() != null + if (offset > 0 + && changeInfo.currentRevision() != null && changeInfo.currentRevision().equals(revision)) { return; } @@ -476,9 +501,9 @@ public class ChangeScreen extends Screen { for (int i = 0; i < revisions.length(); i++) { if (revision.equals(revisions.get(i).name())) { if (0 <= i + offset && i + offset < revisions.length()) { - Gerrit.display(PageLinks.toChange( - new PatchSet.Id(changeInfo.legacyId(), - revisions.get(i + offset)._number()))); + Gerrit.display( + PageLinks.toChange( + new PatchSet.Id(changeInfo.legacyId(), revisions.get(i + offset)._number()))); return; } return; @@ -488,17 +513,13 @@ public class ChangeScreen extends Screen { private void initIncludedInAction(ChangeInfo info) { if (info.status() == Status.MERGED) { - includedInAction = new IncludedInAction( - info.legacyId(), - style, headerLine, includedIn); + includedInAction = new IncludedInAction(info.legacyId(), style, headerLine, includedIn); includedIn.setVisible(true); } } private void initChangeAction(ChangeInfo info) { - NativeMap actions = info.hasActions() - ? info.actions() - : NativeMap.create(); + NativeMap actions = info.hasActions() ? info.actions() : NativeMap.create(); actions.copyKeysIntoChildren("id"); if (actions.containsKey("/")) { deleteChange.setVisible(true); @@ -514,11 +535,10 @@ public class ChangeScreen extends Screen { } } - private void initRevisionsAction(ChangeInfo info, String revision, - NativeMap actions) { + private void initRevisionsAction( + ChangeInfo info, String revision, NativeMap actions) { int currentPatchSet; - if (info.currentRevision() != null - && info.revisions().containsKey(info.currentRevision())) { + if (info.currentRevision() != null && info.revisions().containsKey(info.currentRevision())) { currentPatchSet = info.revision(info.currentRevision())._number(); } else { JsArray revList = info.revisions().values(); @@ -531,8 +551,7 @@ public class ChangeScreen extends Screen { String revisionId = info.revision(revision).id(); if (revisionId.equals("edit")) { currentlyViewedPatchSet = - Resources.M.editPatchSet(RevisionInfo.findEditParent(info.revisions() - .values())); + Resources.M.editPatchSet(RevisionInfo.findEditParent(info.revisions().values())); currentPatchSet = info.revisions().values().length() - 1; } else { currentlyViewedPatchSet = revisionId; @@ -540,12 +559,10 @@ public class ChangeScreen extends Screen { isPatchSetCurrent = false; } } - patchSetsText.setInnerText(Resources.M.patchSets( - currentlyViewedPatchSet, currentPatchSet)); + patchSetsText.setInnerText(Resources.M.patchSets(currentlyViewedPatchSet, currentPatchSet)); updatePatchSetsTextStyle(isPatchSetCurrent); - patchSetsAction = new PatchSetsAction( - info.legacyId(), revision, edit, - style, headerLine, patchSets); + patchSetsAction = + new PatchSetsAction(info.legacyId(), revision, edit, style, headerLine, patchSets); RevisionInfo revInfo = info.revision(revision); if (revInfo.draft()) { @@ -561,23 +578,23 @@ public class ChangeScreen extends Screen { } private void initDownloadAction(ChangeInfo info, String revision) { - downloadAction = - new DownloadAction(info, revision, style, headerLine, download); + downloadAction = new DownloadAction(info, revision, style, headerLine, download); } private void initProjectLinks(final ChangeInfo info) { - projectSettingsLink.setHref( - "#" + PageLinks.toProject(info.projectNameKey())); - projectSettings.addDomHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - if (Hyperlink.impl.handleAsClick((Event) event.getNativeEvent())) { - event.stopPropagation(); - event.preventDefault(); - Gerrit.display(PageLinks.toProject(info.projectNameKey())); - } - } - }, ClickEvent.getType()); + projectSettingsLink.setHref("#" + PageLinks.toProject(info.projectNameKey())); + projectSettings.addDomHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + if (Hyperlink.impl.handleAsClick((Event) event.getNativeEvent())) { + event.stopPropagation(); + event.preventDefault(); + Gerrit.display(PageLinks.toProject(info.projectNameKey())); + } + } + }, + ClickEvent.getType()); projectDashboard.setText(info.project()); projectDashboard.setTargetHistoryToken( PageLinks.toProjectDefaultDashboard(info.projectNameKey())); @@ -587,11 +604,7 @@ public class ChangeScreen extends Screen { branchLink.setText(info.branch()); branchLink.setTargetHistoryToken( PageLinks.toChangeQuery( - BranchLink.query( - info.projectNameKey(), - info.status(), - info.branch(), - null))); + BranchLink.query(info.projectNameKey(), info.status(), info.branch(), null))); } private void initEditMode(ChangeInfo info, String revision) { @@ -604,15 +617,12 @@ public class ChangeScreen extends Screen { deleteFile.setVisible(!editMode.isVisible()); renameFile.setVisible(!editMode.isVisible()); reviewMode.setVisible(!editMode.isVisible()); - addFileAction = new AddFileAction( - changeId, info.revision(revision), - style, addFile, files); - deleteFileAction = new DeleteFileAction( - changeId, info.revision(revision), - style, addFile); - renameFileAction = new RenameFileAction( - changeId, info.revision(revision), - style, addFile); + addFileAction = + new AddFileAction(changeId, info.revision(revision), style, addFile, files); + deleteFileAction = + new DeleteFileAction(changeId, info.revision(revision), style, addFile); + renameFileAction = + new RenameFileAction(changeId, info.revision(revision), style, addFile); } else { editMode.setVisible(false); addFile.setVisible(false); @@ -641,8 +651,7 @@ public class ChangeScreen extends Screen { if (edit == null) { return revision.equals(info.currentRevision()); } - return rev._number() == RevisionInfo.findEditParent( - info.revisions().values()); + return rev._number() == RevisionInfo.findEditParent(info.revisions().values()); } @UiHandler("publishEdit") @@ -664,15 +673,13 @@ public class ChangeScreen extends Screen { @UiHandler("publish") void onPublish(@SuppressWarnings("unused") ClickEvent e) { - DraftActions.publish(changeId, revision, publish, deleteRevision, - deleteChange); + DraftActions.publish(changeId, revision, publish, deleteRevision, deleteChange); } @UiHandler("deleteRevision") void onDeleteRevision(@SuppressWarnings("unused") ClickEvent e) { if (Window.confirm(Resources.C.deleteDraftRevision())) { - DraftActions.delete(changeId, revision, publish, deleteRevision, - deleteChange); + DraftActions.delete(changeId, revision, publish, deleteRevision, deleteChange); } } @@ -688,92 +695,102 @@ public class ChangeScreen extends Screen { super.registerKeys(); KeyCommandSet keysNavigation = new KeyCommandSet(Gerrit.C.sectionNavigation()); - keysNavigation.add(new KeyCommand(0, 'u', Util.C.upToChangeList()) { - @Override - public void onKeyPress(KeyPressEvent event) { - Gerrit.displayLastChangeList(); - } - }); - keysNavigation.add(new KeyCommand(0, 'R', Util.C.keyReloadChange()) { - @Override - public void onKeyPress(KeyPressEvent event) { - Gerrit.display(PageLinks.toChange(changeId)); - } - }); - keysNavigation.add(new KeyCommand(0, 'n', Util.C.keyNextPatchSet()) { - @Override - public void onKeyPress(KeyPressEvent event) { - gotoSibling(1); - } - }, new KeyCommand(0, 'p', Util.C.keyPreviousPatchSet()) { - @Override - public void onKeyPress(KeyPressEvent event) { - gotoSibling(-1); - } - }); + keysNavigation.add( + new KeyCommand(0, 'u', Util.C.upToChangeList()) { + @Override + public void onKeyPress(KeyPressEvent event) { + Gerrit.displayLastChangeList(); + } + }); + keysNavigation.add( + new KeyCommand(0, 'R', Util.C.keyReloadChange()) { + @Override + public void onKeyPress(KeyPressEvent event) { + Gerrit.display(PageLinks.toChange(changeId)); + } + }); + keysNavigation.add( + new KeyCommand(0, 'n', Util.C.keyNextPatchSet()) { + @Override + public void onKeyPress(KeyPressEvent event) { + gotoSibling(1); + } + }, + new KeyCommand(0, 'p', Util.C.keyPreviousPatchSet()) { + @Override + public void onKeyPress(KeyPressEvent event) { + gotoSibling(-1); + } + }); handlers.add(GlobalKey.add(this, keysNavigation)); KeyCommandSet keysAction = new KeyCommandSet(Gerrit.C.sectionActions()); - keysAction.add(new KeyCommand(0, 'a', Util.C.keyPublishComments()) { - @Override - public void onKeyPress(KeyPressEvent event) { - if (Gerrit.isSignedIn()) { - onReply(null); - } else { - Gerrit.doSignIn(getToken()); - } - } - }); - keysAction.add(new KeyCommand(0, 'x', Util.C.keyExpandAllMessages()) { - @Override - public void onKeyPress(KeyPressEvent event) { - onExpandAll(null); - } - }); - keysAction.add(new KeyCommand(0, 'z', Util.C.keyCollapseAllMessages()) { - @Override - public void onKeyPress(KeyPressEvent event) { - onCollapseAll(null); - } - }); - keysAction.add(new KeyCommand(0, 's', Util.C.changeTableStar()) { - @Override - public void onKeyPress(KeyPressEvent event) { - if (Gerrit.isSignedIn()) { - star.setValue(!star.getValue(), true); - } else { - Gerrit.doSignIn(getToken()); - } - } - }); - keysAction.add(new KeyCommand(0, 'c', Util.C.keyAddReviewers()) { - @Override - public void onKeyPress(KeyPressEvent event) { - if (Gerrit.isSignedIn()) { - reviewers.onOpenForm(); - } else { - Gerrit.doSignIn(getToken()); - } - } - }); - keysAction.add(new KeyCommand(0, 't', Util.C.keyEditTopic()) { - @Override - public void onKeyPress(KeyPressEvent event) { - if (Gerrit.isSignedIn()) { - // In Firefox this event is mistakenly called when F5 is pressed so - // differentiate F5 from 't' by checking the charCode(F5=0, t=116). - if (event.getNativeEvent().getCharCode() == 0) { - Window.Location.reload(); - return; + keysAction.add( + new KeyCommand(0, 'a', Util.C.keyPublishComments()) { + @Override + public void onKeyPress(KeyPressEvent event) { + if (Gerrit.isSignedIn()) { + onReply(null); + } else { + Gerrit.doSignIn(getToken()); + } } - if (topic.canEdit()) { - topic.onEdit(); + }); + keysAction.add( + new KeyCommand(0, 'x', Util.C.keyExpandAllMessages()) { + @Override + public void onKeyPress(KeyPressEvent event) { + onExpandAll(null); } - } else { - Gerrit.doSignIn(getToken()); - } - } - }); + }); + keysAction.add( + new KeyCommand(0, 'z', Util.C.keyCollapseAllMessages()) { + @Override + public void onKeyPress(KeyPressEvent event) { + onCollapseAll(null); + } + }); + keysAction.add( + new KeyCommand(0, 's', Util.C.changeTableStar()) { + @Override + public void onKeyPress(KeyPressEvent event) { + if (Gerrit.isSignedIn()) { + star.setValue(!star.getValue(), true); + } else { + Gerrit.doSignIn(getToken()); + } + } + }); + keysAction.add( + new KeyCommand(0, 'c', Util.C.keyAddReviewers()) { + @Override + public void onKeyPress(KeyPressEvent event) { + if (Gerrit.isSignedIn()) { + reviewers.onOpenForm(); + } else { + Gerrit.doSignIn(getToken()); + } + } + }); + keysAction.add( + new KeyCommand(0, 't', Util.C.keyEditTopic()) { + @Override + public void onKeyPress(KeyPressEvent event) { + if (Gerrit.isSignedIn()) { + // In Firefox this event is mistakenly called when F5 is pressed so + // differentiate F5 from 't' by checking the charCode(F5=0, t=116). + if (event.getNativeEvent().getCharCode() == 0) { + Window.Location.reload(); + return; + } + if (topic.canEdit()) { + topic.onEdit(); + } + } else { + Gerrit.doSignIn(getToken()); + } + } + }); handlers.add(GlobalKey.add(this, keysAction)); files.registerKeys(); } @@ -782,9 +799,7 @@ public class ChangeScreen extends Screen { public void onShowView() { super.onShowView(); commit.onShowView(); - related.setMaxHeight(commit.getElement() - .getParentElement() - .getOffsetHeight()); + related.setMaxHeight(commit.getElement().getParentElement().getOffsetHeight()); if (openReplyBox) { onReply(); @@ -982,35 +997,34 @@ public class ChangeScreen extends Screen { updateToken(info, base, rev); - RevisionInfo baseRev = - resolveRevisionOrPatchSetId(info, base.asString(), null); + RevisionInfo baseRev = resolveRevisionOrPatchSetId(info, base.asString(), null); CallbackGroup group = new CallbackGroup(); Timestamp lastReply = myLastReply(info); if (rev.isEdit()) { // Comments are filtered for the current revision. Use parent // patch set for edits, as edits themself can never have comments. - RevisionInfo p = RevisionInfo.findEditParentRevision( - info.revisions().values()); + RevisionInfo p = RevisionInfo.findEditParentRevision(info.revisions().values()); List>> comments = loadComments(p, group); loadFileList(base, baseRev, rev, lastReply, group, comments, null); } else { loadDiff(base, baseRev, rev, lastReply, group); } - group.addListener(new AsyncCallback() { - @Override - public void onSuccess(Void result) { - loadConfigInfo(info, rev); - } + group.addListener( + new AsyncCallback() { + @Override + public void onSuccess(Void result) { + loadConfigInfo(info, rev); + } - @Override - public void onFailure(Throwable caught) { - logger.log(Level.SEVERE, - "Loading file list and inline comments failed: " - + caught.getMessage()); - loadConfigInfo(info, rev); - } - }); + @Override + public void onFailure(Throwable caught) { + logger.log( + Level.SEVERE, + "Loading file list and inline comments failed: " + caught.getMessage()); + loadConfigInfo(info, rev); + } + }); group.done(); } @@ -1021,29 +1035,26 @@ public class ChangeScreen extends Screen { RevisionInfoCache.add(changeId, rev); ConfigInfoCache.add(info); - ConfigInfoCache.get(info.projectNameKey(), - new ScreenLoadCallback(this) { - @Override - protected void preDisplay(Entry result) { - loaded = true; - commentLinkProcessor = result.getCommentLinkProcessor(); - setTheme(result.getTheme()); - renderChangeInfo(info); - loadRevisionInfo(); - } - }); + ConfigInfoCache.get( + info.projectNameKey(), + new ScreenLoadCallback(this) { + @Override + protected void preDisplay(Entry result) { + loaded = true; + commentLinkProcessor = result.getCommentLinkProcessor(); + setTheme(result.getTheme()); + renderChangeInfo(info); + loadRevisionInfo(); + } + }); } private void updateToken(ChangeInfo info, DiffObject base, RevisionInfo rev) { - StringBuilder token = new StringBuilder("/c/") - .append(info._number()) - .append("/"); + StringBuilder token = new StringBuilder("/c/").append(info._number()).append("/"); if (base.asString() != null) { - token.append(base.asString()) - .append(".."); + token.append(base.asString()).append(".."); } - if (base.asString() != null - || !rev.name().equals(info.currentRevision())) { + if (base.asString() != null || !rev.name().equals(info.currentRevision())) { token.append(rev._number()); } setToken(token.toString()); @@ -1062,34 +1073,44 @@ public class ChangeScreen extends Screen { return null; } - private void loadDiff(DiffObject base, RevisionInfo baseRev, RevisionInfo rev, - Timestamp myLastReply, CallbackGroup group) { + private void loadDiff( + DiffObject base, + RevisionInfo baseRev, + RevisionInfo rev, + Timestamp myLastReply, + CallbackGroup group) { List>> comments = loadComments(rev, group); List>> drafts = loadDrafts(rev, group); loadFileList(base, baseRev, rev, myLastReply, group, comments, drafts); if (Gerrit.isSignedIn() && fileTableMode == FileTable.Mode.REVIEW) { ChangeApi.revision(changeId.get(), rev.name()) - .view("files") - .addParameterTrue("reviewed") - .get(group.add(new AsyncCallback() { - @Override - public void onSuccess(JsArrayString result) { - files.markReviewed(result); - } + .view("files") + .addParameterTrue("reviewed") + .get( + group.add( + new AsyncCallback() { + @Override + public void onSuccess(JsArrayString result) { + files.markReviewed(result); + } - @Override - public void onFailure(Throwable caught) { - } - })); + @Override + public void onFailure(Throwable caught) {} + })); } } - private void loadFileList(final DiffObject base, final RevisionInfo baseRev, - final RevisionInfo rev, final Timestamp myLastReply, CallbackGroup group, + private void loadFileList( + final DiffObject base, + final RevisionInfo baseRev, + final RevisionInfo rev, + final Timestamp myLastReply, + CallbackGroup group, final List>> comments, final List>> drafts) { - DiffApi.list(changeId.get(), + DiffApi.list( + changeId.get(), rev.name(), baseRev, group.add( @@ -1099,8 +1120,13 @@ public class ChangeScreen extends Screen { files.set( base, new PatchSet.Id(changeId, rev._number()), - style, reply, fileTableMode, edit != null); - files.setValue(m, myLastReply, + style, + reply, + fileTableMode, + edit != null); + files.setValue( + m, + myLastReply, comments != null ? comments.get(0) : null, drafts != null ? drafts.get(0) : null); } @@ -1118,20 +1144,21 @@ public class ChangeScreen extends Screen { // TODO(dborowitz): Could eliminate this call by adding an option to include // inline comments in the change detail. ChangeApi.comments(changeId.get()) - .get(group.add(new AsyncCallback>>() { - @Override - public void onSuccess(NativeMap> result) { - // Return value is used for populating the file table, so only count - // comments for the current revision. Still include all comments in - // the history table. - r.add(filterForRevision(result, rev._number())); - history.addComments(result); - } + .get( + group.add( + new AsyncCallback>>() { + @Override + public void onSuccess(NativeMap> result) { + // Return value is used for populating the file table, so only count + // comments for the current revision. Still include all comments in + // the history table. + r.add(filterForRevision(result, rev._number())); + history.addComments(result); + } - @Override - public void onFailure(Throwable caught) { - } - })); + @Override + public void onFailure(Throwable caught) {} + })); return r; } @@ -1152,24 +1179,24 @@ public class ChangeScreen extends Screen { return filtered; } - private List>> loadDrafts( - RevisionInfo rev, CallbackGroup group) { + private List>> loadDrafts(RevisionInfo rev, CallbackGroup group) { final List>> r = new ArrayList<>(1); if (Gerrit.isSignedIn()) { ChangeApi.revision(changeId.get(), rev.name()) - .view("drafts") - .get(group.add(new AsyncCallback>>() { - @Override - public void onSuccess(NativeMap> result) { - r.add(result); - } + .view("drafts") + .get( + group.add( + new AsyncCallback>>() { + @Override + public void onSuccess(NativeMap> result) { + r.add(result); + } - @Override - public void onFailure(Throwable caught) { - } - })); + @Override + public void onFailure(Throwable caught) {} + })); } else { - r.add(NativeMap.> create()); + r.add(NativeMap.>create()); } return r; } @@ -1179,34 +1206,32 @@ public class ChangeScreen extends Screen { return; } - ChangeApi.commitWithLinks(changeId.get(), rev.name(), - group.add(new AsyncCallback() { - @Override - public void onSuccess(CommitInfo info) { - rev.setCommit(info); - } + ChangeApi.commitWithLinks( + changeId.get(), + rev.name(), + group.add( + new AsyncCallback() { + @Override + public void onSuccess(CommitInfo info) { + rev.setCommit(info); + } - @Override - public void onFailure(Throwable caught) { - } - })); + @Override + public void onFailure(Throwable caught) {} + })); } - private void renderSubmitType(Change.Status status, boolean canSubmit, - SubmitType submitType) { + private void renderSubmitType(Change.Status status, boolean canSubmit, SubmitType submitType) { if (canSubmit && status == Change.Status.NEW) { - statusText.setInnerText(changeInfo.mergeable() - ? Util.C.readyToSubmit() - : Util.C.mergeConflict()); + statusText.setInnerText( + changeInfo.mergeable() ? Util.C.readyToSubmit() : Util.C.mergeConflict()); } setVisible(notMergeable, !changeInfo.mergeable()); - submitActionText.setInnerText( - com.google.gerrit.client.admin.Util.toLongString(submitType)); + submitActionText.setInnerText(com.google.gerrit.client.admin.Util.toLongString(submitType)); } private RevisionInfo resolveRevisionToDisplay(ChangeInfo info) { - RevisionInfo rev = resolveRevisionOrPatchSetId(info, revision, - info.currentRevision()); + RevisionInfo rev = resolveRevisionOrPatchSetId(info, revision, info.currentRevision()); if (rev != null) { revision = rev.name(); return rev; @@ -1222,25 +1247,22 @@ public class ChangeScreen extends Screen { revision = rev.name(); return rev; } - new ErrorDialog( - Resources.M.changeWithNoRevisions(info.legacyId().get())).center(); + new ErrorDialog(Resources.M.changeWithNoRevisions(info.legacyId().get())).center(); throw new IllegalStateException("no revision, cannot proceed"); } /** - * Resolve a revision or patch set id string to RevisionInfo. - * When this view is created from the changes table, revision - * is passed as a real revision. - * When this view is created from side by side (by closing it with 'u') - * patch set id is passed. + * Resolve a revision or patch set id string to RevisionInfo. When this view is created from the + * changes table, revision is passed as a real revision. When this view is created from side by + * side (by closing it with 'u') patch set id is passed. * * @param info change info * @param revOrId revision or patch set id * @param defaultValue value returned when revOrId is null * @return resolved revision or default value */ - private RevisionInfo resolveRevisionOrPatchSetId(ChangeInfo info, - String revOrId, String defaultValue) { + private RevisionInfo resolveRevisionOrPatchSetId( + ChangeInfo info, String revOrId, String defaultValue) { int parentNum; if (revOrId == null) { revOrId = defaultValue; @@ -1265,9 +1287,9 @@ public class ChangeScreen extends Screen { private boolean isSubmittable(ChangeInfo info) { boolean canSubmit = - info.status().isOpen() && - revision.equals(info.currentRevision()) && - !info.revision(revision).draft(); + info.status().isOpen() + && revision.equals(info.currentRevision()) + && !info.revision(revision).draft(); if (canSubmit && info.status() == Change.Status.NEW) { for (String name : info.labels()) { LabelInfo label = info.label(name); @@ -1287,7 +1309,7 @@ public class ChangeScreen extends Screen { case OK: default: break; - } + } } } return canSubmit; @@ -1349,13 +1371,12 @@ public class ChangeScreen extends Screen { // Properly render revision actions initially while waiting for // the callback to populate them correctly. - NativeMap emptyMap = NativeMap. create(); + NativeMap emptyMap = NativeMap.create(); initRevisionsAction(info, revision, emptyMap); quickApprove.setVisible(false); actions.reloadRevisionActions(emptyMap); - boolean current = revision.equals(info.currentRevision()) - && !revisionInfo.isEdit(); + boolean current = revision.equals(info.currentRevision()) && !revisionInfo.isEdit(); if (revisionInfo.isEdit()) { statusText.setInnerText(Util.C.changeEdit()); @@ -1368,8 +1389,9 @@ public class ChangeScreen extends Screen { } if (Gerrit.isSignedIn()) { - replyAction = new ReplyAction(info, revision, hasDraftComments, - style, commentLinkProcessor, reply, quickApprove); + replyAction = + new ReplyAction( + info, revision, hasDraftComments, style, commentLinkProcessor, reply, quickApprove); } history.set(commentLinkProcessor, replyAction, changeId, info); @@ -1381,11 +1403,10 @@ public class ChangeScreen extends Screen { } } - private void renderRevisionInfo(ChangeInfo info, - NativeMap actionMap) { + private void renderRevisionInfo(ChangeInfo info, NativeMap actionMap) { initRevisionsAction(info, revision, actionMap); - commit.setParentNotCurrent(actionMap.containsKey("rebase") - && actionMap.get("rebase").enabled()); + commit.setParentNotCurrent( + actionMap.containsKey("rebase") && actionMap.get("rebase").enabled()); actions.reloadRevisionActions(actionMap); } @@ -1397,18 +1418,19 @@ public class ChangeScreen extends Screen { } ownerLink.setText(name); ownerLink.setTitle(email(info.owner(), name)); - ownerLink.setTargetHistoryToken(PageLinks.toAccountQuery( - info.owner().name() != null - ? info.owner().name() - : info.owner().email() != null - ? info.owner().email() - : String.valueOf(info.owner()._accountId()), Change.Status.NEW)); + ownerLink.setTargetHistoryToken( + PageLinks.toAccountQuery( + info.owner().name() != null + ? info.owner().name() + : info.owner().email() != null + ? info.owner().email() + : String.valueOf(info.owner()._accountId()), + Change.Status.NEW)); } private void renderUploader(ChangeInfo changeInfo, RevisionInfo revInfo) { AccountInfo uploader = revInfo.uploader(); - boolean isOwner = uploader == null - || uploader._accountId() == changeInfo.owner()._accountId(); + boolean isOwner = uploader == null || uploader._accountId() == changeInfo.owner()._accountId(); renderPushCertificate(revInfo, isOwner ? ownerPanel : uploaderPanel); if (isOwner) { uploaderRow.getStyle().setDisplay(Display.NONE); @@ -1431,8 +1453,7 @@ public class ChangeScreen extends Screen { Image status = new Image(); panel.add(status); status.setStyleName(style.pushCertStatus()); - if (!revInfo.hasPushCertificate() - || revInfo.pushCertificate().key() == null) { + if (!revInfo.hasPushCertificate() || revInfo.pushCertificate().key() == null) { status.setResource(Gerrit.RESOURCES.question()); status.setTitle(Util.C.pushCertMissing()); return; @@ -1456,9 +1477,7 @@ public class ChangeScreen extends Screen { } private static String name(AccountInfo info) { - return info.name() != null - ? info.name() - : Gerrit.info().user().anonymousCowardName(); + return info.name() != null ? info.name() : Gerrit.info().user().anonymousCowardName(); } private static String email(AccountInfo info, String name) { @@ -1466,9 +1485,7 @@ public class ChangeScreen extends Screen { } private static String problems(String msg, PushCertificateInfo info) { - if (info.key() == null - || !info.key().hasProblems() - || info.key().problems().length() == 0) { + if (info.key() == null || !info.key().hasProblems() || info.key().problems().length() == 0) { return msg; } @@ -1497,12 +1514,12 @@ public class ChangeScreen extends Screen { int selectedIdx = list.length(); for (int i = list.length() - 1; i >= 0; i--) { RevisionInfo r = list.get(i); - diffBase.addItem( - r.id() + ": " + r.name().substring(0, 6), - r.id()); + diffBase.addItem(r.id() + ": " + r.name().substring(0, 6), r.id()); if (r.name().equals(revision)) { - SelectElement.as(diffBase.getElement()).getOptions() - .getItem(diffBase.getItemCount() - 1).setDisabled(true); + SelectElement.as(diffBase.getElement()) + .getOptions() + .getItem(diffBase.getItemCount() - 1) + .setDisabled(true); } if (base.isPatchSet() && base.asPatchSetId().get() == r._number()) { selectedIdx = diffBase.getItemCount() - 1; @@ -1515,8 +1532,7 @@ public class ChangeScreen extends Screen { diffBase.addItem(Util.C.autoMerge(), DiffObject.AUTO_MERGE); for (int i = 0; i < parents.length(); i++) { int parentNum = i + 1; - diffBase.addItem(Util.M.diffBaseParent(parentNum), - String.valueOf(-parentNum)); + diffBase.addItem(Util.M.diffBaseParent(parentNum), String.valueOf(-parentNum)); } if (base.isParent()) { @@ -1545,21 +1561,20 @@ public class ChangeScreen extends Screen { } if (updateAvailable == null) { - updateAvailable = new UpdateAvailableBar() { - @Override - void onShow() { - Gerrit.display(PageLinks.toChange(changeId)); - } + updateAvailable = + new UpdateAvailableBar() { + @Override + void onShow() { + Gerrit.display(PageLinks.toChange(changeId)); + } - @Override - void onIgnore(Timestamp newTime) { - lastDisplayedUpdate = newTime; - } - }; + @Override + void onIgnore(Timestamp newTime) { + lastDisplayedUpdate = newTime; + } + }; } - updateAvailable.set( - Natives.asList(nm).subList(om.length(), nm.length()), - newInfo.updated()); + updateAvailable.set(Natives.asList(nm).subList(om.length(), nm.length()), newInfo.updated()); if (!updateAvailable.isAttached()) { add(updateAvailable); } @@ -1579,9 +1594,8 @@ public class ChangeScreen extends Screen { /** * @param parentToken - * @return 1-based parentNum if parentToken is a String which can be parsed as - * a negative integer i.e. "-1", "-2", etc. If parentToken cannot be - * parsed as a negative integer, return zero. + * @return 1-based parentNum if parentToken is a String which can be parsed as a negative integer + * i.e. "-1", "-2", etc. If parentToken cannot be parsed as a negative integer, return zero. */ private static int toParentNum(String parentToken) { try { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/CherryPickAction.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/CherryPickAction.java index 3b72581893..5fb0e7b48d 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/CherryPickAction.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/CherryPickAction.java @@ -27,19 +27,20 @@ import com.google.gwt.event.logical.shared.CloseEvent; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.PopupPanel; - class CherryPickAction { - static void call(final Button b, final ChangeInfo info, final String revision, - String project, final String commitMessage) { + static void call( + final Button b, + final ChangeInfo info, + final String revision, + String project, + final String commitMessage) { // TODO Replace CherryPickDialog with a nicer looking display. b.setEnabled(false); new CherryPickDialog(new Project.NameKey(project)) { { sendButton.setText(Util.C.buttonCherryPickChangeSend()); if (info.status() == Change.Status.MERGED) { - message.setText(Util.M.cherryPickedChangeDefaultMessage( - commitMessage.trim(), - revision)); + message.setText(Util.M.cherryPickedChangeDefaultMessage(commitMessage.trim(), revision)); } else { message.setText(commitMessage.trim()); } @@ -47,7 +48,9 @@ class CherryPickAction { @Override public void onSend() { - ChangeApi.cherrypick(info.legacyId().get(), revision, + ChangeApi.cherrypick( + info.legacyId().get(), + revision, getDestinationBranch(), getMessageText(), new GerritCallback() { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/CommitBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/CommitBox.java index d7ae1afc4d..011257993e 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/CommitBox.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/CommitBox.java @@ -50,12 +50,16 @@ import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder; class CommitBox extends Composite { interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); interface Style extends CssResource { String collapsed(); + String expanded(); + String clippy(); + String parentWebLink(); } @@ -100,9 +104,7 @@ class CommitBox extends Composite { expanded = !expanded; } - void set(CommentLinkProcessor commentLinkProcessor, - ChangeInfo change, - String revision) { + void set(CommentLinkProcessor commentLinkProcessor, ChangeInfo change, String revision) { RevisionInfo revInfo = change.revision(revision); CommitInfo commit = revInfo.commit(); @@ -110,12 +112,10 @@ class CommitBox extends Composite { idText.setText("Change-Id: " + change.changeId()); idText.setPreviewText(change.changeId()); - formatLink(commit.author(), authorPanel, authorNameEmail, authorDate, - change); - formatLink(commit.committer(), committerPanel, committerNameEmail, - committerDate, change); - text.setHTML(commentLinkProcessor.apply( - new SafeHtmlBuilder().append(commit.message()).linkify())); + formatLink(commit.author(), authorPanel, authorNameEmail, authorDate, change); + formatLink(commit.committer(), committerPanel, committerNameEmail, committerDate, change); + text.setHTML( + commentLinkProcessor.apply(new SafeHtmlBuilder().append(commit.message()).linkify())); setWebLinks(webLinkPanel, revInfo.commit()); if (revInfo.commit().parents().length() > 1) { @@ -175,8 +175,8 @@ class CommitBox extends Composite { return copyLabel; } - private static void formatLink(GitPerson person, FlowPanel p, - InlineHyperlink name, Element date, ChangeInfo change) { + private static void formatLink( + GitPerson person, FlowPanel p, InlineHyperlink name, Element date, ChangeInfo change) { // only try to fetch the avatar image for author and committer if an avatar // plugin is installed, if the change owner has no avatar info assume that // no avatar plugin is installed @@ -185,15 +185,13 @@ class CommitBox extends Composite { if (sameEmail(change.owner(), person)) { avatar = new AvatarImage(change.owner()); } else { - avatar = new AvatarImage( - AccountInfo.create(0, person.name(), person.email(), null)); + avatar = new AvatarImage(AccountInfo.create(0, person.name(), person.email(), null)); } p.insert(avatar, 0); } name.setText(renderName(person)); - name.setTargetHistoryToken(PageLinks - .toAccountQuery(owner(person), change.status())); + name.setTargetHistoryToken(PageLinks.toAccountQuery(owner(person), change.status())); date.setInnerText(FormatUtil.mediumFormat(person.date())); } @@ -211,10 +209,11 @@ class CommitBox extends Composite { } } - private static boolean sameEmail( - @Nullable AccountInfo p1, @Nullable GitPerson p2) { - return p1 != null && p2 != null && - p1.email() != null && p2.email() != null && - p1.email().equals(p2.email()); + private static boolean sameEmail(@Nullable AccountInfo p1, @Nullable GitPerson p2) { + return p1 != null + && p2 != null + && p1.email() != null + && p2.email() != null + && p1.email().equals(p2.email()); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DeleteFileAction.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DeleteFileAction.java index 3a7977a7f0..4dcdc6e664 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DeleteFileAction.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DeleteFileAction.java @@ -31,8 +31,8 @@ class DeleteFileAction { private DeleteFileBox deleteBox; private PopupPanel popup; - DeleteFileAction(Change.Id changeId, RevisionInfo revision, - ChangeScreen.Style style, Widget deleteButton) { + DeleteFileAction( + Change.Id changeId, RevisionInfo revision, ChangeScreen.Style style, Widget deleteButton) { this.changeId = changeId; this.revision = revision; this.style = style; @@ -53,14 +53,15 @@ class DeleteFileAction { final PopupPanel p = new PopupPanel(true); p.setStyleName(style.replyBox()); p.addAutoHidePartner(deleteButton.getElement()); - p.addCloseHandler(new CloseHandler() { - @Override - public void onClose(CloseEvent event) { - if (popup == p) { - popup = null; - } - } - }); + p.addCloseHandler( + new CloseHandler() { + @Override + public void onClose(CloseEvent event) { + if (popup == p) { + popup = null; + } + } + }); p.add(deleteBox); p.showRelativeTo(deleteButton); GlobalKey.dialog(p); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DeleteFileBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DeleteFileBox.java index 3d889d0461..3edfca2a23 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DeleteFileBox.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DeleteFileBox.java @@ -39,6 +39,7 @@ import com.google.gwt.user.client.ui.Widget; class DeleteFileBox extends Composite { interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); private final Change.Id changeId; @@ -53,18 +54,20 @@ class DeleteFileBox extends Composite { this.changeId = changeId; path = new RemoteSuggestBox(new PathSuggestOracle(changeId, revision)); - path.addSelectionHandler(new SelectionHandler() { - @Override - public void onSelection(SelectionEvent event) { - delete(event.getSelectedItem()); - } - }); - path.addCloseHandler(new CloseHandler() { - @Override - public void onClose(CloseEvent event) { - hide(); - } - }); + path.addSelectionHandler( + new SelectionHandler() { + @Override + public void onSelection(SelectionEvent event) { + delete(event.getSelectedItem()); + } + }); + path.addCloseHandler( + new CloseHandler() { + @Override + public void onClose(CloseEvent event) { + hide(); + } + }); initWidget(uiBinder.createAndBindUi(this)); } @@ -84,7 +87,9 @@ class DeleteFileBox extends Composite { private void delete(String path) { hide(); - ChangeEditApi.delete(changeId.get(), path, + ChangeEditApi.delete( + changeId.get(), + path, new AsyncCallback() { @Override public void onSuccess(VoidResult result) { @@ -92,8 +97,7 @@ class DeleteFileBox extends Composite { } @Override - public void onFailure(Throwable caught) { - } + public void onFailure(Throwable caught) {} }); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DownloadAction.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DownloadAction.java index 9698aefea5..8e4ea84601 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DownloadAction.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DownloadAction.java @@ -29,9 +29,9 @@ class DownloadAction extends RightSidePopdownAction { UIObject relativeTo, Widget downloadButton) { super(style, relativeTo, downloadButton); - this.downloadBox = new DownloadBox(info, revision, - new PatchSet.Id(info.legacyId(), - info.revision(revision)._number())); + this.downloadBox = + new DownloadBox( + info, revision, new PatchSet.Id(info.legacyId(), info.revision(revision)._number())); } @Override diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DownloadBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DownloadBox.java index e8707f42c6..6c2964d97e 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DownloadBox.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DownloadBox.java @@ -38,7 +38,6 @@ import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import com.google.gwtexpui.clippy.client.CopyableLabel; - import java.util.ArrayList; import java.util.EnumSet; import java.util.Iterator; @@ -58,15 +57,16 @@ class DownloadBox extends VerticalPanel { this.psId = psId; this.commandTable = new FlexTable(); this.scheme = new ListBox(); - this.scheme.addChangeHandler(new ChangeHandler() { - @Override - public void onChange(ChangeEvent event) { - renderCommands(); - if (Gerrit.isSignedIn()) { - saveScheme(); - } - } - }); + this.scheme.addChangeHandler( + new ChangeHandler() { + @Override + public void onChange(ChangeEvent event) { + renderCommands(); + if (Gerrit.isSignedIn()) { + saveScheme(); + } + } + }); setStyleName(Gerrit.RESOURCES.css().downloadBox()); commandTable.setStyleName(Gerrit.RESOURCES.css().downloadBoxTable()); @@ -78,36 +78,38 @@ class DownloadBox extends VerticalPanel { protected void onLoad() { if (fetch == null) { if (psId.get() == 0) { - ChangeApi.editWithCommands(change.legacyId().get()).get( - new AsyncCallback() { - @Override - public void onSuccess(EditInfo result) { - fetch = result.fetch(); - renderScheme(); - } + ChangeApi.editWithCommands(change.legacyId().get()) + .get( + new AsyncCallback() { + @Override + public void onSuccess(EditInfo result) { + fetch = result.fetch(); + renderScheme(); + } - @Override - public void onFailure(Throwable caught) { - } - }); + @Override + public void onFailure(Throwable caught) {} + }); } else { RestApi call = ChangeApi.detail(change.legacyId().get()); - ChangeList.addOptions(call, EnumSet.of( - revision.equals(change.currentRevision()) - ? ListChangesOption.CURRENT_REVISION - : ListChangesOption.ALL_REVISIONS, - ListChangesOption.DOWNLOAD_COMMANDS)); - call.get(new AsyncCallback() { - @Override - public void onSuccess(ChangeInfo result) { - fetch = result.revision(revision).fetch(); - renderScheme(); - } + ChangeList.addOptions( + call, + EnumSet.of( + revision.equals(change.currentRevision()) + ? ListChangesOption.CURRENT_REVISION + : ListChangesOption.ALL_REVISIONS, + ListChangesOption.DOWNLOAD_COMMANDS)); + call.get( + new AsyncCallback() { + @Override + public void onSuccess(ChangeInfo result) { + fetch = result.revision(revision).fetch(); + renderScheme(); + } - @Override - public void onFailure(Throwable caught) { - } - }); + @Override + public void onFailure(Throwable caught) {} + }); } } } @@ -116,11 +118,9 @@ class DownloadBox extends VerticalPanel { commandTable.removeAllRows(); if (scheme.getItemCount() > 0) { - FetchInfo fetchInfo = - fetch.get(scheme.getValue(scheme.getSelectedIndex())); + FetchInfo fetchInfo = fetch.get(scheme.getValue(scheme.getSelectedIndex())); for (String commandName : fetchInfo.commands().sortedKeys()) { - CopyableLabel copyLabel = - new CopyableLabel(fetchInfo.command(commandName)); + CopyableLabel copyLabel = new CopyableLabel(fetchInfo.command(commandName)); copyLabel.setStyleName(Gerrit.RESOURCES.css().downloadBoxCopyLabel()); insertCommand(commandName, copyLabel); } @@ -135,22 +135,24 @@ class DownloadBox extends VerticalPanel { private void insertPatch() { String id = revision.substring(0, 7); Anchor patchBase64 = new Anchor(id + ".diff.base64"); - patchBase64.setHref(new RestApi("/changes/") - .id(psId.getParentKey().get()) - .view("revisions") - .id(revision) - .view("patch") - .addParameterTrue("download") - .url()); + patchBase64.setHref( + new RestApi("/changes/") + .id(psId.getParentKey().get()) + .view("revisions") + .id(revision) + .view("patch") + .addParameterTrue("download") + .url()); Anchor patchZip = new Anchor(id + ".diff.zip"); - patchZip.setHref(new RestApi("/changes/") - .id(psId.getParentKey().get()) - .view("revisions") - .id(revision) - .view("patch") - .addParameterTrue("zip") - .url()); + patchZip.setHref( + new RestApi("/changes/") + .id(psId.getParentKey().get()) + .view("revisions") + .id(revision) + .view("patch") + .addParameterTrue("zip") + .url()); HorizontalPanel p = new HorizontalPanel(); p.add(patchBase64); @@ -170,13 +172,14 @@ class DownloadBox extends VerticalPanel { List anchors = new ArrayList<>(activated.size()); for (String f : activated) { Anchor archive = new Anchor(f); - archive.setHref(new RestApi("/changes/") - .id(psId.getParentKey().get()) - .view("revisions") - .id(revision) - .view("archive") - .addParameter("format", f) - .url()); + archive.setHref( + new RestApi("/changes/") + .id(psId.getParentKey().get()) + .view("revisions") + .id(revision) + .view("archive") + .addParameter("format", f) + .url()); anchors.add(archive); } @@ -197,8 +200,9 @@ class DownloadBox extends VerticalPanel { private void insertCommand(String commandName, Widget w) { int row = commandTable.getRowCount(); commandTable.insertRow(row); - commandTable.getCellFormatter().addStyleName(row, 0, - Gerrit.RESOURCES.css().downloadBoxTableCommandColumn()); + commandTable + .getCellFormatter() + .addStyleName(row, 0, Gerrit.RESOURCES.css().downloadBoxTableCommandColumn()); if (commandName != null) { commandTable.setText(row, 0, commandName); } @@ -241,16 +245,17 @@ class DownloadBox extends VerticalPanel { prefs.downloadScheme(schemeStr); GeneralPreferences in = GeneralPreferences.create(); in.downloadScheme(schemeStr); - AccountApi.self().view("preferences") - .put(in, new AsyncCallback() { - @Override - public void onSuccess(JavaScriptObject result) { - } + AccountApi.self() + .view("preferences") + .put( + in, + new AsyncCallback() { + @Override + public void onSuccess(JavaScriptObject result) {} - @Override - public void onFailure(Throwable caught) { - } - }); + @Override + public void onFailure(Throwable caught) {} + }); } } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DraftActions.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DraftActions.java index 67875768ff..e8c14291da 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DraftActions.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DraftActions.java @@ -59,8 +59,7 @@ public class DraftActions { }; } - private static AsyncCallback mine( - final Button... draftButtons) { + private static AsyncCallback mine(final Button... draftButtons) { setEnabled(false, draftButtons); return new GerritCallback() { @Override diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/FileComments.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/FileComments.java index 9afcd4fcd4..0e30a8c216 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/FileComments.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/FileComments.java @@ -25,20 +25,18 @@ import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HTMLPanel; - import java.util.List; class FileComments extends Composite { interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); @UiField InlineHyperlink path; @UiField FlowPanel comments; - FileComments(CommentLinkProcessor clp, - PatchSet.Id defaultPs, - String title, - List list) { + FileComments( + CommentLinkProcessor clp, PatchSet.Id defaultPs, String title, List list) { initWidget(uiBinder.createAndBindUi(this)); path.setTargetHistoryToken(url(defaultPs, list.get(0))); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/FileTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/FileTable.java index a95270b95c..65e3dc0aab 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/FileTable.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/FileTable.java @@ -67,12 +67,10 @@ import com.google.gwt.user.client.ui.impl.HyperlinkImpl; import com.google.gwtexpui.globalkey.client.KeyCommand; import com.google.gwtexpui.progress.client.ProgressBar; import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder; - import java.sql.Timestamp; public class FileTable extends FlowPanel { - private static final FileTableResources R = GWT - .create(FileTableResources.class); + private static final FileTableResources R = GWT.create(FileTableResources.class); interface FileTableResources extends ClientBundle { @Source("file_table.css") @@ -81,21 +79,37 @@ public class FileTable extends FlowPanel { interface FileTableCss extends CssResource { String table(); + String nohover(); + String pointer(); + String reviewed(); + String status(); + String pathColumn(); + String commonPrefix(); + String renameCopySource(); + String draftColumn(); + String newColumn(); + String commentColumn(); + String deltaColumn1(); + String deltaColumn2(); + String inserted(); + String deleted(); + String restoreDelete(); + String error(); } @@ -160,7 +174,7 @@ public class FileTable extends FlowPanel { } private static boolean onOpen(NativeEvent e, int idx) { - if (link.handleAsClick(e. cast())) { + if (link.handleAsClick(e.cast())) { MyTable t = getMyTable(e); if (t != null) { t.onOpenRow(1 + idx); @@ -200,8 +214,13 @@ public class FileTable extends FlowPanel { R.css().ensureInjected(); } - public void set(DiffObject base, PatchSet.Id curr, ChangeScreen.Style style, - Widget replyButton, Mode mode, boolean editExists) { + public void set( + DiffObject base, + PatchSet.Id curr, + ChangeScreen.Style style, + Widget replyButton, + Mode mode, + boolean editExists) { this.base = base; this.curr = curr; this.style = style; @@ -210,15 +229,15 @@ public class FileTable extends FlowPanel { this.editExists = editExists; } - void setValue(NativeMap fileMap, + void setValue( + NativeMap fileMap, Timestamp myLastReply, @Nullable NativeMap> comments, @Nullable NativeMap> drafts) { JsArray list = fileMap.values(); FileInfo.sortFileInfoByPath(list); - DisplayCommand cmd = new DisplayCommand(fileMap, list, - myLastReply, comments, drafts); + DisplayCommand cmd = new DisplayCommand(fileMap, list, myLastReply, comments, drafts); if (cmd.execute()) { cmd.showProgressBar(); Scheduler.get().scheduleIncremental(cmd); @@ -276,8 +295,7 @@ public class FileTable extends FlowPanel { } private boolean canOpen(String path) { - return mode != Mode.EDIT || !Patch.isMagic(path) - || Patch.COMMIT_MSG.equals(path); + return mode != Mode.EDIT || !Patch.isMagic(path) || Patch.COMMIT_MSG.equals(path); } private void setTable(MyTable table) { @@ -300,8 +318,8 @@ public class FileTable extends FlowPanel { private String url(FileInfo info) { return info.binary() - ? Dispatcher.toUnified(base, curr, info.path()) - : mode == Mode.REVIEW + ? Dispatcher.toUnified(base, curr, info.path()) + : mode == Mode.REVIEW ? Dispatcher.toPatch(base, curr, info.path()) : Dispatcher.toEditScreen(curr, info.path()); } @@ -319,61 +337,59 @@ public class FileTable extends FlowPanel { new PrevKeyCommand(0, 'k', Util.C.patchTablePrev()), new NextKeyCommand(0, 'j', Util.C.patchTableNext())); keysNavigation.add(new OpenKeyCommand(0, 'o', Util.C.patchTableOpenDiff())); - keysNavigation.add(new OpenKeyCommand(0, KeyCodes.KEY_ENTER, - Util.C.patchTableOpenDiff())); + keysNavigation.add(new OpenKeyCommand(0, KeyCodes.KEY_ENTER, Util.C.patchTableOpenDiff())); keysNavigation.add( new OpenFileCommand(list.length() - 1, 0, '[', Resources.C.openLastFile()), new OpenFileCommand(0, 0, ']', Resources.C.openCommitMessage())); - keysAction.add(new KeyCommand(0, 'r', PatchUtil.C.toggleReviewed()) { - @Override - public void onKeyPress(KeyPressEvent event) { - int row = getCurrentRow(); - if (1 <= row && row <= MyTable.this.list.length()) { - FileInfo info = MyTable.this.list.get(row - 1); - InputElement b = getReviewed(info); - boolean c = !b.isChecked(); - setReviewed(info, c); - b.setChecked(c); - } - } - }); + keysAction.add( + new KeyCommand(0, 'r', PatchUtil.C.toggleReviewed()) { + @Override + public void onKeyPress(KeyPressEvent event) { + int row = getCurrentRow(); + if (1 <= row && row <= MyTable.this.list.length()) { + FileInfo info = MyTable.this.list.get(row - 1); + InputElement b = getReviewed(info); + boolean c = !b.isChecked(); + setReviewed(info, c); + b.setChecked(c); + } + } + }); - setSavePointerId( - (!base.isBase() ? base.asString() + ".." : "") - + curr.toString()); + setSavePointerId((!base.isBase() ? base.asString() + ".." : "") + curr.toString()); } void onDelete(int idx) { String path = list.get(idx).path(); - ChangeEditApi.delete(curr.getParentKey().get(), path, + ChangeEditApi.delete( + curr.getParentKey().get(), + path, new AsyncCallback() { @Override public void onSuccess(VoidResult result) { - Gerrit.display(PageLinks.toChangeInEditMode( - curr.getParentKey())); + Gerrit.display(PageLinks.toChangeInEditMode(curr.getParentKey())); } @Override - public void onFailure(Throwable caught) { - } + public void onFailure(Throwable caught) {} }); } void onRestore(int idx) { String path = list.get(idx).path(); - ChangeEditApi.restore(curr.getParentKey().get(), path, + ChangeEditApi.restore( + curr.getParentKey().get(), + path, new AsyncCallback() { @Override public void onSuccess(VoidResult result) { - Gerrit.display(PageLinks.toChangeInEditMode( - curr.getParentKey())); + Gerrit.display(PageLinks.toChangeInEditMode(curr.getParentKey())); } @Override - public void onFailure(Throwable caught) { - } + public void onFailure(Throwable caught) {} }); } @@ -382,10 +398,7 @@ public class FileTable extends FlowPanel { } private void setReviewed(FileInfo info, boolean r) { - RestApi api = ChangeApi.revision(curr) - .view("files") - .id(info.path()) - .view("reviewed"); + RestApi api = ChangeApi.revision(curr).view("files").id(info.path()).view("reviewed"); if (r) { api.put(CallbackGroup.emptyCallback()); } else { @@ -494,7 +507,8 @@ public class FileTable extends FlowPanel { private long bytesInserted; private long bytesDeleted; - private DisplayCommand(NativeMap map, + private DisplayCommand( + NativeMap map, JsArray list, Timestamp myLastReply, @Nullable NativeMap> comments, @@ -505,8 +519,7 @@ public class FileTable extends FlowPanel { this.comments = comments; this.drafts = drafts; this.hasUser = Gerrit.isSignedIn(); - this.showChangeSizeBars = - Gerrit.getUserPreferences().sizeBarInChangeTable(); + this.showChangeSizeBars = Gerrit.getUserPreferences().sizeBarInChangeTable(); myTable.addStyleName(R.css().table()); } @@ -600,14 +613,8 @@ public class FileTable extends FlowPanel { } sb.openTh().setStyleName(R.css().status()).closeTh(); sb.openTh().append(Util.C.patchTableColumnName()).closeTh(); - sb.openTh() - .setAttribute("colspan", 3) - .append(Util.C.patchTableColumnComments()) - .closeTh(); - sb.openTh() - .setAttribute("colspan", 2) - .append(Util.C.patchTableColumnSize()) - .closeTh(); + sb.openTh().setAttribute("colspan", 3).append(Util.C.patchTableColumnComments()).closeTh(); + sb.openTh().setAttribute("colspan", 2).append(Util.C.patchTableColumnSize()).closeTh(); sb.closeTr(); } @@ -631,10 +638,10 @@ public class FileTable extends FlowPanel { sb.openTd().setStyleName(R.css().reviewed()); if (hasUser) { sb.openElement("input") - .setAttribute("title", Resources.C.reviewedFileTitle()) - .setAttribute("type", "checkbox") - .setAttribute("onclick", REVIEWED + "(event," + info._row() + ")") - .closeSelf(); + .setAttribute("title", Resources.C.reviewedFileTitle()) + .setAttribute("type", "checkbox") + .setAttribute("onclick", REVIEWED + "(event," + info._row() + ")") + .closeSelf(); } sb.closeTd(); } @@ -645,19 +652,17 @@ public class FileTable extends FlowPanel { if (!Patch.isMagic(info.path())) { boolean editable = isEditable(info); sb.openDiv() - .openElement("button") - .setAttribute("title", Resources.C.restoreFileInline()) - .setAttribute("onclick", RESTORE + "(event," + info._row() + ")") - .append(new ImageResourceRenderer().render( - Gerrit.RESOURCES.editUndo())) - .closeElement("button"); + .openElement("button") + .setAttribute("title", Resources.C.restoreFileInline()) + .setAttribute("onclick", RESTORE + "(event," + info._row() + ")") + .append(new ImageResourceRenderer().render(Gerrit.RESOURCES.editUndo())) + .closeElement("button"); if (editable) { sb.openElement("button") - .setAttribute("title", Resources.C.removeFileInline()) - .setAttribute("onclick", DELETE + "(event," + info._row() + ")") - .append(new ImageResourceRenderer().render( - Gerrit.RESOURCES.redNot())) - .closeElement("button"); + .setAttribute("title", Resources.C.removeFileInline()) + .setAttribute("onclick", DELETE + "(event," + info._row() + ")") + .append(new ImageResourceRenderer().render(Gerrit.RESOURCES.redNot())) + .closeElement("button"); } sb.closeDiv(); } @@ -667,8 +672,7 @@ public class FileTable extends FlowPanel { private boolean isEditable(FileInfo info) { String status = info.status(); - return status == null - || !ChangeType.DELETED.matches(status); + return status == null || !ChangeType.DELETED.matches(status); } private void columnStatus(SafeHtmlBuilder sb, FileInfo info) { @@ -684,8 +688,7 @@ public class FileTable extends FlowPanel { private void columnPath(SafeHtmlBuilder sb, FileInfo info) { String path = info.path(); - sb.openTd() - .setStyleName(R.css().pathColumn()); + sb.openTd().setStyleName(R.css().pathColumn()); if (!canOpen(path)) { sb.openDiv(); @@ -701,15 +704,13 @@ public class FileTable extends FlowPanel { sb.setAttribute("onclick", RESTORE + "(event," + info._row() + ")"); } else { sb.setAttribute("href", "#" + url(info)) - .setAttribute("onclick", OPEN + "(event," + info._row() + ")"); + .setAttribute("onclick", OPEN + "(event," + info._row() + ")"); } appendPath(path); sb.closeAnchor(); if (info.oldPath() != null) { sb.br(); - sb.openSpan().setStyleName(R.css().renameCopySource()) - .append(info.oldPath()) - .closeSpan(); + sb.openSpan().setStyleName(R.css().renameCopySource()).append(info.oldPath()).closeSpan(); } sb.closeTd(); } @@ -722,9 +723,10 @@ public class FileTable extends FlowPanel { } else if (Gerrit.getUserPreferences().muteCommonPathPrefixes()) { int commonPrefixLen = commonPrefix(path); if (commonPrefixLen > 0) { - sb.openSpan().setStyleName(R.css().commonPrefix()) - .append(path.substring(0, commonPrefixLen)) - .closeSpan(); + sb.openSpan() + .setStyleName(R.css().commonPrefix()) + .append(path.substring(0, commonPrefixLen)) + .closeSpan(); } sb.append(path.substring(commonPrefixLen)); lastPath = path; @@ -734,7 +736,7 @@ public class FileTable extends FlowPanel { } private int commonPrefix(String path) { - for (int n = path.length(); n > 0;) { + for (int n = path.length(); n > 0; ) { int s = path.lastIndexOf('/', n); if (s < 0) { return 0; @@ -817,22 +819,16 @@ public class FileTable extends FlowPanel { sb.append(info.linesInserted() + info.linesDeleted()); } else if (!ChangeType.DELETED.matches(info.status())) { if (ChangeType.ADDED.matches(info.status())) { - sb.append(info.linesInserted()) - .append(" lines"); + sb.append(info.linesInserted()).append(" lines"); } else { - sb.append("+") - .append(info.linesInserted()) - .append(", -") - .append(info.linesDeleted()); + sb.append("+").append(info.linesInserted()).append(", -").append(info.linesDeleted()); } } } else if (info.binary()) { sb.append(formatBytes(info.sizeDelta())); long oldSize = info.size() - info.sizeDelta(); if (oldSize != 0) { - sb.append(" (") - .append(formatPercentage(oldSize, info.sizeDelta())) - .append(")"); + sb.append(" (").append(formatPercentage(oldSize, info.sizeDelta())).append(")"); } } sb.closeTd(); @@ -841,7 +837,8 @@ public class FileTable extends FlowPanel { private void columnDelta2(SafeHtmlBuilder sb, FileInfo info) { sb.openTd().setStyleName(R.css().deltaColumn2()); if (showChangeSizeBars - && !Patch.isMagic(info.path()) && !info.binary() + && !Patch.isMagic(info.path()) + && !info.binary() && (info.linesInserted() != 0 || info.linesDeleted() != 0)) { int w = 80; int t = inserted + deleted; @@ -849,21 +846,19 @@ public class FileTable extends FlowPanel { int d = Math.max(5, (int) (((double) w) * info.linesDeleted() / t)); sb.setAttribute( - "title", - Util.M.patchTableSize_LongModify(info.linesInserted(), - info.linesDeleted())); + "title", Util.M.patchTableSize_LongModify(info.linesInserted(), info.linesDeleted())); if (0 < info.linesInserted()) { sb.openDiv() - .setStyleName(R.css().inserted()) - .setAttribute("style", "width:" + i + "px") - .closeDiv(); + .setStyleName(R.css().inserted()) + .setAttribute("style", "width:" + i + "px") + .closeDiv(); } if (0 < info.linesDeleted()) { sb.openDiv() - .setStyleName(R.css().deleted()) - .setAttribute("style", "width:" + d + "px") - .closeDiv(); + .setStyleName(R.css().deleted()) + .setAttribute("style", "width:" + d + "px") + .closeDiv(); } } sb.closeTd(); @@ -891,15 +886,16 @@ public class FileTable extends FlowPanel { sb.br(); } if (binOldSize != 0) { - sb.append(Util.M.patchTableSize_ModifyBinaryFilesWithPercentages( - formatAbsBytes(bytesInserted), - formatAbsPercentage(binOldSize, bytesInserted), - formatAbsBytes(bytesDeleted), - formatAbsPercentage(binOldSize, bytesDeleted))); + sb.append( + Util.M.patchTableSize_ModifyBinaryFilesWithPercentages( + formatAbsBytes(bytesInserted), + formatAbsPercentage(binOldSize, bytesInserted), + formatAbsBytes(bytesDeleted), + formatAbsPercentage(binOldSize, bytesDeleted))); } else { - sb.append(Util.M.patchTableSize_ModifyBinaryFiles( - formatAbsBytes(bytesInserted), - formatAbsBytes(bytesDeleted))); + sb.append( + Util.M.patchTableSize_ModifyBinaryFiles( + formatAbsBytes(bytesInserted), formatAbsBytes(bytesDeleted))); } } sb.closeTh(); @@ -918,15 +914,15 @@ public class FileTable extends FlowPanel { } if (0 < inserted) { sb.openDiv() - .setStyleName(R.css().inserted()) - .setAttribute("style", "width:" + i + "px") - .closeDiv(); + .setStyleName(R.css().inserted()) + .setAttribute("style", "width:" + i + "px") + .closeDiv(); } if (0 < deleted) { sb.openDiv() - .setStyleName(R.css().deleted()) - .setAttribute("style", "width:" + d + "px") - .closeDiv(); + .setStyleName(R.css().deleted()) + .setAttribute("style", "width:" + d + "px") + .closeDiv(); } } sb.closeTh(); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/FollowUpAction.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/FollowUpAction.java index 29283b8221..5c7472c225 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/FollowUpAction.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/FollowUpAction.java @@ -37,7 +37,12 @@ class FollowUpAction extends ActionMessageBox { @Override void send(String message) { - ChangeApi.createChange(project, branch, topic, message, base, + ChangeApi.createChange( + project, + branch, + topic, + message, + base, new GerritCallback() { @Override public void onSuccess(ChangeInfo result) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Hashtags.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Hashtags.java index 44aae25256..192be34144 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Hashtags.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Hashtags.java @@ -43,12 +43,12 @@ import com.google.gwt.user.client.ui.ImageResourceRenderer; import com.google.gwt.user.client.ui.UIObject; import com.google.gwtexpui.globalkey.client.NpTextBox; import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder; - import java.util.Iterator; public class Hashtags extends Composite { interface Binder extends UiBinder {} + private static final int VISIBLE_LENGTH = 55; private static final Binder uiBinder = GWT.create(Binder.class); private static final String REMOVE; @@ -73,15 +73,17 @@ public class Hashtags extends Composite { if (hashtags != null) { final ChangeScreen screen = ChangeScreen.get(event); final PatchSet.Id psId = screen.getPatchSetId(); - ChangeApi.hashtags(psId.getParentKey().get()).post( - PostInput.create(null, hashtags), new GerritCallback() { - @Override - public void onSuccess(JavaScriptObject result) { - if (screen.isCurrentView()) { - Gerrit.display(PageLinks.toChange(psId)); - } - } - }); + ChangeApi.hashtags(psId.getParentKey().get()) + .post( + PostInput.create(null, hashtags), + new GerritCallback() { + @Override + public void onSuccess(JavaScriptObject result) { + if (screen.isCurrentView()) { + Gerrit.display(PageLinks.toChange(psId)); + } + } + }); } } @@ -111,16 +113,17 @@ public class Hashtags extends Composite { initWidget(uiBinder.createAndBindUi(this)); hashtagTextBox.setVisibleLength(VISIBLE_LENGTH); - hashtagTextBox.addKeyDownHandler(new KeyDownHandler() { - @Override - public void onKeyDown(KeyDownEvent e) { - if (e.getNativeKeyCode() == KeyCodes.KEY_ESCAPE) { - onCancel(null); - } else if (e.getNativeKeyCode() == KeyCodes.KEY_ENTER) { - onAdd(null); - } - } - }); + hashtagTextBox.addKeyDownHandler( + new KeyDownHandler() { + @Override + public void onKeyDown(KeyDownEvent e) { + if (e.getNativeKeyCode() == KeyCodes.KEY_ESCAPE) { + onCancel(null); + } else if (e.getNativeKeyCode() == KeyCodes.KEY_ENTER) { + onAdd(null); + } + } + }); addHashtagIcon.addDomHandler( new ClickHandler() { @@ -137,9 +140,7 @@ public class Hashtags extends Composite { } void set(ChangeInfo info, String revision) { - psId = new PatchSet.Id( - info.legacyId(), - info.revisions().get(revision)._number()); + psId = new PatchSet.Id(info.legacyId(), info.revisions().get(revision)._number()); canEdit = info.hasActions() && info.actions().containsKey("hashtags"); this.changeId = info.legacyId(); @@ -157,6 +158,7 @@ public class Hashtags extends Composite { private void display(ChangeInfo info) { hashtagsText.setInnerSafeHtml(formatHashtags(info)); } + private void display(JsArrayString hashtags) { hashtagsText.setInnerSafeHtml(formatHashtags(hashtags)); } @@ -177,13 +179,11 @@ public class Hashtags extends Composite { .setAttribute(DATA_ID, hashtagName) .setStyleName(style.hashtagName()) .openAnchor() - .setAttribute("href", - "#" + PageLinks.toChangeQuery("hashtag:\"" + hashtagName + "\"")) + .setAttribute("href", "#" + PageLinks.toChangeQuery("hashtag:\"" + hashtagName + "\"")) .setAttribute("role", "listitem") .openSpan() - .setStyleName(style.hashtagIcon()) - .append(new ImageResourceRenderer().render( - Gerrit.RESOURCES.hashtag())) + .setStyleName(style.hashtagIcon()) + .append(new ImageResourceRenderer().render(Gerrit.RESOURCES.hashtag())) .closeSpan() .append(" ") .append(hashtagName) @@ -219,25 +219,25 @@ public class Hashtags extends Composite { } private void addHashtag(final String hashtags) { - ChangeApi.hashtags(changeId.get()).post( - PostInput.create(hashtags, null), - new GerritCallback() { - @Override - public void onSuccess(JsArrayString result) { - Gerrit.display(PageLinks.toChange( - psId.getParentKey(), - String.valueOf(psId.get()))); - } + ChangeApi.hashtags(changeId.get()) + .post( + PostInput.create(hashtags, null), + new GerritCallback() { + @Override + public void onSuccess(JsArrayString result) { + Gerrit.display(PageLinks.toChange(psId.getParentKey(), String.valueOf(psId.get()))); + } - @Override - public void onFailure(Throwable err) { - UIObject.setVisible(error, true); - error.setInnerText(err instanceof StatusCodeException - ? ((StatusCodeException) err).getEncodedResponse() - : err.getMessage()); - hashtagTextBox.setEnabled(true); - } - }); + @Override + public void onFailure(Throwable err) { + UIObject.setVisible(error, true); + error.setInnerText( + err instanceof StatusCodeException + ? ((StatusCodeException) err).getEncodedResponse() + : err.getMessage()); + hashtagTextBox.setEnabled(true); + } + }); } public static class PostInput extends JavaScriptObject { @@ -246,6 +246,7 @@ public class Hashtags extends Composite { input.init(toJsArrayString(add), toJsArrayString(remove)); return input; } + private static JsArrayString toJsArrayString(String commaSeparated) { if (commaSeparated == null || commaSeparated.equals("")) { return null; @@ -262,7 +263,6 @@ public class Hashtags extends Composite { this.remove = remove; }-*/; - protected PostInput() { - } + protected PostInput() {} } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/History.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/History.java index 92a0fc8cb7..e221f5479d 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/History.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/History.java @@ -24,7 +24,6 @@ import com.google.gerrit.reviewdb.client.Change; import com.google.gwt.core.client.JsArray; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Widget; - import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collections; @@ -39,8 +38,7 @@ class History extends FlowPanel { private final Map> byAuthor = new HashMap<>(); - void set(CommentLinkProcessor clp, ReplyAction ra, - Change.Id id, ChangeInfo info) { + void set(CommentLinkProcessor clp, ReplyAction ra, Change.Id id, ChangeInfo info) { this.clp = clp; this.replyAction = ra; this.changeId = id; diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/IncludedInAction.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/IncludedInAction.java index 479670fcdc..00b6c3ca4e 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/IncludedInAction.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/IncludedInAction.java @@ -22,10 +22,7 @@ class IncludedInAction extends RightSidePopdownAction { private final IncludedInBox includedInBox; IncludedInAction( - Change.Id changeId, - ChangeScreen.Style style, - UIObject relativeTo, - Widget includedInButton) { + Change.Id changeId, ChangeScreen.Style style, UIObject relativeTo, Widget includedInButton) { super(style, relativeTo, includedInButton); this.includedInBox = new IncludedInBox(changeId); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/IncludedInBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/IncludedInBox.java index 6493f11953..0f121cc9ba 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/IncludedInBox.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/IncludedInBox.java @@ -35,6 +35,7 @@ import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder; class IncludedInBox extends Composite { interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); interface Style extends CssResource { @@ -57,25 +58,25 @@ class IncludedInBox extends Composite { @Override protected void onLoad() { if (!loaded) { - ChangeApi.includedIn(changeId.get(), + ChangeApi.includedIn( + changeId.get(), new AsyncCallback() { - @Override - public void onSuccess(IncludedInInfo r) { - branches.setInnerSafeHtml(formatList(r.branches())); - tags.setInnerSafeHtml(formatList(r.tags())); - for (String n : r.externalNames()) { - JsArrayString external = r.external(n); - if (external.length() > 0) { - appendRow(n, external); + @Override + public void onSuccess(IncludedInInfo r) { + branches.setInnerSafeHtml(formatList(r.branches())); + tags.setInnerSafeHtml(formatList(r.tags())); + for (String n : r.externalNames()) { + JsArrayString external = r.external(n); + if (external.length() > 0) { + appendRow(n, external); + } + } + loaded = true; } - } - loaded = true; - } - @Override - public void onFailure(Throwable caught) { - } - }); + @Override + public void onFailure(Throwable caught) {} + }); } } @@ -83,10 +84,7 @@ class IncludedInBox extends Composite { SafeHtmlBuilder html = new SafeHtmlBuilder(); int size = l.length(); for (int i = 0; i < size; i++) { - html.openSpan() - .addStyleName(style.includedInElement()) - .append(l.get(i)) - .closeSpan(); + html.openSpan().addStyleName(style.includedInElement()).append(l.get(i)).closeSpan(); if (i < size - 1) { html.append(", "); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Labels.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Labels.java index 89550c6ec2..fc34aeb178 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Labels.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Labels.java @@ -35,7 +35,6 @@ import com.google.gwt.user.client.ui.Grid; import com.google.gwt.user.client.ui.Widget; import com.google.gwtexpui.safehtml.client.SafeHtml; import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder; - import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -73,15 +72,16 @@ class Labels extends Grid { if (user != null) { final ChangeScreen screen = ChangeScreen.get(event); final Change.Id changeId = screen.getPatchSetId().getParentKey(); - ChangeApi.reviewer(changeId.get(), user).delete( - new GerritCallback() { - @Override - public void onSuccess(JavaScriptObject result) { - if (screen.isCurrentView()) { - Gerrit.display(PageLinks.toChange(changeId)); - } - } - }); + ChangeApi.reviewer(changeId.get(), user) + .delete( + new GerritCallback() { + @Override + public void onSuccess(JavaScriptObject result) { + if (screen.isCurrentView()) { + Gerrit.display(PageLinks.toChange(changeId)); + } + } + }); } } @@ -91,15 +91,16 @@ class Labels extends Grid { if (user != null && vote != null) { final ChangeScreen screen = ChangeScreen.get(event); final Change.Id changeId = screen.getPatchSetId().getParentKey(); - ChangeApi.vote(changeId.get(), user, vote).delete( - new GerritCallback() { - @Override - public void onSuccess(JavaScriptObject result) { - if (screen.isCurrentView()) { - Gerrit.display(PageLinks.toChange(changeId)); - } - } - }); + ChangeApi.vote(changeId.get(), user, vote) + .delete( + new GerritCallback() { + @Override + public void onSuccess(JavaScriptObject result) { + if (screen.isCurrentView()) { + Gerrit.display(PageLinks.toChange(changeId)); + } + } + }); } } @@ -189,8 +190,7 @@ class Labels extends Grid { html.setStyleName(style.label_reject()); } html.append(val).append(" "); - html.append(formatUserList(style, m.get(v), removable, - label.name(), null)); + html.append(formatUserList(style, m.get(v), removable, label.name(), null)); html.closeSpan(); } return html.toBlockWidget(); @@ -210,13 +210,11 @@ class Labels extends Grid { } private static boolean isApproved(LabelInfo label, ApprovalInfo ai) { - return label.approved() != null - && label.approved()._accountId() == ai._accountId(); + return label.approved() != null && label.approved()._accountId() == ai._accountId(); } private static boolean isRejected(LabelInfo label, ApprovalInfo ai) { - return label.rejected() != null - && label.rejected()._accountId() == ai._accountId(); + return label.rejected() != null && label.rejected()._accountId() == ai._accountId(); } private String getStyleForLabel(LabelInfo label) { @@ -234,34 +232,37 @@ class Labels extends Grid { } } - static SafeHtml formatUserList(ChangeScreen.Style style, + static SafeHtml formatUserList( + ChangeScreen.Style style, Collection in, Set removable, String label, Map votable) { List users = new ArrayList<>(in); - Collections.sort(users, new Comparator() { - @Override - public int compare(AccountInfo a, AccountInfo b) { - String as = name(a); - String bs = name(b); - if (as.isEmpty()) { - return 1; - } else if (bs.isEmpty()) { - return -1; - } - return as.compareTo(bs); - } + Collections.sort( + users, + new Comparator() { + @Override + public int compare(AccountInfo a, AccountInfo b) { + String as = name(a); + String bs = name(b); + if (as.isEmpty()) { + return 1; + } else if (bs.isEmpty()) { + return -1; + } + return as.compareTo(bs); + } - private String name(AccountInfo a) { - if (a.name() != null) { - return a.name(); - } else if (a.email() != null) { - return a.email(); - } - return ""; - } - }); + private String name(AccountInfo a) { + if (a.name() != null) { + return a.name(); + } else if (a.email() != null) { + return a.email(); + } + return ""; + } + }); SafeHtmlBuilder html = new SafeHtmlBuilder(); Iterator itr = users.iterator(); @@ -285,8 +286,7 @@ class Labels extends Grid { if (!s.isEmpty()) { StringBuilder sb = new StringBuilder(Util.C.votable()); sb.append(" "); - for (Iterator it = vi.votableLabels().iterator(); - it.hasNext();) { + for (Iterator it = vi.votableLabels().iterator(); it.hasNext(); ) { sb.append(it.next()); if (it.hasNext()) { sb.append(", "); @@ -305,9 +305,7 @@ class Labels extends Grid { html.setAttribute(DATA_VOTE, label); } if (img != null) { - html.openElement("img") - .setStyleName(style.avatar()) - .setAttribute("src", img.url()); + html.openElement("img").setStyleName(style.avatar()).setAttribute("src", img.url()); if (img.width() > 0) { html.setAttribute("width", img.width()); } @@ -326,8 +324,7 @@ class Labels extends Grid { html.setAttribute("title", Util.M.removeReviewer(name)) .setAttribute("onclick", REMOVE_REVIEWER + "(event)"); } - html.append("×") - .closeElement("button"); + html.append("×").closeElement("button"); } html.closeSpan(); if (itr.hasNext()) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/LineComment.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/LineComment.java index a0f8858f8d..a1ad7c24e5 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/LineComment.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/LineComment.java @@ -32,6 +32,7 @@ import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder; class LineComment extends Composite { interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); @UiField Element sideLoc; @@ -42,9 +43,7 @@ class LineComment extends Composite { @UiField InlineHyperlink line; @UiField Element message; - LineComment(CommentLinkProcessor clp, - PatchSet.Id defaultPs, - CommentInfo info) { + LineComment(CommentLinkProcessor clp, PatchSet.Id defaultPs, CommentInfo info) { initWidget(uiBinder.createAndBindUi(this)); PatchSet.Id ps; @@ -81,14 +80,17 @@ class LineComment extends Composite { } if (info.message() != null) { - message.setInnerSafeHtml(clp.apply(new SafeHtmlBuilder() - .append(info.message().trim()).wikify())); + message.setInnerSafeHtml( + clp.apply(new SafeHtmlBuilder().append(info.message().trim()).wikify())); ApiGlue.fireEvent("comment", message); } } private static String url(PatchSet.Id ps, CommentInfo info) { - return Dispatcher.toPatch(null, ps, info.path(), + return Dispatcher.toPatch( + null, + ps, + info.path(), info.side() == Side.PARENT ? DisplaySide.A : DisplaySide.B, info.line()); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/LocalComments.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/LocalComments.java index 44316bc9d8..689aa2a1a1 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/LocalComments.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/LocalComments.java @@ -24,7 +24,6 @@ import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gwt.storage.client.Storage; import com.google.gwt.user.client.Cookies; - import java.util.ArrayList; import java.util.Collection; @@ -47,9 +46,10 @@ public class LocalComments { private final Storage storageBackend; StorageBackend() { - storageBackend = (Storage.isLocalStorageSupported()) - ? Storage.getLocalStorageIfSupported() - : Storage.getSessionStorageIfSupported(); + storageBackend = + (Storage.isLocalStorageSupported()) + ? Storage.getLocalStorageIfSupported() + : Storage.getSessionStorageIfSupported(); } String getItem(String key) { @@ -129,7 +129,9 @@ public class LocalComments { if (isInlineComment(cookie)) { InlineComment input = getInlineComment(cookie); if (input.commentInfo.id() == null) { - CommentApi.createDraft(input.psId, input.commentInfo, + CommentApi.createDraft( + input.psId, + input.commentInfo, new GerritCallback() { @Override public void onSuccess(CommentInfo result) { @@ -137,8 +139,11 @@ public class LocalComments { } }); } else { - CommentApi.updateDraft(input.psId, input.commentInfo.id(), - input.commentInfo, new GerritCallback() { + CommentApi.updateDraft( + input.psId, + input.commentInfo.id(), + input.commentInfo, + new GerritCallback() { @Override public void onSuccess(CommentInfo result) { storage.removeItem(cookie); @@ -179,7 +184,8 @@ public class LocalComments { } private static boolean isInlineComment(String key) { - return key.startsWith("patchCommentEdit-") || key.startsWith("patchReply-") + return key.startsWith("patchCommentEdit-") + || key.startsWith("patchReply-") || key.startsWith("patchComment-"); } @@ -196,11 +202,9 @@ public class LocalComments { offset = 2; } Change.Id changeId = new Change.Id(Integer.parseInt(elements[offset + 0])); - PatchSet.Id psId = - new PatchSet.Id(changeId, Integer.parseInt(elements[offset + 1])); + PatchSet.Id psId = new PatchSet.Id(changeId, Integer.parseInt(elements[offset + 1])); path = atob(elements[offset + 2]); - side = (Side.PARENT.toString().equals(elements[offset + 3])) ? Side.PARENT - : Side.REVISION; + side = (Side.PARENT.toString().equals(elements[offset + 3])) ? Side.PARENT : Side.REVISION; range = null; if (elements[offset + 4].startsWith("R")) { String rangeStart = elements[offset + 4].substring(1); @@ -237,12 +241,18 @@ public class LocalComments { } else if (comment.inReplyTo() != null) { result = "patchReply-" + comment.inReplyTo() + "-"; } - result += changeId + "-" + psId.getId() + "-" + btoa(comment.path()) + "-" - + comment.side() + "-"; + result += + changeId + "-" + psId.getId() + "-" + btoa(comment.path()) + "-" + comment.side() + "-"; if (comment.hasRange()) { - result += "R" + comment.range().startLine() + "," - + comment.range().startCharacter() + "-" + comment.range().endLine() - + "," + comment.range().endCharacter(); + result += + "R" + + comment.range().startLine() + + "," + + comment.range().startCharacter() + + "-" + + comment.range().endLine() + + "," + + comment.range().endCharacter(); } else { result += comment.line(); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Message.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Message.java index c8735b738f..a8fe2f0590 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Message.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Message.java @@ -39,7 +39,6 @@ import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.UIObject; import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder; - import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -48,6 +47,7 @@ import java.util.TreeMap; class Message extends Composite { interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); interface Style extends CssResource { @@ -80,12 +80,14 @@ class Message extends Composite { } initWidget(uiBinder.createAndBindUi(this)); - header.addDomHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - setOpen(!isOpen()); - } - }, ClickEvent.getType()); + header.addDomHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + setOpen(!isOpen()); + } + }, + ClickEvent.getType()); this.history = parent; this.info = info; @@ -95,8 +97,8 @@ class Message extends Composite { if (info.message() != null) { String msg = info.message().trim(); summary.setInnerText(msg); - message.setInnerSafeHtml(history.getCommentLinkProcessor() - .apply(new SafeHtmlBuilder().append(msg).wikify())); + message.setInnerSafeHtml( + history.getCommentLinkProcessor().apply(new SafeHtmlBuilder().append(msg).wikify())); ApiGlue.fireEvent("comment", message); } else { reply.getElement().getStyle().setVisibility(Visibility.HIDDEN); @@ -140,9 +142,8 @@ class Message extends Composite { } private void setName(boolean open) { - name.setInnerText(open - ? authorName(info) - : com.google.gerrit.common.FormatUtil.elide(authorName(info), 20)); + name.setInnerText( + open ? authorName(info) : com.google.gerrit.common.FormatUtil.elide(authorName(info), 20)); } void autoOpen() { @@ -168,9 +169,7 @@ class Message extends Composite { private void renderComments(List list) { CommentLinkProcessor clp = history.getCommentLinkProcessor(); - PatchSet.Id ps = new PatchSet.Id( - history.getChangeId(), - info._revisionNumber()); + PatchSet.Id ps = new PatchSet.Id(history.getChangeId(), info._revisionNumber()); TreeMap> m = byPath(list); List l = m.remove(Patch.COMMIT_MSG); if (l != null) { @@ -185,8 +184,7 @@ class Message extends Composite { } } - private static TreeMap> - byPath(List list) { + private static TreeMap> byPath(List list) { TreeMap> m = new TreeMap<>(); for (CommentInfo c : list) { List l = m.get(c.path()); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/PatchSetsBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/PatchSetsBox.java index 1753c7b962..189df08127 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/PatchSetsBox.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/PatchSetsBox.java @@ -47,12 +47,12 @@ import com.google.gwt.user.client.ui.PopupPanel; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.impl.HyperlinkImpl; import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder; - import java.util.Collections; import java.util.EnumSet; class PatchSetsBox extends Composite { interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); private static final String OPEN; @@ -70,7 +70,7 @@ class PatchSetsBox extends Composite { }-*/; private static boolean onOpen(NativeEvent e, int idx) { - if (link.handleAsClick(e. cast())) { + if (link.handleAsClick(e.cast())) { PatchSetsBox t = getRevisionBox(e); if (t != null) { t.onOpenRow(idx); @@ -94,8 +94,11 @@ class PatchSetsBox extends Composite { interface Style extends CssResource { String current(); + String legacy_id(); + String commit(); + String draft_comment(); } @@ -119,24 +122,23 @@ class PatchSetsBox extends Composite { protected void onLoad() { if (!loaded) { RestApi call = ChangeApi.detail(changeId.get()); - ChangeList.addOptions(call, EnumSet.of( - ListChangesOption.ALL_COMMITS, - ListChangesOption.ALL_REVISIONS)); - call.get(new AsyncCallback() { - @Override - public void onSuccess(ChangeInfo result) { - if (edit != null) { - edit.setName(edit.commit().commit()); - result.revisions().put(edit.name(), RevisionInfo.fromEdit(edit)); - } - render(result.revisions()); - loaded = true; - } + ChangeList.addOptions( + call, EnumSet.of(ListChangesOption.ALL_COMMITS, ListChangesOption.ALL_REVISIONS)); + call.get( + new AsyncCallback() { + @Override + public void onSuccess(ChangeInfo result) { + if (edit != null) { + edit.setName(edit.commit().commit()); + result.revisions().put(edit.name(), RevisionInfo.fromEdit(edit)); + } + render(result.revisions()); + loaded = true; + } - @Override - public void onFailure(Throwable caught) { - } - }); + @Override + public void onFailure(Throwable caught) {} + }); } } @@ -158,20 +160,25 @@ class PatchSetsBox extends Composite { revision(sb, i, revisions.get(i)); } - GWT. create(FancyFlexTableImpl.class) - .resetHtml(table, sb); + GWT.create(FancyFlexTableImpl.class).resetHtml(table, sb); } private void header(SafeHtmlBuilder sb) { sb.openTr() - .openTh() - .setStyleName(style.legacy_id()) - .append(Resources.C.patchSet()) - .closeTh() - .openTh().append(Resources.C.commit()).closeTh() - .openTh().append(Resources.C.date()).closeTh() - .openTh().append(Resources.C.author()).closeTh() - .closeTr(); + .openTh() + .setStyleName(style.legacy_id()) + .append(Resources.C.patchSet()) + .closeTh() + .openTh() + .append(Resources.C.commit()) + .closeTh() + .openTh() + .append(Resources.C.date()) + .closeTh() + .openTh() + .append(Resources.C.author()) + .closeTh() + .closeTr(); } private void revision(SafeHtmlBuilder sb, int index, RevisionInfo r) { @@ -189,17 +196,15 @@ class PatchSetsBox extends Composite { sb.closeTd(); sb.openTd() - .setStyleName(style.commit()) - .openAnchor() - .setAttribute("href", "#" + url(r)) - .setAttribute("onclick", OPEN + "(event," + index + ")") - .append(r.name().substring(0, 10)) - .closeAnchor() - .closeTd(); + .setStyleName(style.commit()) + .openAnchor() + .setAttribute("href", "#" + url(r)) + .setAttribute("onclick", OPEN + "(event," + index + ")") + .append(r.name().substring(0, 10)) + .closeAnchor() + .closeTd(); - sb.openTd() - .append(FormatUtil.shortFormatDayTime(c.committer().date())) - .closeTd(); + sb.openTd().append(FormatUtil.shortFormatDayTime(c.committer().date())).closeTd(); String an = c.author() != null ? c.author().name() : ""; String cn = c.committer() != null ? c.committer().name() : ""; diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/PathSuggestOracle.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/PathSuggestOracle.java index 2ca26cee9e..8e51ea7b3a 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/PathSuggestOracle.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/PathSuggestOracle.java @@ -21,7 +21,6 @@ import com.google.gerrit.reviewdb.client.Change; import com.google.gwt.core.client.JsArrayString; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwtexpui.safehtml.client.HighlightSuggestOracle; - import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -39,25 +38,26 @@ class PathSuggestOracle extends HighlightSuggestOracle { @Override protected void onRequestSuggestions(final Request req, final Callback cb) { ChangeApi.revision(changeId.get(), revision.name()) - .view("files") - .addParameter("q", req.getQuery()) - .background() - .get(new AsyncCallback() { - @Override - public void onSuccess(JsArrayString result) { - List r = new ArrayList<>(); - for (String path : Natives.asList(result)) { - r.add(new PathSuggestion(path)); - } - cb.onSuggestionsReady(req, new Response(r)); - } + .view("files") + .addParameter("q", req.getQuery()) + .background() + .get( + new AsyncCallback() { + @Override + public void onSuccess(JsArrayString result) { + List r = new ArrayList<>(); + for (String path : Natives.asList(result)) { + r.add(new PathSuggestion(path)); + } + cb.onSuggestionsReady(req, new Response(r)); + } - @Override - public void onFailure(Throwable caught) { - List none = Collections.emptyList(); - cb.onSuggestionsReady(req, new Response(none)); - } - }); + @Override + public void onFailure(Throwable caught) { + List none = Collections.emptyList(); + cb.onSuggestionsReady(req, new Response(none)); + } + }); } private static class PathSuggestion implements Suggestion { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/QuickApprove.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/QuickApprove.java index ebeb574324..c4a74f545a 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/QuickApprove.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/QuickApprove.java @@ -94,13 +94,15 @@ class QuickApprove extends Button implements ClickHandler { replyAction.quickApprove(input); } else { ChangeApi.revision(changeId.get(), revision) - .view("review") - .post(input, new GerritCallback() { - @Override - public void onSuccess(ReviewInput result) { - Gerrit.display(PageLinks.toChange(changeId)); - } - }); + .view("review") + .post( + input, + new GerritCallback() { + @Override + public void onSuccess(ReviewInput result) { + Gerrit.display(PageLinks.toChange(changeId)); + } + }); } } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RebaseAction.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RebaseAction.java index 986bd78d4d..147f2bc949 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RebaseAction.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RebaseAction.java @@ -26,27 +26,36 @@ import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.PopupPanel; class RebaseAction { - static void call(final Button b, final String project, final String branch, - final Change.Id id, final String revision, final boolean enabled) { + static void call( + final Button b, + final String project, + final String branch, + final Change.Id id, + final String revision, + final boolean enabled) { b.setEnabled(false); new RebaseDialog(project, branch, id, enabled) { @Override public void onSend() { - ChangeApi.rebase(id.get(), revision, getBase(), new GerritCallback() { - @Override - public void onSuccess(ChangeInfo result) { - sent = true; - hide(); - Gerrit.display(PageLinks.toChange(id)); - } + ChangeApi.rebase( + id.get(), + revision, + getBase(), + new GerritCallback() { + @Override + public void onSuccess(ChangeInfo result) { + sent = true; + hide(); + Gerrit.display(PageLinks.toChange(id)); + } - @Override - public void onFailure(Throwable caught) { - enableButtons(true); - super.onFailure(caught); - } - }); + @Override + public void onFailure(Throwable caught) { + enableButtons(true); + super.onFailure(caught); + } + }); } @Override diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RelatedChanges.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RelatedChanges.java index 0d0dba752e..d5d5f36e53 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RelatedChanges.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RelatedChanges.java @@ -37,14 +37,12 @@ import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.TabBar; import com.google.gwt.user.client.ui.TabPanel; - import java.util.ArrayList; import java.util.EnumSet; import java.util.List; public class RelatedChanges extends TabPanel { - static final RelatedChangesResources R = GWT - .create(RelatedChangesResources.class); + static final RelatedChangesResources R = GWT.create(RelatedChangesResources.class); interface RelatedChangesResources extends ClientBundle { @Source("related_changes.css") @@ -53,21 +51,30 @@ public class RelatedChanges extends TabPanel { interface RelatedChangesCss extends CssResource { String activeRow(); + String current(); + String gitweb(); + String indirect(); + String notCurrent(); + String pointer(); + String row(); + String subject(); + String strikedSubject(); + String submittable(); + String tabPanel(); } enum Tab { - RELATED_CHANGES(Resources.C.relatedChanges(), - Resources.C.relatedChangesTooltip()) { + RELATED_CHANGES(Resources.C.relatedChanges(), Resources.C.relatedChangesTooltip()) { @Override String getTitle(int count) { return Resources.M.relatedChanges(count); @@ -79,8 +86,7 @@ public class RelatedChanges extends TabPanel { } }, - SUBMITTED_TOGETHER(Resources.C.submittedTogether(), - Resources.C.submittedTogether()) { + SUBMITTED_TOGETHER(Resources.C.submittedTogether(), Resources.C.submittedTogether()) { @Override String getTitle(int count) { return Resources.M.submittedTogether(count); @@ -92,8 +98,7 @@ public class RelatedChanges extends TabPanel { } }, - SAME_TOPIC(Resources.C.sameTopic(), - Resources.C.sameTopicTooltip()) { + SAME_TOPIC(Resources.C.sameTopic(), Resources.C.sameTopicTooltip()) { @Override String getTitle(int count) { return Resources.M.sameTopic(count); @@ -105,8 +110,7 @@ public class RelatedChanges extends TabPanel { } }, - CONFLICTING_CHANGES(Resources.C.conflictingChanges(), - Resources.C.conflictingChangesTooltip()) { + CONFLICTING_CHANGES(Resources.C.conflictingChanges(), Resources.C.conflictingChangesTooltip()) { @Override String getTitle(int count) { return Resources.M.conflictingChanges(count); @@ -118,8 +122,7 @@ public class RelatedChanges extends TabPanel { } }, - CHERRY_PICKS(Resources.C.cherryPicks(), - Resources.C.cherryPicksTooltip()) { + CHERRY_PICKS(Resources.C.cherryPicks(), Resources.C.cherryPicksTooltip()) { @Override String getTitle(int count) { return Resources.M.cherryPicks(count); @@ -135,6 +138,7 @@ public class RelatedChanges extends TabPanel { final String tooltip; abstract String getTitle(int count); + abstract String getTitle(String count); Tab(String defaultTitle, String tooltip) { @@ -161,16 +165,17 @@ public class RelatedChanges extends TabPanel { private void initTabBar() { TabBar tabBar = getTabBar(); - tabBar.addSelectionHandler(new SelectionHandler() { - @Override - public void onSelection(SelectionEvent event) { - if (selectedTab >= 0) { - tabs.get(selectedTab).registerKeys(false); - } - selectedTab = event.getSelectedItem(); - tabs.get(selectedTab).registerKeys(true); - } - }); + tabBar.addSelectionHandler( + new SelectionHandler() { + @Override + public void onSelection(SelectionEvent event) { + if (selectedTab >= 0) { + tabs.get(selectedTab).registerKeys(false); + } + selectedTab = event.getSelectedItem(); + tabs.get(selectedTab).registerKeys(true); + } + }); for (Tab tabInfo : Tab.values()) { RelatedChangesTab panel = new RelatedChangesTab(tabInfo); @@ -198,8 +203,10 @@ public class RelatedChanges extends TabPanel { setForOpenChange(info, revision); } - ChangeApi.revision(info.legacyId().get(), revision).view("related") - .get(new TabCallback(Tab.RELATED_CHANGES, info.project(), revision) { + ChangeApi.revision(info.legacyId().get(), revision) + .view("related") + .get( + new TabCallback(Tab.RELATED_CHANGES, info.project(), revision) { @Override public JsArray convert(RelatedInfo result) { return result.changes(); @@ -211,27 +218,30 @@ public class RelatedChanges extends TabPanel { cherryPicksQuery.append(" ").append(op("change", info.changeId())); cherryPicksQuery.append(" ").append(op("-change", info.legacyId().get())); cherryPicksQuery.append(" -is:abandoned"); - ChangeList.query(cherryPicksQuery.toString(), + ChangeList.query( + cherryPicksQuery.toString(), EnumSet.of(ListChangesOption.CURRENT_REVISION, ListChangesOption.CURRENT_COMMIT), new TabChangeListCallback(Tab.CHERRY_PICKS, info.project(), revision)); - if (info.currentRevision() != null - && info.currentRevision().equals(revision)) { - ChangeApi.change(info.legacyId().get()).view("submitted_together") - .get(new TabChangeListCallback(Tab.SUBMITTED_TOGETHER, - info.project(), revision)); + if (info.currentRevision() != null && info.currentRevision().equals(revision)) { + ChangeApi.change(info.legacyId().get()) + .view("submitted_together") + .get(new TabChangeListCallback(Tab.SUBMITTED_TOGETHER, info.project(), revision)); } if (!Gerrit.info().change().isSubmitWholeTopicEnabled() - && info.topic() != null && !"".equals(info.topic())) { + && info.topic() != null + && !"".equals(info.topic())) { StringBuilder topicQuery = new StringBuilder(); topicQuery.append("status:open"); topicQuery.append(" ").append(op("topic", info.topic())); - ChangeList.query(topicQuery.toString(), - EnumSet.of(ListChangesOption.CURRENT_REVISION, - ListChangesOption.CURRENT_COMMIT, - ListChangesOption.DETAILED_LABELS, - ListChangesOption.LABELS), + ChangeList.query( + topicQuery.toString(), + EnumSet.of( + ListChangesOption.CURRENT_REVISION, + ListChangesOption.CURRENT_COMMIT, + ListChangesOption.DETAILED_LABELS, + ListChangesOption.LABELS), new TabChangeListCallback(Tab.SAME_TOPIC, info.project(), revision)); } } @@ -242,7 +252,8 @@ public class RelatedChanges extends TabPanel { conflictsQuery.append("status:open"); conflictsQuery.append(" is:mergeable"); conflictsQuery.append(" ").append(op("conflicts", info.legacyId().get())); - ChangeList.query(conflictsQuery.toString(), + ChangeList.query( + conflictsQuery.toString(), EnumSet.of(ListChangesOption.CURRENT_REVISION, ListChangesOption.CURRENT_COMMIT), new TabChangeListCallback(Tab.CONFLICTING_CHANGES, info.project(), revision)); } @@ -323,7 +334,7 @@ public class RelatedChanges extends TabPanel { setTabEnabled(tabInfo, enabled); outstandingCallbacks--; if (outstandingCallbacks == 0 || (enabled && tabInfo == Tab.RELATED_CHANGES)) { - outstandingCallbacks = 0; // Only execute this block once + outstandingCallbacks = 0; // Only execute this block once for (int i = 0; i < getTabBar().getTabCount(); i++) { if (getTabBar().isTabEnabled(i)) { selectTab(i); @@ -369,8 +380,8 @@ public class RelatedChanges extends TabPanel { public static class RelatedInfo extends JavaScriptObject { public final native JsArray changes() /*-{ return this.changes }-*/; - protected RelatedInfo() { - } + + protected RelatedInfo() {} } public static class ChangeAndCommit extends JavaScriptObject { @@ -379,27 +390,29 @@ public class RelatedChanges extends TabPanel { } public final native String id() /*-{ return this.change_id }-*/; + public final native CommitInfo commit() /*-{ return this.commit }-*/; + final native String branch() /*-{ return this.branch }-*/; + final native String project() /*-{ return this.project }-*/; + final native boolean submittable() /*-{ return this._submittable ? true : false; }-*/; + final Change.Status status() { String s = statusRaw(); return s != null ? Change.Status.valueOf(s) : null; } + private native String statusRaw() /*-{ return this.status; }-*/; - final native void setId(String i) - /*-{ if(i)this.change_id=i; }-*/; + final native void setId(String i) /*-{ if(i)this.change_id=i; }-*/; - final native void setCommit(CommitInfo c) - /*-{ if(c)this.commit=c; }-*/; + final native void setCommit(CommitInfo c) /*-{ if(c)this.commit=c; }-*/; - final native void setBranch(String b) - /*-{ if(b)this.branch=b; }-*/; + final native void setBranch(String b) /*-{ if(b)this.branch=b; }-*/; - final native void setProject(String b) - /*-{ if(b)this.project=b; }-*/; + final native void setProject(String b) /*-{ if(b)this.project=b; }-*/; public final Change.Id legacyId() { return hasChangeNumber() ? new Change.Id(_changeNumber()) : null; @@ -412,39 +425,30 @@ public class RelatedChanges extends TabPanel { } public final native boolean hasChangeNumber() - /*-{ return this.hasOwnProperty('_change_number') }-*/; + /*-{ return this.hasOwnProperty('_change_number') }-*/ ; final native boolean hasRevisionNumber() - /*-{ return this.hasOwnProperty('_revision_number') }-*/; + /*-{ return this.hasOwnProperty('_revision_number') }-*/ ; final native boolean hasCurrentRevisionNumber() - /*-{ return this.hasOwnProperty('_current_revision_number') }-*/; + /*-{ return this.hasOwnProperty('_current_revision_number') }-*/ ; - final native int _changeNumber() - /*-{ return this._change_number }-*/; + final native int _changeNumber() /*-{ return this._change_number }-*/; - final native int _revisionNumber() - /*-{ return this._revision_number }-*/; + final native int _revisionNumber() /*-{ return this._revision_number }-*/; - final native int _currentRevisionNumber() - /*-{ return this._current_revision_number }-*/; + final native int _currentRevisionNumber() /*-{ return this._current_revision_number }-*/; - final native void setChangeNumber(int n) - /*-{ this._change_number=n; }-*/; + final native void setChangeNumber(int n) /*-{ this._change_number=n; }-*/; - final native void setRevisionNumber(int n) - /*-{ this._revision_number=n; }-*/; + final native void setRevisionNumber(int n) /*-{ this._revision_number=n; }-*/; - final native void setCurrentRevisionNumber(int n) - /*-{ this._current_revision_number=n; }-*/; + final native void setCurrentRevisionNumber(int n) /*-{ this._current_revision_number=n; }-*/; - final native void setSubmittable(boolean s) - /*-{ this._submittable=s; }-*/; + final native void setSubmittable(boolean s) /*-{ this._submittable=s; }-*/; - final native void setStatus(String s) - /*-{ if(s)this.status=s; }-*/; + final native void setStatus(String s) /*-{ if(s)this.status=s; }-*/; - protected ChangeAndCommit() { - } + protected ChangeAndCommit() {} } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RelatedChangesTab.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RelatedChangesTab.java index 846ad53ba9..9ffbad8a8d 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RelatedChangesTab.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RelatedChangesTab.java @@ -54,7 +54,6 @@ import com.google.gwtexpui.globalkey.client.GlobalKey; import com.google.gwtexpui.globalkey.client.KeyCommand; import com.google.gwtexpui.globalkey.client.KeyCommandSet; import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder; - import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -170,16 +169,15 @@ class RelatedChangesTab implements IsWidget { private int connectedPos; private int selected; - private DisplayCommand(String revision, JsArray changes, - NavigationList navList) { + private DisplayCommand( + String revision, JsArray changes, NavigationList navList) { this.revision = revision; this.changes = changes; this.navList = navList; rows = new ArrayList<>(changes.length()); connectedPos = changes.length() - 1; - connected = showIndirectAncestors - ? new HashSet<>(Math.max(changes.length() * 4 / 3, 16)) - : null; + connected = + showIndirectAncestors ? new HashSet<>(Math.max(changes.length() * 4 / 3, 16)) : null; } private boolean computeConnected() { @@ -229,8 +227,7 @@ class RelatedChangesTab implements IsWidget { while (row < changes.length()) { ChangeAndCommit info = changes.get(row); String commit = info.commit().commit(); - rows.add(new RowSafeHtml( - info, connected != null && !connected.contains(commit))); + rows.add(new RowSafeHtml(info, connected != null && !connected.contains(commit))); if (revision.equals(commit)) { selected = row; } @@ -315,7 +312,8 @@ class RelatedChangesTab implements IsWidget { sb.setStyleName(RelatedChanges.R.css().indirect()); sb.setAttribute("title", Resources.C.indirectAncestor()); sb.append('~'); - } else if (info.hasCurrentRevisionNumber() && info.hasRevisionNumber() + } else if (info.hasCurrentRevisionNumber() + && info.hasRevisionNumber() && info._currentRevisionNumber() != info._revisionNumber()) { sb.setStyleName(RelatedChanges.R.css().notCurrent()); sb.setAttribute("title", Util.C.notCurrent()); @@ -373,12 +371,13 @@ class RelatedChangesTab implements IsWidget { movePointerTo(selectedRow + 1, true); } }); - keysNavigation.add(new KeyCommand(0, 'O', Resources.C.openChange()) { - @Override - public void onKeyPress(KeyPressEvent event) { - onOpenRow(getRow(selectedRow)); - } - }); + keysNavigation.add( + new KeyCommand(0, 'O', Resources.C.openChange()) { + @Override + public void onKeyPress(KeyPressEvent event) { + onOpenRow(getRow(selectedRow)); + } + }); if (maxHeight > 0) { setHeight(maxHeight + "px"); @@ -400,8 +399,7 @@ class RelatedChangesTab implements IsWidget { rowHeight = surrogate.getOffsetHeight(); rowWidth = surrogate.getOffsetWidth(); getContainerElement().removeChild(surrogate); - getContainerElement().getStyle() - .setHeight(rowHeight * rows.size(), Style.Unit.PX); + getContainerElement().getStyle().setHeight(rowHeight * rows.size(), Style.Unit.PX); return true; } return false; @@ -414,8 +412,7 @@ class RelatedChangesTab implements IsWidget { if (scroll && rowHeight != 0) { // Position the selected row in the middle. - setVerticalScrollPosition( - Math.max(rowHeight * selectedRow - maxHeight / 2, 0)); + setVerticalScrollPosition(Math.max(rowHeight * selectedRow - maxHeight / 2, 0)); render(); } renderSelected(selectedRow, true); @@ -541,8 +538,7 @@ class RelatedChangesTab implements IsWidget { private void onOpenRow(Element row) { // Find the first HREF of the anchor of the select row (if any) if (row != null) { - NodeList nodes = - row.getElementsByTagName(AnchorElement.TAG); + NodeList nodes = row.getElementsByTagName(AnchorElement.TAG); for (int i = 0; i < nodes.getLength(); i++) { String url = nodes.getItem(i).getAttribute("href"); if (!url.isEmpty()) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RenameFileAction.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RenameFileAction.java index 9783cf43e2..cc24fe623d 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RenameFileAction.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RenameFileAction.java @@ -31,8 +31,8 @@ class RenameFileAction { private RenameFileBox renameBox; private PopupPanel popup; - RenameFileAction(Change.Id changeId, RevisionInfo revision, - ChangeScreen.Style style, Widget renameButton) { + RenameFileAction( + Change.Id changeId, RevisionInfo revision, ChangeScreen.Style style, Widget renameButton) { this.changeId = changeId; this.revision = revision; this.style = style; @@ -53,14 +53,15 @@ class RenameFileAction { final PopupPanel p = new PopupPanel(true); p.setStyleName(style.replyBox()); p.addAutoHidePartner(renameButton.getElement()); - p.addCloseHandler(new CloseHandler() { - @Override - public void onClose(CloseEvent event) { - if (popup == p) { - popup = null; - } - } - }); + p.addCloseHandler( + new CloseHandler() { + @Override + public void onClose(CloseEvent event) { + if (popup == p) { + popup = null; + } + } + }); p.add(renameBox); p.showRelativeTo(renameButton); GlobalKey.dialog(p); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RenameFileBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RenameFileBox.java index d0d8b4883b..a36b8effb8 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RenameFileBox.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RenameFileBox.java @@ -38,6 +38,7 @@ import com.google.gwtexpui.globalkey.client.NpTextBox; class RenameFileBox extends Composite { interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); private final Change.Id changeId; @@ -47,18 +48,20 @@ class RenameFileBox extends Composite { @UiField(provided = true) RemoteSuggestBox path; + @UiField NpTextBox newPath; RenameFileBox(Change.Id changeId, RevisionInfo revision) { this.changeId = changeId; path = new RemoteSuggestBox(new PathSuggestOracle(changeId, revision)); - path.addCloseHandler(new CloseHandler() { - @Override - public void onClose(CloseEvent event) { - hide(); - } - }); + path.addCloseHandler( + new CloseHandler() { + @Override + public void onClose(CloseEvent event) { + hide(); + } + }); initWidget(uiBinder.createAndBindUi(this)); } @@ -78,7 +81,10 @@ class RenameFileBox extends Composite { private void rename(String path, String newPath) { hide(); - ChangeEditApi.rename(changeId.get(), path, newPath, + ChangeEditApi.rename( + changeId.get(), + path, + newPath, new AsyncCallback() { @Override public void onSuccess(VoidResult result) { @@ -86,8 +92,7 @@ class RenameFileBox extends Composite { } @Override - public void onFailure(Throwable caught) { - } + public void onFailure(Throwable caught) {} }); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReplyAction.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReplyAction.java index 7882eecf7f..1c21cbf782 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReplyAction.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReplyAction.java @@ -52,9 +52,7 @@ class ReplyAction { CommentLinkProcessor clp, Widget replyButton, Widget quickApproveButton) { - this.psId = new PatchSet.Id( - info.legacyId(), - info.revisions().get(revision)._number()); + this.psId = new PatchSet.Id(info.legacyId(), info.revisions().get(revision)._number()); this.revision = revision; this.hasDraftComments = hasDraftComments; this.style = style; @@ -64,9 +62,10 @@ class ReplyAction { boolean current = revision.equals(info.currentRevision()); allLabels = info.allLabels(); - permittedLabels = current && info.hasPermittedLabels() - ? info.permittedLabels() - : NativeMap. create(); + permittedLabels = + current && info.hasPermittedLabels() + ? info.permittedLabels() + : NativeMap.create(); } boolean isVisible() { @@ -91,12 +90,7 @@ class ReplyAction { } if (replyBox == null) { - replyBox = new ReplyBox( - clp, - psId, - revision, - allLabels, - permittedLabels); + replyBox = new ReplyBox(clp, psId, revision, allLabels, permittedLabels); allLabels = null; permittedLabels = null; } @@ -108,17 +102,18 @@ class ReplyAction { p.setStyleName(style.replyBox()); p.addAutoHidePartner(replyButton.getElement()); p.addAutoHidePartner(quickApproveButton.getElement()); - p.addCloseHandler(new CloseHandler() { - @Override - public void onClose(CloseEvent event) { - if (popup == p) { - popup = null; - if (hasDraftComments || replyBox.hasMessage()) { - replyButton.setStyleName(style.highlight()); + p.addCloseHandler( + new CloseHandler() { + @Override + public void onClose(CloseEvent event) { + if (popup == p) { + popup = null; + if (hasDraftComments || replyBox.hasMessage()) { + replyButton.setStyleName(style.highlight()); + } + } } - } - } - }); + }); p.add(replyBox); Window.scrollTo(0, 0); replyButton.removeStyleName(style.highlight()); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReplyBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReplyBox.java index 0eea695a65..2a926b6bf9 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReplyBox.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReplyBox.java @@ -72,7 +72,6 @@ import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.TextArea; import com.google.gwt.user.client.ui.UIObject; import com.google.gwt.user.client.ui.Widget; - import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -81,11 +80,14 @@ import java.util.TreeSet; public class ReplyBox extends Composite { interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); interface Styles extends CssResource { String label_name(); + String label_value(); + String label_help(); } @@ -126,29 +128,28 @@ public class ReplyBox extends Composite { } addDomHandler( - new KeyDownHandler() { - @Override - public void onKeyDown(KeyDownEvent e) { - e.stopPropagation(); - if ((e.getNativeKeyCode() == KEY_ENTER - || e.getNativeKeyCode() == KEY_MAC_ENTER) - && (e.isControlKeyDown() || e.isMetaKeyDown())) { - e.preventDefault(); - if (post.isEnabled()) { - onPost(null); + new KeyDownHandler() { + @Override + public void onKeyDown(KeyDownEvent e) { + e.stopPropagation(); + if ((e.getNativeKeyCode() == KEY_ENTER || e.getNativeKeyCode() == KEY_MAC_ENTER) + && (e.isControlKeyDown() || e.isMetaKeyDown())) { + e.preventDefault(); + if (post.isEnabled()) { + onPost(null); + } } } - } - }, - KeyDownEvent.getType()); + }, + KeyDownEvent.getType()); addDomHandler( - new KeyPressHandler() { - @Override - public void onKeyPress(KeyPressEvent e) { - e.stopPropagation(); - } - }, - KeyPressEvent.getType()); + new KeyPressHandler() { + @Override + public void onKeyPress(KeyPressEvent e) { + e.stopPropagation(); + } + }, + KeyPressEvent.getType()); } @Override @@ -160,35 +161,41 @@ public class ReplyBox extends Composite { lc.removeReplyComment(); } ChangeApi.drafts(psId.getParentKey().get()) - .get(new AsyncCallback>>() { - @Override - public void onSuccess(NativeMap> result) { - displayComments(result); - post.setEnabled(true); - } + .get( + new AsyncCallback>>() { + @Override + public void onSuccess(NativeMap> result) { + displayComments(result); + post.setEnabled(true); + } - @Override - public void onFailure(Throwable caught) { - post.setEnabled(true); - } - }); + @Override + public void onFailure(Throwable caught) { + post.setEnabled(true); + } + }); - Scheduler.get().scheduleDeferred(new ScheduledCommand() { - @Override - public void execute() { - message.setFocus(true); - } - }); - Scheduler.get().scheduleFixedDelay(new RepeatingCommand() { - @Override - public boolean execute() { - String t = message.getText(); - if (t != null) { - message.setCursorPos(t.length()); - } - return false; - } - }, 0); + Scheduler.get() + .scheduleDeferred( + new ScheduledCommand() { + @Override + public void execute() { + message.setFocus(true); + } + }); + Scheduler.get() + .scheduleFixedDelay( + new RepeatingCommand() { + @Override + public boolean execute() { + String t = message.getText(); + if (t != null) { + message.setCursorPos(t.length()); + } + return false; + } + }, + 0); } @UiHandler("post") @@ -212,20 +219,23 @@ public class ReplyBox extends Composite { in.drafts(DraftHandling.PUBLISH_ALL_REVISIONS); in.prePost(); ChangeApi.revision(psId.getParentKey().get(), revision) - .view("review") - .post(in, new GerritCallback() { - @Override - public void onSuccess(ReviewInput result) { - Gerrit.display(PageLinks.toChange(psId)); - } - @Override - public void onFailure(final Throwable caught) { - if (RestApi.isNotSignedIn(caught)) { - lc.setReplyComment(message.getText()); - } - super.onFailure(caught); - } - }); + .view("review") + .post( + in, + new GerritCallback() { + @Override + public void onSuccess(ReviewInput result) { + Gerrit.display(PageLinks.toChange(psId)); + } + + @Override + public void onFailure(final Throwable caught) { + if (RestApi.isNotSignedIn(caught)) { + lc.setReplyComment(message.getText()); + } + super.onFailure(caught); + } + }); hide(); } @@ -296,9 +306,7 @@ public class ReplyBox extends Composite { } private void renderLabels( - List names, - NativeMap all, - NativeMap permitted) { + List names, NativeMap all, NativeMap permitted) { TreeSet values = new TreeSet<>(); List labels = new ArrayList<>(permitted.size()); for (String id : names) { @@ -349,9 +357,7 @@ public class ReplyBox extends Composite { return dv; } - private void renderRadio(int row, - List columns, - LabelAndValues lv) { + private void renderRadio(int row, List columns, LabelAndValues lv) { String id = lv.info.name(); Short dv = normalizeDefaultValue(lv.info.defaultValue(), lv.permitted); @@ -362,12 +368,10 @@ public class ReplyBox extends Composite { fmt.setStyleName(row, 0, style.label_name()); fmt.setStyleName(row, labelHelpColumn, style.label_help()); - ApprovalInfo self = Gerrit.isSignedIn() - ? lv.info.forUser(Gerrit.getUserAccount().getId().get()) - : null; + ApprovalInfo self = + Gerrit.isSignedIn() ? lv.info.forUser(Gerrit.getUserAccount().getId().get()) : null; - final LabelRadioGroup group = - new LabelRadioGroup(row, id, lv.permitted.size()); + final LabelRadioGroup group = new LabelRadioGroup(row, id, lv.permitted.size()); for (int i = 0; i < columns.size(); i++) { Short v = columns.get(i); if (lv.permitted.contains(v)) { @@ -386,9 +390,8 @@ public class ReplyBox extends Composite { } private void renderCheckBox(int row, LabelAndValues lv) { - ApprovalInfo self = Gerrit.isSignedIn() - ? lv.info.forUser(Gerrit.getUserAccount().getId().get()) - : null; + ApprovalInfo self = + Gerrit.isSignedIn() ? lv.info.forUser(Gerrit.getUserAccount().getId().get()) : null; final String id = lv.info.name(); final CheckBox b = new CheckBox(); @@ -397,12 +400,13 @@ public class ReplyBox extends Composite { if (self != null && self.value() == 1) { b.setValue(true); } - b.addValueChangeHandler(new ValueChangeHandler() { - @Override - public void onValueChange(ValueChangeEvent event) { - in.label(id, event.getValue() ? (short) 1 : (short) 0); - } - }); + b.addValueChangeHandler( + new ValueChangeHandler() { + @Override + public void onValueChange(ValueChangeEvent event) { + in.label(id, event.getValue() ? (short) 1 : (short) 0); + } + }); b.setStyleName(style.label_name()); labelsTable.setWidget(row, 0, b); @@ -412,9 +416,7 @@ public class ReplyBox extends Composite { } private static boolean isCheckBox(Set values) { - return values.size() == 2 - && values.contains((short) 0) - && values.contains((short) 1); + return values.size() == 2 && values.contains((short) 0) && values.contains((short) 1); } private void displayComments(NativeMap> m) { @@ -422,13 +424,13 @@ public class ReplyBox extends Composite { JsArray l = m.get(Patch.COMMIT_MSG); if (l != null) { - comments.add(new FileComments(clp, psId, - Util.C.commitMessage(), copyPath(Patch.COMMIT_MSG, l))); + comments.add( + new FileComments(clp, psId, Util.C.commitMessage(), copyPath(Patch.COMMIT_MSG, l))); } l = m.get(Patch.MERGE_LIST); if (l != null) { - comments.add(new FileComments(clp, psId, Util.C.commitMessage(), - copyPath(Patch.MERGE_LIST, l))); + comments.add( + new FileComments(clp, psId, Util.C.commitMessage(), copyPath(Patch.MERGE_LIST, l))); } List paths = new ArrayList<>(m.keySet()); @@ -436,8 +438,7 @@ public class ReplyBox extends Composite { for (String path : paths) { if (!Patch.isMagic(path)) { - comments.add(new FileComments(clp, psId, - path, copyPath(path, m.get(path)))); + comments.add(new FileComments(clp, psId, path, copyPath(path, m.get(path)))); } } @@ -479,9 +480,8 @@ public class ReplyBox extends Composite { } } - private class LabelRadioButton extends RadioButton implements - ValueChangeHandler, ClickHandler, MouseOverHandler, - MouseOutHandler { + private class LabelRadioButton extends RadioButton + implements ValueChangeHandler, ClickHandler, MouseOverHandler, MouseOutHandler { private final LabelRadioGroup group; private final String text; private final short value; diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Resources.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Resources.java index fdfaf6167e..cfc4e23927 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Resources.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Resources.java @@ -23,12 +23,16 @@ public interface Resources extends ClientBundle { ChangeConstants C = GWT.create(ChangeConstants.class); ChangeMessages M = GWT.create(ChangeMessages.class); - @Source("common.css") Style style(); + @Source("common.css") + Style style(); public interface Style extends CssResource { String button(); + String popup(); + String popupContent(); + String section(); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RestoreAction.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RestoreAction.java index 253c9a7549..ebc3d6823b 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RestoreAction.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RestoreAction.java @@ -32,12 +32,15 @@ class RestoreAction extends ActionMessageBox { @Override void send(String message) { - ChangeApi.restore(id.get(), message, new GerritCallback() { - @Override - public void onSuccess(ChangeInfo result) { - Gerrit.display(PageLinks.toChange(id)); - hide(); - } - }); + ChangeApi.restore( + id.get(), + message, + new GerritCallback() { + @Override + public void onSuccess(ChangeInfo result) { + Gerrit.display(PageLinks.toChange(id)); + hide(); + } + }); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RevertAction.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RevertAction.java index ae1b5d1918..f216af82bd 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RevertAction.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RevertAction.java @@ -27,23 +27,22 @@ import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.PopupPanel; class RevertAction { - static void call(final Button b, final Change.Id id, final String revision, - final String commitSubject) { + static void call( + final Button b, final Change.Id id, final String revision, final String commitSubject) { // TODO Replace ActionDialog with a nicer looking display. b.setEnabled(false); - new TextAreaActionDialog( - Util.C.revertChangeTitle(), - Util.C.headingRevertMessage()) { + new TextAreaActionDialog(Util.C.revertChangeTitle(), Util.C.headingRevertMessage()) { { sendButton.setText(Util.C.buttonRevertChangeSend()); - message.setText(Util.M.revertChangeDefaultMessage( - commitSubject, revision)); + message.setText(Util.M.revertChangeDefaultMessage(commitSubject, revision)); } @Override public void onSend() { - ChangeApi.revert(id.get(), - getMessageText(), new GerritCallback() { + ChangeApi.revert( + id.get(), + getMessageText(), + new GerritCallback() { @Override public void onSuccess(ChangeInfo result) { sent = true; diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReviewerSuggestOracle.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReviewerSuggestOracle.java index 6f518b1e08..5e7110d13a 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReviewerSuggestOracle.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReviewerSuggestOracle.java @@ -25,7 +25,6 @@ import com.google.gerrit.reviewdb.client.Change; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArray; import com.google.gwtexpui.safehtml.client.HighlightSuggestOracle; - import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -36,24 +35,24 @@ public class ReviewerSuggestOracle extends HighlightSuggestOracle { @Override protected void onRequestSuggestions(final Request req, final Callback cb) { - ChangeApi - .suggestReviewers(changeId.get(), req.getQuery(), req.getLimit(), false) - .get(new GerritCallback>() { - @Override - public void onSuccess(JsArray result) { - List r = new ArrayList<>(result.length()); - for (SuggestReviewerInfo reviewer : Natives.asList(result)) { - r.add(new RestReviewerSuggestion(reviewer, req.getQuery())); - } - cb.onSuggestionsReady(req, new Response(r)); - } + ChangeApi.suggestReviewers(changeId.get(), req.getQuery(), req.getLimit(), false) + .get( + new GerritCallback>() { + @Override + public void onSuccess(JsArray result) { + List r = new ArrayList<>(result.length()); + for (SuggestReviewerInfo reviewer : Natives.asList(result)) { + r.add(new RestReviewerSuggestion(reviewer, req.getQuery())); + } + cb.onSuggestionsReady(req, new Response(r)); + } - @Override - public void onFailure(Throwable err) { - List r = Collections.emptyList(); - cb.onSuggestionsReady(req, new Response(r)); - } - }); + @Override + public void onFailure(Throwable err) { + List r = Collections.emptyList(); + cb.onSuggestionsReady(req, new Response(r)); + } + }); } @Override @@ -71,13 +70,12 @@ public class ReviewerSuggestOracle extends HighlightSuggestOracle { RestReviewerSuggestion(SuggestReviewerInfo reviewer, String query) { if (reviewer.account() != null) { - this.replacementString = AccountSuggestOracle.AccountSuggestion - .format(reviewer.account(), query); + this.replacementString = + AccountSuggestOracle.AccountSuggestion.format(reviewer.account(), query); this.displayString = replacementString; } else { this.replacementString = reviewer.group().name(); - this.displayString = - replacementString + " (" + Util.C.suggestedGroupLabel() + ")"; + this.displayString = replacementString + " (" + Util.C.suggestedGroupLabel() + ")"; } } @@ -94,8 +92,9 @@ public class ReviewerSuggestOracle extends HighlightSuggestOracle { public static class SuggestReviewerInfo extends JavaScriptObject { public final native AccountInfo account() /*-{ return this.account; }-*/; + public final native GroupBaseInfo group() /*-{ return this.group; }-*/; - protected SuggestReviewerInfo() { - } + + protected SuggestReviewerInfo() {} } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Reviewers.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Reviewers.java index bebbaaaad4..cd880a3280 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Reviewers.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Reviewers.java @@ -52,7 +52,6 @@ import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.UIObject; import com.google.gwtexpui.safehtml.client.SafeHtml; import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder; - import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -62,6 +61,7 @@ import java.util.Set; /** Add reviewers. */ public class Reviewers extends Composite { interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); @UiField Element reviewersText; @@ -69,6 +69,7 @@ public class Reviewers extends Composite { @UiField Button addMe; @UiField Element form; @UiField Element error; + @UiField(provided = true) RemoteSuggestBox suggestBox; @@ -84,18 +85,20 @@ public class Reviewers extends Composite { suggestBox.enableDefaultSuggestions(); suggestBox.setVisibleLength(55); suggestBox.setHintText(Util.C.approvalTableAddReviewerHint()); - suggestBox.addCloseHandler(new CloseHandler() { - @Override - public void onClose(CloseEvent event) { - Reviewers.this.onCancel(null); - } - }); - suggestBox.addSelectionHandler(new SelectionHandler() { - @Override - public void onSelection(SelectionEvent event) { - addReviewer(event.getSelectedItem(), false); - } - }); + suggestBox.addCloseHandler( + new CloseHandler() { + @Override + public void onClose(CloseEvent event) { + Reviewers.this.onCancel(null); + } + }); + suggestBox.addSelectionHandler( + new SelectionHandler() { + @Override + public void onSelection(SelectionEvent event) { + addReviewer(event.getSelectedItem(), false); + } + }); initWidget(uiBinder.createAndBindUi(this)); addReviewerIcon.addDomHandler( @@ -153,56 +156,59 @@ public class Reviewers extends Composite { return; } - ChangeApi.reviewers(changeId.get()).post( - PostInput.create(reviewer, confirmed), - new GerritCallback() { - @Override - public void onSuccess(PostResult result) { - if (result.confirm()) { - askForConfirmation(result.error()); - } else if (result.error() != null) { - UIObject.setVisible(error, true); - error.setInnerText(result.error()); - } else { - UIObject.setVisible(error, false); - error.setInnerText(""); - suggestBox.setText(""); + ChangeApi.reviewers(changeId.get()) + .post( + PostInput.create(reviewer, confirmed), + new GerritCallback() { + @Override + public void onSuccess(PostResult result) { + if (result.confirm()) { + askForConfirmation(result.error()); + } else if (result.error() != null) { + UIObject.setVisible(error, true); + error.setInnerText(result.error()); + } else { + UIObject.setVisible(error, false); + error.setInnerText(""); + suggestBox.setText(""); - if (result.reviewers() != null - && result.reviewers().length() > 0) { - updateReviewerList(); - } - } - } - - private void askForConfirmation(String text) { - new ConfirmationDialog( - Util.C.approvalTableAddManyReviewersConfirmationDialogTitle(), - new SafeHtmlBuilder().append(text), - new ConfirmationCallback() { - @Override - public void onOk() { - addReviewer(reviewer, true); + if (result.reviewers() != null && result.reviewers().length() > 0) { + updateReviewerList(); } - }).center(); - } + } + } - @Override - public void onFailure(Throwable err) { - if (isSigninFailure(err)) { - new NotSignedInDialog().center(); - } else { - UIObject.setVisible(error, true); - error.setInnerText(err instanceof StatusCodeException - ? ((StatusCodeException) err).getEncodedResponse() - : err.getMessage()); - } - } - }); + private void askForConfirmation(String text) { + new ConfirmationDialog( + Util.C.approvalTableAddManyReviewersConfirmationDialogTitle(), + new SafeHtmlBuilder().append(text), + new ConfirmationCallback() { + @Override + public void onOk() { + addReviewer(reviewer, true); + } + }) + .center(); + } + + @Override + public void onFailure(Throwable err) { + if (isSigninFailure(err)) { + new NotSignedInDialog().center(); + } else { + UIObject.setVisible(error, true); + error.setInnerText( + err instanceof StatusCodeException + ? ((StatusCodeException) err).getEncodedResponse() + : err.getMessage()); + } + } + }); } void updateReviewerList() { - ChangeApi.detail(changeId.get(), + ChangeApi.detail( + changeId.get(), new GerritCallback() { @Override public void onSuccess(ChangeInfo result) { @@ -222,18 +228,17 @@ public class Reviewers extends Composite { Set removable = info.removableReviewerIds(); Map votable = votable(info); - SafeHtml rHtml = Labels.formatUserList(style, - r.values(), removable, null, votable); - SafeHtml ccHtml = Labels.formatUserList(style, - cc.values(), removable, null, votable); + SafeHtml rHtml = Labels.formatUserList(style, r.values(), removable, null, votable); + SafeHtml ccHtml = Labels.formatUserList(style, cc.values(), removable, null, votable); reviewersText.setInnerSafeHtml(rHtml); ccText.setInnerSafeHtml(ccHtml); if (Gerrit.isSignedIn()) { int currentUser = Gerrit.getUserAccount()._accountId(); - boolean showAddMeButton = info.owner()._accountId() != currentUser - && !cc.containsKey(currentUser) - && !r.containsKey(currentUser); + boolean showAddMeButton = + info.owner()._accountId() != currentUser + && !cc.containsKey(currentUser) + && !r.containsKey(currentUser); addMe.setVisible(showAddMeButton); } } @@ -255,9 +260,8 @@ public class Reviewers extends Composite { Map d = new HashMap<>(); for (String name : change.labels()) { LabelInfo label = change.label(name); - Short labelMaxValue = label.valueSet().isEmpty() - ? null - : LabelInfo.parseValue(label.maxValue()); + Short labelMaxValue = + label.valueSet().isEmpty() ? null : LabelInfo.parseValue(label.maxValue()); if (label.all() != null) { for (ApprovalInfo ai : Natives.asList(label.all())) { int id = ai._accountId(); @@ -279,7 +283,6 @@ public class Reviewers extends Composite { return d; } - public static class PostInput extends JavaScriptObject { public static PostInput create(String reviewer, boolean confirmed) { PostInput input = createObject().cast(); @@ -294,27 +297,28 @@ public class Reviewers extends Composite { } }-*/; - protected PostInput() { - } + protected PostInput() {} } public static class ReviewerInfo extends AccountInfo { final Set approvals() { return Natives.keys(_approvals()); } + final native String approval(String l) /*-{ return this.approvals[l]; }-*/; + private native NativeMap _approvals() /*-{ return this.approvals; }-*/; - protected ReviewerInfo() { - } + protected ReviewerInfo() {} } public static class PostResult extends JavaScriptObject { public final native JsArray reviewers() /*-{ return this.reviewers; }-*/; + public final native boolean confirm() /*-{ return this.confirm || false; }-*/; + public final native String error() /*-{ return this.error; }-*/; - protected PostResult() { - } + protected PostResult() {} } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RightSidePopdownAction.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RightSidePopdownAction.java index a3b16f9195..1383c5de21 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RightSidePopdownAction.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RightSidePopdownAction.java @@ -30,10 +30,7 @@ abstract class RightSidePopdownAction { private final UIObject relativeTo; private PopupPanel popup; - RightSidePopdownAction( - ChangeScreen.Style style, - UIObject relativeTo, - Widget button) { + RightSidePopdownAction(ChangeScreen.Style style, UIObject relativeTo, Widget button) { this.style = style; this.relativeTo = relativeTo; this.button = button; @@ -48,31 +45,33 @@ abstract class RightSidePopdownAction { return; } - final PopupPanel p = new PopupPanel(true) { - @Override - public void setPopupPosition(int left, int top) { - top -= Document.get().getBodyOffsetTop(); + final PopupPanel p = + new PopupPanel(true) { + @Override + public void setPopupPosition(int left, int top) { + top -= Document.get().getBodyOffsetTop(); - int w = Window.getScrollLeft() + Window.getClientWidth(); - int r = relativeTo.getAbsoluteLeft() + relativeTo.getOffsetWidth(); - int right = w - r; - Style style = getElement().getStyle(); - style.clearProperty("left"); - style.setPropertyPx("right", right); - style.setPropertyPx("top", top); - } - }; + int w = Window.getScrollLeft() + Window.getClientWidth(); + int r = relativeTo.getAbsoluteLeft() + relativeTo.getOffsetWidth(); + int right = w - r; + Style style = getElement().getStyle(); + style.clearProperty("left"); + style.setPropertyPx("right", right); + style.setPropertyPx("top", top); + } + }; p.setStyleName(style.replyBox()); p.addAutoHidePartner(button.getElement()); - p.addCloseHandler(new CloseHandler() { - @Override - public void onClose(CloseEvent event) { - if (popup == p) { - button.removeStyleName(style.selected()); - popup = null; - } - } - }); + p.addCloseHandler( + new CloseHandler() { + @Override + public void onClose(CloseEvent event) { + if (popup == p) { + button.removeStyleName(style.selected()); + popup = null; + } + } + }); p.add(getWidget()); p.showRelativeTo(relativeTo); GlobalKey.dialog(p); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/StarIcon.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/StarIcon.java index 0f19406d0c..b7bf8debc1 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/StarIcon.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/StarIcon.java @@ -20,8 +20,6 @@ import com.google.gwt.user.client.ui.ToggleButton; class StarIcon extends ToggleButton { StarIcon() { - super( - new Image(Gerrit.RESOURCES.starOpen()), - new Image(Gerrit.RESOURCES.starFilled())); + super(new Image(Gerrit.RESOURCES.starOpen()), new Image(Gerrit.RESOURCES.starFilled())); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/SubmitAction.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/SubmitAction.java index ad1043ab41..69a7ca56db 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/SubmitAction.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/SubmitAction.java @@ -29,27 +29,28 @@ class SubmitAction { if (ChangeGlue.onSubmitChange(changeInfo, revisionInfo)) { final Change.Id changeId = changeInfo.legacyId(); ChangeApi.submit( - changeId.get(), revisionInfo.name(), - new GerritCallback() { - @Override - public void onSuccess(SubmitInfo result) { - redisplay(); - } - - @Override - public void onFailure(Throwable err) { - if (SubmitFailureDialog.isConflict(err)) { - new SubmitFailureDialog(err.getMessage()).center(); - } else { - super.onFailure(err); + changeId.get(), + revisionInfo.name(), + new GerritCallback() { + @Override + public void onSuccess(SubmitInfo result) { + redisplay(); } - redisplay(); - } - private void redisplay() { - Gerrit.display(PageLinks.toChange(changeId)); - } - }); + @Override + public void onFailure(Throwable err) { + if (SubmitFailureDialog.isConflict(err)) { + new SubmitFailureDialog(err.getMessage()).center(); + } else { + super.onFailure(err); + } + redisplay(); + } + + private void redisplay() { + Gerrit.display(PageLinks.toChange(changeId)); + } + }); } } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/SubmitFailureDialog.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/SubmitFailureDialog.java index c9ac2cb267..77bf217520 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/SubmitFailureDialog.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/SubmitFailureDialog.java @@ -21,8 +21,7 @@ import com.google.gwtjsonrpc.client.RemoteJsonException; class SubmitFailureDialog extends ErrorDialog { static boolean isConflict(Throwable err) { - return err instanceof RemoteJsonException - && 409 == ((RemoteJsonException) err).getCode(); + return err instanceof RemoteJsonException && 409 == ((RemoteJsonException) err).getCode(); } SubmitFailureDialog(String msg) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Topic.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Topic.java index a063b6ce55..f08414a685 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Topic.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Topic.java @@ -41,6 +41,7 @@ import com.google.gwtexpui.globalkey.client.NpTextBox; /** Displays (and edits) the change topic string. */ class Topic extends Composite { interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); private PatchSet.Id psId; @@ -58,21 +59,19 @@ class Topic extends Composite { Topic() { initWidget(uiBinder.createAndBindUi(this)); editIcon.addDomHandler( - new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - onEdit(); - } - }, - ClickEvent.getType()); + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + onEdit(); + } + }, + ClickEvent.getType()); } void set(ChangeInfo info, String revision) { canEdit = info.hasActions() && info.actions().containsKey("topic"); - psId = new PatchSet.Id( - info.legacyId(), - info.revisions().get(revision)._number()); + psId = new PatchSet.Id(info.legacyId(), info.revisions().get(revision)._number()); initTopicLink(info); editIcon.setVisible(canEdit); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/UpdateAvailableBar.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/UpdateAvailableBar.java index c14e628b8c..520dc69323 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/UpdateAvailableBar.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/UpdateAvailableBar.java @@ -24,7 +24,6 @@ import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HTMLPanel; - import java.sql.Timestamp; import java.util.HashSet; import java.util.List; @@ -32,6 +31,7 @@ import java.util.List; /** Displays the "New Message From ..." panel in bottom right on updates. */ abstract class UpdateAvailableBar extends Composite { interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); private Timestamp updated; @@ -72,5 +72,6 @@ abstract class UpdateAvailableBar extends Composite { } abstract void onShow(); + abstract void onIgnore(Timestamp newTime); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/UpdateCheckTimer.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/UpdateCheckTimer.java index b1c97612e1..4a5af0551d 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/UpdateCheckTimer.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/UpdateCheckTimer.java @@ -25,8 +25,7 @@ import com.google.gwt.user.client.rpc.AsyncCallback; class UpdateCheckTimer extends Timer implements ValueChangeHandler { private static final int MAX_PERIOD = 3 * 60 * 1000; private static final int IDLE_PERIOD = 2 * 3600 * 1000; - private static final int POLL_PERIOD = - Gerrit.info().change().updateDelay() * 1000; + private static final int POLL_PERIOD = Gerrit.info().change().updateDelay() * 1000; private final ChangeScreen screen; private int delay; @@ -52,34 +51,34 @@ class UpdateCheckTimer extends Timer implements ValueChangeHandler { } running = true; - screen.loadChangeInfo(false, new AsyncCallback() { - @Override - public void onSuccess(ChangeInfo info) { - running = false; - screen.showUpdates(info); + screen.loadChangeInfo( + false, + new AsyncCallback() { + @Override + public void onSuccess(ChangeInfo info) { + running = false; + screen.showUpdates(info); - int d = UserActivityMonitor.isActive() - ? POLL_PERIOD - : IDLE_PERIOD; - if (d != delay) { - delay = d; - schedule(); - } - } + int d = UserActivityMonitor.isActive() ? POLL_PERIOD : IDLE_PERIOD; + if (d != delay) { + delay = d; + schedule(); + } + } - @Override - public void onFailure(Throwable caught) { - // On failures increase the delay time and try again, - // but place an upper bound on the delay. - running = false; - delay = (int) Math.max( - delay * (1.5 + Math.random()), - UserActivityMonitor.isActive() - ? MAX_PERIOD - : IDLE_PERIOD + MAX_PERIOD); - schedule(); - } - }); + @Override + public void onFailure(Throwable caught) { + // On failures increase the delay time and try again, + // but place an upper bound on the delay. + running = false; + delay = + (int) + Math.max( + delay * (1.5 + Math.random()), + UserActivityMonitor.isActive() ? MAX_PERIOD : IDLE_PERIOD + MAX_PERIOD); + schedule(); + } + }); } @Override diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/VotableInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/VotableInfo.java index 056c9a2145..33d8d12c0c 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/VotableInfo.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/VotableInfo.java @@ -35,4 +35,3 @@ class VotableInfo { return s; } } - diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/AccountDashboardScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/AccountDashboardScreen.java index fb66570a31..f37cbc2dde 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/AccountDashboardScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/AccountDashboardScreen.java @@ -27,7 +27,6 @@ import com.google.gerrit.reviewdb.client.Account; import com.google.gwt.core.client.JsArray; import com.google.gwt.event.dom.client.KeyPressEvent; import com.google.gwtexpui.globalkey.client.KeyCommand; - import java.util.Collections; import java.util.Comparator; import java.util.EnumSet; @@ -37,6 +36,7 @@ public class AccountDashboardScreen extends Screen implements ChangeListScreen { // If changing default options, also update in // ChangeIT#defaultSearchDoesNotTouchDatabase(). private static final Set MY_DASHBOARD_OPTIONS; + static { EnumSet options = EnumSet.copyOf(ChangeTable.OPTIONS); options.add(ListChangesOption.REVIEWED); @@ -58,16 +58,18 @@ public class AccountDashboardScreen extends Screen implements ChangeListScreen { @Override protected void onInitUI() { super.onInitUI(); - table = new ChangeTable() { - { - keysNavigation.add(new KeyCommand(0, 'R', Util.C.keyReloadSearch()) { - @Override - public void onKeyPress(final KeyPressEvent event) { - Gerrit.display(getToken()); + table = + new ChangeTable() { + { + keysNavigation.add( + new KeyCommand(0, 'R', Util.C.keyReloadSearch()) { + @Override + public void onKeyPress(final KeyPressEvent event) { + Gerrit.display(getToken()); + } + }); } - }); - } - }; + }; table.addStyleName(Gerrit.RESOURCES.css().accountDashboard()); outgoing = new ChangeTable.Section(); @@ -75,13 +77,13 @@ public class AccountDashboardScreen extends Screen implements ChangeListScreen { closed = new ChangeTable.Section(); String who = mine ? "self" : ownerId.toString(); - outgoing.setTitleWidget(new InlineHyperlink(Util.C.outgoingReviews(), - PageLinks.toChangeQuery(queryOutgoing(who)))); - incoming.setTitleWidget(new InlineHyperlink(Util.C.incomingReviews(), - PageLinks.toChangeQuery(queryIncoming(who)))); + outgoing.setTitleWidget( + new InlineHyperlink(Util.C.outgoingReviews(), PageLinks.toChangeQuery(queryOutgoing(who)))); + incoming.setTitleWidget( + new InlineHyperlink(Util.C.incomingReviews(), PageLinks.toChangeQuery(queryIncoming(who)))); incoming.setHighlightUnreviewed(mine); - closed.setTitleWidget(new InlineHyperlink(Util.C.recentlyClosed(), - PageLinks.toChangeQuery(queryClosed(who)))); + closed.setTitleWidget( + new InlineHyperlink(Util.C.recentlyClosed(), PageLinks.toChangeQuery(queryClosed(who)))); table.addSection(outgoing); table.addSection(incoming); @@ -95,13 +97,17 @@ public class AccountDashboardScreen extends Screen implements ChangeListScreen { } private static String queryIncoming(String who) { - return "is:open ((reviewer:" + who + " -owner:" + who - + " -star:ignore) OR assignee:" + who + ")"; + return "is:open ((reviewer:" + + who + + " -owner:" + + who + + " -star:ignore) OR assignee:" + + who + + ")"; } private static String queryClosed(String who) { - return "is:closed (owner:" + who + " OR reviewer:" + who + " OR assignee:" - + who + ")"; + return "is:closed (owner:" + who + " OR reviewer:" + who + " OR assignee:" + who + ")"; } @Override diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeApi.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeApi.java index 84c240375b..f8a9ba15de 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeApi.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeApi.java @@ -28,10 +28,7 @@ import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.user.client.rpc.AsyncCallback; -/** - * A collection of static methods which work on the Gerrit REST API for specific - * changes. - */ +/** A collection of static methods which work on the Gerrit REST API for specific changes. */ public class ChangeApi { /** Abandon the change, ending its review. */ public static void abandon(int id, String msg, AsyncCallback cb) { @@ -43,13 +40,17 @@ public class ChangeApi { /** * Create a new change. * - * The new change is created as DRAFT unless the draft workflow is disabled by - * `change.allowDrafts = false` in the configuration, in which case the new - * change is created as NEW. - * + *

The new change is created as DRAFT unless the draft workflow is disabled by + * `change.allowDrafts = false` in the configuration, in which case the new change is created as + * NEW. */ - public static void createChange(String project, String branch, String topic, - String subject, String base, AsyncCallback cb) { + public static void createChange( + String project, + String branch, + String topic, + String subject, + String base, + AsyncCallback cb) { CreateChangeInput input = CreateChangeInput.create(); input.project(emptyToNull(project)); input.branch(emptyToNull(branch)); @@ -100,11 +101,7 @@ public class ChangeApi { } public static RestApi blame(PatchSet.Id id, String path, boolean base) { - return revision(id) - .view("files") - .id(path) - .view("blame") - .addParameter("base", base); + return revision(id).view("files").id(path).view("blame").addParameter("base", base); } public static RestApi actions(int id, String revision) { @@ -118,8 +115,7 @@ public class ChangeApi { change(id).view("assignee").delete(cb); } - public static void setAssignee(int id, String user, - AsyncCallback cb) { + public static void setAssignee(int id, String user, AsyncCallback cb) { AssigneeInput input = AssigneeInput.create(); input.assignee(user); change(id).view("assignee").put(input, cb); @@ -171,9 +167,7 @@ public class ChangeApi { } public static RestApi suggestReviewers(int id, String q, int n, boolean e) { - RestApi api = change(id).view("suggest_reviewers") - .addParameter("n", n) - .addParameter("e", e); + RestApi api = change(id).view("suggest_reviewers").addParameter("n", n).addParameter("e", e); if (q != null) { api.addParameter("q", q); } @@ -201,8 +195,8 @@ public class ChangeApi { } /** Submit a specific revision of a change. */ - public static void cherrypick(int id, String commit, String destination, - String message, AsyncCallback cb) { + public static void cherrypick( + int id, String commit, String destination, String message, AsyncCallback cb) { CherryPickInput cherryPickInput = CherryPickInput.create(); cherryPickInput.setMessage(message); cherryPickInput.setDestination(destination); @@ -210,23 +204,21 @@ public class ChangeApi { } /** Edit commit message for specific revision of a change. */ - public static void message(int id, String commit, String message, - AsyncCallback cb) { + public static void message( + int id, String commit, String message, AsyncCallback cb) { CherryPickInput input = CherryPickInput.create(); input.setMessage(message); call(id, commit, "message").post(input, cb); } /** Submit a specific revision of a change. */ - public static void submit(int id, String commit, - AsyncCallback cb) { + public static void submit(int id, String commit, AsyncCallback cb) { JavaScriptObject in = JavaScriptObject.createObject(); call(id, commit, "submit").post(in, cb); } /** Publish a specific revision of a draft change. */ - public static void publish(int id, String commit, - AsyncCallback cb) { + public static void publish(int id, String commit, AsyncCallback cb) { JavaScriptObject in = JavaScriptObject.createObject(); call(id, commit, "publish").post(in, cb); } @@ -237,8 +229,7 @@ public class ChangeApi { } /** Delete a specific draft patch set. */ - public static void deleteRevision(int id, String commit, - AsyncCallback cb) { + public static void deleteRevision(int id, String commit, AsyncCallback cb) { revision(id, commit).delete(cb); } @@ -260,8 +251,7 @@ public class ChangeApi { } /** Rebase a revision onto the branch tip or another change. */ - public static void rebase(int id, String commit, String base, - AsyncCallback cb) { + public static void rebase(int id, String commit, String base, AsyncCallback cb) { RebaseInput rebaseInput = RebaseInput.create(); rebaseInput.setBase(base); call(id, commit, "rebase").post(rebaseInput, cb); @@ -274,8 +264,7 @@ public class ChangeApi { return (MessageInput) createObject(); } - protected MessageInput() { - } + protected MessageInput() {} } private static class AssigneeInput extends JavaScriptObject { @@ -285,8 +274,7 @@ public class ChangeApi { return (AssigneeInput) createObject(); } - protected AssigneeInput() { - } + protected AssigneeInput() {} } private static class TopicInput extends JavaScriptObject { @@ -296,8 +284,7 @@ public class ChangeApi { return (TopicInput) createObject(); } - protected TopicInput() { - } + protected TopicInput() {} } private static class CreateChangeInput extends JavaScriptObject { @@ -306,15 +293,18 @@ public class ChangeApi { } public final native void branch(String b) /*-{ if(b)this.branch=b; }-*/; - public final native void topic(String t) /*-{ if(t)this.topic=t; }-*/; - public final native void project(String p) /*-{ if(p)this.project=p; }-*/; - public final native void subject(String s) /*-{ if(s)this.subject=s; }-*/; - public final native void status(String s) /*-{ if(s)this.status=s; }-*/; - public final native void baseChange( - String b) /*-{ if(b)this.base_change=b; }-*/; - protected CreateChangeInput() { - } + public final native void topic(String t) /*-{ if(t)this.topic=t; }-*/; + + public final native void project(String p) /*-{ if(p)this.project=p; }-*/; + + public final native void subject(String s) /*-{ if(s)this.subject=s; }-*/; + + public final native void status(String s) /*-{ if(s)this.status=s; }-*/; + + public final native void baseChange(String b) /*-{ if(b)this.base_change=b; }-*/; + + protected CreateChangeInput() {} } private static class CherryPickInput extends JavaScriptObject { @@ -326,8 +316,7 @@ public class ChangeApi { final native void setMessage(String m) /*-{ this.message = m; }-*/; - protected CherryPickInput() { - } + protected CherryPickInput() {} } private static class RebaseInput extends JavaScriptObject { @@ -337,8 +326,7 @@ public class ChangeApi { return (RebaseInput) createObject(); } - protected RebaseInput() { - } + protected RebaseInput() {} } private static RestApi call(int id, String action) { @@ -358,11 +346,7 @@ public class ChangeApi { return str == null || str.isEmpty() ? null : str; } - public static void commitWithLinks(int changeId, String revision, - Callback callback) { - revision(changeId, revision) - .view("commit") - .addParameterTrue("links") - .get(callback); + public static void commitWithLinks(int changeId, String revision, Callback callback) { + revision(changeId, revision).view("commit").addParameterTrue("links").get(callback); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.java index 1c3026cf19..ae64ac0469 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.java @@ -18,90 +18,145 @@ import com.google.gwt.i18n.client.Constants; public interface ChangeConstants extends Constants { String statusLongNew(); + String statusLongMerged(); + String statusLongAbandoned(); + String statusLongDraft(); + String submittable(); + String readyToSubmit(); + String mergeConflict(); + String notCurrent(); + String changeEdit(); String myDashboardTitle(); + String unknownDashboardTitle(); + String incomingReviews(); + String outgoingReviews(); + String recentlyClosed(); String changeTableColumnSubject(); + String changeTableColumnSize(); + String changeTableColumnStatus(); + String changeTableColumnOwner(); + String changeTableColumnAssignee(); + String changeTableColumnProject(); + String changeTableColumnBranch(); + String changeTableColumnLastUpdate(); + String changeTableColumnID(); + String changeTableNone(); + String changeTableNotMergeable(); String changeItemHelp(); + String changeTableStar(); + String changeTablePagePrev(); + String changeTablePageNext(); + String upToChangeList(); + String keyReloadChange(); + String keyNextPatchSet(); + String keyPreviousPatchSet(); + String keyReloadSearch(); + String keyPublishComments(); + String keyEditTopic(); + String keyAddReviewers(); + String keyExpandAllMessages(); + String keyCollapseAllMessages(); String patchTableColumnName(); + String patchTableColumnComments(); + String patchTableColumnSize(); + String commitMessage(); + String mergeList(); String patchTablePrev(); + String patchTableNext(); + String patchTableOpenDiff(); String approvalTableEditAssigneeHint(); String approvalTableAddReviewerHint(); + String approvalTableAddManyReviewersConfirmationDialogTitle(); String changeInfoBlockUploaded(); + String changeInfoBlockUpdated(); String messageNoAuthor(); String sideBySide(); + String unifiedDiff(); String buttonRevertChangeSend(); + String headingRevertMessage(); + String revertChangeTitle(); String buttonCherryPickChangeSend(); + String headingCherryPickBranch(); + String cherryPickCommitMessage(); + String cherryPickTitle(); String buttonRebaseChangeSend(); + String rebaseConfirmMessage(); + String rebaseNotPossibleMessage(); + String rebasePlaceholderMessage(); + String rebaseTitle(); String baseDiffItem(); + String autoMerge(); String pagedChangeListPrev(); + String pagedChangeListNext(); String submitFailed(); @@ -109,7 +164,10 @@ public interface ChangeConstants extends Constants { String votable(); String pushCertMissing(); + String pushCertBad(); + String pushCertOk(); + String pushCertTrusted(); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeEditApi.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeEditApi.java index f86ddf762d..0a7fd084a2 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeEditApi.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeEditApi.java @@ -28,8 +28,7 @@ import com.google.gwt.user.client.rpc.AsyncCallback; /** REST API helpers to remotely edit a change. */ public class ChangeEditApi { /** Get file (or commit message) contents. */ - public static void get(PatchSet.Id id, String path, boolean base, - HttpCallback cb) { + public static void get(PatchSet.Id id, String path, boolean base, HttpCallback cb) { RestApi api; if (id.get() != 0) { // Read from a published revision, when change edit doesn't @@ -44,14 +43,12 @@ public class ChangeEditApi { } /** Get file (or commit message) contents of the edit. */ - public static void get(PatchSet.Id id, String path, - HttpCallback cb) { + public static void get(PatchSet.Id id, String path, HttpCallback cb) { get(id, path, false, cb); } /** Get meta info for change edit. */ - public static void getMeta(PatchSet.Id id, String path, - AsyncCallback cb) { + public static void getMeta(PatchSet.Id id, String path, AsyncCallback cb) { if (id.get() != 0) { throw new IllegalStateException("only supported for edits"); } @@ -64,8 +61,7 @@ public class ChangeEditApi { } /** Put contents into a file or commit message in a change edit. */ - public static void put(int id, String path, String content, - GerritCallback cb) { + public static void put(int id, String path, String content, GerritCallback cb) { if (Patch.COMMIT_MSG.equals(path)) { putMessage(id, content, cb); } else { @@ -79,8 +75,7 @@ public class ChangeEditApi { } /** Rename a file in the pending edit. */ - public static void rename(int id, String path, String newPath, - AsyncCallback cb) { + public static void rename(int id, String path, String newPath, AsyncCallback cb) { Input in = Input.create(); in.oldPath(path); in.newPath(newPath); @@ -108,10 +103,11 @@ public class ChangeEditApi { } final native void restorePath(String p) /*-{ this.restore_path=p }-*/; + final native void oldPath(String p) /*-{ this.old_path=p }-*/; + final native void newPath(String p) /*-{ this.new_path=p }-*/; - protected Input() { - } + protected Input() {} } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeList.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeList.java index cea914277a..5d525b663a 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeList.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeList.java @@ -20,7 +20,6 @@ import com.google.gerrit.extensions.client.ListChangesOption; import com.google.gwt.core.client.JsArray; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwtorm.client.KeyUtil; - import java.util.Set; /** List of changes available from {@code /changes/}. */ @@ -43,34 +42,36 @@ public class ChangeList extends JsArray { if (queries.length == 1) { // Server unwraps a single query, so wrap it back in an array for the // callback. - call.get(new AsyncCallback() { - @Override - public void onSuccess(ChangeList result) { - JsArray wrapped = JsArray.createArray(1).cast(); - wrapped.set(0, result); - callback.onSuccess(wrapped); - } + call.get( + new AsyncCallback() { + @Override + public void onSuccess(ChangeList result) { + JsArray wrapped = JsArray.createArray(1).cast(); + wrapped.set(0, result); + callback.onSuccess(wrapped); + } - @Override - public void onFailure(Throwable caught) { - callback.onFailure(caught); - } - }); + @Override + public void onFailure(Throwable caught) { + callback.onFailure(caught); + } + }); } else { call.get(callback); } } - public static void query(String query, - Set options, - AsyncCallback callback) { + public static void query( + String query, Set options, AsyncCallback callback) { query(query, options, callback, 0, 0); } - public static void query(String query, + public static void query( + String query, Set options, AsyncCallback callback, - int start, int limit) { + int start, + int limit) { RestApi call = newQuery(query); if (limit > 0) { call.addParameter("n", limit); @@ -95,6 +96,5 @@ public class ChangeList extends JsArray { return call; } - protected ChangeList() { - } + protected ChangeList() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeListScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeListScreen.java index 8871ee07b6..ed5a6f22cd 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeListScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeListScreen.java @@ -14,5 +14,4 @@ package com.google.gerrit.client.changes; -public interface ChangeListScreen { -} +public interface ChangeListScreen {} diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeMessages.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeMessages.java index b192bd5994..c64fe912ad 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeMessages.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeMessages.java @@ -22,23 +22,33 @@ public interface ChangeMessages extends Messages { String revertChangeDefaultMessage(String commitMsg, String commitId); String cherryPickedChangeDefaultMessage(String commitMsg, String commitId); + String changeScreenTitleId(String changeId); + String loadingPatchSet(int id); String patchTableSize_Modify(int insertions, int deletions); - String patchTableSize_ModifyBinaryFiles(String bytesInserted, - String bytesDeleted); - String patchTableSize_ModifyBinaryFilesWithPercentages(String bytesInserted, - String percentageInserted, String bytesDeleted, String percentageDeleted); + + String patchTableSize_ModifyBinaryFiles(String bytesInserted, String bytesDeleted); + + String patchTableSize_ModifyBinaryFilesWithPercentages( + String bytesInserted, + String percentageInserted, + String bytesDeleted, + String percentageDeleted); + String patchTableSize_LongModify(int insertions, int deletions); String removeReviewer(String fullName); + String removeVote(String label); String blockedOn(String labelName); + String needs(String labelName); String changeQueryWindowTitle(String query); + String changeQueryPageTitle(String query); String insertionsAndDeletions(int insertions, int deletions); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeTable.java index 86b2a828f6..ab41ad62ba 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeTable.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeTable.java @@ -44,7 +44,6 @@ import com.google.gwt.user.client.ui.InlineLabel; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.UIObject; import com.google.gwt.user.client.ui.Widget; - import java.util.ArrayList; import java.util.Collections; import java.util.EnumSet; @@ -56,8 +55,8 @@ public class ChangeTable extends NavigationTable { // If changing default options, also update in // ChangeIT#defaultSearchDoesNotTouchDatabase(). static final Set OPTIONS = - Collections.unmodifiableSet(EnumSet.of( - ListChangesOption.LABELS, ListChangesOption.DETAILED_ACCOUNTS)); + Collections.unmodifiableSet( + EnumSet.of(ListChangesOption.LABELS, ListChangesOption.DETAILED_ACCOUNTS)); private static final int C_STAR = 1; private static final int C_ID = 2; @@ -112,24 +111,25 @@ public class ChangeTable extends NavigationTable { fmt.addStyleName(0, C_ASSIGNEE, Gerrit.RESOURCES.css().dataHeaderHidden()); } - table.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - final Cell cell = table.getCellForEvent(event); - if (cell == null) { - return; - } - if (cell.getCellIndex() == C_STAR) { - // Don't do anything (handled by star itself). - } else if (cell.getCellIndex() == C_STATUS) { - // Don't do anything. - } else if (cell.getCellIndex() == C_OWNER) { - // Don't do anything. - } else if (getRowItem(cell.getRowIndex()) != null) { - movePointerTo(cell.getRowIndex()); - } - } - }); + table.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + final Cell cell = table.getCellForEvent(event); + if (cell == null) { + return; + } + if (cell.getCellIndex() == C_STAR) { + // Don't do anything (handled by star itself). + } else if (cell.getCellIndex() == C_STATUS) { + // Don't do anything. + } else if (cell.getCellIndex() == C_OWNER) { + // Don't do anything. + } else if (getRowItem(cell.getRowIndex()) != null) { + movePointerTo(cell.getRowIndex()); + } + } + }); } @Override @@ -171,8 +171,11 @@ public class ChangeTable extends NavigationTable { fmt.addStyleName(row, C_SUBJECT, Gerrit.RESOURCES.css().cSUBJECT()); fmt.addStyleName(row, C_STATUS, Gerrit.RESOURCES.css().cSTATUS()); fmt.addStyleName(row, C_OWNER, Gerrit.RESOURCES.css().cOWNER()); - fmt.addStyleName(row, C_ASSIGNEE, - showAssignee ? Gerrit.RESOURCES.css().cASSIGNEE() + fmt.addStyleName( + row, + C_ASSIGNEE, + showAssignee + ? Gerrit.RESOURCES.css().cASSIGNEE() : Gerrit.RESOURCES.css().dataCellHidden()); fmt.addStyleName(row, C_LAST_UPDATE, Gerrit.RESOURCES.css().cLastUpdate()); fmt.addStyleName(row, C_SIZE, Gerrit.RESOURCES.css().cSIZE()); @@ -222,13 +225,10 @@ public class ChangeTable extends NavigationTable { } } - private void populateChangeRow(final int row, final ChangeInfo c, - boolean highlightUnreviewed) { + private void populateChangeRow(final int row, final ChangeInfo c, boolean highlightUnreviewed) { CellFormatter fmt = table.getCellFormatter(); if (Gerrit.isSignedIn()) { - table.setWidget(row, C_STAR, StarredChanges.createIcon( - c.legacyId(), - c.starred())); + table.setWidget(row, C_STAR, StarredChanges.createIcon(c.legacyId(), c.starred())); } table.setWidget(row, C_ID, new TableChangeLink(String.valueOf(c.legacyId()), c)); @@ -243,21 +243,17 @@ public class ChangeTable extends NavigationTable { } if (c.owner() != null) { - table.setWidget(row, C_OWNER, - AccountLinkPanel.withStatus(c.owner(), status)); + table.setWidget(row, C_OWNER, AccountLinkPanel.withStatus(c.owner(), status)); } else { table.setText(row, C_OWNER, ""); } if (showAssignee) { if (c.assignee() != null) { - table.setWidget(row, C_ASSIGNEE, - AccountLinkPanel.forAssignee(c.assignee())); + table.setWidget(row, C_ASSIGNEE, AccountLinkPanel.forAssignee(c.assignee())); if (Gerrit.getUserPreferences().highlightAssigneeInChangeTable() - && Objects.equals(c.assignee().getId(), - Gerrit.getUserAccount().getId())) { - table.getRowFormatter().addStyleName(row, - Gerrit.RESOURCES.css().cASSIGNEDTOME()); + && Objects.equals(c.assignee().getId(), Gerrit.getUserAccount().getId())) { + table.getRowFormatter().addStyleName(row, Gerrit.RESOURCES.css().cASSIGNEDTOME()); } } else { table.setText(row, C_ASSIGNEE, ""); @@ -265,9 +261,8 @@ public class ChangeTable extends NavigationTable { } table.setWidget(row, C_PROJECT, new ProjectLink(c.projectNameKey())); - table.setWidget(row, C_BRANCH, - new BranchLink(c.projectNameKey(), c - .status(), c.branch(), c.topic())); + table.setWidget( + row, C_BRANCH, new BranchLink(c.projectNameKey(), c.status(), c.branch(), c.topic())); if (Gerrit.getUserPreferences().relativeDateInChangeTable()) { table.setText(row, C_LAST_UPDATE, relativeFormat(c.updated())); } else { @@ -276,12 +271,11 @@ public class ChangeTable extends NavigationTable { int col = C_SIZE; if (!Gerrit.getUserPreferences().sizeBarInChangeTable()) { - table.setText(row, col, - Util.M.insertionsAndDeletions(c.insertions(), c.deletions())); + table.setText(row, col, Util.M.insertionsAndDeletions(c.insertions(), c.deletions())); } else { table.setWidget(row, col, getSizeWidget(c)); - fmt.getElement(row, col).setTitle( - Util.M.insertionsAndDeletions(c.insertions(), c.deletions())); + fmt.getElement(row, col) + .setTitle(Util.M.insertionsAndDeletions(c.insertions(), c.deletions())); } col++; @@ -301,8 +295,7 @@ public class ChangeTable extends NavigationTable { Gerrit.getUserPreferences().reviewCategoryStrategy(); if (label.rejected() != null) { user = label.rejected().name(); - info = getReviewCategoryDisplayInfo(reviewCategoryStrategy, - label.rejected()); + info = getReviewCategoryDisplayInfo(reviewCategoryStrategy, label.rejected()); if (info != null) { FlowPanel panel = new FlowPanel(); panel.add(new Image(Gerrit.RESOURCES.redNot())); @@ -313,8 +306,7 @@ public class ChangeTable extends NavigationTable { } } else if (label.approved() != null) { user = label.approved().name(); - info = getReviewCategoryDisplayInfo(reviewCategoryStrategy, - label.approved()); + info = getReviewCategoryDisplayInfo(reviewCategoryStrategy, label.approved()); if (info != null) { FlowPanel panel = new FlowPanel(); panel.add(new Image(Gerrit.RESOURCES.greenCheck())); @@ -325,8 +317,7 @@ public class ChangeTable extends NavigationTable { } } else if (label.disliked() != null) { user = label.disliked().name(); - info = getReviewCategoryDisplayInfo(reviewCategoryStrategy, - label.disliked()); + info = getReviewCategoryDisplayInfo(reviewCategoryStrategy, label.disliked()); String vstr = String.valueOf(label._value()); if (info != null) { vstr = vstr + " " + info; @@ -335,8 +326,7 @@ public class ChangeTable extends NavigationTable { table.setText(row, col, vstr); } else if (label.recommended() != null) { user = label.recommended().name(); - info = getReviewCategoryDisplayInfo(reviewCategoryStrategy, - label.recommended()); + info = getReviewCategoryDisplayInfo(reviewCategoryStrategy, label.recommended()); String vstr = "+" + label._value(); if (info != null) { vstr = vstr + " " + info; @@ -361,8 +351,7 @@ public class ChangeTable extends NavigationTable { needHighlight = true; } final Element tr = fmt.getElement(row, 0).getParentElement(); - UIObject.setStyleName(tr, Gerrit.RESOURCES.css().needsReview(), - needHighlight); + UIObject.setStyleName(tr, Gerrit.RESOURCES.css().needsReview(), needHighlight); setRowItem(row, c); } @@ -551,8 +540,7 @@ public class ChangeTable extends NavigationTable { rows++; } for (int i = 0; i < sz; i++) { - parent.populateChangeRow(dataBegin + i, changeList.get(i), - highlightUnreviewed); + parent.populateChangeRow(dataBegin + i, changeList.get(i), highlightUnreviewed); } } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/CommentApi.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/CommentApi.java index 66cd485035..0950fa584b 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/CommentApi.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/CommentApi.java @@ -23,38 +23,34 @@ import com.google.gwt.user.client.rpc.AsyncCallback; public class CommentApi { - public static void comments(PatchSet.Id id, - AsyncCallback>> cb) { + public static void comments(PatchSet.Id id, AsyncCallback>> cb) { revision(id, "comments").get(cb); } - public static void comment(PatchSet.Id id, String commentId, - AsyncCallback cb) { + public static void comment(PatchSet.Id id, String commentId, AsyncCallback cb) { revision(id, "comments").id(commentId).get(cb); } - public static void drafts(PatchSet.Id id, - AsyncCallback>> cb) { + public static void drafts(PatchSet.Id id, AsyncCallback>> cb) { revision(id, "drafts").get(cb); } - public static void draft(PatchSet.Id id, String draftId, - AsyncCallback cb) { + public static void draft(PatchSet.Id id, String draftId, AsyncCallback cb) { revision(id, "drafts").id(draftId).get(cb); } - public static void createDraft(PatchSet.Id id, CommentInfo content, - AsyncCallback cb) { + public static void createDraft( + PatchSet.Id id, CommentInfo content, AsyncCallback cb) { revision(id, "drafts").put(content, cb); } - public static void updateDraft(PatchSet.Id id, String draftId, - CommentInfo content, AsyncCallback cb) { + public static void updateDraft( + PatchSet.Id id, String draftId, CommentInfo content, AsyncCallback cb) { revision(id, "drafts").id(draftId).put(content, cb); } - public static void deleteDraft(PatchSet.Id id, String draftId, - AsyncCallback cb) { + public static void deleteDraft( + PatchSet.Id id, String draftId, AsyncCallback cb) { revision(id, "drafts").id(draftId).delete(cb); } @@ -62,6 +58,5 @@ public class CommentApi { return ChangeApi.revision(id).view(type); } - private CommentApi() { - } + private CommentApi() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/CommentInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/CommentInfo.java index 2800b0b802..a11186091a 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/CommentInfo.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/CommentInfo.java @@ -19,17 +19,16 @@ import com.google.gerrit.client.info.AccountInfo; import com.google.gerrit.extensions.client.Side; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwtjsonrpc.client.impl.ser.JavaSqlTimestamp_JsonSerializer; - import java.sql.Timestamp; public class CommentInfo extends JavaScriptObject { - public static CommentInfo create(String path, Side side, - int line, CommentRange range, Boolean unresolved) { + public static CommentInfo create( + String path, Side side, int line, CommentRange range, Boolean unresolved) { return create(path, side, 0, line, range, unresolved); } - public static CommentInfo create(String path, Side side, int parent, - int line, CommentRange range, boolean unresolved) { + public static CommentInfo create( + String path, Side side, int parent, int line, CommentRange range, boolean unresolved) { CommentInfo n = createObject().cast(); n.path(path); n.side(side); @@ -79,33 +78,46 @@ public class CommentInfo extends JavaScriptObject { } public final native void path(String p) /*-{ this.path = p }-*/; + public final native void id(String i) /*-{ this.id = i }-*/; + public final native void line(int n) /*-{ this.line = n }-*/; + public final native void range(CommentRange r) /*-{ this.range = r }-*/; + public final native void inReplyTo(String i) /*-{ this.in_reply_to = i }-*/; + public final native void message(String m) /*-{ this.message = m }-*/; + public final native void unresolved(boolean b) /*-{ this.unresolved = b }-*/; public final void side(Side side) { sideRaw(side.toString()); } + private native void sideRaw(String s) /*-{ this.side = s }-*/; + public final native void parent(int n) /*-{ this.parent = n }-*/; + public final native boolean hasParent() /*-{ return this.hasOwnProperty('parent') }-*/; public final native String path() /*-{ return this.path }-*/; + public final native String id() /*-{ return this.id }-*/; + public final native String inReplyTo() /*-{ return this.in_reply_to }-*/; + public final native int patchSet() /*-{ return this.patch_set }-*/; + public final native boolean unresolved() /*-{ return this.unresolved }-*/; public final Side side() { String s = sideRaw(); - return s != null - ? Side.valueOf(s) - : Side.REVISION; + return s != null ? Side.valueOf(s) : Side.REVISION; } + private native String sideRaw() /*-{ return this.side }-*/; + public final native int parent() /*-{ return this.parent }-*/; public final Timestamp updated() { @@ -119,17 +131,24 @@ public class CommentInfo extends JavaScriptObject { } return r; } + private native String updatedRaw() /*-{ return this.updated }-*/; + private native Timestamp updatedTimestamp() /*-{ return this._ts }-*/; + private native void updatedTimestamp(Timestamp t) /*-{ this._ts = t }-*/; public final native AccountInfo author() /*-{ return this.author }-*/; + public final native int line() /*-{ return this.line || 0 }-*/; + public final native boolean hasLine() /*-{ return this.hasOwnProperty('line') }-*/; + public final native boolean hasRange() /*-{ return this.hasOwnProperty('range') }-*/; + public final native CommentRange range() /*-{ return this.range }-*/; + public final native String message() /*-{ return this.message }-*/; - protected CommentInfo() { - } + protected CommentInfo() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/CustomDashboardScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/CustomDashboardScreen.java index 320976e128..802e56cb79 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/CustomDashboardScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/CustomDashboardScreen.java @@ -26,13 +26,14 @@ public class CustomDashboardScreen extends Screen implements ChangeListScreen { @Override protected void onInitUI() { - table = new DashboardTable(this, params) { - @Override - public void finishDisplay() { - super.finishDisplay(); - display(); - } - }; + table = + new DashboardTable(this, params) { + @Override + public void finishDisplay() { + super.finishDisplay(); + display(); + } + }; super.onInitUI(); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/DashboardTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/DashboardTable.java index 26e11ae405..3cfe63d933 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/DashboardTable.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/DashboardTable.java @@ -24,7 +24,6 @@ import com.google.gwt.core.client.JsArray; import com.google.gwt.event.dom.client.KeyPressEvent; import com.google.gwt.http.client.URL; import com.google.gwtexpui.globalkey.client.KeyCommand; - import java.util.ArrayList; import java.util.List; import java.util.ListIterator; @@ -74,20 +73,20 @@ public class DashboardTable extends ChangeTable { sections.add(s); } - keysNavigation.add(new KeyCommand(0, 'R', Util.C.keyReloadSearch()) { - @Override - public void onKeyPress(KeyPressEvent event) { - Gerrit.display(screen.getToken()); - } - }); + keysNavigation.add( + new KeyCommand(0, 'R', Util.C.keyReloadSearch()) { + @Override + public void onKeyPress(KeyPressEvent event) { + Gerrit.display(screen.getToken()); + } + }); } private String removeLimitAndAge(String query) { StringBuilder unlimitedQuery = new StringBuilder(); String[] operators = query.split(" "); for (String o : operators) { - if (!o.startsWith("limit:") - && !o.startsWith("age:") && !o.startsWith("-age:")) { + if (!o.startsWith("limit:") && !o.startsWith("age:") && !o.startsWith("-age:")) { unlimitedQuery.append(o).append(" "); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PagedSingleListScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PagedSingleListScreen.java index b7b9b07e7e..370d9425d2 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PagedSingleListScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PagedSingleListScreen.java @@ -50,24 +50,26 @@ public abstract class PagedSingleListScreen extends Screen { next = new Hyperlink(Util.C.pagedChangeListNext(), true, ""); next.setVisible(false); - table = new ChangeTable() { - { - keysNavigation.add( - new DoLinkCommand(0, 'p', Util.C.changeTablePagePrev(), prev), - new DoLinkCommand(0, 'n', Util.C.changeTablePageNext(), next)); + table = + new ChangeTable() { + { + keysNavigation.add( + new DoLinkCommand(0, 'p', Util.C.changeTablePagePrev(), prev), + new DoLinkCommand(0, 'n', Util.C.changeTablePageNext(), next)); - keysNavigation.add( - new DoLinkCommand(0, '[', Util.C.changeTablePagePrev(), prev), - new DoLinkCommand(0, ']', Util.C.changeTablePageNext(), next)); + keysNavigation.add( + new DoLinkCommand(0, '[', Util.C.changeTablePagePrev(), prev), + new DoLinkCommand(0, ']', Util.C.changeTablePageNext(), next)); - keysNavigation.add(new KeyCommand(0, 'R', Util.C.keyReloadSearch()) { - @Override - public void onKeyPress(final KeyPressEvent event) { - Gerrit.display(getToken()); + keysNavigation.add( + new KeyCommand(0, 'R', Util.C.keyReloadSearch()) { + @Override + public void onKeyPress(final KeyPressEvent event) { + Gerrit.display(getToken()); + } + }); } - }); - } - }; + }; section = new ChangeTable.Section(); table.addSection(section); table.setSavePointerId(anchorPrefix); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ProjectDashboardScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ProjectDashboardScreen.java index d2eec274ce..12638d7805 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ProjectDashboardScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ProjectDashboardScreen.java @@ -32,13 +32,14 @@ public class ProjectDashboardScreen extends ProjectScreen implements ChangeListS @Override protected void onInitUI() { - table = new DashboardTable(this, params) { - @Override - public void finishDisplay() { - super.finishDisplay(); - display(); - } - }; + table = + new DashboardTable(this, params) { + @Override + public void finishDisplay() { + super.finishDisplay(); + display(); + } + }; super.onInitUI(); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/QueryScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/QueryScreen.java index 80117be837..696fe8b4ab 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/QueryScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/QueryScreen.java @@ -24,18 +24,15 @@ import com.google.gwt.regexp.shared.RegExp; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwtorm.client.KeyUtil; -public class QueryScreen extends PagedSingleListScreen implements - ChangeListScreen { +public class QueryScreen extends PagedSingleListScreen implements ChangeListScreen { // Legacy numeric identifier. private static final RegExp NUMERIC_ID = RegExp.compile("^[1-9][0-9]*$"); // Commit SHA1 hash - private static final RegExp COMMIT_SHA1 = - RegExp.compile("^([0-9a-fA-F]{4," + RevId.LEN + "})$"); + private static final RegExp COMMIT_SHA1 = RegExp.compile("^([0-9a-fA-F]{4," + RevId.LEN + "})$"); // Change-Id private static final String ID_PATTERN = "[iI][0-9a-f]{4,}$"; private static final RegExp CHANGE_ID = RegExp.compile("^" + ID_PATTERN); - private static final RegExp CHANGE_ID_TRIPLET = - RegExp.compile("^(.)+~(.)+~" + ID_PATTERN); + private static final RegExp CHANGE_ID_TRIPLET = RegExp.compile("^(.)+~(.)+~" + ID_PATTERN); public static QueryScreen forQuery(String query) { return forQuery(query, 0); @@ -87,8 +84,7 @@ public class QueryScreen extends PagedSingleListScreen implements @Override protected void onLoad() { super.onLoad(); - ChangeList.query( - query, ChangeTable.OPTIONS, loadCallback(), start, pageSize); + ChangeList.query(query, ChangeTable.OPTIONS, loadCallback(), start, pageSize); } private static boolean isSingleQuery(String query) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ReviewInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ReviewInfo.java index 3508c3d3d2..06d2484eba 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ReviewInfo.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ReviewInfo.java @@ -21,6 +21,5 @@ public class ReviewInfo extends JavaScriptObject { public final native NativeMap labels() /*-{ return this.labels }-*/; - protected ReviewInfo() { - } + protected ReviewInfo() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ReviewInput.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ReviewInput.java index a127e7f389..113651beca 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ReviewInput.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ReviewInput.java @@ -20,11 +20,17 @@ import com.google.gwt.core.client.JsArray; public class ReviewInput extends JavaScriptObject { public enum NotifyHandling { - NONE, OWNER, OWNER_REVIEWERS, ALL + NONE, + OWNER, + OWNER_REVIEWERS, + ALL } public enum DraftHandling { - DELETE, PUBLISH, KEEP, PUBLISH_ALL_REVISIONS + DELETE, + PUBLISH, + KEEP, + PUBLISH_ALL_REVISIONS } public static ReviewInput create() { @@ -35,18 +41,21 @@ public class ReviewInput extends JavaScriptObject { } public final native void message(String m) /*-{ if(m)this.message=m; }-*/; + public final native void label(String n, short v) /*-{ this.labels[n]=v; }-*/; - public final native void comments(NativeMap> m) - /*-{ this.comments=m }-*/; + + public final native void comments(NativeMap> m) /*-{ this.comments=m }-*/; public final void notify(NotifyHandling e) { _notify(e.name()); } + private native void _notify(String n) /*-{ this.notify=n; }-*/; public final void drafts(DraftHandling e) { _drafts(e.name()); } + private native void _drafts(String n) /*-{ this.drafts=n; }-*/; private native void init() /*-{ @@ -76,6 +85,5 @@ public class ReviewInput extends JavaScriptObject { } }-*/; - protected ReviewInput() { - } + protected ReviewInput() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/RevisionInfoCache.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/RevisionInfoCache.java index 48e3052d23..0b83119ae1 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/RevisionInfoCache.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/RevisionInfoCache.java @@ -17,7 +17,6 @@ package com.google.gerrit.client.changes; import com.google.gerrit.client.info.ChangeInfo.RevisionInfo; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.PatchSet; - import java.util.LinkedHashMap; import java.util.Map; @@ -27,9 +26,7 @@ public class RevisionInfoCache { private static final RevisionInfoCache IMPL = new RevisionInfoCache(); public static void add(Change.Id change, RevisionInfo info) { - IMPL.psToCommit.put( - new PatchSet.Id(change, info._number()), - info.name()); + IMPL.psToCommit.put(new PatchSet.Id(change, info._number()), info.name()); } static String get(PatchSet.Id id) { @@ -40,11 +37,12 @@ public class RevisionInfoCache { @SuppressWarnings("serial") private RevisionInfoCache() { - psToCommit = new LinkedHashMap(LIMIT) { - @Override - protected boolean removeEldestEntry(Map.Entry e) { - return size() > LIMIT; - } - }; + psToCommit = + new LinkedHashMap(LIMIT) { + @Override + protected boolean removeEldestEntry(Map.Entry e) { + return size() > LIMIT; + } + }; } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/StarredChanges.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/StarredChanges.java index 43b3b800f4..b4499acbf4 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/StarredChanges.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/StarredChanges.java @@ -28,7 +28,6 @@ import com.google.gwt.user.client.ui.Image; import com.google.gwtexpui.globalkey.client.KeyCommand; import com.google.web.bindery.event.shared.Event; import com.google.web.bindery.event.shared.HandlerRegistration; - import java.util.LinkedHashMap; import java.util.Map; @@ -66,8 +65,8 @@ public class StarredChanges { } /** - * Create a star icon for the given change, and current status. Returns null - * if the user is not signed in and cannot support starred changes. + * Create a star icon for the given change, and current status. Returns null if the user is not + * signed in and cannot support starred changes. */ public static Icon createIcon(Change.Id source, boolean starred) { return Gerrit.isSignedIn() ? new Icon(source, starred) : null; @@ -84,30 +83,23 @@ public class StarredChanges { } /** Add a handler to listen for starred status to change. */ - public static HandlerRegistration addHandler( - Change.Id source, - ChangeStarHandler handler) { + public static HandlerRegistration addHandler(Change.Id source, ChangeStarHandler handler) { return Gerrit.EVENT_BUS.addHandlerToSource(TYPE, source, handler); } /** - * Broadcast the current starred value of a change to UI widgets. This does - * not RPC to the server and does not alter the starred status of a change. + * Broadcast the current starred value of a change to UI widgets. This does not RPC to the server + * and does not alter the starred status of a change. */ public static void fireChangeStarEvent(Change.Id id, boolean starred) { - Gerrit.EVENT_BUS.fireEventFromSource( - new ChangeStarEvent(id, starred), - id); + Gerrit.EVENT_BUS.fireEventFromSource(new ChangeStarEvent(id, starred), id); } /** - * Set the starred status of a change. This method broadcasts to all - * interested UI widgets and sends an RPC to the server to record the - * updated status. + * Set the starred status of a change. This method broadcasts to all interested UI widgets and + * sends an RPC to the server to record the updated status. */ - public static void toggleStar( - final Change.Id changeId, - final boolean newValue) { + public static void toggleStar(final Change.Id changeId, final boolean newValue) { pending.put(changeId, newValue); fireChangeStarEvent(changeId, newValue); if (!busy) { @@ -116,8 +108,7 @@ public class StarredChanges { } private static boolean busy; - private static final Map pending = - new LinkedHashMap<>(4); + private static final Map pending = new LinkedHashMap<>(4); private static void startRequest() { busy = true; @@ -125,31 +116,32 @@ public class StarredChanges { final Change.Id id = pending.keySet().iterator().next(); final boolean starred = pending.remove(id); RestApi call = AccountApi.self().view("starred.changes").id(id.get()); - AsyncCallback cb = new AsyncCallback() { - @Override - public void onSuccess(JavaScriptObject none) { - if (pending.isEmpty()) { - busy = false; - } else { - startRequest(); - } - } + AsyncCallback cb = + new AsyncCallback() { + @Override + public void onSuccess(JavaScriptObject none) { + if (pending.isEmpty()) { + busy = false; + } else { + startRequest(); + } + } - @Override - public void onFailure(Throwable caught) { - if (!starred && RestApi.isStatus(caught, 404)) { - onSuccess(null); - return; - } + @Override + public void onFailure(Throwable caught) { + if (!starred && RestApi.isStatus(caught, 404)) { + onSuccess(null); + return; + } - fireChangeStarEvent(id, !starred); - for (Map.Entry e : pending.entrySet()) { - fireChangeStarEvent(e.getKey(), !e.getValue()); - } - pending.clear(); - busy = false; - } - }; + fireChangeStarEvent(id, !starred); + for (Map.Entry e : pending.entrySet()) { + fireChangeStarEvent(e.getKey(), !e.getValue()); + } + pending.clear(); + busy = false; + } + }; if (starred) { call.put(cb); } else { @@ -157,8 +149,7 @@ public class StarredChanges { } } - public static class Icon extends Image - implements ChangeStarHandler, ClickHandler { + public static class Icon extends Image implements ChangeStarHandler, ClickHandler { private final Change.Id changeId; private boolean starred; private HandlerRegistration handler; @@ -171,9 +162,9 @@ public class StarredChanges { } /** - * Toggles the state of the star, as if the user clicked on the image. This - * will broadcast the new star status to all interested UI widgets, and RPC - * to the server to store the changed value. + * Toggles the state of the star, as if the user clicked on the image. This will broadcast the + * new star status to all interested UI widgets, and RPC to the server to store the changed + * value. */ public void toggleStar() { StarredChanges.toggleStar(changeId, !starred); @@ -206,6 +197,5 @@ public class StarredChanges { } } - private StarredChanges() { - } + private StarredChanges() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/SubmitInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/SubmitInfo.java index 7a24774263..9027c5ba75 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/SubmitInfo.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/SubmitInfo.java @@ -24,6 +24,5 @@ public class SubmitInfo extends JavaScriptObject { private native String statusRaw() /*-{ return this.status; }-*/; - protected SubmitInfo() { - } + protected SubmitInfo() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/Util.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/Util.java index e6d3dbe47e..b2efcdbb19 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/Util.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/Util.java @@ -44,22 +44,20 @@ public class Util { } /** - * Crops the given change subject if needed so that it has at most - * {@link #SUBJECT_MAX_LENGTH} characters. + * Crops the given change subject if needed so that it has at most {@link #SUBJECT_MAX_LENGTH} + * characters. * - * If the given subject is not longer than {@link #SUBJECT_MAX_LENGTH} - * characters it is returned unchanged. + *

If the given subject is not longer than {@link #SUBJECT_MAX_LENGTH} characters it is + * returned unchanged. * - * If the length of the given subject exceeds {@link #SUBJECT_MAX_LENGTH} - * characters it is cropped. In this case {@link #SUBJECT_CROP_APPENDIX} is - * appended to the cropped subject, the cropped subject including the appendix - * has at most {@link #SUBJECT_MAX_LENGTH} characters. + *

If the length of the given subject exceeds {@link #SUBJECT_MAX_LENGTH} characters it is + * cropped. In this case {@link #SUBJECT_CROP_APPENDIX} is appended to the cropped subject, the + * cropped subject including the appendix has at most {@link #SUBJECT_MAX_LENGTH} characters. * - * If cropping is needed, the subject will be cropped after the last space - * character that is found within the last {@link #SUBJECT_CROP_RANGE} - * characters of the potentially visible characters. If no such space is - * found, the subject will be cropped so that the cropped subject including - * the appendix has exactly {@link #SUBJECT_MAX_LENGTH} characters. + *

If cropping is needed, the subject will be cropped after the last space character that is + * found within the last {@link #SUBJECT_CROP_RANGE} characters of the potentially visible + * characters. If no such space is found, the subject will be cropped so that the cropped subject + * including the appendix has exactly {@link #SUBJECT_MAX_LENGTH} characters. * * @return the subject, cropped if needed */ @@ -67,7 +65,9 @@ public class Util { public static String cropSubject(final String subject) { if (subject.length() > SUBJECT_MAX_LENGTH) { final int maxLength = SUBJECT_MAX_LENGTH - SUBJECT_CROP_APPENDIX.length(); - for (int cropPosition = maxLength; cropPosition > maxLength - SUBJECT_CROP_RANGE; cropPosition--) { + for (int cropPosition = maxLength; + cropPosition > maxLength - SUBJECT_CROP_RANGE; + cropPosition--) { // Character.isWhitespace(char) can't be used because this method is not supported by GWT, // see https://developers.google.com/web-toolkit/doc/1.6/RefJreEmulation#Package_java_lang if (Character.isSpace(subject.charAt(cropPosition - 1))) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/config/CapabilityInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/config/CapabilityInfo.java index 45abbd6894..1d7f4abe08 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/config/CapabilityInfo.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/config/CapabilityInfo.java @@ -18,8 +18,8 @@ import com.google.gwt.core.client.JavaScriptObject; public class CapabilityInfo extends JavaScriptObject { public final native String id() /*-{ return this.id; }-*/; + public final native String name() /*-{ return this.name; }-*/; - protected CapabilityInfo() { - } + protected CapabilityInfo() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/config/ConfigServerApi.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/config/ConfigServerApi.java index 47393a7015..e71929c064 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/config/ConfigServerApi.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/config/ConfigServerApi.java @@ -23,10 +23,7 @@ import com.google.gerrit.client.rpc.RestApi; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.user.client.rpc.AsyncCallback; -/** - * A collection of static methods which work on the Gerrit REST API for server - * configuration. - */ +/** A collection of static methods which work on the Gerrit REST API for server configuration. */ public class ConfigServerApi { /** map of the server wide capabilities (core & plugins). */ public static void capabilities(AsyncCallback> cb) { @@ -58,7 +55,6 @@ public class ConfigServerApi { return createObject().cast(); } - protected EmailConfirmationInput() { - } + protected EmailConfirmationInput() {} } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/dashboards/DashboardConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/dashboards/DashboardConstants.java index b02f0474ba..ecb2938307 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/dashboards/DashboardConstants.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/dashboards/DashboardConstants.java @@ -18,9 +18,14 @@ import com.google.gwt.i18n.client.Constants; public interface DashboardConstants extends Constants { String dashboardName(); + String dashboardTitle(); + String dashboardDescription(); + String dashboardInherited(); + String dashboardItem(); + String dashboardDefaultToolTip(); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/dashboards/DashboardInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/dashboards/DashboardInfo.java index 44d74abae2..0d496777a6 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/dashboards/DashboardInfo.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/dashboards/DashboardInfo.java @@ -18,16 +18,24 @@ import com.google.gwt.core.client.JavaScriptObject; public class DashboardInfo extends JavaScriptObject { public final native String id() /*-{ return this.id; }-*/; + public final native String title() /*-{ return this.title; }-*/; + public final native String project() /*-{ return this.project; }-*/; + public final native String definingProject() /*-{ return this.defining_project; }-*/; + public final native String ref() /*-{ return this.ref; }-*/; + public final native String path() /*-{ return this.path; }-*/; + public final native String description() /*-{ return this.description; }-*/; + public final native String foreach() /*-{ return this.foreach; }-*/; + public final native String url() /*-{ return this.url; }-*/; + public final native boolean isDefault() /*-{ return this['default'] ? true : false; }-*/; - protected DashboardInfo() { - } + protected DashboardInfo() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/dashboards/DashboardList.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/dashboards/DashboardList.java index 1190f9cd18..7ba3580089 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/dashboards/DashboardList.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/dashboards/DashboardList.java @@ -22,18 +22,16 @@ import com.google.gwt.user.client.rpc.AsyncCallback; /** Project dashboards from {@code /projects//dashboards/}. */ public class DashboardList extends JsArray { - public static void all(Project.NameKey project, - AsyncCallback> callback) { + public static void all(Project.NameKey project, AsyncCallback> callback) { base(project).addParameterTrue("inherited").get(callback); } - public static void getDefault(Project.NameKey project, - AsyncCallback callback) { + public static void getDefault(Project.NameKey project, AsyncCallback callback) { base(project).view("default").addParameterTrue("inherited").get(callback); } - public static void get(Project.NameKey project, String id, - AsyncCallback callback) { + public static void get( + Project.NameKey project, String id, AsyncCallback callback) { base(project).idRaw(encodeDashboardId(id)).get(callback); } @@ -51,6 +49,5 @@ public class DashboardList extends JsArray { return URL.encodeQueryString(id); } - protected DashboardList() { - } + protected DashboardList() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/dashboards/DashboardsTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/dashboards/DashboardsTable.java index 47c0359f75..62158545b3 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/dashboards/DashboardsTable.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/dashboards/DashboardsTable.java @@ -24,7 +24,6 @@ import com.google.gwt.user.client.History; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter; import com.google.gwt.user.client.ui.Image; - import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -76,12 +75,14 @@ public class DashboardsTable extends NavigationTable { table.removeRow(table.getRowCount() - 1); } - Collections.sort(list, new Comparator() { - @Override - public int compare(DashboardInfo a, DashboardInfo b) { - return a.id().compareTo(b.id()); - } - }); + Collections.sort( + list, + new Comparator() { + @Override + public int compare(DashboardInfo a, DashboardInfo b) { + return a.id().compareTo(b.id()); + } + }); String ref = null; for (DashboardInfo d : list) { @@ -126,13 +127,21 @@ public class DashboardsTable extends NavigationTable { final FlexCellFormatter fmt = table.getFlexCellFormatter(); fmt.getElement(row, 1).setTitle(Util.C.dashboardDefaultToolTip()); } - table.setWidget(row, 2, new Anchor(k.path(), "#" - + PageLinks.toProjectDashboard(new Project.NameKey(k.project()), k.id()))); + table.setWidget( + row, + 2, + new Anchor( + k.path(), + "#" + PageLinks.toProjectDashboard(new Project.NameKey(k.project()), k.id()))); table.setText(row, 3, k.title() != null ? k.title() : k.path()); table.setText(row, 4, k.description()); if (k.definingProject() != null && !k.definingProject().equals(k.project())) { - table.setWidget(row, 5, new Anchor(k.definingProject(), "#" - + PageLinks.toProjectDashboards(new Project.NameKey(k.definingProject())))); + table.setWidget( + row, + 5, + new Anchor( + k.definingProject(), + "#" + PageLinks.toProjectDashboards(new Project.NameKey(k.definingProject())))); } setRowItem(row, k); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/ChunkManager.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/ChunkManager.java index eed0f9b511..953bc877ef 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/ChunkManager.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/ChunkManager.java @@ -18,20 +18,17 @@ import static com.google.gerrit.client.diff.DisplaySide.A; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.dom.client.Element; - +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; import net.codemirror.lib.CodeMirror; import net.codemirror.lib.CodeMirror.LineClassWhere; import net.codemirror.lib.Pos; import net.codemirror.lib.TextMarker; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; - /** Colors modified regions for {@link SideBySide} and {@link Unified}. */ abstract class ChunkManager { - static final native void onClick(Element e, JavaScriptObject f) - /*-{ e.onclick = f }-*/; + static final native void onClick(Element e, JavaScriptObject f) /*-{ e.onclick = f }-*/; final Scrollbar scrollbar; final LineMapper lineMapper; @@ -71,27 +68,32 @@ abstract class ChunkManager { colorLines(cm, LineClassWhere.WRAP, color, line, line + cnt); } - void colorLines(final CodeMirror cm, final LineClassWhere where, - final String className, final int start, final int end) { + void colorLines( + final CodeMirror cm, + final LineClassWhere where, + final String className, + final int start, + final int end) { if (start < end) { for (int line = start; line < end; line++) { cm.addLineClass(line, where, className); } - undo.add(new Runnable() { - @Override - public void run() { - for (int line = start; line < end; line++) { - cm.removeLineClass(line, where, className); - } - } - }); + undo.add( + new Runnable() { + @Override + public void run() { + for (int line = start; line < end; line++) { + cm.removeLineClass(line, where, className); + } + } + }); } } abstract Runnable diffChunkNav(CodeMirror cm, Direction dir); - void diffChunkNavHelper(List chunks, - DiffScreen host, int res, Direction dir) { + void diffChunkNavHelper( + List chunks, DiffScreen host, int res, Direction dir) { if (res < 0) { res = -res - (dir == Direction.PREV ? 1 : 2); } @@ -115,8 +117,7 @@ abstract class ChunkManager { targetCm.setCursor(Pos.create(cmLine)); targetCm.focus(); targetCm.scrollToY( - targetCm.heightAtLine(cmLine, "local") - - 0.5 * targetCm.scrollbarV().getClientHeight()); + targetCm.heightAtLine(cmLine, "local") - 0.5 * targetCm.scrollbarV().getClientHeight()); } Comparator getDiffChunkComparator() { @@ -130,12 +131,10 @@ abstract class ChunkManager { if (a.getSide() == b.getSide()) { return a.getStart() - b.getStart(); } else if (a.getSide() == A) { - int comp = lineMapper.lineOnOther(a.getSide(), a.getStart()) - .getLine() - b.getStart(); + int comp = lineMapper.lineOnOther(a.getSide(), a.getStart()).getLine() - b.getStart(); return comp == 0 ? -1 : comp; } else { - int comp = a.getStart() - - lineMapper.lineOnOther(b.getSide(), b.getStart()).getLine(); + int comp = a.getStart() - lineMapper.lineOnOther(b.getSide(), b.getStart()).getLine(); return comp == 0 ? 1 : comp; } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentBox.java index 70ef947b60..6f9e694dfd 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentBox.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentBox.java @@ -21,7 +21,6 @@ import com.google.gwt.event.dom.client.MouseOverEvent; import com.google.gwt.event.dom.client.MouseOverHandler; import com.google.gwt.resources.client.CssResource; import com.google.gwt.user.client.ui.Composite; - import net.codemirror.lib.CodeMirror; import net.codemirror.lib.Configuration; import net.codemirror.lib.Pos; @@ -36,15 +35,23 @@ abstract class CommentBox extends Composite { interface Style extends CssResource { String commentWidgets(); + String commentBox(); + String contents(); + String message(); + String header(); + String summary(); + String date(); String goPrev(); + String goNext(); + String goUp(); } @@ -58,33 +65,40 @@ abstract class CommentBox extends Composite { this.group = group; if (range != null) { DiffScreen screen = group.getManager().host; - int startCmLine = - screen.getCmLine(range.startLine() - 1, group.getSide()); + int startCmLine = screen.getCmLine(range.startLine() - 1, group.getSide()); int endCmLine = screen.getCmLine(range.endLine() - 1, group.getSide()); - fromTo = FromTo.create( - Pos.create(startCmLine, range.startCharacter()), - Pos.create(endCmLine, range.endCharacter())); - rangeMarker = group.getCm().markText( - fromTo.from(), - fromTo.to(), - Configuration.create() - .set("className", Resources.I.diffTableStyle().range())); + fromTo = + FromTo.create( + Pos.create(startCmLine, range.startCharacter()), + Pos.create(endCmLine, range.endCharacter())); + rangeMarker = + group + .getCm() + .markText( + fromTo.from(), + fromTo.to(), + Configuration.create().set("className", Resources.I.diffTableStyle().range())); } - addDomHandler(new MouseOverHandler() { - @Override - public void onMouseOver(MouseOverEvent event) { - setRangeHighlight(true); - } - }, MouseOverEvent.getType()); - addDomHandler(new MouseOutHandler() { - @Override - public void onMouseOut(MouseOutEvent event) { - setRangeHighlight(isOpen()); - } - }, MouseOutEvent.getType()); + addDomHandler( + new MouseOverHandler() { + @Override + public void onMouseOver(MouseOverEvent event) { + setRangeHighlight(true); + } + }, + MouseOverEvent.getType()); + addDomHandler( + new MouseOutHandler() { + @Override + public void onMouseOut(MouseOutEvent event) { + setRangeHighlight(isOpen()); + } + }, + MouseOutEvent.getType()); } abstract CommentInfo getCommentInfo(); + abstract boolean isOpen(); void setOpen(boolean open) { @@ -112,11 +126,14 @@ abstract class CommentBox extends Composite { void setRangeHighlight(boolean highlight) { if (fromTo != null) { if (highlight && rangeHighlightMarker == null) { - rangeHighlightMarker = group.getCm().markText( - fromTo.from(), - fromTo.to(), - Configuration.create() - .set("className", Resources.I.diffTableStyle().rangeHighlight())); + rangeHighlightMarker = + group + .getCm() + .markText( + fromTo.from(), + fromTo.to(), + Configuration.create() + .set("className", Resources.I.diffTableStyle().rangeHighlight())); } else if (!highlight && rangeHighlightMarker != null) { rangeHighlightMarker.clear(); rangeHighlightMarker = null; diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentGroup.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentGroup.java index 1d198ec1b5..414e82e9bd 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentGroup.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentGroup.java @@ -18,7 +18,6 @@ import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.SimplePanel; - import net.codemirror.lib.CodeMirror; import net.codemirror.lib.Configuration; import net.codemirror.lib.LineWidget; @@ -27,7 +26,7 @@ import net.codemirror.lib.TextMarker.FromTo; /** * LineWidget attached to a CodeMirror container. * - * When a comment is placed on a line a CommentWidget is created. + *

When a comment is placed on a line a CommentWidget is created. */ abstract class CommentGroup extends Composite { @@ -139,12 +138,15 @@ abstract class CommentGroup extends Composite { void attach(DiffTable parent) { parent.add(this); - lineWidget = cm.addLineWidget(Math.max(0, line - 1), getElement(), - Configuration.create() - .set("coverGutter", true) - .set("noHScroll", true) - .set("above", line <= 0) - .set("insertAt", 0)); + lineWidget = + cm.addLineWidget( + Math.max(0, line - 1), + getElement(), + Configuration.create() + .set("coverGutter", true) + .set("noHScroll", true) + .set("above", line <= 0) + .set("insertAt", 0)); } @Override diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentManager.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentManager.java index 7419dd5bd5..587dacc130 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentManager.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentManager.java @@ -24,11 +24,6 @@ import com.google.gerrit.client.ui.CommentLinkProcessor; import com.google.gerrit.extensions.client.Side; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gwt.core.client.JsArray; - -import net.codemirror.lib.CodeMirror; -import net.codemirror.lib.Pos; -import net.codemirror.lib.TextMarker.FromTo; - import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -38,6 +33,9 @@ import java.util.Map; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; +import net.codemirror.lib.CodeMirror; +import net.codemirror.lib.Pos; +import net.codemirror.lib.TextMarker.FromTo; /** Tracks comment widgets for {@link DiffScreen}. */ abstract class CommentManager { @@ -152,8 +150,7 @@ abstract class CommentManager { DisplaySide displaySide(CommentInfo info, DisplaySide forSide) { if (info.side() == Side.PARENT) { - return (base.isBaseOrAutoMerge() || base.isParent()) - ? DisplaySide.A : null; + return (base.isBaseOrAutoMerge() || base.isParent()) ? DisplaySide.A : null; } return forSide; } @@ -174,8 +171,8 @@ abstract class CommentManager { * Create a new {@link DraftBox} at the specified line and focus it. * * @param side which side the draft will appear on. - * @param line the line the draft will be at. Lines are 1-based. Line 0 is a - * special case creating a file level comment. + * @param line the line the draft will be at. Lines are 1-based. Line 0 is a special case creating + * a file level comment. */ void insertNewDraft(DisplaySide side, int line) { if (line == 0) { @@ -186,18 +183,21 @@ abstract class CommentManager { if (0 < group.getBoxCount()) { CommentBox last = group.getCommentBox(group.getBoxCount() - 1); if (last instanceof DraftBox) { - ((DraftBox)last).setEdit(true); + ((DraftBox) last).setEdit(true); } else { - ((PublishedBox)last).doReply(); + ((PublishedBox) last).doReply(); } } else { - addDraftBox(side, CommentInfo.create( - getPath(), - getStoredSideFromDisplaySide(side), - getParentNumFromDisplaySide(side), - line, - null, - false)).setEdit(true); + addDraftBox( + side, + CommentInfo.create( + getPath(), + getStoredSideFromDisplaySide(side), + getParentNumFromDisplaySide(side), + line, + null, + false)) + .setEdit(true); } } @@ -236,12 +236,9 @@ abstract class CommentManager { DraftBox addDraftBox(DisplaySide side, CommentInfo info) { int cmLinePlusOne = host.getCmLine(info.line() - 1, side) + 1; CommentGroup group = group(side, cmLinePlusOne); - DraftBox box = new DraftBox( - group, - getCommentLinkProcessor(), - getPatchSetIdFromSide(side), - info, - isExpandAll()); + DraftBox box = + new DraftBox( + group, getCommentLinkProcessor(), getPatchSetIdFromSide(side), info, isExpandAll()); if (info.inReplyTo() != null) { PublishedBox r = getPublished().get(info.inReplyTo()); @@ -251,9 +248,10 @@ abstract class CommentManager { } group.add(box); - box.setAnnotation(host.getDiffTable().scrollbar.draft( - host.getCmFromSide(side), - Math.max(0, cmLinePlusOne - 1))); + box.setAnnotation( + host.getDiffTable() + .scrollbar + .draft(host.getCmFromSide(side), Math.max(0, cmLinePlusOne - 1))); return box; } @@ -277,9 +275,8 @@ abstract class CommentManager { // It is only necessary to search one side to find a comment // on either side of the editor pair. SortedMap map = getMapForNav(src.side()); - int line = src.extras().hasActiveLine() - ? src.getLineNumber(src.extras().activeLine()) + 1 - : 0; + int line = + src.extras().hasActiveLine() ? src.getLineNumber(src.extras().activeLine()) + 1 : 0; CommentGroup g; if (dir == Direction.NEXT) { @@ -358,17 +355,17 @@ abstract class CommentManager { if (side != null) { int cmLinePlusOne = host.getCmLine(info.line() - 1, side) + 1; CommentGroup group = group(side, cmLinePlusOne); - PublishedBox box = new PublishedBox( - group, - getCommentLinkProcessor(), - getPatchSetIdFromSide(side), - info, - side, - isOpen()); + PublishedBox box = + new PublishedBox( + group, + getCommentLinkProcessor(), + getPatchSetIdFromSide(side), + info, + side, + isOpen()); group.add(box); - box.setAnnotation(host.getDiffTable().scrollbar.comment( - host.getCmFromSide(side), - cmLinePlusOne - 1)); + box.setAnnotation( + host.getDiffTable().scrollbar.comment(host.getCmFromSide(side), cmLinePlusOne - 1)); getPublished().put(info.id(), box); } } @@ -402,9 +399,9 @@ abstract class CommentManager { if (deltaBefore < -context || deltaAfter < -context) { temp.add(skip); // Size guaranteed to be greater than 1 } else if (deltaBefore > context && deltaAfter > context) { - SkippedLine before = new SkippedLine( - skip.getStartA(), skip.getStartB(), - skip.getSize() - deltaAfter - context); + SkippedLine before = + new SkippedLine( + skip.getStartA(), skip.getStartB(), skip.getSize() - deltaAfter - context); skip.incrementStart(deltaBefore + context); checkAndAddSkip(temp, before); checkAndAddSkip(temp, skip); @@ -424,8 +421,7 @@ abstract class CommentManager { return skips; } - abstract void newDraftOnGutterClick(CodeMirror cm, String gutterClass, - int line); + abstract void newDraftOnGutterClick(CodeMirror cm, String gutterClass, int line); abstract CommentGroup getCommentGroupOnActiveLine(CodeMirror cm); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentRange.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentRange.java index d3c150d964..0f357d599e 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentRange.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentRange.java @@ -15,7 +15,6 @@ package com.google.gerrit.client.diff; import com.google.gwt.core.client.JavaScriptObject; - import net.codemirror.lib.Pos; import net.codemirror.lib.TextMarker.FromTo; @@ -39,8 +38,11 @@ public class CommentRange extends JavaScriptObject { } public final native int startLine() /*-{ return this.start_line; }-*/; + public final native int startCharacter() /*-{ return this.start_character; }-*/; + public final native int endLine() /*-{ return this.end_line; }-*/; + public final native int endCharacter() /*-{ return this.end_character; }-*/; private native void set(int sl, int sc, int el, int ec) /*-{ @@ -50,6 +52,5 @@ public class CommentRange extends JavaScriptObject { this.end_character = ec; }-*/; - protected CommentRange() { - } + protected CommentRange() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentsCollections.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentsCollections.java index 0b8e1416da..3ed0c5082d 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentsCollections.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentsCollections.java @@ -25,7 +25,6 @@ import com.google.gerrit.extensions.client.Side; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gwt.core.client.JsArray; import com.google.gwt.user.client.rpc.AsyncCallback; - import java.util.Collections; import java.util.Comparator; @@ -84,8 +83,7 @@ class CommentsCollections { } @Override - public void onFailure(Throwable caught) { - } + public void onFailure(Throwable caught) {} }; } @@ -101,24 +99,23 @@ class CommentsCollections { } @Override - public void onFailure(Throwable caught) { - } + public void onFailure(Throwable caught) {} }; } - private JsArray filterForParent(JsArray list) { - JsArray result = JsArray.createArray().cast(); - for (CommentInfo c : Natives.asList(list)) { - if (c.side() == Side.REVISION) { - result.push(c); - } else if (base.isBaseOrAutoMerge() && !c.hasParent()) { - result.push(c); - } else if (base.isParent() && c.parent() == base.getParentNum()) { - result.push(c); - } + private JsArray filterForParent(JsArray list) { + JsArray result = JsArray.createArray().cast(); + for (CommentInfo c : Natives.asList(list)) { + if (c.side() == Side.REVISION) { + result.push(c); + } else if (base.isBaseOrAutoMerge() && !c.hasParent()) { + result.push(c); + } else if (base.isParent() && c.parent() == base.getParentNum()) { + result.push(c); } - return result; } + return result; + } private AsyncCallback>> draftsBase() { return new AsyncCallback>>() { @@ -128,8 +125,7 @@ class CommentsCollections { } @Override - public void onFailure(Throwable caught) { - } + public void onFailure(Throwable caught) {} }; } @@ -144,8 +140,7 @@ class CommentsCollections { } @Override - public void onFailure(Throwable caught) { - } + public void onFailure(Throwable caught) {} }; } @@ -154,12 +149,14 @@ class CommentsCollections { for (CommentInfo c : Natives.asList(in)) { c.path(path); } - Collections.sort(Natives.asList(in), new Comparator() { - @Override - public int compare(CommentInfo a, CommentInfo b) { - return a.updated().compareTo(b.updated()); - } - }); + Collections.sort( + Natives.asList(in), + new Comparator() { + @Override + public int compare(CommentInfo a, CommentInfo b) { + return a.updated().compareTo(b.updated()); + } + }); } return in; } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffApi.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffApi.java index e3720cccdd..3f6406687d 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffApi.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffApi.java @@ -26,8 +26,8 @@ import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gwt.user.client.rpc.AsyncCallback; public class DiffApi { - public static void list(int id, String revision, RevisionInfo base, - AsyncCallback> cb) { + public static void list( + int id, String revision, RevisionInfo base, AsyncCallback> cb) { RestApi api = ChangeApi.revision(id, revision).view("files"); if (base != null) { if (base._number() < 0) { @@ -39,8 +39,7 @@ public class DiffApi { api.get(NativeMap.copyKeysIntoChildren("path", cb)); } - public static void list(PatchSet.Id id, PatchSet.Id base, - AsyncCallback> cb) { + public static void list(PatchSet.Id id, PatchSet.Id base, AsyncCallback> cb) { RestApi api = ChangeApi.revision(id).view("files"); if (base != null) { if (base.get() < 0) { @@ -53,9 +52,7 @@ public class DiffApi { } public static DiffApi diff(PatchSet.Id id, String path) { - return new DiffApi(ChangeApi.revision(id) - .view("files").id(path) - .view("diff")); + return new DiffApi(ChangeApi.revision(id).view("files").id(path).view("diff")); } private final RestApi call; diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffInfo.java index 861b84c677..cf40762bb7 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffInfo.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffInfo.java @@ -22,16 +22,20 @@ import com.google.gerrit.reviewdb.client.Patch.ChangeType; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArray; import com.google.gwt.core.client.JsArrayString; - import java.util.ArrayList; import java.util.List; public class DiffInfo extends JavaScriptObject { public final native FileMeta metaA() /*-{ return this.meta_a; }-*/; + public final native FileMeta metaB() /*-{ return this.meta_b; }-*/; + public final native JsArrayString diffHeader() /*-{ return this.diff_header; }-*/; + public final native JsArray content() /*-{ return this.content; }-*/; + public final native JsArray webLinks() /*-{ return this.web_links; }-*/; + public final native boolean binary() /*-{ return this.binary || false; }-*/; public final List sideBySideWebLinks() { @@ -47,12 +51,10 @@ public class DiffInfo extends JavaScriptObject { List allDiffWebLinks = Natives.asList(webLinks()); if (allDiffWebLinks != null) { for (DiffWebLinkInfo webLink : allDiffWebLinks) { - if (diffView == DiffView.SIDE_BY_SIDE - && webLink.showOnSideBySideDiffView()) { + if (diffView == DiffView.SIDE_BY_SIDE && webLink.showOnSideBySideDiffView()) { filteredDiffWebLinks.add(webLink); } - if (diffView == DiffView.UNIFIED_DIFF - && webLink.showOnUnifiedDiffView()) { + if (diffView == DiffView.UNIFIED_DIFF && webLink.showOnUnifiedDiffView()) { filteredDiffWebLinks.add(webLink); } } @@ -63,17 +65,15 @@ public class DiffInfo extends JavaScriptObject { public final ChangeType changeType() { return ChangeType.valueOf(changeTypeRaw()); } - private native String changeTypeRaw() - /*-{ return this.change_type }-*/; + + private native String changeTypeRaw() /*-{ return this.change_type }-*/; public final IntraLineStatus intralineStatus() { String s = intralineStatusRaw(); - return s != null - ? IntraLineStatus.valueOf(s) - : IntraLineStatus.OFF; + return s != null ? IntraLineStatus.valueOf(s) : IntraLineStatus.OFF; } - private native String intralineStatusRaw() - /*-{ return this.intraline_status }-*/; + + private native String intralineStatusRaw() /*-{ return this.intraline_status }-*/; public final boolean hasSkip() { JsArray c = content(); @@ -141,42 +141,50 @@ public class DiffInfo extends JavaScriptObject { } } - protected DiffInfo() { - } + protected DiffInfo() {} public enum IntraLineStatus { - OFF, OK, TIMEOUT, FAILURE + OFF, + OK, + TIMEOUT, + FAILURE } public static class FileMeta extends JavaScriptObject { public final native String name() /*-{ return this.name; }-*/; + public final native String contentType() /*-{ return this.content_type; }-*/; + public final native int lines() /*-{ return this.lines || 0 }-*/; + public final native JsArray webLinks() /*-{ return this.web_links; }-*/; - protected FileMeta() { - } + protected FileMeta() {} } public static class Region extends JavaScriptObject { public final native JsArrayString ab() /*-{ return this.ab; }-*/; + public final native JsArrayString a() /*-{ return this.a; }-*/; + public final native JsArrayString b() /*-{ return this.b; }-*/; + public final native int skip() /*-{ return this.skip || 0; }-*/; + public final native boolean common() /*-{ return this.common || false; }-*/; public final native JsArray editA() /*-{ return this.edit_a }-*/; + public final native JsArray editB() /*-{ return this.edit_b }-*/; - protected Region() { - } + protected Region() {} } public static class Span extends JavaScriptObject { public final native int skip() /*-{ return this[0]; }-*/; + public final native int mark() /*-{ return this[1]; }-*/; - protected Span() { - } + protected Span() {} } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffScreen.java index 1cb5995831..60a75ebba6 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffScreen.java @@ -64,7 +64,9 @@ import com.google.gwtexpui.globalkey.client.GlobalKey; import com.google.gwtexpui.globalkey.client.KeyCommand; import com.google.gwtexpui.globalkey.client.KeyCommandSet; import com.google.gwtexpui.globalkey.client.ShowHelpCommand; - +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; import net.codemirror.lib.CodeMirror; import net.codemirror.lib.CodeMirror.BeforeSelectionChangeHandler; import net.codemirror.lib.CodeMirror.GutterClickHandler; @@ -75,14 +77,10 @@ import net.codemirror.mode.ModeInfo; import net.codemirror.mode.ModeInjector; import net.codemirror.theme.ThemeLoader; -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.List; - /** Base class for SideBySide and Unified */ abstract class DiffScreen extends Screen { - private static final KeyMap RENDER_ENTIRE_FILE_KEYMAP = KeyMap.create() - .propagate("Ctrl-F").propagate("Ctrl-G").propagate("Shift-Ctrl-G"); + private static final KeyMap RENDER_ENTIRE_FILE_KEYMAP = + KeyMap.create().propagate("Ctrl-F").propagate("Ctrl-G").propagate("Shift-Ctrl-G"); enum FileSize { SMALL(0), @@ -140,8 +138,7 @@ abstract class DiffScreen extends Screen { prefs = DiffPreferences.create(Gerrit.getDiffPreferences()); handlers = new ArrayList<>(6); keysNavigation = new KeyCommandSet(Gerrit.C.sectionNavigation()); - header = new Header( - keysNavigation, base, revision, path, diffScreenType, prefs); + header = new Header(keysNavigation, base, revision, path, diffScreenType, prefs); skipManager = new SkipManager(this); } @@ -159,111 +156,124 @@ abstract class DiffScreen extends Screen { CallbackGroup group1 = new CallbackGroup(); final CallbackGroup group2 = new CallbackGroup(); - CodeMirror.initLibrary(group1.add(new AsyncCallback() { - final AsyncCallback themeCallback = group2.addEmpty(); + CodeMirror.initLibrary( + group1.add( + new AsyncCallback() { + final AsyncCallback themeCallback = group2.addEmpty(); - @Override - public void onSuccess(Void result) { - // Load theme after CM library to ensure theme can override CSS. - ThemeLoader.loadTheme(prefs.theme(), themeCallback); - } + @Override + public void onSuccess(Void result) { + // Load theme after CM library to ensure theme can override CSS. + ThemeLoader.loadTheme(prefs.theme(), themeCallback); + } - @Override - public void onFailure(Throwable caught) { - } - })); + @Override + public void onFailure(Throwable caught) {} + })); DiffApi.diff(revision, path) - .base(base.asPatchSetId()) - .wholeFile() - .intraline(prefs.intralineDifference()) - .ignoreWhitespace(prefs.ignoreWhitespace()) - .get(group1.addFinal(new GerritCallback() { - final AsyncCallback modeInjectorCb = group2.addEmpty(); + .base(base.asPatchSetId()) + .wholeFile() + .intraline(prefs.intralineDifference()) + .ignoreWhitespace(prefs.ignoreWhitespace()) + .get( + group1.addFinal( + new GerritCallback() { + final AsyncCallback modeInjectorCb = group2.addEmpty(); - @Override - public void onSuccess(DiffInfo diffInfo) { - diff = diffInfo; - fileSize = bucketFileSize(diffInfo); + @Override + public void onSuccess(DiffInfo diffInfo) { + diff = diffInfo; + fileSize = bucketFileSize(diffInfo); - if (prefs.syntaxHighlighting()) { - if (fileSize.compareTo(FileSize.SMALL) > 0) { - modeInjectorCb.onSuccess(null); - } else { - injectMode(diffInfo, modeInjectorCb); - } - } else { - modeInjectorCb.onSuccess(null); - } - } - })); + if (prefs.syntaxHighlighting()) { + if (fileSize.compareTo(FileSize.SMALL) > 0) { + modeInjectorCb.onSuccess(null); + } else { + injectMode(diffInfo, modeInjectorCb); + } + } else { + modeInjectorCb.onSuccess(null); + } + } + })); if (Gerrit.isSignedIn()) { - ChangeApi.edit(changeId.get(), group2.add( - new AsyncCallback() { - @Override - public void onSuccess(EditInfo result) { - edit = result; - } + ChangeApi.edit( + changeId.get(), + group2.add( + new AsyncCallback() { + @Override + public void onSuccess(EditInfo result) { + edit = result; + } - @Override - public void onFailure(Throwable caught) { - } - })); + @Override + public void onFailure(Throwable caught) {} + })); } - final CommentsCollections comments = - new CommentsCollections(base, revision, path); + final CommentsCollections comments = new CommentsCollections(base, revision, path); comments.load(group2); countParents(group2); RestApi call = ChangeApi.detail(changeId.get()); - ChangeList.addOptions(call, EnumSet.of( - ListChangesOption.ALL_REVISIONS)); - call.get(group2.add(new AsyncCallback() { - @Override - public void onSuccess(ChangeInfo info) { - changeStatus = info.status(); - info.revisions().copyKeysIntoChildren("name"); - if (edit != null) { - edit.setName(edit.commit().commit()); - info.setEdit(edit); - info.revisions().put(edit.name(), RevisionInfo.fromEdit(edit)); - } - String currentRevision = info.currentRevision(); - boolean current = currentRevision != null && - revision.get() == info.revision(currentRevision)._number(); - JsArray list = info.revisions().values(); - RevisionInfo.sortRevisionInfoByNumber(list); - getDiffTable().set(prefs, list, parents, diff, edit != null, current, - changeStatus.isOpen(), diff.binary()); - header.setChangeInfo(info); - } + ChangeList.addOptions(call, EnumSet.of(ListChangesOption.ALL_REVISIONS)); + call.get( + group2.add( + new AsyncCallback() { + @Override + public void onSuccess(ChangeInfo info) { + changeStatus = info.status(); + info.revisions().copyKeysIntoChildren("name"); + if (edit != null) { + edit.setName(edit.commit().commit()); + info.setEdit(edit); + info.revisions().put(edit.name(), RevisionInfo.fromEdit(edit)); + } + String currentRevision = info.currentRevision(); + boolean current = + currentRevision != null + && revision.get() == info.revision(currentRevision)._number(); + JsArray list = info.revisions().values(); + RevisionInfo.sortRevisionInfoByNumber(list); + getDiffTable() + .set( + prefs, + list, + parents, + diff, + edit != null, + current, + changeStatus.isOpen(), + diff.binary()); + header.setChangeInfo(info); + } - @Override - public void onFailure(Throwable caught) { - } - })); + @Override + public void onFailure(Throwable caught) {} + })); - ConfigInfoCache.get(changeId, group2.addFinal( - getScreenLoadCallback(comments))); + ConfigInfoCache.get(changeId, group2.addFinal(getScreenLoadCallback(comments))); } private void countParents(CallbackGroup cbg) { ChangeApi.revision(changeId.get(), revision.getId()) .view("commit") - .get(cbg.add(new AsyncCallback() { - @Override - public void onSuccess(CommitInfo info) { - parents = info.parents().length(); - } + .get( + cbg.add( + new AsyncCallback() { + @Override + public void onSuccess(CommitInfo info) { + parents = info.parents().length(); + } - @Override - public void onFailure(Throwable caught) { - parents = 0; - } - })); + @Override + public void onFailure(Throwable caught) { + parents = 0; + } + })); } @Override @@ -274,12 +284,14 @@ abstract class DiffScreen extends Screen { if (prefs.hideTopMenu()) { Gerrit.setHeaderVisible(false); } - resizeHandler = Window.addResizeHandler(new ResizeHandler() { - @Override - public void onResize(ResizeEvent event) { - resizeCodeMirror(); - } - }); + resizeHandler = + Window.addResizeHandler( + new ResizeHandler() { + @Override + public void onResize(ResizeEvent event) { + resizeCodeMirror(); + } + }); } KeyCommandSet getKeysNavigation() { @@ -327,149 +339,188 @@ abstract class DiffScreen extends Screen { void registerCmEvents(final CodeMirror cm) { cm.on("cursorActivity", updateActiveLine(cm)); cm.on("focus", updateActiveLine(cm)); - KeyMap keyMap = KeyMap.create() - .on("A", upToChange(true)) - .on("U", upToChange(false)) - .on("'['", header.navigate(Direction.PREV)) - .on("']'", header.navigate(Direction.NEXT)) - .on("R", header.toggleReviewed()) - .on("O", getCommentManager().toggleOpenBox(cm)) - .on("N", maybeNextVimSearch(cm)) - .on("Ctrl-Alt-E", openEditScreen(cm)) - .on("P", getChunkManager().diffChunkNav(cm, Direction.PREV)) - .on("Shift-M", header.reviewedAndNext()) - .on("Shift-N", maybePrevVimSearch(cm)) - .on("Shift-P", getCommentManager().commentNav(cm, Direction.PREV)) - .on("Shift-O", getCommentManager().openCloseAll(cm)) - .on("I", new Runnable() { - @Override - public void run() { - switch (getIntraLineStatus()) { - case OFF: - case OK: - toggleShowIntraline(); - break; - case FAILURE: - case TIMEOUT: - default: - break; - } - } - }) - .on("','", new Runnable() { - @Override - public void run() { - prefsAction.show(); - } - }) - .on("Shift-/", new Runnable() { - @Override - public void run() { - new ShowHelpCommand().onKeyPress(null); - } - }) - .on("Space", new Runnable() { - @Override - public void run() { - cm.vim().handleKey(""); - } - }) - .on("Shift-Space", new Runnable() { - @Override - public void run() { - cm.vim().handleKey(""); - } - }) - .on("Ctrl-F", new Runnable() { - @Override - public void run() { - cm.execCommand("find"); - } - }) - .on("Ctrl-G", new Runnable() { - @Override - public void run() { - cm.execCommand("findNext"); - } - }) - .on("Enter", maybeNextCmSearch(cm)) - .on("Shift-Ctrl-G", new Runnable() { - @Override - public void run() { - cm.execCommand("findPrev"); - } - }) - .on("Shift-Enter", new Runnable() { - @Override - public void run() { - cm.execCommand("findPrev"); - } - }) - .on("Esc", new Runnable() { - @Override - public void run() { - cm.setCursor(cm.getCursor()); - cm.execCommand("clearSearch"); - cm.vim().handleEx("nohlsearch"); - } - }) - .on("Ctrl-A", new Runnable() { - @Override - public void run() { - cm.execCommand("selectAll"); - } - }) - .on("G O", new Runnable() { - @Override - public void run() { - Gerrit.display(PageLinks.toChangeQuery("status:open")); - } - }) - .on("G M", new Runnable() { - @Override - public void run() { - Gerrit.display(PageLinks.toChangeQuery("status:merged")); - } - }) - .on("G A", new Runnable() { - @Override - public void run() { - Gerrit.display(PageLinks.toChangeQuery("status:abandoned")); - } - }); - if (Gerrit.isSignedIn()) { - keyMap.on("G I", new Runnable() { - @Override - public void run() { - Gerrit.display(PageLinks.MINE); - } - }) - .on("G D", new Runnable() { - @Override - public void run() { - Gerrit.display(PageLinks.toChangeQuery("owner:self is:draft")); - } - }) - .on("G C", new Runnable() { - @Override - public void run() { - Gerrit.display(PageLinks.toChangeQuery("has:draft")); - } - }) - .on("G W", new Runnable() { - @Override - public void run() { - Gerrit.display( - PageLinks.toChangeQuery("is:watched status:open")); - } - }) - .on("G S", new Runnable() { - @Override - public void run() { - Gerrit.display(PageLinks.toChangeQuery("is:starred")); - } - }); - } + KeyMap keyMap = + KeyMap.create() + .on("A", upToChange(true)) + .on("U", upToChange(false)) + .on("'['", header.navigate(Direction.PREV)) + .on("']'", header.navigate(Direction.NEXT)) + .on("R", header.toggleReviewed()) + .on("O", getCommentManager().toggleOpenBox(cm)) + .on("N", maybeNextVimSearch(cm)) + .on("Ctrl-Alt-E", openEditScreen(cm)) + .on("P", getChunkManager().diffChunkNav(cm, Direction.PREV)) + .on("Shift-M", header.reviewedAndNext()) + .on("Shift-N", maybePrevVimSearch(cm)) + .on("Shift-P", getCommentManager().commentNav(cm, Direction.PREV)) + .on("Shift-O", getCommentManager().openCloseAll(cm)) + .on( + "I", + new Runnable() { + @Override + public void run() { + switch (getIntraLineStatus()) { + case OFF: + case OK: + toggleShowIntraline(); + break; + case FAILURE: + case TIMEOUT: + default: + break; + } + } + }) + .on( + "','", + new Runnable() { + @Override + public void run() { + prefsAction.show(); + } + }) + .on( + "Shift-/", + new Runnable() { + @Override + public void run() { + new ShowHelpCommand().onKeyPress(null); + } + }) + .on( + "Space", + new Runnable() { + @Override + public void run() { + cm.vim().handleKey(""); + } + }) + .on( + "Shift-Space", + new Runnable() { + @Override + public void run() { + cm.vim().handleKey(""); + } + }) + .on( + "Ctrl-F", + new Runnable() { + @Override + public void run() { + cm.execCommand("find"); + } + }) + .on( + "Ctrl-G", + new Runnable() { + @Override + public void run() { + cm.execCommand("findNext"); + } + }) + .on("Enter", maybeNextCmSearch(cm)) + .on( + "Shift-Ctrl-G", + new Runnable() { + @Override + public void run() { + cm.execCommand("findPrev"); + } + }) + .on( + "Shift-Enter", + new Runnable() { + @Override + public void run() { + cm.execCommand("findPrev"); + } + }) + .on( + "Esc", + new Runnable() { + @Override + public void run() { + cm.setCursor(cm.getCursor()); + cm.execCommand("clearSearch"); + cm.vim().handleEx("nohlsearch"); + } + }) + .on( + "Ctrl-A", + new Runnable() { + @Override + public void run() { + cm.execCommand("selectAll"); + } + }) + .on( + "G O", + new Runnable() { + @Override + public void run() { + Gerrit.display(PageLinks.toChangeQuery("status:open")); + } + }) + .on( + "G M", + new Runnable() { + @Override + public void run() { + Gerrit.display(PageLinks.toChangeQuery("status:merged")); + } + }) + .on( + "G A", + new Runnable() { + @Override + public void run() { + Gerrit.display(PageLinks.toChangeQuery("status:abandoned")); + } + }); + if (Gerrit.isSignedIn()) { + keyMap + .on( + "G I", + new Runnable() { + @Override + public void run() { + Gerrit.display(PageLinks.MINE); + } + }) + .on( + "G D", + new Runnable() { + @Override + public void run() { + Gerrit.display(PageLinks.toChangeQuery("owner:self is:draft")); + } + }) + .on( + "G C", + new Runnable() { + @Override + public void run() { + Gerrit.display(PageLinks.toChangeQuery("has:draft")); + } + }) + .on( + "G W", + new Runnable() { + @Override + public void run() { + Gerrit.display(PageLinks.toChangeQuery("is:watched status:open")); + } + }) + .on( + "G S", + new Runnable() { + @Override + public void run() { + Gerrit.display(PageLinks.toChangeQuery("is:starred")); + } + }); + } if (revision.get() != 0) { cm.on("beforeSelectionChange", onSelectionChange(cm)); @@ -527,61 +578,61 @@ abstract class DiffScreen extends Screen { keysNavigation.add( new NoOpKeyCommand(KeyCommand.M_SHIFT, 'n', PatchUtil.C.commentNext()), new NoOpKeyCommand(KeyCommand.M_SHIFT, 'p', PatchUtil.C.commentPrev())); - keysNavigation.add( - new NoOpKeyCommand(KeyCommand.M_CTRL, 'f', Gerrit.C.keySearch())); + keysNavigation.add(new NoOpKeyCommand(KeyCommand.M_CTRL, 'f', Gerrit.C.keySearch())); keysAction = new KeyCommandSet(Gerrit.C.sectionActions()); - keysAction.add(new NoOpKeyCommand(0, KeyCodes.KEY_ENTER, - PatchUtil.C.expandComment())); + keysAction.add(new NoOpKeyCommand(0, KeyCodes.KEY_ENTER, PatchUtil.C.expandComment())); keysAction.add(new NoOpKeyCommand(0, 'o', PatchUtil.C.expandComment())); - keysAction.add(new NoOpKeyCommand( - KeyCommand.M_SHIFT, 'o', PatchUtil.C.expandAllCommentsOnCurrentLine())); + keysAction.add( + new NoOpKeyCommand(KeyCommand.M_SHIFT, 'o', PatchUtil.C.expandAllCommentsOnCurrentLine())); if (Gerrit.isSignedIn()) { - keysAction.add(new KeyCommand(0, 'r', PatchUtil.C.toggleReviewed()) { - @Override - public void onKeyPress(KeyPressEvent event) { - header.toggleReviewed().run(); - } - }); - keysAction.add(new NoOpKeyCommand(KeyCommand.M_CTRL | KeyCommand.M_ALT, - 'e', Gerrit.C.keyEditor())); + keysAction.add( + new KeyCommand(0, 'r', PatchUtil.C.toggleReviewed()) { + @Override + public void onKeyPress(KeyPressEvent event) { + header.toggleReviewed().run(); + } + }); + keysAction.add( + new NoOpKeyCommand(KeyCommand.M_CTRL | KeyCommand.M_ALT, 'e', Gerrit.C.keyEditor())); } - keysAction.add(new KeyCommand( - KeyCommand.M_SHIFT, 'm', PatchUtil.C.markAsReviewedAndGoToNext()) { - @Override - public void onKeyPress(KeyPressEvent event) { - header.reviewedAndNext().run(); - } - }); - keysAction.add(new KeyCommand(0, 'a', PatchUtil.C.openReply()) { - @Override - public void onKeyPress(KeyPressEvent event) { - upToChange(true).run(); - } - }); - keysAction.add(new KeyCommand(0, ',', PatchUtil.C.showPreferences()) { - @Override - public void onKeyPress(KeyPressEvent event) { - prefsAction.show(); - } - }); + keysAction.add( + new KeyCommand(KeyCommand.M_SHIFT, 'm', PatchUtil.C.markAsReviewedAndGoToNext()) { + @Override + public void onKeyPress(KeyPressEvent event) { + header.reviewedAndNext().run(); + } + }); + keysAction.add( + new KeyCommand(0, 'a', PatchUtil.C.openReply()) { + @Override + public void onKeyPress(KeyPressEvent event) { + upToChange(true).run(); + } + }); + keysAction.add( + new KeyCommand(0, ',', PatchUtil.C.showPreferences()) { + @Override + public void onKeyPress(KeyPressEvent event) { + prefsAction.show(); + } + }); if (getIntraLineStatus() == DiffInfo.IntraLineStatus.OFF || getIntraLineStatus() == DiffInfo.IntraLineStatus.OK) { - keysAction.add(new KeyCommand(0, 'i', PatchUtil.C.toggleIntraline()) { - @Override - public void onKeyPress(KeyPressEvent event) { - toggleShowIntraline(); - } - }); + keysAction.add( + new KeyCommand(0, 'i', PatchUtil.C.toggleIntraline()) { + @Override + public void onKeyPress(KeyPressEvent event) { + toggleShowIntraline(); + } + }); } if (Gerrit.isSignedIn()) { keysAction.add(new NoOpKeyCommand(0, 'c', PatchUtil.C.commentInsert())); keysComment = new KeyCommandSet(PatchUtil.C.commentEditorSet()); - keysComment.add(new NoOpKeyCommand(KeyCommand.M_CTRL, 's', - PatchUtil.C.commentSaveDraft())); - keysComment.add(new NoOpKeyCommand(0, KeyCodes.KEY_ESCAPE, - PatchUtil.C.commentCancelEdit())); + keysComment.add(new NoOpKeyCommand(KeyCommand.M_CTRL, 's', PatchUtil.C.commentSaveDraft())); + keysComment.add(new NoOpKeyCommand(0, KeyCodes.KEY_ESCAPE, PatchUtil.C.commentCancelEdit())); } else { keysComment = null; } @@ -599,20 +650,22 @@ abstract class DiffScreen extends Screen { void setupSyntaxHighlighting() { if (prefs.syntaxHighlighting() && fileSize.compareTo(FileSize.SMALL) > 0) { - Scheduler.get().scheduleFixedDelay(new RepeatingCommand() { - @Override - public boolean execute() { - if (prefs.syntaxHighlighting() && isAttached()) { - setSyntaxHighlighting(prefs.syntaxHighlighting()); - } - return false; - } - }, 250); + Scheduler.get() + .scheduleFixedDelay( + new RepeatingCommand() { + @Override + public boolean execute() { + if (prefs.syntaxHighlighting() && isAttached()) { + setSyntaxHighlighting(prefs.syntaxHighlighting()); + } + return false; + } + }, + 250); } } - abstract CodeMirror newCm( - DiffInfo.FileMeta meta, String contents, Element parent); + abstract CodeMirror newCm(DiffInfo.FileMeta meta, String contents, Element parent); void render(DiffInfo diff) { header.setNoDiff(diff); @@ -621,11 +674,9 @@ abstract class DiffScreen extends Screen { void setShowLineNumbers(boolean b) { if (b) { - getDiffTable().addStyleName( - Resources.I.diffTableStyle().showLineNumbers()); + getDiffTable().addStyleName(Resources.I.diffTableStyle().showLineNumbers()); } else { - getDiffTable().removeStyleName( - Resources.I.diffTableStyle().showLineNumbers()); + getDiffTable().removeStyleName(Resources.I.diffTableStyle().showLineNumbers()); } } @@ -648,14 +699,15 @@ abstract class DiffScreen extends Screen { abstract void setSyntaxHighlighting(boolean b); void setContext(final int context) { - operation(new Runnable() { - @Override - public void run() { - skipManager.removeAll(); - skipManager.render(context, diff); - updateRenderEntireFile(); - } - }); + operation( + new Runnable() { + @Override + public void run() { + skipManager.removeAll(); + skipManager.render(context, diff); + updateRenderEntireFile(); + } + }); } private int adjustCommitMessageLine(int line) { @@ -787,16 +839,16 @@ abstract class DiffScreen extends Screen { CallbackGroup group = new CallbackGroup(); getCommentManager().saveAllDrafts(group); group.done(); - group.addListener(new GerritCallback() { - @Override - public void onSuccess(Void result) { - String rev = String.valueOf(revision.get()); - Gerrit.display( - PageLinks.toChange(changeId, base.asString(), rev), - new ChangeScreen(changeId, base, rev, openReplyBox, - FileTable.Mode.REVIEW)); - } - }); + group.addListener( + new GerritCallback() { + @Override + public void onSuccess(Void result) { + String rev = String.valueOf(revision.get()); + Gerrit.display( + PageLinks.toChange(changeId, base.asString(), rev), + new ChangeScreen(changeId, base, rev, openReplyBox, FileTable.Mode.REVIEW)); + } + }); } }; } @@ -876,12 +928,11 @@ abstract class DiffScreen extends Screen { } String getContentType(DiffInfo.FileMeta meta) { - if (prefs.syntaxHighlighting() && meta != null - && meta.contentType() != null) { - ModeInfo m = ModeInfo.findMode(meta.contentType(), path); - return m != null ? m.mime() : null; - } - return null; + if (prefs.syntaxHighlighting() && meta != null && meta.contentType() != null) { + ModeInfo m = ModeInfo.findMode(meta.contentType(), path); + return m != null ? m.mime() : null; + } + return null; } String getContentType() { @@ -901,52 +952,54 @@ abstract class DiffScreen extends Screen { String nextPath = header.getNextPath(); if (nextPath != null) { DiffApi.diff(revision, nextPath) - .base(base.asPatchSetId()) - .wholeFile() - .intraline(prefs.intralineDifference()) - .ignoreWhitespace(prefs.ignoreWhitespace()) - .get(new AsyncCallback() { - @Override - public void onSuccess(DiffInfo info) { - new ModeInjector() - .add(getContentType(info.metaA())) - .add(getContentType(info.metaB())) - .inject(CallbackGroup. emptyCallback()); - } + .base(base.asPatchSetId()) + .wholeFile() + .intraline(prefs.intralineDifference()) + .ignoreWhitespace(prefs.ignoreWhitespace()) + .get( + new AsyncCallback() { + @Override + public void onSuccess(DiffInfo info) { + new ModeInjector() + .add(getContentType(info.metaA())) + .add(getContentType(info.metaB())) + .inject(CallbackGroup.emptyCallback()); + } - @Override - public void onFailure(Throwable caught) { - } - }); + @Override + public void onFailure(Throwable caught) {} + }); } } void reloadDiffInfo() { final int id = ++reloadVersionId; DiffApi.diff(revision, path) - .base(base.asPatchSetId()) - .wholeFile() - .intraline(prefs.intralineDifference()) - .ignoreWhitespace(prefs.ignoreWhitespace()) - .get(new GerritCallback() { - @Override - public void onSuccess(DiffInfo diffInfo) { - if (id == reloadVersionId && isAttached()) { - diff = diffInfo; - operation(new Runnable() { + .base(base.asPatchSetId()) + .wholeFile() + .intraline(prefs.intralineDifference()) + .ignoreWhitespace(prefs.ignoreWhitespace()) + .get( + new GerritCallback() { @Override - public void run() { - skipManager.removeAll(); - getChunkManager().reset(); - getDiffTable().scrollbar.removeDiffAnnotations(); - setShowIntraline(prefs.intralineDifference()); - render(diff); - skipManager.render(prefs.context(), diff); + public void onSuccess(DiffInfo diffInfo) { + if (id == reloadVersionId && isAttached()) { + diff = diffInfo; + operation( + new Runnable() { + @Override + public void run() { + skipManager.removeAll(); + getChunkManager().reset(); + getDiffTable().scrollbar.removeDiffAnnotations(); + setShowIntraline(prefs.intralineDifference()); + render(diff); + skipManager.render(prefs.context(), diff); + } + }); + } } }); - } - } - }); } private static FileSize bucketFileSize(DiffInfo diff) { @@ -955,8 +1008,7 @@ abstract class DiffScreen extends Screen { FileSize[] sizes = FileSize.values(); for (int i = sizes.length - 1; 0 <= i; i--) { FileSize s = sizes[i]; - if ((a != null && s.lines <= a.lines()) - || (b != null && s.lines <= b.lines())) { + if ((a != null && s.lines <= a.lines()) || (b != null && s.lines <= b.lines())) { return s; } } @@ -968,23 +1020,23 @@ abstract class DiffScreen extends Screen { private GutterClickHandler onGutterClick(final CodeMirror cm) { return new GutterClickHandler() { @Override - public void handle(CodeMirror instance, final int line, - final String gutterClass, NativeEvent clickEvent) { - if (Element.as(clickEvent.getEventTarget()) - .hasClassName(getLineNumberClassName()) + public void handle( + CodeMirror instance, final int line, final String gutterClass, NativeEvent clickEvent) { + if (Element.as(clickEvent.getEventTarget()).hasClassName(getLineNumberClassName()) && clickEvent.getButton() == NativeEvent.BUTTON_LEFT && !clickEvent.getMetaKey() && !clickEvent.getAltKey() && !clickEvent.getCtrlKey() && !clickEvent.getShiftKey()) { cm.setCursor(Pos.create(line)); - Scheduler.get().scheduleDeferred(new ScheduledCommand() { - @Override - public void execute() { - getCommentManager().newDraftOnGutterClick( - cm, gutterClass, line + 1); - } - }); + Scheduler.get() + .scheduleDeferred( + new ScheduledCommand() { + @Override + public void execute() { + getCommentManager().newDraftOnGutterClick(cm, gutterClass, line + 1); + } + }); } } }; diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.java index 54b55f04e5..4650acfe7f 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.java @@ -29,12 +29,9 @@ import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.UIObject; import com.google.gwt.user.client.ui.Widget; - import net.codemirror.lib.CodeMirror; -/** - * Base class for SideBySideTable2 and UnifiedTable2 - */ +/** Base class for SideBySideTable2 and UnifiedTable2 */ abstract class DiffTable extends Composite { static { Resources.I.diffTableStyle().ensureInjected(); @@ -42,11 +39,17 @@ abstract class DiffTable extends Composite { interface Style extends CssResource { String fullscreen(); + String dark(); + String noIntraline(); + String range(); + String rangeHighlight(); + String diffHeader(); + String showLineNumbers(); } @@ -67,12 +70,13 @@ abstract class DiffTable extends Composite { private ChangeType changeType; Scrollbar scrollbar; - DiffTable(DiffScreen parent, DiffObject base, DiffObject revision, - String path) { - patchSetSelectBoxA = new PatchSetSelectBox(parent, DisplaySide.A, - revision.asPatchSetId().getParentKey(), base, path); - patchSetSelectBoxB = new PatchSetSelectBox(parent, DisplaySide.B, - revision.asPatchSetId().getParentKey(), revision, path); + DiffTable(DiffScreen parent, DiffObject base, DiffObject revision, String path) { + patchSetSelectBoxA = + new PatchSetSelectBox( + parent, DisplaySide.A, revision.asPatchSetId().getParentKey(), base, path); + patchSetSelectBoxB = + new PatchSetSelectBox( + parent, DisplaySide.B, revision.asPatchSetId().getParentKey(), revision, path); PatchSetSelectBox.link(patchSetSelectBoxA, patchSetSelectBoxB); this.scrollbar = new Scrollbar(this); @@ -100,23 +104,28 @@ abstract class DiffTable extends Composite { return changeType; } - void setUpBlameIconA(CodeMirror cm, boolean isBase, PatchSet.Id rev, - String path) { + void setUpBlameIconA(CodeMirror cm, boolean isBase, PatchSet.Id rev, String path) { patchSetSelectBoxA.setUpBlame(cm, isBase, rev, path); } - void setUpBlameIconB(CodeMirror cm, PatchSet.Id rev, - String path) { + void setUpBlameIconB(CodeMirror cm, PatchSet.Id rev, String path) { patchSetSelectBoxB.setUpBlame(cm, false, rev, path); } - void set(DiffPreferences prefs, JsArray list, int parents, DiffInfo info, - boolean editExists, boolean current, boolean open, boolean binary) { + void set( + DiffPreferences prefs, + JsArray list, + int parents, + DiffInfo info, + boolean editExists, + boolean current, + boolean open, + boolean binary) { this.changeType = info.changeType(); - patchSetSelectBoxA.setUpPatchSetNav(list, parents, info.metaA(), editExists, - current, open, binary); - patchSetSelectBoxB.setUpPatchSetNav(list, parents, info.metaB(), editExists, - current, open, binary); + patchSetSelectBoxA.setUpPatchSetNav( + list, parents, info.metaA(), editExists, current, open, binary); + patchSetSelectBoxB.setUpPatchSetNav( + list, parents, info.metaB(), editExists, current, open, binary); JsArrayString hdr = info.diffHeader(); if (hdr != null) { @@ -125,9 +134,9 @@ abstract class DiffTable extends Composite { String s = hdr.get(i); if (!info.binary() && (s.startsWith("diff --git ") - || s.startsWith("index ") - || s.startsWith("+++ ") - || s.startsWith("--- "))) { + || s.startsWith("index ") + || s.startsWith("+++ ") + || s.startsWith("--- "))) { continue; } b.append(s).append('\n'); @@ -149,9 +158,7 @@ abstract class DiffTable extends Composite { void refresh() { if (header) { CodeMirror cm = getDiffScreen().getCmFromSide(DisplaySide.A); - diffHeaderText.getStyle().setMarginLeft( - cm.getGutterElement().getOffsetWidth(), - Unit.PX); + diffHeaderText.getStyle().setMarginLeft(cm.getGutterElement().getOffsetWidth(), Unit.PX); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/Direction.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/Direction.java index 9b0b1c4762..b1dd87e1cf 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/Direction.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/Direction.java @@ -16,5 +16,6 @@ package com.google.gerrit.client.diff; /** Direction of traversal in an ordered list. */ public enum Direction { - PREV, NEXT + PREV, + NEXT } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DisplaySide.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DisplaySide.java index c7ee6783cf..6cee17410a 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DisplaySide.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DisplaySide.java @@ -16,7 +16,8 @@ package com.google.gerrit.client.diff; /** Enum representing the side on a side-by-side view */ public enum DisplaySide { - A, B; + A, + B; DisplaySide otherSide() { return this == A ? B : A; diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DraftBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DraftBox.java index d814a576a9..b86df0be91 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DraftBox.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DraftBox.java @@ -50,12 +50,12 @@ import com.google.gwt.user.client.ui.UIObject; import com.google.gwt.user.client.ui.Widget; import com.google.gwtexpui.globalkey.client.NpTextArea; import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder; - import net.codemirror.lib.CodeMirror; /** An HtmlPanel for displaying and editing a draft */ class DraftBox extends CommentBox { interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); private static final int INITIAL_LINES = 5; @@ -100,39 +100,44 @@ class DraftBox extends CommentBox { expandAll = expandAllComments; initWidget(uiBinder.createAndBindUi(this)); - expandTimer = new Timer() { - @Override - public void run() { - expandText(); - } - }; + expandTimer = + new Timer() { + @Override + public void run() { + expandText(); + } + }; set(info); - header.addDomHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - if (!isEdit()) { - if (autoClosed && !isOpen()) { - setOpen(true); - setEdit(true); - } else { - setOpen(!isOpen()); + header.addDomHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + if (!isEdit()) { + if (autoClosed && !isOpen()) { + setOpen(true); + setEdit(true); + } else { + setOpen(!isOpen()); + } + } } - } - } - }, ClickEvent.getType()); + }, + ClickEvent.getType()); - addDomHandler(new DoubleClickHandler() { - @Override - public void onDoubleClick(DoubleClickEvent event) { - if (isEdit()) { - editArea.setFocus(true); - } else { - setOpen(true); - setEdit(true); - } - } - }, DoubleClickEvent.getType()); + addDomHandler( + new DoubleClickHandler() { + @Override + public void onDoubleClick(DoubleClickEvent event) { + if (isEdit()) { + editArea.setFocus(true); + } else { + setOpen(true); + setEdit(true); + } + } + }, + DoubleClickEvent.getType()); initResizeHandler(); } @@ -143,8 +148,7 @@ class DraftBox extends CommentBox { if (info.message() != null) { String msg = info.message().trim(); summary.setInnerText(msg); - message.setHTML(linkProcessor.apply( - new SafeHtmlBuilder().append(msg).wikify())); + message.setHTML(linkProcessor.apply(new SafeHtmlBuilder().append(msg).wikify())); } comment = info; } @@ -191,24 +195,24 @@ class DraftBox extends CommentBox { setRangeHighlight(edit); if (edit) { - String msg = comment.message() != null - ? comment.message() - : ""; + String msg = comment.message() != null ? comment.message() : ""; editArea.setValue(msg); cancel.setVisible(!isNew()); expandText(); editAreaHeight = editArea.getOffsetHeight(); final int len = msg.length(); - Scheduler.get().scheduleDeferred(new ScheduledCommand() { - @Override - public void execute() { - editArea.setFocus(true); - if (len > 0) { - editArea.setCursorPos(len); - } - } - }); + Scheduler.get() + .scheduleDeferred( + new ScheduledCommand() { + @Override + public void execute() { + editArea.setFocus(true); + if (len > 0) { + editArea.setCursorPos(len); + } + } + }); } else { expandTimer.cancel(); resizeTimer.cancel(); @@ -292,31 +296,32 @@ class DraftBox extends CommentBox { pendingGroup = group; final LocalComments lc = new LocalComments(psId); - GerritCallback cb = new GerritCallback() { - @Override - public void onSuccess(CommentInfo result) { - enableEdit(true); - pendingGroup = null; - set(result); - setEdit(false); - if (autoClosed) { - setOpen(false); - } - getCommentManager().setUnsaved(DraftBox.this, false); - } + GerritCallback cb = + new GerritCallback() { + @Override + public void onSuccess(CommentInfo result) { + enableEdit(true); + pendingGroup = null; + set(result); + setEdit(false); + if (autoClosed) { + setOpen(false); + } + getCommentManager().setUnsaved(DraftBox.this, false); + } - @Override - public void onFailure(Throwable e) { - enableEdit(true); - pendingGroup = null; - if (RestApi.isNotSignedIn(e)) { - CommentInfo saved = CommentInfo.copy(comment); - saved.message(editArea.getValue().trim()); - lc.setInlineComment(saved); - } - super.onFailure(e); - } - }; + @Override + public void onFailure(Throwable e) { + enableEdit(true); + pendingGroup = null; + if (RestApi.isNotSignedIn(e)) { + CommentInfo saved = CommentInfo.copy(comment); + saved.message(editArea.getValue().trim()); + lc.setInlineComment(saved); + } + super.onFailure(e); + } + }; if (input.id() == null) { CommentApi.createDraft(psId, input, group.add(cb)); } else { @@ -358,22 +363,24 @@ class DraftBox extends CommentBox { } else { setEdit(false); pendingGroup = new CallbackGroup(); - CommentApi.deleteDraft(psId, comment.id(), - pendingGroup.addFinal(new GerritCallback() { - @Override - public void onSuccess(JavaScriptObject result) { - pendingGroup = null; - removeUI(); - } - })); + CommentApi.deleteDraft( + psId, + comment.id(), + pendingGroup.addFinal( + new GerritCallback() { + @Override + public void onSuccess(JavaScriptObject result) { + pendingGroup = null; + removeUI(); + } + })); } } @UiHandler("editArea") void onKeyDown(KeyDownEvent e) { resizeTimer.cancel(); - if ((e.isControlKeyDown() || e.isMetaKeyDown()) - && !e.isAltKeyDown() && !e.isShiftKeyDown()) { + if ((e.isControlKeyDown() || e.isMetaKeyDown()) && !e.isAltKeyDown() && !e.isShiftKeyDown()) { switch (e.getNativeKeyCode()) { case 's': case 'S': @@ -405,32 +412,37 @@ class DraftBox extends CommentBox { } private void initResizeHandler() { - resizeTimer = new Timer() { - @Override - public void run() { - getCommentGroup().resize(); - } - }; + resizeTimer = + new Timer() { + @Override + public void run() { + getCommentGroup().resize(); + } + }; - addDomHandler(new MouseMoveHandler() { - @Override - public void onMouseMove(MouseMoveEvent event) { - int h = editArea.getOffsetHeight(); - if (isEdit() && h != editAreaHeight) { - getCommentGroup().resize(); - resizeTimer.scheduleRepeating(50); - editAreaHeight = h; - } - } - }, MouseMoveEvent.getType()); + addDomHandler( + new MouseMoveHandler() { + @Override + public void onMouseMove(MouseMoveEvent event) { + int h = editArea.getOffsetHeight(); + if (isEdit() && h != editAreaHeight) { + getCommentGroup().resize(); + resizeTimer.scheduleRepeating(50); + editAreaHeight = h; + } + } + }, + MouseMoveEvent.getType()); - addDomHandler(new MouseUpHandler() { - @Override - public void onMouseUp(MouseUpEvent event) { - resizeTimer.cancel(); - getCommentGroup().resize(); - } - }, MouseUpEvent.getType()); + addDomHandler( + new MouseUpHandler() { + @Override + public void onMouseUp(MouseUpEvent event) { + resizeTimer.cancel(); + getCommentGroup().resize(); + } + }, + MouseUpEvent.getType()); } private boolean isNew() { @@ -442,8 +454,6 @@ class DraftBox extends CommentBox { if (isNew()) { return msg.length() > 0; } - return !msg.equals(comment.message() != null - ? comment.message().trim() - : ""); + return !msg.equals(comment.message() != null ? comment.message().trim() : ""); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/EditIterator.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/EditIterator.java index ce3a5625cb..4cf78c79c2 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/EditIterator.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/EditIterator.java @@ -15,7 +15,6 @@ package com.google.gerrit.client.diff; import com.google.gwt.core.client.JsArrayString; - import net.codemirror.lib.Pos; /** An iterator for intraline edits */ @@ -36,9 +35,7 @@ class EditIterator { while (line < lines.length()) { int len = lines.get(line).length() - pos + 1; // + 1 for LF if (numOfChar < len) { - Pos at = Pos.create( - startLine + line, - numOfChar + pos); + Pos at = Pos.create(startLine + line, numOfChar + pos); pos += numOfChar; return at; } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/Header.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/Header.java index f3b9886bee..a2ffb03f5f 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/Header.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/Header.java @@ -59,18 +59,20 @@ import com.google.gwtexpui.globalkey.client.KeyCommand; import com.google.gwtexpui.globalkey.client.KeyCommandSet; import com.google.gwtexpui.safehtml.client.SafeHtml; import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder; - import java.util.List; public class Header extends Composite { interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); + static { Resources.I.style().ensureInjected(); } private enum ReviewedState { - AUTO_REVIEW, LOADED + AUTO_REVIEW, + LOADED } @UiField CheckBox reviewed; @@ -100,8 +102,13 @@ public class Header extends Composite { private PreferencesAction prefsAction; private ReviewedState reviewedState; - Header(KeyCommandSet keys, DiffObject base, DiffObject patchSetId, - String path, DiffView diffSreenType, DiffPreferences prefs) { + Header( + KeyCommandSet keys, + DiffObject base, + DiffObject patchSetId, + String path, + DiffView diffSreenType, + DiffPreferences prefs) { initWidget(uiBinder.createAndBindUi(this)); this.keys = keys; this.base = base; @@ -115,8 +122,10 @@ public class Header extends Composite { } SafeHtml.setInnerHTML(filePath, formatPath(path)); up.setTargetHistoryToken( - PageLinks.toChange(patchSetId.asPatchSetId().getParentKey(), - base.asString(), patchSetId.asPatchSetId().getId())); + PageLinks.toChange( + patchSetId.asPatchSetId().getParentKey(), + base.asString(), + patchSetId.asPatchSetId().getId())); } public static SafeHtml formatPath(String path) { @@ -148,36 +157,39 @@ public class Header extends Composite { @Override protected void onLoad() { - DiffApi.list(patchSetId, base.asPatchSetId(), + DiffApi.list( + patchSetId, + base.asPatchSetId(), new GerritCallback>() { @Override public void onSuccess(NativeMap result) { files = result.values(); FileInfo.sortFileInfoByPath(files); - fileNumber.setInnerText(Integer - .toString(Natives.asList(files).indexOf(result.get(path)) + 1)); + fileNumber.setInnerText( + Integer.toString(Natives.asList(files).indexOf(result.get(path)) + 1)); fileCount.setInnerText(Integer.toString(files.length())); } }); if (Gerrit.isSignedIn()) { - ChangeApi.revision(patchSetId).view("files") - .addParameterTrue("reviewed") - .get(new AsyncCallback() { - @Override - public void onSuccess(JsArrayString result) { - boolean b = Natives.asList(result).contains(path); - reviewed.setValue(b, false); - if (!b && reviewedState == ReviewedState.AUTO_REVIEW) { - postAutoReviewed(); - } - reviewedState = ReviewedState.LOADED; - } + ChangeApi.revision(patchSetId) + .view("files") + .addParameterTrue("reviewed") + .get( + new AsyncCallback() { + @Override + public void onSuccess(JsArrayString result) { + boolean b = Natives.asList(result).contains(path); + reviewed.setValue(b, false); + if (!b && reviewedState == ReviewedState.AUTO_REVIEW) { + postAutoReviewed(); + } + reviewedState = ReviewedState.LOADED; + } - @Override - public void onFailure(Throwable caught) { - } - }); + @Override + public void onFailure(Throwable caught) {} + }); } } @@ -193,8 +205,7 @@ public class Header extends Composite { project.setInnerText(info.project()); } - void init(PreferencesAction pa, List links, - List webLinks) { + void init(PreferencesAction pa, List links, List webLinks) { prefsAction = pa; prefsAction.setPartner(preferences); @@ -209,30 +220,29 @@ public class Header extends Composite { @UiHandler("reviewed") void onValueChange(ValueChangeEvent event) { if (event.getValue()) { - reviewed().put(CallbackGroup. emptyCallback()); + reviewed().put(CallbackGroup.emptyCallback()); } else { - reviewed().delete(CallbackGroup. emptyCallback()); + reviewed().delete(CallbackGroup.emptyCallback()); } } private void postAutoReviewed() { - reviewed().background().put(new AsyncCallback() { - @Override - public void onSuccess(ReviewInfo result) { - reviewed.setValue(true, false); - } + reviewed() + .background() + .put( + new AsyncCallback() { + @Override + public void onSuccess(ReviewInfo result) { + reviewed.setValue(true, false); + } - @Override - public void onFailure(Throwable caught) { - } - }); + @Override + public void onFailure(Throwable caught) {} + }); } private RestApi reviewed() { - return ChangeApi.revision(patchSetId) - .view("files") - .id(path) - .view("reviewed"); + return ChangeApi.revision(patchSetId).view("files").id(path).view("reviewed"); } @UiHandler("preferences") @@ -250,15 +260,16 @@ public class Header extends Composite { if (info != null) { final String url = url(info); link.setTargetHistoryToken(url); - link.setTitle(PatchUtil.M.fileNameWithShortcutKey( - FileInfo.getFileName(info.path()), - Character.toString(key))); - KeyCommand k = new KeyCommand(0, key, help) { - @Override - public void onKeyPress(KeyPressEvent event) { - Gerrit.display(url); - } - }; + link.setTitle( + PatchUtil.M.fileNameWithShortcutKey( + FileInfo.getFileName(info.path()), Character.toString(key))); + KeyCommand k = + new KeyCommand(0, key, help) { + @Override + public void onKeyPress(KeyPressEvent event) { + Gerrit.display(url); + } + }; keys.add(k); if (link == prev) { hasPrev = true; @@ -298,10 +309,8 @@ public class Header extends Composite { nextInfo = curr; break; } - KeyCommand p = setupNav(prev, '[', PatchUtil.C.previousFileHelp(), - prevInfo); - KeyCommand n = setupNav(next, ']', PatchUtil.C.nextFileHelp(), - nextInfo); + KeyCommand p = setupNav(prev, '[', PatchUtil.C.previousFileHelp(), prevInfo); + KeyCommand n = setupNav(next, ']', PatchUtil.C.nextFileHelp(), nextInfo); if (p != null && n != null) { keys.pair(p, n); } @@ -336,8 +345,7 @@ public class Header extends Composite { default: return new Runnable() { @Override - public void run() { - } + public void run() {} }; } } @@ -363,8 +371,7 @@ public class Header extends Composite { UIObject.setVisible(noDiff, false); // Don't bother showing "No Differences" } else { JsArray regions = diff.content(); - boolean b = regions.length() == 0 - || (regions.length() == 1 && regions.get(0).ab() != null); + boolean b = regions.length() == 0 || (regions.length() == 1 && regions.get(0).ab() != null); UIObject.setVisible(noDiff, b); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/InsertCommentBubble.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/InsertCommentBubble.java index ac295e389f..b04973abc4 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/InsertCommentBubble.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/InsertCommentBubble.java @@ -24,28 +24,28 @@ import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.Image; - import net.codemirror.lib.CodeMirror; import net.codemirror.lib.Rect; /** Bubble displayed near a selected region to create a comment. */ class InsertCommentBubble extends Composite { interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); @UiField Image icon; - InsertCommentBubble( - final CommentManager commentManager, - final CodeMirror cm) { + InsertCommentBubble(final CommentManager commentManager, final CodeMirror cm) { initWidget(uiBinder.createAndBindUi(this)); - addDomHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - setVisible(false); - commentManager.newDraftCallback(cm).run(); - } - }, ClickEvent.getType()); + addDomHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + setVisible(false); + commentManager.newDraftCallback(cm).run(); + } + }, + ClickEvent.getType()); } void position(Rect r) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/LineMapper.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/LineMapper.java index 96128f36e3..fc83a144ea 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/LineMapper.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/LineMapper.java @@ -78,39 +78,28 @@ class LineMapper { /** * Helper method to retrieve the line number on the other side. * - * Given a line number on one side, performs a binary search in the lineMap - * to find the corresponding LineGap record. + *

Given a line number on one side, performs a binary search in the lineMap to find the + * corresponding LineGap record. * - * A LineGap records gap information from the start of an actual gap up to - * the start of the next gap. In the following example, - * lineMapAtoB will have LineGap: {start: 1, end: -1, delta: 3} - * (end set to -1 to represent a dummy gap of length zero. The binary search - * only looks at start so setting it to -1 has no effect here.) - * lineMapBtoA will have LineGap: {start: 1, end: 3, delta: -3} - * These LineGaps control lines between 1 and 5. + *

A LineGap records gap information from the start of an actual gap up to the start of the + * next gap. In the following example, lineMapAtoB will have LineGap: {start: 1, end: -1, delta: + * 3} (end set to -1 to represent a dummy gap of length zero. The binary search only looks at + * start so setting it to -1 has no effect here.) lineMapBtoA will have LineGap: {start: 1, end: + * 3, delta: -3} These LineGaps control lines between 1 and 5. * - * The "delta" is computed as the number to add on our side to get the line - * number on the other side given a line after the actual gap, so the result - * will be (line + delta). All lines within the actual gap (1 to 3) are - * considered corresponding to the last line above the region on the other - * side, which is 0 in this case. For these lines, we do (end + delta). + *

The "delta" is computed as the number to add on our side to get the line number on the other + * side given a line after the actual gap, so the result will be (line + delta). All lines within + * the actual gap (1 to 3) are considered corresponding to the last line above the region on the + * other side, which is 0 in this case. For these lines, we do (end + delta). * - * For example, to get the line number on the left corresponding to 1 on the - * right (lineOnOther(REVISION, 1)), the method looks up in lineMapBtoA, - * finds the "delta" to be -3, and returns 3 + (-3) = 0 since 1 falls in the - * actual gap. On the other hand, the line corresponding to 5 on the right - * will be 5 + (-3) = 2, since 5 is in the region after the gap (but still + *

For example, to get the line number on the left corresponding to 1 on the right + * (lineOnOther(REVISION, 1)), the method looks up in lineMapBtoA, finds the "delta" to be -3, and + * returns 3 + (-3) = 0 since 1 falls in the actual gap. On the other hand, the line corresponding + * to 5 on the right will be 5 + (-3) = 2, since 5 is in the region after the gap (but still * controlled by the current LineGap). * - * PARENT REVISION - * 0 | 0 - * - | 1 \ \ - * - | 2 | Actual insertion gap | - * - | 3 / | Region controlled by one LineGap - * 1 | 4 <- delta = 4 - 1 = 3 | - * 2 | 5 / - * - | 6 - * ... + *

PARENT REVISION 0 | 0 - | 1 \ \ - | 2 | Actual insertion gap | - | 3 / | Region controlled + * by one LineGap 1 | 4 <- delta = 4 - 1 = 3 | 2 | 5 / - | 6 ... */ LineOnOtherInfo lineOnOther(DisplaySide mySide, int line) { List lineGaps = gapList(mySide); @@ -204,14 +193,14 @@ class LineMapper { } /** - * Helper class to record line gap info and assist in calculation of line - * number on the other side. + * Helper class to record line gap info and assist in calculation of line number on the other + * side. + * + *

For a mapping from A to B, where A is the side with an insertion: * - * For a mapping from A to B, where A is the side with an insertion: * @field start The start line of the insertion in A. * @field end The exclusive end line of the insertion in A. - * @field delta The offset added to A to get the line number in B calculated - * from end. + * @field delta The offset added to A to get the line number in B calculated from end. */ private static class LineGap implements Comparable { private final int start; diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/NoOpKeyCommand.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/NoOpKeyCommand.java index 969b8619a3..584232d1b5 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/NoOpKeyCommand.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/NoOpKeyCommand.java @@ -24,6 +24,5 @@ class NoOpKeyCommand extends KeyCommand { } @Override - public void onKeyPress(KeyPressEvent event) { - } + public void onKeyPress(KeyPressEvent event) {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PatchSetSelectBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PatchSetSelectBox.java index b07a199ea3..822bc74350 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PatchSetSelectBox.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PatchSetSelectBox.java @@ -44,14 +44,13 @@ import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.ImageResourceRenderer; import com.google.gwt.user.client.ui.Widget; import com.google.gwtorm.client.KeyUtil; - -import net.codemirror.lib.CodeMirror; - import java.util.List; +import net.codemirror.lib.CodeMirror; /** HTMLPanel to select among patch sets */ class PatchSetSelectBox extends Composite { interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); interface BoxStyle extends CssResource { @@ -71,11 +70,8 @@ class PatchSetSelectBox extends Composite { private DiffObject idActive; private PatchSetSelectBox other; - PatchSetSelectBox(DiffScreen parent, - DisplaySide side, - Change.Id changeId, - DiffObject diffObject, - String path) { + PatchSetSelectBox( + DiffScreen parent, DisplaySide side, Change.Id changeId, DiffObject diffObject, String path) { initWidget(uiBinder.createAndBindUi(this)); icon.setTitle(PatchUtil.C.addFileCommentToolTip()); icon.addStyleName(Gerrit.RESOURCES.css().link()); @@ -89,27 +85,30 @@ class PatchSetSelectBox extends Composite { this.path = path; } - void setUpPatchSetNav(JsArray list, int parents, DiffInfo.FileMeta meta, - boolean editExists, boolean current, boolean open, boolean binary) { + void setUpPatchSetNav( + JsArray list, + int parents, + DiffInfo.FileMeta meta, + boolean editExists, + boolean current, + boolean open, + boolean binary) { InlineHyperlink selectedLink = null; if (sideA) { if (parents <= 1) { - InlineHyperlink link = - createLink(PatchUtil.C.patchBase(), DiffObject.base()); + InlineHyperlink link = createLink(PatchUtil.C.patchBase(), DiffObject.base()); linkPanel.add(link); selectedLink = link; } else { for (int i = parents; i > 0; i--) { PatchSet.Id id = new PatchSet.Id(changeId, -i); - InlineHyperlink link = - createLink(Util.M.diffBaseParent(i), DiffObject.patchSet(id)); + InlineHyperlink link = createLink(Util.M.diffBaseParent(i), DiffObject.patchSet(id)); linkPanel.add(link); if (revision != null && id.equals(revision)) { selectedLink = link; } } - InlineHyperlink link = - createLink(Util.C.autoMerge(), DiffObject.autoMerge()); + InlineHyperlink link = createLink(Util.C.autoMerge(), DiffObject.autoMerge()); linkPanel.add(link); if (selectedLink == null) { selectedLink = link; @@ -118,8 +117,8 @@ class PatchSetSelectBox extends Composite { } for (int i = 0; i < list.length(); i++) { RevisionInfo r = list.get(i); - InlineHyperlink link = createLink(r.id(), - DiffObject.patchSet(new PatchSet.Id(changeId, r._number()))); + InlineHyperlink link = + createLink(r.id(), DiffObject.patchSet(new PatchSet.Id(changeId, r._number()))); linkPanel.add(link); if (revision != null && r.id().equals(revision.getId())) { selectedLink = link; @@ -136,8 +135,7 @@ class PatchSetSelectBox extends Composite { linkPanel.add(createDownloadLink()); } if (!binary && open && !idActive.isBaseOrAutoMerge() && Gerrit.isSignedIn()) { - if ((editExists && idActive.isEdit()) - || (!editExists && current)) { + if ((editExists && idActive.isEdit()) || (!editExists && current)) { linkPanel.add(createEditIcon()); } } @@ -149,46 +147,46 @@ class PatchSetSelectBox extends Composite { } } - void setUpBlame(final CodeMirror cm, final boolean isBase, - final PatchSet.Id rev, final String path) { - if (!Patch.isMagic(path) && Gerrit.isSignedIn() - && Gerrit.info().change().allowBlame()) { + void setUpBlame( + final CodeMirror cm, final boolean isBase, final PatchSet.Id rev, final String path) { + if (!Patch.isMagic(path) && Gerrit.isSignedIn() && Gerrit.info().change().allowBlame()) { Anchor blameIcon = createBlameIcon(); - blameIcon.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent clickEvent) { - if (cm.extras().getBlameInfo() != null) { - cm.extras().toggleAnnotation(); - } else { - ChangeApi.blame(rev, path, isBase) - .get(new GerritCallback>() { + blameIcon.addClickHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent clickEvent) { + if (cm.extras().getBlameInfo() != null) { + cm.extras().toggleAnnotation(); + } else { + ChangeApi.blame(rev, path, isBase) + .get( + new GerritCallback>() { - @Override - public void onSuccess(JsArray lines) { - cm.extras().toggleAnnotation(lines); - } - }); - } - } - }); + @Override + public void onSuccess(JsArray lines) { + cm.extras().toggleAnnotation(lines); + } + }); + } + } + }); linkPanel.add(blameIcon); } } private Widget createEditIcon() { - PatchSet.Id id = idActive.isBaseOrAutoMerge() - ? other.idActive.asPatchSetId() - : idActive.asPatchSetId(); - Anchor anchor = new Anchor( - new ImageResourceRenderer().render(Gerrit.RESOURCES.edit()), - "#" + Dispatcher.toEditScreen(id, path)); + PatchSet.Id id = + idActive.isBaseOrAutoMerge() ? other.idActive.asPatchSetId() : idActive.asPatchSetId(); + Anchor anchor = + new Anchor( + new ImageResourceRenderer().render(Gerrit.RESOURCES.edit()), + "#" + Dispatcher.toEditScreen(id, path)); anchor.setTitle(PatchUtil.C.edit()); return anchor; } private Anchor createBlameIcon() { - Anchor anchor = new Anchor( - new ImageResourceRenderer().render(Gerrit.RESOURCES.blame())); + Anchor anchor = new Anchor(new ImageResourceRenderer().render(Gerrit.RESOURCES.blame())); anchor.setTitle(PatchUtil.C.blame()); return anchor; } @@ -206,21 +204,21 @@ class PatchSetSelectBox extends Composite { DiffObject diffBase = sideA ? id : other.idActive; DiffObject revision = sideA ? other.idActive : id; - return new InlineHyperlink(label, + return new InlineHyperlink( + label, parent.isSideBySide() ? Dispatcher.toSideBySide(diffBase, revision.asPatchSetId(), path) : Dispatcher.toUnified(diffBase, revision.asPatchSetId(), path)); } private Anchor createDownloadLink() { - DiffObject diffObject = idActive.isBaseOrAutoMerge() - ? other.idActive : idActive; + DiffObject diffObject = idActive.isBaseOrAutoMerge() ? other.idActive : idActive; String sideURL = idActive.isBaseOrAutoMerge() ? "1" : "0"; String base = GWT.getHostPageBaseURL() + "cat/"; - Anchor anchor = new Anchor( - new ImageResourceRenderer().render(Gerrit.RESOURCES.downloadIcon()), - base + KeyUtil.encode(diffObject.asPatchSetId() + "," + path) + "^" - + sideURL); + Anchor anchor = + new Anchor( + new ImageResourceRenderer().render(Gerrit.RESOURCES.downloadIcon()), + base + KeyUtil.encode(diffObject.asPatchSetId() + "," + path) + "^" + sideURL); anchor.setTitle(PatchUtil.C.download()); return anchor; } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PreferencesAction.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PreferencesAction.java index 3f7a0abb08..2d4a4c4c27 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PreferencesAction.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PreferencesAction.java @@ -53,20 +53,22 @@ class PreferencesAction { popup.setStyleName(current.style.dialog()); popup.add(current); popup.addAutoHidePartner(partner.getElement()); - popup.addCloseHandler(new CloseHandler() { - @Override - public void onClose(CloseEvent event) { - view.getCmFromSide(DisplaySide.B).focus(); - popup = null; - current = null; - } - }); - popup.setPopupPositionAndShow(new PositionCallback() { - @Override - public void setPosition(int offsetWidth, int offsetHeight) { - popup.setPopupPosition(300, 120); - } - }); + popup.addCloseHandler( + new CloseHandler() { + @Override + public void onClose(CloseEvent event) { + view.getCmFromSide(DisplaySide.B).focus(); + popup = null; + current = null; + } + }); + popup.setPopupPositionAndShow( + new PositionCallback() { + @Override + public void setPosition(int offsetWidth, int offsetHeight) { + popup.setPopupPosition(300, 120); + } + }); current.setFocus(true); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PreferencesBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PreferencesBox.java index ef1d4bd135..4d781ea7ec 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PreferencesBox.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PreferencesBox.java @@ -57,17 +57,16 @@ import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.PopupPanel; import com.google.gwt.user.client.ui.ToggleButton; import com.google.gwt.user.client.ui.UIObject; - +import java.util.Objects; import net.codemirror.lib.CodeMirror; import net.codemirror.mode.ModeInfo; import net.codemirror.mode.ModeInjector; import net.codemirror.theme.ThemeLoader; -import java.util.Objects; - /** Displays current diff preferences. */ public class PreferencesBox extends Composite { interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); public interface Style extends CssResource { @@ -134,32 +133,34 @@ public class PreferencesBox extends Composite { save.setVisible(Gerrit.isSignedIn()); if (view != null) { - addDomHandler(new KeyDownHandler() { - @Override - public void onKeyDown(KeyDownEvent event) { - if (event.getNativeKeyCode() == KEY_ESCAPE - || event.getNativeKeyCode() == ',') { - close(); - } - } - }, KeyDownEvent.getType()); + addDomHandler( + new KeyDownHandler() { + @Override + public void onKeyDown(KeyDownEvent event) { + if (event.getNativeKeyCode() == KEY_ESCAPE || event.getNativeKeyCode() == ',') { + close(); + } + } + }, + KeyDownEvent.getType()); - updateContextTimer = new Timer() { - @Override - public void run() { - if (prefs.context() == WHOLE_FILE_CONTEXT) { - contextEntireFile.setValue(true); - } - if (view.canRenderEntireFile(prefs)) { - renderEntireFile.setEnabled(true); - renderEntireFile.setValue(prefs.renderEntireFile()); - } else { - renderEntireFile.setValue(false); - renderEntireFile.setEnabled(false); - } - view.setContext(prefs.context()); - } - }; + updateContextTimer = + new Timer() { + @Override + public void run() { + if (prefs.context() == WHOLE_FILE_CONTEXT) { + contextEntireFile.setValue(true); + } + if (view.canRenderEntireFile(prefs)) { + renderEntireFile.setEnabled(true); + renderEntireFile.setValue(prefs.renderEntireFile()); + } else { + renderEntireFile.setValue(false); + renderEntireFile.setEnabled(false); + } + view.setContext(prefs.context()); + } + }; } } @@ -187,8 +188,8 @@ public class PreferencesBox extends Composite { emptyPane.setValue(!prefs.hideEmptyPane()); if (view != null) { leftSide.setValue(view.getDiffTable().isVisibleA()); - leftSide.setEnabled(!(prefs.hideEmptyPane() - && view.getDiffTable().getChangeType() == ChangeType.ADDED)); + leftSide.setEnabled( + !(prefs.hideEmptyPane() && view.getDiffTable().getChangeType() == ChangeType.ADDED)); } else { UIObject.setVisible(leftSideLabel, false); leftSide.setVisible(false); @@ -251,8 +252,8 @@ public class PreferencesBox extends Composite { @UiHandler("ignoreWhitespace") void onIgnoreWhitespace(@SuppressWarnings("unused") ChangeEvent e) { - prefs.ignoreWhitespace(Whitespace.valueOf( - ignoreWhitespace.getValue(ignoreWhitespace.getSelectedIndex()))); + prefs.ignoreWhitespace( + Whitespace.valueOf(ignoreWhitespace.getValue(ignoreWhitespace.getSelectedIndex()))); if (view != null) { view.reloadDiffInfo(); } @@ -320,15 +321,16 @@ public class PreferencesBox extends Composite { if (v != null && v.length() > 0) { prefs.tabSize(Math.max(1, Integer.parseInt(v))); if (view != null) { - view.operation(new Runnable() { - @Override - public void run() { - int v = prefs.tabSize(); - for (CodeMirror cm : view.getCms()) { - cm.setOption("tabSize", v); - } - } - }); + view.operation( + new Runnable() { + @Override + public void run() { + int v = prefs.tabSize(); + for (CodeMirror cm : view.getCms()) { + cm.setOption("tabSize", v); + } + } + }); } } } @@ -339,15 +341,17 @@ public class PreferencesBox extends Composite { if (v != null && v.length() > 0) { prefs.lineLength(Math.max(1, Integer.parseInt(v))); if (view != null) { - view.operation(new Runnable() { - @Override - public void run() { - view.setLineLength(prefs.lineLength()); - } - }); + view.operation( + new Runnable() { + @Override + public void run() { + view.setLineLength(prefs.lineLength()); + } + }); } } } + @UiHandler("expandAllComments") void onExpandAllComments(ValueChangeEvent e) { prefs.expandAllComments(e.getValue()); @@ -363,10 +367,8 @@ public class PreferencesBox extends Composite { // A negative value hides the cursor entirely: // don't let user shoot himself in the foot. prefs.cursorBlinkRate(Math.max(0, Integer.parseInt(v))); - view.getCmFromSide(DisplaySide.A).setOption("cursorBlinkRate", - prefs.cursorBlinkRate()); - view.getCmFromSide(DisplaySide.B).setOption("cursorBlinkRate", - prefs.cursorBlinkRate()); + view.getCmFromSide(DisplaySide.A).setOption("cursorBlinkRate", prefs.cursorBlinkRate()); + view.getCmFromSide(DisplaySide.B).setOption("cursorBlinkRate", prefs.cursorBlinkRate()); } } @@ -449,22 +451,26 @@ public class PreferencesBox extends Composite { final String mode = getSelectedMode(); prefs.syntaxHighlighting(true); syntaxHighlighting.setValue(true, false); - new ModeInjector().add(mode).inject(new GerritCallback() { - @Override - public void onSuccess(Void result) { - if (prefs.syntaxHighlighting() - && Objects.equals(mode, getSelectedMode()) - && view.isAttached()) { - view.operation(new Runnable() { - @Override - public void run() { - view.getCmFromSide(DisplaySide.A).setOption("mode", mode); - view.getCmFromSide(DisplaySide.B).setOption("mode", mode); - } - }); - } - } - }); + new ModeInjector() + .add(mode) + .inject( + new GerritCallback() { + @Override + public void onSuccess(Void result) { + if (prefs.syntaxHighlighting() + && Objects.equals(mode, getSelectedMode()) + && view.isAttached()) { + view.operation( + new Runnable() { + @Override + public void run() { + view.getCmFromSide(DisplaySide.A).setOption("mode", mode); + view.getCmFromSide(DisplaySide.B).setOption("mode", mode); + } + }); + } + } + }); } private String getSelectedMode() { @@ -476,15 +482,16 @@ public class PreferencesBox extends Composite { void onWhitespaceErrors(ValueChangeEvent e) { prefs.showWhitespaceErrors(e.getValue()); if (view != null) { - view.operation(new Runnable() { - @Override - public void run() { - boolean s = prefs.showWhitespaceErrors(); - for (CodeMirror cm : view.getCms()) { - cm.setOption("showTrailingSpace", s); - } - } - }); + view.operation( + new Runnable() { + @Override + public void run() { + boolean s = prefs.showWhitespaceErrors(); + for (CodeMirror cm : view.getCms()) { + cm.setOption("showTrailingSpace", s); + } + } + }); } } @@ -499,19 +506,15 @@ public class PreferencesBox extends Composite { @UiHandler("matchBrackets") void onMatchBrackets(ValueChangeEvent e) { prefs.matchBrackets(e.getValue()); - view.getCmFromSide(DisplaySide.A).setOption("matchBrackets", - prefs.matchBrackets()); - view.getCmFromSide(DisplaySide.B).setOption("matchBrackets", - prefs.matchBrackets()); + view.getCmFromSide(DisplaySide.A).setOption("matchBrackets", prefs.matchBrackets()); + view.getCmFromSide(DisplaySide.B).setOption("matchBrackets", prefs.matchBrackets()); } @UiHandler("lineWrapping") void onLineWrapping(ValueChangeEvent e) { prefs.lineWrapping(e.getValue()); - view.getCmFromSide(DisplaySide.A).setOption("lineWrapping", - prefs.lineWrapping()); - view.getCmFromSide(DisplaySide.B).setOption("lineWrapping", - prefs.lineWrapping()); + view.getCmFromSide(DisplaySide.A).setOption("lineWrapping", prefs.lineWrapping()); + view.getCmFromSide(DisplaySide.B).setOption("lineWrapping", prefs.lineWrapping()); } @UiHandler("skipDeleted") @@ -537,22 +540,25 @@ public class PreferencesBox extends Composite { final Theme newTheme = getSelectedTheme(); prefs.theme(newTheme); if (view != null) { - ThemeLoader.loadTheme(newTheme, new GerritCallback() { - @Override - public void onSuccess(Void result) { - view.operation(new Runnable() { + ThemeLoader.loadTheme( + newTheme, + new GerritCallback() { @Override - public void run() { - if (getSelectedTheme() == newTheme && isAttached()) { - String t = newTheme.name().toLowerCase(); - view.getCmFromSide(DisplaySide.A).setOption("theme", t); - view.getCmFromSide(DisplaySide.B).setOption("theme", t); - view.setThemeStyles(newTheme.isDark()); - } + public void onSuccess(Void result) { + view.operation( + new Runnable() { + @Override + public void run() { + if (getSelectedTheme() == newTheme && isAttached()) { + String t = newTheme.name().toLowerCase(); + view.getCmFromSide(DisplaySide.A).setOption("theme", t); + view.getCmFromSide(DisplaySide.B).setOption("theme", t); + view.setThemeStyles(newTheme.isDark()); + } + } + }); } }); - } - }); } } @@ -567,14 +573,16 @@ public class PreferencesBox extends Composite { @UiHandler("save") void onSave(@SuppressWarnings("unused") ClickEvent e) { - AccountApi.putDiffPreferences(prefs, new GerritCallback() { - @Override - public void onSuccess(DiffPreferences result) { - DiffPreferencesInfo p = new DiffPreferencesInfo(); - result.copyTo(p); - Gerrit.setDiffPreferences(p); - } - }); + AccountApi.putDiffPreferences( + prefs, + new GerritCallback() { + @Override + public void onSuccess(DiffPreferences result) { + DiffPreferencesInfo p = new DiffPreferencesInfo(); + result.copyTo(p); + Gerrit.setDiffPreferences(p); + } + }); if (view != null) { close(); } @@ -606,18 +614,11 @@ public class PreferencesBox extends Composite { } private void initIgnoreWhitespace() { + ignoreWhitespace.addItem(PatchUtil.C.whitespaceIGNORE_NONE(), IGNORE_NONE.name()); + ignoreWhitespace.addItem(PatchUtil.C.whitespaceIGNORE_TRAILING(), IGNORE_TRAILING.name()); ignoreWhitespace.addItem( - PatchUtil.C.whitespaceIGNORE_NONE(), - IGNORE_NONE.name()); - ignoreWhitespace.addItem( - PatchUtil.C.whitespaceIGNORE_TRAILING(), - IGNORE_TRAILING.name()); - ignoreWhitespace.addItem( - PatchUtil.C.whitespaceIGNORE_LEADING_AND_TRAILING(), - IGNORE_LEADING_AND_TRAILING.name()); - ignoreWhitespace.addItem( - PatchUtil.C.whitespaceIGNORE_ALL(), - IGNORE_ALL.name()); + PatchUtil.C.whitespaceIGNORE_LEADING_AND_TRAILING(), IGNORE_LEADING_AND_TRAILING.name()); + ignoreWhitespace.addItem(PatchUtil.C.whitespaceIGNORE_ALL(), IGNORE_ALL.name()); } private void initMode() { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PublishedBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PublishedBox.java index dc2e3a2a68..ce69802731 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PublishedBox.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PublishedBox.java @@ -44,6 +44,7 @@ import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder; /** An HtmlPanel for displaying a published comment */ class PublishedBox extends CommentBox { interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); interface Style extends CssResource { @@ -90,20 +91,21 @@ class PublishedBox extends CommentBox { } initWidget(uiBinder.createAndBindUi(this)); - header.addDomHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - setOpen(!isOpen()); - } - }, ClickEvent.getType()); + header.addDomHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + setOpen(!isOpen()); + } + }, + ClickEvent.getType()); name.setInnerText(authorName(info)); date.setInnerText(FormatUtil.shortFormatDayTime(info.updated())); if (info.message() != null) { String msg = info.message().trim(); summary.setInnerText(msg); - message.setInnerSafeHtml(clp.apply( - new SafeHtmlBuilder().append(msg).wikify())); + message.setInnerSafeHtml(clp.apply(new SafeHtmlBuilder().append(msg).wikify())); ApiGlue.fireEvent("comment", message); } @@ -154,9 +156,7 @@ class PublishedBox extends CommentBox { if (quote) { commentReply.message(ReplyBox.quote(comment.message())); } - getCommentManager().addDraftBox( - displaySide, - commentReply).setEdit(true); + getCommentManager().addDraftBox(displaySide, commentReply).setEdit(true); } void doReply() { @@ -193,7 +193,9 @@ class PublishedBox extends CommentBox { done.setEnabled(false); CommentInfo input = CommentInfo.createReply(comment); input.message(PatchUtil.C.cannedReplyDone()); - CommentApi.createDraft(psId, input, + CommentApi.createDraft( + psId, + input, new GerritCallback() { @Override public void onSuccess(CommentInfo result) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/Resources.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/Resources.java index 2723374750..e5903335e6 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/Resources.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/Resources.java @@ -22,15 +22,22 @@ import com.google.gwt.resources.client.ImageResource; interface Resources extends ClientBundle { Resources I = GWT.create(Resources.class); - @Source("CommentBox.css") CommentBox.Style style(); - @Source("Scrollbar.css") Scrollbar.Style scrollbarStyle(); - @Source("DiffTable.css") DiffTable.Style diffTableStyle(); + @Source("CommentBox.css") + CommentBox.Style style(); - /** - * tango icon library (public domain): - * http://tango.freedesktop.org/Tango_Icon_Library - */ - @Source("goPrev.png") ImageResource goPrev(); - @Source("goNext.png") ImageResource goNext(); - @Source("goUp.png") ImageResource goUp(); + @Source("Scrollbar.css") + Scrollbar.Style scrollbarStyle(); + + @Source("DiffTable.css") + DiffTable.Style diffTableStyle(); + + /** tango icon library (public domain): http://tango.freedesktop.org/Tango_Icon_Library */ + @Source("goPrev.png") + ImageResource goPrev(); + + @Source("goNext.png") + ImageResource goNext(); + + @Source("goUp.png") + ImageResource goUp(); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/ScrollSynchronizer.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/ScrollSynchronizer.java index 13f58db45c..35e3e7d199 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/ScrollSynchronizer.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/ScrollSynchronizer.java @@ -15,7 +15,6 @@ package com.google.gerrit.client.diff; import com.google.gwt.user.client.Timer; - import net.codemirror.lib.CodeMirror; import net.codemirror.lib.ScrollInfo; @@ -28,9 +27,7 @@ class ScrollSynchronizer { private CodeMirror cmB; private boolean autoHideDiffTableHeader; - ScrollSynchronizer(SideBySideTable diffTable, - CodeMirror cmA, CodeMirror cmB, - LineMapper mapper) { + ScrollSynchronizer(SideBySideTable diffTable, CodeMirror cmA, CodeMirror cmB, LineMapper mapper) { this.diffTable = diffTable; this.mapper = mapper; this.cmB = cmB; @@ -73,14 +70,15 @@ class ScrollSynchronizer { this.src = src; this.dst = dst; this.srcSide = srcSide; - this.fixup = new Timer() { - @Override - public void run() { - if (active == ScrollCallback.this) { - fixup(); - } - } - }; + this.fixup = + new Timer() { + @Override + public void run() { + if (active == ScrollCallback.this) { + fixup(); + } + } + }; } void sync() { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/Scrollbar.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/Scrollbar.java index b72ab43711..83ada90112 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/Scrollbar.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/Scrollbar.java @@ -15,12 +15,10 @@ package com.google.gerrit.client.diff; import com.google.gwt.resources.client.CssResource; - -import net.codemirror.lib.CodeMirror; -import net.codemirror.lib.Pos; - import java.util.ArrayList; import java.util.List; +import net.codemirror.lib.CodeMirror; +import net.codemirror.lib.Pos; /** Displays overview of all edits and comments in this file. */ class Scrollbar { @@ -30,9 +28,13 @@ class Scrollbar { interface Style extends CssResource { String comment(); + String draft(); + String insert(); + String delete(); + String edit(); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/ScrollbarAnnotation.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/ScrollbarAnnotation.java index c8f991166d..6cb9b6a2c3 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/ScrollbarAnnotation.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/ScrollbarAnnotation.java @@ -20,7 +20,6 @@ import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.ui.Widget; - import net.codemirror.lib.CodeMirror; import net.codemirror.lib.CodeMirror.RegisteredHandler; import net.codemirror.lib.Pos; @@ -62,14 +61,17 @@ class ScrollbarAnnotation extends Widget implements ClickHandler { @Override protected void onLoad() { cmB.getWrapperElement().appendChild(getElement()); - refresh = cmB.on("refresh", new Runnable() { - @Override - public void run() { - if (updateScale()) { - updatePosition(); - } - } - }); + refresh = + cmB.on( + "refresh", + new Runnable() { + @Override + public void run() { + if (updateScale()) { + updatePosition(); + } + } + }); updateScale(); updatePosition(); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide.java index 6e2120a4c3..1560597647 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide.java @@ -42,18 +42,17 @@ import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.ImageResourceRenderer; import com.google.gwtexpui.globalkey.client.GlobalKey; import com.google.gwtexpui.globalkey.client.KeyCommand; - +import java.util.Collections; +import java.util.List; import net.codemirror.lib.CodeMirror; import net.codemirror.lib.CodeMirror.LineHandle; import net.codemirror.lib.Configuration; import net.codemirror.lib.KeyMap; import net.codemirror.lib.Pos; -import java.util.Collections; -import java.util.List; - public class SideBySide extends DiffScreen { interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); private static final String LINE_NUMBER_CLASSNAME = "CodeMirror-linenumber"; @@ -69,11 +68,7 @@ public class SideBySide extends DiffScreen { private SideBySideCommentManager commentManager; public SideBySide( - DiffObject base, - DiffObject revision, - String path, - DisplaySide startSide, - int startLine) { + DiffObject base, DiffObject revision, String path, DisplaySide startSide, int startLine) { super(base, revision, path, startSide, startLine, DiffView.SIDE_BY_SIDE); diffTable = new SideBySideTable(this, base, revision, path); @@ -87,11 +82,14 @@ public class SideBySide extends DiffScreen { return new ScreenLoadCallback(SideBySide.this) { @Override protected void preDisplay(ConfigInfoCache.Entry result) { - commentManager = new SideBySideCommentManager( - SideBySide.this, - base, revision, path, - result.getCommentLinkProcessor(), - getChangeStatus().isOpen()); + commentManager = + new SideBySideCommentManager( + SideBySide.this, + base, + revision, + path, + result.getCommentLinkProcessor(), + getChangeStatus().isOpen()); setTheme(result.getTheme()); display(comments); header.setupPrevNextFiles(comments); @@ -103,15 +101,16 @@ public class SideBySide extends DiffScreen { public void onShowView() { super.onShowView(); - operation(new Runnable() { - @Override - public void run() { - resizeCodeMirror(); - chunkManager.adjustPadding(); - cmA.refresh(); - cmB.refresh(); - } - }); + operation( + new Runnable() { + @Override + public void run() { + resizeCodeMirror(); + chunkManager.adjustPadding(); + cmA.refresh(); + cmB.refresh(); + } + }); setLineLength(Patch.COMMIT_MSG.equals(path) ? 72 : prefs.lineLength()); diffTable.refresh(); @@ -145,10 +144,11 @@ public class SideBySide extends DiffScreen { void registerCmEvents(final CodeMirror cm) { super.registerCmEvents(cm); - KeyMap keyMap = KeyMap.create() - .on("Shift-A", diffTable.toggleA()) - .on("Shift-Left", moveCursorToSide(cm, DisplaySide.A)) - .on("Shift-Right", moveCursorToSide(cm, DisplaySide.B)); + KeyMap keyMap = + KeyMap.create() + .on("Shift-A", diffTable.toggleA()) + .on("Shift-Left", moveCursorToSide(cm, DisplaySide.A)) + .on("Shift-Right", moveCursorToSide(cm, DisplaySide.B)); cm.addKeyMap(keyMap); maybeRegisterRenderEntireFileKeyMap(cm); } @@ -157,16 +157,18 @@ public class SideBySide extends DiffScreen { public void registerKeys() { super.registerKeys(); - getKeysNavigation().add( - new NoOpKeyCommand(KeyCommand.M_SHIFT, KeyCodes.KEY_LEFT, PatchUtil.C.focusSideA()), - new NoOpKeyCommand(KeyCommand.M_SHIFT, KeyCodes.KEY_RIGHT, PatchUtil.C.focusSideB())); - getKeysAction().add(new KeyCommand( - KeyCommand.M_SHIFT, 'a', PatchUtil.C.toggleSideA()) { - @Override - public void onKeyPress(KeyPressEvent event) { - diffTable.toggleA().run(); - } - }); + getKeysNavigation() + .add( + new NoOpKeyCommand(KeyCommand.M_SHIFT, KeyCodes.KEY_LEFT, PatchUtil.C.focusSideA()), + new NoOpKeyCommand(KeyCommand.M_SHIFT, KeyCodes.KEY_RIGHT, PatchUtil.C.focusSideB())); + getKeysAction() + .add( + new KeyCommand(KeyCommand.M_SHIFT, 'a', PatchUtil.C.toggleSideA()) { + @Override + public void onKeyPress(KeyPressEvent event) { + diffTable.toggleA().run(); + } + }); registerHandlers(); } @@ -192,8 +194,12 @@ public class SideBySide extends DiffScreen { cmA = newCm(diff.metaA(), diff.textA(), diffTable.cmA); cmB = newCm(diff.metaB(), diff.textB(), diffTable.cmB); - getDiffTable().setUpBlameIconA(cmA, base.isBaseOrAutoMerge(), - base.isBaseOrAutoMerge() ? revision : base.asPatchSetId(), path); + getDiffTable() + .setUpBlameIconA( + cmA, + base.isBaseOrAutoMerge(), + base.isBaseOrAutoMerge() ? revision : base.asPatchSetId(), + path); getDiffTable().setUpBlameIconB(cmB, revision, path); cmA.extras().side(DisplaySide.A); @@ -202,25 +208,24 @@ public class SideBySide extends DiffScreen { chunkManager = new SideBySideChunkManager(this, cmA, cmB, diffTable.scrollbar); - operation(new Runnable() { - @Override - public void run() { - // Estimate initial CodeMirror height, fixed up in onShowView. - int height = Window.getClientHeight() - - (Gerrit.getHeaderFooterHeight() + 18); - cmA.setHeight(height); - cmB.setHeight(height); + operation( + new Runnable() { + @Override + public void run() { + // Estimate initial CodeMirror height, fixed up in onShowView. + int height = Window.getClientHeight() - (Gerrit.getHeaderFooterHeight() + 18); + cmA.setHeight(height); + cmB.setHeight(height); - render(diff); - commentManager.render(comments, prefs.expandAllComments()); - skipManager.render(prefs.context(), diff); - } - }); + render(diff); + commentManager.render(comments, prefs.expandAllComments()); + skipManager.render(prefs.context(), diff); + } + }); registerCmEvents(cmA); registerCmEvents(cmB); - scrollSynchronizer = new ScrollSynchronizer(diffTable, cmA, cmB, - chunkManager.lineMapper); + scrollSynchronizer = new ScrollSynchronizer(diffTable, cmA, cmB, chunkManager.lineMapper); setPrefsAction(new PreferencesAction(this, prefs)); header.init(getPrefsAction(), getUnifiedDiffLink(), diff.sideBySideWebLinks()); @@ -231,36 +236,33 @@ public class SideBySide extends DiffScreen { private List getUnifiedDiffLink() { InlineHyperlink toUnifiedDiffLink = new InlineHyperlink(); - toUnifiedDiffLink.setHTML( - new ImageResourceRenderer().render(Gerrit.RESOURCES.unifiedDiff())); - toUnifiedDiffLink.setTargetHistoryToken( - Dispatcher.toUnified(base, revision, path)); + toUnifiedDiffLink.setHTML(new ImageResourceRenderer().render(Gerrit.RESOURCES.unifiedDiff())); + toUnifiedDiffLink.setTargetHistoryToken(Dispatcher.toUnified(base, revision, path)); toUnifiedDiffLink.setTitle(PatchUtil.C.unifiedDiff()); return Collections.singletonList(toUnifiedDiffLink); } @Override - CodeMirror newCm( - DiffInfo.FileMeta meta, - String contents, - Element parent) { - return CodeMirror.create(parent, Configuration.create() - .set("cursorBlinkRate", prefs.cursorBlinkRate()) - .set("cursorHeight", 0.85) - .set("inputStyle", "textarea") - .set("keyMap", "vim_ro") - .set("lineNumbers", prefs.showLineNumbers()) - .set("matchBrackets", prefs.matchBrackets()) - .set("lineWrapping", prefs.lineWrapping()) - .set("mode", getFileSize() == FileSize.SMALL ? getContentType(meta) : null) - .set("readOnly", true) - .set("scrollbarStyle", "overlay") - .set("showTrailingSpace", prefs.showWhitespaceErrors()) - .set("styleSelectedText", true) - .set("tabSize", prefs.tabSize()) - .set("theme", prefs.theme().name().toLowerCase()) - .set("value", meta != null ? contents : "") - .set("viewportMargin", renderEntireFile() ? POSITIVE_INFINITY : 10)); + CodeMirror newCm(DiffInfo.FileMeta meta, String contents, Element parent) { + return CodeMirror.create( + parent, + Configuration.create() + .set("cursorBlinkRate", prefs.cursorBlinkRate()) + .set("cursorHeight", 0.85) + .set("inputStyle", "textarea") + .set("keyMap", "vim_ro") + .set("lineNumbers", prefs.showLineNumbers()) + .set("matchBrackets", prefs.matchBrackets()) + .set("lineWrapping", prefs.lineWrapping()) + .set("mode", getFileSize() == FileSize.SMALL ? getContentType(meta) : null) + .set("readOnly", true) + .set("scrollbarStyle", "overlay") + .set("showTrailingSpace", prefs.showWhitespaceErrors()) + .set("styleSelectedText", true) + .set("tabSize", prefs.tabSize()) + .set("theme", prefs.theme().name().toLowerCase()) + .set("value", meta != null ? contents : "") + .set("viewportMargin", renderEntireFile() ? POSITIVE_INFINITY : 10)); } @Override @@ -275,20 +277,22 @@ public class SideBySide extends DiffScreen { void setSyntaxHighlighting(boolean b) { final DiffInfo diff = getDiff(); if (b) { - injectMode(diff, new AsyncCallback() { - @Override - public void onSuccess(Void result) { - if (prefs.syntaxHighlighting()) { - cmA.setOption("mode", getContentType(diff.metaA())); - cmB.setOption("mode", getContentType(diff.metaB())); - } - } + injectMode( + diff, + new AsyncCallback() { + @Override + public void onSuccess(Void result) { + if (prefs.syntaxHighlighting()) { + cmA.setOption("mode", getContentType(diff.metaA())); + cmB.setOption("mode", getContentType(diff.metaB())); + } + } - @Override - public void onFailure(Throwable caught) { - prefs.syntaxHighlighting(false); - } - }); + @Override + public void onFailure(Throwable caught) { + prefs.syntaxHighlighting(false); + } + }); } else { cmA.setOption("mode", (String) null); cmB.setOption("mode", (String) null); @@ -325,29 +329,31 @@ public class SideBySide extends DiffScreen { // key (or j/k) is held down. Performance on Chrome is fine // without the deferral. // - Scheduler.get().scheduleDeferred(new ScheduledCommand() { - @Override - public void execute() { - operation(new Runnable() { - @Override - public void run() { - LineHandle handle = - cm.getLineHandleVisualStart(cm.getCursor("end").line()); - if (!cm.extras().activeLine(handle)) { - return; - } + Scheduler.get() + .scheduleDeferred( + new ScheduledCommand() { + @Override + public void execute() { + operation( + new Runnable() { + @Override + public void run() { + LineHandle handle = + cm.getLineHandleVisualStart(cm.getCursor("end").line()); + if (!cm.extras().activeLine(handle)) { + return; + } - LineOnOtherInfo info = - lineOnOther(cm.side(), cm.getLineNumber(handle)); - if (info.isAligned()) { - other.extras().activeLine(other.getLineHandle(info.getLine())); - } else { - other.extras().clearActiveLine(); - } - } - }); - } - }); + LineOnOtherInfo info = lineOnOther(cm.side(), cm.getLineNumber(handle)); + if (info.isAligned()) { + other.extras().activeLine(other.getLineHandle(info.getLine())); + } else { + other.extras().clearActiveLine(); + } + } + }); + } + }); } }; } @@ -357,8 +363,7 @@ public class SideBySide extends DiffScreen { if (cmDst == cmSrc) { return new Runnable() { @Override - public void run() { - } + public void run() {} }; } @@ -367,9 +372,10 @@ public class SideBySide extends DiffScreen { @Override public void run() { if (cmSrc.extras().hasActiveLine()) { - cmDst.setCursor(Pos.create(lineOnOther( - sideSrc, - cmSrc.getLineNumber(cmSrc.extras().activeLine())).getLine())); + cmDst.setCursor( + Pos.create( + lineOnOther(sideSrc, cmSrc.getLineNumber(cmSrc.extras().activeLine())) + .getLine())); } cmDst.focus(); } @@ -384,22 +390,24 @@ public class SideBySide extends DiffScreen { @Override void operation(final Runnable apply) { - cmA.operation(new Runnable() { - @Override - public void run() { - cmB.operation(new Runnable() { + cmA.operation( + new Runnable() { @Override public void run() { - apply.run(); + cmB.operation( + new Runnable() { + @Override + public void run() { + apply.run(); + } + }); } }); - } - }); } @Override CodeMirror[] getCms() { - return new CodeMirror[]{cmA, cmB}; + return new CodeMirror[] {cmA, cmB}; } @Override diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySideChunkManager.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySideChunkManager.java index 11b7e7c580..a78e59edb3 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySideChunkManager.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySideChunkManager.java @@ -28,23 +28,22 @@ import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.EventListener; - +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import net.codemirror.lib.CodeMirror; import net.codemirror.lib.CodeMirror.LineClassWhere; import net.codemirror.lib.Configuration; import net.codemirror.lib.LineWidget; import net.codemirror.lib.Pos; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - /** Colors modified regions for {@link SideBySide}. */ class SideBySideChunkManager extends ChunkManager { private static final String DATA_LINES = "_cs2h"; private static double guessedLineHeightPx = 15; private static final JavaScriptObject focusA = initOnClick(A); private static final JavaScriptObject focusB = initOnClick(B); + private static native JavaScriptObject initOnClick(DisplaySide s) /*-{ return $entry(function(e){ @com.google.gerrit.client.diff.SideBySideChunkManager::focus( @@ -76,10 +75,7 @@ class SideBySideChunkManager extends ChunkManager { private List padding; private List paddingDivs; - SideBySideChunkManager(SideBySide host, - CodeMirror cmA, - CodeMirror cmB, - Scrollbar scrollbar) { + SideBySideChunkManager(SideBySide host, CodeMirror cmA, CodeMirror cmB, Scrollbar scrollbar) { super(scrollbar); this.host = host; @@ -109,9 +105,10 @@ class SideBySideChunkManager extends ChunkManager { padding = new ArrayList<>(); paddingDivs = new ArrayList<>(); - String diffColor = diff.metaA() == null || diff.metaB() == null - ? SideBySideTable.style.intralineBg() - : SideBySideTable.style.diff(); + String diffColor = + diff.metaA() == null || diff.metaB() == null + ? SideBySideTable.style.intralineBg() + : SideBySideTable.style.diff(); for (Region current : Natives.asList(diff.content())) { if (current.ab() != null) { @@ -154,9 +151,7 @@ class SideBySideChunkManager extends ChunkManager { int aLen = a != null ? a.length() : 0; int bLen = b != null ? b.length() : 0; - String color = a == null || b == null - ? diffColor - : SideBySideTable.style.intralineBg(); + String color = a == null || b == null ? diffColor : SideBySideTable.style.intralineBg(); colorLines(cmA, color, startA, aLen); colorLines(cmB, color, startB, bLen); @@ -187,20 +182,19 @@ class SideBySideChunkManager extends ChunkManager { } } - private void markEdit(CodeMirror cm, int startLine, - JsArrayString lines, JsArray edits) { + private void markEdit(CodeMirror cm, int startLine, JsArrayString lines, JsArray edits) { if (lines == null || edits == null) { return; } EditIterator iter = new EditIterator(lines, startLine); - Configuration bg = Configuration.create() - .set("className", SideBySideTable.style.intralineBg()) - .set("readOnly", true); + Configuration bg = + Configuration.create() + .set("className", SideBySideTable.style.intralineBg()) + .set("readOnly", true); - Configuration diff = Configuration.create() - .set("className", SideBySideTable.style.diff()) - .set("readOnly", true); + Configuration diff = + Configuration.create().set("className", SideBySideTable.style.diff()).set("readOnly", true); Pos last = Pos.create(0, 0); for (Span span : Natives.asList(edits)) { @@ -213,9 +207,8 @@ class SideBySideChunkManager extends ChunkManager { } getMarkers().add(cm.markText(from, to, diff)); last = to; - colorLines(cm, LineClassWhere.BACKGROUND, - SideBySideTable.style.diff(), - from.line(), to.line()); + colorLines( + cm, LineClassWhere.BACKGROUND, SideBySideTable.style.diff(), from.line(), to.line()); } } @@ -224,8 +217,7 @@ class SideBySideChunkManager extends ChunkManager { * * @param cm parent CodeMirror to add extra space into. * @param line line to put the padding below. - * @param len number of lines to pad. Padding is inserted only if - * {@code len >= 1}. + * @param len number of lines to pad. Padding is inserted only if {@code len >= 1}. */ private void addPadding(CodeMirror cm, int line, final int len) { if (0 < len) { @@ -235,20 +227,21 @@ class SideBySideChunkManager extends ChunkManager { pad.getStyle().setHeight(guessedLineHeightPx * len, Unit.PX); focusOnClick(pad, cm.side()); paddingDivs.add(pad); - padding.add(cm.addLineWidget( - line == -1 ? 0 : line, - pad, - Configuration.create() - .set("coverGutter", true) - .set("noHScroll", true) - .set("above", line == -1))); + padding.add( + cm.addLineWidget( + line == -1 ? 0 : line, + pad, + Configuration.create() + .set("coverGutter", true) + .set("noHScroll", true) + .set("above", line == -1))); } } - private void addDiffChunk(CodeMirror cmToPad, int lineOnOther, - int chunkSize, boolean edit) { - chunks.add(new DiffChunkInfo(host.otherCm(cmToPad).side(), - lineOnOther - chunkSize + 1, lineOnOther, edit)); + private void addDiffChunk(CodeMirror cmToPad, int lineOnOther, int chunkSize, boolean edit) { + chunks.add( + new DiffChunkInfo( + host.otherCm(cmToPad).side(), lineOnOther - chunkSize + 1, lineOnOther, edit)); } @Override @@ -256,13 +249,10 @@ class SideBySideChunkManager extends ChunkManager { return new Runnable() { @Override public void run() { - int line = cm.extras().hasActiveLine() - ? cm.getLineNumber(cm.extras().activeLine()) - : 0; - int res = Collections.binarySearch( - chunks, - new DiffChunkInfo(cm.side(), line, 0, false), - getDiffChunkComparator()); + int line = cm.extras().hasActiveLine() ? cm.getLineNumber(cm.extras().activeLine()) : 0; + int res = + Collections.binarySearch( + chunks, new DiffChunkInfo(cm.side(), line, 0, false), getDiffChunkComparator()); diffChunkNavHelper(chunks, host, res, dir); } }; diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySideCommentGroup.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySideCommentGroup.java index db72864a87..6fcd6c880f 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySideCommentGroup.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySideCommentGroup.java @@ -18,20 +18,17 @@ import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Timer; - -import net.codemirror.lib.CodeMirror; - import java.util.PriorityQueue; +import net.codemirror.lib.CodeMirror; /** * LineWidget attached to a CodeMirror container. * - * When a comment is placed on a line a CommentWidget is created on both sides. - * The group tracks all comment boxes on that same line, and also includes an - * empty padding element to keep subsequent lines vertically aligned. + *

When a comment is placed on a line a CommentWidget is created on both sides. The group tracks + * all comment boxes on that same line, and also includes an empty padding element to keep + * subsequent lines vertically aligned. */ -class SideBySideCommentGroup extends CommentGroup - implements Comparable { +class SideBySideCommentGroup extends CommentGroup implements Comparable { static void pair(SideBySideCommentGroup a, SideBySideCommentGroup b) { a.peers.add(b); b.peers.add(a); @@ -40,8 +37,8 @@ class SideBySideCommentGroup extends CommentGroup private final Element padding; private final PriorityQueue peers; - SideBySideCommentGroup(SideBySideCommentManager manager, CodeMirror cm, DisplaySide side, - int line) { + SideBySideCommentGroup( + SideBySideCommentManager manager, CodeMirror cm, DisplaySide side, int line) { super(manager, cm, side, line); padding = DOM.createDiv(); @@ -59,12 +56,12 @@ class SideBySideCommentGroup extends CommentGroup void remove(DraftBox box) { super.remove(box); - if (getBoxCount() == 0 && peers.size() == 1 - && peers.peek().peers.size() > 1) { + if (getBoxCount() == 0 && peers.size() == 1 && peers.peek().peers.size() > 1) { SideBySideCommentGroup peer = peers.peek(); peer.peers.remove(this); detach(); - if (peer.getBoxCount() == 0 && peer.peers.size() == 1 + if (peer.getBoxCount() == 0 + && peer.peers.size() == 1 && peer.peers.peek().getBoxCount() == 0) { peer.detach(); } else { @@ -89,30 +86,33 @@ class SideBySideCommentGroup extends CommentGroup @Override void handleRedraw() { - getLineWidget().onRedraw(new Runnable() { - @Override - public void run() { - if (canComputeHeight() && peers.peek().canComputeHeight()) { - if (getResizeTimer() != null) { - getResizeTimer().cancel(); - setResizeTimer(null); - } - adjustPadding(SideBySideCommentGroup.this, peers.peek()); - } else if (getResizeTimer() == null) { - setResizeTimer(new Timer() { - @Override - public void run() { - if (canComputeHeight() && peers.peek().canComputeHeight()) { - cancel(); - setResizeTimer(null); - adjustPadding(SideBySideCommentGroup.this, peers.peek()); + getLineWidget() + .onRedraw( + new Runnable() { + @Override + public void run() { + if (canComputeHeight() && peers.peek().canComputeHeight()) { + if (getResizeTimer() != null) { + getResizeTimer().cancel(); + setResizeTimer(null); + } + adjustPadding(SideBySideCommentGroup.this, peers.peek()); + } else if (getResizeTimer() == null) { + setResizeTimer( + new Timer() { + @Override + public void run() { + if (canComputeHeight() && peers.peek().canComputeHeight()) { + cancel(); + setResizeTimer(null); + adjustPadding(SideBySideCommentGroup.this, peers.peek()); + } + } + }); + getResizeTimer().scheduleRepeating(5); + } } - } - }); - getResizeTimer().scheduleRepeating(5); - } - } - }); + }); } @Override @@ -157,7 +157,6 @@ class SideBySideCommentGroup extends CommentGroup if (side == o.side) { return line - o.line; } - throw new IllegalStateException( - "Cannot compare SideBySideCommentGroup with different sides"); + throw new IllegalStateException("Cannot compare SideBySideCommentGroup with different sides"); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySideCommentManager.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySideCommentManager.java index 1981ed01f0..7503711da1 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySideCommentManager.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySideCommentManager.java @@ -19,18 +19,18 @@ import com.google.gerrit.client.Gerrit; import com.google.gerrit.client.changes.CommentInfo; import com.google.gerrit.client.ui.CommentLinkProcessor; import com.google.gerrit.reviewdb.client.PatchSet; - -import net.codemirror.lib.CodeMirror; -import net.codemirror.lib.TextMarker.FromTo; - import java.util.Collection; import java.util.Map; import java.util.SortedMap; +import net.codemirror.lib.CodeMirror; +import net.codemirror.lib.TextMarker.FromTo; /** Tracks comment widgets for {@link SideBySide}. */ class SideBySideCommentManager extends CommentManager { - SideBySideCommentManager(SideBySide host, - DiffObject base, PatchSet.Id revision, + SideBySideCommentManager( + SideBySide host, + DiffObject base, + PatchSet.Id revision, String path, CommentLinkProcessor clp, boolean open) { @@ -60,8 +60,7 @@ class SideBySideCommentManager extends CommentManager { CommentGroup getCommentGroupOnActiveLine(CodeMirror cm) { CommentGroup group = null; if (cm.extras().hasActiveLine()) { - group = map(cm.side()) - .get(cm.getLineNumber(cm.extras().activeLine()) + 1); + group = map(cm.side()).get(cm.getLineNumber(cm.extras().activeLine()) + 1); } return group; } @@ -82,13 +81,16 @@ class SideBySideCommentManager extends CommentManager { int line = cm.getLineNumber(cm.extras().activeLine()) + 1; if (cm.somethingSelected()) { FromTo fromTo = adjustSelection(cm); - addDraftBox(cm.side(), CommentInfo.create( - getPath(), - getStoredSideFromDisplaySide(cm.side()), - getParentNumFromDisplaySide(cm.side()), - line, - CommentRange.create(fromTo), - false)).setEdit(true); + addDraftBox( + cm.side(), + CommentInfo.create( + getPath(), + getStoredSideFromDisplaySide(cm.side()), + getParentNumFromDisplaySide(cm.side()), + line, + CommentRange.create(fromTo), + false)) + .setEdit(true); cm.setCursor(fromTo.to()); cm.setSelection(cm.getCursor()); } else { @@ -104,10 +106,8 @@ class SideBySideCommentManager extends CommentManager { } SideBySideCommentGroup newGroup = newGroup(side, line); - Map map = - side == DisplaySide.A ? sideA : sideB; - Map otherMap = - side == DisplaySide.A ? sideB : sideA; + Map map = side == DisplaySide.A ? sideA : sideB; + Map otherMap = side == DisplaySide.A ? sideB : sideA; map.put(line, newGroup); int otherLine = host.lineOnOther(side, line - 1).getLine() + 1; existing = map(side.otherSide()).get(otherLine); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySideTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySideTable.java index 5e8d7cc3fb..7465c81d3c 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySideTable.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySideTable.java @@ -24,18 +24,23 @@ import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.HTMLPanel; /** - * A table with one row and two columns to hold the two CodeMirrors displaying - * the files to be compared. + * A table with one row and two columns to hold the two CodeMirrors displaying the files to be + * compared. */ class SideBySideTable extends DiffTable { interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); interface DiffTableStyle extends CssResource { String intralineBg(); + String diff(); + String hideA(); + String hideB(); + String padding(); } @@ -46,8 +51,7 @@ class SideBySideTable extends DiffTable { private boolean visibleA; - SideBySideTable(SideBySide parent, DiffObject base, DiffObject revision, - String path) { + SideBySideTable(SideBySide parent, DiffObject base, DiffObject revision, String path) { super(parent, base, revision, path); initWidget(uiBinder.createAndBindUi(this)); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SkipBar.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SkipBar.java index 5f86955e63..03cfd6080b 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SkipBar.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SkipBar.java @@ -26,7 +26,6 @@ import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HTMLPanel; - import net.codemirror.lib.CodeMirror; import net.codemirror.lib.Configuration; import net.codemirror.lib.LineWidget; @@ -36,6 +35,7 @@ import net.codemirror.lib.TextMarker.FromTo; class SkipBar extends Composite { interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); private static final int NUM_ROWS_TO_EXPAND = 10; private static final int UP_DOWN_THRESHOLD = 30; @@ -44,9 +44,15 @@ class SkipBar extends Composite { String noExpand(); } - @UiField(provided = true) Anchor skipNum; - @UiField(provided = true) Anchor upArrow; - @UiField(provided = true) Anchor downArrow; + @UiField(provided = true) + Anchor skipNum; + + @UiField(provided = true) + Anchor upArrow; + + @UiField(provided = true) + Anchor downArrow; + @UiField SkipBarStyle style; private final SkipManager manager; @@ -64,50 +70,54 @@ class SkipBar extends Composite { upArrow = new Anchor(true); downArrow = new Anchor(true); initWidget(uiBinder.createAndBindUi(this)); - addDomHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - cm.focus(); - } - }, ClickEvent.getType()); + addDomHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + cm.focus(); + } + }, + ClickEvent.getType()); } void collapse(int start, int end, boolean attach) { if (attach) { boolean isNew = lineWidget == null; - Configuration cfg = Configuration.create() - .set("coverGutter", true) - .set("noHScroll", true); + Configuration cfg = Configuration.create().set("coverGutter", true).set("noHScroll", true); if (start == 0) { // First line workaround lineWidget = cm.addLineWidget(end + 1, getElement(), cfg.set("above", true)); } else { lineWidget = cm.addLineWidget(start - 1, getElement(), cfg); } if (isNew) { - lineWidget.onFirstRedraw(new Runnable() { - @Override - public void run() { - int w = cm.getGutterElement().getOffsetWidth(); - getElement().getStyle().setPaddingLeft(w, Unit.PX); - } - }); + lineWidget.onFirstRedraw( + new Runnable() { + @Override + public void run() { + int w = cm.getGutterElement().getOffsetWidth(); + getElement().getStyle().setPaddingLeft(w, Unit.PX); + } + }); } } - textMarker = cm.markText( - Pos.create(start, 0), - Pos.create(end), - Configuration.create() - .set("collapsed", true) - .set("inclusiveLeft", true) - .set("inclusiveRight", true)); + textMarker = + cm.markText( + Pos.create(start, 0), + Pos.create(end), + Configuration.create() + .set("collapsed", true) + .set("inclusiveLeft", true) + .set("inclusiveRight", true)); - textMarker.on("beforeCursorEnter", new Runnable() { - @Override - public void run() { - expandAll(); - } - }); + textMarker.on( + "beforeCursorEnter", + new Runnable() { + @Override + public void run() { + expandAll(); + } + }); int skipped = end - start + 1; if (skipped <= UP_DOWN_THRESHOLD) { @@ -116,8 +126,7 @@ class SkipBar extends Composite { upArrow.setHTML(PatchUtil.M.expandBefore(NUM_ROWS_TO_EXPAND)); downArrow.setHTML(PatchUtil.M.expandAfter(NUM_ROWS_TO_EXPAND)); } - skipNum.setText(PatchUtil.M.patchSkipRegion(Integer - .toString(skipped))); + skipNum.setText(PatchUtil.M.patchSkipRegion(Integer.toString(skipped))); } static void link(SkipBar barA, SkipBar barB) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SkipManager.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SkipManager.java index cf23694df2..533ba1fed5 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SkipManager.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SkipManager.java @@ -18,16 +18,13 @@ import com.google.gerrit.client.diff.DiffInfo.Region; import com.google.gerrit.client.patches.SkippedLine; import com.google.gerrit.extensions.client.DiffPreferencesInfo; import com.google.gwt.core.client.JsArray; - -import net.codemirror.lib.CodeMirror; - import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; +import net.codemirror.lib.CodeMirror; -/** Collapses common regions with {@link SkipBar} for {@link SideBySide} - * and {@link Unified}. */ +/** Collapses common regions with {@link SkipBar} for {@link SideBySide} and {@link Unified}. */ class SkipManager { private final Set skipBars; private final DiffScreen host; @@ -50,17 +47,16 @@ class SkipManager { for (int i = 0; i < regions.length(); i++) { Region current = regions.get(i); if (current.ab() != null || current.common() || current.skip() > 0) { - int len = current.skip() > 0 - ? current.skip() - : (current.ab() != null ? current.ab() : current.b()).length(); + int len = + current.skip() > 0 + ? current.skip() + : (current.ab() != null ? current.ab() : current.b()).length(); if (i == 0 && len > context + 1) { skips.add(new SkippedLine(0, 0, len - context)); } else if (i == regions.length() - 1 && len > context + 1) { - skips.add(new SkippedLine(lineA + context, lineB + context, - len - context)); + skips.add(new SkippedLine(lineA + context, lineB + context, len - context)); } else if (len > 2 * context + 1) { - skips.add(new SkippedLine(lineA + context, lineB + context, - len - 2 * context)); + skips.add(new SkippedLine(lineA + context, lineB + context, len - 2 * context)); } lineA += len; lineB += len; @@ -109,10 +105,8 @@ class SkipManager { } } - private SkipBar newSkipBar(CodeMirror cm, DisplaySide side, - SkippedLine skip) { - int start = host.getCmLine( - side == DisplaySide.A ? skip.getStartA() : skip.getStartB(), side); + private SkipBar newSkipBar(CodeMirror cm, DisplaySide side, SkippedLine skip) { + int start = host.getCmLine(side == DisplaySide.A ? skip.getStartA() : skip.getStartB(), side); int end = start + skip.getSize() - 1; SkipBar bar = new SkipBar(this, cm); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/Unified.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/Unified.java index 566d87cb0e..0f0ba4146f 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/Unified.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/Unified.java @@ -44,18 +44,17 @@ import com.google.gwt.user.client.ui.ImageResourceRenderer; import com.google.gwt.user.client.ui.InlineHTML; import com.google.gwtexpui.globalkey.client.GlobalKey; import com.google.gwtexpui.safehtml.client.SafeHtml; - +import java.util.Collections; +import java.util.List; import net.codemirror.lib.CodeMirror; import net.codemirror.lib.CodeMirror.LineHandle; import net.codemirror.lib.Configuration; import net.codemirror.lib.Pos; import net.codemirror.lib.ScrollInfo; -import java.util.Collections; -import java.util.List; - public class Unified extends DiffScreen { interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); @UiField(provided = true) @@ -69,11 +68,7 @@ public class Unified extends DiffScreen { private boolean autoHideDiffTableHeader; public Unified( - DiffObject base, - DiffObject revision, - String path, - DisplaySide startSide, - int startLine) { + DiffObject base, DiffObject revision, String path, DisplaySide startSide, int startLine) { super(base, revision, path, startSide, startLine, DiffView.UNIFIED_DIFF); diffTable = new UnifiedTable(this, base, revision, path); @@ -87,11 +82,14 @@ public class Unified extends DiffScreen { return new ScreenLoadCallback(Unified.this) { @Override protected void preDisplay(ConfigInfoCache.Entry result) { - commentManager = new UnifiedCommentManager( - Unified.this, - base, revision, path, - result.getCommentLinkProcessor(), - getChangeStatus().isOpen()); + commentManager = + new UnifiedCommentManager( + Unified.this, + base, + revision, + path, + result.getCommentLinkProcessor(), + getChangeStatus().isOpen()); setTheme(result.getTheme()); display(comments); header.setupPrevNextFiles(comments); @@ -103,13 +101,14 @@ public class Unified extends DiffScreen { public void onShowView() { super.onShowView(); - operation(new Runnable() { - @Override - public void run() { - resizeCodeMirror(); - cm.refresh(); - } - }); + operation( + new Runnable() { + @Override + public void run() { + resizeCodeMirror(); + cm.refresh(); + } + }); setLineLength(Patch.COMMIT_MSG.equals(path) ? 72 : prefs.lineLength()); diffTable.refresh(); @@ -125,8 +124,7 @@ public class Unified extends DiffScreen { } } if (getStartSide() != null && getStartLine() > 0) { - cm.scrollToLine( - chunkManager.getCmLine(getStartLine() - 1, getStartSide())); + cm.scrollToLine(chunkManager.getCmLine(getStartLine() - 1, getStartSide())); cm.focus(); } else { cm.setCursor(Pos.create(0)); @@ -142,15 +140,17 @@ public class Unified extends DiffScreen { void registerCmEvents(final CodeMirror cm) { super.registerCmEvents(cm); - cm.on("scroll", new Runnable() { - @Override - public void run() { - ScrollInfo si = cm.getScrollInfo(); - if (autoHideDiffTableHeader) { - updateDiffTableHeader(si); - } - } - }); + cm.on( + "scroll", + new Runnable() { + @Override + public void run() { + ScrollInfo si = cm.getScrollInfo(); + if (autoHideDiffTableHeader) { + updateDiffTableHeader(si); + } + } + }); maybeRegisterRenderEntireFileKeyMap(cm); } @@ -179,27 +179,25 @@ public class Unified extends DiffScreen { diffTable.addStyleName(Resources.I.diffTableStyle().showLineNumbers()); } - cm = newCm( - diff.metaA() == null ? diff.metaB() : diff.metaA(), - diff.textUnified(), - diffTable.cm); + cm = + newCm(diff.metaA() == null ? diff.metaB() : diff.metaA(), diff.textUnified(), diffTable.cm); setShowTabs(prefs.showTabs()); chunkManager = new UnifiedChunkManager(this, cm, diffTable.scrollbar); - operation(new Runnable() { - @Override - public void run() { - // Estimate initial CodeMirror height, fixed up in onShowView. - int height = Window.getClientHeight() - - (Gerrit.getHeaderFooterHeight() + 18); - cm.setHeight(height); + operation( + new Runnable() { + @Override + public void run() { + // Estimate initial CodeMirror height, fixed up in onShowView. + int height = Window.getClientHeight() - (Gerrit.getHeaderFooterHeight() + 18); + cm.setHeight(height); - render(diff); - commentManager.render(comments, prefs.expandAllComments()); - skipManager.render(prefs.context(), diff); - } - }); + render(diff); + commentManager.render(comments, prefs.expandAllComments()); + skipManager.render(prefs.context(), diff); + } + }); registerCmEvents(cm); @@ -214,39 +212,37 @@ public class Unified extends DiffScreen { InlineHyperlink toSideBySideDiffLink = new InlineHyperlink(); toSideBySideDiffLink.setHTML( new ImageResourceRenderer().render(Gerrit.RESOURCES.sideBySideDiff())); - toSideBySideDiffLink.setTargetHistoryToken( - Dispatcher.toSideBySide(base, revision, path)); + toSideBySideDiffLink.setTargetHistoryToken(Dispatcher.toSideBySide(base, revision, path)); toSideBySideDiffLink.setTitle(PatchUtil.C.sideBySideDiff()); return Collections.singletonList(toSideBySideDiffLink); } @Override - CodeMirror newCm( - DiffInfo.FileMeta meta, - String contents, - Element parent) { + CodeMirror newCm(DiffInfo.FileMeta meta, String contents, Element parent) { JsArrayString gutters = JavaScriptObject.createArray().cast(); gutters.push(UnifiedTable.style.lineNumbersLeft()); gutters.push(UnifiedTable.style.lineNumbersRight()); - return CodeMirror.create(parent, Configuration.create() - .set("cursorBlinkRate", prefs.cursorBlinkRate()) - .set("cursorHeight", 0.85) - .set("gutters", gutters) - .set("inputStyle", "textarea") - .set("keyMap", "vim_ro") - .set("lineNumbers", false) - .set("lineWrapping", prefs.lineWrapping()) - .set("matchBrackets", prefs.matchBrackets()) - .set("mode", getFileSize() == FileSize.SMALL ? getContentType(meta) : null) - .set("readOnly", true) - .set("scrollbarStyle", "overlay") - .set("styleSelectedText", true) - .set("showTrailingSpace", prefs.showWhitespaceErrors()) - .set("tabSize", prefs.tabSize()) - .set("theme", prefs.theme().name().toLowerCase()) - .set("value", meta != null ? contents : "") - .set("viewportMargin", renderEntireFile() ? POSITIVE_INFINITY : 10)); + return CodeMirror.create( + parent, + Configuration.create() + .set("cursorBlinkRate", prefs.cursorBlinkRate()) + .set("cursorHeight", 0.85) + .set("gutters", gutters) + .set("inputStyle", "textarea") + .set("keyMap", "vim_ro") + .set("lineNumbers", false) + .set("lineWrapping", prefs.lineWrapping()) + .set("matchBrackets", prefs.matchBrackets()) + .set("mode", getFileSize() == FileSize.SMALL ? getContentType(meta) : null) + .set("readOnly", true) + .set("scrollbarStyle", "overlay") + .set("styleSelectedText", true) + .set("showTrailingSpace", prefs.showWhitespaceErrors()) + .set("tabSize", prefs.tabSize()) + .set("theme", prefs.theme().name().toLowerCase()) + .set("value", meta != null ? contents : "") + .set("viewportMargin", renderEntireFile() ? POSITIVE_INFINITY : 10)); } @Override @@ -256,15 +252,17 @@ public class Unified extends DiffScreen { cm.refresh(); } - private void setLineNumber(DisplaySide side, int cmLine, Integer line, - String styleName) { + private void setLineNumber(DisplaySide side, int cmLine, Integer line, String styleName) { SafeHtml html = SafeHtml.asis(line != null ? line.toString() : " "); InlineHTML gutter = new InlineHTML(html); diffTable.add(gutter); gutter.setStyleName(styleName); - cm.setGutterMarker(cmLine, side == DisplaySide.A - ? UnifiedTable.style.lineNumbersLeft() - : UnifiedTable.style.lineNumbersRight(), gutter.getElement()); + cm.setGutterMarker( + cmLine, + side == DisplaySide.A + ? UnifiedTable.style.lineNumbersLeft() + : UnifiedTable.style.lineNumbersRight(), + gutter.getElement()); } void setLineNumber(DisplaySide side, int cmLine, int line) { @@ -272,29 +270,29 @@ public class Unified extends DiffScreen { } void setLineNumberEmpty(DisplaySide side, int cmLine) { - setLineNumber(side, cmLine, null, - UnifiedTable.style.unifiedLineNumberEmpty()); + setLineNumber(side, cmLine, null, UnifiedTable.style.unifiedLineNumberEmpty()); } @Override void setSyntaxHighlighting(boolean b) { final DiffInfo diff = getDiff(); if (b) { - injectMode(diff, new AsyncCallback() { - @Override - public void onSuccess(Void result) { - if (prefs.syntaxHighlighting()) { - cm.setOption("mode", getContentType(diff.metaA() == null - ? diff.metaB() - : diff.metaA())); - } - } + injectMode( + diff, + new AsyncCallback() { + @Override + public void onSuccess(Void result) { + if (prefs.syntaxHighlighting()) { + cm.setOption( + "mode", getContentType(diff.metaA() == null ? diff.metaB() : diff.metaA())); + } + } - @Override - public void onFailure(Throwable caught) { - prefs.syntaxHighlighting(false); - } - }); + @Override + public void onFailure(Throwable caught) { + prefs.syntaxHighlighting(false); + } + }); } else { cm.setOption("mode", (String) null); } @@ -328,14 +326,15 @@ public class Unified extends DiffScreen { // key (or j/k) is held down. Performance on Chrome is fine // without the deferral. // - Scheduler.get().scheduleDeferred(new ScheduledCommand() { - @Override - public void execute() { - LineHandle handle = - cm.getLineHandleVisualStart(cm.getCursor("end").line()); - cm.extras().activeLine(handle); - } - }); + Scheduler.get() + .scheduleDeferred( + new ScheduledCommand() { + @Override + public void execute() { + LineHandle handle = cm.getLineHandleVisualStart(cm.getCursor("end").line()); + cm.extras().activeLine(handle); + } + }); } }; } @@ -356,12 +355,13 @@ public class Unified extends DiffScreen { @Override void operation(final Runnable apply) { - cm.operation(new Runnable() { - @Override - public void run() { - apply.run(); - } - }); + cm.operation( + new Runnable() { + @Override + public void run() { + apply.run(); + } + }); } @Override diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UnifiedChunkManager.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UnifiedChunkManager.java index 74cf0dfa82..3939f99616 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UnifiedChunkManager.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UnifiedChunkManager.java @@ -24,20 +24,19 @@ import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.EventListener; - +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; import net.codemirror.lib.CodeMirror; import net.codemirror.lib.CodeMirror.LineClassWhere; import net.codemirror.lib.Configuration; import net.codemirror.lib.Pos; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - /** Colors modified regions for {@link Unified}. */ class UnifiedChunkManager extends ChunkManager { private static final JavaScriptObject focus = initOnClick(); + private static native JavaScriptObject initOnClick() /*-{ return $entry(function(e){ @com.google.gerrit.client.diff.UnifiedChunkManager::focus( @@ -70,9 +69,7 @@ class UnifiedChunkManager extends ChunkManager { private final Unified host; private final CodeMirror cm; - UnifiedChunkManager(Unified host, - CodeMirror cm, - Scrollbar scrollbar) { + UnifiedChunkManager(Unified host, CodeMirror cm, Scrollbar scrollbar) { super(scrollbar); this.host = host; @@ -123,14 +120,19 @@ class UnifiedChunkManager extends ChunkManager { int bLen = b != null ? b.length() : 0; boolean insertOrDelete = a == null || b == null; - colorLines(cm, + colorLines( + cm, insertOrDelete && !useIntralineBg ? UnifiedTable.style.diffDelete() - : UnifiedTable.style.intralineDelete(), cmLine, aLen); - colorLines(cm, + : UnifiedTable.style.intralineDelete(), + cmLine, + aLen); + colorLines( + cm, insertOrDelete && !useIntralineBg ? UnifiedTable.style.diffInsert() - : UnifiedTable.style.intralineInsert(), cmLine + aLen, + : UnifiedTable.style.intralineInsert(), + cmLine + aLen, bLen); markEdit(DisplaySide.A, cmLine, a, region.editA()); markEdit(DisplaySide.B, cmLine + aLen, b, region.editB()); @@ -166,20 +168,17 @@ class UnifiedChunkManager extends ChunkManager { } } - private void markEdit(DisplaySide side, int startLine, - JsArrayString lines, JsArray edits) { + private void markEdit(DisplaySide side, int startLine, JsArrayString lines, JsArray edits) { if (lines == null || edits == null) { return; } EditIterator iter = new EditIterator(lines, startLine); - Configuration bg = Configuration.create() - .set("className", getIntralineBgFromSide(side)) - .set("readOnly", true); + Configuration bg = + Configuration.create().set("className", getIntralineBgFromSide(side)).set("readOnly", true); - Configuration diff = Configuration.create() - .set("className", getDiffColorFromSide(side)) - .set("readOnly", true); + Configuration diff = + Configuration.create().set("className", getDiffColorFromSide(side)).set("readOnly", true); Pos last = Pos.create(0, 0); for (Span span : Natives.asList(edits)) { @@ -192,26 +191,25 @@ class UnifiedChunkManager extends ChunkManager { } getMarkers().add(cm.markText(from, to, diff)); last = to; - colorLines(cm, LineClassWhere.BACKGROUND, - getDiffColorFromSide(side), - from.line(), to.line()); + colorLines(cm, LineClassWhere.BACKGROUND, getDiffColorFromSide(side), from.line(), to.line()); } } private String getIntralineBgFromSide(DisplaySide side) { - return side == DisplaySide.A ? UnifiedTable.style.intralineDelete() + return side == DisplaySide.A + ? UnifiedTable.style.intralineDelete() : UnifiedTable.style.intralineInsert(); } private String getDiffColorFromSide(DisplaySide side) { - return side == DisplaySide.A ? UnifiedTable.style.diffDelete() + return side == DisplaySide.A + ? UnifiedTable.style.diffDelete() : UnifiedTable.style.diffInsert(); } - private void addDiffChunk(DisplaySide side, int chunkEnd, int chunkSize, - int cmLine, boolean edit) { - chunks.add(new UnifiedDiffChunkInfo(side, chunkEnd - chunkSize + 1, chunkEnd, - cmLine, edit)); + private void addDiffChunk( + DisplaySide side, int chunkEnd, int chunkSize, int cmLine, boolean edit) { + chunks.add(new UnifiedDiffChunkInfo(side, chunkEnd - chunkSize + 1, chunkEnd, cmLine, edit)); } @Override @@ -219,10 +217,9 @@ class UnifiedChunkManager extends ChunkManager { return new Runnable() { @Override public void run() { - int line = cm.extras().hasActiveLine() - ? cm.getLineNumber(cm.extras().activeLine()) - : 0; - int res = Collections.binarySearch( + int line = cm.extras().hasActiveLine() ? cm.getLineNumber(cm.extras().activeLine()) : 0; + int res = + Collections.binarySearch( chunks, new UnifiedDiffChunkInfo(cm.side(), 0, 0, line, false), getDiffChunkComparatorCmLine()); @@ -244,9 +241,9 @@ class UnifiedChunkManager extends ChunkManager { @Override int getCmLine(int line, DisplaySide side) { int res = - Collections.binarySearch(chunks, - new UnifiedDiffChunkInfo( - side, line, 0, 0, false), // Dummy DiffChunkInfo + Collections.binarySearch( + chunks, + new UnifiedDiffChunkInfo(side, line, 0, 0, false), // Dummy DiffChunkInfo getDiffChunkComparator()); if (res >= 0) { return chunks.get(res).getCmLine(); @@ -255,22 +252,18 @@ class UnifiedChunkManager extends ChunkManager { res = -res - 1; if (res > 0) { UnifiedDiffChunkInfo info = chunks.get(res - 1); - if (side == DisplaySide.A && info.isEdit() - && info.getSide() == DisplaySide.B) { + if (side == DisplaySide.A && info.isEdit() && info.getSide() == DisplaySide.B) { // Need to use the start and cmLine of the deletion chunk UnifiedDiffChunkInfo delete = chunks.get(res - 2); if (line <= delete.getEnd()) { return delete.getCmLine() + line - delete.getStart(); } // Need to add the length of the insertion chunk - return delete.getCmLine() + line - delete.getStart() - + info.getEnd() - info.getStart() + 1; + return delete.getCmLine() + line - delete.getStart() + info.getEnd() - info.getStart() + 1; } else if (side == info.getSide()) { return info.getCmLine() + line - info.getStart(); } else { - return info.getCmLine() - + lineMapper.lineOnOther(side, line).getLine() - - info.getStart(); + return info.getCmLine() + lineMapper.lineOnOther(side, line).getLine() - info.getStart(); } } return line; @@ -278,14 +271,13 @@ class UnifiedChunkManager extends ChunkManager { LineRegionInfo getLineRegionInfoFromCmLine(int cmLine) { int res = - Collections.binarySearch(chunks, - new UnifiedDiffChunkInfo( - DisplaySide.A, 0, 0, cmLine, false), // Dummy DiffChunkInfo + Collections.binarySearch( + chunks, + new UnifiedDiffChunkInfo(DisplaySide.A, 0, 0, cmLine, false), // Dummy DiffChunkInfo getDiffChunkComparatorCmLine()); - if (res >= 0) { // The line is right at the start of a diff chunk. + if (res >= 0) { // The line is right at the start of a diff chunk. UnifiedDiffChunkInfo info = chunks.get(res); - return new LineRegionInfo( - info.getStart(), displaySideToRegionType(info.getSide())); + return new LineRegionInfo(info.getStart(), displaySideToRegionType(info.getSide())); } // The line might be within or after a diff chunk. res = -res - 1; @@ -297,14 +289,12 @@ class UnifiedChunkManager extends ChunkManager { // For the common region after a deletion chunk, associate the line // on side B with a common region. return new LineRegionInfo( - lineMapper.lineOnOther(DisplaySide.A, lineOnInfoSide) - .getLine(), RegionType.COMMON); + lineMapper.lineOnOther(DisplaySide.A, lineOnInfoSide).getLine(), RegionType.COMMON); } return new LineRegionInfo(lineOnInfoSide, RegionType.COMMON); } // Within a diff chunk - return new LineRegionInfo( - lineOnInfoSide, displaySideToRegionType(info.getSide())); + return new LineRegionInfo(lineOnInfoSide, displaySideToRegionType(info.getSide())); } // The line is before any diff chunk, so it always equals cmLine and // belongs to a common region. @@ -312,7 +302,9 @@ class UnifiedChunkManager extends ChunkManager { } enum RegionType { - INSERT, DELETE, COMMON, + INSERT, + DELETE, + COMMON, } private static RegionType displaySideToRegionType(DisplaySide side) { @@ -320,13 +312,12 @@ class UnifiedChunkManager extends ChunkManager { } /** - * Helper class to associate a line in the original file with the type of the - * region it belongs to. + * Helper class to associate a line in the original file with the type of the region it belongs + * to. * - * @field line The 0-based line number in the original file. Note that this - * might be different from the line number shown in CodeMirror. - * @field type The type of the region the line belongs to. Can be INSERT, - * DELETE or COMMON. + * @field line The 0-based line number in the original file. Note that this might be different + * from the line number shown in CodeMirror. + * @field type The type of the region the line belongs to. Can be INSERT, DELETE or COMMON. */ static class LineRegionInfo { final int line; diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UnifiedCommentGroup.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UnifiedCommentGroup.java index 4effb46dc1..a6912df6f7 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UnifiedCommentGroup.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UnifiedCommentGroup.java @@ -15,14 +15,13 @@ package com.google.gerrit.client.diff; import com.google.gwt.user.client.Timer; - import net.codemirror.lib.CodeMirror; /** * LineWidget attached to a CodeMirror container. * - * When a comment is placed on a line a CommentWidget is created. - * The group tracks all comment boxes on a line in unified diff view. + *

When a comment is placed on a line a CommentWidget is created. The group tracks all comment + * boxes on a line in unified diff view. */ class UnifiedCommentGroup extends CommentGroup { UnifiedCommentGroup(UnifiedCommentManager manager, CodeMirror cm, DisplaySide side, int line) { @@ -49,30 +48,33 @@ class UnifiedCommentGroup extends CommentGroup { @Override void handleRedraw() { - getLineWidget().onRedraw(new Runnable() { - @Override - public void run() { - if (canComputeHeight()) { - if (getResizeTimer() != null) { - getResizeTimer().cancel(); - setResizeTimer(null); - } - reportHeightChange(); - } else if (getResizeTimer() == null) { - setResizeTimer(new Timer() { - @Override - public void run() { - if (canComputeHeight()) { - cancel(); - setResizeTimer(null); - reportHeightChange(); + getLineWidget() + .onRedraw( + new Runnable() { + @Override + public void run() { + if (canComputeHeight()) { + if (getResizeTimer() != null) { + getResizeTimer().cancel(); + setResizeTimer(null); + } + reportHeightChange(); + } else if (getResizeTimer() == null) { + setResizeTimer( + new Timer() { + @Override + public void run() { + if (canComputeHeight()) { + cancel(); + setResizeTimer(null); + reportHeightChange(); + } + } + }); + getResizeTimer().scheduleRepeating(5); + } } - } - }); - getResizeTimer().scheduleRepeating(5); - } - } - }); + }); } @Override diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UnifiedCommentManager.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UnifiedCommentManager.java index cc23acaed5..1d9b55afc9 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UnifiedCommentManager.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UnifiedCommentManager.java @@ -22,16 +22,14 @@ import com.google.gerrit.client.diff.UnifiedChunkManager.LineRegionInfo; import com.google.gerrit.client.diff.UnifiedChunkManager.RegionType; import com.google.gerrit.client.ui.CommentLinkProcessor; import com.google.gerrit.reviewdb.client.PatchSet; - -import net.codemirror.lib.CodeMirror; -import net.codemirror.lib.Pos; -import net.codemirror.lib.TextMarker.FromTo; - import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; +import net.codemirror.lib.CodeMirror; +import net.codemirror.lib.Pos; +import net.codemirror.lib.TextMarker.FromTo; /** Tracks comment widgets for {@link Unified}. */ class UnifiedCommentManager extends CommentManager { @@ -43,8 +41,10 @@ class UnifiedCommentManager extends CommentManager { // duplicates and replace the entries in mergedMap on draft removal. private final Map duplicates; - UnifiedCommentManager(Unified host, - DiffObject base, PatchSet.Id revision, + UnifiedCommentManager( + Unified host, + DiffObject base, + PatchSet.Id revision, String path, CommentLinkProcessor clp, boolean open) { @@ -71,17 +71,13 @@ class UnifiedCommentManager extends CommentManager { } @Override - void newDraftOnGutterClick(CodeMirror cm, String gutterClass, - int cmLinePlusOne) { + void newDraftOnGutterClick(CodeMirror cm, String gutterClass, int cmLinePlusOne) { if (!Gerrit.isSignedIn()) { signInCallback(cm).run(); } else { - LineRegionInfo info = - ((Unified) host).getLineRegionInfoFromCmLine(cmLinePlusOne - 1); + LineRegionInfo info = ((Unified) host).getLineRegionInfoFromCmLine(cmLinePlusOne - 1); DisplaySide side = - gutterClass.equals(UnifiedTable.style.lineNumbersLeft()) - ? DisplaySide.A - : DisplaySide.B; + gutterClass.equals(UnifiedTable.style.lineNumbersLeft()) ? DisplaySide.A : DisplaySide.B; int line = info.line; if (info.getSide() != side) { line = host.lineOnOther(info.getSide(), line).getLine(); @@ -95,12 +91,9 @@ class UnifiedCommentManager extends CommentManager { CommentGroup group = null; if (cm.extras().hasActiveLine()) { int cmLinePlusOne = cm.getLineNumber(cm.extras().activeLine()) + 1; - LineRegionInfo info = - ((Unified) host).getLineRegionInfoFromCmLine(cmLinePlusOne - 1); + LineRegionInfo info = ((Unified) host).getLineRegionInfoFromCmLine(cmLinePlusOne - 1); CommentGroup forSide = map(info.getSide()).get(cmLinePlusOne); - group = forSide == null - ? map(info.getSide().otherSide()).get(cmLinePlusOne) - : forSide; + group = forSide == null ? map(info.getSide().otherSide()).get(cmLinePlusOne) : forSide; } return group; } @@ -113,8 +106,7 @@ class UnifiedCommentManager extends CommentManager { @Override String getTokenSuffixForActiveLine(CodeMirror cm) { int cmLinePlusOne = cm.getLineNumber(cm.extras().activeLine()) + 1; - LineRegionInfo info = - ((Unified) host).getLineRegionInfoFromCmLine(cmLinePlusOne - 1); + LineRegionInfo info = ((Unified) host).getLineRegionInfoFromCmLine(cmLinePlusOne - 1); return (info.getSide() == DisplaySide.A ? "a" : "") + cmLinePlusOne; } @@ -126,19 +118,15 @@ class UnifiedCommentManager extends CommentManager { Pos to = fromTo.to(); Unified unified = (Unified) host; UnifiedChunkManager manager = unified.getChunkManager(); - LineRegionInfo fromInfo = - unified.getLineRegionInfoFromCmLine(from.line()); - LineRegionInfo toInfo = - unified.getLineRegionInfoFromCmLine(to.line()); + LineRegionInfo fromInfo = unified.getLineRegionInfoFromCmLine(from.line()); + LineRegionInfo toInfo = unified.getLineRegionInfoFromCmLine(to.line()); DisplaySide side = toInfo.getSide(); // Handle special cases in selections that span multiple regions. Force // start line to be on the same side as the end line. - if ((fromInfo.type == RegionType.INSERT - || fromInfo.type == RegionType.COMMON) + if ((fromInfo.type == RegionType.INSERT || fromInfo.type == RegionType.COMMON) && toInfo.type == RegionType.DELETE) { - LineOnOtherInfo infoOnSideA = manager.lineMapper - .lineOnOther(DisplaySide.B, fromInfo.line); + LineOnOtherInfo infoOnSideA = manager.lineMapper.lineOnOther(DisplaySide.B, fromInfo.line); int startLineOnSideA = infoOnSideA.getLine(); if (infoOnSideA.isAligned()) { from.line(startLineOnSideA); @@ -147,10 +135,8 @@ class UnifiedCommentManager extends CommentManager { } from.ch(0); to.line(toInfo.line); - } else if (fromInfo.type == RegionType.DELETE - && toInfo.type == RegionType.INSERT) { - LineOnOtherInfo infoOnSideB = manager.lineMapper - .lineOnOther(DisplaySide.A, fromInfo.line); + } else if (fromInfo.type == RegionType.DELETE && toInfo.type == RegionType.INSERT) { + LineOnOtherInfo infoOnSideB = manager.lineMapper.lineOnOther(DisplaySide.A, fromInfo.line); int startLineOnSideB = infoOnSideB.getLine(); if (infoOnSideB.isAligned()) { from.line(startLineOnSideB); @@ -159,10 +145,8 @@ class UnifiedCommentManager extends CommentManager { } from.ch(0); to.line(toInfo.line); - } else if (fromInfo.type == RegionType.DELETE - && toInfo.type == RegionType.COMMON) { - int toLineOnSideA = manager.lineMapper - .lineOnOther(DisplaySide.B, toInfo.line).getLine(); + } else if (fromInfo.type == RegionType.DELETE && toInfo.type == RegionType.COMMON) { + int toLineOnSideA = manager.lineMapper.lineOnOther(DisplaySide.B, toInfo.line).getLine(); from.line(fromInfo.line); // Force the end line to be on the same side as the start line. to.line(toLineOnSideA); @@ -172,18 +156,20 @@ class UnifiedCommentManager extends CommentManager { to.line(toInfo.line); } - addDraftBox(side, CommentInfo.create( - getPath(), - getStoredSideFromDisplaySide(side), - to.line() + 1, - CommentRange.create(fromTo), - false)).setEdit(true); + addDraftBox( + side, + CommentInfo.create( + getPath(), + getStoredSideFromDisplaySide(side), + to.line() + 1, + CommentRange.create(fromTo), + false)) + .setEdit(true); cm.setCursor(Pos.create(host.getCmLine(to.line(), side), to.ch())); cm.setSelection(cm.getCursor()); } else { int cmLine = cm.getLineNumber(cm.extras().activeLine()); - LineRegionInfo info = - ((Unified) host).getLineRegionInfoFromCmLine(cmLine); + LineRegionInfo info = ((Unified) host).getLineRegionInfoFromCmLine(cmLine); insertNewDraft(info.getSide(), cmLine + 1); } } @@ -196,8 +182,8 @@ class UnifiedCommentManager extends CommentManager { return existing; } - UnifiedCommentGroup g = new UnifiedCommentGroup( - this, host.getCmFromSide(side), side, cmLinePlusOne); + UnifiedCommentGroup g = + new UnifiedCommentGroup(this, host.getCmFromSide(side), side, cmLinePlusOne); map.put(cmLinePlusOne, g); if (mergedMap.containsKey(cmLinePlusOne)) { duplicates.put(cmLinePlusOne, mergedMap.remove(cmLinePlusOne)); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UnifiedDiffChunkInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UnifiedDiffChunkInfo.java index 844be78f70..dc827cba24 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UnifiedDiffChunkInfo.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UnifiedDiffChunkInfo.java @@ -18,8 +18,7 @@ public class UnifiedDiffChunkInfo extends DiffChunkInfo { private int cmLine; - UnifiedDiffChunkInfo(DisplaySide side, - int start, int end, int cmLine, boolean edit) { + UnifiedDiffChunkInfo(DisplaySide side, int start, int end, int cmLine, boolean edit) { super(side, start, end, edit); this.cmLine = cmLine; } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UnifiedTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UnifiedTable.java index e3317c472d..2d5df63a10 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UnifiedTable.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UnifiedTable.java @@ -23,21 +23,29 @@ import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.HTMLPanel; /** - * A table with one row and one column to hold a unified CodeMirror displaying - * the files to be compared. + * A table with one row and one column to hold a unified CodeMirror displaying the files to be + * compared. */ class UnifiedTable extends DiffTable { interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); interface DiffTableStyle extends CssResource { String intralineInsert(); + String intralineDelete(); + String diffInsert(); + String diffDelete(); + String unifiedLineNumber(); + String unifiedLineNumberEmpty(); + String lineNumbersLeft(); + String lineNumbersRight(); } @@ -45,8 +53,7 @@ class UnifiedTable extends DiffTable { @UiField Element cm; @UiField static DiffTableStyle style; - UnifiedTable(Unified parent, DiffObject base, DiffObject revision, - String path) { + UnifiedTable(Unified parent, DiffObject base, DiffObject revision, String path) { super(parent, base, revision, path); initWidget(uiBinder.createAndBindUi(this)); @@ -54,8 +61,7 @@ class UnifiedTable extends DiffTable { } @Override - void setHideEmptyPane(boolean hide) { - } + void setHideEmptyPane(boolean hide) {} @Override boolean isVisibleA() { @@ -69,8 +75,7 @@ class UnifiedTable extends DiffTable { @Override int getHeaderHeight() { - int h = patchSetSelectBoxA.getOffsetHeight() - + patchSetSelectBoxB.getOffsetHeight(); + int h = patchSetSelectBoxA.getOffsetHeight() + patchSetSelectBoxB.getOffsetHeight(); if (hasHeader()) { h += diffHeaderRow.getOffsetHeight(); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UpToChangeCommand.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UpToChangeCommand.java index 5d554940c2..ea2f2cfda1 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UpToChangeCommand.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UpToChangeCommand.java @@ -31,8 +31,6 @@ class UpToChangeCommand extends KeyCommand { @Override public void onKeyPress(final KeyPressEvent event) { - Gerrit.display(PageLinks.toChange( - revision.getParentKey(), - revision.getId())); + Gerrit.display(PageLinks.toChange(revision.getParentKey(), revision.getId())); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocConstants.java index f6b7a9d976..2958783705 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocConstants.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocConstants.java @@ -20,6 +20,8 @@ public interface DocConstants extends Constants { String keyReloadSearch(); String docItemHelp(); + String docTableColumnTitle(); + String docTableNone(); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocInfo.java index fd63ffc15d..5fcb6b059b 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocInfo.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocInfo.java @@ -20,14 +20,14 @@ import com.google.gwt.core.client.JavaScriptObject; public class DocInfo extends JavaScriptObject { public final native String title() /*-{ return this.title; }-*/; + public final native String url() /*-{ return this.url; }-*/; public static DocInfo create() { return (DocInfo) createObject(); } - protected DocInfo() { - } + protected DocInfo() {} public final String getFullUrl() { return GWT.getHostPageBaseURL() + url(); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocMessages.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocMessages.java index df62b92e49..7d76f7bca2 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocMessages.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocMessages.java @@ -18,5 +18,6 @@ import com.google.gwt.i18n.client.Messages; public interface DocMessages extends Messages { String docQueryWindowTitle(String query); + String docQueryPageTitle(String query); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocTable.java index 0c5be8ee68..677c2bf388 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocTable.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocTable.java @@ -39,18 +39,19 @@ class DocTable extends NavigationTable { FlexCellFormatter fmt = table.getFlexCellFormatter(); fmt.addStyleName(0, C_TITLE, Gerrit.RESOURCES.css().dataHeader()); - table.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - Cell cell = table.getCellForEvent(event); - if (cell == null) { - return; - } - if (getRowItem(cell.getRowIndex()) != null) { - movePointerTo(cell.getRowIndex()); - } - } - }); + table.addClickHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + Cell cell = table.getCellForEvent(event); + if (cell == null) { + return; + } + if (getRowItem(cell.getRowIndex()) != null) { + movePointerTo(cell.getRowIndex()); + } + } + }); } @Override diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/download/DownloadCommandLink.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/download/DownloadCommandLink.java index 4a6ecab331..2b09175e52 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/download/DownloadCommandLink.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/download/DownloadCommandLink.java @@ -27,8 +27,7 @@ public class DownloadCommandLink extends Anchor implements ClickHandler { private final CopyableLabel copyLabel; private final String command; - public DownloadCommandLink(CopyableLabel copyLabel, - DownloadCommandInfo commandInfo) { + public DownloadCommandLink(CopyableLabel copyLabel, DownloadCommandInfo commandInfo) { super(commandInfo.name()); this.copyLabel = copyLabel; this.command = commandInfo.command(); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/download/DownloadCommandPanel.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/download/DownloadCommandPanel.java index 21c33e2eab..20cf3f3a0c 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/download/DownloadCommandPanel.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/download/DownloadCommandPanel.java @@ -37,8 +37,7 @@ public class DownloadCommandPanel extends FlowPanel { for (Widget w : this) { if (w instanceof DownloadCommandLink) { DownloadCommandLink d = (DownloadCommandLink) w; - if (currentCommand != null - && d.getText().equals(currentCommand.getText())) { + if (currentCommand != null && d.getText().equals(currentCommand.getText())) { d.select(); return; } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/download/DownloadPanel.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/download/DownloadPanel.java index 7119bd2ee8..b881505cb5 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/download/DownloadPanel.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/download/DownloadPanel.java @@ -20,7 +20,6 @@ import com.google.gerrit.client.info.DownloadInfo.DownloadSchemeInfo; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.InlineLabel; import com.google.gwtexpui.clippy.client.CopyableLabel; - import java.util.List; public abstract class DownloadPanel extends FlowPanel { @@ -63,6 +62,5 @@ public abstract class DownloadPanel extends FlowPanel { commands.select(); } - protected abstract List getCommands( - DownloadSchemeInfo schemeInfo); + protected abstract List getCommands(DownloadSchemeInfo schemeInfo); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/download/DownloadUrlLink.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/download/DownloadUrlLink.java index 086376ac72..76e7d7ca25 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/download/DownloadUrlLink.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/download/DownloadUrlLink.java @@ -25,7 +25,6 @@ import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Widget; - import java.util.ArrayList; import java.util.List; @@ -47,8 +46,8 @@ public class DownloadUrlLink extends Anchor implements ClickHandler { private final DownloadSchemeInfo schemeInfo; private final String schemeName; - public DownloadUrlLink(DownloadPanel downloadPanel, - DownloadSchemeInfo schemeInfo, String schemeName) { + public DownloadUrlLink( + DownloadPanel downloadPanel, DownloadSchemeInfo schemeInfo, String schemeName) { super(schemeName); setStyleName(Gerrit.RESOURCES.css().downloadLink()); Roles.getTabRole().set(getElement()); @@ -75,16 +74,17 @@ public class DownloadUrlLink extends Anchor implements ClickHandler { prefs.downloadScheme(schemeName); GeneralPreferences in = GeneralPreferences.create(); in.downloadScheme(schemeName); - AccountApi.self().view("preferences") - .put(in, new AsyncCallback() { - @Override - public void onSuccess(JavaScriptObject result) { - } + AccountApi.self() + .view("preferences") + .put( + in, + new AsyncCallback() { + @Override + public void onSuccess(JavaScriptObject result) {} - @Override - public void onFailure(Throwable caught) { - } - }); + @Override + public void onFailure(Throwable caught) {} + }); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/download/DownloadUrlPanel.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/download/DownloadUrlPanel.java index 541c6f3fea..6a5fbe4f8b 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/download/DownloadUrlPanel.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/download/DownloadUrlPanel.java @@ -18,7 +18,6 @@ import com.google.gerrit.client.Gerrit; import com.google.gwt.aria.client.Roles; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Widget; - import java.util.Collection; public class DownloadUrlPanel extends FlowPanel { @@ -56,7 +55,7 @@ public class DownloadUrlPanel extends FlowPanel { } public void add(Collection links) { - for (Widget link: links) { + for (Widget link : links) { add(link); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditConstants.java index 8dc4137517..b70c209ea0 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditConstants.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditConstants.java @@ -21,6 +21,7 @@ interface EditConstants extends Constants { EditConstants I = GWT.create(EditConstants.class); String closeUnsavedChanges(); + String cancelUnsavedChanges(); String gotoLineNumber(); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditFileInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditFileInfo.java index dda5fc2897..3f9d73282f 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditFileInfo.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditFileInfo.java @@ -21,6 +21,5 @@ import com.google.gwt.core.client.JsArray; public class EditFileInfo extends JavaScriptObject { public final native JsArray webLinks() /*-{ return this.web_links; }-*/; - protected EditFileInfo() { - } + protected EditFileInfo() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditPreferencesAction.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditPreferencesAction.java index d297f4d73e..e11ded0d64 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditPreferencesAction.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditPreferencesAction.java @@ -43,20 +43,22 @@ class EditPreferencesAction { popup = new PopupPanel(true, false); popup.setStyleName(current.style.dialog()); popup.add(current); - popup.addCloseHandler(new CloseHandler() { - @Override - public void onClose(CloseEvent event) { - view.getEditor().focus(); - popup = null; - current = null; - } - }); - popup.setPopupPositionAndShow(new PositionCallback() { - @Override - public void setPosition(int offsetWidth, int offsetHeight) { - popup.setPopupPosition(300, 120); - } - }); + popup.addCloseHandler( + new CloseHandler() { + @Override + public void onClose(CloseEvent event) { + view.getEditor().focus(); + popup = null; + current = null; + } + }); + popup.setPopupPositionAndShow( + new PositionCallback() { + @Override + public void setPosition(int offsetWidth, int offsetHeight) { + popup.setPopupPosition(300, 120); + } + }); } void hide() { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditPreferencesBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditPreferencesBox.java index 6694e7cd14..de2c739cc7 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditPreferencesBox.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditPreferencesBox.java @@ -40,12 +40,12 @@ import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.PopupPanel; import com.google.gwt.user.client.ui.ToggleButton; import com.google.gwt.user.client.ui.UIObject; - import net.codemirror.theme.ThemeLoader; /** Displays current edit preferences. */ public class EditPreferencesBox extends Composite { interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); public interface Style extends CssResource { @@ -237,19 +237,20 @@ public class EditPreferencesBox extends Composite { final Theme newTheme = Theme.valueOf(theme.getValue(theme.getSelectedIndex())); prefs.theme(newTheme); if (view != null) { - ThemeLoader.loadTheme(newTheme, new GerritCallback() { - @Override - public void onSuccess(Void result) { - view.setTheme(newTheme); - } - }); + ThemeLoader.loadTheme( + newTheme, + new GerritCallback() { + @Override + public void onSuccess(Void result) { + view.setTheme(newTheme); + } + }); } } @UiHandler("keyMap") void onKeyMap(@SuppressWarnings("unused") ChangeEvent e) { - KeyMapType keyMapType = KeyMapType.valueOf( - keyMap.getValue(keyMap.getSelectedIndex())); + KeyMapType keyMapType = KeyMapType.valueOf(keyMap.getValue(keyMap.getSelectedIndex())); prefs.keyMapType(keyMapType); if (view != null) { view.setOption("keyMap", keyMapType.name().toLowerCase()); @@ -263,7 +264,8 @@ public class EditPreferencesBox extends Composite { @UiHandler("save") void onSave(@SuppressWarnings("unused") ClickEvent e) { - AccountApi.putEditPreferences(prefs, + AccountApi.putEditPreferences( + prefs, new GerritCallback() { @Override public void onSuccess(EditPreferences p) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditScreen.java index 490e028f8a..511944bff5 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditScreen.java @@ -73,7 +73,7 @@ import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.ImageResourceRenderer; import com.google.gwtexpui.globalkey.client.GlobalKey; import com.google.gwtexpui.safehtml.client.SafeHtml; - +import java.util.List; import net.codemirror.addon.AddonInjector; import net.codemirror.addon.Addons; import net.codemirror.lib.CodeMirror; @@ -87,15 +87,16 @@ import net.codemirror.mode.ModeInfo; import net.codemirror.mode.ModeInjector; import net.codemirror.theme.ThemeLoader; -import java.util.List; - public class EditScreen extends Screen { interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); interface Style extends CssResource { String fullWidth(); + String base(); + String hideBase(); } @@ -155,74 +156,82 @@ public class EditScreen extends Screen { final CallbackGroup group2 = new CallbackGroup(); final CallbackGroup group3 = new CallbackGroup(); - CodeMirror.initLibrary(group1.add(new AsyncCallback() { - final AsyncCallback themeCallback = group3.addEmpty(); - - @Override - public void onSuccess(Void result) { - // Load theme after CM library to ensure theme can override CSS. - ThemeLoader.loadTheme(prefs.theme(), themeCallback); - group2.done(); - - new AddonInjector().add(Addons.I.merge_bundled().getName()).inject( + CodeMirror.initLibrary( + group1.add( new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - } + final AsyncCallback themeCallback = group3.addEmpty(); - @Override - public void onSuccess(Void result) { - if (!prefs.showBase() || revision.get() > 0) { - group3.done(); - } - } - }); - } + @Override + public void onSuccess(Void result) { + // Load theme after CM library to ensure theme can override CSS. + ThemeLoader.loadTheme(prefs.theme(), themeCallback); + group2.done(); - @Override - public void onFailure(Throwable caught) { - } - })); + new AddonInjector() + .add(Addons.I.merge_bundled().getName()) + .inject( + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) {} - ChangeApi.detail(revision.getParentKey().get(), - group1.add(new AsyncCallback() { - @Override - public void onSuccess(ChangeInfo c) { - project.setInnerText(c.project()); - SafeHtml.setInnerHTML(filePath, Header.formatPath(path)); - } + @Override + public void onSuccess(Void result) { + if (!prefs.showBase() || revision.get() > 0) { + group3.done(); + } + } + }); + } - @Override - public void onFailure(Throwable caught) { - } - })); + @Override + public void onFailure(Throwable caught) {} + })); + + ChangeApi.detail( + revision.getParentKey().get(), + group1.add( + new AsyncCallback() { + @Override + public void onSuccess(ChangeInfo c) { + project.setInnerText(c.project()); + SafeHtml.setInnerHTML(filePath, Header.formatPath(path)); + } + + @Override + public void onFailure(Throwable caught) {} + })); if (revision.get() == 0) { - ChangeEditApi.getMeta(revision, path, - group1.add(new AsyncCallback() { - @Override - public void onSuccess(EditFileInfo editInfo) { - editFileInfo = editInfo; - } + ChangeEditApi.getMeta( + revision, + path, + group1.add( + new AsyncCallback() { + @Override + public void onSuccess(EditFileInfo editInfo) { + editFileInfo = editInfo; + } - @Override - public void onFailure(Throwable e) { - } - })); + @Override + public void onFailure(Throwable e) {} + })); if (prefs.showBase()) { - ChangeEditApi.get(revision, path, true /* base */, - group1.addFinal(new HttpCallback() { - @Override - public void onSuccess(HttpResponse fc) { - baseContent = fc; - group3.done(); - } + ChangeEditApi.get( + revision, + path, + true /* base */, + group1.addFinal( + new HttpCallback() { + @Override + public void onSuccess(HttpResponse fc) { + baseContent = fc; + group3.done(); + } - @Override - public void onFailure(Throwable e) { - } - })); + @Override + public void onFailure(Throwable e) {} + })); } else { group1.done(); } @@ -230,72 +239,74 @@ public class EditScreen extends Screen { // TODO(davido): We probably want to create dedicated GET EditScreenMeta // REST endpoint. Abuse GET diff for now, as it retrieves links we need. DiffApi.diff(revision, path) - .webLinksOnly() - .get(group1.addFinal(new AsyncCallback() { - @Override - public void onSuccess(DiffInfo diffInfo) { - diffLinks = diffInfo.webLinks(); - } + .webLinksOnly() + .get( + group1.addFinal( + new AsyncCallback() { + @Override + public void onSuccess(DiffInfo diffInfo) { + diffLinks = diffInfo.webLinks(); + } - @Override - public void onFailure(Throwable e) { - } - })); + @Override + public void onFailure(Throwable e) {} + })); } - ChangeEditApi.get(revision, path, - group2.add(new HttpCallback() { - final AsyncCallback modeCallback = group3.addEmpty(); + ChangeEditApi.get( + revision, + path, + group2.add( + new HttpCallback() { + final AsyncCallback modeCallback = group3.addEmpty(); + @Override + public void onSuccess(HttpResponse fc) { + content = fc; + if (revision.get() > 0) { + baseContent = fc; + } + + if (prefs.syntaxHighlighting()) { + injectMode(fc.getContentType(), modeCallback); + } else { + modeCallback.onSuccess(null); + } + } + + @Override + public void onFailure(Throwable e) { + // "Not Found" means it's a new file. + if (RestApi.isNotFound(e)) { + content = null; + modeCallback.onSuccess(null); + } else { + GerritCallback.showFailure(e); + } + } + })); + + group3.addListener( + new ScreenLoadCallback(this) { @Override - public void onSuccess(HttpResponse fc) { - content = fc; - if (revision.get() > 0) { - baseContent = fc; - } + protected void preDisplay(Void result) { + initEditor(); - if (prefs.syntaxHighlighting()) { - injectMode(fc.getContentType(), modeCallback); - } else { - modeCallback.onSuccess(null); - } + renderLinks(editFileInfo, diffLinks); + editFileInfo = null; + diffLinks = null; + + showBase.setValue(prefs.showBase(), true); + cmBase.refresh(); } - - @Override - public void onFailure(Throwable e) { - // "Not Found" means it's a new file. - if (RestApi.isNotFound(e)) { - content = null; - modeCallback.onSuccess(null); - } else { - GerritCallback.showFailure(e); - } - } - })); - - group3.addListener(new ScreenLoadCallback(this) { - @Override - protected void preDisplay(Void result) { - initEditor(); - - renderLinks(editFileInfo, diffLinks); - editFileInfo = null; - diffLinks = null; - - showBase.setValue(prefs.showBase(), true); - cmBase.refresh(); - } - }); + }); } @Override public void registerKeys() { super.registerKeys(); KeyMap localKeyMap = KeyMap.create(); - localKeyMap - .on("Ctrl-L", gotoLine()) - .on("Cmd-L", gotoLine()) - .on("Cmd-S", save()); + localKeyMap.on("Ctrl-L", gotoLine()).on("Cmd-L", gotoLine()).on("Cmd-S", save()); // TODO(davido): Find a better way to prevent key maps collisions if (prefs.keyMapType() != KeyMapType.EMACS) { @@ -323,29 +334,34 @@ public class EditScreen extends Screen { if (prefs.hideTopMenu()) { Gerrit.setHeaderVisible(false); } - resizeHandler = Window.addResizeHandler(new ResizeHandler() { - @Override - public void onResize(ResizeEvent event) { - adjustHeight(); - } - }); - closeHandler = Window.addWindowClosingHandler(new ClosingHandler() { - @Override - public void onWindowClosing(ClosingEvent event) { - if (!cmEdit.isClean(generation)) { - event.setMessage(EditConstants.I.closeUnsavedChanges()); - } - } - }); + resizeHandler = + Window.addResizeHandler( + new ResizeHandler() { + @Override + public void onResize(ResizeEvent event) { + adjustHeight(); + } + }); + closeHandler = + Window.addWindowClosingHandler( + new ClosingHandler() { + @Override + public void onWindowClosing(ClosingEvent event) { + if (!cmEdit.isClean(generation)) { + event.setMessage(EditConstants.I.closeUnsavedChanges()); + } + } + }); generation = cmEdit.changeGeneration(true); setClean(true); - cmEdit.on(new ChangesHandler() { - @Override - public void handle(CodeMirror cm) { - setClean(cm.isClean(generation)); - } - }); + cmEdit.on( + new ChangesHandler() { + @Override + public void handle(CodeMirror cm) { + setClean(cm.isClean(generation)); + } + }); adjustHeight(); cmEdit.on("cursorActivity", updateCursorPosition()); @@ -397,17 +413,14 @@ public class EditScreen extends Screen { @UiHandler("close") void onClose(@SuppressWarnings("unused") ClickEvent e) { - if (cmEdit.isClean(generation) - || Window.confirm(EditConstants.I.cancelUnsavedChanges())) { + if (cmEdit.isClean(generation) || Window.confirm(EditConstants.I.cancelUnsavedChanges())) { upToChange(); } } private void displayBase() { - cmBase.getWrapperElement().getParentElement() - .removeClassName(style.hideBase()); - cmEdit.getWrapperElement().getParentElement() - .removeClassName(style.fullWidth()); + cmBase.getWrapperElement().getParentElement().removeClassName(style.hideBase()); + cmEdit.getWrapperElement().getParentElement().removeClassName(style.fullWidth()); mv.getGapElement().removeClassName(style.hideBase()); setCmBaseValue(); setLineLength(prefs.lineLength()); @@ -419,7 +432,10 @@ public class EditScreen extends Screen { boolean shouldShow = e.getValue(); if (shouldShow) { if (baseContent == null) { - ChangeEditApi.get(revision, path, true /* base */, + ChangeEditApi.get( + revision, + path, + true /* base */, new HttpCallback() { @Override public void onSuccess(HttpResponse fc) { @@ -428,17 +444,14 @@ public class EditScreen extends Screen { } @Override - public void onFailure(Throwable e) { - } + public void onFailure(Throwable e) {} }); } else { displayBase(); } } else { - cmBase.getWrapperElement().getParentElement() - .addClassName(style.hideBase()); - cmEdit.getWrapperElement().getParentElement() - .addClassName(style.fullWidth()); + cmBase.getWrapperElement().getParentElement().addClassName(style.hideBase()); + cmEdit.getWrapperElement().getParentElement().addClassName(style.fullWidth()); mv.getGapElement().addClassName(style.hideBase()); } mv.setShowDifferences(shouldShow); @@ -460,18 +473,20 @@ public class EditScreen extends Screen { } void setTheme(final Theme newTheme) { - cmBase.operation(new Runnable() { - @Override - public void run() { - cmBase.setOption("theme", newTheme.name().toLowerCase()); - } - }); - cmEdit.operation(new Runnable() { - @Override - public void run() { - cmEdit.setOption("theme", newTheme.name().toLowerCase()); - } - }); + cmBase.operation( + new Runnable() { + @Override + public void run() { + cmBase.setOption("theme", newTheme.name().toLowerCase()); + } + }); + cmEdit.operation( + new Runnable() { + @Override + public void run() { + cmEdit.setOption("theme", newTheme.name().toLowerCase()); + } + }); } void setLineLength(int length) { @@ -490,18 +505,20 @@ public class EditScreen extends Screen { } void setShowWhitespaceErrors(final boolean show) { - cmBase.operation(new Runnable() { - @Override - public void run() { - cmBase.setOption("showTrailingSpace", show); - } - }); - cmEdit.operation(new Runnable() { - @Override - public void run() { - cmEdit.setOption("showTrailingSpace", show); - } - }); + cmBase.operation( + new Runnable() { + @Override + public void run() { + cmBase.setOption("showTrailingSpace", show); + } + }); + cmEdit.operation( + new Runnable() { + @Override + public void run() { + cmEdit.setOption("showTrailingSpace", show); + } + }); } void setShowTabs(boolean show) { @@ -511,11 +528,8 @@ public class EditScreen extends Screen { void adjustHeight() { int height = header.getOffsetHeight(); - int rest = Gerrit.getHeaderFooterHeight() - + height - + 5; // Estimate - mv.getGapElement().getStyle().setHeight( - Window.getClientHeight() - rest, Unit.PX); + int rest = Gerrit.getHeaderFooterHeight() + height + 5; // Estimate + mv.getGapElement().getStyle().setHeight(Window.getClientHeight() - rest, Unit.PX); cmBase.adjustHeight(height); cmEdit.adjustHeight(height); } @@ -524,18 +538,20 @@ public class EditScreen extends Screen { ModeInfo modeInfo = ModeInfo.findMode(content.getContentType(), path); final String mode = modeInfo != null ? modeInfo.mime() : null; if (b && mode != null && !mode.isEmpty()) { - injectMode(mode, new AsyncCallback() { - @Override - public void onSuccess(Void result) { - cmBase.setOption("mode", mode); - cmEdit.setOption("mode", mode); - } + injectMode( + mode, + new AsyncCallback() { + @Override + public void onSuccess(Void result) { + cmBase.setOption("mode", mode); + cmEdit.setOption("mode", mode); + } - @Override - public void onFailure(Throwable caught) { - prefs.syntaxHighlighting(false); - } - }); + @Override + public void onFailure(Throwable caught) { + prefs.syntaxHighlighting(false); + } + }); } else { cmBase.setOption("mode", (String) null); cmEdit.setOption("mode", (String) null); @@ -555,23 +571,26 @@ public class EditScreen extends Screen { mode = ModeInfo.findMode(content.getContentType(), path); } } - mv = MergeView.create(editor, Configuration.create() - .set("autoCloseBrackets", prefs.autoCloseBrackets()) - .set("cursorBlinkRate", prefs.cursorBlinkRate()) - .set("cursorHeight", 0.85) - .set("indentUnit", prefs.indentUnit()) - .set("keyMap", prefs.keyMapType().name().toLowerCase()) - .set("lineNumbers", prefs.hideLineNumbers()) - .set("lineWrapping", false) - .set("matchBrackets", prefs.matchBrackets()) - .set("mode", mode != null ? mode.mime() : null) - .set("origLeft", editContent) - .set("scrollbarStyle", "overlay") - .set("showTrailingSpace", prefs.showWhitespaceErrors()) - .set("styleSelectedText", true) - .set("tabSize", prefs.tabSize()) - .set("theme", prefs.theme().name().toLowerCase()) - .set("value", "")); + mv = + MergeView.create( + editor, + Configuration.create() + .set("autoCloseBrackets", prefs.autoCloseBrackets()) + .set("cursorBlinkRate", prefs.cursorBlinkRate()) + .set("cursorHeight", 0.85) + .set("indentUnit", prefs.indentUnit()) + .set("keyMap", prefs.keyMapType().name().toLowerCase()) + .set("lineNumbers", prefs.hideLineNumbers()) + .set("lineWrapping", false) + .set("matchBrackets", prefs.matchBrackets()) + .set("mode", mode != null ? mode.mime() : null) + .set("origLeft", editContent) + .set("scrollbarStyle", "overlay") + .set("showTrailingSpace", prefs.showWhitespaceErrors()) + .set("styleSelectedText", true) + .set("tabSize", prefs.tabSize()) + .set("theme", prefs.theme().name().toLowerCase()) + .set("value", "")); cmBase = mv.leftOriginal(); cmBase.getWrapperElement().addClassName(style.base()); @@ -579,16 +598,17 @@ public class EditScreen extends Screen { setCmBaseValue(); cmEdit.setValue(editContent); - CodeMirror.addCommand("save", new CommandRunner() { - @Override - public void run(CodeMirror instance) { - save().run(); - } - }); + CodeMirror.addCommand( + "save", + new CommandRunner() { + @Override + public void run(CodeMirror instance) { + save().run(); + } + }); } - private void renderLinks(EditFileInfo editInfo, - JsArray diffLinks) { + private void renderLinks(EditFileInfo editInfo, JsArray diffLinks) { renderLinksToDiff(); if (editInfo != null) { @@ -608,16 +628,14 @@ public class EditScreen extends Screen { private void renderLinksToDiff() { InlineHyperlink sbs = new InlineHyperlink(); - sbs.setHTML(new ImageResourceRenderer() - .render(Gerrit.RESOURCES.sideBySideDiff())); + sbs.setHTML(new ImageResourceRenderer().render(Gerrit.RESOURCES.sideBySideDiff())); sbs.setTargetHistoryToken( Dispatcher.toPatch("sidebyside", null, new Patch.Key(revision, path))); sbs.setTitle(PatchUtil.C.sideBySideDiff()); linkPanel.add(sbs); InlineHyperlink unified = new InlineHyperlink(); - unified.setHTML(new ImageResourceRenderer() - .render(Gerrit.RESOURCES.unifiedDiff())); + unified.setHTML(new ImageResourceRenderer().render(Gerrit.RESOURCES.unifiedDiff())); unified.setTargetHistoryToken( Dispatcher.toPatch("unified", null, new Patch.Key(revision, path))); unified.setTitle(PatchUtil.C.unifiedDiff()); @@ -633,17 +651,20 @@ public class EditScreen extends Screen { // key (or j/k) is held down. Performance on Chrome is fine // without the deferral. // - Scheduler.get().scheduleDeferred(new ScheduledCommand() { - @Override - public void execute() { - cmEdit.operation(new Runnable() { - @Override - public void run() { - updateActiveLine(); - } - }); - } - }); + Scheduler.get() + .scheduleDeferred( + new ScheduledCommand() { + @Override + public void execute() { + cmEdit.operation( + new Runnable() { + @Override + public void run() { + updateActiveLine(); + } + }); + } + }); } }; } @@ -676,13 +697,17 @@ public class EditScreen extends Screen { } } final int g = cmEdit.changeGeneration(false); - ChangeEditApi.put(revision.getParentKey().get(), path, text, + ChangeEditApi.put( + revision.getParentKey().get(), + path, + text, new GerritCallback() { @Override public void onSuccess(VoidResult result) { generation = g; setClean(cmEdit.isClean(g)); } + @Override public void onFailure(final Throwable caught) { close.setEnabled(true); @@ -698,8 +723,9 @@ public class EditScreen extends Screen { } private void setCmBaseValue() { - cmBase.setValue(baseContent != null && baseContent.getResult() != null - ? baseContent.getResult().asString() - : ""); + cmBase.setValue( + baseContent != null && baseContent.getResult() != null + ? baseContent.getResult().asString() + : ""); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupApi.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupApi.java index 760f06de78..74cfaf18e5 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupApi.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupApi.java @@ -24,13 +24,9 @@ import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArray; import com.google.gwt.user.client.rpc.AsyncCallback; - import java.util.Set; -/** - * A collection of static methods which work on the Gerrit REST API for specific - * groups. - */ +/** A collection of static methods which work on the Gerrit REST API for specific groups. */ public class GroupApi { /** Create a new group */ public static void createGroup(String groupName, AsyncCallback cb) { @@ -43,36 +39,38 @@ public class GroupApi { } /** Get the name of a group */ - public static void getGroupName(AccountGroup.UUID group, - AsyncCallback cb) { + public static void getGroupName(AccountGroup.UUID group, AsyncCallback cb) { group(group).view("name").get(cb); } /** Check if the current user is owner of a group */ public static void isGroupOwner(String groupName, final AsyncCallback cb) { - GroupMap.myOwned(groupName, new AsyncCallback() { - @Override - public void onSuccess(GroupMap result) { - cb.onSuccess(!result.isEmpty()); - } - @Override - public void onFailure(Throwable caught) { - cb.onFailure(caught); - } - }); + GroupMap.myOwned( + groupName, + new AsyncCallback() { + @Override + public void onSuccess(GroupMap result) { + cb.onSuccess(!result.isEmpty()); + } + + @Override + public void onFailure(Throwable caught) { + cb.onFailure(caught); + } + }); } /** Rename a group */ - public static void renameGroup(AccountGroup.UUID group, - String newName, AsyncCallback cb) { + public static void renameGroup( + AccountGroup.UUID group, String newName, AsyncCallback cb) { GroupInput in = GroupInput.create(); in.name(newName); group(group).view("name").put(in, cb); } /** Set description for a group */ - public static void setGroupDescription(AccountGroup.UUID group, - String description, AsyncCallback cb) { + public static void setGroupDescription( + AccountGroup.UUID group, String description, AsyncCallback cb) { RestApi call = group(group).view("description"); if (description != null && !description.isEmpty()) { GroupInput in = GroupInput.create(); @@ -84,33 +82,33 @@ public class GroupApi { } /** Set owner for a group */ - public static void setGroupOwner(AccountGroup.UUID group, - String owner, AsyncCallback cb) { + public static void setGroupOwner( + AccountGroup.UUID group, String owner, AsyncCallback cb) { GroupInput in = GroupInput.create(); in.owner(owner); group(group).view("owner").put(in, cb); } /** Set the options for a group */ - public static void setGroupOptions(AccountGroup.UUID group, - boolean isVisibleToAll, AsyncCallback cb) { + public static void setGroupOptions( + AccountGroup.UUID group, boolean isVisibleToAll, AsyncCallback cb) { GroupOptionsInput in = GroupOptionsInput.create(); in.visibleToAll(isVisibleToAll); group(group).view("options").put(in, cb); } /** Add member to a group. */ - public static void addMember(AccountGroup.UUID group, String member, - AsyncCallback cb) { + public static void addMember( + AccountGroup.UUID group, String member, AsyncCallback cb) { members(group).id(member).put(cb); } /** Add members to a group. */ - public static void addMembers(AccountGroup.UUID group, - Set members, - final AsyncCallback> cb) { + public static void addMembers( + AccountGroup.UUID group, Set members, final AsyncCallback> cb) { if (members.size() == 1) { - addMember(group, + addMember( + group, members.iterator().next(), new AsyncCallback() { @Override @@ -133,8 +131,8 @@ public class GroupApi { } /** Remove members from a group. */ - public static void removeMembers(AccountGroup.UUID group, - Set ids, final AsyncCallback cb) { + public static void removeMembers( + AccountGroup.UUID group, Set ids, final AsyncCallback cb) { if (ids.size() == 1) { members(group).id(ids.iterator().next().toString()).delete(cb); } else { @@ -147,17 +145,19 @@ public class GroupApi { } /** Include a group into a group. */ - public static void addIncludedGroup(AccountGroup.UUID group, String include, - AsyncCallback cb) { + public static void addIncludedGroup( + AccountGroup.UUID group, String include, AsyncCallback cb) { groups(group).id(include).put(cb); } /** Include groups into a group. */ - public static void addIncludedGroups(AccountGroup.UUID group, + public static void addIncludedGroups( + AccountGroup.UUID group, Set includedGroups, final AsyncCallback> cb) { if (includedGroups.size() == 1) { - addIncludedGroup(group, + addIncludedGroup( + group, includedGroups.iterator().next(), new AsyncCallback() { @Override @@ -180,8 +180,8 @@ public class GroupApi { } /** Remove included groups from a group. */ - public static void removeIncludedGroups(AccountGroup.UUID group, - Set ids, final AsyncCallback cb) { + public static void removeIncludedGroups( + AccountGroup.UUID group, Set ids, final AsyncCallback cb) { if (ids.size() == 1) { AccountGroup.UUID g = ids.iterator().next(); groups(group).id(g.get()).delete(cb); @@ -195,8 +195,8 @@ public class GroupApi { } /** Get audit log of a group. */ - public static void getAuditLog(AccountGroup.UUID group, - AsyncCallback> cb) { + public static void getAuditLog( + AccountGroup.UUID group, AsyncCallback> cb) { group(group).view("log.audit").get(cb); } @@ -218,15 +218,16 @@ public class GroupApi { private static class GroupInput extends JavaScriptObject { final native void description(String d) /*-{ if(d)this.description=d; }-*/; + final native void name(String n) /*-{ if(n)this.name=n; }-*/; + final native void owner(String o) /*-{ if(o)this.owner=o; }-*/; static GroupInput create() { return (GroupInput) createObject(); } - protected GroupInput() { - } + protected GroupInput() {} } private static class GroupOptionsInput extends JavaScriptObject { @@ -236,12 +237,12 @@ public class GroupApi { return (GroupOptionsInput) createObject(); } - protected GroupOptionsInput() { - } + protected GroupOptionsInput() {} } private static class MemberInput extends JavaScriptObject { final native void init() /*-{ this.members = []; }-*/; + final native void addMember(String n) /*-{ this.members.push(n); }-*/; static MemberInput create() { @@ -250,12 +251,12 @@ public class GroupApi { return m; } - protected MemberInput() { - } + protected MemberInput() {} } private static class IncludedGroupInput extends JavaScriptObject { final native void init() /*-{ this.groups = []; }-*/; + final native void addGroup(String n) /*-{ this.groups.push(n); }-*/; static IncludedGroupInput create() { @@ -264,7 +265,6 @@ public class GroupApi { return g; } - protected IncludedGroupInput() { - } + protected IncludedGroupInput() {} } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupAuditEventInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupAuditEventInfo.java index 5bcdc6be85..255c6e8e20 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupAuditEventInfo.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupAuditEventInfo.java @@ -18,12 +18,14 @@ import com.google.gerrit.client.info.AccountInfo; import com.google.gerrit.client.info.GroupInfo; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwtjsonrpc.client.impl.ser.JavaSqlTimestamp_JsonSerializer; - import java.sql.Timestamp; public class GroupAuditEventInfo extends JavaScriptObject { public enum Type { - ADD_USER, REMOVE_USER, ADD_GROUP, REMOVE_GROUP + ADD_USER, + REMOVE_USER, + ADD_GROUP, + REMOVE_GROUP } public final Timestamp date() { @@ -35,12 +37,14 @@ public class GroupAuditEventInfo extends JavaScriptObject { } public final native AccountInfo user() /*-{ return this.user; }-*/; + public final native AccountInfo memberAsUser() /*-{ return this.member; }-*/; + public final native GroupInfo memberAsGroup() /*-{ return this.member; }-*/; private native String dateRaw() /*-{ return this.date; }-*/; + private native String typeRaw() /*-{ return this.type; }-*/; - protected GroupAuditEventInfo() { - } + protected GroupAuditEventInfo() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupList.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupList.java index f51ecb8840..db966b1d98 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupList.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupList.java @@ -26,11 +26,9 @@ public class GroupList extends JsArray { new RestApi("/accounts/self/groups").get(callback); } - public static void included(AccountGroup.UUID group, - AsyncCallback callback) { + public static void included(AccountGroup.UUID group, AsyncCallback callback) { new RestApi("/groups/").id(group.get()).view("groups").get(callback); } - protected GroupList() { - } + protected GroupList() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupMap.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupMap.java index e0a7d0cfb9..76147f598d 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupMap.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupMap.java @@ -39,8 +39,8 @@ public class GroupMap extends NativeMap { call.get(NativeMap.copyKeysIntoChildren(cb)); } - public static void suggestAccountGroupForProject(String project, String query, - int limit, AsyncCallback cb) { + public static void suggestAccountGroupForProject( + String project, String query, int limit, AsyncCallback cb) { RestApi call = groups(); if (project != null) { call.addParameter("p", project); @@ -59,8 +59,7 @@ public class GroupMap extends NativeMap { } public static void myOwned(String groupName, AsyncCallback cb) { - myOwnedGroups().addParameter("g", groupName).get( - NativeMap.copyKeysIntoChildren(cb)); + myOwnedGroups().addParameter("g", groupName).get(NativeMap.copyKeysIntoChildren(cb)); } private static RestApi myOwnedGroups() { @@ -71,6 +70,5 @@ public class GroupMap extends NativeMap { return new RestApi("/groups/"); } - protected GroupMap() { - } + protected GroupMap() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchConstants.java index b1991693d7..4c4c8da9d3 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchConstants.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchConstants.java @@ -18,47 +18,74 @@ import com.google.gwt.i18n.client.Constants; public interface PatchConstants extends Constants { String patchBase(); + String patchSet(); String upToChange(); + String openReply(); + String linePrev(); + String lineNext(); + String chunkPrev(); + String chunkNext(); + String commentPrev(); + String commentNext(); + String focusSideA(); + String focusSideB(); + String expandComment(); + String expandAllCommentsOnCurrentLine(); + String toggleSideA(); + String toggleIntraline(); + String showPreferences(); String toggleReviewed(); + String markAsReviewedAndGoToNext(); String commentEditorSet(); + String commentInsert(); + String commentSaveDraft(); + String commentCancelEdit(); String whitespaceIGNORE_NONE(); + String whitespaceIGNORE_TRAILING(); + String whitespaceIGNORE_LEADING_AND_TRAILING(); + String whitespaceIGNORE_ALL(); String previousFileHelp(); + String nextFileHelp(); String download(); + String edit(); + String blame(); + String addFileCommentToolTip(); String cannedReplyDone(); String sideBySideDiff(); + String unifiedDiff(); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchMessages.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchMessages.java index aaab1c91fc..358ccd3674 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchMessages.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchMessages.java @@ -18,7 +18,10 @@ import com.google.gwt.i18n.client.Messages; public interface PatchMessages extends Messages { String expandBefore(int cnt); + String expandAfter(int cnt); + String patchSkipRegion(String lineNumber); + String fileNameWithShortcutKey(String file, String key); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/plugins/PluginInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/plugins/PluginInfo.java index ed175cb8d0..ac073de4c8 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/plugins/PluginInfo.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/plugins/PluginInfo.java @@ -18,10 +18,12 @@ import com.google.gwt.core.client.JavaScriptObject; public class PluginInfo extends JavaScriptObject { public final native String name() /*-{ return this.name }-*/; + public final native String version() /*-{ return this.version }-*/; + public final native String indexUrl() /*-{ return this.index_url }-*/; + public final native boolean disabled() /*-{ return this.disabled || false }-*/; - protected PluginInfo() { - } + protected PluginInfo() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/plugins/PluginMap.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/plugins/PluginMap.java index e4c5159565..cea27b93e8 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/plugins/PluginMap.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/plugins/PluginMap.java @@ -21,11 +21,8 @@ import com.google.gwt.user.client.rpc.AsyncCallback; /** Plugins available from {@code /plugins/}. */ public class PluginMap extends NativeMap { public static void all(AsyncCallback callback) { - new RestApi("/plugins/") - .addParameterTrue("all") - .get(NativeMap.copyKeysIntoChildren(callback)); + new RestApi("/plugins/").addParameterTrue("all").get(NativeMap.copyKeysIntoChildren(callback)); } - protected PluginMap() { - } + protected PluginMap() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/BranchInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/BranchInfo.java index 8d166a166b..097f26ad43 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/BranchInfo.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/BranchInfo.java @@ -21,9 +21,10 @@ import com.google.gwt.core.client.JsArray; public class BranchInfo extends RefInfo { public final native boolean canDelete() /*-{ return this['can_delete'] ? true : false; }-*/; + public final native NativeMap actions() /*-{ return this.actions }-*/; + public final native JsArray webLinks() /*-{ return this.web_links; }-*/; - protected BranchInfo() { - } + protected BranchInfo() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ConfigInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ConfigInfo.java index 9751b3b11a..738319d410 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ConfigInfo.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ConfigInfo.java @@ -26,54 +26,50 @@ import com.google.gwt.core.client.JsArrayString; import com.google.gwtexpui.safehtml.client.FindReplace; import com.google.gwtexpui.safehtml.client.LinkFindReplace; import com.google.gwtexpui.safehtml.client.RawFindReplace; - import java.util.ArrayList; import java.util.List; public class ConfigInfo extends JavaScriptObject { - public final native String description() - /*-{ return this.description }-*/; + public final native String description() /*-{ return this.description }-*/; public final native InheritedBooleanInfo requireChangeId() - /*-{ return this.require_change_id; }-*/; + /*-{ return this.require_change_id; }-*/ ; public final native InheritedBooleanInfo useContentMerge() - /*-{ return this.use_content_merge; }-*/; + /*-{ return this.use_content_merge; }-*/ ; public final native InheritedBooleanInfo useContributorAgreements() - /*-{ return this.use_contributor_agreements; }-*/; + /*-{ return this.use_contributor_agreements; }-*/ ; public final native InheritedBooleanInfo createNewChangeForAllNotInTarget() - /*-{ return this.create_new_change_for_all_not_in_target; }-*/; + /*-{ return this.create_new_change_for_all_not_in_target; }-*/ ; public final native InheritedBooleanInfo useSignedOffBy() - /*-{ return this.use_signed_off_by; }-*/; + /*-{ return this.use_signed_off_by; }-*/ ; public final native InheritedBooleanInfo enableSignedPush() - /*-{ return this.enable_signed_push; }-*/; + /*-{ return this.enable_signed_push; }-*/ ; public final native InheritedBooleanInfo requireSignedPush() - /*-{ return this.require_signed_push; }-*/; + /*-{ return this.require_signed_push; }-*/ ; public final native InheritedBooleanInfo rejectImplicitMerges() - /*-{ return this.reject_implicit_merges; }-*/; + /*-{ return this.reject_implicit_merges; }-*/ ; public final SubmitType submitType() { return SubmitType.valueOf(submitTypeRaw()); } public final native NativeMap> pluginConfig() - /*-{ return this.plugin_config || {}; }-*/; + /*-{ return this.plugin_config || {}; }-*/ ; public final native NativeMap pluginConfig(String p) - /*-{ return this.plugin_config[p]; }-*/; + /*-{ return this.plugin_config[p]; }-*/ ; - public final native NativeMap actions() - /*-{ return this.actions; }-*/; + public final native NativeMap actions() /*-{ return this.actions; }-*/; - private native String submitTypeRaw() - /*-{ return this.submit_type }-*/; + private native String submitTypeRaw() /*-{ return this.submit_type }-*/; public final ProjectState state() { if (stateRaw() == null) { @@ -81,14 +77,14 @@ public class ConfigInfo extends JavaScriptObject { } return ProjectState.valueOf(stateRaw()); } - private native String stateRaw() - /*-{ return this.state }-*/; + + private native String stateRaw() /*-{ return this.state }-*/; public final native MaxObjectSizeLimitInfo maxObjectSizeLimit() - /*-{ return this.max_object_size_limit; }-*/; + /*-{ return this.max_object_size_limit; }-*/ ; + + private native NativeMap commentlinks0() /*-{ return this.commentlinks; }-*/; - private native NativeMap commentlinks0() - /*-{ return this.commentlinks; }-*/; final List commentlinks() { JsArray cls = commentlinks0().values(); List commentLinks = new ArrayList<>(cls.length()); @@ -105,10 +101,10 @@ public class ConfigInfo extends JavaScriptObject { commentLinks.add(fr); } catch (RuntimeException e) { int index = e.getMessage().indexOf("at Object"); - new ErrorDialog("Invalid commentlink configuration: " - + (index == -1 - ? e.getMessage() - : e.getMessage().substring(0, index))).center(); + new ErrorDialog( + "Invalid commentlink configuration: " + + (index == -1 ? e.getMessage() : e.getMessage().substring(0, index))) + .center(); } } } @@ -117,19 +113,20 @@ public class ConfigInfo extends JavaScriptObject { final native ThemeInfo theme() /*-{ return this.theme; }-*/; - protected ConfigInfo() { - } + protected ConfigInfo() {} static class CommentLinkInfo extends JavaScriptObject { final native String match() /*-{ return this.match; }-*/; + final native String link() /*-{ return this.link; }-*/; + final native String html() /*-{ return this.html; }-*/; + final native boolean enabled() /*-{ return !this.hasOwnProperty('enabled') || this.enabled; }-*/; - protected CommentLinkInfo() { - } + protected CommentLinkInfo() {} } public static class InheritedBooleanInfo extends JavaScriptObject { @@ -137,59 +134,72 @@ public class ConfigInfo extends JavaScriptObject { return (InheritedBooleanInfo) createObject(); } - public final native boolean value() - /*-{ return this.value ? true : false; }-*/; + public final native boolean value() /*-{ return this.value ? true : false; }-*/; public final native boolean inheritedValue() - /*-{ return this.inherited_value ? true : false; }-*/; + /*-{ return this.inherited_value ? true : false; }-*/ ; public final InheritableBoolean configuredValue() { return InheritableBoolean.valueOf(configuredValueRaw()); } - private native String configuredValueRaw() - /*-{ return this.configured_value }-*/; + + private native String configuredValueRaw() /*-{ return this.configured_value }-*/; public final void setConfiguredValue(InheritableBoolean v) { setConfiguredValueRaw(v.name()); } - public final native void setConfiguredValueRaw(String v) - /*-{ if(v)this.configured_value=v; }-*/; - protected InheritedBooleanInfo() { - } + public final native void setConfiguredValueRaw(String v) + /*-{ if(v)this.configured_value=v; }-*/ ; + + protected InheritedBooleanInfo() {} } public static class MaxObjectSizeLimitInfo extends JavaScriptObject { public final native String value() /*-{ return this.value; }-*/; + public final native String inheritedValue() /*-{ return this.inherited_value; }-*/; + public final native String configuredValue() /*-{ return this.configured_value }-*/; - protected MaxObjectSizeLimitInfo() { - } + protected MaxObjectSizeLimitInfo() {} } public static class ConfigParameterInfo extends JavaScriptObject { public final native String name() /*-{ return this.name; }-*/; - public final native String displayName() /*-{ return this.display_name; }-*/; - public final native String description() /*-{ return this.description; }-*/; - public final native String warning() /*-{ return this.warning; }-*/; - public final native String type() /*-{ return this.type; }-*/; - public final native String value() /*-{ return this.value; }-*/; - public final native boolean editable() /*-{ return this.editable ? true : false; }-*/; - public final native boolean inheritable() /*-{ return this.inheritable ? true : false; }-*/; - public final native String configuredValue() /*-{ return this.configured_value; }-*/; - public final native String inheritedValue() /*-{ return this.inherited_value; }-*/; - public final native JsArrayString permittedValues() /*-{ return this.permitted_values; }-*/; - public final native JsArrayString values() /*-{ return this.values; }-*/; - protected ConfigParameterInfo() { - } + public final native String displayName() /*-{ return this.display_name; }-*/; + + public final native String description() /*-{ return this.description; }-*/; + + public final native String warning() /*-{ return this.warning; }-*/; + + public final native String type() /*-{ return this.type; }-*/; + + public final native String value() /*-{ return this.value; }-*/; + + public final native boolean editable() /*-{ return this.editable ? true : false; }-*/; + + public final native boolean inheritable() /*-{ return this.inheritable ? true : false; }-*/; + + public final native String configuredValue() /*-{ return this.configured_value; }-*/; + + public final native String inheritedValue() /*-{ return this.inherited_value; }-*/; + + public final native JsArrayString permittedValues() /*-{ return this.permitted_values; }-*/; + + public final native JsArrayString values() /*-{ return this.values; }-*/; + + protected ConfigParameterInfo() {} } public static class ConfigParameterValue extends JavaScriptObject { final native void init() /*-{ this.values = []; }-*/; + final native void addValue(String v) /*-{ this.values.push(v); }-*/; + final native void setValue(String v) /*-{ if(v)this.value = v; }-*/; + public static ConfigParameterValue create() { ConfigParameterValue v = createObject().cast(); return v; @@ -208,7 +218,6 @@ public class ConfigInfo extends JavaScriptObject { return this; } - protected ConfigParameterValue() { - } + protected ConfigParameterValue() {} } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ConfigInfoCache.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ConfigInfoCache.java index 6a1ba11849..e41cf12002 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ConfigInfoCache.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ConfigInfoCache.java @@ -21,7 +21,6 @@ import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Project; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.rpc.AsyncCallback; - import java.util.LinkedHashMap; import java.util.Map; @@ -29,8 +28,7 @@ import java.util.Map; public class ConfigInfoCache { private static final int PROJECT_LIMIT = 25; private static final int CHANGE_LIMIT = 100; - private static final ConfigInfoCache instance = - GWT.create(ConfigInfoCache.class); + private static final ConfigInfoCache instance = GWT.create(ConfigInfoCache.class); public static class Entry { private final ConfigInfo info; @@ -68,24 +66,25 @@ public class ConfigInfoCache { private final LinkedHashMap changeToProject; protected ConfigInfoCache() { - cache = new LinkedHashMap(PROJECT_LIMIT) { - private static final long serialVersionUID = 1L; + cache = + new LinkedHashMap(PROJECT_LIMIT) { + private static final long serialVersionUID = 1L; - @Override - protected boolean removeEldestEntry( - Map.Entry e) { - return size() > PROJECT_LIMIT; - } - }; + @Override + protected boolean removeEldestEntry(Map.Entry e) { + return size() > PROJECT_LIMIT; + } + }; - changeToProject = new LinkedHashMap(CHANGE_LIMIT) { - private static final long serialVersionUID = 1L; + changeToProject = + new LinkedHashMap(CHANGE_LIMIT) { + private static final long serialVersionUID = 1L; - @Override - protected boolean removeEldestEntry(Map.Entry e) { - return size() > CHANGE_LIMIT; - } - }; + @Override + protected boolean removeEldestEntry(Map.Entry e) { + return size() > CHANGE_LIMIT; + } + }; } private void getImpl(final String name, final AsyncCallback cb) { @@ -94,7 +93,8 @@ public class ConfigInfoCache { cb.onSuccess(e); return; } - ProjectApi.getConfig(new Project.NameKey(name), + ProjectApi.getConfig( + new Project.NameKey(name), new AsyncCallback() { @Override public void onSuccess(ConfigInfo result) { @@ -116,17 +116,19 @@ public class ConfigInfoCache { getImpl(name, cb); return; } - ChangeApi.change(id).get(new AsyncCallback() { - @Override - public void onSuccess(ChangeInfo result) { - changeToProject.put(id, result.project()); - getImpl(result.project(), cb); - } + ChangeApi.change(id) + .get( + new AsyncCallback() { + @Override + public void onSuccess(ChangeInfo result) { + changeToProject.put(id, result.project()); + getImpl(result.project(), cb); + } - @Override - public void onFailure(Throwable caught) { - cb.onFailure(caught); - } - }); + @Override + public void onFailure(Throwable caught) { + cb.onFailure(caught); + } + }); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectApi.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectApi.java index 10932bc577..d1343dfd9e 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectApi.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectApi.java @@ -25,27 +25,28 @@ import com.google.gerrit.reviewdb.client.Project; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArray; import com.google.gwt.user.client.rpc.AsyncCallback; - import java.util.Map; import java.util.Map.Entry; import java.util.Set; public class ProjectApi { /** Create a new project */ - public static void createProject(String projectName, String parent, - Boolean createEmptyCcommit, Boolean permissionsOnly, + public static void createProject( + String projectName, + String parent, + Boolean createEmptyCcommit, + Boolean permissionsOnly, AsyncCallback cb) { ProjectInput input = ProjectInput.create(); input.setName(projectName); input.setParent(parent); input.setPermissionsOnly(permissionsOnly); input.setCreateEmptyCommit(createEmptyCcommit); - new RestApi("/projects/").id(projectName).ifNoneMatch() - .put(input, cb); + new RestApi("/projects/").id(projectName).ifNoneMatch().put(input, cb); } - private static RestApi getRestApi(Project.NameKey name, String viewName, - int limit, int start, String match) { + private static RestApi getRestApi( + Project.NameKey name, String viewName, int limit, int start, String match) { RestApi call = project(name).view(viewName); call.addParameter("n", limit); call.addParameter("s", start); @@ -60,41 +61,44 @@ public class ProjectApi { } /** Retrieve all visible tags of the project */ - public static void getTags(Project.NameKey name, - AsyncCallback> cb) { + public static void getTags(Project.NameKey name, AsyncCallback> cb) { project(name).view("tags").get(cb); } - public static void getTags(Project.NameKey name, int limit, int start, - String match, AsyncCallback> cb) { + public static void getTags( + Project.NameKey name, + int limit, + int start, + String match, + AsyncCallback> cb) { getRestApi(name, "tags", limit, start, match).get(cb); } /** Create a new branch */ - public static void createBranch(Project.NameKey name, String ref, - String revision, AsyncCallback cb) { + public static void createBranch( + Project.NameKey name, String ref, String revision, AsyncCallback cb) { BranchInput input = BranchInput.create(); input.setRevision(revision); project(name).view("branches").id(ref).ifNoneMatch().put(input, cb); } /** Retrieve all visible branches of the project */ - public static void getBranches(Project.NameKey name, - AsyncCallback> cb) { + public static void getBranches(Project.NameKey name, AsyncCallback> cb) { project(name).view("branches").get(cb); } - public static void getBranches(Project.NameKey name, int limit, int start, - String match, AsyncCallback> cb) { + public static void getBranches( + Project.NameKey name, + int limit, + int start, + String match, + AsyncCallback> cb) { getRestApi(name, "branches", limit, start, match).get(cb); } - /** - * Delete branches. One call is fired to the server to delete all the - * branches. - */ - public static void deleteBranches(Project.NameKey name, - Set refs, AsyncCallback cb) { + /** Delete branches. One call is fired to the server to delete all the branches. */ + public static void deleteBranches( + Project.NameKey name, Set refs, AsyncCallback cb) { if (refs.size() == 1) { project(name).view("branches").id(refs.iterator().next()).delete(cb); } else { @@ -106,21 +110,24 @@ public class ProjectApi { } } - public static void getConfig(Project.NameKey name, - AsyncCallback cb) { + public static void getConfig(Project.NameKey name, AsyncCallback cb) { project(name).view("config").get(cb); } - public static void setConfig(Project.NameKey name, String description, + public static void setConfig( + Project.NameKey name, + String description, InheritableBoolean useContributorAgreements, - InheritableBoolean useContentMerge, InheritableBoolean useSignedOffBy, + InheritableBoolean useContentMerge, + InheritableBoolean useSignedOffBy, InheritableBoolean createNewChangeForAllNotInTarget, InheritableBoolean requireChangeId, InheritableBoolean enableSignedPush, InheritableBoolean requireSignedPush, InheritableBoolean rejectImplicitMerges, String maxObjectSizeLimit, - SubmitType submitType, ProjectState state, + SubmitType submitType, + ProjectState state, Map> pluginConfigValues, AsyncCallback cb) { ConfigInput in = ConfigInput.create(); @@ -145,24 +152,25 @@ public class ProjectApi { project(name).view("config").put(in, cb); } - public static void getParent(Project.NameKey name, - final AsyncCallback cb) { - project(name).view("parent").get( - new AsyncCallback() { - @Override - public void onSuccess(NativeString result) { - cb.onSuccess(new Project.NameKey(result.asString())); - } + public static void getParent(Project.NameKey name, final AsyncCallback cb) { + project(name) + .view("parent") + .get( + new AsyncCallback() { + @Override + public void onSuccess(NativeString result) { + cb.onSuccess(new Project.NameKey(result.asString())); + } - @Override - public void onFailure(Throwable caught) { - cb.onFailure(caught); - } - }); + @Override + public void onFailure(Throwable caught) { + cb.onFailure(caught); + } + }); } - public static void getChildren(Project.NameKey name, boolean recursive, - AsyncCallback> cb) { + public static void getChildren( + Project.NameKey name, boolean recursive, AsyncCallback> cb) { RestApi view = project(name).view("children"); if (recursive) { view.addParameterTrue("recursive"); @@ -170,13 +178,12 @@ public class ProjectApi { view.get(cb); } - public static void getDescription(Project.NameKey name, - AsyncCallback cb) { + public static void getDescription(Project.NameKey name, AsyncCallback cb) { project(name).view("description").get(cb); } - public static void setDescription(Project.NameKey name, String description, - AsyncCallback cb) { + public static void setDescription( + Project.NameKey name, String description, AsyncCallback cb) { RestApi call = project(name).view("description"); if (description != null && !description.isEmpty()) { DescriptionInput input = DescriptionInput.create(); @@ -187,8 +194,7 @@ public class ProjectApi { } } - public static void setHead(Project.NameKey name, String ref, - AsyncCallback cb) { + public static void setHead(Project.NameKey name, String ref, AsyncCallback cb) { RestApi call = project(name).view("HEAD"); HeadInput input = HeadInput.create(); input.setRef(ref); @@ -204,8 +210,7 @@ public class ProjectApi { return (ProjectInput) createObject(); } - protected ProjectInput() { - } + protected ProjectInput() {} final native void setName(String n) /*-{ if(n)this.name=n; }-*/; @@ -221,76 +226,78 @@ public class ProjectApi { return (ConfigInput) createObject(); } - protected ConfigInput() { - } + protected ConfigInput() {} - final native void setDescription(String d) - /*-{ if(d)this.description=d; }-*/; + final native void setDescription(String d) /*-{ if(d)this.description=d; }-*/; final void setUseContributorAgreements(InheritableBoolean v) { setUseContributorAgreementsRaw(v.name()); } + private native void setUseContributorAgreementsRaw(String v) - /*-{ if(v)this.use_contributor_agreements=v; }-*/; + /*-{ if(v)this.use_contributor_agreements=v; }-*/ ; final void setUseContentMerge(InheritableBoolean v) { setUseContentMergeRaw(v.name()); } - private native void setUseContentMergeRaw(String v) - /*-{ if(v)this.use_content_merge=v; }-*/; + + private native void setUseContentMergeRaw(String v) /*-{ if(v)this.use_content_merge=v; }-*/; final void setUseSignedOffBy(InheritableBoolean v) { setUseSignedOffByRaw(v.name()); } - private native void setUseSignedOffByRaw(String v) - /*-{ if(v)this.use_signed_off_by=v; }-*/; + + private native void setUseSignedOffByRaw(String v) /*-{ if(v)this.use_signed_off_by=v; }-*/; final void setRequireChangeId(InheritableBoolean v) { setRequireChangeIdRaw(v.name()); } - private native void setRequireChangeIdRaw(String v) - /*-{ if(v)this.require_change_id=v; }-*/; + + private native void setRequireChangeIdRaw(String v) /*-{ if(v)this.require_change_id=v; }-*/; final void setCreateNewChangeForAllNotInTarget(InheritableBoolean v) { setCreateNewChangeForAllNotInTargetRaw(v.name()); } + private native void setCreateNewChangeForAllNotInTargetRaw(String v) - /*-{ if(v)this.create_new_change_for_all_not_in_target=v; }-*/; + /*-{ if(v)this.create_new_change_for_all_not_in_target=v; }-*/ ; final void setEnableSignedPush(InheritableBoolean v) { setEnableSignedPushRaw(v.name()); } - private native void setEnableSignedPushRaw(String v) - /*-{ if(v)this.enable_signed_push=v; }-*/; + + private native void setEnableSignedPushRaw(String v) /*-{ if(v)this.enable_signed_push=v; }-*/; final void setRequireSignedPush(InheritableBoolean v) { setRequireSignedPushRaw(v.name()); } + private native void setRequireSignedPushRaw(String v) - /*-{ if(v)this.require_signed_push=v; }-*/; + /*-{ if(v)this.require_signed_push=v; }-*/ ; final void setRejectImplicitMerges(InheritableBoolean v) { setRejectImplicitMergesRaw(v.name()); } - private native void setRejectImplicitMergesRaw(String v) - /*-{ if(v)this.reject_implicit_merges=v; }-*/; - final native void setMaxObjectSizeLimit(String l) - /*-{ if(l)this.max_object_size_limit=l; }-*/; + private native void setRejectImplicitMergesRaw(String v) + /*-{ if(v)this.reject_implicit_merges=v; }-*/ ; + + final native void setMaxObjectSizeLimit(String l) /*-{ if(l)this.max_object_size_limit=l; }-*/; final void setSubmitType(SubmitType t) { setSubmitTypeRaw(t.name()); } - private native void setSubmitTypeRaw(String t) - /*-{ if(t)this.submit_type=t; }-*/; + + private native void setSubmitTypeRaw(String t) /*-{ if(t)this.submit_type=t; }-*/; final void setState(ProjectState s) { setStateRaw(s.name()); } - private native void setStateRaw(String s) - /*-{ if(s)this.state=s; }-*/; - final void setPluginConfigValues(Map> pluginConfigValues) { + private native void setStateRaw(String s) /*-{ if(s)this.state=s; }-*/; + + final void setPluginConfigValues( + Map> pluginConfigValues) { if (!pluginConfigValues.isEmpty()) { NativeMap configValues = NativeMap.create().cast(); for (Entry> e : pluginConfigValues.entrySet()) { @@ -303,8 +310,9 @@ public class ProjectApi { setPluginConfigValuesRaw(configValues); } } + private native void setPluginConfigValuesRaw(NativeMap v) - /*-{ this.plugin_config_values=v; }-*/; + /*-{ this.plugin_config_values=v; }-*/ ; } private static class ConfigParameterValueMap extends JavaScriptObject { @@ -312,8 +320,7 @@ public class ProjectApi { return createObject().cast(); } - protected ConfigParameterValueMap() { - } + protected ConfigParameterValueMap() {} public final native void put(String n, ConfigParameterValue v) /*-{ this[n] = v; }-*/; } @@ -323,8 +330,7 @@ public class ProjectApi { return (BranchInput) createObject(); } - protected BranchInput() { - } + protected BranchInput() {} final native void setRevision(String r) /*-{ if(r)this.revision=r; }-*/; } @@ -334,8 +340,7 @@ public class ProjectApi { return (DescriptionInput) createObject(); } - protected DescriptionInput() { - } + protected DescriptionInput() {} final native void setDescription(String d) /*-{ if(d)this.description=d; }-*/; } @@ -345,8 +350,7 @@ public class ProjectApi { return createObject().cast(); } - protected HeadInput() { - } + protected HeadInput() {} final native void setRef(String r) /*-{ if(r)this.ref=r; }-*/; } @@ -358,10 +362,10 @@ public class ProjectApi { return d; } - protected DeleteBranchesInput() { - } + protected DeleteBranchesInput() {} final native void init() /*-{ this.branches = []; }-*/; + final native void addBranch(String b) /*-{ this.branches.push(b); }-*/; } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectInfo.java index eed9d1dc29..1ff568f8a9 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectInfo.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectInfo.java @@ -21,15 +21,15 @@ import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArray; import com.google.gwt.user.client.ui.SuggestOracle; -public class ProjectInfo - extends JavaScriptObject - implements SuggestOracle.Suggestion { +public class ProjectInfo extends JavaScriptObject implements SuggestOracle.Suggestion { public final Project.NameKey name_key() { return new Project.NameKey(name()); } public final native String name() /*-{ return this.name; }-*/; + public final native String description() /*-{ return this.description; }-*/; + public final native JsArray webLinks() /*-{ return this.web_links; }-*/; public final ProjectState state() { @@ -51,6 +51,5 @@ public class ProjectInfo return name(); } - protected ProjectInfo() { - } + protected ProjectInfo() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectMap.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectMap.java index 0f121c816c..4327c07b42 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectMap.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectMap.java @@ -78,6 +78,5 @@ public class ProjectMap extends NativeMap { match(match, 0, 0, cb); } - protected ProjectMap() { - } + protected ProjectMap() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/RefInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/RefInfo.java index 9801d6073c..90c862fce7 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/RefInfo.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/RefInfo.java @@ -23,8 +23,8 @@ public class RefInfo extends JavaScriptObject { } public final native String ref() /*-{ return this.ref; }-*/; + public final native String revision() /*-{ return this.revision; }-*/; - protected RefInfo() { - } + protected RefInfo() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/TagInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/TagInfo.java index ee1d1afcfa..1657b25aeb 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/TagInfo.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/TagInfo.java @@ -17,6 +17,5 @@ package com.google.gerrit.client.projects; public class TagInfo extends RefInfo { // TODO(dpursehouse) add extra tag-related fields (message, tagger, etc) - protected TagInfo() { - } + protected TagInfo() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ThemeInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ThemeInfo.java index 9a852a2ccc..7584e14516 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ThemeInfo.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ThemeInfo.java @@ -18,9 +18,10 @@ import com.google.gwt.core.client.JavaScriptObject; public class ThemeInfo extends JavaScriptObject { public final native String css() /*-{ return this.css; }-*/; + public final native String header() /*-{ return this.header; }-*/; + public final native String footer() /*-{ return this.footer; }-*/; - protected ThemeInfo() { - } + protected ThemeInfo() {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/CallbackGroup.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/CallbackGroup.java index 009deaf421..90a820fc10 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/CallbackGroup.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/CallbackGroup.java @@ -15,7 +15,6 @@ package com.google.gerrit.client.rpc; import com.google.gwt.user.client.rpc.AsyncCallback; - import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -23,22 +22,19 @@ import java.util.Set; /** * Class for grouping together callbacks and calling them in order. - *

- * Callbacks are added to the group with {@link #add(AsyncCallback)}, which - * returns a wrapped callback suitable for passing to an asynchronous RPC call. - * The last callback must be added using {@link #addFinal(AsyncCallback)} or - * {@link #done()} must be invoked. * - * The enclosing group buffers returned results and ensures that - * {@code onSuccess} is called exactly once for each callback in the group, in - * the same order that callbacks were added. This allows callers to, for - * example, use a {@link ScreenLoadCallback} as the last callback in the list + *

Callbacks are added to the group with {@link #add(AsyncCallback)}, which returns a wrapped + * callback suitable for passing to an asynchronous RPC call. The last callback must be added using + * {@link #addFinal(AsyncCallback)} or {@link #done()} must be invoked. + * + *

The enclosing group buffers returned results and ensures that {@code onSuccess} is called + * exactly once for each callback in the group, in the same order that callbacks were added. This + * allows callers to, for example, use a {@link ScreenLoadCallback} as the last callback in the list * and only display the screen once all callbacks have succeeded. - *

- * In the event of a failure, the first caught exception is sent to - * all callbacks' {@code onFailure} methods, in order; subsequent - * successes or failures are all ignored. Note that this means - * {@code onFailure} may be called with an exception unrelated to the callback + * + *

In the event of a failure, the first caught exception is sent to all + * callbacks' {@code onFailure} methods, in order; subsequent successes or failures are all ignored. + * Note that this means {@code onFailure} may be called with an exception unrelated to the callback * processing it. */ public class CallbackGroup { @@ -52,12 +48,10 @@ public class CallbackGroup { public static Callback emptyCallback() { return new Callback() { @Override - public void onSuccess(T result) { - } + public void onSuccess(T result) {} @Override - public void onFailure(Throwable err) { - } + public void onFailure(Throwable err) {} }; } @@ -107,7 +101,7 @@ public class CallbackGroup { } public void addListener(CallbackGroup group) { - addListener(group. addEmpty()); + addListener(group.addEmpty()); } private void success(CallbackGlue cb) { @@ -156,12 +150,10 @@ public class CallbackGroup { cb.onFailure(failedThrowable); return new HttpCallback() { @Override - public void onSuccess(HttpResponse result) { - } + public void onSuccess(HttpResponse result) {} @Override - public void onFailure(Throwable caught) { - } + public void onFailure(Throwable caught) {} }; } @@ -178,11 +170,11 @@ public class CallbackGroup { } public interface Callback - extends AsyncCallback, com.google.gwtjsonrpc.common.AsyncCallback { - } + extends AsyncCallback, com.google.gwtjsonrpc.common.AsyncCallback {} private interface CallbackGlue { void applySuccess(); + void applyFailed(); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/GerritCallback.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/GerritCallback.java index cd44facb1a..5688a3132e 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/GerritCallback.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/GerritCallback.java @@ -28,9 +28,9 @@ import com.google.gwtjsonrpc.client.ServerUnavailableException; import com.google.gwtjsonrpc.common.JsonConstants; /** Abstract callback handling generic error conditions automatically */ -public abstract class GerritCallback implements - com.google.gwtjsonrpc.common.AsyncCallback, - com.google.gwt.user.client.rpc.AsyncCallback { +public abstract class GerritCallback + implements com.google.gwtjsonrpc.common.AsyncCallback, + com.google.gwt.user.client.rpc.AsyncCallback { @Override public void onFailure(final Throwable caught) { showFailure(caught); @@ -69,8 +69,9 @@ public abstract class GerritCallback implements } public static boolean isSigninFailure(Throwable caught) { - if (isNotSignedIn(caught) || isInvalidXSRF(caught) || - (isNoSuchEntity(caught) && !Gerrit.isSignedIn())) { + if (isNotSignedIn(caught) + || isInvalidXSRF(caught) + || (isNoSuchEntity(caught) && !Gerrit.isSignedIn())) { return true; } return false; @@ -84,7 +85,7 @@ public abstract class GerritCallback implements protected static boolean isNotSignedIn(Throwable caught) { return RestApi.isNotSignedIn(caught) || (caught instanceof RemoteJsonException - && caught.getMessage().equals(NotSignedInException.MESSAGE)); + && caught.getMessage().equals(NotSignedInException.MESSAGE)); } protected static boolean isNoSuchEntity(Throwable caught) { @@ -105,6 +106,6 @@ public abstract class GerritCallback implements protected static boolean isNoSuchGroup(final Throwable caught) { return caught instanceof RemoteJsonException - && caught.getMessage().startsWith(NoSuchGroupException.MESSAGE); + && caught.getMessage().startsWith(NoSuchGroupException.MESSAGE); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/HttpCallback.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/HttpCallback.java index a97642edd1..2de2980c97 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/HttpCallback.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/HttpCallback.java @@ -17,5 +17,6 @@ package com.google.gerrit.client.rpc; /** AsyncCallback supplied with HTTP response headers. */ public interface HttpCallback { void onSuccess(HttpResponse result); + void onFailure(Throwable caught); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/HttpResponse.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/HttpResponse.java index 969dd30931..22d62fb1e3 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/HttpResponse.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/HttpResponse.java @@ -36,7 +36,7 @@ public class HttpResponse { /** * Content type supplied by the server. * - * This helper simplifies the common {@code getHeader("Content-Type")} case. + *

This helper simplifies the common {@code getHeader("Content-Type")} case. */ public String getContentType() { return contentType; diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/RestApi.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/RestApi.java index 111f19a6d0..250bc6e8fa 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/RestApi.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/RestApi.java @@ -50,12 +50,11 @@ public class RestApi { /** * Expected JSON content body prefix that prevents XSSI. - *

- * The server always includes this line as the first line of the response - * content body when the response body is formatted as JSON. It gets inserted - * by the server to prevent the resource from being imported into another - * domain's page using a <script> tag. This line must be removed before - * the JSON can be parsed. + * + *

The server always includes this line as the first line of the response content body when the + * response body is formatted as JSON. It gets inserted by the server to prevent the resource from + * being imported into another domain's page using a <script> tag. This line must be removed + * before the JSON can be parsed. */ private static final String JSON_MAGIC = ")]}'\n"; @@ -107,8 +106,7 @@ public class RestApi { } } - private static class HttpImpl - implements RequestCallback { + private static class HttpImpl implements RequestCallback { private final boolean background; private final HttpCallback cb; @@ -137,15 +135,15 @@ public class RestApi { data = NativeString.wrap(val.isString().stringValue()).cast(); type = simpleType(res.getHeader("X-FYI-Content-Type")); } else { - data = RestApi. cast(val); + data = RestApi.cast(val); type = JSON_TYPE; } } catch (JSONException e) { if (!background) { RpcStatus.INSTANCE.onRpcComplete(); } - cb.onFailure(new StatusCodeException(SC_BAD_RESPONSE, - "Invalid JSON: " + e.getMessage())); + cb.onFailure( + new StatusCodeException(SC_BAD_RESPONSE, "Invalid JSON: " + e.getMessage())); return; } } else if (isTextBody(res)) { @@ -155,24 +153,31 @@ public class RestApi { if (!background) { RpcStatus.INSTANCE.onRpcComplete(); } - cb.onFailure(new StatusCodeException(SC_BAD_RESPONSE, "Expected " - + JSON_TYPE + " or " + TEXT_TYPE + "; received Content-Type: " - + res.getHeader("Content-Type"))); + cb.onFailure( + new StatusCodeException( + SC_BAD_RESPONSE, + "Expected " + + JSON_TYPE + + " or " + + TEXT_TYPE + + "; received Content-Type: " + + res.getHeader("Content-Type"))); return; } - Scheduler.ScheduledCommand cmd = new Scheduler.ScheduledCommand() { - @Override - public void execute() { - try { - cb.onSuccess(new HttpResponse<>(res, type, data)); - } finally { - if (!background) { - RpcStatus.INSTANCE.onRpcComplete(); + Scheduler.ScheduledCommand cmd = + new Scheduler.ScheduledCommand() { + @Override + public void execute() { + try { + cb.onSuccess(new HttpResponse<>(res, type, data)); + } finally { + if (!background) { + RpcStatus.INSTANCE.onRpcComplete(); + } + } } - } - } - }; + }; // Defer handling the response if the parse took a while. if ((System.currentTimeMillis() - start) > 75) { @@ -213,9 +218,8 @@ public class RestApi { RpcStatus.INSTANCE.onRpcComplete(); } if (err.getMessage().contains("XmlHttpRequest.status")) { - cb.onFailure(new StatusCodeException( - SC_UNAVAILABLE, - RpcConstants.C.errorServerUnavailable())); + cb.onFailure( + new StatusCodeException(SC_UNAVAILABLE, RpcConstants.C.errorServerUnavailable())); } else { cb.onFailure(new StatusCodeException(SC_BAD_TRANSPORT, err.getMessage())); } @@ -229,12 +233,12 @@ public class RestApi { /** * Initialize a new API call. - *

- * By default the JSON format will be selected by including an HTTP Accept - * header in the request. * - * @param name URL of the REST resource to access, e.g. {@code "/projects/"} - * to list accessible projects from the server. + *

By default the JSON format will be selected by including an HTTP Accept header in the + * request. + * + * @param name URL of the REST resource to access, e.g. {@code "/projects/"} to list accessible + * projects from the server. */ public RestApi(String name) { if (name.startsWith("/")) { @@ -344,8 +348,7 @@ public class RestApi { send(DELETE, cb); } - private void send(Method method, - HttpCallback cb) { + private void send(Method method, HttpCallback cb) { HttpImpl httpCallback = new HttpImpl<>(background, cb); try { if (!background) { @@ -357,25 +360,19 @@ public class RestApi { } } - public void post( - JavaScriptObject content, - AsyncCallback cb) { + public void post(JavaScriptObject content, AsyncCallback cb) { post(content, wrap(cb)); } - public void post( - JavaScriptObject content, - HttpCallback cb) { + public void post(JavaScriptObject content, HttpCallback cb) { sendJSON(POST, content, cb); } - public void post(String content, - AsyncCallback cb) { + public void post(String content, AsyncCallback cb) { post(content, wrap(cb)); } - public void post(String content, - HttpCallback cb) { + public void post(String content, HttpCallback cb) { sendText(POST, content, cb); } @@ -387,31 +384,24 @@ public class RestApi { send(PUT, cb); } - public void put(String content, - AsyncCallback cb) { + public void put(String content, AsyncCallback cb) { put(content, wrap(cb)); } - public void put(String content, - HttpCallback cb) { + public void put(String content, HttpCallback cb) { sendText(PUT, content, cb); } - public void put( - JavaScriptObject content, - AsyncCallback cb) { + public void put(JavaScriptObject content, AsyncCallback cb) { put(content, wrap(cb)); } - public void put( - JavaScriptObject content, - HttpCallback cb) { + public void put(JavaScriptObject content, HttpCallback cb) { sendJSON(PUT, content, cb); } private void sendJSON( - Method method, JavaScriptObject content, - HttpCallback cb) { + Method method, JavaScriptObject content, HttpCallback cb) { HttpImpl httpCallback = new HttpImpl<>(background, cb); try { if (!background) { @@ -425,11 +415,10 @@ public class RestApi { } } - private static native String str(JavaScriptObject jso) - /*-{ return JSON.stringify(jso) }-*/; + private static native String str(JavaScriptObject jso) /*-{ return JSON.stringify(jso) }-*/; - private void sendText(Method method, String body, - HttpCallback cb) { + private void sendText( + Method method, String body, HttpCallback cb) { HttpImpl httpCallback = new HttpImpl<>(background, cb); try { if (!background) { @@ -480,8 +469,7 @@ public class RestApi { return type; } - private static JSONValue parseJson(Response res) - throws JSONException { + private static JSONValue parseJson(Response res) throws JSONException { String json = trimJsonMagic(res.getText()); if (json.isEmpty()) { throw new JSONException("response was empty"); @@ -511,8 +499,7 @@ public class RestApi { } } - private static HttpCallback wrap( - final AsyncCallback cb) { + private static HttpCallback wrap(final AsyncCallback cb) { return new HttpCallback() { @Override public void onSuccess(HttpResponse r) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/RpcConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/RpcConstants.java index 620133dd52..56d536d874 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/RpcConstants.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/RpcConstants.java @@ -21,5 +21,6 @@ public interface RpcConstants extends Constants { RpcConstants C = GWT.create(RpcConstants.class); String errorServerUnavailable(); + String errorRemoteJsonException(); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/ScreenLoadCallback.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/ScreenLoadCallback.java index 97ed5593bd..74b45dfcff 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/ScreenLoadCallback.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/ScreenLoadCallback.java @@ -39,8 +39,7 @@ public abstract class ScreenLoadCallback extends GerritCallback { protected abstract void preDisplay(T result); - protected void postDisplay() { - } + protected void postDisplay() {} @Override public void onFailure(final Throwable caught) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/AccountGroupSuggestOracle.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/AccountGroupSuggestOracle.java index 983d48cadd..80b8c66c69 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/AccountGroupSuggestOracle.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/AccountGroupSuggestOracle.java @@ -21,7 +21,6 @@ import com.google.gerrit.client.rpc.Natives; import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gerrit.reviewdb.client.Project; import com.google.gwt.user.client.ui.SuggestOracle; - import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -56,8 +55,7 @@ public class AccountGroupSuggestOracle extends SuggestAfterTypingNCharsOracle { this.projectName = projectName; } - private static class AccountGroupSuggestion implements - SuggestOracle.Suggestion { + private static class AccountGroupSuggestion implements SuggestOracle.Suggestion { private final GroupInfo info; AccountGroupSuggestion(final GroupInfo k) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/AccountLinkPanel.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/AccountLinkPanel.java index dd9f369378..c44f35789b 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/AccountLinkPanel.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/AccountLinkPanel.java @@ -21,7 +21,6 @@ import com.google.gerrit.client.info.AccountInfo; import com.google.gerrit.common.PageLinks; import com.google.gerrit.reviewdb.client.Change; import com.google.gwt.user.client.ui.FlowPanel; - import java.util.function.Function; /** Link to any user's account dashboard. */ @@ -30,24 +29,19 @@ public class AccountLinkPanel extends FlowPanel { return withStatus(ai, Change.Status.NEW); } - public static AccountLinkPanel withStatus(AccountInfo ai, - Change.Status status) { - return new AccountLinkPanel( - ai, name -> PageLinks.toAccountQuery(name, status)); + public static AccountLinkPanel withStatus(AccountInfo ai, Change.Status status) { + return new AccountLinkPanel(ai, name -> PageLinks.toAccountQuery(name, status)); } public static AccountLinkPanel forAssignee(AccountInfo ai) { return new AccountLinkPanel(ai, PageLinks::toAssigneeQuery); } - private AccountLinkPanel(AccountInfo ai, - Function nameToQuery) { + private AccountLinkPanel(AccountInfo ai, Function nameToQuery) { addStyleName(Gerrit.RESOURCES.css().accountLinkPanel()); InlineHyperlink l = - new InlineHyperlink( - FormatUtil.name(ai), - nameToQuery.apply(name(ai))) { + new InlineHyperlink(FormatUtil.name(ai), nameToQuery.apply(name(ai))) { @Override public void go() { Gerrit.display(getTargetHistoryToken()); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/AccountSuggestOracle.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/AccountSuggestOracle.java index e43a24e145..78ae15629d 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/AccountSuggestOracle.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/AccountSuggestOracle.java @@ -21,7 +21,6 @@ import com.google.gerrit.client.rpc.GerritCallback; import com.google.gerrit.client.rpc.Natives; import com.google.gwt.core.client.JsArray; import com.google.gwt.user.client.ui.SuggestOracle; - import java.util.ArrayList; import java.util.List; @@ -29,7 +28,9 @@ import java.util.List; public class AccountSuggestOracle extends SuggestAfterTypingNCharsOracle { @Override public void _onRequestSuggestions(final Request req, final Callback cb) { - AccountApi.suggest(req.getQuery(), req.getLimit(), + AccountApi.suggest( + req.getQuery(), + req.getLimit(), new GerritCallback>() { @Override public void onSuccess(JsArray in) { @@ -61,11 +62,10 @@ public class AccountSuggestOracle extends SuggestAfterTypingNCharsOracle { public static String format(AccountInfo info, String query) { String s = FormatUtil.nameEmail(info); - if (query != null && !containsQuery(s, query) && - info.secondaryEmails() != null) { + if (query != null && !containsQuery(s, query) && info.secondaryEmails() != null) { for (String email : Natives.asList(info.secondaryEmails())) { - AccountInfo info2 = AccountInfo.create(info._accountId(), info.name(), - email, info.username()); + AccountInfo info2 = + AccountInfo.create(info._accountId(), info.name(), email, info.username()); String s2 = FormatUtil.nameEmail(info2); if (containsQuery(s2, query)) { s = s2; diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/AddMemberBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/AddMemberBox.java index 72233f5a47..5d8d56cbcf 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/AddMemberBox.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/AddMemberBox.java @@ -29,8 +29,8 @@ public class AddMemberBox extends Composite { private final Button addMember; private final RemoteSuggestBox suggestBox; - public AddMemberBox(final String buttonLabel, final String hint, - final SuggestOracle suggestOracle) { + public AddMemberBox( + final String buttonLabel, final String hint, final SuggestOracle suggestOracle) { addPanel = new FlowPanel(); addMember = new Button(buttonLabel); @@ -38,12 +38,13 @@ public class AddMemberBox extends Composite { suggestBox.setStyleName(Gerrit.RESOURCES.css().addMemberTextBox()); suggestBox.setVisibleLength(50); suggestBox.setHintText(hint); - suggestBox.addSelectionHandler(new SelectionHandler() { - @Override - public void onSelection(SelectionEvent event) { - addMember.fireEvent(new ClickEvent() {}); - } - }); + suggestBox.addSelectionHandler( + new SelectionHandler() { + @Override + public void onSelection(SelectionEvent event) { + addMember.fireEvent(new ClickEvent() {}); + } + }); addPanel.add(suggestBox); addPanel.add(addMember); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/BranchLink.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/BranchLink.java index 984653db18..6e05f830f2 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/BranchLink.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/BranchLink.java @@ -25,13 +25,12 @@ import com.google.gerrit.reviewdb.client.RefNames; public class BranchLink extends InlineHyperlink { private final String query; - public BranchLink(Project.NameKey project, Change.Status status, - String branch, String topic) { + public BranchLink(Project.NameKey project, Change.Status status, String branch, String topic) { this(text(branch, topic), query(project, status, branch, topic)); } - public BranchLink(String text, Project.NameKey project, Change.Status status, - String branch, String topic) { + public BranchLink( + String text, Project.NameKey project, Change.Status status, String branch, String topic) { this(text, query(project, status, branch, topic)); } @@ -56,14 +55,17 @@ public class BranchLink extends InlineHyperlink { return branch; } - public static String query(Project.NameKey project, Change.Status status, - String branch, String topic) { + public static String query( + Project.NameKey project, Change.Status status, String branch, String topic) { String query = PageLinks.projectQuery(project, status); if (branch.startsWith(RefNames.REFS)) { if (branch.startsWith(RefNames.REFS_HEADS)) { - query += " " + PageLinks.op("branch", // - branch.substring(RefNames.REFS_HEADS.length())); + query += + " " + + PageLinks.op( + "branch", // + branch.substring(RefNames.REFS_HEADS.length())); } else { query += " " + PageLinks.op("ref", branch); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/CherryPickDialog.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/CherryPickDialog.java index 5577772f21..85552c92c1 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/CherryPickDialog.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/CherryPickDialog.java @@ -27,7 +27,6 @@ import com.google.gwt.user.client.ui.SuggestBox; import com.google.gwt.user.client.ui.SuggestOracle.Suggestion; import com.google.gwtexpui.globalkey.client.GlobalKey; import com.google.gwtexpui.safehtml.client.HighlightSuggestOracle; - import java.util.ArrayList; import java.util.List; @@ -36,9 +35,9 @@ public abstract class CherryPickDialog extends TextAreaActionDialog { private List branches; public CherryPickDialog(Project.NameKey project) { - super(Util.C.cherryPickTitle(), Util.C - .cherryPickCommitMessage()); - ProjectApi.getBranches(project, + super(Util.C.cherryPickTitle(), Util.C.cherryPickCommitMessage()); + ProjectApi.getBranches( + project, new GerritCallback>() { @Override public void onSuccess(JsArray result) { @@ -46,18 +45,20 @@ public abstract class CherryPickDialog extends TextAreaActionDialog { } }); - newBranch = new SuggestBox(new HighlightSuggestOracle() { - @Override - protected void onRequestSuggestions(Request request, Callback done) { - List suggestions = new ArrayList<>(); - for (final BranchInfo b : branches) { - if (b.ref().contains(request.getQuery())) { - suggestions.add(new BranchSuggestion(b)); - } - } - done.onSuggestionsReady(request, new Response(suggestions)); - } - }); + newBranch = + new SuggestBox( + new HighlightSuggestOracle() { + @Override + protected void onRequestSuggestions(Request request, Callback done) { + List suggestions = new ArrayList<>(); + for (final BranchInfo b : branches) { + if (b.ref().contains(request.getQuery())) { + suggestions.add(new BranchSuggestion(b)); + } + } + done.onSuggestionsReady(request, new Response(suggestions)); + } + }); newBranch.setWidth("100%"); newBranch.getElement().getStyle().setProperty("boxSizing", "border-box"); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/CommentLinkProcessor.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/CommentLinkProcessor.java index fd7d40cf39..1753ade074 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/CommentLinkProcessor.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/CommentLinkProcessor.java @@ -19,7 +19,6 @@ import com.google.gwtexpui.safehtml.client.FindReplace; import com.google.gwtexpui.safehtml.client.SafeHtml; import com.google.gwtjsonrpc.common.AsyncCallback; import com.google.gwtjsonrpc.common.VoidResult; - import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -60,15 +59,14 @@ public class CommentLinkProcessor { msg.append("\": "); msg.append(e.errorMessage); } - Gerrit.SYSTEM_SVC.clientError(msg.toString(), + Gerrit.SYSTEM_SVC.clientError( + msg.toString(), new AsyncCallback() { @Override - public void onFailure(Throwable caught) { - } + public void onFailure(Throwable caught) {} @Override - public void onSuccess(VoidResult result) { - } + public void onSuccess(VoidResult result) {} }); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/CommentedActionDialog.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/CommentedActionDialog.java index c21d5dcff0..d497740588 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/CommentedActionDialog.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/CommentedActionDialog.java @@ -38,29 +38,31 @@ public abstract class CommentedActionDialog extends AutoCenterDialogBox protected boolean sent; public CommentedActionDialog(final String title, final String heading) { - super(/* auto hide */false, /* modal */true); + super(/* auto hide */ false, /* modal */ true); setGlassEnabled(true); setText(title); addStyleName(Gerrit.RESOURCES.css().commentedActionDialog()); sendButton = new Button(Util.C.commentedActionButtonSend()); - sendButton.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - enableButtons(false); - onSend(); - } - }); + sendButton.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + enableButtons(false); + onSend(); + } + }); cancelButton = new Button(Util.C.commentedActionButtonCancel()); cancelButton.getElement().getStyle().setProperty("float", "right"); - cancelButton.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - hide(); - } - }); + cancelButton.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + hide(); + } + }); contentPanel = new FlowPanel(); contentPanel.setStyleName(Gerrit.RESOURCES.css().commentedActionMessage()); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ComplexDisclosurePanel.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ComplexDisclosurePanel.java index 4cc6a16d0a..f65fb1b837 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ComplexDisclosurePanel.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ComplexDisclosurePanel.java @@ -27,8 +27,8 @@ import com.google.gwt.user.client.ui.DisclosurePanel; import com.google.gwt.user.client.ui.Panel; import com.google.gwt.user.client.ui.Widget; -public class ComplexDisclosurePanel extends Composite implements - HasOpenHandlers, HasCloseHandlers { +public class ComplexDisclosurePanel extends Composite + implements HasOpenHandlers, HasCloseHandlers { private final DisclosurePanel main; private final Panel header; @@ -51,28 +51,30 @@ public class ComplexDisclosurePanel extends Composite implements headerParent = tr1; } - header = new ComplexPanel() { - { - setElement((Element)(DOM.createTD())); - getElement().setInnerHTML(" "); - } + header = + new ComplexPanel() { + { + setElement((Element) (DOM.createTD())); + getElement().setInnerHTML(" "); + } - @Override - public void add(Widget w) { - add(w, (Element)getElement()); - } - }; + @Override + public void add(Widget w) { + add(w, (Element) getElement()); + } + }; - initWidget(new ComplexPanel() { - { - final DisclosurePanel main = ComplexDisclosurePanel.this.main; - setElement((Element)(main.getElement())); - getChildren().add(main); - adopt(main); + initWidget( + new ComplexPanel() { + { + final DisclosurePanel main = ComplexDisclosurePanel.this.main; + setElement((Element) (main.getElement())); + getChildren().add(main); + adopt(main); - add(ComplexDisclosurePanel.this.header, headerParent); - } - }); + add(ComplexDisclosurePanel.this.header, headerParent); + } + }); } public Panel getHeader() { @@ -93,8 +95,7 @@ public class ComplexDisclosurePanel extends Composite implements } @Override - public HandlerRegistration addCloseHandler( - final CloseHandler h) { + public HandlerRegistration addCloseHandler(final CloseHandler h) { return main.addCloseHandler(h); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/CreateChangeDialog.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/CreateChangeDialog.java index 7cda8a3d01..2d00281bdf 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/CreateChangeDialog.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/CreateChangeDialog.java @@ -27,7 +27,6 @@ import com.google.gwt.user.client.ui.SuggestOracle.Suggestion; import com.google.gwt.user.client.ui.TextBox; import com.google.gwtexpui.globalkey.client.GlobalKey; import com.google.gwtexpui.safehtml.client.HighlightSuggestOracle; - import java.util.ArrayList; import java.util.List; @@ -37,9 +36,9 @@ public abstract class CreateChangeDialog extends TextAreaActionDialog { private TextBox topic; public CreateChangeDialog(Project.NameKey project) { - super(Util.C.dialogCreateChangeTitle(), - Util.C.dialogCreateChangeHeading()); - ProjectApi.getBranches(project, + super(Util.C.dialogCreateChangeTitle(), Util.C.dialogCreateChangeHeading()); + ProjectApi.getBranches( + project, new GerritCallback>() { @Override public void onSuccess(JsArray result) { @@ -56,18 +55,20 @@ public abstract class CreateChangeDialog extends TextAreaActionDialog { panel.insert(newTopicPanel, 0); panel.insert(new SmallHeading(Util.C.newChangeTopicSuggestion()), 0); - newChange = new SuggestBox(new HighlightSuggestOracle() { - @Override - protected void onRequestSuggestions(Request request, Callback done) { - List suggestions = new ArrayList<>(); - for (BranchInfo b : branches) { - if (b.ref().contains(request.getQuery())) { - suggestions.add(new BranchSuggestion(b)); - } - } - done.onSuggestionsReady(request, new Response(suggestions)); - } - }); + newChange = + new SuggestBox( + new HighlightSuggestOracle() { + @Override + protected void onRequestSuggestions(Request request, Callback done) { + List suggestions = new ArrayList<>(); + for (BranchInfo b : branches) { + if (b.ref().contains(request.getQuery())) { + suggestions.add(new BranchSuggestion(b)); + } + } + done.onSuggestionsReady(request, new Response(suggestions)); + } + }); newChange.setWidth("100%"); newChange.getElement().getStyle().setProperty("boxSizing", "border-box"); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/FancyFlexTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/FancyFlexTable.java index e77bc10456..a9a1721069 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/FancyFlexTable.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/FancyFlexTable.java @@ -24,13 +24,11 @@ import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.HTMLTable.CellFormatter; import com.google.gwt.user.client.ui.Widget; import com.google.gwtexpui.safehtml.client.SafeHtml; - import java.util.Comparator; import java.util.Iterator; public abstract class FancyFlexTable extends Composite { - private static final FancyFlexTableImpl impl = - GWT.create(FancyFlexTableImpl.class); + private static final FancyFlexTableImpl impl = GWT.create(FancyFlexTableImpl.class); protected static final int C_ARROW = 0; @@ -51,8 +49,7 @@ public abstract class FancyFlexTable extends Composite { } protected RowItem getRowItem(final int row) { - return FancyFlexTable. getRowItem(table.getCellFormatter() - .getElement(row, 0)); + return FancyFlexTable.getRowItem(table.getCellFormatter().getElement(row, 0)); } protected void setRowItem(final int row, final RowItem item) { @@ -64,32 +61,28 @@ public abstract class FancyFlexTable extends Composite { * * @param comparator comparator by which the items in the table are sorted * @param item the item that should be found - * @return if the item is found the number of the row that contains the item; - * if the item is not found {@code -1} + * @return if the item is found the number of the row that contains the item; if the item is not + * found {@code -1} */ protected int findRowItem(Comparator comparator, RowItem item) { int row = lookupRowItem(comparator, item); - if (row < table.getRowCount() - && comparator.compare(item, getRowItem(row)) == 0) { + if (row < table.getRowCount() && comparator.compare(item, getRowItem(row)) == 0) { return row; } return -1; } /** - * Finds the number of the row where a new item should be inserted into the - * table. + * Finds the number of the row where a new item should be inserted into the table. * * @param comparator comparator by which the items in the table are sorted * @param item the new item that should be inserted - * @return if the item is not yet contained in the table, the number of the - * row where the new item should be inserted; if the item is already - * contained in the table {@code -1} + * @return if the item is not yet contained in the table, the number of the row where the new item + * should be inserted; if the item is already contained in the table {@code -1} */ protected int getInsertRow(Comparator comparator, RowItem item) { int row = lookupRowItem(comparator, item); - if (row >= table.getRowCount() - || comparator.compare(item, getRowItem(row)) != 0) { + if (row >= table.getRowCount() || comparator.compare(item, getRowItem(row)) != 0) { return row; } return -1; @@ -100,9 +93,9 @@ public abstract class FancyFlexTable extends Composite { * * @param comparator comparator by which the items in the table are sorted * @param item the item that should be looked up - * @return if the item is found the number of the row that contains the item; - * if the item is not found the number of the row where the item - * should be inserted according to the given comparator. + * @return if the item is found the number of the row that contains the item; if the item is not + * found the number of the row where the item should be inserted according to the given + * comparator. */ private int lookupRowItem(Comparator comparator, RowItem item) { int left = 1; @@ -125,7 +118,7 @@ public abstract class FancyFlexTable extends Composite { } protected void resetHtml(final SafeHtml body) { - for (final Iterator i = table.iterator(); i.hasNext();) { + for (final Iterator i = table.iterator(); i.hasNext(); ) { i.next(); i.remove(); } @@ -180,8 +173,8 @@ public abstract class FancyFlexTable extends Composite { * Get the td element that contains another element. * * @param target the child element whose parent td is required. - * @return the td containing element {@code target}; null if {@code target} is - * not a member of this table. + * @return the td containing element {@code target}; null if {@code target} is not a member of + * this table. */ protected Element getParentCell(final Element target) { final Element body = FancyFlexTableImpl.getBodyElement(table); @@ -219,12 +212,11 @@ public abstract class FancyFlexTable extends Composite { return DOM.getChildIndex(tr, td); } - protected static class MyFlexTable extends FlexTable { - } + protected static class MyFlexTable extends FlexTable {} private static native void setRowItem(Element td, ItemType c) - /*-{ td['__gerritRowItem'] = c; }-*/; + /*-{ td['__gerritRowItem'] = c; }-*/ ; private static native ItemType getRowItem(Element td) - /*-{ return td['__gerritRowItem']; }-*/; + /*-{ return td['__gerritRowItem']; }-*/ ; } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/FancyFlexTableImpl.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/FancyFlexTableImpl.java index e6e5d8bd0c..ded0140e50 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/FancyFlexTableImpl.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/FancyFlexTableImpl.java @@ -25,5 +25,5 @@ public class FancyFlexTableImpl { } protected static native Element getBodyElement(HTMLTable myTable) - /*-{ return myTable.@com.google.gwt.user.client.ui.HTMLTable::bodyElem; }-*/; + /*-{ return myTable.@com.google.gwt.user.client.ui.HTMLTable::bodyElem; }-*/ ; } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/FancyFlexTableImplIE8.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/FancyFlexTableImplIE8.java index 76ad0e70b3..a6484123fe 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/FancyFlexTableImplIE8.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/FancyFlexTableImplIE8.java @@ -41,8 +41,7 @@ public class FancyFlexTableImplIE8 extends FancyFlexTableImpl { b.closeElement("table"); final Element newTable = SafeHtml.parse(b); - for (Element e = DOM.getFirstChild(newTable); e != null; e = - DOM.getNextSibling(e)) { + for (Element e = DOM.getFirstChild(newTable); e != null; e = DOM.getNextSibling(e)) { if ("tbody".equals(e.getTagName().toLowerCase())) { return e; } @@ -51,5 +50,5 @@ public class FancyFlexTableImplIE8 extends FancyFlexTableImpl { } private static native void setBodyElement(HTMLTable myTable, Element newBody) - /*-{ myTable.@com.google.gwt.user.client.ui.HTMLTable::bodyElem = newBody; }-*/; + /*-{ myTable.@com.google.gwt.user.client.ui.HTMLTable::bodyElem = newBody; }-*/ ; } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/HighlightingInlineHyperlink.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/HighlightingInlineHyperlink.java index 00825a3c80..6e1fb0987e 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/HighlightingInlineHyperlink.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/HighlightingInlineHyperlink.java @@ -14,13 +14,12 @@ package com.google.gerrit.client.ui; - public class HighlightingInlineHyperlink extends InlineHyperlink { private String toHighlight; - public HighlightingInlineHyperlink(final String text, final String token, - final String toHighlight) { + public HighlightingInlineHyperlink( + final String text, final String token, final String toHighlight) { super(text, token); this.toHighlight = toHighlight; highlight(text, toHighlight); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/HighlightingProjectsTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/HighlightingProjectsTable.java index fc60360f91..06d1cf83b6 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/HighlightingProjectsTable.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/HighlightingProjectsTable.java @@ -28,8 +28,7 @@ public class HighlightingProjectsTable extends ProjectsTable { @Override protected void populate(final int row, final ProjectInfo k) { - table.setWidget(row, 1, - new InlineHTML(Util.highlight(k.name(), toHighlight))); + table.setWidget(row, 1, new InlineHTML(Util.highlight(k.name(), toHighlight))); table.setText(row, 2, k.description()); setRowItem(row, k); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/HintTextBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/HintTextBox.java index 2ec6cd933b..f8ad835459 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/HintTextBox.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/HintTextBox.java @@ -28,7 +28,6 @@ import com.google.gwt.user.client.ui.SuggestBox.DefaultSuggestionDisplay; import com.google.gwt.user.client.ui.Widget; import com.google.gwtexpui.globalkey.client.NpTextBox; - public class HintTextBox extends NpTextBox { private HandlerRegistration hintFocusHandler; private HandlerRegistration hintBlurHandler; @@ -42,7 +41,6 @@ public class HintTextBox extends NpTextBox { private boolean hintOn; private boolean isFocused; - @Override public String getText() { if (hintOn) { @@ -58,7 +56,7 @@ public class HintTextBox extends NpTextBox { super.setText(text); prevText = text; - if (! isFocused) { + if (!isFocused) { blurHint(); } } @@ -91,42 +89,48 @@ public class HintTextBox extends NpTextBox { if (hintText == null) { // first time (was not already set) hintText = text; - hintFocusHandler = addFocusHandler(new FocusHandler() { - @Override - public void onFocus(FocusEvent event) { - focusHint(); - prevText = getText(); - isFocused = true; - } - }); + hintFocusHandler = + addFocusHandler( + new FocusHandler() { + @Override + public void onFocus(FocusEvent event) { + focusHint(); + prevText = getText(); + isFocused = true; + } + }); - hintBlurHandler = addBlurHandler(new BlurHandler() { - @Override - public void onBlur(BlurEvent event) { - blurHint(); - isFocused = false; - } - }); + hintBlurHandler = + addBlurHandler( + new BlurHandler() { + @Override + public void onBlur(BlurEvent event) { + blurHint(); + isFocused = false; + } + }); /* - * There seems to be a strange bug (at least on firefox 3.5.9 ubuntu) with - * the textbox under the following circumstances: - * 1) The field is not focused with BText in it. - * 2) The field receives focus and a focus listener changes the text to FText - * 3) The ESC key is pressed and the value of the field has not changed - * (ever) from FText - * 4) BUG: The text value gets reset to BText! - * - * A counter to this bug seems to be to force setFocus(false) on ESC. - */ + * There seems to be a strange bug (at least on firefox 3.5.9 ubuntu) with + * the textbox under the following circumstances: + * 1) The field is not focused with BText in it. + * 2) The field receives focus and a focus listener changes the text to FText + * 3) The ESC key is pressed and the value of the field has not changed + * (ever) from FText + * 4) BUG: The text value gets reset to BText! + * + * A counter to this bug seems to be to force setFocus(false) on ESC. + */ /* Chrome does not create a KeyPressEvent on ESC, so use KeyDownEvents */ - keyDownHandler = addKeyDownHandler(new KeyDownHandler() { - @Override - public void onKeyDown(final KeyDownEvent event) { - onKey(event.getNativeKeyCode()); - } - }); + keyDownHandler = + addKeyDownHandler( + new KeyDownHandler() { + @Override + public void onKeyDown(final KeyDownEvent event) { + onKey(event.getNativeKeyCode()); + } + }); } else { // Changing an already set Hint @@ -134,7 +138,7 @@ public class HintTextBox extends NpTextBox { hintText = text; } - if (! isFocused) { + if (!isFocused) { blurHint(); } } @@ -151,11 +155,10 @@ public class HintTextBox extends NpTextBox { // recreates the same string as before ESC was pressed, the // SuggestBox will think that the string has not changed, and // it will not yet provide any Suggestions. - ((SuggestBox)p).showSuggestionList(); + ((SuggestBox) p).showSuggestionList(); // The suggestion list lingers if we don't hide it. - ((DefaultSuggestionDisplay) ((SuggestBox) p).getSuggestionDisplay()) - .hideSuggestions(); + ((DefaultSuggestionDisplay) ((SuggestBox) p).getSuggestionDisplay()).hideSuggestions(); } setFocus(false); @@ -179,7 +182,7 @@ public class HintTextBox extends NpTextBox { } protected void blurHint() { - if (! hintOn && getHintText() != null && "".equals(super.getText())) { + if (!hintOn && getHintText() != null && "".equals(super.getText())) { hintOn = true; super.setText(getHintText()); if (getHintStyleName() != null) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/Hyperlink.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/Hyperlink.java index 2108ad4643..6c28145022 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/Hyperlink.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/Hyperlink.java @@ -26,15 +26,14 @@ public class Hyperlink extends com.google.gwt.user.client.ui.Hyperlink { public static final HyperlinkImpl impl = GWT.create(HyperlinkImpl.class); /** Initialize a default hyperlink with no target and no text. */ - public Hyperlink() { - } + public Hyperlink() {} /** * Creates a hyperlink with its text and target history token specified. * * @param text the hyperlink's text - * @param token the history token to which it will link, which may not be null - * (use {@link Anchor} instead if you don't need history processing) + * @param token the history token to which it will link, which may not be null (use {@link Anchor} + * instead if you don't need history processing) */ public Hyperlink(final String text, final String token) { super(text, token); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/InlineHyperlink.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/InlineHyperlink.java index 9d417748b9..24f288782e 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/InlineHyperlink.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/InlineHyperlink.java @@ -21,8 +21,7 @@ import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Event; /** Standard GWT hyperlink with late updating of the token. */ -public class InlineHyperlink extends - com.google.gwt.user.client.ui.InlineHyperlink { +public class InlineHyperlink extends com.google.gwt.user.client.ui.InlineHyperlink { /** * Creates a link with its text and target history token specified. * @@ -34,8 +33,7 @@ public class InlineHyperlink extends } /** Creates an empty link. */ - public InlineHyperlink() { - } + public InlineHyperlink() {} @Override public void onBrowserEvent(final Event event) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/LinkMenuBar.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/LinkMenuBar.java index 4f7d419623..d08b6f9b85 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/LinkMenuBar.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/LinkMenuBar.java @@ -87,6 +87,5 @@ public class LinkMenuBar extends Composite implements ScreenLoadHandler { } @Override - public void onScreenLoad(ScreenLoadEvent event) { - } + public void onScreenLoad(ScreenLoadEvent event) {} } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/MenuScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/MenuScreen.java index d94469099c..2c614b5836 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/MenuScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/MenuScreen.java @@ -62,8 +62,7 @@ public abstract class MenuScreen extends Screen { link(text, target, true); } - protected void link(final String text, final String target, - final boolean visible) { + protected void link(final String text, final String target, final boolean visible) { final LinkMenuItem item = new LinkMenuItem(text, target); item.setStyleName(Gerrit.RESOURCES.css().menuItem()); item.setVisible(visible); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/MorphingTabPanel.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/MorphingTabPanel.java index 1b99707ad4..7fd6432b42 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/MorphingTabPanel.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/MorphingTabPanel.java @@ -18,14 +18,13 @@ import com.google.gwt.event.logical.shared.SelectionEvent; import com.google.gwt.event.logical.shared.SelectionHandler; import com.google.gwt.user.client.ui.TabPanel; import com.google.gwt.user.client.ui.Widget; - import java.util.ArrayList; import java.util.List; -/** A TabPanel which allows entries to be hidden. This class is not yet - * designed to handle removes or any other add methods than the one - * overridden here. It is also not designed to handle anything other - * than text for the tab. +/** + * A TabPanel which allows entries to be hidden. This class is not yet designed to handle removes or + * any other add methods than the one overridden here. It is also not designed to handle anything + * other than text for the tab. */ public class MorphingTabPanel extends TabPanel { // Keep track of the order the widgets/texts should be in when not hidden. @@ -38,12 +37,13 @@ public class MorphingTabPanel extends TabPanel { private int selection; public MorphingTabPanel() { - addSelectionHandler(new SelectionHandler() { - @Override - public void onSelection(SelectionEvent ev) { - selection = ev.getSelectedItem(); - } - }); + addSelectionHandler( + new SelectionHandler() { + @Override + public void onSelection(SelectionEvent ev) { + selection = ev.getSelectedItem(); + } + }); } public int getSelectedIndex() { @@ -80,8 +80,8 @@ public class MorphingTabPanel extends TabPanel { int origPos = widgets.indexOf(w); /* Re-insert the widget right after the first visible widget found - when scanning backwards from the current widget */ - for (int pos = origPos - 1; pos >= 0 ; pos--) { + when scanning backwards from the current widget */ + for (int pos = origPos - 1; pos >= 0; pos--) { int visiblePos = visibles.indexOf(widgets.get(pos)); if (visiblePos != -1) { visibles.add(visiblePos + 1, w); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/NavigationTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/NavigationTable.java index 91fedef36e..8975dda5a8 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/NavigationTable.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/NavigationTable.java @@ -32,7 +32,6 @@ import com.google.gwtexpui.globalkey.client.GlobalKey; import com.google.gwtexpui.globalkey.client.KeyCommand; import com.google.gwtexpui.globalkey.client.KeyCommandSet; import com.google.gwtexpui.safehtml.client.SafeHtml; - import java.util.LinkedHashMap; import java.util.Map.Entry; @@ -45,28 +44,30 @@ public abstract class NavigationTable extends FancyFlexTable { @Override public void onBrowserEvent(final Event event) { switch (DOM.eventGetType(event)) { - case Event.ONCLICK: { - // Find out which cell was actually clicked. - final Element td = getEventTargetCell(event); - if (td == null) { + case Event.ONCLICK: + { + // Find out which cell was actually clicked. + final Element td = getEventTargetCell(event); + if (td == null) { + break; + } + final int row = rowOf(td); + if (getRowItem(row) != null) { + onCellSingleClick(event, rowOf(td), columnOf(td)); + return; + } break; } - final int row = rowOf(td); - if (getRowItem(row) != null) { - onCellSingleClick(event, rowOf(td), columnOf(td)); + case Event.ONDBLCLICK: + { + // Find out which cell was actually clicked. + Element td = getEventTargetCell(event); + if (td == null) { + return; + } + onCellDoubleClick(rowOf(td), columnOf(td)); return; } - break; - } - case Event.ONDBLCLICK: { - // Find out which cell was actually clicked. - Element td = getEventTargetCell(event); - if (td == null) { - return; - } - onCellDoubleClick(rowOf(td), columnOf(td)); - return; - } } super.onBrowserEvent(event); } @@ -98,8 +99,8 @@ public abstract class NavigationTable extends FancyFlexTable { new PrevKeyCommand(0, 'k', Util.M.helpListPrev(itemHelpName)), new NextKeyCommand(0, 'j', Util.M.helpListNext(itemHelpName))); keysNavigation.add(new OpenKeyCommand(0, 'o', Util.M.helpListOpen(itemHelpName))); - keysNavigation.add(new OpenKeyCommand(0, KeyCodes.KEY_ENTER, - Util.M.helpListOpen(itemHelpName))); + keysNavigation.add( + new OpenKeyCommand(0, KeyCodes.KEY_ENTER, Util.M.helpListOpen(itemHelpName))); } protected NavigationTable() { @@ -208,8 +209,7 @@ public abstract class NavigationTable extends FancyFlexTable { final Element tr = fmt.getElement(currentRow, C_ARROW).getParentElement(); UIObject.setStyleName(tr, Gerrit.RESOURCES.css().activeRow(), false); } - if (0 <= newRow && newRow < table.getRowCount() - && getRowItem(newRow) != null) { + if (0 <= newRow && newRow < table.getRowCount() && getRowItem(newRow) != null) { table.setWidget(newRow, C_ARROW, pointer); final Element tr = fmt.getElement(newRow, C_ARROW).getParentElement(); UIObject.setStyleName(tr, Gerrit.RESOURCES.css().activeRow(), true); @@ -238,11 +238,12 @@ public abstract class NavigationTable extends FancyFlexTable { } if (parentScrollPanel != null) { - parentScrollPanel.ensureVisible(new UIObject() { - { - setElement(tr); - } - }); + parentScrollPanel.ensureVisible( + new UIObject() { + { + setElement(tr); + } + }); } else { int rt = tr.getAbsoluteTop(); int rl = tr.getAbsoluteLeft(); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/NpIntTextBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/NpIntTextBox.java index 39943813c4..8be6647e93 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/NpIntTextBox.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/NpIntTextBox.java @@ -31,21 +31,23 @@ public class NpIntTextBox extends NpTextBox { } private void init() { - addKeyDownHandler(new KeyDownHandler() { - @Override - public void onKeyDown(KeyDownEvent event) { - int code = event.getNativeKeyCode(); - onKey(event, code, code); - } - }); - addKeyPressHandler(new KeyPressHandler() { - @Override - public void onKeyPress(KeyPressEvent event) { - int charCode = event.getCharCode(); - int keyCode = event.getNativeEvent().getKeyCode(); - onKey(event, charCode, keyCode); - } - }); + addKeyDownHandler( + new KeyDownHandler() { + @Override + public void onKeyDown(KeyDownEvent event) { + int code = event.getNativeKeyCode(); + onKey(event, code, code); + } + }); + addKeyPressHandler( + new KeyPressHandler() { + @Override + public void onKeyPress(KeyPressEvent event) { + int charCode = event.getCharCode(); + int keyCode = event.getNativeEvent().getKeyCode(); + onKey(event, charCode, keyCode); + } + }); } private void onKey(KeyEvent event, int charCode, int keyCode) { @@ -67,9 +69,7 @@ public class NpIntTextBox extends NpTextBox { default: // Allow copy and paste using ctl-c/ctrl-v, // or whatever the platform's convention is. - if (!(event.isControlKeyDown() - || event.isMetaKeyDown() - || event.isAltKeyDown())) { + if (!(event.isControlKeyDown() || event.isMetaKeyDown() || event.isAltKeyDown())) { event.preventDefault(); } break; diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/OnEditEnabler.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/OnEditEnabler.java index 439147715d..87de3b7687 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/OnEditEnabler.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/OnEditEnabler.java @@ -34,22 +34,23 @@ import com.google.gwt.user.client.ui.FocusWidget; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.TextBoxBase; import com.google.gwt.user.client.ui.ValueBoxBase; - import java.util.HashMap; import java.util.Map; - -/** Enables a FocusWidget (e.g. a Button) if an edit is detected from any - * registered input widget. +/** + * Enables a FocusWidget (e.g. a Button) if an edit is detected from any registered input widget. */ -public class OnEditEnabler implements KeyPressHandler, KeyDownHandler, - MouseUpHandler, ChangeHandler, ValueChangeHandler { +public class OnEditEnabler + implements KeyPressHandler, + KeyDownHandler, + MouseUpHandler, + ChangeHandler, + ValueChangeHandler { private final FocusWidget widget; private Map strings = new HashMap<>(); private String originalValue; - // The first parameter to the contructors must be the FocusWidget to enable, // subsequent parameters are widgets to listenTo. @@ -91,12 +92,13 @@ public class OnEditEnabler implements KeyPressHandler, KeyDownHandler, // up to date with non-user updates of the text (calls to // setText()...) and also up to date with user changes which // occurred after enabling "widget". - tb.addFocusHandler(new FocusHandler() { - @Override - public void onFocus(FocusEvent event) { - strings.put(tb, tb.getText().trim()); - } - }); + tb.addFocusHandler( + new FocusHandler() { + @Override + public void onFocus(FocusEvent event) { + strings.put(tb, tb.getText().trim()); + } + }); // CTRL-V Pastes in Chrome seem only detectable via BrowserEvents or // KeyDownEvents, the latter is better. @@ -112,7 +114,6 @@ public class OnEditEnabler implements KeyPressHandler, KeyDownHandler, cb.addValueChangeHandler((ValueChangeHandler) this); } - // Handlers @Override @@ -142,19 +143,21 @@ public class OnEditEnabler implements KeyPressHandler, KeyDownHandler, } private void on(final GwtEvent e) { - if (widget.isEnabled() || - ! (e.getSource() instanceof FocusWidget) || - ! ((FocusWidget) e.getSource()).isEnabled() ) { + if (widget.isEnabled() + || !(e.getSource() instanceof FocusWidget) + || !((FocusWidget) e.getSource()).isEnabled()) { if (e.getSource() instanceof ValueBoxBase) { final TextBoxBase box = ((TextBoxBase) e.getSource()); - Scheduler.get().scheduleDeferred(new ScheduledCommand() { - @Override - public void execute() { - if (box.getValue().trim().equals(originalValue)) { - widget.setEnabled(false); - } - } - }); + Scheduler.get() + .scheduleDeferred( + new ScheduledCommand() { + @Override + public void execute() { + if (box.getValue().trim().equals(originalValue)) { + widget.setEnabled(false); + } + } + }); } return; } @@ -171,17 +174,19 @@ public class OnEditEnabler implements KeyPressHandler, KeyDownHandler, private void onTextBoxBase(final TextBoxBase tb) { // The text appears to not get updated until the handlers complete. - Scheduler.get().scheduleDeferred(new ScheduledCommand() { - @Override - public void execute() { - String orig = strings.get(tb); - if (orig == null) { - orig = ""; - } - if (! orig.equals(tb.getText().trim())) { - widget.setEnabled(true); - } - } - }); + Scheduler.get() + .scheduleDeferred( + new ScheduledCommand() { + @Override + public void execute() { + String orig = strings.get(tb); + if (orig == null) { + orig = ""; + } + if (!orig.equals(tb.getText().trim())) { + widget.setEnabled(true); + } + } + }); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ParentProjectBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ParentProjectBox.java index e254f6e073..fab0cf71fd 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ParentProjectBox.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ParentProjectBox.java @@ -21,7 +21,6 @@ import com.google.gerrit.reviewdb.client.Project; import com.google.gwt.core.client.JsArray; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Composite; - import java.util.HashSet; import java.util.Set; @@ -61,38 +60,41 @@ public class ParentProjectBox extends Composite { public void setProject(Project.NameKey project) { exclude.clear(); exclude.add(project.get()); - ProjectApi.getChildren(project, true, new AsyncCallback>() { - @Override - public void onSuccess(JsArray result) { - for (ProjectInfo p : Natives.asList(result)) { - exclude.add(p.name()); - } - } + ProjectApi.getChildren( + project, + true, + new AsyncCallback>() { + @Override + public void onSuccess(JsArray result) { + for (ProjectInfo p : Natives.asList(result)) { + exclude.add(p.name()); + } + } - @Override - public void onFailure(Throwable caught) { - } - }); + @Override + public void onFailure(Throwable caught) {} + }); } @Override public void _onRequestSuggestions(Request req, final Callback callback) { - super._onRequestSuggestions(req, new Callback() { - @Override - public void onSuggestionsReady(Request request, Response response) { - if (exclude.size() > 0) { - Set filteredSuggestions = - new HashSet<>(response.getSuggestions()); - for (Suggestion s : response.getSuggestions()) { - if (exclude.contains(s.getReplacementString())) { - filteredSuggestions.remove(s); + super._onRequestSuggestions( + req, + new Callback() { + @Override + public void onSuggestionsReady(Request request, Response response) { + if (exclude.size() > 0) { + Set filteredSuggestions = new HashSet<>(response.getSuggestions()); + for (Suggestion s : response.getSuggestions()) { + if (exclude.contains(s.getReplacementString())) { + filteredSuggestions.remove(s); + } + } + response.setSuggestions(filteredSuggestions); } + callback.onSuggestionsReady(request, response); } - response.setSuggestions(filteredSuggestions); - } - callback.onSuggestionsReady(request, response); - } - }); + }); } } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectLinkMenuItem.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectLinkMenuItem.java index 119f5ef034..114f794c08 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectLinkMenuItem.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectLinkMenuItem.java @@ -31,7 +31,7 @@ public class ProjectLinkMenuItem extends LinkMenuItem { Screen screen = event.getScreen(); Project.NameKey projectKey; if (screen instanceof ProjectScreen) { - projectKey = ((ProjectScreen)screen).getProjectKey(); + projectKey = ((ProjectScreen) screen).getProjectKey(); } else { projectKey = ProjectScreen.getSavedKey(); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectListPopup.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectListPopup.java index 36708dc846..8e6ee42a30 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectListPopup.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectListPopup.java @@ -96,57 +96,55 @@ public class ProjectListPopup { * * @param projectName project name. */ - protected void onMovePointerTo(String projectName) { - } + protected void onMovePointerTo(String projectName) {} /** * Invoked after opening a project row. * * @param projectName project name. */ - protected void openRow(String projectName) { - } + protected void openRow(String projectName) {} public boolean isPoppingUp() { return poppingUp; } - private void createWidgets(final String popupText, - final String currentPageLink) { + private void createWidgets(final String popupText, final String currentPageLink) { filterPanel = new HorizontalPanel(); filterPanel.setStyleName(Gerrit.RESOURCES.css().projectFilterPanel()); - final Label filterLabel = - new Label(com.google.gerrit.client.admin.Util.C.projectFilter()); + final Label filterLabel = new Label(com.google.gerrit.client.admin.Util.C.projectFilter()); filterLabel.setStyleName(Gerrit.RESOURCES.css().projectFilterLabel()); filterPanel.add(filterLabel); filterTxt = new NpTextBox(); - filterTxt.addKeyUpHandler(new KeyUpHandler() { - @Override - public void onKeyUp(KeyUpEvent event) { - Query q = new Query(filterTxt.getValue()); - if (!match.equals(q.qMatch)) { - if (query == null) { - q.run(); + filterTxt.addKeyUpHandler( + new KeyUpHandler() { + @Override + public void onKeyUp(KeyUpEvent event) { + Query q = new Query(filterTxt.getValue()); + if (!match.equals(q.qMatch)) { + if (query == null) { + q.run(); + } + query = q; + } } - query = q; - } - } - }); + }); filterPanel.add(filterTxt); - projectsTab = new HighlightingProjectsTable() { - @Override - protected void movePointerTo(final int row, final boolean scroll) { - super.movePointerTo(row, scroll); - onMovePointerTo(getRowItem(row).name()); - } + projectsTab = + new HighlightingProjectsTable() { + @Override + protected void movePointerTo(final int row, final boolean scroll) { + super.movePointerTo(row, scroll); + onMovePointerTo(getRowItem(row).name()); + } - @Override - protected void onOpenRow(final int row) { - super.onOpenRow(row); - openRow(getRowItem(row).name()); - } - }; + @Override + protected void onOpenRow(final int row) { + super.onOpenRow(row); + openRow(getRowItem(row).name()); + } + }; projectsTab.setSavePointerId(currentPageLink); closeTop = createCloseButton(); @@ -159,12 +157,13 @@ public class ProjectListPopup { private Button createCloseButton() { Button close = new Button(Util.C.projectsClose()); - close.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - closePopup(); - } - }); + close.addClickHandler( + new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + closePopup(); + } + }); return close; } @@ -176,8 +175,7 @@ public class ProjectListPopup { } else { popup.setPopupPositionAndShow(popupPosition); GlobalKey.dialog(popup); - GlobalKey.addApplication(popup, new HidePopupPanelCommand(0, - KeyCodes.KEY_ESCAPE, popup)); + GlobalKey.addApplication(popup, new HidePopupPanelCommand(0, KeyCodes.KEY_ESCAPE, popup)); projectsTab.setRegisterKeys(true); projectsTab.finishDisplay(); filterTxt.setFocus(true); @@ -202,19 +200,21 @@ public class ProjectListPopup { } Query run() { - ProjectMap.match(qMatch, new GerritCallback() { - @Override - public void onSuccess(ProjectMap result) { - if (!firstPopupLoad && !popup.isShowing()) { - query = null; - } else if (query == Query.this) { - query = null; - showMap(result); - } else { - query.run(); + ProjectMap.match( + qMatch, + new GerritCallback() { + @Override + public void onSuccess(ProjectMap result) { + if (!firstPopupLoad && !popup.isShowing()) { + query = null; + } else if (query == Query.this) { + query = null; + showMap(result); + } else { + query.run(); + } } - } - }); + }); return this; } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectNameSuggestOracle.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectNameSuggestOracle.java index 49120f6ea5..2767a053ea 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectNameSuggestOracle.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectNameSuggestOracle.java @@ -22,7 +22,9 @@ import com.google.gerrit.client.rpc.Natives; public class ProjectNameSuggestOracle extends SuggestAfterTypingNCharsOracle { @Override public void _onRequestSuggestions(final Request req, final Callback callback) { - ProjectMap.suggest(req.getQuery(), req.getLimit(), + ProjectMap.suggest( + req.getQuery(), + req.getLimit(), new GerritCallback() { @Override public void onSuccess(ProjectMap map) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectSearchLink.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectSearchLink.java index ad418a6807..b383a836fc 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectSearchLink.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectSearchLink.java @@ -28,7 +28,6 @@ public class ProjectSearchLink extends InlineHyperlink { setTitle(Util.C.projectListQueryLink()); final Image image = new Image(Gerrit.RESOURCES.queryIcon()); image.setStyleName(Gerrit.RESOURCES.css().queryIcon()); - DOM.insertBefore(getElement(), image.getElement(), - DOM.getFirstChild(getElement())); + DOM.insertBefore(getElement(), image.getElement(), DOM.getFirstChild(getElement())); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectsTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectsTable.java index bb55b699a5..17d02ca199 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectsTable.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectsTable.java @@ -19,7 +19,6 @@ import com.google.gerrit.client.projects.ProjectInfo; import com.google.gerrit.client.projects.ProjectMap; import com.google.gerrit.client.rpc.Natives; import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter; - import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -37,8 +36,7 @@ public class ProjectsTable extends NavigationTable { protected void initColumnHeaders() { table.setText(0, C_STATE, Util.C.projectStateAbbrev()); - table.getCellFormatter().getElement(0, C_STATE) - .setTitle(Util.C.projectStateHelp()); + table.getCellFormatter().getElement(0, C_STATE).setTitle(Util.C.projectStateHelp()); table.setText(0, C_NAME, Util.C.projectName()); table.setText(0, C_DESCRIPTION, Util.C.projectDescription()); @@ -70,12 +68,14 @@ public class ProjectsTable extends NavigationTable { } List list = Natives.asList(projects.values()); - Collections.sort(list, new Comparator() { - @Override - public int compare(ProjectInfo a, ProjectInfo b) { - return a.name().compareTo(b.name()); - } - }); + Collections.sort( + list, + new Comparator() { + @Override + public int compare(ProjectInfo a, ProjectInfo b) { + return a.name().compareTo(b.name()); + } + }); for (ProjectInfo p : list.subList(fromIndex, toIndex)) { insert(table.getRowCount(), p); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/RebaseDialog.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/RebaseDialog.java index 77c4e568d4..f3dc6c3b64 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/RebaseDialog.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/RebaseDialog.java @@ -31,7 +31,6 @@ import com.google.gwt.user.client.ui.SuggestBox; import com.google.gwt.user.client.ui.SuggestOracle.Suggestion; import com.google.gwtexpui.globalkey.client.GlobalKey; import com.google.gwtexpui.safehtml.client.HighlightSuggestOracle; - import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -42,8 +41,11 @@ public abstract class RebaseDialog extends CommentedActionDialog { private List candidateChanges; private final boolean sendEnabled; - public RebaseDialog(final String project, final String branch, - final Change.Id changeId, final boolean sendEnabled) { + public RebaseDialog( + final String project, + final String branch, + final Change.Id changeId, + final boolean sendEnabled) { super(Util.C.rebaseTitle(), null); this.sendEnabled = sendEnabled; sendButton.setText(Util.C.buttonRebaseChangeSend()); @@ -51,62 +53,65 @@ public abstract class RebaseDialog extends CommentedActionDialog { // Create the suggestion box to filter over a list of recent changes // open on the same branch. The list of candidates is primed by the // changeParent CheckBox (below) getting enabled by the user. - base = new SuggestBox(new HighlightSuggestOracle() { - @Override - protected void onRequestSuggestions(Request request, Callback done) { - String query = request.getQuery().toLowerCase(); - List suggestions = new ArrayList<>(); - for (ChangeInfo ci : candidateChanges) { - if (changeId.equals(ci.legacyId())) { - continue; // do not suggest current change - } - String id = String.valueOf(ci.legacyId().get()); - if (id.contains(query) || ci.subject().toLowerCase().contains(query)) { - suggestions.add(new ChangeSuggestion(ci)); - if (suggestions.size() >= 50) { // limit to 50 suggestions - break; - } - } - } - done.onSuggestionsReady(request, new Response(suggestions)); - } - }); - base.getElement().setAttribute("placeholder", - Util.C.rebasePlaceholderMessage()); + base = + new SuggestBox( + new HighlightSuggestOracle() { + @Override + protected void onRequestSuggestions(Request request, Callback done) { + String query = request.getQuery().toLowerCase(); + List suggestions = new ArrayList<>(); + for (ChangeInfo ci : candidateChanges) { + if (changeId.equals(ci.legacyId())) { + continue; // do not suggest current change + } + String id = String.valueOf(ci.legacyId().get()); + if (id.contains(query) || ci.subject().toLowerCase().contains(query)) { + suggestions.add(new ChangeSuggestion(ci)); + if (suggestions.size() >= 50) { // limit to 50 suggestions + break; + } + } + } + done.onSuggestionsReady(request, new Response(suggestions)); + } + }); + base.getElement().setAttribute("placeholder", Util.C.rebasePlaceholderMessage()); base.setStyleName(Gerrit.RESOURCES.css().rebaseSuggestBox()); // The changeParent checkbox must be clicked to load into browser memory // a list of open changes from the same project and same branch that this // change may rebase onto. changeParent = new CheckBox(Util.C.rebaseConfirmMessage()); - changeParent.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - if (changeParent.getValue()) { - ChangeList.query( - PageLinks.projectQuery(new Project.NameKey(project)) - + " " + PageLinks.op("branch", branch) - + " is:open -age:90d", - Collections. emptySet(), - new GerritCallback() { - @Override - public void onSuccess(ChangeList result) { - candidateChanges = Natives.asList(result); - updateControls(true); - } + changeParent.addClickHandler( + new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + if (changeParent.getValue()) { + ChangeList.query( + PageLinks.projectQuery(new Project.NameKey(project)) + + " " + + PageLinks.op("branch", branch) + + " is:open -age:90d", + Collections.emptySet(), + new GerritCallback() { + @Override + public void onSuccess(ChangeList result) { + candidateChanges = Natives.asList(result); + updateControls(true); + } - @Override - public void onFailure(Throwable err) { - updateControls(false); - changeParent.setValue(false); - super.onFailure(err); - } - }); - } else { - updateControls(false); - } - } - }); + @Override + public void onFailure(Throwable err) { + updateControls(false); + changeParent.setValue(false); + super.onFailure(err); + } + }); + } else { + updateControls(false); + } + } + }); // add the checkbox and suggestbox widgets to the content panel contentPanel.add(changeParent); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/RemoteSuggestBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/RemoteSuggestBox.java index 57cd849508..5d741cfa22 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/RemoteSuggestBox.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/RemoteSuggestBox.java @@ -34,8 +34,11 @@ import com.google.gwt.user.client.ui.SuggestOracle; import com.google.gwt.user.client.ui.SuggestOracle.Suggestion; import com.google.gwt.user.client.ui.TextBoxBase; -public class RemoteSuggestBox extends Composite implements Focusable, HasText, - HasSelectionHandlers, HasCloseHandlers { +public class RemoteSuggestBox extends Composite + implements Focusable, + HasText, + HasSelectionHandlers, + HasCloseHandlers { private final RemoteSuggestOracle remoteSuggestOracle; private final DefaultSuggestionDisplay display; private final HintTextBox textBox; @@ -48,37 +51,39 @@ public class RemoteSuggestBox extends Composite implements Focusable, HasText, display = new DefaultSuggestionDisplay(); textBox = new HintTextBox(); - textBox.addKeyDownHandler(new KeyDownHandler() { - @Override - public void onKeyDown(KeyDownEvent e) { - submitOnSelection = false; - if (e.getNativeKeyCode() == KeyCodes.KEY_ESCAPE) { - CloseEvent.fire(RemoteSuggestBox.this, RemoteSuggestBox.this); - } else if (e.getNativeKeyCode() == KeyCodes.KEY_ENTER) { - if (display.isSuggestionListShowing()) { - if (textBox.getValue().equals(remoteSuggestOracle.getLast())) { - submitOnSelection = true; - } else { - display.hideSuggestions(); + textBox.addKeyDownHandler( + new KeyDownHandler() { + @Override + public void onKeyDown(KeyDownEvent e) { + submitOnSelection = false; + if (e.getNativeKeyCode() == KeyCodes.KEY_ESCAPE) { + CloseEvent.fire(RemoteSuggestBox.this, RemoteSuggestBox.this); + } else if (e.getNativeKeyCode() == KeyCodes.KEY_ENTER) { + if (display.isSuggestionListShowing()) { + if (textBox.getValue().equals(remoteSuggestOracle.getLast())) { + submitOnSelection = true; + } else { + display.hideSuggestions(); + } + } else { + SelectionEvent.fire(RemoteSuggestBox.this, getText()); + } } - } else { - SelectionEvent.fire(RemoteSuggestBox.this, getText()); } - } - } - }); + }); suggestBox = new SuggestBox(remoteSuggestOracle, textBox, display); - suggestBox.addSelectionHandler(new SelectionHandler() { - @Override - public void onSelection(SelectionEvent event) { - if (submitOnSelection) { - SelectionEvent.fire(RemoteSuggestBox.this, getText()); - } - remoteSuggestOracle.cancelOutstandingRequest(); - display.hideSuggestions(); - } - }); + suggestBox.addSelectionHandler( + new SelectionHandler() { + @Override + public void onSelection(SelectionEvent event) { + if (submitOnSelection) { + SelectionEvent.fire(RemoteSuggestBox.this, getText()); + } + remoteSuggestOracle.cancelOutstandingRequest(); + display.hideSuggestions(); + } + }); initWidget(suggestBox); } @@ -143,14 +148,15 @@ public class RemoteSuggestBox extends Composite implements Focusable, HasText, } public void enableDefaultSuggestions() { - textBox.addFocusHandler(new FocusHandler() { - @Override - public void onFocus(FocusEvent focusEvent) { - if (textBox.getText().equals("")) { - suggestBox.showSuggestionList(); - } - } - }); + textBox.addFocusHandler( + new FocusHandler() { + @Override + public void onFocus(FocusEvent focusEvent) { + if (textBox.getText().equals("")) { + suggestBox.showSuggestionList(); + } + } + }); } public void setServeSuggestionsOnOracle(boolean serveSuggestions) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/Screen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/Screen.java index 1068b3ec42..b0ee915338 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/Screen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/Screen.java @@ -24,15 +24,13 @@ import com.google.gwt.user.client.ui.Widget; import com.google.gwtexpui.user.client.View; /** - * A Screen layout with a header and a body. - * - * The header is mainly a text title, but it can be decorated - * in the West, the East, and the FarEast by any Widget. The - * West and East decorations will surround the text on the - * left and right respectively, and the FarEast will be right - * justified to the right edge of the screen. The East - * decoration will expand to take up any extra space. - */ + * A Screen layout with a header and a body. + * + *

The header is mainly a text title, but it can be decorated in the West, the East, and the + * FarEast by any Widget. The West and East decorations will surround the text on the left and right + * respectively, and the FarEast will be right justified to the right edge of the screen. The East + * decoration will expand to take up any extra space. + */ public abstract class Screen extends View { private Grid header; private InlineLabel headerText; @@ -67,11 +65,13 @@ public abstract class Screen extends View { } } - public void registerKeys() { - } + public void registerKeys() {} private enum Cols { - West, Title, East, FarEast + West, + Title, + East, + FarEast } protected void onInitUI() { @@ -89,8 +89,9 @@ public abstract class Screen extends View { header.setWidget(0, Cols.Title.ordinal(), title); header.setStyleName(Gerrit.RESOURCES.css().screenHeader()); - header.getCellFormatter().setHorizontalAlignment(0, Cols.FarEast.ordinal(), - HasHorizontalAlignment.ALIGN_RIGHT); + header + .getCellFormatter() + .setHorizontalAlignment(0, Cols.FarEast.ordinal(), HasHorizontalAlignment.ALIGN_RIGHT); // force FarEast all the way to the right header.getCellFormatter().setWidth(0, Cols.FarEast.ordinal(), "100%"); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/SuggestAfterTypingNCharsOracle.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/SuggestAfterTypingNCharsOracle.java index cab29dac5c..e24f347c0a 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/SuggestAfterTypingNCharsOracle.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/SuggestAfterTypingNCharsOracle.java @@ -16,21 +16,19 @@ package com.google.gerrit.client.ui; import com.google.gerrit.client.Gerrit; import com.google.gwtexpui.safehtml.client.HighlightSuggestOracle; - import java.util.Collections; import java.util.List; /** - * Suggest oracle that only provides suggestions if the user has typed at least - * as many characters as configured by 'suggest.from'. If 'suggest.from' is set - * to 0, suggestions will always be provided. + * Suggest oracle that only provides suggestions if the user has typed at least as many characters + * as configured by 'suggest.from'. If 'suggest.from' is set to 0, suggestions will always be + * provided. */ public abstract class SuggestAfterTypingNCharsOracle extends HighlightSuggestOracle { @Override protected void onRequestSuggestions(Request req, Callback cb) { - if (req.getQuery() != null - && req.getQuery().length() >= Gerrit.info().suggest().from()) { + if (req.getQuery() != null && req.getQuery().length() >= Gerrit.info().suggest().from()) { _onRequestSuggestions(req, cb); } else { List none = Collections.emptyList(); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/UIConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/UIConstants.java index a220ea044f..32bb7964f8 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/UIConstants.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/UIConstants.java @@ -18,16 +18,24 @@ import com.google.gwt.i18n.client.Constants; public interface UIConstants extends Constants { String commentedActionButtonSend(); + String commentedActionButtonCancel(); String projectName(); + String projectDescription(); + String projectItemHelp(); + String projectStateAbbrev(); + String projectStateHelp(); String dialogCreateChangeTitle(); + String dialogCreateChangeHeading(); + String newChangeBranchSuggestion(); + String newChangeTopicSuggestion(); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/UIMessages.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/UIMessages.java index fcb846f49b..af1739050c 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/UIMessages.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/UIMessages.java @@ -18,6 +18,8 @@ import com.google.gwt.i18n.client.Messages; public interface UIMessages extends Messages { String helpListOpen(String item); + String helpListPrev(String item); + String helpListNext(String item); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/UserActivityMonitor.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/UserActivityMonitor.java index 6e754a2352..2b76b9b44d 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/UserActivityMonitor.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/UserActivityMonitor.java @@ -36,15 +36,14 @@ public class UserActivityMonitor { private static final MonitorImpl impl; /** - * @return true if there has been keyboard and/or mouse activity in recent - * enough history to believe a user is still controlling this session. + * @return true if there has been keyboard and/or mouse activity in recent enough history to + * believe a user is still controlling this session. */ public static boolean isActive() { return impl.active || impl.recent; } - public static HandlerRegistration addValueChangeHandler( - ValueChangeHandler handler) { + public static HandlerRegistration addValueChangeHandler(ValueChangeHandler handler) { return impl.addValueChangeHandler(handler); } @@ -56,12 +55,14 @@ public class UserActivityMonitor { Scheduler.get().scheduleFixedDelay(impl, 60 * 1000); } - private UserActivityMonitor() { - } + private UserActivityMonitor() {} - private static class MonitorImpl implements RepeatingCommand, - KeyPressHandler, MouseMoveHandler, ValueChangeHandler, - HasValueChangeHandlers { + private static class MonitorImpl + implements RepeatingCommand, + KeyPressHandler, + MouseMoveHandler, + ValueChangeHandler, + HasValueChangeHandlers { private final EventBus bus = new SimpleEventBus(); private boolean recent = true; private boolean active = true; @@ -100,8 +101,7 @@ public class UserActivityMonitor { } @Override - public HandlerRegistration addValueChangeHandler( - ValueChangeHandler handler) { + public HandlerRegistration addValueChangeHandler(ValueChangeHandler handler) { return bus.addHandler(ValueChangeEvent.getType(), handler); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/Util.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/Util.java index 804eee1f8a..26026e1474 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/Util.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/Util.java @@ -30,8 +30,7 @@ public class Util { int pos = 0; int endPos = 0; - while ((pos = text.toLowerCase().indexOf( - toHighlight.toLowerCase(), pos)) > -1) { + while ((pos = text.toLowerCase().indexOf(toHighlight.toLowerCase(), pos)) > -1) { if (pos > endPos) { b.append(text.substring(endPos, pos)); } diff --git a/gerrit-gwtui/src/main/java/net/codemirror/addon/AddonInjector.java b/gerrit-gwtui/src/main/java/net/codemirror/addon/AddonInjector.java index efed451479..ce91a46326 100644 --- a/gerrit-gwtui/src/main/java/net/codemirror/addon/AddonInjector.java +++ b/gerrit-gwtui/src/main/java/net/codemirror/addon/AddonInjector.java @@ -16,21 +16,19 @@ package net.codemirror.addon; import com.google.gwt.safehtml.shared.SafeUri; import com.google.gwt.user.client.rpc.AsyncCallback; - -import net.codemirror.lib.Loader; - import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; +import net.codemirror.lib.Loader; public class AddonInjector { private static final Map addonUris = new HashMap<>(); + static { - addonUris.put(Addons.I.merge_bundled().getName(), - Addons.I.merge_bundled().getSafeUri()); + addonUris.put(Addons.I.merge_bundled().getName(), Addons.I.merge_bundled().getSafeUri()); } public static SafeUri getAddonScriptUri(String addon) { @@ -51,9 +49,8 @@ public class AddonInjector { } if (!canLoad(name)) { - Logger.getLogger("net.codemirror").log( - Level.WARNING, - "CodeMirror addon " + name + " not configured."); + Logger.getLogger("net.codemirror") + .log(Level.WARNING, "CodeMirror addon " + name + " not configured."); return this; } @@ -74,22 +71,22 @@ public class AddonInjector { private void beginLoading(final String addon) { pending++; Loader.injectScript( - getAddonScriptUri(addon), - new AsyncCallback() { - @Override - public void onSuccess(Void result) { - pending--; - if (pending == 0) { - appCallback.onSuccess(null); + getAddonScriptUri(addon), + new AsyncCallback() { + @Override + public void onSuccess(Void result) { + pending--; + if (pending == 0) { + appCallback.onSuccess(null); + } } - } - @Override - public void onFailure(Throwable caught) { - if (--pending == 0) { - appCallback.onFailure(caught); + @Override + public void onFailure(Throwable caught) { + if (--pending == 0) { + appCallback.onFailure(caught); + } } - } - }); + }); } } diff --git a/gerrit-gwtui/src/main/java/net/codemirror/addon/Addons.java b/gerrit-gwtui/src/main/java/net/codemirror/addon/Addons.java index 7c8b3621c4..19a681cb79 100644 --- a/gerrit-gwtui/src/main/java/net/codemirror/addon/Addons.java +++ b/gerrit-gwtui/src/main/java/net/codemirror/addon/Addons.java @@ -22,5 +22,7 @@ import com.google.gwt.resources.client.DataResource.DoNotEmbed; public interface Addons extends ClientBundle { Addons I = GWT.create(Addons.class); - @Source("merge_bundled.js") @DoNotEmbed DataResource merge_bundled(); + @Source("merge_bundled.js") + @DoNotEmbed + DataResource merge_bundled(); } diff --git a/gerrit-gwtui/src/main/java/net/codemirror/lib/BlameConfig.java b/gerrit-gwtui/src/main/java/net/codemirror/lib/BlameConfig.java index 7418795d4c..1e81f83a20 100644 --- a/gerrit-gwtui/src/main/java/net/codemirror/lib/BlameConfig.java +++ b/gerrit-gwtui/src/main/java/net/codemirror/lib/BlameConfig.java @@ -18,6 +18,6 @@ import com.google.gwt.i18n.client.Messages; public interface BlameConfig extends Messages { String shortBlameMsg(String commitId, String date, String author); - String detailedBlameMsg(String commitId, String author, String time, - String msg); + + String detailedBlameMsg(String commitId, String author, String time, String msg); } diff --git a/gerrit-gwtui/src/main/java/net/codemirror/lib/CodeMirror.java b/gerrit-gwtui/src/main/java/net/codemirror/lib/CodeMirror.java index be914f3d73..a84c46414f 100644 --- a/gerrit-gwtui/src/main/java/net/codemirror/lib/CodeMirror.java +++ b/gerrit-gwtui/src/main/java/net/codemirror/lib/CodeMirror.java @@ -23,7 +23,6 @@ import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.resources.client.CssResource; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; - import net.codemirror.lib.TextMarker.FromTo; /** @@ -33,7 +32,7 @@ import net.codemirror.lib.TextMarker.FromTo; */ public class CodeMirror extends JavaScriptObject { public static void preload() { - initLibrary(CallbackGroup. emptyCallback()); + initLibrary(CallbackGroup.emptyCallback()); } public static void initLibrary(AsyncCallback cb) { @@ -42,7 +41,9 @@ public class CodeMirror extends JavaScriptObject { interface Style extends CssResource { String activeLine(); + String showTabs(); + String margin(); } @@ -79,14 +80,16 @@ public class CodeMirror extends JavaScriptObject { public final native String getStringOption(String o) /*-{ return this.getOption(o) }-*/; public final native String getValue() /*-{ return this.getValue() }-*/; + public final native void setValue(String v) /*-{ this.setValue(v) }-*/; public final native int changeGeneration(boolean closeEvent) - /*-{ return this.changeGeneration(closeEvent) }-*/; - public final native boolean isClean(int generation) - /*-{ return this.isClean(generation) }-*/; + /*-{ return this.changeGeneration(closeEvent) }-*/ ; + + public final native boolean isClean(int generation) /*-{ return this.isClean(generation) }-*/; public final native void setWidth(double w) /*-{ this.setSize(w, null) }-*/; + public final native void setHeight(double h) /*-{ this.setSize(null, h) }-*/; public final int getHeight() { @@ -94,20 +97,21 @@ public class CodeMirror extends JavaScriptObject { } public final void adjustHeight(int localHeader) { - int rest = Gerrit.getHeaderFooterHeight() - + localHeader - + 5; // Estimate + int rest = Gerrit.getHeaderFooterHeight() + localHeader + 5; // Estimate setHeight(Window.getClientHeight() - rest); } public final native String getLine(int n) /*-{ return this.getLine(n) }-*/; + public final native double barHeight() /*-{ return this.display.barHeight }-*/; + public final native double barWidth() /*-{ return this.display.barWidth }-*/; + public final native int lastLine() /*-{ return this.lastLine() }-*/; + public final native void refresh() /*-{ this.refresh() }-*/; - public final native TextMarker markText(Pos from, Pos to, - Configuration options) /*-{ + public final native TextMarker markText(Pos from, Pos to, Configuration options) /*-{ return this.markText(from, to, options) }-*/; @@ -130,46 +134,39 @@ public class CodeMirror extends JavaScriptObject { return "wrap"; } }; + abstract String value(); } - public final void addLineClass(int line, LineClassWhere where, - String className) { + public final void addLineClass(int line, LineClassWhere where, String className) { addLineClassNative(line, where.value(), className); } - private native void addLineClassNative(int line, String where, - String lineClass) /*-{ + private native void addLineClassNative(int line, String where, String lineClass) /*-{ this.addLineClass(line, where, lineClass) }-*/; - public final void addLineClass(LineHandle line, LineClassWhere where, - String className) { + public final void addLineClass(LineHandle line, LineClassWhere where, String className) { addLineClassNative(line, where.value(), className); } - private native void addLineClassNative(LineHandle line, String where, - String lineClass) /*-{ + private native void addLineClassNative(LineHandle line, String where, String lineClass) /*-{ this.addLineClass(line, where, lineClass) }-*/; - public final void removeLineClass(int line, LineClassWhere where, - String className) { + public final void removeLineClass(int line, LineClassWhere where, String className) { removeLineClassNative(line, where.value(), className); } - private native void removeLineClassNative(int line, String where, - String lineClass) /*-{ + private native void removeLineClassNative(int line, String where, String lineClass) /*-{ this.removeLineClass(line, where, lineClass) }-*/; - public final void removeLineClass(LineHandle line, LineClassWhere where, - String className) { + public final void removeLineClass(LineHandle line, LineClassWhere where, String className) { removeLineClassNative(line, where.value(), className); } - private native void removeLineClassNative(LineHandle line, String where, - String lineClass) /*-{ + private native void removeLineClassNative(LineHandle line, String where, String lineClass) /*-{ this.removeLineClass(line, where, lineClass) }-*/; @@ -177,8 +174,7 @@ public class CodeMirror extends JavaScriptObject { this.addWidget(pos, node, false) }-*/; - public final native LineWidget addLineWidget(int line, Element node, - Configuration options) /*-{ + public final native LineWidget addLineWidget(int line, Element node, Configuration options) /*-{ return this.addLineWidget(line, node, options) }-*/; @@ -291,7 +287,9 @@ public class CodeMirror extends JavaScriptObject { }-*/; public final native void setCursor(Pos p) /*-{ this.setCursor(p) }-*/; + public final native Pos getCursor() /*-{ return this.getCursor() }-*/; + public final native Pos getCursor(String start) /*-{ return this.getCursor(start) }-*/; @@ -301,6 +299,7 @@ public class CodeMirror extends JavaScriptObject { } public final native void setSelection(Pos p) /*-{ this.setSelection(p) }-*/; + public final native void setSelection(Pos anchor, Pos head) /*-{ this.setSelection(anchor, head) }-*/; @@ -310,6 +309,7 @@ public class CodeMirror extends JavaScriptObject { }-*/; public final native void addKeyMap(KeyMap map) /*-{ this.addKeyMap(map) }-*/; + public final native void removeKeyMap(KeyMap map) /*-{ this.removeKeyMap(map) }-*/; public final native LineHandle getLineHandle(int line) /*-{ @@ -391,7 +391,8 @@ public class CodeMirror extends JavaScriptObject { return this.setGutterMarker(line, gutterId, value); }-*/; - public final native LineHandle setGutterMarker(LineHandle line, String gutterId, Element value) /*-{ + public final native LineHandle setGutterMarker( + LineHandle line, String gutterId, Element value) /*-{ return this.setGutterMarker(line, gutterId, value); }-*/; @@ -399,28 +400,26 @@ public class CodeMirror extends JavaScriptObject { return this.state.search && !!this.state.search.query; }-*/; - protected CodeMirror() { - } + protected CodeMirror() {} public static class Viewport extends JavaScriptObject { public final native int from() /*-{ return this.from }-*/; + public final native int to() /*-{ return this.to }-*/; + public final boolean contains(int line) { return from() <= line && line < to(); } - protected Viewport() { - } + protected Viewport() {} } public static class LineHandle extends JavaScriptObject { - protected LineHandle(){ - } + protected LineHandle() {} } public static class RegisteredHandler extends JavaScriptObject { - protected RegisteredHandler() { - } + protected RegisteredHandler() {} } public interface EventHandler { @@ -432,8 +431,7 @@ public class CodeMirror extends JavaScriptObject { } public interface GutterClickHandler { - void handle(CodeMirror instance, int line, String gutter, - NativeEvent clickEvent); + void handle(CodeMirror instance, int line, String gutter, NativeEvent clickEvent); } public interface BeforeSelectionChangeHandler { diff --git a/gerrit-gwtui/src/main/java/net/codemirror/lib/CodeMirrorDoc.java b/gerrit-gwtui/src/main/java/net/codemirror/lib/CodeMirrorDoc.java index d04cc24981..be1af05503 100644 --- a/gerrit-gwtui/src/main/java/net/codemirror/lib/CodeMirrorDoc.java +++ b/gerrit-gwtui/src/main/java/net/codemirror/lib/CodeMirrorDoc.java @@ -19,8 +19,7 @@ import com.google.gwt.core.client.JavaScriptObject; /** The Doc object representing the content in a CodeMirror */ public class CodeMirrorDoc extends JavaScriptObject { - public final native void replaceRange(String replacement, - Pos from, Pos to) /*-{ + public final native void replaceRange(String replacement, Pos from, Pos to) /*-{ this.replaceRange(replacement, from, to); }-*/; @@ -28,6 +27,5 @@ public class CodeMirrorDoc extends JavaScriptObject { this.replaceRange(insertion, at); }-*/; - protected CodeMirrorDoc() { - } + protected CodeMirrorDoc() {} } diff --git a/gerrit-gwtui/src/main/java/net/codemirror/lib/Configuration.java b/gerrit-gwtui/src/main/java/net/codemirror/lib/Configuration.java index 7a0bbeae4b..d37b70b1d8 100644 --- a/gerrit-gwtui/src/main/java/net/codemirror/lib/Configuration.java +++ b/gerrit-gwtui/src/main/java/net/codemirror/lib/Configuration.java @@ -28,20 +28,19 @@ public class Configuration extends JavaScriptObject { } public final native Configuration set(String name, String val) - /*-{ this[name] = val; return this; }-*/; + /*-{ this[name] = val; return this; }-*/ ; public final native Configuration set(String name, int val) - /*-{ this[name] = val; return this; }-*/; + /*-{ this[name] = val; return this; }-*/ ; public final native Configuration set(String name, double val) - /*-{ this[name] = val; return this; }-*/; + /*-{ this[name] = val; return this; }-*/ ; public final native Configuration set(String name, boolean val) - /*-{ this[name] = val; return this; }-*/; + /*-{ this[name] = val; return this; }-*/ ; public final native Configuration set(String name, JavaScriptObject val) - /*-{ this[name] = val; return this; }-*/; + /*-{ this[name] = val; return this; }-*/ ; - protected Configuration() { - } + protected Configuration() {} } diff --git a/gerrit-gwtui/src/main/java/net/codemirror/lib/Extras.java b/gerrit-gwtui/src/main/java/net/codemirror/lib/Extras.java index d727e24663..a5af703775 100644 --- a/gerrit-gwtui/src/main/java/net/codemirror/lib/Extras.java +++ b/gerrit-gwtui/src/main/java/net/codemirror/lib/Extras.java @@ -16,8 +16,8 @@ package net.codemirror.lib; import static com.google.gwt.dom.client.Style.Display.INLINE_BLOCK; import static com.google.gwt.dom.client.Style.Unit.PX; -import static net.codemirror.lib.CodeMirror.style; import static net.codemirror.lib.CodeMirror.LineClassWhere.WRAP; +import static net.codemirror.lib.CodeMirror.style; import com.google.gerrit.client.FormatUtil; import com.google.gerrit.client.RangeInfo; @@ -31,11 +31,9 @@ import com.google.gwt.core.client.JsArrayString; import com.google.gwt.dom.client.Element; import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.user.client.DOM; - -import net.codemirror.lib.CodeMirror.LineHandle; - import java.util.Date; import java.util.Objects; +import net.codemirror.lib.CodeMirror.LineHandle; /** Additional features added to CodeMirror by Gerrit Code Review. */ public class Extras { @@ -43,8 +41,8 @@ public class Extras { private static final BlameConfig C = GWT.create(BlameConfig.class); static final native Extras get(CodeMirror c) /*-{ return c.gerritExtras }-*/; - private static native void set(CodeMirror c, Extras e) - /*-{ c.gerritExtras = e }-*/; + + private static native void set(CodeMirror c, Extras e) /*-{ c.gerritExtras = e }-*/; static void attach(CodeMirror c) { set(c, new Extras(c)); @@ -172,21 +170,23 @@ public class Extras { gutters.push(ANNOTATION_GUTTER_ID); cm.setOption("gutters", gutters); annotated = true; - DateTimeFormat format = DateTimeFormat.getFormat( - DateTimeFormat.PredefinedFormat.DATE_SHORT); + DateTimeFormat format = DateTimeFormat.getFormat(DateTimeFormat.PredefinedFormat.DATE_SHORT); JsArray annotations = JsArray.createArray().cast(); for (BlameInfo blameInfo : Natives.asList(blameInfos)) { for (RangeInfo range : Natives.asList(blameInfo.ranges())) { Date commitTime = new Date(blameInfo.time() * 1000L); String shortId = blameInfo.id().substring(0, 8); - String shortBlame = C.shortBlameMsg( - shortId, format.format(commitTime), blameInfo.author()); - String detailedBlame = C.detailedBlameMsg(blameInfo.id(), - blameInfo.author(), FormatUtil.mediumFormat(commitTime), - blameInfo.commitMsg()); + String shortBlame = + C.shortBlameMsg(shortId, format.format(commitTime), blameInfo.author()); + String detailedBlame = + C.detailedBlameMsg( + blameInfo.id(), + blameInfo.author(), + FormatUtil.mediumFormat(commitTime), + blameInfo.commitMsg()); - annotations.push(LintLine.create(shortBlame, detailedBlame, shortId, - Pos.create(range.start() - 1))); + annotations.push( + LintLine.create(shortBlame, detailedBlame, shortId, Pos.create(range.start() - 1))); } } cm.setOption("lint", getAnnotation(annotations)); diff --git a/gerrit-gwtui/src/main/java/net/codemirror/lib/KeyMap.java b/gerrit-gwtui/src/main/java/net/codemirror/lib/KeyMap.java index 946b44f196..be1852fc46 100644 --- a/gerrit-gwtui/src/main/java/net/codemirror/lib/KeyMap.java +++ b/gerrit-gwtui/src/main/java/net/codemirror/lib/KeyMap.java @@ -39,6 +39,5 @@ public class KeyMap extends JavaScriptObject { return this; }-*/; - protected KeyMap() { - } + protected KeyMap() {} } diff --git a/gerrit-gwtui/src/main/java/net/codemirror/lib/LineWidget.java b/gerrit-gwtui/src/main/java/net/codemirror/lib/LineWidget.java index 62c219b24c..4a15fd38f4 100644 --- a/gerrit-gwtui/src/main/java/net/codemirror/lib/LineWidget.java +++ b/gerrit-gwtui/src/main/java/net/codemirror/lib/LineWidget.java @@ -19,6 +19,7 @@ import com.google.gwt.core.client.JavaScriptObject; /** LineWidget objects used within CodeMirror. */ public class LineWidget extends JavaScriptObject { public final native void clear() /*-{ this.clear() }-*/; + public final native void changed() /*-{ this.changed() }-*/; public final native void onRedraw(Runnable thunk) /*-{ @@ -36,6 +37,5 @@ public class LineWidget extends JavaScriptObject { w.on("redraw", h); }-*/; - protected LineWidget() { - } + protected LineWidget() {} } diff --git a/gerrit-gwtui/src/main/java/net/codemirror/lib/LintLine.java b/gerrit-gwtui/src/main/java/net/codemirror/lib/LintLine.java index b1e20c1adf..b0b2ae0bbb 100644 --- a/gerrit-gwtui/src/main/java/net/codemirror/lib/LintLine.java +++ b/gerrit-gwtui/src/main/java/net/codemirror/lib/LintLine.java @@ -18,19 +18,25 @@ import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.dom.client.StyleInjector; public class LintLine extends JavaScriptObject { - public static LintLine create(String shortMsg, String msg, String sev, - Pos line) { - StyleInjector.inject(".CodeMirror-lint-marker-" + sev + " {\n" - + " visibility: hidden;\n" - + " text-overflow: ellipsis;\n" - + " white-space: nowrap;\n" - + " overflow: hidden;\n" - + " position: relative;\n" - + "}\n" - + ".CodeMirror-lint-marker-" + sev + ":after {\n" - + " content:'" + shortMsg + "';\n" - + " visibility: visible;\n" - + "}"); + public static LintLine create(String shortMsg, String msg, String sev, Pos line) { + StyleInjector.inject( + ".CodeMirror-lint-marker-" + + sev + + " {\n" + + " visibility: hidden;\n" + + " text-overflow: ellipsis;\n" + + " white-space: nowrap;\n" + + " overflow: hidden;\n" + + " position: relative;\n" + + "}\n" + + ".CodeMirror-lint-marker-" + + sev + + ":after {\n" + + " content:'" + + shortMsg + + "';\n" + + " visibility: visible;\n" + + "}"); return create(msg, sev, line, null); } @@ -44,11 +50,14 @@ public class LintLine extends JavaScriptObject { }-*/; public final native String message() /*-{ return this.message; }-*/; + public final native String detailedMessage() /*-{ return this.message; }-*/; + public final native String severity() /*-{ return this.severity; }-*/; + public final native Pos from() /*-{ return this.from; }-*/; + public final native Pos to() /*-{ return this.to; }-*/; - protected LintLine() { - } + protected LintLine() {} } diff --git a/gerrit-gwtui/src/main/java/net/codemirror/lib/Loader.java b/gerrit-gwtui/src/main/java/net/codemirror/lib/Loader.java index 379cb3c966..582a3109a3 100644 --- a/gerrit-gwtui/src/main/java/net/codemirror/lib/Loader.java +++ b/gerrit-gwtui/src/main/java/net/codemirror/lib/Loader.java @@ -27,8 +27,7 @@ import com.google.gwt.safehtml.shared.SafeUri; import com.google.gwt.user.client.rpc.AsyncCallback; public class Loader { - private static native boolean isLibLoaded() - /*-{ return $wnd.hasOwnProperty('CodeMirror'); }-*/; + private static native boolean isLibLoaded() /*-{ return $wnd.hasOwnProperty('CodeMirror'); }-*/; static void initLibrary(final AsyncCallback cb) { if (isLibLoaded()) { @@ -37,37 +36,39 @@ public class Loader { } CallbackGroup group = new CallbackGroup(); - injectCss(Lib.I.css(), group. addEmpty()); - injectScript(Lib.I.js().getSafeUri(), group.add(new AsyncCallback() { - @Override - public void onSuccess(Void result) { - Vim.initKeyMap(); - } + injectCss(Lib.I.css(), group.addEmpty()); + injectScript( + Lib.I.js().getSafeUri(), + group.add( + new AsyncCallback() { + @Override + public void onSuccess(Void result) { + Vim.initKeyMap(); + } - @Override - public void onFailure(Throwable caught) { - } - })); + @Override + public void onFailure(Throwable caught) {} + })); group.addListener(cb); group.done(); } - private static void injectCss(ExternalTextResource css, - final AsyncCallback cb) { + private static void injectCss(ExternalTextResource css, final AsyncCallback cb) { try { - css.getText(new ResourceCallback() { - @Override - public void onSuccess(TextResource resource) { - StyleInjector.inject(resource.getText()); - Lib.I.style().ensureInjected(); - cb.onSuccess(null); - } + css.getText( + new ResourceCallback() { + @Override + public void onSuccess(TextResource resource) { + StyleInjector.inject(resource.getText()); + Lib.I.style().ensureInjected(); + cb.onSuccess(null); + } - @Override - public void onError(ResourceException e) { - cb.onFailure(e); - } - }); + @Override + public void onError(ResourceException e) { + cb.onFailure(e); + } + }); } catch (ResourceException e) { cb.onFailure(e); } @@ -75,24 +76,25 @@ public class Loader { public static void injectScript(SafeUri js, final AsyncCallback callback) { final ScriptElement[] script = new ScriptElement[1]; - script[0] = ScriptInjector.fromUrl(js.asString()) - .setWindow(ScriptInjector.TOP_WINDOW) - .setCallback(new Callback() { - @Override - public void onSuccess(Void result) { - script[0].removeFromParent(); - callback.onSuccess(result); - } + script[0] = + ScriptInjector.fromUrl(js.asString()) + .setWindow(ScriptInjector.TOP_WINDOW) + .setCallback( + new Callback() { + @Override + public void onSuccess(Void result) { + script[0].removeFromParent(); + callback.onSuccess(result); + } - @Override - public void onFailure(Exception reason) { - callback.onFailure(reason); - } - }) - .inject() - .cast(); + @Override + public void onFailure(Exception reason) { + callback.onFailure(reason); + } + }) + .inject() + .cast(); } - private Loader() { - } + private Loader() {} } diff --git a/gerrit-gwtui/src/main/java/net/codemirror/lib/MergeView.java b/gerrit-gwtui/src/main/java/net/codemirror/lib/MergeView.java index d7e1430108..38c3906f7b 100644 --- a/gerrit-gwtui/src/main/java/net/codemirror/lib/MergeView.java +++ b/gerrit-gwtui/src/main/java/net/codemirror/lib/MergeView.java @@ -46,6 +46,5 @@ public class MergeView extends JavaScriptObject { return $doc.getElementsByClassName("CodeMirror-merge-gap")[0]; }-*/; - protected MergeView() { - } + protected MergeView() {} } diff --git a/gerrit-gwtui/src/main/java/net/codemirror/lib/Pos.java b/gerrit-gwtui/src/main/java/net/codemirror/lib/Pos.java index 07ead4372b..7f83b75d22 100644 --- a/gerrit-gwtui/src/main/java/net/codemirror/lib/Pos.java +++ b/gerrit-gwtui/src/main/java/net/codemirror/lib/Pos.java @@ -27,15 +27,16 @@ public class Pos extends JavaScriptObject { }-*/; public final native void line(int l) /*-{ this.line = l }-*/; + public final native void ch(int c) /*-{ this.ch = c }-*/; public final native int line() /*-{ return this.line }-*/; + public final native int ch() /*-{ return this.ch || 0 }-*/; public final boolean equals(Pos o) { return this == o || (line() == o.line() && ch() == o.ch()); } - protected Pos() { - } + protected Pos() {} } diff --git a/gerrit-gwtui/src/main/java/net/codemirror/lib/Rect.java b/gerrit-gwtui/src/main/java/net/codemirror/lib/Rect.java index 5691d9f298..1114403173 100644 --- a/gerrit-gwtui/src/main/java/net/codemirror/lib/Rect.java +++ b/gerrit-gwtui/src/main/java/net/codemirror/lib/Rect.java @@ -19,10 +19,12 @@ import com.google.gwt.core.client.JavaScriptObject; /** {left, right, top, bottom} objects used within CodeMirror. */ public class Rect extends JavaScriptObject { public final native double left() /*-{ return this.left }-*/; + public final native double right() /*-{ return this.right }-*/; + public final native double top() /*-{ return this.top }-*/; + public final native double bottom() /*-{ return this.bottom }-*/; - protected Rect() { - } + protected Rect() {} } diff --git a/gerrit-gwtui/src/main/java/net/codemirror/lib/ScrollInfo.java b/gerrit-gwtui/src/main/java/net/codemirror/lib/ScrollInfo.java index 26235302a5..432a60f089 100644 --- a/gerrit-gwtui/src/main/java/net/codemirror/lib/ScrollInfo.java +++ b/gerrit-gwtui/src/main/java/net/codemirror/lib/ScrollInfo.java @@ -19,20 +19,22 @@ import com.google.gwt.core.client.JavaScriptObject; /** Returned by {@link CodeMirror#getScrollInfo()}. */ public class ScrollInfo extends JavaScriptObject { public final native double left() /*-{ return this.left }-*/; + public final native double top() /*-{ return this.top }-*/; /** - * Pixel height of the full content being scrolled. This may only be an - * estimate given by CodeMirror. Line widgets further down in the document may - * not be measured, so line heights can be incorrect until drawn. + * Pixel height of the full content being scrolled. This may only be an estimate given by + * CodeMirror. Line widgets further down in the document may not be measured, so line heights can + * be incorrect until drawn. */ public final native double height() /*-{ return this.height }-*/; + public final native double width() /*-{ return this.width }-*/; /** Visible height of the viewport, excluding scrollbars. */ public final native double clientHeight() /*-{ return this.clientHeight }-*/; + public final native double clientWidth() /*-{ return this.clientWidth }-*/; - protected ScrollInfo() { - } + protected ScrollInfo() {} } diff --git a/gerrit-gwtui/src/main/java/net/codemirror/lib/TextMarker.java b/gerrit-gwtui/src/main/java/net/codemirror/lib/TextMarker.java index eac8510035..c3d248a2b8 100644 --- a/gerrit-gwtui/src/main/java/net/codemirror/lib/TextMarker.java +++ b/gerrit-gwtui/src/main/java/net/codemirror/lib/TextMarker.java @@ -20,13 +20,15 @@ import com.google.gwt.core.client.JavaScriptObject; /** Object that represents a text marker within CodeMirror */ public class TextMarker extends JavaScriptObject { public final native void clear() /*-{ this.clear(); }-*/; - public final native void changed() /*-{ this.changed(); }-*/; - public final native FromTo find() /*-{ return this.find(); }-*/; - public final native void on(String event, Runnable thunk) - /*-{ this.on(event, function(){$entry(thunk.@java.lang.Runnable::run()())}) }-*/; - protected TextMarker() { - } + public final native void changed() /*-{ this.changed(); }-*/; + + public final native FromTo find() /*-{ return this.find(); }-*/; + + public final native void on(String event, Runnable thunk) + /*-{ this.on(event, function(){$entry(thunk.@java.lang.Runnable::run()())}) }-*/ ; + + protected TextMarker() {} public static class FromTo extends JavaScriptObject { public static final native FromTo create(Pos f, Pos t) /*-{ @@ -40,12 +42,13 @@ public class TextMarker extends JavaScriptObject { } public final native Pos from() /*-{ return this.from }-*/; + public final native Pos to() /*-{ return this.to }-*/; public final native void from(Pos f) /*-{ this.from = f }-*/; + public final native void to(Pos t) /*-{ this.to = t }-*/; - protected FromTo() { - } + protected FromTo() {} } } diff --git a/gerrit-gwtui/src/main/java/net/codemirror/lib/Vim.java b/gerrit-gwtui/src/main/java/net/codemirror/lib/Vim.java index 84b4a6a766..06016ef008 100644 --- a/gerrit-gwtui/src/main/java/net/codemirror/lib/Vim.java +++ b/gerrit-gwtui/src/main/java/net/codemirror/lib/Vim.java @@ -19,9 +19,8 @@ import com.google.gwt.core.client.JavaScriptObject; /** * Glue around the Vim emulation for {@link CodeMirror}. * - * As an instance {@code this} is actually the {@link CodeMirror} object. Class - * Vim is providing a new namespace for Vim related methods that are associated - * with an editor. + *

As an instance {@code this} is actually the {@link CodeMirror} object. Class Vim is providing + * a new namespace for Vim related methods that are associated with an editor. */ public class Vim extends JavaScriptObject { static void initKeyMap() { @@ -30,9 +29,10 @@ public class Vim extends JavaScriptObject { km.propagate(key); km.propagate("'" + key.toLowerCase() + "'"); } - for (String key : new String[] { - "Ctrl-C", "Ctrl-O", "Ctrl-P", "Ctrl-S", - "Ctrl-F", "Ctrl-B", "Ctrl-R",}) { + for (String key : + new String[] { + "Ctrl-C", "Ctrl-O", "Ctrl-P", "Ctrl-S", "Ctrl-F", "Ctrl-B", "Ctrl-R", + }) { km.propagate(key); } for (int i = 0; i <= 9; i++) { @@ -66,6 +66,5 @@ public class Vim extends JavaScriptObject { return v && v.searchState_ && !!v.searchState_.getOverlay(); }-*/; - protected Vim() { - } + protected Vim() {} } diff --git a/gerrit-gwtui/src/main/java/net/codemirror/mode/ModeInfo.java b/gerrit-gwtui/src/main/java/net/codemirror/mode/ModeInfo.java index 3d99883196..c6f113ede6 100644 --- a/gerrit-gwtui/src/main/java/net/codemirror/mode/ModeInfo.java +++ b/gerrit-gwtui/src/main/java/net/codemirror/mode/ModeInfo.java @@ -21,7 +21,6 @@ import com.google.gwt.core.client.JsArray; import com.google.gwt.core.client.JsArrayString; import com.google.gwt.resources.client.DataResource; import com.google.gwt.safehtml.shared.SafeUri; - import java.util.Collections; import java.util.Comparator; import java.util.HashMap; @@ -36,127 +35,128 @@ public class ModeInfo extends JavaScriptObject { private static final Map modeUris = new HashMap<>(); static { - indexModes(new DataResource[] { - Modes.I.apl(), - Modes.I.asciiarmor(), - Modes.I.asn_1(), - Modes.I.asterisk(), - Modes.I.brainfuck(), - Modes.I.clike(), - Modes.I.clojure(), - Modes.I.cmake(), - Modes.I.cobol(), - Modes.I.coffeescript(), - Modes.I.commonlisp(), - Modes.I.crystal(), - Modes.I.css(), - Modes.I.cypher(), - Modes.I.d(), - Modes.I.dart(), - Modes.I.diff(), - Modes.I.django(), - Modes.I.dockerfile(), - Modes.I.dtd(), - Modes.I.dylan(), - Modes.I.ebnf(), - Modes.I.ecl(), - Modes.I.eiffel(), - Modes.I.elm(), - Modes.I.erlang(), - Modes.I.factor(), - Modes.I.fcl(), - Modes.I.forth(), - Modes.I.fortran(), - Modes.I.gas(), - Modes.I.gerrit_commit(), - Modes.I.gfm(), - Modes.I.gherkin(), - Modes.I.go(), - Modes.I.groovy(), - Modes.I.haml(), - Modes.I.handlebars(), - Modes.I.haskell_literate(), - Modes.I.haskell(), - Modes.I.haxe(), - Modes.I.htmlembedded(), - Modes.I.htmlmixed(), - Modes.I.http(), - Modes.I.idl(), - Modes.I.javascript(), - Modes.I.jinja2(), - Modes.I.jsx(), - Modes.I.julia(), - Modes.I.livescript(), - Modes.I.lua(), - Modes.I.markdown(), - Modes.I.mathematica(), - Modes.I.mbox(), - Modes.I.mirc(), - Modes.I.mllike(), - Modes.I.modelica(), - Modes.I.mscgen(), - Modes.I.mumps(), - Modes.I.nginx(), - Modes.I.nsis(), - Modes.I.ntriples(), - Modes.I.octave(), - Modes.I.oz(), - Modes.I.pascal(), - Modes.I.pegjs(), - Modes.I.perl(), - Modes.I.php(), - Modes.I.pig(), - Modes.I.powershell(), - Modes.I.properties(), - Modes.I.protobuf(), - Modes.I.pug(), - Modes.I.puppet(), - Modes.I.python(), - Modes.I.q(), - Modes.I.r(), - Modes.I.rpm(), - Modes.I.rst(), - Modes.I.ruby(), - Modes.I.rust(), - Modes.I.sas(), - Modes.I.sass(), - Modes.I.scheme(), - Modes.I.shell(), - Modes.I.smalltalk(), - Modes.I.smarty(), - Modes.I.solr(), - Modes.I.soy(), - Modes.I.sparql(), - Modes.I.spreadsheet(), - Modes.I.sql(), - Modes.I.stex(), - Modes.I.stylus(), - Modes.I.swift(), - Modes.I.tcl(), - Modes.I.textile(), - Modes.I.tiddlywiki(), - Modes.I.tiki(), - Modes.I.toml(), - Modes.I.tornado(), - Modes.I.troff(), - Modes.I.ttcn_cfg(), - Modes.I.ttcn(), - Modes.I.turtle(), - Modes.I.twig(), - Modes.I.vb(), - Modes.I.vbscript(), - Modes.I.velocity(), - Modes.I.verilog(), - Modes.I.vhdl(), - Modes.I.vue(), - Modes.I.webidl(), - Modes.I.xml(), - Modes.I.xquery(), - Modes.I.yacas(), - Modes.I.yaml_frontmatter(), - Modes.I.yaml(), - Modes.I.z80(), - }); + indexModes( + new DataResource[] { + Modes.I.apl(), + Modes.I.asciiarmor(), + Modes.I.asn_1(), + Modes.I.asterisk(), + Modes.I.brainfuck(), + Modes.I.clike(), + Modes.I.clojure(), + Modes.I.cmake(), + Modes.I.cobol(), + Modes.I.coffeescript(), + Modes.I.commonlisp(), + Modes.I.crystal(), + Modes.I.css(), + Modes.I.cypher(), + Modes.I.d(), + Modes.I.dart(), + Modes.I.diff(), + Modes.I.django(), + Modes.I.dockerfile(), + Modes.I.dtd(), + Modes.I.dylan(), + Modes.I.ebnf(), + Modes.I.ecl(), + Modes.I.eiffel(), + Modes.I.elm(), + Modes.I.erlang(), + Modes.I.factor(), + Modes.I.fcl(), + Modes.I.forth(), + Modes.I.fortran(), + Modes.I.gas(), + Modes.I.gerrit_commit(), + Modes.I.gfm(), + Modes.I.gherkin(), + Modes.I.go(), + Modes.I.groovy(), + Modes.I.haml(), + Modes.I.handlebars(), + Modes.I.haskell_literate(), + Modes.I.haskell(), + Modes.I.haxe(), + Modes.I.htmlembedded(), + Modes.I.htmlmixed(), + Modes.I.http(), + Modes.I.idl(), + Modes.I.javascript(), + Modes.I.jinja2(), + Modes.I.jsx(), + Modes.I.julia(), + Modes.I.livescript(), + Modes.I.lua(), + Modes.I.markdown(), + Modes.I.mathematica(), + Modes.I.mbox(), + Modes.I.mirc(), + Modes.I.mllike(), + Modes.I.modelica(), + Modes.I.mscgen(), + Modes.I.mumps(), + Modes.I.nginx(), + Modes.I.nsis(), + Modes.I.ntriples(), + Modes.I.octave(), + Modes.I.oz(), + Modes.I.pascal(), + Modes.I.pegjs(), + Modes.I.perl(), + Modes.I.php(), + Modes.I.pig(), + Modes.I.powershell(), + Modes.I.properties(), + Modes.I.protobuf(), + Modes.I.pug(), + Modes.I.puppet(), + Modes.I.python(), + Modes.I.q(), + Modes.I.r(), + Modes.I.rpm(), + Modes.I.rst(), + Modes.I.ruby(), + Modes.I.rust(), + Modes.I.sas(), + Modes.I.sass(), + Modes.I.scheme(), + Modes.I.shell(), + Modes.I.smalltalk(), + Modes.I.smarty(), + Modes.I.solr(), + Modes.I.soy(), + Modes.I.sparql(), + Modes.I.spreadsheet(), + Modes.I.sql(), + Modes.I.stex(), + Modes.I.stylus(), + Modes.I.swift(), + Modes.I.tcl(), + Modes.I.textile(), + Modes.I.tiddlywiki(), + Modes.I.tiki(), + Modes.I.toml(), + Modes.I.tornado(), + Modes.I.troff(), + Modes.I.ttcn_cfg(), + Modes.I.ttcn(), + Modes.I.turtle(), + Modes.I.twig(), + Modes.I.vb(), + Modes.I.vbscript(), + Modes.I.velocity(), + Modes.I.verilog(), + Modes.I.vhdl(), + Modes.I.vue(), + Modes.I.webidl(), + Modes.I.xml(), + Modes.I.xquery(), + Modes.I.yacas(), + Modes.I.yaml_frontmatter(), + Modes.I.yaml(), + Modes.I.z80(), + }); alias("application/x-httpd-php-open", "application/x-httpd-php"); alias("application/x-javascript", "application/javascript"); @@ -242,12 +242,14 @@ public class ModeInfo extends JavaScriptObject { byMime.put(m.mode(), m); } } - Collections.sort(Natives.asList(filtered), new Comparator() { - @Override - public int compare(ModeInfo a, ModeInfo b) { - return a.name().toLowerCase().compareTo(b.name().toLowerCase()); - } - }); + Collections.sort( + Natives.asList(filtered), + new Comparator() { + @Override + public int compare(ModeInfo a, ModeInfo b) { + return a.name().toLowerCase().compareTo(b.name().toLowerCase()); + } + }); setAll(filtered); } @@ -261,14 +263,11 @@ public class ModeInfo extends JavaScriptObject { public final native String mime() /*-{ return this.mime }-*/; /** Primary and additional MIME types that activate this mode. */ - public final native JsArrayString mimes() - /*-{ return this.mimes || [this.mime] }-*/; + public final native JsArrayString mimes() /*-{ return this.mimes || [this.mime] }-*/; - private native JsArrayString ext() - /*-{ return this.ext || [] }-*/; + private native JsArrayString ext() /*-{ return this.ext || [] }-*/; - protected ModeInfo() { - } + protected ModeInfo() {} private static native ModeInfo gerrit_commit() /*-{ return {name: "Git Commit Message", diff --git a/gerrit-gwtui/src/main/java/net/codemirror/mode/ModeInjector.java b/gerrit-gwtui/src/main/java/net/codemirror/mode/ModeInjector.java index 2c171ac877..74401024bf 100644 --- a/gerrit-gwtui/src/main/java/net/codemirror/mode/ModeInjector.java +++ b/gerrit-gwtui/src/main/java/net/codemirror/mode/ModeInjector.java @@ -16,13 +16,11 @@ package net.codemirror.mode; import com.google.gwt.core.client.JsArrayString; import com.google.gwt.user.client.rpc.AsyncCallback; - -import net.codemirror.lib.Loader; - import java.util.HashSet; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; +import net.codemirror.lib.Loader; public class ModeInjector { private static boolean canLoad(String mode) { @@ -30,13 +28,13 @@ public class ModeInjector { } private static native boolean isModeLoaded(String n) - /*-{ return $wnd.CodeMirror.modes.hasOwnProperty(n); }-*/; + /*-{ return $wnd.CodeMirror.modes.hasOwnProperty(n); }-*/ ; private static native boolean isMimeLoaded(String n) - /*-{ return $wnd.CodeMirror.mimeModes.hasOwnProperty(n); }-*/; + /*-{ return $wnd.CodeMirror.mimeModes.hasOwnProperty(n); }-*/ ; private static native JsArrayString getDependencies(String n) - /*-{ return $wnd.CodeMirror.modes[n].dependencies || []; }-*/; + /*-{ return $wnd.CodeMirror.modes[n].dependencies || []; }-*/ ; private final Set loading = new HashSet<>(4); private int pending; @@ -53,9 +51,8 @@ public class ModeInjector { } if (!canLoad(name)) { - Logger.getLogger("net.codemirror").log( - Level.WARNING, - "CodeMirror mode " + name + " not configured."); + Logger.getLogger("net.codemirror") + .log(Level.WARNING, "CodeMirror mode " + name + " not configured."); return this; } @@ -76,24 +73,24 @@ public class ModeInjector { private void beginLoading(final String mode) { pending++; Loader.injectScript( - ModeInfo.getModeScriptUri(mode), - new AsyncCallback() { - @Override - public void onSuccess(Void result) { - pending--; - ensureDependenciesAreLoaded(mode); - if (pending == 0) { - appCallback.onSuccess(null); + ModeInfo.getModeScriptUri(mode), + new AsyncCallback() { + @Override + public void onSuccess(Void result) { + pending--; + ensureDependenciesAreLoaded(mode); + if (pending == 0) { + appCallback.onSuccess(null); + } } - } - @Override - public void onFailure(Throwable caught) { - if (--pending == 0) { - appCallback.onFailure(caught); + @Override + public void onFailure(Throwable caught) { + if (--pending == 0) { + appCallback.onFailure(caught); + } } - } - }); + }); } private void ensureDependenciesAreLoaded(String mode) { @@ -105,9 +102,8 @@ public class ModeInjector { } if (!canLoad(d)) { - Logger.getLogger("net.codemirror").log( - Level.SEVERE, - "CodeMirror mode " + d + " needs " + d); + Logger.getLogger("net.codemirror") + .log(Level.SEVERE, "CodeMirror mode " + d + " needs " + d); continue; } diff --git a/gerrit-gwtui/src/main/java/net/codemirror/mode/Modes.java b/gerrit-gwtui/src/main/java/net/codemirror/mode/Modes.java index 218b96c239..2b87a347f6 100644 --- a/gerrit-gwtui/src/main/java/net/codemirror/mode/Modes.java +++ b/gerrit-gwtui/src/main/java/net/codemirror/mode/Modes.java @@ -22,127 +22,489 @@ import com.google.gwt.resources.client.DataResource.DoNotEmbed; public interface Modes extends ClientBundle { Modes I = GWT.create(Modes.class); - @Source("apl.js") @DoNotEmbed DataResource apl(); - @Source("asciiarmor.js") @DoNotEmbed DataResource asciiarmor(); - @Source("asn.1.js") @DoNotEmbed DataResource asn_1(); - @Source("asterisk.js") @DoNotEmbed DataResource asterisk(); - @Source("brainfuck.js") @DoNotEmbed DataResource brainfuck(); - @Source("clike.js") @DoNotEmbed DataResource clike(); - @Source("clojure.js") @DoNotEmbed DataResource clojure(); - @Source("cmake.js") @DoNotEmbed DataResource cmake(); - @Source("cobol.js") @DoNotEmbed DataResource cobol(); - @Source("coffeescript.js") @DoNotEmbed DataResource coffeescript(); - @Source("commonlisp.js") @DoNotEmbed DataResource commonlisp(); - @Source("crystal.js") @DoNotEmbed DataResource crystal(); - @Source("css.js") @DoNotEmbed DataResource css(); - @Source("cypher.js") @DoNotEmbed DataResource cypher(); - @Source("d.js") @DoNotEmbed DataResource d(); - @Source("dart.js") @DoNotEmbed DataResource dart(); - @Source("diff.js") @DoNotEmbed DataResource diff(); - @Source("django.js") @DoNotEmbed DataResource django(); - @Source("dockerfile.js") @DoNotEmbed DataResource dockerfile(); - @Source("dtd.js") @DoNotEmbed DataResource dtd(); - @Source("dylan.js") @DoNotEmbed DataResource dylan(); - @Source("ebnf.js") @DoNotEmbed DataResource ebnf(); - @Source("ecl.js") @DoNotEmbed DataResource ecl(); - @Source("eiffel.js") @DoNotEmbed DataResource eiffel(); - @Source("elm.js") @DoNotEmbed DataResource elm(); - @Source("erlang.js") @DoNotEmbed DataResource erlang(); - @Source("factor.js") @DoNotEmbed DataResource factor(); - @Source("fcl.js") @DoNotEmbed DataResource fcl(); - @Source("forth.js") @DoNotEmbed DataResource forth(); - @Source("fortran.js") @DoNotEmbed DataResource fortran(); - @Source("gas.js") @DoNotEmbed DataResource gas(); - @Source("gerrit/commit.js") @DoNotEmbed DataResource gerrit_commit(); - @Source("gfm.js") @DoNotEmbed DataResource gfm(); - @Source("gherkin.js") @DoNotEmbed DataResource gherkin(); - @Source("go.js") @DoNotEmbed DataResource go(); - @Source("groovy.js") @DoNotEmbed DataResource groovy(); - @Source("haml.js") @DoNotEmbed DataResource haml(); - @Source("handlebars.js") @DoNotEmbed DataResource handlebars(); - @Source("haskell-literate.js") @DoNotEmbed DataResource haskell_literate(); - @Source("haskell.js") @DoNotEmbed DataResource haskell(); - @Source("haxe.js") @DoNotEmbed DataResource haxe(); - @Source("htmlembedded.js") @DoNotEmbed DataResource htmlembedded(); - @Source("htmlmixed.js") @DoNotEmbed DataResource htmlmixed(); - @Source("http.js") @DoNotEmbed DataResource http(); - @Source("idl.js") @DoNotEmbed DataResource idl(); - @Source("javascript.js") @DoNotEmbed DataResource javascript(); - @Source("jinja2.js") @DoNotEmbed DataResource jinja2(); - @Source("jsx.js") @DoNotEmbed DataResource jsx(); - @Source("julia.js") @DoNotEmbed DataResource julia(); - @Source("livescript.js") @DoNotEmbed DataResource livescript(); - @Source("lua.js") @DoNotEmbed DataResource lua(); - @Source("markdown.js") @DoNotEmbed DataResource markdown(); - @Source("mathematica.js") @DoNotEmbed DataResource mathematica(); - @Source("mbox.js") @DoNotEmbed DataResource mbox(); - @Source("mirc.js") @DoNotEmbed DataResource mirc(); - @Source("mllike.js") @DoNotEmbed DataResource mllike(); - @Source("modelica.js") @DoNotEmbed DataResource modelica(); - @Source("mscgen.js") @DoNotEmbed DataResource mscgen(); - @Source("mumps.js") @DoNotEmbed DataResource mumps(); - @Source("nginx.js") @DoNotEmbed DataResource nginx(); - @Source("nsis.js") @DoNotEmbed DataResource nsis(); - @Source("ntriples.js") @DoNotEmbed DataResource ntriples(); - @Source("octave.js") @DoNotEmbed DataResource octave(); - @Source("oz.js") @DoNotEmbed DataResource oz(); - @Source("pascal.js") @DoNotEmbed DataResource pascal(); - @Source("pegjs.js") @DoNotEmbed DataResource pegjs(); - @Source("perl.js") @DoNotEmbed DataResource perl(); - @Source("php.js") @DoNotEmbed DataResource php(); - @Source("pig.js") @DoNotEmbed DataResource pig(); - @Source("powershell.js") @DoNotEmbed DataResource powershell(); - @Source("properties.js") @DoNotEmbed DataResource properties(); - @Source("protobuf.js") @DoNotEmbed DataResource protobuf(); - @Source("pug.js") @DoNotEmbed DataResource pug(); - @Source("puppet.js") @DoNotEmbed DataResource puppet(); - @Source("python.js") @DoNotEmbed DataResource python(); - @Source("q.js") @DoNotEmbed DataResource q(); - @Source("r.js") @DoNotEmbed DataResource r(); - @Source("rpm.js") @DoNotEmbed DataResource rpm(); - @Source("rst.js") @DoNotEmbed DataResource rst(); - @Source("ruby.js") @DoNotEmbed DataResource ruby(); - @Source("rust.js") @DoNotEmbed DataResource rust(); - @Source("sas.js") @DoNotEmbed DataResource sas(); - @Source("sass.js") @DoNotEmbed DataResource sass(); - @Source("scheme.js") @DoNotEmbed DataResource scheme(); - @Source("shell.js") @DoNotEmbed DataResource shell(); - @Source("sieve.js") @DoNotEmbed DataResource sieve(); - @Source("slim.js") @DoNotEmbed DataResource slim(); - @Source("smalltalk.js") @DoNotEmbed DataResource smalltalk(); - @Source("smarty.js") @DoNotEmbed DataResource smarty(); - @Source("solr.js") @DoNotEmbed DataResource solr(); - @Source("soy.js") @DoNotEmbed DataResource soy(); - @Source("sparql.js") @DoNotEmbed DataResource sparql(); - @Source("spreadsheet.js") @DoNotEmbed DataResource spreadsheet(); - @Source("sql.js") @DoNotEmbed DataResource sql(); - @Source("stex.js") @DoNotEmbed DataResource stex(); - @Source("stylus.js") @DoNotEmbed DataResource stylus(); - @Source("swift.js") @DoNotEmbed DataResource swift(); - @Source("tcl.js") @DoNotEmbed DataResource tcl(); - @Source("textile.js") @DoNotEmbed DataResource textile(); - @Source("tiddlywiki.js") @DoNotEmbed DataResource tiddlywiki(); - @Source("tiki.js") @DoNotEmbed DataResource tiki(); - @Source("toml.js") @DoNotEmbed DataResource toml(); - @Source("tornado.js") @DoNotEmbed DataResource tornado(); - @Source("troff.js") @DoNotEmbed DataResource troff(); - @Source("ttcn-cfg.js") @DoNotEmbed DataResource ttcn_cfg(); - @Source("ttcn.js") @DoNotEmbed DataResource ttcn(); - @Source("turtle.js") @DoNotEmbed DataResource turtle(); - @Source("twig.js") @DoNotEmbed DataResource twig(); - @Source("vb.js") @DoNotEmbed DataResource vb(); - @Source("vbscript.js") @DoNotEmbed DataResource vbscript(); - @Source("velocity.js") @DoNotEmbed DataResource velocity(); - @Source("verilog.js") @DoNotEmbed DataResource verilog(); - @Source("vhdl.js") @DoNotEmbed DataResource vhdl(); - @Source("vue.js") @DoNotEmbed DataResource vue(); - @Source("webidl.js") @DoNotEmbed DataResource webidl(); - @Source("xml.js") @DoNotEmbed DataResource xml(); - @Source("xquery.js") @DoNotEmbed DataResource xquery(); - @Source("yacas.js") @DoNotEmbed DataResource yacas(); - @Source("yaml-frontmatter.js") @DoNotEmbed DataResource yaml_frontmatter(); - @Source("yaml.js") @DoNotEmbed DataResource yaml(); - @Source("z80.js") @DoNotEmbed DataResource z80(); + @Source("apl.js") + @DoNotEmbed + DataResource apl(); + + @Source("asciiarmor.js") + @DoNotEmbed + DataResource asciiarmor(); + + @Source("asn.1.js") + @DoNotEmbed + DataResource asn_1(); + + @Source("asterisk.js") + @DoNotEmbed + DataResource asterisk(); + + @Source("brainfuck.js") + @DoNotEmbed + DataResource brainfuck(); + + @Source("clike.js") + @DoNotEmbed + DataResource clike(); + + @Source("clojure.js") + @DoNotEmbed + DataResource clojure(); + + @Source("cmake.js") + @DoNotEmbed + DataResource cmake(); + + @Source("cobol.js") + @DoNotEmbed + DataResource cobol(); + + @Source("coffeescript.js") + @DoNotEmbed + DataResource coffeescript(); + + @Source("commonlisp.js") + @DoNotEmbed + DataResource commonlisp(); + + @Source("crystal.js") + @DoNotEmbed + DataResource crystal(); + + @Source("css.js") + @DoNotEmbed + DataResource css(); + + @Source("cypher.js") + @DoNotEmbed + DataResource cypher(); + + @Source("d.js") + @DoNotEmbed + DataResource d(); + + @Source("dart.js") + @DoNotEmbed + DataResource dart(); + + @Source("diff.js") + @DoNotEmbed + DataResource diff(); + + @Source("django.js") + @DoNotEmbed + DataResource django(); + + @Source("dockerfile.js") + @DoNotEmbed + DataResource dockerfile(); + + @Source("dtd.js") + @DoNotEmbed + DataResource dtd(); + + @Source("dylan.js") + @DoNotEmbed + DataResource dylan(); + + @Source("ebnf.js") + @DoNotEmbed + DataResource ebnf(); + + @Source("ecl.js") + @DoNotEmbed + DataResource ecl(); + + @Source("eiffel.js") + @DoNotEmbed + DataResource eiffel(); + + @Source("elm.js") + @DoNotEmbed + DataResource elm(); + + @Source("erlang.js") + @DoNotEmbed + DataResource erlang(); + + @Source("factor.js") + @DoNotEmbed + DataResource factor(); + + @Source("fcl.js") + @DoNotEmbed + DataResource fcl(); + + @Source("forth.js") + @DoNotEmbed + DataResource forth(); + + @Source("fortran.js") + @DoNotEmbed + DataResource fortran(); + + @Source("gas.js") + @DoNotEmbed + DataResource gas(); + + @Source("gerrit/commit.js") + @DoNotEmbed + DataResource gerrit_commit(); + + @Source("gfm.js") + @DoNotEmbed + DataResource gfm(); + + @Source("gherkin.js") + @DoNotEmbed + DataResource gherkin(); + + @Source("go.js") + @DoNotEmbed + DataResource go(); + + @Source("groovy.js") + @DoNotEmbed + DataResource groovy(); + + @Source("haml.js") + @DoNotEmbed + DataResource haml(); + + @Source("handlebars.js") + @DoNotEmbed + DataResource handlebars(); + + @Source("haskell-literate.js") + @DoNotEmbed + DataResource haskell_literate(); + + @Source("haskell.js") + @DoNotEmbed + DataResource haskell(); + + @Source("haxe.js") + @DoNotEmbed + DataResource haxe(); + + @Source("htmlembedded.js") + @DoNotEmbed + DataResource htmlembedded(); + + @Source("htmlmixed.js") + @DoNotEmbed + DataResource htmlmixed(); + + @Source("http.js") + @DoNotEmbed + DataResource http(); + + @Source("idl.js") + @DoNotEmbed + DataResource idl(); + + @Source("javascript.js") + @DoNotEmbed + DataResource javascript(); + + @Source("jinja2.js") + @DoNotEmbed + DataResource jinja2(); + + @Source("jsx.js") + @DoNotEmbed + DataResource jsx(); + + @Source("julia.js") + @DoNotEmbed + DataResource julia(); + + @Source("livescript.js") + @DoNotEmbed + DataResource livescript(); + + @Source("lua.js") + @DoNotEmbed + DataResource lua(); + + @Source("markdown.js") + @DoNotEmbed + DataResource markdown(); + + @Source("mathematica.js") + @DoNotEmbed + DataResource mathematica(); + + @Source("mbox.js") + @DoNotEmbed + DataResource mbox(); + + @Source("mirc.js") + @DoNotEmbed + DataResource mirc(); + + @Source("mllike.js") + @DoNotEmbed + DataResource mllike(); + + @Source("modelica.js") + @DoNotEmbed + DataResource modelica(); + + @Source("mscgen.js") + @DoNotEmbed + DataResource mscgen(); + + @Source("mumps.js") + @DoNotEmbed + DataResource mumps(); + + @Source("nginx.js") + @DoNotEmbed + DataResource nginx(); + + @Source("nsis.js") + @DoNotEmbed + DataResource nsis(); + + @Source("ntriples.js") + @DoNotEmbed + DataResource ntriples(); + + @Source("octave.js") + @DoNotEmbed + DataResource octave(); + + @Source("oz.js") + @DoNotEmbed + DataResource oz(); + + @Source("pascal.js") + @DoNotEmbed + DataResource pascal(); + + @Source("pegjs.js") + @DoNotEmbed + DataResource pegjs(); + + @Source("perl.js") + @DoNotEmbed + DataResource perl(); + + @Source("php.js") + @DoNotEmbed + DataResource php(); + + @Source("pig.js") + @DoNotEmbed + DataResource pig(); + + @Source("powershell.js") + @DoNotEmbed + DataResource powershell(); + + @Source("properties.js") + @DoNotEmbed + DataResource properties(); + + @Source("protobuf.js") + @DoNotEmbed + DataResource protobuf(); + + @Source("pug.js") + @DoNotEmbed + DataResource pug(); + + @Source("puppet.js") + @DoNotEmbed + DataResource puppet(); + + @Source("python.js") + @DoNotEmbed + DataResource python(); + + @Source("q.js") + @DoNotEmbed + DataResource q(); + + @Source("r.js") + @DoNotEmbed + DataResource r(); + + @Source("rpm.js") + @DoNotEmbed + DataResource rpm(); + + @Source("rst.js") + @DoNotEmbed + DataResource rst(); + + @Source("ruby.js") + @DoNotEmbed + DataResource ruby(); + + @Source("rust.js") + @DoNotEmbed + DataResource rust(); + + @Source("sas.js") + @DoNotEmbed + DataResource sas(); + + @Source("sass.js") + @DoNotEmbed + DataResource sass(); + + @Source("scheme.js") + @DoNotEmbed + DataResource scheme(); + + @Source("shell.js") + @DoNotEmbed + DataResource shell(); + + @Source("sieve.js") + @DoNotEmbed + DataResource sieve(); + + @Source("slim.js") + @DoNotEmbed + DataResource slim(); + + @Source("smalltalk.js") + @DoNotEmbed + DataResource smalltalk(); + + @Source("smarty.js") + @DoNotEmbed + DataResource smarty(); + + @Source("solr.js") + @DoNotEmbed + DataResource solr(); + + @Source("soy.js") + @DoNotEmbed + DataResource soy(); + + @Source("sparql.js") + @DoNotEmbed + DataResource sparql(); + + @Source("spreadsheet.js") + @DoNotEmbed + DataResource spreadsheet(); + + @Source("sql.js") + @DoNotEmbed + DataResource sql(); + + @Source("stex.js") + @DoNotEmbed + DataResource stex(); + + @Source("stylus.js") + @DoNotEmbed + DataResource stylus(); + + @Source("swift.js") + @DoNotEmbed + DataResource swift(); + + @Source("tcl.js") + @DoNotEmbed + DataResource tcl(); + + @Source("textile.js") + @DoNotEmbed + DataResource textile(); + + @Source("tiddlywiki.js") + @DoNotEmbed + DataResource tiddlywiki(); + + @Source("tiki.js") + @DoNotEmbed + DataResource tiki(); + + @Source("toml.js") + @DoNotEmbed + DataResource toml(); + + @Source("tornado.js") + @DoNotEmbed + DataResource tornado(); + + @Source("troff.js") + @DoNotEmbed + DataResource troff(); + + @Source("ttcn-cfg.js") + @DoNotEmbed + DataResource ttcn_cfg(); + + @Source("ttcn.js") + @DoNotEmbed + DataResource ttcn(); + + @Source("turtle.js") + @DoNotEmbed + DataResource turtle(); + + @Source("twig.js") + @DoNotEmbed + DataResource twig(); + + @Source("vb.js") + @DoNotEmbed + DataResource vb(); + + @Source("vbscript.js") + @DoNotEmbed + DataResource vbscript(); + + @Source("velocity.js") + @DoNotEmbed + DataResource velocity(); + + @Source("verilog.js") + @DoNotEmbed + DataResource verilog(); + + @Source("vhdl.js") + @DoNotEmbed + DataResource vhdl(); + + @Source("vue.js") + @DoNotEmbed + DataResource vue(); + + @Source("webidl.js") + @DoNotEmbed + DataResource webidl(); + + @Source("xml.js") + @DoNotEmbed + DataResource xml(); + + @Source("xquery.js") + @DoNotEmbed + DataResource xquery(); + + @Source("yacas.js") + @DoNotEmbed + DataResource yacas(); + + @Source("yaml-frontmatter.js") + @DoNotEmbed + DataResource yaml_frontmatter(); + + @Source("yaml.js") + @DoNotEmbed + DataResource yaml(); + + @Source("z80.js") + @DoNotEmbed + DataResource z80(); // When adding a resource, update static initializer in ModeInfo. } diff --git a/gerrit-gwtui/src/main/java/net/codemirror/theme/ThemeLoader.java b/gerrit-gwtui/src/main/java/net/codemirror/theme/ThemeLoader.java index 20dd8c79cc..1dce708d4f 100644 --- a/gerrit-gwtui/src/main/java/net/codemirror/theme/ThemeLoader.java +++ b/gerrit-gwtui/src/main/java/net/codemirror/theme/ThemeLoader.java @@ -21,62 +21,60 @@ import com.google.gwt.resources.client.ResourceCallback; import com.google.gwt.resources.client.ResourceException; import com.google.gwt.resources.client.TextResource; import com.google.gwt.user.client.rpc.AsyncCallback; - import java.util.EnumSet; /** Dynamically loads a known CodeMirror theme's CSS */ public class ThemeLoader { private static final ExternalTextResource[] THEMES = { - Themes.I.day_3024(), - Themes.I.night_3024(), - Themes.I.abcdef(), - Themes.I.ambiance(), - Themes.I.base16_dark(), - Themes.I.base16_light(), - Themes.I.bespin(), - Themes.I.blackboard(), - Themes.I.cobalt(), - Themes.I.colorforth(), - Themes.I.dracula(), - Themes.I.eclipse(), - Themes.I.elegant(), - Themes.I.erlang_dark(), - Themes.I.hopscotch(), - Themes.I.icecoder(), - Themes.I.isotope(), - Themes.I.lesser_dark(), - Themes.I.liquibyte(), - Themes.I.material(), - Themes.I.mbo(), - Themes.I.mdn_like(), - Themes.I.midnight(), - Themes.I.monokai(), - Themes.I.neat(), - Themes.I.neo(), - Themes.I.night(), - Themes.I.paraiso_dark(), - Themes.I.paraiso_light(), - Themes.I.pastel_on_dark(), - Themes.I.railscasts(), - Themes.I.rubyblue(), - Themes.I.seti(), - Themes.I.solarized(), - Themes.I.the_matrix(), - Themes.I.tomorrow_night_bright(), - Themes.I.tomorrow_night_eighties(), - Themes.I.ttcn(), - Themes.I.twilight(), - Themes.I.vibrant_ink(), - Themes.I.xq_dark(), - Themes.I.xq_light(), - Themes.I.yeti(), - Themes.I.zenburn(), + Themes.I.day_3024(), + Themes.I.night_3024(), + Themes.I.abcdef(), + Themes.I.ambiance(), + Themes.I.base16_dark(), + Themes.I.base16_light(), + Themes.I.bespin(), + Themes.I.blackboard(), + Themes.I.cobalt(), + Themes.I.colorforth(), + Themes.I.dracula(), + Themes.I.eclipse(), + Themes.I.elegant(), + Themes.I.erlang_dark(), + Themes.I.hopscotch(), + Themes.I.icecoder(), + Themes.I.isotope(), + Themes.I.lesser_dark(), + Themes.I.liquibyte(), + Themes.I.material(), + Themes.I.mbo(), + Themes.I.mdn_like(), + Themes.I.midnight(), + Themes.I.monokai(), + Themes.I.neat(), + Themes.I.neo(), + Themes.I.night(), + Themes.I.paraiso_dark(), + Themes.I.paraiso_light(), + Themes.I.pastel_on_dark(), + Themes.I.railscasts(), + Themes.I.rubyblue(), + Themes.I.seti(), + Themes.I.solarized(), + Themes.I.the_matrix(), + Themes.I.tomorrow_night_bright(), + Themes.I.tomorrow_night_eighties(), + Themes.I.ttcn(), + Themes.I.twilight(), + Themes.I.vibrant_ink(), + Themes.I.xq_dark(), + Themes.I.xq_light(), + Themes.I.yeti(), + Themes.I.zenburn(), }; private static final EnumSet loaded = EnumSet.of(Theme.DEFAULT); - public static final void loadTheme(final Theme theme, - final AsyncCallback cb) { + public static final void loadTheme(final Theme theme, final AsyncCallback cb) { if (loaded.contains(theme)) { cb.onSuccess(null); return; @@ -89,19 +87,20 @@ public class ThemeLoader { } try { - resource.getText(new ResourceCallback() { - @Override - public void onSuccess(TextResource resource) { - StyleInjector.inject(resource.getText()); - loaded.add(theme); - cb.onSuccess(null); - } + resource.getText( + new ResourceCallback() { + @Override + public void onSuccess(TextResource resource) { + StyleInjector.inject(resource.getText()); + loaded.add(theme); + cb.onSuccess(null); + } - @Override - public void onError(ResourceException e) { - cb.onFailure(e); - } - }); + @Override + public void onError(ResourceException e) { + cb.onFailure(e); + } + }); } catch (ResourceException e) { cb.onFailure(e); } @@ -116,6 +115,5 @@ public class ThemeLoader { return null; } - private ThemeLoader() { - } + private ThemeLoader() {} } diff --git a/gerrit-gwtui/src/main/java/net/codemirror/theme/Themes.java b/gerrit-gwtui/src/main/java/net/codemirror/theme/Themes.java index dc95b4a0ae..cfe853f6e8 100644 --- a/gerrit-gwtui/src/main/java/net/codemirror/theme/Themes.java +++ b/gerrit-gwtui/src/main/java/net/codemirror/theme/Themes.java @@ -21,52 +21,143 @@ import com.google.gwt.resources.client.ExternalTextResource; public interface Themes extends ClientBundle { Themes I = GWT.create(Themes.class); - @Source("3024-day.css") ExternalTextResource day_3024(); - @Source("3024-night.css") ExternalTextResource night_3024(); - @Source("abcdef.css") ExternalTextResource abcdef(); - @Source("ambiance.css") ExternalTextResource ambiance(); - @Source("base16-dark.css") ExternalTextResource base16_dark(); - @Source("base16-light.css") ExternalTextResource base16_light(); - @Source("bespin.css") ExternalTextResource bespin(); - @Source("blackboard.css") ExternalTextResource blackboard(); - @Source("cobalt.css") ExternalTextResource cobalt(); - @Source("colorforth.css") ExternalTextResource colorforth(); - @Source("dracula.css") ExternalTextResource dracula(); - @Source("duotone-dark.css") ExternalTextResource duotone_dark(); - @Source("duotone-light.css") ExternalTextResource duotone_light(); - @Source("eclipse.css") ExternalTextResource eclipse(); - @Source("elegant.css") ExternalTextResource elegant(); - @Source("erlang-dark.css") ExternalTextResource erlang_dark(); - @Source("hopscotch.css") ExternalTextResource hopscotch(); - @Source("icecoder.css") ExternalTextResource icecoder(); - @Source("isotope.css") ExternalTextResource isotope(); - @Source("lesser-dark.css") ExternalTextResource lesser_dark(); - @Source("liquibyte.css") ExternalTextResource liquibyte(); - @Source("material.css") ExternalTextResource material(); - @Source("mbo.css") ExternalTextResource mbo(); - @Source("mdn-like.css") ExternalTextResource mdn_like(); - @Source("midnight.css") ExternalTextResource midnight(); - @Source("monokai.css") ExternalTextResource monokai(); - @Source("neat.css") ExternalTextResource neat(); - @Source("neo.css") ExternalTextResource neo(); - @Source("night.css") ExternalTextResource night(); - @Source("paraiso-dark.css") ExternalTextResource paraiso_dark(); - @Source("paraiso-light.css") ExternalTextResource paraiso_light(); - @Source("pastel-on-dark.css") ExternalTextResource pastel_on_dark(); - @Source("railscasts.css") ExternalTextResource railscasts(); - @Source("rubyblue.css") ExternalTextResource rubyblue(); - @Source("seti.css") ExternalTextResource seti(); - @Source("solarized.css") ExternalTextResource solarized(); - @Source("the-matrix.css") ExternalTextResource the_matrix(); - @Source("tomorrow-night-bright.css") ExternalTextResource tomorrow_night_bright(); - @Source("tomorrow-night-eighties.css") ExternalTextResource tomorrow_night_eighties(); - @Source("ttcn.css") ExternalTextResource ttcn(); - @Source("twilight.css") ExternalTextResource twilight(); - @Source("vibrant-ink.css") ExternalTextResource vibrant_ink(); - @Source("xq-dark.css") ExternalTextResource xq_dark(); - @Source("xq-light.css") ExternalTextResource xq_light(); - @Source("yeti.css") ExternalTextResource yeti(); - @Source("zenburn.css") ExternalTextResource zenburn(); + @Source("3024-day.css") + ExternalTextResource day_3024(); + + @Source("3024-night.css") + ExternalTextResource night_3024(); + + @Source("abcdef.css") + ExternalTextResource abcdef(); + + @Source("ambiance.css") + ExternalTextResource ambiance(); + + @Source("base16-dark.css") + ExternalTextResource base16_dark(); + + @Source("base16-light.css") + ExternalTextResource base16_light(); + + @Source("bespin.css") + ExternalTextResource bespin(); + + @Source("blackboard.css") + ExternalTextResource blackboard(); + + @Source("cobalt.css") + ExternalTextResource cobalt(); + + @Source("colorforth.css") + ExternalTextResource colorforth(); + + @Source("dracula.css") + ExternalTextResource dracula(); + + @Source("duotone-dark.css") + ExternalTextResource duotone_dark(); + + @Source("duotone-light.css") + ExternalTextResource duotone_light(); + + @Source("eclipse.css") + ExternalTextResource eclipse(); + + @Source("elegant.css") + ExternalTextResource elegant(); + + @Source("erlang-dark.css") + ExternalTextResource erlang_dark(); + + @Source("hopscotch.css") + ExternalTextResource hopscotch(); + + @Source("icecoder.css") + ExternalTextResource icecoder(); + + @Source("isotope.css") + ExternalTextResource isotope(); + + @Source("lesser-dark.css") + ExternalTextResource lesser_dark(); + + @Source("liquibyte.css") + ExternalTextResource liquibyte(); + + @Source("material.css") + ExternalTextResource material(); + + @Source("mbo.css") + ExternalTextResource mbo(); + + @Source("mdn-like.css") + ExternalTextResource mdn_like(); + + @Source("midnight.css") + ExternalTextResource midnight(); + + @Source("monokai.css") + ExternalTextResource monokai(); + + @Source("neat.css") + ExternalTextResource neat(); + + @Source("neo.css") + ExternalTextResource neo(); + + @Source("night.css") + ExternalTextResource night(); + + @Source("paraiso-dark.css") + ExternalTextResource paraiso_dark(); + + @Source("paraiso-light.css") + ExternalTextResource paraiso_light(); + + @Source("pastel-on-dark.css") + ExternalTextResource pastel_on_dark(); + + @Source("railscasts.css") + ExternalTextResource railscasts(); + + @Source("rubyblue.css") + ExternalTextResource rubyblue(); + + @Source("seti.css") + ExternalTextResource seti(); + + @Source("solarized.css") + ExternalTextResource solarized(); + + @Source("the-matrix.css") + ExternalTextResource the_matrix(); + + @Source("tomorrow-night-bright.css") + ExternalTextResource tomorrow_night_bright(); + + @Source("tomorrow-night-eighties.css") + ExternalTextResource tomorrow_night_eighties(); + + @Source("ttcn.css") + ExternalTextResource ttcn(); + + @Source("twilight.css") + ExternalTextResource twilight(); + + @Source("vibrant-ink.css") + ExternalTextResource vibrant_ink(); + + @Source("xq-dark.css") + ExternalTextResource xq_dark(); + + @Source("xq-light.css") + ExternalTextResource xq_light(); + + @Source("yeti.css") + ExternalTextResource yeti(); + + @Source("zenburn.css") + ExternalTextResource zenburn(); // When adding a resource, update: // - static initializer in ThemeLoader diff --git a/gerrit-gwtui/src/test/java/com/google/gerrit/client/diff/LineMapperTest.java b/gerrit-gwtui/src/test/java/com/google/gerrit/client/diff/LineMapperTest.java index 8e59b10dcb..fcc214e712 100644 --- a/gerrit-gwtui/src/test/java/com/google/gerrit/client/diff/LineMapperTest.java +++ b/gerrit-gwtui/src/test/java/com/google/gerrit/client/diff/LineMapperTest.java @@ -17,7 +17,6 @@ package com.google.gerrit.client.diff; import static org.junit.Assert.assertEquals; import com.google.gerrit.client.diff.LineMapper.LineOnOtherInfo; - import org.junit.Test; /** Unit tests for LineMapper */ @@ -51,56 +50,46 @@ public class LineMapperTest { public void findInCommon() { LineMapper mapper = new LineMapper(); mapper.appendCommon(10); - assertEquals(new LineOnOtherInfo(9, true), - mapper.lineOnOther(DisplaySide.A, 9)); - assertEquals(new LineOnOtherInfo(9, true), - mapper.lineOnOther(DisplaySide.B, 9)); + assertEquals(new LineOnOtherInfo(9, true), mapper.lineOnOther(DisplaySide.A, 9)); + assertEquals(new LineOnOtherInfo(9, true), mapper.lineOnOther(DisplaySide.B, 9)); } @Test public void findAfterCommon() { LineMapper mapper = new LineMapper(); mapper.appendCommon(10); - assertEquals(new LineOnOtherInfo(10, true), - mapper.lineOnOther(DisplaySide.A, 10)); - assertEquals(new LineOnOtherInfo(10, true), - mapper.lineOnOther(DisplaySide.B, 10)); + assertEquals(new LineOnOtherInfo(10, true), mapper.lineOnOther(DisplaySide.A, 10)); + assertEquals(new LineOnOtherInfo(10, true), mapper.lineOnOther(DisplaySide.B, 10)); } @Test public void findInInsertGap() { LineMapper mapper = new LineMapper(); mapper.appendInsert(10); - assertEquals(new LineOnOtherInfo(-1, false), - mapper.lineOnOther(DisplaySide.B, 9)); + assertEquals(new LineOnOtherInfo(-1, false), mapper.lineOnOther(DisplaySide.B, 9)); } @Test public void findAfterInsertGap() { LineMapper mapper = new LineMapper(); mapper.appendInsert(10); - assertEquals(new LineOnOtherInfo(0, true), - mapper.lineOnOther(DisplaySide.B, 10)); - assertEquals(new LineOnOtherInfo(10, true), - mapper.lineOnOther(DisplaySide.A, 0)); + assertEquals(new LineOnOtherInfo(0, true), mapper.lineOnOther(DisplaySide.B, 10)); + assertEquals(new LineOnOtherInfo(10, true), mapper.lineOnOther(DisplaySide.A, 0)); } @Test public void findInDeleteGap() { LineMapper mapper = new LineMapper(); mapper.appendDelete(10); - assertEquals(new LineOnOtherInfo(-1, false), - mapper.lineOnOther(DisplaySide.A, 9)); + assertEquals(new LineOnOtherInfo(-1, false), mapper.lineOnOther(DisplaySide.A, 9)); } @Test public void findAfterDeleteGap() { LineMapper mapper = new LineMapper(); mapper.appendDelete(10); - assertEquals(new LineOnOtherInfo(0, true), - mapper.lineOnOther(DisplaySide.A, 10)); - assertEquals(new LineOnOtherInfo(10, true), - mapper.lineOnOther(DisplaySide.B, 0)); + assertEquals(new LineOnOtherInfo(0, true), mapper.lineOnOther(DisplaySide.A, 10)); + assertEquals(new LineOnOtherInfo(10, true), mapper.lineOnOther(DisplaySide.B, 0)); } @Test @@ -119,14 +108,10 @@ public class LineMapperTest { assertEquals(4, mapper.getLineA()); assertEquals(6, mapper.getLineB()); - assertEquals(new LineOnOtherInfo(1, true), - mapper.lineOnOther(DisplaySide.B, 1)); - assertEquals(new LineOnOtherInfo(3, true), - mapper.lineOnOther(DisplaySide.B, 5)); + assertEquals(new LineOnOtherInfo(1, true), mapper.lineOnOther(DisplaySide.B, 1)); + assertEquals(new LineOnOtherInfo(3, true), mapper.lineOnOther(DisplaySide.B, 5)); - assertEquals(new LineOnOtherInfo(2, true), - mapper.lineOnOther(DisplaySide.B, 2)); - assertEquals(new LineOnOtherInfo(2, false), - mapper.lineOnOther(DisplaySide.B, 3)); + assertEquals(new LineOnOtherInfo(2, true), mapper.lineOnOther(DisplaySide.B, 2)); + assertEquals(new LineOnOtherInfo(2, false), mapper.lineOnOther(DisplaySide.B, 3)); } } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/AdvertisedObjectsCacheKey.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/AdvertisedObjectsCacheKey.java index 4bf31023dc..68bbd9840d 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/AdvertisedObjectsCacheKey.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/AdvertisedObjectsCacheKey.java @@ -25,5 +25,6 @@ abstract class AdvertisedObjectsCacheKey { } public abstract Account.Id account(); + public abstract Project.NameKey project(); } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/AllRequestFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/AllRequestFilter.java index bcc584223f..09b6f250fa 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/AllRequestFilter.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/AllRequestFilter.java @@ -21,10 +21,8 @@ import com.google.inject.Inject; import com.google.inject.Singleton; import com.google.inject.internal.UniqueAnnotations; import com.google.inject.servlet.ServletModule; - import java.io.IOException; import java.util.Iterator; - import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -42,8 +40,8 @@ public abstract class AllRequestFilter implements Filter { filter("/*").through(FilterProxy.class); bind(StopPluginListener.class) - .annotatedWith(UniqueAnnotations.create()) - .to(FilterProxy.class); + .annotatedWith(UniqueAnnotations.create()) + .to(FilterProxy.class); } }; } @@ -87,7 +85,7 @@ public abstract class AllRequestFilter implements Filter { } private synchronized void cleanUpInitializedFilters() { - Iterable filtersToCleanUp = initializedFilters; + Iterable filtersToCleanUp = initializedFilters; initializedFilters = new DynamicSet<>(); for (AllRequestFilter filter : filtersToCleanUp) { if (filters.contains(filter)) { @@ -99,8 +97,8 @@ public abstract class AllRequestFilter implements Filter { } @Override - public void doFilter(ServletRequest req, ServletResponse res, - final FilterChain last) throws IOException, ServletException { + public void doFilter(ServletRequest req, ServletResponse res, final FilterChain last) + throws IOException, ServletException { final Iterator itr = filters.iterator(); new FilterChain() { @Override @@ -127,8 +125,7 @@ public abstract class AllRequestFilter implements Filter { // it, given that this is really both really improbable and also // the "proper" fix for it would basically kill concurrency of // webrequests. - if (initializedFilters.contains(filter) - || initFilterIfNeeded(filter)) { + if (initializedFilters.contains(filter) || initFilterIfNeeded(filter)) { filter.doFilter(req, res, this); return; } @@ -146,16 +143,16 @@ public abstract class AllRequestFilter implements Filter { // FilterConfig around, and reuse it to lazy init the AllRequestFilters. filterConfig = config; - for (AllRequestFilter f: filters) { + for (AllRequestFilter f : filters) { initFilterIfNeeded(f); } } @Override public synchronized void destroy() { - Iterable filtersToDestroy = initializedFilters; + Iterable filtersToDestroy = initializedFilters; initializedFilters = new DynamicSet<>(); - for (AllRequestFilter filter: filtersToDestroy) { + for (AllRequestFilter filter : filtersToDestroy) { filter.destroy(); } } @@ -170,10 +167,8 @@ public abstract class AllRequestFilter implements Filter { } @Override - public void init(FilterConfig config) throws ServletException { - } + public void init(FilterConfig config) throws ServletException {} @Override - public void destroy() { - } + public void destroy() {} } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/CacheBasedWebSession.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/CacheBasedWebSession.java index f34f488882..9a8197a757 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/CacheBasedWebSession.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/CacheBasedWebSession.java @@ -31,14 +31,11 @@ import com.google.gerrit.server.account.AuthResult; import com.google.gerrit.server.config.AuthConfig; import com.google.inject.Provider; import com.google.inject.servlet.RequestScoped; - -import org.eclipse.jgit.http.server.GitSmartHttpTools; - import java.util.EnumSet; - import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.eclipse.jgit.http.server.GitSmartHttpTools; @RequestScoped public abstract class CacheBasedWebSession implements WebSession { @@ -58,7 +55,8 @@ public abstract class CacheBasedWebSession implements WebSession { private Val val; private CurrentUser user; - protected CacheBasedWebSession(final HttpServletRequest request, + protected CacheBasedWebSession( + final HttpServletRequest request, final HttpServletResponse response, final WebSessionManager manager, final AuthConfig authConfig, @@ -71,8 +69,7 @@ public abstract class CacheBasedWebSession implements WebSession { this.anonymousProvider = anonymousProvider; this.identified = identified; - if (request.getRequestURI() == null - || !GitSmartHttpTools.isGitClient(request)) { + if (request.getRequestURI() == null || !GitSmartHttpTools.isGitClient(request)) { String cookie = readCookie(); if (cookie != null) { key = new Key(cookie); diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/CanonicalWebUrl.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/CanonicalWebUrl.java index 901b180bdc..2a0f787b13 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/CanonicalWebUrl.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/CanonicalWebUrl.java @@ -17,7 +17,6 @@ package com.google.gerrit.httpd; import com.google.gerrit.common.Nullable; import com.google.inject.Inject; import com.google.inject.Provider; - import javax.servlet.http.HttpServletRequest; public class CanonicalWebUrl { @@ -25,9 +24,7 @@ public class CanonicalWebUrl { @Inject CanonicalWebUrl( - @com.google.gerrit.server.config.CanonicalWebUrl - @Nullable - Provider provider) { + @com.google.gerrit.server.config.CanonicalWebUrl @Nullable Provider provider) { configured = provider; } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ContainerAuthFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ContainerAuthFilter.java index f291621d09..07893ba7ea 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ContainerAuthFilter.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ContainerAuthFilter.java @@ -29,12 +29,8 @@ import com.google.gerrit.server.config.AuthConfig; import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.Config; - import java.io.IOException; import java.util.Locale; - import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -43,17 +39,18 @@ import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.eclipse.jgit.lib.Config; /** * Trust the authentication which is done by the container. - *

- * Check whether the container has already authenticated the user. If yes, then - * lookup the account and set the account ID in our current session. - *

- * This filter should only be configured to run, when authentication is - * configured to trust container authentication. This filter is intended to - * protect the {@link GitOverHttpServlet} and its handled URLs, which provide remote - * repository access over HTTP. It also protects {@link RestApiServlet}. + * + *

Check whether the container has already authenticated the user. If yes, then lookup the + * account and set the account ID in our current session. + * + *

This filter should only be configured to run, when authentication is configured to trust + * container authentication. This filter is intended to protect the {@link GitOverHttpServlet} and + * its handled URLs, which provide remote repository access over HTTP. It also protects {@link + * RestApiServlet}. */ @Singleton class ContainerAuthFilter implements Filter { @@ -63,7 +60,8 @@ class ContainerAuthFilter implements Filter { private final String loginHttpHeader; @Inject - ContainerAuthFilter(DynamicItem session, + ContainerAuthFilter( + DynamicItem session, AccountCache accountCache, AuthConfig authConfig, @GerritServerConfig Config config) { @@ -71,22 +69,18 @@ class ContainerAuthFilter implements Filter { this.accountCache = accountCache; this.config = config; - loginHttpHeader = firstNonNull( - emptyToNull(authConfig.getLoginHttpHeader()), - AUTHORIZATION); + loginHttpHeader = firstNonNull(emptyToNull(authConfig.getLoginHttpHeader()), AUTHORIZATION); } @Override - public void init(FilterConfig config) { - } + public void init(FilterConfig config) {} @Override - public void destroy() { - } + public void destroy() {} @Override - public void doFilter(ServletRequest request, ServletResponse response, - FilterChain chain) throws IOException, ServletException { + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse rsp = (HttpServletResponse) response; @@ -95,8 +89,7 @@ class ContainerAuthFilter implements Filter { } } - private boolean verify(HttpServletRequest req, HttpServletResponse rsp) - throws IOException { + private boolean verify(HttpServletRequest req, HttpServletResponse rsp) throws IOException { String username = RemoteUserUtil.getRemoteUser(req, loginHttpHeader); if (username == null) { rsp.sendError(SC_FORBIDDEN); diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/CookieBase64.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/CookieBase64.java index 183e015fa0..11342be1c8 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/CookieBase64.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/CookieBase64.java @@ -52,8 +52,8 @@ class CookieBase64 { return out.toString(); } - private static void encode3to4(final StringBuilder out, final byte[] in, - final int inOffset, final int numSigBytes) { + private static void encode3to4( + final StringBuilder out, final byte[] in, final int inOffset, final int numSigBytes) { // 1 2 3 // 01234567890123456789012345678901 Bit position // --------000000001111111122222222 Array position from threeBytes @@ -66,9 +66,10 @@ class CookieBase64 { // We have to shift left 24 in order to flush out the 1's that appear // when Java treats a value as negative that is cast from a byte to an int. // - int inBuff = ( numSigBytes > 0 ? ((in[ inOffset ] << 24) >>> 8) : 0 ) - | ( numSigBytes > 1 ? ((in[ inOffset + 1 ] << 24) >>> 16) : 0 ) - | ( numSigBytes > 2 ? ((in[ inOffset + 2 ] << 24) >>> 24) : 0 ); + int inBuff = + (numSigBytes > 0 ? ((in[inOffset] << 24) >>> 8) : 0) + | (numSigBytes > 1 ? ((in[inOffset + 1] << 24) >>> 16) : 0) + | (numSigBytes > 2 ? ((in[inOffset + 2] << 24) >>> 24) : 0); switch (numSigBytes) { case 3: @@ -94,6 +95,5 @@ class CookieBase64 { } } - private CookieBase64() { - } + private CookieBase64() {} } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/DirectChangeByCommit.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/DirectChangeByCommit.java index 74dc56f7ef..825505cd1d 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/DirectChangeByCommit.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/DirectChangeByCommit.java @@ -11,22 +11,18 @@ import com.google.gerrit.extensions.restapi.RestApiException; import com.google.gerrit.reviewdb.client.Change; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.util.List; - import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Singleton class DirectChangeByCommit extends HttpServlet { private static final long serialVersionUID = 1L; - private static final Logger log = - LoggerFactory.getLogger(DirectChangeByCommit.class); + private static final Logger log = LoggerFactory.getLogger(DirectChangeByCommit.class); private final Changes changes; @@ -36,8 +32,8 @@ class DirectChangeByCommit extends HttpServlet { } @Override - protected void doGet(final HttpServletRequest req, - final HttpServletResponse rsp) throws IOException { + protected void doGet(final HttpServletRequest req, final HttpServletResponse rsp) + throws IOException { String query = CharMatcher.is('/').trimTrailingFrom(req.getPathInfo()); List results; try { @@ -50,8 +46,7 @@ class DirectChangeByCommit extends HttpServlet { if (results.size() == 1) { // If exactly one change matches, link to that change. // TODO Link to a specific patch set, if one matched. - token = PageLinks.toChange( - new Change.Id(results.iterator().next()._number)); + token = PageLinks.toChange(new Change.Id(results.iterator().next()._number)); } else { // Otherwise, link to the query page. token = PageLinks.toChangeQuery(query); diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GetUserFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GetUserFilter.java index 019efb47a4..bbcd9778c5 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GetUserFilter.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GetUserFilter.java @@ -21,22 +21,16 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; import com.google.inject.servlet.ServletModule; - -import org.eclipse.jgit.lib.Config; - import java.io.IOException; - import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; +import org.eclipse.jgit.lib.Config; -/** - * Stores user as a request attribute, so servlets can access it outside of the - * request scope. - */ +/** Stores user as a request attribute, so servlets can access it outside of the request scope. */ @Singleton public class GetUserFilter implements Filter { @@ -67,8 +61,7 @@ public class GetUserFilter implements Filter { } @Override - public void doFilter( - ServletRequest req, ServletResponse resp, FilterChain chain) + public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { CurrentUser user = userProvider.get(); if (user != null && user.isIdentifiedUser()) { @@ -83,10 +76,8 @@ public class GetUserFilter implements Filter { } @Override - public void destroy() { - } + public void destroy() {} @Override - public void init(FilterConfig arg0) { - } + public void init(FilterConfig arg0) {} } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitOverHttpModule.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitOverHttpModule.java index 7935bb6ccb..007c5ae32b 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitOverHttpModule.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitOverHttpModule.java @@ -21,7 +21,6 @@ import com.google.gerrit.server.config.AuthConfig; import com.google.gerrit.server.config.DownloadConfig; import com.google.inject.Inject; import com.google.inject.servlet.ServletModule; - import javax.servlet.Filter; /** Configures Git access over HTTP with authentication. */ @@ -30,8 +29,7 @@ public class GitOverHttpModule extends ServletModule { private final DownloadConfig downloadConfig; @Inject - GitOverHttpModule(AuthConfig authConfig, - DownloadConfig downloadConfig) { + GitOverHttpModule(AuthConfig authConfig, DownloadConfig downloadConfig) { this.authConfig = authConfig; this.downloadConfig = downloadConfig; } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitOverHttpServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitOverHttpServlet.java index bae6d19d63..7a5956eb03 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitOverHttpServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitOverHttpServlet.java @@ -42,7 +42,19 @@ import com.google.inject.Provider; import com.google.inject.Singleton; import com.google.inject.TypeLiteral; import com.google.inject.name.Named; - +import java.io.IOException; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.http.server.GitServlet; import org.eclipse.jgit.http.server.GitSmartHttpTools; @@ -62,21 +74,6 @@ import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException; import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException; import org.eclipse.jgit.transport.resolver.UploadPackFactory; -import java.io.IOException; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; -import java.util.concurrent.TimeUnit; - -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - /** Serves Git repositories over HTTP. */ @Singleton public class GitOverHttpServlet extends GitServlet { @@ -87,6 +84,7 @@ public class GitOverHttpServlet extends GitServlet { private static final String ID_CACHE = "adv_bases"; public static final String URL_REGEX; + static { StringBuilder url = new StringBuilder(); url.append("^(?:/a)?(?:/p/|/)(.*/(?:info/refs"); @@ -110,24 +108,25 @@ public class GitOverHttpServlet extends GitServlet { bind(Resolver.class); bind(UploadFactory.class); bind(UploadFilter.class); - bind(new TypeLiteral>() {}).to( - enableReceive ? ReceiveFactory.class : DisabledReceiveFactory.class); + bind(new TypeLiteral>() {}) + .to(enableReceive ? ReceiveFactory.class : DisabledReceiveFactory.class); bind(ReceiveFilter.class); - install(new CacheModule() { - @Override - protected void configure() { - cache(ID_CACHE, - AdvertisedObjectsCacheKey.class, - new TypeLiteral>() {}) - .maximumWeight(4096) - .expireAfterWrite(10, TimeUnit.MINUTES); - } - }); + install( + new CacheModule() { + @Override + protected void configure() { + cache(ID_CACHE, AdvertisedObjectsCacheKey.class, new TypeLiteral>() {}) + .maximumWeight(4096) + .expireAfterWrite(10, TimeUnit.MINUTES); + } + }); } } @Inject - GitOverHttpServlet(Resolver resolver, UploadFactory upload, + GitOverHttpServlet( + Resolver resolver, + UploadFactory upload, UploadFilter uploadFilter, ReceivePackFactory receive, ReceiveFilter receiveFilter) { @@ -146,8 +145,7 @@ public class GitOverHttpServlet extends GitServlet { private final ProjectControl.Factory projectControlFactory; @Inject - Resolver(GitRepositoryManager manager, - ProjectControl.Factory projectControlFactory) { + Resolver(GitRepositoryManager manager, ProjectControl.Factory projectControlFactory) { this.manager = manager; this.projectControlFactory = projectControlFactory; } @@ -155,7 +153,7 @@ public class GitOverHttpServlet extends GitServlet { @Override public Repository open(HttpServletRequest req, String projectName) throws RepositoryNotFoundException, ServiceNotAuthorizedException, - ServiceNotEnabledException { + ServiceNotEnabledException { while (projectName.endsWith("/")) { projectName = projectName.substring(0, projectName.length() - 1); } @@ -191,8 +189,7 @@ public class GitOverHttpServlet extends GitServlet { try { return manager.openRepository(pc.getProject().getNameKey()); } catch (IOException e) { - throw new RepositoryNotFoundException( - pc.getProject().getNameKey().get(), e); + throw new RepositoryNotFoundException(pc.getProject().getNameKey().get(), e); } } } @@ -203,7 +200,8 @@ public class GitOverHttpServlet extends GitServlet { private final DynamicSet postUploadHooks; @Inject - UploadFactory(TransferConfig tc, + UploadFactory( + TransferConfig tc, DynamicSet preUploadHooks, DynamicSet postUploadHooks) { this.config = tc; @@ -216,10 +214,8 @@ public class GitOverHttpServlet extends GitServlet { UploadPack up = new UploadPack(repo); up.setPackConfig(config.getPackConfig()); up.setTimeout(config.getTimeout()); - up.setPreUploadHook(PreUploadHookChain.newChain( - Lists.newArrayList(preUploadHooks))); - up.setPostUploadHook( - PostUploadHookChain.newChain(Lists.newArrayList(postUploadHooks))); + up.setPreUploadHook(PreUploadHookChain.newChain(Lists.newArrayList(preUploadHooks))); + up.setPostUploadHook(PostUploadHookChain.newChain(Lists.newArrayList(postUploadHooks))); return up; } } @@ -232,7 +228,9 @@ public class GitOverHttpServlet extends GitServlet { private final UploadValidators.Factory uploadValidatorsFactory; @Inject - UploadFilter(Provider db, TagCache tagCache, + UploadFilter( + Provider db, + TagCache tagCache, ChangeNotes.Factory changeNotesFactory, @Nullable SearchingChangeCacheImpl changeCache, UploadValidators.Factory uploadValidatorsFactory) { @@ -244,16 +242,18 @@ public class GitOverHttpServlet extends GitServlet { } @Override - public void doFilter(ServletRequest request, ServletResponse response, - FilterChain next) throws IOException, ServletException { + public void doFilter(ServletRequest request, ServletResponse response, FilterChain next) + throws IOException, ServletException { // The Resolver above already checked READ access for us. Repository repo = ServletUtils.getRepository(request); ProjectControl pc = (ProjectControl) request.getAttribute(ATT_CONTROL); UploadPack up = (UploadPack) request.getAttribute(ServletUtils.ATTRIBUTE_HANDLER); if (!pc.canRunUploadPack()) { - GitSmartHttpTools.sendError((HttpServletRequest) request, - (HttpServletResponse) response, HttpServletResponse.SC_FORBIDDEN, + GitSmartHttpTools.sendError( + (HttpServletRequest) request, + (HttpServletResponse) response, + HttpServletResponse.SC_FORBIDDEN, "upload-pack not permitted on this server"); return; } @@ -261,21 +261,20 @@ public class GitOverHttpServlet extends GitServlet { // may have been overridden by a proxy server -- we'll try to avoid this. UploadValidators uploadValidators = uploadValidatorsFactory.create(pc.getProject(), repo, request.getRemoteHost()); - up.setPreUploadHook(PreUploadHookChain.newChain( - Lists.newArrayList(up.getPreUploadHook(), uploadValidators))); - up.setAdvertiseRefsHook(new VisibleRefFilter(tagCache, changeNotesFactory, - changeCache, repo, pc, db.get(), true)); + up.setPreUploadHook( + PreUploadHookChain.newChain(Lists.newArrayList(up.getPreUploadHook(), uploadValidators))); + up.setAdvertiseRefsHook( + new VisibleRefFilter( + tagCache, changeNotesFactory, changeCache, repo, pc, db.get(), true)); next.doFilter(request, response); } @Override - public void init(FilterConfig config) { - } + public void init(FilterConfig config) {} @Override - public void destroy() { - } + public void destroy() {} } static class ReceiveFactory implements ReceivePackFactory { @@ -305,8 +304,7 @@ public class GitOverHttpServlet extends GitServlet { } } - static class DisabledReceiveFactory implements - ReceivePackFactory { + static class DisabledReceiveFactory implements ReceivePackFactory { @Override public ReceivePack create(HttpServletRequest req, Repository db) throws ServiceNotEnabledException { @@ -318,16 +316,14 @@ public class GitOverHttpServlet extends GitServlet { private final Cache> cache; @Inject - ReceiveFilter( - @Named(ID_CACHE) Cache> cache) { + ReceiveFilter(@Named(ID_CACHE) Cache> cache) { this.cache = cache; } @Override - public void doFilter(ServletRequest request, ServletResponse response, - FilterChain chain) throws IOException, ServletException { - boolean isGet = - "GET".equalsIgnoreCase(((HttpServletRequest) request).getMethod()); + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + boolean isGet = "GET".equalsIgnoreCase(((HttpServletRequest) request).getMethod()); ReceiveCommits rc = (ReceiveCommits) request.getAttribute(ATT_RC); ReceivePack rp = rc.getReceivePack(); @@ -336,16 +332,20 @@ public class GitOverHttpServlet extends GitServlet { Project.NameKey projectName = pc.getProject().getNameKey(); if (!pc.canRunReceivePack()) { - GitSmartHttpTools.sendError((HttpServletRequest) request, - (HttpServletResponse) response, HttpServletResponse.SC_FORBIDDEN, + GitSmartHttpTools.sendError( + (HttpServletRequest) request, + (HttpServletResponse) response, + HttpServletResponse.SC_FORBIDDEN, "receive-pack not permitted on this server"); return; } final Capable s = rc.canUpload(); if (s != Capable.OK) { - GitSmartHttpTools.sendError((HttpServletRequest) request, - (HttpServletResponse) response, HttpServletResponse.SC_FORBIDDEN, + GitSmartHttpTools.sendError( + (HttpServletRequest) request, + (HttpServletResponse) response, + HttpServletResponse.SC_FORBIDDEN, "\n" + s.getMessage()); return; } @@ -360,8 +360,8 @@ public class GitOverHttpServlet extends GitServlet { return; } - AdvertisedObjectsCacheKey cacheKey = AdvertisedObjectsCacheKey.create( - pc.getUser().getAccountId(), projectName); + AdvertisedObjectsCacheKey cacheKey = + AdvertisedObjectsCacheKey.create(pc.getUser().getAccountId(), projectName); if (isGet) { cache.invalidate(cacheKey); @@ -376,17 +376,14 @@ public class GitOverHttpServlet extends GitServlet { chain.doFilter(request, response); if (isGet) { - cache.put(cacheKey, Collections.unmodifiableSet( - new HashSet<>(rp.getAdvertisedObjects()))); + cache.put(cacheKey, Collections.unmodifiableSet(new HashSet<>(rp.getAdvertisedObjects()))); } } @Override - public void init(FilterConfig arg0) { - } + public void init(FilterConfig arg0) {} @Override - public void destroy() { - } + public void destroy() {} } } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/H2CacheBasedWebSession.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/H2CacheBasedWebSession.java index 4b68f02708..c466290b28 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/H2CacheBasedWebSession.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/H2CacheBasedWebSession.java @@ -30,7 +30,6 @@ import com.google.inject.Provider; import com.google.inject.assistedinject.FactoryModuleBuilder; import com.google.inject.name.Named; import com.google.inject.servlet.RequestScoped; - import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -42,14 +41,15 @@ public class H2CacheBasedWebSession extends CacheBasedWebSession { protected void configure() { persist(WebSessionManager.CACHE_NAME, String.class, Val.class) .maximumWeight(1024) // reasonable default for many sites - .expireAfterWrite(CacheBasedWebSession.MAX_AGE_MINUTES, MINUTES) // expire sessions if they are inactive + .expireAfterWrite( + CacheBasedWebSession.MAX_AGE_MINUTES, + MINUTES) // expire sessions if they are inactive ; - install(new FactoryModuleBuilder() - .build(WebSessionManagerFactory.class)); + install(new FactoryModuleBuilder().build(WebSessionManagerFactory.class)); DynamicItem.itemOf(binder(), WebSession.class); DynamicItem.bind(binder(), WebSession.class) - .to(H2CacheBasedWebSession.class) - .in(RequestScoped.class); + .to(H2CacheBasedWebSession.class) + .in(RequestScoped.class); } }; } @@ -63,7 +63,7 @@ public class H2CacheBasedWebSession extends CacheBasedWebSession { AuthConfig authConfig, Provider anonymousProvider, RequestFactory identified) { - super(request, response, managerFactory.create(cache), authConfig, - anonymousProvider, identified); + super( + request, response, managerFactory.create(cache), authConfig, anonymousProvider, identified); } } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HtmlDomUtil.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HtmlDomUtil.java index 95f453654a..9acc754b6a 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HtmlDomUtil.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HtmlDomUtil.java @@ -17,13 +17,6 @@ package com.google.gerrit.httpd; import static java.nio.charset.StandardCharsets.UTF_8; import com.google.common.io.ByteStreams; - -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; - import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; @@ -33,7 +26,6 @@ import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.nio.file.Path; import java.util.zip.GZIPOutputStream; - import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -47,6 +39,11 @@ import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; /** Utility functions to deal with HTML using W3C DOM operations. */ public class HtmlDomUtil { @@ -83,8 +80,7 @@ public class HtmlDomUtil { serializer.setOutputProperty(OutputKeys.ENCODING, ENC.name()); serializer.setOutputProperty(OutputKeys.METHOD, "html"); serializer.setOutputProperty(OutputKeys.INDENT, "no"); - serializer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, - HtmlDomUtil.HTML_STRICT); + serializer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, HtmlDomUtil.HTML_STRICT); serializer.transform(domSource, streamResult); return out.toString(); } catch (TransformerException e) { @@ -145,8 +141,7 @@ public class HtmlDomUtil { } /** Parse an XHTML file from our CLASSPATH and return the instance. */ - public static Document parseFile(Class context, String name) - throws IOException { + public static Document parseFile(Class context, String name) throws IOException { try (InputStream in = context.getResourceAsStream(name)) { if (in == null) { return null; @@ -175,8 +170,7 @@ public class HtmlDomUtil { } /** Read a Read a UTF-8 text file from our CLASSPATH and return it. */ - public static String readFile(Class context, String name) - throws IOException { + public static String readFile(Class context, String name) throws IOException { try (InputStream in = context.getResourceAsStream(name)) { if (in == null) { return null; @@ -201,8 +195,7 @@ public class HtmlDomUtil { } /** Read a UTF-8 text file from the local drive. */ - public static String readFile(Path parentDir, String name) - throws IOException { + public static String readFile(Path parentDir, String name) throws IOException { if (parentDir == null) { return null; } @@ -216,8 +209,7 @@ public class HtmlDomUtil { } } - private static DocumentBuilder newBuilder() - throws ParserConfigurationException { + private static DocumentBuilder newBuilder() throws ParserConfigurationException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(false); factory.setExpandEntityReferences(false); diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpCanonicalWebUrlProvider.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpCanonicalWebUrlProvider.java index 0492e863a5..6411ee5719 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpCanonicalWebUrlProvider.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpCanonicalWebUrlProvider.java @@ -20,10 +20,8 @@ import com.google.inject.Inject; import com.google.inject.OutOfScopeException; import com.google.inject.Provider; import com.google.inject.ProvisionException; - -import org.eclipse.jgit.lib.Config; - import javax.servlet.http.HttpServletRequest; +import org.eclipse.jgit.lib.Config; /** Sets {@code CanonicalWebUrl} to current HTTP request if not configured. */ public class HttpCanonicalWebUrlProvider extends CanonicalWebUrlProvider { diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpLogoutServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpLogoutServlet.java index 88584ebb57..00c18af19a 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpLogoutServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpLogoutServlet.java @@ -26,9 +26,7 @@ import com.google.gerrit.server.config.CanonicalWebUrl; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; - import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -43,7 +41,8 @@ public class HttpLogoutServlet extends HttpServlet { private final AuditService audit; @Inject - protected HttpLogoutServlet(final AuthConfig authConfig, + protected HttpLogoutServlet( + final AuthConfig authConfig, final DynamicItem webSession, @CanonicalWebUrl @Nullable final Provider urlProvider, final AuditService audit) { @@ -53,8 +52,8 @@ public class HttpLogoutServlet extends HttpServlet { this.audit = audit; } - protected void doLogout(final HttpServletRequest req, - final HttpServletResponse rsp) throws IOException { + protected void doLogout(final HttpServletRequest req, final HttpServletResponse rsp) + throws IOException { webSession.get().logout(); if (logoutUrl != null) { rsp.sendRedirect(logoutUrl); @@ -74,8 +73,8 @@ public class HttpLogoutServlet extends HttpServlet { } @Override - protected void doGet(final HttpServletRequest req, - final HttpServletResponse rsp) throws IOException { + protected void doGet(final HttpServletRequest req, final HttpServletResponse rsp) + throws IOException { final String sid = webSession.get().getSessionId(); final CurrentUser currentUser = webSession.get().getUser(); @@ -85,9 +84,7 @@ public class HttpLogoutServlet extends HttpServlet { try { doLogout(req, rsp); } finally { - audit.dispatch(new AuditEvent(sid, currentUser, - what, when, null, null)); + audit.dispatch(new AuditEvent(sid, currentUser, what, when, null, null)); } } - } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpRemotePeerProvider.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpRemotePeerProvider.java index 9e0b0421e4..2dedd8699e 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpRemotePeerProvider.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpRemotePeerProvider.java @@ -18,12 +18,10 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.ProvisionException; import com.google.inject.servlet.RequestScoped; - import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.net.UnknownHostException; - import javax.servlet.http.HttpServletRequest; @RequestScoped diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpRequestContext.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpRequestContext.java index adad03f89c..6cc7a175f6 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpRequestContext.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpRequestContext.java @@ -27,8 +27,7 @@ class HttpRequestContext implements RequestContext { private final RequestScopedReviewDbProvider provider; @Inject - HttpRequestContext(DynamicItem session, - RequestScopedReviewDbProvider provider) { + HttpRequestContext(DynamicItem session, RequestScopedReviewDbProvider provider) { this.session = session; this.provider = provider; } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpServletResponseRecorder.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpServletResponseRecorder.java index 3f419ed54a..3a43e2496f 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpServletResponseRecorder.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpServletResponseRecorder.java @@ -14,25 +14,22 @@ package com.google.gerrit.httpd; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.util.HashMap; import java.util.Map; - import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * HttpServletResponse wrapper to allow response status code override. * - * Differently from the normal HttpServletResponse, this class allows multiple - * filters to override the response http status code. + *

Differently from the normal HttpServletResponse, this class allows multiple filters to + * override the response http status code. */ public class HttpServletResponseRecorder extends HttpServletResponseWrapper { - private static final Logger log = LoggerFactory - .getLogger(HttpServletResponseWrapper.class); + private static final Logger log = LoggerFactory.getLogger(HttpServletResponseWrapper.class); private static final String LOCATION_HEADER = "Location"; private int status; diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/LoginUrlToken.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/LoginUrlToken.java index a4874a9ffd..87de00303a 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/LoginUrlToken.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/LoginUrlToken.java @@ -17,7 +17,6 @@ package com.google.gerrit.httpd; import com.google.common.base.CharMatcher; import com.google.common.base.Strings; import com.google.gerrit.common.PageLinks; - import javax.servlet.http.HttpServletRequest; public class LoginUrlToken { @@ -31,6 +30,5 @@ public class LoginUrlToken { return CharMatcher.is('/').trimLeadingFrom(token); } - private LoginUrlToken() { - } + private LoginUrlToken() {} } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectBasicAuthFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectBasicAuthFilter.java index fab0aeb716..60482d3931 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectBasicAuthFilter.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectBasicAuthFilter.java @@ -34,14 +34,8 @@ import com.google.gerrit.server.auth.NoSuchUserException; import com.google.gerrit.server.config.AuthConfig; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.apache.commons.codec.binary.Base64; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.util.Locale; - import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -51,22 +45,23 @@ import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; +import org.apache.commons.codec.binary.Base64; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Authenticates the current user by HTTP basic authentication. - *

- * The current HTTP request is authenticated by looking up the username and - * password from the Base64 encoded Authorization header and validating them - * against any username/password configured authentication system in Gerrit. - * This filter is intended only to protect the {@link GitOverHttpServlet} and - * its handled URLs, which provide remote repository access over HTTP. + * + *

The current HTTP request is authenticated by looking up the username and password from the + * Base64 encoded Authorization header and validating them against any username/password configured + * authentication system in Gerrit. This filter is intended only to protect the {@link + * GitOverHttpServlet} and its handled URLs, which provide remote repository access over HTTP. * * @see RFC 2617 */ @Singleton class ProjectBasicAuthFilter implements Filter { - private static final Logger log = LoggerFactory - .getLogger(ProjectBasicAuthFilter.class); + private static final Logger log = LoggerFactory.getLogger(ProjectBasicAuthFilter.class); public static final String REALM_NAME = "Gerrit Code Review"; private static final String AUTHORIZATION = "Authorization"; @@ -78,8 +73,10 @@ class ProjectBasicAuthFilter implements Filter { private final AuthConfig authConfig; @Inject - ProjectBasicAuthFilter(DynamicItem session, - AccountCache accountCache, AccountManager accountManager, + ProjectBasicAuthFilter( + DynamicItem session, + AccountCache accountCache, + AccountManager accountManager, AuthConfig authConfig) { this.session = session; this.accountCache = accountCache; @@ -88,16 +85,14 @@ class ProjectBasicAuthFilter implements Filter { } @Override - public void init(FilterConfig config) { - } + public void init(FilterConfig config) {} @Override - public void destroy() { - } + public void destroy() {} @Override - public void doFilter(ServletRequest request, ServletResponse response, - FilterChain chain) throws IOException, ServletException { + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; Response rsp = new Response((HttpServletResponse) response); @@ -106,8 +101,7 @@ class ProjectBasicAuthFilter implements Filter { } } - private boolean verify(HttpServletRequest req, Response rsp) - throws IOException { + private boolean verify(HttpServletRequest req, Response rsp) throws IOException { final String hdr = req.getHeader(AUTHORIZATION); if (hdr == null || !hdr.startsWith(LIT_BASIC)) { // Allow an anonymous connection through, or it might be using a @@ -115,8 +109,7 @@ class ProjectBasicAuthFilter implements Filter { return true; } - final byte[] decoded = - Base64.decodeBase64(hdr.substring(LIT_BASIC.length())); + final byte[] decoded = Base64.decodeBase64(hdr.substring(LIT_BASIC.length())); String usernamePassword = new String(decoded, encoding(req)); int splitPos = usernamePassword.indexOf(':'); if (splitPos < 1) { @@ -136,8 +129,10 @@ class ProjectBasicAuthFilter implements Filter { final AccountState who = accountCache.getByUsername(username); if (who == null || !who.getAccount().isActive()) { - log.warn("Authentication failed for " + username - + ": account inactive or not provisioned in Gerrit"); + log.warn( + "Authentication failed for " + + username + + ": account inactive or not provisioned in Gerrit"); rsp.sendError(SC_UNAUTHORIZED); return false; } @@ -184,10 +179,10 @@ class ProjectBasicAuthFilter implements Filter { return true; } - private boolean failAuthentication(Response rsp, String username) - throws IOException { - log.warn("Authentication failed for {}: password does not match the one" - + " stored in Gerrit", username); + private boolean failAuthentication(Response rsp, String username) throws IOException { + log.warn( + "Authentication failed for {}: password does not match the one" + " stored in Gerrit", + username); rsp.sendError(SC_UNAUTHORIZED); return false; } @@ -199,11 +194,10 @@ class ProjectBasicAuthFilter implements Filter { ws.setAccessPathOk(AccessPath.REST_API, true); } - private boolean passwordMatchesTheUserGeneratedOne(AccountState who, - String username, String password) { + private boolean passwordMatchesTheUserGeneratedOne( + AccountState who, String username, String password) { String accountPassword = who.getPassword(username); - return accountPassword != null && password != null - && accountPassword.equals(password); + return accountPassword != null && password != null && accountPassword.equals(password); } private String encoding(HttpServletRequest req) { diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectDigestFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectDigestFilter.java index f66f3973d7..7da8cda53b 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectDigestFilter.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectDigestFilter.java @@ -33,9 +33,6 @@ import com.google.gwtjsonrpc.server.XsrfException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.Config; - import java.io.IOException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; @@ -43,7 +40,6 @@ import java.util.Collections; import java.util.HashMap; import java.util.Locale; import java.util.Map; - import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -54,14 +50,15 @@ import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; +import org.eclipse.jgit.lib.Config; /** * Authenticates the current user by HTTP digest authentication. - *

- * The current HTTP request is authenticated by looking up the username from the - * Authorization header and checking the digest response against the stored - * password. This filter is intended only to protect the {@link GitOverHttpServlet} - * and its handled URLs, which provide remote repository access over HTTP. + * + *

The current HTTP request is authenticated by looking up the username from the Authorization + * header and checking the digest response against the stored password. This filter is intended only + * to protect the {@link GitOverHttpServlet} and its handled URLs, which provide remote repository + * access over HTTP. * * @see RFC 2617 */ @@ -78,9 +75,12 @@ class ProjectDigestFilter implements Filter { private ServletContext context; @Inject - ProjectDigestFilter(@CanonicalWebUrl @Nullable Provider urlProvider, - DynamicItem session, AccountCache accountCache, - @GerritServerConfig Config config) throws XsrfException { + ProjectDigestFilter( + @CanonicalWebUrl @Nullable Provider urlProvider, + DynamicItem session, + AccountCache accountCache, + @GerritServerConfig Config config) + throws XsrfException { this.urlProvider = urlProvider; this.session = session; this.accountCache = accountCache; @@ -94,12 +94,11 @@ class ProjectDigestFilter implements Filter { } @Override - public void destroy() { - } + public void destroy() {} @Override - public void doFilter(ServletRequest request, ServletResponse response, - FilterChain chain) throws IOException, ServletException { + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; Response rsp = new Response(req, (HttpServletResponse) response); @@ -108,8 +107,7 @@ class ProjectDigestFilter implements Filter { } } - private boolean verify(HttpServletRequest req, Response rsp) - throws IOException { + private boolean verify(HttpServletRequest req, Response rsp) throws IOException { final String hdr = req.getHeader(AUTHORIZATION); if (hdr == null || !hdr.startsWith("Digest ")) { // Allow an anonymous connection through, or it might be using a @@ -146,7 +144,7 @@ class ProjectDigestFilter implements Filter { } final AccountState who = accountCache.getByUsername(username); - if (who == null || ! who.getAccount().isActive()) { + if (who == null || !who.getAccount().isActive()) { rsp.sendError(SC_UNAUTHORIZED); return false; } @@ -159,8 +157,7 @@ class ProjectDigestFilter implements Filter { final String A1 = user + ":" + realm + ":" + passwd; final String A2 = method + ":" + uri; - final String expect = - KD(H(A1), nonce + ":" + nc + ":" + cnonce + ":" + qop + ":" + H(A2)); + final String expect = KD(H(A1), nonce + ":" + nc + ":" + cnonce + ":" + qop + ":" + H(A2)); if (expect.equals(response)) { try { @@ -170,7 +167,6 @@ class ProjectDigestFilter implements Filter { ws.setAccessPathOk(AccessPath.GIT, true); ws.setAccessPathOk(AccessPath.REST_API, true); return true; - } rsp.stale = true; rsp.sendError(SC_UNAUTHORIZED); @@ -180,7 +176,6 @@ class ProjectDigestFilter implements Filter { rsp.sendError(SC_INTERNAL_SERVER_ERROR); return false; } - } rsp.sendError(SC_UNAUTHORIZED); return false; @@ -208,9 +203,10 @@ class ProjectDigestFilter implements Filter { } } - private static final char[] LHEX = - {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', // - 'a', 'b', 'c', 'd', 'e', 'f',}; + private static final char[] LHEX = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', // + 'a', 'b', 'c', 'd', 'e', 'f', + }; private static String LHEX(byte[] bin) { StringBuilder r = new StringBuilder(bin.length * 2); diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectOAuthFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectOAuthFilter.java index 7cadbae375..1f21da28fb 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectOAuthFilter.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectOAuthFilter.java @@ -34,18 +34,11 @@ import com.google.gerrit.server.account.AuthResult; import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.apache.commons.codec.binary.Base64; -import org.eclipse.jgit.lib.Config; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.Locale; import java.util.NoSuchElementException; - import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -56,6 +49,10 @@ import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; +import org.apache.commons.codec.binary.Base64; +import org.eclipse.jgit.lib.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Authenticates the current user with an OAuth2 server. @@ -65,8 +62,7 @@ import javax.servlet.http.HttpServletResponseWrapper; @Singleton class ProjectOAuthFilter implements Filter { - private static final Logger log = LoggerFactory - .getLogger(ProjectOAuthFilter.class); + private static final Logger log = LoggerFactory.getLogger(ProjectOAuthFilter.class); private static final String REALM_NAME = "Gerrit Code Review"; private static final String AUTHORIZATION = "Authorization"; @@ -84,7 +80,8 @@ class ProjectOAuthFilter implements Filter { private String defaultAuthProvider; @Inject - ProjectOAuthFilter(DynamicItem session, + ProjectOAuthFilter( + DynamicItem session, DynamicMap pluginsProvider, AccountCache accountCache, AccountManager accountManager, @@ -93,10 +90,8 @@ class ProjectOAuthFilter implements Filter { this.loginProviders = pluginsProvider; this.accountCache = accountCache; this.accountManager = accountManager; - this.gitOAuthProvider = - gerritConfig.getString("auth", null, "gitOAuthProvider"); - this.userNameToLowerCase = - gerritConfig.getBoolean("auth", null, "userNameToLowerCase", false); + this.gitOAuthProvider = gerritConfig.getString("auth", null, "gitOAuthProvider"); + this.userNameToLowerCase = gerritConfig.getBoolean("auth", null, "userNameToLowerCase", false); } @Override @@ -109,12 +104,11 @@ class ProjectOAuthFilter implements Filter { } @Override - public void destroy() { - } + public void destroy() {} @Override - public void doFilter(ServletRequest request, ServletResponse response, - FilterChain chain) throws IOException, ServletException { + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; Response rsp = new Response((HttpServletResponse) response); if (verify(req, rsp)) { @@ -122,8 +116,7 @@ class ProjectOAuthFilter implements Filter { } } - private boolean verify(HttpServletRequest req, Response rsp) - throws IOException { + private boolean verify(HttpServletRequest req, Response rsp) throws IOException { AuthInfo authInfo = null; // first check if there is a BASIC authentication header @@ -159,14 +152,15 @@ class ProjectOAuthFilter implements Filter { AccountState who = accountCache.getByUsername(authInfo.username); if (who == null || !who.getAccount().isActive()) { - log.warn("Authentication failed for " + authInfo.username - + ": account inactive or not provisioned in Gerrit"); + log.warn( + "Authentication failed for " + + authInfo.username + + ": account inactive or not provisioned in Gerrit"); rsp.sendError(SC_UNAUTHORIZED); return false; } - AuthRequest authRequest = AuthRequest.forExternalUser( - authInfo.username); + AuthRequest authRequest = AuthRequest.forExternalUser(authInfo.username); authRequest.setEmailAddress(who.getAccount().getPreferredEmail()); authRequest.setDisplayName(who.getAccount().getFullName()); authRequest.setPassword(authInfo.tokenOrSecret); @@ -188,17 +182,14 @@ class ProjectOAuthFilter implements Filter { } /** - * Picks the only installed OAuth provider. If there is a multiude - * of providers available, the actual provider must be determined - * from the authentication request. + * Picks the only installed OAuth provider. If there is a multiude of providers available, the + * actual provider must be determined from the authentication request. * - * @throws ServletException if there is no {@code OAuthLoginProvider} - * installed at all. + * @throws ServletException if there is no {@code OAuthLoginProvider} installed at all. */ private void pickOnlyProvider() throws ServletException { try { - Entry loginProvider = - Iterables.getOnlyElement(loginProviders); + Entry loginProvider = Iterables.getOnlyElement(loginProviders); defaultAuthPlugin = loginProvider.getPluginName(); defaultAuthProvider = loginProvider.getExportName(); } catch (NoSuchElementException e) { @@ -209,8 +200,7 @@ class ProjectOAuthFilter implements Filter { } /** - * Picks the {@code OAuthLoginProvider} configured with - * auth.gitOAuthProvider. + * Picks the {@code OAuthLoginProvider} configured with auth.gitOAuthProvider. * * @throws ServletException if the configured provider was not found. */ @@ -218,16 +208,16 @@ class ProjectOAuthFilter implements Filter { int splitPos = gitOAuthProvider.lastIndexOf(':'); if (splitPos < 1 || splitPos == gitOAuthProvider.length() - 1) { // no colon at all or leading/trailing colon: malformed providerId - throw new ServletException("OAuth login provider configuration is" - + " invalid: Must be of the form pluginName:providerName"); + throw new ServletException( + "OAuth login provider configuration is" + + " invalid: Must be of the form pluginName:providerName"); } defaultAuthPlugin = gitOAuthProvider.substring(0, splitPos); defaultAuthProvider = gitOAuthProvider.substring(splitPos + 1); - OAuthLoginProvider provider = loginProviders.get(defaultAuthPlugin, - defaultAuthProvider); + OAuthLoginProvider provider = loginProviders.get(defaultAuthPlugin, defaultAuthProvider); if (provider == null) { - throw new ServletException("Configured OAuth login provider " - + gitOAuthProvider + " wasn't installed"); + throw new ServletException( + "Configured OAuth login provider " + gitOAuthProvider + " wasn't installed"); } } @@ -239,23 +229,23 @@ class ProjectOAuthFilter implements Filter { if (splitPos < 1 || splitPos == usernamePassword.length() - 1) { return null; } - return new AuthInfo(usernamePassword.substring(0, splitPos), - usernamePassword.substring(splitPos + 1), defaultAuthPlugin, + return new AuthInfo( + usernamePassword.substring(0, splitPos), + usernamePassword.substring(splitPos + 1), + defaultAuthPlugin, defaultAuthProvider); } - private AuthInfo extractAuthInfo(Cookie cookie) - throws UnsupportedEncodingException { - String username = URLDecoder.decode(cookie.getName() - .substring(GIT_COOKIE_PREFIX.length()), UTF_8.name()); + private AuthInfo extractAuthInfo(Cookie cookie) throws UnsupportedEncodingException { + String username = + URLDecoder.decode(cookie.getName().substring(GIT_COOKIE_PREFIX.length()), UTF_8.name()); String value = cookie.getValue(); int splitPos = value.lastIndexOf('@'); if (splitPos < 1 || splitPos == value.length() - 1) { // no providerId in the cookie value => assume default provider // note: a leading/trailing at sign is considered to belong to // the access token rather than being a separator - return new AuthInfo(username, cookie.getValue(), - defaultAuthPlugin, defaultAuthProvider); + return new AuthInfo(username, cookie.getValue(), defaultAuthPlugin, defaultAuthProvider); } String token = value.substring(0, splitPos); String providerId = value.substring(splitPos + 1); @@ -295,11 +285,8 @@ class ProjectOAuthFilter implements Filter { private final String pluginName; private final String exportName; - private AuthInfo(String username, String tokenOrSecret, - String pluginName, String exportName) { - this.username = userNameToLowerCase - ? username.toLowerCase(Locale.US) - : username; + private AuthInfo(String username, String tokenOrSecret, String pluginName, String exportName) { + this.username = userNameToLowerCase ? username.toLowerCase(Locale.US) : username; this.tokenOrSecret = tokenOrSecret; this.pluginName = pluginName; this.exportName = exportName; diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProxyProperties.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProxyProperties.java index 67b97c4ec2..5977398cc9 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProxyProperties.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProxyProperties.java @@ -18,6 +18,8 @@ import java.net.URL; public interface ProxyProperties { URL getProxyUrl(); + String getUsername(); + String getPassword(); } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProxyPropertiesProvider.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProxyPropertiesProvider.java index 0e51cc2c52..b0a801348e 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProxyPropertiesProvider.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProxyPropertiesProvider.java @@ -19,11 +19,9 @@ import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.Config; - import java.net.MalformedURLException; import java.net.URL; +import org.eclipse.jgit.lib.Config; @Singleton class ProxyPropertiesProvider implements Provider { @@ -33,8 +31,7 @@ class ProxyPropertiesProvider implements Provider { private String proxyPassword; @Inject - ProxyPropertiesProvider(@GerritServerConfig Config config) - throws MalformedURLException { + ProxyPropertiesProvider(@GerritServerConfig Config config) throws MalformedURLException { String proxyUrlStr = config.getString("http", null, "proxy"); if (!Strings.isNullOrEmpty(proxyUrlStr)) { proxyUrl = new URL(proxyUrlStr); @@ -60,10 +57,12 @@ class ProxyPropertiesProvider implements Provider { public URL getProxyUrl() { return proxyUrl; } + @Override public String getUsername() { return proxyUser; } + @Override public String getPassword() { return proxyPassword; diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RemoteUserUtil.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RemoteUserUtil.java index e99838a410..a02b5a017c 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RemoteUserUtil.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RemoteUserUtil.java @@ -18,26 +18,24 @@ import static com.google.common.base.Strings.emptyToNull; import static com.google.common.net.HttpHeaders.AUTHORIZATION; import static java.nio.charset.StandardCharsets.UTF_8; -import org.eclipse.jgit.util.Base64; - import javax.servlet.http.HttpServletRequest; +import org.eclipse.jgit.util.Base64; public class RemoteUserUtil { /** * Tries to get username from a request with following strategies: + * *

    - *
  • ServletRequest#getRemoteUser
  • - *
  • HTTP 'Authorization' header
  • - *
  • Custom HTTP header
  • + *
  • ServletRequest#getRemoteUser + *
  • HTTP 'Authorization' header + *
  • Custom HTTP header *
* * @param req request to extract username from. - * @param loginHeader name of header which is used for extracting - * username. + * @param loginHeader name of header which is used for extracting username. * @return the extracted username or null. */ - public static String getRemoteUser(HttpServletRequest req, - String loginHeader) { + public static String getRemoteUser(HttpServletRequest req, String loginHeader) { if (AUTHORIZATION.equals(loginHeader)) { String user = emptyToNull(req.getRemoteUser()); if (user != null) { @@ -59,8 +57,7 @@ public class RemoteUserUtil { } /** - * Extracts username from an HTTP Basic or Digest authentication - * header. + * Extracts username from an HTTP Basic or Digest authentication header. * * @param auth header value which is used for extracting. * @return username if available or null. diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequestContextFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequestContextFilter.java index b46505f0e1..548db48760 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequestContextFilter.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequestContextFilter.java @@ -22,9 +22,7 @@ import com.google.inject.Module; import com.google.inject.Provider; import com.google.inject.Singleton; import com.google.inject.servlet.ServletModule; - import java.io.IOException; - import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -49,7 +47,8 @@ public class RequestContextFilter implements Filter { private final ThreadLocalRequestContext local; @Inject - RequestContextFilter(final Provider r, + RequestContextFilter( + final Provider r, final Provider c, final ThreadLocalRequestContext l) { cleanup = r; @@ -58,16 +57,14 @@ public class RequestContextFilter implements Filter { } @Override - public void init(FilterConfig filterConfig) { - } + public void init(FilterConfig filterConfig) {} @Override - public void destroy() { - } + public void destroy() {} @Override - public void doFilter(final ServletRequest request, - final ServletResponse response, final FilterChain chain) + public void doFilter( + final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException { RequestContext old = local.setContext(requestContext.get()); try { diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequestMetrics.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequestMetrics.java index ec193c9f46..cab4a922a3 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequestMetrics.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequestMetrics.java @@ -28,17 +28,15 @@ public class RequestMetrics { @Inject public RequestMetrics(MetricMaker metricMaker) { - errors = metricMaker.newCounter( - "http/server/error_count", - new Description("Rate of REST API error responses") - .setRate() - .setUnit("errors"), - Field.ofInteger("status", "HTTP status code")); - successes = metricMaker.newCounter( - "http/server/success_count", - new Description("Rate of REST API success responses") - .setRate() - .setUnit("successes"), - Field.ofInteger("status", "HTTP status code")); + errors = + metricMaker.newCounter( + "http/server/error_count", + new Description("Rate of REST API error responses").setRate().setUnit("errors"), + Field.ofInteger("status", "HTTP status code")); + successes = + metricMaker.newCounter( + "http/server/success_count", + new Description("Rate of REST API success responses").setRate().setUnit("successes"), + Field.ofInteger("status", "HTTP status code")); } } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequestMetricsFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequestMetricsFilter.java index 48b2a2fdb9..c7a7540451 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequestMetricsFilter.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequestMetricsFilter.java @@ -18,9 +18,7 @@ import com.google.inject.Inject; import com.google.inject.Module; import com.google.inject.Singleton; import com.google.inject.servlet.ServletModule; - import java.io.IOException; - import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -49,20 +47,18 @@ public class RequestMetricsFilter implements Filter { } @Override - public void destroy() { - } + public void destroy() {} @Override - public void doFilter(ServletRequest request, ServletResponse response, - FilterChain chain) throws IOException, ServletException { + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { Response rsp = new Response((HttpServletResponse) response, metrics); chain.doFilter(request, rsp); } @Override - public void init(FilterConfig cfg) throws ServletException { - } + public void init(FilterConfig cfg) throws ServletException {} private static class Response extends HttpServletResponseWrapper { private final RequestMetrics metrics; diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequireIdentifiedUserFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequireIdentifiedUserFilter.java index 2448d3f4f5..522d0b62c1 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequireIdentifiedUserFilter.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequireIdentifiedUserFilter.java @@ -18,9 +18,7 @@ import com.google.gerrit.server.CurrentUser; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; - import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -40,16 +38,13 @@ class RequireIdentifiedUserFilter implements Filter { } @Override - public void init(FilterConfig filterConfig) { - } + public void init(FilterConfig filterConfig) {} @Override - public void destroy() { - } + public void destroy() {} @Override - public void doFilter(ServletRequest request, - ServletResponse response, FilterChain chain) + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if (user.get().isIdentifiedUser()) { chain.doFilter(request, response); diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequireSslFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequireSslFilter.java index 4cb8e92b4b..4bdd1f04e8 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequireSslFilter.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequireSslFilter.java @@ -20,9 +20,7 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; import com.google.inject.servlet.ServletModule; - import java.io.IOException; - import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -59,16 +57,14 @@ public class RequireSslFilter implements Filter { } @Override - public void init(FilterConfig filterConfig) { - } + public void init(FilterConfig filterConfig) {} @Override - public void destroy() { - } + public void destroy() {} @Override - public void doFilter(final ServletRequest request, - final ServletResponse response, final FilterChain chain) + public void doFilter( + final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException { final HttpServletRequest req = (HttpServletRequest) request; final HttpServletResponse rsp = (HttpServletResponse) response; @@ -100,7 +96,6 @@ public class RequireSslFilter implements Filter { } private static boolean isLocalHost(final HttpServletRequest req) { - return "localhost".equals(req.getServerName()) - || "127.0.0.1".equals(req.getServerName()); + return "localhost".equals(req.getServerName()) || "127.0.0.1".equals(req.getServerName()); } } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RunAsFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RunAsFilter.java index 7e71639de2..4862a70cf2 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RunAsFilter.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RunAsFilter.java @@ -29,12 +29,7 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; import com.google.inject.servlet.ServletModule; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; - import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -43,6 +38,8 @@ import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** Allows running a request as another user account. */ @Singleton @@ -63,7 +60,8 @@ class RunAsFilter implements Filter { private final AccountResolver accountResolver; @Inject - RunAsFilter(Provider db, + RunAsFilter( + Provider db, AuthConfig config, DynamicItem session, AccountResolver accountResolver) { @@ -74,18 +72,15 @@ class RunAsFilter implements Filter { } @Override - public void doFilter(ServletRequest request, ServletResponse response, - FilterChain chain) throws IOException, ServletException { + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; String runas = req.getHeader(RUN_AS); if (runas != null) { if (!enabled) { - replyError(req, res, - SC_FORBIDDEN, - RUN_AS + " disabled by auth.enableRunAs = false", - null); + replyError(req, res, SC_FORBIDDEN, RUN_AS + " disabled by auth.enableRunAs = false", null); return; } @@ -94,10 +89,7 @@ class RunAsFilter implements Filter { // Always disallow for anonymous users, even if permitted by the ACL, // because that would be crazy. || !self.isIdentifiedUser()) { - replyError(req, res, - SC_FORBIDDEN, - "not permitted to use " + RUN_AS, - null); + replyError(req, res, SC_FORBIDDEN, "not permitted to use " + RUN_AS, null); return; } @@ -106,17 +98,11 @@ class RunAsFilter implements Filter { target = accountResolver.find(db.get(), runas); } catch (OrmException e) { log.warn("cannot resolve account for " + RUN_AS, e); - replyError(req, res, - SC_INTERNAL_SERVER_ERROR, - "cannot resolve " + RUN_AS, - e); + replyError(req, res, SC_INTERNAL_SERVER_ERROR, "cannot resolve " + RUN_AS, e); return; } if (target == null) { - replyError(req, res, - SC_FORBIDDEN, - "no account matches " + RUN_AS, - null); + replyError(req, res, SC_FORBIDDEN, "no account matches " + RUN_AS, null); return; } session.get().setUserAccountId(target.getId()); @@ -126,10 +112,8 @@ class RunAsFilter implements Filter { } @Override - public void init(FilterConfig filterConfig) { - } + public void init(FilterConfig filterConfig) {} @Override - public void destroy() { - } + public void destroy() {} } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/UniversalWebLoginFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/UniversalWebLoginFilter.java index f6efb61a28..48780063ae 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/UniversalWebLoginFilter.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/UniversalWebLoginFilter.java @@ -22,10 +22,8 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; import com.google.inject.servlet.ServletModule; - import java.io.IOException; import java.util.Optional; - import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -53,7 +51,8 @@ public class UniversalWebLoginFilter implements Filter { } @Inject - public UniversalWebLoginFilter(DynamicItem session, + public UniversalWebLoginFilter( + DynamicItem session, DynamicSet webLoginListeners, Provider userProvider) { this.session = session; @@ -62,12 +61,11 @@ public class UniversalWebLoginFilter implements Filter { } @Override - public void init(FilterConfig filterConfig) throws ServletException { - } + public void init(FilterConfig filterConfig) throws ServletException {} @Override - public void doFilter(ServletRequest request, ServletResponse response, - FilterChain chain) throws IOException, ServletException { + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponseRecorder wrappedResponse = new HttpServletResponseRecorder((HttpServletResponse) response); @@ -78,13 +76,11 @@ public class UniversalWebLoginFilter implements Filter { if (!loggedInUserBefore.isPresent() && loggedInUserAfter.isPresent()) { for (WebLoginListener loginListener : webLoginListeners) { - loginListener.onLogin(loggedInUserAfter.get(), httpRequest, - wrappedResponse); + loginListener.onLogin(loggedInUserAfter.get(), httpRequest, wrappedResponse); } } else if (loggedInUserBefore.isPresent() && !loggedInUserAfter.isPresent()) { for (WebLoginListener loginListener : webLoginListeners) { - loginListener.onLogout(loggedInUserBefore.get(), httpRequest, - wrappedResponse); + loginListener.onLogout(loggedInUserBefore.get(), httpRequest, wrappedResponse); } } @@ -92,13 +88,11 @@ public class UniversalWebLoginFilter implements Filter { } private Optional loggedInUser() { - return session.get().isSignedIn() ? - Optional.of(userProvider.get().asIdentifiedUser()) : - Optional.empty(); + return session.get().isSignedIn() + ? Optional.of(userProvider.get().asIdentifiedUser()) + : Optional.empty(); } @Override - public void destroy() { - } - + public void destroy() {} } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/UrlModule.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/UrlModule.java index 842c575d7f..b6719e6332 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/UrlModule.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/UrlModule.java @@ -40,14 +40,11 @@ import com.google.inject.Key; import com.google.inject.Provider; import com.google.inject.internal.UniqueAnnotations; import com.google.inject.servlet.ServletModule; - -import org.eclipse.jgit.lib.Constants; - import java.io.IOException; - import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.eclipse.jgit.lib.Constants; class UrlModule extends ServletModule { private GerritOptions options; @@ -74,8 +71,7 @@ class UrlModule extends ServletModule { } serve("/cat/*").with(CatServlet.class); - if (authConfig.getAuthType() != AuthType.OAUTH && - authConfig.getAuthType() != AuthType.OPENID) { + if (authConfig.getAuthType() != AuthType.OAUTH && authConfig.getAuthType() != AuthType.OPENID) { serve("/logout").with(HttpLogoutServlet.class); serve("/signout").with(HttpLogoutServlet.class); } @@ -120,143 +116,157 @@ class UrlModule extends ServletModule { } private Key notFound() { - return key(new HttpServlet() { - private static final long serialVersionUID = 1L; + return key( + new HttpServlet() { + private static final long serialVersionUID = 1L; - @Override - protected void doGet(final HttpServletRequest req, - final HttpServletResponse rsp) throws IOException { - rsp.sendError(HttpServletResponse.SC_NOT_FOUND); - } - }); + @Override + protected void doGet(final HttpServletRequest req, final HttpServletResponse rsp) + throws IOException { + rsp.sendError(HttpServletResponse.SC_NOT_FOUND); + } + }); } private Key gerritUrl() { - return key(new HttpServlet() { - private static final long serialVersionUID = 1L; + return key( + new HttpServlet() { + private static final long serialVersionUID = 1L; - @Override - protected void doGet(final HttpServletRequest req, - final HttpServletResponse rsp) throws IOException { - toGerrit(req.getRequestURI(), req, rsp); - } - }); + @Override + protected void doGet(final HttpServletRequest req, final HttpServletResponse rsp) + throws IOException { + toGerrit(req.getRequestURI(), req, rsp); + } + }); } private Key screen(final String target) { - return key(new HttpServlet() { - private static final long serialVersionUID = 1L; + return key( + new HttpServlet() { + private static final long serialVersionUID = 1L; - @Override - protected void doGet(final HttpServletRequest req, - final HttpServletResponse rsp) throws IOException { - toGerrit(target, req, rsp); - } - }); + @Override + protected void doGet(final HttpServletRequest req, final HttpServletResponse rsp) + throws IOException { + toGerrit(target, req, rsp); + } + }); } private Key legacyGerritScreen() { - return key(new HttpServlet() { - private static final long serialVersionUID = 1L; + return key( + new HttpServlet() { + private static final long serialVersionUID = 1L; - @Override - protected void doGet(final HttpServletRequest req, - final HttpServletResponse rsp) throws IOException { - final String token = req.getPathInfo().substring(1); - toGerrit(token, req, rsp); - } - }); + @Override + protected void doGet(final HttpServletRequest req, final HttpServletResponse rsp) + throws IOException { + final String token = req.getPathInfo().substring(1); + toGerrit(token, req, rsp); + } + }); } private Key directChangeById() { - return key(new HttpServlet() { - private static final long serialVersionUID = 1L; + return key( + new HttpServlet() { + private static final long serialVersionUID = 1L; - @Override - protected void doGet(final HttpServletRequest req, - final HttpServletResponse rsp) throws IOException { - try { - String idString = req.getPathInfo(); - if (idString.endsWith("/")) { - idString = idString.substring(0, idString.length() - 1); + @Override + protected void doGet(final HttpServletRequest req, final HttpServletResponse rsp) + throws IOException { + try { + String idString = req.getPathInfo(); + if (idString.endsWith("/")) { + idString = idString.substring(0, idString.length() - 1); + } + Change.Id id = Change.Id.parse(idString); + toGerrit(PageLinks.toChange(id), req, rsp); + } catch (IllegalArgumentException err) { + rsp.sendError(HttpServletResponse.SC_NOT_FOUND); + } } - Change.Id id = Change.Id.parse(idString); - toGerrit(PageLinks.toChange(id), req, rsp); - } catch (IllegalArgumentException err) { - rsp.sendError(HttpServletResponse.SC_NOT_FOUND); - } - } - }); + }); } private Key queryProjectNew() { - return key(new HttpServlet() { - private static final long serialVersionUID = 1L; + return key( + new HttpServlet() { + private static final long serialVersionUID = 1L; - @Override - protected void doGet(HttpServletRequest req, HttpServletResponse rsp) - throws IOException { - String name = req.getPathInfo(); - if (Strings.isNullOrEmpty(name)) { - toGerrit(PageLinks.ADMIN_PROJECTS, req, rsp); - return; - } + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException { + String name = req.getPathInfo(); + if (Strings.isNullOrEmpty(name)) { + toGerrit(PageLinks.ADMIN_PROJECTS, req, rsp); + return; + } - while (name.endsWith("/")) { - name = name.substring(0, name.length() - 1); - } - if (name.endsWith(Constants.DOT_GIT_EXT)) { - name = name.substring(0, // - name.length() - Constants.DOT_GIT_EXT.length()); - } - while (name.endsWith("/")) { - name = name.substring(0, name.length() - 1); - } - Project.NameKey project = new Project.NameKey(name); - toGerrit(PageLinks.toChangeQuery(PageLinks.projectQuery(project, - Change.Status.NEW)), req, rsp); - } - }); + while (name.endsWith("/")) { + name = name.substring(0, name.length() - 1); + } + if (name.endsWith(Constants.DOT_GIT_EXT)) { + name = + name.substring( + 0, // + name.length() - Constants.DOT_GIT_EXT.length()); + } + while (name.endsWith("/")) { + name = name.substring(0, name.length() - 1); + } + Project.NameKey project = new Project.NameKey(name); + toGerrit( + PageLinks.toChangeQuery(PageLinks.projectQuery(project, Change.Status.NEW)), + req, + rsp); + } + }); } private Key query(final String query) { - return key(new HttpServlet() { - private static final long serialVersionUID = 1L; + return key( + new HttpServlet() { + private static final long serialVersionUID = 1L; - @Override - protected void doGet(final HttpServletRequest req, - final HttpServletResponse rsp) throws IOException { - toGerrit(PageLinks.toChangeQuery(query), req, rsp); - } - }); + @Override + protected void doGet(final HttpServletRequest req, final HttpServletResponse rsp) + throws IOException { + toGerrit(PageLinks.toChangeQuery(query), req, rsp); + } + }); } private Key key(final HttpServlet servlet) { - final Key srv = - Key.get(HttpServlet.class, UniqueAnnotations.create()); - bind(srv).toProvider(new Provider() { - @Override - public HttpServlet get() { - return servlet; - } - }).in(SINGLETON); + final Key srv = Key.get(HttpServlet.class, UniqueAnnotations.create()); + bind(srv) + .toProvider( + new Provider() { + @Override + public HttpServlet get() { + return servlet; + } + }) + .in(SINGLETON); return srv; } private Key registerScreen() { - return key(new HttpServlet() { - private static final long serialVersionUID = 1L; + return key( + new HttpServlet() { + private static final long serialVersionUID = 1L; - @Override - protected void doGet(final HttpServletRequest req, - final HttpServletResponse rsp) throws IOException { - toGerrit("/register" + req.getPathInfo(), req, rsp); - } - }); + @Override + protected void doGet(final HttpServletRequest req, final HttpServletResponse rsp) + throws IOException { + toGerrit("/register" + req.getPathInfo(), req, rsp); + } + }); } - static void toGerrit(final String target, final HttpServletRequest req, - final HttpServletResponse rsp) throws IOException { + static void toGerrit( + final String target, final HttpServletRequest req, final HttpServletResponse rsp) + throws IOException { final StringBuilder url = new StringBuilder(); url.append(req.getContextPath()); url.append('/'); diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebLoginListener.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebLoginListener.java index 55e927b213..5222f4cb99 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebLoginListener.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebLoginListener.java @@ -16,22 +16,18 @@ package com.google.gerrit.httpd; import com.google.gerrit.extensions.annotations.ExtensionPoint; import com.google.gerrit.server.IdentifiedUser; - import java.io.IOException; - import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Allows to listen and override the reponse to login/logout web actions. * - * Allows to intercept and act when a Gerrit user logs in or logs out of - * the Web interface to perform actions or to override the output response - * status code. - * - * Typical use can be multi-factor authentication (on login) or global sign-out - * from SSO systems (on logout). + *

Allows to intercept and act when a Gerrit user logs in or logs out of the Web interface to + * perform actions or to override the output response status code. * + *

Typical use can be multi-factor authentication (on login) or global sign-out from SSO systems + * (on logout). */ @ExtensionPoint public interface WebLoginListener { @@ -43,8 +39,8 @@ public interface WebLoginListener { * @param request request of the latest login action * @param response response of the latest login action */ - void onLogin(IdentifiedUser userId, HttpServletRequest request, - HttpServletResponse response) throws IOException; + void onLogin(IdentifiedUser userId, HttpServletRequest request, HttpServletResponse response) + throws IOException; /** * Invoked after a user's web logout. @@ -53,6 +49,6 @@ public interface WebLoginListener { * @param request request of the latest logout action * @param response response of the latest logout action */ - void onLogout(IdentifiedUser userId, HttpServletRequest request, - HttpServletResponse response) throws IOException; + void onLogout(IdentifiedUser userId, HttpServletRequest request, HttpServletResponse response) + throws IOException; } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebModule.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebModule.java index 48ba60e4e3..9967af63ef 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebModule.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebModule.java @@ -34,7 +34,6 @@ import com.google.gerrit.server.util.RequestScopePropagator; import com.google.inject.Inject; import com.google.inject.ProvisionException; import com.google.inject.servlet.RequestScoped; - import java.net.SocketAddress; public class WebModule extends LifecycleModule { @@ -43,9 +42,7 @@ public class WebModule extends LifecycleModule { private final GerritOptions options; @Inject - WebModule(AuthConfig authConfig, - GerritOptions options, - GitwebCgiConfig gitwebCgiConfig) { + WebModule(AuthConfig authConfig, GerritOptions options, GitwebCgiConfig gitwebCgiConfig) { this.authConfig = authConfig; this.options = options; this.gitwebCgiConfig = gitwebCgiConfig; @@ -70,8 +67,10 @@ public class WebModule extends LifecycleModule { install(new AsyncReceiveCommits.Module()); - bind(SocketAddress.class).annotatedWith(RemotePeer.class).toProvider( - HttpRemotePeerProvider.class).in(RequestScoped.class); + bind(SocketAddress.class) + .annotatedWith(RemotePeer.class) + .toProvider(HttpRemotePeerProvider.class) + .in(RequestScoped.class); bind(ProxyProperties.class).toProvider(ProxyPropertiesProvider.class); diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSession.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSession.java index cddd04f5b8..948af29ecf 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSession.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSession.java @@ -23,17 +23,26 @@ import com.google.gerrit.server.account.AuthResult; public interface WebSession { boolean isSignedIn(); - @Nullable String getXGerritAuth(); + + @Nullable + String getXGerritAuth(); + boolean isValidXGerritAuth(String keyIn); + AccountExternalId.Key getLastLoginExternalId(); + CurrentUser getUser(); + void login(AuthResult res, boolean rememberMe); /** Set the user account for this current request only. */ void setUserAccountId(Account.Id id); + boolean isAccessPathOk(AccessPath path); + void setAccessPathOk(AccessPath path, boolean ok); void logout(); + String getSessionId(); } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSessionManager.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSessionManager.java index 902bf001d5..76ea665d31 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSessionManager.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSessionManager.java @@ -35,11 +35,6 @@ import com.google.gerrit.server.config.ConfigUtil; import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - -import org.eclipse.jgit.lib.Config; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; @@ -47,6 +42,9 @@ import java.io.ObjectOutputStream; import java.io.Serializable; import java.security.SecureRandom; import java.util.concurrent.TimeUnit; +import org.eclipse.jgit.lib.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class WebSessionManager { private static final Logger log = LoggerFactory.getLogger(WebSessionManager.class); @@ -57,19 +55,24 @@ public class WebSessionManager { private final Cache self; @Inject - WebSessionManager(@GerritServerConfig Config cfg, - @Assisted final Cache cache) { + WebSessionManager(@GerritServerConfig Config cfg, @Assisted final Cache cache) { prng = new SecureRandom(); self = cache; - sessionMaxAgeMillis = SECONDS.toMillis(ConfigUtil.getTimeUnit(cfg, - "cache", CACHE_NAME, "maxAge", - SECONDS.convert(MAX_AGE_MINUTES, MINUTES), SECONDS)); + sessionMaxAgeMillis = + SECONDS.toMillis( + ConfigUtil.getTimeUnit( + cfg, + "cache", + CACHE_NAME, + "maxAge", + SECONDS.convert(MAX_AGE_MINUTES, MINUTES), + SECONDS)); if (sessionMaxAgeMillis < MINUTES.toMillis(5)) { - log.warn(String.format( - "cache.%s.maxAge is set to %d milliseconds;" + - " it should be at least 5 minutes.", - CACHE_NAME, sessionMaxAgeMillis)); + log.warn( + String.format( + "cache.%s.maxAge is set to %d milliseconds;" + " it should be at least 5 minutes.", + CACHE_NAME, sessionMaxAgeMillis)); } } @@ -102,8 +105,13 @@ public class WebSessionManager { return createVal(key, who, remember, lastLogin, val.sessionId, val.auth); } - Val createVal(final Key key, final Account.Id who, final boolean remember, - final AccountExternalId.Key lastLogin, String sid, String auth) { + Val createVal( + final Key key, + final Account.Id who, + final boolean remember, + final AccountExternalId.Key lastLogin, + String sid, + String auth) { // Refresh the cookie every hour or when it is half-expired. // This reduces the odds that the user session will be kicked // early but also avoids us needing to refresh the cookie on @@ -155,7 +163,7 @@ public class WebSessionManager { self.invalidate(key.token); } - static final class Key { + static final class Key { private transient String token; Key(final String t) { @@ -188,9 +196,14 @@ public class WebSessionManager { private transient String sessionId; private transient String auth; - Val(final Account.Id accountId, final long refreshCookieAt, - final boolean persistentCookie, final AccountExternalId.Key externalId, - final long expiresAt, final String sessionId, final String auth) { + Val( + final Account.Id accountId, + final long refreshCookieAt, + final boolean persistentCookie, + final AccountExternalId.Key externalId, + final long expiresAt, + final String sessionId, + final String auth) { this.accountId = accountId; this.refreshCookieAt = refreshCookieAt; this.persistentCookie = persistentCookie; @@ -260,7 +273,8 @@ public class WebSessionManager { } private void readObject(final ObjectInputStream in) throws IOException { - PARSE: for (;;) { + PARSE: + for (; ; ) { final int tag = readVarInt32(in); switch (tag) { case 0: diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSshGlueModule.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSshGlueModule.java index eb06617699..de75f6b081 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSshGlueModule.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSshGlueModule.java @@ -21,10 +21,10 @@ import com.google.inject.Provider; /** * Pulls objects from the SSH injector over the HTTP injector. - *

- * This mess is only necessary because we build up two different injectors, in - * order to have different request scopes. But some HTTP RPCs can cause changes - * to the SSH side of the house, and thus needs access to it. + * + *

This mess is only necessary because we build up two different injectors, in order to have + * different request scopes. But some HTTP RPCs can cause changes to the SSH side of the house, and + * thus needs access to it. */ public class WebSshGlueModule extends AbstractModule { private final Provider sshInfoProvider; diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/XsrfCookieFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/XsrfCookieFilter.java index 0c2565c239..ff64c84298 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/XsrfCookieFilter.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/XsrfCookieFilter.java @@ -23,9 +23,7 @@ import com.google.gerrit.server.config.AuthConfig; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; - import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -44,32 +42,30 @@ public class XsrfCookieFilter implements Filter { @Inject XsrfCookieFilter( - Provider user, - DynamicItem session, - AuthConfig authConfig) { + Provider user, DynamicItem session, AuthConfig authConfig) { this.user = user; this.session = session; this.authConfig = authConfig; } @Override - public void doFilter(ServletRequest req, ServletResponse rsp, - FilterChain chain) throws IOException, ServletException { + public void doFilter(ServletRequest req, ServletResponse rsp, FilterChain chain) + throws IOException, ServletException { WebSession s = user.get().isIdentifiedUser() ? session.get() : null; - setXsrfTokenCookie( - (HttpServletRequest) req, (HttpServletResponse) rsp, s); + setXsrfTokenCookie((HttpServletRequest) req, (HttpServletResponse) rsp, s); chain.doFilter(req, rsp); } - private void setXsrfTokenCookie(HttpServletRequest req, - HttpServletResponse rsp, WebSession session) { + private void setXsrfTokenCookie( + HttpServletRequest req, HttpServletResponse rsp, WebSession session) { String v = session != null ? session.getXGerritAuth() : null; Cookie c = new Cookie(HostPageData.XSRF_COOKIE_NAME, nullToEmpty(v)); c.setPath("/"); c.setSecure(authConfig.getCookieSecure() && isSecure(req)); - c.setMaxAge(v != null - ? -1 // Set the cookie for this browser session. - : 0); // Remove the cookie (expire immediately). + c.setMaxAge( + v != null + ? -1 // Set the cookie for this browser session. + : 0); // Remove the cookie (expire immediately). rsp.addCookie(c); } @@ -78,10 +74,8 @@ public class XsrfCookieFilter implements Filter { } @Override - public void init(FilterConfig config) { - } + public void init(FilterConfig config) {} @Override - public void destroy() { - } + public void destroy() {} } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountLoginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountLoginServlet.java index 8d5aff6ea3..d6bc5dc5c4 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountLoginServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountLoginServlet.java @@ -37,21 +37,18 @@ import com.google.gwtorm.server.ResultSet; import com.google.gwtorm.server.SchemaFactory; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.w3c.dom.Document; -import org.w3c.dom.Element; - import java.io.FileNotFoundException; import java.io.IOException; import java.io.OutputStream; import java.io.Writer; import java.util.List; import java.util.UUID; - import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.w3c.dom.Document; +import org.w3c.dom.Element; @SuppressWarnings("serial") @Singleton @@ -63,7 +60,8 @@ class BecomeAnyAccountLoginServlet extends HttpServlet { private final InternalAccountQuery accountQuery; @Inject - BecomeAnyAccountLoginServlet(DynamicItem ws, + BecomeAnyAccountLoginServlet( + DynamicItem ws, SchemaFactory sf, AccountManager am, SiteHeaderFooter shf, @@ -76,14 +74,14 @@ class BecomeAnyAccountLoginServlet extends HttpServlet { } @Override - protected void doGet(final HttpServletRequest req, - final HttpServletResponse rsp) throws IOException, ServletException { + protected void doGet(final HttpServletRequest req, final HttpServletResponse rsp) + throws IOException, ServletException { doPost(req, rsp); } @Override - protected void doPost(final HttpServletRequest req, - final HttpServletResponse rsp) throws IOException, ServletException { + protected void doPost(final HttpServletRequest req, final HttpServletResponse rsp) + throws IOException, ServletException { CacheHeaders.setNotCacheable(rsp); final AuthResult res; @@ -190,22 +188,17 @@ class BecomeAnyAccountLoginServlet extends HttpServlet { private AuthResult byUserName(final String userName) { try { - AccountExternalId.Key extKey = - new AccountExternalId.Key(SCHEME_USERNAME, userName); - List accountStates = - accountQuery.byExternalId(extKey.get()); + AccountExternalId.Key extKey = new AccountExternalId.Key(SCHEME_USERNAME, userName); + List accountStates = accountQuery.byExternalId(extKey.get()); if (accountStates.isEmpty()) { - getServletContext() - .log("No accounts with username " + userName + " found"); + getServletContext().log("No accounts with username " + userName + " found"); return null; } if (accountStates.size() > 1) { - getServletContext() - .log("Multiple accounts with username " + userName + " found"); + getServletContext().log("Multiple accounts with username " + userName + " found"); return null; } - return auth(new AccountExternalId( - accountStates.get(0).getAccount().getId(), extKey)); + return auth(new AccountExternalId(accountStates.get(0).getAccount().getId(), extKey)); } catch (OrmException e) { getServletContext().log("cannot query account index", e); return null; diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpAuthFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpAuthFilter.java index 978f0814e1..f921dbca00 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpAuthFilter.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpAuthFilter.java @@ -32,12 +32,10 @@ import com.google.gwtexpui.server.CacheHeaders; import com.google.gwtjsonrpc.server.RPCServletUtils; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.io.FileNotFoundException; import java.io.IOException; import java.io.OutputStream; import java.util.Locale; - import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -49,12 +47,11 @@ import javax.servlet.http.HttpServletResponse; /** * Watches request for the host page and requires login if not yet signed in. - *

- * If HTTP authentication has been enabled on this server this filter is bound - * in front of the {@link HostPageServlet} and redirects users who are not yet - * signed in to visit {@code /login/}, so the web container can force login. - * This redirect is performed with JavaScript, such that any existing anchor - * token in the URL can be rewritten and preserved through the authentication + * + *

If HTTP authentication has been enabled on this server this filter is bound in front of the + * {@link HostPageServlet} and redirects users who are not yet signed in to visit {@code /login/}, + * so the web container can force login. This redirect is performed with JavaScript, such that any + * existing anchor token in the URL can be rewritten and preserved through the authentication * process of any enterprise single sign-on solutions. */ @Singleton @@ -69,8 +66,8 @@ class HttpAuthFilter implements Filter { private final boolean userNameToLowerCase; @Inject - HttpAuthFilter(final DynamicItem webSession, - final AuthConfig authConfig) throws IOException { + HttpAuthFilter(final DynamicItem webSession, final AuthConfig authConfig) + throws IOException { this.sessionProvider = webSession; final String pageName = "LoginRedirect.html"; @@ -81,9 +78,7 @@ class HttpAuthFilter implements Filter { signInRaw = doc.getBytes(HtmlDomUtil.ENC); signInGzip = HtmlDomUtil.compress(signInRaw); - loginHeader = firstNonNull( - emptyToNull(authConfig.getLoginHttpHeader()), - AUTHORIZATION); + loginHeader = firstNonNull(emptyToNull(authConfig.getLoginHttpHeader()), AUTHORIZATION); displaynameHeader = emptyToNull(authConfig.getHttpDisplaynameHeader()); emailHeader = emptyToNull(authConfig.getHttpEmailHeader()); externalIdHeader = emptyToNull(authConfig.getHttpExternalIdHeader()); @@ -91,8 +86,8 @@ class HttpAuthFilter implements Filter { } @Override - public void doFilter(final ServletRequest request, - final ServletResponse response, final FilterChain chain) + public void doFilter( + final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException { if (isSessionValid((HttpServletRequest) request)) { chain.doFilter(request, response); @@ -133,14 +128,14 @@ class HttpAuthFilter implements Filter { private static boolean correctUser(String user, WebSession session) { AccountExternalId.Key id = session.getLastLoginExternalId(); - return id != null - && id.equals(new AccountExternalId.Key(SCHEME_GERRIT, user)); + return id != null && id.equals(new AccountExternalId.Key(SCHEME_GERRIT, user)); } String getRemoteUser(HttpServletRequest req) { String remoteUser = RemoteUserUtil.getRemoteUser(req, loginHeader); - return (userNameToLowerCase && remoteUser != null) ? - remoteUser.toLowerCase(Locale.US) : remoteUser; + return (userNameToLowerCase && remoteUser != null) + ? remoteUser.toLowerCase(Locale.US) + : remoteUser; } String getRemoteDisplayname(HttpServletRequest req) { @@ -170,10 +165,8 @@ class HttpAuthFilter implements Filter { } @Override - public void init(final FilterConfig filterConfig) { - } + public void init(final FilterConfig filterConfig) {} @Override - public void destroy() { - } + public void destroy() {} } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpLoginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpLoginServlet.java index 40e0f606c7..7bc5e7cdfa 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpLoginServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpLoginServlet.java @@ -33,7 +33,12 @@ import com.google.gwtexpui.server.CacheHeaders; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Singleton; - +import java.io.IOException; +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; @@ -41,26 +46,16 @@ import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; -import java.io.IOException; - -import javax.servlet.ServletException; -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - /** * Initializes the user session if HTTP authentication is enabled. - *

- * If HTTP authentication has been enabled this servlet binds to {@code /login/} - * and initializes the user session based on user information contained in the - * HTTP request. + * + *

If HTTP authentication has been enabled this servlet binds to {@code /login/} and initializes + * the user session based on user information contained in the HTTP request. */ @Singleton class HttpLoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; - private static final Logger log = - LoggerFactory.getLogger(HttpLoginServlet.class); + private static final Logger log = LoggerFactory.getLogger(HttpLoginServlet.class); private final DynamicItem webSession; private final CanonicalWebUrl urlProvider; @@ -69,7 +64,8 @@ class HttpLoginServlet extends HttpServlet { private final AuthConfig authConfig; @Inject - HttpLoginServlet(final DynamicItem webSession, + HttpLoginServlet( + final DynamicItem webSession, final CanonicalWebUrl urlProvider, final AccountManager accountManager, final HttpAuthFilter authFilter, @@ -82,18 +78,21 @@ class HttpLoginServlet extends HttpServlet { } @Override - protected void doGet(final HttpServletRequest req, - final HttpServletResponse rsp) throws ServletException, IOException { + protected void doGet(final HttpServletRequest req, final HttpServletResponse rsp) + throws ServletException, IOException { final String token = LoginUrlToken.getToken(req); CacheHeaders.setNotCacheable(rsp); final String user = authFilter.getRemoteUser(req); if (user == null || "".equals(user)) { - log.error("Unable to authenticate user by " + authFilter.getLoginHeader() - + " request header. Check container or server configuration."); + log.error( + "Unable to authenticate user by " + + authFilter.getLoginHeader() + + " request header. Check container or server configuration."); - final Document doc = HtmlDomUtil.parseFile( // - HttpLoginServlet.class, "ConfigurationError.html"); + final Document doc = + HtmlDomUtil.parseFile( // + HttpLoginServlet.class, "ConfigurationError.html"); replace(doc, "loginHeader", authFilter.getLoginHeader()); replace(doc, "ServerName", req.getServerName()); @@ -126,12 +125,16 @@ class HttpLoginServlet extends HttpServlet { String remoteExternalId = authFilter.getRemoteExternalIdToken(req); if (remoteExternalId != null) { try { - log.debug("Associating external identity \"{}\" to user \"{}\"", - remoteExternalId, user); + log.debug("Associating external identity \"{}\" to user \"{}\"", remoteExternalId, user); updateRemoteExternalId(arsp, remoteExternalId); } catch (AccountException | OrmException e) { - log.error("Unable to associate external identity \"" + remoteExternalId - + "\" to user \"" + user + "\"", e); + log.error( + "Unable to associate external identity \"" + + remoteExternalId + + "\" to user \"" + + user + + "\"", + e); rsp.sendError(HttpServletResponse.SC_FORBIDDEN); return; } @@ -155,10 +158,10 @@ class HttpLoginServlet extends HttpServlet { private void updateRemoteExternalId(AuthResult arsp, String remoteAuthToken) throws AccountException, OrmException, IOException { AccountExternalId remoteAuthExtId = - new AccountExternalId(arsp.getAccountId(), new AccountExternalId.Key( - SCHEME_EXTERNAL, remoteAuthToken)); - accountManager.updateLink(arsp.getAccountId(), - new AuthRequest(remoteAuthExtId.getExternalId())); + new AccountExternalId( + arsp.getAccountId(), new AccountExternalId.Key(SCHEME_EXTERNAL, remoteAuthToken)); + accountManager.updateLink( + arsp.getAccountId(), new AuthRequest(remoteAuthExtId.getExternalId())); } private void replace(Document doc, String name, String value) { diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertAuthFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertAuthFilter.java index ea9b1c0db9..bb3dc6a12b 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertAuthFilter.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertAuthFilter.java @@ -22,47 +22,43 @@ import com.google.gerrit.server.account.AuthRequest; import com.google.gerrit.server.account.AuthResult; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.security.cert.X509Certificate; import java.util.regex.Matcher; import java.util.regex.Pattern; - import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Singleton class HttpsClientSslCertAuthFilter implements Filter { private static final Pattern REGEX_USERID = Pattern.compile("CN=([^,]*)"); - private static final Logger log = - LoggerFactory.getLogger(HttpsClientSslCertAuthFilter.class); + private static final Logger log = LoggerFactory.getLogger(HttpsClientSslCertAuthFilter.class); private final DynamicItem webSession; private final AccountManager accountManager; @Inject - HttpsClientSslCertAuthFilter(final DynamicItem webSession, - final AccountManager accountManager) { + HttpsClientSslCertAuthFilter( + final DynamicItem webSession, final AccountManager accountManager) { this.webSession = webSession; this.accountManager = accountManager; } @Override - public void destroy() { - } + public void destroy() {} @Override - public void doFilter(ServletRequest req, ServletResponse rsp, - FilterChain chain) throws IOException, ServletException { - X509Certificate[] certs = (X509Certificate[]) req.getAttribute("javax.servlet.request.X509Certificate"); + public void doFilter(ServletRequest req, ServletResponse rsp, FilterChain chain) + throws IOException, ServletException { + X509Certificate[] certs = + (X509Certificate[]) req.getAttribute("javax.servlet.request.X509Certificate"); if (certs == null || certs.length == 0) { throw new ServletException( "Couldn't get the attribute javax.servlet.request.X509Certificate from the request"); @@ -89,6 +85,5 @@ class HttpsClientSslCertAuthFilter implements Filter { } @Override - public void init(FilterConfig arg0) throws ServletException { - } + public void init(FilterConfig arg0) throws ServletException {} } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertLoginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertLoginServlet.java index 4c7ce7bacd..8b14af7c0b 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertLoginServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertLoginServlet.java @@ -21,21 +21,18 @@ import com.google.gwtexpui.server.CacheHeaders; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; - import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** - * Servlet bound to {@code /login/*} to redirect after client SSL certificate - * login. - *

- * When using client SSL certificate one should normally never see the sign in - * dialog. However, this will happen if users session gets invalidated in some - * way. Like in other authentication types, we need to force page to fully - * reload in order to initialize a new session and create a valid xsrfKey. + * Servlet bound to {@code /login/*} to redirect after client SSL certificate login. + * + *

When using client SSL certificate one should normally never see the sign in dialog. However, + * this will happen if users session gets invalidated in some way. Like in other authentication + * types, we need to force page to fully reload in order to initialize a new session and create a + * valid xsrfKey. */ @Singleton public class HttpsClientSslCertLoginServlet extends HttpServlet { @@ -44,13 +41,14 @@ public class HttpsClientSslCertLoginServlet extends HttpServlet { private final Provider urlProvider; @Inject - public HttpsClientSslCertLoginServlet(@CanonicalWebUrl @Nullable final Provider urlProvider) { + public HttpsClientSslCertLoginServlet( + @CanonicalWebUrl @Nullable final Provider urlProvider) { this.urlProvider = urlProvider; } @Override - protected void doGet(final HttpServletRequest req, - final HttpServletResponse rsp) throws IOException { + protected void doGet(final HttpServletRequest req, final HttpServletResponse rsp) + throws IOException { final StringBuilder rdr = new StringBuilder(); rdr.append(urlProvider.get()); rdr.append(LoginUrlToken.getToken(req)); diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/ldap/LdapLoginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/ldap/LdapLoginServlet.java index a5b4f7a89f..24ba4ac114 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/ldap/LdapLoginServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/ldap/LdapLoginServlet.java @@ -34,26 +34,22 @@ import com.google.gerrit.server.auth.AuthenticationUnavailableException; import com.google.gwtexpui.server.CacheHeaders; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.w3c.dom.Document; -import org.w3c.dom.Element; - import java.io.IOException; - import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.w3c.dom.Document; +import org.w3c.dom.Element; /** Handles username/password based authentication against the directory. */ @SuppressWarnings("serial") @Singleton class LdapLoginServlet extends HttpServlet { - private static final Logger log = LoggerFactory - .getLogger(LdapLoginServlet.class); + private static final Logger log = LoggerFactory.getLogger(LdapLoginServlet.class); private final AccountManager accountManager; private final DynamicItem webSession; @@ -61,7 +57,8 @@ class LdapLoginServlet extends HttpServlet { private final SiteHeaderFooter headers; @Inject - LdapLoginServlet(AccountManager accountManager, + LdapLoginServlet( + AccountManager accountManager, DynamicItem webSession, CanonicalWebUrl urlProvider, SiteHeaderFooter headers) { @@ -71,8 +68,9 @@ class LdapLoginServlet extends HttpServlet { this.headers = headers; } - private void sendForm(HttpServletRequest req, HttpServletResponse res, - @Nullable String errorMessage) throws IOException { + private void sendForm( + HttpServletRequest req, HttpServletResponse res, @Nullable String errorMessage) + throws IOException { String self = req.getRequestURI(); String cancel = MoreObjects.firstNonNull(urlProvider.get(req), "/"); cancel += LoginUrlToken.getToken(req); @@ -100,8 +98,7 @@ class LdapLoginServlet extends HttpServlet { } @Override - protected void doGet(HttpServletRequest req, HttpServletResponse res) - throws IOException { + protected void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException { sendForm(req, res, null); } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitLogoServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitLogoServlet.java index b5365ad886..67d36e4e3d 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitLogoServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitLogoServlet.java @@ -21,14 +21,12 @@ import com.google.gerrit.server.config.GitwebCgiConfig; import com.google.gwtexpui.server.CacheHeaders; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.nio.file.Path; import java.util.concurrent.TimeUnit; - import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -64,8 +62,8 @@ class GitLogoServlet extends HttpServlet { } @Override - protected void doGet(final HttpServletRequest req, - final HttpServletResponse rsp) throws IOException { + protected void doGet(final HttpServletRequest req, final HttpServletResponse rsp) + throws IOException { if (raw != null) { rsp.setContentType("image/png"); rsp.setContentLength(raw.length); diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebCssServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebCssServlet.java index abcc4fe4d2..c5a1f183ca 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebCssServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebCssServlet.java @@ -24,11 +24,9 @@ import com.google.gwtexpui.server.CacheHeaders; import com.google.gwtjsonrpc.server.RPCServletUtils; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.io.IOException; import java.nio.file.Path; import java.util.concurrent.TimeUnit; - import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -56,8 +54,7 @@ abstract class GitwebCssServlet extends HttpServlet { private final byte[] raw_css; private final byte[] gz_css; - GitwebCssServlet(final Path src) - throws IOException { + GitwebCssServlet(final Path src) throws IOException { if (src != null) { final Path dir = src.getParent(); final String name = src.getFileName().toString(); @@ -84,8 +81,8 @@ abstract class GitwebCssServlet extends HttpServlet { } @Override - protected void doGet(final HttpServletRequest req, - final HttpServletResponse rsp) throws IOException { + protected void doGet(final HttpServletRequest req, final HttpServletResponse rsp) + throws IOException { if (raw_css != null) { rsp.setContentType("text/css"); rsp.setCharacterEncoding(UTF_8.name()); diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebJavaScriptServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebJavaScriptServlet.java index f30eb526a2..70f6e4c20f 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebJavaScriptServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebJavaScriptServlet.java @@ -21,14 +21,12 @@ import com.google.gerrit.server.config.GitwebCgiConfig; import com.google.gwtexpui.server.CacheHeaders; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.nio.file.Path; import java.util.concurrent.TimeUnit; - import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -64,8 +62,8 @@ class GitwebJavaScriptServlet extends HttpServlet { } @Override - protected void doGet(final HttpServletRequest req, - final HttpServletResponse rsp) throws IOException { + protected void doGet(final HttpServletRequest req, final HttpServletResponse rsp) + throws IOException { if (raw != null) { rsp.setContentType("text/javascript"); rsp.setContentLength(raw.length); diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebServlet.java index cb9e616cb4..f3abf2dc1d 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebServlet.java @@ -52,13 +52,6 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.ProvisionException; import com.google.inject.Singleton; - -import org.eclipse.jgit.errors.RepositoryNotFoundException; -import org.eclipse.jgit.lib.Config; -import org.eclipse.jgit.lib.Repository; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.EOFException; @@ -77,17 +70,20 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; - import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.eclipse.jgit.errors.RepositoryNotFoundException; +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.lib.Repository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** Invokes {@code gitweb.cgi} for the project given in {@code p}. */ @SuppressWarnings("serial") @Singleton class GitwebServlet extends HttpServlet { - private static final Logger log = - LoggerFactory.getLogger(GitwebServlet.class); + private static final Logger log = LoggerFactory.getLogger(GitwebServlet.class); private static final String PROJECT_LIST_ACTION = "project_list"; @@ -102,7 +98,8 @@ class GitwebServlet extends HttpServlet { private final EnvList _env; @Inject - GitwebServlet(GitRepositoryManager repoManager, + GitwebServlet( + GitRepositoryManager repoManager, ProjectControl.Factory projectControl, Provider anonymousUserProvider, Provider userProvider, @@ -113,10 +110,9 @@ class GitwebServlet extends HttpServlet { GitwebCgiConfig gitwebCgiConfig) throws IOException { if (!(repoManager instanceof LocalDiskRepositoryManager)) { - throw new ProvisionException( - "Gitweb can only be used with LocalDiskRepositoryManager"); + throw new ProvisionException("Gitweb can only be used with LocalDiskRepositoryManager"); } - this.repoManager = (LocalDiskRepositoryManager)repoManager; + this.repoManager = (LocalDiskRepositoryManager) repoManager; this.projectControl = projectControl; this.anonymousUserProvider = anonymousUserProvider; this.userProvider = userProvider; @@ -159,8 +155,7 @@ class GitwebServlet extends HttpServlet { } } - private void makeSiteConfig(SitePaths site, Config cfg, SshInfo sshInfo) - throws IOException { + private void makeSiteConfig(SitePaths site, Config cfg, SshInfo sshInfo) throws IOException { if (!Files.exists(site.tmp_dir)) { Files.createDirectories(site.tmp_dir); } @@ -183,8 +178,7 @@ class GitwebServlet extends HttpServlet { _env.set("GIT_DIR", "."); _env.set("GITWEB_CONFIG", myconf.toAbsolutePath().toString()); - try (PrintWriter p = - new PrintWriter(Files.newBufferedWriter(myconf, UTF_8))) { + try (PrintWriter p = new PrintWriter(Files.newBufferedWriter(myconf, UTF_8))) { p.print("# Autogenerated by Gerrit Code Review \n"); p.print("# DO NOT EDIT\n"); p.print("\n"); @@ -370,8 +364,8 @@ class GitwebServlet extends HttpServlet { } @Override - protected void service(final HttpServletRequest req, - final HttpServletResponse rsp) throws IOException { + protected void service(final HttpServletRequest req, final HttpServletResponse rsp) + throws IOException { if (req.getQueryString() == null || req.getQueryString().isEmpty()) { // No query string? They want the project list, which we don't // currently support. Return to Gerrit's own web UI. @@ -389,8 +383,12 @@ class GitwebServlet extends HttpServlet { } if (a.equals(PROJECT_LIST_ACTION)) { - rsp.sendRedirect(req.getContextPath() + "/#" + PageLinks.ADMIN_PROJECTS - + "?filter=" + Url.encode(params.get("pf") + "/")); + rsp.sendRedirect( + req.getContextPath() + + "/#" + + PageLinks.ADMIN_PROJECTS + + "?filter=" + + Url.encode(params.get("pf") + "/")); return; } } @@ -409,7 +407,7 @@ class GitwebServlet extends HttpServlet { try { project = projectControl.validateFor(nameKey); if (!project.allRefsAreVisible() && !project.isOwner()) { - // Pretend the project doesn't exist + // Pretend the project doesn't exist throw new NoSuchProjectException(nameKey); } } catch (NoSuchProjectException e) { @@ -424,7 +422,6 @@ class GitwebServlet extends HttpServlet { return; } - try (Repository repo = repoManager.openRepository(nameKey)) { CacheHeaders.setNotCacheable(rsp); exec(req, rsp, project); @@ -465,13 +462,15 @@ class GitwebServlet extends HttpServlet { return params; } - private void exec(final HttpServletRequest req, - final HttpServletResponse rsp, final ProjectControl project) throws IOException { + private void exec( + final HttpServletRequest req, final HttpServletResponse rsp, final ProjectControl project) + throws IOException { final Process proc = - Runtime.getRuntime().exec( - new String[] {gitwebCgi.toAbsolutePath().toString()}, - makeEnv(req, project), - gitwebCgi.toAbsolutePath().getParent().toFile()); + Runtime.getRuntime() + .exec( + new String[] {gitwebCgi.toAbsolutePath().toString()}, + makeEnv(req, project), + gitwebCgi.toAbsolutePath().getParent().toFile()); copyStderrToLog(proc.getErrorStream()); if (0 < req.getContentLength()) { @@ -513,8 +512,7 @@ class GitwebServlet extends HttpServlet { } } - private String[] makeEnv(final HttpServletRequest req, - final ProjectControl project) { + private String[] makeEnv(final HttpServletRequest req, final ProjectControl project) { final EnvList env = new EnvList(_env); final int contentLength = Math.max(0, req.getContentLength()); @@ -555,9 +553,9 @@ class GitwebServlet extends HttpServlet { env.set("GERRIT_CONTEXT_PATH", req.getContextPath() + "/"); env.set("GERRIT_PROJECT_NAME", project.getProject().getName()); - env.set("GITWEB_PROJECTROOT", - repoManager.getBasePath(project.getProject().getNameKey()) - .toAbsolutePath().toString()); + env.set( + "GITWEB_PROJECTROOT", + repoManager.getBasePath(project.getProject().getNameKey()).toAbsolutePath().toString()); if (project.forUser(anonymousUserProvider.get()).isVisible()) { env.set("GERRIT_ANONYMOUS_READ", "1"); @@ -607,61 +605,65 @@ class GitwebServlet extends HttpServlet { } if (gitwebUrl.getPath() != null) { - env.set("SCRIPT_NAME", gitwebUrl.getPath().isEmpty() - ? "/" : gitwebUrl.getPath()); + env.set("SCRIPT_NAME", gitwebUrl.getPath().isEmpty() ? "/" : gitwebUrl.getPath()); } } return env.getEnvArray(); } - private void copyContentToCGI(final HttpServletRequest req, - final OutputStream dst) throws IOException { + private void copyContentToCGI(final HttpServletRequest req, final OutputStream dst) + throws IOException { final int contentLength = req.getContentLength(); final InputStream src = req.getInputStream(); - new Thread(() -> { - try { - try { - final byte[] buf = new byte[bufferSize]; - int remaining = contentLength; - while (0 < remaining) { - final int max = Math.max(buf.length, remaining); - final int n = src.read(buf, 0, max); - if (n < 0) { - throw new EOFException("Expected " + remaining + " more bytes"); - } - dst.write(buf, 0, n); - remaining -= n; - } - } finally { - dst.close(); - } - } catch (IOException e) { - log.debug("Unexpected error copying input to CGI", e); - } - }, "Gitweb-InputFeeder").start(); + new Thread( + () -> { + try { + try { + final byte[] buf = new byte[bufferSize]; + int remaining = contentLength; + while (0 < remaining) { + final int max = Math.max(buf.length, remaining); + final int n = src.read(buf, 0, max); + if (n < 0) { + throw new EOFException("Expected " + remaining + " more bytes"); + } + dst.write(buf, 0, n); + remaining -= n; + } + } finally { + dst.close(); + } + } catch (IOException e) { + log.debug("Unexpected error copying input to CGI", e); + } + }, + "Gitweb-InputFeeder") + .start(); } private void copyStderrToLog(final InputStream in) { - new Thread(() -> { - try (BufferedReader br = - new BufferedReader(new InputStreamReader(in, ISO_8859_1.name()))) { - String line; - while ((line = br.readLine()) != null) { - log.error("CGI: " + line); - } - } catch (IOException e) { - log.debug("Unexpected error copying stderr from CGI", e); - } - }, "Gitweb-ErrorLogger").start(); + new Thread( + () -> { + try (BufferedReader br = + new BufferedReader(new InputStreamReader(in, ISO_8859_1.name()))) { + String line; + while ((line = br.readLine()) != null) { + log.error("CGI: " + line); + } + } catch (IOException e) { + log.debug("Unexpected error copying stderr from CGI", e); + } + }, + "Gitweb-ErrorLogger") + .start(); } private static Enumeration enumerateHeaderNames(HttpServletRequest req) { return req.getHeaderNames(); } - private void readCgiHeaders(HttpServletResponse res, final InputStream in) - throws IOException { + private void readCgiHeaders(HttpServletResponse res, final InputStream in) throws IOException { String line; while (!(line = readLine(in)).isEmpty()) { if (line.startsWith("HTTP")) { diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/ContextMapper.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/ContextMapper.java index b51bfb9e2b..85dd5a52e8 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/ContextMapper.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/ContextMapper.java @@ -15,7 +15,6 @@ package com.google.gerrit.httpd.plugins; import com.google.common.base.Strings; - import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; @@ -70,5 +69,4 @@ class ContextMapper { return pathInfo; } } - } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpAutoRegisterModuleGenerator.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpAutoRegisterModuleGenerator.java index 8392f84b56..9ab2d721b1 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpAutoRegisterModuleGenerator.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpAutoRegisterModuleGenerator.java @@ -25,18 +25,14 @@ import com.google.inject.Module; import com.google.inject.Scopes; import com.google.inject.TypeLiteral; import com.google.inject.servlet.ServletModule; - import java.lang.annotation.Annotation; import java.util.HashMap; import java.util.Map; - import javax.servlet.http.HttpServlet; -class HttpAutoRegisterModuleGenerator extends ServletModule - implements ModuleGenerator { +class HttpAutoRegisterModuleGenerator extends ServletModule implements ModuleGenerator { private final Map> serve = new HashMap<>(); - private final ListMultimap, Class> listeners = - LinkedListMultimap.create(); + private final ListMultimap, Class> listeners = LinkedListMultimap.create(); @Override protected void configureServlets() { @@ -57,26 +53,25 @@ class HttpAutoRegisterModuleGenerator extends ServletModule } @Override - public void setPluginName(String name) { - } + public void setPluginName(String name) {} @SuppressWarnings("unchecked") @Override - public void export(Export export, Class type) - throws InvalidPluginException { + public void export(Export export, Class type) throws InvalidPluginException { if (HttpServlet.class.isAssignableFrom(type)) { Class old = serve.get(export.value()); if (old != null) { - throw new InvalidPluginException(String.format( - "@Export(\"%s\") has duplicate bindings:\n %s\n %s", - export.value(), old.getName(), type.getName())); + throw new InvalidPluginException( + String.format( + "@Export(\"%s\") has duplicate bindings:\n %s\n %s", + export.value(), old.getName(), type.getName())); } serve.put(export.value(), (Class) type); } else { - throw new InvalidPluginException(String.format( - "Class %s with @Export(\"%s\") must extend %s", - type.getName(), export.value(), - HttpServlet.class.getName())); + throw new InvalidPluginException( + String.format( + "Class %s with @Export(\"%s\") must extend %s", + type.getName(), export.value(), HttpServlet.class.getName())); } } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginModule.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginModule.java index 3c72ec5157..b48caf5fe3 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginModule.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginModule.java @@ -36,31 +36,31 @@ public class HttpPluginModule extends ServletModule { serveRegex(LfsPluginServlet.URL_REGEX).with(LfsPluginServlet.class); bind(StartPluginListener.class) - .annotatedWith(UniqueAnnotations.create()) - .to(HttpPluginServlet.class); + .annotatedWith(UniqueAnnotations.create()) + .to(HttpPluginServlet.class); bind(ReloadPluginListener.class) - .annotatedWith(UniqueAnnotations.create()) - .to(HttpPluginServlet.class); + .annotatedWith(UniqueAnnotations.create()) + .to(HttpPluginServlet.class); bind(StartPluginListener.class) - .annotatedWith(UniqueAnnotations.create()) - .to(LfsPluginServlet.class); + .annotatedWith(UniqueAnnotations.create()) + .to(LfsPluginServlet.class); bind(ReloadPluginListener.class) - .annotatedWith(UniqueAnnotations.create()) - .to(LfsPluginServlet.class); + .annotatedWith(UniqueAnnotations.create()) + .to(LfsPluginServlet.class); - bind(ModuleGenerator.class) - .to(HttpAutoRegisterModuleGenerator.class); + bind(ModuleGenerator.class).to(HttpAutoRegisterModuleGenerator.class); - install(new CacheModule() { - @Override - protected void configure() { - cache(PLUGIN_RESOURCES, ResourceKey.class, Resource.class) - .maximumWeight(2 << 20) - .weigher(ResourceWeigher.class); - } - }); + install( + new CacheModule() { + @Override + protected void configure() { + cache(PLUGIN_RESOURCES, ResourceKey.class, Resource.class) + .maximumWeight(2 << 20) + .weigher(ResourceWeigher.class); + } + }); } } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java index 3812fa11ae..973003264f 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java @@ -51,12 +51,6 @@ import com.google.inject.Provider; import com.google.inject.Singleton; import com.google.inject.name.Named; import com.google.inject.servlet.GuiceFilter; - -import org.eclipse.jgit.util.IO; -import org.eclipse.jgit.util.RawParseUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -77,7 +71,6 @@ import java.util.function.Predicate; import java.util.jar.Attributes; import java.util.regex.Matcher; import java.util.regex.Pattern; - import javax.servlet.FilterChain; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; @@ -87,14 +80,16 @@ import javax.servlet.ServletResponse; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.eclipse.jgit.util.IO; +import org.eclipse.jgit.util.RawParseUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Singleton -class HttpPluginServlet extends HttpServlet - implements StartPluginListener, ReloadPluginListener { +class HttpPluginServlet extends HttpServlet implements StartPluginListener, ReloadPluginListener { private static final int SMALL_RESOURCE = 128 * 1024; private static final long serialVersionUID = 1L; - private static final Logger log - = LoggerFactory.getLogger(HttpPluginServlet.class); + private static final Logger log = LoggerFactory.getLogger(HttpPluginServlet.class); private final MimeUtilFileTypeRegistry mimeUtil; private final Provider webUrl; @@ -105,8 +100,7 @@ class HttpPluginServlet extends HttpServlet private List pending = new ArrayList<>(); private ContextMapper wrapper; - private final ConcurrentMap plugins - = Maps.newConcurrentMap(); + private final ConcurrentMap plugins = Maps.newConcurrentMap(); @Inject HttpPluginServlet( @@ -167,12 +161,13 @@ class HttpPluginServlet extends HttpServlet GuiceFilter filter = load(plugin); final String name = plugin.getName(); final PluginHolder holder = new PluginHolder(plugin, filter); - plugin.add(new RegistrationHandle() { - @Override - public void remove() { - plugins.remove(name, holder); - } - }); + plugin.add( + new RegistrationHandle() { + @Override + public void remove() { + plugins.remove(name, holder); + } + }); plugins.put(name, holder); } @@ -188,20 +183,20 @@ class HttpPluginServlet extends HttpServlet } try { - ServletContext ctx = - PluginServletContext.create(plugin, wrapper.getFullPath(name)); + ServletContext ctx = PluginServletContext.create(plugin, wrapper.getFullPath(name)); filter.init(new WrappedFilterConfig(ctx)); } catch (ServletException e) { log.warn(String.format("Plugin %s failed to initialize HTTP", name), e); return null; } - plugin.add(new RegistrationHandle() { - @Override - public void remove() { - filter.destroy(); - } - }); + plugin.add( + new RegistrationHandle() { + @Override + public void remove() { + filter.destroy(); + } + }); return filter; } return null; @@ -210,9 +205,12 @@ class HttpPluginServlet extends HttpServlet @Override public void service(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { - List parts = Lists.newArrayList( - Splitter.on('/').limit(3).omitEmptyStrings() - .split(Strings.nullToEmpty(RequestUtil.getEncodedPathInfo(req)))); + List parts = + Lists.newArrayList( + Splitter.on('/') + .limit(3) + .omitEmptyStrings() + .split(Strings.nullToEmpty(RequestUtil.getEncodedPathInfo(req)))); if (isApiCall(req, parts)) { managerApi.service(req, res); @@ -228,13 +226,13 @@ class HttpPluginServlet extends HttpServlet } HttpServletRequest wr = wrapper.create(req, name); - FilterChain chain = new FilterChain() { - @Override - public void doFilter(ServletRequest req, ServletResponse res) - throws IOException { - onDefault(holder, (HttpServletRequest) req, (HttpServletResponse) res); - } - }; + FilterChain chain = + new FilterChain() { + @Override + public void doFilter(ServletRequest req, ServletResponse res) throws IOException { + onDefault(holder, (HttpServletRequest) req, (HttpServletResponse) res); + } + }; if (holder.filter != null) { holder.filter.doFilter(wr, res, chain); } else { @@ -250,9 +248,8 @@ class HttpPluginServlet extends HttpServlet || (cnt == 2 && parts.get(1).startsWith("gerrit~")); } - private void onDefault(PluginHolder holder, - HttpServletRequest req, - HttpServletResponse res) throws IOException { + private void onDefault(PluginHolder holder, HttpServletRequest req, HttpServletResponse res) + throws IOException { if (!"GET".equals(req.getMethod()) && !"HEAD".equals(req.getMethod())) { CacheHeaders.setNotCacheable(res); res.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED); @@ -296,8 +293,7 @@ class HttpPluginServlet extends HttpServlet Resource.NOT_FOUND.send(req, res); } } - } else if (file.equals( - holder.docPrefix.substring(0, holder.docPrefix.length() - 1))) { + } else if (file.equals(holder.docPrefix.substring(0, holder.docPrefix.length() - 1))) { res.sendRedirect(uri + "/index.html"); } else if (file.startsWith(holder.docPrefix) && file.endsWith("/")) { res.sendRedirect(uri + "index.html"); @@ -313,15 +309,13 @@ class HttpPluginServlet extends HttpServlet if (hasUpToDateCachedResource(rsc, pluginLastModified)) { rsc.send(req, res); } else { - sendAutoIndex(scanner, pfx, holder.plugin.getName(), key, res, - pluginLastModified); + sendAutoIndex(scanner, pfx, holder.plugin.getName(), key, res, pluginLastModified); } } else if (entry.isPresent() && entry.get().getName().endsWith(".md")) { if (hasUpToDateCachedResource(rsc, entry.get().getTime())) { rsc.send(req, res); } else { - sendMarkdownAsHtml(scanner, entry.get(), holder.plugin.getName(), - key, res); + sendMarkdownAsHtml(scanner, entry.get(), holder.plugin.getName(), key, res); } } else if (entry.isPresent()) { if (hasUpToDateCachedResource(rsc, entry.get().getTime())) { @@ -340,13 +334,17 @@ class HttpPluginServlet extends HttpServlet } private boolean hasUpToDateCachedResource(Resource cachedResource, long lastUpdateTime) { - return cachedResource != null - && cachedResource.isUnchanged(lastUpdateTime); + return cachedResource != null && cachedResource.isUnchanged(lastUpdateTime); } - private void appendEntriesSection(PluginContentScanner scanner, List entries, - String sectionTitle, StringBuilder md, String prefix, - int nameOffset) throws IOException { + private void appendEntriesSection( + PluginContentScanner scanner, + List entries, + String sectionTitle, + StringBuilder md, + String prefix, + int nameOffset) + throws IOException { if (!entries.isEmpty()) { md.append("## ").append(sectionTitle).append(" ##\n"); for (PluginEntry entry : entries) { @@ -368,9 +366,13 @@ class HttpPluginServlet extends HttpServlet } } - private void sendAutoIndex(PluginContentScanner scanner, - final String prefix, final String pluginName, - PluginResourceKey cacheKey, HttpServletResponse res,long lastModifiedTime) + private void sendAutoIndex( + PluginContentScanner scanner, + final String prefix, + final String pluginName, + PluginResourceKey cacheKey, + HttpServletResponse res, + long lastModifiedTime) throws IOException { List cmds = new ArrayList<>(); List servlets = new ArrayList<>(); @@ -386,13 +388,11 @@ class HttpPluginServlet extends HttpServlet && (name.endsWith(".md") || name.endsWith(".html")) && size.isPresent()) { if (size.get() <= 0 || size.get() > SMALL_RESOURCE) { - log.warn(String.format( - "Plugin %s: %s omitted from document index. " - + "Size %d out of range (0,%d).", - pluginName, - name.substring(prefix.length()), - size.get(), - SMALL_RESOURCE)); + log.warn( + String.format( + "Plugin %s: %s omitted from document index. " + + "Size %d out of range (0,%d).", + pluginName, name.substring(prefix.length()), size.get(), SMALL_RESOURCE)); return false; } return true; @@ -400,9 +400,9 @@ class HttpPluginServlet extends HttpServlet return false; }; - List entries = Collections.list(scanner.entries()).stream() - .filter(filter).collect(toList()); - for (PluginEntry entry: entries) { + List entries = + Collections.list(scanner.entries()).stream().filter(filter).collect(toList()); + for (PluginEntry entry : entries) { String name = entry.getName().substring(prefix.length()); if (name.startsWith("cmd-")) { cmds.add(entry); @@ -414,10 +414,10 @@ class HttpPluginServlet extends HttpServlet if (about == null) { about = entry; } else { - log.warn(String.format( - "Plugin %s: Multiple 'about' documents found; using %s", - pluginName, - about.getName().substring(prefix.length()))); + log.warn( + String.format( + "Plugin %s: Multiple 'about' documents found; using %s", + pluginName, about.getName().substring(prefix.length()))); } } else { docs.add(entry); @@ -433,8 +433,7 @@ class HttpPluginServlet extends HttpServlet appendPluginInfoTable(md, scanner.getManifest().getMainAttributes()); if (about != null) { - InputStreamReader isr = new InputStreamReader( - scanner.getInputStream(about), UTF_8); + InputStreamReader isr = new InputStreamReader(scanner.getInputStream(about), UTF_8); StringBuilder aboutContent = new StringBuilder(); try (BufferedReader reader = new BufferedReader(isr)) { String line; @@ -463,8 +462,12 @@ class HttpPluginServlet extends HttpServlet sendMarkdownAsHtml(md.toString(), pluginName, cacheKey, res, lastModifiedTime); } - private void sendMarkdownAsHtml(String md, String pluginName, - PluginResourceKey cacheKey, HttpServletResponse res, long lastModifiedTime) + private void sendMarkdownAsHtml( + String md, + String pluginName, + PluginResourceKey cacheKey, + HttpServletResponse res, + long lastModifiedTime) throws UnsupportedEncodingException, IOException { Map macros = new HashMap<>(); macros.put("PLUGIN", pluginName); @@ -491,12 +494,13 @@ class HttpPluginServlet extends HttpServlet } m.appendTail(sb); - byte[] html = new MarkdownFormatter() - .markdownToDocHtml(sb.toString(), UTF_8.name()); - resourceCache.put(cacheKey, new SmallResource(html) - .setContentType("text/html") - .setCharacterEncoding(UTF_8.name()) - .setLastModified(lastModifiedTime)); + byte[] html = new MarkdownFormatter().markdownToDocHtml(sb.toString(), UTF_8.name()); + resourceCache.put( + cacheKey, + new SmallResource(html) + .setContentType("text/html") + .setCharacterEncoding(UTF_8.name()) + .setLastModified(lastModifiedTime)); res.setContentType("text/html"); res.setCharacterEncoding(UTF_8.name()); res.setContentLength(html.length); @@ -513,31 +517,23 @@ class HttpPluginServlet extends HttpServlet html.append(""); if (!Strings.isNullOrEmpty(t)) { - html.append("\n"); + html.append("\n"); } if (!Strings.isNullOrEmpty(n)) { - html.append("\n"); + html.append("\n"); } if (!Strings.isNullOrEmpty(v)) { - html.append("\n"); + html.append("\n"); } if (!Strings.isNullOrEmpty(a)) { - html.append("\n"); + html.append("\n"); } html.append("
Name") - .append(t) - .append("
Name").append(t).append("
Vendor") - .append(n) - .append("
Vendor").append(n).append("
Version") - .append(v) - .append("
Version").append(v).append("
API Version") - .append(a) - .append("
API Version").append(a).append("
\n"); } } private static String extractTitleFromMarkdown(PluginContentScanner scanner, PluginEntry entry) - throws IOException { + throws IOException { String charEnc = null; Map atts = entry.getAttrs(); if (atts != null) { @@ -546,13 +542,12 @@ class HttpPluginServlet extends HttpServlet if (charEnc == null) { charEnc = UTF_8.name(); } - return new MarkdownFormatter().extractTitleFromMarkdown( - readWholeEntry(scanner, entry), - charEnc); + return new MarkdownFormatter() + .extractTitleFromMarkdown(readWholeEntry(scanner, entry), charEnc); } - private static Optional findSource( - PluginContentScanner scanner, String file) throws IOException { + private static Optional findSource(PluginContentScanner scanner, String file) + throws IOException { if (file.endsWith(".html")) { int d = file.lastIndexOf('.'); return scanner.getEntry(file.substring(0, d) + ".md"); @@ -560,8 +555,12 @@ class HttpPluginServlet extends HttpServlet return Optional.empty(); } - private void sendMarkdownAsHtml(PluginContentScanner scanner, PluginEntry entry, - String pluginName, PluginResourceKey key, HttpServletResponse res) + private void sendMarkdownAsHtml( + PluginContentScanner scanner, + PluginEntry entry, + String pluginName, + PluginResourceKey key, + HttpServletResponse res) throws IOException { byte[] rawmd = readWholeEntry(scanner, entry); String encoding = null; @@ -570,9 +569,8 @@ class HttpPluginServlet extends HttpServlet encoding = Strings.emptyToNull(atts.get(ATTR_CHARACTER_ENCODING)); } - String txtmd = RawParseUtils.decode( - Charset.forName(encoding != null ? encoding : UTF_8.name()), - rawmd); + String txtmd = + RawParseUtils.decode(Charset.forName(encoding != null ? encoding : UTF_8.name()), rawmd); long time = entry.getTime(); if (0 < time) { res.setDateHeader("Last-Modified", time); @@ -580,8 +578,11 @@ class HttpPluginServlet extends HttpServlet sendMarkdownAsHtml(txtmd, pluginName, key, res, time); } - private void sendResource(PluginContentScanner scanner, PluginEntry entry, - PluginResourceKey key, HttpServletResponse res) + private void sendResource( + PluginContentScanner scanner, + PluginEntry entry, + PluginResourceKey key, + HttpServletResponse res) throws IOException { byte[] data = null; Optional size = entry.getSize(); @@ -598,8 +599,7 @@ class HttpPluginServlet extends HttpServlet } if (contentType == null) { contentType = mimeUtil.getMimeType(entry.getName(), data).toString(); - if ("application/octet-stream".equals(contentType) - && entry.getName().endsWith(".js")) { + if ("application/octet-stream".equals(contentType) && entry.getName().endsWith(".js")) { contentType = "application/javascript"; } else if ("application/x-pointplus".equals(contentType) && entry.getName().endsWith(".css")) { @@ -619,21 +619,23 @@ class HttpPluginServlet extends HttpServlet res.setCharacterEncoding(charEnc); } if (data != null) { - resourceCache.put(key, new SmallResource(data) - .setContentType(contentType) - .setCharacterEncoding(charEnc) - .setLastModified(time)); + resourceCache.put( + key, + new SmallResource(data) + .setContentType(contentType) + .setCharacterEncoding(charEnc) + .setLastModified(time)); res.getOutputStream().write(data); } else { writeToResponse(res, scanner.getInputStream(entry)); } } - private void sendJsPlugin(Plugin plugin, PluginResourceKey key, - HttpServletRequest req, HttpServletResponse res) throws IOException { + private void sendJsPlugin( + Plugin plugin, PluginResourceKey key, HttpServletRequest req, HttpServletResponse res) + throws IOException { Path path = plugin.getSrcFile(); - if (req.getRequestURI().endsWith(getJsPluginPath(plugin)) - && Files.exists(path)) { + if (req.getRequestURI().endsWith(getJsPluginPath(plugin)) && Files.exists(path)) { res.setHeader("Content-Length", Long.toString(Files.size(path))); res.setContentType("application/javascript"); writeToResponse(res, Files.newInputStream(path)); @@ -644,8 +646,8 @@ class HttpPluginServlet extends HttpServlet } private static String getJsPluginPath(Plugin plugin) { - return String.format("/plugins/%s/static/%s", plugin.getName(), - plugin.getSrcFile().getFileName()); + return String.format( + "/plugins/%s/static/%s", plugin.getName(), plugin.getSrcFile().getFileName()); } private void writeToResponse(HttpServletResponse res, InputStream inputStream) @@ -672,10 +674,8 @@ class HttpPluginServlet extends HttpServlet PluginHolder(Plugin plugin, GuiceFilter filter) { this.plugin = plugin; this.filter = filter; - this.staticPrefix = - getPrefix(plugin, "Gerrit-HttpStaticPrefix", "static/"); - this.docPrefix = - getPrefix(plugin, "Gerrit-HttpDocumentationPrefix", "Documentation/"); + this.staticPrefix = getPrefix(plugin, "Gerrit-HttpStaticPrefix", "static/"); + this.docPrefix = getPrefix(plugin, "Gerrit-HttpDocumentationPrefix", "Documentation/"); } private static String getPrefix(Plugin plugin, String attr, String def) { @@ -685,15 +685,15 @@ class HttpPluginServlet extends HttpServlet return def; } try { - String prefix = - scanner.getManifest().getMainAttributes().getValue(attr); + String prefix = scanner.getManifest().getMainAttributes().getValue(attr); if (prefix != null) { return CharMatcher.is('/').trimFrom(prefix) + "/"; } return def; } catch (IOException e) { - log.warn(String.format("Error getting %s for plugin %s, using default", - attr, plugin.getName()), e); + log.warn( + String.format("Error getting %s for plugin %s, using default", attr, plugin.getName()), + e); return null; } } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/LfsPluginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/LfsPluginServlet.java index c01c4893ef..cc3726aa71 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/LfsPluginServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/LfsPluginServlet.java @@ -27,11 +27,6 @@ import com.google.gwtexpui.server.CacheHeaders; import com.google.inject.Inject; import com.google.inject.Singleton; import com.google.inject.servlet.GuiceFilter; - -import org.eclipse.jgit.lib.Config; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStreamWriter; @@ -39,7 +34,6 @@ import java.io.Writer; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicReference; - import javax.servlet.FilterChain; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; @@ -49,16 +43,17 @@ import javax.servlet.ServletResponse; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.eclipse.jgit.lib.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Singleton public class LfsPluginServlet extends HttpServlet implements StartPluginListener, ReloadPluginListener { private static final long serialVersionUID = 1L; - private static final Logger log - = LoggerFactory.getLogger(LfsPluginServlet.class); + private static final Logger log = LoggerFactory.getLogger(LfsPluginServlet.class); - public static final String URL_REGEX = - "^(?:/a)?(?:/p/|/)(.+)(?:/info/lfs/objects/batch)$"; + public static final String URL_REGEX = "^(?:/a)?(?:/p/|/)(.+)(?:/info/lfs/objects/batch)$"; private static final String CONTENTTYPE_VND_GIT_LFS_JSON = "application/vnd.git-lfs+json; charset=utf-8"; @@ -73,14 +68,13 @@ public class LfsPluginServlet extends HttpServlet @Inject LfsPluginServlet(@GerritServerConfig Config cfg) { this.pluginName = cfg.getString("lfs", null, "plugin"); - this.chain = new FilterChain() { - @Override - public void doFilter(ServletRequest req, ServletResponse res) - throws IOException { - Resource.NOT_FOUND.send( - (HttpServletRequest) req, (HttpServletResponse) res); - } - }; + this.chain = + new FilterChain() { + @Override + public void doFilter(ServletRequest req, ServletResponse res) throws IOException { + Resource.NOT_FOUND.send((HttpServletRequest) req, (HttpServletResponse) res); + } + }; this.filter = new AtomicReference<>(); } @@ -118,13 +112,11 @@ public class LfsPluginServlet extends HttpServlet install(newPlugin); } - private void responseLfsNotConfigured(HttpServletResponse res) - throws IOException { + private void responseLfsNotConfigured(HttpServletResponse res) throws IOException { CacheHeaders.setNotCacheable(res); res.setContentType(CONTENTTYPE_VND_GIT_LFS_JSON); res.setStatus(SC_NOT_IMPLEMENTED); - Writer w = new BufferedWriter( - new OutputStreamWriter(res.getOutputStream(), UTF_8)); + Writer w = new BufferedWriter(new OutputStreamWriter(res.getOutputStream(), UTF_8)); w.write(MESSAGE_LFS_NOT_CONFIGURED); w.flush(); } @@ -134,12 +126,13 @@ public class LfsPluginServlet extends HttpServlet return; } final GuiceFilter guiceFilter = load(plugin); - plugin.add(new RegistrationHandle() { - @Override - public void remove() { - filter.compareAndSet(guiceFilter, null); - } - }); + plugin.add( + new RegistrationHandle() { + @Override + public void remove() { + filter.compareAndSet(guiceFilter, null); + } + }); filter.set(guiceFilter); } @@ -155,20 +148,20 @@ public class LfsPluginServlet extends HttpServlet } try { - ServletContext ctx = - PluginServletContext.create(plugin, "/"); + ServletContext ctx = PluginServletContext.create(plugin, "/"); guiceFilter.init(new WrappedFilterConfig(ctx)); } catch (ServletException e) { log.warn(String.format("Plugin %s failed to initialize HTTP", name), e); return null; } - plugin.add(new RegistrationHandle() { - @Override - public void remove() { - guiceFilter.destroy(); - } - }); + plugin.add( + new RegistrationHandle() { + @Override + public void remove() { + guiceFilter.destroy(); + } + }); return guiceFilter; } return null; diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/PluginResourceKey.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/PluginResourceKey.java index 0a15a4f23b..a306aa6573 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/PluginResourceKey.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/PluginResourceKey.java @@ -25,6 +25,7 @@ abstract class PluginResourceKey implements ResourceKey { } public abstract Plugin.CacheKey plugin(); + public abstract String resource(); @Override diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/PluginServletContext.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/PluginServletContext.java index 476dba8aaa..a5ba2e80a5 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/PluginServletContext.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/PluginServletContext.java @@ -17,10 +17,6 @@ package com.google.gerrit.httpd.plugins; import com.google.common.collect.Maps; import com.google.gerrit.common.Version; import com.google.gerrit.server.plugins.Plugin; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.InputStream; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; @@ -30,24 +26,24 @@ import java.util.Collections; import java.util.Enumeration; import java.util.Set; import java.util.concurrent.ConcurrentMap; - import javax.servlet.RequestDispatcher; import javax.servlet.Servlet; import javax.servlet.ServletContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; class PluginServletContext { - private static final Logger log = - LoggerFactory.getLogger(PluginServletContext.class); + private static final Logger log = LoggerFactory.getLogger(PluginServletContext.class); static ServletContext create(Plugin plugin, String contextPath) { - return (ServletContext) Proxy.newProxyInstance( - PluginServletContext.class.getClassLoader(), - new Class[] {ServletContext.class, API.class}, - new Handler(plugin, contextPath)); + return (ServletContext) + Proxy.newProxyInstance( + PluginServletContext.class.getClassLoader(), + new Class[] {ServletContext.class, API.class}, + new Handler(plugin, contextPath)); } - private PluginServletContext() { - } + private PluginServletContext() {} private static class Handler implements InvocationHandler, API { private final Plugin plugin; @@ -61,18 +57,14 @@ class PluginServletContext { } @Override - public Object invoke(Object proxy, Method method, Object[] args) - throws Throwable { + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Method handler; try { - handler = API.class.getDeclaredMethod( - method.getName(), - method.getParameterTypes()); + handler = API.class.getDeclaredMethod(method.getName(), method.getParameterTypes()); } catch (NoSuchMethodException e) { - throw new NoSuchMethodError(String.format( - "%s does not implement %s", - PluginServletContext.class, - method.toGenericString())); + throw new NoSuchMethodError( + String.format( + "%s does not implement %s", PluginServletContext.class, method.toGenericString())); } return handler.invoke(this, args); } @@ -210,33 +202,57 @@ class PluginServletContext { interface API { String getContextPath(); + String getInitParameter(String name); + @SuppressWarnings("rawtypes") Enumeration getInitParameterNames(); + ServletContext getContext(String name); + RequestDispatcher getNamedDispatcher(String name); + RequestDispatcher getRequestDispatcher(String name); + URL getResource(String name); + InputStream getResourceAsStream(String name); + @SuppressWarnings("rawtypes") Set getResourcePaths(String name); + Servlet getServlet(String name); + String getRealPath(String name); + String getServletContextName(); + @SuppressWarnings("rawtypes") Enumeration getServletNames(); + @SuppressWarnings("rawtypes") Enumeration getServlets(); + void log(Exception reason, String msg); + void log(String msg); + void log(String msg, Throwable reason); + Object getAttribute(String name); + Enumeration getAttributeNames(); + void setAttribute(String name, Object value); + void removeAttribute(String name); + String getMimeType(String file); + int getMajorVersion(); + int getMinorVersion(); + String getServerInfo(); } } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/WrappedFilterConfig.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/WrappedFilterConfig.java index 60ceeb99dd..b415241de9 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/WrappedFilterConfig.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/WrappedFilterConfig.java @@ -15,10 +15,8 @@ package com.google.gerrit.httpd.plugins; import com.google.inject.servlet.GuiceFilter; - import java.util.Collections; import java.util.Enumeration; - import javax.servlet.FilterConfig; import javax.servlet.ServletContext; diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/BazelBuild.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/BazelBuild.java index 966a2fbe5c..6cae7a1f8d 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/BazelBuild.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/BazelBuild.java @@ -27,8 +27,7 @@ public class BazelBuild extends BuildSystem { @Override protected ProcessBuilder newBuildProcess(Label label) throws IOException { - Properties properties = loadBuildProperties( - sourceRoot.resolve(".primary_build_tool")); + Properties properties = loadBuildProperties(sourceRoot.resolve(".primary_build_tool")); String bazel = firstNonNull(properties.getProperty("bazel"), "bazel"); ProcessBuilder proc = new ProcessBuilder(bazel, "build", label.fullName()); if (properties.containsKey("PATH")) { @@ -54,8 +53,7 @@ public class BazelBuild extends BuildSystem { @Override public Label polygerritComponents() { - return new Label("polygerrit-ui", - "polygerrit_components.bower_components.zip"); + return new Label("polygerrit-ui", "polygerrit_components.bower_components.zip"); } @Override diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/BowerComponentsDevServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/BowerComponentsDevServlet.java index 027a04ef11..6c4afb0c09 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/BowerComponentsDevServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/BowerComponentsDevServlet.java @@ -17,7 +17,6 @@ package com.google.gerrit.httpd.raw; import com.google.common.cache.Cache; import com.google.gerrit.httpd.raw.BuildSystem.Label; import com.google.gerrit.launcher.GerritLauncher; - import java.io.IOException; import java.nio.file.Path; import java.util.Objects; @@ -29,8 +28,7 @@ class BowerComponentsDevServlet extends ResourceServlet { private final Path bowerComponents; private final Path zip; - BowerComponentsDevServlet(Cache cache, - BuildSystem builder) throws IOException { + BowerComponentsDevServlet(Cache cache, BuildSystem builder) throws IOException { super(cache, true); Objects.requireNonNull(builder); @@ -42,9 +40,7 @@ class BowerComponentsDevServlet extends ResourceServlet { } zip = builder.targetPath(label); - bowerComponents = GerritLauncher - .newZipFileSystem(zip) - .getPath("/"); + bowerComponents = GerritLauncher.newZipFileSystem(zip).getPath("/"); } @Override diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/BuildSystem.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/BuildSystem.java index 76d31102cb..09b439e7f9 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/BuildSystem.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/BuildSystem.java @@ -21,11 +21,6 @@ import com.google.common.html.HtmlEscapers; import com.google.common.io.ByteStreams; import com.google.gerrit.common.TimeUtil; import com.google.gwtexpui.server.CacheHeaders; - -import org.eclipse.jgit.util.RawParseUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.io.InputStream; import java.io.InterruptedIOException; @@ -34,12 +29,13 @@ import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.nio.file.Path; import java.util.Properties; - import javax.servlet.http.HttpServletResponse; +import org.eclipse.jgit.util.RawParseUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public abstract class BuildSystem { - private static final Logger log = - LoggerFactory.getLogger(BuildSystem.class); + private static final Logger log = LoggerFactory.getLogger(BuildSystem.class); protected final Path sourceRoot; @@ -49,8 +45,7 @@ public abstract class BuildSystem { protected abstract ProcessBuilder newBuildProcess(Label l) throws IOException; - protected static Properties loadBuildProperties(Path propPath) - throws IOException { + protected static Properties loadBuildProperties(Path propPath) throws IOException { Properties properties = new Properties(); try (InputStream in = Files.newInputStream(propPath)) { properties.load(in); @@ -61,11 +56,9 @@ public abstract class BuildSystem { } // builds the given label. - public void build(Label label) - throws IOException, BuildFailureException { + public void build(Label label) throws IOException, BuildFailureException { ProcessBuilder proc = newBuildProcess(label); - proc.directory(sourceRoot.toFile()) - .redirectErrorStream(true); + proc.directory(sourceRoot.toFile()).redirectErrorStream(true); log.info("building [" + name() + "] " + label.fullName()); long start = TimeUtil.nowMs(); Process rebuild = proc.start(); @@ -88,8 +81,7 @@ public abstract class BuildSystem { } long time = TimeUtil.nowMs() - start; - log.info(String.format("UPDATED %s in %.3fs", label.fullName(), - time / 1000.0)); + log.info(String.format("UPDATED %s in %.3fs", label.fullName(), time / 1000.0)); } // Represents a label in either buck or bazel. @@ -103,7 +95,7 @@ public abstract class BuildSystem { protected final String artifact; public String fullName() { - return "//" + pkg + ":" + name; + return "//" + pkg + ":" + name; } @Override @@ -137,8 +129,7 @@ public abstract class BuildSystem { this.why = why; } - public void display(String rule, HttpServletResponse res) - throws IOException { + public void display(String rule, HttpServletResponse res) throws IOException { res.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); res.setContentType("text/html"); res.setCharacterEncoding(UTF_8.name()); diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/CatServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/CatServlet.java index 42b5e7ec7f..7e298aa0f6 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/CatServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/CatServlet.java @@ -30,22 +30,19 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; import java.util.Optional; - import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Exports a single version of a patch as a normal file download. - *

- * This can be relatively unsafe with Microsoft Internet Explorer 6.0 as the - * browser will (rather incorrectly) treat an HTML or JavaScript file its - * supposed to download as though it was served by this site, and will execute - * it with the site's own protection domain. This opens a massive security hole - * so we package the content into a zip file. + * + *

This can be relatively unsafe with Microsoft Internet Explorer 6.0 as the browser will (rather + * incorrectly) treat an HTML or JavaScript file its supposed to download as though it was served by + * this site, and will execute it with the site's own protection domain. This opens a massive + * security hole so we package the content into a zip file. */ @SuppressWarnings("serial") @Singleton @@ -57,7 +54,8 @@ public class CatServlet extends HttpServlet { private final PatchSetUtil psUtil; @Inject - CatServlet(Provider sf, + CatServlet( + Provider sf, ChangeControl.GenericFactory ccf, Provider usrprv, ChangeEditUtil ceu, @@ -70,8 +68,8 @@ public class CatServlet extends HttpServlet { } @Override - protected void doGet(final HttpServletRequest req, - final HttpServletResponse rsp) throws IOException { + protected void doGet(final HttpServletRequest req, final HttpServletResponse rsp) + throws IOException { String keyStr = req.getPathInfo(); // We shouldn't have to do this extra decode pass, but somehow we @@ -122,8 +120,7 @@ public class CatServlet extends HttpServlet { String revision; try { final ReviewDb db = requestDb.get(); - final ChangeControl control = changeControl.validateFor(db, changeId, - userProvider.get()); + final ChangeControl control = changeControl.validateFor(db, changeId, userProvider.get()); if (patchKey.getParentKey().get() == 0) { // change edit try { @@ -139,8 +136,7 @@ public class CatServlet extends HttpServlet { return; } } else { - PatchSet patchSet = - psUtil.get(db, control.getNotes(), patchKey.getParentKey()); + PatchSet patchSet = psUtil.get(db, control.getNotes(), patchKey.getParentKey()); if (patchSet == null) { rsp.sendError(HttpServletResponse.SC_NOT_FOUND); return; @@ -157,8 +153,10 @@ public class CatServlet extends HttpServlet { } String path = patchKey.getFileName(); - String restUrl = String.format("%s/changes/%d/revisions/%s/files/%s/download?parent=%d", - req.getContextPath(), changeId.get(), revision, Url.encode(path), side); + String restUrl = + String.format( + "%s/changes/%d/revisions/%s/files/%s/download?parent=%d", + req.getContextPath(), changeId.get(), revision, Url.encode(path), side); rsp.sendRedirect(restUrl); } } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/DirectoryDocServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/DirectoryDocServlet.java index 826ff95006..c13286e697 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/DirectoryDocServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/DirectoryDocServlet.java @@ -15,7 +15,6 @@ package com.google.gerrit.httpd.raw; import com.google.common.cache.Cache; - import java.nio.file.Path; class DirectoryDocServlet extends ResourceServlet { diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/DirectoryGwtUiServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/DirectoryGwtUiServlet.java index 336faad760..0f3e342631 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/DirectoryGwtUiServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/DirectoryGwtUiServlet.java @@ -16,7 +16,6 @@ package com.google.gerrit.httpd.raw; import com.google.common.cache.Cache; import com.google.gerrit.common.TimeUtil; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -29,8 +28,8 @@ class DirectoryGwtUiServlet extends ResourceServlet { private final Path ui; - DirectoryGwtUiServlet(Cache cache, Path unpackedWar, - boolean dev) throws IOException { + DirectoryGwtUiServlet(Cache cache, Path unpackedWar, boolean dev) + throws IOException { super(cache, false); ui = unpackedWar.resolve("gerrit_ui"); if (!Files.exists(ui)) { diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/FontsDevServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/FontsDevServlet.java index b7b650ac27..8d2e1a1b9f 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/FontsDevServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/FontsDevServlet.java @@ -16,7 +16,6 @@ package com.google.gerrit.httpd.raw; import com.google.common.cache.Cache; import com.google.gerrit.launcher.GerritLauncher; - import java.io.IOException; import java.nio.file.Path; import java.util.Objects; @@ -27,8 +26,7 @@ class FontsDevServlet extends ResourceServlet { private final Path fonts; - FontsDevServlet(Cache cache, BuildSystem builder) - throws IOException { + FontsDevServlet(Cache cache, BuildSystem builder) throws IOException { super(cache, true); Objects.requireNonNull(builder); diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java index bb3eff70b7..84348d0975 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java @@ -43,15 +43,6 @@ import com.google.gwtjsonrpc.server.RPCServletUtils; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.Config; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; - import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -61,19 +52,24 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; - import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; /** Sends the Gerrit host page to clients. */ @SuppressWarnings("serial") @Singleton public class HostPageServlet extends HttpServlet { - private static final Logger log = - LoggerFactory.getLogger(HostPageServlet.class); + private static final Logger log = LoggerFactory.getLogger(HostPageServlet.class); private static final String HPD_ID = "gerrit_hostpagedata"; private static final int DEFAULT_JS_LOAD_TIMEOUT = 5000; @@ -156,8 +152,8 @@ public class HostPageServlet extends HttpServlet { private static int getPluginsLoadTimeout(Config cfg) { long cfgValue = - ConfigUtil.getTimeUnit(cfg, "plugins", null, "jsLoadTimeout", - DEFAULT_JS_LOAD_TIMEOUT, TimeUnit.MILLISECONDS); + ConfigUtil.getTimeUnit( + cfg, "plugins", null, "jsLoadTimeout", DEFAULT_JS_LOAD_TIMEOUT, TimeUnit.MILLISECONDS); if (cfgValue < 0) { return 0; } @@ -182,8 +178,7 @@ public class HostPageServlet extends HttpServlet { } @Override - protected void doGet(HttpServletRequest req, - HttpServletResponse rsp) throws IOException { + protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException { Page.Content page = select(req); StringWriter w = new StringWriter(); CurrentUser user = currentUser.get(); @@ -234,9 +229,7 @@ public class HostPageServlet extends HttpServlet { private void plugins(StringWriter w) { List urls = new ArrayList<>(); for (WebUiPlugin u : plugins) { - urls.add(String.format("plugins/%s/%s", - u.getPluginName(), - u.getJavaScriptResourcePath())); + urls.add(String.format("plugins/%s/%s", u.getPluginName(), u.getJavaScriptResourcePath())); } if (!urls.isEmpty()) { w.write(HPD_ID + ".plugins="); @@ -273,8 +266,7 @@ public class HostPageServlet extends HttpServlet { } private void insertETags(Element e) { - if ("img".equalsIgnoreCase(e.getTagName()) - || "script".equalsIgnoreCase(e.getTagName())) { + if ("img".equalsIgnoreCase(e.getTagName()) || "script".equalsIgnoreCase(e.getTagName())) { String src = e.getAttribute("src"); if (src != null && src.startsWith("static/")) { String name = src.substring("static/".length()); @@ -370,8 +362,7 @@ public class HostPageServlet extends HttpServlet { } } - private FileInfo injectCssFile(Document hostDoc, String id, Path src) - throws IOException { + private FileInfo injectCssFile(Document hostDoc, String id, Path src) throws IOException { FileInfo info = new FileInfo(src); Element banner = HtmlDomUtil.find(hostDoc, id); if (banner == null) { @@ -382,8 +373,7 @@ public class HostPageServlet extends HttpServlet { banner.removeChild(banner.getFirstChild()); } - String css = - HtmlDomUtil.readFile(src.getParent(), src.getFileName().toString()); + String css = HtmlDomUtil.readFile(src.getParent(), src.getFileName().toString()); if (css == null) { return info; } @@ -392,8 +382,7 @@ public class HostPageServlet extends HttpServlet { return info; } - private FileInfo injectXmlFile(Document hostDoc, String id, Path src) - throws IOException { + private FileInfo injectXmlFile(Document hostDoc, String id, Path src) throws IOException { FileInfo info = new FileInfo(src); Element banner = HtmlDomUtil.find(hostDoc, id); if (banner == null) { diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/LegacyGerritServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/LegacyGerritServlet.java index 95a247f24e..8ccf221c77 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/LegacyGerritServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/LegacyGerritServlet.java @@ -19,23 +19,20 @@ import com.google.gwtexpui.server.CacheHeaders; import com.google.gwtjsonrpc.server.RPCServletUtils; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.io.FileNotFoundException; import java.io.IOException; import java.io.OutputStream; - import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Redirects from {@code /Gerrit#foo} to {@code /#foo} in JavaScript. - *

- * This redirect exists to convert the older /Gerrit URL into the more modern - * URL format which does not use a servlet name for the host page. We cannot do - * the redirect here in the server side, as it would lose any history token that - * appears in the URL. Instead we send an HTML page which instructs the browser - * to replace the URL, but preserve the history token. + * + *

This redirect exists to convert the older /Gerrit URL into the more modern URL format which + * does not use a servlet name for the host page. We cannot do the redirect here in the server side, + * as it would lose any history token that appears in the URL. Instead we send an HTML page which + * instructs the browser to replace the URL, but preserve the history token. */ @SuppressWarnings("serial") @Singleton @@ -56,8 +53,8 @@ public class LegacyGerritServlet extends HttpServlet { } @Override - protected void doGet(final HttpServletRequest req, - final HttpServletResponse rsp) throws IOException { + protected void doGet(final HttpServletRequest req, final HttpServletResponse rsp) + throws IOException { final byte[] tosend; if (RPCServletUtils.acceptsGzipEncoding(req)) { rsp.setHeader("Content-Encoding", "gzip"); diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/PolyGerritUiServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/PolyGerritUiServlet.java index 4ca8b1c161..2f3d32fefc 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/PolyGerritUiServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/PolyGerritUiServlet.java @@ -15,7 +15,6 @@ package com.google.gerrit.httpd.raw; import com.google.common.cache.Cache; - import java.nio.file.Path; class PolyGerritUiServlet extends ResourceServlet { diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/RecompileGwtUiFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/RecompileGwtUiFilter.java index c36d257289..cacea89742 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/RecompileGwtUiFilter.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/RecompileGwtUiFilter.java @@ -16,7 +16,6 @@ package com.google.gerrit.httpd.raw; import com.google.gerrit.httpd.raw.BuildSystem.Label; import com.google.gwtexpui.linker.server.UserAgentRule; - import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -27,7 +26,6 @@ import java.util.HashSet; import java.util.Set; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; - import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -54,11 +52,10 @@ class RecompileGwtUiFilter implements Filter { } @Override - public void doFilter(ServletRequest request, ServletResponse res, - FilterChain chain) throws IOException, ServletException { + public void doFilter(ServletRequest request, ServletResponse res, FilterChain chain) + throws IOException, ServletException { String agent = rule.select((HttpServletRequest) request); - if (unpackedWar != null - && (gwtuiRecompile || !uaInitialized.contains(agent))) { + if (unpackedWar != null && (gwtuiRecompile || !uaInitialized.contains(agent))) { Label label = builder.gwtZipLabel(agent); File zip = builder.targetPath(label).toFile(); @@ -82,12 +79,10 @@ class RecompileGwtUiFilter implements Filter { } @Override - public void init(FilterConfig config) { - } + public void init(FilterConfig config) {} @Override - public void destroy() { - } + public void destroy() {} private static void unpack(File srcwar, File dstwar) throws IOException { try (ZipFile zf = new ZipFile(srcwar)) { @@ -97,10 +92,10 @@ class RecompileGwtUiFilter implements Filter { final String name = ze.getName(); if (ze.isDirectory() - || name.startsWith("WEB-INF/") - || name.startsWith("META-INF/") - || name.startsWith("com/google/gerrit/launcher/") - || name.equals("Main.class")) { + || name.startsWith("WEB-INF/") + || name.startsWith("META-INF/") + || name.startsWith("com/google/gerrit/launcher/") + || name.equals("Main.class")) { continue; } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ResourceServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ResourceServlet.java index e4d3339b51..c79fa747da 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ResourceServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ResourceServlet.java @@ -36,10 +36,6 @@ import com.google.gerrit.common.Nullable; import com.google.gerrit.httpd.HtmlDomUtil; import com.google.gwtexpui.server.CacheHeaders; import com.google.gwtjsonrpc.server.RPCServletUtils; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.io.OutputStream; import java.nio.file.Files; @@ -49,47 +45,46 @@ import java.nio.file.attribute.FileTime; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.zip.GZIPOutputStream; - import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Base class for serving static resources. - *

- * Supports caching, ETags, basic content type detection, and limited gzip - * compression. + * + *

Supports caching, ETags, basic content type detection, and limited gzip compression. */ public abstract class ResourceServlet extends HttpServlet { private static final long serialVersionUID = 1L; - private static final Logger log = - LoggerFactory.getLogger(ResourceServlet.class); + private static final Logger log = LoggerFactory.getLogger(ResourceServlet.class); private static final int CACHE_FILE_SIZE_LIMIT_BYTES = 100 << 10; private static final String JS = "application/x-javascript"; private static final ImmutableMap MIME_TYPES = - ImmutableMap. builder() - .put("css", "text/css") - .put("gif", "image/gif") - .put("htm", "text/html") - .put("html", "text/html") - .put("ico", "image/x-icon") - .put("jpeg", "image/jpeg") - .put("jpg", "image/jpeg") - .put("js", JS) - .put("pdf", "application/pdf") - .put("png", "image/png") - .put("rtf", "text/rtf") - .put("svg", "image/svg+xml") - .put("text", "text/plain") - .put("tif", "image/tiff") - .put("tiff", "image/tiff") - .put("txt", "text/plain") - .put("woff", "font/woff") - .put("woff2", "font/woff2") - .build(); + ImmutableMap.builder() + .put("css", "text/css") + .put("gif", "image/gif") + .put("htm", "text/html") + .put("html", "text/html") + .put("ico", "image/x-icon") + .put("jpeg", "image/jpeg") + .put("jpg", "image/jpeg") + .put("js", JS) + .put("pdf", "application/pdf") + .put("png", "image/png") + .put("rtf", "text/rtf") + .put("svg", "image/svg+xml") + .put("text", "text/plain") + .put("tif", "image/tiff") + .put("tiff", "image/tiff") + .put("txt", "text/plain") + .put("woff", "font/woff") + .put("woff2", "font/woff2") + .build(); protected static String contentType(String name) { int dot = name.lastIndexOf('.'); @@ -107,14 +102,16 @@ public abstract class ResourceServlet extends HttpServlet { this(cache, refresh, true, CACHE_FILE_SIZE_LIMIT_BYTES); } - protected ResourceServlet(Cache cache, boolean refresh, - boolean cacheOnClient) { + protected ResourceServlet(Cache cache, boolean refresh, boolean cacheOnClient) { this(cache, refresh, cacheOnClient, CACHE_FILE_SIZE_LIMIT_BYTES); } @VisibleForTesting - ResourceServlet(Cache cache, boolean refresh, - boolean cacheOnClient, int cacheFileSizeLimitBytes) { + ResourceServlet( + Cache cache, + boolean refresh, + boolean cacheOnClient, + int cacheFileSizeLimitBytes) { this.cache = checkNotNull(cache, "cache"); this.refresh = refresh; this.cacheOnClient = cacheOnClient; @@ -122,8 +119,7 @@ public abstract class ResourceServlet extends HttpServlet { } /** - * Get the resource path on the filesystem that should be served for this - * request. + * Get the resource path on the filesystem that should be served for this request. * * @param pathInfo result of {@link HttpServletRequest#getPathInfo()}. * @return path where static content can be found. @@ -136,8 +132,7 @@ public abstract class ResourceServlet extends HttpServlet { } @Override - protected void doGet(HttpServletRequest req, HttpServletResponse rsp) - throws IOException { + protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException { String name; if (req.getPathInfo() == null) { name = "/"; @@ -236,17 +231,17 @@ public abstract class ResourceServlet extends HttpServlet { } /** - * Maybe stream a path to the response, depending on the properties of the - * file and cache headers in the request. + * Maybe stream a path to the response, depending on the properties of the file and cache headers + * in the request. * * @param p path to stream * @param req HTTP request. * @param rsp HTTP response. - * @return true if the response was written (either the file contents or an - * error); false if the path is too small to stream and should be cached. + * @return true if the response was written (either the file contents or an error); false if the + * path is too small to stream and should be cached. */ - private boolean maybeStream(Path p, HttpServletRequest req, - HttpServletResponse rsp) throws IOException { + private boolean maybeStream(Path p, HttpServletRequest req, HttpServletResponse rsp) + throws IOException { try { if (Files.size(p) < cacheFileSizeLimitBytes) { return false; @@ -285,23 +280,20 @@ public abstract class ResourceServlet extends HttpServlet { return true; } - private static boolean isUnreasonableName(String name) { return name.length() < 1 - || name.contains("\\") // no windows/dos style paths - || name.startsWith("../") // no "../etc/passwd" - || name.contains("/../") // no "foo/../etc/passwd" - || name.contains("/./") // "foo/./foo" is insane to ask - || name.contains("//"); // windows UNC path can be "//..." + || name.contains("\\") // no windows/dos style paths + || name.startsWith("../") // no "../etc/passwd" + || name.contains("/../") // no "foo/../etc/passwd" + || name.contains("/./") // "foo/./foo" is insane to ask + || name.contains("//"); // windows UNC path can be "//..." } private Callable newLoader(final Path p) { return () -> { try { return new Resource( - getLastModifiedTime(p), - contentType(p.toString()), - Files.readAllBytes(p)); + getLastModifiedTime(p), contentType(p.toString()), Files.readAllBytes(p)); } catch (NoSuchFileException e) { return Resource.NOT_FOUND; } @@ -309,8 +301,7 @@ public abstract class ResourceServlet extends HttpServlet { } public static class Resource { - static final Resource NOT_FOUND = - new Resource(FileTime.fromMillis(0), "", new byte[] {}); + static final Resource NOT_FOUND = new Resource(FileTime.fromMillis(0), "", new byte[] {}); final FileTime lastModified; final String contentType; @@ -331,14 +322,11 @@ public abstract class ResourceServlet extends HttpServlet { } catch (NoSuchFileException e) { return this != NOT_FOUND; } - return t.toMillis() == 0 - || lastModified.toMillis() == 0 - || !lastModified.equals(t); + return t.toMillis() == 0 || lastModified.toMillis() == 0 || !lastModified.equals(t); } } - public static class Weigher - implements com.google.common.cache.Weigher { + public static class Weigher implements com.google.common.cache.Weigher { @Override public int weigh(Path p, Resource r) { return 2 * p.toString().length() + r.raw.length; diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/SingleFileServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/SingleFileServlet.java index 64dd862179..0ac3d10eb6 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/SingleFileServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/SingleFileServlet.java @@ -15,7 +15,6 @@ package com.google.gerrit.httpd.raw; import com.google.common.cache.Cache; - import java.nio.file.Path; /** Serve a single static file, regardless of path. */ @@ -29,8 +28,8 @@ class SingleFileServlet extends ResourceServlet { this.path = path; } - SingleFileServlet(Cache cache, Path path, boolean refresh, - boolean cacheOnClient) { + SingleFileServlet( + Cache cache, Path path, boolean refresh, boolean cacheOnClient) { super(cache, refresh, cacheOnClient); this.path = path; } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/SiteStaticDirectoryServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/SiteStaticDirectoryServlet.java index 63653069cf..594415aaf9 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/SiteStaticDirectoryServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/SiteStaticDirectoryServlet.java @@ -20,12 +20,9 @@ import com.google.gerrit.server.config.SitePaths; import com.google.inject.Inject; import com.google.inject.Singleton; import com.google.inject.name.Named; - -import org.eclipse.jgit.lib.Config; - import java.io.IOException; import java.nio.file.Path; - +import org.eclipse.jgit.lib.Config; /** Sends static content from the site 's {@code static/} subdirectory. */ @Singleton diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/SshInfoServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/SshInfoServlet.java index f570cb62eb..b20f990c28 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/SshInfoServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/SshInfoServlet.java @@ -20,37 +20,31 @@ import com.google.gerrit.server.ssh.SshInfo; import com.google.gwtexpui.server.CacheHeaders; import com.google.inject.Inject; import com.google.inject.Singleton; - import com.jcraft.jsch.HostKey; - import java.io.IOException; import java.io.PrintWriter; import java.util.List; - import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** - * Servlet hosting an SSH daemon on another port. During a standard HTTP GET - * request the servlet returns the hostname and port number back to the client - * in the form ${host} ${port}. - *

- * Use a Git URL such as ssh://${email}@${host}:${port}/${path}, - * e.g. {@code ssh://sop@google.com@gerrit.com:8010/tools/gerrit.git} to - * access the SSH daemon itself. - *

- * Versions of Git before 1.5.3 may require setting the username and port - * properties in the user's {@code ~/.ssh/config} file, and using a host - * alias through a URL such as {@code gerrit-alias:/tools/gerrit.git}: - *

- * {@code
+ * Servlet hosting an SSH daemon on another port. During a standard HTTP GET request the servlet
+ * returns the hostname and port number back to the client in the form ${host} ${port}.
+ *
+ * 

Use a Git URL such as ssh://${email}@${host}:${port}/${path}, e.g. {@code + * ssh://sop@google.com@gerrit.com:8010/tools/gerrit.git} to access the SSH daemon itself. + * + *

Versions of Git before 1.5.3 may require setting the username and port properties in the + * user's {@code ~/.ssh/config} file, and using a host alias through a URL such as {@code + * gerrit-alias:/tools/gerrit.git}: + * + *

{@code
  * Host gerrit-alias
  *  User sop@google.com
  *  Hostname gerrit.com
  *  Port 8010
- * }
- * 
+ * }
*/ @SuppressWarnings("serial") @Singleton @@ -63,8 +57,8 @@ public class SshInfoServlet extends HttpServlet { } @Override - protected void doGet(final HttpServletRequest req, - final HttpServletResponse rsp) throws IOException { + protected void doGet(final HttpServletRequest req, final HttpServletResponse rsp) + throws IOException { final List hostKeys = sshd.getHostKeys(); final String out; if (!hostKeys.isEmpty()) { diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/StaticModule.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/StaticModule.java index 0571ee623e..fd61d917e1 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/StaticModule.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/StaticModule.java @@ -38,17 +38,11 @@ import com.google.inject.Singleton; import com.google.inject.name.Named; import com.google.inject.name.Names; import com.google.inject.servlet.ServletModule; - -import org.eclipse.jgit.lib.Config; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.nio.file.FileSystem; import java.nio.file.Path; - import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -60,39 +54,33 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; +import org.eclipse.jgit.lib.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class StaticModule extends ServletModule { - private static final Logger log = - LoggerFactory.getLogger(StaticModule.class); + private static final Logger log = LoggerFactory.getLogger(StaticModule.class); public static final String CACHE = "static_content"; public static final String GERRIT_UI_COOKIE = "GERRIT_UI"; /** - * Paths at which we should serve the main PolyGerrit application {@code - * index.html}. - *

- * Supports {@code "/*"} as a trailing wildcard. + * Paths at which we should serve the main PolyGerrit application {@code index.html}. + * + *

Supports {@code "/*"} as a trailing wildcard. */ public static final ImmutableList POLYGERRIT_INDEX_PATHS = - ImmutableList.of( - "/", - "/c/*", - "/q/*", - "/x/*", - "/admin/*", - "/dashboard/*", - "/settings/*"); - // TODO(dborowitz): These fragments conflict with the REST API - // namespace, so they will need to use a different path. - //"/groups/*", - //"/projects/*"); - // + ImmutableList.of("/", "/c/*", "/q/*", "/x/*", "/admin/*", "/dashboard/*", "/settings/*"); + // TODO(dborowitz): These fragments conflict with the REST API + // namespace, so they will need to use a different path. + //"/groups/*", + //"/projects/*"); + // /** * Paths that should be treated as static assets when serving PolyGerrit. - *

- * Supports {@code "/*"} as a trailing wildcard. + * + *

Supports {@code "/*"} as a trailing wildcard. */ private static final ImmutableList POLYGERRIT_ASSET_PATHS = ImmutableList.of( @@ -106,8 +94,7 @@ public class StaticModule extends ServletModule { private static final String DOC_SERVLET = "DocServlet"; private static final String FAVICON_SERVLET = "FaviconServlet"; private static final String GWT_UI_SERVLET = "GwtUiServlet"; - private static final String POLYGERRIT_INDEX_SERVLET = - "PolyGerritUiIndexServlet"; + private static final String POLYGERRIT_INDEX_SERVLET = "PolyGerritUiIndexServlet"; private static final String ROBOTS_TXT_SERVLET = "RobotsTxtServlet"; private static final int GERRIT_UI_COOKIE_MAX_AGE = 60 * 60 * 24 * 365; @@ -133,14 +120,15 @@ public class StaticModule extends ServletModule { protected void configureServlets() { serveRegex("^/Documentation/(.+)$").with(named(DOC_SERVLET)); serve("/static/*").with(SiteStaticDirectoryServlet.class); - install(new CacheModule() { - @Override - protected void configure() { - cache(CACHE, Path.class, Resource.class) - .maximumWeight(1 << 20) - .weigher(ResourceServlet.Weigher.class); - } - }); + install( + new CacheModule() { + @Override + protected void configure() { + cache(CACHE, Path.class, Resource.class) + .maximumWeight(1 << 20) + .weigher(ResourceServlet.Weigher.class); + } + }); if (!options.headless()) { install(new CoreStaticModule()); } @@ -166,8 +154,8 @@ public class StaticModule extends ServletModule { private static final long serialVersionUID = 1L; @Override - protected void service(HttpServletRequest req, - HttpServletResponse resp) throws IOException { + protected void service(HttpServletRequest req, HttpServletResponse resp) + throws IOException { resp.sendError(HttpServletResponse.SC_NOT_FOUND); } }; @@ -184,10 +172,11 @@ public class StaticModule extends ServletModule { @Provides @Singleton @Named(ROBOTS_TXT_SERVLET) - HttpServlet getRobotsTxtServlet(@GerritServerConfig Config cfg, - SitePaths sitePaths, @Named(CACHE) Cache cache) { - Path configPath = sitePaths.resolve( - cfg.getString("httpd", null, "robotsFile")); + HttpServlet getRobotsTxtServlet( + @GerritServerConfig Config cfg, + SitePaths sitePaths, + @Named(CACHE) Cache cache) { + Path configPath = sitePaths.resolve(cfg.getString("httpd", null, "robotsFile")); if (configPath != null) { if (exists(configPath) && isReadable(configPath)) { return new SingleFileServlet(cache, configPath, true); @@ -196,11 +185,9 @@ public class StaticModule extends ServletModule { } Paths p = getPaths(); if (p.warFs != null) { - return new SingleFileServlet( - cache, p.warFs.getPath("/robots.txt"), false); + return new SingleFileServlet(cache, p.warFs.getPath("/robots.txt"), false); } - return new SingleFileServlet( - cache, webappSourcePath("robots.txt"), true); + return new SingleFileServlet(cache, webappSourcePath("robots.txt"), true); } @Provides @@ -209,11 +196,9 @@ public class StaticModule extends ServletModule { HttpServlet getFaviconServlet(@Named(CACHE) Cache cache) { Paths p = getPaths(); if (p.warFs != null) { - return new SingleFileServlet( - cache, p.warFs.getPath("/favicon.ico"), false); + return new SingleFileServlet(cache, p.warFs.getPath("/favicon.ico"), false); } - return new SingleFileServlet( - cache, webappSourcePath("favicon.ico"), true); + return new SingleFileServlet(cache, webappSourcePath("favicon.ico"), true); } private Path webappSourcePath(String name) { @@ -239,8 +224,7 @@ public class StaticModule extends ServletModule { @Provides @Singleton @Named(GWT_UI_SERVLET) - HttpServlet getGwtUiServlet(@Named(CACHE) Cache cache) - throws IOException { + HttpServlet getGwtUiServlet(@Named(CACHE) Cache cache) throws IOException { Paths p = getPaths(); if (p.warFs != null) { return new WarGwtUiServlet(cache, p.warFs); @@ -265,44 +249,35 @@ public class StaticModule extends ServletModule { @Provides @Singleton @Named(POLYGERRIT_INDEX_SERVLET) - HttpServlet getPolyGerritUiIndexServlet( - @Named(CACHE) Cache cache) { - return new SingleFileServlet(cache, - polyGerritBasePath().resolve("index.html"), - getPaths().isDev(), - false); + HttpServlet getPolyGerritUiIndexServlet(@Named(CACHE) Cache cache) { + return new SingleFileServlet( + cache, polyGerritBasePath().resolve("index.html"), getPaths().isDev(), false); } @Provides @Singleton - PolyGerritUiServlet getPolyGerritUiServlet( - @Named(CACHE) Cache cache) { + PolyGerritUiServlet getPolyGerritUiServlet(@Named(CACHE) Cache cache) { return new PolyGerritUiServlet(cache, polyGerritBasePath()); } @Provides @Singleton - BowerComponentsDevServlet getBowerComponentsServlet( - @Named(CACHE) Cache cache) throws IOException { - return getPaths().isDev() - ? new BowerComponentsDevServlet(cache, getPaths().builder) - : null; + BowerComponentsDevServlet getBowerComponentsServlet(@Named(CACHE) Cache cache) + throws IOException { + return getPaths().isDev() ? new BowerComponentsDevServlet(cache, getPaths().builder) : null; } @Provides @Singleton - FontsDevServlet getFontsServlet( - @Named(CACHE) Cache cache) throws IOException { - return getPaths().isDev() - ? new FontsDevServlet(cache, getPaths().builder) - : null; + FontsDevServlet getFontsServlet(@Named(CACHE) Cache cache) throws IOException { + return getPaths().isDev() ? new FontsDevServlet(cache, getPaths().builder) : null; } private Path polyGerritBasePath() { Paths p = getPaths(); if (options.forcePolyGerritDev()) { - checkArgument(p.sourceRoot != null, - "no source root directory found for PolyGerrit developer mode"); + checkArgument( + p.sourceRoot != null, "no source root directory found for PolyGerrit developer mode"); } if (p.isDev()) { @@ -325,19 +300,16 @@ public class StaticModule extends ServletModule { private Paths(GerritOptions options) { try { File launcherLoadedFrom = getLauncherLoadedFrom(); - if (launcherLoadedFrom != null - && launcherLoadedFrom.getName().endsWith(".jar")) { + if (launcherLoadedFrom != null && launcherLoadedFrom.getName().endsWith(".jar")) { // Special case: unpacked war archive deployed in container. // The path is something like: // //WEB-INF/lib/launcher.jar // Switch to exploded war case with /webapp>/ // root directory warFs = null; - unpackedWar = java.nio.file.Paths.get(launcherLoadedFrom - .getParentFile() - .getParentFile() - .getParentFile() - .toURI()); + unpackedWar = + java.nio.file.Paths.get( + launcherLoadedFrom.getParentFile().getParentFile().getParentFile().toURI()); sourceRoot = null; development = false; builder = null; @@ -358,8 +330,7 @@ public class StaticModule extends ServletModule { return; } } catch (IOException e) { - throw new ProvisionException( - "Error initializing static content paths", e); + throw new ProvisionException("Error initializing static content paths", e); } sourceRoot = getSourceRootOrNull(); @@ -390,8 +361,7 @@ public class StaticModule extends ServletModule { && GerritLauncher.NOT_ARCHIVED.equals(e.getMessage())) { return null; } - ProvisionException pe = - new ProvisionException("Error reading gerrit.war"); + ProvisionException pe = new ProvisionException("Error reading gerrit.war"); pe.initCause(e); throw pe; } @@ -421,8 +391,7 @@ public class StaticModule extends ServletModule { return dstwar.getAbsoluteFile().toPath(); } } catch (IOException e) { - ProvisionException pe = - new ProvisionException("Cannot create war tempdir"); + ProvisionException pe = new ProvisionException("Cannot create war tempdir"); pe.initCause(e); throw pe; } @@ -443,7 +412,8 @@ public class StaticModule extends ServletModule { private final FontsDevServlet fontServlet; @Inject - PolyGerritFilter(GerritOptions options, + PolyGerritFilter( + GerritOptions options, Paths paths, @Named(POLYGERRIT_INDEX_SERVLET) HttpServlet polyGerritIndex, PolyGerritUiServlet polygerritUI, @@ -455,21 +425,19 @@ public class StaticModule extends ServletModule { this.polygerritUI = polygerritUI; this.bowerComponentServlet = bowerComponentServlet; this.fontServlet = fontServlet; - checkState(options.enablePolyGerrit(), - "can't install PolyGerritFilter when PolyGerrit is disabled"); + checkState( + options.enablePolyGerrit(), "can't install PolyGerritFilter when PolyGerrit is disabled"); } @Override - public void init(FilterConfig filterConfig) throws ServletException { - } + public void init(FilterConfig filterConfig) throws ServletException {} @Override - public void destroy() { - } + public void destroy() {} @Override - public void doFilter(ServletRequest request, ServletResponse response, - FilterChain chain) throws IOException, ServletException { + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; if (handlePolyGerritParam(req, res)) { @@ -480,8 +448,7 @@ public class StaticModule extends ServletModule { return; } - GuiceFilterRequestWrapper reqWrapper = - new GuiceFilterRequestWrapper(req); + GuiceFilterRequestWrapper reqWrapper = new GuiceFilterRequestWrapper(req); String path = pathInfo(req); // Special case assets during development that are built by Buck and not @@ -518,8 +485,8 @@ public class StaticModule extends ServletModule { return uri.startsWith(ctx) ? uri.substring(ctx.length()) : uri; } - private boolean handlePolyGerritParam(HttpServletRequest req, - HttpServletResponse res) throws IOException { + private boolean handlePolyGerritParam(HttpServletRequest req, HttpServletResponse res) + throws IOException { if (!options.enableGwtUi()) { return false; } @@ -564,8 +531,7 @@ public class StaticModule extends ServletModule { return type == UiType.POLYGERRIT; } - private void setPolyGerritCookie(HttpServletRequest req, - HttpServletResponse res, UiType pref) { + private void setPolyGerritCookie(HttpServletRequest req, HttpServletResponse res, UiType pref) { // Only actually set a cookie if both UIs are enabled in the server; // otherwise clear it. Cookie cookie = new Cookie(GERRIT_UI_COOKIE, pref.name()); @@ -598,7 +564,7 @@ public class StaticModule extends ServletModule { if (path.regionMatches(0, p, 0, p.length() - 1)) { return true; } - } else if(p.equals(path)) { + } else if (p.equals(path)) { return true; } } @@ -606,8 +572,7 @@ public class StaticModule extends ServletModule { } } - private static class GuiceFilterRequestWrapper - extends HttpServletRequestWrapper { + private static class GuiceFilterRequestWrapper extends HttpServletRequestWrapper { GuiceFilterRequestWrapper(HttpServletRequest req) { super(req); } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ThemeFactory.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ThemeFactory.java index 9e89eee427..6a75e07a4a 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ThemeFactory.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ThemeFactory.java @@ -17,7 +17,6 @@ package com.google.gerrit.httpd.raw; import com.google.gerrit.common.data.HostPageData; import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; - import org.eclipse.jgit.lib.Config; class ThemeFactory { diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ToolServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ToolServlet.java index 5c6480a0f7..fcdd21d3be 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ToolServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ToolServlet.java @@ -29,16 +29,13 @@ import com.google.gerrit.server.tools.ToolsCatalog.Entry; import com.google.gwtjsonrpc.server.RPCServletUtils; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.w3c.dom.Document; -import org.w3c.dom.Element; - import java.io.IOException; import java.io.OutputStream; - import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.w3c.dom.Document; +import org.w3c.dom.Element; /** Sends the client side tools we keep within our software. */ @Singleton @@ -52,8 +49,7 @@ public class ToolServlet extends HttpServlet { } @Override - protected void doGet(HttpServletRequest req, HttpServletResponse rsp) - throws IOException { + protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException { Entry ent = toc.get(req.getPathInfo()); if (ent == null) { rsp.sendError(SC_NOT_FOUND); @@ -88,8 +84,8 @@ public class ToolServlet extends HttpServlet { } } - private void doGetDirectory(Entry ent, HttpServletRequest req, - HttpServletResponse rsp) throws IOException { + private void doGetDirectory(Entry ent, HttpServletRequest req, HttpServletResponse rsp) + throws IOException { String path = "/tools/" + ent.getPath(); Document page = newDocument(); @@ -130,8 +126,7 @@ public class ToolServlet extends HttpServlet { Element footer = page.createElement("p"); footer.setAttribute("style", "text-align: right; font-style: italic"); - footer.setTextContent("Powered by Gerrit Code Review " - + Version.getVersion()); + footer.setTextContent("Powered by Gerrit Code Review " + Version.getVersion()); body.appendChild(footer); byte[] tosend = toUTF8(page); diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/WarDocServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/WarDocServlet.java index ad233140b4..93bd5aed1d 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/WarDocServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/WarDocServlet.java @@ -15,7 +15,6 @@ package com.google.gerrit.httpd.raw; import com.google.common.cache.Cache; - import java.nio.file.FileSystem; import java.nio.file.Path; diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/WarGwtUiServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/WarGwtUiServlet.java index 45952cc41e..ff279659b9 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/WarGwtUiServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/WarGwtUiServlet.java @@ -16,7 +16,6 @@ package com.google.gerrit.httpd.raw; import com.google.common.cache.Cache; import com.google.gerrit.common.TimeUtil; - import java.nio.file.FileSystem; import java.nio.file.Path; import java.nio.file.attribute.FileTime; diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/resources/Resource.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/resources/Resource.java index b6d9a75e71..bfa0b95606 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/resources/Resource.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/resources/Resource.java @@ -15,45 +15,42 @@ package com.google.gerrit.httpd.resources; import com.google.gwtexpui.server.CacheHeaders; - import java.io.IOException; import java.io.Serializable; - import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public abstract class Resource implements Serializable { private static final long serialVersionUID = 1L; - public static final Resource NOT_FOUND = new Resource() { - private static final long serialVersionUID = 1L; + public static final Resource NOT_FOUND = + new Resource() { + private static final long serialVersionUID = 1L; - @Override - public int weigh() { - return 0; - } + @Override + public int weigh() { + return 0; + } - @Override - public void send(HttpServletRequest req, HttpServletResponse res) - throws IOException { - CacheHeaders.setNotCacheable(res); - res.sendError(HttpServletResponse.SC_NOT_FOUND); - } + @Override + public void send(HttpServletRequest req, HttpServletResponse res) throws IOException { + CacheHeaders.setNotCacheable(res); + res.sendError(HttpServletResponse.SC_NOT_FOUND); + } - @Override - public boolean isUnchanged(long latestModifiedDate) { - return false; - } + @Override + public boolean isUnchanged(long latestModifiedDate) { + return false; + } - protected Object readResolve() { - return NOT_FOUND; - } - }; + protected Object readResolve() { + return NOT_FOUND; + } + }; public abstract boolean isUnchanged(long latestModifiedDate); public abstract int weigh(); - public abstract void send(HttpServletRequest req, HttpServletResponse res) - throws IOException; + public abstract void send(HttpServletRequest req, HttpServletResponse res) throws IOException; } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/resources/SmallResource.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/resources/SmallResource.java index 9d052fecc8..8d80111f08 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/resources/SmallResource.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/resources/SmallResource.java @@ -16,9 +16,7 @@ package com.google.gerrit.httpd.resources; import com.google.common.net.HttpHeaders; import com.google.gerrit.common.Nullable; - import java.io.IOException; - import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -54,8 +52,7 @@ public final class SmallResource extends Resource { } @Override - public void send(HttpServletRequest req, HttpServletResponse res) - throws IOException { + public void send(HttpServletRequest req, HttpServletResponse res) throws IOException { if (0 < lastModified) { long ifModifiedSince = req.getDateHeader(HttpHeaders.IF_MODIFIED_SINCE); if (ifModifiedSince > 0 && ifModifiedSince == lastModified) { @@ -66,7 +63,7 @@ public final class SmallResource extends Resource { } res.setContentType(contentType); if (characterEncoding != null) { - res.setCharacterEncoding(characterEncoding); + res.setCharacterEncoding(characterEncoding); } res.setContentLength(data.length); res.getOutputStream().write(data); diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/AccessRestApiServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/AccessRestApiServlet.java index a9bd85d380..0d1e53c216 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/AccessRestApiServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/AccessRestApiServlet.java @@ -24,8 +24,7 @@ public class AccessRestApiServlet extends RestApiServlet { private static final long serialVersionUID = 1L; @Inject - AccessRestApiServlet(RestApiServlet.Globals globals, - Provider access) { + AccessRestApiServlet(RestApiServlet.Globals globals, Provider access) { super(globals, access); } } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/AccountsRestApiServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/AccountsRestApiServlet.java index 7f8b152cf3..ee57000a33 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/AccountsRestApiServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/AccountsRestApiServlet.java @@ -24,8 +24,7 @@ public class AccountsRestApiServlet extends RestApiServlet { private static final long serialVersionUID = 1L; @Inject - AccountsRestApiServlet(RestApiServlet.Globals globals, - Provider accounts) { + AccountsRestApiServlet(RestApiServlet.Globals globals, Provider accounts) { super(globals, accounts); } } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/ChangesRestApiServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/ChangesRestApiServlet.java index f6f89a6e54..ccafc6d671 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/ChangesRestApiServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/ChangesRestApiServlet.java @@ -24,8 +24,7 @@ public class ChangesRestApiServlet extends RestApiServlet { private static final long serialVersionUID = 1L; @Inject - ChangesRestApiServlet(RestApiServlet.Globals globals, - Provider changes) { + ChangesRestApiServlet(RestApiServlet.Globals globals, Provider changes) { super(globals, changes); } } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/ConfigRestApiServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/ConfigRestApiServlet.java index 48dcfd9ae1..87df4cfbd9 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/ConfigRestApiServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/ConfigRestApiServlet.java @@ -24,8 +24,8 @@ public class ConfigRestApiServlet extends RestApiServlet { private static final long serialVersionUID = 1L; @Inject - ConfigRestApiServlet(RestApiServlet.Globals globals, - Provider configCollection) { + ConfigRestApiServlet( + RestApiServlet.Globals globals, Provider configCollection) { super(globals, configCollection); } } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/GroupsRestApiServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/GroupsRestApiServlet.java index 4503bc55d8..5c7502f459 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/GroupsRestApiServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/GroupsRestApiServlet.java @@ -24,8 +24,7 @@ public class GroupsRestApiServlet extends RestApiServlet { private static final long serialVersionUID = 1L; @Inject - GroupsRestApiServlet(RestApiServlet.Globals globals, - Provider groups) { + GroupsRestApiServlet(RestApiServlet.Globals globals, Provider groups) { super(globals, groups); } } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/ParameterParser.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/ParameterParser.java index 782055c2f6..ced31217cb 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/ParameterParser.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/ParameterParser.java @@ -34,22 +34,19 @@ import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; import com.google.gwtexpui.server.CacheHeaders; import com.google.inject.Inject; - -import org.kohsuke.args4j.CmdLineException; - import java.io.IOException; import java.io.StringWriter; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; - import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.kohsuke.args4j.CmdLineException; class ParameterParser { - private static final ImmutableSet RESERVED_KEYS = ImmutableSet.of( - "pp", "prettyPrint", "strict", "callback", "alt", "fields"); + private static final ImmutableSet RESERVED_KEYS = + ImmutableSet.of("pp", "prettyPrint", "strict", "callback", "alt", "fields"); private final CmdLineParser.Factory parserFactory; @@ -58,10 +55,8 @@ class ParameterParser { this.parserFactory = pf; } - boolean parse(T param, - ListMultimap in, - HttpServletRequest req, - HttpServletResponse res) + boolean parse( + T param, ListMultimap in, HttpServletRequest req, HttpServletResponse res) throws IOException { CmdLineParser clp = parserFactory.create(param); try { @@ -81,15 +76,15 @@ class ParameterParser { clp.printUsage(msg, null); msg.write('\n'); CacheHeaders.setNotCacheable(res); - replyBinaryResult(req, res, - BinaryResult.create(msg.toString()).setContentType("text/plain")); + replyBinaryResult(req, res, BinaryResult.create(msg.toString()).setContentType("text/plain")); return false; } return true; } - static void splitQueryString(String queryString, + static void splitQueryString( + String queryString, ListMultimap config, ListMultimap params) { if (!Strings.isNullOrEmpty(queryString)) { @@ -110,9 +105,7 @@ class ParameterParser { Set params = new HashSet<>(); if (!Strings.isNullOrEmpty(req.getQueryString())) { for (String kvPair : Splitter.on('&').split(req.getQueryString())) { - params.add(Iterables.getFirst( - Splitter.on('=').limit(2).split(kvPair), - null)); + params.add(Iterables.getFirst(Splitter.on('=').limit(2).split(kvPair), null)); } } return params; @@ -120,8 +113,8 @@ class ParameterParser { /** * Convert a standard URL encoded form input into a parsed JSON tree. - *

- * Given an input such as: + * + *

Given an input such as: * *

    * message=Does+not+compile.&labels.Verified=-1
@@ -144,23 +137,21 @@ class ParameterParser {
    * }
    * 
* - * This input can then be further processed into the Java input type expected - * by a view using Gson. Here we rely on Gson to perform implicit conversion - * of a string {@code "-1"} to a number type when the Java input type expects - * a number. - *

- * Conversion assumes any field name that does not contain {@code "."} will be - * a property of the top level input object. Any field with a dot will use the - * first segment as the top level property name naming an object, and the rest - * of the field name as a property in the nested object. + * This input can then be further processed into the Java input type expected by a view using + * Gson. Here we rely on Gson to perform implicit conversion of a string {@code "-1"} to a number + * type when the Java input type expects a number. + * + *

Conversion assumes any field name that does not contain {@code "."} will be a property of + * the top level input object. Any field with a dot will use the first segment as the top level + * property name naming an object, and the rest of the field name as a property in the nested + * object. * * @param req request to parse form input from and create JSON tree. * @return the converted JSON object tree. - * @throws BadRequestException the request cannot be cast, as there are - * conflicting definitions for a nested object. + * @throws BadRequestException the request cannot be cast, as there are conflicting definitions + * for a nested object. */ - static JsonObject formToJson(HttpServletRequest req) - throws BadRequestException { + static JsonObject formToJson(HttpServletRequest req) throws BadRequestException { Map map = req.getParameterMap(); return formToJson(map, query(req)); } @@ -190,9 +181,7 @@ class ParameterParser { } else if (e.isJsonObject()) { obj = e.getAsJsonObject(); } else { - throw new BadRequestException(String.format( - "key %s conflicts with %s", - key, property)); + throw new BadRequestException(String.format("key %s conflicts with %s", key, property)); } key = key.substring(dot + 1); } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/ProjectsRestApiServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/ProjectsRestApiServlet.java index 87245ab503..f34608afcb 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/ProjectsRestApiServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/ProjectsRestApiServlet.java @@ -24,8 +24,7 @@ public class ProjectsRestApiServlet extends RestApiServlet { private static final long serialVersionUID = 1L; @Inject - ProjectsRestApiServlet(RestApiServlet.Globals globals, - Provider projects) { + ProjectsRestApiServlet(RestApiServlet.Globals globals, Provider projects) { super(globals, projects); } } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiMetrics.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiMetrics.java index 5de0e0cead..4af03a315c 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiMetrics.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiMetrics.java @@ -30,8 +30,7 @@ import com.google.inject.Singleton; @Singleton public class RestApiMetrics { private static final String[] PKGS = { - "com.google.gerrit.server.", - "com.google.gerrit.", + "com.google.gerrit.server.", "com.google.gerrit.", }; final Counter1 count; @@ -42,32 +41,34 @@ public class RestApiMetrics { @Inject RestApiMetrics(MetricMaker metrics) { Field view = Field.ofString("view", "view implementation class"); - count = metrics.newCounter( - "http/server/rest_api/count", - new Description("REST API calls by view") - .setRate(), - view); + count = + metrics.newCounter( + "http/server/rest_api/count", + new Description("REST API calls by view").setRate(), + view); - errorCount = metrics.newCounter( - "http/server/rest_api/error_count", - new Description("REST API errors by view") - .setRate(), - view, - Field.ofInteger("error_code", "HTTP status code")); + errorCount = + metrics.newCounter( + "http/server/rest_api/error_count", + new Description("REST API errors by view").setRate(), + view, + Field.ofInteger("error_code", "HTTP status code")); - serverLatency = metrics.newTimer( - "http/server/rest_api/server_latency", - new Description("REST API call latency by view") - .setCumulative() - .setUnit(Units.MILLISECONDS), - view); + serverLatency = + metrics.newTimer( + "http/server/rest_api/server_latency", + new Description("REST API call latency by view") + .setCumulative() + .setUnit(Units.MILLISECONDS), + view); - responseBytes = metrics.newHistogram( - "http/server/rest_api/response_bytes", - new Description("Size of response on network (may be gzip compressed)") - .setCumulative() - .setUnit(Units.BYTES), - view); + responseBytes = + metrics.newHistogram( + "http/server/rest_api/response_bytes", + new Description("Size of response on network (may be gzip compressed)") + .setCumulative() + .setUnit(Units.BYTES), + view); } String view(ViewData viewData) { @@ -78,8 +79,7 @@ public class RestApiMetrics { break; } } - if (!Strings.isNullOrEmpty(viewData.pluginName) - && !"gerrit".equals(viewData.pluginName)) { + if (!Strings.isNullOrEmpty(viewData.pluginName) && !"gerrit".equals(viewData.pluginName)) { impl = viewData.pluginName + '-' + impl; } return impl; diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java index cc2f7d7dd5..d9dd5d4269 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java @@ -114,13 +114,6 @@ import com.google.gwtexpui.server.CacheHeaders; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.util.Providers; - -import org.eclipse.jgit.lib.Config; -import org.eclipse.jgit.util.TemporaryBuffer; -import org.eclipse.jgit.util.TemporaryBuffer.Heap; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.EOFException; @@ -147,19 +140,23 @@ import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; import java.util.stream.StreamSupport; import java.util.zip.GZIPOutputStream; - import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.util.TemporaryBuffer; +import org.eclipse.jgit.util.TemporaryBuffer.Heap; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class RestApiServlet extends HttpServlet { private static final long serialVersionUID = 1L; - private static final Logger log = LoggerFactory - .getLogger(RestApiServlet.class); + private static final Logger log = LoggerFactory.getLogger(RestApiServlet.class); /** MIME type used for a JSON response body. */ private static final String JSON_TYPE = "application/json"; + private static final String FORM_TYPE = "application/x-www-form-urlencoded"; // HTTP 422 Unprocessable Entity. @@ -173,12 +170,11 @@ public class RestApiServlet extends HttpServlet { /** * Garbage prefix inserted before JSON output to prevent XSSI. - *

- * This prefix is ")]}'\n" and is designed to prevent a web browser from - * executing the response body if the resource URI were to be referenced using - * a <script src="...> HTML tag from another web site. Clients using the - * HTTP interface will need to always strip the first line of response data to - * remove this magic header. + * + *

This prefix is ")]}'\n" and is designed to prevent a web browser from executing the response + * body if the resource URI were to be referenced using a <script src="...> HTML tag from + * another web site. Clients using the HTTP interface will need to always strip the first line of + * response data to remove this magic header. */ public static final byte[] JSON_MAGIC; @@ -195,7 +191,8 @@ public class RestApiServlet extends HttpServlet { final Pattern allowOrigin; @Inject - Globals(Provider currentUser, + Globals( + Provider currentUser, DynamicItem webSession, Provider paramParser, AuditService auditService, @@ -221,12 +218,13 @@ public class RestApiServlet extends HttpServlet { private final Globals globals; private final Provider> members; - public RestApiServlet(Globals globals, - RestCollection members) { + public RestApiServlet( + Globals globals, RestCollection members) { this(globals, Providers.of(members)); } - public RestApiServlet(Globals globals, + public RestApiServlet( + Globals globals, Provider> members) { @SuppressWarnings("unchecked") Provider> n = @@ -245,10 +243,8 @@ public class RestApiServlet extends HttpServlet { int status = SC_OK; long responseBytes = -1; Object result = null; - ListMultimap params = - MultimapBuilder.hashKeys().arrayListValues().build(); - ListMultimap config = - MultimapBuilder.hashKeys().arrayListValues().build(); + ListMultimap params = MultimapBuilder.hashKeys().arrayListValues().build(); + ListMultimap config = MultimapBuilder.hashKeys().arrayListValues().build(); Object inputRequestBody = null; RestResource rsrc = TopLevelResource.INSTANCE; ViewData viewData = null; @@ -265,14 +261,13 @@ public class RestApiServlet extends HttpServlet { List path = splitPath(req); RestCollection rc = members.get(); - CapabilityUtils.checkRequiresCapability(globals.currentUser, - null, rc.getClass()); + CapabilityUtils.checkRequiresCapability(globals.currentUser, null, rc.getClass()); viewData = new ViewData(null, null); if (path.isEmpty()) { if (rc instanceof NeedsParams) { - ((NeedsParams)rc).setParams(params); + ((NeedsParams) rc).setParams(params); } if (isRead(req)) { @@ -294,8 +289,7 @@ public class RestApiServlet extends HttpServlet { } catch (ResourceNotFoundException e) { if (rc instanceof AcceptsCreate && path.isEmpty() - && ("POST".equals(req.getMethod()) - || "PUT".equals(req.getMethod()))) { + && ("POST".equals(req.getMethod()) || "PUT".equals(req.getMethod()))) { @SuppressWarnings("unchecked") AcceptsCreate ac = (AcceptsCreate) rc; viewData = new ViewData(null, ac.create(rsrc, id)); @@ -310,7 +304,7 @@ public class RestApiServlet extends HttpServlet { } checkRequiresCapability(viewData); - while (viewData.view instanceof RestCollection) { + while (viewData.view instanceof RestCollection) { @SuppressWarnings("unchecked") RestCollection c = (RestCollection) viewData.view; @@ -339,8 +333,7 @@ public class RestApiServlet extends HttpServlet { } catch (ResourceNotFoundException e) { if (c instanceof AcceptsCreate && path.isEmpty() - && ("POST".equals(req.getMethod()) - || "PUT".equals(req.getMethod()))) { + && ("POST".equals(req.getMethod()) || "PUT".equals(req.getMethod()))) { @SuppressWarnings("unchecked") AcceptsCreate ac = (AcceptsCreate) c; viewData = new ViewData(viewData.pluginName, ac.create(rsrc, id)); @@ -396,7 +389,7 @@ public class RestApiServlet extends HttpServlet { } else if (result instanceof Response.Accepted) { CacheHeaders.setNotCacheable(res); res.setStatus(SC_ACCEPTED); - res.setHeader(HttpHeaders.LOCATION, ((Response.Accepted)result).location()); + res.setHeader(HttpHeaders.LOCATION, ((Response.Accepted) result).location()); return; } else { CacheHeaders.setNotCacheable(res); @@ -412,45 +405,62 @@ public class RestApiServlet extends HttpServlet { } } } catch (MalformedJsonException e) { - responseBytes = replyError(req, res, status = SC_BAD_REQUEST, - "Invalid " + JSON_TYPE + " in request", e); + responseBytes = + replyError(req, res, status = SC_BAD_REQUEST, "Invalid " + JSON_TYPE + " in request", e); } catch (JsonParseException e) { - responseBytes = replyError(req, res, status = SC_BAD_REQUEST, - "Invalid " + JSON_TYPE + " in request", e); + responseBytes = + replyError(req, res, status = SC_BAD_REQUEST, "Invalid " + JSON_TYPE + " in request", e); } catch (BadRequestException e) { - responseBytes = replyError(req, res, status = SC_BAD_REQUEST, - messageOr(e, "Bad Request"), e.caching(), e); + responseBytes = + replyError( + req, res, status = SC_BAD_REQUEST, messageOr(e, "Bad Request"), e.caching(), e); } catch (AuthException e) { - responseBytes = replyError(req, res, status = SC_FORBIDDEN, - messageOr(e, "Forbidden"), e.caching(), e); + responseBytes = + replyError(req, res, status = SC_FORBIDDEN, messageOr(e, "Forbidden"), e.caching(), e); } catch (AmbiguousViewException e) { - responseBytes = replyError(req, res, status = SC_NOT_FOUND, - messageOr(e, "Ambiguous"), e); + responseBytes = replyError(req, res, status = SC_NOT_FOUND, messageOr(e, "Ambiguous"), e); } catch (ResourceNotFoundException e) { - responseBytes = replyError(req, res, status = SC_NOT_FOUND, - messageOr(e, "Not Found"), e.caching(), e); + responseBytes = + replyError(req, res, status = SC_NOT_FOUND, messageOr(e, "Not Found"), e.caching(), e); } catch (MethodNotAllowedException e) { - responseBytes = replyError(req, res, status = SC_METHOD_NOT_ALLOWED, - messageOr(e, "Method Not Allowed"), e.caching(), e); + responseBytes = + replyError( + req, + res, + status = SC_METHOD_NOT_ALLOWED, + messageOr(e, "Method Not Allowed"), + e.caching(), + e); } catch (ResourceConflictException e) { - responseBytes = replyError(req, res, status = SC_CONFLICT, - messageOr(e, "Conflict"), e.caching(), e); + responseBytes = + replyError(req, res, status = SC_CONFLICT, messageOr(e, "Conflict"), e.caching(), e); } catch (PreconditionFailedException e) { - responseBytes = replyError(req, res, status = SC_PRECONDITION_FAILED, - messageOr(e, "Precondition Failed"), e.caching(), e); + responseBytes = + replyError( + req, + res, + status = SC_PRECONDITION_FAILED, + messageOr(e, "Precondition Failed"), + e.caching(), + e); } catch (UnprocessableEntityException e) { - responseBytes = replyError(req, res, status = SC_UNPROCESSABLE_ENTITY, - messageOr(e, "Unprocessable Entity"), e.caching(), e); + responseBytes = + replyError( + req, + res, + status = SC_UNPROCESSABLE_ENTITY, + messageOr(e, "Unprocessable Entity"), + e.caching(), + e); } catch (NotImplementedException e) { - responseBytes = replyError(req, res, status = SC_NOT_IMPLEMENTED, - messageOr(e, "Not Implemented"), e); + responseBytes = + replyError(req, res, status = SC_NOT_IMPLEMENTED, messageOr(e, "Not Implemented"), e); } catch (Exception e) { status = SC_INTERNAL_SERVER_ERROR; responseBytes = handleException(e, req, res); } finally { - String metric = viewData != null && viewData.view != null - ? globals.metrics.view(viewData) - : "_unknown"; + String metric = + viewData != null && viewData.view != null ? globals.metrics.view(viewData) : "_unknown"; globals.metrics.count.increment(metric); if (status >= SC_BAD_REQUEST) { globals.metrics.errorCount.increment(metric, status); @@ -459,21 +469,25 @@ public class RestApiServlet extends HttpServlet { globals.metrics.responseBytes.record(metric, responseBytes); } globals.metrics.serverLatency.record( - metric, - System.nanoTime() - startNanos, - TimeUnit.NANOSECONDS); - globals.auditService.dispatch(new ExtendedHttpAuditEvent( - globals.webSession.get().getSessionId(), globals.currentUser.get(), - req, auditStartTs, params, inputRequestBody, status, - result, rsrc, viewData == null ? null : viewData.view)); + metric, System.nanoTime() - startNanos, TimeUnit.NANOSECONDS); + globals.auditService.dispatch( + new ExtendedHttpAuditEvent( + globals.webSession.get().getSessionId(), + globals.currentUser.get(), + req, + auditStartTs, + params, + inputRequestBody, + status, + result, + rsrc, + viewData == null ? null : viewData.view)); } } private void checkCors(HttpServletRequest req, HttpServletResponse res) { String origin = req.getHeader(ORIGIN); - if (isRead(req) - && !Strings.isNullOrEmpty(origin) - && isOriginAllowed(origin)) { + if (isRead(req) && !Strings.isNullOrEmpty(origin) && isOriginAllowed(origin)) { res.addHeader(VARY, ORIGIN); setCorsHeaders(res, origin); } @@ -485,12 +499,11 @@ public class RestApiServlet extends HttpServlet { && !Strings.isNullOrEmpty(req.getHeader(ACCESS_CONTROL_REQUEST_METHOD)); } - private void doCorsPreflight(HttpServletRequest req, - HttpServletResponse res) throws BadRequestException { + private void doCorsPreflight(HttpServletRequest req, HttpServletResponse res) + throws BadRequestException { CacheHeaders.setNotCacheable(res); - res.setHeader(VARY, Joiner.on(", ").join(ImmutableList.of( - ORIGIN, - ACCESS_CONTROL_REQUEST_METHOD))); + res.setHeader( + VARY, Joiner.on(", ").join(ImmutableList.of(ORIGIN, ACCESS_CONTROL_REQUEST_METHOD))); String origin = req.getHeader(ORIGIN); if (Strings.isNullOrEmpty(origin) || !isOriginAllowed(origin)) { @@ -506,9 +519,7 @@ public class RestApiServlet extends HttpServlet { if (headers != null) { res.addHeader(VARY, ACCESS_CONTROL_REQUEST_HEADERS); String badHeader = - StreamSupport.stream( - Splitter.on(',').trimResults().split(headers).spliterator(), - false) + StreamSupport.stream(Splitter.on(',').trimResults().split(headers).spliterator(), false) .filter(h -> !ALLOWED_CORS_REQUEST_HEADERS.contains(h)) .findFirst() .orElse(null); @@ -527,14 +538,11 @@ public class RestApiServlet extends HttpServlet { res.setHeader(ACCESS_CONTROL_ALLOW_ORIGIN, origin); res.setHeader(ACCESS_CONTROL_ALLOW_CREDENTIALS, "true"); res.setHeader(ACCESS_CONTROL_ALLOW_METHODS, "GET, OPTIONS"); - res.setHeader( - ACCESS_CONTROL_ALLOW_HEADERS, - Joiner.on(", ").join(ALLOWED_CORS_REQUEST_HEADERS)); + res.setHeader(ACCESS_CONTROL_ALLOW_HEADERS, Joiner.on(", ").join(ALLOWED_CORS_REQUEST_HEADERS)); } private boolean isOriginAllowed(String origin) { - return globals.allowOrigin != null - && globals.allowOrigin.matcher(origin).matches(); + return globals.allowOrigin != null && globals.allowOrigin.matcher(origin).matches(); } private static String messageOr(Throwable t, String defaultMessage) { @@ -545,8 +553,8 @@ public class RestApiServlet extends HttpServlet { } @SuppressWarnings({"unchecked", "rawtypes"}) - private static boolean notModified(HttpServletRequest req, RestResource rsrc, - RestView view) { + private static boolean notModified( + HttpServletRequest req, RestResource rsrc, RestView view) { if (!isRead(req)) { return false; } @@ -576,8 +584,7 @@ public class RestApiServlet extends HttpServlet { } private static void configureCaching( - HttpServletRequest req, HttpServletResponse res, R rsrc, - RestView view, CacheControl c) { + HttpServletRequest req, HttpServletResponse res, R rsrc, RestView view, CacheControl c) { if (isRead(req)) { switch (c.getType()) { case NONE: @@ -586,15 +593,11 @@ public class RestApiServlet extends HttpServlet { break; case PRIVATE: addResourceStateHeaders(res, rsrc, view); - CacheHeaders.setCacheablePrivate(res, - c.getAge(), c.getUnit(), - c.isMustRevalidate()); + CacheHeaders.setCacheablePrivate(res, c.getAge(), c.getUnit(), c.isMustRevalidate()); break; case PUBLIC: addResourceStateHeaders(res, rsrc, view); - CacheHeaders.setCacheable(req, res, - c.getAge(), c.getUnit(), - c.isMustRevalidate()); + CacheHeaders.setCacheable(req, res, c.getAge(), c.getUnit(), c.isMustRevalidate()); break; } } else { @@ -602,7 +605,7 @@ public class RestApiServlet extends HttpServlet { } } - private static void addResourceStateHeaders( + private static void addResourceStateHeaders( HttpServletResponse res, R rsrc, RestView view) { if (view instanceof ETagView) { res.setHeader(HttpHeaders.ETAG, ((ETagView) view).getETag(rsrc)); @@ -616,8 +619,7 @@ public class RestApiServlet extends HttpServlet { } } - private void checkPreconditions(HttpServletRequest req) - throws PreconditionFailedException { + private void checkPreconditions(HttpServletRequest req) throws PreconditionFailedException { if ("*".equals(req.getHeader(HttpHeaders.IF_NONE_MATCH))) { throw new PreconditionFailedException("Resource already exists"); } @@ -626,9 +628,10 @@ public class RestApiServlet extends HttpServlet { private static Type inputType(RestModifyView m) { Type inputType = extractInputType(m.getClass()); if (inputType == null) { - throw new IllegalStateException(String.format( - "View %s does not correctly implement %s", - m.getClass(), RestModifyView.class.getSimpleName())); + throw new IllegalStateException( + String.format( + "View %s does not correctly implement %s", + m.getClass(), RestModifyView.class.getSimpleName())); } return inputType; } @@ -660,9 +663,9 @@ public class RestApiServlet extends HttpServlet { } private Object parseRequest(HttpServletRequest req, Type type) - throws IOException, BadRequestException, SecurityException, - IllegalArgumentException, NoSuchMethodException, IllegalAccessException, - InstantiationException, InvocationTargetException, MethodNotAllowedException { + throws IOException, BadRequestException, SecurityException, IllegalArgumentException, + NoSuchMethodException, IllegalAccessException, InstantiationException, + InvocationTargetException, MethodNotAllowedException { if (isType(JSON_TYPE, req.getContentType())) { try (BufferedReader br = req.getReader(); JsonReader json = new JsonReader(br)) { @@ -696,11 +699,8 @@ public class RestApiServlet extends HttpServlet { } return parseString(sb.toString(), type); } - } else if ("POST".equals(req.getMethod()) - && isType(FORM_TYPE, req.getContentType())) { - return OutputFormat.JSON.newGson().fromJson( - ParameterParser.formToJson(req), - type); + } else if ("POST".equals(req.getMethod()) && isType(FORM_TYPE, req.getContentType())) { + return OutputFormat.JSON.newGson().fromJson(ParameterParser.formToJson(req), type); } else { throw new BadRequestException("Expected Content-Type: " + JSON_TYPE); } @@ -709,8 +709,7 @@ public class RestApiServlet extends HttpServlet { private static boolean hasNoBody(HttpServletRequest req) { int len = req.getContentLength(); String type = req.getContentType(); - return (len <= 0 && type == null) - || (len == 0 && isType(FORM_TYPE, type)); + return (len <= 0 && type == null) || (len == 0 && isType(FORM_TYPE, type)); } @SuppressWarnings("rawtypes") @@ -726,9 +725,9 @@ public class RestApiServlet extends HttpServlet { } private Object parseRawInput(final HttpServletRequest req, Type type) - throws SecurityException, NoSuchMethodException, - IllegalArgumentException, InstantiationException, IllegalAccessException, - InvocationTargetException, MethodNotAllowedException { + throws SecurityException, NoSuchMethodException, IllegalArgumentException, + InstantiationException, IllegalAccessException, InvocationTargetException, + MethodNotAllowedException { Object obj = createInstance(type); for (Field f : obj.getClass().getDeclaredFields()) { if (f.getType() == RawInput.class) { @@ -742,8 +741,8 @@ public class RestApiServlet extends HttpServlet { private Object parseString(String value, Type type) throws BadRequestException, SecurityException, NoSuchMethodException, - IllegalArgumentException, IllegalAccessException, InstantiationException, - InvocationTargetException { + IllegalArgumentException, IllegalAccessException, InstantiationException, + InvocationTargetException { if (type == String.class) { return value; } @@ -754,8 +753,7 @@ public class RestApiServlet extends HttpServlet { return obj; } for (Field f : fields) { - if (f.getAnnotation(DefaultInput.class) != null - && f.getType() == String.class) { + if (f.getAnnotation(DefaultInput.class) != null && f.getType() == String.class) { f.setAccessible(true); f.set(obj, value); return obj; @@ -765,8 +763,8 @@ public class RestApiServlet extends HttpServlet { } private static Object createInstance(Type type) - throws NoSuchMethodException, InstantiationException, - IllegalAccessException, InvocationTargetException { + throws NoSuchMethodException, InstantiationException, IllegalAccessException, + InvocationTargetException { if (type instanceof Class) { @SuppressWarnings("unchecked") Class clazz = (Class) type; @@ -777,7 +775,8 @@ public class RestApiServlet extends HttpServlet { throw new InstantiationException("Cannot make " + type); } - public static long replyJson(@Nullable HttpServletRequest req, + public static long replyJson( + @Nullable HttpServletRequest req, HttpServletResponse res, ListMultimap config, Object result) @@ -793,13 +792,12 @@ public class RestApiServlet extends HttpServlet { } w.write('\n'); w.flush(); - return replyBinaryResult(req, res, asBinaryResult(buf) - .setContentType(JSON_TYPE) - .setCharacterEncoding(UTF_8)); + return replyBinaryResult( + req, res, asBinaryResult(buf).setContentType(JSON_TYPE).setCharacterEncoding(UTF_8)); } - private static Gson newGson(ListMultimap config, - @Nullable HttpServletRequest req) { + private static Gson newGson( + ListMultimap config, @Nullable HttpServletRequest req) { GsonBuilder gb = OutputFormat.JSON_COMPACT.newGsonBuilder(); enablePrettyPrint(gb, config, req); @@ -808,9 +806,8 @@ public class RestApiServlet extends HttpServlet { return gb.create(); } - private static void enablePrettyPrint(GsonBuilder gb, - ListMultimap config, - @Nullable HttpServletRequest req) { + private static void enablePrettyPrint( + GsonBuilder gb, ListMultimap config, @Nullable HttpServletRequest req) { String pp = Iterables.getFirst(config.get("pp"), null); if (pp == null) { pp = Iterables.getFirst(config.get("prettyPrint"), null); @@ -823,55 +820,53 @@ public class RestApiServlet extends HttpServlet { } } - private static void enablePartialGetFields(GsonBuilder gb, - ListMultimap config) { + private static void enablePartialGetFields(GsonBuilder gb, ListMultimap config) { final Set want = new HashSet<>(); for (String p : config.get("fields")) { Iterables.addAll(want, OptionUtil.splitOptionValue(p)); } if (!want.isEmpty()) { - gb.addSerializationExclusionStrategy(new ExclusionStrategy() { - private final Map names = new HashMap<>(); + gb.addSerializationExclusionStrategy( + new ExclusionStrategy() { + private final Map names = new HashMap<>(); - @Override - public boolean shouldSkipField(FieldAttributes field) { - String name = names.get(field.getName()); - if (name == null) { - // Names are supplied by Gson in terms of Java source. - // Translate and cache the JSON lower_case_style used. - try { - name = - FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES.translateName(// - field.getDeclaringClass().getDeclaredField(field.getName())); - names.put(field.getName(), name); - } catch (SecurityException e) { - return true; - } catch (NoSuchFieldException e) { - return true; + @Override + public boolean shouldSkipField(FieldAttributes field) { + String name = names.get(field.getName()); + if (name == null) { + // Names are supplied by Gson in terms of Java source. + // Translate and cache the JSON lower_case_style used. + try { + name = + FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES.translateName( // + field.getDeclaringClass().getDeclaredField(field.getName())); + names.put(field.getName(), name); + } catch (SecurityException e) { + return true; + } catch (NoSuchFieldException e) { + return true; + } + } + return !want.contains(name); } - } - return !want.contains(name); - } - @Override - public boolean shouldSkipClass(Class clazz) { - return false; - } - }); + @Override + public boolean shouldSkipClass(Class clazz) { + return false; + } + }); } } @SuppressWarnings("resource") static long replyBinaryResult( - @Nullable HttpServletRequest req, - HttpServletResponse res, - BinaryResult bin) throws IOException { + @Nullable HttpServletRequest req, HttpServletResponse res, BinaryResult bin) + throws IOException { final BinaryResult appResult = bin; try { if (bin.getAttachmentName() != null) { res.setHeader( - "Content-Disposition", - "attachment; filename=\"" + bin.getAttachmentName() + "\""); + "Content-Disposition", "attachment; filename=\"" + bin.getAttachmentName() + "\""); } if (bin.isBase64()) { if (req != null && JSON_TYPE.equals(req.getHeader(HttpHeaders.ACCEPT))) { @@ -893,8 +888,7 @@ public class RestApiServlet extends HttpServlet { } if (req == null || !"HEAD".equals(req.getMethod())) { - try (CountingOutputStream dst = - new CountingOutputStream(res.getOutputStream())) { + try (CountingOutputStream dst = new CountingOutputStream(res.getOutputStream())) { bin.writeTo(dst); return dst.getCount(); } @@ -905,8 +899,8 @@ public class RestApiServlet extends HttpServlet { } } - private static BinaryResult stackJsonString(HttpServletResponse res, - final BinaryResult src) throws IOException { + private static BinaryResult stackJsonString(HttpServletResponse res, final BinaryResult src) + throws IOException { TemporaryBuffer.Heap buf = heap(HEAP_EST_SIZE, Integer.MAX_VALUE); buf.write(JSON_MAGIC); try (Writer w = new BufferedWriter(new OutputStreamWriter(buf, UTF_8)); @@ -918,41 +912,42 @@ public class RestApiServlet extends HttpServlet { } res.setHeader("X-FYI-Content-Encoding", "json"); res.setHeader("X-FYI-Content-Type", src.getContentType()); - return asBinaryResult(buf) - .setContentType(JSON_TYPE) - .setCharacterEncoding(UTF_8); + return asBinaryResult(buf).setContentType(JSON_TYPE).setCharacterEncoding(UTF_8); } - private static BinaryResult stackBase64(HttpServletResponse res, - final BinaryResult src) throws IOException { + private static BinaryResult stackBase64(HttpServletResponse res, final BinaryResult src) + throws IOException { BinaryResult b64; long len = src.getContentLength(); if (0 <= len && len <= (7 << 20)) { b64 = base64(src); } else { - b64 = new BinaryResult() { - @Override - public void writeTo(OutputStream out) throws IOException { - try (OutputStreamWriter w = new OutputStreamWriter( - new FilterOutputStream(out) { - @Override - public void close() { - // Do not close out, but only w and e. - } - }, ISO_8859_1); - OutputStream e = BaseEncoding.base64().encodingStream(w)) { - src.writeTo(e); - } - } - }; + b64 = + new BinaryResult() { + @Override + public void writeTo(OutputStream out) throws IOException { + try (OutputStreamWriter w = + new OutputStreamWriter( + new FilterOutputStream(out) { + @Override + public void close() { + // Do not close out, but only w and e. + } + }, + ISO_8859_1); + OutputStream e = BaseEncoding.base64().encodingStream(w)) { + src.writeTo(e); + } + } + }; } res.setHeader("X-FYI-Content-Encoding", "base64"); res.setHeader("X-FYI-Content-Type", src.getContentType()); return b64.setContentType("text/plain").setCharacterEncoding(ISO_8859_1); } - private static BinaryResult stackGzip(HttpServletResponse res, - final BinaryResult src) throws IOException { + private static BinaryResult stackGzip(HttpServletResponse res, final BinaryResult src) + throws IOException { BinaryResult gz; long len = src.getContentLength(); if (len < 256) { @@ -963,15 +958,16 @@ public class RestApiServlet extends HttpServlet { return src; } } else { - gz = new BinaryResult() { - @Override - public void writeTo(OutputStream out) throws IOException { - GZIPOutputStream gz = new GZIPOutputStream(out); - src.writeTo(gz); - gz.finish(); - gz.flush(); - } - }; + gz = + new BinaryResult() { + @Override + public void writeTo(OutputStream out) throws IOException { + GZIPOutputStream gz = new GZIPOutputStream(out); + src.writeTo(gz); + gz.finish(); + gz.flush(); + } + }; } res.setHeader("Content-Encoding", "gzip"); return gz.setContentType(src.getContentType()); @@ -980,12 +976,11 @@ public class RestApiServlet extends HttpServlet { private ViewData view( RestResource rsrc, RestCollection rc, - String method, List path) throws AmbiguousViewException, - RestApiException { + String method, + List path) + throws AmbiguousViewException, RestApiException { DynamicMap> views = rc.views(); - final IdString projection = path.isEmpty() - ? IdString.fromUrl("/") - : path.remove(0); + final IdString projection = path.isEmpty() ? IdString.fromUrl("/") : path.remove(0); if (!path.isEmpty()) { // If there are path components still remaining after this projection // is chosen, look for the projection based upon GET as the method as @@ -1001,8 +996,7 @@ public class RestApiServlet extends HttpServlet { if (Strings.isNullOrEmpty(viewname)) { viewname = "/"; } - RestView view = - views.get(p.get(0), method + "." + viewname); + RestView view = views.get(p.get(0), method + "." + viewname); if (view != null) { return new ViewData(p.get(0), view); } @@ -1038,8 +1032,7 @@ public class RestApiServlet extends HttpServlet { } if (r.size() == 1) { - Map.Entry> entry = - Iterables.getOnlyElement(r.entrySet()); + Map.Entry> entry = Iterables.getOnlyElement(r.entrySet()); return new ViewData(entry.getKey(), entry.getValue()); } else if (r.isEmpty()) { throw new ResourceNotFoundException(projection); @@ -1047,9 +1040,7 @@ public class RestApiServlet extends HttpServlet { throw new AmbiguousViewException( String.format( "Projection %s is ambiguous: %s", - name, - r.keySet().stream().map(in -> in + "~" + projection) - .collect(joining(", ")))); + name, r.keySet().stream().map(in -> in + "~" + projection).collect(joining(", ")))); } } @@ -1074,18 +1065,17 @@ public class RestApiServlet extends HttpServlet { return p; } - private void checkUserSession(HttpServletRequest req) - throws AuthException { + private void checkUserSession(HttpServletRequest req) throws AuthException { CurrentUser user = globals.currentUser.get(); if (isRead(req)) { user.setAccessPath(AccessPath.REST_API); - user.setLastLoginExternalIdKey( - globals.webSession.get().getLastLoginExternalId()); + user.setLastLoginExternalIdKey(globals.webSession.get().getLastLoginExternalId()); } else if (user instanceof AnonymousUser) { throw new AuthException("Authentication required"); } else if (!globals.webSession.get().isAccessPathOk(AccessPath.REST_API)) { - throw new AuthException("Invalid authentication method. In order to authenticate, " - + "prefix the REST endpoint URL with /a/ (e.g. http://example.com/a/projects/)."); + throw new AuthException( + "Invalid authentication method. In order to authenticate, " + + "prefix the REST endpoint URL with /a/ (e.g. http://example.com/a/projects/)."); } } @@ -1094,12 +1084,12 @@ public class RestApiServlet extends HttpServlet { } private void checkRequiresCapability(ViewData viewData) throws AuthException { - CapabilityUtils.checkRequiresCapability(globals.currentUser, - viewData.pluginName, viewData.view.getClass()); + CapabilityUtils.checkRequiresCapability( + globals.currentUser, viewData.pluginName, viewData.view.getClass()); } - private static long handleException(Throwable err, HttpServletRequest req, - HttpServletResponse res) throws IOException { + private static long handleException( + Throwable err, HttpServletRequest req, HttpServletResponse res) throws IOException { String uri = req.getRequestURI(); if (!Strings.isNullOrEmpty(req.getQueryString())) { uri += "?" + req.getQueryString(); @@ -1113,14 +1103,24 @@ public class RestApiServlet extends HttpServlet { return 0; } - public static long replyError(HttpServletRequest req, HttpServletResponse res, - int statusCode, String msg, @Nullable Throwable err) throws IOException { + public static long replyError( + HttpServletRequest req, + HttpServletResponse res, + int statusCode, + String msg, + @Nullable Throwable err) + throws IOException { return replyError(req, res, statusCode, msg, CacheControl.NONE, err); } - public static long replyError(HttpServletRequest req, - HttpServletResponse res, int statusCode, String msg, - CacheControl c, @Nullable Throwable err) throws IOException { + public static long replyError( + HttpServletRequest req, + HttpServletResponse res, + int statusCode, + String msg, + CacheControl c, + @Nullable Throwable err) + throws IOException { if (err != null) { RequestUtil.setErrorTraceAttribute(req, err); } @@ -1129,17 +1129,15 @@ public class RestApiServlet extends HttpServlet { return replyText(req, res, msg); } - static long replyText(@Nullable HttpServletRequest req, - HttpServletResponse res, String text) throws IOException { + static long replyText(@Nullable HttpServletRequest req, HttpServletResponse res, String text) + throws IOException { if ((req == null || isRead(req)) && isMaybeHTML(text)) { - return replyJson(req, res, ImmutableListMultimap.of("pp", "0"), - new JsonPrimitive(text)); + return replyJson(req, res, ImmutableListMultimap.of("pp", "0"), new JsonPrimitive(text)); } if (!text.endsWith("\n")) { text += "\n"; } - return replyBinaryResult(req, res, - BinaryResult.create(text).setContentType("text/plain")); + return replyBinaryResult(req, res, BinaryResult.create(text).setContentType("text/plain")); } private static boolean isMaybeHTML(String text) { @@ -1178,20 +1176,18 @@ public class RestApiServlet extends HttpServlet { return 4 * IntMath.divide((int) n, 3, CEILING); } - private static BinaryResult base64(BinaryResult bin) - throws IOException { + private static BinaryResult base64(BinaryResult bin) throws IOException { int maxSize = base64MaxSize(bin.getContentLength()); int estSize = Math.min(base64MaxSize(HEAP_EST_SIZE), maxSize); TemporaryBuffer.Heap buf = heap(estSize, maxSize); - try (OutputStream encoded = BaseEncoding.base64().encodingStream( - new OutputStreamWriter(buf, ISO_8859_1))) { + try (OutputStream encoded = + BaseEncoding.base64().encodingStream(new OutputStreamWriter(buf, ISO_8859_1))) { bin.writeTo(encoded); } return asBinaryResult(buf); } - private static BinaryResult compress(BinaryResult bin) - throws IOException { + private static BinaryResult compress(BinaryResult bin) throws IOException { TemporaryBuffer.Heap buf = heap(HEAP_EST_SIZE, 20 << 20); try (GZIPOutputStream gz = new GZIPOutputStream(buf)) { bin.writeTo(gz); diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/AuditedHttpServletResponse.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/AuditedHttpServletResponse.java index 4696e8d3cf..31819e8af1 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/AuditedHttpServletResponse.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/AuditedHttpServletResponse.java @@ -15,13 +15,10 @@ package com.google.gerrit.httpd.rpc; import java.io.IOException; - import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; -class AuditedHttpServletResponse - extends HttpServletResponseWrapper - implements HttpServletResponse { +class AuditedHttpServletResponse extends HttpServletResponseWrapper implements HttpServletResponse { private int status; AuditedHttpServletResponse(HttpServletResponse response) { diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/BaseServiceImplementation.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/BaseServiceImplementation.java index 9cf6504fd2..e561c9b001 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/BaseServiceImplementation.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/BaseServiceImplementation.java @@ -26,7 +26,6 @@ import com.google.gwtjsonrpc.common.AsyncCallback; import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.OrmRuntimeException; import com.google.inject.Provider; - import java.io.IOException; /** Support for services which require a {@link ReviewDb} instance. */ @@ -34,8 +33,8 @@ public class BaseServiceImplementation { private final Provider schema; private final Provider currentUser; - protected BaseServiceImplementation(final Provider schema, - final Provider currentUser) { + protected BaseServiceImplementation( + final Provider schema, final Provider currentUser) { this.schema = schema; this.currentUser = currentUser; } @@ -55,10 +54,10 @@ public class BaseServiceImplementation { /** * Executes {@code action.run} with an active ReviewDb connection. - *

- * A database handle is automatically opened and closed around the action's - * {@link Action#run(ReviewDb)} method. OrmExceptions are caught and passed - * into the onFailure method of the callback. + * + *

A database handle is automatically opened and closed around the action's {@link + * Action#run(ReviewDb)} method. OrmExceptions are caught and passed into the onFailure method of + * the callback. * * @param type of result the callback expects. * @param callback the callback that will receive the result. @@ -101,8 +100,7 @@ public class BaseServiceImplementation { } } - private static void handleOrmException( - final AsyncCallback callback, Exception e) { + private static void handleOrmException(final AsyncCallback callback, Exception e) { if (e.getCause() instanceof Failure) { callback.onFailure(e.getCause().getCause()); } else if (e.getCause() instanceof NoSuchEntityException) { @@ -129,13 +127,13 @@ public class BaseServiceImplementation { * @param db an open database handle to be used by this connection. * @return he value to pass to {@link AsyncCallback#onSuccess(Object)}. * @throws OrmException any schema based action failed. - * @throws Failure cause is given to - * {@link AsyncCallback#onFailure(Throwable)}. + * @throws Failure cause is given to {@link AsyncCallback#onFailure(Throwable)}. * @throws NoSuchProjectException * @throws NoSuchGroupException * @throws InvalidQueryException */ - T run(ReviewDb db) throws OrmException, Failure, NoSuchProjectException, - NoSuchGroupException, InvalidQueryException, IOException; + T run(ReviewDb db) + throws OrmException, Failure, NoSuchProjectException, NoSuchGroupException, + InvalidQueryException, IOException; } } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/GerritJsonServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/GerritJsonServlet.java index e0b48dc6eb..cce87a8b48 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/GerritJsonServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/GerritJsonServlet.java @@ -33,43 +33,35 @@ import com.google.gwtjsonrpc.server.JsonServlet; import com.google.gwtjsonrpc.server.MethodHandle; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.Method; - import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -/** - * Base JSON servlet to ensure the current user is not forged. - */ +/** Base JSON servlet to ensure the current user is not forged. */ @SuppressWarnings("serial") final class GerritJsonServlet extends JsonServlet { private static final Logger log = LoggerFactory.getLogger(GerritJsonServlet.class); - private static final ThreadLocal currentCall = - new ThreadLocal<>(); - private static final ThreadLocal currentMethod = - new ThreadLocal<>(); + private static final ThreadLocal currentCall = new ThreadLocal<>(); + private static final ThreadLocal currentMethod = new ThreadLocal<>(); private final DynamicItem session; private final RemoteJsonService service; private final AuditService audit; - @Inject - GerritJsonServlet(final DynamicItem w, final RemoteJsonService s, - final AuditService a) { + GerritJsonServlet( + final DynamicItem w, final RemoteJsonService s, final AuditService a) { session = w; service = s; audit = a; } @Override - protected GerritCall createActiveCall(final HttpServletRequest req, - final HttpServletResponse rsp) { + protected GerritCall createActiveCall( + final HttpServletRequest req, final HttpServletResponse rsp) { final GerritCall call = new GerritCall(session.get(), req, new AuditedHttpServletResponse(rsp)); currentCall.set(call); return call; @@ -83,8 +75,8 @@ final class GerritJsonServlet extends JsonServlet private static GsonBuilder gerritDefaultGsonBuilder() { final GsonBuilder g = defaultGsonBuilder(); - g.registerTypeAdapter(org.eclipse.jgit.diff.Edit.class, - new org.eclipse.jgit.diff.EditDeserializer()); + g.registerTypeAdapter( + org.eclipse.jgit.diff.Edit.class, new org.eclipse.jgit.diff.EditDeserializer()); return g; } @@ -114,8 +106,8 @@ final class GerritJsonServlet extends JsonServlet } @Override - protected void service(final HttpServletRequest req, - final HttpServletResponse resp) throws IOException { + protected void service(final HttpServletRequest req, final HttpServletResponse resp) + throws IOException { try { super.service(req, resp); } finally { @@ -141,11 +133,14 @@ final class GerritJsonServlet extends JsonServlet audit.dispatch( new RpcAuditEvent( - sid, username, what, call.getWhen(), args, + sid, + username, + what, + call.getWhen(), + args, call.getHttpServletRequest().getMethod(), call.getHttpServletRequest().getMethod(), - ((AuditedHttpServletResponse) (call.getHttpServletResponse())) - .getStatus(), + ((AuditedHttpServletResponse) (call.getHttpServletResponse())).getStatus(), result)); } } catch (Throwable all) { @@ -154,8 +149,7 @@ final class GerritJsonServlet extends JsonServlet } private ListMultimap extractParams(Audit note, GerritCall call) { - ListMultimap args = - MultimapBuilder.hashKeys().arrayListValues().build(); + ListMultimap args = MultimapBuilder.hashKeys().arrayListValues().build(); Object[] params = call.getParams(); for (int i = 0; i < params.length; i++) { @@ -171,11 +165,8 @@ final class GerritJsonServlet extends JsonServlet private String extractWhat(final Audit note, final GerritCall call) { Class methodClass = call.getMethodClass(); - String methodClassName = methodClass != null - ? methodClass.getName() - : ""; - methodClassName = - methodClassName.substring(methodClassName.lastIndexOf(".") + 1); + String methodClassName = methodClass != null ? methodClass.getName() : ""; + methodClassName = methodClassName.substring(methodClassName.lastIndexOf(".") + 1); String what = note.action(); if (what.length() == 0) { what = call.getMethod().getName(); @@ -242,8 +233,7 @@ final class GerritJsonServlet extends JsonServlet return null; } - GerritCall(final WebSession session, final HttpServletRequest i, - final HttpServletResponse o) { + GerritCall(final WebSession session, final HttpServletRequest i, final HttpServletResponse o) { super(i, o); this.session = session; this.when = TimeUtil.nowMs(); @@ -259,11 +249,9 @@ final class GerritJsonServlet extends JsonServlet @Override public void onFailure(final Throwable error) { - if (error instanceof IllegalArgumentException - || error instanceof IllegalStateException) { + if (error instanceof IllegalArgumentException || error instanceof IllegalStateException) { super.onFailure(error); - } else if (error instanceof OrmException - || error instanceof RuntimeException) { + } else if (error instanceof OrmException || error instanceof RuntimeException) { onInternalFailure(error); } else { super.onFailure(error); @@ -300,5 +288,4 @@ final class GerritJsonServlet extends JsonServlet return TimeUtil.nowMs() - when; } } - } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/GerritJsonServletProvider.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/GerritJsonServletProvider.java index 9361130f61..9fd926970a 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/GerritJsonServletProvider.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/GerritJsonServletProvider.java @@ -22,8 +22,7 @@ import com.google.inject.Provider; /** Creates {@link GerritJsonServlet} with a {@link RemoteJsonService}. */ class GerritJsonServletProvider implements Provider { - @Inject - private Injector injector; + @Inject private Injector injector; private final Class serviceClass; @@ -35,11 +34,14 @@ class GerritJsonServletProvider implements Provider { @Override public GerritJsonServlet get() { final RemoteJsonService srv = injector.getInstance(serviceClass); - return injector.createChildInjector(new AbstractModule() { - @Override - protected void configure() { - bind(RemoteJsonService.class).toInstance(srv); - } - }).getInstance(GerritJsonServlet.class); + return injector + .createChildInjector( + new AbstractModule() { + @Override + protected void configure() { + bind(RemoteJsonService.class).toInstance(srv); + } + }) + .getInstance(GerritJsonServlet.class); } } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/Handler.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/Handler.java index 9364764c86..a9d654c736 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/Handler.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/Handler.java @@ -21,14 +21,13 @@ import com.google.gerrit.server.project.NoSuchRefException; import com.google.gwtjsonrpc.common.AsyncCallback; import com.google.gwtjsonrpc.common.VoidResult; import com.google.gwtorm.server.OrmException; - import java.util.concurrent.Callable; /** * Base class for RPC service implementations. - *

- * Typically an RPC service implementation will extend this class and use Guice - * injection to manage its state. For example: + * + *

Typically an RPC service implementation will extend this class and use Guice injection to + * manage its state. For example: * *

  *   class Foo extends Handler<Result> {
@@ -41,8 +40,8 @@ import java.util.concurrent.Callable;
  *   }
  * 
* - * @param type of result for {@link AsyncCallback#onSuccess(Object)} if the - * operation completed successfully. + * @param type of result for {@link AsyncCallback#onSuccess(Object)} if the operation completed + * successfully. */ public abstract class Handler implements Callable { public static Handler wrap(final Callable r) { @@ -65,8 +64,7 @@ public abstract class Handler implements Callable { if (r != null) { callback.onSuccess(r); } - } catch (NoSuchProjectException | NoSuchChangeException - | NoSuchRefException e) { + } catch (NoSuchProjectException | NoSuchChangeException | NoSuchRefException e) { callback.onFailure(new NoSuchEntityException()); } catch (OrmException e) { @@ -89,10 +87,10 @@ public abstract class Handler implements Callable { /** * Compute the operation result. * - * @return the result of the operation. Return {@link VoidResult#INSTANCE} if - * there is no meaningful return value for the operation. - * @throws Exception the operation failed. The caller will log the exception - * and the stack trace, if it is worth logging on the server side. + * @return the result of the operation. Return {@link VoidResult#INSTANCE} if there is no + * meaningful return value for the operation. + * @throws Exception the operation failed. The caller will log the exception and the stack trace, + * if it is worth logging on the server side. */ @Override public abstract T call() throws Exception; diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/RpcServletModule.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/RpcServletModule.java index 953bc7150e..53151820cb 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/RpcServletModule.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/RpcServletModule.java @@ -39,10 +39,8 @@ public abstract class RpcServletModule extends ServletModule { } protected void rpc(final String name, Class clazz) { - final Key srv = - Key.get(GerritJsonServlet.class, UniqueAnnotations.create()); - final GerritJsonServletProvider provider = - new GerritJsonServletProvider(clazz); + final Key srv = Key.get(GerritJsonServlet.class, UniqueAnnotations.create()); + final GerritJsonServletProvider provider = new GerritJsonServletProvider(clazz); bind(clazz); serve(prefix + name).with(srv); bind(srv).toProvider(provider).in(Scopes.SINGLETON); diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/SystemInfoServiceImpl.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/SystemInfoServiceImpl.java index bda2d91e99..ec67661603 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/SystemInfoServiceImpl.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/SystemInfoServiceImpl.java @@ -21,21 +21,16 @@ import com.google.gwtjsonrpc.common.AsyncCallback; import com.google.gwtjsonrpc.common.VoidResult; import com.google.inject.Inject; import com.google.inject.Provider; - import com.jcraft.jsch.HostKey; import com.jcraft.jsch.JSch; - +import java.util.ArrayList; +import java.util.List; +import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.ArrayList; -import java.util.List; - -import javax.servlet.http.HttpServletRequest; - class SystemInfoServiceImpl implements SystemInfoService { - private static final Logger log = - LoggerFactory.getLogger(SystemInfoServiceImpl.class); + private static final Logger log = LoggerFactory.getLogger(SystemInfoServiceImpl.class); private static final JSch JSCH = new JSch(); @@ -43,8 +38,7 @@ class SystemInfoServiceImpl implements SystemInfoService { private final Provider httpRequest; @Inject - SystemInfoServiceImpl(SshInfo daemon, - Provider hsr) { + SystemInfoServiceImpl(SshInfo daemon, Provider hsr) { hostKeys = daemon.getHostKeys(); httpRequest = hsr; } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountModule.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountModule.java index d32fdaf07a..120b58295a 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountModule.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountModule.java @@ -25,13 +25,14 @@ public class AccountModule extends RpcServletModule { @Override protected void configureServlets() { - install(new FactoryModule() { - @Override - protected void configure() { - factory(DeleteExternalIds.Factory.class); - factory(ExternalIdDetailFactory.Factory.class); - } - }); + install( + new FactoryModule() { + @Override + protected void configure() { + factory(DeleteExternalIds.Factory.class); + factory(ExternalIdDetailFactory.Factory.class); + } + }); rpc(AccountSecurityImpl.class); } } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountSecurityImpl.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountSecurityImpl.java index 3d0554868b..5a6fdfad12 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountSecurityImpl.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountSecurityImpl.java @@ -22,17 +22,16 @@ import com.google.gerrit.server.CurrentUser; import com.google.gwtjsonrpc.common.AsyncCallback; import com.google.inject.Inject; import com.google.inject.Provider; - import java.util.List; import java.util.Set; -class AccountSecurityImpl extends BaseServiceImplementation implements - AccountSecurity { +class AccountSecurityImpl extends BaseServiceImplementation implements AccountSecurity { private final DeleteExternalIds.Factory deleteExternalIdsFactory; private final ExternalIdDetailFactory.Factory externalIdDetailFactory; @Inject - AccountSecurityImpl(final Provider schema, + AccountSecurityImpl( + final Provider schema, final Provider currentUser, final DeleteExternalIds.Factory deleteExternalIdsFactory, final ExternalIdDetailFactory.Factory externalIdDetailFactory) { @@ -47,7 +46,8 @@ class AccountSecurityImpl extends BaseServiceImplementation implements } @Override - public void deleteExternalIds(final Set keys, + public void deleteExternalIds( + final Set keys, final AsyncCallback> callback) { deleteExternalIdsFactory.create(keys).to(callback); } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/DeleteExternalIds.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/DeleteExternalIds.java index 34b7a4b254..ddfed8bf67 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/DeleteExternalIds.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/DeleteExternalIds.java @@ -23,7 +23,6 @@ import com.google.gerrit.server.account.AccountCache; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; @@ -46,10 +45,12 @@ class DeleteExternalIds extends Handler> { private final Set keys; @Inject - DeleteExternalIds(final ReviewDb db, final IdentifiedUser user, + DeleteExternalIds( + final ReviewDb db, + final IdentifiedUser user, final ExternalIdDetailFactory detailFactory, - final AccountByEmailCache byEmailCache, final AccountCache accountCache, - + final AccountByEmailCache byEmailCache, + final AccountCache accountCache, @Assisted final Set keys) { this.db = db; this.user = user; @@ -83,8 +84,7 @@ class DeleteExternalIds extends Handler> { return toKeySet(toDelete); } - private Map have() - throws OrmException { + private Map have() throws OrmException { Map r; r = new HashMap<>(); diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/ExternalIdDetailFactory.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/ExternalIdDetailFactory.java index b97d46acf9..80b7b9b46d 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/ExternalIdDetailFactory.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/ExternalIdDetailFactory.java @@ -25,7 +25,6 @@ import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.config.AuthConfig; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - import java.util.Collections; import java.util.List; @@ -40,8 +39,11 @@ class ExternalIdDetailFactory extends Handler> { private final DynamicItem session; @Inject - ExternalIdDetailFactory(final ReviewDb db, final IdentifiedUser user, - final AuthConfig authConfig, final DynamicItem session) { + ExternalIdDetailFactory( + final ReviewDb db, + final IdentifiedUser user, + final AuthConfig authConfig, + final DynamicItem session) { this.db = db; this.user = user; this.authConfig = authConfig; diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/doc/QueryDocumentationFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/doc/QueryDocumentationFilter.java index 3458ffc63e..160499754f 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/doc/QueryDocumentationFilter.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/doc/QueryDocumentationFilter.java @@ -22,13 +22,8 @@ import com.google.gerrit.server.documentation.QueryDocumentationExecutor.DocQuer import com.google.gerrit.server.documentation.QueryDocumentationExecutor.DocResult; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.util.List; - import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -37,11 +32,12 @@ import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Singleton public class QueryDocumentationFilter implements Filter { - private final Logger log = - LoggerFactory.getLogger(QueryDocumentationFilter.class); + private final Logger log = LoggerFactory.getLogger(QueryDocumentationFilter.class); private final QueryDocumentationExecutor searcher; @@ -51,19 +47,16 @@ public class QueryDocumentationFilter implements Filter { } @Override - public void init(FilterConfig filterConfig) { - } + public void init(FilterConfig filterConfig) {} @Override - public void destroy() { - } + public void destroy() {} @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; - if ("GET".equals(req.getMethod()) - && !Strings.isNullOrEmpty(req.getParameter("q"))) { + if ("GET".equals(req.getMethod()) && !Strings.isNullOrEmpty(req.getParameter("q"))) { HttpServletResponse rsp = (HttpServletResponse) response; try { List result = searcher.doQuery(request.getParameter("q")); diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ChangeProjectAccess.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ChangeProjectAccess.java index b39e2a23bd..75026d3e45 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ChangeProjectAccess.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ChangeProjectAccess.java @@ -31,14 +31,12 @@ import com.google.gerrit.server.project.SetParent; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; - +import java.io.IOException; +import java.util.List; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.revwalk.RevCommit; -import java.io.IOException; -import java.util.List; - class ChangeProjectAccess extends ProjectAccessHandler { interface Factory { ChangeProjectAccess create( @@ -54,9 +52,11 @@ class ChangeProjectAccess extends ProjectAccessHandler { private final ProjectCache projectCache; @Inject - ChangeProjectAccess(ProjectAccessFactory.Factory projectAccessFactory, + ChangeProjectAccess( + ProjectAccessFactory.Factory projectAccessFactory, ProjectControl.Factory projectControlFactory, - ProjectCache projectCache, GroupBackend groupBackend, + ProjectCache projectCache, + GroupBackend groupBackend, MetaDataUpdate.User metaDataUpdateFactory, AllProjectsName allProjects, Provider setParent, @@ -66,22 +66,37 @@ class ChangeProjectAccess extends ProjectAccessHandler { @Assisted List sectionList, @Nullable @Assisted("parentProjectName") Project.NameKey parentProjectName, @Nullable @Assisted String message) { - super(projectControlFactory, groupBackend, metaDataUpdateFactory, - allProjects, setParent, projectName, base, sectionList, - parentProjectName, message, true); + super( + projectControlFactory, + groupBackend, + metaDataUpdateFactory, + allProjects, + setParent, + projectName, + base, + sectionList, + parentProjectName, + message, + true); this.projectAccessFactory = projectAccessFactory; this.projectCache = projectCache; this.gitRefUpdated = gitRefUpdated; } @Override - protected ProjectAccess updateProjectConfig(ProjectControl projectControl, - ProjectConfig config, MetaDataUpdate md, boolean parentProjectUpdate) + protected ProjectAccess updateProjectConfig( + ProjectControl projectControl, + ProjectConfig config, + MetaDataUpdate md, + boolean parentProjectUpdate) throws IOException, NoSuchProjectException, ConfigInvalidException { RevCommit commit = config.commit(md); - gitRefUpdated.fire(config.getProject().getNameKey(), RefNames.REFS_CONFIG, - base, commit.getId(), + gitRefUpdated.fire( + config.getProject().getNameKey(), + RefNames.REFS_CONFIG, + base, + commit.getId(), projectControl.getUser().asIdentifiedUser().getAccount()); projectCache.evict(config.getProject()); diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAccessFactory.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAccessFactory.java index adfd528fb8..ca23ec2500 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAccessFactory.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAccessFactory.java @@ -40,9 +40,6 @@ import com.google.gerrit.server.project.ProjectControl; import com.google.gerrit.server.project.RefControl; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - -import org.eclipse.jgit.errors.ConfigInvalidException; - import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; @@ -50,6 +47,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import org.eclipse.jgit.errors.ConfigInvalidException; class ProjectAccessFactory extends Handler { interface Factory { @@ -68,14 +66,14 @@ class ProjectAccessFactory extends Handler { private WebLinks webLinks; @Inject - ProjectAccessFactory(final GroupBackend groupBackend, + ProjectAccessFactory( + final GroupBackend groupBackend, final ProjectCache projectCache, final ProjectControl.Factory projectControlFactory, final GroupControl.Factory groupControlFactory, final MetaDataUpdate.Server metaDataUpdateFactory, final AllProjectsName allProjectsName, final WebLinks webLinks, - @Assisted final Project.NameKey name) { this.groupBackend = groupBackend; this.projectCache = projectCache; @@ -89,8 +87,7 @@ class ProjectAccessFactory extends Handler { } @Override - public ProjectAccess call() throws NoSuchProjectException, IOException, - ConfigInvalidException { + public ProjectAccess call() throws NoSuchProjectException, IOException, ConfigInvalidException { pc = open(); // Load the current configuration from the repository, ensuring its the most @@ -107,8 +104,7 @@ class ProjectAccessFactory extends Handler { projectCache.evict(config.getProject()); pc = open(); } else if (config.getRevision() != null - && !config.getRevision().equals( - pc.getProjectState().getConfig().getRevision())) { + && !config.getRevision().equals(pc.getProjectState().getConfig().getRevision())) { projectCache.evict(config.getProject()); pc = open(); } @@ -205,8 +201,8 @@ class ProjectAccessFactory extends Handler { detail.setLocal(local); detail.setOwnerOf(ownerOf); - detail.setCanUpload(metaConfigControl.isVisible() - && (pc.isOwner() || metaConfigControl.canUpload())); + detail.setCanUpload( + metaConfigControl.isVisible() && (pc.isOwner() || metaConfigControl.canUpload())); detail.setConfigVisible(pc.isOwner() || metaConfigControl.isVisible()); detail.setGroupInfo(buildGroupInfo(local)); detail.setLabelTypes(pc.getLabelTypes()); @@ -216,8 +212,8 @@ class ProjectAccessFactory extends Handler { private List getConfigFileLogLinks(String projectName) { List links = - webLinks.getFileHistoryLinks(projectName, RefNames.REFS_CONFIG, - ProjectConfig.PROJECT_CONFIG); + webLinks.getFileHistoryLinks( + projectName, RefNames.REFS_CONFIG, ProjectConfig.PROJECT_CONFIG); return links.isEmpty() ? null : links; } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAccessHandler.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAccessHandler.java index 4c7d257b78..0d90190e4b 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAccessHandler.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAccessHandler.java @@ -42,15 +42,13 @@ import com.google.gerrit.server.project.RefPattern; import com.google.gerrit.server.project.SetParent; import com.google.gwtorm.server.OrmException; import com.google.inject.Provider; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.errors.RepositoryNotFoundException; -import org.eclipse.jgit.lib.ObjectId; - import java.io.IOException; import java.util.HashSet; import java.util.List; import java.util.Set; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.errors.RepositoryNotFoundException; +import org.eclipse.jgit.lib.ObjectId; public abstract class ProjectAccessHandler extends Handler { @@ -67,12 +65,18 @@ public abstract class ProjectAccessHandler extends Handler { protected String message; private boolean checkIfOwner; - protected ProjectAccessHandler(ProjectControl.Factory projectControlFactory, - GroupBackend groupBackend, MetaDataUpdate.User metaDataUpdateFactory, - AllProjectsName allProjects, Provider setParent, - Project.NameKey projectName, ObjectId base, - List sectionList, Project.NameKey parentProjectName, - String message, boolean checkIfOwner) { + protected ProjectAccessHandler( + ProjectControl.Factory projectControlFactory, + GroupBackend groupBackend, + MetaDataUpdate.User metaDataUpdateFactory, + AllProjectsName allProjects, + Provider setParent, + Project.NameKey projectName, + ObjectId base, + List sectionList, + Project.NameKey parentProjectName, + String message, + boolean checkIfOwner) { this.projectControlFactory = projectControlFactory; this.groupBackend = groupBackend; this.metaDataUpdateFactory = metaDataUpdateFactory; @@ -88,11 +92,11 @@ public abstract class ProjectAccessHandler extends Handler { } @Override - public final T call() throws NoSuchProjectException, IOException, - ConfigInvalidException, InvalidNameException, NoSuchGroupException, - OrmException, UpdateParentFailedException, PermissionDeniedException { - final ProjectControl projectControl = - projectControlFactory.controlFor(projectName); + public final T call() + throws NoSuchProjectException, IOException, ConfigInvalidException, InvalidNameException, + NoSuchGroupException, OrmException, UpdateParentFailedException, + PermissionDeniedException { + final ProjectControl projectControl = projectControlFactory.controlFor(projectName); Capable r = projectControl.canPushToAtLeastOneRef(); if (r != Capable.OK) { @@ -129,24 +133,28 @@ public abstract class ProjectAccessHandler extends Handler { config.remove(config.getAccessSection(name)); } - } else if (!checkIfOwner || projectControl.controlForRef(name).isOwner()) { + } else if (!checkIfOwner || projectControl.controlForRef(name).isOwner()) { config.remove(config.getAccessSection(name)); } } boolean parentProjectUpdate = false; - if (!config.getProject().getNameKey().equals(allProjects) && - !config.getProject().getParent(allProjects).equals(parentProjectName)) { + if (!config.getProject().getNameKey().equals(allProjects) + && !config.getProject().getParent(allProjects).equals(parentProjectName)) { parentProjectUpdate = true; try { - setParent.get().validateParentUpdate(projectControl, - MoreObjects.firstNonNull(parentProjectName, allProjects).get(), - checkIfOwner); + setParent + .get() + .validateParentUpdate( + projectControl, + MoreObjects.firstNonNull(parentProjectName, allProjects).get(), + checkIfOwner); } catch (AuthException e) { throw new UpdateParentFailedException( "You are not allowed to change the parent project since you are " - + "not an administrator. You may save the modifications for review " - + "so that an administrator can approve them.", e); + + "not an administrator. You may save the modifications for review " + + "so that an administrator can approve them.", + e); } catch (ResourceConflictException | UnprocessableEntityException e) { throw new UpdateParentFailedException(e.getMessage(), e); } @@ -162,20 +170,22 @@ public abstract class ProjectAccessHandler extends Handler { md.setMessage("Modify access rules\n"); } - return updateProjectConfig(projectControl, config, md, - parentProjectUpdate); + return updateProjectConfig(projectControl, config, md, parentProjectUpdate); } catch (RepositoryNotFoundException notFound) { throw new NoSuchProjectException(projectName); } } - protected abstract T updateProjectConfig(ProjectControl projectControl, - ProjectConfig config, MetaDataUpdate md, boolean parentProjectUpdate) - throws IOException, NoSuchProjectException, ConfigInvalidException, - OrmException, PermissionDeniedException; + protected abstract T updateProjectConfig( + ProjectControl projectControl, + ProjectConfig config, + MetaDataUpdate md, + boolean parentProjectUpdate) + throws IOException, NoSuchProjectException, ConfigInvalidException, OrmException, + PermissionDeniedException; - private void replace(ProjectConfig config, Set toDelete, - AccessSection section) throws NoSuchGroupException { + private void replace(ProjectConfig config, Set toDelete, AccessSection section) + throws NoSuchGroupException { for (Permission permission : section.getPermissions()) { for (PermissionRule rule : permission.getRules()) { lookupGroup(rule); @@ -196,8 +206,7 @@ public abstract class ProjectAccessHandler extends Handler { private void lookupGroup(PermissionRule rule) throws NoSuchGroupException { GroupReference ref = rule.getGroup(); if (ref.getUUID() == null) { - final GroupReference group = - GroupBackends.findBestSuggestion(groupBackend, ref.getName()); + final GroupReference group = GroupBackends.findBestSuggestion(groupBackend, ref.getName()); if (group == null) { throw new NoSuchGroupException(ref.getName()); } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAdminServiceImpl.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAdminServiceImpl.java index c37870160f..bdb274d613 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAdminServiceImpl.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAdminServiceImpl.java @@ -21,10 +21,8 @@ import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Project; import com.google.gwtjsonrpc.common.AsyncCallback; import com.google.inject.Inject; - -import org.eclipse.jgit.lib.ObjectId; - import java.util.List; +import org.eclipse.jgit.lib.ObjectId; class ProjectAdminServiceImpl implements ProjectAdminService { private final ChangeProjectAccess.Factory changeProjectAccessFactory; @@ -32,7 +30,8 @@ class ProjectAdminServiceImpl implements ProjectAdminService { private final ProjectAccessFactory.Factory projectAccessFactory; @Inject - ProjectAdminServiceImpl(final ChangeProjectAccess.Factory changeProjectAccessFactory, + ProjectAdminServiceImpl( + final ChangeProjectAccess.Factory changeProjectAccessFactory, final ReviewProjectAccess.Factory reviewProjectAccessFactory, final ProjectAccessFactory.Factory projectAccessFactory) { this.changeProjectAccessFactory = changeProjectAccessFactory; @@ -41,8 +40,8 @@ class ProjectAdminServiceImpl implements ProjectAdminService { } @Override - public void projectAccess(final Project.NameKey projectName, - final AsyncCallback callback) { + public void projectAccess( + final Project.NameKey projectName, final AsyncCallback callback) { projectAccessFactory.create(projectName).to(callback); } @@ -54,18 +53,28 @@ class ProjectAdminServiceImpl implements ProjectAdminService { } @Override - public void changeProjectAccess(Project.NameKey projectName, - String baseRevision, String msg, List sections, - Project.NameKey parentProjectName, AsyncCallback cb) { - changeProjectAccessFactory.create(projectName, getBase(baseRevision), - sections, parentProjectName, msg).to(cb); + public void changeProjectAccess( + Project.NameKey projectName, + String baseRevision, + String msg, + List sections, + Project.NameKey parentProjectName, + AsyncCallback cb) { + changeProjectAccessFactory + .create(projectName, getBase(baseRevision), sections, parentProjectName, msg) + .to(cb); } @Override - public void reviewProjectAccess(Project.NameKey projectName, - String baseRevision, String msg, List sections, - Project.NameKey parentProjectName, AsyncCallback cb) { - reviewProjectAccessFactory.create(projectName, getBase(baseRevision), - sections, parentProjectName, msg).to(cb); + public void reviewProjectAccess( + Project.NameKey projectName, + String baseRevision, + String msg, + List sections, + Project.NameKey parentProjectName, + AsyncCallback cb) { + reviewProjectAccessFactory + .create(projectName, getBase(baseRevision), sections, parentProjectName, msg) + .to(cb); } } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectModule.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectModule.java index a89f52ebde..3d7d80fea2 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectModule.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectModule.java @@ -25,14 +25,15 @@ public class ProjectModule extends RpcServletModule { @Override protected void configureServlets() { - install(new FactoryModule() { - @Override - protected void configure() { - factory(ChangeProjectAccess.Factory.class); - factory(ReviewProjectAccess.Factory.class); - factory(ProjectAccessFactory.Factory.class); - } - }); + install( + new FactoryModule() { + @Override + protected void configure() { + factory(ChangeProjectAccess.Factory.class); + factory(ReviewProjectAccess.Factory.class); + factory(ProjectAccessFactory.Factory.class); + } + }); rpc(ProjectAdminServiceImpl.class); } } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ReviewProjectAccess.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ReviewProjectAccess.java index 966cd88783..42c3374965 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ReviewProjectAccess.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ReviewProjectAccess.java @@ -49,15 +49,13 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; - +import java.io.IOException; +import java.util.List; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectInserter; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; -import java.io.IOException; -import java.util.List; - public class ReviewProjectAccess extends ProjectAccessHandler { interface Factory { ReviewProjectAccess create( @@ -77,9 +75,11 @@ public class ReviewProjectAccess extends ProjectAccessHandler { private final BatchUpdate.Factory updateFactory; @Inject - ReviewProjectAccess(final ProjectControl.Factory projectControlFactory, + ReviewProjectAccess( + final ProjectControl.Factory projectControlFactory, GroupBackend groupBackend, - MetaDataUpdate.User metaDataUpdateFactory, ReviewDb db, + MetaDataUpdate.User metaDataUpdateFactory, + ReviewDb db, Provider reviewersProvider, ProjectCache projectCache, AllProjectsName allProjects, @@ -88,15 +88,23 @@ public class ReviewProjectAccess extends ProjectAccessHandler { BatchUpdate.Factory updateFactory, Provider setParent, Sequences seq, - @Assisted("projectName") Project.NameKey projectName, @Nullable @Assisted ObjectId base, @Assisted List sectionList, @Nullable @Assisted("parentProjectName") Project.NameKey parentProjectName, @Nullable @Assisted String message) { - super(projectControlFactory, groupBackend, metaDataUpdateFactory, - allProjects, setParent, projectName, base, sectionList, - parentProjectName, message, false); + super( + projectControlFactory, + groupBackend, + metaDataUpdateFactory, + allProjects, + setParent, + projectName, + base, + sectionList, + parentProjectName, + message, + false); this.db = db; this.seq = seq; this.reviewersProvider = reviewersProvider; @@ -107,25 +115,25 @@ public class ReviewProjectAccess extends ProjectAccessHandler { } @Override - protected Change.Id updateProjectConfig(ProjectControl projectControl, - ProjectConfig config, MetaDataUpdate md, boolean parentProjectUpdate) - throws IOException, OrmException, PermissionDeniedException { - RefControl refsMetaConfigControl = - projectControl.controlForRef(RefNames.REFS_CONFIG); + protected Change.Id updateProjectConfig( + ProjectControl projectControl, + ProjectConfig config, + MetaDataUpdate md, + boolean parentProjectUpdate) + throws IOException, OrmException, PermissionDeniedException { + RefControl refsMetaConfigControl = projectControl.controlForRef(RefNames.REFS_CONFIG); if (!refsMetaConfigControl.isVisible()) { - throw new PermissionDeniedException( - RefNames.REFS_CONFIG + " not visible"); + throw new PermissionDeniedException(RefNames.REFS_CONFIG + " not visible"); } if (!projectControl.isOwner() && !refsMetaConfigControl.canUpload()) { - throw new PermissionDeniedException( - "cannot upload to " + RefNames.REFS_CONFIG); + throw new PermissionDeniedException("cannot upload to " + RefNames.REFS_CONFIG); } md.setInsertChangeId(true); Change.Id changeId = new Change.Id(seq.nextChangeId()); RevCommit commit = - config.commitToNewRef(md, new PatchSet.Id(changeId, - Change.INITIAL_PATCH_SET_ID).toRefName()); + config.commitToNewRef( + md, new PatchSet.Id(changeId, Change.INITIAL_PATCH_SET_ID).toRefName()); if (commit.getId().equals(base)) { return null; } @@ -133,11 +141,12 @@ public class ReviewProjectAccess extends ProjectAccessHandler { try (RevWalk rw = new RevWalk(md.getRepository()); ObjectInserter objInserter = md.getRepository().newObjectInserter(); BatchUpdate bu = - updateFactory.create(db, config.getProject().getNameKey(), - projectControl.getUser(), TimeUtil.nowTs())) { + updateFactory.create( + db, config.getProject().getNameKey(), projectControl.getUser(), TimeUtil.nowTs())) { bu.setRepository(md.getRepository(), rw, objInserter); bu.insertChange( - changeInserterFactory.create(changeId, commit, RefNames.REFS_CONFIG) + changeInserterFactory + .create(changeId, commit, RefNames.REFS_CONFIG) .setValidatePolicy(CommitValidators.Policy.NONE) .setUpdateRef(false)); // Created by commitToNewRef. bu.execute(); @@ -159,14 +168,12 @@ public class ReviewProjectAccess extends ProjectAccessHandler { } private void addProjectOwnersAsReviewers(ChangeResource rsrc) { - final String projectOwners = - groupBackend.get(SystemGroupBackend.PROJECT_OWNERS).getName(); + final String projectOwners = groupBackend.get(SystemGroupBackend.PROJECT_OWNERS).getName(); try { AddReviewerInput input = new AddReviewerInput(); input.reviewer = projectOwners; reviewersProvider.get().apply(rsrc, input); - } catch (IOException | OrmException | - RestApiException | UpdateException e) { + } catch (IOException | OrmException | RestApiException | UpdateException e) { // one of the owner groups is not visible to the user and this it why it // can't be added as reviewer } @@ -174,16 +181,18 @@ public class ReviewProjectAccess extends ProjectAccessHandler { private void addAdministratorsAsReviewers(ChangeResource rsrc) { List adminRules = - projectCache.getAllProjects().getConfig() + projectCache + .getAllProjects() + .getConfig() .getAccessSection(AccessSection.GLOBAL_CAPABILITIES) - .getPermission(GlobalCapability.ADMINISTRATE_SERVER).getRules(); + .getPermission(GlobalCapability.ADMINISTRATE_SERVER) + .getRules(); for (PermissionRule r : adminRules) { try { AddReviewerInput input = new AddReviewerInput(); input.reviewer = r.getGroup().getUUID().get(); reviewersProvider.get().apply(rsrc, input); - } catch (IOException | OrmException | - RestApiException | UpdateException e) { + } catch (IOException | OrmException | RestApiException | UpdateException e) { // ignore } } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/template/SiteHeaderFooter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/template/SiteHeaderFooter.java index 9c067decc2..dca4d0f099 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/template/SiteHeaderFooter.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/template/SiteHeaderFooter.java @@ -22,16 +22,14 @@ import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.config.SitePaths; import com.google.inject.Inject; import com.google.inject.Singleton; - +import java.io.IOException; +import java.nio.file.Path; import org.eclipse.jgit.lib.Config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; -import java.io.IOException; -import java.nio.file.Path; - @Singleton public class SiteHeaderFooter { private static final Logger log = LoggerFactory.getLogger(SiteHeaderFooter.class); @@ -119,9 +117,7 @@ public class SiteHeaderFooter { } void load() throws IOException { - css = HtmlDomUtil.readFile( - cssFile.path.getParent(), - cssFile.path.getFileName().toString()); + css = HtmlDomUtil.readFile(cssFile.path.getParent(), cssFile.path.getFileName().toString()); header = readXml(headerFile); footer = readXml(footerFile); } diff --git a/gerrit-httpd/src/test/java/com/google/gerrit/httpd/AllRequestFilterFilterProxyTest.java b/gerrit-httpd/src/test/java/com/google/gerrit/httpd/AllRequestFilterFilterProxyTest.java index f19d1d8699..86989ddd44 100644 --- a/gerrit-httpd/src/test/java/com/google/gerrit/httpd/AllRequestFilterFilterProxyTest.java +++ b/gerrit-httpd/src/test/java/com/google/gerrit/httpd/AllRequestFilterFilterProxyTest.java @@ -25,25 +25,22 @@ import com.google.gerrit.util.http.testutil.FakeHttpServletRequest; import com.google.gerrit.util.http.testutil.FakeHttpServletResponse; import com.google.inject.Key; import com.google.inject.util.Providers; - +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import org.easymock.Capture; import org.easymock.EasyMockSupport; import org.easymock.IMocksControl; import org.junit.Before; import org.junit.Test; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - public class AllRequestFilterFilterProxyTest { /** * Set of filters for FilterProxy - *

- * This set is used to as set of filters when fetching an - * {@link AllRequestFilter.FilterProxy} instance through - * {@link #getFilterProxy()}. + * + *

This set is used to as set of filters when fetching an {@link AllRequestFilter.FilterProxy} + * instance through {@link #getFilterProxy()}. */ private DynamicSet filters; @@ -63,9 +60,9 @@ public class AllRequestFilterFilterProxyTest { /** * Obtain a FilterProxy with a known DynamicSet of filters - *

- * The returned {@link AllRequestFilter.FilterProxy} can have new filters - * added dynamically by calling {@link #addFilter(AllRequestFilter)}. + * + *

The returned {@link AllRequestFilter.FilterProxy} can have new filters added dynamically by + * calling {@link #addFilter(AllRequestFilter)}. */ private AllRequestFilter.FilterProxy getFilterProxy() { return new AllRequestFilter.FilterProxy(filters); @@ -73,13 +70,11 @@ public class AllRequestFilterFilterProxyTest { /** * Add a filter to created FilterProxy instances - *

- * This method adds the given filter to all - * {@link AllRequestFilter.FilterProxy} instances created by - * {@link #getFilterProxy()}. + * + *

This method adds the given filter to all {@link AllRequestFilter.FilterProxy} instances + * created by {@link #getFilterProxy()}. */ - private ReloadableRegistrationHandle addFilter( - final AllRequestFilter filter) { + private ReloadableRegistrationHandle addFilter(final AllRequestFilter filter) { Key key = Key.get(AllRequestFilter.class); return filters.add(key, Providers.of(filter)); } @@ -333,10 +328,8 @@ public class AllRequestFilterFilterProxyTest { ems.replayAll(); AllRequestFilter.FilterProxy filterProxy = getFilterProxy(); - ReloadableRegistrationHandle handleFilterA = - addFilter(filterA); - ReloadableRegistrationHandle handleFilterB = - addFilter(filterB); + ReloadableRegistrationHandle handleFilterA = addFilter(filterA); + ReloadableRegistrationHandle handleFilterB = addFilter(filterB); filterProxy.init(config); diff --git a/gerrit-httpd/src/test/java/com/google/gerrit/httpd/RemoteUserUtilTest.java b/gerrit-httpd/src/test/java/com/google/gerrit/httpd/RemoteUserUtilTest.java index b6d0b0b16a..f012ee34ac 100644 --- a/gerrit-httpd/src/test/java/com/google/gerrit/httpd/RemoteUserUtilTest.java +++ b/gerrit-httpd/src/test/java/com/google/gerrit/httpd/RemoteUserUtilTest.java @@ -24,9 +24,7 @@ public class RemoteUserUtilTest { public void testExtractUsername() { assertThat(extractUsername(null)).isNull(); assertThat(extractUsername("")).isNull(); - assertThat(extractUsername("Basic dXNlcjpwYXNzd29yZA==")) - .isEqualTo("user"); - assertThat(extractUsername("Digest username=\"user\", realm=\"test\"")) - .isEqualTo("user"); + assertThat(extractUsername("Basic dXNlcjpwYXNzd29yZA==")).isEqualTo("user"); + assertThat(extractUsername("Digest username=\"user\", realm=\"test\"")).isEqualTo("user"); } } diff --git a/gerrit-httpd/src/test/java/com/google/gerrit/httpd/plugins/ContextMapperTest.java b/gerrit-httpd/src/test/java/com/google/gerrit/httpd/plugins/ContextMapperTest.java index dbf990425f..684a2415bd 100644 --- a/gerrit-httpd/src/test/java/com/google/gerrit/httpd/plugins/ContextMapperTest.java +++ b/gerrit-httpd/src/test/java/com/google/gerrit/httpd/plugins/ContextMapperTest.java @@ -17,10 +17,8 @@ package com.google.gerrit.httpd.plugins; import static com.google.common.truth.Truth.assertThat; import com.google.gerrit.util.http.testutil.FakeHttpServletRequest; - -import org.junit.Test; - import javax.servlet.http.HttpServletRequest; +import org.junit.Test; public class ContextMapperTest { @@ -35,11 +33,9 @@ public class ContextMapperTest { HttpServletRequest originalRequest = createFakeRequest("/plugins/", PLUGIN_NAME + "/" + RESOURCE); - HttpServletRequest result = - classUnderTest.create(originalRequest, PLUGIN_NAME); + HttpServletRequest result = classUnderTest.create(originalRequest, PLUGIN_NAME); - assertThat(result.getContextPath()) - .isEqualTo(CONTEXT + "/plugins/" + PLUGIN_NAME); + assertThat(result.getContextPath()).isEqualTo(CONTEXT + "/plugins/" + PLUGIN_NAME); assertThat(result.getServletPath()).isEqualTo(""); assertThat(result.getPathInfo()).isEqualTo("/" + RESOURCE); assertThat(result.getRequestURI()) @@ -53,20 +49,17 @@ public class ContextMapperTest { HttpServletRequest originalRequest = createFakeRequest("/a/plugins/", PLUGIN_NAME + "/" + RESOURCE); - HttpServletRequest result = - classUnderTest.create(originalRequest, PLUGIN_NAME); + HttpServletRequest result = classUnderTest.create(originalRequest, PLUGIN_NAME); - assertThat(result.getContextPath()) - .isEqualTo(CONTEXT + "/a/plugins/" + PLUGIN_NAME); + assertThat(result.getContextPath()).isEqualTo(CONTEXT + "/a/plugins/" + PLUGIN_NAME); assertThat(result.getServletPath()).isEqualTo(""); assertThat(result.getPathInfo()).isEqualTo("/" + RESOURCE); assertThat(result.getRequestURI()) .isEqualTo(CONTEXT + "/a/plugins/" + PLUGIN_NAME + "/" + RESOURCE); } - private static FakeHttpServletRequest createFakeRequest(String servletPath, - String pathInfo) { - return new FakeHttpServletRequest( - "gerrit.example.com", 80, CONTEXT, servletPath).setPathInfo(pathInfo); + private static FakeHttpServletRequest createFakeRequest(String servletPath, String pathInfo) { + return new FakeHttpServletRequest("gerrit.example.com", 80, CONTEXT, servletPath) + .setPathInfo(pathInfo); } } diff --git a/gerrit-httpd/src/test/java/com/google/gerrit/httpd/plugins/LfsPluginServletTest.java b/gerrit-httpd/src/test/java/com/google/gerrit/httpd/plugins/LfsPluginServletTest.java index 065fa5d049..b1f441de5f 100644 --- a/gerrit-httpd/src/test/java/com/google/gerrit/httpd/plugins/LfsPluginServletTest.java +++ b/gerrit-httpd/src/test/java/com/google/gerrit/httpd/plugins/LfsPluginServletTest.java @@ -16,10 +16,9 @@ package com.google.gerrit.httpd.plugins; import static com.google.common.truth.Truth.assertThat; -import org.junit.Test; - import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.junit.Test; public class LfsPluginServletTest { diff --git a/gerrit-httpd/src/test/java/com/google/gerrit/httpd/raw/ResourceServletTest.java b/gerrit-httpd/src/test/java/com/google/gerrit/httpd/raw/ResourceServletTest.java index e8c835df10..18256c6c8d 100644 --- a/gerrit-httpd/src/test/java/com/google/gerrit/httpd/raw/ResourceServletTest.java +++ b/gerrit-httpd/src/test/java/com/google/gerrit/httpd/raw/ResourceServletTest.java @@ -30,11 +30,6 @@ import com.google.common.jimfs.Jimfs; import com.google.gerrit.httpd.raw.ResourceServlet.Resource; import com.google.gerrit.util.http.testutil.FakeHttpServletRequest; import com.google.gerrit.util.http.testutil.FakeHttpServletResponse; - -import org.joda.time.format.ISODateTimeFormat; -import org.junit.Before; -import org.junit.Test; - import java.io.ByteArrayInputStream; import java.io.InputStream; import java.nio.file.FileSystem; @@ -43,13 +38,13 @@ import java.nio.file.Path; import java.nio.file.attribute.FileTime; import java.util.concurrent.atomic.AtomicLong; import java.util.zip.GZIPInputStream; +import org.joda.time.format.ISODateTimeFormat; +import org.junit.Before; +import org.junit.Test; public class ResourceServletTest { private static Cache newCache(int size) { - return CacheBuilder.newBuilder() - .maximumSize(size) - .recordStats() - .build(); + return CacheBuilder.newBuilder().maximumSize(size).recordStats().build(); } private static class Servlet extends ResourceServlet { @@ -57,26 +52,29 @@ public class ResourceServletTest { private final FileSystem fs; - private Servlet(FileSystem fs, Cache cache, - boolean refresh) { + private Servlet(FileSystem fs, Cache cache, boolean refresh) { super(cache, refresh); this.fs = fs; } - private Servlet(FileSystem fs, Cache cache, - boolean refresh, boolean cacheOnClient) { + private Servlet( + FileSystem fs, Cache cache, boolean refresh, boolean cacheOnClient) { super(cache, refresh, cacheOnClient); this.fs = fs; } - private Servlet(FileSystem fs, Cache cache, - boolean refresh, int cacheFileSizeLimitBytes) { + private Servlet( + FileSystem fs, Cache cache, boolean refresh, int cacheFileSizeLimitBytes) { super(cache, refresh, true, cacheFileSizeLimitBytes); this.fs = fs; } - private Servlet(FileSystem fs, Cache cache, - boolean refresh, boolean cacheOnClient, int cacheFileSizeLimitBytes) { + private Servlet( + FileSystem fs, + Cache cache, + boolean refresh, + boolean cacheOnClient, + int cacheFileSizeLimitBytes) { super(cache, refresh, cacheOnClient, cacheFileSizeLimitBytes); this.fs = fs; } @@ -93,8 +91,7 @@ public class ResourceServletTest { @Before public void setUp() { fs = Jimfs.newFileSystem(Configuration.unix()); - ts = new AtomicLong(ISODateTimeFormat.dateTime().parseMillis( - "2010-01-30T12:00:00.000-08:00")); + ts = new AtomicLong(ISODateTimeFormat.dateTime().parseMillis("2010-01-30T12:00:00.000-08:00")); } @Test @@ -237,8 +234,7 @@ public class ResourceServletTest { Servlet servlet = new Servlet(fs, cache, true); writeFile("/foo", "foo1"); - FakeHttpServletRequest req = request("/foo") - .addHeader("Accept-Encoding", "gzip"); + FakeHttpServletRequest req = request("/foo").addHeader("Accept-Encoding", "gzip"); FakeHttpServletResponse res = new FakeHttpServletResponse(); servlet.doGet(req, res); assertThat(res.getStatus()).isEqualTo(SC_OK); @@ -255,8 +251,7 @@ public class ResourceServletTest { String content = Strings.repeat("a", 100); writeFile("/foo", content); - FakeHttpServletRequest req = request("/foo") - .addHeader("Accept-Encoding", "gzip"); + FakeHttpServletRequest req = request("/foo").addHeader("Accept-Encoding", "gzip"); FakeHttpServletResponse res = new FakeHttpServletResponse(); servlet.doGet(req, res); assertThat(res.getStatus()).isEqualTo(SC_OK); @@ -267,8 +262,7 @@ public class ResourceServletTest { } @Test - public void largeFileBypassesCacheRegardlessOfRefreshParamter() - throws Exception { + public void largeFileBypassesCacheRegardlessOfRefreshParamter() throws Exception { for (boolean refresh : Lists.newArrayList(true, false)) { Cache cache = newCache(1); Servlet servlet = new Servlet(fs, cache, refresh, 3); @@ -312,8 +306,7 @@ public class ResourceServletTest { String content = Strings.repeat("a", 100); writeFile("/foo", content); - FakeHttpServletRequest req = request("/foo") - .addHeader("Accept-Encoding", "gzip"); + FakeHttpServletRequest req = request("/foo").addHeader("Accept-Encoding", "gzip"); FakeHttpServletResponse res = new FakeHttpServletResponse(); servlet.doGet(req, res); assertThat(res.getStatus()).isEqualTo(SC_OK); @@ -331,8 +324,7 @@ public class ResourceServletTest { private void writeFile(String path, String content) throws Exception { Files.write(fs.getPath(path), content.getBytes(UTF_8)); - Files.setLastModifiedTime( - fs.getPath(path), FileTime.fromMillis(ts.getAndIncrement())); + Files.setLastModifiedTime(fs.getPath(path), FileTime.fromMillis(ts.getAndIncrement())); } private static void assertCacheHits(Cache cache, int hits, int misses) { @@ -340,8 +332,7 @@ public class ResourceServletTest { assertThat(cache.stats().missCount()).named("misses").isEqualTo(misses); } - private static void assertCacheable(FakeHttpServletResponse res, - boolean revalidate) { + private static void assertCacheable(FakeHttpServletResponse res, boolean revalidate) { String header = res.getHeader("Cache-Control").toLowerCase(); assertThat(header).contains("public"); if (revalidate) { diff --git a/gerrit-httpd/src/test/java/com/google/gerrit/httpd/restapi/ParameterParserTest.java b/gerrit-httpd/src/test/java/com/google/gerrit/httpd/restapi/ParameterParserTest.java index 29f982ec3b..2b724e267a 100644 --- a/gerrit-httpd/src/test/java/com/google/gerrit/httpd/restapi/ParameterParserTest.java +++ b/gerrit-httpd/src/test/java/com/google/gerrit/httpd/restapi/ParameterParserTest.java @@ -22,19 +22,19 @@ import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; - import org.junit.Test; public class ParameterParserTest { @Test public void convertFormToJson() throws BadRequestException { - JsonObject obj = ParameterParser.formToJson( - ImmutableMap.of( - "message", new String[]{"this.is.text"}, - "labels.Verified", new String[]{"-1"}, - "labels.Code-Review", new String[]{"2"}, - "a_list", new String[]{"a", "b"}), - ImmutableSet.of("q")); + JsonObject obj = + ParameterParser.formToJson( + ImmutableMap.of( + "message", new String[] {"this.is.text"}, + "labels.Verified", new String[] {"-1"}, + "labels.Code-Review", new String[] {"2"}, + "a_list", new String[] {"a", "b"}), + ImmutableSet.of("q")); JsonObject labels = new JsonObject(); labels.addProperty("Verified", "-1"); diff --git a/gerrit-launcher/src/main/java/com/google/gerrit/launcher/GerritLauncher.java b/gerrit-launcher/src/main/java/com/google/gerrit/launcher/GerritLauncher.java index b0eabeaddc..896c52d0b5 100644 --- a/gerrit-launcher/src/main/java/com/google/gerrit/launcher/GerritLauncher.java +++ b/gerrit-launcher/src/main/java/com/google/gerrit/launcher/GerritLauncher.java @@ -110,8 +110,7 @@ public final class GerritLauncher { public static void daemonStart(final String[] argv) throws Exception { if (daemonClassLoader != null) { - throw new IllegalStateException( - "daemonStart can be called only once per JVM instance"); + throw new IllegalStateException("daemonStart can be called only once per JVM instance"); } final ClassLoader cl = libClassLoader(false); Thread.currentThread().setContextClassLoader(cl); @@ -131,8 +130,7 @@ public final class GerritLauncher { public static void daemonStop(final String[] argv) throws Exception { if (daemonClassLoader == null) { - throw new IllegalStateException( - "daemonStop can be called only after call to daemonStop"); + throw new IllegalStateException("daemonStop can be called only after call to daemonStop"); } String[] daemonArgv = new String[argv.length + 2]; daemonArgv[0] = "daemon"; @@ -165,8 +163,8 @@ public final class GerritLauncher { } } - private static int invokeProgram(final ClassLoader loader, - final String[] origArgv) throws Exception { + private static int invokeProgram(final ClassLoader loader, final String[] origArgv) + throws Exception { String name = origArgv[0]; final String[] argv = new String[origArgv.length - 1]; System.arraycopy(origArgv, 1, argv, 0, argv.length); @@ -236,8 +234,7 @@ public final class GerritLauncher { return cn; } - private static ClassLoader libClassLoader(boolean prologCompiler) - throws IOException { + private static ClassLoader libClassLoader(boolean prologCompiler) throws IOException { final File path; try { path = getDistributionArchive(); @@ -287,17 +284,13 @@ public final class GerritLauncher { ClassLoader parent = ClassLoader.getSystemClassLoader(); if (!extapi.isEmpty()) { - parent = new URLClassLoader( - extapi.toArray(new URL[extapi.size()]), - parent); + parent = new URLClassLoader(extapi.toArray(new URL[extapi.size()]), parent); } - return new URLClassLoader( - jars.values().toArray(new URL[jars.size()]), - parent); + return new URLClassLoader(jars.values().toArray(new URL[jars.size()]), parent); } - private static void extractJar(ZipFile zf, ZipEntry ze, - SortedMap jars) throws IOException { + private static void extractJar(ZipFile zf, ZipEntry ze, SortedMap jars) + throws IOException { File tmp = createTempFile(safeName(ze), ".jar"); try (FileOutputStream out = new FileOutputStream(tmp); InputStream in = zf.getInputStream(ze)) { @@ -309,14 +302,10 @@ public final class GerritLauncher { } String name = ze.getName(); - jars.put( - name.substring(name.lastIndexOf('/'), name.length()), - tmp.toURI().toURL()); + jars.put(name.substring(name.lastIndexOf('/'), name.length()), tmp.toURI().toURL()); } - private static void move(SortedMap jars, - String prefix, - List extapi) { + private static void move(SortedMap jars, String prefix, List extapi) { SortedMap matches = jars.tailMap(prefix); if (!matches.isEmpty()) { String first = matches.firstKey(); @@ -355,8 +344,7 @@ public final class GerritLauncher { * @return local path of the Gerrit WAR file. * @throws FileNotFoundException if the code cannot guess the location. */ - public static File getDistributionArchive() - throws FileNotFoundException, IOException { + public static File getDistributionArchive() throws FileNotFoundException, IOException { File result = myArchive; if (result == null) { synchronized (GerritLauncher.class) { @@ -371,8 +359,7 @@ public final class GerritLauncher { return result; } - public static synchronized FileSystem getZipFileSystem(Path zip) - throws IOException { + public static synchronized FileSystem getZipFileSystem(Path zip) throws IOException { // FileSystems canonicalizes the path, so we should too. zip = zip.toRealPath(); FileSystem zipFs = zipFileSystems.get(zip); @@ -385,14 +372,12 @@ public final class GerritLauncher { public static FileSystem newZipFileSystem(Path zip) throws IOException { return FileSystems.newFileSystem( - URI.create("jar:" + zip.toUri()), - Collections. emptyMap()); + URI.create("jar:" + zip.toUri()), Collections.emptyMap()); } private static File locateMyArchive() throws FileNotFoundException { final ClassLoader myCL = GerritLauncher.class.getClassLoader(); - final String myName = - GerritLauncher.class.getName().replace('.', '/') + ".class"; + final String myName = GerritLauncher.class.getName().replace('.', '/') + ".class"; final URL myClazz = myCL.getResource(myName); if (myClazz == null) { @@ -424,8 +409,7 @@ public final class GerritLauncher { // The CodeSource might be able to give us the source as a stream. // If so, copy it to a local file so we have random access to it. // - final CodeSource src = - GerritLauncher.class.getProtectionDomain().getCodeSource(); + final CodeSource src = GerritLauncher.class.getProtectionDomain().getCodeSource(); if (src != null) { try (InputStream in = src.getLocation().openStream()) { final File tmp = createTempFile("gerrit_", ".zip"); @@ -451,35 +435,30 @@ public final class GerritLauncher { /** * Creates a temporary file within the application's unpack location. - *

- * The launcher unpacks the nested JAR files into a temporary directory, - * allowing the classes to be loaded from local disk with standard Java APIs. - * This method constructs a new temporary file in the same directory. - *

- * The method first tries to create {@code prefix + suffix} within the - * directory under the assumption that a given {@code prefix + suffix} - * combination is made at most once per JVM execution. If this fails (e.g. the - * named file already exists) a mangled unique name is used and returned - * instead, with the unique string appearing between the prefix and suffix. - *

- * Files created by this method will be automatically deleted by the JVM when - * it terminates. If the returned file is converted into a directory by the - * caller, the caller must arrange for the contents to be deleted before the - * directory is. - *

- * If supported by the underlying operating system, the temporary directory - * which contains these temporary files is accessible only by the user running - * the JVM. + * + *

The launcher unpacks the nested JAR files into a temporary directory, allowing the classes + * to be loaded from local disk with standard Java APIs. This method constructs a new temporary + * file in the same directory. + * + *

The method first tries to create {@code prefix + suffix} within the directory under the + * assumption that a given {@code prefix + suffix} combination is made at most once per JVM + * execution. If this fails (e.g. the named file already exists) a mangled unique name is used and + * returned instead, with the unique string appearing between the prefix and suffix. + * + *

Files created by this method will be automatically deleted by the JVM when it terminates. If + * the returned file is converted into a directory by the caller, the caller must arrange for the + * contents to be deleted before the directory is. + * + *

If supported by the underlying operating system, the temporary directory which contains + * these temporary files is accessible only by the user running the JVM. * * @param prefix prefix of the file name. * @param suffix suffix of the file name. - * @return the path of the temporary file. The returned object exists in the - * filesystem as a file; caller may need to delete and recreate as a - * directory if a directory was preferred. + * @return the path of the temporary file. The returned object exists in the filesystem as a file; + * caller may need to delete and recreate as a directory if a directory was preferred. * @throws IOException the file could not be created. */ - public static synchronized File createTempFile(String prefix, String suffix) - throws IOException { + public static synchronized File createTempFile(String prefix, String suffix) throws IOException { if (!temporaryDirectoryFound) { final File d = File.createTempFile("gerrit_", "_app", tmproot()); if (d.delete() && d.mkdir()) { @@ -533,7 +512,6 @@ public final class GerritLauncher { return myHome; } - private static File tmproot() { File tmp; String gerritTemp = System.getenv("GERRIT_TMP"); @@ -634,8 +612,7 @@ public final class GerritLauncher { * @return local path of the {@code name} directory in a source tree. * @throws FileNotFoundException if the directory cannot be found. */ - public static Path resolveInSourceRoot(String name) - throws FileNotFoundException { + public static Path resolveInSourceRoot(String name) throws FileNotFoundException { // Find ourselves in the classpath, as a loose class file or jar. Class self = GerritLauncher.class; @@ -644,13 +621,11 @@ public final class GerritLauncher { try (InputStream stream = self.getResourceAsStream(SOURCE_ROOT_RESOURCE)) { System.err.println("URL: " + stream); if (stream != null) { - try (Scanner scan = - new Scanner(stream, UTF_8.name()).useDelimiter("\n")) { + try (Scanner scan = new Scanner(stream, UTF_8.name()).useDelimiter("\n")) { if (scan.hasNext()) { Path p = Paths.get(scan.next()); if (!Files.exists(p)) { - throw new FileNotFoundException( - "source root not found: " + p); + throw new FileNotFoundException("source root not found: " + p); } return p; } @@ -668,8 +643,7 @@ public final class GerritLauncher { try { u = new URL(p.substring(0, p.indexOf('!'))); } catch (MalformedURLException e) { - FileNotFoundException fnfe = - new FileNotFoundException("Not a valid jar file: " + u); + FileNotFoundException fnfe = new FileNotFoundException("Not a valid jar file: " + u); fnfe.initCause(e); throw fnfe; } @@ -690,14 +664,12 @@ public final class GerritLauncher { Path ret = dir.resolve(name); if (!Files.exists(ret)) { - throw new FileNotFoundException( - name + " not found in source root " + dir); + throw new FileNotFoundException(name + " not found in source root " + dir); } return ret; } - private static ClassLoader useDevClasspath() - throws MalformedURLException, FileNotFoundException { + private static ClassLoader useDevClasspath() throws MalformedURLException, FileNotFoundException { Path out = resolveInSourceRoot("eclipse-out"); List dirs = new ArrayList<>(); dirs.add(out.resolve("classes").toUri().toURL()); @@ -708,8 +680,7 @@ public final class GerritLauncher { } } return new URLClassLoader( - dirs.toArray(new URL[dirs.size()]), - ClassLoader.getSystemClassLoader().getParent()); + dirs.toArray(new URL[dirs.size()]), ClassLoader.getSystemClassLoader().getParent()); } private static boolean includeJar(URL u) { @@ -719,6 +690,5 @@ public final class GerritLauncher { && !path.contains("/buck-out/gen/lib/gwt/"); } - private GerritLauncher() { - } + private GerritLauncher() {} } diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/AbstractLuceneIndex.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/AbstractLuceneIndex.java index 6237a61b47..3dc6864305 100644 --- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/AbstractLuceneIndex.java +++ b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/AbstractLuceneIndex.java @@ -33,7 +33,16 @@ import com.google.gerrit.server.index.Index; import com.google.gerrit.server.index.IndexUtils; import com.google.gerrit.server.index.Schema; import com.google.gerrit.server.index.Schema.Values; - +import java.io.IOException; +import java.sql.Timestamp; +import java.util.Set; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.Field.Store; @@ -55,21 +64,9 @@ import org.apache.lucene.store.Directory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.sql.Timestamp; -import java.util.Set; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Executor; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - /** Basic Lucene index implementation. */ public abstract class AbstractLuceneIndex implements Index { - private static final Logger log = - LoggerFactory.getLogger(AbstractLuceneIndex.class); + private static final Logger log = LoggerFactory.getLogger(AbstractLuceneIndex.class); static String sortFieldName(FieldDef f) { return f.getName() + "_SORT"; @@ -93,7 +90,8 @@ public abstract class AbstractLuceneIndex implements Index { String name, String subIndex, GerritIndexWriterConfig writerConfig, - SearcherFactory searcherFactory) throws IOException { + SearcherFactory searcherFactory) + throws IOException { this.schema = schema; this.sitePaths = sitePaths; this.dir = dir; @@ -105,18 +103,21 @@ public abstract class AbstractLuceneIndex implements Index { if (commitPeriod < 0) { delegateWriter = new AutoCommitWriter(dir, writerConfig.getLuceneConfig()); } else if (commitPeriod == 0) { - delegateWriter = - new AutoCommitWriter(dir, writerConfig.getLuceneConfig(), true); + delegateWriter = new AutoCommitWriter(dir, writerConfig.getLuceneConfig(), true); } else { final AutoCommitWriter autoCommitWriter = new AutoCommitWriter(dir, writerConfig.getLuceneConfig()); delegateWriter = autoCommitWriter; - autoCommitExecutor = new ScheduledThreadPoolExecutor(1, new ThreadFactoryBuilder() - .setNameFormat(index + " Commit-%d") - .setDaemon(true) - .build()); - autoCommitExecutor.scheduleAtFixedRate(new Runnable() { + autoCommitExecutor = + new ScheduledThreadPoolExecutor( + 1, + new ThreadFactoryBuilder() + .setNameFormat(index + " Commit-%d") + .setDaemon(true) + .build()); + autoCommitExecutor.scheduleAtFixedRate( + new Runnable() { @Override public void run() { try { @@ -131,34 +132,42 @@ public abstract class AbstractLuceneIndex implements Index { try { autoCommitWriter.close(); } catch (IOException e2) { - log.error("SEVERE: Error closing " + index - + " Lucene index after OOM; index may be corrupted.", e); + log.error( + "SEVERE: Error closing " + + index + + " Lucene index after OOM; index may be corrupted.", + e); } } } - }, commitPeriod, commitPeriod, MILLISECONDS); + }, + commitPeriod, + commitPeriod, + MILLISECONDS); } writer = new TrackingIndexWriter(delegateWriter); - searcherManager = new WrappableSearcherManager( - writer.getIndexWriter(), true, searcherFactory); + searcherManager = new WrappableSearcherManager(writer.getIndexWriter(), true, searcherFactory); notDoneNrtFutures = Sets.newConcurrentHashSet(); - writerThread = MoreExecutors.listeningDecorator( - Executors.newFixedThreadPool(1, - new ThreadFactoryBuilder() - .setNameFormat(index + " Write-%d") - .setDaemon(true) - .build())); + writerThread = + MoreExecutors.listeningDecorator( + Executors.newFixedThreadPool( + 1, + new ThreadFactoryBuilder() + .setNameFormat(index + " Write-%d") + .setDaemon(true) + .build())); - reopenThread = new ControlledRealTimeReopenThread<>( - writer, searcherManager, - 0.500 /* maximum stale age (seconds) */, - 0.010 /* minimum stale age (seconds) */); + reopenThread = + new ControlledRealTimeReopenThread<>( + writer, + searcherManager, + 0.500 /* maximum stale age (seconds) */, + 0.010 /* minimum stale age (seconds) */); reopenThread.setName(index + " NRT"); - reopenThread.setPriority(Math.min( - Thread.currentThread().getPriority() + 2, - Thread.MAX_PRIORITY)); + reopenThread.setPriority( + Math.min(Thread.currentThread().getPriority() + 2, Thread.MAX_PRIORITY)); reopenThread.setDaemon(true); // This must be added after the reopen thread is created. The reopen thread @@ -169,18 +178,18 @@ public abstract class AbstractLuceneIndex implements Index { // internal listener needs to be called first. // TODO(dborowitz): This may have been fixed by // http://issues.apache.org/jira/browse/LUCENE-5461 - searcherManager.addListener(new RefreshListener() { - @Override - public void beforeRefresh() throws IOException { - } + searcherManager.addListener( + new RefreshListener() { + @Override + public void beforeRefresh() throws IOException {} - @Override - public void afterRefresh(boolean didRefresh) throws IOException { - for (NrtFuture f : notDoneNrtFutures) { - f.removeIfDone(); - } - } - }); + @Override + public void afterRefresh(boolean didRefresh) throws IOException { + for (NrtFuture f : notDoneNrtFutures) { + f.removeIfDone(); + } + } + }); reopenThread.start(); } @@ -202,8 +211,7 @@ public abstract class AbstractLuceneIndex implements Index { log.warn("shutting down " + name + " index with pending Lucene writes"); } } catch (InterruptedException e) { - log.warn("interrupted waiting for pending Lucene writes of " + name + - " index", e); + log.warn("interrupted waiting for pending Lucene writes of " + name + " index", e); } reopenThread.close(); @@ -235,44 +243,48 @@ public abstract class AbstractLuceneIndex implements Index { } ListenableFuture insert(final Document doc) { - return submit(new Callable() { - @Override - public Long call() throws IOException, InterruptedException { - return writer.addDocument(doc); - } - }); + return submit( + new Callable() { + @Override + public Long call() throws IOException, InterruptedException { + return writer.addDocument(doc); + } + }); } ListenableFuture replace(final Term term, final Document doc) { - return submit(new Callable() { - @Override - public Long call() throws IOException, InterruptedException { - return writer.updateDocument(term, doc); - } - }); + return submit( + new Callable() { + @Override + public Long call() throws IOException, InterruptedException { + return writer.updateDocument(term, doc); + } + }); } ListenableFuture delete(final Term term) { - return submit(new Callable() { - @Override - public Long call() throws IOException, InterruptedException { - return writer.deleteDocuments(term); - } - }); + return submit( + new Callable() { + @Override + public Long call() throws IOException, InterruptedException { + return writer.deleteDocuments(term); + } + }); } private ListenableFuture submit(Callable task) { - ListenableFuture future = - Futures.nonCancellationPropagating(writerThread.submit(task)); - return Futures.transformAsync(future, new AsyncFunction() { - @Override - public ListenableFuture apply(Long gen) throws InterruptedException { - // Tell the reopen thread a future is waiting on this - // generation so it uses the min stale time when refreshing. - reopenThread.waitForGeneration(gen, 0); - return new NrtFuture(gen); - } - }); + ListenableFuture future = Futures.nonCancellationPropagating(writerThread.submit(task)); + return Futures.transformAsync( + future, + new AsyncFunction() { + @Override + public ListenableFuture apply(Long gen) throws InterruptedException { + // Tell the reopen thread a future is waiting on this + // generation so it uses the min stale time when refreshing. + reopenThread.waitForGeneration(gen, 0); + return new NrtFuture(gen); + } + }); } @Override @@ -319,8 +331,7 @@ public abstract class AbstractLuceneIndex implements Index { for (Object value : values.getValues()) { doc.add(new LongField(name, ((Timestamp) value).getTime(), store)); } - } else if (type == FieldType.EXACT - || type == FieldType.PREFIX) { + } else if (type == FieldType.EXACT || type == FieldType.PREFIX) { for (Object value : values.getValues()) { doc.add(new StringField(name, (String) value, store)); } @@ -358,8 +369,8 @@ public abstract class AbstractLuceneIndex implements Index { } @Override - public Void get(long timeout, TimeUnit unit) throws InterruptedException, - TimeoutException, ExecutionException { + public Void get(long timeout, TimeUnit unit) + throws InterruptedException, TimeoutException, ExecutionException { if (!isDone()) { if (!reopenThread.waitForGeneration(gen, (int) unit.toMillis(timeout))) { throw new TimeoutException(); diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/AutoCommitWriter.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/AutoCommitWriter.java index 4a53fc6f10..7a418aa8ca 100644 --- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/AutoCommitWriter.java +++ b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/AutoCommitWriter.java @@ -14,6 +14,7 @@ package com.google.gerrit.lucene; +import java.io.IOException; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; @@ -22,26 +23,22 @@ import org.apache.lucene.index.Term; import org.apache.lucene.search.Query; import org.apache.lucene.store.Directory; -import java.io.IOException; - /** Writer that optionally flushes/commits after every write. */ public class AutoCommitWriter extends IndexWriter { private boolean autoCommit; - AutoCommitWriter(Directory dir, IndexWriterConfig config) - throws IOException { + AutoCommitWriter(Directory dir, IndexWriterConfig config) throws IOException { this(dir, config, false); } - AutoCommitWriter(Directory dir, IndexWriterConfig config, boolean autoCommit) - throws IOException { + AutoCommitWriter(Directory dir, IndexWriterConfig config, boolean autoCommit) throws IOException { super(dir, config); setAutoCommit(autoCommit); } /** - * This method will override Gerrit configuration index.name.commitWithin - * until next Gerrit restart (or reconfiguration through this method). + * This method will override Gerrit configuration index.name.commitWithin until next Gerrit + * restart (or reconfiguration through this method). * * @param enable auto commit */ @@ -50,23 +47,21 @@ public class AutoCommitWriter extends IndexWriter { } @Override - public void addDocument(Iterable doc) - throws IOException { + public void addDocument(Iterable doc) throws IOException { super.addDocument(doc); autoFlush(); } @Override - public void addDocuments( - Iterable> docs) + public void addDocuments(Iterable> docs) throws IOException { super.addDocuments(docs); autoFlush(); } @Override - public void updateDocuments(Term delTerm, - Iterable> docs) + public void updateDocuments( + Term delTerm, Iterable> docs) throws IOException { super.updateDocuments(delTerm, docs); autoFlush(); @@ -95,8 +90,7 @@ public class AutoCommitWriter extends IndexWriter { } @Override - public void updateDocument(Term term, Iterable doc) - throws IOException { + public void updateDocument(Term term, Iterable doc) throws IOException { super.updateDocument(term, doc); autoFlush(); } diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/ChangeSubIndex.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/ChangeSubIndex.java index 6f0df0f7bb..58117b8695 100644 --- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/ChangeSubIndex.java +++ b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/ChangeSubIndex.java @@ -31,17 +31,15 @@ import com.google.gerrit.server.query.DataSource; import com.google.gerrit.server.query.Predicate; import com.google.gerrit.server.query.QueryParseException; import com.google.gerrit.server.query.change.ChangeData; - +import java.io.IOException; +import java.nio.file.Path; +import java.sql.Timestamp; import org.apache.lucene.document.Document; import org.apache.lucene.document.NumericDocValuesField; import org.apache.lucene.search.SearcherFactory; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; -import java.io.IOException; -import java.nio.file.Path; -import java.sql.Timestamp; - public class ChangeSubIndex extends AbstractLuceneIndex implements ChangeIndex { ChangeSubIndex( @@ -49,9 +47,15 @@ public class ChangeSubIndex extends AbstractLuceneIndex SitePaths sitePaths, Path path, GerritIndexWriterConfig writerConfig, - SearcherFactory searcherFactory) throws IOException { - this(schema, sitePaths, FSDirectory.open(path), - path.getFileName().toString(), writerConfig, searcherFactory); + SearcherFactory searcherFactory) + throws IOException { + this( + schema, + sitePaths, + FSDirectory.open(path), + path.getFileName().toString(), + writerConfig, + searcherFactory); } ChangeSubIndex( @@ -60,28 +64,25 @@ public class ChangeSubIndex extends AbstractLuceneIndex Directory dir, String subIndex, GerritIndexWriterConfig writerConfig, - SearcherFactory searcherFactory) throws IOException { - super(schema, sitePaths, dir, NAME, subIndex, writerConfig, - searcherFactory); + SearcherFactory searcherFactory) + throws IOException { + super(schema, sitePaths, dir, NAME, subIndex, writerConfig, searcherFactory); } @Override public void replace(ChangeData obj) throws IOException { - throw new UnsupportedOperationException( - "don't use ChangeSubIndex directly"); + throw new UnsupportedOperationException("don't use ChangeSubIndex directly"); } @Override public void delete(Change.Id key) throws IOException { - throw new UnsupportedOperationException( - "don't use ChangeSubIndex directly"); + throw new UnsupportedOperationException("don't use ChangeSubIndex directly"); } @Override - public DataSource getSource(Predicate p, - QueryOptions opts) throws QueryParseException { - throw new UnsupportedOperationException( - "don't use ChangeSubIndex directly"); + public DataSource getSource(Predicate p, QueryOptions opts) + throws QueryParseException { + throw new UnsupportedOperationException("don't use ChangeSubIndex directly"); } @Override diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/CustomMappingAnalyzer.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/CustomMappingAnalyzer.java index 3d7faeb443..acbedb1996 100644 --- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/CustomMappingAnalyzer.java +++ b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/CustomMappingAnalyzer.java @@ -14,36 +14,32 @@ package com.google.gerrit.lucene; +import java.io.Reader; +import java.util.Map; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.AnalyzerWrapper; import org.apache.lucene.analysis.charfilter.MappingCharFilter; import org.apache.lucene.analysis.charfilter.NormalizeCharMap; -import java.io.Reader; -import java.util.Map; - /** * This analyzer can be used to provide custom char mappings. * *

Example usage: * - *

- * {@code
+ * 
{@code
  * Map customMapping = new HashMap<>();
  * customMapping.put("_", " ");
  * customMapping.put(".", " ");
  *
  * CustomMappingAnalyzer analyzer =
  *   new CustomMappingAnalyzer(new StandardAnalyzer(version), customMapping);
- * }
- * 
+ * }
*/ public class CustomMappingAnalyzer extends AnalyzerWrapper { private Analyzer delegate; private Map customMappings; - public CustomMappingAnalyzer(Analyzer delegate, - Map customMappings) { + public CustomMappingAnalyzer(Analyzer delegate, Map customMappings) { super(delegate.getReuseStrategy()); this.delegate = delegate; this.customMappings = customMappings; diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/GerritIndexWriterConfig.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/GerritIndexWriterConfig.java index 36145c6595..4f2fc4e06e 100644 --- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/GerritIndexWriterConfig.java +++ b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/GerritIndexWriterConfig.java @@ -19,19 +19,14 @@ import static java.util.concurrent.TimeUnit.MINUTES; import com.google.common.collect.ImmutableMap; import com.google.gerrit.server.config.ConfigUtil; - +import java.util.Map; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.analysis.util.CharArraySet; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.index.IndexWriterConfig.OpenMode; import org.eclipse.jgit.lib.Config; -import java.util.Map; - -/** - * Combination of Lucene {@link IndexWriterConfig} with additional - * Gerrit-specific options. - */ +/** Combination of Lucene {@link IndexWriterConfig} with additional Gerrit-specific options. */ class GerritIndexWriterConfig { private static final Map CUSTOM_CHAR_MAPPING = ImmutableMap.of("_", " ", ".", " "); @@ -42,22 +37,26 @@ class GerritIndexWriterConfig { GerritIndexWriterConfig(Config cfg, String name) { analyzer = - new CustomMappingAnalyzer(new StandardAnalyzer( - CharArraySet.EMPTY_SET), CUSTOM_CHAR_MAPPING); - luceneConfig = new IndexWriterConfig(analyzer) - .setOpenMode(OpenMode.CREATE_OR_APPEND) - .setCommitOnClose(true); + new CustomMappingAnalyzer( + new StandardAnalyzer(CharArraySet.EMPTY_SET), CUSTOM_CHAR_MAPPING); + luceneConfig = + new IndexWriterConfig(analyzer) + .setOpenMode(OpenMode.CREATE_OR_APPEND) + .setCommitOnClose(true); double m = 1 << 20; - luceneConfig.setRAMBufferSizeMB(cfg.getLong( - "index", name, "ramBufferSize", - (long) (IndexWriterConfig.DEFAULT_RAM_BUFFER_SIZE_MB * m)) / m); - luceneConfig.setMaxBufferedDocs(cfg.getInt( - "index", name, "maxBufferedDocs", - IndexWriterConfig.DEFAULT_MAX_BUFFERED_DOCS)); + luceneConfig.setRAMBufferSizeMB( + cfg.getLong( + "index", + name, + "ramBufferSize", + (long) (IndexWriterConfig.DEFAULT_RAM_BUFFER_SIZE_MB * m)) + / m); + luceneConfig.setMaxBufferedDocs( + cfg.getInt("index", name, "maxBufferedDocs", IndexWriterConfig.DEFAULT_MAX_BUFFERED_DOCS)); try { commitWithinMs = - ConfigUtil.getTimeUnit(cfg, "index", name, "commitWithin", - MILLISECONDS.convert(5, MINUTES), MILLISECONDS); + ConfigUtil.getTimeUnit( + cfg, "index", name, "commitWithin", MILLISECONDS.convert(5, MINUTES), MILLISECONDS); } catch (IllegalArgumentException e) { commitWithinMs = cfg.getLong("index", name, "commitWithin", 0); } diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneAccountIndex.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneAccountIndex.java index cfcf6dc669..fbde7beffe 100644 --- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneAccountIndex.java +++ b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneAccountIndex.java @@ -33,7 +33,13 @@ import com.google.gwtorm.server.ResultSet; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; - +import java.io.IOException; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.concurrent.ExecutionException; import org.apache.lucene.document.Document; import org.apache.lucene.index.Term; import org.apache.lucene.search.IndexSearcher; @@ -50,19 +56,9 @@ import org.eclipse.jgit.lib.Config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.concurrent.ExecutionException; - -public class LuceneAccountIndex - extends AbstractLuceneIndex +public class LuceneAccountIndex extends AbstractLuceneIndex implements AccountIndex { - private static final Logger log = - LoggerFactory.getLogger(LuceneAccountIndex.class); + private static final Logger log = LoggerFactory.getLogger(LuceneAccountIndex.class); private static final String ACCOUNTS = "accounts"; @@ -80,13 +76,12 @@ public class LuceneAccountIndex private final QueryBuilder queryBuilder; private final Provider accountCache; - private static Directory dir(Schema schema, Config cfg, - SitePaths sitePaths) throws IOException { + private static Directory dir(Schema schema, Config cfg, SitePaths sitePaths) + throws IOException { if (LuceneIndexModule.isInMemoryTest(cfg)) { return new RAMDirectory(); } - Path indexDir = - LuceneVersionManager.getDir(sitePaths, ACCOUNTS + "_", schema); + Path indexDir = LuceneVersionManager.getDir(sitePaths, ACCOUNTS + "_", schema); return FSDirectory.open(indexDir); } @@ -95,13 +90,19 @@ public class LuceneAccountIndex @GerritServerConfig Config cfg, SitePaths sitePaths, Provider accountCache, - @Assisted Schema schema) throws IOException { - super(schema, sitePaths, dir(schema, cfg, sitePaths), ACCOUNTS, null, - new GerritIndexWriterConfig(cfg, ACCOUNTS), new SearcherFactory()); + @Assisted Schema schema) + throws IOException { + super( + schema, + sitePaths, + dir(schema, cfg, sitePaths), + ACCOUNTS, + null, + new GerritIndexWriterConfig(cfg, ACCOUNTS), + new SearcherFactory()); this.accountCache = accountCache; - indexWriterConfig = - new GerritIndexWriterConfig(cfg, ACCOUNTS); + indexWriterConfig = new GerritIndexWriterConfig(cfg, ACCOUNTS); queryBuilder = new QueryBuilder<>(schema, indexWriterConfig.getAnalyzer()); } @@ -125,13 +126,12 @@ public class LuceneAccountIndex } @Override - public DataSource getSource(Predicate p, - QueryOptions opts) throws QueryParseException { + public DataSource getSource(Predicate p, QueryOptions opts) + throws QueryParseException { return new QuerySource( opts, queryBuilder.toQuery(p), - new Sort( - new SortField(ID_SORT_FIELD, SortField.Type.LONG, true))); + new Sort(new SortField(ID_SORT_FIELD, SortField.Type.LONG, true))); } private class QuerySource implements DataSource { @@ -198,8 +198,7 @@ public class LuceneAccountIndex } private AccountState toAccountState(Document doc) { - Account.Id id = - new Account.Id(doc.getField(ID.getName()).numericValue().intValue()); + Account.Id id = new Account.Id(doc.getField(ID.getName()).numericValue().intValue()); // Use the AccountCache rather than depending on any stored fields in the // document (of which there shouldn't be any). The most expensive part to // compute anyway is the effective group IDs, and we don't have a good way diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java index 688d4e780c..5477b31aca 100644 --- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java +++ b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java @@ -64,7 +64,18 @@ import com.google.gwtorm.server.ResultSet; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - +import java.io.IOException; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; import org.apache.lucene.document.Document; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexableField; @@ -84,30 +95,15 @@ import org.eclipse.jgit.lib.Config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; - /** * Secondary index implementation using Apache Lucene. - *

- * Writes are managed using a single {@link IndexWriter} per process, committed - * aggressively. Reads use {@link SearcherManager} and periodically refresh, - * though there may be some lag between a committed write and it showing up to - * other threads' searchers. + * + *

Writes are managed using a single {@link IndexWriter} per process, committed aggressively. + * Reads use {@link SearcherManager} and periodically refresh, though there may be some lag between + * a committed write and it showing up to other threads' searchers. */ public class LuceneChangeIndex implements ChangeIndex { - private static final Logger log = - LoggerFactory.getLogger(LuceneChangeIndex.class); + private static final Logger log = LoggerFactory.getLogger(LuceneChangeIndex.class); static final String UPDATED_SORT_FIELD = sortFieldName(ChangeField.UPDATED); static final String ID_SORT_FIELD = sortFieldName(ChangeField.LEGACY_ID); @@ -122,13 +118,10 @@ public class LuceneChangeIndex implements ChangeIndex { private static final String MERGEABLE_FIELD = ChangeField.MERGEABLE.getName(); private static final String PATCH_SET_FIELD = ChangeField.PATCH_SET.getName(); private static final String REF_STATE_FIELD = ChangeField.REF_STATE.getName(); - private static final String REF_STATE_PATTERN_FIELD = - ChangeField.REF_STATE_PATTERN.getName(); - private static final String REVIEWEDBY_FIELD = - ChangeField.REVIEWEDBY.getName(); + private static final String REF_STATE_PATTERN_FIELD = ChangeField.REF_STATE_PATTERN.getName(); + private static final String REVIEWEDBY_FIELD = ChangeField.REVIEWEDBY.getName(); private static final String REVIEWER_FIELD = ChangeField.REVIEWER.getName(); - private static final String HASHTAG_FIELD = - ChangeField.HASHTAG_CASE_AWARE.getName(); + private static final String HASHTAG_FIELD = ChangeField.HASHTAG_CASE_AWARE.getName(); private static final String STAR_FIELD = ChangeField.STAR.getName(); private static final String SUBMIT_RECORD_LENIENT_FIELD = ChangeField.STORED_SUBMIT_RECORD_LENIENT.getName(); @@ -156,43 +149,45 @@ public class LuceneChangeIndex implements ChangeIndex { LuceneChangeIndex( @GerritServerConfig Config cfg, SitePaths sitePaths, - @IndexExecutor(INTERACTIVE) ListeningExecutorService executor, + @IndexExecutor(INTERACTIVE) ListeningExecutorService executor, Provider db, ChangeData.Factory changeDataFactory, FillArgs fillArgs, - @Assisted Schema schema) throws IOException { + @Assisted Schema schema) + throws IOException { this.fillArgs = fillArgs; this.executor = executor; this.db = db; this.changeDataFactory = changeDataFactory; this.schema = schema; - GerritIndexWriterConfig openConfig = - new GerritIndexWriterConfig(cfg, "changes_open"); - GerritIndexWriterConfig closedConfig = - new GerritIndexWriterConfig(cfg, "changes_closed"); + GerritIndexWriterConfig openConfig = new GerritIndexWriterConfig(cfg, "changes_open"); + GerritIndexWriterConfig closedConfig = new GerritIndexWriterConfig(cfg, "changes_closed"); queryBuilder = new QueryBuilder<>(schema, openConfig.getAnalyzer()); SearcherFactory searcherFactory = new SearcherFactory(); if (LuceneIndexModule.isInMemoryTest(cfg)) { - openIndex = new ChangeSubIndex(schema, sitePaths, new RAMDirectory(), - "ramOpen", openConfig, searcherFactory); - closedIndex = new ChangeSubIndex(schema, sitePaths, new RAMDirectory(), - "ramClosed", closedConfig, searcherFactory); + openIndex = + new ChangeSubIndex( + schema, sitePaths, new RAMDirectory(), "ramOpen", openConfig, searcherFactory); + closedIndex = + new ChangeSubIndex( + schema, sitePaths, new RAMDirectory(), "ramClosed", closedConfig, searcherFactory); } else { Path dir = LuceneVersionManager.getDir(sitePaths, CHANGES_PREFIX, schema); - openIndex = new ChangeSubIndex(schema, sitePaths, - dir.resolve(CHANGES_OPEN), openConfig, searcherFactory); - closedIndex = new ChangeSubIndex(schema, sitePaths, - dir.resolve(CHANGES_CLOSED), closedConfig, searcherFactory); + openIndex = + new ChangeSubIndex( + schema, sitePaths, dir.resolve(CHANGES_OPEN), openConfig, searcherFactory); + closedIndex = + new ChangeSubIndex( + schema, sitePaths, dir.resolve(CHANGES_CLOSED), closedConfig, searcherFactory); } } @Override public void stop() { - MoreExecutors.shutdownAndAwaitTermination( - executor, Long.MAX_VALUE, TimeUnit.SECONDS); + MoreExecutors.shutdownAndAwaitTermination(executor, Long.MAX_VALUE, TimeUnit.SECONDS); } @Override @@ -217,13 +212,9 @@ public class LuceneChangeIndex implements ChangeIndex { Document doc = openIndex.toDocument(cd, fillArgs); try { if (cd.change().getStatus().isOpen()) { - Futures.allAsList( - closedIndex.delete(id), - openIndex.replace(id, doc)).get(); + Futures.allAsList(closedIndex.delete(id), openIndex.replace(id, doc)).get(); } else { - Futures.allAsList( - openIndex.delete(id), - closedIndex.replace(id, doc)).get(); + Futures.allAsList(openIndex.delete(id), closedIndex.replace(id, doc)).get(); } } catch (OrmException | ExecutionException | InterruptedException e) { throw new IOException(e); @@ -234,9 +225,7 @@ public class LuceneChangeIndex implements ChangeIndex { public void delete(Change.Id id) throws IOException { Term idTerm = LuceneChangeIndex.idTerm(id); try { - Futures.allAsList( - openIndex.delete(idTerm), - closedIndex.delete(idTerm)).get(); + Futures.allAsList(openIndex.delete(idTerm), closedIndex.delete(idTerm)).get(); } catch (ExecutionException | InterruptedException e) { throw new IOException(e); } @@ -286,14 +275,12 @@ public class LuceneChangeIndex implements ChangeIndex { private final QueryOptions opts; private final Sort sort; - - private QuerySource(List indexes, - Predicate predicate, QueryOptions opts, Sort sort) + private QuerySource( + List indexes, Predicate predicate, QueryOptions opts, Sort sort) throws QueryParseException { this.indexes = indexes; this.predicate = predicate; - this.query = checkNotNull(queryBuilder.toQuery(predicate), - "null query from Lucene"); + this.query = checkNotNull(queryBuilder.toQuery(predicate), "null query from Lucene"); this.opts = opts; this.sort = sort; } @@ -322,17 +309,19 @@ public class LuceneChangeIndex implements ChangeIndex { final Set fields = IndexUtils.changeFields(opts); return new ChangeDataResults( - executor.submit(new Callable>() { - @Override - public List call() throws IOException { - return doRead(fields); - } + executor.submit( + new Callable>() { + @Override + public List call() throws IOException { + return doRead(fields); + } - @Override - public String toString() { - return predicate.toString(); - } - }), fields); + @Override + public String toString() { + return predicate.toString(); + } + }), + fields); } private List doRead(Set fields) throws IOException { @@ -408,8 +397,7 @@ public class LuceneChangeIndex implements ChangeIndex { } } - private static ListMultimap fields(Document doc, - Set fields) { + private static ListMultimap fields(Document doc, Set fields) { ListMultimap stored = MultimapBuilder.hashKeys(fields.size()).arrayListValues(4).build(); for (IndexableField f : doc) { @@ -421,16 +409,17 @@ public class LuceneChangeIndex implements ChangeIndex { return stored; } - private ChangeData toChangeData(ListMultimap doc, - Set fields, String idFieldName) { + private ChangeData toChangeData( + ListMultimap doc, Set fields, String idFieldName) { ChangeData cd; // Either change or the ID field was guaranteed to be included in the call // to fields() above. IndexableField cb = Iterables.getFirst(doc.get(CHANGE_FIELD), null); if (cb != null) { BytesRef proto = cb.binaryValue(); - cd = changeDataFactory.create(db.get(), - ChangeProtoField.CODEC.decode(proto.bytes, proto.offset, proto.length)); + cd = + changeDataFactory.create( + db.get(), ChangeProtoField.CODEC.decode(proto.bytes, proto.offset, proto.length)); } else { IndexableField f = Iterables.getFirst(doc.get(idFieldName), null); Change.Id id = new Change.Id(f.numericValue().intValue()); @@ -440,8 +429,7 @@ public class LuceneChangeIndex implements ChangeIndex { // disabled. cd = changeDataFactory.createOnlyWhenNoteDbDisabled(db.get(), id); } else { - cd = changeDataFactory.create( - db.get(), new Project.NameKey(project.stringValue()), id); + cd = changeDataFactory.create(db.get(), new Project.NameKey(project.stringValue()), id); } } @@ -469,10 +457,10 @@ public class LuceneChangeIndex implements ChangeIndex { if (fields.contains(REVIEWER_FIELD)) { decodeReviewers(doc, cd); } - decodeSubmitRecords(doc, SUBMIT_RECORD_STRICT_FIELD, - ChangeField.SUBMIT_RULE_OPTIONS_STRICT, cd); - decodeSubmitRecords(doc, SUBMIT_RECORD_LENIENT_FIELD, - ChangeField.SUBMIT_RULE_OPTIONS_LENIENT, cd); + decodeSubmitRecords( + doc, SUBMIT_RECORD_STRICT_FIELD, ChangeField.SUBMIT_RULE_OPTIONS_STRICT, cd); + decodeSubmitRecords( + doc, SUBMIT_RECORD_LENIENT_FIELD, ChangeField.SUBMIT_RULE_OPTIONS_LENIENT, cd); if (fields.contains(REF_STATE_FIELD)) { decodeRefStates(doc, cd); } @@ -482,10 +470,8 @@ public class LuceneChangeIndex implements ChangeIndex { return cd; } - private void decodePatchSets(ListMultimap doc, - ChangeData cd) { - List patchSets = - decodeProtos(doc, PATCH_SET_FIELD, PatchSetProtoField.CODEC); + private void decodePatchSets(ListMultimap doc, ChangeData cd) { + List patchSets = decodeProtos(doc, PATCH_SET_FIELD, PatchSetProtoField.CODEC); if (!patchSets.isEmpty()) { // Will be an empty list for schemas prior to when this field was stored; // this cannot be valid since a change needs at least one patch set. @@ -493,20 +479,15 @@ public class LuceneChangeIndex implements ChangeIndex { } } - private void decodeApprovals(ListMultimap doc, - ChangeData cd) { - cd.setCurrentApprovals( - decodeProtos(doc, APPROVAL_FIELD, PatchSetApprovalProtoField.CODEC)); + private void decodeApprovals(ListMultimap doc, ChangeData cd) { + cd.setCurrentApprovals(decodeProtos(doc, APPROVAL_FIELD, PatchSetApprovalProtoField.CODEC)); } - private void decodeChangedLines(ListMultimap doc, - ChangeData cd) { + private void decodeChangedLines(ListMultimap doc, ChangeData cd) { IndexableField added = Iterables.getFirst(doc.get(ADDED_FIELD), null); IndexableField deleted = Iterables.getFirst(doc.get(DELETED_FIELD), null); if (added != null && deleted != null) { - cd.setChangedLines( - added.numericValue().intValue(), - deleted.numericValue().intValue()); + cd.setChangedLines(added.numericValue().intValue(), deleted.numericValue().intValue()); } else { // No ChangedLines stored, likely due to failure during reindexing, for // example due to LargeObjectException. But we know the field was @@ -516,8 +497,7 @@ public class LuceneChangeIndex implements ChangeIndex { } } - private void decodeMergeable(ListMultimap doc, - ChangeData cd) { + private void decodeMergeable(ListMultimap doc, ChangeData cd) { IndexableField f = Iterables.getFirst(doc.get(MERGEABLE_FIELD), null); if (f != null) { String mergeable = f.stringValue(); @@ -529,12 +509,10 @@ public class LuceneChangeIndex implements ChangeIndex { } } - private void decodeReviewedBy(ListMultimap doc, - ChangeData cd) { + private void decodeReviewedBy(ListMultimap doc, ChangeData cd) { Collection reviewedBy = doc.get(REVIEWEDBY_FIELD); if (reviewedBy.size() > 0) { - Set accounts = - Sets.newHashSetWithExpectedSize(reviewedBy.size()); + Set accounts = Sets.newHashSetWithExpectedSize(reviewedBy.size()); for (IndexableField r : reviewedBy) { int id = r.numericValue().intValue(); if (reviewedBy.size() == 1 && id == ChangeField.NOT_REVIEWED) { @@ -546,8 +524,7 @@ public class LuceneChangeIndex implements ChangeIndex { } } - private void decodeHashtags(ListMultimap doc, - ChangeData cd) { + private void decodeHashtags(ListMultimap doc, ChangeData cd) { Collection hashtag = doc.get(HASHTAG_FIELD); Set hashtags = Sets.newHashSetWithExpectedSize(hashtag.size()); for (IndexableField r : hashtag) { @@ -556,14 +533,11 @@ public class LuceneChangeIndex implements ChangeIndex { cd.setHashtags(hashtags); } - private void decodeStar(ListMultimap doc, - ChangeData cd) { + private void decodeStar(ListMultimap doc, ChangeData cd) { Collection star = doc.get(STAR_FIELD); - ListMultimap stars = - MultimapBuilder.hashKeys().arrayListValues().build(); + ListMultimap stars = MultimapBuilder.hashKeys().arrayListValues().build(); for (IndexableField r : star) { - StarredChangesUtil.StarField starField = - StarredChangesUtil.StarField.parse(r.stringValue()); + StarredChangesUtil.StarField starField = StarredChangesUtil.StarField.parse(r.stringValue()); if (starField != null) { stars.put(starField.accountId(), starField.label()); } @@ -571,35 +545,31 @@ public class LuceneChangeIndex implements ChangeIndex { cd.setStars(stars); } - private void decodeReviewers(ListMultimap doc, - ChangeData cd) { + private void decodeReviewers(ListMultimap doc, ChangeData cd) { cd.setReviewers( ChangeField.parseReviewerFieldValues( - FluentIterable.from(doc.get(REVIEWER_FIELD)) - .transform(IndexableField::stringValue))); + FluentIterable.from(doc.get(REVIEWER_FIELD)).transform(IndexableField::stringValue))); } - private void decodeSubmitRecords(ListMultimap doc, - String field, SubmitRuleOptions opts, ChangeData cd) { - ChangeField.parseSubmitRecords( - Collections2.transform( - doc.get(field), f -> f.binaryValue().utf8ToString()), - opts, cd); - } - - private void decodeRefStates(ListMultimap doc, + private void decodeSubmitRecords( + ListMultimap doc, + String field, + SubmitRuleOptions opts, ChangeData cd) { + ChangeField.parseSubmitRecords( + Collections2.transform(doc.get(field), f -> f.binaryValue().utf8ToString()), opts, cd); + } + + private void decodeRefStates(ListMultimap doc, ChangeData cd) { cd.setRefStates(copyAsBytes(doc.get(REF_STATE_FIELD))); } - private void decodeRefStatePatterns(ListMultimap doc, - ChangeData cd) { + private void decodeRefStatePatterns(ListMultimap doc, ChangeData cd) { cd.setRefStatePatterns(copyAsBytes(doc.get(REF_STATE_PATTERN_FIELD))); } private static List decodeProtos( - ListMultimap doc, - String fieldName, ProtobufCodec codec) { + ListMultimap doc, String fieldName, ProtobufCodec codec) { Collection fields = doc.get(fieldName); if (fields.isEmpty()) { return Collections.emptyList(); @@ -614,7 +584,8 @@ public class LuceneChangeIndex implements ChangeIndex { } private static List copyAsBytes(Collection fields) { - return fields.stream() + return fields + .stream() .map( f -> { BytesRef ref = f.binaryValue(); diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneGroupIndex.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneGroupIndex.java index aef485c742..c4f10ffd35 100644 --- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneGroupIndex.java +++ b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneGroupIndex.java @@ -32,7 +32,13 @@ import com.google.gwtorm.server.ResultSet; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; - +import java.io.IOException; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.concurrent.ExecutionException; import org.apache.lucene.document.Document; import org.apache.lucene.index.Term; import org.apache.lucene.search.IndexSearcher; @@ -49,18 +55,9 @@ import org.eclipse.jgit.lib.Config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.concurrent.ExecutionException; - -public class LuceneGroupIndex extends - AbstractLuceneIndex implements GroupIndex { - private static final Logger log = - LoggerFactory.getLogger(LuceneGroupIndex.class); +public class LuceneGroupIndex extends AbstractLuceneIndex + implements GroupIndex { + private static final Logger log = LoggerFactory.getLogger(LuceneGroupIndex.class); private static final String GROUPS = "groups"; @@ -78,13 +75,12 @@ public class LuceneGroupIndex extends private final QueryBuilder queryBuilder; private final Provider groupCache; - private static Directory dir(Schema schema, Config cfg, - SitePaths sitePaths) throws IOException { + private static Directory dir(Schema schema, Config cfg, SitePaths sitePaths) + throws IOException { if (LuceneIndexModule.isInMemoryTest(cfg)) { return new RAMDirectory(); } - Path indexDir = - LuceneVersionManager.getDir(sitePaths, GROUPS + "_", schema); + Path indexDir = LuceneVersionManager.getDir(sitePaths, GROUPS + "_", schema); return FSDirectory.open(indexDir); } @@ -93,13 +89,19 @@ public class LuceneGroupIndex extends @GerritServerConfig Config cfg, SitePaths sitePaths, Provider groupCache, - @Assisted Schema schema) throws IOException { - super(schema, sitePaths, dir(schema, cfg, sitePaths), GROUPS, null, - new GerritIndexWriterConfig(cfg, GROUPS), new SearcherFactory()); + @Assisted Schema schema) + throws IOException { + super( + schema, + sitePaths, + dir(schema, cfg, sitePaths), + GROUPS, + null, + new GerritIndexWriterConfig(cfg, GROUPS), + new SearcherFactory()); this.groupCache = groupCache; - indexWriterConfig = - new GerritIndexWriterConfig(cfg, GROUPS); + indexWriterConfig = new GerritIndexWriterConfig(cfg, GROUPS); queryBuilder = new QueryBuilder<>(schema, indexWriterConfig.getAnalyzer()); } @@ -123,9 +125,11 @@ public class LuceneGroupIndex extends } @Override - public DataSource getSource(Predicate p, - QueryOptions opts) throws QueryParseException { - return new QuerySource(opts, queryBuilder.toQuery(p), + public DataSource getSource(Predicate p, QueryOptions opts) + throws QueryParseException { + return new QuerySource( + opts, + queryBuilder.toQuery(p), new Sort(new SortField(UUID_SORT_FIELD, SortField.Type.STRING, false))); } @@ -190,8 +194,7 @@ public class LuceneGroupIndex extends } private AccountGroup toAccountGroup(Document doc) { - AccountGroup.UUID uuid = - new AccountGroup.UUID(doc.getField(UUID.getName()).stringValue()); + AccountGroup.UUID uuid = new AccountGroup.UUID(doc.getField(UUID.getName()).stringValue()); // Use the GroupCache rather than depending on any stored fields in the // document (of which there shouldn't be any). return groupCache.get().get(uuid); diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneIndexModule.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneIndexModule.java index 1d1ca95f24..699fd517bb 100644 --- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneIndexModule.java +++ b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneIndexModule.java @@ -26,15 +26,13 @@ import com.google.gerrit.server.index.group.GroupIndex; import com.google.inject.Provides; import com.google.inject.Singleton; import com.google.inject.assistedinject.FactoryModuleBuilder; - +import java.util.Map; import org.apache.lucene.search.BooleanQuery; import org.eclipse.jgit.lib.Config; -import java.util.Map; - public class LuceneIndexModule extends LifecycleModule { public static LuceneIndexModule singleVersionAllLatest(int threads) { - return new LuceneIndexModule(ImmutableMap. of(), threads); + return new LuceneIndexModule(ImmutableMap.of(), threads); } public static LuceneIndexModule singleVersionWithExplicitVersions( @@ -84,8 +82,8 @@ public class LuceneIndexModule extends LifecycleModule { @Provides @Singleton IndexConfig getIndexConfig(@GerritServerConfig Config cfg) { - BooleanQuery.setMaxClauseCount(cfg.getInt("index", "maxTerms", - BooleanQuery.getMaxClauseCount())); + BooleanQuery.setMaxClauseCount( + cfg.getInt("index", "maxTerms", BooleanQuery.getMaxClauseCount())); return IndexConfig.fromConfig(cfg); } diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneVersionManager.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneVersionManager.java index e95a1fb51e..94b3618e82 100644 --- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneVersionManager.java +++ b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneVersionManager.java @@ -32,12 +32,6 @@ import com.google.gerrit.server.index.Schema; import com.google.inject.Inject; import com.google.inject.ProvisionException; import com.google.inject.Singleton; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.Config; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.nio.file.DirectoryStream; import java.nio.file.Files; @@ -46,11 +40,14 @@ import java.util.Collection; import java.util.List; import java.util.Map; import java.util.TreeMap; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Singleton public class LuceneVersionManager implements LifecycleListener { - private static final Logger log = LoggerFactory - .getLogger(LuceneVersionManager.class); + private static final Logger log = LoggerFactory.getLogger(LuceneVersionManager.class); private static class Version { private final Schema schema; @@ -58,8 +55,7 @@ public class LuceneVersionManager implements LifecycleListener { private final boolean exists; private final boolean ready; - private Version(Schema schema, int version, boolean exists, - boolean ready) { + private Version(Schema schema, int version, boolean exists, boolean ready) { checkArgument(schema == null || schema.getVersion() == version); this.schema = schema; this.version = version; @@ -69,8 +65,7 @@ public class LuceneVersionManager implements LifecycleListener { } static Path getDir(SitePaths sitePaths, String prefix, Schema schema) { - return sitePaths.index_dir.resolve(String.format("%s%04d", - prefix, schema.getVersion())); + return sitePaths.index_dir.resolve(String.format("%s%04d", prefix, schema.getVersion())); } private final SitePaths sitePaths; @@ -93,9 +88,9 @@ public class LuceneVersionManager implements LifecycleListener { reindexers = Maps.newHashMapWithExpectedSize(defs.size()); onlineUpgrade = cfg.getBoolean("index", null, "onlineUpgrade", true); runReindexMsg = - "No index versions ready; run java -jar " + - sitePaths.gerrit_war.toAbsolutePath() + - " reindex"; + "No index versions ready; run java -jar " + + sitePaths.gerrit_war.toAbsolutePath() + + " reindex"; } @Override @@ -176,7 +171,7 @@ public class LuceneVersionManager implements LifecycleListener { /** * Start the online reindexer if the current index is not already the latest. * - * @param force start re-index + * @param force start re-index * @return true if started, otherwise false. * @throws ReindexerAlreadyRunningException */ @@ -208,24 +203,20 @@ public class LuceneVersionManager implements LifecycleListener { return false; } - private boolean isCurrentIndexVersionLatest( - String name, OnlineReindexer reindexer) { - int readVersion = defs.get(name).getIndexCollection().getSearchIndex() - .getSchema().getVersion(); - return reindexer == null - || reindexer.getVersion() == readVersion; + private boolean isCurrentIndexVersionLatest(String name, OnlineReindexer reindexer) { + int readVersion = defs.get(name).getIndexCollection().getSearchIndex().getSchema().getVersion(); + return reindexer == null || reindexer.getVersion() == readVersion; } - private static void validateReindexerNotRunning( - OnlineReindexer reindexer) + private static void validateReindexerNotRunning(OnlineReindexer reindexer) throws ReindexerAlreadyRunningException { if (reindexer != null && reindexer.isRunning()) { throw new ReindexerAlreadyRunningException(); } } - private > TreeMap> - scanVersions(IndexDefinition def, GerritIndexStatus cfg) { + private > TreeMap> scanVersions( + IndexDefinition def, GerritIndexStatus cfg) { TreeMap> versions = new TreeMap<>(); for (Schema schema : def.getSchemas().values()) { // This part is Lucene-specific. @@ -235,13 +226,11 @@ public class LuceneVersionManager implements LifecycleListener { log.warn("Not a directory: %s", p.toAbsolutePath()); } int v = schema.getVersion(); - versions.put(v, new Version<>( - schema, v, isDir, cfg.getReady(def.getName(), v))); + versions.put(v, new Version<>(schema, v, isDir, cfg.getReady(def.getName(), v))); } String prefix = def.getName() + "_"; - try (DirectoryStream paths = - Files.newDirectoryStream(sitePaths.index_dir)) { + try (DirectoryStream paths = Files.newDirectoryStream(sitePaths.index_dir)) { for (Path p : paths) { String n = p.getFileName().toString(); if (!n.startsWith(prefix)) { @@ -250,13 +239,11 @@ public class LuceneVersionManager implements LifecycleListener { String versionStr = n.substring(prefix.length()); Integer v = Ints.tryParse(versionStr); if (v == null || versionStr.length() != 4) { - log.warn("Unrecognized version in index directory: {}", - p.toAbsolutePath()); + log.warn("Unrecognized version in index directory: {}", p.toAbsolutePath()); continue; } if (!versions.containsKey(v)) { - versions.put(v, new Version( - null, v, true, cfg.getReady(def.getName(), v))); + versions.put(v, new Version(null, v, true, cfg.getReady(def.getName(), v))); } } } catch (IOException e) { @@ -265,8 +252,11 @@ public class LuceneVersionManager implements LifecycleListener { return versions; } - private void markNotReady(GerritIndexStatus cfg, String name, - Iterable> versions, Collection> inUse) { + private void markNotReady( + GerritIndexStatus cfg, + String name, + Iterable> versions, + Collection> inUse) { boolean dirty = false; for (Version v : versions) { if (!inUse.contains(v) && v.exists) { diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/QueryBuilder.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/QueryBuilder.java index cfec648f81..35033beb55 100644 --- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/QueryBuilder.java +++ b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/QueryBuilder.java @@ -32,7 +32,8 @@ import com.google.gerrit.server.query.NotPredicate; import com.google.gerrit.server.query.OrPredicate; import com.google.gerrit.server.query.Predicate; import com.google.gerrit.server.query.QueryParseException; - +import java.util.Date; +import java.util.List; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.index.Term; import org.apache.lucene.search.BooleanQuery; @@ -45,9 +46,6 @@ import org.apache.lucene.search.TermQuery; import org.apache.lucene.util.BytesRefBuilder; import org.apache.lucene.util.NumericUtils; -import java.util.Date; -import java.util.List; - public class QueryBuilder { static Term intTerm(String name, int value) { BytesRefBuilder builder = new BytesRefBuilder(); @@ -83,8 +81,7 @@ public class QueryBuilder { } } - private Query or(Predicate p) - throws QueryParseException { + private Query or(Predicate p) throws QueryParseException { try { BooleanQuery.Builder q = new BooleanQuery.Builder(); for (int i = 0; i < p.getChildCount(); i++) { @@ -96,8 +93,7 @@ public class QueryBuilder { } } - private Query and(Predicate p) - throws QueryParseException { + private Query and(Predicate p) throws QueryParseException { try { BooleanQuery.Builder b = new BooleanQuery.Builder(); List not = Lists.newArrayListWithCapacity(p.getChildCount()); @@ -123,8 +119,7 @@ public class QueryBuilder { } } - private Query not(Predicate p) - throws QueryParseException { + private Query not(Predicate p) throws QueryParseException { Predicate n = p.getChild(0); if (n instanceof TimestampRangePredicate) { return notTimestamp((TimestampRangePredicate) n); @@ -132,15 +127,16 @@ public class QueryBuilder { // Lucene does not support negation, start with all and subtract. return new BooleanQuery.Builder() - .add(new MatchAllDocsQuery(), MUST) - .add(toQuery(n), MUST_NOT) - .build(); + .add(new MatchAllDocsQuery(), MUST) + .add(toQuery(n), MUST_NOT) + .build(); } - private Query fieldQuery(IndexPredicate p) - throws QueryParseException { - checkArgument(schema.hasField(p.getField()), - "field not in schema v%s: %s", schema.getVersion(), + private Query fieldQuery(IndexPredicate p) throws QueryParseException { + checkArgument( + schema.hasField(p.getField()), + "field not in schema v%s: %s", + schema.getVersion(), p.getField().getName()); if (p.getType() == FieldType.INTEGER) { return intQuery(p); @@ -159,8 +155,7 @@ public class QueryBuilder { } } - private Query intQuery(IndexPredicate p) - throws QueryParseException { + private Query intQuery(IndexPredicate p) throws QueryParseException { int value; try { // Can't use IntPredicate because it and IndexPredicate are different @@ -172,49 +167,37 @@ public class QueryBuilder { return new TermQuery(intTerm(p.getField().getName(), value)); } - private Query intRangeQuery(IndexPredicate p) - throws QueryParseException { + private Query intRangeQuery(IndexPredicate p) throws QueryParseException { if (p instanceof IntegerRangePredicate) { - IntegerRangePredicate r = - (IntegerRangePredicate) p; + IntegerRangePredicate r = (IntegerRangePredicate) p; int minimum = r.getMinimumValue(); int maximum = r.getMaximumValue(); if (minimum == maximum) { // Just fall back to a standard integer query. return new TermQuery(intTerm(p.getField().getName(), minimum)); } - return NumericRangeQuery.newIntRange( - r.getField().getName(), - minimum, - maximum, - true, - true); + return NumericRangeQuery.newIntRange(r.getField().getName(), minimum, maximum, true, true); } throw new QueryParseException("not an integer range: " + p); } - private Query timestampQuery(IndexPredicate p) - throws QueryParseException { + private Query timestampQuery(IndexPredicate p) throws QueryParseException { if (p instanceof TimestampRangePredicate) { - TimestampRangePredicate r = - (TimestampRangePredicate) p; + TimestampRangePredicate r = (TimestampRangePredicate) p; return NumericRangeQuery.newLongRange( r.getField().getName(), r.getMinTimestamp().getTime(), r.getMaxTimestamp().getTime(), - true, true); + true, + true); } throw new QueryParseException("not a timestamp: " + p); } - private Query notTimestamp(TimestampRangePredicate r) - throws QueryParseException { + private Query notTimestamp(TimestampRangePredicate r) throws QueryParseException { if (r.getMinTimestamp().getTime() == 0) { return NumericRangeQuery.newLongRange( - r.getField().getName(), - r.getMaxTimestamp().getTime(), - null, - true, true); + r.getField().getName(), r.getMaxTimestamp().getTime(), null, true, true); } throw new QueryParseException("cannot negate: " + r); } @@ -241,17 +224,14 @@ public class QueryBuilder { return new PrefixQuery(new Term(p.getField().getName(), p.getValue())); } - private Query fullTextQuery(IndexPredicate p) - throws QueryParseException { + private Query fullTextQuery(IndexPredicate p) throws QueryParseException { String value = p.getValue(); if (value == null) { - throw new QueryParseException( - "Full-text search over empty string not supported"); + throw new QueryParseException("Full-text search over empty string not supported"); } Query query = queryBuilder.createPhraseQuery(p.getField().getName(), value); if (query == null) { - throw new QueryParseException( - "Cannot create full-text query with value: " + value); + throw new QueryParseException("Cannot create full-text query with value: " + value); } return query; } diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/WrappableSearcherManager.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/WrappableSearcherManager.java index 458cfda62d..f9ecac38cb 100644 --- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/WrappableSearcherManager.java +++ b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/WrappableSearcherManager.java @@ -17,6 +17,7 @@ package com.google.gerrit.lucene; * limitations under the License. */ +import java.io.IOException; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.FilterDirectoryReader; import org.apache.lucene.index.FilterLeafReader; @@ -27,16 +28,13 @@ import org.apache.lucene.search.ReferenceManager; import org.apache.lucene.search.SearcherFactory; import org.apache.lucene.store.Directory; -import java.io.IOException; - /** - * Utility class to safely share {@link IndexSearcher} instances across multiple - * threads, while periodically reopening. This class ensures each searcher is - * closed only once all threads have finished using it. + * Utility class to safely share {@link IndexSearcher} instances across multiple threads, while + * periodically reopening. This class ensures each searcher is closed only once all threads have + * finished using it. * - *

- * Use {@link #acquire} to obtain the current searcher, and {@link #release} to - * release it, like this: + *

Use {@link #acquire} to obtain the current searcher, and {@link #release} to release it, like + * this: * *

  * IndexSearcher s = manager.acquire();
@@ -49,15 +47,12 @@ import java.io.IOException;
  * s = null;
  * 
* - *

- * In addition you should periodically call {@link #maybeRefresh}. While it's - * possible to call this just before running each query, this is discouraged - * since it penalizes the unlucky queries that need to refresh. It's better to use - * a separate background thread, that periodically calls {@link #maybeRefresh}. Finally, - * be sure to call {@link #close} once you are done. + *

In addition you should periodically call {@link #maybeRefresh}. While it's possible to call + * this just before running each query, this is discouraged since it penalizes the unlucky queries + * that need to refresh. It's better to use a separate background thread, that periodically calls + * {@link #maybeRefresh}. Finally, be sure to call {@link #close} once you are done. * * @see SearcherFactory - * * @lucene.experimental */ // This file was copied from: @@ -70,28 +65,22 @@ final class WrappableSearcherManager extends ReferenceManager { private final SearcherFactory searcherFactory; /** - * Creates and returns a new SearcherManager from the given - * {@link IndexWriter}. - * - * @param writer - * the IndexWriter to open the IndexReader from. - * @param applyAllDeletes - * If true, all buffered deletes will be applied (made - * visible) in the {@link IndexSearcher} / {@link DirectoryReader}. - * If false, the deletes may or may not be applied, but - * remain buffered (in IndexWriter) so that they will be applied in - * the future. Applying deletes can be costly, so if your app can - * tolerate deleted documents being returned you might gain some - * performance by passing false. See - * {@link DirectoryReader#openIfChanged(DirectoryReader, IndexWriter, boolean)}. - * @param searcherFactory - * An optional {@link SearcherFactory}. Pass null if you - * don't require the searcher to be warmed before going live or other - * custom behavior. + * Creates and returns a new SearcherManager from the given {@link IndexWriter}. * + * @param writer the IndexWriter to open the IndexReader from. + * @param applyAllDeletes If true, all buffered deletes will be applied (made + * visible) in the {@link IndexSearcher} / {@link DirectoryReader}. If false, the + * deletes may or may not be applied, but remain buffered (in IndexWriter) so that they will + * be applied in the future. Applying deletes can be costly, so if your app can tolerate + * deleted documents being returned you might gain some performance by passing false + * . See {@link DirectoryReader#openIfChanged(DirectoryReader, IndexWriter, boolean)}. + * @param searcherFactory An optional {@link SearcherFactory}. Pass null if you don't + * require the searcher to be warmed before going live or other custom behavior. * @throws IOException if there is a low-level I/O error */ - WrappableSearcherManager(IndexWriter writer, boolean applyAllDeletes, SearcherFactory searcherFactory) throws IOException { + WrappableSearcherManager( + IndexWriter writer, boolean applyAllDeletes, SearcherFactory searcherFactory) + throws IOException { if (searcherFactory == null) { searcherFactory = new SearcherFactory(); } @@ -101,11 +90,10 @@ final class WrappableSearcherManager extends ReferenceManager { /** * Creates and returns a new SearcherManager from the given {@link Directory}. - * @param dir the directory to open the DirectoryReader on. - * @param searcherFactory An optional {@link SearcherFactory}. Pass - * null if you don't require the searcher to be warmed - * before going live or other custom behavior. * + * @param dir the directory to open the DirectoryReader on. + * @param searcherFactory An optional {@link SearcherFactory}. Pass null if you don't + * require the searcher to be warmed before going live or other custom behavior. * @throws IOException if there is a low-level I/O error */ WrappableSearcherManager(Directory dir, SearcherFactory searcherFactory) throws IOException { @@ -117,17 +105,16 @@ final class WrappableSearcherManager extends ReferenceManager { } /** - * Creates and returns a new SearcherManager from an existing {@link DirectoryReader}. Note that + * Creates and returns a new SearcherManager from an existing {@link DirectoryReader}. Note that * this steals the incoming reference. * * @param reader the DirectoryReader. - * @param searcherFactory An optional {@link SearcherFactory}. Pass - * null if you don't require the searcher to be warmed - * before going live or other custom behavior. - * + * @param searcherFactory An optional {@link SearcherFactory}. Pass null if you don't + * require the searcher to be warmed before going live or other custom behavior. * @throws IOException if there is a low-level I/O error */ - WrappableSearcherManager(DirectoryReader reader, SearcherFactory searcherFactory) throws IOException { + WrappableSearcherManager(DirectoryReader reader, SearcherFactory searcherFactory) + throws IOException { if (searcherFactory == null) { searcherFactory = new SearcherFactory(); } @@ -143,8 +130,8 @@ final class WrappableSearcherManager extends ReferenceManager { @Override protected IndexSearcher refreshIfNeeded(IndexSearcher referenceToRefresh) throws IOException { final IndexReader r = referenceToRefresh.getIndexReader(); - assert r instanceof DirectoryReader : - "searcher's IndexReader should be a DirectoryReader, but got " + r; + assert r instanceof DirectoryReader + : "searcher's IndexReader should be a DirectoryReader, but got " + r; final IndexReader newReader = DirectoryReader.openIfChanged((DirectoryReader) r); if (newReader == null) { return null; @@ -163,28 +150,30 @@ final class WrappableSearcherManager extends ReferenceManager { } /** - * Returns true if no changes have occured since this searcher - * ie. reader was opened, otherwise false. + * Returns true if no changes have occured since this searcher ie. reader was opened, + * otherwise false. + * * @see DirectoryReader#isCurrent() */ public boolean isSearcherCurrent() throws IOException { final IndexSearcher searcher = acquire(); try { final IndexReader r = searcher.getIndexReader(); - assert r instanceof DirectoryReader : - "searcher's IndexReader should be a DirectoryReader, but got " + r; + assert r instanceof DirectoryReader + : "searcher's IndexReader should be a DirectoryReader, but got " + r; return ((DirectoryReader) r).isCurrent(); } finally { release(searcher); } } - /** Expert: creates a searcher from the provided {@link - * IndexReader} using the provided {@link - * SearcherFactory}. NOTE: this decRefs incoming reader - * on throwing an exception. */ + /** + * Expert: creates a searcher from the provided {@link IndexReader} using the provided {@link + * SearcherFactory}. NOTE: this decRefs incoming reader on throwing an exception. + */ @SuppressWarnings("resource") - public static IndexSearcher getSearcher(SearcherFactory searcherFactory, IndexReader reader) throws IOException { + public static IndexSearcher getSearcher(SearcherFactory searcherFactory, IndexReader reader) + throws IOException { boolean success = false; final IndexSearcher searcher; try { @@ -206,9 +195,11 @@ final class WrappableSearcherManager extends ReferenceManager { if (unwrapped != reader) { throw new IllegalStateException( - "SearcherFactory must wrap the provided reader (got " + - searcher.getIndexReader() + - " but expected " + reader + ")"); + "SearcherFactory must wrap the provided reader (got " + + searcher.getIndexReader() + + " but expected " + + reader + + ")"); } success = true; } finally { diff --git a/gerrit-main/src/main/java/Main.java b/gerrit-main/src/main/java/Main.java index 58de6a453f..8c9deb1033 100644 --- a/gerrit-main/src/main/java/Main.java +++ b/gerrit-main/src/main/java/Main.java @@ -12,7 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. - public final class Main { // We don't do any real work here because we need to import // the archive lookup code and we cannot import a class in @@ -33,7 +32,6 @@ public final class Main { final String version = System.getProperty("java.specification.version"); if (1.8 <= parse(version)) { return true; - } System.err.println("fatal: Gerrit Code Review requires Java 8 or later"); System.err.println(" (trying to run on Java " + version + ")"); @@ -57,6 +55,5 @@ public final class Main { } } - private Main() { - } + private Main() {} } diff --git a/gerrit-oauth/src/main/java/com/google/gerrit/httpd/auth/oauth/OAuthLogoutServlet.java b/gerrit-oauth/src/main/java/com/google/gerrit/httpd/auth/oauth/OAuthLogoutServlet.java index 36bca15e40..126a1d715c 100644 --- a/gerrit-oauth/src/main/java/com/google/gerrit/httpd/auth/oauth/OAuthLogoutServlet.java +++ b/gerrit-oauth/src/main/java/com/google/gerrit/httpd/auth/oauth/OAuthLogoutServlet.java @@ -24,9 +24,7 @@ import com.google.gerrit.server.config.CanonicalWebUrl; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; - import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -37,7 +35,8 @@ class OAuthLogoutServlet extends HttpLogoutServlet { private final Provider oauthSession; @Inject - OAuthLogoutServlet(AuthConfig authConfig, + OAuthLogoutServlet( + AuthConfig authConfig, DynamicItem webSession, @CanonicalWebUrl @Nullable Provider urlProvider, AuditService audit, @@ -47,12 +46,10 @@ class OAuthLogoutServlet extends HttpLogoutServlet { } @Override - protected void doLogout(HttpServletRequest req, HttpServletResponse rsp) - throws IOException { + protected void doLogout(HttpServletRequest req, HttpServletResponse rsp) throws IOException { super.doLogout(req, rsp); if (req.getSession(false) != null) { oauthSession.get().logout(); } } } - diff --git a/gerrit-oauth/src/main/java/com/google/gerrit/httpd/auth/oauth/OAuthSession.java b/gerrit-oauth/src/main/java/com/google/gerrit/httpd/auth/oauth/OAuthSession.java index 9deec4434b..7cfaf46691 100644 --- a/gerrit-oauth/src/main/java/com/google/gerrit/httpd/auth/oauth/OAuthSession.java +++ b/gerrit-oauth/src/main/java/com/google/gerrit/httpd/auth/oauth/OAuthSession.java @@ -36,19 +36,16 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.servlet.SessionScoped; - -import org.apache.commons.codec.binary.Base64; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Optional; - import javax.servlet.ServletRequest; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.apache.commons.codec.binary.Base64; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @SessionScoped /* OAuth protocol implementation */ @@ -68,7 +65,8 @@ class OAuthSession { private boolean linkMode; @Inject - OAuthSession(DynamicItem webSession, + OAuthSession( + DynamicItem webSession, Provider identifiedUser, AccountManager accountManager, CanonicalWebUrl urlProvider, @@ -89,8 +87,9 @@ class OAuthSession { return Strings.emptyToNull(request.getParameter("code")) != null; } - boolean login(HttpServletRequest request, HttpServletResponse response, - OAuthServiceProvider oauth) throws IOException { + boolean login( + HttpServletRequest request, HttpServletResponse response, OAuthServiceProvider oauth) + throws IOException { log.debug("Login " + this); if (isOAuthFinal(request)) { @@ -100,8 +99,7 @@ class OAuthSession { } log.debug("Login-Retrieve-User " + this); - OAuthToken token = oauth.getAccessToken( - new OAuthVerifier(request.getParameter("code"))); + OAuthToken token = oauth.getAccessToken(new OAuthVerifier(request.getParameter("code"))); user = oauth.getUserInfo(token); if (isLoggedIn()) { @@ -119,22 +117,19 @@ class OAuthSession { // https://bz.apache.org/bugzilla/show_bug.cgi?id=28323 // we cannot use LoginUrlToken.getToken() method, // because it relies on getPathInfo() and it is always null here. - redirectToken = redirectToken.substring( - request.getContextPath().length()); - response.sendRedirect(oauth.getAuthorizationUrl() + - "&state=" + state); + redirectToken = redirectToken.substring(request.getContextPath().length()); + response.sendRedirect(oauth.getAuthorizationUrl() + "&state=" + state); return false; } - private void authenticateAndRedirect(HttpServletRequest req, - HttpServletResponse rsp, OAuthToken token) throws IOException { + private void authenticateAndRedirect( + HttpServletRequest req, HttpServletResponse rsp, OAuthToken token) throws IOException { AuthRequest areq = new AuthRequest(user.getExternalId()); AuthResult arsp; try { String claimedIdentifier = user.getClaimedIdentity(); if (!Strings.isNullOrEmpty(claimedIdentifier)) { - if (!authenticateWithIdentityClaimedDuringHandshake(areq, rsp, - claimedIdentifier)) { + if (!authenticateWithIdentityClaimedDuringHandshake(areq, rsp, claimedIdentifier)) { return; } } else if (linkMode) { @@ -156,8 +151,7 @@ class OAuthSession { } webSession.get().login(arsp, true); - String suffix = redirectToken.substring( - OAuthWebFilter.GERRIT_LOGIN.length() + 1); + String suffix = redirectToken.substring(OAuthWebFilter.GERRIT_LOGIN.length() + 1); StringBuilder rdr = new StringBuilder(urlProvider.get(req)); rdr.append(Url.decode(suffix)); rsp.sendRedirect(rdr.toString()); @@ -176,24 +170,35 @@ class OAuthSession { // This is (for now) a fatal error. There are two records // for what might be the same user. // - log.error("OAuth accounts disagree over user identity:\n" - + " Claimed ID: " + claimedId.get() + " is " + claimedIdentifier - + "\n" + " Delgate ID: " + actualId.get() + " is " - + user.getExternalId()); + log.error( + "OAuth accounts disagree over user identity:\n" + + " Claimed ID: " + + claimedId.get() + + " is " + + claimedIdentifier + + "\n" + + " Delgate ID: " + + actualId.get() + + " is " + + user.getExternalId()); rsp.sendError(HttpServletResponse.SC_FORBIDDEN); return false; } } else if (claimedId.isPresent() && !actualId.isPresent()) { // Claimed account already exists: link to it. // - log.info("OAuth2: linking claimed identity to {}", - claimedId.get().toString()); + log.info("OAuth2: linking claimed identity to {}", claimedId.get().toString()); try { accountManager.link(claimedId.get(), req); } catch (OrmException e) { - log.error("Cannot link: " + user.getExternalId() - + " to user identity:\n" - + " Claimed ID: " + claimedId.get() + " is " + claimedIdentifier); + log.error( + "Cannot link: " + + user.getExternalId() + + " to user identity:\n" + + " Claimed ID: " + + claimedId.get() + + " is " + + claimedIdentifier); rsp.sendError(HttpServletResponse.SC_FORBIDDEN); return false; } @@ -201,13 +206,16 @@ class OAuthSession { return true; } - private boolean authenticateWithLinkedIdentity(AuthRequest areq, - HttpServletResponse rsp) throws AccountException, IOException { + private boolean authenticateWithLinkedIdentity(AuthRequest areq, HttpServletResponse rsp) + throws AccountException, IOException { try { accountManager.link(identifiedUser.get().getAccountId(), areq); } catch (OrmException e) { - log.error("Cannot link: " + user.getExternalId() - + " to user identity: " + identifiedUser.get().getAccountId()); + log.error( + "Cannot link: " + + user.getExternalId() + + " to user identity: " + + identifiedUser.get().getAccountId()); rsp.sendError(HttpServletResponse.SC_FORBIDDEN); return false; } finally { @@ -239,8 +247,7 @@ class OAuthSession { try { return SecureRandom.getInstance("SHA1PRNG"); } catch (NoSuchAlgorithmException e) { - throw new IllegalArgumentException( - "No SecureRandom available for GitHub authentication", e); + throw new IllegalArgumentException("No SecureRandom available for GitHub authentication", e); } } @@ -252,8 +259,7 @@ class OAuthSession { @Override public String toString() { - return "OAuthSession [token=" + tokenCache.get(accountId) + ", user=" - + user + "]"; + return "OAuthSession [token=" + tokenCache.get(accountId) + ", user=" + user + "]"; } public void setServiceProvider(OAuthServiceProvider provider) { diff --git a/gerrit-oauth/src/main/java/com/google/gerrit/httpd/auth/oauth/OAuthWebFilter.java b/gerrit-oauth/src/main/java/com/google/gerrit/httpd/auth/oauth/OAuthWebFilter.java index 4c6c0b05d3..6ec5f3b8b0 100644 --- a/gerrit-oauth/src/main/java/com/google/gerrit/httpd/auth/oauth/OAuthWebFilter.java +++ b/gerrit-oauth/src/main/java/com/google/gerrit/httpd/auth/oauth/OAuthWebFilter.java @@ -29,16 +29,11 @@ import com.google.gerrit.server.config.CanonicalWebUrl; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.w3c.dom.Document; -import org.w3c.dom.Element; - import java.io.IOException; import java.util.Map; import java.util.Set; import java.util.SortedMap; import java.util.SortedSet; - import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -48,6 +43,8 @@ import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.w3c.dom.Document; +import org.w3c.dom.Element; @Singleton /* OAuth web filter uses active OAuth session to perform OAuth requests */ @@ -61,7 +58,8 @@ class OAuthWebFilter implements Filter { private OAuthServiceProvider ssoProvider; @Inject - OAuthWebFilter(@CanonicalWebUrl @Nullable Provider urlProvider, + OAuthWebFilter( + @CanonicalWebUrl @Nullable Provider urlProvider, DynamicMap oauthServiceProviders, Provider oauthSessionProvider, SiteHeaderFooter header) { @@ -77,12 +75,11 @@ class OAuthWebFilter implements Filter { } @Override - public void destroy() { - } + public void destroy() {} @Override - public void doFilter(ServletRequest request, ServletResponse response, - FilterChain chain) throws IOException, ServletException { + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; @@ -93,9 +90,8 @@ class OAuthWebFilter implements Filter { } String provider = httpRequest.getParameter("provider"); - OAuthServiceProvider service = ssoProvider == null - ? oauthSession.getServiceProvider() - : ssoProvider; + OAuthServiceProvider service = + ssoProvider == null ? oauthSession.getServiceProvider() : ssoProvider; if (isGerritLogin(httpRequest) || oauthSession.isOAuthFinal(httpRequest)) { if (service == null && Strings.isNullOrEmpty(provider)) { @@ -112,29 +108,24 @@ class OAuthWebFilter implements Filter { } } - private OAuthServiceProvider findService(String providerId) - throws ServletException { + private OAuthServiceProvider findService(String providerId) throws ServletException { Set plugins = oauthServiceProviders.plugins(); for (String pluginName : plugins) { - Map> m = - oauthServiceProviders.byPlugin(pluginName); - for (Map.Entry> e - : m.entrySet()) { - if (providerId.equals( - String.format("%s_%s", pluginName, e.getKey()))) { - return e.getValue().get(); - } + Map> m = oauthServiceProviders.byPlugin(pluginName); + for (Map.Entry> e : m.entrySet()) { + if (providerId.equals(String.format("%s_%s", pluginName, e.getKey()))) { + return e.getValue().get(); } + } } throw new ServletException("No provider found for: " + providerId); } - private void selectProvider(HttpServletRequest req, HttpServletResponse res, - @Nullable String errorMessage) + private void selectProvider( + HttpServletRequest req, HttpServletResponse res, @Nullable String errorMessage) throws IOException { String self = req.getRequestURI(); - String cancel = MoreObjects.firstNonNull( - urlProvider != null ? urlProvider.get() : "/", "/"); + String cancel = MoreObjects.firstNonNull(urlProvider != null ? urlProvider.get() : "/", "/"); cancel += LoginUrlToken.getToken(req); Document doc = header.parse(OAuthWebFilter.class, "LoginForm.html"); @@ -153,33 +144,26 @@ class OAuthWebFilter implements Filter { Set plugins = oauthServiceProviders.plugins(); for (String pluginName : plugins) { - Map> m = - oauthServiceProviders.byPlugin(pluginName); - for (Map.Entry> e - : m.entrySet()) { - addProvider(providers, pluginName, e.getKey(), - e.getValue().get().getName()); - } + Map> m = oauthServiceProviders.byPlugin(pluginName); + for (Map.Entry> e : m.entrySet()) { + addProvider(providers, pluginName, e.getKey(), e.getValue().get().getName()); + } } sendHtml(res, doc); } - private static void addProvider(Element form, String pluginName, - String id, String serviceName) { + private static void addProvider(Element form, String pluginName, String id, String serviceName) { Element div = form.getOwnerDocument().createElement("div"); div.setAttribute("id", id); Element hyperlink = form.getOwnerDocument().createElement("a"); - hyperlink.setAttribute("href", String.format("?provider=%s_%s", - pluginName, id)); - hyperlink.setTextContent(serviceName + - " (" + pluginName + " plugin)"); + hyperlink.setAttribute("href", String.format("?provider=%s_%s", pluginName, id)); + hyperlink.setTextContent(serviceName + " (" + pluginName + " plugin)"); div.appendChild(hyperlink); form.appendChild(div); } - private static void sendHtml(HttpServletResponse res, Document doc) - throws IOException { + private static void sendHtml(HttpServletResponse res, Document doc) throws IOException { byte[] bin = HtmlDomUtil.toUTF8(doc); res.setStatus(HttpServletResponse.SC_UNAUTHORIZED); res.setContentType("text/html"); @@ -190,12 +174,10 @@ class OAuthWebFilter implements Filter { } } - private void pickSSOServiceProvider() - throws ServletException { + private void pickSSOServiceProvider() throws ServletException { SortedSet plugins = oauthServiceProviders.plugins(); if (plugins.isEmpty()) { - throw new ServletException( - "OAuth service provider wasn't installed"); + throw new ServletException("OAuth service provider wasn't installed"); } if (plugins.size() == 1) { SortedMap> services = diff --git a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/DiscoveryResult.java b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/DiscoveryResult.java index 2ee3b6ba43..889e07036e 100644 --- a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/DiscoveryResult.java +++ b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/DiscoveryResult.java @@ -32,8 +32,7 @@ final class DiscoveryResult { String providerUrl; Map providerArgs; - DiscoveryResult() { - } + DiscoveryResult() {} DiscoveryResult(String redirect, Map args) { status = Status.VALID; diff --git a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/LoginForm.java b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/LoginForm.java index 791f9fde7c..6202cfc65d 100644 --- a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/LoginForm.java +++ b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/LoginForm.java @@ -37,32 +37,30 @@ import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import org.eclipse.jgit.lib.Config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; -import java.io.IOException; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import javax.servlet.ServletOutputStream; -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - /** Handles OpenID based login flow. */ @SuppressWarnings("serial") @Singleton class LoginForm extends HttpServlet { private static final Logger log = LoggerFactory.getLogger(LoginForm.class); - private static final ImmutableMap ALL_PROVIDERS = ImmutableMap.of( - "launchpad", OpenIdUrls.URL_LAUNCHPAD, - "yahoo", OpenIdUrls.URL_YAHOO); + private static final ImmutableMap ALL_PROVIDERS = + ImmutableMap.of( + "launchpad", OpenIdUrls.URL_LAUNCHPAD, + "yahoo", OpenIdUrls.URL_YAHOO); private final ImmutableSet suggestProviders; private final Provider urlProvider; @@ -87,9 +85,7 @@ class LoginForm extends HttpServlet { this.urlProvider = urlProvider; this.impl = impl; this.header = header; - this.maxRedirectUrlLength = config.getInt( - "openid", "maxRedirectUrlLength", - 10); + this.maxRedirectUrlLength = config.getInt("openid", "maxRedirectUrlLength", 10); this.oauthSessionProvider = oauthSessionProvider; this.currentUserProvider = currentUserProvider; this.oauthServiceProviders = oauthServiceProviders; @@ -114,8 +110,7 @@ class LoginForm extends HttpServlet { } @Override - protected void doGet(HttpServletRequest req, HttpServletResponse res) - throws IOException { + protected void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException { if (ssoUrl != null) { String token = LoginUrlToken.getToken(req); SignInMode mode; @@ -138,8 +133,7 @@ class LoginForm extends HttpServlet { } @Override - protected void doPost(HttpServletRequest req, HttpServletResponse res) - throws IOException { + protected void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException { boolean link = req.getParameter("link") != null; String id = Strings.nullToEmpty(req.getParameter("id")).trim(); if (id.isEmpty()) { @@ -175,12 +169,10 @@ class LoginForm extends HttpServlet { } else { log.debug("OAuth provider \"{}\"", id); OAuthSessionOverOpenID oauthSession = oauthSessionProvider.get(); - if (!currentUserProvider.get().isIdentifiedUser() - && oauthSession.isLoggedIn()) { + if (!currentUserProvider.get().isIdentifiedUser() && oauthSession.isLoggedIn()) { oauthSession.logout(); } - if ((isGerritLogin(req) - || oauthSession.isOAuthFinal(req))) { + if ((isGerritLogin(req) || oauthSession.isOAuthFinal(req))) { oauthSession.setServiceProvider(oauthProvider); oauthSession.setLinkMode(link); oauthSession.login(req, res, oauthProvider); @@ -188,8 +180,14 @@ class LoginForm extends HttpServlet { } } - private void discover(HttpServletRequest req, HttpServletResponse res, - boolean link, String id, boolean remember, String token, SignInMode mode) + private void discover( + HttpServletRequest req, + HttpServletResponse res, + boolean link, + String id, + boolean remember, + String token, + SignInMode mode) throws IOException { if (ssoUrl != null) { remember = false; @@ -202,8 +200,7 @@ class LoginForm extends HttpServlet { break; case NO_PROVIDER: - sendForm(req, res, link, - "Provider is not supported, or was incorrectly entered."); + sendForm(req, res, link, "Provider is not supported, or was incorrectly entered."); break; case ERROR: @@ -212,8 +209,7 @@ class LoginForm extends HttpServlet { } } - private void redirect(DiscoveryResult r, HttpServletResponse res) - throws IOException { + private void redirect(DiscoveryResult r, HttpServletResponse res) throws IOException { StringBuilder url = new StringBuilder(); url.append(r.providerUrl); if (r.providerArgs != null && !r.providerArgs.isEmpty()) { @@ -225,9 +221,7 @@ class LoginForm extends HttpServlet { } else { url.append('&'); } - url.append(Url.encode(arg.getKey())) - .append('=') - .append(Url.encode(arg.getValue())); + url.append(Url.encode(arg.getKey())).append('=').append(Url.encode(arg.getValue())); } } if (url.length() <= maxRedirectUrlLength) { @@ -250,11 +244,11 @@ class LoginForm extends HttpServlet { sendHtml(res, doc); } - private void sendForm(HttpServletRequest req, HttpServletResponse res, - boolean link, @Nullable String errorMessage) throws IOException { + private void sendForm( + HttpServletRequest req, HttpServletResponse res, boolean link, @Nullable String errorMessage) + throws IOException { String self = req.getRequestURI(); - String cancel = MoreObjects.firstNonNull( - urlProvider != null ? urlProvider.get() : "/", "/"); + String cancel = MoreObjects.firstNonNull(urlProvider != null ? urlProvider.get() : "/", "/"); cancel += LoginUrlToken.getToken(req); Document doc = header.parse(LoginForm.class, "LoginForm.html"); @@ -305,20 +299,16 @@ class LoginForm extends HttpServlet { Element providers = HtmlDomUtil.find(doc, "providers"); Set plugins = oauthServiceProviders.plugins(); for (String pluginName : plugins) { - Map> m = - oauthServiceProviders.byPlugin(pluginName); - for (Map.Entry> e - : m.entrySet()) { - addProvider(providers, link, pluginName, e.getKey(), - e.getValue().get().getName()); - } + Map> m = oauthServiceProviders.byPlugin(pluginName); + for (Map.Entry> e : m.entrySet()) { + addProvider(providers, link, pluginName, e.getKey(), e.getValue().get().getName()); + } } sendHtml(res, doc); } - private void sendHtml(HttpServletResponse res, Document doc) - throws IOException { + private void sendHtml(HttpServletResponse res, Document doc) throws IOException { byte[] bin = HtmlDomUtil.toUTF8(doc); res.setStatus(HttpServletResponse.SC_UNAUTHORIZED); res.setContentType("text/html"); @@ -329,20 +319,18 @@ class LoginForm extends HttpServlet { } } - private static void addProvider(Element form, boolean link, - String pluginName, String id, String serviceName) { + private static void addProvider( + Element form, boolean link, String pluginName, String id, String serviceName) { Element div = form.getOwnerDocument().createElement("div"); div.setAttribute("id", id); Element hyperlink = form.getOwnerDocument().createElement("a"); - StringBuilder u = new StringBuilder(String.format("?id=%s_%s", - pluginName, id)); + StringBuilder u = new StringBuilder(String.format("?id=%s_%s", pluginName, id)); if (link) { u.append("&link"); } hyperlink.setAttribute("href", u.toString()); - hyperlink.setTextContent(serviceName + - " (" + pluginName + " plugin)"); + hyperlink.setTextContent(serviceName + " (" + pluginName + " plugin)"); div.appendChild(hyperlink); form.appendChild(div); } @@ -353,15 +341,12 @@ class LoginForm extends HttpServlet { } Set plugins = oauthServiceProviders.plugins(); for (String pluginName : plugins) { - Map> m = - oauthServiceProviders.byPlugin(pluginName); - for (Map.Entry> e - : m.entrySet()) { - if (providerId.equals( - String.format("%s_%s", pluginName, e.getKey()))) { - return e.getValue().get(); - } + Map> m = oauthServiceProviders.byPlugin(pluginName); + for (Map.Entry> e : m.entrySet()) { + if (providerId.equals(String.format("%s_%s", pluginName, e.getKey()))) { + return e.getValue().get(); } + } } return null; } @@ -379,7 +364,6 @@ class LoginForm extends HttpServlet { } private static boolean isGerritLogin(HttpServletRequest request) { - return request.getRequestURI().indexOf( - OAuthSessionOverOpenID.GERRIT_LOGIN) >= 0; + return request.getRequestURI().indexOf(OAuthSessionOverOpenID.GERRIT_LOGIN) >= 0; } } diff --git a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OAuthOverOpenIDLogoutServlet.java b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OAuthOverOpenIDLogoutServlet.java index 02f428e62d..eecfb7faf8 100644 --- a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OAuthOverOpenIDLogoutServlet.java +++ b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OAuthOverOpenIDLogoutServlet.java @@ -24,9 +24,7 @@ import com.google.gerrit.server.config.CanonicalWebUrl; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; - import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -37,7 +35,8 @@ class OAuthOverOpenIDLogoutServlet extends HttpLogoutServlet { private final Provider oauthSession; @Inject - OAuthOverOpenIDLogoutServlet(AuthConfig authConfig, + OAuthOverOpenIDLogoutServlet( + AuthConfig authConfig, DynamicItem webSession, @CanonicalWebUrl @Nullable Provider urlProvider, AuditService audit, @@ -47,8 +46,7 @@ class OAuthOverOpenIDLogoutServlet extends HttpLogoutServlet { } @Override - protected void doLogout(HttpServletRequest req, HttpServletResponse rsp) - throws IOException { + protected void doLogout(HttpServletRequest req, HttpServletResponse rsp) throws IOException { super.doLogout(req, rsp); if (req.getSession(false) != null) { oauthSession.get().logout(); diff --git a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OAuthSessionOverOpenID.java b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OAuthSessionOverOpenID.java index dccb6f7a2e..4a2ffec925 100644 --- a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OAuthSessionOverOpenID.java +++ b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OAuthSessionOverOpenID.java @@ -35,26 +35,22 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.servlet.SessionScoped; - -import org.apache.commons.codec.binary.Base64; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Optional; - import javax.servlet.ServletRequest; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.apache.commons.codec.binary.Base64; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** OAuth protocol implementation */ @SessionScoped class OAuthSessionOverOpenID { static final String GERRIT_LOGIN = "/login"; - private static final Logger log = LoggerFactory.getLogger( - OAuthSessionOverOpenID.class); + private static final Logger log = LoggerFactory.getLogger(OAuthSessionOverOpenID.class); private static final SecureRandom randomState = newRandomGenerator(); private final String state; private final DynamicItem webSession; @@ -68,7 +64,8 @@ class OAuthSessionOverOpenID { private boolean linkMode; @Inject - OAuthSessionOverOpenID(DynamicItem webSession, + OAuthSessionOverOpenID( + DynamicItem webSession, Provider identifiedUser, AccountManager accountManager, CanonicalWebUrl urlProvider) { @@ -87,8 +84,9 @@ class OAuthSessionOverOpenID { return Strings.emptyToNull(request.getParameter("code")) != null; } - boolean login(HttpServletRequest request, HttpServletResponse response, - OAuthServiceProvider oauth) throws IOException { + boolean login( + HttpServletRequest request, HttpServletResponse response, OAuthServiceProvider oauth) + throws IOException { log.debug("Login " + this); if (isOAuthFinal(request)) { @@ -111,20 +109,18 @@ class OAuthSessionOverOpenID { } log.debug("Login-PHASE1 " + this); redirectToken = LoginUrlToken.getToken(request); - response.sendRedirect(oauth.getAuthorizationUrl() + - "&state=" + state); + response.sendRedirect(oauth.getAuthorizationUrl() + "&state=" + state); return false; } - private void authenticateAndRedirect(HttpServletRequest req, - HttpServletResponse rsp) throws IOException { + private void authenticateAndRedirect(HttpServletRequest req, HttpServletResponse rsp) + throws IOException { com.google.gerrit.server.account.AuthRequest areq = new com.google.gerrit.server.account.AuthRequest(user.getExternalId()); AuthResult arsp = null; try { String claimedIdentifier = user.getClaimedIdentity(); - Optional actualId = - accountManager.lookup(user.getExternalId()); + Optional actualId = accountManager.lookup(user.getExternalId()); Optional claimedId = Optional.empty(); // We try to retrieve claimed identity. @@ -152,10 +148,17 @@ class OAuthSessionOverOpenID { // This is (for now) a fatal error. There are two records // for what might be the same user. The admin would have to // link the accounts manually. - log.error("OAuth accounts disagree over user identity:\n" - + " Claimed ID: " + claimedId.get() + " is " + claimedIdentifier - + "\n" + " Delgate ID: " + actualId.get() + " is " - + user.getExternalId()); + log.error( + "OAuth accounts disagree over user identity:\n" + + " Claimed ID: " + + claimedId.get() + + " is " + + claimedIdentifier + + "\n" + + " Delgate ID: " + + actualId.get() + + " is " + + user.getExternalId()); rsp.sendError(HttpServletResponse.SC_FORBIDDEN); return; } @@ -165,9 +168,14 @@ class OAuthSessionOverOpenID { try { accountManager.link(claimedId.get(), areq); } catch (OrmException e) { - log.error("Cannot link: " + user.getExternalId() - + " to user identity:\n" - + " Claimed ID: " + claimedId.get() + " is " + claimedIdentifier); + log.error( + "Cannot link: " + + user.getExternalId() + + " to user identity:\n" + + " Claimed ID: " + + claimedId.get() + + " is " + + claimedIdentifier); rsp.sendError(HttpServletResponse.SC_FORBIDDEN); return; } @@ -176,12 +184,10 @@ class OAuthSessionOverOpenID { // Use case 2: link mode activated from the UI Account.Id accountId = identifiedUser.get().getAccountId(); try { - log.debug("Linking \"{}\" to \"{}\"", user.getExternalId(), - accountId); + log.debug("Linking \"{}\" to \"{}\"", user.getExternalId(), accountId); accountManager.link(accountId, areq); } catch (OrmException e) { - log.error("Cannot link: " + user.getExternalId() - + " to user identity: " + accountId); + log.error("Cannot link: " + user.getExternalId() + " to user identity: " + accountId); rsp.sendError(HttpServletResponse.SC_FORBIDDEN); return; } finally { @@ -224,8 +230,7 @@ class OAuthSessionOverOpenID { try { return SecureRandom.getInstance("SHA1PRNG"); } catch (NoSuchAlgorithmException e) { - throw new IllegalArgumentException( - "No SecureRandom available for GitHub authentication", e); + throw new IllegalArgumentException("No SecureRandom available for GitHub authentication", e); } } diff --git a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OAuthWebFilterOverOpenID.java b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OAuthWebFilterOverOpenID.java index c17079de8f..fe3d9eea82 100644 --- a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OAuthWebFilterOverOpenID.java +++ b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OAuthWebFilterOverOpenID.java @@ -20,11 +20,9 @@ import com.google.gerrit.extensions.registration.DynamicMap; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; import java.util.SortedMap; import java.util.SortedSet; - import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -34,7 +32,6 @@ import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; - /** OAuth web filter uses active OAuth session to perform OAuth requests */ @Singleton class OAuthWebFilterOverOpenID implements Filter { @@ -45,7 +42,8 @@ class OAuthWebFilterOverOpenID implements Filter { private OAuthServiceProvider ssoProvider; @Inject - OAuthWebFilterOverOpenID(DynamicMap oauthServiceProviders, + OAuthWebFilterOverOpenID( + DynamicMap oauthServiceProviders, Provider oauthSessionProvider) { this.oauthServiceProviders = oauthServiceProviders; this.oauthSessionProvider = oauthSessionProvider; @@ -57,26 +55,24 @@ class OAuthWebFilterOverOpenID implements Filter { } @Override - public void destroy() { - } + public void destroy() {} @Override - public void doFilter(ServletRequest request, ServletResponse response, - FilterChain chain) throws IOException, ServletException { + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; OAuthSessionOverOpenID oauthSession = oauthSessionProvider.get(); - OAuthServiceProvider service = ssoProvider == null - ? oauthSession.getServiceProvider() - : ssoProvider; + OAuthServiceProvider service = + ssoProvider == null ? oauthSession.getServiceProvider() : ssoProvider; if (isGerritLogin(httpRequest) || oauthSession.isOAuthFinal(httpRequest)) { - if (service == null) { - throw new IllegalStateException("service is unknown"); - } - oauthSession.setServiceProvider(service); - oauthSession.login(httpRequest, httpResponse, service); + if (service == null) { + throw new IllegalStateException("service is unknown"); + } + oauthSession.setServiceProvider(service); + oauthSession.login(httpRequest, httpResponse, service); } else { chain.doFilter(httpRequest, response); } diff --git a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OpenIdLoginServlet.java b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OpenIdLoginServlet.java index 51342f7ed9..1406267ff4 100644 --- a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OpenIdLoginServlet.java +++ b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OpenIdLoginServlet.java @@ -17,9 +17,7 @@ package com.google.gerrit.httpd.auth.openid; import com.google.gwtexpui.server.CacheHeaders; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.io.IOException; - import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; diff --git a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OpenIdServiceImpl.java b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OpenIdServiceImpl.java index f3130e7a4d..dbc0d147df 100644 --- a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OpenIdServiceImpl.java +++ b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OpenIdServiceImpl.java @@ -34,7 +34,14 @@ import com.google.gwtorm.client.KeyUtil; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; +import java.net.URL; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.TimeUnit; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import org.eclipse.jgit.lib.Config; import org.openid4java.consumer.ConsumerException; import org.openid4java.consumer.ConsumerManager; @@ -59,20 +66,9 @@ import org.openid4java.util.HttpClientFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.net.URL; -import java.util.List; -import java.util.Optional; -import java.util.concurrent.TimeUnit; - -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - @Singleton class OpenIdServiceImpl { - private static final Logger log = - LoggerFactory.getLogger(OpenIdServiceImpl.class); + private static final Logger log = LoggerFactory.getLogger(OpenIdServiceImpl.class); static final String RETURN_URL = "OpenID"; @@ -85,12 +81,9 @@ class OpenIdServiceImpl { private static final String OPENID_MODE = "openid.mode"; private static final String OMODE_CANCEL = "cancel"; - private static final String SCHEMA_EMAIL = - "http://schema.openid.net/contact/email"; - private static final String SCHEMA_FIRSTNAME = - "http://schema.openid.net/namePerson/first"; - private static final String SCHEMA_LASTNAME = - "http://schema.openid.net/namePerson/last"; + private static final String SCHEMA_EMAIL = "http://schema.openid.net/contact/email"; + private static final String SCHEMA_FIRSTNAME = "http://schema.openid.net/namePerson/first"; + private static final String SCHEMA_LASTNAME = "http://schema.openid.net/namePerson/last"; private final DynamicItem webSession; private final Provider identifiedUser; @@ -104,16 +97,17 @@ class OpenIdServiceImpl { private final int papeMaxAuthAge; @Inject - OpenIdServiceImpl(final DynamicItem cf, + OpenIdServiceImpl( + final DynamicItem cf, final Provider iu, CanonicalWebUrl up, - @GerritServerConfig final Config config, final AuthConfig ac, + @GerritServerConfig final Config config, + final AuthConfig ac, final AccountManager am, ProxyProperties proxyProperties) { if (proxyProperties.getProxyUrl() != null) { - final org.openid4java.util.ProxyProperties proxy = - new org.openid4java.util.ProxyProperties(); + final org.openid4java.util.ProxyProperties proxy = new org.openid4java.util.ProxyProperties(); URL url = proxyProperties.getProxyUrl(); proxy.setProxyHostName(url.getHost()); proxy.setProxyPort(url.getPort()); @@ -129,13 +123,24 @@ class OpenIdServiceImpl { manager = new ConsumerManager(); allowedOpenIDs = ac.getAllowedOpenIDs(); openIdDomains = ac.getOpenIdDomains(); - papeMaxAuthAge = (int) ConfigUtil.getTimeUnit(config, // - "auth", null, "maxOpenIdSessionAge", -1, TimeUnit.SECONDS); + papeMaxAuthAge = + (int) + ConfigUtil.getTimeUnit( + config, // + "auth", + null, + "maxOpenIdSessionAge", + -1, + TimeUnit.SECONDS); } @SuppressWarnings("unchecked") - DiscoveryResult discover(HttpServletRequest req, String openidIdentifier, - final SignInMode mode, final boolean remember, final String returnToken) { + DiscoveryResult discover( + HttpServletRequest req, + String openidIdentifier, + final SignInMode mode, + final boolean remember, + final String returnToken) { final State state; state = init(req, openidIdentifier, mode, remember, returnToken); if (state == null) { @@ -174,9 +179,7 @@ class OpenIdServiceImpl { return new DiscoveryResult(DiscoveryResult.Status.ERROR); } - return new DiscoveryResult( - aReq.getDestinationUrl(false), - aReq.getParameterMap()); + return new DiscoveryResult(aReq.getDestinationUrl(false), aReq.getParameterMap()); } private boolean requestRegistration(final AuthRequest aReq) { @@ -200,8 +203,7 @@ class OpenIdServiceImpl { } /** Called by {@link OpenIdLoginServlet} doGet, doPost */ - void doAuth(final HttpServletRequest req, final HttpServletResponse rsp) - throws Exception { + void doAuth(final HttpServletRequest req, final HttpServletResponse rsp) throws Exception { if (OMODE_CANCEL.equals(req.getParameter(OPENID_MODE))) { cancel(req, rsp); return; @@ -244,15 +246,17 @@ class OpenIdServiceImpl { } final VerificationResult result = - manager.verify(state.retTo.toString(), new ParameterList(req - .getParameterMap()), state.discovered); + manager.verify( + state.retTo.toString(), new ParameterList(req.getParameterMap()), state.discovered); if (result.getVerifiedId() == null /* authentication failure */) { if ("Nonce verification failed.".equals(result.getStatusMsg())) { // We might be suffering from clock skew on this system. // - log.error("OpenID failure: " + result.getStatusMsg() - + " Likely caused by clock skew on this server," - + " install/configure NTP."); + log.error( + "OpenID failure: " + + result.getStatusMsg() + + " Likely caused by clock skew on this server," + + " install/configure NTP."); cancelWithError(req, rsp, result.getStatusMsg()); } else if (result.getStatusMsg() != null) { @@ -296,8 +300,7 @@ class OpenIdServiceImpl { } if (authRsp.hasExtension(SRegMessage.OPENID_NS_SREG)) { - final MessageExtension ext = - authRsp.getExtension(SRegMessage.OPENID_NS_SREG); + final MessageExtension ext = authRsp.getExtension(SRegMessage.OPENID_NS_SREG); if (ext instanceof SRegResponse) { sregRsp = (SRegResponse) ext; } @@ -366,8 +369,7 @@ class OpenIdServiceImpl { // link between the two, so set one up if not present. // Optional claimedId = accountManager.lookup(claimedIdentifier); - Optional actualId = - accountManager.lookup(areq.getExternalId()); + Optional actualId = accountManager.lookup(areq.getExternalId()); if (claimedId.isPresent() && actualId.isPresent()) { if (claimedId.get().equals(actualId.get())) { @@ -376,10 +378,17 @@ class OpenIdServiceImpl { // This is (for now) a fatal error. There are two records // for what might be the same user. // - log.error("OpenID accounts disagree over user identity:\n" - + " Claimed ID: " + claimedId.get() + " is " + claimedIdentifier - + "\n" + " Delgate ID: " + actualId.get() + " is " - + areq.getExternalId()); + log.error( + "OpenID accounts disagree over user identity:\n" + + " Claimed ID: " + + claimedId.get() + + " is " + + claimedIdentifier + + "\n" + + " Delgate ID: " + + actualId.get() + + " is " + + areq.getExternalId()); cancelWithError(req, rsp, "Contact site administrator"); return; } @@ -425,8 +434,7 @@ class OpenIdServiceImpl { webSession.get().login(arsp, remember); if (arsp.isNew() && claimedIdentifier != null) { final com.google.gerrit.server.account.AuthRequest linkReq = - new com.google.gerrit.server.account.AuthRequest( - claimedIdentifier); + new com.google.gerrit.server.account.AuthRequest(claimedIdentifier); linkReq.setDisplayName(areq.getDisplayName()); linkReq.setEmailAddress(areq.getEmailAddress()); accountManager.link(arsp.getAccountId(), linkReq); @@ -434,12 +442,13 @@ class OpenIdServiceImpl { callback(arsp.isNew(), req, rsp); break; - case LINK_IDENTIY: { - arsp = accountManager.link(identifiedUser.get().getAccountId(), areq); - webSession.get().login(arsp, remember); - callback(false, req, rsp); - break; - } + case LINK_IDENTIY: + { + arsp = accountManager.link(identifiedUser.get().getAccountId(), areq); + webSession.get().login(arsp, remember); + callback(false, req, rsp); + break; + } } } catch (AccountException e) { log.error("OpenID authentication failure", e); @@ -466,8 +475,9 @@ class OpenIdServiceImpl { } } - private void callback(final boolean isNew, final HttpServletRequest req, - final HttpServletResponse rsp) throws IOException { + private void callback( + final boolean isNew, final HttpServletRequest req, final HttpServletResponse rsp) + throws IOException { String token = req.getParameter(P_TOKEN); if (token == null || token.isEmpty() || token.startsWith("/SignInFailure,")) { token = PageLinks.MINE; @@ -482,16 +492,16 @@ class OpenIdServiceImpl { rsp.sendRedirect(rdr.toString()); } - private void cancel(final HttpServletRequest req, - final HttpServletResponse rsp) throws IOException { + private void cancel(final HttpServletRequest req, final HttpServletResponse rsp) + throws IOException { if (isSignIn(signInMode(req))) { webSession.get().logout(); } callback(false, req, rsp); } - private void cancelWithError(final HttpServletRequest req, - final HttpServletResponse rsp, final String errorDetail) + private void cancelWithError( + final HttpServletRequest req, final HttpServletResponse rsp, final String errorDetail) throws IOException { final SignInMode mode = signInMode(req); if (isSignIn(mode)) { @@ -508,8 +518,12 @@ class OpenIdServiceImpl { rsp.sendRedirect(rdr.toString()); } - private State init(HttpServletRequest req, final String openidIdentifier, - final SignInMode mode, final boolean remember, final String returnToken) { + private State init( + HttpServletRequest req, + final String openidIdentifier, + final SignInMode mode, + final boolean remember, + final String returnToken) { final List list; try { list = manager.discover(openidIdentifier); diff --git a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/SignInMode.java b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/SignInMode.java index 9aae6c593c..eebb0e716b 100644 --- a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/SignInMode.java +++ b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/SignInMode.java @@ -15,5 +15,7 @@ package com.google.gerrit.httpd.auth.openid; enum SignInMode { - SIGN_IN, LINK_IDENTIY, REGISTER + SIGN_IN, + LINK_IDENTIY, + REGISTER } diff --git a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/XrdsFilter.java b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/XrdsFilter.java index 92230f687d..2f7f4bd095 100644 --- a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/XrdsFilter.java +++ b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/XrdsFilter.java @@ -4,9 +4,7 @@ import com.google.gerrit.server.config.CanonicalWebUrl; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; - import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -25,18 +23,16 @@ class XrdsFilter implements Filter { } @Override - public void doFilter(ServletRequest request, ServletResponse response, - FilterChain chain) throws IOException, ServletException { + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { HttpServletResponse rsp = (HttpServletResponse) response; rsp.setHeader("X-XRDS-Location", url.get() + XrdsServlet.LOCATION); chain.doFilter(request, response); } @Override - public void init(FilterConfig config) { - } + public void init(FilterConfig config) {} @Override - public void destroy() { - } + public void destroy() {} } diff --git a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/XrdsServlet.java b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/XrdsServlet.java index b48d3ed230..5ff40578d7 100644 --- a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/XrdsServlet.java +++ b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/XrdsServlet.java @@ -20,9 +20,7 @@ import com.google.gerrit.server.config.CanonicalWebUrl; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; - import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -41,11 +39,9 @@ class XrdsServlet extends HttpServlet { } @Override - protected void doGet(HttpServletRequest req, HttpServletResponse rsp) - throws IOException { + protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException { final StringBuilder r = new StringBuilder(); - r.append(""); + r.append(""); r.append(""); r.append(""); r.append("http://specs.openid.net/auth/2.0/return_to"); - r.append("").append(url.get()).append(OpenIdServiceImpl.RETURN_URL) - .append(""); + r.append("").append(url.get()).append(OpenIdServiceImpl.RETURN_URL).append(""); r.append(""); r.append(""); r.append(""); diff --git a/gerrit-patch-commonsnet/src/main/java/org/apache/commons/net/smtp/AuthSMTPClient.java b/gerrit-patch-commonsnet/src/main/java/org/apache/commons/net/smtp/AuthSMTPClient.java index 63bb842fd0..48890ddf76 100644 --- a/gerrit-patch-commonsnet/src/main/java/org/apache/commons/net/smtp/AuthSMTPClient.java +++ b/gerrit-patch-commonsnet/src/main/java/org/apache/commons/net/smtp/AuthSMTPClient.java @@ -17,9 +17,6 @@ package org.apache.commons.net.smtp; import static java.nio.charset.StandardCharsets.UTF_8; import com.google.gerrit.util.ssl.BlindSSLSocketFactory; - -import org.apache.commons.codec.binary.Base64; - import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; @@ -31,12 +28,12 @@ import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.Arrays; import java.util.List; - import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import javax.net.ssl.SSLParameters; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; +import org.apache.commons.codec.binary.Base64; public class AuthSMTPClient extends SMTPClient { private String authTypes; @@ -60,7 +57,7 @@ public class AuthSMTPClient extends SMTPClient { if (verify) { SSLParameters sslParams = new SSLParameters(); sslParams.setEndpointIdentificationAlgorithm("HTTPS"); - ((SSLSocket)_socket_).setSSLParameters(sslParams); + ((SSLSocket) _socket_).setSSLParameters(sslParams); } // XXX: Can't call _connectAction_() because SMTP server doesn't @@ -72,10 +69,8 @@ public class AuthSMTPClient extends SMTPClient { _socket_.setSoTimeout(_timeout_); _input_ = _socket_.getInputStream(); _output_ = _socket_.getOutputStream(); - _reader = - new BufferedReader(new InputStreamReader(_input_, UTF_8)); - _writer = - new BufferedWriter(new OutputStreamWriter(_output_, UTF_8)); + _reader = new BufferedReader(new InputStreamReader(_input_, UTF_8)); + _writer = new BufferedWriter(new OutputStreamWriter(_output_, UTF_8)); return true; } @@ -154,8 +149,8 @@ public class AuthSMTPClient extends SMTPClient { return SMTPReply.isPositiveCompletion(sendCommand(cmd)); } - private boolean authLogin(String smtpUser, String smtpPass) throws UnsupportedEncodingException, - IOException { + private boolean authLogin(String smtpUser, String smtpPass) + throws UnsupportedEncodingException, IOException { if (sendCommand("AUTH", "LOGIN") != 334) { return false; } @@ -169,8 +164,9 @@ public class AuthSMTPClient extends SMTPClient { return SMTPReply.isPositiveCompletion(sendCommand(cmd)); } - private static final char[] hexchar = - {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; + private static final char[] hexchar = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' + }; private String toHex(final byte[] b) { final StringBuilder sec = new StringBuilder(); @@ -183,8 +179,8 @@ public class AuthSMTPClient extends SMTPClient { return sec.toString(); } - private boolean authPlain(String smtpUser, String smtpPass) throws UnsupportedEncodingException, - IOException { + private boolean authPlain(String smtpUser, String smtpPass) + throws UnsupportedEncodingException, IOException { String token = '\0' + smtpUser + '\0' + smtpPass; String cmd = "PLAIN " + encodeBase64(token.getBytes(UTF_8)); return SMTPReply.isPositiveCompletion(sendCommand("AUTH", cmd)); diff --git a/gerrit-patch-jgit/src/main/java/org/eclipse/jgit/diff/EditDeserializer.java b/gerrit-patch-jgit/src/main/java/org/eclipse/jgit/diff/EditDeserializer.java index a99b3607cc..8090f602c5 100644 --- a/gerrit-patch-jgit/src/main/java/org/eclipse/jgit/diff/EditDeserializer.java +++ b/gerrit-patch-jgit/src/main/java/org/eclipse/jgit/diff/EditDeserializer.java @@ -23,16 +23,15 @@ import com.google.gson.JsonParseException; import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; - import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; -public class EditDeserializer implements JsonDeserializer, - JsonSerializer { +public class EditDeserializer implements JsonDeserializer, JsonSerializer { @Override - public Edit deserialize(final JsonElement json, final Type typeOfT, - final JsonDeserializationContext context) throws JsonParseException { + public Edit deserialize( + final JsonElement json, final Type typeOfT, final JsonDeserializationContext context) + throws JsonParseException { if (json.isJsonNull()) { return null; } @@ -51,7 +50,7 @@ public class EditDeserializer implements JsonDeserializer, } List l = new ArrayList<>((cnt / 4) - 1); - for (int i = 4; i < cnt;) { + for (int i = 4; i < cnt; ) { int as = get(o, i++); int ae = get(o, i++); int bs = get(o, i++); @@ -61,8 +60,7 @@ public class EditDeserializer implements JsonDeserializer, return new ReplaceEdit(get(o, 0), get(o, 1), get(o, 2), get(o, 3), l); } - private static int get(final JsonArray a, final int idx) - throws JsonParseException { + private static int get(final JsonArray a, final int idx) throws JsonParseException { final JsonElement v = a.get(idx); if (!v.isJsonPrimitive()) { throw new JsonParseException("Expected array of 4 for Edit type"); @@ -75,8 +73,8 @@ public class EditDeserializer implements JsonDeserializer, } @Override - public JsonElement serialize(final Edit src, final Type typeOfSrc, - final JsonSerializationContext context) { + public JsonElement serialize( + final Edit src, final Type typeOfSrc, final JsonSerializationContext context) { if (src == null) { return JsonNull.INSTANCE; } diff --git a/gerrit-patch-jgit/src/main/java/org/eclipse/jgit/diff/Edit_JsonSerializer.java b/gerrit-patch-jgit/src/main/java/org/eclipse/jgit/diff/Edit_JsonSerializer.java index 1a3714b4cb..ce8a9f3933 100644 --- a/gerrit-patch-jgit/src/main/java/org/eclipse/jgit/diff/Edit_JsonSerializer.java +++ b/gerrit-patch-jgit/src/main/java/org/eclipse/jgit/diff/Edit_JsonSerializer.java @@ -16,7 +16,6 @@ package org.eclipse.jgit.diff; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwtjsonrpc.client.impl.JsonSerializer; - import java.util.ArrayList; import java.util.List; @@ -36,7 +35,7 @@ public class Edit_JsonSerializer extends JsonSerializer { } List l = new ArrayList<>((cnt / 4) - 1); - for (int i = 4; i < cnt;) { + for (int i = 4; i < cnt; ) { int as = get(o, i++); int ae = get(o, i++); int bs = get(o, i++); @@ -69,9 +68,7 @@ public class Edit_JsonSerializer extends JsonSerializer { sb.append(o.getEndB()); } - private static native int length(JavaScriptObject jso) - /*-{ return jso.length; }-*/; + private static native int length(JavaScriptObject jso) /*-{ return jso.length; }-*/; - private static native int get(JavaScriptObject jso, int idx) - /*-{ return jso[idx]; }-*/; + private static native int get(JavaScriptObject jso, int idx) /*-{ return jso[idx]; }-*/; } diff --git a/gerrit-patch-jgit/src/main/java/org/eclipse/jgit/internal/storage/file/WindowCacheStatAccessor.java b/gerrit-patch-jgit/src/main/java/org/eclipse/jgit/internal/storage/file/WindowCacheStatAccessor.java index 1e94050ef5..f8c434063a 100644 --- a/gerrit-patch-jgit/src/main/java/org/eclipse/jgit/internal/storage/file/WindowCacheStatAccessor.java +++ b/gerrit-patch-jgit/src/main/java/org/eclipse/jgit/internal/storage/file/WindowCacheStatAccessor.java @@ -26,6 +26,5 @@ public class WindowCacheStatAccessor { return WindowCache.getInstance().getOpenBytes(); } - private WindowCacheStatAccessor() { - } + private WindowCacheStatAccessor() {} } diff --git a/gerrit-patch-jgit/src/main/java/org/eclipse/jgit/lib/ObjectIdSerialization.java b/gerrit-patch-jgit/src/main/java/org/eclipse/jgit/lib/ObjectIdSerialization.java index 1d9d9d5127..6617793368 100644 --- a/gerrit-patch-jgit/src/main/java/org/eclipse/jgit/lib/ObjectIdSerialization.java +++ b/gerrit-patch-jgit/src/main/java/org/eclipse/jgit/lib/ObjectIdSerialization.java @@ -14,25 +14,23 @@ package org.eclipse.jgit.lib; -import org.eclipse.jgit.util.IO; - import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import org.eclipse.jgit.util.IO; public class ObjectIdSerialization { public static void writeCanBeNull(final OutputStream out, final AnyObjectId id) throws IOException { if (id != null) { - out.write((byte)1); + out.write((byte) 1); writeNotNull(out, id); } else { - out.write((byte)0); + out.write((byte) 0); } } - public static void writeNotNull(final OutputStream out, final AnyObjectId id) - throws IOException { + public static void writeNotNull(final OutputStream out, final AnyObjectId id) throws IOException { id.copyRawTo(out); } @@ -53,6 +51,5 @@ public class ObjectIdSerialization { return ObjectId.fromRaw(b); } - private ObjectIdSerialization() { - } + private ObjectIdSerialization() {} } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Cat.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Cat.java index 22145873ed..940c9db724 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Cat.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Cat.java @@ -16,11 +16,9 @@ package com.google.gerrit.pgm; import com.google.gerrit.launcher.GerritLauncher; import com.google.gerrit.pgm.util.AbstractProgram; - -import org.kohsuke.args4j.Argument; - import java.io.IOException; import java.io.InputStream; +import org.kohsuke.args4j.Argument; /** Dump the contents of a file in our archive. */ public class Cat extends AbstractProgram { diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Daemon.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Daemon.java index ec00a63028..22f0f3efa4 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Daemon.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Daemon.java @@ -98,20 +98,17 @@ import com.google.inject.Key; import com.google.inject.Module; import com.google.inject.Provider; import com.google.inject.Stage; - -import org.eclipse.jgit.lib.Config; -import org.kohsuke.args4j.Option; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.lang.Thread.UncaughtExceptionHandler; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; - import javax.servlet.http.HttpServletRequest; +import org.eclipse.jgit.lib.Config; +import org.kohsuke.args4j.Option; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** Run SSH daemon portions of Gerrit. */ public class Daemon extends SiteProgram { @@ -151,8 +148,11 @@ public class Daemon extends SiteProgram { @Option(name = "--polygerrit-dev", usage = "Force PolyGerrit UI for development") private boolean polyGerritDev; - @Option(name = "--init", aliases = {"-i"}, - usage = "Init site before starting the daemon") + @Option( + name = "--init", + aliases = {"-i"}, + usage = "Init site before starting the daemon" + ) private boolean doInit; @Option(name = "--stop-only", usage = "Stop the daemon", hidden = true) @@ -174,12 +174,11 @@ public class Daemon extends SiteProgram { private Runnable serverStarted; private IndexType indexType; - public Daemon() { - } + public Daemon() {} @VisibleForTesting public Daemon(Runnable serverStarted, Path sitePath) { - super (sitePath); + super(sitePath); this.serverStarted = serverStarted; } @@ -206,12 +205,13 @@ public class Daemon extends SiteProgram { } } mustHaveValidSite(); - Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { - @Override - public void uncaughtException(Thread t, Throwable e) { - log.error("Thread " + t.getName() + " threw exception", e); - } - }); + Thread.setDefaultUncaughtExceptionHandler( + new UncaughtExceptionHandler() { + @Override + public void uncaughtException(Thread t, Throwable e) { + log.error("Thread " + t.getName() + " threw exception", e); + } + }); if (runId != null) { runFile = getSitePath().resolve("logs").resolve("gerrit.run"); @@ -227,13 +227,14 @@ public class Daemon extends SiteProgram { try { start(); - RuntimeShutdown.add(new Runnable() { - @Override - public void run() { - log.info("caught shutdown, cleaning up"); - stop(); - } - }); + RuntimeShutdown.add( + new Runnable() { + @Override + public void run() { + log.info("caught shutdown, cleaning up"); + stop(); + } + }); log.info("Gerrit Code Review " + myVersion() + " ready"); if (runId != null) { @@ -295,14 +296,12 @@ public class Daemon extends SiteProgram { dbInjector = createDbInjector(true /* enableMetrics */, MULTI_USER); } cfgInjector = createCfgInjector(); - config = cfgInjector.getInstance( - Key.get(Config.class, GerritServerConfig.class)); + config = cfgInjector.getInstance(Key.get(Config.class, GerritServerConfig.class)); if (!slave) { initIndexType(); } sysInjector = createSysInjector(); - sysInjector.getInstance(PluginGuiceEnvironment.class) - .setDbCfgInjector(dbInjector, cfgInjector); + sysInjector.getInstance(PluginGuiceEnvironment.class).setDbCfgInjector(dbInjector, cfgInjector); manager.add(dbInjector, cfgInjector, sysInjector); if (!consoleLog) { @@ -360,9 +359,10 @@ public class Daemon extends SiteProgram { modules.add(new WorkQueue.Module()); modules.add(new StreamEventsApiListener.Module()); modules.add(new EventBroker.Module()); - modules.add(test - ? new H2AccountPatchReviewStore.InMemoryModule() - : new H2AccountPatchReviewStore.Module()); + modules.add( + test + ? new H2AccountPatchReviewStore.InMemoryModule() + : new H2AccountPatchReviewStore.Module()); modules.add(new ReceiveCommitsExecutorModule()); modules.add(new DiffExecutorModule()); modules.add(new MimeUtil2Module()); @@ -382,37 +382,41 @@ public class Daemon extends SiteProgram { modules.add(new GpgModule(config)); modules.add(new StartupChecks.Module()); if (MoreObjects.firstNonNull(httpd, true)) { - modules.add(new CanonicalWebUrlModule() { - @Override - protected Class> provider() { - return HttpCanonicalWebUrlProvider.class; - } - }); + modules.add( + new CanonicalWebUrlModule() { + @Override + protected Class> provider() { + return HttpCanonicalWebUrlProvider.class; + } + }); } else { - modules.add(new CanonicalWebUrlModule() { - @Override - protected Class> provider() { - return CanonicalWebUrlProvider.class; - } - }); + modules.add( + new CanonicalWebUrlModule() { + @Override + protected Class> provider() { + return CanonicalWebUrlProvider.class; + } + }); } if (sshd) { modules.add(SshKeyCacheImpl.module()); } else { modules.add(NoSshKeyCache.module()); } - modules.add(new AbstractModule() { - @Override - protected void configure() { - bind(GerritOptions.class).toInstance( - new GerritOptions(config, headless, slave, polyGerritDev)); - if (test) { - bind(String.class).annotatedWith(SecureStoreClassName.class) - .toInstance(DefaultSecureStore.class.getName()); - bind(SecureStore.class).toProvider(SecureStoreProvider.class); - } - } - }); + modules.add( + new AbstractModule() { + @Override + protected void configure() { + bind(GerritOptions.class) + .toInstance(new GerritOptions(config, headless, slave, polyGerritDev)); + if (test) { + bind(String.class) + .annotatedWith(SecureStoreClassName.class) + .toInstance(DefaultSecureStore.class.getName()); + bind(SecureStore.class).toProvider(SecureStoreProvider.class); + } + } + }); modules.add(new GarbageCollectionModule()); if (!slave) { modules.add(new ChangeCleanupRunner.Module()); @@ -450,8 +454,7 @@ public class Daemon extends SiteProgram { private void initSshd() { sshInjector = createSshInjector(); - sysInjector.getInstance(PluginGuiceEnvironment.class) - .setSshInjector(sshInjector); + sysInjector.getInstance(PluginGuiceEnvironment.class).setSshInjector(sshInjector); manager.add(sshInjector); } @@ -461,9 +464,11 @@ public class Daemon extends SiteProgram { if (!test) { modules.add(new SshHostKeyModule()); } - modules.add(new DefaultCommandModule(slave, - sysInjector.getInstance(DownloadConfig.class), - sysInjector.getInstance(LfsPluginAuthCommand.Module.class))); + modules.add( + new DefaultCommandModule( + slave, + sysInjector.getInstance(DownloadConfig.class), + sysInjector.getInstance(LfsPluginAuthCommand.Module.class))); if (!slave && indexType == IndexType.LUCENE) { modules.add(new IndexCommandsModule()); } @@ -473,12 +478,11 @@ public class Daemon extends SiteProgram { private void initHttpd() { webInjector = createWebInjector(); - sysInjector.getInstance(PluginGuiceEnvironment.class) - .setHttpInjector(webInjector); + sysInjector.getInstance(PluginGuiceEnvironment.class).setHttpInjector(webInjector); - sysInjector.getInstance(HttpCanonicalWebUrlProvider.class) - .setHttpServletRequest( - webInjector.getProvider(HttpServletRequest.class)); + sysInjector + .getInstance(HttpCanonicalWebUrlProvider.class) + .setHttpServletRequest(webInjector.getProvider(HttpServletRequest.class)); httpdInjector = createHttpdInjector(); manager.add(webInjector, httpdInjector); @@ -504,8 +508,8 @@ public class Daemon extends SiteProgram { } AuthConfig authConfig = cfgInjector.getInstance(AuthConfig.class); - if (authConfig.getAuthType() == AuthType.OPENID || - authConfig.getAuthType() == AuthType.OPENID_SSO) { + if (authConfig.getAuthType() == AuthType.OPENID + || authConfig.getAuthType() == AuthType.OPENID_SSO) { modules.add(new OpenIdModule()); } else if (authConfig.getAuthType() == AuthType.OAUTH) { modules.add(new OAuthModule()); diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Gsql.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Gsql.java index 8e09578372..b1a50d7849 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Gsql.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Gsql.java @@ -23,10 +23,8 @@ import com.google.gerrit.pgm.util.SiteProgram; import com.google.gerrit.sshd.commands.QueryShell; import com.google.gerrit.sshd.commands.QueryShell.Factory; import com.google.inject.Injector; - -import org.kohsuke.args4j.Option; - import java.io.IOException; +import org.kohsuke.args4j.Option; /** Run Gerrit's SQL query tool */ public class Gsql extends SiteProgram { @@ -46,17 +44,18 @@ public class Gsql extends SiteProgram { dbInjector = createDbInjector(SINGLE_USER); manager.add(dbInjector); manager.start(); - RuntimeShutdown.add(new Runnable() { - @Override - public void run() { - try { - System.in.close(); - } catch (IOException e) { - // Ignored - } - manager.stop(); - } - }); + RuntimeShutdown.add( + new Runnable() { + @Override + public void run() { + try { + System.in.close(); + } catch (IOException e) { + // Ignored + } + manager.stop(); + } + }); final QueryShell shell = shellFactory().create(System.in, System.out); shell.setOutputFormat(format); if (query != null) { @@ -68,11 +67,14 @@ public class Gsql extends SiteProgram { } private Factory shellFactory() { - return dbInjector.createChildInjector(new FactoryModule() { - @Override - protected void configure() { - factory(QueryShell.Factory.class); - } - }).getInstance(QueryShell.Factory.class); + return dbInjector + .createChildInjector( + new FactoryModule() { + @Override + protected void configure() { + factory(QueryShell.Factory.class); + } + }) + .getInstance(QueryShell.Factory.class); } } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Init.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Init.java index b3813f600c..6e7e3de8a3 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Init.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Init.java @@ -33,24 +33,24 @@ import com.google.inject.Guice; import com.google.inject.Inject; import com.google.inject.Module; import com.google.inject.util.Providers; - -import org.kohsuke.args4j.Option; - import java.io.IOException; import java.nio.file.Path; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; +import org.kohsuke.args4j.Option; /** Initialize a new Gerrit installation. */ public class Init extends BaseInit { - @Option(name = "--batch", aliases = {"-b"}, - usage = "Batch mode; skip interactive prompting") + @Option( + name = "--batch", + aliases = {"-b"}, + usage = "Batch mode; skip interactive prompting" + ) private boolean batchMode; - @Option(name = "--delete-caches", - usage = "Delete all persistent caches without asking") + @Option(name = "--delete-caches", usage = "Delete all persistent caches without asking") private boolean deleteCaches; @Option(name = "--no-auto-start", usage = "Don't automatically start daemon after init") @@ -65,16 +65,16 @@ public class Init extends BaseInit { @Option(name = "--install-plugin", usage = "Install given plugin without asking") private List installPlugins; - @Option(name = "--install-all-plugins", - usage = "Install all plugins from war without asking") + @Option(name = "--install-all-plugins", usage = "Install all plugins from war without asking") private boolean installAllPlugins; - @Option(name = "--secure-store-lib", - usage = "Path to jar providing SecureStore implementation class") + @Option( + name = "--secure-store-lib", + usage = "Path to jar providing SecureStore implementation class" + ) private String secureStoreLib; - @Option(name = "--dev", - usage = "Setup site with default options suitable for developers") + @Option(name = "--dev", usage = "Setup site with default options suitable for developers") private boolean dev; @Option(name = "--skip-all-downloads", usage = "Don't download libraries") @@ -83,8 +83,7 @@ public class Init extends BaseInit { @Option(name = "--skip-download", usage = "Don't download given library") private List skippedDownloads; - @Inject - Browser browser; + @Inject Browser browser; public Init() { super(new WarDistribution(), null); @@ -102,12 +101,10 @@ public class Init extends BaseInit { if (!skipPlugins) { final List plugins = - InitPlugins.listPluginsAndRemoveTempFiles(init.site, - pluginsDistribution); + InitPlugins.listPluginsAndRemoveTempFiles(init.site, pluginsDistribution); ConsoleUI ui = ConsoleUI.getInstance(false); if (installAllPlugins && !nullOrEmpty(installPlugins)) { - ui.message( - "Cannot use --install-plugin together with --install-all-plugins.\n"); + ui.message("Cannot use --install-plugin together with --install-all-plugins.\n"); return true; } verifyInstallPluginList(ui, plugins); @@ -129,15 +126,17 @@ public class Init extends BaseInit { @Override protected void afterInit(SiteRun run) throws Exception { List modules = new ArrayList<>(); - modules.add(new AbstractModule() { - @Override - protected void configure() { - bind(Path.class).annotatedWith(SitePath.class).toInstance(getSitePath()); - bind(Browser.class); - bind(String.class).annotatedWith(SecureStoreClassName.class) - .toProvider(Providers.of(getConfiguredSecureStoreClass())); - } - }); + modules.add( + new AbstractModule() { + @Override + protected void configure() { + bind(Path.class).annotatedWith(SitePath.class).toInstance(getSitePath()); + bind(Browser.class); + bind(String.class) + .annotatedWith(SecureStoreClassName.class) + .toProvider(Providers.of(getConfiguredSecureStoreClass())); + } + }); modules.add(new GerritServerConfigModule()); Guice.createInjector(modules).injectMembers(this); start(run); @@ -168,7 +167,6 @@ public class Init extends BaseInit { return deleteCaches; } - @Override protected boolean skipPlugins() { return skipPlugins; @@ -186,9 +184,7 @@ public class Init extends BaseInit { @Override protected List getSkippedDownloads() { - return skippedDownloads != null - ? skippedDownloads - : Collections. emptyList(); + return skippedDownloads != null ? skippedDownloads : Collections.emptyList(); } @Override @@ -230,7 +226,7 @@ public class Init extends BaseInit { IoUtil.copyWithThread(proc.getInputStream(), System.err); IoUtil.copyWithThread(proc.getErrorStream(), System.err); - for (;;) { + for (; ; ) { try { int rc = proc.waitFor(); if (rc != 0) { diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/JythonShell.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/JythonShell.java index b09278421c..612f0bda2a 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/JythonShell.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/JythonShell.java @@ -15,10 +15,6 @@ package com.google.gerrit.pgm; import com.google.gerrit.launcher.GerritLauncher; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -28,6 +24,8 @@ import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.Properties; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class JythonShell { private static final Logger log = LoggerFactory.getLogger(JythonShell.class); @@ -38,7 +36,7 @@ public class JythonShell { private Class pyObject; private Class pySystemState; private Object shell; - private ArrayList injectedVariables; + private ArrayList injectedVariables; public JythonShell() { Properties env = new Properties(); @@ -72,10 +70,12 @@ public class JythonShell { pyObject = findClass("org.python.core.PyObject"); pySystemState = findClass("org.python.core.PySystemState"); - runMethod(pySystemState, pySystemState, "initialize", - new Class[] { Properties.class, Properties.class }, - new Object[] { null, env } - ); + runMethod( + pySystemState, + pySystemState, + "initialize", + new Class[] {Properties.class, Properties.class}, + new Object[] {null, env}); try { shell = console.newInstance(); @@ -87,21 +87,23 @@ public class JythonShell { set("Shell", this); } - protected Object runMethod0(Class klazz, Object instance, - String name, Class[] sig, Object[] args) + protected Object runMethod0( + Class klazz, Object instance, String name, Class[] sig, Object[] args) throws InvocationTargetException { try { Method m; m = klazz.getMethod(name, sig); return m.invoke(instance, args); - } catch (NoSuchMethodException | IllegalAccessException - | IllegalArgumentException | SecurityException e) { + } catch (NoSuchMethodException + | IllegalAccessException + | IllegalArgumentException + | SecurityException e) { throw cannotStart(e); } } - protected Object runMethod(Class klazz, Object instance, - String name, Class[] sig, Object[] args) { + protected Object runMethod( + Class klazz, Object instance, String name, Class[] sig, Object[] args) { try { return runMethod0(klazz, instance, name, sig, args); } catch (InvocationTargetException e) { @@ -114,15 +116,14 @@ public class JythonShell { } protected String getDefaultBanner() { - return (String)runInterpreter("getDefaultBanner", - new Class[] { }, new Object[] { }); + return (String) runInterpreter("getDefaultBanner", new Class[] {}, new Object[] {}); } protected void printInjectedVariable(String id) { - runInterpreter("exec", - new Class[] { String.class }, - new Object[] { "print '\"%s\" is \"%s\"' % (\"" + id + "\", " + id + ")" } - ); + runInterpreter( + "exec", + new Class[] {String.class}, + new Object[] {"print '\"%s\" is \"%s\"' % (\"" + id + "\", " + id + ")"}); } public void run() { @@ -130,18 +131,19 @@ public class JythonShell { printInjectedVariable(key); } reload(); - runInterpreter("interact", - new Class[] { String.class, pyObject }, - new Object[] { getDefaultBanner() + - " running for Gerrit " + com.google.gerrit.common.Version.getVersion(), - null, }); + runInterpreter( + "interact", + new Class[] {String.class, pyObject}, + new Object[] { + getDefaultBanner() + + " running for Gerrit " + + com.google.gerrit.common.Version.getVersion(), + null, + }); } public void set(String key, Object content) { - runInterpreter("set", - new Class[] { String.class, Object.class }, - new Object[] { key, content } - ); + runInterpreter("set", new Class[] {String.class, Object.class}, new Object[] {key, content}); injectedVariables.add(key); } @@ -174,14 +176,17 @@ public class JythonShell { try { File script = new File(parent, p); if (script.canExecute()) { - runMethod0(console, shell, "execfile", - new Class[] { String.class }, - new Object[] { script.getAbsolutePath() } - ); + runMethod0( + console, + shell, + "execfile", + new Class[] {String.class}, + new Object[] {script.getAbsolutePath()}); } else { - log.info("User initialization file " - + script.getAbsolutePath() - + " is not found or not executable"); + log.info( + "User initialization file " + + script.getAbsolutePath() + + " is not found or not executable"); } } catch (InvocationTargetException e) { log.error("Exception occurred while loading file " + p + " : ", e); @@ -192,10 +197,12 @@ public class JythonShell { protected void execStream(final InputStream in, final String p) { try { - runMethod0(console, shell, "execfile", - new Class[] { InputStream.class, String.class }, - new Object[] { in, p } - ); + runMethod0( + console, + shell, + "execfile", + new Class[] {InputStream.class, String.class}, + new Object[] {in, p}); } catch (InvocationTargetException e) { log.error("Exception occurred while loading " + p + " : ", e); } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/LocalUsernamesToLowerCase.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/LocalUsernamesToLowerCase.java index bd9ed8fc15..72b8078adb 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/LocalUsernamesToLowerCase.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/LocalUsernamesToLowerCase.java @@ -25,14 +25,12 @@ import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.SchemaFactory; import com.google.inject.Inject; import com.google.inject.Injector; - -import org.eclipse.jgit.lib.TextProgressMonitor; -import org.kohsuke.args4j.Option; - import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Locale; +import org.eclipse.jgit.lib.TextProgressMonitor; +import org.kohsuke.args4j.Option; /** Converts the local username for all accounts to lower case */ public class LocalUsernamesToLowerCase extends SiteProgram { @@ -45,8 +43,7 @@ public class LocalUsernamesToLowerCase extends SiteProgram { private Injector dbInjector; - @Inject - private SchemaFactory database; + @Inject private SchemaFactory database; @Override public int run() throws Exception { @@ -55,8 +52,7 @@ public class LocalUsernamesToLowerCase extends SiteProgram { } dbInjector = createDbInjector(MULTI_USER); - manager.add(dbInjector, - dbInjector.createChildInjector(SchemaVersionCheck.module())); + manager.add(dbInjector, dbInjector.createChildInjector(SchemaVersionCheck.module())); manager.start(); dbInjector.injectMembers(this); @@ -83,15 +79,13 @@ public class LocalUsernamesToLowerCase extends SiteProgram { return 0; } - private void convertLocalUserToLowerCase(final ReviewDb db, - final AccountExternalId extId) { + private void convertLocalUserToLowerCase(final ReviewDb db, final AccountExternalId extId) { if (extId.isScheme(AccountExternalId.SCHEME_GERRIT)) { final String localUser = extId.getSchemeRest(); final String localUserLowerCase = localUser.toLowerCase(Locale.US); if (!localUser.equals(localUserLowerCase)) { final AccountExternalId.Key extIdKeyLowerCase = - new AccountExternalId.Key(AccountExternalId.SCHEME_GERRIT, - localUserLowerCase); + new AccountExternalId.Key(AccountExternalId.SCHEME_GERRIT, localUserLowerCase); final AccountExternalId extIdLowerCase = new AccountExternalId(extId.getAccountId(), extIdKeyLowerCase); try { @@ -117,7 +111,7 @@ public class LocalUsernamesToLowerCase extends SiteProgram { @Override public void run() { try (ReviewDb db = database.open()) { - for (;;) { + for (; ; ) { final AccountExternalId extId = next(); if (extId == null) { break; diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Ls.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Ls.java index 9f6436b2f6..4211c175ed 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Ls.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Ls.java @@ -16,7 +16,6 @@ package com.google.gerrit.pgm; import com.google.gerrit.launcher.GerritLauncher; import com.google.gerrit.pgm.util.AbstractProgram; - import java.io.IOException; import java.util.Enumeration; import java.util.zip.ZipEntry; diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Passwd.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Passwd.java index 643323f09d..d9c3c5d836 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Passwd.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Passwd.java @@ -28,30 +28,31 @@ import com.google.inject.Injector; import com.google.inject.Module; import com.google.inject.TypeLiteral; import com.google.inject.util.Providers; - -import org.kohsuke.args4j.Argument; - import java.nio.file.Path; import java.util.ArrayList; import java.util.List; +import org.kohsuke.args4j.Argument; public class Passwd extends SiteProgram { private String section; private String key; - @Argument(metaVar = "SECTION.KEY", index = 0, required = true, - usage = "Section and key separated by a dot of the password to set") + @Argument( + metaVar = "SECTION.KEY", + index = 0, + required = true, + usage = "Section and key separated by a dot of the password to set" + ) private String sectionAndKey; - @Argument(metaVar = "PASSWORD", index = 1, required = false, - usage = "Password to set") + @Argument(metaVar = "PASSWORD", index = 1, required = false, usage = "Password to set") private String password; private void init() { String[] varParts = sectionAndKey.split("\\."); if (varParts.length != 2) { - throw new IllegalArgumentException("Invalid name '" + sectionAndKey - + "': expected section.key format"); + throw new IllegalArgumentException( + "Invalid name '" + sectionAndKey + "': expected section.key format"); } section = varParts[0]; key = varParts[1]; @@ -67,22 +68,22 @@ public class Passwd extends SiteProgram { private Injector getSysInjector() { List modules = new ArrayList<>(); - modules.add(new FactoryModule() { - @Override - protected void configure() { - bind(Path.class).annotatedWith(SitePath.class) - .toInstance(getSitePath()); - bind(ConsoleUI.class).toInstance( - ConsoleUI.getInstance(password != null)); - factory(Section.Factory.class); - bind(Boolean.class).annotatedWith(InstallAllPlugins.class).toInstance( - Boolean.FALSE); - bind(new TypeLiteral>() {}).annotatedWith( - InstallPlugins.class).toInstance(new ArrayList()); - bind(String.class).annotatedWith(SecureStoreClassName.class) - .toProvider(Providers.of(getConfiguredSecureStoreClass())); - } - }); + modules.add( + new FactoryModule() { + @Override + protected void configure() { + bind(Path.class).annotatedWith(SitePath.class).toInstance(getSitePath()); + bind(ConsoleUI.class).toInstance(ConsoleUI.getInstance(password != null)); + factory(Section.Factory.class); + bind(Boolean.class).annotatedWith(InstallAllPlugins.class).toInstance(Boolean.FALSE); + bind(new TypeLiteral>() {}) + .annotatedWith(InstallPlugins.class) + .toInstance(new ArrayList()); + bind(String.class) + .annotatedWith(SecureStoreClassName.class) + .toProvider(Providers.of(getConfiguredSecureStoreClass())); + } + }); modules.add(new GerritServerConfigModule()); return Guice.createInjector(modules); } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/PrologShell.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/PrologShell.java index 58162a148c..83bcf4a330 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/PrologShell.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/PrologShell.java @@ -15,19 +15,16 @@ package com.google.gerrit.pgm; import com.google.gerrit.pgm.util.AbstractProgram; - import com.googlecode.prolog_cafe.exceptions.HaltException; import com.googlecode.prolog_cafe.lang.BufferingPrologControl; import com.googlecode.prolog_cafe.lang.Prolog; import com.googlecode.prolog_cafe.lang.PrologClassLoader; import com.googlecode.prolog_cafe.lang.SymbolTerm; - -import org.kohsuke.args4j.Option; - import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import org.kohsuke.args4j.Option; public class PrologShell extends AbstractProgram { @Option(name = "-s", metaVar = "FILE.pl", usage = "file to load") @@ -67,11 +64,12 @@ public class PrologShell extends AbstractProgram { } private void banner() { - System.err.format("Gerrit Code Review %s - Interactive Prolog Shell", + System.err.format( + "Gerrit Code Review %s - Interactive Prolog Shell", com.google.gerrit.common.Version.getVersion()); System.err.println(); - System.err.println("(type Ctrl-D or \"halt.\" to exit," - + " \"['path/to/file.pl'].\" to load a file)"); + System.err.println( + "(type Ctrl-D or \"halt.\" to exit," + " \"['path/to/file.pl'].\" to load a file)"); System.err.println(); System.err.flush(); } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/ProtoGen.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/ProtoGen.java index 7dba8edd46..f659bb0783 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/ProtoGen.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/ProtoGen.java @@ -19,11 +19,6 @@ import static java.nio.charset.StandardCharsets.UTF_8; import com.google.gerrit.pgm.util.AbstractProgram; import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gwtorm.schema.java.JavaSchemaModel; - -import org.eclipse.jgit.internal.storage.file.LockFile; -import org.eclipse.jgit.util.IO; -import org.kohsuke.args4j.Option; - import java.io.BufferedWriter; import java.io.File; import java.io.InputStream; @@ -31,9 +26,18 @@ import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.nio.ByteBuffer; +import org.eclipse.jgit.internal.storage.file.LockFile; +import org.eclipse.jgit.util.IO; +import org.kohsuke.args4j.Option; public class ProtoGen extends AbstractProgram { - @Option(name = "--output", aliases = {"-o"}, required = true, metaVar = "FILE", usage = "File to write .proto into") + @Option( + name = "--output", + aliases = {"-o"}, + required = true, + metaVar = "FILE", + usage = "File to write .proto into" + ) private File file; @Override @@ -45,8 +49,7 @@ public class ProtoGen extends AbstractProgram { try { JavaSchemaModel jsm = new JavaSchemaModel(ReviewDb.class); try (OutputStream o = lock.getOutputStream(); - PrintWriter out = new PrintWriter( - new BufferedWriter(new OutputStreamWriter(o, UTF_8)))) { + PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(o, UTF_8)))) { String header; try (InputStream in = getClass().getResourceAsStream("ProtoGenHeader.txt")) { ByteBuffer buf = IO.readWholeStream(in, 1024); diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/ProtobufImport.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/ProtobufImport.java index 948182e353..07e7921054 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/ProtobufImport.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/ProtobufImport.java @@ -37,11 +37,6 @@ import com.google.inject.Injector; import com.google.protobuf.ByteString; import com.google.protobuf.Parser; import com.google.protobuf.UnknownFieldSet; - -import org.eclipse.jgit.lib.ProgressMonitor; -import org.eclipse.jgit.lib.TextProgressMonitor; -import org.kohsuke.args4j.Option; - import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; @@ -53,29 +48,35 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.eclipse.jgit.lib.ProgressMonitor; +import org.eclipse.jgit.lib.TextProgressMonitor; +import org.kohsuke.args4j.Option; /** * Import data from a protocol buffer dump into the database. - *

- * Takes as input a file containing protocol buffers concatenated together with - * varint length encoding, as in {@link Parser#parseDelimitedFrom(InputStream)}. - * Each message contains a single field with a tag corresponding to the relation - * ID in the {@link com.google.gwtorm.server.Relation} annotation. - *

- * Warning: This method blindly upserts data into the database. - * It should only be used to restore a protobuf-formatted backup into a new, - * empty site. + * + *

Takes as input a file containing protocol buffers concatenated together with varint length + * encoding, as in {@link Parser#parseDelimitedFrom(InputStream)}. Each message contains a single + * field with a tag corresponding to the relation ID in the {@link + * com.google.gwtorm.server.Relation} annotation. + * + *

Warning: This method blindly upserts data into the database. It should only + * be used to restore a protobuf-formatted backup into a new, empty site. */ public class ProtobufImport extends SiteProgram { - @Option(name = "--file", aliases = {"-f"}, required = true, metaVar = "FILE", - usage = "File to import from") + @Option( + name = "--file", + aliases = {"-f"}, + required = true, + metaVar = "FILE", + usage = "File to import from" + ) private File file; private final LifecycleManager manager = new LifecycleManager(); private final Map relations = new HashMap<>(); - @Inject - private SchemaFactory schemaFactory; + @Inject private SchemaFactory schemaFactory; @Override public int run() throws Exception { @@ -84,34 +85,36 @@ public class ProtobufImport extends SiteProgram { Injector dbInjector = createDbInjector(SINGLE_USER); manager.add(dbInjector); manager.start(); - RuntimeShutdown.add(new Runnable() { - @Override - public void run() { - manager.stop(); - } - }); + RuntimeShutdown.add( + new Runnable() { + @Override + public void run() { + manager.stop(); + } + }); dbInjector.injectMembers(this); ProgressMonitor progress = new TextProgressMonitor(); progress.beginTask("Importing entities", ProgressMonitor.UNKNOWN); try (ReviewDb db = schemaFactory.open()) { - for (RelationModel model - : new JavaSchemaModel(ReviewDb.class).getRelations()) { + for (RelationModel model : new JavaSchemaModel(ReviewDb.class).getRelations()) { relations.put(model.getRelationID(), Relation.create(model, db)); } - Parser parser = - UnknownFieldSet.getDefaultInstance().getParserForType(); + Parser parser = UnknownFieldSet.getDefaultInstance().getParserForType(); try (InputStream in = new BufferedInputStream(new FileInputStream(file))) { UnknownFieldSet msg; while ((msg = parser.parseDelimitedFrom(in)) != null) { Map.Entry e = Iterables.getOnlyElement(msg.asMap().entrySet()); - Relation rel = checkNotNull(relations.get(e.getKey()), - "unknown relation ID %s in message: %s", e.getKey(), msg); + Relation rel = + checkNotNull( + relations.get(e.getKey()), + "unknown relation ID %s in message: %s", + e.getKey(), + msg); List values = e.getValue().getLengthDelimitedList(); - checkState(values.size() == 1, - "expected one string field in message: %s", msg); + checkState(values.size() == 1, "expected one string field in message: %s", msg); upsert(rel, values.get(0)); progress.update(1); } @@ -123,8 +126,7 @@ public class ProtobufImport extends SiteProgram { } @SuppressWarnings({"rawtypes", "unchecked"}) - private static void upsert(Relation rel, ByteString s) - throws OrmException { + private static void upsert(Relation rel, ByteString s) throws OrmException { Collection ents = Collections.singleton(rel.codec().decode(s)); try { // Not all relations support update; fall back manually. @@ -138,16 +140,16 @@ public class ProtobufImport extends SiteProgram { @AutoValue abstract static class Relation { private static Relation create(RelationModel model, ReviewDb db) - throws IllegalAccessException, InvocationTargetException, - NoSuchMethodException, ClassNotFoundException { + throws IllegalAccessException, InvocationTargetException, NoSuchMethodException, + ClassNotFoundException { Method m = db.getClass().getMethod(model.getMethodName()); Class clazz = Class.forName(model.getEntityTypeClassName()); return new AutoValue_ProtobufImport_Relation( - (Access) m.invoke(db), - CodecFactory.encoder(clazz)); + (Access) m.invoke(db), CodecFactory.encoder(clazz)); } abstract Access access(); + abstract ProtobufCodec codec(); } } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/RebuildNoteDb.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/RebuildNoteDb.java index 52ce6b2f61..fd104c5c36 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/RebuildNoteDb.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/RebuildNoteDb.java @@ -58,7 +58,14 @@ import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.SchemaFactory; import com.google.inject.Inject; import com.google.inject.Injector; - +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; import org.eclipse.jgit.lib.BatchRefUpdate; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.NullProgressMonitor; @@ -75,61 +82,41 @@ import org.kohsuke.args4j.Option; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; - public class RebuildNoteDb extends SiteProgram { - private static final Logger log = - LoggerFactory.getLogger(RebuildNoteDb.class); + private static final Logger log = LoggerFactory.getLogger(RebuildNoteDb.class); - @Option(name = "--threads", - usage = "Number of threads to use for rebuilding NoteDb") + @Option(name = "--threads", usage = "Number of threads to use for rebuilding NoteDb") private int threads = Runtime.getRuntime().availableProcessors(); - @Option(name = "--project", - usage = "Projects to rebuild; recommended for debugging only") + @Option(name = "--project", usage = "Projects to rebuild; recommended for debugging only") private List projects = new ArrayList<>(); - @Option(name = "--change", - usage = "Individual change numbers to rebuild; recommended for debugging only") + @Option( + name = "--change", + usage = "Individual change numbers to rebuild; recommended for debugging only" + ) private List changes = new ArrayList<>(); private Injector dbInjector; private Injector sysInjector; - @Inject - private AllUsersName allUsersName; + @Inject private AllUsersName allUsersName; - @Inject - private ChangeRebuilder rebuilder; + @Inject private ChangeRebuilder rebuilder; - @Inject - @GerritServerConfig - private Config cfg; + @Inject @GerritServerConfig private Config cfg; - @Inject - private GitRepositoryManager repoManager; + @Inject private GitRepositoryManager repoManager; - @Inject - private NoteDbUpdateManager.Factory updateManagerFactory; + @Inject private NoteDbUpdateManager.Factory updateManagerFactory; - @Inject - private NotesMigration notesMigration; + @Inject private NotesMigration notesMigration; - @Inject - private SchemaFactory schemaFactory; + @Inject private SchemaFactory schemaFactory; - @Inject - private WorkQueue workQueue; + @Inject private WorkQueue workQueue; - @Inject - private ChangeBundleReader bundleReader; + @Inject private ChangeBundleReader bundleReader; @Override public int run() throws Exception { @@ -153,36 +140,34 @@ public class RebuildNoteDb extends SiteProgram { ListeningExecutorService executor = newExecutor(); System.out.println("Rebuilding the NoteDb"); - ImmutableListMultimap changesByProject = - getChangesByProject(); + ImmutableListMultimap changesByProject = getChangesByProject(); boolean ok; Stopwatch sw = Stopwatch.createStarted(); try (Repository allUsersRepo = repoManager.openRepository(allUsersName)) { deleteRefs(RefNames.REFS_DRAFT_COMMENTS, allUsersRepo); List> futures = new ArrayList<>(); - List projectNames = Ordering.usingToString() - .sortedCopy(changesByProject.keySet()); + List projectNames = + Ordering.usingToString().sortedCopy(changesByProject.keySet()); for (final Project.NameKey project : projectNames) { - ListenableFuture future = executor.submit( - new Callable() { - @Override - public Boolean call() { - try (ReviewDb db = unwrapDb(schemaFactory.open())) { - return rebuildProject( - db, changesByProject, project, allUsersRepo); - } catch (Exception e) { - log.error("Error rebuilding project " + project, e); - return false; - } - } - }); + ListenableFuture future = + executor.submit( + new Callable() { + @Override + public Boolean call() { + try (ReviewDb db = unwrapDb(schemaFactory.open())) { + return rebuildProject(db, changesByProject, project, allUsersRepo); + } catch (Exception e) { + log.error("Error rebuilding project " + project, e); + return false; + } + } + }); futures.add(future); } try { - ok = Iterables.all( - Futures.allAsList(futures).get(), Predicates.equalTo(true)); + ok = Iterables.all(Futures.allAsList(futures).get(), Predicates.equalTo(true)); } catch (InterruptedException | ExecutionException e) { log.error("Error rebuilding projects", e); ok = false; @@ -190,53 +175,53 @@ public class RebuildNoteDb extends SiteProgram { } double t = sw.elapsed(TimeUnit.MILLISECONDS) / 1000d; - System.out.format("Rebuild %d changes in %.01fs (%.01f/s)\n", + System.out.format( + "Rebuild %d changes in %.01fs (%.01f/s)\n", changesByProject.size(), t, changesByProject.size() / t); return ok ? 0 : 1; } - private static void execute(BatchRefUpdate bru, Repository repo) - throws IOException { + private static void execute(BatchRefUpdate bru, Repository repo) throws IOException { try (RevWalk rw = new RevWalk(repo)) { bru.execute(rw, NullProgressMonitor.INSTANCE); } for (ReceiveCommand command : bru.getCommands()) { if (command.getResult() != ReceiveCommand.Result.OK) { - throw new IOException(String.format("Command %s failed: %s", - command.toString(), command.getResult())); + throw new IOException( + String.format("Command %s failed: %s", command.toString(), command.getResult())); } } } - private void deleteRefs(String prefix, Repository allUsersRepo) - throws IOException { + private void deleteRefs(String prefix, Repository allUsersRepo) throws IOException { RefDatabase refDb = allUsersRepo.getRefDatabase(); Map allRefs = refDb.getRefs(prefix); BatchRefUpdate bru = refDb.newBatchUpdate(); for (Map.Entry ref : allRefs.entrySet()) { - bru.addCommand(new ReceiveCommand(ref.getValue().getObjectId(), - ObjectId.zeroId(), prefix + ref.getKey())); + bru.addCommand( + new ReceiveCommand( + ref.getValue().getObjectId(), ObjectId.zeroId(), prefix + ref.getKey())); } execute(bru, allUsersRepo); } private Injector createSysInjector() { - return dbInjector.createChildInjector(new FactoryModule() { - @Override - public void configure() { - install(dbInjector.getInstance(BatchProgramModule.class)); - DynamicSet.bind(binder(), GitReferenceUpdatedListener.class).to( - ReindexAfterUpdate.class); - install(new DummyIndexModule()); - factory(ChangeResource.Factory.class); - } - }); + return dbInjector.createChildInjector( + new FactoryModule() { + @Override + public void configure() { + install(dbInjector.getInstance(BatchProgramModule.class)); + DynamicSet.bind(binder(), GitReferenceUpdatedListener.class) + .to(ReindexAfterUpdate.class); + install(new DummyIndexModule()); + factory(ChangeResource.Factory.class); + } + }); } private ListeningExecutorService newExecutor() { if (threads > 0) { - return MoreExecutors.listeningDecorator( - workQueue.createQueue(threads, "RebuildChange")); + return MoreExecutors.listeningDecorator(workQueue.createQueue(threads, "RebuildChange")); } return MoreExecutors.newDirectExecutorService(); } @@ -249,8 +234,8 @@ public class RebuildNoteDb extends SiteProgram { MultimapBuilder.hashKeys().arrayListValues().build(); try (ReviewDb db = schemaFactory.open()) { if (projects.isEmpty() && !changes.isEmpty()) { - Iterable todo = unwrapDb(db).changes() - .get(Iterables.transform(changes, Change.Id::new)); + Iterable todo = + unwrapDb(db).changes().get(Iterables.transform(changes, Change.Id::new)); for (Change c : todo) { changesByProject.put(c.getProject(), c.getId()); } @@ -259,8 +244,7 @@ public class RebuildNoteDb extends SiteProgram { boolean include = false; if (projects.isEmpty() && changes.isEmpty()) { include = true; - } else if (!projects.isEmpty() - && projects.contains(c.getProject().get())) { + } else if (!projects.isEmpty() && projects.contains(c.getProject().get())) { include = true; } else if (!changes.isEmpty() && changes.contains(c.getId().get())) { include = true; @@ -274,24 +258,24 @@ public class RebuildNoteDb extends SiteProgram { } } - private boolean rebuildProject(ReviewDb db, + private boolean rebuildProject( + ReviewDb db, ImmutableListMultimap allChanges, - Project.NameKey project, Repository allUsersRepo) + Project.NameKey project, + Repository allUsersRepo) throws IOException, OrmException { checkArgument(allChanges.containsKey(project)); boolean ok = true; ProgressMonitor pm = new TextProgressMonitor(new PrintWriter(System.out)); - pm.beginTask( - FormatUtil.elide(project.get(), 50), allChanges.get(project).size()); + pm.beginTask(FormatUtil.elide(project.get(), 50), allChanges.get(project).size()); try (NoteDbUpdateManager manager = updateManagerFactory.create(project); ObjectInserter allUsersInserter = allUsersRepo.newObjectInserter(); RevWalk allUsersRw = new RevWalk(allUsersInserter.newReader())) { - manager.setAllUsersRepo(allUsersRepo, allUsersRw, allUsersInserter, - new ChainedReceiveCommands(allUsersRepo)); + manager.setAllUsersRepo( + allUsersRepo, allUsersRw, allUsersInserter, new ChainedReceiveCommands(allUsersRepo)); for (Change.Id changeId : allChanges.get(project)) { try { - rebuilder.buildUpdates( - manager, bundleReader.fromReviewDb(db, changeId)); + rebuilder.buildUpdates(manager, bundleReader.fromReviewDb(db, changeId)); } catch (NoPatchSetsException e) { log.warn(e.getMessage()); } catch (Throwable t) { diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Reindex.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Reindex.java index ee0d02f276..410d0585fd 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Reindex.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Reindex.java @@ -39,11 +39,6 @@ import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Key; import com.google.inject.Module; - -import org.eclipse.jgit.lib.Config; -import org.eclipse.jgit.util.io.NullOutputStream; -import org.kohsuke.args4j.Option; - import java.io.IOException; import java.util.ArrayList; import java.util.Collection; @@ -53,13 +48,18 @@ import java.util.Map; import java.util.Set; import java.util.TreeSet; import java.util.concurrent.TimeUnit; +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.util.io.NullOutputStream; +import org.kohsuke.args4j.Option; public class Reindex extends SiteProgram { @Option(name = "--threads", usage = "Number of threads to use for indexing") private int threads = Runtime.getRuntime().availableProcessors(); - @Option(name = "--changes-schema-version", - usage = "Schema version to reindex, for changes; default is most recent version") + @Option( + name = "--changes-schema-version", + usage = "Schema version to reindex, for changes; default is most recent version" + ) private Integer changesVersion; @Option(name = "--verbose", usage = "Output debug information for each change") @@ -75,15 +75,13 @@ public class Reindex extends SiteProgram { private Injector sysInjector; private Config globalConfig; - @Inject - private Collection> indexDefs; + @Inject private Collection> indexDefs; @Override public int run() throws Exception { mustHaveValidSite(); dbInjector = createDbInjector(MULTI_USER); - globalConfig = - dbInjector.getInstance(Key.get(Config.class, GerritServerConfig.class)); + globalConfig = dbInjector.getInstance(Key.get(Config.class, GerritServerConfig.class)); threads = ThreadLimiter.limitThreads(dbInjector, threads); checkNotSlaveMode(); disableLuceneAutomaticCommit(); @@ -133,15 +131,14 @@ public class Reindex extends SiteProgram { } checkNotNull(indexDefs, "Called this method before injectMembers?"); - Set valid = indexDefs.stream() - .map(IndexDefinition::getName).sorted().collect(toSet()); + Set valid = indexDefs.stream().map(IndexDefinition::getName).sorted().collect(toSet()); Set invalid = Sets.difference(Sets.newHashSet(indices), valid); if (invalid.isEmpty()) { return; } - throw die("invalid index name(s): " + new TreeSet<>(invalid) - + " available indices are: " + valid); + throw die( + "invalid index name(s): " + new TreeSet<>(invalid) + " available indices are: " + valid); } private void checkNotSlaveMode() throws Die { @@ -159,24 +156,23 @@ public class Reindex extends SiteProgram { Module indexModule; switch (IndexModule.getIndexType(dbInjector)) { case LUCENE: - indexModule = LuceneIndexModule.singleVersionWithExplicitVersions( - versions, threads); + indexModule = LuceneIndexModule.singleVersionWithExplicitVersions(versions, threads); break; case ELASTICSEARCH: - indexModule = ElasticIndexModule - .singleVersionWithExplicitVersions(versions, threads); + indexModule = ElasticIndexModule.singleVersionWithExplicitVersions(versions, threads); break; default: throw new IllegalStateException("unsupported index.type"); } modules.add(indexModule); modules.add(dbInjector.getInstance(BatchProgramModule.class)); - modules.add(new FactoryModule() { - @Override - protected void configure() { - factory(ChangeResource.Factory.class); - } - }); + modules.add( + new FactoryModule() { + @Override + protected void configure() { + factory(ChangeResource.Factory.class); + } + }); return dbInjector.createChildInjector(modules); } @@ -192,11 +188,10 @@ public class Reindex extends SiteProgram { globalConfig.setLong("cache", "changes", "maximumWeight", 0); } - private > boolean reindex( - IndexDefinition def) throws IOException { + private > boolean reindex(IndexDefinition def) + throws IOException { I index = def.getIndexCollection().getSearchIndex(); - checkNotNull(index, - "no active search index configured for %s", def.getName()); + checkNotNull(index, "no active search index configured for %s", def.getName()); index.markReady(false); index.deleteAll(); @@ -206,8 +201,8 @@ public class Reindex extends SiteProgram { SiteIndexer.Result result = siteIndexer.indexAll(index); int n = result.doneCount() + result.failedCount(); double t = result.elapsed(TimeUnit.MILLISECONDS) / 1000d; - System.out.format("Reindexed %d documents in %s index in %.01fs (%.01f/s)\n", - n, def.getName(), t, n / t); + System.out.format( + "Reindexed %d documents in %s index in %.01fs (%.01f/s)\n", n, def.getName(), t, n / t); if (result.success()) { index.markReady(true); } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Rulec.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Rulec.java index 7134f49c37..1e542176f1 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Rulec.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Rulec.java @@ -24,20 +24,17 @@ import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.git.GitRepositoryManager; import com.google.inject.Inject; import com.google.inject.Injector; - import com.googlecode.prolog_cafe.exceptions.CompileException; - +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; import org.eclipse.jgit.lib.Repository; import org.kohsuke.args4j.Argument; import org.kohsuke.args4j.Option; -import java.util.ArrayList; -import java.util.LinkedHashSet; -import java.util.List; - /** - * Gets rules.pl at refs/meta/config and compiles into jar file called - * rules-(sha1 of rules.pl).jar in (site-path)/cache/rules + * Gets rules.pl at refs/meta/config and compiles into jar file called rules-(sha1 of rules.pl).jar + * in (site-path)/cache/rules */ public class Rulec extends SiteProgram { @Option(name = "--all", usage = "recompile all rules") @@ -46,30 +43,36 @@ public class Rulec extends SiteProgram { @Option(name = "--quiet", usage = "suppress some messages") private boolean quiet; - @Argument(index = 0, multiValued = true, metaVar = "PROJECT", usage = "project to compile rules for") + @Argument( + index = 0, + multiValued = true, + metaVar = "PROJECT", + usage = "project to compile rules for" + ) private List projectNames = new ArrayList<>(); private Injector dbInjector; private final LifecycleManager manager = new LifecycleManager(); - @Inject - private GitRepositoryManager gitManager; + @Inject private GitRepositoryManager gitManager; - @Inject - private PrologCompiler.Factory jarFactory; + @Inject private PrologCompiler.Factory jarFactory; @Override public int run() throws Exception { dbInjector = createDbInjector(SINGLE_USER); manager.add(dbInjector); manager.start(); - dbInjector.createChildInjector(new FactoryModule() { - @Override - protected void configure() { - factory(PrologCompiler.Factory.class); - } - }).injectMembers(this); + dbInjector + .createChildInjector( + new FactoryModule() { + @Override + protected void configure() { + factory(PrologCompiler.Factory.class); + } + }) + .injectMembers(this); LinkedHashSet names = new LinkedHashSet<>(); for (String name : projectNames) { diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/SwitchSecureStore.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/SwitchSecureStore.java index 280795a2ba..58876ce688 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/SwitchSecureStore.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/SwitchSecureStore.java @@ -28,14 +28,6 @@ import com.google.gerrit.server.securestore.DefaultSecureStore; import com.google.gerrit.server.securestore.SecureStore; import com.google.gerrit.server.securestore.SecureStore.EntryKey; import com.google.inject.Injector; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.storage.file.FileBasedConfig; -import org.eclipse.jgit.util.FS; -import org.kohsuke.args4j.Option; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -44,11 +36,16 @@ import java.util.Arrays; import java.util.List; import java.util.jar.JarFile; import java.util.zip.ZipEntry; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.storage.file.FileBasedConfig; +import org.eclipse.jgit.util.FS; +import org.kohsuke.args4j.Option; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class SwitchSecureStore extends SiteProgram { private static String getSecureStoreClassFromGerritConfig(SitePaths sitePaths) { - FileBasedConfig cfg = - new FileBasedConfig(sitePaths.gerrit_config.toFile(), FS.DETECTED); + FileBasedConfig cfg = new FileBasedConfig(sitePaths.gerrit_config.toFile(), FS.DETECTED); try { cfg.load(); } catch (IOException | ConfigInvalidException e) { @@ -57,12 +54,13 @@ public class SwitchSecureStore extends SiteProgram { return cfg.getString("gerrit", null, "secureStoreClass"); } - private static final Logger log = LoggerFactory - .getLogger(SwitchSecureStore.class); + private static final Logger log = LoggerFactory.getLogger(SwitchSecureStore.class); - @Option(name = "--new-secure-store-lib", - usage = "Path to new SecureStore implementation", - required = true) + @Option( + name = "--new-secure-store-lib", + usage = "Path to new SecureStore implementation", + required = true + ) private String newSecureStoreLib; @Override @@ -70,8 +68,7 @@ public class SwitchSecureStore extends SiteProgram { SitePaths sitePaths = new SitePaths(getSitePath()); Path newSecureStorePath = Paths.get(newSecureStoreLib); if (!Files.exists(newSecureStorePath)) { - log.error(String.format("File %s doesn't exist", - newSecureStorePath.toAbsolutePath())); + log.error(String.format("File %s doesn't exist", newSecureStorePath.toAbsolutePath())); return -1; } @@ -79,19 +76,21 @@ public class SwitchSecureStore extends SiteProgram { String currentSecureStoreName = getCurrentSecureStoreClassName(sitePaths); if (currentSecureStoreName.equals(newSecureStore)) { - log.error("Old and new SecureStore implementation names " - + "are the same. Migration will not work"); + log.error( + "Old and new SecureStore implementation names " + + "are the same. Migration will not work"); return -1; } IoUtil.loadJARs(newSecureStorePath); SiteLibraryLoaderUtil.loadSiteLib(sitePaths.lib_dir); - log.info("Current secureStoreClass property ({}) will be replaced with {}", - currentSecureStoreName, newSecureStore); + log.info( + "Current secureStoreClass property ({}) will be replaced with {}", + currentSecureStoreName, + newSecureStore); Injector dbInjector = createDbInjector(SINGLE_USER); - SecureStore currentStore = - getSecureStore(currentSecureStoreName, dbInjector); + SecureStore currentStore = getSecureStore(currentSecureStoreName, dbInjector); SecureStore newStore = getSecureStore(newSecureStore, dbInjector); migrateProperties(currentStore, newStore); @@ -107,14 +106,11 @@ public class SwitchSecureStore extends SiteProgram { private void migrateProperties(SecureStore currentStore, SecureStore newStore) { log.info("Migrate entries"); for (EntryKey key : currentStore.list()) { - String[] value = - currentStore.getList(key.section, key.subsection, key.name); + String[] value = currentStore.getList(key.section, key.subsection, key.name); if (value != null) { - newStore.setList(key.section, key.subsection, key.name, - Arrays.asList(value)); + newStore.setList(key.section, key.subsection, key.name, Arrays.asList(value)); } else { - String msg = - String.format("Cannot migrate entry for %s", key.section); + String msg = String.format("Cannot migrate entry for %s", key.section); if (key.subsection != null) { msg = msg + String.format(".%s", key.subsection); } @@ -124,57 +120,49 @@ public class SwitchSecureStore extends SiteProgram { } } - private void removeOldLib(SitePaths sitePaths, String currentSecureStoreName) - throws IOException { - Path oldSecureStore = - findJarWithSecureStore(sitePaths, currentSecureStoreName); + private void removeOldLib(SitePaths sitePaths, String currentSecureStoreName) throws IOException { + Path oldSecureStore = findJarWithSecureStore(sitePaths, currentSecureStoreName); if (oldSecureStore != null) { - log.info("Removing old SecureStore ({}) from lib/ directory", - oldSecureStore.getFileName()); + log.info("Removing old SecureStore ({}) from lib/ directory", oldSecureStore.getFileName()); try { Files.delete(oldSecureStore); } catch (IOException e) { log.error("Cannot remove {}", oldSecureStore.toAbsolutePath(), e); } } else { - log.info("Cannot find jar with old SecureStore ({}) in lib/ directory", - currentSecureStoreName); + log.info( + "Cannot find jar with old SecureStore ({}) in lib/ directory", currentSecureStoreName); } } - private void copyNewLib(SitePaths sitePaths, Path newSecureStorePath) - throws IOException { - log.info("Copy new SecureStore ({}) into lib/ directory", - newSecureStorePath.getFileName()); - Files.copy(newSecureStorePath, - sitePaths.lib_dir.resolve(newSecureStorePath.getFileName())); + private void copyNewLib(SitePaths sitePaths, Path newSecureStorePath) throws IOException { + log.info("Copy new SecureStore ({}) into lib/ directory", newSecureStorePath.getFileName()); + Files.copy(newSecureStorePath, sitePaths.lib_dir.resolve(newSecureStorePath.getFileName())); } private void updateGerritConfig(SitePaths sitePaths, String newSecureStore) throws IOException, ConfigInvalidException { - log.info("Set gerrit.secureStoreClass property of gerrit.config to {}", - newSecureStore); - FileBasedConfig config = - new FileBasedConfig(sitePaths.gerrit_config.toFile(), FS.DETECTED); + log.info("Set gerrit.secureStoreClass property of gerrit.config to {}", newSecureStore); + FileBasedConfig config = new FileBasedConfig(sitePaths.gerrit_config.toFile(), FS.DETECTED); config.load(); config.setString("gerrit", null, "secureStoreClass", newSecureStore); config.save(); } - private String getNewSecureStoreClassName(Path secureStore) - throws IOException { + private String getNewSecureStoreClassName(Path secureStore) throws IOException { try (JarScanner scanner = new JarScanner(secureStore)) { - List newSecureStores = - scanner.findSubClassesOf(SecureStore.class); + List newSecureStores = scanner.findSubClassesOf(SecureStore.class); if (newSecureStores.isEmpty()) { - throw new RuntimeException(String.format( - "Cannot find implementation of SecureStore interface in %s", - secureStore.toAbsolutePath())); + throw new RuntimeException( + String.format( + "Cannot find implementation of SecureStore interface in %s", + secureStore.toAbsolutePath())); } if (newSecureStores.size() > 1) { - throw new RuntimeException(String.format( - "Found too many implementations of SecureStore:\n%s\nin %s", Joiner - .on("\n").join(newSecureStores), secureStore.toAbsolutePath())); + throw new RuntimeException( + String.format( + "Found too many implementations of SecureStore:\n%s\nin %s", + Joiner.on("\n").join(newSecureStores), secureStore.toAbsolutePath())); } return Iterables.getOnlyElement(newSecureStores); } @@ -191,8 +179,7 @@ public class SwitchSecureStore extends SiteProgram { private SecureStore getSecureStore(String className, Injector injector) { try { @SuppressWarnings("unchecked") - Class clazz = - (Class) Class.forName(className); + Class clazz = (Class) Class.forName(className); return injector.getInstance(clazz); } catch (ClassNotFoundException e) { throw new RuntimeException( @@ -200,8 +187,8 @@ public class SwitchSecureStore extends SiteProgram { } } - private Path findJarWithSecureStore(SitePaths sitePaths, - String secureStoreClass) throws IOException { + private Path findJarWithSecureStore(SitePaths sitePaths, String secureStoreClass) + throws IOException { List jars = SiteLibraryLoaderUtil.listJars(sitePaths.lib_dir); String secureStoreClassPath = secureStoreClass.replace('.', '/') + ".class"; for (Path jar : jars) { diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/WarDistribution.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/WarDistribution.java index 3328a54f9c..1b4946a3d6 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/WarDistribution.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/WarDistribution.java @@ -20,7 +20,6 @@ import static com.google.gerrit.pgm.init.InitPlugins.PLUGIN_DIR; import com.google.gerrit.launcher.GerritLauncher; import com.google.gerrit.pgm.init.PluginsDistribution; import com.google.inject.Singleton; - import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; @@ -47,8 +46,7 @@ public class WarDistribution implements PluginsDistribution { if (ze.getName().startsWith(PLUGIN_DIR) && ze.getName().endsWith(JAR)) { String pluginJarName = new File(ze.getName()).getName(); - String pluginName = pluginJarName.substring(0, - pluginJarName.length() - JAR.length()); + String pluginName = pluginJarName.substring(0, pluginJarName.length() - JAR.length()); try (InputStream in = zf.getInputStream(ze)) { processor.process(pluginName, in); } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HiddenErrorHandler.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HiddenErrorHandler.java index 0c2ec7817d..4c2455a22d 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HiddenErrorHandler.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HiddenErrorHandler.java @@ -18,7 +18,10 @@ import static java.nio.charset.StandardCharsets.ISO_8859_1; import com.google.common.base.Strings; import com.google.gwtexpui.server.CacheHeaders; - +import java.io.IOException; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import org.eclipse.jetty.http.HttpHeader; import org.eclipse.jetty.http.HttpStatus; import org.eclipse.jetty.server.HttpConnection; @@ -27,18 +30,13 @@ import org.eclipse.jetty.server.handler.ErrorHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; - -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - class HiddenErrorHandler extends ErrorHandler { private static final Logger log = LoggerFactory.getLogger(HiddenErrorHandler.class); @Override - public void handle(String target, Request baseRequest, - HttpServletRequest req, HttpServletResponse res) throws IOException { + public void handle( + String target, Request baseRequest, HttpServletRequest req, HttpServletResponse res) + throws IOException { HttpConnection conn = HttpConnection.getCurrentConnection(); baseRequest.setHandled(true); try { @@ -48,11 +46,9 @@ class HiddenErrorHandler extends ErrorHandler { } } - private void reply(HttpConnection conn, HttpServletResponse res) - throws IOException { + private void reply(HttpConnection conn, HttpServletResponse res) throws IOException { byte[] msg = message(conn); - res.setHeader(HttpHeader.CONTENT_TYPE.asString(), - "text/plain; charset=ISO-8859-1"); + res.setHeader(HttpHeader.CONTENT_TYPE.asString(), "text/plain; charset=ISO-8859-1"); res.setContentLength(msg.length); try { CacheHeaders.setNotCacheable(res); @@ -70,15 +66,14 @@ class HiddenErrorHandler extends ErrorHandler { } else { msg = conn.getHttpChannel().getResponse().getReason(); if (msg == null) { - msg = HttpStatus.getMessage(conn.getHttpChannel() - .getResponse().getStatus()); + msg = HttpStatus.getMessage(conn.getHttpChannel().getResponse().getStatus()); } } return msg.getBytes(ISO_8859_1); } private static void log(HttpServletRequest req) { - Throwable err = (Throwable)req.getAttribute("javax.servlet.error.exception"); + Throwable err = (Throwable) req.getAttribute("javax.servlet.error.exception"); if (err != null) { String uri = req.getRequestURI(); if (!Strings.isNullOrEmpty(req.getQueryString())) { diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HttpLog.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HttpLog.java index a326919b74..9f54634074 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HttpLog.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HttpLog.java @@ -18,7 +18,6 @@ import com.google.gerrit.common.TimeUtil; import com.google.gerrit.httpd.GetUserFilter; import com.google.gerrit.server.util.SystemLog; import com.google.inject.Inject; - import org.apache.log4j.AsyncAppender; import org.apache.log4j.Level; import org.apache.log4j.Logger; @@ -55,8 +54,7 @@ class HttpLog extends AbstractLifeCycle implements RequestLog { } @Override - protected void doStart() throws Exception { - } + protected void doStart() throws Exception {} @Override protected void doStop() throws Exception { @@ -65,18 +63,19 @@ class HttpLog extends AbstractLifeCycle implements RequestLog { @Override public void log(final Request req, final Response rsp) { - final LoggingEvent event = new LoggingEvent( // - Logger.class.getName(), // fqnOfCategoryClass - log, // logger - TimeUtil.nowMs(), // when - Level.INFO, // level - "", // message text - "HTTPD", // thread name - null, // exception information - null, // current NDC string - null, // caller location - null // MDC properties - ); + final LoggingEvent event = + new LoggingEvent( // + Logger.class.getName(), // fqnOfCategoryClass + log, // logger + TimeUtil.nowMs(), // when + Level.INFO, // level + "", // message text + "HTTPD", // thread name + null, // exception information + null, // current NDC string + null, // caller location + null // MDC properties + ); String uri = req.getRequestURI(); String qs = req.getQueryString(); diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HttpLogLayout.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HttpLogLayout.java index bab4de7287..bfa4d641f9 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HttpLogLayout.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HttpLogLayout.java @@ -14,12 +14,11 @@ package com.google.gerrit.pgm.http.jetty; -import org.apache.log4j.Layout; -import org.apache.log4j.spi.LoggingEvent; - import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; +import org.apache.log4j.Layout; +import org.apache.log4j.spi.LoggingEvent; public final class HttpLogLayout extends Layout { private final SimpleDateFormat dateFormat; @@ -116,7 +115,5 @@ public final class HttpLogLayout extends Layout { } @Override - public void activateOptions() { - } + public void activateOptions() {} } - diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyServer.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyServer.java index f5212ab50d..90f8558fbd 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyServer.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyServer.java @@ -29,7 +29,18 @@ import com.google.inject.Injector; import com.google.inject.Singleton; import com.google.inject.servlet.GuiceFilter; import com.google.inject.servlet.GuiceServletContextListener; - +import java.lang.management.ManagementFactory; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import javax.servlet.DispatcherType; +import javax.servlet.Filter; import org.eclipse.jetty.http.HttpScheme; import org.eclipse.jetty.jmx.MBeanContainer; import org.eclipse.jetty.server.Connector; @@ -59,20 +70,6 @@ import org.eclipse.jgit.lib.Config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.lang.management.ManagementFactory; -import java.net.URI; -import java.net.URISyntaxException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import javax.servlet.DispatcherType; -import javax.servlet.Filter; - @Singleton public class JettyServer { private static final Logger log = LoggerFactory.getLogger(JettyServer.class); @@ -91,14 +88,13 @@ public class JettyServer { public void start() { try { String origUrl = cfg.getString("httpd", null, "listenUrl"); - boolean rewrite = !Strings.isNullOrEmpty(origUrl) - && origUrl.endsWith(":0/"); + boolean rewrite = !Strings.isNullOrEmpty(origUrl) && origUrl.endsWith(":0/"); server.httpd.start(); if (rewrite) { Connector con = server.httpd.getConnectors()[0]; if (con instanceof ServerConnector) { @SuppressWarnings("resource") - ServerConnector serverCon = (ServerConnector)con; + ServerConnector serverCon = (ServerConnector) con; String host = serverCon.getHost(); int port = serverCon.getLocalPort(); String url = String.format("http://%s:%d", host, port); @@ -128,7 +124,8 @@ public class JettyServer { private boolean reverseProxy; @Inject - JettyServer(@GerritServerConfig Config cfg, + JettyServer( + @GerritServerConfig Config cfg, ThreadSettingsConfig threadSettingsConfig, SitePaths site, JettyEnv env, @@ -146,8 +143,7 @@ public class JettyServer { app = handler; } if (cfg.getBoolean("httpd", "registerMBeans", false)) { - MBeanContainer mbean = - new MBeanContainer(ManagementFactory.getPlatformMBeanServer()); + MBeanContainer mbean = new MBeanContainer(ManagementFactory.getPlatformMBeanServer()); httpd.addEventListener(mbean); httpd.addBean(Log.getRootLogger()); httpd.addBean(mbean); @@ -163,8 +159,7 @@ public class JettyServer { // need to use a larger default header size to ensure we have // the space required. // - final int requestHeaderSize = - cfg.getInt("httpd", "requestheadersize", 16386); + final int requestHeaderSize = cfg.getInt("httpd", "requestheadersize", 16386); final URI[] listenUrls = listenURLs(cfg); final boolean reuseAddress = cfg.getBoolean("httpd", "reuseaddress", true); final int acceptors = cfg.getInt("httpd", "acceptorThreads", 2); @@ -178,11 +173,16 @@ public class JettyServer { final ServerConnector c; HttpConfiguration config = defaultConfig(requestHeaderSize); - if (AuthType.CLIENT_SSL_CERT_LDAP.equals(authType) && ! "https".equals(u.getScheme())) { - throw new IllegalArgumentException("Protocol '" + u.getScheme() - + "' " + " not supported in httpd.listenurl '" + u - + "' when auth.type = '" + AuthType.CLIENT_SSL_CERT_LDAP.name() - + "'; only 'https' is supported"); + if (AuthType.CLIENT_SSL_CERT_LDAP.equals(authType) && !"https".equals(u.getScheme())) { + throw new IllegalArgumentException( + "Protocol '" + + u.getScheme() + + "' " + + " not supported in httpd.listenurl '" + + u + + "' when auth.type = '" + + AuthType.CLIENT_SSL_CERT_LDAP.name() + + "'; only 'https' is supported"); } if ("http".equals(u.getScheme())) { @@ -214,10 +214,16 @@ public class JettyServer { defaultPort = 443; config.addCustomizer(new SecureRequestCustomizer()); - c = new ServerConnector(server, - null, null, null, 0, acceptors, - new SslConnectionFactory(ssl, "http/1.1"), - new HttpConnectionFactory(config)); + c = + new ServerConnector( + server, + null, + null, + null, + 0, + acceptors, + new SslConnectionFactory(ssl, "http/1.1"), + new HttpConnectionFactory(config)); } else if ("proxy-http".equals(u.getScheme())) { defaultPort = 8080; @@ -227,32 +233,38 @@ public class JettyServer { } else if ("proxy-https".equals(u.getScheme())) { defaultPort = 8080; config.addCustomizer(new ForwardedRequestCustomizer()); - config.addCustomizer(new HttpConfiguration.Customizer() { - @Override - public void customize(Connector connector, - HttpConfiguration channelConfig, Request request) { - request.setScheme(HttpScheme.HTTPS.asString()); - request.setSecure(true); - } - }); + config.addCustomizer( + new HttpConfiguration.Customizer() { + @Override + public void customize( + Connector connector, HttpConfiguration channelConfig, Request request) { + request.setScheme(HttpScheme.HTTPS.asString()); + request.setSecure(true); + } + }); c = newServerConnector(server, acceptors, config); } else { - throw new IllegalArgumentException("Protocol '" + u.getScheme() + "' " - + " not supported in httpd.listenurl '" + u + "';" - + " only 'http', 'https', 'proxy-http, 'proxy-https'" - + " are supported"); + throw new IllegalArgumentException( + "Protocol '" + + u.getScheme() + + "' " + + " not supported in httpd.listenurl '" + + u + + "';" + + " only 'http', 'https', 'proxy-http, 'proxy-https'" + + " are supported"); } try { - if (u.getHost() == null && (u.getAuthority().equals("*") // - || u.getAuthority().startsWith("*:"))) { + if (u.getHost() == null + && (u.getAuthority().equals("*") // + || u.getAuthority().startsWith("*:"))) { // Bind to all local addresses. Port wasn't parsed right by URI // due to the illegal host of "*" so replace with a legal name // and parse the URI. // - final URI r = - new URI(u.toString().replace('*', 'A')).parseServerAuthority(); + final URI r = new URI(u.toString().replace('*', 'A')).parseServerAuthority(); c.setHost(null); c.setPort(0 < r.getPort() ? r.getPort() : defaultPort); } else { @@ -270,10 +282,10 @@ public class JettyServer { return connectors; } - private static ServerConnector newServerConnector(Server server, - int acceptors, HttpConfiguration config) { - return new ServerConnector(server, null, null, null, 0, acceptors, - new HttpConnectionFactory(config)); + private static ServerConnector newServerConnector( + Server server, int acceptors, HttpConfiguration config) { + return new ServerConnector( + server, null, null, null, 0, acceptors, new HttpConnectionFactory(config)); } private HttpConfiguration defaultConfig(int requestHeaderSize) { @@ -323,19 +335,18 @@ public class JettyServer { int maxThreads = threadSettingsConfig.getHttpdMaxThreads(); int minThreads = cfg.getInt("httpd", null, "minthreads", 5); int maxQueued = cfg.getInt("httpd", null, "maxqueued", 200); - int idleTimeout = (int)MILLISECONDS.convert(60, SECONDS); - int maxCapacity = maxQueued == 0 - ? Integer.MAX_VALUE - : Math.max(minThreads, maxQueued); - QueuedThreadPool pool = new QueuedThreadPool( - maxThreads, - minThreads, - idleTimeout, - new BlockingArrayQueue( - minThreads, // capacity, - minThreads, // growBy, - maxCapacity // maxCapacity - )); + int idleTimeout = (int) MILLISECONDS.convert(60, SECONDS); + int maxCapacity = maxQueued == 0 ? Integer.MAX_VALUE : Math.max(minThreads, maxQueued); + QueuedThreadPool pool = + new QueuedThreadPool( + maxThreads, + minThreads, + idleTimeout, + new BlockingArrayQueue( + minThreads, // capacity, + minThreads, // growBy, + maxCapacity // maxCapacity + )); pool.setName("HTTP"); return pool; } @@ -373,8 +384,8 @@ public class JettyServer { return r; } - private ContextHandler makeContext(final String contextPath, - final JettyEnv env, final Config cfg) { + private ContextHandler makeContext( + final String contextPath, final JettyEnv env, final Config cfg) { final ServletContextHandler app = new ServletContextHandler(); // This enables the use of sessions in Jetty, feature available @@ -398,11 +409,12 @@ public class JettyServer { Class filterClass = (Class) Class.forName(filterClassName); Filter filter = env.webInjector.getInstance(filterClass); - app.addFilter(new FilterHolder(filter), "/*", + app.addFilter( + new FilterHolder(filter), + "/*", EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC)); } catch (Throwable e) { - String errorMessage = - "Unable to instantiate front-end HTTP Filter " + filterClassName; + String errorMessage = "Unable to instantiate front-end HTTP Filter " + filterClassName; log.error(errorMessage, e); throw new IllegalArgumentException(errorMessage, e); } @@ -413,15 +425,15 @@ public class JettyServer { // already have built. // GuiceFilter filter = env.webInjector.getInstance(GuiceFilter.class); - app.addFilter(new FilterHolder(filter), "/*", EnumSet.of( - DispatcherType.REQUEST, - DispatcherType.ASYNC)); - app.addEventListener(new GuiceServletContextListener() { - @Override - protected Injector getInjector() { - return env.webInjector; - } - }); + app.addFilter( + new FilterHolder(filter), "/*", EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC)); + app.addEventListener( + new GuiceServletContextListener() { + @Override + protected Injector getInjector() { + return env.webInjector; + } + }); // Jetty requires at least one servlet be bound before it will // bother running the filter above. Since the filter has all diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/ProjectQoSFilter.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/ProjectQoSFilter.java index b577475897..6239af4101 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/ProjectQoSFilter.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/ProjectQoSFilter.java @@ -29,16 +29,9 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; import com.google.inject.servlet.ServletModule; - -import org.eclipse.jetty.continuation.Continuation; -import org.eclipse.jetty.continuation.ContinuationListener; -import org.eclipse.jetty.continuation.ContinuationSupport; -import org.eclipse.jgit.lib.Config; - import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; - import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -48,20 +41,23 @@ import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.eclipse.jetty.continuation.Continuation; +import org.eclipse.jetty.continuation.ContinuationListener; +import org.eclipse.jetty.continuation.ContinuationSupport; +import org.eclipse.jgit.lib.Config; /** * Use Jetty continuations to defer execution until threads are available. - *

- * We actually schedule a task into the same execution queue as the SSH daemon - * uses for command execution, and then park the web request in a continuation - * until an execution thread is available. This ensures that the overall JVM - * process doesn't exceed the configured limit on concurrent Git requests. - *

- * During Git request execution however we have to use the Jetty service thread, - * not the thread from the SSH execution queue. Trying to complete the request - * on the SSH execution queue caused Jetty's HTTP parser to crash, so we instead - * block the SSH execution queue thread and ask Jetty to resume processing on - * the web service thread. + * + *

We actually schedule a task into the same execution queue as the SSH daemon uses for command + * execution, and then park the web request in a continuation until an execution thread is + * available. This ensures that the overall JVM process doesn't exceed the configured limit on + * concurrent Git requests. + * + *

During Git request execution however we have to use the Jetty service thread, not the thread + * from the SSH execution queue. Trying to complete the request on the SSH execution queue caused + * Jetty's HTTP parser to crash, so we instead block the SSH execution queue thread and ask Jetty to + * resume processing on the web service thread. */ @Singleton public class ProjectQoSFilter implements Filter { @@ -69,16 +65,14 @@ public class ProjectQoSFilter implements Filter { private static final String TASK = ATT_SPACE + "/TASK"; private static final String CANCEL = ATT_SPACE + "/CANCEL"; - private static final String FILTER_RE = - "^/(.*)/(git-upload-pack|git-receive-pack)$"; + private static final String FILTER_RE = "^/(.*)/(git-upload-pack|git-receive-pack)$"; private static final Pattern URI_PATTERN = Pattern.compile(FILTER_RE); public static class Module extends ServletModule { @Override protected void configureServlets() { - bind(QueueProvider.class).to(CommandExecutorQueueProvider.class) - .in(SINGLETON); + bind(QueueProvider.class).to(CommandExecutorQueueProvider.class).in(SINGLETON); filterRegex(FILTER_RE).through(ProjectQoSFilter.class); } } @@ -90,8 +84,10 @@ public class ProjectQoSFilter implements Filter { private final long maxWait; @Inject - ProjectQoSFilter(final Provider user, - QueueProvider queue, final ServletContext context, + ProjectQoSFilter( + final Provider user, + QueueProvider queue, + final ServletContext context, @GerritServerConfig final Config cfg) { this.user = user; this.queue = queue; @@ -100,8 +96,8 @@ public class ProjectQoSFilter implements Filter { } @Override - public void doFilter(ServletRequest request, ServletResponse response, - FilterChain chain) throws IOException, ServletException { + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { final HttpServletRequest req = (HttpServletRequest) request; final HttpServletResponse rsp = (HttpServletResponse) response; final Continuation cont = ContinuationSupport.getContinuation(req); @@ -145,15 +141,12 @@ public class ProjectQoSFilter implements Filter { } @Override - public void init(FilterConfig config) { - } + public void init(FilterConfig config) {} @Override - public void destroy() { - } + public void destroy() {} - private final class TaskThunk implements CancelableRunnable, - ContinuationListener { + private final class TaskThunk implements CancelableRunnable, ContinuationListener { private final WorkQueue.Executor executor; private final Continuation cont; @@ -163,8 +156,8 @@ public class ProjectQoSFilter implements Filter { private Thread worker; private String fullName; - TaskThunk(final WorkQueue.Executor executor, final Continuation cont, - final HttpServletRequest req) { + TaskThunk( + final WorkQueue.Executor executor, final Continuation cont, final HttpServletRequest req) { this.executor = executor; this.cont = cont; this.name = generateName(req); @@ -210,8 +203,7 @@ public class ProjectQoSFilter implements Filter { } @Override - public void onComplete(Continuation self) { - } + public void onComplete(Continuation self) {} @Override public void onTimeout(Continuation self) { diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/AllUsersNameOnInitProvider.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/AllUsersNameOnInitProvider.java index 29e61660fc..2ace78707c 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/AllUsersNameOnInitProvider.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/AllUsersNameOnInitProvider.java @@ -27,8 +27,7 @@ public class AllUsersNameOnInitProvider implements Provider { @Inject AllUsersNameOnInitProvider(Section.Factory sections) { String n = sections.get("gerrit", null).get("allUsers"); - name = MoreObjects.firstNonNull( - Strings.emptyToNull(n), AllUsersNameProvider.DEFAULT); + name = MoreObjects.firstNonNull(Strings.emptyToNull(n), AllUsersNameProvider.DEFAULT); } @Override diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/BaseInit.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/BaseInit.java index ad1f844a6a..43a44cd25c 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/BaseInit.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/BaseInit.java @@ -61,10 +61,6 @@ import com.google.inject.Provider; import com.google.inject.TypeLiteral; import com.google.inject.spi.Message; import com.google.inject.util.Providers; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.FileNotFoundException; import java.io.IOException; import java.nio.file.FileVisitResult; @@ -77,13 +73,13 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; - import javax.sql.DataSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** Initialize a new Gerrit installation. */ public class BaseInit extends SiteProgram { - private static final Logger log = - LoggerFactory.getLogger(BaseInit.class); + private static final Logger log = LoggerFactory.getLogger(BaseInit.class); private final boolean standalone; private final boolean initDb; @@ -92,22 +88,29 @@ public class BaseInit extends SiteProgram { private Injector sysInjector; - protected BaseInit(PluginsDistribution pluginsDistribution, - List pluginsToInstall) { + protected BaseInit(PluginsDistribution pluginsDistribution, List pluginsToInstall) { this.standalone = true; this.initDb = true; this.pluginsDistribution = pluginsDistribution; this.pluginsToInstall = pluginsToInstall; } - public BaseInit(Path sitePath, boolean standalone, boolean initDb, - PluginsDistribution pluginsDistribution, List pluginsToInstall) { + public BaseInit( + Path sitePath, + boolean standalone, + boolean initDb, + PluginsDistribution pluginsDistribution, + List pluginsToInstall) { this(sitePath, null, standalone, initDb, pluginsDistribution, pluginsToInstall); } - public BaseInit(Path sitePath, final Provider dsProvider, - boolean standalone, boolean initDb, - PluginsDistribution pluginsDistribution, List pluginsToInstall) { + public BaseInit( + Path sitePath, + final Provider dsProvider, + boolean standalone, + boolean initDb, + PluginsDistribution pluginsDistribution, + List pluginsToInstall) { super(sitePath, dsProvider); this.standalone = standalone; this.initDb = initDb; @@ -127,15 +130,13 @@ public class BaseInit extends SiteProgram { init.flags.skipPlugins = skipPlugins(); init.flags.deleteCaches = getDeleteCaches(); - final SiteRun run; try { init.initializer.run(); init.flags.deleteOnFailure = false; Injector sysInjector = createSysInjector(init); - IndexManagerOnInit indexManager = - sysInjector.getInstance(IndexManagerOnInit.class); + IndexManagerOnInit indexManager = sysInjector.getInstance(IndexManagerOnInit.class); try { indexManager.start(); run = createSiteRun(init); @@ -189,8 +190,7 @@ public class BaseInit extends SiteProgram { * @param run completed run instance. * @throws Exception */ - protected void afterInit(SiteRun run) throws Exception { - } + protected void afterInit(SiteRun run) throws Exception {} protected List getInstallPlugins() { try { @@ -199,7 +199,7 @@ public class BaseInit extends SiteProgram { } List names = pluginsDistribution.listPluginNames(); if (pluginsToInstall != null) { - for (Iterator i = names.iterator(); i.hasNext();) { + for (Iterator i = names.iterator(); i.hasNext(); ) { String n = i.next(); if (!pluginsToInstall.contains(n)) { i.remove(); @@ -208,8 +208,7 @@ public class BaseInit extends SiteProgram { } return names; } catch (FileNotFoundException e) { - log.warn("Couldn't find distribution archive location." - + " No plugin will be installed"); + log.warn("Couldn't find distribution archive location." + " No plugin will be installed"); return null; } } @@ -229,7 +228,10 @@ public class BaseInit extends SiteProgram { final SitePathInitializer initializer; @Inject - SiteInit(final SitePaths site, final InitFlags flags, final ConsoleUI ui, + SiteInit( + final SitePaths site, + final InitFlags flags, + final ConsoleUI ui, final SitePathInitializer initializer) { this.site = site; this.flags = flags; @@ -245,53 +247,57 @@ public class BaseInit extends SiteProgram { final SecureStoreInitData secureStoreInitData = discoverSecureStoreClass(); final String currentSecureStoreClassName = getConfiguredSecureStoreClass(); - if (secureStoreInitData != null && currentSecureStoreClassName != null + if (secureStoreInitData != null + && currentSecureStoreClassName != null && !currentSecureStoreClassName.equals(secureStoreInitData.className)) { - String err = String.format( - "Different secure store was previously configured: %s. " - + "Use SwitchSecureStore program to switch between implementations.", - currentSecureStoreClassName); + String err = + String.format( + "Different secure store was previously configured: %s. " + + "Use SwitchSecureStore program to switch between implementations.", + currentSecureStoreClassName); throw die(err); } m.add(new GerritServerConfigModule()); m.add(new InitModule(standalone, initDb)); - m.add(new AbstractModule() { - @Override - protected void configure() { - bind(ConsoleUI.class).toInstance(ui); - bind(Path.class).annotatedWith(SitePath.class).toInstance(sitePath); - List plugins = - MoreObjects.firstNonNull( - getInstallPlugins(), new ArrayList()); - bind(new TypeLiteral>() {}).annotatedWith( - InstallPlugins.class).toInstance(plugins); - bind(new TypeLiteral() {}).annotatedWith( - InstallAllPlugins.class).toInstance(installAllPlugins()); - bind(PluginsDistribution.class).toInstance(pluginsDistribution); + m.add( + new AbstractModule() { + @Override + protected void configure() { + bind(ConsoleUI.class).toInstance(ui); + bind(Path.class).annotatedWith(SitePath.class).toInstance(sitePath); + List plugins = + MoreObjects.firstNonNull(getInstallPlugins(), new ArrayList()); + bind(new TypeLiteral>() {}) + .annotatedWith(InstallPlugins.class) + .toInstance(plugins); + bind(new TypeLiteral() {}) + .annotatedWith(InstallAllPlugins.class) + .toInstance(installAllPlugins()); + bind(PluginsDistribution.class).toInstance(pluginsDistribution); - String secureStoreClassName; - if (secureStoreInitData != null) { - secureStoreClassName = secureStoreInitData.className; - } else { - secureStoreClassName = currentSecureStoreClassName; - } - if (secureStoreClassName != null) { - ui.message("Using secure store: %s\n", secureStoreClassName); - } - bind(SecureStoreInitData.class).toProvider( - Providers.of(secureStoreInitData)); - bind(String.class).annotatedWith(SecureStoreClassName.class) - .toProvider(Providers.of(secureStoreClassName)); - bind(SecureStore.class).toProvider(SecureStoreProvider.class).in(SINGLETON); - bind(new TypeLiteral>() {}).annotatedWith( - LibraryDownload.class).toInstance(getSkippedDownloads()); - bind(Boolean.class).annotatedWith( - LibraryDownload.class).toInstance(skipAllDownloads()); + String secureStoreClassName; + if (secureStoreInitData != null) { + secureStoreClassName = secureStoreInitData.className; + } else { + secureStoreClassName = currentSecureStoreClassName; + } + if (secureStoreClassName != null) { + ui.message("Using secure store: %s\n", secureStoreClassName); + } + bind(SecureStoreInitData.class).toProvider(Providers.of(secureStoreInitData)); + bind(String.class) + .annotatedWith(SecureStoreClassName.class) + .toProvider(Providers.of(secureStoreClassName)); + bind(SecureStore.class).toProvider(SecureStoreProvider.class).in(SINGLETON); + bind(new TypeLiteral>() {}) + .annotatedWith(LibraryDownload.class) + .toInstance(getSkippedDownloads()); + bind(Boolean.class).annotatedWith(LibraryDownload.class).toInstance(skipAllDownloads()); - bind(MetricMaker.class).to(DisabledMetricMaker.class); - } - }); + bind(MetricMaker.class).to(DisabledMetricMaker.class); + } + }); try { return Guice.createInjector(PRODUCTION, m).getInstance(SiteInit.class); @@ -328,27 +334,26 @@ public class BaseInit extends SiteProgram { Path secureStoreLib = Paths.get(secureStore); if (!Files.exists(secureStoreLib)) { - throw new InvalidSecureStoreException(String.format( - "File %s doesn't exist", secureStore)); + throw new InvalidSecureStoreException(String.format("File %s doesn't exist", secureStore)); } try (JarScanner scanner = new JarScanner(secureStoreLib)) { - List secureStores = - scanner.findSubClassesOf(SecureStore.class); + List secureStores = scanner.findSubClassesOf(SecureStore.class); if (secureStores.isEmpty()) { - throw new InvalidSecureStoreException(String.format( - "Cannot find class implementing %s interface in %s", - SecureStore.class.getName(), secureStore)); + throw new InvalidSecureStoreException( + String.format( + "Cannot find class implementing %s interface in %s", + SecureStore.class.getName(), secureStore)); } if (secureStores.size() > 1) { - throw new InvalidSecureStoreException(String.format( - "%s has more that one implementation of %s interface", - secureStore, SecureStore.class.getName())); + throw new InvalidSecureStoreException( + String.format( + "%s has more that one implementation of %s interface", + secureStore, SecureStore.class.getName())); } IoUtil.loadJARs(secureStoreLib); return new SecureStoreInitData(secureStoreLib, secureStores.get(0)); } catch (IOException e) { - throw new InvalidSecureStoreException(String.format("%s is not a valid jar", - secureStore)); + throw new InvalidSecureStoreException(String.format("%s is not a valid jar", secureStore)); } } @@ -361,7 +366,8 @@ public class BaseInit extends SiteProgram { final GitRepositoryManager repositoryManager; @Inject - SiteRun(ConsoleUI ui, + SiteRun( + ConsoleUI ui, SitePaths site, InitFlags flags, SchemaUpdater schemaUpdater, @@ -377,32 +383,33 @@ public class BaseInit extends SiteProgram { void upgradeSchema() throws OrmException { final List pruneList = new ArrayList<>(); - schemaUpdater.update(new UpdateUI() { - @Override - public void message(String msg) { - System.err.println(msg); - System.err.flush(); - } - - @Override - public boolean yesno(boolean def, String msg) { - return ui.yesno(def, msg); - } - - @Override - public boolean isBatch() { - return ui.isBatch(); - } - - @Override - public void pruneSchema(StatementExecutor e, List prune) { - for (String p : prune) { - if (!pruneList.contains(p)) { - pruneList.add(p); + schemaUpdater.update( + new UpdateUI() { + @Override + public void message(String msg) { + System.err.println(msg); + System.err.flush(); } - } - } - }); + + @Override + public boolean yesno(boolean def, String msg) { + return ui.yesno(def, msg); + } + + @Override + public boolean isBatch() { + return ui.isBatch(); + } + + @Override + public void pruneSchema(StatementExecutor e, List prune) { + for (String p : prune) { + if (!pruneList.contains(p)) { + pruneList.add(p); + } + } + } + }); if (!pruneList.isEmpty()) { StringBuilder msg = new StringBuilder(); @@ -437,13 +444,14 @@ public class BaseInit extends SiteProgram { private Injector createSysInjector(final SiteInit init) { if (sysInjector == null) { final List modules = new ArrayList<>(); - modules.add(new AbstractModule() { - @Override - protected void configure() { - bind(ConsoleUI.class).toInstance(init.ui); - bind(InitFlags.class).toInstance(init.flags); - } - }); + modules.add( + new AbstractModule() { + @Override + protected void configure() { + bind(ConsoleUI.class).toInstance(init.ui); + bind(InitFlags.class).toInstance(init.flags); + } + }); Injector dbInjector = createDbInjector(SINGLE_USER); switch (IndexModule.getIndexType(dbInjector)) { case LUCENE: @@ -463,36 +471,37 @@ public class BaseInit extends SiteProgram { private static void recursiveDelete(Path path) { final String msg = "warn: Cannot remove "; try { - Files.walkFileTree(path, new SimpleFileVisitor() { - @Override - public FileVisitResult visitFile(Path f, BasicFileAttributes attrs) - throws IOException { - try { - Files.delete(f); - } catch (IOException e) { - System.err.println(msg + f); - } - return FileVisitResult.CONTINUE; - } + Files.walkFileTree( + path, + new SimpleFileVisitor() { + @Override + public FileVisitResult visitFile(Path f, BasicFileAttributes attrs) throws IOException { + try { + Files.delete(f); + } catch (IOException e) { + System.err.println(msg + f); + } + return FileVisitResult.CONTINUE; + } - @Override - public FileVisitResult postVisitDirectory(Path dir, IOException err) { - try { - // Previously warned if err was not null; if dir is not empty as a - // result, will cause an error that will be logged below. - Files.delete(dir); - } catch (IOException e) { - System.err.println(msg + dir); - } - return FileVisitResult.CONTINUE; - } + @Override + public FileVisitResult postVisitDirectory(Path dir, IOException err) { + try { + // Previously warned if err was not null; if dir is not empty as a + // result, will cause an error that will be logged below. + Files.delete(dir); + } catch (IOException e) { + System.err.println(msg + dir); + } + return FileVisitResult.CONTINUE; + } - @Override - public FileVisitResult visitFileFailed(Path f, IOException e) { - System.err.println(msg + f); - return FileVisitResult.CONTINUE; - } - }); + @Override + public FileVisitResult visitFileFailed(Path f, IOException e) { + System.err.println(msg + f); + return FileVisitResult.CONTINUE; + } + }); } catch (IOException e) { System.err.println(msg + path); } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/Browser.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/Browser.java index 41cb87e2b5..8868a31566 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/Browser.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/Browser.java @@ -18,13 +18,11 @@ import com.google.common.base.Strings; import com.google.gerrit.pgm.init.api.InitUtil; import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; - -import org.eclipse.jgit.lib.Config; - import java.io.IOException; import java.net.Socket; import java.net.URI; import java.net.URISyntaxException; +import org.eclipse.jgit.lib.Config; /** Opens the user's web browser to the web UI. */ public class Browser { @@ -67,7 +65,7 @@ public class Browser { int port = InitUtil.portOf(uri); System.err.format("Waiting for server on %s:%d ... ", host, port); System.err.flush(); - for (;;) { + for (; ; ) { Socket s; try { s = new Socket(host, port); diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/DB2Initializer.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/DB2Initializer.java index 3f6abcff0b..9dc1088b6f 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/DB2Initializer.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/DB2Initializer.java @@ -18,7 +18,6 @@ import static com.google.gerrit.pgm.init.api.InitUtil.username; import com.google.gerrit.pgm.init.api.Section; - public class DB2Initializer implements DatabaseConfigInitializer { @Override diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/DatabaseConfigInitializer.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/DatabaseConfigInitializer.java index bc9ce8c164..27019576ae 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/DatabaseConfigInitializer.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/DatabaseConfigInitializer.java @@ -20,8 +20,8 @@ import com.google.gerrit.pgm.init.api.Section; interface DatabaseConfigInitializer { /** - * Performs database platform specific configuration steps and writes - * configuration parameters into the given database section + * Performs database platform specific configuration steps and writes configuration parameters + * into the given database section */ void initConfig(Section databaseSection); } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/DatabaseConfigModule.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/DatabaseConfigModule.java index 9dda276eb8..45206c9fdd 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/DatabaseConfigModule.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/DatabaseConfigModule.java @@ -29,23 +29,30 @@ public class DatabaseConfigModule extends AbstractModule { @Override protected void configure() { bind(SitePaths.class).toInstance(site); - bind(DatabaseConfigInitializer.class).annotatedWith( - Names.named("db2")).to(DB2Initializer.class); - bind(DatabaseConfigInitializer.class).annotatedWith( - Names.named("derby")).to(DerbyInitializer.class); - bind(DatabaseConfigInitializer.class).annotatedWith( - Names.named("h2")).to(H2Initializer.class); - bind(DatabaseConfigInitializer.class).annotatedWith( - Names.named("jdbc")).to(JDBCInitializer.class); - bind(DatabaseConfigInitializer.class).annotatedWith( - Names.named("mysql")).to(MySqlInitializer.class); - bind(DatabaseConfigInitializer.class).annotatedWith( - Names.named("oracle")).to(OracleInitializer.class); - bind(DatabaseConfigInitializer.class).annotatedWith( - Names.named("postgresql")).to(PostgreSQLInitializer.class); - bind(DatabaseConfigInitializer.class).annotatedWith( - Names.named("maxdb")).to(MaxDbInitializer.class); - bind(DatabaseConfigInitializer.class).annotatedWith( - Names.named("hana")).to(HANAInitializer.class); + bind(DatabaseConfigInitializer.class) + .annotatedWith(Names.named("db2")) + .to(DB2Initializer.class); + bind(DatabaseConfigInitializer.class) + .annotatedWith(Names.named("derby")) + .to(DerbyInitializer.class); + bind(DatabaseConfigInitializer.class).annotatedWith(Names.named("h2")).to(H2Initializer.class); + bind(DatabaseConfigInitializer.class) + .annotatedWith(Names.named("jdbc")) + .to(JDBCInitializer.class); + bind(DatabaseConfigInitializer.class) + .annotatedWith(Names.named("mysql")) + .to(MySqlInitializer.class); + bind(DatabaseConfigInitializer.class) + .annotatedWith(Names.named("oracle")) + .to(OracleInitializer.class); + bind(DatabaseConfigInitializer.class) + .annotatedWith(Names.named("postgresql")) + .to(PostgreSQLInitializer.class); + bind(DatabaseConfigInitializer.class) + .annotatedWith(Names.named("maxdb")) + .to(MaxDbInitializer.class); + bind(DatabaseConfigInitializer.class) + .annotatedWith(Names.named("hana")) + .to(HANAInitializer.class); } } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/DerbyInitializer.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/DerbyInitializer.java index 4d710f1dd8..5db4287957 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/DerbyInitializer.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/DerbyInitializer.java @@ -20,7 +20,6 @@ import com.google.gerrit.common.FileUtil; import com.google.gerrit.pgm.init.api.Section; import com.google.gerrit.server.config.SitePaths; import com.google.inject.Inject; - import java.nio.file.Path; class DerbyInitializer implements DatabaseConfigInitializer { diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/H2Initializer.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/H2Initializer.java index 6d60ad1e28..1f3fd0f2e1 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/H2Initializer.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/H2Initializer.java @@ -20,7 +20,6 @@ import com.google.gerrit.common.FileUtil; import com.google.gerrit.pgm.init.api.Section; import com.google.gerrit.server.config.SitePaths; import com.google.inject.Inject; - import java.nio.file.Path; class H2Initializer implements DatabaseConfigInitializer { diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/HANAInitializer.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/HANAInitializer.java index fa0acbd9d5..bc39799a74 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/HANAInitializer.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/HANAInitializer.java @@ -26,8 +26,7 @@ public class HANAInitializer implements DatabaseConfigInitializer { public void initConfig(Section databaseSection) { final String defInstanceNumber = "00"; databaseSection.string("Server hostname", "hostname", "localhost"); - databaseSection.string("Instance number", "instance", defInstanceNumber, - false); + databaseSection.string("Instance number", "instance", defInstanceNumber, false); String instance = databaseSection.get("instance"); Integer instanceNumber = Ints.tryParse(instance); if (instanceNumber == null || instanceNumber < 0 || instanceNumber > 99) { diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitAdminUser.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitAdminUser.java index 43056f9a1d..2fe4ec3164 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitAdminUser.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitAdminUser.java @@ -34,9 +34,6 @@ import com.google.gerrit.server.index.account.AccountIndex; import com.google.gerrit.server.index.account.AccountIndexCollection; import com.google.gwtorm.server.SchemaFactory; import com.google.inject.Inject; - -import org.apache.commons.validator.routines.EmailValidator; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -45,6 +42,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; +import org.apache.commons.validator.routines.EmailValidator; public class InitAdminUser implements InitStep { private final ConsoleUI ui; @@ -55,17 +53,14 @@ public class InitAdminUser implements InitStep { @Inject InitAdminUser( - InitFlags flags, - ConsoleUI ui, - VersionedAuthorizedKeysOnInit.Factory authorizedKeysFactory) { + InitFlags flags, ConsoleUI ui, VersionedAuthorizedKeysOnInit.Factory authorizedKeysFactory) { this.flags = flags; this.ui = ui; this.authorizedKeysFactory = authorizedKeysFactory; } @Override - public void run() { - } + public void run() {} @Inject(optional = true) void set(SchemaFactory dbFactory) { @@ -79,8 +74,7 @@ public class InitAdminUser implements InitStep { @Override public void postRun() throws Exception { - AuthType authType = - flags.cfg.getEnum(AuthType.values(), "auth", null, "type", null); + AuthType authType = flags.cfg.getEnum(AuthType.values(), "auth", null, "type", null); if (authType != AuthType.DEVELOPMENT_BECOME_ANY_ACCOUNT) { return; } @@ -98,8 +92,8 @@ public class InitAdminUser implements InitStep { List extIds = new ArrayList<>(2); AccountExternalId extUser = - new AccountExternalId(id, new AccountExternalId.Key( - AccountExternalId.SCHEME_USERNAME, username)); + new AccountExternalId( + id, new AccountExternalId.Key(AccountExternalId.SCHEME_USERNAME, username)); if (!Strings.isNullOrEmpty(httpPassword)) { extUser.setPassword(httpPassword); } @@ -108,8 +102,8 @@ public class InitAdminUser implements InitStep { if (email != null) { AccountExternalId extMailto = - new AccountExternalId(id, new AccountExternalId.Key( - AccountExternalId.SCHEME_MAILTO, email)); + new AccountExternalId( + id, new AccountExternalId.Key(AccountExternalId.SCHEME_MAILTO, email)); extMailto.setEmailAddress(email); extIds.add(extMailto); db.accountExternalIds().insert(Collections.singleton(extMailto)); @@ -120,25 +114,22 @@ public class InitAdminUser implements InitStep { a.setPreferredEmail(email); db.accounts().insert(Collections.singleton(a)); - AccountGroupName adminGroupName = db.accountGroupNames().get( - new AccountGroup.NameKey("Administrators")); + AccountGroupName adminGroupName = + db.accountGroupNames().get(new AccountGroup.NameKey("Administrators")); AccountGroupMember m = - new AccountGroupMember(new AccountGroupMember.Key(id, - adminGroupName.getId())); + new AccountGroupMember(new AccountGroupMember.Key(id, adminGroupName.getId())); db.accountGroupMembers().insert(Collections.singleton(m)); if (sshKey != null) { - VersionedAuthorizedKeysOnInit authorizedKeys = - authorizedKeysFactory.create(id).load(); + VersionedAuthorizedKeysOnInit authorizedKeys = authorizedKeysFactory.create(id).load(); authorizedKeys.addKey(sshKey.getSshPublicKey()); authorizedKeys.save("Added SSH key for initial admin user\n"); } - AccountGroup adminGroup = - db.accountGroups().get(adminGroupName.getId()); - AccountState as = new AccountState(a, - Collections.singleton(adminGroup.getGroupUUID()), extIds, - new HashMap<>()); + AccountGroup adminGroup = db.accountGroups().get(adminGroupName.getId()); + AccountState as = + new AccountState( + a, Collections.singleton(adminGroup.getGroupUUID()), extIds, new HashMap<>()); for (AccountIndex accountIndex : indexCollection.getWriteIndexes()) { accountIndex.replace(as); } @@ -150,10 +141,10 @@ public class InitAdminUser implements InitStep { private String readEmail(AccountSshKey sshKey) { String defaultEmail = "admin@example.com"; if (sshKey != null && sshKey.getComment() != null) { - String c = sshKey.getComment().trim(); - if (EmailValidator.getInstance().isValid(c)) { - defaultEmail = c; - } + String c = sshKey.getComment().trim(); + if (EmailValidator.getInstance().isValid(c)) { + defaultEmail = c; + } } return readEmail(defaultEmail); } @@ -169,23 +160,18 @@ public class InitAdminUser implements InitStep { private AccountSshKey readSshKey(Account.Id id) throws IOException { String defaultPublicSshKeyFile = ""; - Path defaultPublicSshKeyPath = - Paths.get(System.getProperty("user.home"), ".ssh", "id_rsa.pub"); + Path defaultPublicSshKeyPath = Paths.get(System.getProperty("user.home"), ".ssh", "id_rsa.pub"); if (Files.exists(defaultPublicSshKeyPath)) { defaultPublicSshKeyFile = defaultPublicSshKeyPath.toString(); } - String publicSshKeyFile = - ui.readString(defaultPublicSshKeyFile, "public SSH key file"); - return !Strings.isNullOrEmpty(publicSshKeyFile) - ? createSshKey(id, publicSshKeyFile) : null; + String publicSshKeyFile = ui.readString(defaultPublicSshKeyFile, "public SSH key file"); + return !Strings.isNullOrEmpty(publicSshKeyFile) ? createSshKey(id, publicSshKeyFile) : null; } - private AccountSshKey createSshKey(Account.Id id, String keyFile) - throws IOException { + private AccountSshKey createSshKey(Account.Id id, String keyFile) throws IOException { Path p = Paths.get(keyFile); if (!Files.exists(p)) { - throw new IOException(String.format( - "Cannot add public SSH key: %s is not a file", keyFile)); + throw new IOException(String.format("Cannot add public SSH key: %s is not a file", keyFile)); } String content = new String(Files.readAllBytes(p), UTF_8); return new AccountSshKey(new AccountSshKey.Id(id, 1), content); diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitAuth.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitAuth.java index f4bcd86c75..3a4341291f 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitAuth.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitAuth.java @@ -39,10 +39,7 @@ class InitAuth implements InitStep { private final InitFlags flags; @Inject - InitAuth(InitFlags flags, - ConsoleUI ui, - Libraries libraries, - Section.Factory sections) { + InitAuth(InitFlags flags, ConsoleUI ui, Libraries libraries, Section.Factory sections) { this.flags = flags; this.ui = ui; this.auth = sections.get("auth", null); @@ -64,20 +61,24 @@ class InitAuth implements InitStep { } private void initAuthType() { - AuthType authType = auth.select("Authentication method", "type", - flags.dev ? AuthType.DEVELOPMENT_BECOME_ANY_ACCOUNT : AuthType.OPENID); + AuthType authType = + auth.select( + "Authentication method", + "type", + flags.dev ? AuthType.DEVELOPMENT_BECOME_ANY_ACCOUNT : AuthType.OPENID); switch (authType) { case HTTP: - case HTTP_LDAP: { - String hdr = auth.get("httpHeader"); - if (ui.yesno(hdr != null, "Get username from custom HTTP header")) { - auth.string("Username HTTP header", "httpHeader", "SM_USER"); - } else if (hdr != null) { - auth.unset("httpHeader"); + case HTTP_LDAP: + { + String hdr = auth.get("httpHeader"); + if (ui.yesno(hdr != null, "Get username from custom HTTP header")) { + auth.string("Username HTTP header", "httpHeader", "SM_USER"); + } else if (hdr != null) { + auth.unset("httpHeader"); + } + auth.string("SSO logout URL", "logoutUrl", null); + break; } - auth.string("SSO logout URL", "logoutUrl", null); - break; - } case CLIENT_SSL_CERT_LDAP: case CUSTOM_EXTENSION: @@ -93,28 +94,28 @@ class InitAuth implements InitStep { switch (authType) { case LDAP: case LDAP_BIND: - case HTTP_LDAP: { - String server = - ldap.string("LDAP server", "server", "ldap://localhost"); - if (server != null // - && !server.startsWith("ldap://") // - && !server.startsWith("ldaps://")) { - if (ui.yesno(false, "Use SSL")) { - server = "ldaps://" + server; - } else { - server = "ldap://" + server; + case HTTP_LDAP: + { + String server = ldap.string("LDAP server", "server", "ldap://localhost"); + if (server != null // + && !server.startsWith("ldap://") // + && !server.startsWith("ldaps://")) { + if (ui.yesno(false, "Use SSL")) { + server = "ldaps://" + server; + } else { + server = "ldap://" + server; + } + ldap.set("server", server); } - ldap.set("server", server); + + ldap.string("LDAP username", "username", null); + ldap.password("username", "password"); + + String aBase = ldap.string("Account BaseDN", "accountBase", dnOf(server)); + ldap.string("Group BaseDN", "groupBase", aBase); + break; } - ldap.string("LDAP username", "username", null); - ldap.password("username", "password"); - - String aBase = ldap.string("Account BaseDN", "accountBase", dnOf(server)); - ldap.string("Group BaseDN", "groupBase", aBase); - break; - } - case CLIENT_SSL_CERT_LDAP: case CUSTOM_EXTENSION: case DEVELOPMENT_BECOME_ANY_ACCOUNT: diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitCache.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitCache.java index aac2b36688..30627d5dc4 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitCache.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitCache.java @@ -22,7 +22,6 @@ import com.google.gerrit.pgm.init.api.Section; import com.google.gerrit.server.config.SitePaths; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.io.IOException; import java.nio.file.DirectoryStream; import java.nio.file.Files; @@ -39,8 +38,11 @@ class InitCache implements InitStep { private final Section cache; @Inject - InitCache(final ConsoleUI ui, final InitFlags flags, - final SitePaths site, final Section.Factory sections) { + InitCache( + final ConsoleUI ui, + final InitFlags flags, + final SitePaths site, + final Section.Factory sections) { this.ui = ui; this.flags = flags; this.site = site; @@ -67,8 +69,7 @@ class InitCache implements InitStep { Path loc = site.resolve(path); FileUtil.mkdirsOrDie(loc, "cannot create cache.directory"); List cacheFiles = new ArrayList<>(); - try (DirectoryStream stream = - Files.newDirectoryStream(loc, "*.{lock,h2,trace}.db")) { + try (DirectoryStream stream = Files.newDirectoryStream(loc, "*.{lock,h2,trace}.db")) { for (Path entry : stream) { cacheFiles.add(entry); } @@ -78,8 +79,7 @@ class InitCache implements InitStep { } if (!cacheFiles.isEmpty()) { for (Path entry : cacheFiles) { - if (flags.deleteCaches || - ui.yesno(false, "Delete cache file %s", entry)) { + if (flags.deleteCaches || ui.yesno(false, "Delete cache file %s", entry)) { try { Files.deleteIfExists(entry); } catch (IOException e) { diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitContainer.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitContainer.java index 03ddd7b2eb..395806942c 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitContainer.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitContainer.java @@ -25,15 +25,13 @@ import com.google.gerrit.pgm.init.api.Section; import com.google.gerrit.server.config.SitePaths; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.internal.storage.file.LockFile; - import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Path; +import org.eclipse.jgit.internal.storage.file.LockFile; /** Initialize the {@code container} configuration section. */ @Singleton @@ -43,8 +41,7 @@ class InitContainer implements InitStep { private final Section container; @Inject - InitContainer(final ConsoleUI ui, final SitePaths site, - final Section.Factory sections) { + InitContainer(final ConsoleUI ui, final SitePaths site, final Section.Factory sections) { this.ui = ui; this.site = site; this.container = sections.get("container", null); @@ -67,8 +64,9 @@ class InitContainer implements InitStep { String path = container.get("war"); if (path != null) { - path = container.string("Gerrit runtime", "war", - myWar != null ? myWar.toAbsolutePath().toString() : null); + path = + container.string( + "Gerrit runtime", "war", myWar != null ? myWar.toAbsolutePath().toString() : null); if (path == null || path.isEmpty()) { throw die("container.war is required"); } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitDatabase.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitDatabase.java index 47783e4895..5565158873 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitDatabase.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitDatabase.java @@ -32,7 +32,6 @@ import com.google.inject.Singleton; import com.google.inject.TypeLiteral; import com.google.inject.name.Named; import com.google.inject.name.Names; - import java.lang.annotation.Annotation; import java.util.List; import java.util.Set; @@ -47,7 +46,10 @@ class InitDatabase implements InitStep { private final Section idSection; @Inject - InitDatabase(final ConsoleUI ui, final SitePaths site, final Libraries libraries, + InitDatabase( + final ConsoleUI ui, + final SitePaths site, + final Libraries libraries, final Section.Factory sections) { this.ui = ui; this.site = site; @@ -76,12 +78,10 @@ class InitDatabase implements InitStep { database.set("type", "jdbc"); } - String dbType = - database.select("Database server type", "type", "h2", allowedValues); + String dbType = database.select("Database server type", "type", "h2", allowedValues); DatabaseConfigInitializer dci = - i.getInstance(Key.get(DatabaseConfigInitializer.class, - Names.named(dbType.toLowerCase()))); + i.getInstance(Key.get(DatabaseConfigInitializer.class, Names.named(dbType.toLowerCase()))); if (dci instanceof MySqlInitializer) { libraries.mysqlDriver.downloadRequired(); @@ -98,8 +98,7 @@ class InitDatabase implements InitStep { // Initialize UUID for NoteDb on first init. String id = idSection.get(GerritServerIdProvider.KEY); if (Strings.isNullOrEmpty(id)) { - idSection.set( - GerritServerIdProvider.KEY, GerritServerIdProvider.generate()); + idSection.set(GerritServerIdProvider.KEY, GerritServerIdProvider.generate()); } } } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitDev.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitDev.java index 5500da8bd1..4305877905 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitDev.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitDev.java @@ -26,8 +26,7 @@ public class InitDev implements InitStep { private final Section plugins; @Inject - InitDev(InitFlags flags, - Section.Factory sections) { + InitDev(InitFlags flags, Section.Factory sections) { this.flags = flags; this.plugins = sections.get("plugins", null); } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitGitManager.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitGitManager.java index 19eaa3c8dc..fc42f9d817 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitGitManager.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitGitManager.java @@ -22,7 +22,6 @@ import com.google.gerrit.pgm.init.api.InitStep; import com.google.gerrit.pgm.init.api.Section; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.nio.file.Path; /** Initialize the GitRepositoryManager configuration section. */ diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitHttpd.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitHttpd.java index 72a70c9fb5..1a86106a0d 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitHttpd.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitHttpd.java @@ -28,7 +28,6 @@ import com.google.gerrit.server.config.SitePaths; import com.google.gwtjsonrpc.server.SignedToken; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; @@ -45,7 +44,10 @@ class InitHttpd implements InitStep { private final Section gerrit; @Inject - InitHttpd(final ConsoleUI ui, final SitePaths site, final InitFlags flags, + InitHttpd( + final ConsoleUI ui, + final SitePaths site, + final InitFlags flags, final Section.Factory sections) { this.ui = ui; this.site = site; @@ -129,8 +131,7 @@ class InitHttpd implements InitStep { generateSslCertificate(); } - private void generateSslCertificate() throws IOException, - InterruptedException { + private void generateSslCertificate() throws IOException, InterruptedException { final String listenUrl = httpd.get("listenUrl"); if (!listenUrl.startsWith("https://")) { @@ -152,8 +153,7 @@ class InitHttpd implements InitStep { } Path store = site.ssl_keystore; - if (!ui.yesno(!Files.exists(store), - "Create new self-signed SSL certificate")) { + if (!ui.yesno(!Files.exists(store), "Create new self-signed SSL certificate")) { return; } @@ -164,11 +164,9 @@ class InitHttpd implements InitStep { } hostname = ui.readString(hostname, "Certificate server name"); - final String validity = - ui.readString("365", "Certificate expires in (days)"); + final String validity = ui.readString("365", "Certificate expires in (days)"); - final String dname = - "CN=" + hostname + ",OU=Gerrit Code Review,O=" + domainOf(hostname); + final String dname = "CN=" + hostname + ",OU=Gerrit Code Review,O=" + domainOf(hostname); Path tmpdir = site.etc_dir.resolve("tmp.sslcertgen"); try { @@ -179,16 +177,27 @@ class InitHttpd implements InitStep { chmod(0600, tmpdir); Path tmpstore = tmpdir.resolve("keystore"); - Runtime.getRuntime().exec(new String[] {"keytool", // - "-keystore", tmpstore.toAbsolutePath().toString(), // - "-storepass", ssl_pass, // - "-genkeypair", // - "-alias", hostname, // - "-keyalg", "RSA", // - "-validity", validity, // - "-dname", dname, // - "-keypass", ssl_pass, // - }).waitFor(); + Runtime.getRuntime() + .exec( + new String[] { + "keytool", // + "-keystore", + tmpstore.toAbsolutePath().toString(), // + "-storepass", + ssl_pass, // + "-genkeypair", // + "-alias", + hostname, // + "-keyalg", + "RSA", // + "-validity", + validity, // + "-dname", + dname, // + "-keypass", + ssl_pass, // + }) + .waitFor(); chmod(0600, tmpstore); try { diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitIndex.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitIndex.java index c9a9b5c717..0d9a822e5d 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitIndex.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitIndex.java @@ -27,7 +27,6 @@ import com.google.gerrit.server.index.IndexUtils; import com.google.gerrit.server.index.SchemaDefinitions; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.io.IOException; import java.nio.file.DirectoryStream; import java.nio.file.Files; @@ -43,10 +42,7 @@ class InitIndex implements InitStep { private final Section gerrit; @Inject - InitIndex(ConsoleUI ui, - Section.Factory sections, - SitePaths site, - InitFlags initFlags) { + InitIndex(ConsoleUI ui, Section.Factory sections, SitePaths site, InitFlags initFlags) { this.ui = ui; this.index = sections.get("index", null); this.gerrit = sections.get("gerrit", null); @@ -63,8 +59,7 @@ class InitIndex implements InitStep { } if (type == IndexType.ELASTICSEARCH) { - index.select("Transport protocol", "protocol", "http", - Sets.newHashSet("http", "https")); + index.select("Transport protocol", "protocol", "http", Sets.newHashSet("http", "https")); index.string("Hostname", "hostname", "localhost"); index.string("Port", "port", "9200"); index.string("Index Name", "name", "gerrit"); @@ -72,17 +67,17 @@ class InitIndex implements InitStep { if ((site.isNew || isEmptySite()) && type == IndexType.LUCENE) { for (SchemaDefinitions def : IndexModule.ALL_SCHEMA_DEFS) { - IndexUtils.setReady( - site, def.getName(), def.getLatest().getVersion(), true); + IndexUtils.setReady(site, def.getName(), def.getLatest().getVersion(), true); } } else { if (IndexType.values().length <= 1) { ui.header("Index"); } - String message = String.format( - "\nThe index must be %sbuilt before starting Gerrit:\n" - + " java -jar gerrit.war reindex -d site_path\n", - site.isNew ? "" : "re"); + String message = + String.format( + "\nThe index must be %sbuilt before starting Gerrit:\n" + + " java -jar gerrit.war reindex -d site_path\n", + site.isNew ? "" : "re"); ui.message(message); initFlags.autoStart = false; } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitLabels.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitLabels.java index b6b4cc13d7..60fd60f0bc 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitLabels.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitLabels.java @@ -19,15 +19,12 @@ import com.google.gerrit.pgm.init.api.ConsoleUI; import com.google.gerrit.pgm.init.api.InitStep; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.Config; - import java.util.Arrays; +import org.eclipse.jgit.lib.Config; @Singleton public class InitLabels implements InitStep { - private static final String KEY_COPY_ALL_SCORES_IF_NO_CODE_CHANGE = - "copyAllScoresIfNoCodeChange"; + private static final String KEY_COPY_ALL_SCORES_IF_NO_CODE_CHANGE = "copyAllScoresIfNoCodeChange"; private static final String KEY_LABEL = "label"; private static final String KEY_FUNCTION = "function"; private static final String KEY_VALUE = "value"; @@ -58,7 +55,10 @@ public class InitLabels implements InitStep { Config cfg = allProjectsConfig.load().getConfig(); if (installVerified) { cfg.setString(KEY_LABEL, LABEL_VERIFIED, KEY_FUNCTION, "MaxWithBlock"); - cfg.setStringList(KEY_LABEL, LABEL_VERIFIED, KEY_VALUE, + cfg.setStringList( + KEY_LABEL, + LABEL_VERIFIED, + KEY_VALUE, Arrays.asList(new String[] {"-1 Fails", " 0 No score", "+1 Verified"})); cfg.setBoolean(KEY_LABEL, LABEL_VERIFIED, KEY_COPY_ALL_SCORES_IF_NO_CODE_CHANGE, true); allProjectsConfig.save("Configure 'Verified' label"); diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitModule.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitModule.java index a442f29765..f6b7e6ae77 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitModule.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitModule.java @@ -21,7 +21,6 @@ import com.google.gerrit.pgm.init.api.Section; import com.google.gerrit.server.config.SitePaths; import com.google.inject.binder.LinkedBindingBuilder; import com.google.inject.internal.UniqueAnnotations; - import java.lang.annotation.Annotation; /** Injection configuration for the site initialization process. */ diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPluginStepsLoader.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPluginStepsLoader.java index ee20d996a5..4526a87184 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPluginStepsLoader.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPluginStepsLoader.java @@ -26,7 +26,6 @@ import com.google.inject.AbstractModule; import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Singleton; - import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; @@ -44,8 +43,8 @@ public class InitPluginStepsLoader { final ConsoleUI ui; @Inject - public InitPluginStepsLoader(final ConsoleUI ui, final SitePaths sitePaths, - final Injector initInjector) { + public InitPluginStepsLoader( + final ConsoleUI ui, final SitePaths sitePaths, final Injector initInjector) { this.pluginsDir = sitePaths.plugins_dir; this.initInjector = initInjector; this.ui = ui; @@ -68,8 +67,8 @@ public class InitPluginStepsLoader { private InitStep loadInitStep(Path jar) { try { URLClassLoader pluginLoader = - new URLClassLoader(new URL[] {jar.toUri().toURL()}, - InitPluginStepsLoader.class.getClassLoader()); + new URLClassLoader( + new URL[] {jar.toUri().toURL()}, InitPluginStepsLoader.class.getClassLoader()); try (JarFile jarFile = new JarFile(jar.toFile())) { Attributes jarFileAttributes = jarFile.getManifest().getMainAttributes(); String initClassName = jarFileAttributes.getValue("Gerrit-InitStep"); @@ -100,24 +99,23 @@ public class InitPluginStepsLoader { } private Injector getPluginInjector(Path jarPath) throws IOException { - final String pluginName = MoreObjects.firstNonNull( - JarPluginProvider.getJarPluginName(jarPath), - PluginLoader.nameOf(jarPath)); - return initInjector.createChildInjector(new AbstractModule() { - @Override - protected void configure() { - bind(String.class).annotatedWith(PluginName.class).toInstance( - pluginName); - } - }); + final String pluginName = + MoreObjects.firstNonNull( + JarPluginProvider.getJarPluginName(jarPath), PluginLoader.nameOf(jarPath)); + return initInjector.createChildInjector( + new AbstractModule() { + @Override + protected void configure() { + bind(String.class).annotatedWith(PluginName.class).toInstance(pluginName); + } + }); } private List scanJarsInPluginsDirectory() { try { return PluginLoader.listPlugins(pluginsDir, ".jar"); } catch (IOException e) { - ui.message("WARN: Cannot list %s: %s", pluginsDir.toAbsolutePath(), - e.getMessage()); + ui.message("WARN: Cannot list %s: %s", pluginsDir.toAbsolutePath(), e.getMessage()); return ImmutableList.of(); } } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPlugins.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPlugins.java index 43d7d3b242..385d20ca82 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPlugins.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPlugins.java @@ -24,7 +24,6 @@ import com.google.gerrit.server.plugins.JarPluginProvider; import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Singleton; - import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; @@ -42,37 +41,42 @@ public class InitPlugins implements InitStep { public static final String PLUGIN_DIR = "WEB-INF/plugins/"; public static final String JAR = ".jar"; - public static List listPlugins(SitePaths site, - PluginsDistribution pluginsDistribution) throws IOException { + public static List listPlugins( + SitePaths site, PluginsDistribution pluginsDistribution) throws IOException { return listPlugins(site, false, pluginsDistribution); } - public static List listPluginsAndRemoveTempFiles(SitePaths site, - PluginsDistribution pluginsDistribution) throws IOException { + public static List listPluginsAndRemoveTempFiles( + SitePaths site, PluginsDistribution pluginsDistribution) throws IOException { return listPlugins(site, true, pluginsDistribution); } - private static List listPlugins(final SitePaths site, - final boolean deleteTempPluginFile, PluginsDistribution pluginsDistribution) - throws IOException { + private static List listPlugins( + final SitePaths site, + final boolean deleteTempPluginFile, + PluginsDistribution pluginsDistribution) + throws IOException { final List result = new ArrayList<>(); - pluginsDistribution.foreach(new PluginsDistribution.Processor() { - @Override - public void process(String pluginName, InputStream in) throws IOException { - Path tmpPlugin = JarPluginProvider.storeInTemp(pluginName, in, site); - String pluginVersion = getVersion(tmpPlugin); - if (deleteTempPluginFile) { - Files.delete(tmpPlugin); - } - result.add(new PluginData(pluginName, pluginVersion, tmpPlugin)); - } - }); - return FluentIterable.from(result).toSortedList(new Comparator() { - @Override - public int compare(PluginData a, PluginData b) { - return a.name.compareTo(b.name); - } - }); + pluginsDistribution.foreach( + new PluginsDistribution.Processor() { + @Override + public void process(String pluginName, InputStream in) throws IOException { + Path tmpPlugin = JarPluginProvider.storeInTemp(pluginName, in, site); + String pluginVersion = getVersion(tmpPlugin); + if (deleteTempPluginFile) { + Files.delete(tmpPlugin); + } + result.add(new PluginData(pluginName, pluginVersion, tmpPlugin)); + } + }); + return FluentIterable.from(result) + .toSortedList( + new Comparator() { + @Override + public int compare(PluginData a, PluginData b) { + return a.name.compareTo(b.name); + } + }); } private final ConsoleUI ui; @@ -84,8 +88,11 @@ public class InitPlugins implements InitStep { private Injector postRunInjector; @Inject - InitPlugins(final ConsoleUI ui, final SitePaths site, - InitFlags initFlags, InitPluginStepsLoader pluginLoader, + InitPlugins( + final ConsoleUI ui, + final SitePaths site, + InitFlags initFlags, + InitPluginStepsLoader pluginLoader, PluginsDistribution pluginsDistribution) { this.ui = ui; this.site = site; @@ -124,24 +131,26 @@ public class InitPlugins implements InitStep { if (!(initFlags.installPlugins.contains(pluginName) || initFlags.installAllPlugins - || ui.yesno(upgrade, "Install plugin %s version %s", pluginName, - plugin.version))) { + || ui.yesno(upgrade, "Install plugin %s version %s", pluginName, plugin.version))) { Files.deleteIfExists(tmpPlugin); continue; } if (upgrade) { final String installedPluginVersion = getVersion(p); - if (!ui.yesno(upgrade, "%s %s is already installed, overwrite it", - plugin.name, installedPluginVersion)) { + if (!ui.yesno( + upgrade, + "%s %s is already installed, overwrite it", + plugin.name, + installedPluginVersion)) { Files.deleteIfExists(tmpPlugin); continue; } try { Files.delete(p); } catch (IOException e) { - throw new IOException("Failed to delete plugin " + pluginName - + ": " + p.toAbsolutePath(), e); + throw new IOException( + "Failed to delete plugin " + pluginName + ": " + p.toAbsolutePath(), e); } } try { @@ -153,9 +162,14 @@ public class InitPlugins implements InitStep { ui.message("Installed %s %s\n", plugin.name, plugin.version); } } catch (IOException e) { - throw new IOException("Failed to install plugin " + pluginName - + ": " + tmpPlugin.toAbsolutePath() + " -> " - + p.toAbsolutePath(), e); + throw new IOException( + "Failed to install plugin " + + pluginName + + ": " + + tmpPlugin.toAbsolutePath() + + " -> " + + p.toAbsolutePath(), + e); } } finally { Files.deleteIfExists(plugin.pluginPath); diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitSendEmail.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitSendEmail.java index b140ab1145..97359b3dca 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitSendEmail.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitSendEmail.java @@ -24,7 +24,6 @@ import com.google.gerrit.server.config.SitePaths; import com.google.gerrit.server.mail.Encryption; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.nio.file.Files; /** Initialize the {@code sendemail} configuration section. */ @@ -35,8 +34,7 @@ class InitSendEmail implements InitStep { private final SitePaths site; @Inject - InitSendEmail(final ConsoleUI ui, final SitePaths site, - final Section.Factory sections) { + InitSendEmail(final ConsoleUI ui, final SitePaths site, final Section.Factory sections) { this.ui = ui; this.sendemail = sections.get("sendemail", null); this.site = site; @@ -46,14 +44,12 @@ class InitSendEmail implements InitStep { public void run() { ui.header("Email Delivery"); - final String hostname = - sendemail.string("SMTP server hostname", "smtpServer", "localhost"); + final String hostname = sendemail.string("SMTP server hostname", "smtpServer", "localhost"); sendemail.string("SMTP server port", "smtpServerPort", "(default)", true); final Encryption enc = - sendemail.select("SMTP encryption", "smtpEncryption", Encryption.NONE, - true); + sendemail.select("SMTP encryption", "smtpEncryption", Encryption.NONE, true); String username = null; if (Files.exists(site.gerrit_config)) { diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitSshd.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitSshd.java index 904d4f253a..d49a2673b4 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitSshd.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitSshd.java @@ -27,15 +27,13 @@ import com.google.gerrit.server.util.HostPlatform; import com.google.gerrit.server.util.SocketUtil; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.apache.sshd.common.util.SecurityUtils; -import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider; - import java.io.IOException; import java.lang.ProcessBuilder.Redirect; import java.net.InetSocketAddress; import java.nio.file.Files; import java.nio.file.Path; +import org.apache.sshd.common.util.SecurityUtils; +import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider; /** Initialize the {@code sshd} configuration section. */ @Singleton @@ -46,7 +44,10 @@ class InitSshd implements InitStep { private final Section sshd; @Inject - InitSshd(final ConsoleUI ui, final SitePaths site, final Libraries libraries, + InitSshd( + final ConsoleUI ui, + final SitePaths site, + final Libraries libraries, final Section.Factory sections) { this.ui = ui; this.site = site; @@ -110,25 +111,39 @@ class InitSshd implements InitStep { System.err.print(" rsa..."); System.err.flush(); - new ProcessBuilder("ssh-keygen", - "-q" /* quiet */, - "-t", "rsa", - "-P", emptyPassphraseArg, - "-C", comment, - "-f", site.ssh_rsa.toAbsolutePath().toString() - ).redirectError(Redirect.INHERIT).redirectOutput(Redirect.INHERIT) - .start().waitFor(); + new ProcessBuilder( + "ssh-keygen", + "-q" /* quiet */, + "-t", + "rsa", + "-P", + emptyPassphraseArg, + "-C", + comment, + "-f", + site.ssh_rsa.toAbsolutePath().toString()) + .redirectError(Redirect.INHERIT) + .redirectOutput(Redirect.INHERIT) + .start() + .waitFor(); System.err.print(" dsa..."); System.err.flush(); - new ProcessBuilder("ssh-keygen", - "-q" /* quiet */, - "-t", "dsa", - "-P", emptyPassphraseArg, - "-C", comment, - "-f", site.ssh_dsa.toAbsolutePath().toString() - ).redirectError(Redirect.INHERIT).redirectOutput(Redirect.INHERIT) - .start().waitFor(); + new ProcessBuilder( + "ssh-keygen", + "-q" /* quiet */, + "-t", + "dsa", + "-P", + emptyPassphraseArg, + "-C", + comment, + "-f", + site.ssh_dsa.toAbsolutePath().toString()) + .redirectError(Redirect.INHERIT) + .redirectOutput(Redirect.INHERIT) + .start() + .waitFor(); } else { // Generate the SSH daemon host key ourselves. This is complex diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/Libraries.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/Libraries.java index b4c672a03d..de87ba94f5 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/Libraries.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/Libraries.java @@ -20,10 +20,6 @@ import com.google.gerrit.pgm.init.api.LibraryDownload; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.Config; - import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -32,28 +28,30 @@ import java.io.Reader; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.List; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.Config; /** Standard {@link LibraryDownloader} instances derived from configuration. */ @Singleton class Libraries { - private static final String RESOURCE_FILE = - "com/google/gerrit/pgm/init/libraries.config"; + private static final String RESOURCE_FILE = "com/google/gerrit/pgm/init/libraries.config"; private final Provider downloadProvider; private final List skippedDownloads; private final boolean skipAllDownloads; - /* final */LibraryDownloader bouncyCastlePGP; - /* final */LibraryDownloader bouncyCastleProvider; - /* final */LibraryDownloader bouncyCastleSSL; - /* final */LibraryDownloader db2Driver; - /* final */LibraryDownloader db2DriverLicense; - /* final */LibraryDownloader hanaDriver; - /* final */LibraryDownloader mysqlDriver; - /* final */LibraryDownloader oracleDriver; + /* final */ LibraryDownloader bouncyCastlePGP; + /* final */ LibraryDownloader bouncyCastleProvider; + /* final */ LibraryDownloader bouncyCastleSSL; + /* final */ LibraryDownloader db2Driver; + /* final */ LibraryDownloader db2DriverLicense; + /* final */ LibraryDownloader hanaDriver; + /* final */ LibraryDownloader mysqlDriver; + /* final */ LibraryDownloader oracleDriver; @Inject - Libraries(final Provider downloadProvider, + Libraries( + final Provider downloadProvider, @LibraryDownload List skippedDownloads, @LibraryDownload Boolean skipAllDownloads) { this.downloadProvider = downloadProvider; @@ -71,8 +69,7 @@ class Libraries { } for (Field f : Libraries.class.getDeclaredFields()) { - if ((f.getModifiers() & Modifier.STATIC) == 0 - && f.getType() == LibraryDownloader.class) { + if ((f.getModifiers() & Modifier.STATIC) == 0 && f.getType() == LibraryDownloader.class) { try { f.set(this, downloadProvider.get()); } catch (IllegalArgumentException | IllegalAccessException e) { @@ -82,20 +79,22 @@ class Libraries { } for (Field f : Libraries.class.getDeclaredFields()) { - if ((f.getModifiers() & Modifier.STATIC) == 0 - && f.getType() == LibraryDownloader.class) { + if ((f.getModifiers() & Modifier.STATIC) == 0 && f.getType() == LibraryDownloader.class) { try { init(f, cfg); - } catch (IllegalArgumentException | IllegalAccessException - | NoSuchFieldException | SecurityException e) { + } catch (IllegalArgumentException + | IllegalAccessException + | NoSuchFieldException + | SecurityException e) { throw new IllegalStateException("Cannot configure " + f.getName()); } } } } - private void init(Field field, Config cfg) throws IllegalArgumentException, - IllegalAccessException, NoSuchFieldException, SecurityException { + private void init(Field field, Config cfg) + throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, + SecurityException { String n = field.getName(); LibraryDownloader dl = (LibraryDownloader) field.get(this); dl.setName(get(cfg, n, "name")); @@ -116,12 +115,11 @@ class Libraries { return doGet(cfg, name, key, true); } - private static String doGet(Config cfg, String name, String key, - boolean required) { + private static String doGet(Config cfg, String name, String key, boolean required) { String val = cfg.getString("library", name, key); if ((val == null || val.isEmpty()) && required) { - throw new IllegalStateException("Variable library." + name + "." + key - + " is required within " + RESOURCE_FILE); + throw new IllegalStateException( + "Variable library." + name + "." + key + " is required within " + RESOURCE_FILE); } return val; } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/LibraryDownloader.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/LibraryDownloader.java index 653f2c53c1..af4c7d834c 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/LibraryDownloader.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/LibraryDownloader.java @@ -24,9 +24,6 @@ import com.google.gerrit.common.IoUtil; import com.google.gerrit.pgm.init.api.ConsoleUI; import com.google.gerrit.server.config.SitePaths; import com.google.inject.Inject; - -import org.eclipse.jgit.util.HttpSupport; - import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -42,6 +39,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; +import org.eclipse.jgit.util.HttpSupport; /** Get optional or required 3rd party library files into $site_path/lib. */ class LibraryDownloader { @@ -150,17 +148,14 @@ class LibraryDownloader { msg.append("\n"); msg.append("Gerrit Code Review is not shipped with %s\n"); if (neededBy != null) { - msg.append(String.format( - "** This library is required by %s. **\n", - neededBy.name)); + msg.append(String.format("** This library is required by %s. **\n", neededBy.name)); } else if (required) { msg.append("** This library is required for your configuration. **\n"); } else { msg.append(" If available, Gerrit can take advantage of features\n"); msg.append(" in the library, but will also function without it.\n"); } - msg.append(String.format( - "%s and install it now", download ? "Download" : "Copy")); + msg.append(String.format("%s and install it now", download ? "Download" : "Copy")); return ui.yesno(true, msg.toString(), name); } @@ -223,15 +218,14 @@ class LibraryDownloader { private void removeStaleVersions() { if (!Strings.isNullOrEmpty(remove)) { - DirectoryStream.Filter filter = new DirectoryStream.Filter() { - @Override - public boolean accept(Path entry) { - return entry.getFileName().toString() - .matches("^" + remove + "$"); - } - }; - try (DirectoryStream paths = - Files.newDirectoryStream(lib_dir, filter)) { + DirectoryStream.Filter filter = + new DirectoryStream.Filter() { + @Override + public boolean accept(Path entry) { + return entry.getFileName().toString().matches("^" + remove + "$"); + } + }; + try (DirectoryStream paths = Files.newDirectoryStream(lib_dir, filter)) { for (Path p : paths) { String old = p.getFileName().toString(); String bak = "." + old + ".backup"; @@ -252,10 +246,11 @@ class LibraryDownloader { System.err.print("Copying " + jarUrl + " ..."); Path p = url2file(jarUrl); if (!Files.exists(p)) { - StringBuilder msg = new StringBuilder() - .append("\n") - .append("Can not find the %s at this location: %s\n") - .append("Please provide alternative URL"); + StringBuilder msg = + new StringBuilder() + .append("\n") + .append("Can not find the %s at this location: %s\n") + .append("Please provide alternative URL"); p = url2file(ui.readString(null, msg.toString(), name, jarUrl)); } Files.copy(p, dst); @@ -300,8 +295,8 @@ class LibraryDownloader { throw new FileNotFoundException(url.toString()); default: - throw new IOException(url.toString() + ": " + HttpSupport.response(c) - + " " + c.getResponseMessage()); + throw new IOException( + url.toString() + ": " + HttpSupport.response(c) + " " + c.getResponseMessage()); } } @@ -326,8 +321,9 @@ class LibraryDownloader { deleteDst(); throw new Die(dst + " SHA-1 checksum does not match"); - } else if (!ui.yesno(null /* force an answer */, - "error: SHA-1 checksum does not match\n" + "Use %s anyway",// + } else if (!ui.yesno( + null /* force an answer */, + "error: SHA-1 checksum does not match\n" + "Use %s anyway", // dst.getFileName())) { deleteDst(); throw new Die("aborted by user"); diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/OracleInitializer.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/OracleInitializer.java index e58c6ad7ee..ffbaf34212 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/OracleInitializer.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/OracleInitializer.java @@ -18,7 +18,6 @@ import static com.google.gerrit.pgm.init.api.InitUtil.username; import com.google.gerrit.pgm.init.api.Section; - public class OracleInitializer implements DatabaseConfigInitializer { @Override diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/PluginsDistribution.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/PluginsDistribution.java index 68af83f675..73720c4e6a 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/PluginsDistribution.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/PluginsDistribution.java @@ -19,19 +19,15 @@ import java.io.IOException; import java.io.InputStream; import java.util.List; -/** - * Represents the plugins packaged in the Gerrit distribution - */ +/** Represents the plugins packaged in the Gerrit distribution */ public interface PluginsDistribution { public interface Processor { /** * @param pluginName the name of the plugin (without the .jar extension) - * @param in the content of the plugin .jar file. Implementors don't have to - * close this stream. - * @throws IOException implementations will typically propagate any - * IOException caused by dealing with the InputStream back to the - * caller + * @param in the content of the plugin .jar file. Implementors don't have to close this stream. + * @throws IOException implementations will typically propagate any IOException caused by + * dealing with the InputStream back to the caller */ void process(String pluginName, InputStream in) throws IOException; } @@ -40,18 +36,16 @@ public interface PluginsDistribution { * Iterate over plugins package in the Gerrit distribution * * @param processor invoke for each plugin via its process method - * @throws FileNotFoundException if the location of the plugins couldn't be - * determined - * @throws IOException in case of any other IO error caused by reading the - * plugin input stream + * @throws FileNotFoundException if the location of the plugins couldn't be determined + * @throws IOException in case of any other IO error caused by reading the plugin input stream */ void foreach(Processor processor) throws FileNotFoundException, IOException; /** * List plugins included in the Gerrit distribution + * * @return list of plugins names included in the Gerrit distribution - * @throws FileNotFoundException if the location of the plugins couldn't be - * determined + * @throws FileNotFoundException if the location of the plugins couldn't be determined */ List listPluginNames() throws FileNotFoundException; } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/SitePathInitializer.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/SitePathInitializer.java index 7487e2b68c..0bd5c06a2d 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/SitePathInitializer.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/SitePathInitializer.java @@ -34,7 +34,6 @@ import com.google.inject.Binding; import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.TypeLiteral; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -51,8 +50,11 @@ public class SitePathInitializer { private final SecureStoreInitData secureStoreInitData; @Inject - public SitePathInitializer(final Injector injector, final ConsoleUI ui, - final InitFlags flags, final SitePaths site, + public SitePathInitializer( + final Injector injector, + final ConsoleUI ui, + final InitFlags flags, + final SitePaths site, final Section.Factory sectionFactory, @Nullable final SecureStoreInitData secureStoreInitData) { this.ui = ui; @@ -85,8 +87,7 @@ public class SitePathInitializer { mkdir(site.data_dir); for (InitStep step : steps) { - if (step instanceof InitPlugins - && flags.skipPlugins) { + if (step instanceof InitPlugins && flags.skipPlugins) { continue; } step.run(); @@ -137,8 +138,7 @@ public class SitePathInitializer { public void postRun(Injector injector) throws Exception { for (InitStep step : steps) { - if (step instanceof InitPlugins - && flags.skipPlugins) { + if (step instanceof InitPlugins && flags.skipPlugins) { continue; } injector.injectMembers(step); @@ -148,8 +148,7 @@ public class SitePathInitializer { private void saveSecureStore() throws IOException { if (secureStoreInitData != null) { - Path dst = - site.lib_dir.resolve(secureStoreInitData.jarFile.getFileName()); + Path dst = site.lib_dir.resolve(secureStoreInitData.jarFile.getFileName()); Files.copy(secureStoreInitData.jarFile, dst); Section gerritSection = sectionFactory.get("gerrit", null); gerritSection.set("secureStoreClass", secureStoreInitData.className); diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_x.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_x.java index 87b24f948b..d5d7e786a4 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_x.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_x.java @@ -27,10 +27,6 @@ import com.google.gerrit.server.securestore.SecureStore; import com.google.gerrit.server.util.SocketUtil; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.storage.file.FileBasedConfig; - import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; @@ -42,24 +38,27 @@ import java.nio.file.Paths; import java.util.Arrays; import java.util.Map; import java.util.Properties; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.storage.file.FileBasedConfig; /** Upgrade from a 2.0.x site to a 2.1 site. */ @Singleton class UpgradeFrom2_0_x implements InitStep { - static final String[] etcFiles = {"gerrit.config", // - "secure.config", // - "replication.config", // - "ssh_host_rsa_key", // - "ssh_host_rsa_key.pub", // - "ssh_host_dsa_key", // - "ssh_host_dsa_key.pub", // - "ssh_host_key", // - "contact_information.pub", // - "gitweb_config.perl", // - "keystore", // - "GerritSite.css", // - "GerritSiteFooter.html", // - "GerritSiteHeader.html", // + static final String[] etcFiles = { + "gerrit.config", // + "secure.config", // + "replication.config", // + "ssh_host_rsa_key", // + "ssh_host_rsa_key.pub", // + "ssh_host_dsa_key", // + "ssh_host_dsa_key.pub", // + "ssh_host_key", // + "contact_information.pub", // + "gitweb_config.perl", // + "keystore", // + "GerritSite.css", // + "GerritSiteFooter.html", // + "GerritSiteHeader.html", // }; private final ConsoleUI ui; @@ -71,8 +70,11 @@ class UpgradeFrom2_0_x implements InitStep { private final Section.Factory sections; @Inject - UpgradeFrom2_0_x(final SitePaths site, final InitFlags flags, - final ConsoleUI ui, final Section.Factory sections) { + UpgradeFrom2_0_x( + final SitePaths site, + final InitFlags flags, + final ConsoleUI ui, + final Section.Factory sections) { this.ui = ui; this.sections = sections; diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/VersionedAuthorizedKeysOnInit.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/VersionedAuthorizedKeysOnInit.java index e47f23a3d2..e0b0c1c96d 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/VersionedAuthorizedKeysOnInit.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/VersionedAuthorizedKeysOnInit.java @@ -27,13 +27,11 @@ import com.google.gerrit.server.account.VersionedAuthorizedKeys; import com.google.gerrit.server.config.SitePaths; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.CommitBuilder; - import java.io.IOException; import java.util.List; import java.util.Optional; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.CommitBuilder; public class VersionedAuthorizedKeysOnInit extends VersionedMetaDataOnInit { public interface Factory { @@ -54,8 +52,7 @@ public class VersionedAuthorizedKeysOnInit extends VersionedMetaDataOnInit { } @Override - public VersionedAuthorizedKeysOnInit load() - throws IOException, ConfigInvalidException { + public VersionedAuthorizedKeysOnInit load() throws IOException, ConfigInvalidException { super.load(); return this; } @@ -69,8 +66,7 @@ public class VersionedAuthorizedKeysOnInit extends VersionedMetaDataOnInit { checkState(keys != null, "SSH keys not loaded yet"); int seq = keys.isEmpty() ? 1 : keys.size() + 1; AccountSshKey.Id keyId = new AccountSshKey.Id(accountId, seq); - AccountSshKey key = - new VersionedAuthorizedKeys.SimpleSshKeyCreator().create(keyId, pub); + AccountSshKey key = new VersionedAuthorizedKeys.SimpleSshKeyCreator().create(keyId, pub); keys.add(Optional.of(key)); return key; } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/AllProjectsConfig.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/AllProjectsConfig.java index 81ee0a261b..349cd056b0 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/AllProjectsConfig.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/AllProjectsConfig.java @@ -20,7 +20,7 @@ import com.google.gerrit.server.config.SitePaths; import com.google.gerrit.server.git.GroupList; import com.google.gerrit.server.git.ProjectConfig; import com.google.inject.Inject; - +import java.io.IOException; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.CommitBuilder; import org.eclipse.jgit.lib.Config; @@ -29,8 +29,6 @@ import org.eclipse.jgit.lib.RepositoryCache; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; - public class AllProjectsConfig extends VersionedMetaDataOnInit { private static final Logger log = LoggerFactory.getLogger(AllProjectsConfig.class); @@ -39,10 +37,8 @@ public class AllProjectsConfig extends VersionedMetaDataOnInit { private GroupList groupList; @Inject - AllProjectsConfig(AllProjectsNameOnInitProvider allProjects, SitePaths site, - InitFlags flags) { + AllProjectsConfig(AllProjectsNameOnInitProvider allProjects, SitePaths site, InitFlags flags) { super(flags, site, allProjects.get(), RefNames.REFS_CONFIG); - } public Config getConfig() { @@ -54,8 +50,7 @@ public class AllProjectsConfig extends VersionedMetaDataOnInit { } @Override - public AllProjectsConfig load() - throws IOException, ConfigInvalidException { + public AllProjectsConfig load() throws IOException, ConfigInvalidException { super.load(); return this; } @@ -73,15 +68,14 @@ public class AllProjectsConfig extends VersionedMetaDataOnInit { GroupList.createLoggerSink(GroupList.FILE_NAME, log)); } - public void save(String pluginName, String message) - throws IOException, ConfigInvalidException { - save(new PersonIdent(pluginName, pluginName + "@gerrit"), + public void save(String pluginName, String message) throws IOException, ConfigInvalidException { + save( + new PersonIdent(pluginName, pluginName + "@gerrit"), "Update from plugin " + pluginName + ": " + message); } @Override - protected void save(PersonIdent ident, String msg) - throws IOException, ConfigInvalidException { + protected void save(PersonIdent ident, String msg) throws IOException, ConfigInvalidException { super.save(ident, msg); // we need to invalidate the JGit cache if the group list is invalidated in @@ -90,8 +84,7 @@ public class AllProjectsConfig extends VersionedMetaDataOnInit { } @Override - protected boolean onSave(CommitBuilder commit) throws IOException, - ConfigInvalidException { + protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException { saveConfig(ProjectConfig.PROJECT_CONFIG, cfg); saveGroupList(); return true; diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/AllProjectsNameOnInitProvider.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/AllProjectsNameOnInitProvider.java index 9a6faeaf78..fae2f4e36e 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/AllProjectsNameOnInitProvider.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/AllProjectsNameOnInitProvider.java @@ -26,8 +26,7 @@ public class AllProjectsNameOnInitProvider implements Provider { @Inject AllProjectsNameOnInitProvider(Section.Factory sections) { String n = sections.get("gerrit", null).get("allProjects"); - name = MoreObjects.firstNonNull( - Strings.emptyToNull(n), AllProjectsNameProvider.DEFAULT); + name = MoreObjects.firstNonNull(Strings.emptyToNull(n), AllProjectsNameProvider.DEFAULT); } @Override diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/ConsoleUI.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/ConsoleUI.java index 78ea5a0d99..5104b15bb0 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/ConsoleUI.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/ConsoleUI.java @@ -15,7 +15,6 @@ package com.google.gerrit.pgm.init.api; import com.google.gerrit.common.Die; - import java.io.Console; import java.lang.reflect.InvocationTargetException; import java.util.Set; @@ -43,8 +42,10 @@ public abstract class ConsoleUI { protected static > T[] all(final T value) { try { return (T[]) value.getClass().getMethod("values").invoke(null); - } catch (IllegalArgumentException | NoSuchMethodException - | InvocationTargetException | IllegalAccessException + } catch (IllegalArgumentException + | NoSuchMethodException + | InvocationTargetException + | IllegalAccessException | SecurityException e) { throw new IllegalArgumentException("Cannot obtain enumeration values", e); } @@ -69,12 +70,12 @@ public abstract class ConsoleUI { public abstract String readString(String def, String fmt, Object... args); /** Prompt the user to make a choice from an allowed list of values. */ - public abstract String readString(String def, Set allowedValues, - String fmt, Object... args); + public abstract String readString( + String def, Set allowedValues, String fmt, Object... args); /** Prompt the user for an integer value, suggesting a default. */ public int readInt(int def, String fmt, Object... args) { - for (;;) { + for (; ; ) { String p = readString(String.valueOf(def), fmt, args); try { return Integer.parseInt(p.trim(), 10); @@ -94,8 +95,7 @@ public abstract class ConsoleUI { } /** Prompt the user to make a choice from an enumeration's values. */ - public abstract > T readEnum(T def, String fmt, - Object... args); + public abstract > T readEnum(T def, String fmt, Object... args); private static class Interactive extends ConsoleUI { private final Console console; @@ -112,7 +112,7 @@ public abstract class ConsoleUI { @Override public boolean yesno(Boolean def, String fmt, Object... args) { final String prompt = String.format(fmt, args); - for (;;) { + for (; ; ) { String y = "y"; String n = "n"; if (def != null) { @@ -167,9 +167,8 @@ public abstract class ConsoleUI { } @Override - public String readString(String def, Set allowedValues, String fmt, - Object... args) { - for (;;) { + public String readString(String def, Set allowedValues, String fmt, Object... args) { + for (; ; ) { String r = readString(def, fmt, args); if (allowedValues.contains(r.toLowerCase())) { return r.toLowerCase(); @@ -187,7 +186,7 @@ public abstract class ConsoleUI { @Override public String password(String fmt, Object... args) { final String prompt = String.format(fmt, args); - for (;;) { + for (; ; ) { final char[] a1 = console.readPassword("%-30s : ", prompt); if (a1 == null) { throw abort(); @@ -212,7 +211,7 @@ public abstract class ConsoleUI { public > T readEnum(T def, String fmt, Object... args) { final String prompt = String.format(fmt, args); final T[] options = all(def); - for (;;) { + for (; ; ) { String r = console.readLine("%-30s [%s/?]: ", prompt, def.toString()); if (r == null) { throw abort(); @@ -265,14 +264,12 @@ public abstract class ConsoleUI { } @Override - public String readString(String def, Set allowedValues, String fmt, - Object... args) { + public String readString(String def, Set allowedValues, String fmt, Object... args) { return def; } @Override - public void waitForUser() { - } + public void waitForUser() {} @Override public String password(String fmt, Object... args) { @@ -285,11 +282,9 @@ public abstract class ConsoleUI { } @Override - public void header(String fmt, Object... args) { - } + public void header(String fmt, Object... args) {} @Override - public void message(String fmt, Object... args) { - } + public void message(String fmt, Object... args) {} } } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InitFlags.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InitFlags.java index fa62d93b92..691243ff00 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InitFlags.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InitFlags.java @@ -19,14 +19,12 @@ import com.google.gerrit.server.config.SitePaths; import com.google.gerrit.server.securestore.SecureStore; import com.google.inject.Inject; import com.google.inject.Singleton; - +import java.io.IOException; +import java.util.List; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.storage.file.FileBasedConfig; import org.eclipse.jgit.util.FS; -import java.io.IOException; -import java.util.List; - /** Global variables used by the 'init' command. */ @Singleton public class InitFlags { @@ -52,11 +50,12 @@ public class InitFlags { @VisibleForTesting @Inject - public InitFlags(final SitePaths site, + public InitFlags( + final SitePaths site, final SecureStore secureStore, @InstallPlugins final List installPlugins, - @InstallAllPlugins final Boolean installAllPlugins) throws IOException, - ConfigInvalidException { + @InstallAllPlugins final Boolean installAllPlugins) + throws IOException, ConfigInvalidException { sec = secureStore; this.installPlugins = installPlugins; this.installAllPlugins = installAllPlugins; diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InitUtil.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InitUtil.java index 1e1ddd7b2c..b80cb22fa1 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InitUtil.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InitUtil.java @@ -18,11 +18,6 @@ import static com.google.gerrit.common.FileUtil.modified; import com.google.common.io.ByteStreams; import com.google.gerrit.common.Die; - -import org.eclipse.jgit.internal.storage.file.LockFile; -import org.eclipse.jgit.storage.file.FileBasedConfig; -import org.eclipse.jgit.util.SystemReader; - import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileNotFoundException; @@ -37,6 +32,9 @@ import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.nio.file.Path; import java.util.Arrays; +import org.eclipse.jgit.internal.storage.file.LockFile; +import org.eclipse.jgit.storage.file.FileBasedConfig; +import org.eclipse.jgit.util.SystemReader; /** Utility functions to help initialize a site. */ public class InitUtil { @@ -121,8 +119,7 @@ public class InitUtil { return name; } - public static void extract(Path dst, Class sibling, String name) - throws IOException { + public static void extract(Path dst, Class sibling, String name) throws IOException { try (InputStream in = open(sibling, name)) { if (in != null) { copy(dst, ByteStreams.toByteArray(in)); @@ -147,8 +144,7 @@ public class InitUtil { return in; } - public static void copy(Path dst, byte[] buf) - throws FileNotFoundException, IOException { + public static void copy(Path dst, byte[] buf) throws FileNotFoundException, IOException { // If the file already has the content we want to put there, // don't attempt to overwrite the file. // @@ -203,6 +199,5 @@ public class InitUtil { return port; } - private InitUtil() { - } + private InitUtil() {} } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InstallAllPlugins.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InstallAllPlugins.java index 809a19758f..7a41accd41 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InstallAllPlugins.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InstallAllPlugins.java @@ -15,11 +15,9 @@ package com.google.gerrit.pgm.init.api; import com.google.inject.BindingAnnotation; - import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @BindingAnnotation @Retention(RetentionPolicy.RUNTIME) -public @interface InstallAllPlugins { -} +public @interface InstallAllPlugins {} diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InstallPlugins.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InstallPlugins.java index 256892a799..a88250e973 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InstallPlugins.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InstallPlugins.java @@ -15,11 +15,9 @@ package com.google.gerrit.pgm.init.api; import com.google.inject.BindingAnnotation; - import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @BindingAnnotation @Retention(RetentionPolicy.RUNTIME) -public @interface InstallPlugins { -} +public @interface InstallPlugins {} diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/LibraryDownload.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/LibraryDownload.java index 7e46b21f1e..3e3b67a925 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/LibraryDownload.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/LibraryDownload.java @@ -15,11 +15,9 @@ package com.google.gerrit.pgm.init.api; import com.google.inject.BindingAnnotation; - import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @BindingAnnotation @Retention(RetentionPolicy.RUNTIME) -public @interface LibraryDownload { -} +public @interface LibraryDownload {} diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/Section.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/Section.java index 8cda882a5e..7ec46040f1 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/Section.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/Section.java @@ -19,7 +19,6 @@ import com.google.gerrit.server.config.SitePaths; import com.google.gerrit.server.securestore.SecureStore; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; @@ -28,8 +27,7 @@ import java.util.Set; /** Helper to edit a section of the configuration files. */ public class Section { public interface Factory { - Section get(@Assisted("section") String section, - @Assisted("subsection") String subsection); + Section get(@Assisted("section") String section, @Assisted("subsection") String subsection); } private final InitFlags flags; @@ -40,8 +38,11 @@ public class Section { private final SecureStore secureStore; @Inject - public Section(final InitFlags flags, final SitePaths site, - final SecureStore secureStore, final ConsoleUI ui, + public Section( + final InitFlags flags, + final SitePaths site, + final SecureStore secureStore, + final ConsoleUI ui, @Assisted("section") final String section, @Assisted("subsection") @Nullable final String subsection) { this.flags = flags; @@ -92,8 +93,8 @@ public class Section { return string(title, name, dv, false); } - public String string(final String title, final String name, final String dv, - final boolean nullIfDefault) { + public String string( + final String title, final String name, final String dv, final boolean nullIfDefault) { final String ov = get(name); String nv = ui.readString(ov != null ? ov : dv, "%s", title); if (nullIfDefault && nv.equals(dv)) { @@ -109,13 +110,12 @@ public class Section { return site.resolve(string(title, name, defValue)); } - public > T select(final String title, final String name, - final T defValue) { + public > T select(final String title, final String name, final T defValue) { return select(title, name, defValue, false); } - public > T select(final String title, final String name, - final T defValue, final boolean nullIfDefault) { + public > T select( + final String title, final String name, final T defValue, final boolean nullIfDefault) { final boolean set = get(name) != null; T oldValue = flags.cfg.getEnum(section, subsection, name, defValue); T newValue = ui.readEnum(oldValue, "%s", title); @@ -132,8 +132,8 @@ public class Section { return newValue; } - public String select(final String title, final String name, final String dv, - Set allowedValues) { + public String select( + final String title, final String name, final String dv, Set allowedValues) { final String ov = get(name); String nv = ui.readString(ov != null ? ov : dv, allowedValues, "%s", title); if (!eq(ov, nv)) { diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/VersionedMetaDataOnInit.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/VersionedMetaDataOnInit.java index 43fd9913fa..f0e2d4e02d 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/VersionedMetaDataOnInit.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/VersionedMetaDataOnInit.java @@ -16,7 +16,9 @@ package com.google.gerrit.pgm.init.api; import com.google.gerrit.server.config.SitePaths; import com.google.gerrit.server.git.VersionedMetaData; - +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.internal.storage.file.FileRepository; import org.eclipse.jgit.lib.CommitBuilder; @@ -31,10 +33,6 @@ import org.eclipse.jgit.revwalk.RevTree; import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.util.FS; -import java.io.File; -import java.io.IOException; -import java.nio.file.Path; - public abstract class VersionedMetaDataOnInit extends VersionedMetaData { protected final String project; @@ -42,8 +40,7 @@ public abstract class VersionedMetaDataOnInit extends VersionedMetaData { private final SitePaths site; private final String ref; - protected VersionedMetaDataOnInit(InitFlags flags, SitePaths site, - String project, String ref) { + protected VersionedMetaDataOnInit(InitFlags flags, SitePaths site, String project, String ref) { this.flags = flags; this.site = site; this.project = project; @@ -55,8 +52,7 @@ public abstract class VersionedMetaDataOnInit extends VersionedMetaData { return ref; } - public VersionedMetaDataOnInit load() - throws IOException, ConfigInvalidException { + public VersionedMetaDataOnInit load() throws IOException, ConfigInvalidException { File path = getPath(); if (path != null) { try (Repository repo = new FileRepository(path)) { @@ -70,8 +66,7 @@ public abstract class VersionedMetaDataOnInit extends VersionedMetaData { save(new PersonIdent("Gerrit Initialization", "init@gerrit"), message); } - protected void save(PersonIdent ident, String msg) - throws IOException, ConfigInvalidException { + protected void save(PersonIdent ident, String msg) throws IOException, ConfigInvalidException { File path = getPath(); if (path == null) { throw new IOException(project + " does not exist."); @@ -112,15 +107,15 @@ public abstract class VersionedMetaDataOnInit extends VersionedMetaData { } } - private void updateRef(Repository repo, PersonIdent ident, - ObjectId newRevision, String refLogMsg) throws IOException { + private void updateRef(Repository repo, PersonIdent ident, ObjectId newRevision, String refLogMsg) + throws IOException { RefUpdate ru = repo.updateRef(getRefName()); ru.setRefLogIdent(ident); ru.setNewObjectId(newRevision); ru.setExpectedOldObjectId(revision); ru.setRefLogMessage(refLogMsg, false); RefUpdate.Result r = ru.update(); - switch(r) { + switch (r) { case FAST_FORWARD: case NEW: case NO_CHANGE: @@ -133,8 +128,8 @@ public abstract class VersionedMetaDataOnInit extends VersionedMetaData { case REJECTED_CURRENT_BRANCH: case RENAMED: default: - throw new IOException("Failed to update " + getRefName() + " of " - + project + ": " + r.name()); + throw new IOException( + "Failed to update " + getRefName() + " of " + project + ": " + r.name()); } } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/index/IndexManagerOnInit.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/index/IndexManagerOnInit.java index 813a7acd89..5273dfbc85 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/index/IndexManagerOnInit.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/index/IndexManagerOnInit.java @@ -18,12 +18,11 @@ import com.google.gerrit.extensions.events.LifecycleListener; import com.google.gerrit.server.index.IndexDefinition; import com.google.inject.Inject; import com.google.inject.name.Named; - import java.util.Collection; /** - * This class starts/stops the indexes from the init program so that init can - * write updates the indexes. + * This class starts/stops the indexes from the init program so that init can write updates the + * indexes. */ public class IndexManagerOnInit { private final LifecycleListener indexManager; diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/index/IndexModuleOnInit.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/index/IndexModuleOnInit.java index 7b1d2ebda1..0358f13ea9 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/index/IndexModuleOnInit.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/index/IndexModuleOnInit.java @@ -39,7 +39,6 @@ import com.google.inject.ProvisionException; import com.google.inject.TypeLiteral; import com.google.inject.name.Names; import com.google.inject.util.Providers; - import java.util.Collection; import java.util.Map; import java.util.Set; @@ -48,9 +47,8 @@ public class IndexModuleOnInit extends AbstractModule { static final String INDEX_MANAGER = "IndexModuleOnInit/IndexManager"; private static final ImmutableCollection> ALL_SCHEMA_DEFS = - ImmutableList.> of( - AccountSchemaDefinitions.INSTANCE, - GroupSchemaDefinitions.INSTANCE); + ImmutableList.>of( + AccountSchemaDefinitions.INSTANCE, GroupSchemaDefinitions.INSTANCE); @Override protected void configure() { @@ -81,30 +79,23 @@ public class IndexModuleOnInit extends AbstractModule { bind(new TypeLiteral>() {}) .annotatedWith(Names.named(SingleVersionModule.SINGLE_VERSIONS)) - .toInstance(ImmutableMap. of()); - bind(LifecycleListener.class).annotatedWith(Names.named(INDEX_MANAGER)) + .toInstance(ImmutableMap.of()); + bind(LifecycleListener.class) + .annotatedWith(Names.named(INDEX_MANAGER)) .to(SingleVersionListener.class); } @Provides Collection> getIndexDefinitions( - AccountIndexDefinition accounts, - GroupIndexDefinition groups) { + AccountIndexDefinition accounts, GroupIndexDefinition groups) { Collection> result = - ImmutableList.> of( - accounts, - groups); + ImmutableList.>of(accounts, groups); Set expected = - FluentIterable.from(ALL_SCHEMA_DEFS) - .transform(SchemaDefinitions::getName) - .toSet(); - Set actual = FluentIterable.from(result) - .transform(IndexDefinition::getName) - .toSet(); + FluentIterable.from(ALL_SCHEMA_DEFS).transform(SchemaDefinitions::getName).toSet(); + Set actual = FluentIterable.from(result).transform(IndexDefinition::getName).toSet(); if (!expected.equals(actual)) { throw new ProvisionException( - "need index definitions for all schemas: " - + expected + " != " + actual); + "need index definitions for all schemas: " + expected + " != " + actual); } return result; } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/index/elasticsearch/ElasticIndexModuleOnInit.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/index/elasticsearch/ElasticIndexModuleOnInit.java index 7f74c2b88e..f086ab1920 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/index/elasticsearch/ElasticIndexModuleOnInit.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/index/elasticsearch/ElasticIndexModuleOnInit.java @@ -28,13 +28,13 @@ public class ElasticIndexModuleOnInit extends AbstractModule { protected void configure() { install( new FactoryModuleBuilder() - .implement(AccountIndex.class, ElasticAccountIndex.class) - .build(AccountIndex.Factory.class)); + .implement(AccountIndex.class, ElasticAccountIndex.class) + .build(AccountIndex.Factory.class)); install( new FactoryModuleBuilder() - .implement(GroupIndex.class, ElasticGroupIndex.class) - .build(GroupIndex.Factory.class)); + .implement(GroupIndex.class, ElasticGroupIndex.class) + .build(GroupIndex.Factory.class)); install(new IndexModuleOnInit()); } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/rules/PrologCompiler.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/rules/PrologCompiler.java index 8d3c7668c0..0ea0f1a1d8 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/rules/PrologCompiler.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/rules/PrologCompiler.java @@ -21,15 +21,8 @@ import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.config.SitePaths; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - import com.googlecode.prolog_cafe.compiler.Compiler; import com.googlecode.prolog_cafe.exceptions.CompileException; - -import org.eclipse.jgit.errors.MissingObjectException; -import org.eclipse.jgit.lib.Config; -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.Repository; - import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -48,18 +41,20 @@ import java.util.jar.Attributes; import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; import java.util.jar.Manifest; - import javax.tools.Diagnostic; import javax.tools.DiagnosticCollector; import javax.tools.JavaCompiler; import javax.tools.JavaFileObject; import javax.tools.StandardJavaFileManager; import javax.tools.ToolProvider; +import org.eclipse.jgit.errors.MissingObjectException; +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Repository; /** - * Helper class for Rulec: does the actual prolog -> java src -> class -> jar work - * Finds rules.pl in refs/meta/config branch - * Creates rules-(sha1 of rules.pl).jar in (site-path)/cache/rules + * Helper class for Rulec: does the actual prolog -> java src -> class -> jar work Finds rules.pl in + * refs/meta/config branch Creates rules-(sha1 of rules.pl).jar in (site-path)/cache/rules */ public class PrologCompiler implements Callable { public interface Factory { @@ -67,15 +62,16 @@ public class PrologCompiler implements Callable { } public enum Status { - NO_RULES, COMPILED + NO_RULES, + COMPILED } private final Path ruleDir; private final Repository git; @Inject - PrologCompiler(@GerritServerConfig Config config, SitePaths site, - @Assisted Repository gitRepository) { + PrologCompiler( + @GerritServerConfig Config config, SitePaths site, @Assisted Repository gitRepository) { Path cacheDir = site.resolve(config.getString("cache", null, "directory")); ruleDir = cacheDir != null ? cacheDir.resolve("rules") : null; git = gitRepository; @@ -123,8 +119,7 @@ public class PrologCompiler implements Callable { } /** Creates a copy of rules.pl and compiles it into Java sources. */ - private void compileProlog(ObjectId prolog, File tempDir) - throws IOException, CompileException { + private void compileProlog(ObjectId prolog, File tempDir) throws IOException, CompileException { File tempRules = copyToTempFile(prolog, tempDir); try { Compiler comp = new Compiler(); @@ -152,12 +147,11 @@ public class PrologCompiler implements Callable { throw new CompileException("JDK required (running inside of JRE)"); } - DiagnosticCollector diagnostics = - new DiagnosticCollector<>(); + DiagnosticCollector diagnostics = new DiagnosticCollector<>(); try (StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null)) { - Iterable compilationUnits = fileManager - .getJavaFileObjectsFromFiles(getAllFiles(tempDir, ".java")); + Iterable compilationUnits = + fileManager.getJavaFileObjectsFromFiles(getAllFiles(tempDir, ".java")); ArrayList options = new ArrayList<>(); String classpath = getMyClasspath(); if (classpath != null) { @@ -166,13 +160,8 @@ public class PrologCompiler implements Callable { } options.add("-d"); options.add(tempDir.getPath()); - JavaCompiler.CompilationTask task = compiler.getTask( - null, - fileManager, - diagnostics, - options, - null, - compilationUnits); + JavaCompiler.CompilationTask task = + compiler.getTask(null, fileManager, diagnostics, options, null, compilationUnits); if (!task.call()) { Locale myLocale = Locale.getDefault(); StringBuilder msg = new StringBuilder(); @@ -217,8 +206,9 @@ public class PrologCompiler implements Callable { } /** Takes compiled prolog .class files, puts them into the jar file. */ - private void createJar(Path archiveFile, List toBeJared, - File tempDir, ObjectId metaConfig, ObjectId rulesId) throws IOException { + private void createJar( + Path archiveFile, List toBeJared, File tempDir, ObjectId metaConfig, ObjectId rulesId) + throws IOException { long now = TimeUtil.nowMs(); Manifest mf = new Manifest(); mf.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0"); @@ -229,8 +219,7 @@ public class PrologCompiler implements Callable { mf.getMainAttributes().putValue("Source-Commit", metaConfig.name()); mf.getMainAttributes().putValue("Source-Blob", rulesId.name()); - Path tmpjar = - Files.createTempFile(archiveFile.getParent(), ".rulec_", ".jar"); + Path tmpjar = Files.createTempFile(archiveFile.getParent(), ".rulec_", ".jar"); try (OutputStream stream = Files.newOutputStream(tmpjar); JarOutputStream out = new JarOutputStream(stream, mf)) { byte[] buffer = new byte[10240]; @@ -262,15 +251,13 @@ public class PrologCompiler implements Callable { } } - private List getAllFiles(File dir, String extension) - throws IOException { + private List getAllFiles(File dir, String extension) throws IOException { ArrayList fileList = new ArrayList<>(); getAllFiles(dir, extension, fileList); return fileList; } - private void getAllFiles(File dir, String extension, List fileList) - throws IOException { + private void getAllFiles(File dir, String extension, List fileList) throws IOException { for (File f : listFiles(dir)) { if (f.getName().endsWith(extension)) { fileList.add(f); @@ -281,15 +268,14 @@ public class PrologCompiler implements Callable { } } - private List getRelativePaths(File dir, String extension) - throws IOException { + private List getRelativePaths(File dir, String extension) throws IOException { ArrayList pathList = new ArrayList<>(); getRelativePaths(dir, extension, "", pathList); return pathList; } - private static void getRelativePaths(File dir, String extension, String path, - List pathList) throws IOException { + private static void getRelativePaths( + File dir, String extension, String path, List pathList) throws IOException { for (File f : listFiles(dir)) { if (f.getName().endsWith(extension)) { pathList.add(path + f.getName()); diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/AbstractProgram.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/AbstractProgram.java index 31fa7dd3ce..825bd70917 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/AbstractProgram.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/AbstractProgram.java @@ -14,16 +14,13 @@ package com.google.gerrit.pgm.util; - import com.google.gerrit.common.Die; import com.google.gerrit.util.cli.CmdLineParser; import com.google.gerrit.util.cli.OptionHandlers; - +import java.io.StringWriter; import org.kohsuke.args4j.CmdLineException; import org.kohsuke.args4j.Option; -import java.io.StringWriter; - /** Base class for command line invocations of Gerrit Code Review. */ public abstract class AbstractProgram { private final Object sleepLock = new Object(); @@ -69,8 +66,7 @@ public abstract class AbstractProgram { final Throwable cause = err.getCause(); final String diemsg = err.getMessage(); if (cause != null && !cause.getMessage().equals(diemsg)) { - System.err.println("fatal: " - + cause.getMessage().replaceAll("\n", "\nfatal: ")); + System.err.println("fatal: " + cause.getMessage().replaceAll("\n", "\nfatal: ")); } System.err.println("fatal: " + diemsg.replaceAll("\n", "\nfatal: ")); } @@ -104,9 +100,9 @@ public abstract class AbstractProgram { /** * Run this program's logic, returning the command exit status. - *

- * When this method completes, the JVM is terminated. To keep the JVM running, - * use {@code return never()}. + * + *

When this method completes, the JVM is terminated. To keep the JVM running, use {@code + * return never()}. */ public abstract int run() throws Exception; } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/BatchProgramModule.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/BatchProgramModule.java index 689b606b35..502a94834b 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/BatchProgramModule.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/BatchProgramModule.java @@ -73,27 +73,23 @@ import com.google.inject.Inject; import com.google.inject.Module; import com.google.inject.TypeLiteral; import com.google.inject.util.Providers; - -import org.eclipse.jgit.lib.Config; - import java.util.Collections; import java.util.List; import java.util.Set; +import org.eclipse.jgit.lib.Config; /** * Module for programs that perform batch operations on a site. - *

- * Any program that requires this module likely also requires using - * {@link ThreadLimiter} to limit the number of threads accessing the database - * concurrently. + * + *

Any program that requires this module likely also requires using {@link ThreadLimiter} to + * limit the number of threads accessing the database concurrently. */ public class BatchProgramModule extends FactoryModule { private final Config cfg; private final Module reviewDbModule; @Inject - BatchProgramModule(@GerritServerConfig Config cfg, - PerThreadReviewDbModule reviewDbModule) { + BatchProgramModule(@GerritServerConfig Config cfg, PerThreadReviewDbModule reviewDbModule) { this.cfg = cfg; this.reviewDbModule = reviewDbModule; } @@ -109,20 +105,23 @@ public class BatchProgramModule extends FactoryModule { // Plugins are not loaded and we're just running through each change // once, so don't worry about cache removal. bind(new TypeLiteral>() {}) - .toInstance(DynamicSet. emptySet()); + .toInstance(DynamicSet.emptySet()); bind(new TypeLiteral>>() {}) - .toInstance(DynamicMap.> emptyMap()); + .toInstance(DynamicMap.>emptyMap()); bind(new TypeLiteral>() {}) - .toProvider(CommentLinkProvider.class).in(SINGLETON); - bind(String.class).annotatedWith(CanonicalWebUrl.class) + .toProvider(CommentLinkProvider.class) + .in(SINGLETON); + bind(String.class) + .annotatedWith(CanonicalWebUrl.class) .toProvider(CanonicalWebUrlProvider.class); - bind(Boolean.class).annotatedWith(DisableReverseDnsLookup.class) - .toProvider(DisableReverseDnsLookupProvider.class).in(SINGLETON); + bind(Boolean.class) + .annotatedWith(DisableReverseDnsLookup.class) + .toProvider(DisableReverseDnsLookupProvider.class) + .in(SINGLETON); bind(Realm.class).to(FakeRealm.class); - bind(IdentifiedUser.class) - .toProvider(Providers. of(null)); - bind(ReplacePatchSetSender.Factory.class).toProvider( - Providers.of(null)); + bind(IdentifiedUser.class).toProvider(Providers.of(null)); + bind(ReplacePatchSetSender.Factory.class) + .toProvider(Providers.of(null)); bind(CurrentUser.class).to(IdentifiedUser.class); factory(BatchUpdate.Factory.class); factory(MergeUtil.Factory.class); @@ -131,18 +130,17 @@ public class BatchProgramModule extends FactoryModule { // As Reindex is a batch program, don't assume the index is available for // the change cache. - bind(SearchingChangeCacheImpl.class).toProvider( - Providers.of(null)); + bind(SearchingChangeCacheImpl.class).toProvider(Providers.of(null)); bind(new TypeLiteral>() {}) - .annotatedWith(AdministrateServerGroups.class) - .toInstance(ImmutableSet. of()); + .annotatedWith(AdministrateServerGroups.class) + .toInstance(ImmutableSet.of()); bind(new TypeLiteral>() {}) - .annotatedWith(GitUploadPackGroups.class) - .toInstance(Collections. emptySet()); + .annotatedWith(GitUploadPackGroups.class) + .toInstance(Collections.emptySet()); bind(new TypeLiteral>() {}) - .annotatedWith(GitReceivePackGroups.class) - .toInstance(Collections. emptySet()); + .annotatedWith(GitReceivePackGroups.class) + .toInstance(Collections.emptySet()); bind(ChangeControl.Factory.class); factory(ProjectControl.AssistedFactory.class); @@ -165,10 +163,7 @@ public class BatchProgramModule extends FactoryModule { factory(ChangeData.Factory.class); factory(ProjectState.Factory.class); - bind(ChangeJson.Factory.class).toProvider( - Providers.of(null)); - bind(AccountVisibility.class) - .toProvider(AccountVisibilityProvider.class) - .in(SINGLETON); + bind(ChangeJson.Factory.class).toProvider(Providers.of(null)); + bind(AccountVisibility.class).toProvider(AccountVisibilityProvider.class).in(SINGLETON); } } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ErrorLogFile.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ErrorLogFile.java index 95caf25389..e5076c945e 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ErrorLogFile.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ErrorLogFile.java @@ -18,9 +18,9 @@ import com.google.gerrit.common.FileUtil; import com.google.gerrit.extensions.events.LifecycleListener; import com.google.gerrit.server.config.SitePaths; import com.google.gerrit.server.util.SystemLog; - +import java.io.IOException; +import java.nio.file.Path; import net.logstash.log4j.JSONEventLayoutV1; - import org.apache.log4j.ConsoleAppender; import org.apache.log4j.Level; import org.apache.log4j.LogManager; @@ -28,9 +28,6 @@ import org.apache.log4j.Logger; import org.apache.log4j.PatternLayout; import org.eclipse.jgit.lib.Config; -import java.io.IOException; -import java.nio.file.Path; - public class ErrorLogFile { static final String LOG_NAME = "error_log"; static final String JSON_SUFFIX = ".json"; @@ -54,16 +51,15 @@ public class ErrorLogFile { public static LifecycleListener start(final Path sitePath, final Config config) throws IOException { - Path logdir = FileUtil.mkdirsOrDie(new SitePaths(sitePath).logs_dir, - "Cannot create log directory"); + Path logdir = + FileUtil.mkdirsOrDie(new SitePaths(sitePath).logs_dir, "Cannot create log directory"); if (SystemLog.shouldConfigure()) { initLogSystem(logdir, config); } return new LifecycleListener() { @Override - public void start() { - } + public void start() {} @Override public void stop() { @@ -80,13 +76,14 @@ public class ErrorLogFile { boolean text = config.getBoolean("log", "textLogging", true) || !json; if (text) { - root.addAppender(SystemLog.createAppender(logdir, LOG_NAME, - new PatternLayout("[%d] [%t] %-5p %c %x: %m%n"))); + root.addAppender( + SystemLog.createAppender( + logdir, LOG_NAME, new PatternLayout("[%d] [%t] %-5p %c %x: %m%n"))); } if (json) { - root.addAppender(SystemLog.createAppender(logdir, LOG_NAME + JSON_SUFFIX, - new JSONEventLayoutV1())); + root.addAppender( + SystemLog.createAppender(logdir, LOG_NAME + JSON_SUFFIX, new JSONEventLayoutV1())); } } } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/GuiceLogger.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/GuiceLogger.java index 6776ca9e7c..a25fc14535 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/GuiceLogger.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/GuiceLogger.java @@ -23,19 +23,22 @@ import java.util.logging.StreamHandler; public class GuiceLogger { private static final Handler HANDLER; + static { - HANDLER = new StreamHandler(System.out, new Formatter() { - @Override - public String format(LogRecord record) { - return String.format("[Guice %s] %s%n", record.getLevel().getName(), - record.getMessage()); - } - }); + HANDLER = + new StreamHandler( + System.out, + new Formatter() { + @Override + public String format(LogRecord record) { + return String.format( + "[Guice %s] %s%n", record.getLevel().getName(), record.getMessage()); + } + }); HANDLER.setLevel(Level.ALL); } - private GuiceLogger() { - } + private GuiceLogger() {} public static Logger getLogger() { return Logger.getLogger("com.google.inject"); diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/LogFileCompressor.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/LogFileCompressor.java index 2670407ae5..f7f49972d7 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/LogFileCompressor.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/LogFileCompressor.java @@ -23,10 +23,6 @@ import com.google.gerrit.lifecycle.LifecycleModule; import com.google.gerrit.server.config.SitePaths; import com.google.gerrit.server.git.WorkQueue; import com.google.inject.Inject; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -36,11 +32,12 @@ import java.nio.file.Path; import java.time.LocalDate; import java.time.ZoneId; import java.util.zip.GZIPOutputStream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** Compresses the old error logs. */ public class LogFileCompressor implements Runnable { - private static final Logger log = - LoggerFactory.getLogger(LogFileCompressor.class); + private static final Logger log = LoggerFactory.getLogger(LogFileCompressor.class); public static class Module extends LifecycleModule { @Override @@ -54,8 +51,7 @@ public class LogFileCompressor implements Runnable { private final LogFileCompressor compressor; @Inject - Lifecycle(WorkQueue queue, - LogFileCompressor compressor) { + Lifecycle(WorkQueue queue, LogFileCompressor compressor) { this.queue = queue; this.compressor = compressor; } @@ -66,15 +62,14 @@ public class LogFileCompressor implements Runnable { queue.getDefaultQueue().execute(compressor); ZoneId zone = ZoneId.systemDefault(); LocalDate now = LocalDate.now(zone); - long milliSecondsUntil11pm = now.atStartOfDay(zone) - .plusHours(23).toInstant().toEpochMilli(); - queue.getDefaultQueue().scheduleAtFixedRate(compressor, - milliSecondsUntil11pm, HOURS.toMillis(24), MILLISECONDS); + long milliSecondsUntil11pm = now.atStartOfDay(zone).plusHours(23).toInstant().toEpochMilli(); + queue + .getDefaultQueue() + .scheduleAtFixedRate(compressor, milliSecondsUntil11pm, HOURS.toMillis(24), MILLISECONDS); } @Override - public void stop() { - } + public void stop() {} } private final Path logs_dir; diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/PerThreadReviewDbModule.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/PerThreadReviewDbModule.java index 9ef31ff198..bdd939f959 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/PerThreadReviewDbModule.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/PerThreadReviewDbModule.java @@ -22,15 +22,14 @@ import com.google.gwtorm.server.SchemaFactory; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.ProvisionException; - import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * Module to bind a single {@link ReviewDb} instance per thread. - *

- * New instances are opened on demand, but are closed only at shutdown. + * + *

New instances are opened on demand, but are closed only at shutdown. */ class PerThreadReviewDbModule extends LifecycleModule { private final SchemaFactory schema; @@ -42,38 +41,41 @@ class PerThreadReviewDbModule extends LifecycleModule { @Override protected void configure() { - final List dbs = Collections.synchronizedList( - new ArrayList()); + final List dbs = Collections.synchronizedList(new ArrayList()); final ThreadLocal localDb = new ThreadLocal<>(); - bind(ReviewDb.class).toProvider(new Provider() { - @Override - public ReviewDb get() { - ReviewDb db = localDb.get(); - if (db == null) { - try { - db = schema.open(); - dbs.add(db); - localDb.set(db); - } catch (OrmException e) { - throw new ProvisionException("unable to open ReviewDb", e); - } - } - return db; - } - }); - listener().toInstance(new LifecycleListener() { - @Override - public void start() { - // Do nothing. - } + bind(ReviewDb.class) + .toProvider( + new Provider() { + @Override + public ReviewDb get() { + ReviewDb db = localDb.get(); + if (db == null) { + try { + db = schema.open(); + dbs.add(db); + localDb.set(db); + } catch (OrmException e) { + throw new ProvisionException("unable to open ReviewDb", e); + } + } + return db; + } + }); + listener() + .toInstance( + new LifecycleListener() { + @Override + public void start() { + // Do nothing. + } - @Override - public void stop() { - for (ReviewDb db : dbs) { - db.close(); - } - } - }); + @Override + public void stop() { + for (ReviewDb db : dbs) { + db.close(); + } + } + }); } } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ProxyUtil.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ProxyUtil.java index 7a12d38950..3eb81871d4 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ProxyUtil.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ProxyUtil.java @@ -38,24 +38,20 @@ package com.google.gerrit.pgm.util; import com.google.common.base.Strings; - -import org.eclipse.jgit.util.CachedAuthenticator; - import java.net.MalformedURLException; import java.net.URL; +import org.eclipse.jgit.util.CachedAuthenticator; final class ProxyUtil { /** * Configure the JRE's standard HTTP based on {@code http_proxy}. - *

- * The popular libcurl library honors the {@code http_proxy} environment - * variable as a means of specifying an HTTP proxy for requests made behind a - * firewall. This is not natively recognized by the JRE, so this method can be - * used by command line utilities to configure the JRE before the first - * request is sent. * - * @throws MalformedURLException the value in {@code http_proxy} is - * unsupportable. + *

The popular libcurl library honors the {@code http_proxy} environment variable as a means of + * specifying an HTTP proxy for requests made behind a firewall. This is not natively recognized + * by the JRE, so this method can be used by command line utilities to configure the JRE before + * the first request is sent. + * + * @throws MalformedURLException the value in {@code http_proxy} is unsupportable. */ static void configureHttpProxy() throws MalformedURLException { final String s = System.getenv("http_proxy"); @@ -65,8 +61,7 @@ final class ProxyUtil { final URL u = new URL((!s.contains("://")) ? "http://" + s : s); if (!"http".equals(u.getProtocol())) { - throw new MalformedURLException("Invalid http_proxy: " + s - + ": Only http supported."); + throw new MalformedURLException("Invalid http_proxy: " + s + ": Only http supported."); } final String proxyHost = u.getHost(); @@ -82,11 +77,10 @@ final class ProxyUtil { final int c = userpass.indexOf(':'); final String user = userpass.substring(0, c); final String pass = userpass.substring(c + 1); - CachedAuthenticator.add(new CachedAuthenticator.CachedAuthentication( - proxyHost, proxyPort, user, pass)); + CachedAuthenticator.add( + new CachedAuthenticator.CachedAuthentication(proxyHost, proxyPort, user, pass)); } } - ProxyUtil() { - } + ProxyUtil() {} } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/RuntimeShutdown.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/RuntimeShutdown.java index 86fef2147d..7eed2eff6d 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/RuntimeShutdown.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/RuntimeShutdown.java @@ -14,11 +14,10 @@ package com.google.gerrit.pgm.util; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.ArrayList; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class RuntimeShutdown { private static final ShutdownCallback cb = new ShutdownCallback(); @@ -43,12 +42,10 @@ public class RuntimeShutdown { cb.manualShutdown(); } - private RuntimeShutdown() { - } + private RuntimeShutdown() {} private static class ShutdownCallback extends Thread { - private static final Logger log = - LoggerFactory.getLogger(ShutdownCallback.class); + private static final Logger log = LoggerFactory.getLogger(ShutdownCallback.class); private final List tasks = new ArrayList<>(); private boolean shutdownStarted; @@ -66,7 +63,6 @@ public class RuntimeShutdown { } tasks.add(newTask); return true; - } // We don't permit adding a task once shutdown has started. // diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteLibraryBasedDataSourceProvider.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteLibraryBasedDataSourceProvider.java index 6443e21c2f..1c7dc52576 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteLibraryBasedDataSourceProvider.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteLibraryBasedDataSourceProvider.java @@ -23,12 +23,9 @@ import com.google.gerrit.server.schema.DataSourceProvider; import com.google.gerrit.server.schema.DataSourceType; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.Config; - import java.nio.file.Path; - import javax.sql.DataSource; +import org.eclipse.jgit.lib.Config; /** Loads the site library if not yet loaded. */ @Singleton @@ -37,7 +34,8 @@ public class SiteLibraryBasedDataSourceProvider extends DataSourceProvider { private boolean init; @Inject - SiteLibraryBasedDataSourceProvider(SitePaths site, + SiteLibraryBasedDataSourceProvider( + SitePaths site, @GerritServerConfig Config cfg, MetricMaker metrics, ThreadSettingsConfig tsc, diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteProgram.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteProgram.java index f0cc5c5f56..cc9ddf63b4 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteProgram.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteProgram.java @@ -51,10 +51,6 @@ import com.google.inject.name.Named; import com.google.inject.name.Names; import com.google.inject.spi.Message; import com.google.inject.util.Providers; - -import org.eclipse.jgit.lib.Config; -import org.kohsuke.args4j.Option; - import java.lang.annotation.Annotation; import java.nio.file.Files; import java.nio.file.Path; @@ -63,11 +59,16 @@ import java.sql.Connection; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; - import javax.sql.DataSource; +import org.eclipse.jgit.lib.Config; +import org.kohsuke.args4j.Option; public abstract class SiteProgram extends AbstractProgram { - @Option(name = "--site-path", aliases = {"-d"}, usage = "Local directory containing site data") + @Option( + name = "--site-path", + aliases = {"-d"}, + usage = "Local directory containing site data" + ) private void setSitePath(String path) { sitePath = Paths.get(path); } @@ -76,8 +77,7 @@ public abstract class SiteProgram extends AbstractProgram { private Path sitePath = Paths.get("."); - protected SiteProgram() { - } + protected SiteProgram() {} protected SiteProgram(Path sitePath) { this.sitePath = sitePath; @@ -96,8 +96,8 @@ public abstract class SiteProgram extends AbstractProgram { /** Ensures we are running inside of a valid site, otherwise throws a Die. */ protected void mustHaveValidSite() throws Die { if (!Files.exists(sitePath.resolve("etc").resolve("gerrit.config"))) { - throw die("not a Gerrit site: '" + getSitePath() + "'\n" - + "Perhaps you need to run init first?"); + throw die( + "not a Gerrit site: '" + getSitePath() + "'\n" + "Perhaps you need to run init first?"); } } @@ -107,51 +107,55 @@ public abstract class SiteProgram extends AbstractProgram { } /** @return provides database connectivity and site path. */ - protected Injector createDbInjector(final boolean enableMetrics, - final DataSourceProvider.Context context) { + protected Injector createDbInjector( + final boolean enableMetrics, final DataSourceProvider.Context context) { final Path sitePath = getSitePath(); final List modules = new ArrayList<>(); - Module sitePathModule = new AbstractModule() { - @Override - protected void configure() { - bind(Path.class).annotatedWith(SitePath.class).toInstance(sitePath); - bind(String.class).annotatedWith(SecureStoreClassName.class) - .toProvider(Providers.of(getConfiguredSecureStoreClass())); - } - }; + Module sitePathModule = + new AbstractModule() { + @Override + protected void configure() { + bind(Path.class).annotatedWith(SitePath.class).toInstance(sitePath); + bind(String.class) + .annotatedWith(SecureStoreClassName.class) + .toProvider(Providers.of(getConfiguredSecureStoreClass())); + } + }; modules.add(sitePathModule); if (enableMetrics) { modules.add(new DropWizardMetricMaker.ApiModule()); } else { - modules.add(new AbstractModule() { - @Override - protected void configure() { - bind(MetricMaker.class).to(DisabledMetricMaker.class); - } - }); + modules.add( + new AbstractModule() { + @Override + protected void configure() { + bind(MetricMaker.class).to(DisabledMetricMaker.class); + } + }); } - modules.add(new LifecycleModule() { - @Override - protected void configure() { - bind(DataSourceProvider.Context.class).toInstance(context); - if (dsProvider != null) { - bind(Key.get(DataSource.class, Names.named("ReviewDb"))) - .toProvider(dsProvider) - .in(SINGLETON); - if (LifecycleListener.class.isAssignableFrom(dsProvider.getClass())) { - listener().toInstance((LifecycleListener) dsProvider); + modules.add( + new LifecycleModule() { + @Override + protected void configure() { + bind(DataSourceProvider.Context.class).toInstance(context); + if (dsProvider != null) { + bind(Key.get(DataSource.class, Names.named("ReviewDb"))) + .toProvider(dsProvider) + .in(SINGLETON); + if (LifecycleListener.class.isAssignableFrom(dsProvider.getClass())) { + listener().toInstance((LifecycleListener) dsProvider); + } + } else { + bind(Key.get(DataSource.class, Names.named("ReviewDb"))) + .toProvider(SiteLibraryBasedDataSourceProvider.class) + .in(SINGLETON); + listener().to(SiteLibraryBasedDataSourceProvider.class); + } } - } else { - bind(Key.get(DataSource.class, Names.named("ReviewDb"))) - .toProvider(SiteLibraryBasedDataSourceProvider.class) - .in(SINGLETON); - listener().to(SiteLibraryBasedDataSourceProvider.class); - } - } - }); + }); Module configModule = new GerritServerConfigModule(); modules.add(configModule); Injector cfgInjector = Guice.createInjector(sitePathModule, configModule); @@ -167,16 +171,17 @@ public abstract class SiteProgram extends AbstractProgram { throw new ProvisionException("database.type must be defined"); } - final DataSourceType dst = Guice.createInjector(new DataSourceModule(), configModule, - sitePathModule).getInstance( - Key.get(DataSourceType.class, Names.named(dbType.toLowerCase()))); + final DataSourceType dst = + Guice.createInjector(new DataSourceModule(), configModule, sitePathModule) + .getInstance(Key.get(DataSourceType.class, Names.named(dbType.toLowerCase()))); - modules.add(new AbstractModule() { - @Override - protected void configure() { - bind(DataSourceType.class).toInstance(dst); - } - }); + modules.add( + new AbstractModule() { + @Override + protected void configure() { + bind(DataSourceType.class).toInstance(dst); + } + }); modules.add(new DatabaseModule()); modules.add(new SchemaModule()); modules.add(cfgInjector.getInstance(GitRepositoryManagerModule.class)); @@ -192,7 +197,8 @@ public abstract class SiteProgram extends AbstractProgram { if (why instanceof SQLException) { throw die("Cannot connect to SQL database", why); } - if (why instanceof OrmException && why.getCause() != null + if (why instanceof OrmException + && why.getCause() != null && "Unable to determine driver URL".equals(why.getMessage())) { why = why.getCause(); if (isCannotCreatePoolException(why)) { @@ -230,12 +236,13 @@ public abstract class SiteProgram extends AbstractProgram { } List modules = new ArrayList<>(); - modules.add(new AbstractModule() { - @Override - protected void configure() { - bind(Path.class).annotatedWith(SitePath.class).toInstance(getSitePath()); - } - }); + modules.add( + new AbstractModule() { + @Override + protected void configure() { + bind(Path.class).annotatedWith(SitePath.class).toInstance(getSitePath()); + } + }); modules.add(new GerritServerConfigModule()); modules.add(new DataSourceModule()); Injector i = Guice.createInjector(modules); @@ -249,16 +256,15 @@ public abstract class SiteProgram extends AbstractProgram { } } } - throw new IllegalStateException(String.format( - "Cannot guess database type from the database product name '%s'", - dbProductName)); + throw new IllegalStateException( + String.format( + "Cannot guess database type from the database product name '%s'", dbProductName)); } @SuppressWarnings("deprecation") private static boolean isCannotCreatePoolException(Throwable why) { return why instanceof org.apache.commons.dbcp.SQLNestedException && why.getCause() != null - && why.getMessage().startsWith( - "Cannot create PoolableConnectionFactory"); + && why.getMessage().startsWith("Cannot create PoolableConnectionFactory"); } } diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ThreadLimiter.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ThreadLimiter.java index 7b0e4dab69..d609c34cb6 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ThreadLimiter.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ThreadLimiter.java @@ -19,7 +19,6 @@ import com.google.gerrit.server.config.ThreadSettingsConfig; import com.google.gerrit.server.schema.DataSourceType; import com.google.inject.Injector; import com.google.inject.Key; - import org.eclipse.jgit.lib.Config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -27,8 +26,7 @@ import org.slf4j.LoggerFactory; // TODO(dborowitz): Not necessary once we switch to NoteDb. /** Utility to limit threads used by a batch program. */ public class ThreadLimiter { - private static final Logger log = - LoggerFactory.getLogger(ThreadLimiter.class); + private static final Logger log = LoggerFactory.getLogger(ThreadLimiter.class); public static int limitThreads(Injector dbInjector, int threads) { return limitThreads( @@ -38,19 +36,16 @@ public class ThreadLimiter { threads); } - private static int limitThreads(Config cfg, DataSourceType dst, - ThreadSettingsConfig threadSettingsConfig, int threads) { - boolean usePool = cfg.getBoolean("database", "connectionpool", - dst.usePool()); + private static int limitThreads( + Config cfg, DataSourceType dst, ThreadSettingsConfig threadSettingsConfig, int threads) { + boolean usePool = cfg.getBoolean("database", "connectionpool", dst.usePool()); int poolLimit = threadSettingsConfig.getDatabasePoolLimit(); if (usePool && threads > poolLimit) { - log.warn("Limiting program to " + poolLimit - + " threads due to database.poolLimit"); + log.warn("Limiting program to " + poolLimit + " threads due to database.poolLimit"); return poolLimit; } return threads; } - private ThreadLimiter() { - } + private ThreadLimiter() {} } diff --git a/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/InitTestCase.java b/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/InitTestCase.java index 959ba69afc..35c093720f 100644 --- a/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/InitTestCase.java +++ b/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/InitTestCase.java @@ -14,11 +14,10 @@ package com.google.gerrit.pgm.init; -import org.eclipse.jgit.junit.LocalDiskRepositoryTestCase; -import org.junit.Ignore; - import java.io.IOException; import java.nio.file.Path; +import org.eclipse.jgit.junit.LocalDiskRepositoryTestCase; +import org.junit.Ignore; @Ignore public abstract class InitTestCase extends LocalDiskRepositoryTestCase { diff --git a/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/LibrariesTest.java b/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/LibrariesTest.java index 115b0fda6a..6585650e63 100644 --- a/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/LibrariesTest.java +++ b/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/LibrariesTest.java @@ -22,11 +22,9 @@ import static org.junit.Assert.assertNotNull; import com.google.gerrit.pgm.init.api.ConsoleUI; import com.google.gerrit.server.config.SitePaths; import com.google.inject.Provider; - -import org.junit.Test; - import java.nio.file.Paths; import java.util.Collections; +import org.junit.Test; public class LibrariesTest { @Test @@ -36,12 +34,16 @@ public class LibrariesTest { replay(ui); - Libraries lib = new Libraries(new Provider() { - @Override - public LibraryDownloader get() { - return new LibraryDownloader(ui, site); - } - }, Collections. emptyList(), false); + Libraries lib = + new Libraries( + new Provider() { + @Override + public LibraryDownloader get() { + return new LibraryDownloader(ui, site); + } + }, + Collections.emptyList(), + false); assertNotNull(lib.bouncyCastleProvider); assertNotNull(lib.mysqlDriver); diff --git a/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_xTest.java b/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_xTest.java index 76a3185e09..461a2416de 100644 --- a/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_xTest.java +++ b/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_xTest.java @@ -32,20 +32,17 @@ import com.google.gerrit.pgm.init.api.InitFlags; import com.google.gerrit.pgm.init.api.Section; import com.google.gerrit.server.config.SitePaths; import com.google.gerrit.server.securestore.SecureStore; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.Config; -import org.eclipse.jgit.storage.file.FileBasedConfig; -import org.eclipse.jgit.util.FS; -import org.junit.Test; - import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.util.Collections; import java.util.List; - +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.storage.file.FileBasedConfig; +import org.eclipse.jgit.util.FS; +import org.junit.Test; public class UpgradeFrom2_0_xTest extends InitTestCase { @@ -60,8 +57,7 @@ public class UpgradeFrom2_0_xTest extends InitTestCase { Files.write(p.resolve(n), ("# " + n + "\n").getBytes(UTF_8)); } - FileBasedConfig old = - new FileBasedConfig(p.resolve("gerrit.config").toFile(), FS.DETECTED); + FileBasedConfig old = new FileBasedConfig(p.resolve("gerrit.config").toFile(), FS.DETECTED); old.setString("ldap", null, "username", "ldap.user"); old.setString("ldap", null, "password", "ldap.s3kr3t"); @@ -71,21 +67,19 @@ public class UpgradeFrom2_0_xTest extends InitTestCase { old.save(); final InMemorySecureStore secureStore = new InMemorySecureStore(); - final InitFlags flags = new InitFlags(site, secureStore, - Collections. emptyList(), false); + final InitFlags flags = + new InitFlags(site, secureStore, Collections.emptyList(), false); final ConsoleUI ui = createStrictMock(ConsoleUI.class); - Section.Factory sections = new Section.Factory() { - @Override - public Section get(String name, String subsection) { - return new Section(flags, site, secureStore, ui, name, subsection); - } - }; + Section.Factory sections = + new Section.Factory() { + @Override + public Section get(String name, String subsection) { + return new Section(flags, site, secureStore, ui, name, subsection); + } + }; - expect(ui.yesno( - eq(true), - eq("Upgrade '%s'"), - eq(p.toAbsolutePath().normalize()))) - .andReturn(true); + expect(ui.yesno(eq(true), eq("Upgrade '%s'"), eq(p.toAbsolutePath().normalize()))) + .andReturn(true); replay(ui); UpgradeFrom2_0_x u = new UpgradeFrom2_0_x(site, flags, ui, sections); @@ -99,13 +93,11 @@ public class UpgradeFrom2_0_xTest extends InitTestCase { continue; } try (InputStream in = Files.newInputStream(site.etc_dir.resolve(n))) { - assertEquals("# " + n + "\n", - new String(ByteStreams.toByteArray(in), UTF_8)); + assertEquals("# " + n + "\n", new String(ByteStreams.toByteArray(in), UTF_8)); } } - FileBasedConfig cfg = - new FileBasedConfig(site.gerrit_config.toFile(), FS.DETECTED); + FileBasedConfig cfg = new FileBasedConfig(site.gerrit_config.toFile(), FS.DETECTED); cfg.load(); assertEquals("email.user", cfg.getString("sendemail", null, "smtpUser")); @@ -128,14 +120,13 @@ public class UpgradeFrom2_0_xTest extends InitTestCase { } @Override - public String[] getListForPlugin(String pluginName, String section, - String subsection, String name) { + public String[] getListForPlugin( + String pluginName, String section, String subsection, String name) { throw new UnsupportedOperationException("not used by tests"); } @Override - public void setList(String section, String subsection, String name, - List values) { + public void setList(String section, String subsection, String name, List values) { cfg.setStringList(section, subsection, name, values); } diff --git a/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/FormatUtil.java b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/FormatUtil.java index e5e8c624d2..85bc9c3706 100644 --- a/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/FormatUtil.java +++ b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/FormatUtil.java @@ -18,13 +18,11 @@ import com.google.gerrit.client.AccountFormatter; import com.google.gerrit.client.DateFormatter; import com.google.gerrit.client.RelativeDateFormatter; import com.google.gerrit.client.info.AccountInfo; - import java.util.Date; public class FormatUtil { private static final AccountFormatter accountFormatter = - new AccountFormatter(Plugin.get().getServerInfo().user() - .anonymousCowardName()); + new AccountFormatter(Plugin.get().getServerInfo().user().anonymousCowardName()); /** Format a date using a really short format. */ public static String shortFormat(Date dt) { @@ -52,13 +50,14 @@ public class FormatUtil { /** * Formats an account as a name and an email address. - *

- * Example output: + * + *

Example output: + * *

    - *
  • {@code A U. Thor <author@example.com>}: full populated
  • - *
  • {@code A U. Thor (12)}: missing email address
  • - *
  • {@code Anonymous Coward <author@example.com>}: missing name
  • - *
  • {@code Anonymous Coward (12)}: missing name and email address
  • + *
  • {@code A U. Thor <author@example.com>}: full populated + *
  • {@code A U. Thor (12)}: missing email address + *
  • {@code Anonymous Coward <author@example.com>}: missing name + *
  • {@code Anonymous Coward (12)}: missing name and email address *
*/ public static String nameEmail(AccountInfo info) { @@ -67,9 +66,9 @@ public class FormatUtil { /** * Formats an account name. - *

- * If the account has a full name, it returns only the full name. Otherwise it - * returns a longer form that includes the email address. + * + *

If the account has a full name, it returns only the full name. Otherwise it returns a longer + * form that includes the email address. */ public static String name(AccountInfo info) { return accountFormatter.name(info); diff --git a/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/Plugin.java b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/Plugin.java index 14e31553ba..7c478c1016 100644 --- a/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/Plugin.java +++ b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/Plugin.java @@ -26,12 +26,11 @@ import com.google.gwt.core.client.JavaScriptObject; /** * Wrapper around the plugin instance exposed by Gerrit. * - * Listeners for events generated by the main UI must be registered - * through this instance. + *

Listeners for events generated by the main UI must be registered through this instance. */ public final class Plugin extends JavaScriptObject { - private static final Plugin self = install( - GWT.getModuleBaseURL() + GWT.getModuleName() + ".nocache.js"); + private static final Plugin self = + install(GWT.getModuleBaseURL() + GWT.getModuleName() + ".nocache.js"); /** Obtain the plugin instance wrapper. */ public static Plugin get() { @@ -44,65 +43,57 @@ public final class Plugin extends JavaScriptObject { } /** Installed name of the plugin. */ - public native String getPluginName() - /*-{ return this.getPluginName() }-*/; + public native String getPluginName() /*-{ return this.getPluginName() }-*/; /** Navigate the UI to the screen identified by the token. */ - public native void go(String token) - /*-{ return this.go(token) }-*/; + public native void go(String token) /*-{ return this.go(token) }-*/; /** Refresh the current UI. */ - public native void refresh() - /*-{ return this.refresh() }-*/; + public native void refresh() /*-{ return this.refresh() }-*/; /** Refresh Gerrit's menu bar. */ - public native void refreshMenuBar() - /*-{ return this.refreshMenuBar() }-*/; + public native void refreshMenuBar() /*-{ return this.refreshMenuBar() }-*/; - /** @return the preferences of the currently signed in user, the default preferences if not signed in */ - public native GeneralPreferences getUserPreferences() - /*-{ return this.getUserPreferences() }-*/; + /** + * @return the preferences of the currently signed in user, the default preferences if not signed + * in + */ + public native GeneralPreferences getUserPreferences() /*-{ return this.getUserPreferences() }-*/; /** Refresh the user preferences of the current user. */ - public native void refreshUserPreferences() - /*-{ return this.refreshUserPreferences() }-*/; + public native void refreshUserPreferences() /*-{ return this.refreshUserPreferences() }-*/; /** @return the server info */ - public native ServerInfo getServerInfo() - /*-{ return this.getServerInfo() }-*/; + public native ServerInfo getServerInfo() /*-{ return this.getServerInfo() }-*/; /** @return the current user */ - public native AccountInfo getCurrentUser() - /*-{ return this.getCurrentUser() }-*/; + public native AccountInfo getCurrentUser() /*-{ return this.getCurrentUser() }-*/; /** Check if user is signed in. */ - public native boolean isSignedIn() - /*-{ return this.isSignedIn() }-*/; + public native boolean isSignedIn() /*-{ return this.isSignedIn() }-*/; /** Show message in Gerrit's ErrorDialog. */ - public native void showError(String message) - /*-{ return this.showError(message) }-*/; + public native void showError(String message) /*-{ return this.showError(message) }-*/; /** * Register a screen displayed at {@code /#/x/plugin/token}. * - * @param token literal anchor token appearing after the plugin name. For - * regular expression matching use {@code screenRegex()} . + * @param token literal anchor token appearing after the plugin name. For regular expression + * matching use {@code screenRegex()} . * @param entry callback function invoked to create the screen widgets. */ public void screen(String token, Screen.EntryPoint entry) { screen(token, wrap(entry)); } - private native void screen(String t, JavaScriptObject e) - /*-{ this.screen(t, e) }-*/; + private native void screen(String t, JavaScriptObject e) /*-{ this.screen(t, e) }-*/; /** * Register a screen displayed at {@code /#/x/plugin/regex}. * - * @param regex JavaScript {@code RegExp} expression to match the anchor token - * after the plugin name. Matching groups are exposed through the - * {@code Screen} object passed into the {@code Screen.EntryPoint}. + * @param regex JavaScript {@code RegExp} expression to match the anchor token after the plugin + * name. Matching groups are exposed through the {@code Screen} object passed into the {@code + * Screen.EntryPoint}. * @param entry callback function invoked to create the screen widgets. */ public void screenRegex(String regex, Screen.EntryPoint entry) { @@ -110,7 +101,7 @@ public final class Plugin extends JavaScriptObject { } private native void screenRegex(String p, JavaScriptObject e) - /*-{ this.screen(new $wnd.RegExp(p), e) }-*/; + /*-{ this.screen(new $wnd.RegExp(p), e) }-*/ ; /** * Register a settings screen displayed at {@code /#/settings/x/plugin/token}. @@ -123,29 +114,27 @@ public final class Plugin extends JavaScriptObject { } private native void settingsScreen(String t, String m, JavaScriptObject e) - /*-{ this.settingsScreen(t, m, e) }-*/; + /*-{ this.settingsScreen(t, m, e) }-*/ ; /** * Register a panel for a UI extension point. * - * @param extensionPoint the UI extension point for which the panel should be - * registered. + * @param extensionPoint the UI extension point for which the panel should be registered. * @param entry callback function invoked to create the panel widgets. */ public void panel(GerritUiExtensionPoint extensionPoint, Panel.EntryPoint entry) { panel(extensionPoint.name(), wrap(entry)); } - private native void panel(String i, JavaScriptObject e) - /*-{ this.panel(i, e) }-*/; + private native void panel(String i, JavaScriptObject e) /*-{ this.panel(i, e) }-*/; - protected Plugin() { - } + protected Plugin() {} native void _initialized() /*-{ this._success = true }-*/; + native void _loaded() /*-{ this._loadedGwt() }-*/; - private static native Plugin install(String u) - /*-{ return $wnd.Gerrit.installGwt(u) }-*/; + + private static native Plugin install(String u) /*-{ return $wnd.Gerrit.installGwt(u) }-*/; private static native JavaScriptObject wrap(Screen.EntryPoint b) /*-{ return $entry(function(c){ diff --git a/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/PluginEntryPoint.java b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/PluginEntryPoint.java index 0f8a16aa84..808cda356d 100644 --- a/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/PluginEntryPoint.java +++ b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/PluginEntryPoint.java @@ -19,16 +19,17 @@ import com.google.gwt.core.client.EntryPoint; /** * Base class for writing Gerrit Web UI plugins * - * Writing a plugin: + *

Writing a plugin: + * *

    - *
  1. Declare subtype of Plugin
  2. - *
  3. Bind WebUiPlugin to GwtPlugin implementation in Gerrit-Module
  4. + *
  5. Declare subtype of Plugin + *
  6. Bind WebUiPlugin to GwtPlugin implementation in Gerrit-Module *
*/ public abstract class PluginEntryPoint implements EntryPoint { /** - * The plugin entry point method, called automatically by loading - * a module that declares an implementing class as an entry point. + * The plugin entry point method, called automatically by loading a module that declares an + * implementing class as an entry point. */ public abstract void onPluginLoad(); diff --git a/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/extension/Panel.java b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/extension/Panel.java index 0200a14305..8ee6d0eaf3 100644 --- a/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/extension/Panel.java +++ b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/extension/Panel.java @@ -22,7 +22,7 @@ import com.google.gwt.user.client.ui.SimplePanel; /** * Panel that extends a Gerrit core screen contributed by this plugin. * - * Panel should be registered early at module load: + *

Panel should be registered early at module load: * *

  * @Override
@@ -42,17 +42,16 @@ public class Panel extends SimplePanel {
   public interface EntryPoint {
     /**
      * Invoked when the panel has been created.
-     * 

- * The implementation should create a single widget to define the content of - * this panel and add it to the passed panel instance. - *

- * To use multiple widgets, compose them in panels such as {@code FlowPanel} - * and add only the top level widget to the panel. - *

- * The panel is already attached to the browser DOM. - * Any widgets added to the screen will immediately receive {@code onLoad()}. - * GWT will fire {@code onUnload()} when the panel is removed from the UI, - * generally caused by the user navigating to another screen. + * + *

The implementation should create a single widget to define the content of this panel and + * add it to the passed panel instance. + * + *

To use multiple widgets, compose them in panels such as {@code FlowPanel} and add only the + * top level widget to the panel. + * + *

The panel is already attached to the browser DOM. Any widgets added to the screen will + * immediately receive {@code onLoad()}. GWT will fire {@code onUnload()} when the panel is + * removed from the UI, generally caused by the user navigating to another screen. * * @param panel panel that will contain the panel widget. */ @@ -63,15 +62,16 @@ public class Panel extends SimplePanel { native Element body() /*-{ return this.body }-*/; native String get(String k) /*-{ return this.p[k]; }-*/; + native int getInt(String k, int d) /*-{ return this.p.hasOwnProperty(k) ? this.p[k] : d }-*/; + native int getBoolean(String k, boolean d) /*-{ return this.p.hasOwnProperty(k) ? this.p[k] : d }-*/; - native JavaScriptObject getObject(String k) - /*-{ return this.p[k]; }-*/; + native JavaScriptObject getObject(String k) /*-{ return this.p[k]; }-*/; native void detach(Panel p) /*-{ this.onUnload($entry(function(){ @@ -79,8 +79,7 @@ public class Panel extends SimplePanel { })); }-*/; - protected Context() { - } + protected Context() {} } private final Context ctx; diff --git a/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/rpc/NoContent.java b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/rpc/NoContent.java index 55744d5b2a..9ff4fed581 100644 --- a/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/rpc/NoContent.java +++ b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/rpc/NoContent.java @@ -17,6 +17,5 @@ package com.google.gerrit.plugin.client.rpc; import com.google.gwt.core.client.JavaScriptObject; public class NoContent extends JavaScriptObject { - protected NoContent() { - } + protected NoContent() {} } diff --git a/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/rpc/RestApi.java b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/rpc/RestApi.java index d627959de2..86791f8410 100644 --- a/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/rpc/RestApi.java +++ b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/rpc/RestApi.java @@ -100,8 +100,7 @@ public class RestApi { return path.toString(); } - public - void get(AsyncCallback cb) { + public void get(AsyncCallback cb) { get(path(), wrap(cb)); } @@ -109,62 +108,51 @@ public class RestApi { get(NativeString.unwrap(cb)); } - private static native void get(String p, JavaScriptObject r) - /*-{ $wnd.Gerrit.get_raw(p, r) }-*/; + private static native void get(String p, JavaScriptObject r) /*-{ $wnd.Gerrit.get_raw(p, r) }-*/; - public - void put(AsyncCallback cb) { + public void put(AsyncCallback cb) { put(path(), wrap(cb)); } - private static native void put(String p, JavaScriptObject r) - /*-{ $wnd.Gerrit.put_raw(p, r) }-*/; + private static native void put(String p, JavaScriptObject r) /*-{ $wnd.Gerrit.put_raw(p, r) }-*/; - public - void put(String content, AsyncCallback cb) { + public void put(String content, AsyncCallback cb) { put(path(), content, wrap(cb)); } - private static native - void put(String p, String c, JavaScriptObject r) - /*-{ $wnd.Gerrit.put_raw(p, c, r) }-*/; + private static native void put(String p, String c, JavaScriptObject r) + /*-{ $wnd.Gerrit.put_raw(p, c, r) }-*/ ; - public - void put(JavaScriptObject content, AsyncCallback cb) { + public void put(JavaScriptObject content, AsyncCallback cb) { put(path(), content, wrap(cb)); } - private static native - void put(String p, JavaScriptObject c, JavaScriptObject r) - /*-{ $wnd.Gerrit.put_raw(p, c, r) }-*/; + private static native void put(String p, JavaScriptObject c, JavaScriptObject r) + /*-{ $wnd.Gerrit.put_raw(p, c, r) }-*/ ; - public - void post(String content, AsyncCallback cb) { + public void post(String content, AsyncCallback cb) { post(path(), content, wrap(cb)); } - private static native - void post(String p, String c, JavaScriptObject r) - /*-{ $wnd.Gerrit.post_raw(p, c, r) }-*/; + private static native void post(String p, String c, JavaScriptObject r) + /*-{ $wnd.Gerrit.post_raw(p, c, r) }-*/ ; - public - void post(JavaScriptObject content, AsyncCallback cb) { + public void post(JavaScriptObject content, AsyncCallback cb) { post(path(), content, wrap(cb)); } - private static native - void post(String p, JavaScriptObject c, JavaScriptObject r) - /*-{ $wnd.Gerrit.post_raw(p, c, r) }-*/; + private static native void post(String p, JavaScriptObject c, JavaScriptObject r) + /*-{ $wnd.Gerrit.post_raw(p, c, r) }-*/ ; public void delete(AsyncCallback cb) { delete(path(), wrap(cb)); } private static native void delete(String p, JavaScriptObject r) - /*-{ $wnd.Gerrit.del_raw(p, r) }-*/; + /*-{ $wnd.Gerrit.del_raw(p, r) }-*/ ; - private static native - JavaScriptObject wrap(AsyncCallback b) /*-{ + private static native JavaScriptObject wrap( + AsyncCallback b) /*-{ return function(r) { b.@com.google.gwt.user.client.rpc.AsyncCallback::onSuccess(Ljava/lang/Object;)(r) } diff --git a/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/screen/Screen.java b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/screen/Screen.java index 5e0ba4a91b..226ac48426 100644 --- a/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/screen/Screen.java +++ b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/screen/Screen.java @@ -23,7 +23,7 @@ import com.google.gwt.user.client.ui.Widget; /** * Screen contributed by this plugin. * - * Screens should be registered early at module load: + *

Screens should be registered early at module load: * *

  * @Override
@@ -43,18 +43,18 @@ public final class Screen extends SimplePanel {
   public interface EntryPoint {
     /**
      * Invoked when the screen has been created, but not yet displayed.
-     * 

- * The implementation should create a single widget to define the content of - * this screen and added it to the passed screen instance. When the screen - * is ready to be displayed, call {@link Screen#show()}. - *

- * To use multiple widgets, compose them in panels such as {@code FlowPanel} - * and add only the top level widget to the screen. - *

- * The screen is already attached to the browser DOM in an invisible area. - * Any widgets added to the screen will immediately receive {@code onLoad()}. - * GWT will fire {@code onUnload()} when the screen is removed from the UI, - * generally caused by the user navigating to another screen. + * + *

The implementation should create a single widget to define the content of this screen and + * added it to the passed screen instance. When the screen is ready to be displayed, call {@link + * Screen#show()}. + * + *

To use multiple widgets, compose them in panels such as {@code FlowPanel} and add only the + * top level widget to the screen. + * + *

The screen is already attached to the browser DOM in an invisible area. Any widgets added + * to the screen will immediately receive {@code onLoad()}. GWT will fire {@code onUnload()} + * when the screen is removed from the UI, generally caused by the user navigating to another + * screen. * * @param screen panel that will contain the screen widget. */ @@ -63,18 +63,22 @@ public final class Screen extends SimplePanel { static final class Context extends JavaScriptObject { native Element body() /*-{ return this.body }-*/; + native JsArrayString token_match() /*-{ return this.token_match }-*/; + native void show() /*-{ this.show() }-*/; + native void setTitle(String t) /*-{ this.setTitle(t) }-*/; + native void setWindowTitle(String t) /*-{ this.setWindowTitle(t) }-*/; + native void detach(Screen s) /*-{ this.onUnload($entry(function(){ s.@com.google.gwt.user.client.ui.Widget::onDetach()(); })); }-*/; - protected Context() { - } + protected Context() {} } private final Context ctx; @@ -92,8 +96,8 @@ public final class Screen extends SimplePanel { } /** - * @param group groups range from 1 to {@code getTokenGroups() - 1}. Token - * group 0 is the entire token, see {@link #getToken()}. + * @param group groups range from 1 to {@code getTokenGroups() - 1}. Token group 0 is the entire + * token, see {@link #getToken()}. * @return the token from the regex match group. */ public String getToken(int group) { diff --git a/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/ui/GroupSuggestOracle.java b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/ui/GroupSuggestOracle.java index 528b07a55c..13e19ae2de 100644 --- a/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/ui/GroupSuggestOracle.java +++ b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/ui/GroupSuggestOracle.java @@ -20,7 +20,6 @@ import com.google.gerrit.plugin.client.rpc.RestApi; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.SuggestOracle; - import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -30,9 +29,7 @@ public class GroupSuggestOracle extends SuggestOracle { private final int chars; - /** - * @param chars minimum chars to start suggesting. - */ + /** @param chars minimum chars to start suggesting. */ public GroupSuggestOracle(int chars) { this.chars = chars; } @@ -52,22 +49,23 @@ public class GroupSuggestOracle extends SuggestOracle { if (req.getLimit() > 0) { rest.addParameter("n", req.getLimit()); } - rest.get(new AsyncCallback>() { - @Override - public void onSuccess(NativeMap result) { - List keys = result.sortedKeys(); - List suggestions = new ArrayList<>(keys.size()); - for (String g : keys) { - suggestions.add(new HighlightSuggestion(req.getQuery(), g)); - } - done.onSuggestionsReady(req, new Response(suggestions)); - } + rest.get( + new AsyncCallback>() { + @Override + public void onSuccess(NativeMap result) { + List keys = result.sortedKeys(); + List suggestions = new ArrayList<>(keys.size()); + for (String g : keys) { + suggestions.add(new HighlightSuggestion(req.getQuery(), g)); + } + done.onSuggestionsReady(req, new Response(suggestions)); + } - @Override - public void onFailure(Throwable caught) { - responseEmptySuggestion(req, done); - } - }); + @Override + public void onFailure(Throwable caught) { + responseEmptySuggestion(req, done); + } + }); } private static void responseEmptySuggestion(Request req, Callback done) { diff --git a/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/rebind/PluginGenerator.java b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/rebind/PluginGenerator.java index 89bb026368..ba145563e5 100644 --- a/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/rebind/PluginGenerator.java +++ b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/rebind/PluginGenerator.java @@ -24,19 +24,18 @@ import com.google.gwt.core.ext.typeinfo.JClassType; import com.google.gwt.core.ext.typeinfo.TypeOracle; import com.google.gwt.user.rebind.ClassSourceFileComposerFactory; import com.google.gwt.user.rebind.SourceWriter; - import java.io.PrintWriter; /** - * Write the top layer in the Gadget bootstrap sandwich and generate a stub - * manifest that will be completed by the linker. + * Write the top layer in the Gadget bootstrap sandwich and generate a stub manifest that will be + * completed by the linker. * - * Based on gwt-gadgets GadgetGenerator class + *

Based on gwt-gadgets GadgetGenerator class */ public class PluginGenerator extends Generator { @Override - public String generate(TreeLogger logger, GeneratorContext context, - String typeName) throws UnableToCompleteException { + public String generate(TreeLogger logger, GeneratorContext context, String typeName) + throws UnableToCompleteException { // The TypeOracle knows about all types in the type system TypeOracle typeOracle = context.getTypeOracle(); @@ -54,18 +53,18 @@ public class PluginGenerator extends Generator { validateType(logger, sourceType); // Pick a name for the generated class to not conflict. - String generatedSimpleSourceName = sourceType.getSimpleSourceName() - + "PluginImpl"; + String generatedSimpleSourceName = sourceType.getSimpleSourceName() + "PluginImpl"; // Begin writing the generated source. - ClassSourceFileComposerFactory f = new ClassSourceFileComposerFactory( - sourceType.getPackage().getName(), generatedSimpleSourceName); + ClassSourceFileComposerFactory f = + new ClassSourceFileComposerFactory( + sourceType.getPackage().getName(), generatedSimpleSourceName); f.addImport(GWT.class.getName()); f.setSuperclass(typeName); // All source gets written through this Writer - PrintWriter out = context.tryCreate(logger, - sourceType.getPackage().getName(), generatedSimpleSourceName); + PrintWriter out = + context.tryCreate(logger, sourceType.getPackage().getName(), generatedSimpleSourceName); // If an implementation already exists, we don't need to do any work if (out != null) { @@ -78,11 +77,9 @@ public class PluginGenerator extends Generator { return f.getCreatedClassName(); } - protected void validateType(TreeLogger logger, JClassType type) - throws UnableToCompleteException { + protected void validateType(TreeLogger logger, JClassType type) throws UnableToCompleteException { if (!type.isDefaultInstantiable()) { - logger.log(TreeLogger.ERROR, "Plugin types must be default instantiable", - null); + logger.log(TreeLogger.ERROR, "Plugin types must be default instantiable", null); throw new UnableToCompleteException(); } } diff --git a/gerrit-prettify/src/main/java/com/google/gerrit/prettify/common/EditList.java b/gerrit-prettify/src/main/java/com/google/gerrit/prettify/common/EditList.java index ec5c78d831..1b06f0fc54 100644 --- a/gerrit-prettify/src/main/java/com/google/gerrit/prettify/common/EditList.java +++ b/gerrit-prettify/src/main/java/com/google/gerrit/prettify/common/EditList.java @@ -14,10 +14,9 @@ package com.google.gerrit.prettify.common; -import org.eclipse.jgit.diff.Edit; - import java.util.Iterator; import java.util.List; +import org.eclipse.jgit.diff.Edit; public class EditList { private final List edits; @@ -25,8 +24,8 @@ public class EditList { private final int aSize; private final int bSize; - public EditList(final List edits, final int contextLines, - final int aSize, final int bSize) { + public EditList( + final List edits, final int contextLines, final int aSize, final int bSize) { this.edits = edits; this.context = contextLines; this.aSize = aSize; diff --git a/gerrit-prettify/src/main/java/com/google/gerrit/prettify/common/SparseFileContent.java b/gerrit-prettify/src/main/java/com/google/gerrit/prettify/common/SparseFileContent.java index a57146f467..1dce0a0cf1 100644 --- a/gerrit-prettify/src/main/java/com/google/gerrit/prettify/common/SparseFileContent.java +++ b/gerrit-prettify/src/main/java/com/google/gerrit/prettify/common/SparseFileContent.java @@ -14,11 +14,9 @@ package com.google.gerrit.prettify.common; - -import org.eclipse.jgit.diff.Edit; - import java.util.ArrayList; import java.util.List; +import org.eclipse.jgit.diff.Edit; public class SparseFileContent { protected String path; @@ -282,8 +280,7 @@ public class SparseFileContent { lines = new ArrayList<>(); } - protected Range() { - } + protected Range() {} private String get(final int i) { return lines.get(i - base); diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Account.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Account.java index 39a59b9376..4e457e190b 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Account.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Account.java @@ -20,35 +20,27 @@ import com.google.gerrit.extensions.client.DiffPreferencesInfo; import com.google.gerrit.extensions.client.GeneralPreferencesInfo; import com.google.gwtorm.client.Column; import com.google.gwtorm.client.IntKey; - import java.sql.Timestamp; /** * Information about a single user. - *

- * A user may have multiple identities they can use to login to Gerrit (see - * {@link AccountExternalId}), but in such cases they always map back to a - * single Account entity. - *

- * Entities "owned" by an Account (that is, their primary key contains the - * {@link Account.Id} key as part of their key structure): + * + *

A user may have multiple identities they can use to login to Gerrit (see {@link + * AccountExternalId}), but in such cases they always map back to a single Account entity. + * + *

Entities "owned" by an Account (that is, their primary key contains the {@link Account.Id} key + * as part of their key structure): + * *

    - * - *
  • {@link AccountExternalId}: OpenID identities and email addresses known to - * be registered to this user. Multiple records can exist when the user has more - * than one public identity, such as a work and a personal email address.
  • - * - *
  • {@link AccountGroupMember}: membership of the user in a specific human - * managed {@link AccountGroup}. Multiple records can exist when the user is a - * member of more than one group.
  • - * - *
  • {@link AccountSshKey}: user's public SSH keys, for authentication through - * the internal SSH daemon. One record per SSH key uploaded by the user, keys - * are checked in random order until a match is found.
  • - * - *
  • {@link DiffPreferencesInfo}: user's preferences for rendering side-to-side - * and unified diff
  • - * + *
  • {@link AccountExternalId}: OpenID identities and email addresses known to be registered to + * this user. Multiple records can exist when the user has more than one public identity, such + * as a work and a personal email address. + *
  • {@link AccountGroupMember}: membership of the user in a specific human managed {@link + * AccountGroup}. Multiple records can exist when the user is a member of more than one group. + *
  • {@link AccountSshKey}: user's public SSH keys, for authentication through the internal SSH + * daemon. One record per SSH key uploaded by the user, keys are checked in random order until + * a match is found. + *
  • {@link DiffPreferencesInfo}: user's preferences for rendering side-to-side and unified diff *
*/ public final class Account { @@ -57,15 +49,25 @@ public final class Account { public static final String USER_NAME_PATTERN_LAST = "[a-zA-Z0-9]"; /** Regular expression that {@link #userName} must match. */ - public static final String USER_NAME_PATTERN = "^" + // - "(" + // - USER_NAME_PATTERN_FIRST + // - USER_NAME_PATTERN_REST + "*" + // - USER_NAME_PATTERN_LAST + // - "|" + // - USER_NAME_PATTERN_FIRST + // - ")" + // - "$"; + public static final String USER_NAME_PATTERN = + "^" + + // + "(" + + // + USER_NAME_PATTERN_FIRST + + // + USER_NAME_PATTERN_REST + + "*" + + // + USER_NAME_PATTERN_LAST + + // + "|" + + // + USER_NAME_PATTERN_FIRST + + // + ")" + + // + "$"; /** Key local to Gerrit to identify a user. */ public static class Id extends IntKey> { @@ -74,8 +76,7 @@ public final class Account { @Column(id = 1) protected int id; - protected Id() { - } + protected Id() {} public Id(int id) { this.id = id; @@ -111,8 +112,8 @@ public final class Account { /** * Parse an Account.Id out of a part of a ref-name. * - * @param name a ref name with the following syntax: {@code "34/1234..."}. - * We assume that the caller has trimmed any prefix. + * @param name a ref name with the following syntax: {@code "34/1234..."}. We assume that the + * caller has trimmed any prefix. */ public static Id fromRefPart(String name) { Integer id = RefNames.parseShardedRefPart(name); @@ -121,10 +122,10 @@ public final class Account { /** * Parse an Account.Id out of the last part of a ref name. - *

- * The input is a ref name of the form {@code ".../1234"}, where the suffix - * is a non-sharded account ID. Ref names using a sharded ID should use - * {@link #fromRefPart(String)} instead for greater safety. + * + *

The input is a ref name of the form {@code ".../1234"}, where the suffix is a non-sharded + * account ID. Ref names using a sharded ID should use {@link #fromRefPart(String)} instead for + * greater safety. * * @param name ref name * @return account ID, or null if not numeric. @@ -168,14 +169,12 @@ public final class Account { /** stored in git, used for caching the user's preferences. */ private GeneralPreferencesInfo generalPreferences; - protected Account() { - } + protected Account() {} /** * Create a new account. * - * @param newId unique id, see - * {@link com.google.gerrit.reviewdb.server.ReviewDb#nextAccountId()}. + * @param newId unique id, see {@link com.google.gerrit.reviewdb.server.ReviewDb#nextAccountId()}. * @param registeredOn when the account was registered. */ public Account(Account.Id newId, Timestamp registeredOn) { @@ -214,9 +213,9 @@ public final class Account { /** * Formats an account name. - *

- * If the account has a full name, it returns only the full name. Otherwise it - * returns a longer form that includes the email address. + * + *

If the account has a full name, it returns only the full name. Otherwise it returns a longer + * form that includes the email address. */ public String getName(String anonymousCowardName) { if (fullName != null) { @@ -230,13 +229,14 @@ public final class Account { /** * Get the name and email address. - *

- * Example output: + * + *

Example output: + * *

    - *
  • {@code A U. Thor <author@example.com>}: full populated
  • - *
  • {@code A U. Thor (12)}: missing email address
  • - *
  • {@code Anonymous Coward <author@example.com>}: missing name
  • - *
  • {@code Anonymous Coward (12)}: missing name and email address
  • + *
  • {@code A U. Thor <author@example.com>}: full populated + *
  • {@code A U. Thor (12)}: missing email address + *
  • {@code Anonymous Coward <author@example.com>}: missing name + *
  • {@code Anonymous Coward (12)}: missing name and email address *
*/ public String getNameEmail(String anonymousCowardName) { @@ -269,11 +269,11 @@ public final class Account { } public boolean isActive() { - return ! inactive; + return !inactive; } public void setActive(boolean active) { - inactive = ! active; + inactive = !active; } public String getStatus() { diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountExternalId.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountExternalId.java index 5ae88473d9..a78958059e 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountExternalId.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountExternalId.java @@ -21,10 +21,10 @@ import com.google.gwtorm.client.StringKey; /** Association of an external account identifier to a local {@link Account}. */ public final class AccountExternalId { /** - * Scheme used for {@link AuthType#LDAP}, {@link AuthType#CLIENT_SSL_CERT_LDAP}, - * {@link AuthType#HTTP_LDAP}, and {@link AuthType#LDAP_BIND} usernames. - *

- * The name {@code gerrit:} was a very poor choice. + * Scheme used for {@link AuthType#LDAP}, {@link AuthType#CLIENT_SSL_CERT_LDAP}, {@link + * AuthType#HTTP_LDAP}, and {@link AuthType#LDAP_BIND} usernames. + * + *

The name {@code gerrit:} was a very poor choice. */ public static final String SCHEME_GERRIT = "gerrit:"; @@ -49,8 +49,7 @@ public final class AccountExternalId { @Column(id = 1) protected String externalId; - protected Key() { - } + protected Key() {} public Key(String scheme, final String identity) { if (!scheme.endsWith(":")) { @@ -97,8 +96,7 @@ public final class AccountExternalId { /** computed value can this identity be removed from the account? */ protected boolean canDelete; - protected AccountExternalId() { - } + protected AccountExternalId() {} /** * Create a new binding to an external identity. @@ -139,9 +137,7 @@ public final class AccountExternalId { public String getSchemeRest() { String scheme = key.getScheme(); - return null != scheme - ? getExternalId().substring(scheme.length() + 1) - : null; + return null != scheme ? getExternalId().substring(scheme.length() + 1) : null; } public String getPassword() { diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroup.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroup.java index 284ae0a66a..c3b2908921 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroup.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroup.java @@ -21,15 +21,13 @@ import com.google.gwtorm.client.StringKey; /** Named group of one or more accounts, typically used for access controls. */ public final class AccountGroup { /** Group name key */ - public static class NameKey extends - StringKey> { + public static class NameKey extends StringKey> { private static final long serialVersionUID = 1L; @Column(id = 1) protected String name; - protected NameKey() { - } + protected NameKey() {} public NameKey(final String n) { name = n; @@ -47,15 +45,13 @@ public final class AccountGroup { } /** Globally unique identifier. */ - public static class UUID extends - StringKey> { + public static class UUID extends StringKey> { private static final long serialVersionUID = 1L; @Column(id = 1) protected String uuid; - protected UUID() { - } + protected UUID() {} public UUID(final String n) { uuid = n; @@ -91,8 +87,7 @@ public final class AccountGroup { @Column(id = 1) protected int id; - protected Id() { - } + protected Id() {} public Id(final int id) { this.id = id; @@ -144,17 +139,18 @@ public final class AccountGroup { /** * Identity of the group whose members can manage this group. - *

- * This can be a self-reference to indicate the group's members manage itself. + * + *

This can be a self-reference to indicate the group's members manage itself. */ @Column(id = 10) protected UUID ownerGroupUUID; - protected AccountGroup() { - } + protected AccountGroup() {} - public AccountGroup(final AccountGroup.NameKey newName, - final AccountGroup.Id newId, final AccountGroup.UUID uuid) { + public AccountGroup( + final AccountGroup.NameKey newName, + final AccountGroup.Id newId, + final AccountGroup.UUID uuid) { name = newName; groupId = newId; visibleToAll = false; diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupById.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupById.java index 3443f80e25..b4bf7834f2 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupById.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupById.java @@ -60,8 +60,7 @@ public final class AccountGroupById { @Column(id = 1, name = Column.NONE) protected Key key; - protected AccountGroupById() { - } + protected AccountGroupById() {} public AccountGroupById(final AccountGroupById.Key k) { key = k; diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupByIdAud.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupByIdAud.java index 161a66e003..d1e72afd82 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupByIdAud.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupByIdAud.java @@ -16,7 +16,6 @@ package com.google.gerrit.reviewdb.client; import com.google.gwtorm.client.Column; import com.google.gwtorm.client.CompoundKey; - import java.sql.Timestamp; /** Inclusion of an {@link AccountGroup} in another {@link AccountGroup}. */ @@ -75,11 +74,10 @@ public final class AccountGroupByIdAud { @Column(id = 4, notNull = false) protected Timestamp removedOn; - protected AccountGroupByIdAud() { - } + protected AccountGroupByIdAud() {} - public AccountGroupByIdAud(final AccountGroupById m, - final Account.Id adder, final Timestamp when) { + public AccountGroupByIdAud( + final AccountGroupById m, final Account.Id adder, final Timestamp when) { final AccountGroup.Id group = m.getGroupId(); final AccountGroup.UUID include = m.getIncludeUUID(); key = new AccountGroupByIdAud.Key(group, include, when); diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupMember.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupMember.java index 4869cf8c6f..ce6999fd67 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupMember.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupMember.java @@ -56,8 +56,7 @@ public final class AccountGroupMember { @Column(id = 1, name = Column.NONE) protected Key key; - protected AccountGroupMember() { - } + protected AccountGroupMember() {} public AccountGroupMember(final AccountGroupMember.Key k) { key = k; diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupMemberAudit.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupMemberAudit.java index c1b057aae4..4f3992d1f2 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupMemberAudit.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupMemberAudit.java @@ -16,7 +16,6 @@ package com.google.gerrit.reviewdb.client; import com.google.gwtorm.client.Column; import com.google.gwtorm.client.CompoundKey; - import java.sql.Timestamp; /** Membership of an {@link Account} in an {@link AccountGroup}. */ @@ -75,11 +74,10 @@ public final class AccountGroupMemberAudit { @Column(id = 4, notNull = false) protected Timestamp removedOn; - protected AccountGroupMemberAudit() { - } + protected AccountGroupMemberAudit() {} - public AccountGroupMemberAudit(final AccountGroupMember m, - final Account.Id adder, Timestamp addedOn) { + public AccountGroupMemberAudit( + final AccountGroupMember m, final Account.Id adder, Timestamp addedOn) { final Account.Id who = m.getAccountId(); final AccountGroup.Id group = m.getAccountGroupId(); key = new AccountGroupMemberAudit.Key(who, group, addedOn); diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupName.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupName.java index 701f2c373d..924f45718d 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupName.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupName.java @@ -24,8 +24,7 @@ public class AccountGroupName { @Column(id = 2) protected AccountGroup.Id groupId; - protected AccountGroupName() { - } + protected AccountGroupName() {} public AccountGroupName(AccountGroup.NameKey name, AccountGroup.Id groupId) { this.name = name; diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountPatchReview.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountPatchReview.java index a1c3c3ce33..5cbd7883a2 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountPatchReview.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountPatchReview.java @@ -17,9 +17,7 @@ package com.google.gerrit.reviewdb.client; import com.google.gwtorm.client.Column; import com.google.gwtorm.client.CompoundKey; -/** - * An entity that keeps track of what user reviewed what patches. - */ +/** An entity that keeps track of what user reviewed what patches. */ public final class AccountPatchReview { public static class Key extends CompoundKey { @@ -59,8 +57,7 @@ public final class AccountPatchReview { @Column(id = 1, name = Column.NONE) protected AccountPatchReview.Key key; - protected AccountPatchReview() { - } + protected AccountPatchReview() {} public AccountPatchReview(final Patch.Key k, final Account.Id a) { key = new AccountPatchReview.Key(k, a); diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountSshKey.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountSshKey.java index 78aef91906..3645dac5b6 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountSshKey.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountSshKey.java @@ -15,7 +15,6 @@ package com.google.gerrit.reviewdb.client; import com.google.gwtorm.client.IntKey; - import java.util.Objects; /** An SSH key approved for use by an {@link Account}. */ @@ -62,8 +61,7 @@ public final class AccountSshKey { protected boolean valid; - protected AccountSshKey() { - } + protected AccountSshKey() {} public AccountSshKey(final AccountSshKey.Id i, final String pub) { id = i; diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Branch.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Branch.java index 23685c5ef0..d0df7c6601 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Branch.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Branch.java @@ -66,8 +66,7 @@ public final class Branch { protected RevId revision; protected boolean canDelete; - protected Branch() { - } + protected Branch() {} public Branch(final Branch.NameKey newName) { name = newName; diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Change.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Change.java index fbaabc6e0f..9655edd762 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Change.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Change.java @@ -21,14 +21,13 @@ import com.google.gwtorm.client.Column; import com.google.gwtorm.client.IntKey; import com.google.gwtorm.client.RowVersion; import com.google.gwtorm.client.StringKey; - import java.sql.Timestamp; import java.util.Arrays; /** * A change proposed to be merged into a {@link Branch}. - *

- * The data graph rooted below a Change can be quite complex: + * + *

The data graph rooted below a Change can be quite complex: * *

  *   {@link Change}
@@ -41,58 +40,58 @@ import java.util.Arrays;
  *          |
  *          +- {@link PatchLineComment}: comment about a specific line
  * 
+ * *

+ * *

PatchSets
+ * + *

Every change has at least one PatchSet. A change starts out with one PatchSet, the initial + * proposal put forth by the change owner. This {@link Account} is usually also listed as the author + * and committer in the PatchSetInfo. + * + *

Each PatchSet contains zero or more Patch records, detailing the file paths impacted by the + * change (otherwise known as, the file paths the author added/deleted/modified). Sometimes a merge + * commit can contain zero patches, if the merge has no conflicts, or has no impact other than to + * cut off a line of development. + * + *

Each PatchLineComment is a draft or a published comment about a single line of the associated + * file. These are the inline comment entities created by users as they perform a review. + * + *

When additional PatchSets appear under a change, these PatchSets reference replacement + * commits; alternative commits that could be made to the project instead of the original commit + * referenced by the first PatchSet. + * + *

A change has at most one current PatchSet. The current PatchSet is updated when a new + * replacement PatchSet is uploaded. When a change is submitted, the current patch set is what is + * merged into the destination branch. + * *

- * Every change has at least one PatchSet. A change starts out with one - * PatchSet, the initial proposal put forth by the change owner. This - * {@link Account} is usually also listed as the author and committer in the - * PatchSetInfo. - *

- * Each PatchSet contains zero or more Patch records, detailing the file paths - * impacted by the change (otherwise known as, the file paths the author - * added/deleted/modified). Sometimes a merge commit can contain zero patches, - * if the merge has no conflicts, or has no impact other than to cut off a line - * of development. - *

- * Each PatchLineComment is a draft or a published comment about a single line - * of the associated file. These are the inline comment entities created by - * users as they perform a review. - *

- * When additional PatchSets appear under a change, these PatchSets reference - * replacement commits; alternative commits that could be made to the - * project instead of the original commit referenced by the first PatchSet. - *

- * A change has at most one current PatchSet. The current PatchSet is updated - * when a new replacement PatchSet is uploaded. When a change is submitted, the - * current patch set is what is merged into the destination branch. - *

+ * *

ChangeMessage
- *

- * The ChangeMessage entity is a general free-form comment about the whole - * change, rather than PatchLineComment's file and line specific context. The - * ChangeMessage appears at the start of any email generated by Gerrit, and is - * shown on the change overview page, rather than in a file-specific context. - * Users often use this entity to describe general remarks about the overall + * + *

The ChangeMessage entity is a general free-form comment about the whole change, rather than + * PatchLineComment's file and line specific context. The ChangeMessage appears at the start of any + * email generated by Gerrit, and is shown on the change overview page, rather than in a + * file-specific context. Users often use this entity to describe general remarks about the overall * concept proposed by the change. + * *

+ * *

PatchSetApproval
- *

- * PatchSetApproval entities exist to fill in the cells of the approvals - * table in the web UI. That is, a single PatchSetApproval record's key is the - * tuple {@code (PatchSet,Account,ApprovalCategory)}. Each PatchSetApproval - * carries with it a small score value, typically within the range -2..+2. - *

- * If an Account has created only PatchSetApprovals with a score value of 0, the - * Change shows in their dashboard, and they are said to be CC'd (carbon copied) - * on the Change, but are not a direct reviewer. This often happens when an - * account was specified at upload time with the {@code --cc} command line flag, - * or have published comments, but left the approval scores at 0 ("No Score"). - *

- * If an Account has one or more PatchSetApprovals with a score != 0, the Change - * shows in their dashboard, and they are said to be an active reviewer. Such - * individuals are highlighted when notice of a replacement patch set is sent, - * or when notice of the change submission occurs. + * + *

PatchSetApproval entities exist to fill in the cells of the approvals table in the web + * UI. That is, a single PatchSetApproval record's key is the tuple {@code + * (PatchSet,Account,ApprovalCategory)}. Each PatchSetApproval carries with it a small score value, + * typically within the range -2..+2. + * + *

If an Account has created only PatchSetApprovals with a score value of 0, the Change shows in + * their dashboard, and they are said to be CC'd (carbon copied) on the Change, but are not a direct + * reviewer. This often happens when an account was specified at upload time with the {@code --cc} + * command line flag, or have published comments, but left the approval scores at 0 ("No Score"). + * + *

If an Account has one or more PatchSetApprovals with a score != 0, the Change shows in their + * dashboard, and they are said to be an active reviewer. Such individuals are highlighted when + * notice of a replacement patch set is sent, or when notice of the change submission occurs. */ public final class Change { public static class Id extends IntKey> { @@ -101,8 +100,7 @@ public final class Change { @Column(id = 1) public int id; - protected Id() { - } + protected Id() {} public Id(final int id) { this.id = id; @@ -123,16 +121,12 @@ public final class Change { } StringBuilder refPrefixBuilder() { - StringBuilder r = new StringBuilder(32) - .append(REFS_CHANGES); + StringBuilder r = new StringBuilder(32).append(REFS_CHANGES); int m = id % 100; if (m < 10) { r.append('0'); } - return r.append(m) - .append('/') - .append(id) - .append('/'); + return r.append(m).append('/').append(id).append('/'); } /** Parse a Change.Id out of a string representation. */ @@ -176,8 +170,7 @@ public final class Change { return null; } int ce = nextNonDigit(ref, cs); - if (ce < ref.length() && ref.charAt(ce) == '/' - && isNumeric(ref, ce + 1)) { + if (ce < ref.length() && ref.charAt(ce) == '/' && isNumeric(ref, ce + 1)) { return new Change.Id(Integer.parseInt(ref.substring(cs, ce))); } return null; @@ -196,8 +189,7 @@ public final class Change { } public static Id fromEditRefPart(String ref) { - int startChangeId = ref.indexOf(RefNames.EDIT_PREFIX) + - RefNames.EDIT_PREFIX.length(); + int startChangeId = ref.indexOf(RefNames.EDIT_PREFIX) + RefNames.EDIT_PREFIX.length(); int endChangeId = nextNonDigit(ref, startChangeId); String id = ref.substring(startChangeId, endChangeId); if (id != null && !id.isEmpty()) { @@ -240,14 +232,12 @@ public final class Change { case 0: return -1; case 1: - if (ref.charAt(ls) != '0' - || ref.charAt(ls + 1) != ref.charAt(cs)) { + if (ref.charAt(ls) != '0' || ref.charAt(ls + 1) != ref.charAt(cs)) { return -1; } break; default: - if (ref.charAt(ls) != ref.charAt(ce - 2) - || ref.charAt(ls + 1) != ref.charAt(ce - 1)) { + if (ref.charAt(ls) != ref.charAt(ce - 2) || ref.charAt(ls + 1) != ref.charAt(ce - 1)) { return -1; } break; @@ -270,8 +260,7 @@ public final class Change { @Column(id = 1, length = 60) protected String id; - protected Key() { - } + protected Key() {} public Key(final String id) { this.id = id; @@ -330,26 +319,23 @@ public final class Change { /** * Current state within the basic workflow of the change. * - *

- * Within the database, lower case codes ('a'..'z') indicate a change that is - * still open, and that can be modified/refined further, while upper case - * codes ('A'..'Z') indicate a change that is closed and cannot be further - * modified. - * */ + *

Within the database, lower case codes ('a'..'z') indicate a change that is still open, and + * that can be modified/refined further, while upper case codes ('A'..'Z') indicate a change that + * is closed and cannot be further modified. + */ public enum Status { /** * Change is open and pending review, or review is in progress. * - *

- * This is the default state assigned to a change when it is first created - * in the database. A change stays in the NEW state throughout its review - * cycle, until the change is submitted or abandoned. + *

This is the default state assigned to a change when it is first created in the database. A + * change stays in the NEW state throughout its review cycle, until the change is submitted or + * abandoned. + * + *

Changes in the NEW state can be moved to: * - *

- * Changes in the NEW state can be moved to: *

    - *
  • {@link #MERGED} - when the Submit Patch Set action is used; - *
  • {@link #ABANDONED} - when the Abandon action is used. + *
  • {@link #MERGED} - when the Submit Patch Set action is used; + *
  • {@link #ABANDONED} - when the Abandon action is used. *
*/ NEW(STATUS_NEW, ChangeStatus.NEW), @@ -357,17 +343,15 @@ public final class Change { /** * Change is a draft change that only consists of draft patchsets. * - *

- * This is a change that is not meant to be submitted or reviewed yet. If - * the uploader publishes the change, it becomes a NEW change. - * Publishing is a one-way action, a change cannot return to DRAFT status. - * Draft changes are only visible to the uploader and those explicitly - * added as reviewers. + *

This is a change that is not meant to be submitted or reviewed yet. If the uploader + * publishes the change, it becomes a NEW change. Publishing is a one-way action, a change + * cannot return to DRAFT status. Draft changes are only visible to the uploader and those + * explicitly added as reviewers. + * + *

Changes in the DRAFT state can be moved to: * - *

- * Changes in the DRAFT state can be moved to: *

    - *
  • {@link #NEW} - when the change is published, it becomes a new change; + *
  • {@link #NEW} - when the change is published, it becomes a new change; *
*/ DRAFT(STATUS_DRAFT, ChangeStatus.DRAFT), @@ -375,20 +359,17 @@ public final class Change { /** * Change is closed, and submitted to its destination branch. * - *

- * Once a change has been merged, it cannot be further modified by adding a - * replacement patch set. Draft comments however may be published, - * supporting a post-submit review. + *

Once a change has been merged, it cannot be further modified by adding a replacement patch + * set. Draft comments however may be published, supporting a post-submit review. */ MERGED(STATUS_MERGED, ChangeStatus.MERGED), /** * Change is closed, but was not submitted to its destination branch. * - *

- * Once a change has been abandoned, it cannot be further modified by adding - * a replacement patch set, and it cannot be merged. Draft comments however - * may be published, permitting reviewers to send constructive feedback. + *

Once a change has been abandoned, it cannot be further modified by adding a replacement + * patch set, and it cannot be merged. Draft comments however may be published, permitting + * reviewers to send constructive feedback. */ ABANDONED('A', ChangeStatus.ABANDONED); @@ -401,9 +382,11 @@ public final class Change { ok &= s.name().equals(s.changeStatus.name()); } if (!ok) { - throw new IllegalStateException("Mismatched status mapping: " - + Arrays.asList(Status.values()) + " != " - + Arrays.asList(ChangeStatus.values())); + throw new IllegalStateException( + "Mismatched status mapping: " + + Arrays.asList(Status.values()) + + " != " + + Arrays.asList(ChangeStatus.values())); } } @@ -471,8 +454,8 @@ public final class Change { /** * When was a meaningful modification last made to this record's data - *

- * Note, this update timestamp includes its children. + * + *

Note, this update timestamp includes its children. */ @Column(id = 5) protected Timestamp lastUpdatedOn; @@ -511,36 +494,36 @@ public final class Change { /** * First line of first patch set's commit message. - *

- * Unlike {@link #subject}, this string does not change if future patch sets - * change the first line. + * + *

Unlike {@link #subject}, this string does not change if future patch sets change the first + * line. */ @Column(id = 17, notNull = false) protected String originalSubject; /** - * Unique id for the changes submitted together assigned during merging. - * Only set if the status is MERGED. + * Unique id for the changes submitted together assigned during merging. Only set if the status is + * MERGED. */ @Column(id = 18, notNull = false) protected String submissionId; - /** - * Allows assigning a change to a user. - */ + /** Allows assigning a change to a user. */ @Column(id = 19, notNull = false) protected Account.Id assignee; - /** @see com.google.gerrit.server.notedb.NoteDbChangeState */ @Column(id = 101, notNull = false, length = Integer.MAX_VALUE) protected String noteDbState; - protected Change() { - } + protected Change() {} - public Change(Change.Key newKey, Change.Id newId, Account.Id ownedBy, - Branch.NameKey forBranch, Timestamp ts) { + public Change( + Change.Key newKey, + Change.Id newId, + Account.Id ownedBy, + Branch.NameKey forBranch, + Timestamp ts) { changeKey = newKey; changeId = newId; createdOn = ts; @@ -672,11 +655,9 @@ public final class Change { } } - public void setCurrentPatchSet(PatchSet.Id psId, String subject, - String originalSubject) { + public void setCurrentPatchSet(PatchSet.Id psId, String subject, String originalSubject) { if (!psId.getParentKey().equals(changeId)) { - throw new IllegalArgumentException( - "patch set ID " + psId + " is not for change " + changeId); + throw new IllegalArgumentException("patch set ID " + psId + " is not for change " + changeId); } currentPatchSetId = psId.get(); this.subject = subject; @@ -724,10 +705,17 @@ public final class Change { @Override public String toString() { return new StringBuilder(getClass().getSimpleName()) - .append('{').append(changeId) - .append(" (").append(changeKey).append("), ") - .append("dest=").append(dest).append(", ") - .append("status=").append(status).append('}') + .append('{') + .append(changeId) + .append(" (") + .append(changeKey) + .append("), ") + .append("dest=") + .append(dest) + .append(", ") + .append("status=") + .append(status) + .append('}') .toString(); } } diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/ChangeMessage.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/ChangeMessage.java index db44d3331f..caf20c77b0 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/ChangeMessage.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/ChangeMessage.java @@ -16,7 +16,6 @@ package com.google.gerrit.reviewdb.client; import com.google.gwtorm.client.Column; import com.google.gwtorm.client.StringKey; - import java.sql.Timestamp; import java.util.Objects; @@ -79,18 +78,14 @@ public final class ChangeMessage { @Column(id = 6, notNull = false) protected String tag; - /** - * Real user that added this message on behalf of the user recorded in {@link - * #author}. - */ + /** Real user that added this message on behalf of the user recorded in {@link #author}. */ @Column(id = 7, notNull = false) protected Account.Id realAuthor; - protected ChangeMessage() { - } + protected ChangeMessage() {} - public ChangeMessage(final ChangeMessage.Key k, final Account.Id a, - final Timestamp wo, final PatchSet.Id psid) { + public ChangeMessage( + final ChangeMessage.Key k, final Account.Id a, final Timestamp wo, final PatchSet.Id psid) { key = k; author = a; writtenOn = wo; @@ -157,13 +152,20 @@ public final class ChangeMessage { @Override public String toString() { return "ChangeMessage{" - + "key=" + key - + ", author=" + author - + ", realAuthor=" + realAuthor - + ", writtenOn=" + writtenOn - + ", patchset=" + patchset - + ", tag=" + tag - + ", message=[" + message + + "key=" + + key + + ", author=" + + author + + ", realAuthor=" + + realAuthor + + ", writtenOn=" + + writtenOn + + ", patchset=" + + patchset + + ", tag=" + + tag + + ", message=[" + + message + "]}"; } } diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Comment.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Comment.java index 15ec625e5b..b2c72d9568 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Comment.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Comment.java @@ -18,36 +18,33 @@ import java.sql.Timestamp; import java.util.Objects; /** - * This class represents inline comments in NoteDb. This means it determines the - * JSON format for inline comments in the revision notes that NoteDb uses to - * persist inline comments. - *

- * Changing fields in this class changes the storage format of inline comments - * in NoteDb and may require a corresponding data migration (adding new optional - * fields is generally okay). - *

- * {@link PatchLineComment} also represents inline comments, but in ReviewDb. - * There are a few notable differences: + * This class represents inline comments in NoteDb. This means it determines the JSON format for + * inline comments in the revision notes that NoteDb uses to persist inline comments. + * + *

Changing fields in this class changes the storage format of inline comments in NoteDb and may + * require a corresponding data migration (adding new optional fields is generally okay). + * + *

{@link PatchLineComment} also represents inline comments, but in ReviewDb. There are a few + * notable differences: + * *

    - *
  • PatchLineComment knows the comment status (published or draft). For - * comments in NoteDb the status is determined by the branch in which they are - * stored (published comments are stored in the change meta ref; draft comments - * are store in refs/draft-comments branches in All-Users). Hence Comment - * doesn't need to contain the status, but the status is implicitly known by - * where the comments are read from. - *
  • PatchLineComment knows the change ID. For comments in NoteDb, the change - * ID is determined by the branch in which they are stored (the ref name - * contains the change ID). Hence Comment doesn't need to contain the change ID, - * but the change ID is implicitly known by where the comments are read from. + *
  • PatchLineComment knows the comment status (published or draft). For comments in NoteDb the + * status is determined by the branch in which they are stored (published comments are stored + * in the change meta ref; draft comments are store in refs/draft-comments branches in + * All-Users). Hence Comment doesn't need to contain the status, but the status is implicitly + * known by where the comments are read from. + *
  • PatchLineComment knows the change ID. For comments in NoteDb, the change ID is determined + * by the branch in which they are stored (the ref name contains the change ID). Hence Comment + * doesn't need to contain the change ID, but the change ID is implicitly known by where the + * comments are read from. *
- *

- * For all utility classes and middle layer functionality using Comment over - * PatchLineComment is preferred, as PatchLineComment will go away together with - * ReviewDb. This means Comment should be used everywhere and only for storing - * inline comment in ReviewDb a conversion to PatchLineComment is done. - * Converting Comments to PatchLineComments and vice verse is done by - * CommentsUtil#toPatchLineComments(Change.Id, PatchLineComment.Status, Iterable) - * and CommentsUtil#toComments(String, Iterable). + * + *

For all utility classes and middle layer functionality using Comment over PatchLineComment is + * preferred, as PatchLineComment will go away together with ReviewDb. This means Comment should be + * used everywhere and only for storing inline comment in ReviewDb a conversion to PatchLineComment + * is done. Converting Comments to PatchLineComments and vice verse is done by + * CommentsUtil#toPatchLineComments(Change.Id, PatchLineComment.Status, Iterable) and + * CommentsUtil#toComments(String, Iterable). */ public class Comment { public static class Key { @@ -69,9 +66,14 @@ public class Comment { public String toString() { return new StringBuilder() .append("Comment.Key{") - .append("uuid=").append(uuid).append(',') - .append("filename=").append(filename).append(',') - .append("patchSetId=").append(patchSetId) + .append("uuid=") + .append(uuid) + .append(',') + .append("filename=") + .append(filename) + .append(',') + .append("patchSetId=") + .append(patchSetId) .append('}') .toString(); } @@ -121,7 +123,8 @@ public class Comment { public String toString() { return new StringBuilder() .append("Comment.Identity{") - .append("id=").append(id) + .append("id=") + .append(id) .append('}') .toString(); } @@ -169,10 +172,17 @@ public class Comment { public String toString() { return new StringBuilder() .append("Comment.Range{") - .append("startLine=").append(startLine).append(',') - .append("startChar=").append(startChar).append(',') - .append("endLine=").append(endLine).append(',') - .append("endChar=").append(endChar) + .append("startLine=") + .append(startLine) + .append(',') + .append("startChar=") + .append(startChar) + .append(',') + .append("endLine=") + .append(endLine) + .append(',') + .append("endChar=") + .append(endChar) .append('}') .toString(); } @@ -193,8 +203,14 @@ public class Comment { public boolean unresolved; public Comment(Comment c) { - this(new Key(c.key), c.author.getId(), new Timestamp(c.writtenOn.getTime()), - c.side, c.message, c.serverId, c.unresolved); + this( + new Key(c.key), + c.author.getId(), + new Timestamp(c.writtenOn.getTime()), + c.side, + c.message, + c.serverId, + c.unresolved); this.lineNbr = c.lineNbr; this.realAuthor = c.realAuthor; this.range = c.range != null ? new Range(c.range) : null; @@ -203,8 +219,14 @@ public class Comment { this.unresolved = c.unresolved; } - public Comment(Key key, Account.Id author, Timestamp writtenOn, - short side, String message, String serverId, boolean unresolved) { + public Comment( + Key key, + Account.Id author, + Timestamp writtenOn, + short side, + String message, + String serverId, + boolean unresolved) { this.key = key; this.author = new Comment.Identity(author); this.realAuthor = this.author; @@ -215,13 +237,9 @@ public class Comment { this.unresolved = unresolved; } - public void setLineNbrAndRange(Integer lineNbr, - com.google.gerrit.extensions.client.Comment.Range range) { - this.lineNbr = lineNbr != null - ? lineNbr - : range != null - ? range.endLine - : 0; + public void setLineNbrAndRange( + Integer lineNbr, com.google.gerrit.extensions.client.Comment.Range range) { + this.lineNbr = lineNbr != null ? lineNbr : range != null ? range.endLine : 0; if (range != null) { this.range = new Comment.Range(range); } @@ -236,9 +254,7 @@ public class Comment { } public void setRealAuthor(Account.Id id) { - realAuthor = id != null && id.get() != author.id - ? new Comment.Identity(id) - : null; + realAuthor = id != null && id.get() != author.id ? new Comment.Identity(id) : null; } public Identity getRealAuthor() { @@ -262,21 +278,41 @@ public class Comment { public String toString() { return new StringBuilder() .append("Comment{") - .append("key=").append(key).append(',') - .append("lineNbr=").append(lineNbr).append(',') - .append("author=").append(author.getId().get()).append(',') + .append("key=") + .append(key) + .append(',') + .append("lineNbr=") + .append(lineNbr) + .append(',') + .append("author=") + .append(author.getId().get()) + .append(',') .append("realAuthor=") - .append(realAuthor != null ? realAuthor.getId().get() : "") - .append(',') - .append("writtenOn=").append(writtenOn.toString()).append(',') - .append("side=").append(side).append(',') - .append("message=").append(Objects.toString(message, "")).append(',') + .append(realAuthor != null ? realAuthor.getId().get() : "") + .append(',') + .append("writtenOn=") + .append(writtenOn.toString()) + .append(',') + .append("side=") + .append(side) + .append(',') + .append("message=") + .append(Objects.toString(message, "")) + .append(',') .append("parentUuid=") - .append(Objects.toString(parentUuid, "")).append(',') - .append("range=").append(Objects.toString(range, "")).append(',') - .append("revId=").append(revId != null ? revId : "").append(',') - .append("tag=").append(Objects.toString(tag, "")).append(',') - .append("unresolved=").append(unresolved) + .append(Objects.toString(parentUuid, "")) + .append(',') + .append("range=") + .append(Objects.toString(range, "")) + .append(',') + .append("revId=") + .append(revId != null ? revId : "") + .append(',') + .append("tag=") + .append(Objects.toString(tag, "")) + .append(',') + .append("unresolved=") + .append(unresolved) .append('}') .toString(); } diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/CommentRange.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/CommentRange.java index 0cc3e589ea..b9da8d5256 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/CommentRange.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/CommentRange.java @@ -30,8 +30,7 @@ public class CommentRange { @Column(id = 4) protected int endCharacter; - protected CommentRange() { - } + protected CommentRange() {} public CommentRange(int sl, int sc, int el, int ec) { startLine = sl; @@ -80,8 +79,10 @@ public class CommentRange { public boolean equals(Object obj) { if (obj instanceof CommentRange) { CommentRange other = (CommentRange) obj; - return startLine == other.startLine && startCharacter == other.startCharacter && - endLine == other.endLine && endCharacter == other.endCharacter; + return startLine == other.startLine + && startCharacter == other.startCharacter + && endLine == other.endLine + && endCharacter == other.endCharacter; } return false; } @@ -97,7 +98,14 @@ public class CommentRange { @Override public String toString() { - return "Range[startLine=" + startLine + ", startCharacter=" + startCharacter - + ", endLine=" + endLine + ", endCharacter=" + endCharacter + "]"; + return "Range[startLine=" + + startLine + + ", startCharacter=" + + startCharacter + + ", endLine=" + + endLine + + ", endCharacter=" + + endCharacter + + "]"; } } diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/CoreDownloadSchemes.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/CoreDownloadSchemes.java index 9303373e48..2ca89c8bb4 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/CoreDownloadSchemes.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/CoreDownloadSchemes.java @@ -14,10 +14,7 @@ package com.google.gerrit.reviewdb.client; -/** - * Download scheme string constants supported by the download-commands core - * plugin. - */ +/** Download scheme string constants supported by the download-commands core plugin. */ public class CoreDownloadSchemes { public static final String ANON_GIT = "git"; public static final String ANON_HTTP = "anonymous http"; @@ -25,6 +22,5 @@ public class CoreDownloadSchemes { public static final String SSH = "ssh"; public static final String REPO_DOWNLOAD = "repo"; - private CoreDownloadSchemes() { - } + private CoreDownloadSchemes() {} } diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/CurrentSchemaVersion.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/CurrentSchemaVersion.java index cba5d41968..9d6118693f 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/CurrentSchemaVersion.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/CurrentSchemaVersion.java @@ -19,8 +19,7 @@ import com.google.gwtorm.client.StringKey; /** Current version of the database schema, to facilitate live upgrades. */ public final class CurrentSchemaVersion { - public static final class Key extends - StringKey> { + public static final class Key extends StringKey> { private static final long serialVersionUID = 1L; private static final String VALUE = "X"; @@ -28,8 +27,7 @@ public final class CurrentSchemaVersion { @Column(id = 1, length = 1) public String one = VALUE; - public Key() { - } + public Key() {} @Override public String get() { @@ -56,6 +54,5 @@ public final class CurrentSchemaVersion { @Column(id = 2) public transient int versionNbr; - public CurrentSchemaVersion() { - } + public CurrentSchemaVersion() {} } diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/FixReplacement.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/FixReplacement.java index 19d1b5170f..66630e43c3 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/FixReplacement.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/FixReplacement.java @@ -27,10 +27,15 @@ public class FixReplacement { @Override public String toString() { - return "FixReplacement{" + - "path='" + path + '\'' + - ", range=" + range + - ", replacement='" + replacement + '\'' + - '}'; + return "FixReplacement{" + + "path='" + + path + + '\'' + + ", range=" + + range + + ", replacement='" + + replacement + + '\'' + + '}'; } } diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/FixSuggestion.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/FixSuggestion.java index 7af647af22..d766a3a659 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/FixSuggestion.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/FixSuggestion.java @@ -21,8 +21,7 @@ public class FixSuggestion { public String description; public List replacements; - public FixSuggestion(String fixId, String description, - List replacements) { + public FixSuggestion(String fixId, String description, List replacements) { this.fixId = fixId; this.description = description; this.replacements = replacements; @@ -30,10 +29,15 @@ public class FixSuggestion { @Override public String toString() { - return "FixSuggestion{" + - "fixId='" + fixId + '\'' + - ", description='" + description + '\'' + - ", replacements=" + replacements + - '}'; + return "FixSuggestion{" + + "fixId='" + + fixId + + '\'' + + ", description='" + + description + + '\'' + + ", replacements=" + + replacements + + '}'; } } diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/LabelId.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/LabelId.java index 5239447ebb..c38078eb84 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/LabelId.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/LabelId.java @@ -29,8 +29,7 @@ public class LabelId extends StringKey> { @Column(id = 1) public String id; - public LabelId() { - } + public LabelId() {} public LabelId(final String n) { id = n; diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Patch.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Patch.java index 309bda4286..269b6d47a3 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Patch.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Patch.java @@ -26,13 +26,11 @@ public final class Patch { public static final String MERGE_LIST = "/MERGE_LIST"; /** - * Checks if the given path represents a magic file. A magic file is a - * generated file that is automatically included into changes. It does not - * exist in the commit of the patch set. + * Checks if the given path represents a magic file. A magic file is a generated file that is + * automatically included into changes. It does not exist in the commit of the patch set. * * @param path the file path - * @return {@code true} if the path represents a magic file, otherwise - * {@code false}. + * @return {@code true} if the path represents a magic file, otherwise {@code false}. */ public static boolean isMagic(String path) { return COMMIT_MSG.equals(path) || MERGE_LIST.equals(path); @@ -133,32 +131,26 @@ public final class Patch { /** * A textual difference between two versions. * - *

- * A UNIFIED patch can be rendered in multiple ways. Most commonly, it is - * rendered as a side by side display using two columns, left column for the - * old version, right column for the new version. A UNIFIED patch can also - * be formatted in a number of standard "patch script" styles, but typically - * is formatted in the POSIX standard unified diff format. + *

A UNIFIED patch can be rendered in multiple ways. Most commonly, it is rendered as a side + * by side display using two columns, left column for the old version, right column for the new + * version. A UNIFIED patch can also be formatted in a number of standard "patch script" styles, + * but typically is formatted in the POSIX standard unified diff format. * - *

- * Usually Gerrit renders a UNIFIED patch in a PatchScreen.SideBySide view, - * presenting the file in two columns. If the user chooses, a - * PatchScreen.Unified is also a valid display method. - * */ + *

Usually Gerrit renders a UNIFIED patch in a PatchScreen.SideBySide view, presenting the + * file in two columns. If the user chooses, a PatchScreen.Unified is also a valid display + * method. + */ UNIFIED('U'), /** * Difference of two (or more) binary contents. * - *

- * A BINARY patch cannot be viewed in a text display, as it represents a - * change in binary content at the associated path, for example, an image - * file has been replaced with a different image. + *

A BINARY patch cannot be viewed in a text display, as it represents a change in binary + * content at the associated path, for example, an image file has been replaced with a different + * image. * - *

- * Gerrit can only render a BINARY file in a PatchScreen.Unified view, as - * the only information it can display is the old and new file content - * hashes. + *

Gerrit can only render a BINARY file in a PatchScreen.Unified view, as the only + * information it can display is the old and new file content hashes. */ BINARY('B'); @@ -203,17 +195,13 @@ public final class Patch { /** Number of lines deleted from the file. */ protected int deletions; - /** - * Original if {@link #changeType} is {@link ChangeType#COPIED} or - * {@link ChangeType#RENAMED}. - */ + /** Original if {@link #changeType} is {@link ChangeType#COPIED} or {@link ChangeType#RENAMED}. */ protected String sourceFileName; /** True if this patch has been reviewed by the current logged in user */ private boolean reviewedByCurrentUser; - protected Patch() { - } + protected Patch() {} public Patch(final Patch.Key newId) { key = newId; diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchLineComment.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchLineComment.java index d5edb759b3..90552b8ccb 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchLineComment.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchLineComment.java @@ -17,16 +17,15 @@ package com.google.gerrit.reviewdb.client; import com.google.gerrit.extensions.client.Comment.Range; import com.google.gwtorm.client.Column; import com.google.gwtorm.client.StringKey; - import java.sql.Timestamp; import java.util.Objects; /** * A comment left by a user on a specific line of a {@link Patch}. * - * This class represents an inline comment in ReviewDb. It should only be used - * for writing/reading inline comments to/from ReviewDb. For all other purposes - * inline comments should be represented by {@link Comment}. + *

This class represents an inline comment in ReviewDb. It should only be used for + * writing/reading inline comments to/from ReviewDb. For all other purposes inline comments should + * be represented by {@link Comment}. * * @see Comment */ @@ -35,8 +34,8 @@ public final class PatchLineComment { private static final long serialVersionUID = 1L; public static Key from(Change.Id changeId, Comment.Key key) { - return new Key(new Patch.Key(new PatchSet.Id(changeId, key.patchSetId), - key.filename), key.uuid); + return new Key( + new Patch.Key(new PatchSet.Id(changeId, key.patchSetId), key.filename), key.uuid); } @Column(id = 1, name = Column.NONE) @@ -70,9 +69,8 @@ public final class PatchLineComment { } public Comment.Key asCommentKey() { - return new Comment.Key(get(), - getParentKey().getFileName(), - getParentKey().getParentKey().get()); + return new Comment.Key( + get(), getParentKey().getFileName(), getParentKey().getParentKey().get()); } } @@ -104,21 +102,19 @@ public final class PatchLineComment { } } - public static PatchLineComment from(Change.Id changeId, - PatchLineComment.Status status, Comment c) { - PatchLineComment.Key key = new PatchLineComment.Key( - new Patch.Key(new PatchSet.Id(changeId, c.key.patchSetId), - c.key.filename), - c.key.uuid); + public static PatchLineComment from( + Change.Id changeId, PatchLineComment.Status status, Comment c) { + PatchLineComment.Key key = + new PatchLineComment.Key( + new Patch.Key(new PatchSet.Id(changeId, c.key.patchSetId), c.key.filename), c.key.uuid); - PatchLineComment plc = new PatchLineComment(key, c.lineNbr, - c.author.getId(), c.parentUuid, c.writtenOn); + PatchLineComment plc = + new PatchLineComment(key, c.lineNbr, c.author.getId(), c.parentUuid, c.writtenOn); plc.setSide(c.side); plc.setMessage(c.message); if (c.range != null) { Comment.Range r = c.range; - plc.setRange( - new CommentRange(r.startLine, r.startChar, r.endLine, r.endChar)); + plc.setRange(new CommentRange(r.startLine, r.startChar, r.endLine, r.endChar)); } plc.setTag(c.tag); plc.setRevId(new RevId(c.revId)); @@ -155,10 +151,7 @@ public final class PatchLineComment { @Column(id = 7, notNull = false, length = Integer.MAX_VALUE) protected String message; - /** - * The parent of this comment, or null if this is the first comment on this - * line - */ + /** The parent of this comment, or null if this is the first comment on this line */ @Column(id = 8, length = 40, notNull = false) protected String parentUuid; @@ -168,10 +161,7 @@ public final class PatchLineComment { @Column(id = 10, notNull = false) protected String tag; - /** - * Real user that added this comment on behalf of the user recorded in {@link - * #author}. - */ + /** Real user that added this comment on behalf of the user recorded in {@link #author}. */ @Column(id = 11, notNull = false) protected Account.Id realAuthor; @@ -182,17 +172,15 @@ public final class PatchLineComment { /** * The RevId for the commit to which this comment is referring. * - * Note that this field is not stored in the database. It is just provided - * for users of this class to avoid a lookup when they don't have easy access - * to a ReviewDb. + *

Note that this field is not stored in the database. It is just provided for users of this + * class to avoid a lookup when they don't have easy access to a ReviewDb. */ protected RevId revId; - protected PatchLineComment() { - } + protected PatchLineComment() {} - public PatchLineComment(PatchLineComment.Key id, int line, Account.Id a, - String parentUuid, Timestamp when) { + public PatchLineComment( + PatchLineComment.Key id, int line, Account.Id a, String parentUuid, Timestamp when) { key = id; lineNbr = line; author = a; @@ -213,11 +201,12 @@ public final class PatchLineComment { parentUuid = o.parentUuid; revId = o.revId; if (o.range != null) { - range = new CommentRange( - o.range.getStartLine(), - o.range.getStartCharacter(), - o.range.getEndLine(), - o.range.getEndCharacter()); + range = + new CommentRange( + o.range.getStartLine(), + o.range.getStartCharacter(), + o.range.getEndLine(), + o.range.getEndCharacter()); } } @@ -292,9 +281,10 @@ public final class PatchLineComment { public void setRange(Range r) { if (r != null) { - range = new CommentRange( - r.startLine, r.startCharacter, - r.endLine, r.endCharacter); + range = + new CommentRange( + r.startLine, r.startCharacter, + r.endLine, r.endCharacter); } else { range = null; } @@ -333,8 +323,8 @@ public final class PatchLineComment { } public Comment asComment(String serverId) { - Comment c = new Comment(key.asCommentKey(), author, writtenOn, side, - message, serverId, unresolved); + Comment c = + new Comment(key.asCommentKey(), author, writtenOn, side, message, serverId, unresolved); c.setRevId(revId); c.setRange(range); c.lineNbr = lineNbr; @@ -376,19 +366,14 @@ public final class PatchLineComment { builder.append("key=").append(key).append(','); builder.append("lineNbr=").append(lineNbr).append(','); builder.append("author=").append(author.get()).append(','); - builder.append("realAuthor=") - .append(realAuthor != null ? realAuthor.get() : "").append(','); + builder.append("realAuthor=").append(realAuthor != null ? realAuthor.get() : "").append(','); builder.append("writtenOn=").append(writtenOn.toString()).append(','); builder.append("status=").append(status).append(','); builder.append("side=").append(side).append(','); - builder.append("message=").append(Objects.toString(message, "")) - .append(','); - builder.append("parentUuid=").append(Objects.toString(parentUuid, "")) - .append(','); - builder.append("range=").append(Objects.toString(range, "")) - .append(','); - builder.append("revId=").append(revId != null ? revId.get() : "") - .append(','); + builder.append("message=").append(Objects.toString(message, "")).append(','); + builder.append("parentUuid=").append(Objects.toString(parentUuid, "")).append(','); + builder.append("range=").append(Objects.toString(range, "")).append(','); + builder.append("revId=").append(revId != null ? revId.get() : "").append(','); builder.append("tag=").append(Objects.toString(tag, "")).append(','); builder.append("unresolved=").append(unresolved); builder.append('}'); diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchSet.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchSet.java index cf5c5ad7c1..138da5aa5f 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchSet.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchSet.java @@ -16,7 +16,6 @@ package com.google.gerrit.reviewdb.client; import com.google.gwtorm.client.Column; import com.google.gwtorm.client.IntKey; - import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collections; @@ -33,7 +32,7 @@ public final class PatchSet { * Is the reference name a change reference? * * @deprecated use isChangeRef instead. - **/ + */ @Deprecated public static boolean isRef(String name) { return isChangeRef(name); @@ -108,9 +107,7 @@ public final class PatchSet { } public String toRefName() { - return changeId.refPrefixBuilder() - .append(patchSetId) - .toString(); + return changeId.refPrefixBuilder().append(patchSetId).toString(); } /** Parse a PatchSet.Id out of a string representation. */ @@ -154,9 +151,7 @@ public final class PatchSet { } public static String toId(int number) { - return number == 0 - ? "edit" - : String.valueOf(number); + return number == 0 ? "edit" : String.valueOf(number); } } @@ -178,12 +173,12 @@ public final class PatchSet { /** * Opaque group identifier, usually assigned during creation. - *

- * This field is actually a comma-separated list of values, as in rare cases - * involving merge commits a patch set may belong to multiple groups. - *

- * Changes on the same branch having patch sets with intersecting groups are - * considered related, as in the "Related Changes" tab. + * + *

This field is actually a comma-separated list of values, as in rare cases involving merge + * commits a patch set may belong to multiple groups. + * + *

Changes on the same branch having patch sets with intersecting groups are considered + * related, as in the "Related Changes" tab. */ @Column(id = 6, notNull = false, length = Integer.MAX_VALUE) protected String groups; @@ -196,16 +191,14 @@ public final class PatchSet { /** * Optional user-supplied description for this patch set. - *

- * When this field is null, the description was never set on the patch set. - * When this field is an empty string, the description was set and later - * cleared. + * + *

When this field is null, the description was never set on the patch set. When this field is + * an empty string, the description was set and later cleared. */ @Column(id = 9, notNull = false, length = Integer.MAX_VALUE) protected String description; - protected PatchSet() { - } + protected PatchSet() {} public PatchSet(final PatchSet.Id k) { id = k; diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchSetApproval.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchSetApproval.java index 30f2e1daff..ef2732bc58 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchSetApproval.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchSetApproval.java @@ -16,7 +16,6 @@ package com.google.gerrit.reviewdb.client; import com.google.gwtorm.client.Column; import com.google.gwtorm.client.CompoundKey; - import java.sql.Timestamp; import java.util.Date; import java.util.Objects; @@ -41,8 +40,7 @@ public final class PatchSetApproval { categoryId = new LabelId(); } - public Key(final PatchSet.Id ps, final Account.Id a, - final LabelId c) { + public Key(final PatchSet.Id ps, final Account.Id a, final LabelId c) { this.patchSetId = ps; this.accountId = a; this.categoryId = c; @@ -72,17 +70,19 @@ public final class PatchSetApproval { /** * Value assigned by the user. - *

- * The precise meaning of "value" is up to each category. - *

- * In general: + * + *

The precise meaning of "value" is up to each category. + * + *

In general: + * *

    - *
  • < 0: The approval is rejected/revoked.
  • - *
  • = 0: No indication either way is provided.
  • - *
  • > 0: The approval is approved/positive.
  • + *
  • < 0: The approval is rejected/revoked. + *
  • = 0: No indication either way is provided. + *
  • > 0: The approval is approved/positive. *
- * and in the negative and positive direction a magnitude can be assumed.The - * further from 0 the more assertive the approval. + * + * and in the negative and positive direction a magnitude can be assumed.The further from 0 the + * more assertive the approval. */ @Column(id = 2) protected short value; @@ -93,10 +93,7 @@ public final class PatchSetApproval { @Column(id = 6, notNull = false) protected String tag; - /** - * Real user that made this approval on behalf of the user recorded in {@link - * Key#accountId}. - */ + /** Real user that made this approval on behalf of the user recorded in {@link Key#accountId}. */ @Column(id = 7, notNull = false) protected Account.Id realAccountId; @@ -106,8 +103,7 @@ public final class PatchSetApproval { // DELETED: id = 4 (changeOpen) // DELETED: id = 5 (changeSortKey) - protected PatchSetApproval() { - } + protected PatchSetApproval() {} public PatchSetApproval(PatchSetApproval.Key k, short v, Date ts) { key = k; @@ -116,8 +112,7 @@ public final class PatchSetApproval { } public PatchSetApproval(final PatchSet.Id psId, final PatchSetApproval src) { - key = - new PatchSetApproval.Key(psId, src.getAccountId(), src.getLabelId()); + key = new PatchSetApproval.Key(psId, src.getAccountId(), src.getLabelId()); value = src.getValue(); granted = src.granted; realAccountId = src.realAccountId; @@ -200,10 +195,15 @@ public final class PatchSetApproval { @Override public String toString() { - StringBuilder sb = new StringBuilder("[") - .append(key).append(": ").append(value) - .append(",tag:").append(tag) - .append(",realAccountId:").append(realAccountId); + StringBuilder sb = + new StringBuilder("[") + .append(key) + .append(": ") + .append(value) + .append(",tag:") + .append(tag) + .append(",realAccountId:") + .append(realAccountId); if (postSubmit) { sb.append(",postSubmit"); } diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchSetInfo.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchSetInfo.java index 40cb9fc52c..4970db1477 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchSetInfo.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchSetInfo.java @@ -16,10 +16,7 @@ package com.google.gerrit.reviewdb.client; import java.util.List; - -/** - * Additional data about a {@link PatchSet} not normally loaded. - */ +/** Additional data about a {@link PatchSet} not normally loaded. */ public final class PatchSetInfo { public static class ParentInfo { public RevId id; @@ -30,8 +27,7 @@ public final class PatchSetInfo { this.shortMessage = shortMessage; } - protected ParentInfo() { - } + protected ParentInfo() {} } protected PatchSet.Id key; @@ -57,8 +53,7 @@ public final class PatchSetInfo { /** Optional user-supplied description for the patch set. */ protected String description; - protected PatchSetInfo() { - } + protected PatchSetInfo() {} public PatchSetInfo(final PatchSet.Id k) { key = k; diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Project.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Project.java index 74ebb25a13..ba83c5848b 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Project.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Project.java @@ -23,15 +23,13 @@ import com.google.gwtorm.client.StringKey; /** Projects match a source code repository managed by Gerrit */ public final class Project { /** Project name key */ - public static class NameKey extends - StringKey> { + public static class NameKey extends StringKey> { private static final long serialVersionUID = 1L; @Column(id = 1) protected String name; - protected NameKey() { - } + protected NameKey() {} public NameKey(final String n) { name = n; @@ -101,8 +99,7 @@ public final class Project { protected InheritableBoolean rejectImplicitMerges; - protected Project() { - } + protected Project() {} public Project(Project.NameKey nameKey) { name = nameKey; @@ -177,8 +174,7 @@ public final class Project { return createNewChangeForAllNotInTarget; } - public void setCreateNewChangeForAllNotInTarget( - InheritableBoolean useAllNotInTarget) { + public void setCreateNewChangeForAllNotInTarget(InheritableBoolean useAllNotInTarget) { this.createNewChangeForAllNotInTarget = useAllNotInTarget; } @@ -261,9 +257,9 @@ public final class Project { /** * Returns the name key of the parent project. * - * @return name key of the parent project, {@code null} if this project - * is the wild project, {@code null} or the name key of the wild - * project if this project is a direct child of the wild project + * @return name key of the parent project, {@code null} if this project is the wild project, + * {@code null} or the name key of the wild project if this project is a direct child of the + * wild project */ public Project.NameKey getParent() { return parent; @@ -273,8 +269,7 @@ public final class Project { * Returns the name key of the parent project. * * @param allProjectsName name key of the wild project - * @return name key of the parent project, {@code null} if this project - * is the wild project + * @return name key of the parent project, {@code null} if this project is the wild project */ public Project.NameKey getParent(final Project.NameKey allProjectsName) { if (parent != null) { diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/RefNames.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/RefNames.java index c7c870eb85..176d6a98d7 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/RefNames.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/RefNames.java @@ -57,13 +57,11 @@ public class RefNames { /** * Prefix applied to merge commit base nodes. - *

- * References in this directory should take the form - * {@code refs/cache-automerge/xx/yyyy...} where xx is - * the first two digits of the merge commit's object - * name, and yyyyy... is the remaining 38. The reference - * should point to a treeish that is the automatic merge - * result of the merge commit's parents. + * + *

References in this directory should take the form {@code refs/cache-automerge/xx/yyyy...} + * where xx is the first two digits of the merge commit's object name, and yyyyy... is the + * remaining 38. The reference should point to a treeish that is the automatic merge result of the + * merge commit's parents. */ public static final String REFS_CACHE_AUTOMERGE = "refs/cache-automerge/"; @@ -76,8 +74,7 @@ public class RefNames { public static final String EDIT_PREFIX = "edit-"; public static String fullName(String ref) { - return (ref.startsWith(REFS) || ref.equals(HEAD)) ? - ref : REFS_HEADS + ref; + return (ref.startsWith(REFS) || ref.equals(HEAD)) ? ref : REFS_HEADS + ref; } public static final String shortName(String ref) { @@ -112,8 +109,7 @@ public class RefNames { return r.toString(); } - public static String refsDraftComments(Change.Id changeId, - Account.Id accountId) { + public static String refsDraftComments(Change.Id changeId, Account.Id accountId) { StringBuilder r = buildRefsPrefix(REFS_DRAFT_COMMENTS, changeId.get()); r.append(accountId.get()); return r.toString(); @@ -123,8 +119,7 @@ public class RefNames { return buildRefsPrefix(REFS_DRAFT_COMMENTS, changeId.get()).toString(); } - public static String refsStarredChanges(Change.Id changeId, - Account.Id accountId) { + public static String refsStarredChanges(Change.Id changeId, Account.Id accountId) { StringBuilder r = buildRefsPrefix(REFS_STARRED_CHANGES, changeId.get()); r.append(accountId.get()); return r.toString(); @@ -143,10 +138,7 @@ public class RefNames { } public static String refsCacheAutomerge(String hash) { - return REFS_CACHE_AUTOMERGE - + hash.substring(0, 2) - + '/' - + hash.substring(2); + return REFS_CACHE_AUTOMERGE + hash.substring(0, 2) + '/' + hash.substring(2); } public static String shard(int id) { @@ -173,14 +165,13 @@ public class RefNames { * @param psId patch set number * @return reference for this change edit */ - public static String refsEdit(Account.Id accountId, Change.Id changeId, - PatchSet.Id psId) { + public static String refsEdit(Account.Id accountId, Change.Id changeId, PatchSet.Id psId) { return refsEditPrefix(accountId, changeId) + psId.get(); } /** - * Returns reference prefix for this change edit with sharded user and - * change number: refs/users/UU/UUUU/edit-CCCC/. + * Returns reference prefix for this change edit with sharded user and change number: + * refs/users/UU/UUUU/edit-CCCC/. * * @param accountId account id * @param changeId change number @@ -195,8 +186,7 @@ public class RefNames { } public static boolean isRefsEdit(String ref) { - return ref != null && ref.startsWith(REFS_USERS) - && ref.contains(EDIT_PREFIX); + return ref != null && ref.startsWith(REFS_USERS) && ref.contains(EDIT_PREFIX); } public static boolean isRefsUsers(String ref) { @@ -265,6 +255,5 @@ public class RefNames { return Integer.valueOf(name.substring(i, name.length())); } - private RefNames() { - } + private RefNames() {} } diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/RevId.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/RevId.java index 42f3017f09..d04f8e616a 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/RevId.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/RevId.java @@ -23,8 +23,7 @@ public final class RevId { @Column(id = 1, length = LEN) protected String id; - protected RevId() { - } + protected RevId() {} public RevId(final String str) { id = str; @@ -41,8 +40,8 @@ public final class RevId { } /** - * @return if {@link #isComplete()}, {@code this}; otherwise a new RevId - * with 'z' appended on the end. + * @return if {@link #isComplete()}, {@code this}; otherwise a new RevId with 'z' appended on the + * end. */ public RevId max() { if (isComplete()) { diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/RobotComment.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/RobotComment.java index f08a30f5cd..eceb0bfc8e 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/RobotComment.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/RobotComment.java @@ -26,8 +26,14 @@ public class RobotComment extends Comment { public Map properties; public List fixSuggestions; - public RobotComment(Key key, Account.Id author, Timestamp writtenOn, - short side, String message, String serverId, String robotId, + public RobotComment( + Key key, + Account.Id author, + Timestamp writtenOn, + short side, + String message, + String serverId, + String robotId, String robotRunId) { super(key, author, writtenOn, side, message, serverId, false); this.robotId = robotId; @@ -38,27 +44,55 @@ public class RobotComment extends Comment { public String toString() { return new StringBuilder() .append("RobotComment{") - .append("key=").append(key).append(',') - .append("robotId=").append(robotId).append(',') - .append("robotRunId=").append(robotRunId).append(',') - .append("lineNbr=").append(lineNbr).append(',') - .append("author=").append(author.getId().get()).append(',') + .append("key=") + .append(key) + .append(',') + .append("robotId=") + .append(robotId) + .append(',') + .append("robotRunId=") + .append(robotRunId) + .append(',') + .append("lineNbr=") + .append(lineNbr) + .append(',') + .append("author=") + .append(author.getId().get()) + .append(',') .append("realAuthor=") - .append(realAuthor != null ? realAuthor.getId().get() : "") - .append(',') - .append("writtenOn=").append(writtenOn.toString()).append(',') - .append("side=").append(side).append(',') - .append("message=").append(Objects.toString(message, "")).append(',') + .append(realAuthor != null ? realAuthor.getId().get() : "") + .append(',') + .append("writtenOn=") + .append(writtenOn.toString()) + .append(',') + .append("side=") + .append(side) + .append(',') + .append("message=") + .append(Objects.toString(message, "")) + .append(',') .append("parentUuid=") - .append(Objects.toString(parentUuid, "")).append(',') - .append("range=").append(Objects.toString(range, "")).append(',') - .append("revId=").append(revId != null ? revId : "").append(',') - .append("tag=").append(Objects.toString(tag, "")).append(',') - .append("unresolved=").append(unresolved).append(',') - .append("url=").append(url).append(',') - .append("properties=").append(properties != null ? properties : "") + .append(Objects.toString(parentUuid, "")) + .append(',') + .append("range=") + .append(Objects.toString(range, "")) + .append(',') + .append("revId=") + .append(revId != null ? revId : "") + .append(',') + .append("tag=") + .append(Objects.toString(tag, "")) + .append(',') + .append("unresolved=") + .append(unresolved) + .append(',') + .append("url=") + .append(url) + .append(',') + .append("properties=") + .append(properties != null ? properties : "") .append("fixSuggestions=") - .append(fixSuggestions != null ? fixSuggestions : "") + .append(fixSuggestions != null ? fixSuggestions : "") .append('}') .toString(); } diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/SubmoduleSubscription.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/SubmoduleSubscription.java index 32a9131356..bd00d3766c 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/SubmoduleSubscription.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/SubmoduleSubscription.java @@ -19,11 +19,11 @@ import com.google.gwtorm.client.StringKey; /** * Defining a project/branch subscription to a project/branch project. - *

- * This means a class instance represents a repo/branch subscription to a - * project/branch (the subscriber). - *

- * A subscriber operates a submodule in defined path. + * + *

This means a class instance represents a repo/branch subscription to a project/branch (the + * subscriber). + * + *

A subscriber operates a submodule in defined path. */ public final class SubmoduleSubscription { /** Subscription key */ @@ -31,8 +31,8 @@ public final class SubmoduleSubscription { private static final long serialVersionUID = 1L; /** - * Indicates the super project, aka subscriber: the project owner of the - * gitlinks to the submodules. + * Indicates the super project, aka subscriber: the project owner of the gitlinks to the + * submodules. */ @Column(id = 1) protected Branch.NameKey superProject; @@ -71,12 +71,9 @@ public final class SubmoduleSubscription { @Column(id = 2) protected Branch.NameKey submodule; - protected SubmoduleSubscription() { - } + protected SubmoduleSubscription() {} - public SubmoduleSubscription(Branch.NameKey superProject, - Branch.NameKey submodule, - String path) { + public SubmoduleSubscription(Branch.NameKey superProject, Branch.NameKey submodule, String path) { this.key = new Key(superProject, path); this.submodule = submodule; } diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/SystemConfig.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/SystemConfig.java index 8b7a661905..9abc7444c0 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/SystemConfig.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/SystemConfig.java @@ -19,8 +19,7 @@ import com.google.gwtorm.client.StringKey; /** Global configuration needed to serve web requests. */ public final class SystemConfig { - public static final class Key extends - StringKey> { + public static final class Key extends StringKey> { private static final long serialVersionUID = 1L; private static final String VALUE = "X"; @@ -28,8 +27,7 @@ public final class SystemConfig { @Column(id = 1, length = 1) protected String one = VALUE; - public Key() { - } + public Key() {} @Override public String get() { @@ -52,13 +50,10 @@ public final class SystemConfig { @Column(id = 1) protected Key singleton; - /** - * Local filesystem location of header/footer/CSS configuration files - */ + /** Local filesystem location of header/footer/CSS configuration files */ @Column(id = 3, notNull = false, length = Integer.MAX_VALUE) public transient String sitePath; - // DO NOT LOOK BELOW THIS LINE. These fields have all been deleted, // but survive to support schema upgrade code. @@ -90,6 +85,5 @@ public final class SystemConfig { @Column(id = 11, notNull = false) public AccountGroup.UUID batchUsersGroupUUID; - protected SystemConfig() { - } + protected SystemConfig() {} } diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/TrackingId.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/TrackingId.java index c664285b77..8cc97370e2 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/TrackingId.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/TrackingId.java @@ -30,8 +30,7 @@ public final class TrackingId { @Column(id = 1, length = TrackingId.TRACKING_ID_MAX_CHAR) protected String id; - protected Id() { - } + protected Id() {} public Id(final String id) { this.id = id; @@ -55,8 +54,7 @@ public final class TrackingId { @Column(id = 1, length = TrackingId.TRACKING_SYSTEM_MAX_CHAR) protected String system; - protected System() { - } + protected System() {} public System(final String s) { this.system = s; @@ -119,11 +117,9 @@ public final class TrackingId { @Column(id = 1, name = Column.NONE) protected Key key; - protected TrackingId() { - } + protected TrackingId() {} - public TrackingId(final Change.Id ch, final TrackingId.Id id, - final TrackingId.System s) { + public TrackingId(final Change.Id ch, final TrackingId.Id id, final TrackingId.System s) { key = new Key(ch, id, s); } diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountAccess.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountAccess.java index de81a909cf..b015af84dd 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountAccess.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountAccess.java @@ -35,12 +35,11 @@ public interface AccountAccess extends Access { ResultSet byFullName(String name) throws OrmException; @Query("WHERE fullName >= ? AND fullName <= ? ORDER BY fullName LIMIT ?") - ResultSet suggestByFullName(String nameA, String nameB, int limit) - throws OrmException; + ResultSet suggestByFullName(String nameA, String nameB, int limit) throws OrmException; @Query("WHERE preferredEmail >= ? AND preferredEmail <= ? ORDER BY preferredEmail LIMIT ?") - ResultSet suggestByPreferredEmail(String nameA, String nameB, - int limit) throws OrmException; + ResultSet suggestByPreferredEmail(String nameA, String nameB, int limit) + throws OrmException; @Query("LIMIT 1") ResultSet anyAccounts() throws OrmException; diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountExternalIdAccess.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountExternalIdAccess.java index b930356732..91243014e9 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountExternalIdAccess.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountExternalIdAccess.java @@ -22,8 +22,7 @@ import com.google.gwtorm.server.PrimaryKey; import com.google.gwtorm.server.Query; import com.google.gwtorm.server.ResultSet; -public interface AccountExternalIdAccess extends - Access { +public interface AccountExternalIdAccess extends Access { @Override @PrimaryKey("key") AccountExternalId get(AccountExternalId.Key key) throws OrmException; diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupAccess.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupAccess.java index 3b8277364f..c5a1caffb5 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupAccess.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupAccess.java @@ -21,8 +21,7 @@ import com.google.gwtorm.server.PrimaryKey; import com.google.gwtorm.server.Query; import com.google.gwtorm.server.ResultSet; -public interface AccountGroupAccess extends - Access { +public interface AccountGroupAccess extends Access { @Override @PrimaryKey("groupId") AccountGroup get(AccountGroup.Id id) throws OrmException; diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupByIdAccess.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupByIdAccess.java index 4fce0cd337..1634fda87b 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupByIdAccess.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupByIdAccess.java @@ -22,8 +22,7 @@ import com.google.gwtorm.server.PrimaryKey; import com.google.gwtorm.server.Query; import com.google.gwtorm.server.ResultSet; -public interface AccountGroupByIdAccess extends - Access { +public interface AccountGroupByIdAccess extends Access { @Override @PrimaryKey("key") AccountGroupById get(AccountGroupById.Key key) throws OrmException; diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupByIdAudAccess.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupByIdAudAccess.java index 480e8e460d..08f9a0a960 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupByIdAudAccess.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupByIdAudAccess.java @@ -22,18 +22,16 @@ import com.google.gwtorm.server.PrimaryKey; import com.google.gwtorm.server.Query; import com.google.gwtorm.server.ResultSet; -public interface AccountGroupByIdAudAccess extends - Access { +public interface AccountGroupByIdAudAccess + extends Access { @Override @PrimaryKey("key") - AccountGroupByIdAud get(AccountGroupByIdAud.Key key) - throws OrmException; + AccountGroupByIdAud get(AccountGroupByIdAud.Key key) throws OrmException; @Query("WHERE key.groupId = ? AND key.includeUUID = ?") - ResultSet byGroupInclude(AccountGroup.Id groupId, - AccountGroup.UUID incGroupUUID) throws OrmException; + ResultSet byGroupInclude( + AccountGroup.Id groupId, AccountGroup.UUID incGroupUUID) throws OrmException; @Query("WHERE key.groupId = ?") - ResultSet byGroup(AccountGroup.Id groupId) - throws OrmException; + ResultSet byGroup(AccountGroup.Id groupId) throws OrmException; } diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupMemberAccess.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupMemberAccess.java index b3296d961b..0213f25a29 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupMemberAccess.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupMemberAccess.java @@ -23,8 +23,8 @@ import com.google.gwtorm.server.PrimaryKey; import com.google.gwtorm.server.Query; import com.google.gwtorm.server.ResultSet; -public interface AccountGroupMemberAccess extends - Access { +public interface AccountGroupMemberAccess + extends Access { @Override @PrimaryKey("key") AccountGroupMember get(AccountGroupMember.Key key) throws OrmException; diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupMemberAuditAccess.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupMemberAuditAccess.java index 041254a488..aa2f7c43d5 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupMemberAuditAccess.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupMemberAuditAccess.java @@ -23,18 +23,16 @@ import com.google.gwtorm.server.PrimaryKey; import com.google.gwtorm.server.Query; import com.google.gwtorm.server.ResultSet; -public interface AccountGroupMemberAuditAccess extends - Access { +public interface AccountGroupMemberAuditAccess + extends Access { @Override @PrimaryKey("key") - AccountGroupMemberAudit get(AccountGroupMemberAudit.Key key) - throws OrmException; + AccountGroupMemberAudit get(AccountGroupMemberAudit.Key key) throws OrmException; @Query("WHERE key.groupId = ? AND key.accountId = ?") - ResultSet byGroupAccount(AccountGroup.Id groupId, - Account.Id accountId) throws OrmException; + ResultSet byGroupAccount(AccountGroup.Id groupId, Account.Id accountId) + throws OrmException; @Query("WHERE key.groupId = ?") - ResultSet byGroup(AccountGroup.Id groupId) - throws OrmException; + ResultSet byGroup(AccountGroup.Id groupId) throws OrmException; } diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupNameAccess.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupNameAccess.java index 0a06d07f40..82660cb10a 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupNameAccess.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupNameAccess.java @@ -22,9 +22,7 @@ import com.google.gwtorm.server.PrimaryKey; import com.google.gwtorm.server.Query; import com.google.gwtorm.server.ResultSet; - -public interface AccountGroupNameAccess extends - Access { +public interface AccountGroupNameAccess extends Access { @Override @PrimaryKey("name") AccountGroupName get(AccountGroup.NameKey name) throws OrmException; @@ -33,6 +31,6 @@ public interface AccountGroupNameAccess extends ResultSet all() throws OrmException; @Query("WHERE name.name >= ? AND name.name <= ? ORDER BY name LIMIT ?") - ResultSet suggestByName(String nameA, String nameB, - int limit) throws OrmException; + ResultSet suggestByName(String nameA, String nameB, int limit) + throws OrmException; } diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ChangeMessageAccess.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ChangeMessageAccess.java index d291fd507a..fe87e59136 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ChangeMessageAccess.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ChangeMessageAccess.java @@ -23,8 +23,7 @@ import com.google.gwtorm.server.PrimaryKey; import com.google.gwtorm.server.Query; import com.google.gwtorm.server.ResultSet; -public interface ChangeMessageAccess extends - Access { +public interface ChangeMessageAccess extends Access { @Override @PrimaryKey("key") ChangeMessage get(ChangeMessage.Key id) throws OrmException; diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/DisabledChangesReviewDbWrapper.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/DisabledChangesReviewDbWrapper.java index b70778ed15..2af8d11468 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/DisabledChangesReviewDbWrapper.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/DisabledChangesReviewDbWrapper.java @@ -36,12 +36,10 @@ public class DisabledChangesReviewDbWrapper extends ReviewDbWrapper { public DisabledChangesReviewDbWrapper(ReviewDb db) { super(db); changes = new DisabledChangeAccess(delegate.changes()); - patchSetApprovals = - new DisabledPatchSetApprovalAccess(delegate.patchSetApprovals()); + patchSetApprovals = new DisabledPatchSetApprovalAccess(delegate.patchSetApprovals()); changeMessages = new DisabledChangeMessageAccess(delegate.changeMessages()); patchSets = new DisabledPatchSetAccess(delegate.patchSets()); - patchComments = - new DisabledPatchLineCommentAccess(delegate.patchComments()); + patchComments = new DisabledPatchLineCommentAccess(delegate.patchComments()); } public ReviewDb unsafeGetDelegate() { @@ -105,8 +103,7 @@ public class DisabledChangesReviewDbWrapper extends ReviewDbWrapper { } } - private static class DisabledPatchSetApprovalAccess - extends PatchSetApprovalAccessWrapper { + private static class DisabledPatchSetApprovalAccess extends PatchSetApprovalAccessWrapper { DisabledPatchSetApprovalAccess(PatchSetApprovalAccess delegate) { super(delegate); } @@ -117,14 +114,12 @@ public class DisabledChangesReviewDbWrapper extends ReviewDbWrapper { } @Override - public CheckedFuture getAsync( - PatchSetApproval.Key key) { + public CheckedFuture getAsync(PatchSetApproval.Key key) { throw new UnsupportedOperationException(MSG); } @Override - public ResultSet get( - Iterable keys) { + public ResultSet get(Iterable keys) { throw new UnsupportedOperationException(MSG); } @@ -144,8 +139,7 @@ public class DisabledChangesReviewDbWrapper extends ReviewDbWrapper { } } - private static class DisabledChangeMessageAccess - extends ChangeMessageAccessWrapper { + private static class DisabledChangeMessageAccess extends ChangeMessageAccessWrapper { DisabledChangeMessageAccess(ChangeMessageAccess delegate) { super(delegate); } @@ -156,8 +150,7 @@ public class DisabledChangesReviewDbWrapper extends ReviewDbWrapper { } @Override - public CheckedFuture getAsync( - ChangeMessage.Key key) { + public CheckedFuture getAsync(ChangeMessage.Key key) { throw new UnsupportedOperationException(MSG); } @@ -218,8 +211,7 @@ public class DisabledChangesReviewDbWrapper extends ReviewDbWrapper { } } - private static class DisabledPatchLineCommentAccess - extends PatchLineCommentAccessWrapper { + private static class DisabledPatchLineCommentAccess extends PatchLineCommentAccessWrapper { DisabledPatchLineCommentAccess(PatchLineCommentAccess delegate) { super(delegate); } @@ -230,14 +222,12 @@ public class DisabledChangesReviewDbWrapper extends ReviewDbWrapper { } @Override - public CheckedFuture getAsync( - PatchLineComment.Key key) { + public CheckedFuture getAsync(PatchLineComment.Key key) { throw new UnsupportedOperationException(MSG); } @Override - public ResultSet get( - Iterable keys) { + public ResultSet get(Iterable keys) { throw new UnsupportedOperationException(MSG); } @@ -257,14 +247,12 @@ public class DisabledChangesReviewDbWrapper extends ReviewDbWrapper { } @Override - public ResultSet publishedByChangeFile(Change.Id id, - String file) { + public ResultSet publishedByChangeFile(Change.Id id, String file) { throw new UnsupportedOperationException(MSG); } @Override - public ResultSet publishedByPatchSet( - PatchSet.Id patchset) { + public ResultSet publishedByPatchSet(PatchSet.Id patchset) { throw new UnsupportedOperationException(MSG); } @@ -275,8 +263,8 @@ public class DisabledChangesReviewDbWrapper extends ReviewDbWrapper { } @Override - public ResultSet draftByChangeFileAuthor(Change.Id id, - String file, Account.Id author) { + public ResultSet draftByChangeFileAuthor( + Change.Id id, String file, Account.Id author) { throw new UnsupportedOperationException(MSG); } @@ -286,4 +274,3 @@ public class DisabledChangesReviewDbWrapper extends ReviewDbWrapper { } } } - diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/PatchLineCommentAccess.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/PatchLineCommentAccess.java index cff34fa356..08b8484d1b 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/PatchLineCommentAccess.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/PatchLineCommentAccess.java @@ -24,8 +24,7 @@ import com.google.gwtorm.server.PrimaryKey; import com.google.gwtorm.server.Query; import com.google.gwtorm.server.ResultSet; -public interface PatchLineCommentAccess extends - Access { +public interface PatchLineCommentAccess extends Access { @Override @PrimaryKey("key") PatchLineComment get(PatchLineComment.Key id) throws OrmException; @@ -36,35 +35,34 @@ public interface PatchLineCommentAccess extends @Query("WHERE key.patchKey.patchSetId = ?") ResultSet byPatchSet(PatchSet.Id id) throws OrmException; - @Query("WHERE key.patchKey.patchSetId.changeId = ?" - + " AND key.patchKey.fileName = ? AND status = '" - + PatchLineComment.STATUS_PUBLISHED + "' ORDER BY lineNbr,writtenOn") - ResultSet publishedByChangeFile(Change.Id id, String file) + @Query( + "WHERE key.patchKey.patchSetId.changeId = ?" + + " AND key.patchKey.fileName = ? AND status = '" + + PatchLineComment.STATUS_PUBLISHED + + "' ORDER BY lineNbr,writtenOn") + ResultSet publishedByChangeFile(Change.Id id, String file) throws OrmException; + + @Query( + "WHERE key.patchKey.patchSetId = ? AND status = '" + PatchLineComment.STATUS_PUBLISHED + "'") + ResultSet publishedByPatchSet(PatchSet.Id patchset) throws OrmException; + + @Query( + "WHERE key.patchKey.patchSetId = ? AND status = '" + + PatchLineComment.STATUS_DRAFT + + "' AND author = ? ORDER BY key.patchKey,lineNbr,writtenOn") + ResultSet draftByPatchSetAuthor(PatchSet.Id patchset, Account.Id author) throws OrmException; - @Query("WHERE key.patchKey.patchSetId = ? AND status = '" - + PatchLineComment.STATUS_PUBLISHED + "'") - ResultSet publishedByPatchSet(PatchSet.Id patchset) + @Query( + "WHERE key.patchKey.patchSetId.changeId = ?" + + " AND key.patchKey.fileName = ? AND author = ? AND status = '" + + PatchLineComment.STATUS_DRAFT + + "' ORDER BY lineNbr,writtenOn") + ResultSet draftByChangeFileAuthor(Change.Id id, String file, Account.Id author) throws OrmException; - @Query("WHERE key.patchKey.patchSetId = ? AND status = '" - + PatchLineComment.STATUS_DRAFT - + "' AND author = ? ORDER BY key.patchKey,lineNbr,writtenOn") - ResultSet draftByPatchSetAuthor - (PatchSet.Id patchset, Account.Id author) - throws OrmException; - - @Query("WHERE key.patchKey.patchSetId.changeId = ?" - + " AND key.patchKey.fileName = ? AND author = ? AND status = '" - + PatchLineComment.STATUS_DRAFT + "' ORDER BY lineNbr,writtenOn") - ResultSet draftByChangeFileAuthor - (Change.Id id, String file, Account.Id author) - throws OrmException; - - @Query("WHERE status = '" + PatchLineComment.STATUS_DRAFT - + "' AND author = ?") - ResultSet draftByAuthor(Account.Id author) - throws OrmException; + @Query("WHERE status = '" + PatchLineComment.STATUS_DRAFT + "' AND author = ?") + ResultSet draftByAuthor(Account.Id author) throws OrmException; @Query ResultSet all() throws OrmException; diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/PatchSetApprovalAccess.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/PatchSetApprovalAccess.java index 66e6a3b2c1..69357bcd07 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/PatchSetApprovalAccess.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/PatchSetApprovalAccess.java @@ -24,8 +24,7 @@ import com.google.gwtorm.server.PrimaryKey; import com.google.gwtorm.server.Query; import com.google.gwtorm.server.ResultSet; -public interface PatchSetApprovalAccess extends - Access { +public interface PatchSetApprovalAccess extends Access { @Override @PrimaryKey("key") PatchSetApproval get(PatchSetApproval.Key key) throws OrmException; @@ -37,8 +36,8 @@ public interface PatchSetApprovalAccess extends ResultSet byPatchSet(PatchSet.Id id) throws OrmException; @Query("WHERE key.patchSetId = ? AND key.accountId = ?") - ResultSet byPatchSetUser(PatchSet.Id patchSet, - Account.Id account) throws OrmException; + ResultSet byPatchSetUser(PatchSet.Id patchSet, Account.Id account) + throws OrmException; @Query ResultSet all() throws OrmException; diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ReviewDb.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ReviewDb.java index dafca819a6..9b4e1ed7df 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ReviewDb.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ReviewDb.java @@ -25,12 +25,13 @@ import com.google.gwtorm.server.Sequence; /** * The review service database schema. - *

- * Root entities that are at the top level of some important data graph: + * + *

Root entities that are at the top level of some important data graph: + * *

    - *
  • {@link Account}: Per-user account registration, preferences, identity.
  • - *
  • {@link Change}: All review information about a single proposed change.
  • - *
  • {@link SystemConfig}: Server-wide settings, managed by administrator.
  • + *
  • {@link Account}: Per-user account registration, preferences, identity. + *
  • {@link Change}: All review information about a single proposed change. + *
  • {@link SystemConfig}: Server-wide settings, managed by administrator. *
*/ public interface ReviewDb extends Schema { diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ReviewDbUtil.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ReviewDbUtil.java index 7e2a9b0e62..27a8e72730 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ReviewDbUtil.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ReviewDbUtil.java @@ -20,24 +20,20 @@ import com.google.gwtorm.client.IntKey; /** Static utilities for ReviewDb types. */ public class ReviewDbUtil { private static final Ordering> INT_KEY_ORDERING = - Ordering.natural() - .nullsFirst() - .>onResultOf(IntKey::get) - .nullsFirst(); + Ordering.natural().nullsFirst().>onResultOf(IntKey::get).nullsFirst(); /** * Null-safe ordering over arbitrary subclass of {@code IntKey}. - *

- * In some cases, {@code Comparator.comparing(Change.Id::get)} may be shorter - * and cleaner. However, this method may be preferable in some cases: + * + *

In some cases, {@code Comparator.comparing(Change.Id::get)} may be shorter and cleaner. + * However, this method may be preferable in some cases: + * *

    - *
  • This ordering is null-safe over both input and the result of {@link - * IntKey#get()}; {@code comparing} is only a good idea if all inputs are - * obviously non-null.
  • - *
  • {@code intKeyOrdering().sortedCopy(iterable)} is shorter than the - * stream equivalent.
  • - *
  • Creating derived comparators may be more readable with {@link Ordering} - * method chaining rather than static {@code Comparator} methods. + *
  • This ordering is null-safe over both input and the result of {@link IntKey#get()}; {@code + * comparing} is only a good idea if all inputs are obviously non-null. + *
  • {@code intKeyOrdering().sortedCopy(iterable)} is shorter than the stream equivalent. + *
  • Creating derived comparators may be more readable with {@link Ordering} method chaining + * rather than static {@code Comparator} methods. *
*/ @SuppressWarnings("unchecked") @@ -52,6 +48,5 @@ public class ReviewDbUtil { return db; } - private ReviewDbUtil() { - } + private ReviewDbUtil() {} } diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ReviewDbWrapper.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ReviewDbWrapper.java index 50f22ce65e..6dd37014b9 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ReviewDbWrapper.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ReviewDbWrapper.java @@ -28,7 +28,6 @@ import com.google.gwtorm.server.AtomicUpdate; import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.ResultSet; import com.google.gwtorm.server.StatementExecutor; - import java.util.Map; public class ReviewDbWrapper implements ReviewDb { @@ -247,8 +246,7 @@ public class ReviewDbWrapper implements ReviewDb { } } - public static class PatchSetApprovalAccessWrapper - implements PatchSetApprovalAccess { + public static class PatchSetApprovalAccessWrapper implements PatchSetApprovalAccess { protected final PatchSetApprovalAccess delegate; protected PatchSetApprovalAccessWrapper(PatchSetApprovalAccess delegate) { @@ -266,8 +264,7 @@ public class ReviewDbWrapper implements ReviewDb { } @Override - public ResultSet iterateAllEntities() - throws OrmException { + public ResultSet iterateAllEntities() throws OrmException { return delegate.iterateAllEntities(); } @@ -277,14 +274,12 @@ public class ReviewDbWrapper implements ReviewDb { } @Override - public Map toMap( - Iterable c) { + public Map toMap(Iterable c) { return delegate.toMap(c); } @Override - public CheckedFuture getAsync( - PatchSetApproval.Key key) { + public CheckedFuture getAsync(PatchSetApproval.Key key) { return delegate.getAsync(key); } @@ -295,32 +290,27 @@ public class ReviewDbWrapper implements ReviewDb { } @Override - public void insert(Iterable instances) - throws OrmException { + public void insert(Iterable instances) throws OrmException { delegate.insert(instances); } @Override - public void update(Iterable instances) - throws OrmException { + public void update(Iterable instances) throws OrmException { delegate.update(instances); } @Override - public void upsert(Iterable instances) - throws OrmException { + public void upsert(Iterable instances) throws OrmException { delegate.upsert(instances); } @Override - public void deleteKeys(Iterable keys) - throws OrmException { + public void deleteKeys(Iterable keys) throws OrmException { delegate.deleteKeys(keys); } @Override - public void delete(Iterable instances) - throws OrmException { + public void delete(Iterable instances) throws OrmException { delegate.delete(instances); } @@ -330,8 +320,8 @@ public class ReviewDbWrapper implements ReviewDb { } @Override - public PatchSetApproval atomicUpdate(PatchSetApproval.Key key, - AtomicUpdate update) throws OrmException { + public PatchSetApproval atomicUpdate( + PatchSetApproval.Key key, AtomicUpdate update) throws OrmException { return delegate.atomicUpdate(key, update); } @@ -341,20 +331,18 @@ public class ReviewDbWrapper implements ReviewDb { } @Override - public ResultSet byChange(Change.Id id) - throws OrmException { + public ResultSet byChange(Change.Id id) throws OrmException { return delegate.byChange(id); } @Override - public ResultSet byPatchSet(PatchSet.Id id) - throws OrmException { + public ResultSet byPatchSet(PatchSet.Id id) throws OrmException { return delegate.byPatchSet(id); } @Override - public ResultSet byPatchSetUser(PatchSet.Id patchSet, - Account.Id account) throws OrmException { + public ResultSet byPatchSetUser(PatchSet.Id patchSet, Account.Id account) + throws OrmException { return delegate.byPatchSetUser(patchSet, account); } @@ -364,8 +352,7 @@ public class ReviewDbWrapper implements ReviewDb { } } - public static class ChangeMessageAccessWrapper - implements ChangeMessageAccess { + public static class ChangeMessageAccessWrapper implements ChangeMessageAccess { protected final ChangeMessageAccess delegate; protected ChangeMessageAccessWrapper(ChangeMessageAccess delegate) { @@ -393,20 +380,17 @@ public class ReviewDbWrapper implements ReviewDb { } @Override - public Map toMap( - Iterable c) { + public Map toMap(Iterable c) { return delegate.toMap(c); } @Override - public CheckedFuture getAsync( - ChangeMessage.Key key) { + public CheckedFuture getAsync(ChangeMessage.Key key) { return delegate.getAsync(key); } @Override - public ResultSet get(Iterable keys) - throws OrmException { + public ResultSet get(Iterable keys) throws OrmException { return delegate.get(keys); } @@ -426,8 +410,7 @@ public class ReviewDbWrapper implements ReviewDb { } @Override - public void deleteKeys(Iterable keys) - throws OrmException { + public void deleteKeys(Iterable keys) throws OrmException { delegate.deleteKeys(keys); } @@ -442,8 +425,8 @@ public class ReviewDbWrapper implements ReviewDb { } @Override - public ChangeMessage atomicUpdate(ChangeMessage.Key key, - AtomicUpdate update) throws OrmException { + public ChangeMessage atomicUpdate(ChangeMessage.Key key, AtomicUpdate update) + throws OrmException { return delegate.atomicUpdate(key, update); } @@ -458,8 +441,7 @@ public class ReviewDbWrapper implements ReviewDb { } @Override - public ResultSet byPatchSet(PatchSet.Id id) - throws OrmException { + public ResultSet byPatchSet(PatchSet.Id id) throws OrmException { return delegate.byPatchSet(id); } @@ -467,7 +449,6 @@ public class ReviewDbWrapper implements ReviewDb { public ResultSet all() throws OrmException { return delegate.all(); } - } public static class PatchSetAccessWrapper implements PatchSetAccess { @@ -508,8 +489,7 @@ public class ReviewDbWrapper implements ReviewDb { } @Override - public ResultSet get(Iterable keys) - throws OrmException { + public ResultSet get(Iterable keys) throws OrmException { return delegate.get(keys); } @@ -565,8 +545,7 @@ public class ReviewDbWrapper implements ReviewDb { } } - public static class PatchLineCommentAccessWrapper - implements PatchLineCommentAccess { + public static class PatchLineCommentAccessWrapper implements PatchLineCommentAccess { protected PatchLineCommentAccess delegate; protected PatchLineCommentAccessWrapper(PatchLineCommentAccess delegate) { @@ -584,8 +563,7 @@ public class ReviewDbWrapper implements ReviewDb { } @Override - public ResultSet iterateAllEntities() - throws OrmException { + public ResultSet iterateAllEntities() throws OrmException { return delegate.iterateAllEntities(); } @@ -595,14 +573,12 @@ public class ReviewDbWrapper implements ReviewDb { } @Override - public Map toMap( - Iterable c) { + public Map toMap(Iterable c) { return delegate.toMap(c); } @Override - public CheckedFuture getAsync( - PatchLineComment.Key key) { + public CheckedFuture getAsync(PatchLineComment.Key key) { return delegate.getAsync(key); } @@ -613,32 +589,27 @@ public class ReviewDbWrapper implements ReviewDb { } @Override - public void insert(Iterable instances) - throws OrmException { + public void insert(Iterable instances) throws OrmException { delegate.insert(instances); } @Override - public void update(Iterable instances) - throws OrmException { + public void update(Iterable instances) throws OrmException { delegate.update(instances); } @Override - public void upsert(Iterable instances) - throws OrmException { + public void upsert(Iterable instances) throws OrmException { delegate.upsert(instances); } @Override - public void deleteKeys(Iterable keys) - throws OrmException { + public void deleteKeys(Iterable keys) throws OrmException { delegate.deleteKeys(keys); } @Override - public void delete(Iterable instances) - throws OrmException { + public void delete(Iterable instances) throws OrmException { delegate.delete(instances); } @@ -648,8 +619,8 @@ public class ReviewDbWrapper implements ReviewDb { } @Override - public PatchLineComment atomicUpdate(PatchLineComment.Key key, - AtomicUpdate update) throws OrmException { + public PatchLineComment atomicUpdate( + PatchLineComment.Key key, AtomicUpdate update) throws OrmException { return delegate.atomicUpdate(key, update); } @@ -659,20 +630,18 @@ public class ReviewDbWrapper implements ReviewDb { } @Override - public ResultSet byChange(Change.Id id) - throws OrmException { + public ResultSet byChange(Change.Id id) throws OrmException { return delegate.byChange(id); } @Override - public ResultSet byPatchSet(PatchSet.Id id) - throws OrmException { + public ResultSet byPatchSet(PatchSet.Id id) throws OrmException { return delegate.byPatchSet(id); } @Override - public ResultSet publishedByChangeFile(Change.Id id, - String file) throws OrmException { + public ResultSet publishedByChangeFile(Change.Id id, String file) + throws OrmException { return delegate.publishedByChangeFile(id, file); } @@ -689,14 +658,13 @@ public class ReviewDbWrapper implements ReviewDb { } @Override - public ResultSet draftByChangeFileAuthor(Change.Id id, - String file, Account.Id author) throws OrmException { + public ResultSet draftByChangeFileAuthor( + Change.Id id, String file, Account.Id author) throws OrmException { return delegate.draftByChangeFileAuthor(id, file, author); } @Override - public ResultSet draftByAuthor(Account.Id author) - throws OrmException { + public ResultSet draftByAuthor(Account.Id author) throws OrmException { return delegate.draftByAuthor(author); } diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/SchemaVersionAccess.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/SchemaVersionAccess.java index dda8d5c12a..8819a6c355 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/SchemaVersionAccess.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/SchemaVersionAccess.java @@ -20,8 +20,8 @@ import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.PrimaryKey; /** Access interface for {@link CurrentSchemaVersion}. */ -public interface SchemaVersionAccess extends - Access { +public interface SchemaVersionAccess + extends Access { @Override @PrimaryKey("singleton") CurrentSchemaVersion get(CurrentSchemaVersion.Key key) throws OrmException; diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/SystemConfigAccess.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/SystemConfigAccess.java index 3bc49dd756..a2177fd57a 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/SystemConfigAccess.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/SystemConfigAccess.java @@ -22,8 +22,7 @@ import com.google.gwtorm.server.Query; import com.google.gwtorm.server.ResultSet; /** Access interface for {@link SystemConfig}. */ -public interface SystemConfigAccess extends - Access { +public interface SystemConfigAccess extends Access { @Override @PrimaryKey("singleton") SystemConfig get(SystemConfig.Key key) throws OrmException; diff --git a/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/AccountSshKeyTest.java b/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/AccountSshKeyTest.java index 727ba8e1d1..ed378e48ad 100644 --- a/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/AccountSshKeyTest.java +++ b/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/AccountSshKeyTest.java @@ -21,22 +21,21 @@ import org.junit.Test; public class AccountSshKeyTest { private static final String KEY = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCgug5VyMXQGnem2H1KVC4/HcRcD4zzBqS" - + "uJBRWVonSSoz3RoAZ7bWXCVVGwchtXwUURD689wFYdiPecOrWOUgeeyRq754YWRhU+W28" - + "vf8IZixgjCmiBhaL2gt3wff6pP+NXJpTSA4aeWE5DfNK5tZlxlSxqkKOS8JRSUeNQov5T" - + "w== john.doe@example.com"; + + "uJBRWVonSSoz3RoAZ7bWXCVVGwchtXwUURD689wFYdiPecOrWOUgeeyRq754YWRhU+W28" + + "vf8IZixgjCmiBhaL2gt3wff6pP+NXJpTSA4aeWE5DfNK5tZlxlSxqkKOS8JRSUeNQov5T" + + "w== john.doe@example.com"; private static final String KEY_WITH_NEWLINES = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCgug5VyMXQGnem2H1KVC4/HcRcD4zzBqS\n" - + "uJBRWVonSSoz3RoAZ7bWXCVVGwchtXwUURD689wFYdiPecOrWOUgeeyRq754YWRhU+W28\n" - + "vf8IZixgjCmiBhaL2gt3wff6pP+NXJpTSA4aeWE5DfNK5tZlxlSxqkKOS8JRSUeNQov5T\n" - + "w== john.doe@example.com"; + + "uJBRWVonSSoz3RoAZ7bWXCVVGwchtXwUURD689wFYdiPecOrWOUgeeyRq754YWRhU+W28\n" + + "vf8IZixgjCmiBhaL2gt3wff6pP+NXJpTSA4aeWE5DfNK5tZlxlSxqkKOS8JRSUeNQov5T\n" + + "w== john.doe@example.com"; private final Account.Id accountId = new Account.Id(1); @Test public void validity() throws Exception { - AccountSshKey key = new AccountSshKey( - new AccountSshKey.Id(accountId, -1), KEY); + AccountSshKey key = new AccountSshKey(new AccountSshKey.Id(accountId, -1), KEY); assertThat(key.isValid()).isFalse(); key = new AccountSshKey(new AccountSshKey.Id(accountId, 0), KEY); assertThat(key.isValid()).isFalse(); @@ -46,8 +45,7 @@ public class AccountSshKeyTest { @Test public void getters() throws Exception { - AccountSshKey key = new AccountSshKey( - new AccountSshKey.Id(accountId, 1), KEY); + AccountSshKey key = new AccountSshKey(new AccountSshKey.Id(accountId, 1), KEY); assertThat(key.getSshPublicKey()).isEqualTo(KEY); assertThat(key.getAlgorithm()).isEqualTo(KEY.split(" ")[0]); assertThat(key.getEncodedKey()).isEqualTo(KEY.split(" ")[1]); @@ -56,8 +54,7 @@ public class AccountSshKeyTest { @Test public void keyWithNewLines() throws Exception { - AccountSshKey key = new AccountSshKey( - new AccountSshKey.Id(accountId, 1), KEY_WITH_NEWLINES); + AccountSshKey key = new AccountSshKey(new AccountSshKey.Id(accountId, 1), KEY_WITH_NEWLINES); assertThat(key.getSshPublicKey()).isEqualTo(KEY); assertThat(key.getAlgorithm()).isEqualTo(KEY.split(" ")[0]); assertThat(key.getEncodedKey()).isEqualTo(KEY.split(" ")[1]); diff --git a/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/ChangeTest.java b/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/ChangeTest.java index 2aa863e05f..6d1d0a6817 100644 --- a/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/ChangeTest.java +++ b/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/ChangeTest.java @@ -122,10 +122,8 @@ public class ChangeTest { @Test public void toRefPrefix() { - assertThat(new Change.Id(1).toRefPrefix()) - .isEqualTo("refs/changes/01/1/"); - assertThat(new Change.Id(1234).toRefPrefix()) - .isEqualTo("refs/changes/34/1234/"); + assertThat(new Change.Id(1).toRefPrefix()).isEqualTo("refs/changes/01/1/"); + assertThat(new Change.Id(1234).toRefPrefix()).isEqualTo("refs/changes/34/1234/"); } @Test @@ -158,8 +156,7 @@ public class ChangeTest { } private static void assertAllUsersRef(int changeId, String refName) { - assertThat(Change.Id.fromAllUsersRef(refName)) - .isEqualTo(new Change.Id(changeId)); + assertThat(Change.Id.fromAllUsersRef(refName)).isEqualTo(new Change.Id(changeId)); } private static void assertNotAllUsersRef(String refName) { diff --git a/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/PatchSetApprovalTest.java b/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/PatchSetApprovalTest.java index 008c77fa2f..a0a806fed7 100644 --- a/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/PatchSetApprovalTest.java +++ b/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/PatchSetApprovalTest.java @@ -17,27 +17,22 @@ package com.google.gerrit.reviewdb.client; import static com.google.common.truth.Truth.assertThat; import com.google.gerrit.testutil.GerritBaseTests; - -import org.junit.Test; - import java.util.HashMap; import java.util.Map; +import org.junit.Test; public class PatchSetApprovalTest extends GerritBaseTests { @Test public void keyEquality() { - PatchSetApproval.Key k1 = new PatchSetApproval.Key( - new PatchSet.Id(new Change.Id(1), 2), - new Account.Id(3), - new LabelId("My-Label")); - PatchSetApproval.Key k2 = new PatchSetApproval.Key( - new PatchSet.Id(new Change.Id(1), 2), - new Account.Id(3), - new LabelId("My-Label")); - PatchSetApproval.Key k3 = new PatchSetApproval.Key( - new PatchSet.Id(new Change.Id(1), 2), - new Account.Id(3), - new LabelId("Other-Label")); + PatchSetApproval.Key k1 = + new PatchSetApproval.Key( + new PatchSet.Id(new Change.Id(1), 2), new Account.Id(3), new LabelId("My-Label")); + PatchSetApproval.Key k2 = + new PatchSetApproval.Key( + new PatchSet.Id(new Change.Id(1), 2), new Account.Id(3), new LabelId("My-Label")); + PatchSetApproval.Key k3 = + new PatchSetApproval.Key( + new PatchSet.Id(new Change.Id(1), 2), new Account.Id(3), new LabelId("Other-Label")); assertThat(k2).isEqualTo(k1); assertThat(k3).isNotEqualTo(k1); diff --git a/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/PatchSetTest.java b/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/PatchSetTest.java index 7a4531bae7..51a405f6b6 100644 --- a/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/PatchSetTest.java +++ b/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/PatchSetTest.java @@ -19,7 +19,6 @@ import static com.google.gerrit.reviewdb.client.PatchSet.joinGroups; import static com.google.gerrit.reviewdb.client.PatchSet.splitGroups; import com.google.common.collect.ImmutableList; - import org.junit.Test; public class PatchSetTest { @@ -83,8 +82,7 @@ public class PatchSetTest { @Test public void toRefName() { - assertThat(new PatchSet.Id(new Change.Id(1), 23).toRefName()) - .isEqualTo("refs/changes/01/1/23"); + assertThat(new PatchSet.Id(new Change.Id(1), 23).toRefName()).isEqualTo("refs/changes/01/1/23"); assertThat(new PatchSet.Id(new Change.Id(1234), 5).toRefName()) .isEqualTo("refs/changes/34/1234/5"); } diff --git a/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/RefNamesTest.java b/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/RefNamesTest.java index 9bbfb3318f..65a92a0d4b 100644 --- a/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/RefNamesTest.java +++ b/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/RefNamesTest.java @@ -42,37 +42,36 @@ public class RefNamesTest { @Test public void refsDraftComments() throws Exception { assertThat(RefNames.refsDraftComments(changeId, accountId)) - .isEqualTo("refs/draft-comments/73/67473/1011123"); + .isEqualTo("refs/draft-comments/73/67473/1011123"); } @Test public void refsDraftCommentsPrefix() throws Exception { assertThat(RefNames.refsDraftCommentsPrefix(changeId)) - .isEqualTo("refs/draft-comments/73/67473/"); + .isEqualTo("refs/draft-comments/73/67473/"); } @Test public void refsStarredChanges() throws Exception { assertThat(RefNames.refsStarredChanges(changeId, accountId)) - .isEqualTo("refs/starred-changes/73/67473/1011123"); + .isEqualTo("refs/starred-changes/73/67473/1011123"); } @Test public void refsStarredChangesPrefix() throws Exception { assertThat(RefNames.refsStarredChangesPrefix(changeId)) - .isEqualTo("refs/starred-changes/73/67473/"); + .isEqualTo("refs/starred-changes/73/67473/"); } @Test public void refsEdit() throws Exception { assertThat(RefNames.refsEdit(accountId, changeId, psId)) - .isEqualTo("refs/users/23/1011123/edit-67473/42"); + .isEqualTo("refs/users/23/1011123/edit-67473/42"); } @Test public void isRefsEdit() throws Exception { - assertThat(RefNames.isRefsEdit("refs/users/23/1011123/edit-67473/42")) - .isTrue(); + assertThat(RefNames.isRefsEdit("refs/users/23/1011123/edit-67473/42")).isTrue(); // user ref, but no edit ref assertThat(RefNames.isRefsEdit("refs/users/23/1011123")).isFalse(); @@ -85,8 +84,7 @@ public class RefNamesTest { public void isRefsUsers() throws Exception { assertThat(RefNames.isRefsUsers("refs/users/23/1011123")).isTrue(); assertThat(RefNames.isRefsUsers("refs/users/default")).isTrue(); - assertThat(RefNames.isRefsUsers("refs/users/23/1011123/edit-67473/42")) - .isTrue(); + assertThat(RefNames.isRefsUsers("refs/users/23/1011123/edit-67473/42")).isTrue(); assertThat(RefNames.isRefsUsers("refs/heads/master")).isFalse(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/audit/AuditEvent.java b/gerrit-server/src/main/java/com/google/gerrit/audit/AuditEvent.java index 3184b15183..f2b4eab654 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/audit/AuditEvent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/audit/AuditEvent.java @@ -25,8 +25,7 @@ import com.google.gerrit.server.CurrentUser; public class AuditEvent { public static final String UNKNOWN_SESSION_ID = "000000000000000000000000000"; - protected static final ListMultimap EMPTY_PARAMS = - ImmutableListMultimap.of(); + protected static final ListMultimap EMPTY_PARAMS = ImmutableListMultimap.of(); public final String sessionId; public final CurrentUser who; @@ -58,8 +57,13 @@ public class AuditEvent { * @param params parameters of the event * @param result result of the event */ - public AuditEvent(String sessionId, CurrentUser who, String what, long when, - ListMultimap params, Object result) { + public AuditEvent( + String sessionId, + CurrentUser who, + String what, + long when, + ListMultimap params, + Object result) { Preconditions.checkNotNull(what, "what is a mandatory not null param !"); this.sessionId = MoreObjects.firstNonNull(sessionId, UNKNOWN_SESSION_ID); @@ -96,7 +100,8 @@ public class AuditEvent { @Override public String toString() { - return String.format("AuditEvent UUID:%s, SID:%s, TS:%d, who:%s, what:%s", + return String.format( + "AuditEvent UUID:%s, SID:%s, TS:%d, who:%s, what:%s", uuid.uuid(), sessionId, when, who, what); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/audit/AuditListener.java b/gerrit-server/src/main/java/com/google/gerrit/audit/AuditListener.java index 0aab248407..8eb8ed41a6 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/audit/AuditListener.java +++ b/gerrit-server/src/main/java/com/google/gerrit/audit/AuditListener.java @@ -20,5 +20,4 @@ import com.google.gerrit.extensions.annotations.ExtensionPoint; public interface AuditListener { void onAuditableAction(AuditEvent action); - } diff --git a/gerrit-server/src/main/java/com/google/gerrit/audit/AuditModule.java b/gerrit-server/src/main/java/com/google/gerrit/audit/AuditModule.java index 89b51f81f4..aedb8a7a28 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/audit/AuditModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/audit/AuditModule.java @@ -25,5 +25,4 @@ public class AuditModule extends AbstractModule { DynamicSet.setOf(binder(), GroupMemberAuditListener.class); bind(AuditService.class); } - } diff --git a/gerrit-server/src/main/java/com/google/gerrit/audit/AuditService.java b/gerrit-server/src/main/java/com/google/gerrit/audit/AuditService.java index 4844045af7..cc29559327 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/audit/AuditService.java +++ b/gerrit-server/src/main/java/com/google/gerrit/audit/AuditService.java @@ -20,12 +20,10 @@ import com.google.gerrit.reviewdb.client.AccountGroupById; import com.google.gerrit.reviewdb.client.AccountGroupMember; import com.google.inject.Inject; import com.google.inject.Singleton; - +import java.util.Collection; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Collection; - @Singleton public class AuditService { private static final Logger log = LoggerFactory.getLogger(AuditService.class); @@ -34,7 +32,8 @@ public class AuditService { private final DynamicSet groupMemberAuditListeners; @Inject - public AuditService(DynamicSet auditListeners, + public AuditService( + DynamicSet auditListeners, DynamicSet groupMemberAuditListeners) { this.auditListeners = auditListeners; this.groupMemberAuditListeners = groupMemberAuditListeners; @@ -46,8 +45,7 @@ public class AuditService { } } - public void dispatchAddAccountsToGroup(Account.Id actor, - Collection added) { + public void dispatchAddAccountsToGroup(Account.Id actor, Collection added) { for (GroupMemberAuditListener auditListener : groupMemberAuditListeners) { try { auditListener.onAddAccountsToGroup(actor, added); @@ -57,8 +55,8 @@ public class AuditService { } } - public void dispatchDeleteAccountsFromGroup(Account.Id actor, - Collection removed) { + public void dispatchDeleteAccountsFromGroup( + Account.Id actor, Collection removed) { for (GroupMemberAuditListener auditListener : groupMemberAuditListeners) { try { auditListener.onDeleteAccountsFromGroup(actor, removed); @@ -68,8 +66,7 @@ public class AuditService { } } - public void dispatchAddGroupsToGroup(Account.Id actor, - Collection added) { + public void dispatchAddGroupsToGroup(Account.Id actor, Collection added) { for (GroupMemberAuditListener auditListener : groupMemberAuditListeners) { try { auditListener.onAddGroupsToGroup(actor, added); @@ -79,8 +76,8 @@ public class AuditService { } } - public void dispatchDeleteGroupsFromGroup(Account.Id actor, - Collection removed) { + public void dispatchDeleteGroupsFromGroup( + Account.Id actor, Collection removed) { for (GroupMemberAuditListener auditListener : groupMemberAuditListeners) { try { auditListener.onDeleteGroupsFromGroup(actor, removed); diff --git a/gerrit-server/src/main/java/com/google/gerrit/audit/ExtendedHttpAuditEvent.java b/gerrit-server/src/main/java/com/google/gerrit/audit/ExtendedHttpAuditEvent.java index 6bd7deb417..4db8a5166b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/audit/ExtendedHttpAuditEvent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/audit/ExtendedHttpAuditEvent.java @@ -19,12 +19,9 @@ import com.google.common.collect.ListMultimap; import com.google.gerrit.extensions.restapi.RestResource; import com.google.gerrit.extensions.restapi.RestView; import com.google.gerrit.server.CurrentUser; - import javax.servlet.http.HttpServletRequest; -/** - * Extended audit event. Adds request, resource and view data to HttpAuditEvent. - */ +/** Extended audit event. Adds request, resource and view data to HttpAuditEvent. */ public class ExtendedHttpAuditEvent extends HttpAuditEvent { public final HttpServletRequest httpRequest; public final RestResource resource; @@ -44,12 +41,27 @@ public class ExtendedHttpAuditEvent extends HttpAuditEvent { * @param resource REST resource data * @param view view rendering object */ - public ExtendedHttpAuditEvent(String sessionId, CurrentUser who, - HttpServletRequest httpRequest, long when, ListMultimap params, - Object input, int status, Object result, RestResource resource, + public ExtendedHttpAuditEvent( + String sessionId, + CurrentUser who, + HttpServletRequest httpRequest, + long when, + ListMultimap params, + Object input, + int status, + Object result, + RestResource resource, RestView view) { - super(sessionId, who, httpRequest.getRequestURI(), when, params, - httpRequest.getMethod(), input, status, result); + super( + sessionId, + who, + httpRequest.getRequestURI(), + when, + params, + httpRequest.getMethod(), + input, + status, + result); this.httpRequest = Preconditions.checkNotNull(httpRequest); this.resource = resource; this.view = view; diff --git a/gerrit-server/src/main/java/com/google/gerrit/audit/GroupMemberAuditListener.java b/gerrit-server/src/main/java/com/google/gerrit/audit/GroupMemberAuditListener.java index 1269f4ab97..0878499d40 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/audit/GroupMemberAuditListener.java +++ b/gerrit-server/src/main/java/com/google/gerrit/audit/GroupMemberAuditListener.java @@ -18,20 +18,16 @@ import com.google.gerrit.extensions.annotations.ExtensionPoint; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.AccountGroupById; import com.google.gerrit.reviewdb.client.AccountGroupMember; - import java.util.Collection; @ExtensionPoint public interface GroupMemberAuditListener { - void onAddAccountsToGroup(Account.Id actor, - Collection added); + void onAddAccountsToGroup(Account.Id actor, Collection added); - void onDeleteAccountsFromGroup(Account.Id actor, - Collection removed); + void onDeleteAccountsFromGroup(Account.Id actor, Collection removed); void onAddGroupsToGroup(Account.Id actor, Collection added); - void onDeleteGroupsFromGroup(Account.Id actor, - Collection deleted); + void onDeleteGroupsFromGroup(Account.Id actor, Collection deleted); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/audit/HttpAuditEvent.java b/gerrit-server/src/main/java/com/google/gerrit/audit/HttpAuditEvent.java index 300d76001a..cd19606971 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/audit/HttpAuditEvent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/audit/HttpAuditEvent.java @@ -34,9 +34,16 @@ public class HttpAuditEvent extends AuditEvent { * @param status HTTP status * @param result result of the event */ - public HttpAuditEvent(String sessionId, CurrentUser who, String what, - long when, ListMultimap params, String httpMethod, - Object input, int status, Object result) { + public HttpAuditEvent( + String sessionId, + CurrentUser who, + String what, + long when, + ListMultimap params, + String httpMethod, + Object input, + int status, + Object result) { super(sessionId, who, what, when, params, result); this.httpMethod = httpMethod; this.input = input; diff --git a/gerrit-server/src/main/java/com/google/gerrit/audit/RpcAuditEvent.java b/gerrit-server/src/main/java/com/google/gerrit/audit/RpcAuditEvent.java index cefc3a2500..f6b955c197 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/audit/RpcAuditEvent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/audit/RpcAuditEvent.java @@ -32,9 +32,16 @@ public class RpcAuditEvent extends HttpAuditEvent { * @param status HTTP status * @param result result of the event */ - public RpcAuditEvent(String sessionId, CurrentUser who, String what, - long when, ListMultimap params, String httpMethod, - Object input, int status, Object result) { + public RpcAuditEvent( + String sessionId, + CurrentUser who, + String what, + long when, + ListMultimap params, + String httpMethod, + Object input, + int status, + Object result) { super(sessionId, who, what, when, params, httpMethod, input, status, result); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/audit/SshAuditEvent.java b/gerrit-server/src/main/java/com/google/gerrit/audit/SshAuditEvent.java index 6823de361d..98cba09c65 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/audit/SshAuditEvent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/audit/SshAuditEvent.java @@ -19,8 +19,13 @@ import com.google.gerrit.server.CurrentUser; public class SshAuditEvent extends AuditEvent { - public SshAuditEvent(String sessionId, CurrentUser who, String what, - long when, ListMultimap params, Object result) { + public SshAuditEvent( + String sessionId, + CurrentUser who, + String what, + long when, + ListMultimap params, + Object result) { super(sessionId, who, what, when, params, result); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/common/EventBroker.java b/gerrit-server/src/main/java/com/google/gerrit/common/EventBroker.java index 0029768cb2..87cfea13a8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/common/EventBroker.java +++ b/gerrit-server/src/main/java/com/google/gerrit/common/EventBroker.java @@ -48,10 +48,7 @@ public class EventBroker implements EventDispatcher { } } - /** - * Listeners to receive changes as they happen (limited by visibility of - * user). - */ + /** Listeners to receive changes as they happen (limited by visibility of user). */ protected final DynamicSet listeners; /** Listeners to receive all changes as they happen. */ @@ -64,7 +61,8 @@ public class EventBroker implements EventDispatcher { protected final Provider dbProvider; @Inject - public EventBroker(DynamicSet listeners, + public EventBroker( + DynamicSet listeners, DynamicSet unrestrictedListeners, ProjectCache projectCache, ChangeNotes.Factory notesFactory, @@ -77,8 +75,7 @@ public class EventBroker implements EventDispatcher { } @Override - public void postEvent(Change change, ChangeEvent event) - throws OrmException { + public void postEvent(Change change, ChangeEvent event) throws OrmException { fireEvent(change, event); } @@ -103,8 +100,7 @@ public class EventBroker implements EventDispatcher { } } - protected void fireEvent(Change change, ChangeEvent event) - throws OrmException { + protected void fireEvent(Change change, ChangeEvent event) throws OrmException { for (UserScopedEventListener listener : listeners) { if (isVisibleTo(change, listener.getUser())) { listener.onEvent(event); @@ -148,8 +144,7 @@ public class EventBroker implements EventDispatcher { return pe.controlFor(user).isVisible(); } - protected boolean isVisibleTo(Change change, CurrentUser user) - throws OrmException { + protected boolean isVisibleTo(Change change, CurrentUser user) throws OrmException { if (change == null) { return false; } @@ -171,15 +166,14 @@ public class EventBroker implements EventDispatcher { return pc.controlForRef(branchName).isVisible(); } - protected boolean isVisibleTo(Event event, CurrentUser user) - throws OrmException { + protected boolean isVisibleTo(Event event, CurrentUser user) throws OrmException { if (event instanceof RefEvent) { RefEvent refEvent = (RefEvent) event; String ref = refEvent.getRefName(); if (PatchSet.isChangeRef(ref)) { Change.Id cid = PatchSet.Id.fromRef(ref).getParentKey(); - Change change = notesFactory.create( - dbProvider.get(), refEvent.getProjectNameKey(), cid).getChange(); + Change change = + notesFactory.create(dbProvider.get(), refEvent.getProjectNameKey(), cid).getChange(); return isVisibleTo(change, user); } return isVisibleTo(refEvent.getBranchNameKey(), user); diff --git a/gerrit-server/src/main/java/com/google/gerrit/common/EventDispatcher.java b/gerrit-server/src/main/java/com/google/gerrit/common/EventDispatcher.java index 09fa581f8a..20d55d6cd4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/common/EventDispatcher.java +++ b/gerrit-server/src/main/java/com/google/gerrit/common/EventDispatcher.java @@ -23,7 +23,6 @@ import com.google.gerrit.server.events.ProjectEvent; import com.google.gerrit.server.events.RefEvent; import com.google.gwtorm.server.OrmException; - /** Interface for posting (dispatching) Events */ public interface EventDispatcher { /** @@ -53,10 +52,9 @@ public interface EventDispatcher { /** * Post a stream event generically. - *

- * If you are creating a RefEvent or ChangeEvent from scratch, - * it is more efficient to use the specific postEvent methods - * for those use cases. + * + *

If you are creating a RefEvent or ChangeEvent from scratch, it is more efficient to use the + * specific postEvent methods for those use cases. * * @param event The event to post. * @throws OrmException on failure to post the event due to DB error diff --git a/gerrit-server/src/main/java/com/google/gerrit/common/EventListener.java b/gerrit-server/src/main/java/com/google/gerrit/common/EventListener.java index b2d568090a..6cfc5eb337 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/common/EventListener.java +++ b/gerrit-server/src/main/java/com/google/gerrit/common/EventListener.java @@ -18,8 +18,8 @@ import com.google.gerrit.extensions.annotations.ExtensionPoint; import com.google.gerrit.server.events.Event; /** - * Allows to listen to events without user visibility restrictions. To listen to - * events visible to a specific user, use {@link UserScopedEventListener}. + * Allows to listen to events without user visibility restrictions. To listen to events visible to a + * specific user, use {@link UserScopedEventListener}. */ @ExtensionPoint public interface EventListener { diff --git a/gerrit-server/src/main/java/com/google/gerrit/common/UserScopedEventListener.java b/gerrit-server/src/main/java/com/google/gerrit/common/UserScopedEventListener.java index 22435bad15..3216baca27 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/common/UserScopedEventListener.java +++ b/gerrit-server/src/main/java/com/google/gerrit/common/UserScopedEventListener.java @@ -17,8 +17,8 @@ import com.google.gerrit.extensions.annotations.ExtensionPoint; import com.google.gerrit.server.CurrentUser; /** - * Allows to listen to events visible to the specified user. To listen to events - * without user visibility restrictions, use {@link EventListener}. + * Allows to listen to events visible to the specified user. To listen to events without user + * visibility restrictions, use {@link EventListener}. */ @ExtensionPoint public interface UserScopedEventListener extends EventListener { diff --git a/gerrit-server/src/main/java/com/google/gerrit/common/Version.java b/gerrit-server/src/main/java/com/google/gerrit/common/Version.java index 57a2946045..f5a63aff9e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/common/Version.java +++ b/gerrit-server/src/main/java/com/google/gerrit/common/Version.java @@ -16,13 +16,12 @@ package com.google.gerrit.common; import static java.nio.charset.StandardCharsets.UTF_8; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class Version { private static final Logger log = LoggerFactory.getLogger(Version.class); @@ -57,6 +56,5 @@ public class Version { } } - private Version() { - } + private Version() {} } diff --git a/gerrit-server/src/main/java/com/google/gerrit/lifecycle/LifecycleManager.java b/gerrit-server/src/main/java/com/google/gerrit/lifecycle/LifecycleManager.java index db6faa27f9..bbffd49cf9 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/lifecycle/LifecycleManager.java +++ b/gerrit-server/src/main/java/com/google/gerrit/lifecycle/LifecycleManager.java @@ -23,10 +23,8 @@ import com.google.inject.Injector; import com.google.inject.Provider; import com.google.inject.TypeLiteral; import com.google.inject.util.Providers; - -import org.slf4j.LoggerFactory; - import java.util.List; +import org.slf4j.LoggerFactory; /** Tracks and executes registered {@link LifecycleListener}s. */ public class LifecycleManager { @@ -36,34 +34,38 @@ public class LifecycleManager { /** Index of the last listener to start successfully; -1 when not started. */ private int startedIndex = -1; - /** Add a handle that must be cleared during stop. + /** + * Add a handle that must be cleared during stop. * * @param handle the handle to add. - **/ + */ public void add(RegistrationHandle handle) { handles.add(handle); } - /** Add a single listener. + /** + * Add a single listener. * * @param listener the listener to add. - **/ + */ public void add(LifecycleListener listener) { listeners.add(Providers.of(listener)); } - /** Add a single listener. + /** + * Add a single listener. * * @param listener the listener to add. - **/ + */ public void add(Provider listener) { listeners.add(listener); } - /** Add all {@link LifecycleListener}s registered in the Injector. + /** + * Add all {@link LifecycleListener}s registered in the Injector. * * @param injector the injector to add. - **/ + */ public void add(Injector injector) { Preconditions.checkState(startedIndex < 0, "Already started"); for (Binding binding : get(injector)) { @@ -71,10 +73,11 @@ public class LifecycleManager { } } - /** Add all {@link LifecycleListener}s registered in the Injectors. + /** + * Add all {@link LifecycleListener}s registered in the Injectors. * * @param injectors the injectors to add. - **/ + */ public void add(Injector... injectors) { for (Injector i : injectors) { add(i); diff --git a/gerrit-server/src/main/java/com/google/gerrit/lifecycle/LifecycleModule.java b/gerrit-server/src/main/java/com/google/gerrit/lifecycle/LifecycleModule.java index c22f2ee441..bfb61d2eda 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/lifecycle/LifecycleModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/lifecycle/LifecycleModule.java @@ -5,22 +5,18 @@ import com.google.gerrit.extensions.events.LifecycleListener; import com.google.inject.Singleton; import com.google.inject.binder.LinkedBindingBuilder; import com.google.inject.internal.UniqueAnnotations; - import java.lang.annotation.Annotation; /** Module to support registering a unique LifecyleListener. */ public abstract class LifecycleModule extends FactoryModule { /** * @return a unique listener binding. - *

- * To create a listener binding use: - * - *

+   *     

To create a listener binding use: + *

    * listener().to(MyListener.class);
    * 
- * - * where {@code MyListener} is a {@link Singleton} implementing the - * {@link LifecycleListener} interface. + * where {@code MyListener} is a {@link Singleton} implementing the {@link LifecycleListener} + * interface. */ protected LinkedBindingBuilder listener() { final Annotation id = UniqueAnnotations.create(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/CallbackMetric.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/CallbackMetric.java index 1714c7a150..12646454d8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/CallbackMetric.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/CallbackMetric.java @@ -16,7 +16,6 @@ package com.google.gerrit.metrics; import com.google.gerrit.extensions.registration.RegistrationHandle; - /** * Metric whose value is supplied when the trigger is invoked. * diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/CallbackMetric1.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/CallbackMetric1.java index 864a0eacdf..1df88a6d66 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/CallbackMetric1.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/CallbackMetric1.java @@ -38,6 +38,5 @@ public abstract class CallbackMetric1 implements CallbackMetric { /** Prune any submetrics that were not assigned during this trigger. */ @Override - public void prune() { - } + public void prune() {} } diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/Counter0.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/Counter0.java index a2af7e4beb..d684cd288d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/Counter0.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/Counter0.java @@ -18,13 +18,13 @@ import com.google.gerrit.extensions.registration.RegistrationHandle; /** * Metric whose value increments during the life of the process. - *

- * Suitable uses are "total requests handled", "bytes sent", etc. - * Use {@link Description#setRate()} to suggest the monitoring system - * should also track the rate of increments if this is of interest. - *

- * For an instantaneous read of a value that can change over time - * (e.g. "memory in use") use a {@link CallbackMetric}. + * + *

Suitable uses are "total requests handled", "bytes sent", etc. Use {@link + * Description#setRate()} to suggest the monitoring system should also track the rate of increments + * if this is of interest. + * + *

For an instantaneous read of a value that can change over time (e.g. "memory in use") use a + * {@link CallbackMetric}. */ public abstract class Counter0 implements RegistrationHandle { /** Increment the counter by one event. */ diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/Counter1.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/Counter1.java index 1b8c833554..78b2496279 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/Counter1.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/Counter1.java @@ -18,13 +18,13 @@ import com.google.gerrit.extensions.registration.RegistrationHandle; /** * Metric whose value increments during the life of the process. - *

- * Suitable uses are "total requests handled", "bytes sent", etc. - * Use {@link Description#setRate()} to suggest the monitoring system - * should also track the rate of increments if this is of interest. - *

- * For an instantaneous read of a value that can change over time - * (e.g. "memory in use") use a {@link CallbackMetric}. + * + *

Suitable uses are "total requests handled", "bytes sent", etc. Use {@link + * Description#setRate()} to suggest the monitoring system should also track the rate of increments + * if this is of interest. + * + *

For an instantaneous read of a value that can change over time (e.g. "memory in use") use a + * {@link CallbackMetric}. * * @param type of the field. */ diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/Counter2.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/Counter2.java index a24b46d01b..5f2ae55957 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/Counter2.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/Counter2.java @@ -18,13 +18,13 @@ import com.google.gerrit.extensions.registration.RegistrationHandle; /** * Metric whose value increments during the life of the process. - *

- * Suitable uses are "total requests handled", "bytes sent", etc. - * Use {@link Description#setRate()} to suggest the monitoring system - * should also track the rate of increments if this is of interest. - *

- * For an instantaneous read of a value that can change over time - * (e.g. "memory in use") use a {@link CallbackMetric}. + * + *

Suitable uses are "total requests handled", "bytes sent", etc. Use {@link + * Description#setRate()} to suggest the monitoring system should also track the rate of increments + * if this is of interest. + * + *

For an instantaneous read of a value that can change over time (e.g. "memory in use") use a + * {@link CallbackMetric}. * * @param type of the field. * @param type of the field. diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/Counter3.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/Counter3.java index e0ac5bedc0..7a51bdbd26 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/Counter3.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/Counter3.java @@ -18,13 +18,13 @@ import com.google.gerrit.extensions.registration.RegistrationHandle; /** * Metric whose value increments during the life of the process. - *

- * Suitable uses are "total requests handled", "bytes sent", etc. - * Use {@link Description#setRate()} to suggest the monitoring system - * should also track the rate of increments if this is of interest. - *

- * For an instantaneous read of a value that can change over time - * (e.g. "memory in use") use a {@link CallbackMetric}. + * + *

Suitable uses are "total requests handled", "bytes sent", etc. Use {@link + * Description#setRate()} to suggest the monitoring system should also track the rate of increments + * if this is of interest. + * + *

For an instantaneous read of a value that can change over time (e.g. "memory in use") use a + * {@link CallbackMetric}. * * @param type of the field. * @param type of the field. diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/Description.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/Description.java index b1579f83a6..10568bcd6d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/Description.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/Description.java @@ -17,7 +17,6 @@ package com.google.gerrit.metrics; import com.google.common.base.Strings; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; - import java.util.Map; import java.util.concurrent.TimeUnit; @@ -40,8 +39,7 @@ public class Description { public static final String BYTES = "bytes"; - private Units() { - } + private Units() {} } public enum FieldOrdering { @@ -49,10 +47,9 @@ public class Description { AT_END, /** - * Splits the metric name by inserting field values before the last '/' in - * the metric name. For example {@code "plugins/replication/push_latency"} - * with a {@code Field.ofString("remote")} will create submetrics named - * {@code "plugins/replication/some-server/push_latency"}. + * Splits the metric name by inserting field values before the last '/' in the metric name. For + * example {@code "plugins/replication/push_latency"} with a {@code Field.ofString("remote")} + * will create submetrics named {@code "plugins/replication/some-server/push_latency"}. */ PREFIX_FIELDS_BASENAME; } @@ -62,16 +59,16 @@ public class Description { /** * Describe a metric. * - * @param helpText a short one-sentence string explaining the values captured - * by the metric. This may be made available to administrators as - * documentation in the reporting tools. + * @param helpText a short one-sentence string explaining the values captured by the metric. This + * may be made available to administrators as documentation in the reporting tools. */ public Description(String helpText) { annotations = Maps.newLinkedHashMapWithExpectedSize(4); annotations.put(DESCRIPTION, helpText); } - /** Set unit used to describe the value. + /** + * Set unit used to describe the value. * * @param unitName name of the unit, e.g. "requests", "seconds", etc. * @return this @@ -82,9 +79,8 @@ public class Description { } /** - * Mark the value as constant for the life of this process. Typically used for - * software versions, command line arguments, etc. that cannot change without - * a process restart. + * Mark the value as constant for the life of this process. Typically used for software versions, + * command line arguments, etc. that cannot change without a process restart. * * @return this */ @@ -94,9 +90,8 @@ public class Description { } /** - * Indicates the metric may be usefully interpreted as a count over short - * periods of time, such as request arrival rate. May only be applied to a - * {@link Counter0}. + * Indicates the metric may be usefully interpreted as a count over short periods of time, such as + * request arrival rate. May only be applied to a {@link Counter0}. * * @return this */ @@ -106,8 +101,8 @@ public class Description { } /** - * Instantaneously sampled value that may increase or decrease at a later - * time. Memory allocated or open network connections are examples of gauges. + * Instantaneously sampled value that may increase or decrease at a later time. Memory allocated + * or open network connections are examples of gauges. * * @return this */ @@ -117,9 +112,8 @@ public class Description { } /** - * Indicates the metric accumulates over the lifespan of the process. A - * {@link Counter0} like total requests handled accumulates over the process - * and should be {@code setCumulative()}. + * Indicates the metric accumulates over the lifespan of the process. A {@link Counter0} like + * total requests handled accumulates over the process and should be {@code setCumulative()}. * * @return this */ @@ -175,11 +169,12 @@ public class Description { return getTimeUnit(annotations.get(UNIT)); } - private static final ImmutableMap TIME_UNITS = ImmutableMap.of( - Units.NANOSECONDS, TimeUnit.NANOSECONDS, - Units.MICROSECONDS, TimeUnit.MICROSECONDS, - Units.MILLISECONDS, TimeUnit.MILLISECONDS, - Units.SECONDS, TimeUnit.SECONDS); + private static final ImmutableMap TIME_UNITS = + ImmutableMap.of( + Units.NANOSECONDS, TimeUnit.NANOSECONDS, + Units.MICROSECONDS, TimeUnit.MICROSECONDS, + Units.MILLISECONDS, TimeUnit.MILLISECONDS, + Units.SECONDS, TimeUnit.SECONDS); public static TimeUnit getTimeUnit(String unit) { if (Strings.isNullOrEmpty(unit)) { @@ -187,8 +182,7 @@ public class Description { } TimeUnit u = TIME_UNITS.get(unit); if (u == null) { - throw new IllegalArgumentException(String.format( - "unit %s not TimeUnit", unit)); + throw new IllegalArgumentException(String.format("unit %s not TimeUnit", unit)); } return u; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/DisabledMetricMaker.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/DisabledMetricMaker.java index 1b05e2cc6e..ea408e296c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/DisabledMetricMaker.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/DisabledMetricMaker.java @@ -15,7 +15,6 @@ package com.google.gerrit.metrics; import com.google.gerrit.extensions.registration.RegistrationHandle; - import java.util.Set; import java.util.concurrent.TimeUnit; @@ -24,132 +23,173 @@ public class DisabledMetricMaker extends MetricMaker { @Override public Counter0 newCounter(String name, Description desc) { return new Counter0() { - @Override public void incrementBy(long value) {} - @Override public void remove() {} + @Override + public void incrementBy(long value) {} + + @Override + public void remove() {} }; } @Override - public Counter1 newCounter(String name, Description desc, - Field field1) { + public Counter1 newCounter(String name, Description desc, Field field1) { return new Counter1() { - @Override public void incrementBy(F1 field1, long value) {} - @Override public void remove() {} + @Override + public void incrementBy(F1 field1, long value) {} + + @Override + public void remove() {} }; } @Override - public Counter2 newCounter(String name, Description desc, - Field field1, Field field2) { + public Counter2 newCounter( + String name, Description desc, Field field1, Field field2) { return new Counter2() { - @Override public void incrementBy(F1 field1, F2 field2, long value) {} - @Override public void remove() {} + @Override + public void incrementBy(F1 field1, F2 field2, long value) {} + + @Override + public void remove() {} }; } @Override - public Counter3 newCounter(String name, - Description desc, Field field1, Field field2, Field field3) { + public Counter3 newCounter( + String name, Description desc, Field field1, Field field2, Field field3) { return new Counter3() { - @Override public void incrementBy(F1 field1, F2 field2, F3 field3, long value) {} - @Override public void remove() {} + @Override + public void incrementBy(F1 field1, F2 field2, F3 field3, long value) {} + + @Override + public void remove() {} }; } @Override public Timer0 newTimer(String name, Description desc) { return new Timer0() { - @Override public void record(long value, TimeUnit unit) {} - @Override public void remove() {} + @Override + public void record(long value, TimeUnit unit) {} + + @Override + public void remove() {} }; } @Override - public Timer1 newTimer(String name, Description desc, - Field field1) { + public Timer1 newTimer(String name, Description desc, Field field1) { return new Timer1() { - @Override public void record(F1 field1, long value, TimeUnit unit) {} - @Override public void remove() {} + @Override + public void record(F1 field1, long value, TimeUnit unit) {} + + @Override + public void remove() {} }; } @Override - public Timer2 newTimer(String name, Description desc, - Field field1, Field field2) { + public Timer2 newTimer( + String name, Description desc, Field field1, Field field2) { return new Timer2() { - @Override public void record(F1 field1, F2 field2, long value, TimeUnit unit) {} - @Override public void remove() {} + @Override + public void record(F1 field1, F2 field2, long value, TimeUnit unit) {} + + @Override + public void remove() {} }; } @Override - public Timer3 newTimer(String name, - Description desc, Field field1, Field field2, Field field3) { + public Timer3 newTimer( + String name, Description desc, Field field1, Field field2, Field field3) { return new Timer3() { - @Override public void record(F1 field1, F2 field2, F3 field3, long value, TimeUnit unit) {} - @Override public void remove() {} + @Override + public void record(F1 field1, F2 field2, F3 field3, long value, TimeUnit unit) {} + + @Override + public void remove() {} }; } @Override public Histogram0 newHistogram(String name, Description desc) { return new Histogram0() { - @Override public void record(long value) {} - @Override public void remove() {} + @Override + public void record(long value) {} + + @Override + public void remove() {} }; } @Override - public Histogram1 newHistogram(String name, Description desc, - Field field1) { + public Histogram1 newHistogram(String name, Description desc, Field field1) { return new Histogram1() { - @Override public void record(F1 field1, long value) {} - @Override public void remove() {} + @Override + public void record(F1 field1, long value) {} + + @Override + public void remove() {} }; } @Override - public Histogram2 newHistogram(String name, Description desc, - Field field1, Field field2) { + public Histogram2 newHistogram( + String name, Description desc, Field field1, Field field2) { return new Histogram2() { - @Override public void record(F1 field1, F2 field2, long value) {} - @Override public void remove() {} + @Override + public void record(F1 field1, F2 field2, long value) {} + + @Override + public void remove() {} }; } @Override - public Histogram3 newHistogram(String name, - Description desc, Field field1, Field field2, Field field3) { + public Histogram3 newHistogram( + String name, Description desc, Field field1, Field field2, Field field3) { return new Histogram3() { - @Override public void record(F1 field1, F2 field2, F3 field3, long value) {} - @Override public void remove() {} + @Override + public void record(F1 field1, F2 field2, F3 field3, long value) {} + + @Override + public void remove() {} }; } @Override - public CallbackMetric0 newCallbackMetric(String name, - Class valueClass, Description desc) { + public CallbackMetric0 newCallbackMetric( + String name, Class valueClass, Description desc) { return new CallbackMetric0() { - @Override public void set(V value) {} - @Override public void remove() {} + @Override + public void set(V value) {} + + @Override + public void remove() {} }; } @Override - public CallbackMetric1 newCallbackMetric(String name, - Class valueClass, Description desc, Field field1) { + public CallbackMetric1 newCallbackMetric( + String name, Class valueClass, Description desc, Field field1) { return new CallbackMetric1() { - @Override public void set(F1 field1, V value) {} - @Override public void forceCreate(F1 field1) {} - @Override public void remove() {} + @Override + public void set(F1 field1, V value) {} + + @Override + public void forceCreate(F1 field1) {} + + @Override + public void remove() {} }; } @Override - public RegistrationHandle newTrigger(Set> metrics, - Runnable trigger) { + public RegistrationHandle newTrigger(Set> metrics, Runnable trigger) { return new RegistrationHandle() { - @Override public void remove() {} + @Override + public void remove() {} }; } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/Field.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/Field.java index 95fbf04afb..95eb9cff19 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/Field.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/Field.java @@ -53,8 +53,7 @@ public class Field { * @param name field name * @return enum field */ - public static > Field ofEnum(Class enumType, - String name) { + public static > Field ofEnum(Class enumType, String name) { return ofEnum(enumType, name, null); } @@ -66,16 +65,16 @@ public class Field { * @param description field description * @return enum field */ - public static > Field ofEnum(Class enumType, - String name, String description) { + public static > Field ofEnum( + Class enumType, String name, String description) { return new Field<>(name, enumType, description); } /** * Break down metrics by string. - *

- * Each unique string will allocate a new submetric. Do not use user - * content as a field value as field values are never reclaimed. + * + *

Each unique string will allocate a new submetric. Do not use user content as a field + * value as field values are never reclaimed. * * @param name field name * @return string field @@ -86,9 +85,9 @@ public class Field { /** * Break down metrics by string. - *

- * Each unique string will allocate a new submetric. Do not use user - * content as a field value as field values are never reclaimed. + * + *

Each unique string will allocate a new submetric. Do not use user content as a field + * value as field values are never reclaimed. * * @param name field name * @param description field description @@ -100,9 +99,9 @@ public class Field { /** * Break down metrics by integer. - *

- * Each unique integer will allocate a new submetric. Do not use user - * content as a field value as field values are never reclaimed. + * + *

Each unique integer will allocate a new submetric. Do not use user content as a field + * value as field values are never reclaimed. * * @param name field name * @return integer field @@ -113,9 +112,9 @@ public class Field { /** * Break down metrics by integer. - *

- * Each unique integer will allocate a new submetric. Do not use user - * content as a field value as field values are never reclaimed. + * + *

Each unique integer will allocate a new submetric. Do not use user content as a field + * value as field values are never reclaimed. * * @param name field name * @param description field description @@ -160,7 +159,7 @@ public class Field { @SuppressWarnings("unchecked") private static Function initFormatter(Class keyType) { if (keyType == String.class) { - return (Function) Functions. identity(); + return (Function) Functions.identity(); } else if (keyType == Integer.class || keyType == Boolean.class) { return (Function) Functions.toStringFunction(); } else if (Enum.class.isAssignableFrom(keyType)) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/Histogram0.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/Histogram0.java index fa614d585a..5aad8feaaf 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/Histogram0.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/Histogram0.java @@ -18,8 +18,8 @@ import com.google.gerrit.extensions.registration.RegistrationHandle; /** * Measures the statistical distribution of values in a stream of data. - *

- * Suitable uses are "response size in bytes", etc. + * + *

Suitable uses are "response size in bytes", etc. */ public abstract class Histogram0 implements RegistrationHandle { /** diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/Histogram1.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/Histogram1.java index dd1ed0a34e..3b9307f884 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/Histogram1.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/Histogram1.java @@ -18,8 +18,8 @@ import com.google.gerrit.extensions.registration.RegistrationHandle; /** * Measures the statistical distribution of values in a stream of data. - *

- * Suitable uses are "response size in bytes", etc. + * + *

Suitable uses are "response size in bytes", etc. * * @param type of the field. */ diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/Histogram2.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/Histogram2.java index b1c4482b90..939fe2506f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/Histogram2.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/Histogram2.java @@ -18,8 +18,8 @@ import com.google.gerrit.extensions.registration.RegistrationHandle; /** * Measures the statistical distribution of values in a stream of data. - *

- * Suitable uses are "response size in bytes", etc. + * + *

Suitable uses are "response size in bytes", etc. * * @param type of the field. * @param type of the field. diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/Histogram3.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/Histogram3.java index 0c50e1189d..ed709e13e7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/Histogram3.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/Histogram3.java @@ -18,8 +18,8 @@ import com.google.gerrit.extensions.registration.RegistrationHandle; /** * Measures the statistical distribution of values in a stream of data. - *

- * Suitable uses are "response size in bytes", etc. + * + *

Suitable uses are "response size in bytes", etc. * * @param type of the field. * @param type of the field. diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/MetricMaker.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/MetricMaker.java index 461c6b6cbd..977386952c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/MetricMaker.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/MetricMaker.java @@ -17,7 +17,6 @@ package com.google.gerrit.metrics; import com.google.common.base.Supplier; import com.google.common.collect.ImmutableSet; import com.google.gerrit.extensions.registration.RegistrationHandle; - import java.util.Set; /** Factory to create metrics for monitoring. */ @@ -30,15 +29,14 @@ public abstract class MetricMaker { * @return counter */ public abstract Counter0 newCounter(String name, Description desc); - public abstract Counter1 newCounter( - String name, Description desc, - Field field1); + + public abstract Counter1 newCounter(String name, Description desc, Field field1); + public abstract Counter2 newCounter( - String name, Description desc, - Field field1, Field field2); + String name, Description desc, Field field1, Field field2); + public abstract Counter3 newCounter( - String name, Description desc, - Field field1, Field field2, Field field3); + String name, Description desc, Field field1, Field field2, Field field3); /** * Metric recording time spent on an operation. @@ -48,15 +46,14 @@ public abstract class MetricMaker { * @return timer */ public abstract Timer0 newTimer(String name, Description desc); - public abstract Timer1 newTimer( - String name, Description desc, - Field field1); + + public abstract Timer1 newTimer(String name, Description desc, Field field1); + public abstract Timer2 newTimer( - String name, Description desc, - Field field1, Field field2); + String name, Description desc, Field field1, Field field2); + public abstract Timer3 newTimer( - String name, Description desc, - Field field1, Field field2, Field field3); + String name, Description desc, Field field1, Field field2, Field field3); /** * Metric recording statistical distribution of values. @@ -66,15 +63,14 @@ public abstract class MetricMaker { * @return histogram */ public abstract Histogram0 newHistogram(String name, Description desc); - public abstract Histogram1 newHistogram( - String name, Description desc, - Field field1); + + public abstract Histogram1 newHistogram(String name, Description desc, Field field1); + public abstract Histogram2 newHistogram( - String name, Description desc, - Field field1, Field field2); + String name, Description desc, Field field1, Field field2); + public abstract Histogram3 newHistogram( - String name, Description desc, - Field field1, Field field2, Field field3); + String name, Description desc, Field field1, Field field2, Field field3); /** * Constant value that does not change. @@ -89,12 +85,14 @@ public abstract class MetricMaker { @SuppressWarnings("unchecked") Class type = (Class) value.getClass(); final CallbackMetric0 metric = newCallbackMetric(name, type, desc); - newTrigger(metric, new Runnable() { - @Override - public void run() { - metric.set(value); - } - }); + newTrigger( + metric, + new Runnable() { + @Override + public void run() { + metric.set(value); + } + }); } /** @@ -117,19 +115,21 @@ public abstract class MetricMaker { * @param desc description of the metric. * @param trigger function to compute the value of the metric. */ - public void newCallbackMetric(String name, - Class valueClass, Description desc, final Supplier trigger) { + public void newCallbackMetric( + String name, Class valueClass, Description desc, final Supplier trigger) { final CallbackMetric0 metric = newCallbackMetric(name, valueClass, desc); - newTrigger(metric, new Runnable() { - @Override - public void run() { - metric.set(trigger.get()); - } - }); + newTrigger( + metric, + new Runnable() { + @Override + public void run() { + metric.set(trigger.get()); + } + }); } /** - * Instantaneous reading of a single value. + * Instantaneous reading of a single value. * * @param name field name * @param valueClass field type @@ -138,9 +138,9 @@ public abstract class MetricMaker { */ public abstract CallbackMetric0 newCallbackMetric( String name, Class valueClass, Description desc); + public abstract CallbackMetric1 newCallbackMetric( - String name, Class valueClass, Description desc, - Field field1); + String name, Class valueClass, Description desc, Field field1); /** * Connect logic to populate a previously created {@link CallbackMetric}. @@ -153,16 +153,18 @@ public abstract class MetricMaker { return newTrigger(ImmutableSet.>of(metric1), trigger); } - public RegistrationHandle newTrigger(CallbackMetric metric1, - CallbackMetric metric2, Runnable trigger) { + public RegistrationHandle newTrigger( + CallbackMetric metric1, CallbackMetric metric2, Runnable trigger) { return newTrigger(ImmutableSet.of(metric1, metric2), trigger); } - public RegistrationHandle newTrigger(CallbackMetric metric1, - CallbackMetric metric2, CallbackMetric metric3, Runnable trigger) { + public RegistrationHandle newTrigger( + CallbackMetric metric1, + CallbackMetric metric2, + CallbackMetric metric3, + Runnable trigger) { return newTrigger(ImmutableSet.of(metric1, metric2, metric3), trigger); } - public abstract RegistrationHandle newTrigger(Set> metrics, - Runnable trigger); + public abstract RegistrationHandle newTrigger(Set> metrics, Runnable trigger); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/Timer0.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/Timer0.java index d2c9a527ca..55d1ddfb54 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/Timer0.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/Timer0.java @@ -17,13 +17,12 @@ package com.google.gerrit.metrics; import static java.util.concurrent.TimeUnit.NANOSECONDS; import com.google.gerrit.extensions.registration.RegistrationHandle; - import java.util.concurrent.TimeUnit; /** * Records elapsed time for an operation or span. - *

- * Typical usage in a try-with-resources block: + * + *

Typical usage in a try-with-resources block: * *

  * try (Timer0.Context ctx = timer.start()) {
@@ -53,7 +52,8 @@ public abstract class Timer0 implements RegistrationHandle {
     return new Context(this);
   }
 
-  /** Record a value in the distribution.
+  /**
+   * Record a value in the distribution.
    *
    * @param value value to record
    * @param unit time unit of the value
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/Timer1.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/Timer1.java
index be6931d0b5..f623841a45 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/Timer1.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/Timer1.java
@@ -17,13 +17,12 @@ package com.google.gerrit.metrics;
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
 
 import com.google.gerrit.extensions.registration.RegistrationHandle;
-
 import java.util.concurrent.TimeUnit;
 
 /**
  * Records elapsed time for an operation or span.
- * 

- * Typical usage in a try-with-resources block: + * + *

Typical usage in a try-with-resources block: * *

  * try (Timer1.Context ctx = timer.start(field)) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/Timer2.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/Timer2.java
index 0ace4c3b9e..b03ff83099 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/Timer2.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/Timer2.java
@@ -17,13 +17,12 @@ package com.google.gerrit.metrics;
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
 
 import com.google.gerrit.extensions.registration.RegistrationHandle;
-
 import java.util.concurrent.TimeUnit;
 
 /**
  * Records elapsed time for an operation or span.
- * 

- * Typical usage in a try-with-resources block: + * + *

Typical usage in a try-with-resources block: * *

  * try (Timer2.Context ctx = timer.start(field)) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/Timer3.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/Timer3.java
index 09e899dd20..91af42c35a 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/Timer3.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/Timer3.java
@@ -17,13 +17,12 @@ package com.google.gerrit.metrics;
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
 
 import com.google.gerrit.extensions.registration.RegistrationHandle;
-
 import java.util.concurrent.TimeUnit;
 
 /**
  * Records elapsed time for an operation or span.
- * 

- * Typical usage in a try-with-resources block: + * + *

Typical usage in a try-with-resources block: * *

  * try (Timer3.Context ctx = timer.start(field)) {
@@ -76,6 +75,5 @@ public abstract class Timer3 implements RegistrationHandle {
    * @param value value to record
    * @param unit time unit of the value
    */
-  public abstract void record(F1 field1, F2 field2, F3 field3,
-      long value, TimeUnit unit);
+  public abstract void record(F1 field1, F2 field2, F3 field3, long value, TimeUnit unit);
 }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedCallback.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedCallback.java
index d3fe6edeb9..c7a92a31db 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedCallback.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedCallback.java
@@ -14,15 +14,13 @@
 
 package com.google.gerrit.metrics.dropwizard;
 
+import com.codahale.metrics.Gauge;
+import com.codahale.metrics.Metric;
+import com.codahale.metrics.MetricRegistry;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Maps;
 import com.google.gerrit.metrics.Description;
 import com.google.gerrit.metrics.Field;
-
-import com.codahale.metrics.Gauge;
-import com.codahale.metrics.Metric;
-import com.codahale.metrics.MetricRegistry;
-
 import java.util.Iterator;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -39,8 +37,13 @@ abstract class BucketedCallback implements BucketedMetric {
   protected volatile Runnable trigger;
   private final Object lock = new Object();
 
-  BucketedCallback(DropWizardMetricMaker metrics, MetricRegistry registry,
-      String name, Class valueType, Description desc, Field... fields) {
+  BucketedCallback(
+      DropWizardMetricMaker metrics,
+      MetricRegistry registry,
+      String name,
+      Class valueType,
+      Description desc,
+      Field... fields) {
     this.metrics = metrics;
     this.registry = registry;
     this.name = name;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedCounter.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedCounter.java
index 7894a84338..77062970df 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedCounter.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedCounter.java
@@ -14,14 +14,12 @@
 
 package com.google.gerrit.metrics.dropwizard;
 
+import com.codahale.metrics.Metric;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Maps;
 import com.google.gerrit.metrics.Description;
 import com.google.gerrit.metrics.Field;
 import com.google.gerrit.metrics.dropwizard.DropWizardMetricMaker.CounterImpl;
-
-import com.codahale.metrics.Metric;
-
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -36,8 +34,8 @@ abstract class BucketedCounter implements BucketedMetric {
   private final Map cells;
   private final Object lock = new Object();
 
-  BucketedCounter(DropWizardMetricMaker metrics,
-      String name, Description desc, Field... fields) {
+  BucketedCounter(
+      DropWizardMetricMaker metrics, String name, Description desc, Field... fields) {
     this.metrics = metrics;
     this.name = name;
     this.isRate = desc.isRate();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedHistogram.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedHistogram.java
index ff38cd428f..35eb180cee 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedHistogram.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedHistogram.java
@@ -14,14 +14,12 @@
 
 package com.google.gerrit.metrics.dropwizard;
 
+import com.codahale.metrics.Metric;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Maps;
 import com.google.gerrit.metrics.Description;
 import com.google.gerrit.metrics.Field;
 import com.google.gerrit.metrics.dropwizard.DropWizardMetricMaker.HistogramImpl;
-
-import com.codahale.metrics.Metric;
-
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -35,8 +33,8 @@ abstract class BucketedHistogram implements BucketedMetric {
   private final Map cells;
   private final Object lock = new Object();
 
-  BucketedHistogram(DropWizardMetricMaker metrics, String name,
-      Description desc, Field... fields) {
+  BucketedHistogram(
+      DropWizardMetricMaker metrics, String name, Description desc, Field... fields) {
     this.metrics = metrics;
     this.name = name;
     this.ordering = desc.getFieldOrdering();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedMetric.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedMetric.java
index 799e59449b..9b0b37fcfd 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedMetric.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedMetric.java
@@ -14,16 +14,17 @@
 
 package com.google.gerrit.metrics.dropwizard;
 
+import com.codahale.metrics.Metric;
 import com.google.gerrit.common.Nullable;
 import com.google.gerrit.metrics.Field;
-
-import com.codahale.metrics.Metric;
-
 import java.util.Map;
 
 /** Metric broken down into buckets by {@link Field} values. */
 interface BucketedMetric extends Metric {
-  @Nullable Metric getTotal();
+  @Nullable
+  Metric getTotal();
+
   Field[] getFields();
+
   Map getCells();
 }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedTimer.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedTimer.java
index aff6c4a868..3b19a622b4 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedTimer.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedTimer.java
@@ -14,14 +14,12 @@
 
 package com.google.gerrit.metrics.dropwizard;
 
+import com.codahale.metrics.Metric;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Maps;
 import com.google.gerrit.metrics.Description;
 import com.google.gerrit.metrics.Field;
 import com.google.gerrit.metrics.dropwizard.DropWizardMetricMaker.TimerImpl;
-
-import com.codahale.metrics.Metric;
-
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -35,8 +33,7 @@ abstract class BucketedTimer implements BucketedMetric {
   private final Map cells;
   private final Object lock = new Object();
 
-  BucketedTimer(DropWizardMetricMaker metrics, String name,
-      Description desc, Field... fields) {
+  BucketedTimer(DropWizardMetricMaker metrics, String name, Description desc, Field... fields) {
     this.metrics = metrics;
     this.name = name;
     this.ordering = desc.getFieldOrdering();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CallbackGroup.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CallbackGroup.java
index 372bdcb22e..f153e7e613 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CallbackGroup.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CallbackGroup.java
@@ -15,17 +15,15 @@
 package com.google.gerrit.metrics.dropwizard;
 
 import com.google.common.collect.ImmutableSet;
-
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
 
 /**
  * Run a user specified trigger only once every 2 seconds.
- * 

- * This allows the same Runnable trigger to be applied to several metrics. When - * a recorder is sampling the related metrics only the first access will perform - * recomputation. Reading other related metrics will rely on the already set - * values for the next several seconds. + * + *

This allows the same Runnable trigger to be applied to several metrics. When a recorder is + * sampling the related metrics only the first access will perform recomputation. Reading other + * related metrics will rely on the already set values for the next several seconds. */ class CallbackGroup implements Runnable { private static final long PERIOD = TimeUnit.SECONDS.toNanos(2); @@ -57,7 +55,7 @@ class CallbackGroup implements Runnable { } private boolean reload() { - for (;;) { + for (; ; ) { long now = System.nanoTime(); long next = reloadAt.get(); if (next > now) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CallbackMetricGlue.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CallbackMetricGlue.java index 4f5b7ad933..9fd4fc94db 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CallbackMetricGlue.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CallbackMetricGlue.java @@ -16,7 +16,10 @@ package com.google.gerrit.metrics.dropwizard; interface CallbackMetricGlue { void beginSet(); + void endSet(); + void register(Runnable trigger); + void remove(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CallbackMetricImpl0.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CallbackMetricImpl0.java index dcab692689..6910d22b16 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CallbackMetricImpl0.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CallbackMetricImpl0.java @@ -14,13 +14,10 @@ package com.google.gerrit.metrics.dropwizard; +import com.codahale.metrics.MetricRegistry; import com.google.gerrit.metrics.CallbackMetric0; -import com.codahale.metrics.MetricRegistry; - -class CallbackMetricImpl0 - extends CallbackMetric0 - implements CallbackMetricGlue { +class CallbackMetricImpl0 extends CallbackMetric0 implements CallbackMetricGlue { @SuppressWarnings("unchecked") static V zeroFor(Class valueClass) { if (valueClass == Integer.class) { @@ -36,8 +33,7 @@ class CallbackMetricImpl0 } else if (valueClass == Boolean.class) { return (V) Boolean.FALSE; } else { - throw new IllegalArgumentException("unsupported value type " - + valueClass.getName()); + throw new IllegalArgumentException("unsupported value type " + valueClass.getName()); } } @@ -46,8 +42,8 @@ class CallbackMetricImpl0 private final String name; private volatile V value; - CallbackMetricImpl0(DropWizardMetricMaker metrics, MetricRegistry registry, - String name, Class valueType) { + CallbackMetricImpl0( + DropWizardMetricMaker metrics, MetricRegistry registry, String name, Class valueType) { this.metrics = metrics; this.registry = registry; this.name = name; @@ -55,12 +51,10 @@ class CallbackMetricImpl0 } @Override - public void beginSet() { - } + public void beginSet() {} @Override - public void endSet() { - } + public void endSet() {} @Override public void set(V value) { @@ -75,12 +69,14 @@ class CallbackMetricImpl0 @Override public void register(final Runnable trigger) { - registry.register(name, new com.codahale.metrics.Gauge() { - @Override - public V getValue() { - trigger.run(); - return value; - } - }); + registry.register( + name, + new com.codahale.metrics.Gauge() { + @Override + public V getValue() { + trigger.run(); + return value; + } + }); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CallbackMetricImpl1.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CallbackMetricImpl1.java index 81d5ff547f..6d1daf4bf2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CallbackMetricImpl1.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CallbackMetricImpl1.java @@ -14,17 +14,21 @@ package com.google.gerrit.metrics.dropwizard; +import com.codahale.metrics.MetricRegistry; import com.google.common.base.Function; import com.google.gerrit.metrics.CallbackMetric1; import com.google.gerrit.metrics.Description; import com.google.gerrit.metrics.Field; -import com.codahale.metrics.MetricRegistry; - /** Optimized version of {@link BucketedCallback} for single dimension. */ class CallbackMetricImpl1 extends BucketedCallback { - CallbackMetricImpl1(DropWizardMetricMaker metrics, MetricRegistry registry, - String name, Class valueClass, Description desc, Field field1) { + CallbackMetricImpl1( + DropWizardMetricMaker metrics, + MetricRegistry registry, + String name, + Class valueClass, + Description desc, + Field field1) { super(metrics, registry, name, valueClass, desc, field1); } @@ -32,9 +36,7 @@ class CallbackMetricImpl1 extends BucketedCallback { return new Impl1(); } - private final class Impl1 - extends CallbackMetric1 - implements CallbackMetricGlue { + private final class Impl1 extends CallbackMetric1 implements CallbackMetricGlue { @Override public void beginSet() { doBeginSet(); @@ -76,8 +78,7 @@ class CallbackMetricImpl1 extends BucketedCallback { @Override String name(Object field1) { @SuppressWarnings("unchecked") - Function fmt = - (Function) fields[0].formatter(); + Function fmt = (Function) fields[0].formatter(); return fmt.apply(field1).replace('/', '-'); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CounterImpl1.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CounterImpl1.java index 25647ef1e2..46434ce28b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CounterImpl1.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CounterImpl1.java @@ -21,8 +21,7 @@ import com.google.gerrit.metrics.Field; /** Optimized version of {@link BucketedCounter} for single dimension. */ class CounterImpl1 extends BucketedCounter { - CounterImpl1(DropWizardMetricMaker metrics, String name, Description desc, - Field field1) { + CounterImpl1(DropWizardMetricMaker metrics, String name, Description desc, Field field1) { super(metrics, name, desc, field1); } @@ -44,8 +43,7 @@ class CounterImpl1 extends BucketedCounter { @Override String name(Object field1) { @SuppressWarnings("unchecked") - Function fmt = - (Function) fields[0].formatter(); + Function fmt = (Function) fields[0].formatter(); return fmt.apply(field1).replace('/', '-'); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CounterImplN.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CounterImplN.java index a2f1f8447d..38c31a1b9d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CounterImplN.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CounterImplN.java @@ -24,8 +24,7 @@ import com.google.gerrit.metrics.Field; /** Generalized implementation of N-dimensional counter metrics. */ class CounterImplN extends BucketedCounter implements BucketedMetric { - CounterImplN(DropWizardMetricMaker metrics, String name, Description desc, - Field... fields) { + CounterImplN(DropWizardMetricMaker metrics, String name, Description desc, Field... fields) { super(metrics, name, desc, fields); } @@ -65,8 +64,7 @@ class CounterImplN extends BucketedCounter implements BucketedMetric { ImmutableList keyList = (ImmutableList) key; String[] parts = new String[fields.length]; for (int i = 0; i < fields.length; i++) { - Function fmt = - (Function) fields[i].formatter(); + Function fmt = (Function) fields[i].formatter(); parts[i] = fmt.apply(keyList.get(i)).replace('/', '-'); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/DropWizardMetricMaker.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/DropWizardMetricMaker.java index ee2ce29a07..11277282db 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/DropWizardMetricMaker.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/DropWizardMetricMaker.java @@ -18,6 +18,8 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.gerrit.metrics.dropwizard.MetricResource.METRIC_KIND; import static com.google.gerrit.server.config.ConfigResource.CONFIG_KIND; +import com.codahale.metrics.Metric; +import com.codahale.metrics.MetricRegistry; import com.google.common.collect.FluentIterable; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; @@ -49,10 +51,6 @@ import com.google.gerrit.server.cache.CacheMetrics; import com.google.inject.Inject; import com.google.inject.Scopes; import com.google.inject.Singleton; - -import com.codahale.metrics.Metric; -import com.codahale.metrics.MetricRegistry; - import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -123,8 +121,7 @@ public class DropWizardMetricMaker extends MetricMaker { @Override public synchronized Counter1 newCounter( - String name, Description desc, - Field field1) { + String name, Description desc, Field field1) { checkCounterDescription(name, desc); CounterImpl1 m = new CounterImpl1<>(this, name, desc, field1); define(name, desc); @@ -134,8 +131,7 @@ public class DropWizardMetricMaker extends MetricMaker { @Override public synchronized Counter2 newCounter( - String name, Description desc, - Field field1, Field field2) { + String name, Description desc, Field field1, Field field2) { checkCounterDescription(name, desc); CounterImplN m = new CounterImplN(this, name, desc, field1, field2); define(name, desc); @@ -145,8 +141,7 @@ public class DropWizardMetricMaker extends MetricMaker { @Override public synchronized Counter3 newCounter( - String name, Description desc, - Field field1, Field field2, Field field3) { + String name, Description desc, Field field1, Field field2, Field field3) { checkCounterDescription(name, desc); CounterImplN m = new CounterImplN(this, name, desc, field1, field2, field3); define(name, desc); @@ -198,8 +193,8 @@ public class DropWizardMetricMaker extends MetricMaker { } @Override - public synchronized Timer2 newTimer(String name, Description desc, - Field field1, Field field2) { + public synchronized Timer2 newTimer( + String name, Description desc, Field field1, Field field2) { checkTimerDescription(name, desc); TimerImplN m = new TimerImplN(this, name, desc, field1, field2); define(name, desc); @@ -209,8 +204,7 @@ public class DropWizardMetricMaker extends MetricMaker { @Override public synchronized Timer3 newTimer( - String name, Description desc, - Field field1, Field field2, Field field3) { + String name, Description desc, Field field1, Field field2, Field field3) { checkTimerDescription(name, desc); TimerImplN m = new TimerImplN(this, name, desc, field1, field2, field3); define(name, desc); @@ -239,8 +233,8 @@ public class DropWizardMetricMaker extends MetricMaker { } @Override - public synchronized Histogram1 newHistogram(String name, - Description desc, Field field1) { + public synchronized Histogram1 newHistogram( + String name, Description desc, Field field1) { checkHistogramDescription(name, desc); HistogramImpl1 m = new HistogramImpl1<>(this, name, desc, field1); define(name, desc); @@ -249,8 +243,8 @@ public class DropWizardMetricMaker extends MetricMaker { } @Override - public synchronized Histogram2 newHistogram(String name, - Description desc, Field field1, Field field2) { + public synchronized Histogram2 newHistogram( + String name, Description desc, Field field1, Field field2) { checkHistogramDescription(name, desc); HistogramImplN m = new HistogramImplN(this, name, desc, field1, field2); define(name, desc); @@ -260,8 +254,7 @@ public class DropWizardMetricMaker extends MetricMaker { @Override public synchronized Histogram3 newHistogram( - String name, Description desc, - Field field1, Field field2, Field field3) { + String name, Description desc, Field field1, Field field2, Field field3) { checkHistogramDescription(name, desc); HistogramImplN m = new HistogramImplN(this, name, desc, field1, field2, field3); define(name, desc); @@ -293,8 +286,8 @@ public class DropWizardMetricMaker extends MetricMaker { public CallbackMetric1 newCallbackMetric( String name, Class valueClass, Description desc, Field field1) { checkMetricName(name); - CallbackMetricImpl1 m = new CallbackMetricImpl1<>(this, registry, - name, valueClass, desc, field1); + CallbackMetricImpl1 m = + new CallbackMetricImpl1<>(this, registry, name, valueClass, desc, field1); define(name, desc); bucketed.put(name, m); return m.create(); @@ -303,9 +296,8 @@ public class DropWizardMetricMaker extends MetricMaker { @Override public synchronized RegistrationHandle newTrigger( Set> metrics, Runnable trigger) { - ImmutableSet all = FluentIterable.from(metrics) - .transform(m -> (CallbackMetricGlue) m) - .toSet(); + ImmutableSet all = + FluentIterable.from(metrics).transform(m -> (CallbackMetricGlue) m).toSet(); trigger = new CallbackGroup(trigger, all); for (CallbackMetricGlue m : all) { @@ -330,24 +322,22 @@ public class DropWizardMetricMaker extends MetricMaker { private synchronized void define(String name, Description desc) { if (descriptions.containsKey(name)) { - throw new IllegalStateException(String.format( - "metric %s already defined", name)); + throw new IllegalStateException(String.format("metric %s already defined", name)); } descriptions.put(name, desc.getAnnotations()); } - private static final Pattern METRIC_NAME_PATTERN = Pattern - .compile("[a-zA-Z0-9_-]+(/[a-zA-Z0-9_-]+)*"); + private static final Pattern METRIC_NAME_PATTERN = + Pattern.compile("[a-zA-Z0-9_-]+(/[a-zA-Z0-9_-]+)*"); private static void checkMetricName(String name) { checkArgument( METRIC_NAME_PATTERN.matcher(name).matches(), - "metric name must match %s", METRIC_NAME_PATTERN.pattern()); + "metric name must match %s", + METRIC_NAME_PATTERN.pattern()); } - static String name(Description.FieldOrdering ordering, - String codeName, - String fieldValues) { + static String name(Description.FieldOrdering ordering, String codeName, String fieldValues) { if (ordering == FieldOrdering.PREFIX_FIELDS_BASENAME) { int s = codeName.lastIndexOf('/'); if (s > 0) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/GetMetric.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/GetMetric.java index 47064df2bb..52e35c332d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/GetMetric.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/GetMetric.java @@ -18,7 +18,6 @@ import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.extensions.restapi.RestReadView; import com.google.gerrit.server.CurrentUser; import com.google.inject.Inject; - import org.kohsuke.args4j.Option; class GetMetric implements RestReadView { @@ -40,8 +39,6 @@ class GetMetric implements RestReadView { throw new AuthException("restricted to viewCaches"); } return new MetricJson( - resource.getMetric(), - metrics.getAnnotations(resource.getName()), - dataOnly); + resource.getMetric(), metrics.getAnnotations(resource.getName()), dataOnly); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/HistogramImpl1.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/HistogramImpl1.java index e3f9e1cf2f..3eb12faaf1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/HistogramImpl1.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/HistogramImpl1.java @@ -21,8 +21,7 @@ import com.google.gerrit.metrics.Histogram1; /** Optimized version of {@link BucketedHistogram} for single dimension. */ class HistogramImpl1 extends BucketedHistogram implements BucketedMetric { - HistogramImpl1(DropWizardMetricMaker metrics, String name, - Description desc, Field field1) { + HistogramImpl1(DropWizardMetricMaker metrics, String name, Description desc, Field field1) { super(metrics, name, desc, field1); } @@ -44,8 +43,7 @@ class HistogramImpl1 extends BucketedHistogram implements BucketedMetric { @Override String name(Object field1) { @SuppressWarnings("unchecked") - Function fmt = - (Function) fields[0].formatter(); + Function fmt = (Function) fields[0].formatter(); return fmt.apply(field1).replace('/', '-'); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/HistogramImplN.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/HistogramImplN.java index d832c6069a..3561c55a1d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/HistogramImplN.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/HistogramImplN.java @@ -24,8 +24,7 @@ import com.google.gerrit.metrics.Histogram3; /** Generalized implementation of N-dimensional Histogram metrics. */ class HistogramImplN extends BucketedHistogram implements BucketedMetric { - HistogramImplN(DropWizardMetricMaker metrics, String name, - Description desc, Field... fields) { + HistogramImplN(DropWizardMetricMaker metrics, String name, Description desc, Field... fields) { super(metrics, name, desc, fields); } @@ -65,8 +64,7 @@ class HistogramImplN extends BucketedHistogram implements BucketedMetric { ImmutableList keyList = (ImmutableList) key; String[] parts = new String[fields.length]; for (int i = 0; i < fields.length; i++) { - Function fmt = - (Function) fields[i].formatter(); + Function fmt = (Function) fields[i].formatter(); parts[i] = fmt.apply(keyList.get(i)).replace('/', '-'); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/ListMetrics.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/ListMetrics.java index 04d10a25dc..891f4aca60 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/ListMetrics.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/ListMetrics.java @@ -14,21 +14,18 @@ package com.google.gerrit.metrics.dropwizard; +import com.codahale.metrics.Metric; import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.extensions.restapi.RestReadView; import com.google.gerrit.server.CurrentUser; import com.google.gerrit.server.config.ConfigResource; import com.google.inject.Inject; - -import com.codahale.metrics.Metric; - -import org.kohsuke.args4j.Option; - import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; +import org.kohsuke.args4j.Option; class ListMetrics implements RestReadView { private final CurrentUser user; @@ -37,8 +34,12 @@ class ListMetrics implements RestReadView { @Option(name = "--data-only", usage = "return only values") boolean dataOnly; - @Option(name = "--prefix", aliases = {"-p"}, metaVar = "PREFIX", - usage = "match metric by exact match or prefix") + @Option( + name = "--prefix", + aliases = {"-p"}, + metaVar = "PREFIX", + usage = "match metric by exact match or prefix" + ) List query = new ArrayList<>(); @Inject @@ -48,8 +49,7 @@ class ListMetrics implements RestReadView { } @Override - public Map apply(ConfigResource resource) - throws AuthException { + public Map apply(ConfigResource resource) throws AuthException { if (!user.getCapabilities().canViewCaches()) { throw new AuthException("restricted to viewCaches"); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/MetricJson.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/MetricJson.java index b332262312..20806239e7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/MetricJson.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/MetricJson.java @@ -14,12 +14,6 @@ package com.google.gerrit.metrics.dropwizard; -import com.google.common.base.Function; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.gerrit.metrics.Description; -import com.google.gerrit.metrics.Field; - import com.codahale.metrics.Counter; import com.codahale.metrics.Gauge; import com.codahale.metrics.Histogram; @@ -27,7 +21,11 @@ import com.codahale.metrics.Meter; import com.codahale.metrics.Metric; import com.codahale.metrics.Snapshot; import com.codahale.metrics.Timer; - +import com.google.common.base.Function; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.gerrit.metrics.Description; +import com.google.gerrit.metrics.Field; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -114,8 +112,7 @@ class MetricJson { rate_5m = m.getFiveMinuteRate(); rate_15m = m.getFifteenMinuteRate(); - double div = - Description.getTimeUnit(atts.get(Description.UNIT)).toNanos(1); + double div = Description.getTimeUnit(atts.get(Description.UNIT)).toNanos(1); p50 = s.getMedian() / div; p75 = s.get75thPercentile() / div; p95 = s.get95thPercentile() / div; @@ -153,17 +150,12 @@ class MetricJson { @SuppressWarnings("unchecked") private static Map makeBuckets( - Field[] fields, - Map metrics, - ImmutableMap atts) { + Field[] fields, Map metrics, ImmutableMap atts) { if (fields.length == 1) { - Function fmt = - (Function) fields[0].formatter(); + Function fmt = (Function) fields[0].formatter(); Map out = new TreeMap<>(); for (Map.Entry e : metrics.entrySet()) { - out.put( - fmt.apply(e.getKey()), - new MetricJson(e.getValue(), atts, true)); + out.put(fmt.apply(e.getKey()), new MetricJson(e.getValue(), atts, true)); } return out; } @@ -174,8 +166,7 @@ class MetricJson { Map dst = out; for (int i = 0; i < fields.length - 1; i++) { - Function fmt = - (Function) fields[i].formatter(); + Function fmt = (Function) fields[i].formatter(); String key = fmt.apply(keys.get(i)); Map t = (Map) dst.get(key); if (t == null) { @@ -187,9 +178,7 @@ class MetricJson { Function fmt = (Function) fields[fields.length - 1].formatter(); - dst.put( - fmt.apply(keys.get(fields.length - 1)), - new MetricJson(e.getValue(), atts, true)); + dst.put(fmt.apply(keys.get(fields.length - 1)), new MetricJson(e.getValue(), atts, true)); } return out; } @@ -202,9 +191,8 @@ class MetricJson { FieldJson(Field field) { this.name = field.getName(); this.description = field.getDescription(); - this.type = Enum.class.isAssignableFrom(field.getType()) - ? field.getType().getSimpleName() - : null; + this.type = + Enum.class.isAssignableFrom(field.getType()) ? field.getType().getSimpleName() : null; } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/MetricResource.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/MetricResource.java index d073f37e74..226edc763d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/MetricResource.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/MetricResource.java @@ -14,12 +14,11 @@ package com.google.gerrit.metrics.dropwizard; +import com.codahale.metrics.Metric; import com.google.gerrit.extensions.restapi.RestView; import com.google.gerrit.server.config.ConfigResource; import com.google.inject.TypeLiteral; -import com.codahale.metrics.Metric; - class MetricResource extends ConfigResource { static final TypeLiteral> METRIC_KIND = new TypeLiteral>() {}; diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/MetricsCollection.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/MetricsCollection.java index 81945f10e3..2686f1f350 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/MetricsCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/MetricsCollection.java @@ -14,6 +14,7 @@ package com.google.gerrit.metrics.dropwizard; +import com.codahale.metrics.Metric; import com.google.gerrit.extensions.registration.DynamicMap; import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.extensions.restapi.ChildCollection; @@ -26,19 +27,18 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; -import com.codahale.metrics.Metric; - @Singleton -class MetricsCollection implements - ChildCollection { +class MetricsCollection implements ChildCollection { private final DynamicMap> views; private final Provider list; private final Provider user; private final DropWizardMetricMaker metrics; @Inject - MetricsCollection(DynamicMap> views, - Provider list, Provider user, + MetricsCollection( + DynamicMap> views, + Provider list, + Provider user, DropWizardMetricMaker metrics) { this.views = views; this.list = list; diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/TimerImpl1.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/TimerImpl1.java index 0164f6f5b5..fe6f70e203 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/TimerImpl1.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/TimerImpl1.java @@ -18,13 +18,11 @@ import com.google.common.base.Function; import com.google.gerrit.metrics.Description; import com.google.gerrit.metrics.Field; import com.google.gerrit.metrics.Timer1; - import java.util.concurrent.TimeUnit; /** Optimized version of {@link BucketedTimer} for single dimension. */ class TimerImpl1 extends BucketedTimer implements BucketedMetric { - TimerImpl1(DropWizardMetricMaker metrics, String name, - Description desc, Field field1) { + TimerImpl1(DropWizardMetricMaker metrics, String name, Description desc, Field field1) { super(metrics, name, desc, field1); } @@ -46,8 +44,7 @@ class TimerImpl1 extends BucketedTimer implements BucketedMetric { @Override String name(Object field1) { @SuppressWarnings("unchecked") - Function fmt = - (Function) fields[0].formatter(); + Function fmt = (Function) fields[0].formatter(); return fmt.apply(field1).replace('/', '-'); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/TimerImplN.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/TimerImplN.java index 49c9f14e58..43cc2907b2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/TimerImplN.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/TimerImplN.java @@ -21,13 +21,11 @@ import com.google.gerrit.metrics.Description; import com.google.gerrit.metrics.Field; import com.google.gerrit.metrics.Timer2; import com.google.gerrit.metrics.Timer3; - import java.util.concurrent.TimeUnit; /** Generalized implementation of N-dimensional timer metrics. */ class TimerImplN extends BucketedTimer implements BucketedMetric { - TimerImplN(DropWizardMetricMaker metrics, String name, - Description desc, Field... fields) { + TimerImplN(DropWizardMetricMaker metrics, String name, Description desc, Field... fields) { super(metrics, name, desc, fields); } @@ -49,8 +47,7 @@ class TimerImplN extends BucketedTimer implements BucketedMetric { Timer3 timer3() { return new Timer3() { @Override - public void record(F1 field1, F2 field2, F3 field3, - long value, TimeUnit unit) { + public void record(F1 field1, F2 field2, F3 field3, long value, TimeUnit unit) { total.record(value, unit); forceCreate(field1, field2, field3).record(value, unit); } @@ -68,8 +65,7 @@ class TimerImplN extends BucketedTimer implements BucketedMetric { ImmutableList keyList = (ImmutableList) key; String[] parts = new String[fields.length]; for (int i = 0; i < fields.length; i++) { - Function fmt = - (Function) fields[i].formatter(); + Function fmt = (Function) fields[i].formatter(); parts[i] = fmt.apply(keyList.get(i)).replace('/', '-'); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/proc/JGitMetricModule.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/proc/JGitMetricModule.java index b5a2fcc8a1..c3eb39f2f2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/proc/JGitMetricModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/proc/JGitMetricModule.java @@ -18,31 +18,28 @@ import com.google.common.base.Supplier; import com.google.gerrit.metrics.Description; import com.google.gerrit.metrics.Description.Units; import com.google.gerrit.metrics.MetricMaker; - import org.eclipse.jgit.internal.storage.file.WindowCacheStatAccessor; public class JGitMetricModule extends MetricModule { @Override protected void configure(MetricMaker metrics) { metrics.newCallbackMetric( - "jgit/block_cache/cache_used", - Long.class, - new Description("Bytes of memory retained in JGit block cache.") - .setGauge() - .setUnit(Units.BYTES), - new Supplier() { - @Override - public Long get() { - return WindowCacheStatAccessor.getOpenBytes(); - } - }); + "jgit/block_cache/cache_used", + Long.class, + new Description("Bytes of memory retained in JGit block cache.") + .setGauge() + .setUnit(Units.BYTES), + new Supplier() { + @Override + public Long get() { + return WindowCacheStatAccessor.getOpenBytes(); + } + }); metrics.newCallbackMetric( "jgit/block_cache/open_files", Integer.class, - new Description("File handles held open by JGit block cache.") - .setGauge() - .setUnit("fds"), + new Description("File handles held open by JGit block cache.").setGauge().setUnit("fds"), new Supplier() { @Override public Integer get() { diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/proc/MetricModule.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/proc/MetricModule.java index c556ee4e08..200a29d038 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/proc/MetricModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/proc/MetricModule.java @@ -26,18 +26,18 @@ public abstract class MetricModule extends LifecycleModule { @Override protected void configure() { - listener().toInstance(new LifecycleListener() { - @Inject - MetricMaker metrics; + listener() + .toInstance( + new LifecycleListener() { + @Inject MetricMaker metrics; - @Override - public void start() { - configure(metrics); - } + @Override + public void start() { + configure(metrics); + } - @Override - public void stop() { - } - }); + @Override + public void stop() {} + }); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/proc/ProcMetricModule.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/proc/ProcMetricModule.java index 53b860c20e..64a88bbcdb 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/metrics/proc/ProcMetricModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/proc/ProcMetricModule.java @@ -25,10 +25,8 @@ import com.google.gerrit.metrics.Description; import com.google.gerrit.metrics.Description.Units; import com.google.gerrit.metrics.Field; import com.google.gerrit.metrics.MetricMaker; - import com.sun.management.OperatingSystemMXBean; import com.sun.management.UnixOperatingSystemMXBean; - import java.lang.management.GarbageCollectorMXBean; import java.lang.management.ManagementFactory; import java.lang.management.MemoryMXBean; @@ -58,16 +56,13 @@ public class ProcMetricModule extends MetricModule { private void procUptime(MetricMaker metrics) { metrics.newConstantMetric( "proc/birth_timestamp", - Long.valueOf(TimeUnit.MILLISECONDS.toMicros( - System.currentTimeMillis())), - new Description("Time at which the process started") - .setUnit(Units.MICROSECONDS)); + Long.valueOf(TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis())), + new Description("Time at which the process started").setUnit(Units.MICROSECONDS)); metrics.newCallbackMetric( "proc/uptime", Long.class, - new Description("Uptime of this process") - .setUnit(Units.MILLISECONDS), + new Description("Uptime of this process").setUnit(Units.MILLISECONDS), new Supplier() { @Override public Long get() { @@ -83,9 +78,7 @@ public class ProcMetricModule extends MetricModule { metrics.newCallbackMetric( "proc/cpu/usage", Double.class, - new Description("CPU time used by the process") - .setCumulative() - .setUnit(Units.SECONDS), + new Description("CPU time used by the process").setCumulative().setUnit(Units.SECONDS), new Supplier() { @Override public Double get() { @@ -99,9 +92,7 @@ public class ProcMetricModule extends MetricModule { metrics.newCallbackMetric( "proc/num_open_fds", Long.class, - new Description("Number of open file descriptors") - .setGauge() - .setUnit("fds"), + new Description("Number of open file descriptors").setGauge().setUnit("fds"), new Supplier() { @Override public Long get() { @@ -113,99 +104,105 @@ public class ProcMetricModule extends MetricModule { } private void procJvmMemory(MetricMaker metrics) { - final CallbackMetric0 heapCommitted = metrics.newCallbackMetric( - "proc/jvm/memory/heap_committed", - Long.class, - new Description("Amount of memory guaranteed for user objects.") - .setGauge() - .setUnit(Units.BYTES)); + final CallbackMetric0 heapCommitted = + metrics.newCallbackMetric( + "proc/jvm/memory/heap_committed", + Long.class, + new Description("Amount of memory guaranteed for user objects.") + .setGauge() + .setUnit(Units.BYTES)); - final CallbackMetric0 heapUsed = metrics.newCallbackMetric( - "proc/jvm/memory/heap_used", - Long.class, - new Description("Amount of memory holding user objects.") - .setGauge() - .setUnit(Units.BYTES)); + final CallbackMetric0 heapUsed = + metrics.newCallbackMetric( + "proc/jvm/memory/heap_used", + Long.class, + new Description("Amount of memory holding user objects.") + .setGauge() + .setUnit(Units.BYTES)); - final CallbackMetric0 nonHeapCommitted = metrics.newCallbackMetric( - "proc/jvm/memory/non_heap_committed", - Long.class, - new Description("Amount of memory guaranteed for classes, etc.") - .setGauge() - .setUnit(Units.BYTES)); + final CallbackMetric0 nonHeapCommitted = + metrics.newCallbackMetric( + "proc/jvm/memory/non_heap_committed", + Long.class, + new Description("Amount of memory guaranteed for classes, etc.") + .setGauge() + .setUnit(Units.BYTES)); - final CallbackMetric0 nonHeapUsed = metrics.newCallbackMetric( - "proc/jvm/memory/non_heap_used", - Long.class, - new Description("Amount of memory holding classes, etc.") - .setGauge() - .setUnit(Units.BYTES)); + final CallbackMetric0 nonHeapUsed = + metrics.newCallbackMetric( + "proc/jvm/memory/non_heap_used", + Long.class, + new Description("Amount of memory holding classes, etc.") + .setGauge() + .setUnit(Units.BYTES)); final CallbackMetric0 objectPendingFinalizationCount = metrics.newCallbackMetric( - "proc/jvm/memory/object_pending_finalization_count", - Integer.class, - new Description("Approximate number of objects needing finalization.") - .setGauge() - .setUnit("objects")); + "proc/jvm/memory/object_pending_finalization_count", + Integer.class, + new Description("Approximate number of objects needing finalization.") + .setGauge() + .setUnit("objects")); final MemoryMXBean memory = ManagementFactory.getMemoryMXBean(); metrics.newTrigger( - ImmutableSet.> of( - heapCommitted, heapUsed, nonHeapCommitted, - nonHeapUsed, objectPendingFinalizationCount), - new Runnable() { - @Override - public void run() { - try { - MemoryUsage stats = memory.getHeapMemoryUsage(); - heapCommitted.set(stats.getCommitted()); - heapUsed.set(stats.getUsed()); - } catch (IllegalArgumentException e) { - // MXBean may throw due to a bug in Java 7; ignore. + ImmutableSet.>of( + heapCommitted, heapUsed, nonHeapCommitted, nonHeapUsed, objectPendingFinalizationCount), + new Runnable() { + @Override + public void run() { + try { + MemoryUsage stats = memory.getHeapMemoryUsage(); + heapCommitted.set(stats.getCommitted()); + heapUsed.set(stats.getUsed()); + } catch (IllegalArgumentException e) { + // MXBean may throw due to a bug in Java 7; ignore. + } + + MemoryUsage stats = memory.getNonHeapMemoryUsage(); + nonHeapCommitted.set(stats.getCommitted()); + nonHeapUsed.set(stats.getUsed()); + + objectPendingFinalizationCount.set(memory.getObjectPendingFinalizationCount()); } - - MemoryUsage stats = memory.getNonHeapMemoryUsage(); - nonHeapCommitted.set(stats.getCommitted()); - nonHeapUsed.set(stats.getUsed()); - - objectPendingFinalizationCount.set( - memory.getObjectPendingFinalizationCount()); - } - }); + }); } private void procJvmGc(MetricMaker metrics) { - final CallbackMetric1 gcCount = metrics.newCallbackMetric( - "proc/jvm/gc/count", - Long.class, - new Description("Number of GCs").setCumulative(), - Field.ofString("gc_name", "The name of the garbage collector")); + final CallbackMetric1 gcCount = + metrics.newCallbackMetric( + "proc/jvm/gc/count", + Long.class, + new Description("Number of GCs").setCumulative(), + Field.ofString("gc_name", "The name of the garbage collector")); - final CallbackMetric1 gcTime = metrics.newCallbackMetric( - "proc/jvm/gc/time", - Long.class, - new Description("Approximate accumulated GC elapsed time") - .setCumulative() - .setUnit(Units.MILLISECONDS), - Field.ofString("gc_name", "The name of the garbage collector")); + final CallbackMetric1 gcTime = + metrics.newCallbackMetric( + "proc/jvm/gc/time", + Long.class, + new Description("Approximate accumulated GC elapsed time") + .setCumulative() + .setUnit(Units.MILLISECONDS), + Field.ofString("gc_name", "The name of the garbage collector")); - metrics.newTrigger(gcCount, gcTime, new Runnable() { - @Override - public void run() { - for (GarbageCollectorMXBean gc : ManagementFactory - .getGarbageCollectorMXBeans()) { - long count = gc.getCollectionCount(); - if (count != -1) { - gcCount.set(gc.getName(), count); + metrics.newTrigger( + gcCount, + gcTime, + new Runnable() { + @Override + public void run() { + for (GarbageCollectorMXBean gc : ManagementFactory.getGarbageCollectorMXBeans()) { + long count = gc.getCollectionCount(); + if (count != -1) { + gcCount.set(gc.getName(), count); + } + long time = gc.getCollectionTime(); + if (time != -1) { + gcTime.set(gc.getName(), time); + } + } } - long time = gc.getCollectionTime(); - if (time != -1) { - gcTime.set(gc.getName(), time); - } - } - } - }); + }); } private void procJvmThread(MetricMaker metrics) { @@ -213,9 +210,7 @@ public class ProcMetricModule extends MetricModule { metrics.newCallbackMetric( "proc/jvm/thread/num_live", Integer.class, - new Description("Current live thread count") - .setGauge() - .setUnit("threads"), + new Description("Current live thread count").setGauge().setUnit("threads"), new Supplier() { @Override public Integer get() { diff --git a/gerrit-server/src/main/java/com/google/gerrit/rules/PredicateClassLoader.java b/gerrit-server/src/main/java/com/google/gerrit/rules/PredicateClassLoader.java index 52a93635fd..c2643de57e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/rules/PredicateClassLoader.java +++ b/gerrit-server/src/main/java/com/google/gerrit/rules/PredicateClassLoader.java @@ -17,33 +17,27 @@ package com.google.gerrit.rules; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.SetMultimap; import com.google.gerrit.extensions.registration.DynamicSet; - import java.util.Collection; -/** - * Loads the classes for Prolog predicates. - */ +/** Loads the classes for Prolog predicates. */ public class PredicateClassLoader extends ClassLoader { private final SetMultimap packageClassLoaderMap = LinkedHashMultimap.create(); public PredicateClassLoader( - final DynamicSet predicateProviders, - final ClassLoader parent) { + final DynamicSet predicateProviders, final ClassLoader parent) { super(parent); for (PredicateProvider predicateProvider : predicateProviders) { for (String pkg : predicateProvider.getPackages()) { - packageClassLoaderMap.put(pkg, predicateProvider.getClass() - .getClassLoader()); + packageClassLoaderMap.put(pkg, predicateProvider.getClass().getClassLoader()); } } } @Override - protected Class findClass(final String className) - throws ClassNotFoundException { + protected Class findClass(final String className) throws ClassNotFoundException { final Collection classLoaders = packageClassLoaderMap.get(getPackageName(className)); for (final ClassLoader cl : classLoaders) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/rules/PredicateProvider.java b/gerrit-server/src/main/java/com/google/gerrit/rules/PredicateProvider.java index 9d32e381dd..c64bc920af 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/rules/PredicateProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/rules/PredicateProvider.java @@ -15,17 +15,15 @@ package com.google.gerrit.rules; import com.google.common.collect.ImmutableSet; import com.google.gerrit.extensions.annotations.ExtensionPoint; - import com.googlecode.prolog_cafe.lang.Predicate; /** - * Provides additional packages that contain Prolog predicates that should be - * made available in the Prolog environment. The predicates can e.g. be used in - * the project submit rules. + * Provides additional packages that contain Prolog predicates that should be made available in the + * Prolog environment. The predicates can e.g. be used in the project submit rules. * - * Each Java class defining a Prolog predicate must be in one of the provided - * packages and its name must apply to the 'PRED_[functor]_[arity]' format. In - * addition it must extend {@link Predicate}. + *

Each Java class defining a Prolog predicate must be in one of the provided packages and its + * name must apply to the 'PRED_[functor]_[arity]' format. In addition it must extend {@link + * Predicate}. */ @ExtensionPoint public interface PredicateProvider { diff --git a/gerrit-server/src/main/java/com/google/gerrit/rules/PrologEnvironment.java b/gerrit-server/src/main/java/com/google/gerrit/rules/PrologEnvironment.java index de54a0b014..9538121a41 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/rules/PrologEnvironment.java +++ b/gerrit-server/src/main/java/com/google/gerrit/rules/PrologEnvironment.java @@ -25,34 +25,30 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; import com.google.inject.assistedinject.Assisted; - import com.googlecode.prolog_cafe.lang.BufferingPrologControl; import com.googlecode.prolog_cafe.lang.Predicate; import com.googlecode.prolog_cafe.lang.PredicateEncoder; import com.googlecode.prolog_cafe.lang.Prolog; import com.googlecode.prolog_cafe.lang.PrologMachineCopy; - -import org.eclipse.jgit.lib.Config; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.EnumSet; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; +import org.eclipse.jgit.lib.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Per-thread Prolog interpreter. - *

- * This class is not thread safe. - *

- * A single copy of the Prolog interpreter, for the current thread. + * + *

This class is not thread safe. + * + *

A single copy of the Prolog interpreter, for the current thread. */ public class PrologEnvironment extends BufferingPrologControl { - private static final Logger log = - LoggerFactory.getLogger(PrologEnvironment.class); + private static final Logger log = LoggerFactory.getLogger(PrologEnvironment.class); public interface Factory { /** @@ -112,8 +108,8 @@ public class PrologEnvironment extends BufferingPrologControl { } /** - * Copy the stored values from another interpreter to this one. - * Also gets the cleanup from the child interpreter + * Copy the stored values from another interpreter to this one. Also gets the cleanup from the + * child interpreter */ public void copyStoredValues(PrologEnvironment child) { storedValues.putAll(child.storedValues); @@ -121,9 +117,8 @@ public class PrologEnvironment extends BufferingPrologControl { } /** - * Assign the environment a cleanup list (in order to use a centralized list) - * If this enivronment's list is non-empty, append its cleanup tasks to the - * assigning list. + * Assign the environment a cleanup list (in order to use a centralized list) If this + * enivronment's list is non-empty, append its cleanup tasks to the assigning list. */ public void setCleanup(List newCleanupList) { newCleanupList.addAll(cleanup); @@ -132,17 +127,16 @@ public class PrologEnvironment extends BufferingPrologControl { /** * Adds cleanup task to run when close() is called + * * @param task is run when close() is called */ public void addToCleanup(Runnable task) { cleanup.add(task); } - /** - * Release resources stored in interpreter's hash manager. - */ + /** Release resources stored in interpreter's hash manager. */ public void close() { - for (final Iterator i = cleanup.iterator(); i.hasNext();) { + for (final Iterator i = cleanup.iterator(); i.hasNext(); ) { try { i.next().run(); } catch (Throwable err) { @@ -155,12 +149,16 @@ public class PrologEnvironment extends BufferingPrologControl { @Singleton public static class Args { private static final Class CONSULT_STREAM_2; + static { try { @SuppressWarnings("unchecked") - Class c = (Class) Class.forName( - PredicateEncoder.encode(Prolog.BUILTIN, "consult_stream", 2), - false, RulesCache.class.getClassLoader()); + Class c = + (Class) + Class.forName( + PredicateEncoder.encode(Prolog.BUILTIN, "consult_stream", 2), + false, + RulesCache.class.getClassLoader()); CONSULT_STREAM_2 = c; } catch (ClassNotFoundException e) { throw new LinkageError("cannot find predicate consult_stream", e); @@ -177,7 +175,8 @@ public class PrologEnvironment extends BufferingPrologControl { private final int compileLimit; @Inject - Args(ProjectCache projectCache, + Args( + ProjectCache projectCache, GitRepositoryManager repositoryManager, PatchListCache patchListCache, PatchSetInfoFactory patchSetInfoFactory, @@ -194,8 +193,12 @@ public class PrologEnvironment extends BufferingPrologControl { int limit = config.getInt("rules", null, "reductionLimit", 100000); reductionLimit = limit <= 0 ? Integer.MAX_VALUE : limit; - limit = config.getInt("rules", null, "compileReductionLimit", - (int) Math.min(10L * limit, Integer.MAX_VALUE)); + limit = + config.getInt( + "rules", + null, + "compileReductionLimit", + (int) Math.min(10L * limit, Integer.MAX_VALUE)); compileLimit = limit <= 0 ? Integer.MAX_VALUE : limit; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/rules/RulesCache.java b/gerrit-server/src/main/java/com/google/gerrit/rules/RulesCache.java index 068b70d2a7..e364f5fcd2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/rules/RulesCache.java +++ b/gerrit-server/src/main/java/com/google/gerrit/rules/RulesCache.java @@ -26,7 +26,6 @@ import com.google.gerrit.server.config.SitePaths; import com.google.gerrit.server.git.GitRepositoryManager; import com.google.inject.Inject; import com.google.inject.Singleton; - import com.googlecode.prolog_cafe.exceptions.CompileException; import com.googlecode.prolog_cafe.exceptions.SyntaxException; import com.googlecode.prolog_cafe.exceptions.TermException; @@ -39,15 +38,6 @@ import com.googlecode.prolog_cafe.lang.PrologMachineCopy; import com.googlecode.prolog_cafe.lang.StructureTerm; import com.googlecode.prolog_cafe.lang.SymbolTerm; import com.googlecode.prolog_cafe.lang.Term; - -import org.eclipse.jgit.errors.LargeObjectException; -import org.eclipse.jgit.lib.Config; -import org.eclipse.jgit.lib.Constants; -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.ObjectLoader; -import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.util.RawParseUtils; - import java.io.IOException; import java.io.PushbackReader; import java.io.Reader; @@ -65,24 +55,28 @@ import java.util.EnumSet; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.eclipse.jgit.errors.LargeObjectException; +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.lib.Constants; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.ObjectLoader; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.util.RawParseUtils; /** * Manages a cache of compiled Prolog rules. - *

- * Rules are loaded from the {@code site_path/cache/rules/rules-SHA1.jar}, where - * {@code SHA1} is the SHA1 of the Prolog {@code rules.pl} in a project's - * {@link RefNames#REFS_CONFIG} branch. + * + *

Rules are loaded from the {@code site_path/cache/rules/rules-SHA1.jar}, where {@code SHA1} is + * the SHA1 of the Prolog {@code rules.pl} in a project's {@link RefNames#REFS_CONFIG} branch. */ @Singleton public class RulesCache { - private static final List PACKAGE_LIST = ImmutableList.of( - Prolog.BUILTIN, "gerrit"); + private static final List PACKAGE_LIST = ImmutableList.of(Prolog.BUILTIN, "gerrit"); private static final class MachineRef extends WeakReference { final ObjectId key; - MachineRef(ObjectId key, PrologMachineCopy pcm, - ReferenceQueue queue) { + MachineRef(ObjectId key, PrologMachineCopy pcm, ReferenceQueue queue) { super(pcm, queue); this.key = key; } @@ -98,16 +92,17 @@ public class RulesCache { private final ClassLoader systemLoader; private final PrologMachineCopy defaultMachine; private final Map machineCache = new HashMap<>(); - private final ReferenceQueue dead = - new ReferenceQueue<>(); + private final ReferenceQueue dead = new ReferenceQueue<>(); @Inject - protected RulesCache(@GerritServerConfig Config config, SitePaths site, - GitRepositoryManager gm, DynamicSet predicateProviders) { + protected RulesCache( + @GerritServerConfig Config config, + SitePaths site, + GitRepositoryManager gm, + DynamicSet predicateProviders) { maxDbSize = config.getInt("rules", null, "maxPrologDatabaseSize", 256); maxSrcBytes = config.getInt("rules", null, "maxSourceBytes", 128 << 10); - enableProjectRules = config.getBoolean("rules", null, "enable", true) - && maxSrcBytes > 0; + enableProjectRules = config.getBoolean("rules", null, "enable", true) && maxSrcBytes > 0; cacheDir = site.resolve(config.getString("cache", null, "directory")); rulesDir = cacheDir != null ? cacheDir.resolve("rules") : null; gitMgr = gm; @@ -127,9 +122,7 @@ public class RulesCache { * @return a Prolog machine, after loading the specified rules. * @throws CompileException the machine cannot be created. */ - public synchronized PrologMachineCopy loadMachine( - Project.NameKey project, - ObjectId rulesId) + public synchronized PrologMachineCopy loadMachine(Project.NameKey project, ObjectId rulesId) throws CompileException { if (!enableProjectRules || project == null || rulesId == null) { return defaultMachine; @@ -154,8 +147,7 @@ public class RulesCache { return pcm; } - public PrologMachineCopy loadMachine(String name, Reader in) - throws CompileException { + public PrologMachineCopy loadMachine(String name, Reader in) throws CompileException { PrologMachineCopy pmc = consultRules(name, in); if (pmc == null) { throw new CompileException("Cannot consult rules from the stream " + name); @@ -173,8 +165,8 @@ public class RulesCache { } } - private PrologMachineCopy createMachine(Project.NameKey project, - ObjectId rulesId) throws CompileException { + private PrologMachineCopy createMachine(Project.NameKey project, ObjectId rulesId) + throws CompileException { // If the rules are available as a complied JAR on local disk, prefer // that over dynamic consult as the bytecode will be faster. // @@ -196,29 +188,26 @@ public class RulesCache { return pmc; } - private PrologMachineCopy consultRules(String name, Reader rules) - throws CompileException { + private PrologMachineCopy consultRules(String name, Reader rules) throws CompileException { BufferingPrologControl ctl = newEmptyMachine(systemLoader); PushbackReader in = new PushbackReader(rules, Prolog.PUSHBACK_SIZE); try { - if (!ctl.execute(Prolog.BUILTIN, "consult_stream", - SymbolTerm.intern(name), new JavaObjectTerm(in))) { + if (!ctl.execute( + Prolog.BUILTIN, "consult_stream", SymbolTerm.intern(name), new JavaObjectTerm(in))) { return null; } } catch (SyntaxException e) { throw new CompileException(e.toString(), e); } catch (TermException e) { Term m = e.getMessageTerm(); - if (m instanceof StructureTerm && "syntax_error".equals(m.name()) - && m.arity() >= 1) { + if (m instanceof StructureTerm && "syntax_error".equals(m.name()) && m.arity() >= 1) { StringBuilder msg = new StringBuilder(); if (m.arg(0) instanceof ListTerm) { msg.append(Joiner.on(' ').join(((ListTerm) m.arg(0)).toJava())); } else { msg.append(m.arg(0).toString()); } - if (m.arity() == 2 && m.arg(1) instanceof StructureTerm - && "at".equals(m.arg(1).name())) { + if (m.arity() == 2 && m.arg(1) instanceof StructureTerm && "at".equals(m.arg(1).name())) { Term at = m.arg(1).arg(0).dereference(); if (at instanceof ListTerm) { msg.append(" at: "); @@ -259,8 +248,7 @@ public class RulesCache { return b.toString().trim(); } - private String read(Project.NameKey project, ObjectId rulesId) - throws CompileException { + private String read(Project.NameKey project, ObjectId rulesId) throws CompileException { try (Repository git = gitMgr.openRepository(project)) { try { ObjectLoader ldr = git.open(rulesId, Constants.OBJ_BLOB); @@ -279,8 +267,8 @@ public class RulesCache { private BufferingPrologControl newEmptyMachine(ClassLoader cl) { BufferingPrologControl ctl = new BufferingPrologControl(); ctl.setMaxDatabaseSize(maxDbSize); - ctl.setPrologClassLoader(new PrologClassLoader(new PredicateClassLoader( - predicateProviders, cl))); + ctl.setPrologClassLoader( + new PrologClassLoader(new PredicateClassLoader(predicateProviders, cl))); ctl.setEnabled(EnumSet.allOf(Prolog.Feature.class), false); List packages = new ArrayList<>(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValue.java b/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValue.java index 206e840c40..461f3ab658 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValue.java +++ b/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValue.java @@ -38,16 +38,14 @@ public class StoredValue { /** * Initialize a stored value key using any Java Object. * - * @param key unique identity of the stored value. This will be the hash key - * in the Prolog Environments's hash map. + * @param key unique identity of the stored value. This will be the hash key in the Prolog + * Environments's hash map. */ public StoredValue(Object key) { this.key = key; } - /** - * Initializes a stored value key with a new unique key. - */ + /** Initializes a stored value key with a new unique key. */ public StoredValue() { key = this; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValues.java b/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValues.java index c493ccd127..34fcb52d44 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValues.java +++ b/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValues.java @@ -36,16 +36,13 @@ import com.google.gerrit.server.patch.PatchSetInfoNotAvailableException; import com.google.gerrit.server.project.ChangeControl; import com.google.gerrit.server.query.change.ChangeData; import com.google.gwtorm.server.OrmException; - import com.googlecode.prolog_cafe.exceptions.SystemException; import com.googlecode.prolog_cafe.lang.Prolog; - -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.Repository; - import java.io.IOException; import java.util.HashMap; import java.util.Map; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Repository; public final class StoredValues { public static final StoredValue REVIEW_DB = create(ReviewDb.class); @@ -76,65 +73,68 @@ public final class StoredValues { } } - public static final StoredValue PATCH_SET_INFO = new StoredValue() { - @Override - public PatchSetInfo createValue(Prolog engine) { - Change change = getChange(engine); - PatchSet ps = getPatchSet(engine); - PrologEnvironment env = (PrologEnvironment) engine.control; - PatchSetInfoFactory patchInfoFactory = - env.getArgs().getPatchSetInfoFactory(); - try { - return patchInfoFactory.get(change.getProject(), ps); - } catch (PatchSetInfoNotAvailableException e) { - throw new SystemException(e.getMessage()); - } - } - }; - - public static final StoredValue PATCH_LIST = new StoredValue() { - @Override - public PatchList createValue(Prolog engine) { - PrologEnvironment env = (PrologEnvironment) engine.control; - PatchSet ps = getPatchSet(engine); - PatchListCache plCache = env.getArgs().getPatchListCache(); - Change change = getChange(engine); - Project.NameKey project = change.getProject(); - ObjectId b = ObjectId.fromString(ps.getRevision().get()); - Whitespace ws = Whitespace.IGNORE_NONE; - PatchListKey plKey = PatchListKey.againstDefaultBase(b, ws); - PatchList patchList; - try { - patchList = plCache.get(plKey, project); - } catch (PatchListNotAvailableException e) { - throw new SystemException("Cannot create " + plKey); - } - return patchList; - } - }; - - public static final StoredValue REPOSITORY = new StoredValue() { - @Override - public Repository createValue(Prolog engine) { - PrologEnvironment env = (PrologEnvironment) engine.control; - GitRepositoryManager gitMgr = env.getArgs().getGitRepositoryManager(); - Change change = getChange(engine); - Project.NameKey projectKey = change.getProject(); - final Repository repo; - try { - repo = gitMgr.openRepository(projectKey); - } catch (IOException e) { - throw new SystemException(e.getMessage()); - } - env.addToCleanup(new Runnable() { + public static final StoredValue PATCH_SET_INFO = + new StoredValue() { @Override - public void run() { - repo.close(); + public PatchSetInfo createValue(Prolog engine) { + Change change = getChange(engine); + PatchSet ps = getPatchSet(engine); + PrologEnvironment env = (PrologEnvironment) engine.control; + PatchSetInfoFactory patchInfoFactory = env.getArgs().getPatchSetInfoFactory(); + try { + return patchInfoFactory.get(change.getProject(), ps); + } catch (PatchSetInfoNotAvailableException e) { + throw new SystemException(e.getMessage()); + } } - }); - return repo; - } - }; + }; + + public static final StoredValue PATCH_LIST = + new StoredValue() { + @Override + public PatchList createValue(Prolog engine) { + PrologEnvironment env = (PrologEnvironment) engine.control; + PatchSet ps = getPatchSet(engine); + PatchListCache plCache = env.getArgs().getPatchListCache(); + Change change = getChange(engine); + Project.NameKey project = change.getProject(); + ObjectId b = ObjectId.fromString(ps.getRevision().get()); + Whitespace ws = Whitespace.IGNORE_NONE; + PatchListKey plKey = PatchListKey.againstDefaultBase(b, ws); + PatchList patchList; + try { + patchList = plCache.get(plKey, project); + } catch (PatchListNotAvailableException e) { + throw new SystemException("Cannot create " + plKey); + } + return patchList; + } + }; + + public static final StoredValue REPOSITORY = + new StoredValue() { + @Override + public Repository createValue(Prolog engine) { + PrologEnvironment env = (PrologEnvironment) engine.control; + GitRepositoryManager gitMgr = env.getArgs().getGitRepositoryManager(); + Change change = getChange(engine); + Project.NameKey projectKey = change.getProject(); + final Repository repo; + try { + repo = gitMgr.openRepository(projectKey); + } catch (IOException e) { + throw new SystemException(e.getMessage()); + } + env.addToCleanup( + new Runnable() { + @Override + public void run() { + repo.close(); + } + }); + return repo; + } + }; public static final StoredValue ANONYMOUS_USER = new StoredValue() { @@ -153,6 +153,5 @@ public final class StoredValues { } }; - private StoredValues() { - } + private StoredValues() {} } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/AnonymousUser.java b/gerrit-server/src/main/java/com/google/gerrit/server/AnonymousUser.java index 36888e3474..de8e9a428f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/AnonymousUser.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/AnonymousUser.java @@ -19,7 +19,6 @@ import com.google.gerrit.server.account.GroupMembership; import com.google.gerrit.server.account.ListGroupMembership; import com.google.gerrit.server.group.SystemGroupBackend; import com.google.inject.Inject; - import java.util.Collections; /** An anonymous user who has not yet authenticated. */ diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalCopier.java b/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalCopier.java index 1fcb5b6397..cb65ed37c3 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalCopier.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalCopier.java @@ -36,22 +36,19 @@ import com.google.gerrit.server.query.change.ChangeData; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.Repository; - import java.io.IOException; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.TreeMap; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Repository; /** * Copies approvals between patch sets. - *

- * The result of a copy may either be stored, as when stamping approvals in the - * database at submit time, or refreshed on demand, as when reading approvals - * from the NoteDb. + * + *

The result of a copy may either be stored, as when stamping approvals in the database at + * submit time, or refreshed on demand, as when reading approvals from the NoteDb. */ @Singleton public class ApprovalCopier { @@ -63,7 +60,8 @@ public class ApprovalCopier { private final PatchSetUtil psUtil; @Inject - ApprovalCopier(GitRepositoryManager repoManager, + ApprovalCopier( + GitRepositoryManager repoManager, ProjectCache projectCache, ChangeKindCache changeKindCache, LabelNormalizer labelNormalizer, @@ -85,8 +83,7 @@ public class ApprovalCopier { * @param ps new PatchSet * @throws OrmException */ - public void copy(ReviewDb db, ChangeControl ctl, PatchSet ps) - throws OrmException { + public void copy(ReviewDb db, ChangeControl ctl, PatchSet ps) throws OrmException { copy(db, ctl, ps, Collections.emptyList()); } @@ -96,25 +93,22 @@ public class ApprovalCopier { * @param db review database. * @param ctl change control for user uploading PatchSet * @param ps new PatchSet - * @param dontCopy PatchSetApprovals indicating which (account, label) pairs - * should not be copied + * @param dontCopy PatchSetApprovals indicating which (account, label) pairs should not be copied * @throws OrmException */ - public void copy(ReviewDb db, ChangeControl ctl, PatchSet ps, - Iterable dontCopy) throws OrmException { - db.patchSetApprovals().insert( - getForPatchSet(db, ctl, ps, dontCopy)); + public void copy(ReviewDb db, ChangeControl ctl, PatchSet ps, Iterable dontCopy) + throws OrmException { + db.patchSetApprovals().insert(getForPatchSet(db, ctl, ps, dontCopy)); } - Iterable getForPatchSet(ReviewDb db, - ChangeControl ctl, PatchSet.Id psId) throws OrmException { - return getForPatchSet(db, ctl, psId, - Collections.emptyList()); + Iterable getForPatchSet(ReviewDb db, ChangeControl ctl, PatchSet.Id psId) + throws OrmException { + return getForPatchSet(db, ctl, psId, Collections.emptyList()); } - Iterable getForPatchSet(ReviewDb db, - ChangeControl ctl, PatchSet.Id psId, - Iterable dontCopy) throws OrmException { + Iterable getForPatchSet( + ReviewDb db, ChangeControl ctl, PatchSet.Id psId, Iterable dontCopy) + throws OrmException { PatchSet ps = psUtil.get(db, ctl.getNotes(), psId); if (ps == null) { return Collections.emptyList(); @@ -122,25 +116,22 @@ public class ApprovalCopier { return getForPatchSet(db, ctl, ps, dontCopy); } - private Iterable getForPatchSet(ReviewDb db, - ChangeControl ctl, PatchSet ps, - Iterable dontCopy) throws OrmException { + private Iterable getForPatchSet( + ReviewDb db, ChangeControl ctl, PatchSet ps, Iterable dontCopy) + throws OrmException { checkNotNull(ps, "ps should not be null"); ChangeData cd = changeDataFactory.create(db, ctl); try { - ProjectState project = - projectCache.checkedGet(cd.change().getDest().getParentKey()); + ProjectState project = projectCache.checkedGet(cd.change().getDest().getParentKey()); ListMultimap all = cd.approvals(); checkNotNull(all, "all should not be null"); - Table wontCopy = - HashBasedTable.create(); + Table wontCopy = HashBasedTable.create(); for (PatchSetApproval psa : dontCopy) { wontCopy.put(psa.getLabel(), psa.getAccountId(), psa); } - Table byUser = - HashBasedTable.create(); + Table byUser = HashBasedTable.create(); for (PatchSetApproval psa : all.get(ps.getId())) { if (!wontCopy.contains(psa.getLabel(), psa.getAccountId())) { byUser.put(psa.getLabel(), psa.getAccountId(), psa); @@ -149,22 +140,22 @@ public class ApprovalCopier { TreeMap patchSets = getPatchSets(cd); - try (Repository repo = - repoManager.openRepository(project.getProject().getNameKey())) { + try (Repository repo = repoManager.openRepository(project.getProject().getNameKey())) { // Walk patch sets strictly less than current in descending order. - Collection allPrior = patchSets.descendingMap() - .tailMap(ps.getId().get(), false) - .values(); + Collection allPrior = + patchSets.descendingMap().tailMap(ps.getId().get(), false).values(); for (PatchSet priorPs : allPrior) { List priorApprovals = all.get(priorPs.getId()); if (priorApprovals.isEmpty()) { continue; } - ChangeKind kind = changeKindCache.getChangeKind( - project.getProject().getNameKey(), repo, - ObjectId.fromString(priorPs.getRevision().get()), - ObjectId.fromString(ps.getRevision().get())); + ChangeKind kind = + changeKindCache.getChangeKind( + project.getProject().getNameKey(), + repo, + ObjectId.fromString(priorPs.getRevision().get()), + ObjectId.fromString(ps.getRevision().get())); for (PatchSetApproval psa : priorApprovals) { if (wontCopy.contains(psa.getLabel(), psa.getAccountId())) { @@ -177,8 +168,7 @@ public class ApprovalCopier { wontCopy.put(psa.getLabel(), psa.getAccountId(), psa); continue; } - byUser.put(psa.getLabel(), psa.getAccountId(), - copy(psa, ps.getId())); + byUser.put(psa.getLabel(), psa.getAccountId(), copy(psa, ps.getId())); } } return labelNormalizer.normalize(ctl, byUser.values()).getNormalized(); @@ -188,8 +178,7 @@ public class ApprovalCopier { } } - private static TreeMap getPatchSets(ChangeData cd) - throws OrmException { + private static TreeMap getPatchSets(ChangeData cd) throws OrmException { Collection patchSets = cd.patchSets(); TreeMap result = new TreeMap<>(); for (PatchSet ps : patchSets) { @@ -198,15 +187,14 @@ public class ApprovalCopier { return result; } - private static boolean canCopy(ProjectState project, PatchSetApproval psa, - PatchSet.Id psId, ChangeKind kind) { + private static boolean canCopy( + ProjectState project, PatchSetApproval psa, PatchSet.Id psId, ChangeKind kind) { int n = psa.getKey().getParentKey().get(); checkArgument(n != psId.get()); LabelType type = project.getLabelTypes().byLabel(psa.getLabelId()); if (type == null) { return false; - } else if ( - (type.isCopyMinScore() && type.isMaxNegative(psa)) + } else if ((type.isCopyMinScore() && type.isMaxNegative(psa)) || (type.isCopyMaxScore() && type.isMaxPositive(psa))) { return true; } @@ -234,4 +222,4 @@ public class ApprovalCopier { } return new PatchSetApproval(psId, src); } -} \ No newline at end of file +} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalsUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalsUtil.java index c61f61370f..87969ece62 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalsUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalsUtil.java @@ -48,10 +48,6 @@ import com.google.gerrit.server.util.LabelVote; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -61,49 +57,45 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Utility functions to manipulate patchset approvals. - *

- * Approvals are overloaded, they represent both approvals and reviewers - * which should be CCed on a change. To ensure that reviewers are not lost - * there must always be an approval on each patchset for each reviewer, - * even if the reviewer hasn't actually given a score to the change. To - * mark the "no score" case, a dummy approval, which may live in any of - * the available categories, with a score of 0 is used. - *

- * The methods in this class only modify the gwtorm database. + * + *

Approvals are overloaded, they represent both approvals and reviewers which should be CCed on + * a change. To ensure that reviewers are not lost there must always be an approval on each patchset + * for each reviewer, even if the reviewer hasn't actually given a score to the change. To mark the + * "no score" case, a dummy approval, which may live in any of the available categories, with a + * score of 0 is used. + * + *

The methods in this class only modify the gwtorm database. */ @Singleton public class ApprovalsUtil { - private static final Logger log = - LoggerFactory.getLogger(ApprovalsUtil.class); + private static final Logger log = LoggerFactory.getLogger(ApprovalsUtil.class); private static final Ordering SORT_APPROVALS = Ordering.from(comparing(PatchSetApproval::getGranted)); - public static List sortApprovals( - Iterable approvals) { + public static List sortApprovals(Iterable approvals) { return SORT_APPROVALS.sortedCopy(approvals); } - public static PatchSetApproval newApproval(PatchSet.Id psId, CurrentUser user, - LabelId labelId, int value, Date when) { - PatchSetApproval psa = new PatchSetApproval( - new PatchSetApproval.Key( - psId, - user.getAccountId(), - labelId), - Shorts.checkedCast(value), - when); + public static PatchSetApproval newApproval( + PatchSet.Id psId, CurrentUser user, LabelId labelId, int value, Date when) { + PatchSetApproval psa = + new PatchSetApproval( + new PatchSetApproval.Key(psId, user.getAccountId(), labelId), + Shorts.checkedCast(value), + when); user.updateRealAccountId(psa::setRealAccountId); return psa; } private static Iterable filterApprovals( Iterable psas, final Account.Id accountId) { - return Iterables.filter( - psas, a -> Objects.equals(a.getAccountId(), accountId)); + return Iterables.filter(psas, a -> Objects.equals(a.getAccountId(), accountId)); } private final NotesMigration migration; @@ -113,7 +105,8 @@ public class ApprovalsUtil { @VisibleForTesting @Inject - public ApprovalsUtil(NotesMigration migration, + public ApprovalsUtil( + NotesMigration migration, IdentifiedUser.GenericFactory userFactory, ChangeControl.GenericFactory changeControlFactory, ApprovalCopier copier) { @@ -131,11 +124,9 @@ public class ApprovalsUtil { * @return reviewers for the change. * @throws OrmException if reviewers for the change could not be read. */ - public ReviewerSet getReviewers(ReviewDb db, ChangeNotes notes) - throws OrmException { + public ReviewerSet getReviewers(ReviewDb db, ChangeNotes notes) throws OrmException { if (!migration.readChanges()) { - return ReviewerSet.fromApprovals( - db.patchSetApprovals().byChange(notes.getChangeId())); + return ReviewerSet.fromApprovals(db.patchSetApprovals().byChange(notes.getChangeId())); } return notes.load().getReviewers(); } @@ -143,13 +134,11 @@ public class ApprovalsUtil { /** * Get all reviewers and CCed accounts for a change. * - * @param allApprovals all approvals to consider; must all belong to the same - * change. + * @param allApprovals all approvals to consider; must all belong to the same change. * @return reviewers for the change. * @throws OrmException if reviewers for the change could not be read. */ - public ReviewerSet getReviewers(ChangeNotes notes, - Iterable allApprovals) + public ReviewerSet getReviewers(ChangeNotes notes, Iterable allApprovals) throws OrmException { if (!migration.readChanges()) { return ReviewerSet.fromApprovals(allApprovals); @@ -158,33 +147,49 @@ public class ApprovalsUtil { } /** - * Get updates to reviewer set. - * Always returns empty list for ReviewDb. + * Get updates to reviewer set. Always returns empty list for ReviewDb. * * @param notes change notes. * @return reviewer updates for the change. * @throws OrmException if reviewer updates for the change could not be read. */ - public List getReviewerUpdates(ChangeNotes notes) - throws OrmException { + public List getReviewerUpdates(ChangeNotes notes) throws OrmException { if (!migration.readChanges()) { return ImmutableList.of(); } return notes.load().getReviewerUpdates(); } - public List addReviewers(ReviewDb db, - ChangeUpdate update, LabelTypes labelTypes, Change change, PatchSet ps, - PatchSetInfo info, Iterable wantReviewers, - Collection existingReviewers) throws OrmException { - return addReviewers(db, update, labelTypes, change, ps.getId(), - info.getAuthor().getAccount(), info.getCommitter().getAccount(), - wantReviewers, existingReviewers); + public List addReviewers( + ReviewDb db, + ChangeUpdate update, + LabelTypes labelTypes, + Change change, + PatchSet ps, + PatchSetInfo info, + Iterable wantReviewers, + Collection existingReviewers) + throws OrmException { + return addReviewers( + db, + update, + labelTypes, + change, + ps.getId(), + info.getAuthor().getAccount(), + info.getCommitter().getAccount(), + wantReviewers, + existingReviewers); } - public List addReviewers(ReviewDb db, ChangeNotes notes, - ChangeUpdate update, LabelTypes labelTypes, Change change, - Iterable wantReviewers) throws OrmException { + public List addReviewers( + ReviewDb db, + ChangeNotes notes, + ChangeUpdate update, + LabelTypes labelTypes, + Change change, + Iterable wantReviewers) + throws OrmException { PatchSet.Id psId = change.currentPatchSetId(); Collection existingReviewers; if (migration.readChanges()) { @@ -197,21 +202,26 @@ public class ApprovalsUtil { // Existing reviewers should include pending additions in the REVIEWER // state, taken from ChangeUpdate. existingReviewers = Lists.newArrayList(existingReviewers); - for (Map.Entry entry : - update.getReviewers().entrySet()) { + for (Map.Entry entry : update.getReviewers().entrySet()) { if (entry.getValue() == REVIEWER) { existingReviewers.add(entry.getKey()); } } - return addReviewers(db, update, labelTypes, change, psId, null, null, - wantReviewers, existingReviewers); + return addReviewers( + db, update, labelTypes, change, psId, null, null, wantReviewers, existingReviewers); } - private List addReviewers(ReviewDb db, ChangeUpdate update, - LabelTypes labelTypes, Change change, PatchSet.Id psId, - Account.Id authorId, Account.Id committerId, + private List addReviewers( + ReviewDb db, + ChangeUpdate update, + LabelTypes labelTypes, + Change change, + PatchSet.Id psId, + Account.Id authorId, + Account.Id committerId, Iterable wantReviewers, - Collection existingReviewers) throws OrmException { + Collection existingReviewers) + throws OrmException { List allTypes = labelTypes.getLabelTypes(); if (allTypes.isEmpty()) { return ImmutableList.of(); @@ -234,9 +244,9 @@ public class ApprovalsUtil { List cells = Lists.newArrayListWithCapacity(need.size()); LabelId labelId = Iterables.getLast(allTypes).getLabelId(); for (Account.Id account : need) { - cells.add(new PatchSetApproval( - new PatchSetApproval.Key(psId, account, labelId), - (short) 0, update.getWhen())); + cells.add( + new PatchSetApproval( + new PatchSetApproval.Key(psId, account, labelId), (short) 0, update.getWhen())); update.putReviewer(account, REVIEWER); } db.patchSetApprovals().upsert(cells); @@ -248,8 +258,11 @@ public class ApprovalsUtil { IdentifiedUser user = userFactory.create(accountId); return changeControlFactory.controlFor(notes, user).isVisible(db); } catch (OrmException e) { - log.warn(String.format("Failed to check if account %d can see change %d", - accountId.get(), notes.getChangeId().get()), e); + log.warn( + String.format( + "Failed to check if account %d can see change %d", + accountId.get(), notes.getChangeId().get()), + e); return false; } } @@ -263,13 +276,13 @@ public class ApprovalsUtil { * @return whether a change was made. * @throws OrmException */ - public Collection addCcs(ChangeNotes notes, ChangeUpdate update, - Collection wantCCs) throws OrmException { + public Collection addCcs( + ChangeNotes notes, ChangeUpdate update, Collection wantCCs) throws OrmException { return addCcs(update, wantCCs, notes.load().getReviewers()); } - private Collection addCcs(ChangeUpdate update, - Collection wantCCs, ReviewerSet existingReviewers) { + private Collection addCcs( + ChangeUpdate update, Collection wantCCs, ReviewerSet existingReviewers) { Set need = new LinkedHashSet<>(wantCCs); need.removeAll(existingReviewers.all()); need.removeAll(update.getReviewers().keySet()); @@ -290,14 +303,20 @@ public class ApprovalsUtil { * @param approvals approvals to add. * @throws OrmException */ - public Iterable addApprovalsForNewPatchSet(ReviewDb db, - ChangeUpdate update, LabelTypes labelTypes, PatchSet ps, - ChangeControl changeCtl, Map approvals) + public Iterable addApprovalsForNewPatchSet( + ReviewDb db, + ChangeUpdate update, + LabelTypes labelTypes, + PatchSet ps, + ChangeControl changeCtl, + Map approvals) throws OrmException { Account.Id accountId = changeCtl.getUser().getAccountId(); - checkArgument(accountId.equals(ps.getUploader()), + checkArgument( + accountId.equals(ps.getUploader()), "expected user %s to match patch set uploader %s", - accountId, ps.getUploader()); + accountId, + ps.getUploader()); if (approvals.isEmpty()) { return Collections.emptyList(); } @@ -306,9 +325,7 @@ public class ApprovalsUtil { Date ts = update.getWhen(); for (Map.Entry vote : approvals.entrySet()) { LabelType lt = labelTypes.byLabel(vote.getKey()); - cells.add( - newApproval(ps.getId(), changeCtl.getUser(), lt.getLabelId(), - vote.getValue(), ts)); + cells.add(newApproval(ps.getId(), changeCtl.getUser(), lt.getLabelId(), vote.getValue(), ts)); } for (PatchSetApproval psa : cells) { update.putApproval(psa.getLabel(), psa.getValue()); @@ -320,35 +337,33 @@ public class ApprovalsUtil { public static void checkLabel(LabelTypes labelTypes, String name, Short value) { LabelType label = labelTypes.byLabel(name); if (label == null) { - throw new IllegalArgumentException(String.format( - "label \"%s\" is not a configured label", name)); + throw new IllegalArgumentException( + String.format("label \"%s\" is not a configured label", name)); } if (label.getValue(value) == null) { - throw new IllegalArgumentException(String.format( - "label \"%s\": %d is not a valid value", name, value)); + throw new IllegalArgumentException( + String.format("label \"%s\": %d is not a valid value", name, value)); } } - private static void checkApprovals(Map approvals, - ChangeControl changeCtl) { + private static void checkApprovals(Map approvals, ChangeControl changeCtl) { for (Map.Entry vote : approvals.entrySet()) { String name = vote.getKey(); Short value = vote.getValue(); PermissionRange range = changeCtl.getRange(Permission.forLabel(name)); if (range == null || !range.contains(value)) { - throw new IllegalArgumentException(String.format( - "applying label \"%s\": %d is restricted", name, value)); + throw new IllegalArgumentException( + String.format("applying label \"%s\": %d is restricted", name, value)); } } } - public ListMultimap byChange(ReviewDb db, - ChangeNotes notes) throws OrmException { + public ListMultimap byChange(ReviewDb db, ChangeNotes notes) + throws OrmException { if (!migration.readChanges()) { ImmutableListMultimap.Builder result = ImmutableListMultimap.builder(); - for (PatchSetApproval psa - : db.patchSetApprovals().byChange(notes.getChangeId())) { + for (PatchSetApproval psa : db.patchSetApprovals().byChange(notes.getChangeId())) { result.put(psa.getPatchSetId(), psa); } return result.build(); @@ -356,26 +371,23 @@ public class ApprovalsUtil { return notes.load().getApprovals(); } - public Iterable byPatchSet(ReviewDb db, ChangeControl ctl, - PatchSet.Id psId) throws OrmException { + public Iterable byPatchSet(ReviewDb db, ChangeControl ctl, PatchSet.Id psId) + throws OrmException { if (!migration.readChanges()) { return sortApprovals(db.patchSetApprovals().byPatchSet(psId)); } return copier.getForPatchSet(db, ctl, psId); } - public Iterable byPatchSetUser(ReviewDb db, - ChangeControl ctl, PatchSet.Id psId, Account.Id accountId) - throws OrmException { + public Iterable byPatchSetUser( + ReviewDb db, ChangeControl ctl, PatchSet.Id psId, Account.Id accountId) throws OrmException { if (!migration.readChanges()) { - return sortApprovals( - db.patchSetApprovals().byPatchSetUser(psId, accountId)); + return sortApprovals(db.patchSetApprovals().byPatchSetUser(psId, accountId)); } return filterApprovals(byPatchSet(db, ctl, psId), accountId); } - public PatchSetApproval getSubmitter(ReviewDb db, ChangeNotes notes, - PatchSet.Id c) { + public PatchSetApproval getSubmitter(ReviewDb db, ChangeNotes notes, PatchSet.Id c) { if (c == null) { return null; } @@ -387,16 +399,14 @@ public class ApprovalsUtil { } } - public static PatchSetApproval getSubmitter(PatchSet.Id c, - Iterable approvals) { + public static PatchSetApproval getSubmitter(PatchSet.Id c, Iterable approvals) { if (c == null) { return null; } PatchSetApproval submitter = null; for (PatchSetApproval a : approvals) { if (a.getPatchSetId().equals(c) && a.getValue() > 0 && a.isLegacySubmit()) { - if (submitter == null - || a.getGranted().compareTo(submitter.getGranted()) > 0) { + if (submitter == null || a.getGranted().compareTo(submitter.getGranted()) > 0) { submitter = a; } } @@ -404,22 +414,20 @@ public class ApprovalsUtil { return submitter; } - public static String renderMessageWithApprovals(int patchSetId, - Map n, Map c) { + public static String renderMessageWithApprovals( + int patchSetId, Map n, Map c) { StringBuilder msgs = new StringBuilder("Uploaded patch set " + patchSetId); if (!n.isEmpty()) { boolean first = true; for (Map.Entry e : n.entrySet()) { - if (c.containsKey(e.getKey()) - && c.get(e.getKey()).getValue() == e.getValue()) { + if (c.containsKey(e.getKey()) && c.get(e.getKey()).getValue() == e.getValue()) { continue; } if (first) { msgs.append(":"); first = false; } - msgs.append(" ") - .append(LabelVote.create(e.getKey(), e.getValue()).format()); + msgs.append(" ").append(LabelVote.create(e.getKey(), e.getValue()).format()); } } return msgs.toString(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ChangeFinder.java b/gerrit-server/src/main/java/com/google/gerrit/server/ChangeFinder.java index 7dda538ab6..2f3a76f523 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/ChangeFinder.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/ChangeFinder.java @@ -25,7 +25,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -43,15 +42,13 @@ public class ChangeFinder { /** * Find changes matching the given identifier. * - * @param id change identifier, either a numeric ID, a Change-Id, or - * project~branch~id triplet. + * @param id change identifier, either a numeric ID, a Change-Id, or project~branch~id triplet. * @param user user to wrap in controls. - * @return possibly-empty list of controls for all matching changes, - * corresponding to the given user; may or may not be visible. + * @return possibly-empty list of controls for all matching changes, corresponding to the given + * user; may or may not be visible. * @throws OrmException if an error occurred querying the database. */ - public List find(String id, CurrentUser user) - throws OrmException { + public List find(String id, CurrentUser user) throws OrmException { // Use the index to search for changes, but don't return any stored fields, // to force rereading in case the index is stale. InternalChangeQuery query = queryProvider.get().noFields(); @@ -72,17 +69,13 @@ public class ChangeFinder { // Try change triplet Optional triplet = ChangeTriplet.parse(id); if (triplet.isPresent()) { - return asChangeControls(query.byBranchKey( - triplet.get().branch(), - triplet.get().id()), - user); + return asChangeControls(query.byBranchKey(triplet.get().branch(), triplet.get().id()), user); } return Collections.emptyList(); } - public ChangeControl findOne(Change.Id id, CurrentUser user) - throws OrmException { + public ChangeControl findOne(Change.Id id, CurrentUser user) throws OrmException { List ctls = find(id, user); if (ctls.size() != 1) { throw new NoSuchChangeException(id); @@ -90,16 +83,15 @@ public class ChangeFinder { return ctls.get(0); } - public List find(Change.Id id, CurrentUser user) - throws OrmException { + public List find(Change.Id id, CurrentUser user) throws OrmException { // Use the index to search for changes, but don't return any stored fields, // to force rereading in case the index is stale. InternalChangeQuery query = queryProvider.get().noFields(); return asChangeControls(query.byLegacyChangeId(id), user); } - private List asChangeControls(List cds, - CurrentUser user) throws OrmException { + private List asChangeControls(List cds, CurrentUser user) + throws OrmException { List ctls = new ArrayList<>(cds.size()); for (ChangeData cd : cds) { ctls.add(cd.changeControl(user)); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ChangeMessagesUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/ChangeMessagesUtil.java index e49b61719e..b8bdcd543e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/ChangeMessagesUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/ChangeMessagesUtil.java @@ -30,7 +30,6 @@ import com.google.gerrit.server.notedb.NotesMigration; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.sql.Timestamp; import java.util.Collections; import java.util.List; @@ -38,64 +37,49 @@ import java.util.Objects; /** * Utility functions to manipulate ChangeMessages. - *

- * These methods either query for and update ChangeMessages in the NoteDb or - * ReviewDb, depending on the state of the NotesMigration. + * + *

These methods either query for and update ChangeMessages in the NoteDb or ReviewDb, depending + * on the state of the NotesMigration. */ @Singleton public class ChangeMessagesUtil { - public static final String TAG_ABANDON = - "autogenerated:gerrit:abandon"; - public static final String TAG_CHERRY_PICK_CHANGE = - "autogenerated:gerrit:cherryPickChange"; - public static final String TAG_DELETE_ASSIGNEE = - "autogenerated:gerrit:deleteAssignee"; - public static final String TAG_DELETE_REVIEWER = - "autogenerated:gerrit:deleteReviewer"; - public static final String TAG_DELETE_VOTE = - "autogenerated:gerrit:deleteVote"; - public static final String TAG_MERGED = - "autogenerated:gerrit:merged"; - public static final String TAG_MOVE = - "autogenerated:gerrit:move"; - public static final String TAG_RESTORE = - "autogenerated:gerrit:restore"; - public static final String TAG_REVERT = - "autogenerated:gerrit:revert"; - public static final String TAG_SET_ASSIGNEE = - "autogenerated:gerrit:setAssignee"; - public static final String TAG_SET_DESCRIPTION = - "autogenerated:gerrit:setPsDescription"; - public static final String TAG_SET_HASHTAGS = - "autogenerated:gerrit:setHashtag"; - public static final String TAG_SET_TOPIC = - "autogenerated:gerrit:setTopic"; - public static final String TAG_UPLOADED_PATCH_SET = - "autogenerated:gerrit:newPatchSet"; + public static final String TAG_ABANDON = "autogenerated:gerrit:abandon"; + public static final String TAG_CHERRY_PICK_CHANGE = "autogenerated:gerrit:cherryPickChange"; + public static final String TAG_DELETE_ASSIGNEE = "autogenerated:gerrit:deleteAssignee"; + public static final String TAG_DELETE_REVIEWER = "autogenerated:gerrit:deleteReviewer"; + public static final String TAG_DELETE_VOTE = "autogenerated:gerrit:deleteVote"; + public static final String TAG_MERGED = "autogenerated:gerrit:merged"; + public static final String TAG_MOVE = "autogenerated:gerrit:move"; + public static final String TAG_RESTORE = "autogenerated:gerrit:restore"; + public static final String TAG_REVERT = "autogenerated:gerrit:revert"; + public static final String TAG_SET_ASSIGNEE = "autogenerated:gerrit:setAssignee"; + public static final String TAG_SET_DESCRIPTION = "autogenerated:gerrit:setPsDescription"; + public static final String TAG_SET_HASHTAGS = "autogenerated:gerrit:setHashtag"; + public static final String TAG_SET_TOPIC = "autogenerated:gerrit:setTopic"; + public static final String TAG_UPLOADED_PATCH_SET = "autogenerated:gerrit:newPatchSet"; - public static ChangeMessage newMessage(BatchUpdate.ChangeContext ctx, - String body, @Nullable String tag) { - return newMessage( - ctx.getChange().currentPatchSetId(), - ctx.getUser(), ctx.getWhen(), body, tag); + public static ChangeMessage newMessage( + BatchUpdate.ChangeContext ctx, String body, @Nullable String tag) { + return newMessage(ctx.getChange().currentPatchSetId(), ctx.getUser(), ctx.getWhen(), body, tag); } public static ChangeMessage newMessage( - PatchSet.Id psId, CurrentUser user, Timestamp when, - String body, @Nullable String tag) { + PatchSet.Id psId, CurrentUser user, Timestamp when, String body, @Nullable String tag) { checkNotNull(psId); Account.Id accountId = user.isInternalUser() ? null : user.getAccountId(); - ChangeMessage m = new ChangeMessage( - new ChangeMessage.Key(psId.getParentKey(), ChangeUtil.messageUuid()), - accountId, when, psId); + ChangeMessage m = + new ChangeMessage( + new ChangeMessage.Key(psId.getParentKey(), ChangeUtil.messageUuid()), + accountId, + when, + psId); m.setMessage(body); m.setTag(tag); user.updateRealAccountId(m::setRealAuthor); return m; } - private static List sortChangeMessages( - Iterable changeMessage) { + private static List sortChangeMessages(Iterable changeMessage) { return ChangeNotes.MESSAGE_BY_TIME.sortedCopy(changeMessage); } @@ -109,26 +93,26 @@ public class ChangeMessagesUtil { public List byChange(ReviewDb db, ChangeNotes notes) throws OrmException { if (!migration.readChanges()) { - return - sortChangeMessages(db.changeMessages().byChange(notes.getChangeId())); + return sortChangeMessages(db.changeMessages().byChange(notes.getChangeId())); } return notes.load().getChangeMessages(); } - public Iterable byPatchSet(ReviewDb db, ChangeNotes notes, - PatchSet.Id psId) throws OrmException { + public Iterable byPatchSet(ReviewDb db, ChangeNotes notes, PatchSet.Id psId) + throws OrmException { if (!migration.readChanges()) { return db.changeMessages().byPatchSet(psId); } return notes.load().getChangeMessagesByPatchSet().get(psId); } - public void addChangeMessage(ReviewDb db, ChangeUpdate update, - ChangeMessage changeMessage) throws OrmException { + public void addChangeMessage(ReviewDb db, ChangeUpdate update, ChangeMessage changeMessage) + throws OrmException { checkState( Objects.equals(changeMessage.getAuthor(), update.getNullableAccountId()), "cannot store change message by %s in update by %s", - changeMessage.getAuthor(), update.getNullableAccountId()); + changeMessage.getAuthor(), + update.getNullableAccountId()); update.setChangeMessage(changeMessage.getMessage()); update.setTag(changeMessage.getTag()); db.changeMessages().insert(Collections.singleton(changeMessage)); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java index fbf6d03b6e..10ae60c747 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java @@ -20,21 +20,18 @@ import com.google.common.collect.Ordering; import com.google.common.io.BaseEncoding; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.Ref; -import org.eclipse.jgit.lib.RefDatabase; -import org.eclipse.jgit.lib.Repository; - import java.io.IOException; import java.security.SecureRandom; import java.util.Map; import java.util.Random; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.lib.RefDatabase; +import org.eclipse.jgit.lib.Repository; @Singleton public class ChangeUtil { private static final Random UUID_RANDOM = new SecureRandom(); - private static final BaseEncoding UUID_ENCODING = - BaseEncoding.base16().lowerCase(); + private static final BaseEncoding UUID_ENCODING = BaseEncoding.base16().lowerCase(); private static final int SUBJECT_MAX_LENGTH = 80; private static final String SUBJECT_CROP_APPENDIX = "..."; @@ -47,12 +44,10 @@ public class ChangeUtil { public static String messageUuid() { byte[] buf = new byte[8]; UUID_RANDOM.nextBytes(buf); - return UUID_ENCODING.encode(buf, 0, 4) + '_' - + UUID_ENCODING.encode(buf, 4, 4); + return UUID_ENCODING.encode(buf, 0, 4) + '_' + UUID_ENCODING.encode(buf, 4, 4); } - public static PatchSet.Id nextPatchSetId(Map allRefs, - PatchSet.Id id) { + public static PatchSet.Id nextPatchSetId(Map allRefs, PatchSet.Id id) { PatchSet.Id next = nextPatchSetId(id); while (allRefs.containsKey(next.toRefName())) { next = nextPatchSetId(next); @@ -64,8 +59,7 @@ public class ChangeUtil { return new PatchSet.Id(id.getParentKey(), id.get() + 1); } - public static PatchSet.Id nextPatchSetId(Repository git, PatchSet.Id id) - throws IOException { + public static PatchSet.Id nextPatchSetId(Repository git, PatchSet.Id id) throws IOException { return nextPatchSetId(git.getRefDatabase().getRefs(RefDatabase.ALL), id); } @@ -73,7 +67,8 @@ public class ChangeUtil { if (subject.length() > SUBJECT_MAX_LENGTH) { int maxLength = SUBJECT_MAX_LENGTH - SUBJECT_CROP_APPENDIX.length(); for (int cropPosition = maxLength; - cropPosition > maxLength - SUBJECT_CROP_RANGE; cropPosition--) { + cropPosition > maxLength - SUBJECT_CROP_RANGE; + cropPosition--) { if (Character.isWhitespace(subject.charAt(cropPosition - 1))) { return subject.substring(0, cropPosition) + SUBJECT_CROP_APPENDIX; } @@ -83,6 +78,5 @@ public class ChangeUtil { return subject; } - private ChangeUtil() { - } + private ChangeUtil() {} } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/CmdLineParserModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/CmdLineParserModule.java index 282d51e2bc..63f72020af 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/CmdLineParserModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/CmdLineParserModule.java @@ -32,16 +32,13 @@ import com.google.gerrit.server.project.ProjectControl; import com.google.gerrit.util.cli.CmdLineParser; import com.google.gerrit.util.cli.OptionHandlerUtil; import com.google.gerrit.util.cli.OptionHandlers; - +import java.net.SocketAddress; +import java.sql.Timestamp; import org.eclipse.jgit.lib.ObjectId; import org.kohsuke.args4j.spi.OptionHandler; -import java.net.SocketAddress; -import java.sql.Timestamp; - public class CmdLineParserModule extends FactoryModule { - public CmdLineParserModule() { - } + public CmdLineParserModule() {} @Override protected void configure() { @@ -59,8 +56,7 @@ public class CmdLineParserModule extends FactoryModule { registerOptionHandler(Timestamp.class, TimestampHandler.class); } - private void registerOptionHandler(Class type, - Class> impl) { + private void registerOptionHandler(Class type, Class> impl) { install(OptionHandlerUtil.moduleFor(type, impl)); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/CommentsUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/CommentsUtil.java index a9af7e058a..f4344d879e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/CommentsUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/CommentsUtil.java @@ -51,15 +51,6 @@ import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.ResultSet; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.BatchRefUpdate; -import org.eclipse.jgit.lib.NullProgressMonitor; -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.Ref; -import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.revwalk.RevWalk; -import org.eclipse.jgit.transport.ReceiveCommand; - import java.io.IOException; import java.util.ArrayList; import java.util.Collection; @@ -68,28 +59,35 @@ import java.util.List; import java.util.Optional; import java.util.function.Predicate; import java.util.stream.StreamSupport; +import org.eclipse.jgit.lib.BatchRefUpdate; +import org.eclipse.jgit.lib.NullProgressMonitor; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevWalk; +import org.eclipse.jgit.transport.ReceiveCommand; /** * Utility functions to manipulate Comments. - *

- * These methods either query for and update Comments in the NoteDb or - * ReviewDb, depending on the state of the NotesMigration. + * + *

These methods either query for and update Comments in the NoteDb or ReviewDb, depending on the + * state of the NotesMigration. */ @Singleton public class CommentsUtil { public static final Ordering COMMENT_ORDER = new Ordering() { - @Override - public int compare(Comment c1, Comment c2) { - return ComparisonChain.start() - .compare(c1.key.filename, c2.key.filename) - .compare(c1.key.patchSetId, c2.key.patchSetId) - .compare(c1.side, c2.side) - .compare(c1.lineNbr, c2.lineNbr) - .compare(c1.writtenOn, c2.writtenOn) - .result(); - } - }; + @Override + public int compare(Comment c1, Comment c2) { + return ComparisonChain.start() + .compare(c1.key.filename, c2.key.filename) + .compare(c1.key.patchSetId, c2.key.patchSetId) + .compare(c1.side, c2.side) + .compare(c1.lineNbr, c2.lineNbr) + .compare(c1.writtenOn, c2.writtenOn) + .result(); + } + }; public static final Ordering COMMENT_INFO_ORDER = new Ordering() { @@ -111,8 +109,7 @@ public class CommentsUtil { } }; - public static PatchSet.Id getCommentPsId(Change.Id changeId, - Comment comment) { + public static PatchSet.Id getCommentPsId(Change.Id changeId, Comment comment) { return new PatchSet.Id(changeId, comment.key.patchSetId); } @@ -123,8 +120,7 @@ public class CommentsUtil { return tag.substring("mailMessageId=".length()); } - private static final Ordering> NULLS_FIRST = - Ordering.natural().nullsFirst(); + private static final Ordering> NULLS_FIRST = Ordering.natural().nullsFirst(); private final GitRepositoryManager repoManager; private final AllUsersName allUsers; @@ -132,7 +128,8 @@ public class CommentsUtil { private final String serverId; @Inject - CommentsUtil(GitRepositoryManager repoManager, + CommentsUtil( + GitRepositoryManager repoManager, AllUsersName allUsers, NotesMigration migration, @GerritServerId String serverId) { @@ -142,7 +139,8 @@ public class CommentsUtil { this.serverId = serverId; } - public Comment newComment(ChangeContext ctx, + public Comment newComment( + ChangeContext ctx, String path, PatchSet.Id psId, short side, @@ -159,62 +157,73 @@ public class CommentsUtil { Comment.Key key = new Comment.Key(parentUuid, path, psId.patchSetId); Optional parent = get(ctx.getDb(), ctx.getNotes(), key); if (!parent.isPresent()) { - throw new UnprocessableEntityException( - "Invalid parentUuid supplied for comment"); + throw new UnprocessableEntityException("Invalid parentUuid supplied for comment"); } unresolved = parent.get().unresolved; } } - Comment c = new Comment( - new Comment.Key(ChangeUtil.messageUuid(), path, psId.get()), - ctx.getUser().getAccountId(), ctx.getWhen(), side, message, serverId, - unresolved); + Comment c = + new Comment( + new Comment.Key(ChangeUtil.messageUuid(), path, psId.get()), + ctx.getUser().getAccountId(), + ctx.getWhen(), + side, + message, + serverId, + unresolved); c.parentUuid = parentUuid; ctx.getUser().updateRealAccountId(c::setRealAuthor); return c; } - public RobotComment newRobotComment(ChangeContext ctx, String path, - PatchSet.Id psId, short side, String message, String robotId, + public RobotComment newRobotComment( + ChangeContext ctx, + String path, + PatchSet.Id psId, + short side, + String message, + String robotId, String robotRunId) { - RobotComment c = new RobotComment( - new Comment.Key(ChangeUtil.messageUuid(), path, psId.get()), - ctx.getUser().getAccountId(), ctx.getWhen(), side, message, serverId, - robotId, robotRunId); + RobotComment c = + new RobotComment( + new Comment.Key(ChangeUtil.messageUuid(), path, psId.get()), + ctx.getUser().getAccountId(), + ctx.getWhen(), + side, + message, + serverId, + robotId, + robotRunId); ctx.getUser().updateRealAccountId(c::setRealAuthor); return c; } - public Optional get(ReviewDb db, ChangeNotes notes, - Comment.Key key) throws OrmException { + public Optional get(ReviewDb db, ChangeNotes notes, Comment.Key key) + throws OrmException { if (!migration.readChanges()) { return Optional.ofNullable( - db.patchComments() - .get(PatchLineComment.Key.from(notes.getChangeId(), key))) + db.patchComments().get(PatchLineComment.Key.from(notes.getChangeId(), key))) .map(plc -> plc.asComment(serverId)); } Predicate p = c -> key.equals(c.key); - Optional c = - publishedByChange(db, notes).stream().filter(p).findFirst(); + Optional c = publishedByChange(db, notes).stream().filter(p).findFirst(); if (c.isPresent()) { return c; } return draftByChange(db, notes).stream().filter(p).findFirst(); } - public List publishedByChange(ReviewDb db, ChangeNotes notes) - throws OrmException { + public List publishedByChange(ReviewDb db, ChangeNotes notes) throws OrmException { if (!migration.readChanges()) { - return sort(byCommentStatus( - db.patchComments().byChange(notes.getChangeId()), Status.PUBLISHED)); + return sort( + byCommentStatus(db.patchComments().byChange(notes.getChangeId()), Status.PUBLISHED)); } notes.load(); return sort(Lists.newArrayList(notes.getComments().values())); } - public List robotCommentsByChange(ChangeNotes notes) - throws OrmException { + public List robotCommentsByChange(ChangeNotes notes) throws OrmException { if (!migration.readChanges()) { return ImmutableList.of(); } @@ -223,11 +232,9 @@ public class CommentsUtil { return sort(Lists.newArrayList(notes.getRobotComments().values())); } - public List draftByChange(ReviewDb db, ChangeNotes notes) - throws OrmException { + public List draftByChange(ReviewDb db, ChangeNotes notes) throws OrmException { if (!migration.readChanges()) { - return sort(byCommentStatus( - db.patchComments().byChange(notes.getChangeId()), Status.DRAFT)); + return sort(byCommentStatus(db.patchComments().byChange(notes.getChangeId()), Status.DRAFT)); } List comments = new ArrayList<>(); @@ -240,17 +247,16 @@ public class CommentsUtil { return sort(comments); } - private List byCommentStatus(ResultSet comments, - final PatchLineComment.Status status) { - return toComments(serverId, Lists.newArrayList( - Iterables.filter(comments, c -> c.getStatus() == status))); + private List byCommentStatus( + ResultSet comments, final PatchLineComment.Status status) { + return toComments( + serverId, Lists.newArrayList(Iterables.filter(comments, c -> c.getStatus() == status))); } - public List byPatchSet(ReviewDb db, - ChangeNotes notes, PatchSet.Id psId) throws OrmException { + public List byPatchSet(ReviewDb db, ChangeNotes notes, PatchSet.Id psId) + throws OrmException { if (!migration.readChanges()) { - return sort(toComments(serverId, - db.patchComments().byPatchSet(psId).toList())); + return sort(toComments(serverId, db.patchComments().byPatchSet(psId).toList())); } List comments = new ArrayList<>(); comments.addAll(publishedByPatchSet(db, notes, psId)); @@ -264,27 +270,27 @@ public class CommentsUtil { return sort(comments); } - public List publishedByChangeFile(ReviewDb db, ChangeNotes notes, - Change.Id changeId, String file) throws OrmException { + public List publishedByChangeFile( + ReviewDb db, ChangeNotes notes, Change.Id changeId, String file) throws OrmException { if (!migration.readChanges()) { - return sort(toComments(serverId, - db.patchComments().publishedByChangeFile(changeId, file).toList())); + return sort( + toComments(serverId, db.patchComments().publishedByChangeFile(changeId, file).toList())); } return commentsOnFile(notes.load().getComments().values(), file); } - public List publishedByPatchSet(ReviewDb db, - ChangeNotes notes, PatchSet.Id psId) throws OrmException { + public List publishedByPatchSet(ReviewDb db, ChangeNotes notes, PatchSet.Id psId) + throws OrmException { if (!migration.readChanges()) { - return removeCommentsOnAncestorOfCommitMessage(sort(toComments(serverId, - db.patchComments().publishedByPatchSet(psId).toList()))); + return removeCommentsOnAncestorOfCommitMessage( + sort(toComments(serverId, db.patchComments().publishedByPatchSet(psId).toList()))); } return removeCommentsOnAncestorOfCommitMessage( commentsOnPatchSet(notes.load().getComments().values(), psId)); } - public List robotCommentsByPatchSet(ChangeNotes notes, - PatchSet.Id psId) throws OrmException { + public List robotCommentsByPatchSet(ChangeNotes notes, PatchSet.Id psId) + throws OrmException { if (!migration.readChanges()) { return ImmutableList.of(); } @@ -292,49 +298,45 @@ public class CommentsUtil { } /** - * For the commit message the A side in a diff view is always empty when a - * comparison against an ancestor is done, so there can't be any comments on - * this ancestor. However earlier we showed the auto-merge commit message on - * side A when for a merge commit a comparison against the auto-merge was - * done. From that time there may still be comments on the auto-merge commit + * For the commit message the A side in a diff view is always empty when a comparison against an + * ancestor is done, so there can't be any comments on this ancestor. However earlier we showed + * the auto-merge commit message on side A when for a merge commit a comparison against the + * auto-merge was done. From that time there may still be comments on the auto-merge commit * message and those we want to filter out. */ - private List removeCommentsOnAncestorOfCommitMessage( - List list) { + private List removeCommentsOnAncestorOfCommitMessage(List list) { return list.stream() .filter(c -> c.side != 0 || !Patch.COMMIT_MSG.equals(c.key.filename)) .collect(toList()); } - public List draftByPatchSetAuthor(ReviewDb db, PatchSet.Id psId, - Account.Id author, ChangeNotes notes) throws OrmException { + public List draftByPatchSetAuthor( + ReviewDb db, PatchSet.Id psId, Account.Id author, ChangeNotes notes) throws OrmException { if (!migration.readChanges()) { - return sort(toComments(serverId, - db.patchComments().draftByPatchSetAuthor(psId, author).toList())); + return sort( + toComments(serverId, db.patchComments().draftByPatchSetAuthor(psId, author).toList())); } return commentsOnPatchSet(notes.load().getDraftComments(author).values(), psId); } - public List draftByChangeFileAuthor(ReviewDb db, - ChangeNotes notes, String file, Account.Id author) - throws OrmException { + public List draftByChangeFileAuthor( + ReviewDb db, ChangeNotes notes, String file, Account.Id author) throws OrmException { if (!migration.readChanges()) { - return sort(toComments(serverId, - db.patchComments() - .draftByChangeFileAuthor(notes.getChangeId(), file, author) - .toList())); + return sort( + toComments( + serverId, + db.patchComments() + .draftByChangeFileAuthor(notes.getChangeId(), file, author) + .toList())); } return commentsOnFile(notes.load().getDraftComments(author).values(), file); } - public List draftByChangeAuthor(ReviewDb db, - ChangeNotes notes, Account.Id author) + public List draftByChangeAuthor(ReviewDb db, ChangeNotes notes, Account.Id author) throws OrmException { if (!migration.readChanges()) { - return StreamSupport - .stream(db.patchComments().draftByAuthor(author).spliterator(), false) - .filter(c -> c.getPatchSetId().getParentKey() - .equals(notes.getChangeId())) + return StreamSupport.stream(db.patchComments().draftByAuthor(author).spliterator(), false) + .filter(c -> c.getPatchSetId().getParentKey().equals(notes.getChangeId())) .map(plc -> plc.asComment(serverId)) .sorted(COMMENT_ORDER) .collect(toList()); @@ -345,17 +347,17 @@ public class CommentsUtil { } @Deprecated // To be used only by HasDraftByLegacyPredicate. - public List changesWithDraftsByAuthor(ReviewDb db, - Account.Id author) throws OrmException { + public List changesWithDraftsByAuthor(ReviewDb db, Account.Id author) + throws OrmException { if (!migration.readChanges()) { return FluentIterable.from(db.patchComments().draftByAuthor(author)) - .transform(plc -> plc.getPatchSetId().getParentKey()).toList(); + .transform(plc -> plc.getPatchSetId().getParentKey()) + .toList(); } List changes = new ArrayList<>(); try (Repository repo = repoManager.openRepository(allUsers)) { - for (String refName : repo.getRefDatabase() - .getRefs(RefNames.REFS_DRAFT_COMMENTS).keySet()) { + for (String refName : repo.getRefDatabase().getRefs(RefNames.REFS_DRAFT_COMMENTS).keySet()) { Account.Id accountId = Account.Id.fromRefSuffix(refName); Change.Id changeId = Change.Id.fromRefPart(refName); if (accountId == null || changeId == null) { @@ -369,56 +371,51 @@ public class CommentsUtil { return changes; } - public void putComments(ReviewDb db, ChangeUpdate update, - PatchLineComment.Status status, Iterable comments) - throws OrmException { + public void putComments( + ReviewDb db, ChangeUpdate update, PatchLineComment.Status status, Iterable comments) + throws OrmException { for (Comment c : comments) { update.putComment(status, c); } - db.patchComments() - .upsert(toPatchLineComments(update.getId(), status, comments)); + db.patchComments().upsert(toPatchLineComments(update.getId(), status, comments)); } - public void putRobotComments(ChangeUpdate update, - Iterable comments) { + public void putRobotComments(ChangeUpdate update, Iterable comments) { for (RobotComment c : comments) { update.putRobotComment(c); } } - public void deleteComments(ReviewDb db, ChangeUpdate update, - Iterable comments) throws OrmException { + public void deleteComments(ReviewDb db, ChangeUpdate update, Iterable comments) + throws OrmException { for (Comment c : comments) { update.deleteComment(c); } - db.patchComments().delete(toPatchLineComments(update.getId(), - PatchLineComment.Status.DRAFT, comments)); + db.patchComments() + .delete(toPatchLineComments(update.getId(), PatchLineComment.Status.DRAFT, comments)); } - public void deleteAllDraftsFromAllUsers(Change.Id changeId) - throws IOException { + public void deleteAllDraftsFromAllUsers(Change.Id changeId) throws IOException { try (Repository repo = repoManager.openRepository(allUsers); RevWalk rw = new RevWalk(repo)) { BatchRefUpdate bru = repo.getRefDatabase().newBatchUpdate(); for (Ref ref : getDraftRefs(repo, changeId)) { - bru.addCommand(new ReceiveCommand( - ref.getObjectId(), ObjectId.zeroId(), ref.getName())); + bru.addCommand(new ReceiveCommand(ref.getObjectId(), ObjectId.zeroId(), ref.getName())); } bru.setRefLogMessage("Delete drafts from NoteDb", false); bru.execute(rw, NullProgressMonitor.INSTANCE); for (ReceiveCommand cmd : bru.getCommands()) { if (cmd.getResult() != ReceiveCommand.Result.OK) { - throw new IOException(String.format( - "Failed to delete draft comment ref %s at %s: %s (%s)", - cmd.getRefName(), cmd.getOldId(), cmd.getResult(), - cmd.getMessage())); + throw new IOException( + String.format( + "Failed to delete draft comment ref %s at %s: %s (%s)", + cmd.getRefName(), cmd.getOldId(), cmd.getResult(), cmd.getMessage())); } } } } - private static List commentsOnFile(Collection allComments, - String file) { + private static List commentsOnFile(Collection allComments, String file) { List result = new ArrayList<>(allComments.size()); for (Comment c : allComments) { String currentFilename = c.key.filename; @@ -430,8 +427,7 @@ public class CommentsUtil { } private static List commentsOnPatchSet( - Collection allComments, - PatchSet.Id psId) { + Collection allComments, PatchSet.Id psId) { List result = new ArrayList<>(allComments.size()); for (T c : allComments) { if (c.key.patchSetId == psId.get()) { @@ -441,10 +437,13 @@ public class CommentsUtil { return sort(result); } - public static void setCommentRevId(Comment c, - PatchListCache cache, Change change, PatchSet ps) throws OrmException { - checkArgument(c.key.patchSetId == ps.getId().get(), - "cannot set RevId for patch set %s on comment %s", ps.getId(), c); + public static void setCommentRevId(Comment c, PatchListCache cache, Change change, PatchSet ps) + throws OrmException { + checkArgument( + c.key.patchSetId == ps.getId().get(), + "cannot set RevId for patch set %s on comment %s", + ps.getId(), + c); if (c.revId == null) { try { if (Side.fromShort(c.side) == Side.PARENT) { @@ -464,18 +463,17 @@ public class CommentsUtil { /** * Get NoteDb draft refs for a change. - *

- * Works if NoteDb is not enabled, but the results are not meaningful. - *

- * This is just a simple ref scan, so the results may potentially include refs - * for zombie draft comments. A zombie draft is one which has been published - * but the write to delete the draft ref from All-Users failed. + * + *

Works if NoteDb is not enabled, but the results are not meaningful. + * + *

This is just a simple ref scan, so the results may potentially include refs for zombie draft + * comments. A zombie draft is one which has been published but the write to delete the draft ref + * from All-Users failed. * * @param changeId change ID. * @return raw refs from All-Users repo. */ - public Collection getDraftRefs(Change.Id changeId) - throws OrmException { + public Collection getDraftRefs(Change.Id changeId) throws OrmException { try (Repository repo = repoManager.openRepository(allUsers)) { return getDraftRefs(repo, changeId); } catch (IOException e) { @@ -483,10 +481,8 @@ public class CommentsUtil { } } - private Collection getDraftRefs(Repository repo, Change.Id changeId) - throws IOException { - return repo.getRefDatabase().getRefs( - RefNames.refsDraftCommentsPrefix(changeId)).values(); + private Collection getDraftRefs(Repository repo, Change.Id changeId) throws IOException { + return repo.getRefDatabase().getRefs(RefNames.refsDraftCommentsPrefix(changeId)).values(); } private static List sort(List comments) { @@ -495,15 +491,13 @@ public class CommentsUtil { } public static Iterable toPatchLineComments( - Change.Id changeId, PatchLineComment.Status status, - Iterable comments) { - return FluentIterable.from(comments) - .transform(c -> PatchLineComment.from(changeId, status, c)); + Change.Id changeId, PatchLineComment.Status status, Iterable comments) { + return FluentIterable.from(comments).transform(c -> PatchLineComment.from(changeId, status, c)); } - public static List toComments(final String serverId, - Iterable comments) { - return COMMENT_ORDER.sortedCopy(FluentIterable.from(comments) - .transform(plc -> plc.asComment(serverId))); + public static List toComments( + final String serverId, Iterable comments) { + return COMMENT_ORDER.sortedCopy( + FluentIterable.from(comments).transform(plc -> plc.asComment(serverId))); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/CommonConverters.java b/gerrit-server/src/main/java/com/google/gerrit/server/CommonConverters.java index be07bde99e..2b48169f2e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/CommonConverters.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/CommonConverters.java @@ -15,17 +15,15 @@ package com.google.gerrit.server; import com.google.gerrit.extensions.common.GitPerson; - -import org.eclipse.jgit.lib.PersonIdent; - import java.sql.Timestamp; +import org.eclipse.jgit.lib.PersonIdent; /** * Converters to classes in {@code com.google.gerrit.extensions.common}. - *

- * The server frequently needs to convert internal types to types exposed in the - * extension API, but the converters themselves are not part of this API. This - * class contains such converters as static utility methods. + * + *

The server frequently needs to convert internal types to types exposed in the extension API, + * but the converters themselves are not part of this API. This class contains such converters as + * static utility methods. */ public class CommonConverters { public static GitPerson toGitPerson(PersonIdent ident) { @@ -37,6 +35,5 @@ public class CommonConverters { return result; } - private CommonConverters() { - } + private CommonConverters() {} } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/CurrentUser.java b/gerrit-server/src/main/java/com/google/gerrit/server/CurrentUser.java index b62283aa98..9a294c9056 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/CurrentUser.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/CurrentUser.java @@ -20,13 +20,12 @@ import com.google.gerrit.reviewdb.client.AccountExternalId; import com.google.gerrit.server.account.CapabilityControl; import com.google.gerrit.server.account.GroupMembership; import com.google.inject.servlet.RequestScoped; - import java.util.function.Consumer; /** * Information about the currently logged in user. - *

- * This is a {@link RequestScoped} property managed by Guice. + * + *

This is a {@link RequestScoped} property managed by Guice. * * @see AnonymousUser * @see IdentifiedUser @@ -38,16 +37,14 @@ public abstract class CurrentUser { return new PropertyKey<>(); } - private PropertyKey() { - } + private PropertyKey() {} } private final CapabilityControl.Factory capabilityControlFactory; private AccessPath accessPath = AccessPath.UNKNOWN; private CapabilityControl capabilities; - private PropertyKey lastLoginExternalIdPropertyKey = - PropertyKey.create(); + private PropertyKey lastLoginExternalIdPropertyKey = PropertyKey.create(); protected CurrentUser(CapabilityControl.Factory capabilityControlFactory) { this.capabilityControlFactory = capabilityControlFactory; @@ -64,21 +61,19 @@ public abstract class CurrentUser { /** * Identity of the authenticated user. - *

- * In the normal case where a user authenticates as themselves - * {@code getRealUser() == this}. - *

- * If {@code X-Gerrit-RunAs} or {@code suexec} was used this method returns - * the identity of the account that has permission to act on behalf of this - * user. + * + *

In the normal case where a user authenticates as themselves {@code getRealUser() == this}. + * + *

If {@code X-Gerrit-RunAs} or {@code suexec} was used this method returns the identity of the + * account that has permission to act on behalf of this user. */ public CurrentUser getRealUser() { return this; } /** - * If the {@link #getRealUser()} has an account ID associated with it, call - * the given setter with that ID. + * If the {@link #getRealUser()} has an account ID associated with it, call the given setter with + * that ID. */ public void updateRealAccountId(Consumer setter) { if (getRealUser().isIdentifiedUser()) { @@ -88,12 +83,11 @@ public abstract class CurrentUser { /** * Get the set of groups the user is currently a member of. - *

- * The returned set may be a subset of the user's actual groups; if the user's - * account is currently deemed to be untrusted then the effective group set is - * only the anonymous and registered user groups. To enable additional groups - * (and gain their granted permissions) the user must update their account to - * use only trusted authentication providers. + * + *

The returned set may be a subset of the user's actual groups; if the user's account is + * currently deemed to be untrusted then the effective group set is only the anonymous and + * registered user groups. To enable additional groups (and gain their granted permissions) the + * user must update their account to use only trusted authentication providers. * * @return active groups for this user. */ @@ -151,8 +145,7 @@ public abstract class CurrentUser { * @param key unique property key. * @param value value to store; or {@code null} to clear the value. */ - public void put(PropertyKey key, @Nullable T value) { - } + public void put(PropertyKey key, @Nullable T value) {} public void setLastLoginExternalIdKey(AccountExternalId.Key externalIdKey) { put(lastLoginExternalIdPropertyKey, externalIdKey); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/EnableSignedPush.java b/gerrit-server/src/main/java/com/google/gerrit/server/EnableSignedPush.java index 13942a67ff..154a78370d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/EnableSignedPush.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/EnableSignedPush.java @@ -17,13 +17,9 @@ package com.google.gerrit.server; import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.google.inject.BindingAnnotation; - import java.lang.annotation.Retention; -/** - * Marker on a boolean indicating whether signed push is enabled on the server. - */ +/** Marker on a boolean indicating whether signed push is enabled on the server. */ @Retention(RUNTIME) @BindingAnnotation -public @interface EnableSignedPush { -} +public @interface EnableSignedPush {} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/GerritPersonIdent.java b/gerrit-server/src/main/java/com/google/gerrit/server/GerritPersonIdent.java index 07b49ee922..5d259b3d5f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/GerritPersonIdent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/GerritPersonIdent.java @@ -17,7 +17,6 @@ package com.google.gerrit.server; import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.google.inject.BindingAnnotation; - import java.lang.annotation.Retention; /** @@ -26,5 +25,4 @@ import java.lang.annotation.Retention; */ @Retention(RUNTIME) @BindingAnnotation -public @interface GerritPersonIdent { -} +public @interface GerritPersonIdent {} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/GerritPersonIdentProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/GerritPersonIdentProvider.java index 2d9bbb91bf..8c68270ba4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/GerritPersonIdentProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/GerritPersonIdentProvider.java @@ -18,7 +18,6 @@ import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.UserConfig; @@ -43,5 +42,4 @@ public class GerritPersonIdentProvider implements Provider { public PersonIdent get() { return new PersonIdent(name, email); } - } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/GpgException.java b/gerrit-server/src/main/java/com/google/gerrit/server/GpgException.java index 5ed27b5813..a34b75ceb8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/GpgException.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/GpgException.java @@ -30,4 +30,3 @@ public class GpgException extends Exception { super(message, cause); } } - diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/IdentifiedUser.java b/gerrit-server/src/main/java/com/google/gerrit/server/IdentifiedUser.java index 313a3e31a8..026e32afc3 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/IdentifiedUser.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/IdentifiedUser.java @@ -37,10 +37,6 @@ import com.google.inject.Provider; import com.google.inject.ProvisionException; import com.google.inject.Singleton; import com.google.inject.util.Providers; - -import org.eclipse.jgit.lib.PersonIdent; -import org.eclipse.jgit.util.SystemReader; - import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.MalformedURLException; @@ -51,6 +47,8 @@ import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.TimeZone; +import org.eclipse.jgit.lib.PersonIdent; +import org.eclipse.jgit.util.SystemReader; /** An authenticated user. */ public class IdentifiedUser extends CurrentUser { @@ -87,9 +85,17 @@ public class IdentifiedUser extends CurrentUser { } public IdentifiedUser create(AccountState state) { - return new IdentifiedUser(capabilityControlFactory, authConfig, realm, - anonymousCowardName, canonicalUrl, accountCache, groupBackend, - disableReverseDnsLookup, Providers.of((SocketAddress) null), state, + return new IdentifiedUser( + capabilityControlFactory, + authConfig, + realm, + anonymousCowardName, + canonicalUrl, + accountCache, + groupBackend, + disableReverseDnsLookup, + Providers.of((SocketAddress) null), + state, null); } @@ -101,19 +107,28 @@ public class IdentifiedUser extends CurrentUser { return runAs(remotePeer, id, null); } - public IdentifiedUser runAs(SocketAddress remotePeer, Account.Id id, - @Nullable CurrentUser caller) { - return new IdentifiedUser(capabilityControlFactory, authConfig, realm, - anonymousCowardName, canonicalUrl, accountCache, groupBackend, - disableReverseDnsLookup, Providers.of(remotePeer), id, caller); + public IdentifiedUser runAs( + SocketAddress remotePeer, Account.Id id, @Nullable CurrentUser caller) { + return new IdentifiedUser( + capabilityControlFactory, + authConfig, + realm, + anonymousCowardName, + canonicalUrl, + accountCache, + groupBackend, + disableReverseDnsLookup, + Providers.of(remotePeer), + id, + caller); } } /** * Create an IdentifiedUser, relying on current request state. - *

- * Can only be used from within a module that has defined request scoped - * {@code @RemotePeer SocketAddress} and {@code ReviewDb} providers. + * + *

Can only be used from within a module that has defined request scoped {@code @RemotePeer + * SocketAddress} and {@code ReviewDb} providers. */ @Singleton public static class RequestFactory { @@ -150,22 +165,39 @@ public class IdentifiedUser extends CurrentUser { } public IdentifiedUser create(Account.Id id) { - return new IdentifiedUser(capabilityControlFactory, authConfig, realm, - anonymousCowardName, canonicalUrl, accountCache, groupBackend, - disableReverseDnsLookup, remotePeerProvider, id, null); + return new IdentifiedUser( + capabilityControlFactory, + authConfig, + realm, + anonymousCowardName, + canonicalUrl, + accountCache, + groupBackend, + disableReverseDnsLookup, + remotePeerProvider, + id, + null); } public IdentifiedUser runAs(Account.Id id, CurrentUser caller) { - return new IdentifiedUser(capabilityControlFactory, authConfig, realm, - anonymousCowardName, canonicalUrl, accountCache, groupBackend, - disableReverseDnsLookup, remotePeerProvider, id, caller); + return new IdentifiedUser( + capabilityControlFactory, + authConfig, + realm, + anonymousCowardName, + canonicalUrl, + accountCache, + groupBackend, + disableReverseDnsLookup, + remotePeerProvider, + id, + caller); } } private static final GroupMembership registeredGroups = - new ListGroupMembership(ImmutableSet.of( - SystemGroupBackend.ANONYMOUS_USERS, - SystemGroupBackend.REGISTERED_USERS)); + new ListGroupMembership( + ImmutableSet.of(SystemGroupBackend.ANONYMOUS_USERS, SystemGroupBackend.REGISTERED_USERS)); private final Provider canonicalUrl; private final AccountCache accountCache; @@ -174,8 +206,7 @@ public class IdentifiedUser extends CurrentUser { private final GroupBackend groupBackend; private final String anonymousCowardName; private final Boolean disableReverseDnsLookup; - private final Set validEmails = - Sets.newTreeSet(String.CASE_INSENSITIVE_ORDER); + private final Set validEmails = Sets.newTreeSet(String.CASE_INSENSITIVE_ORDER); private final Provider remotePeerProvider; private final Account.Id accountId; @@ -199,9 +230,18 @@ public class IdentifiedUser extends CurrentUser { @Nullable Provider remotePeerProvider, AccountState state, @Nullable CurrentUser realUser) { - this(capabilityControlFactory, authConfig, realm, anonymousCowardName, - canonicalUrl, accountCache, groupBackend, disableReverseDnsLookup, - remotePeerProvider, state.getAccount().getId(), realUser); + this( + capabilityControlFactory, + authConfig, + realm, + anonymousCowardName, + canonicalUrl, + accountCache, + groupBackend, + disableReverseDnsLookup, + remotePeerProvider, + state.getAccount().getId(), + realUser); this.state = state; } @@ -419,8 +459,8 @@ public class IdentifiedUser extends CurrentUser { /** * Returns a materialized copy of the user with all dependencies. * - * Invoke all providers and factories of dependent objects and store the - * references to a copy of the current identified user. + *

Invoke all providers and factories of dependent objects and store the references to a copy + * of the current identified user. * * @return copy of the identified user */ @@ -430,22 +470,32 @@ public class IdentifiedUser extends CurrentUser { try { remotePeer = Providers.of(remotePeerProvider.get()); } catch (OutOfScopeException | ProvisionException e) { - remotePeer = new Provider() { - @Override - public SocketAddress get() { - throw e; - } - }; + remotePeer = + new Provider() { + @Override + public SocketAddress get() { + throw e; + } + }; } - return new IdentifiedUser(new CapabilityControl.Factory() { + return new IdentifiedUser( + new CapabilityControl.Factory() { - @Override - public CapabilityControl create(CurrentUser user) { - return capabilities; - } - }, authConfig, realm, anonymousCowardName, - Providers.of(canonicalUrl.get()), accountCache, groupBackend, - disableReverseDnsLookup, remotePeer, state, realUser); + @Override + public CapabilityControl create(CurrentUser user) { + return capabilities; + } + }, + authConfig, + realm, + anonymousCowardName, + Providers.of(canonicalUrl.get()), + accountCache, + groupBackend, + disableReverseDnsLookup, + remotePeer, + state, + realUser); } private String guessHost() { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/InternalUser.java b/gerrit-server/src/main/java/com/google/gerrit/server/InternalUser.java index 02d41f49f9..bc99ec148c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/InternalUser.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/InternalUser.java @@ -21,11 +21,10 @@ import com.google.inject.Inject; /** * User identity for plugin code that needs an identity. - *

- * An InternalUser has no real identity, it acts as the server and can access - * anything it wants, anytime it wants, given the JVM's own direct access to - * data. Plugins may use this when they need to have a CurrentUser with read - * permission on anything. + * + *

An InternalUser has no real identity, it acts as the server and can access anything it wants, + * anytime it wants, given the JVM's own direct access to data. Plugins may use this when they need + * to have a CurrentUser with read permission on anything. * * @see PluginUser */ diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/LibModuleLoader.java b/gerrit-server/src/main/java/com/google/gerrit/server/LibModuleLoader.java index abea78f9d5..4ec7d2d9c6 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/LibModuleLoader.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/LibModuleLoader.java @@ -21,18 +21,15 @@ import com.google.inject.Injector; import com.google.inject.Key; import com.google.inject.Module; import com.google.inject.ProvisionException; - +import java.util.Arrays; +import java.util.List; import org.eclipse.jgit.lib.Config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Arrays; -import java.util.List; - /** Loads configured Guice modules from {@code gerrit.installModule}. */ public class LibModuleLoader { - private static final Logger log = - LoggerFactory.getLogger(LibModuleLoader.class); + private static final Logger log = LoggerFactory.getLogger(LibModuleLoader.class); public static List loadModules(Injector parent) { Config cfg = getConfig(parent); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/OptionUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/OptionUtil.java index c050a614b9..7b317cb9c2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/OptionUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/OptionUtil.java @@ -24,11 +24,8 @@ public class OptionUtil { Splitter.on(CharMatcher.anyOf(", ")).omitEmptyStrings().trimResults(); public static Iterable splitOptionValue(String value) { - return Iterables.transform( - COMMA_OR_SPACE.split(value), - String::toLowerCase); + return Iterables.transform(COMMA_OR_SPACE.split(value), String::toLowerCase); } - private OptionUtil() { - } + private OptionUtil() {} } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/OutputFormat.java b/gerrit-server/src/main/java/com/google/gerrit/server/OutputFormat.java index 7e1ec4b2d0..e555845a8b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/OutputFormat.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/OutputFormat.java @@ -18,30 +18,28 @@ import com.google.gson.FieldNamingPolicy; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gwtjsonrpc.server.SqlTimestampDeserializer; - import java.sql.Timestamp; /** Standard output format used by an API call. */ public enum OutputFormat { /** - * The output is a human readable text format. It may also be regular enough - * to be machine readable. Whether or not the text format is machine readable - * and will be committed to as a long term format that tools can build upon is - * specific to each API call. + * The output is a human readable text format. It may also be regular enough to be machine + * readable. Whether or not the text format is machine readable and will be committed to as a long + * term format that tools can build upon is specific to each API call. */ TEXT, /** - * Pretty-printed JSON format. This format uses whitespace to make the output - * readable by a human, but is also machine readable with a JSON library. The - * structure of the output is a long term format that tools can rely upon. + * Pretty-printed JSON format. This format uses whitespace to make the output readable by a human, + * but is also machine readable with a JSON library. The structure of the output is a long term + * format that tools can rely upon. */ JSON, /** - * Same as {@link #JSON}, but with unnecessary whitespace removed to save - * generation time and copy costs. Typically JSON_COMPACT format is used by a - * browser based HTML client running over the network. + * Same as {@link #JSON}, but with unnecessary whitespace removed to save generation time and copy + * costs. Typically JSON_COMPACT format is used by a browser based HTML client running over the + * network. */ JSON_COMPACT; @@ -55,9 +53,10 @@ public enum OutputFormat { if (!isJson()) { throw new IllegalStateException(String.format("%s is not JSON", this)); } - GsonBuilder gb = new GsonBuilder() - .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) - .registerTypeAdapter(Timestamp.class, new SqlTimestampDeserializer()); + GsonBuilder gb = + new GsonBuilder() + .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) + .registerTypeAdapter(Timestamp.class, new SqlTimestampDeserializer()); if (this == OutputFormat.JSON) { gb.setPrettyPrinting(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/PatchSetUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/PatchSetUtil.java index fdc1feb4d7..ab942ca28e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/PatchSetUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/PatchSetUtil.java @@ -32,14 +32,12 @@ import com.google.gerrit.server.notedb.PatchSetState; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.revwalk.RevWalk; - import java.io.IOException; import java.sql.Timestamp; import java.util.Collections; import java.util.List; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.revwalk.RevWalk; /** Utilities for manipulating patch sets. */ @Singleton @@ -51,13 +49,11 @@ public class PatchSetUtil { this.migration = migration; } - public PatchSet current(ReviewDb db, ChangeNotes notes) - throws OrmException { + public PatchSet current(ReviewDb db, ChangeNotes notes) throws OrmException { return get(db, notes, notes.getChange().currentPatchSetId()); } - public PatchSet get(ReviewDb db, ChangeNotes notes, PatchSet.Id psId) - throws OrmException { + public PatchSet get(ReviewDb db, ChangeNotes notes, PatchSet.Id psId) throws OrmException { if (!migration.readChanges()) { return db.patchSets().get(psId); } @@ -73,13 +69,12 @@ public class PatchSetUtil { return notes.load().getPatchSets().values(); } - public ImmutableMap byChangeAsMap(ReviewDb db, - ChangeNotes notes) throws OrmException { + public ImmutableMap byChangeAsMap(ReviewDb db, ChangeNotes notes) + throws OrmException { if (!migration.readChanges()) { - ImmutableMap.Builder result = - ImmutableMap.builder(); - for (PatchSet ps : ChangeUtil.PS_ID_ORDER.sortedCopy( - db.patchSets().byChange(notes.getChangeId()))) { + ImmutableMap.Builder result = ImmutableMap.builder(); + for (PatchSet ps : + ChangeUtil.PS_ID_ORDER.sortedCopy(db.patchSets().byChange(notes.getChangeId()))) { result.put(ps.getId(), ps); } return result.build(); @@ -87,9 +82,16 @@ public class PatchSetUtil { return notes.load().getPatchSets(); } - public PatchSet insert(ReviewDb db, RevWalk rw, ChangeUpdate update, - PatchSet.Id psId, ObjectId commit, boolean draft, - List groups, String pushCertificate, String description) + public PatchSet insert( + ReviewDb db, + RevWalk rw, + ChangeUpdate update, + PatchSet.Id psId, + ObjectId commit, + boolean draft, + List groups, + String pushCertificate, + String description) throws OrmException, IOException { checkNotNull(groups, "groups may not be null"); ensurePatchSetMatches(psId, update); @@ -114,38 +116,40 @@ public class PatchSetUtil { return ps; } - public void publish(ReviewDb db, ChangeUpdate update, PatchSet ps) - throws OrmException { + public void publish(ReviewDb db, ChangeUpdate update, PatchSet ps) throws OrmException { ensurePatchSetMatches(ps.getId(), update); ps.setDraft(false); update.setPatchSetState(PUBLISHED); db.patchSets().update(Collections.singleton(ps)); } - public void delete(ReviewDb db, ChangeUpdate update, PatchSet ps) - throws OrmException { + public void delete(ReviewDb db, ChangeUpdate update, PatchSet ps) throws OrmException { ensurePatchSetMatches(ps.getId(), update); - checkArgument(ps.isDraft(), - "cannot delete non-draft patch set %s", ps.getId()); + checkArgument(ps.isDraft(), "cannot delete non-draft patch set %s", ps.getId()); update.setPatchSetState(PatchSetState.DELETED); db.patchSets().delete(Collections.singleton(ps)); } private void ensurePatchSetMatches(PatchSet.Id psId, ChangeUpdate update) { Change.Id changeId = update.getChange().getId(); - checkArgument(psId.getParentKey().equals(changeId), - "cannot modify patch set %s on update for change %s", psId, changeId); + checkArgument( + psId.getParentKey().equals(changeId), + "cannot modify patch set %s on update for change %s", + psId, + changeId); if (update.getPatchSetId() != null) { - checkArgument(update.getPatchSetId().equals(psId), + checkArgument( + update.getPatchSetId().equals(psId), "cannot modify patch set %s on update for %s", - psId, update.getPatchSetId()); + psId, + update.getPatchSetId()); } else { update.setPatchSetId(psId); } } - public void setGroups(ReviewDb db, ChangeUpdate update, PatchSet ps, - List groups) throws OrmException { + public void setGroups(ReviewDb db, ChangeUpdate update, PatchSet ps, List groups) + throws OrmException { ps.setGroups(groups); update.setGroups(groups); db.patchSets().update(Collections.singleton(ps)); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/PeerDaemonUser.java b/gerrit-server/src/main/java/com/google/gerrit/server/PeerDaemonUser.java index 6616a66e58..263bb5077c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/PeerDaemonUser.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/PeerDaemonUser.java @@ -18,7 +18,6 @@ import com.google.gerrit.server.account.CapabilityControl; import com.google.gerrit.server.account.GroupMembership; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - import java.net.SocketAddress; /** Identity of a peer daemon process that isn't this JVM. */ @@ -33,8 +32,8 @@ public class PeerDaemonUser extends CurrentUser { private final SocketAddress peer; @Inject - protected PeerDaemonUser(CapabilityControl.Factory capabilityControlFactory, - @Assisted SocketAddress peer) { + protected PeerDaemonUser( + CapabilityControl.Factory capabilityControlFactory, @Assisted SocketAddress peer) { super(capabilityControlFactory); this.peer = peer; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/PluginUser.java b/gerrit-server/src/main/java/com/google/gerrit/server/PluginUser.java index 490ab07c26..13e04c552b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/PluginUser.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/PluginUser.java @@ -28,8 +28,7 @@ public class PluginUser extends InternalUser { @Inject protected PluginUser( - CapabilityControl.Factory capabilityControlFactory, - @Assisted String pluginName) { + CapabilityControl.Factory capabilityControlFactory, @Assisted String pluginName) { super(capabilityControlFactory); this.pluginName = pluginName; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ProjectUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/ProjectUtil.java index 40c5242cfd..f3ab21d1eb 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/ProjectUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/ProjectUtil.java @@ -16,12 +16,10 @@ package com.google.gerrit.server; import com.google.gerrit.reviewdb.client.Branch; import com.google.gerrit.server.git.GitRepositoryManager; - +import java.io.IOException; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.Repository; -import java.io.IOException; - public class ProjectUtil { /** @@ -29,16 +27,14 @@ public class ProjectUtil { * * @param repoManager Git repository manager to open the git repository * @param branch the branch for which it should be checked if it exists - * @return {@code true} if the specified branch exists or if - * {@code HEAD} points to this branch, otherwise - * {@code false} - * @throws RepositoryNotFoundException the repository of the branch's project - * does not exist. + * @return {@code true} if the specified branch exists or if {@code HEAD} points to this branch, + * otherwise {@code false} + * @throws RepositoryNotFoundException the repository of the branch's project does not exist. * @throws IOException error while retrieving the branch from the repository. */ - public static boolean branchExists(final GitRepositoryManager repoManager, - final Branch.NameKey branch) throws RepositoryNotFoundException, - IOException { + public static boolean branchExists( + final GitRepositoryManager repoManager, final Branch.NameKey branch) + throws RepositoryNotFoundException, IOException { try (Repository repo = repoManager.openRepository(branch.getParentKey())) { boolean exists = repo.getRefDatabase().exactRef(branch.get()) != null; if (!exists) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/RemotePeer.java b/gerrit-server/src/main/java/com/google/gerrit/server/RemotePeer.java index 77e6d4371d..4e7e04a867 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/RemotePeer.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/RemotePeer.java @@ -17,12 +17,10 @@ package com.google.gerrit.server; import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.google.inject.BindingAnnotation; - import java.lang.annotation.Retention; import java.net.SocketAddress; /** Marker on a {@link SocketAddress} pointing to the remote client. */ @Retention(RUNTIME) @BindingAnnotation -public @interface RemotePeer { -} +public @interface RemotePeer {} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/RequestCleanup.java b/gerrit-server/src/main/java/com/google/gerrit/server/RequestCleanup.java index 6e12346b37..72b361c3ce 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/RequestCleanup.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/RequestCleanup.java @@ -15,22 +15,16 @@ package com.google.gerrit.server; import com.google.inject.servlet.RequestScoped; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; - -/** - * Registers cleanup activities to be completed when a scope ends. - */ +/** Registers cleanup activities to be completed when a scope ends. */ @RequestScoped public class RequestCleanup implements Runnable { - private static final Logger log = - LoggerFactory.getLogger(RequestCleanup.class); + private static final Logger log = LoggerFactory.getLogger(RequestCleanup.class); private final List cleanup = new LinkedList<>(); private boolean ran; @@ -49,7 +43,7 @@ public class RequestCleanup implements Runnable { public void run() { synchronized (cleanup) { ran = true; - for (final Iterator i = cleanup.iterator(); i.hasNext();) { + for (final Iterator i = cleanup.iterator(); i.hasNext(); ) { try { i.next().run(); } catch (Throwable err) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ReviewerRecommender.java b/gerrit-server/src/main/java/com/google/gerrit/server/ReviewerRecommender.java index 91b568c844..8728a08646 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/ReviewerRecommender.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/ReviewerRecommender.java @@ -43,12 +43,6 @@ import com.google.gerrit.server.query.change.InternalChangeQuery; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - -import org.apache.commons.lang.mutable.MutableDouble; -import org.eclipse.jgit.lib.Config; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.ArrayList; import java.util.Collections; import java.util.EnumSet; @@ -65,15 +59,20 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.apache.commons.lang.mutable.MutableDouble; +import org.eclipse.jgit.lib.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class ReviewerRecommender { - private static final Logger log = - LoggerFactory.getLogger(ReviewersUtil.class); + private static final Logger log = LoggerFactory.getLogger(ReviewersUtil.class); private static final double BASE_REVIEWER_WEIGHT = 10; private static final double BASE_OWNER_WEIGHT = 1; private static final double BASE_COMMENT_WEIGHT = 0.5; - private static final double[] WEIGHTS = new double[] { - BASE_REVIEWER_WEIGHT, BASE_OWNER_WEIGHT, BASE_COMMENT_WEIGHT,}; + private static final double[] WEIGHTS = + new double[] { + BASE_REVIEWER_WEIGHT, BASE_OWNER_WEIGHT, BASE_COMMENT_WEIGHT, + }; private static final long PLUGIN_QUERY_TIMEOUT = 500; //ms private final ChangeQueryBuilder changeQueryBuilder; @@ -85,7 +84,8 @@ public class ReviewerRecommender { private final ApprovalsUtil approvalsUtil; @Inject - ReviewerRecommender(ChangeQueryBuilder changeQueryBuilder, + ReviewerRecommender( + ChangeQueryBuilder changeQueryBuilder, DynamicMap reviewerSuggestionPluginMap, InternalChangeQuery internalChangeQuery, WorkQueue workQueue, @@ -105,7 +105,8 @@ public class ReviewerRecommender { public List suggestReviewers( ChangeNotes changeNotes, - SuggestReviewers suggestReviewers, ProjectControl projectControl, + SuggestReviewers suggestReviewers, + ProjectControl projectControl, List candidateList) throws OrmException { String query = suggestReviewers.getQuery(); @@ -115,8 +116,7 @@ public class ReviewerRecommender { if (Strings.isNullOrEmpty(query)) { reviewerScores = baseRankingForEmptyQuery(baseWeight); } else { - reviewerScores = baseRankingForCandidateList( - candidateList, projectControl, baseWeight); + reviewerScores = baseRankingForCandidateList(candidateList, projectControl, baseWeight); } // Send the query along with a candidate list to all plugins and merge the @@ -124,32 +124,41 @@ public class ReviewerRecommender { // can also return non-candidate account ids. List>> tasks = new ArrayList<>(reviewerSuggestionPluginMap.plugins().size()); - List weights = - new ArrayList<>(reviewerSuggestionPluginMap.plugins().size()); + List weights = new ArrayList<>(reviewerSuggestionPluginMap.plugins().size()); - for (DynamicMap.Entry plugin : - reviewerSuggestionPluginMap) { - tasks.add(() -> plugin.getProvider().get() - .suggestReviewers(projectControl.getProject().getNameKey(), - changeNotes.getChangeId(), query, reviewerScores.keySet())); - String pluginWeight = config.getString("addReviewer", - plugin.getPluginName() + "-" + plugin.getExportName(), "weight"); + for (DynamicMap.Entry plugin : reviewerSuggestionPluginMap) { + tasks.add( + () -> + plugin + .getProvider() + .get() + .suggestReviewers( + projectControl.getProject().getNameKey(), + changeNotes.getChangeId(), + query, + reviewerScores.keySet())); + String pluginWeight = + config.getString( + "addReviewer", plugin.getPluginName() + "-" + plugin.getExportName(), "weight"); if (Strings.isNullOrEmpty(pluginWeight)) { pluginWeight = "1"; } try { weights.add(Double.parseDouble(pluginWeight)); } catch (NumberFormatException e) { - log.error("Exception while parsing weight for " + - plugin.getPluginName() + "-" + plugin.getExportName(), e); + log.error( + "Exception while parsing weight for " + + plugin.getPluginName() + + "-" + + plugin.getExportName(), + e); weights.add(1d); } } try { - List>> futures = workQueue - .getDefaultQueue() - .invokeAll(tasks, PLUGIN_QUERY_TIMEOUT, TimeUnit.MILLISECONDS); + List>> futures = + workQueue.getDefaultQueue().invokeAll(tasks, PLUGIN_QUERY_TIMEOUT, TimeUnit.MILLISECONDS); Iterator weightIterator = weights.iterator(); for (Future> f : futures) { double weight = weightIterator.next(); @@ -171,29 +180,30 @@ public class ReviewerRecommender { reviewerScores.remove(changeNotes.getChange().getOwner()); // Remove existing reviewers - reviewerScores.keySet().removeAll( - approvalsUtil.getReviewers(dbProvider.get(), changeNotes) - .byState(REVIEWER)); + reviewerScores + .keySet() + .removeAll(approvalsUtil.getReviewers(dbProvider.get(), changeNotes).byState(REVIEWER)); } // Sort results Stream> sorted = - reviewerScores.entrySet().stream() + reviewerScores + .entrySet() + .stream() .sorted(Collections.reverseOrder(Map.Entry.comparingByValue())); - List sortedSuggestions = sorted - .map(Map.Entry::getKey) - .collect(Collectors.toList()); + List sortedSuggestions = sorted.map(Map.Entry::getKey).collect(Collectors.toList()); return sortedSuggestions; } - private Map baseRankingForEmptyQuery( - double baseWeight) throws OrmException{ + private Map baseRankingForEmptyQuery(double baseWeight) + throws OrmException { // Get the user's last 25 changes, check approvals try { - List result = internalChangeQuery - .setLimit(25) - .setRequestedFields(ImmutableSet.of(ChangeField.REVIEWER.getName())) - .query(changeQueryBuilder.owner("self")); + List result = + internalChangeQuery + .setLimit(25) + .setRequestedFields(ImmutableSet.of(ChangeField.REVIEWER.getName())) + .query(changeQueryBuilder.owner("self")); Map suggestions = new HashMap<>(); for (ChangeData cd : result) { for (PatchSetApproval approval : cd.currentApprovals()) { @@ -214,9 +224,8 @@ public class ReviewerRecommender { } private Map baseRankingForCandidateList( - List candidates, - ProjectControl projectControl, - double baseWeight) throws OrmException { + List candidates, ProjectControl projectControl, double baseWeight) + throws OrmException { // Get each reviewer's activity based on number of applied labels // (weighted 10d), number of comments (weighted 0.5d) and number of owned // changes (weighted 1d). @@ -232,21 +241,18 @@ public class ReviewerRecommender { // Get all labels for this project and create a compound OR query to // fetch all changes where users have applied one of these labels - List labelTypes = - projectControl.getLabelTypes().getLabelTypes(); - List> labelPredicates = - new ArrayList<>(labelTypes.size()); + List labelTypes = projectControl.getLabelTypes().getLabelTypes(); + List> labelPredicates = new ArrayList<>(labelTypes.size()); for (LabelType type : labelTypes) { - labelPredicates - .add(changeQueryBuilder.label(type.getName() + ",user=" + id)); + labelPredicates.add(changeQueryBuilder.label(type.getName() + ",user=" + id)); } Predicate reviewerQuery = Predicate.and(projectQuery, Predicate.or(labelPredicates)); - Predicate ownerQuery = Predicate.and(projectQuery, - changeQueryBuilder.owner(id.toString())); - Predicate commentedByQuery = Predicate.and(projectQuery, - changeQueryBuilder.commentby(id.toString())); + Predicate ownerQuery = + Predicate.and(projectQuery, changeQueryBuilder.owner(id.toString())); + Predicate commentedByQuery = + Predicate.and(projectQuery, changeQueryBuilder.commentby(id.toString())); predicates.add(reviewerQuery); predicates.add(ownerQuery); @@ -259,10 +265,8 @@ public class ReviewerRecommender { } } - List> result = internalChangeQuery - .setLimit(25) - .setRequestedFields(ImmutableSet.of()) - .query(predicates); + List> result = + internalChangeQuery.setLimit(25).setRequestedFields(ImmutableSet.of()).query(predicates); Iterator> queryResultIterator = result.iterator(); Iterator reviewersIterator = reviewers.keySet().iterator(); @@ -275,8 +279,7 @@ public class ReviewerRecommender { currentId = reviewersIterator.next(); } - reviewers.get(currentId).add(WEIGHTS[i % WEIGHTS.length] * - baseWeight * currentResult.size()); + reviewers.get(currentId).add(WEIGHTS[i % WEIGHTS.length] * baseWeight * currentResult.size()); i++; } return reviewers; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ReviewerSet.java b/gerrit-server/src/main/java/com/google/gerrit/server/ReviewerSet.java index 5e0f77b73b..67b1d9dc34 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/ReviewerSet.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/ReviewerSet.java @@ -25,33 +25,34 @@ import com.google.common.collect.Table; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.PatchSetApproval; import com.google.gerrit.server.notedb.ReviewerStateInternal; - import java.sql.Timestamp; /** * Set of reviewers on a change. - *

- * A given account may appear in multiple states and at different timestamps. No - * reviewers with state {@link ReviewerStateInternal#REMOVED} are ever exposed - * by this interface. + * + *

A given account may appear in multiple states and at different timestamps. No reviewers with + * state {@link ReviewerStateInternal#REMOVED} are ever exposed by this interface. */ public class ReviewerSet { - private static final ReviewerSet EMPTY = new ReviewerSet( - ImmutableTable.of()); + private static final ReviewerSet EMPTY = + new ReviewerSet(ImmutableTable.of()); - public static ReviewerSet fromApprovals( - Iterable approvals) { + public static ReviewerSet fromApprovals(Iterable approvals) { PatchSetApproval first = null; - Table reviewers = - HashBasedTable.create(); + Table reviewers = HashBasedTable.create(); for (PatchSetApproval psa : approvals) { if (first == null) { first = psa; } else { checkArgument( - first.getKey().getParentKey().getParentKey().equals( - psa.getKey().getParentKey().getParentKey()), - "multiple change IDs: %s, %s", first.getKey(), psa.getKey()); + first + .getKey() + .getParentKey() + .getParentKey() + .equals(psa.getKey().getParentKey().getParentKey()), + "multiple change IDs: %s, %s", + first.getKey(), + psa.getKey()); } Account.Id id = psa.getAccountId(); reviewers.put(REVIEWER, id, psa.getGranted()); @@ -62,8 +63,7 @@ public class ReviewerSet { return new ReviewerSet(reviewers); } - public static ReviewerSet fromTable( - Table table) { + public static ReviewerSet fromTable(Table table) { return new ReviewerSet(table); } @@ -71,8 +71,7 @@ public class ReviewerSet { return EMPTY; } - private final ImmutableTable - table; + private final ImmutableTable table; private ImmutableSet accounts; private ReviewerSet(Table table) { @@ -91,8 +90,7 @@ public class ReviewerSet { return table.row(state).keySet(); } - public ImmutableTable - asTable() { + public ImmutableTable asTable() { return table; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ReviewerStatusUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/ReviewerStatusUpdate.java index bbe4013381..c4f3e2a24e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/ReviewerStatusUpdate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/ReviewerStatusUpdate.java @@ -17,20 +17,21 @@ package com.google.gerrit.server; import com.google.auto.value.AutoValue; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.server.notedb.ReviewerStateInternal; - import java.sql.Timestamp; /** Change to a reviewer's status. */ @AutoValue public abstract class ReviewerStatusUpdate { public static ReviewerStatusUpdate create( - Timestamp ts, Account.Id updatedBy, Account.Id reviewer, - ReviewerStateInternal state) { + Timestamp ts, Account.Id updatedBy, Account.Id reviewer, ReviewerStateInternal state) { return new AutoValue_ReviewerStatusUpdate(ts, updatedBy, reviewer, state); } public abstract Timestamp date(); + public abstract Account.Id updatedBy(); + public abstract Account.Id reviewer(); + public abstract ReviewerStateInternal state(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ReviewersUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/ReviewersUtil.java index a848c6c38e..7b4777efc0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/ReviewersUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/ReviewersUtil.java @@ -49,7 +49,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; import java.util.ArrayList; import java.util.Collections; @@ -69,30 +68,30 @@ public class ReviewersUtil { @Inject Metrics(MetricMaker metricMaker) { - queryAccountsLatency = metricMaker.newTimer( - "reviewer_suggestion/query_accounts", - new Description( - "Latency for querying accounts for reviewer suggestion") - .setCumulative() - .setUnit(Units.MILLISECONDS)); - recommendAccountsLatency = metricMaker.newTimer( - "reviewer_suggestion/recommend_accounts", - new Description( - "Latency for recommending accounts for reviewer suggestion") - .setCumulative() - .setUnit(Units.MILLISECONDS)); - loadAccountsLatency = metricMaker.newTimer( - "reviewer_suggestion/load_accounts", - new Description( - "Latency for loading accounts for reviewer suggestion") - .setCumulative() - .setUnit(Units.MILLISECONDS)); - queryGroupsLatency = metricMaker.newTimer( - "reviewer_suggestion/query_groups", - new Description( - "Latency for querying groups for reviewer suggestion") - .setCumulative() - .setUnit(Units.MILLISECONDS)); + queryAccountsLatency = + metricMaker.newTimer( + "reviewer_suggestion/query_accounts", + new Description("Latency for querying accounts for reviewer suggestion") + .setCumulative() + .setUnit(Units.MILLISECONDS)); + recommendAccountsLatency = + metricMaker.newTimer( + "reviewer_suggestion/recommend_accounts", + new Description("Latency for recommending accounts for reviewer suggestion") + .setCumulative() + .setUnit(Units.MILLISECONDS)); + loadAccountsLatency = + metricMaker.newTimer( + "reviewer_suggestion/load_accounts", + new Description("Latency for loading accounts for reviewer suggestion") + .setCumulative() + .setUnit(Units.MILLISECONDS)); + queryGroupsLatency = + metricMaker.newTimer( + "reviewer_suggestion/query_groups", + new Description("Latency for querying groups for reviewer suggestion") + .setCumulative() + .setUnit(Units.MILLISECONDS)); } } @@ -110,7 +109,8 @@ public class ReviewersUtil { private final Metrics metrics; @Inject - ReviewersUtil(AccountLoader.Factory accountLoaderFactory, + ReviewersUtil( + AccountLoader.Factory accountLoaderFactory, AccountQueryBuilder accountQueryBuilder, AccountQueryProcessor accountQueryProcessor, GroupBackend groupBackend, @@ -134,9 +134,12 @@ public class ReviewersUtil { boolean isVisibleTo(Account.Id account) throws OrmException; } - public List suggestReviewers(ChangeNotes changeNotes, - SuggestReviewers suggestReviewers, ProjectControl projectControl, - VisibilityControl visibilityControl, boolean excludeGroups) + public List suggestReviewers( + ChangeNotes changeNotes, + SuggestReviewers suggestReviewers, + ProjectControl projectControl, + VisibilityControl visibilityControl, + boolean excludeGroups) throws IOException, OrmException { String query = suggestReviewers.getQuery(); int limit = suggestReviewers.getLimit(); @@ -150,17 +153,19 @@ public class ReviewersUtil { candidateList = suggestAccounts(suggestReviewers, visibilityControl); } - List sortedRecommendations = recommendAccounts(changeNotes, - suggestReviewers, projectControl, candidateList); - List suggestedReviewer = - loadAccounts(sortedRecommendations); + List sortedRecommendations = + recommendAccounts(changeNotes, suggestReviewers, projectControl, candidateList); + List suggestedReviewer = loadAccounts(sortedRecommendations); - if (!excludeGroups && suggestedReviewer.size() < limit - && !Strings.isNullOrEmpty(query)) { + if (!excludeGroups && suggestedReviewer.size() < limit && !Strings.isNullOrEmpty(query)) { // Add groups at the end as individual accounts are usually more // important. - suggestedReviewer.addAll(suggestAccountGroups(suggestReviewers, - projectControl, visibilityControl, limit - suggestedReviewer.size())); + suggestedReviewer.addAll( + suggestAccountGroups( + suggestReviewers, + projectControl, + visibilityControl, + limit - suggestedReviewer.size())); } if (suggestedReviewer.size() <= limit) { @@ -169,14 +174,15 @@ public class ReviewersUtil { return suggestedReviewer.subList(0, limit); } - private List suggestAccounts(SuggestReviewers suggestReviewers, - VisibilityControl visibilityControl) throws OrmException { + private List suggestAccounts( + SuggestReviewers suggestReviewers, VisibilityControl visibilityControl) throws OrmException { try (Timer0.Context ctx = metrics.queryAccountsLatency.start()) { try { Set matches = new HashSet<>(); - QueryResult result = accountQueryProcessor - .setLimit(suggestReviewers.getLimit() * CANDIDATE_LIST_MULTIPLIER) - .query(accountQueryBuilder.defaultQuery(suggestReviewers.getQuery())); + QueryResult result = + accountQueryProcessor + .setLimit(suggestReviewers.getLimit() * CANDIDATE_LIST_MULTIPLIER) + .query(accountQueryBuilder.defaultQuery(suggestReviewers.getQuery())); for (AccountState accountState : result.entities()) { Account.Id id = accountState.getAccount().getId(); if (visibilityControl.isVisibleTo(id)) { @@ -190,48 +196,56 @@ public class ReviewersUtil { } } - private List recommendAccounts(ChangeNotes changeNotes, - SuggestReviewers suggestReviewers, ProjectControl projectControl, - List candidateList) throws OrmException { + private List recommendAccounts( + ChangeNotes changeNotes, + SuggestReviewers suggestReviewers, + ProjectControl projectControl, + List candidateList) + throws OrmException { try (Timer0.Context ctx = metrics.recommendAccountsLatency.start()) { - return reviewerRecommender.suggestReviewers(changeNotes, suggestReviewers, - projectControl, candidateList); + return reviewerRecommender.suggestReviewers( + changeNotes, suggestReviewers, projectControl, candidateList); } } private List loadAccounts(List accountIds) throws OrmException { try (Timer0.Context ctx = metrics.loadAccountsLatency.start()) { - List reviewer = accountIds.stream() - .map(accountLoader::get) - .filter(Objects::nonNull) - .map(a -> { - SuggestedReviewerInfo info = new SuggestedReviewerInfo(); - info.account = a; - info.count = 1; - return info; - }).collect(toList()); + List reviewer = + accountIds + .stream() + .map(accountLoader::get) + .filter(Objects::nonNull) + .map( + a -> { + SuggestedReviewerInfo info = new SuggestedReviewerInfo(); + info.account = a; + info.count = 1; + return info; + }) + .collect(toList()); accountLoader.fill(); return reviewer; } } private List suggestAccountGroups( - SuggestReviewers suggestReviewers, ProjectControl projectControl, - VisibilityControl visibilityControl, int limit) - throws OrmException, IOException { + SuggestReviewers suggestReviewers, + ProjectControl projectControl, + VisibilityControl visibilityControl, + int limit) + throws OrmException, IOException { try (Timer0.Context ctx = metrics.queryGroupsLatency.start()) { List groups = new ArrayList<>(); - for (GroupReference g : suggestAccountGroups(suggestReviewers, - projectControl)) { - GroupAsReviewer result = suggestGroupAsReviewer(suggestReviewers, - projectControl.getProject(), g, visibilityControl); + for (GroupReference g : suggestAccountGroups(suggestReviewers, projectControl)) { + GroupAsReviewer result = + suggestGroupAsReviewer( + suggestReviewers, projectControl.getProject(), g, visibilityControl); if (result.allowed || result.allowedWithConfirmation) { GroupBaseInfo info = new GroupBaseInfo(); info.id = Url.encode(g.getUUID().get()); info.name = g.getName(); - SuggestedReviewerInfo suggestedReviewerInfo = - new SuggestedReviewerInfo(); + SuggestedReviewerInfo suggestedReviewerInfo = new SuggestedReviewerInfo(); suggestedReviewerInfo.group = info; suggestedReviewerInfo.count = result.size; if (result.allowedWithConfirmation) { @@ -250,8 +264,8 @@ public class ReviewersUtil { private List suggestAccountGroups( SuggestReviewers suggestReviewers, ProjectControl ctl) { return Lists.newArrayList( - Iterables.limit(groupBackend.suggest(suggestReviewers.getQuery(), ctl), - suggestReviewers.getLimit())); + Iterables.limit( + groupBackend.suggest(suggestReviewers.getQuery(), ctl), suggestReviewers.getLimit())); } private static class GroupAsReviewer { @@ -262,21 +276,23 @@ public class ReviewersUtil { private GroupAsReviewer suggestGroupAsReviewer( SuggestReviewers suggestReviewers, - Project project, GroupReference group, - VisibilityControl visibilityControl) throws OrmException, IOException { + Project project, + GroupReference group, + VisibilityControl visibilityControl) + throws OrmException, IOException { GroupAsReviewer result = new GroupAsReviewer(); int maxAllowed = suggestReviewers.getMaxAllowed(); - int maxAllowedWithoutConfirmation = - suggestReviewers.getMaxAllowedWithoutConfirmation(); + int maxAllowedWithoutConfirmation = suggestReviewers.getMaxAllowedWithoutConfirmation(); if (!PostReviewers.isLegalReviewerGroup(group.getUUID())) { return result; } try { - Set members = groupMembersFactory - .create(currentUser.get()) - .listAccounts(group.getUUID(), project.getNameKey()); + Set members = + groupMembersFactory + .create(currentUser.get()) + .listAccounts(group.getUUID(), project.getNameKey()); if (members.isEmpty()) { return result; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/Sequences.java b/gerrit-server/src/main/java/com/google/gerrit/server/Sequences.java index 9448ceb300..6b3a58f6c3 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/Sequences.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/Sequences.java @@ -28,11 +28,9 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.Config; - import java.util.ArrayList; import java.util.List; +import org.eclipse.jgit.lib.Config; @SuppressWarnings("deprecation") @Singleton @@ -42,7 +40,8 @@ public class Sequences { private final RepoSequence changeSeq; @Inject - Sequences(@GerritServerConfig Config cfg, + Sequences( + @GerritServerConfig Config cfg, final Provider db, NotesMigration migration, GitRepositoryManager repoManager, @@ -51,17 +50,18 @@ public class Sequences { this.migration = migration; final int gap = cfg.getInt("noteDb", "changes", "initialSequenceGap", 0); - changeSeq = new RepoSequence( - repoManager, - allProjects, - "changes", - new RepoSequence.Seed() { - @Override - public int get() throws OrmException { - return db.get().nextChangeId() + gap; - } - }, - cfg.getInt("noteDb", "changes", "sequenceBatchSize", 20)); + changeSeq = + new RepoSequence( + repoManager, + allProjects, + "changes", + new RepoSequence.Seed() { + @Override + public int get() throws OrmException { + return db.get().nextChangeId() + gap; + } + }, + cfg.getInt("noteDb", "changes", "sequenceBatchSize", 20)); } public int nextChangeId() throws OrmException { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/StarredChangesUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/StarredChangesUtil.java index 5d9fbd67f5..8c4666330a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/StarredChangesUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/StarredChangesUtil.java @@ -45,7 +45,13 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; import org.eclipse.jgit.lib.BatchRefUpdate; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.NullProgressMonitor; @@ -63,14 +69,6 @@ import org.eclipse.jgit.transport.ReceiveCommand; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.SortedSet; -import java.util.TreeSet; - @Singleton public class StarredChangesUtil { @AutoValue @@ -96,6 +94,7 @@ public class StarredChangesUtil { } public abstract Account.Id accountId(); + public abstract String label(); @Override @@ -111,11 +110,12 @@ public class StarredChangesUtil { private static StarRef create(Ref ref, Iterable labels) { return new AutoValue_StarredChangesUtil_StarRef( - checkNotNull(ref), - ImmutableSortedSet.copyOf(labels)); + checkNotNull(ref), ImmutableSortedSet.copyOf(labels)); } - @Nullable public abstract Ref ref(); + @Nullable + public abstract Ref ref(); + public abstract ImmutableSortedSet labels(); public ObjectId objectId() { @@ -128,15 +128,14 @@ public class StarredChangesUtil { static IllegalLabelException invalidLabels(Set invalidLabels) { return new IllegalLabelException( - String.format("invalid labels: %s", - Joiner.on(", ").join(invalidLabels))); + String.format("invalid labels: %s", Joiner.on(", ").join(invalidLabels))); } - static IllegalLabelException mutuallyExclusiveLabels(String label1, - String label2) { + static IllegalLabelException mutuallyExclusiveLabels(String label1, String label2) { return new IllegalLabelException( - String.format("The labels %s and %s are mutually exclusive." - + " Only one of them can be set.", label1, label2)); + String.format( + "The labels %s and %s are mutually exclusive." + " Only one of them can be set.", + label1, label2)); } IllegalLabelException(String message) { @@ -144,8 +143,7 @@ public class StarredChangesUtil { } } - private static final Logger log = - LoggerFactory.getLogger(StarredChangesUtil.class); + private static final Logger log = LoggerFactory.getLogger(StarredChangesUtil.class); public static final String DEFAULT_LABEL = "star"; public static final String IGNORE_LABEL = "ignore"; @@ -160,7 +158,8 @@ public class StarredChangesUtil { private final Provider queryProvider; @Inject - StarredChangesUtil(GitRepositoryManager repoManager, + StarredChangesUtil( + GitRepositoryManager repoManager, AllUsersName allUsers, Provider dbProvider, @GerritPersonIdent PersonIdent serverIdent, @@ -174,21 +173,26 @@ public class StarredChangesUtil { this.queryProvider = queryProvider; } - public ImmutableSortedSet getLabels(Account.Id accountId, - Change.Id changeId) throws OrmException { + public ImmutableSortedSet getLabels(Account.Id accountId, Change.Id changeId) + throws OrmException { try (Repository repo = repoManager.openRepository(allUsers)) { - return readLabels(repo, RefNames.refsStarredChanges(changeId, accountId)) - .labels(); + return readLabels(repo, RefNames.refsStarredChanges(changeId, accountId)).labels(); } catch (IOException e) { throw new OrmException( - String.format("Reading stars from change %d for account %d failed", - changeId.get(), accountId.get()), e); + String.format( + "Reading stars from change %d for account %d failed", + changeId.get(), accountId.get()), + e); } } - public ImmutableSortedSet star(Account.Id accountId, - Project.NameKey project, Change.Id changeId, Set labelsToAdd, - Set labelsToRemove) throws OrmException { + public ImmutableSortedSet star( + Account.Id accountId, + Project.NameKey project, + Change.Id changeId, + Set labelsToAdd, + Set labelsToRemove) + throws OrmException { try (Repository repo = repoManager.openRepository(allUsers)) { String refName = RefNames.refsStarredChanges(changeId, accountId); StarRef old = readLabels(repo, refName); @@ -212,13 +216,12 @@ public class StarredChangesUtil { return ImmutableSortedSet.copyOf(labels); } catch (IOException e) { throw new OrmException( - String.format("Star change %d for account %d failed", - changeId.get(), accountId.get()), e); + String.format("Star change %d for account %d failed", changeId.get(), accountId.get()), + e); } } - public void unstarAll(Project.NameKey project, Change.Id changeId) - throws OrmException { + public void unstarAll(Project.NameKey project, Change.Id changeId) throws OrmException { try (Repository repo = repoManager.openRepository(allUsers); RevWalk rw = new RevWalk(repo)) { BatchRefUpdate batchUpdate = repo.getRefDatabase().newBatchUpdate(); @@ -228,48 +231,43 @@ public class StarredChangesUtil { for (Account.Id accountId : byChangeFromIndex(changeId).keySet()) { String refName = RefNames.refsStarredChanges(changeId, accountId); Ref ref = repo.getRefDatabase().getRef(refName); - batchUpdate.addCommand(new ReceiveCommand(ref.getObjectId(), - ObjectId.zeroId(), refName)); + batchUpdate.addCommand(new ReceiveCommand(ref.getObjectId(), ObjectId.zeroId(), refName)); } batchUpdate.execute(rw, NullProgressMonitor.INSTANCE); for (ReceiveCommand command : batchUpdate.getCommands()) { if (command.getResult() != ReceiveCommand.Result.OK) { - throw new IOException(String.format( - "Unstar change %d failed, ref %s could not be deleted: %s", - changeId.get(), command.getRefName(), command.getResult())); + throw new IOException( + String.format( + "Unstar change %d failed, ref %s could not be deleted: %s", + changeId.get(), command.getRefName(), command.getResult())); } } indexer.index(dbProvider.get(), project, changeId); } catch (IOException e) { - throw new OrmException( - String.format("Unstar change %d failed", changeId.get()), e); + throw new OrmException(String.format("Unstar change %d failed", changeId.get()), e); } } - public ImmutableMap byChange(Change.Id changeId) - throws OrmException { + public ImmutableMap byChange(Change.Id changeId) throws OrmException { try (Repository repo = repoManager.openRepository(allUsers)) { - ImmutableMap.Builder builder = - ImmutableMap.builder(); - for (String refPart : getRefNames(repo, - RefNames.refsStarredChangesPrefix(changeId))) { + ImmutableMap.Builder builder = ImmutableMap.builder(); + for (String refPart : getRefNames(repo, RefNames.refsStarredChangesPrefix(changeId))) { Integer id = Ints.tryParse(refPart); if (id == null) { continue; } Account.Id accountId = new Account.Id(id); - builder.put(accountId, - readLabels(repo, RefNames.refsStarredChanges(changeId, accountId))); + builder.put(accountId, readLabels(repo, RefNames.refsStarredChanges(changeId, accountId))); } return builder.build(); } catch (IOException e) { - throw new OrmException(String.format( - "Get accounts that starred change %d failed", changeId.get()), e); + throw new OrmException( + String.format("Get accounts that starred change %d failed", changeId.get()), e); } } - public Set byChange(final Change.Id changeId, - final String label) throws OrmException { + public Set byChange(final Change.Id changeId, final String label) + throws OrmException { try (Repository repo = repoManager.openRepository(allUsers)) { return getRefNames(repo, RefNames.refsStarredChangesPrefix(changeId)) .stream() @@ -278,57 +276,53 @@ public class StarredChangesUtil { .collect(toSet()); } catch (IOException e) { throw new OrmException( - String.format("Get accounts that starred change %d failed", - changeId.get()), e); + String.format("Get accounts that starred change %d failed", changeId.get()), e); } } @Deprecated // To be used only for IsStarredByLegacyPredicate. - public Set byAccount(final Account.Id accountId, - final String label) throws OrmException { + public Set byAccount(final Account.Id accountId, final String label) + throws OrmException { try (Repository repo = repoManager.openRepository(allUsers)) { - return getRefNames(repo, RefNames.REFS_STARRED_CHANGES).stream() + return getRefNames(repo, RefNames.REFS_STARRED_CHANGES) + .stream() .filter(refPart -> refPart.endsWith("/" + accountId.get())) .map(Change.Id::fromRefPart) .filter(changeId -> hasStar(repo, changeId, accountId, label)) .collect(toSet()); } catch (IOException e) { throw new OrmException( - String.format("Get changes that were starred by %d failed", - accountId.get()), e); + String.format("Get changes that were starred by %d failed", accountId.get()), e); } } - private boolean hasStar(Repository repo, Change.Id changeId, - Account.Id accountId, String label) { + private boolean hasStar(Repository repo, Change.Id changeId, Account.Id accountId, String label) { try { - return readLabels(repo, - RefNames.refsStarredChanges(changeId, accountId)).labels() - .contains(label); + return readLabels(repo, RefNames.refsStarredChanges(changeId, accountId)) + .labels() + .contains(label); } catch (IOException e) { - log.error(String.format( - "Cannot query stars by account %d on change %d", - accountId.get(), changeId.get()), e); + log.error( + String.format( + "Cannot query stars by account %d on change %d", accountId.get(), changeId.get()), + e); return false; } } - public ImmutableListMultimap byChangeFromIndex( - Change.Id changeId) throws OrmException { - Set fields = ImmutableSet.of( - ChangeField.ID.getName(), - ChangeField.STAR.getName()); - List changeData = queryProvider.get().setRequestedFields(fields) - .byLegacyChangeId(changeId); + public ImmutableListMultimap byChangeFromIndex(Change.Id changeId) + throws OrmException { + Set fields = ImmutableSet.of(ChangeField.ID.getName(), ChangeField.STAR.getName()); + List changeData = + queryProvider.get().setRequestedFields(fields).byLegacyChangeId(changeId); if (changeData.size() != 1) { throw new NoSuchChangeException(changeId); } return changeData.get(0).stars(); } - private static Set getRefNames(Repository repo, String prefix) - throws IOException { + private static Set getRefNames(Repository repo, String prefix) throws IOException { RefDatabase refDb = repo.getRefDatabase(); return refDb.getRefs(prefix).keySet(); } @@ -338,15 +332,16 @@ public class StarredChangesUtil { Ref ref = repo.exactRef(RefNames.refsStarredChanges(changeId, accountId)); return ref != null ? ref.getObjectId() : ObjectId.zeroId(); } catch (IOException e) { - log.error(String.format( - "Getting star object ID for account %d on change %d failed", - accountId.get(), changeId.get()), e); + log.error( + String.format( + "Getting star object ID for account %d on change %d failed", + accountId.get(), changeId.get()), + e); return ObjectId.zeroId(); } } - private static StarRef readLabels(Repository repo, String refName) - throws IOException { + private static StarRef readLabels(Repository repo, String refName) throws IOException { Ref ref = repo.exactRef(refName); if (ref == null) { return StarRef.MISSING; @@ -356,7 +351,8 @@ public class StarredChangesUtil { ObjectLoader obj = reader.open(ref.getObjectId(), Constants.OBJ_BLOB); return StarRef.create( ref, - Splitter.on(CharMatcher.whitespace()).omitEmptyStrings() + Splitter.on(CharMatcher.whitespace()) + .omitEmptyStrings() .split(new String(obj.getCachedBytes(Integer.MAX_VALUE), UTF_8))); } } @@ -365,13 +361,10 @@ public class StarredChangesUtil { throws IOException { validateLabels(labels); try (ObjectInserter oi = repo.newObjectInserter()) { - ObjectId id = oi.insert( - Constants.OBJ_BLOB, - labels.stream() - .sorted() - .distinct() - .collect(joining("\n")) - .getBytes(UTF_8)); + ObjectId id = + oi.insert( + Constants.OBJ_BLOB, + labels.stream().sorted().distinct().collect(joining("\n")).getBytes(UTF_8)); oi.flush(); return id; } @@ -379,8 +372,7 @@ public class StarredChangesUtil { private static void checkMutuallyExclusiveLabels(Set labels) { if (labels.containsAll(ImmutableSet.of(DEFAULT_LABEL, IGNORE_LABEL))) { - throw IllegalLabelException.mutuallyExclusiveLabels(DEFAULT_LABEL, - IGNORE_LABEL); + throw IllegalLabelException.mutuallyExclusiveLabels(DEFAULT_LABEL, IGNORE_LABEL); } } @@ -400,9 +392,9 @@ public class StarredChangesUtil { } } - private void updateLabels(Repository repo, String refName, - ObjectId oldObjectId, Collection labels) - throws IOException, OrmException { + private void updateLabels( + Repository repo, String refName, ObjectId oldObjectId, Collection labels) + throws IOException, OrmException { try (RevWalk rw = new RevWalk(repo)) { RefUpdate u = repo.updateRef(refName); u.setExpectedOldObjectId(oldObjectId); @@ -424,8 +416,7 @@ public class StarredChangesUtil { case REJECTED_CURRENT_BRANCH: case RENAMED: throw new OrmException( - String.format("Update star labels on ref %s failed: %s", refName, - result.name())); + String.format("Update star labels on ref %s failed: %s", refName, result.name())); } } } @@ -450,8 +441,8 @@ public class StarredChangesUtil { case REJECTED: case REJECTED_CURRENT_BRANCH: case RENAMED: - throw new OrmException(String.format("Delete star ref %s failed: %s", - refName, result.name())); + throw new OrmException( + String.format("Delete star ref %s failed: %s", refName, result.name())); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/StartupCheck.java b/gerrit-server/src/main/java/com/google/gerrit/server/StartupCheck.java index 2a7e4c935b..196ca5bda0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/StartupCheck.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/StartupCheck.java @@ -16,16 +16,12 @@ package com.google.gerrit.server; import com.google.gerrit.extensions.events.LifecycleListener; -/** - * Check executed on Gerrit startup. - */ +/** Check executed on Gerrit startup. */ public interface StartupCheck { /** - * Performs Gerrit startup check, can abort startup by throwing - * {@link StartupException}. - *

- * Called on Gerrit startup after all {@link LifecycleListener} have been - * invoked. + * Performs Gerrit startup check, can abort startup by throwing {@link StartupException}. + * + *

Called on Gerrit startup after all {@link LifecycleListener} have been invoked. * * @throws StartupException thrown if Gerrit startup should be aborted */ diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/StartupChecks.java b/gerrit-server/src/main/java/com/google/gerrit/server/StartupChecks.java index 0a208fef25..9df2604122 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/StartupChecks.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/StartupChecks.java @@ -29,10 +29,8 @@ public class StartupChecks implements LifecycleListener { protected void configure() { DynamicSet.setOf(binder(), StartupCheck.class); listener().to(StartupChecks.class); - DynamicSet.bind(binder(), StartupCheck.class) - .to(UniversalGroupBackend.ConfigCheck.class); - DynamicSet.bind(binder(), StartupCheck.class) - .to(SystemGroupBackend.NameCheck.class); + DynamicSet.bind(binder(), StartupCheck.class).to(UniversalGroupBackend.ConfigCheck.class); + DynamicSet.bind(binder(), StartupCheck.class).to(SystemGroupBackend.NameCheck.class); } } @@ -51,6 +49,5 @@ public class StartupChecks implements LifecycleListener { } @Override - public void stop() { - } + public void stop() {} } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/StringUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/StringUtil.java index 0aef9e9970..83b6ec6de1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/StringUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/StringUtil.java @@ -16,22 +16,21 @@ package com.google.gerrit.server; public class StringUtil { /** - * An array of the string representations that should be used in place - * of the non-printable characters in the beginning of the ASCII table - * when escaping a string. The index of each element in the array - * corresponds to its ASCII value, i.e. the string representation of - * ASCII 0 is found in the first element of this array. + * An array of the string representations that should be used in place of the non-printable + * characters in the beginning of the ASCII table when escaping a string. The index of each + * element in the array corresponds to its ASCII value, i.e. the string representation of ASCII 0 + * is found in the first element of this array. */ - private static final String[] NON_PRINTABLE_CHARS = - { "\\x00", "\\x01", "\\x02", "\\x03", "\\x04", "\\x05", "\\x06", "\\a", - "\\b", "\\t", "\\n", "\\v", "\\f", "\\r", "\\x0e", "\\x0f", - "\\x10", "\\x11", "\\x12", "\\x13", "\\x14", "\\x15", "\\x16", "\\x17", - "\\x18", "\\x19", "\\x1a", "\\x1b", "\\x1c", "\\x1d", "\\x1e", "\\x1f", }; + private static final String[] NON_PRINTABLE_CHARS = { + "\\x00", "\\x01", "\\x02", "\\x03", "\\x04", "\\x05", "\\x06", "\\a", + "\\b", "\\t", "\\n", "\\v", "\\f", "\\r", "\\x0e", "\\x0f", + "\\x10", "\\x11", "\\x12", "\\x13", "\\x14", "\\x15", "\\x16", "\\x17", + "\\x18", "\\x19", "\\x1a", "\\x1b", "\\x1c", "\\x1d", "\\x1e", "\\x1f", + }; /** - * Escapes the input string so that all non-printable characters - * (0x00-0x1f) are represented as a hex escape (\x00, \x01, ...) - * or as a C-style escape sequence (\a, \b, \t, \n, \v, \f, or \r). + * Escapes the input string so that all non-printable characters (0x00-0x1f) are represented as a + * hex escape (\x00, \x01, ...) or as a C-style escape sequence (\a, \b, \t, \n, \v, \f, or \r). * Backslashes in the input string are doubled (\\). */ public static String escapeString(final String str) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/UrlEncoded.java b/gerrit-server/src/main/java/com/google/gerrit/server/UrlEncoded.java index 3ac6c987af..adad11cb67 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/UrlEncoded.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/UrlEncoded.java @@ -12,11 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. - package com.google.gerrit.server; import com.google.gerrit.extensions.restapi.Url; - import java.util.LinkedHashMap; import java.util.Map; @@ -25,8 +23,7 @@ public class UrlEncoded extends LinkedHashMap { private String url; - public UrlEncoded() { - } + public UrlEncoded() {} public UrlEncoded(final String url) { this.url = url; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/WebLinks.java b/gerrit-server/src/main/java/com/google/gerrit/server/WebLinks.java index 789d9a74ca..533ed9d2e7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/WebLinks.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/WebLinks.java @@ -33,12 +33,10 @@ import com.google.gerrit.extensions.webui.WebLink; import com.google.gerrit.reviewdb.client.Project; import com.google.inject.Inject; import com.google.inject.Singleton; - +import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.List; - @Singleton public class WebLinks { private static final Logger log = LoggerFactory.getLogger(WebLinks.class); @@ -47,10 +45,8 @@ public class WebLinks { link -> { if (link == null) { return false; - } else if (Strings.isNullOrEmpty(link.name) - || Strings.isNullOrEmpty(link.url)) { - log.warn(String.format("%s is missing name and/or url", - link.getClass().getName())); + } else if (Strings.isNullOrEmpty(link.name) || Strings.isNullOrEmpty(link.url)) { + log.warn(String.format("%s is missing name and/or url", link.getClass().getName())); return false; } return true; @@ -60,10 +56,8 @@ public class WebLinks { link -> { if (link == null) { return false; - } else if (Strings.isNullOrEmpty(link.name) - || Strings.isNullOrEmpty(link.url)) { - log.warn(String.format("%s is missing name and/or url", link - .getClass().getName())); + } else if (Strings.isNullOrEmpty(link.name) || Strings.isNullOrEmpty(link.url)) { + log.warn(String.format("%s is missing name and/or url", link.getClass().getName())); return false; } return true; @@ -78,7 +72,8 @@ public class WebLinks { private final DynamicSet branchLinks; @Inject - public WebLinks(DynamicSet patchSetLinks, + public WebLinks( + DynamicSet patchSetLinks, DynamicSet parentLinks, DynamicSet fileLinks, DynamicSet fileLogLinks, @@ -95,60 +90,44 @@ public class WebLinks { } /** - * * @param project Project name. * @param commit SHA1 of commit. * @return Links for patch sets. */ - public List getPatchSetLinks(Project.NameKey project, - String commit) { - return filterLinks( - patchSetLinks, - webLink -> webLink.getPatchSetWebLink(project.get(), commit)); + public List getPatchSetLinks(Project.NameKey project, String commit) { + return filterLinks(patchSetLinks, webLink -> webLink.getPatchSetWebLink(project.get(), commit)); } /** - * * @param project Project name. * @param revision SHA1 of the parent revision. * @return Links for patch sets. */ - public List getParentLinks(Project.NameKey project, - String revision) { - return filterLinks( - parentLinks, - webLink -> webLink.getParentWebLink(project.get(), revision)); + public List getParentLinks(Project.NameKey project, String revision) { + return filterLinks(parentLinks, webLink -> webLink.getParentWebLink(project.get(), revision)); } /** - * * @param project Project name. * @param revision SHA1 of revision. * @param file File name. * @return Links for files. */ - public List getFileLinks(String project, - String revision, String file) { - return filterLinks( - fileLinks, - webLink -> webLink.getFileWebLink(project, revision, file)); + public List getFileLinks(String project, String revision, String file) { + return filterLinks(fileLinks, webLink -> webLink.getFileWebLink(project, revision, file)); } /** - * * @param project Project name. * @param revision SHA1 of revision. * @param file File name. * @return Links for file history */ - public List getFileHistoryLinks( - String project, String revision, String file) { - return FluentIterable - .from(fileHistoryLinks) + public List getFileHistoryLinks(String project, String revision, String file) { + return FluentIterable.from(fileHistoryLinks) .transform( webLink -> { - WebLinkInfo info = - webLink.getFileHistoryWebLink(project, revision, file); + WebLinkInfo info = webLink.getFileHistoryWebLink(project, revision, file); if (info == null) { return null; } @@ -164,10 +143,8 @@ public class WebLinks { } /** - * * @param project Project name. - * @param patchSetIdA Patch set ID of side A, null if no base - * patch set was selected. + * @param patchSetIdA Patch set ID of side A, null if no base patch set was selected. * @param revisionA SHA1 of revision of side A. * @param fileA File name of side A. * @param patchSetIdB Patch set ID of side B. @@ -175,48 +152,50 @@ public class WebLinks { * @param fileB File name of side B. * @return Links for file diffs. */ - public List getDiffLinks(final String project, final int changeId, - final Integer patchSetIdA, final String revisionA, final String fileA, - final int patchSetIdB, final String revisionB, final String fileB) { - return FluentIterable - .from(diffLinks) - .transform(webLink -> - webLink.getDiffLink(project, changeId, - patchSetIdA, revisionA, fileA, - patchSetIdB, revisionB, fileB)) - .filter(INVALID_WEBLINK) - .toList(); - } + public List getDiffLinks( + final String project, + final int changeId, + final Integer patchSetIdA, + final String revisionA, + final String fileA, + final int patchSetIdB, + final String revisionB, + final String fileB) { + return FluentIterable.from(diffLinks) + .transform( + webLink -> + webLink.getDiffLink( + project, + changeId, + patchSetIdA, + revisionA, + fileA, + patchSetIdB, + revisionB, + fileB)) + .filter(INVALID_WEBLINK) + .toList(); + } /** - * * @param project Project name. * @return Links for projects. */ public List getProjectLinks(final String project) { - return filterLinks( - projectLinks, - webLink -> webLink.getProjectWeblink(project)); + return filterLinks(projectLinks, webLink -> webLink.getProjectWeblink(project)); } /** - * * @param project Project name * @param branch Branch name * @return Links for branches. */ public List getBranchLinks(final String project, final String branch) { - return filterLinks( - branchLinks, - webLink -> webLink.getBranchWebLink(project, branch)); + return filterLinks(branchLinks, webLink -> webLink.getBranchWebLink(project, branch)); } - private List filterLinks(DynamicSet links, - Function transformer) { - return FluentIterable - .from(links) - .transform(transformer) - .filter(INVALID_WEBLINK) - .toList(); + private List filterLinks( + DynamicSet links, Function transformer) { + return FluentIterable.from(links).transform(transformer).filter(INVALID_WEBLINK).toList(); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/access/AccessCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/access/AccessCollection.java index aa04b33235..2e90889ba1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/access/AccessCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/access/AccessCollection.java @@ -25,14 +25,12 @@ import com.google.inject.Provider; import com.google.inject.Singleton; @Singleton -public class AccessCollection implements - RestCollection { +public class AccessCollection implements RestCollection { private final Provider list; private final DynamicMap> views; @Inject - AccessCollection(Provider list, - DynamicMap> views) { + AccessCollection(Provider list, DynamicMap> views) { this.list = list; this.views = views; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/access/ListAccess.java b/gerrit-server/src/main/java/com/google/gerrit/server/access/ListAccess.java index aeff017824..024c6107c9 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/access/ListAccess.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/access/ListAccess.java @@ -22,19 +22,21 @@ import com.google.gerrit.extensions.restapi.TopLevelResource; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.project.GetAccess; import com.google.inject.Inject; - -import org.kohsuke.args4j.Option; - import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.TreeMap; +import org.kohsuke.args4j.Option; public class ListAccess implements RestReadView { - @Option(name = "--project", aliases = {"-p"}, metaVar = "PROJECT", - usage = "projects for which the access rights should be returned") + @Option( + name = "--project", + aliases = {"-p"}, + metaVar = "PROJECT", + usage = "projects for which the access rights should be returned" + ) private List projects = new ArrayList<>(); private final GetAccess getAccess; @@ -54,5 +56,4 @@ public class ListAccess implements RestReadView { } return access; } - } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AbstractRealm.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AbstractRealm.java index 8b4453f4fb..3ba457c10e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AbstractRealm.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AbstractRealm.java @@ -21,12 +21,11 @@ import com.google.gerrit.reviewdb.client.AccountExternalId; import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.mail.send.EmailSender; import com.google.inject.Inject; - import java.util.Collection; import java.util.HashSet; import java.util.Set; -/** Basic implementation of {@link Realm}. */ +/** Basic implementation of {@link Realm}. */ public abstract class AbstractRealm implements Realm { private EmailSender emailSender; @@ -37,7 +36,7 @@ public abstract class AbstractRealm implements Realm { @Override public Set getEditableFields() { - Set fields = new HashSet<>(); + Set fields = new HashSet<>(); for (AccountFieldName n : AccountFieldName.values()) { if (allowsEdit(n)) { if (n == AccountFieldName.REGISTER_NEW_EMAIL) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountByEmailCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountByEmailCache.java index 9001ea524f..e73d82b110 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountByEmailCache.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountByEmailCache.java @@ -15,7 +15,6 @@ package com.google.gerrit.server.account; import com.google.gerrit.reviewdb.client.Account; - import java.util.Set; /** Translates an email address to a set of matching accounts. */ diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountByEmailCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountByEmailCacheImpl.java index 2ddea85de7..56c41e0c60 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountByEmailCacheImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountByEmailCacheImpl.java @@ -29,30 +29,24 @@ import com.google.inject.Provider; import com.google.inject.Singleton; import com.google.inject.TypeLiteral; import com.google.inject.name.Named; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.Collections; import java.util.HashSet; import java.util.Set; import java.util.concurrent.ExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** Translates an email address to a set of matching accounts. */ @Singleton public class AccountByEmailCacheImpl implements AccountByEmailCache { - private static final Logger log = LoggerFactory - .getLogger(AccountByEmailCacheImpl.class); + private static final Logger log = LoggerFactory.getLogger(AccountByEmailCacheImpl.class); private static final String CACHE_NAME = "accounts_byemail"; public static Module module() { return new CacheModule() { @Override protected void configure() { - cache(CACHE_NAME, - String.class, - new TypeLiteral>() {}) - .loader(Loader.class); + cache(CACHE_NAME, String.class, new TypeLiteral>() {}).loader(Loader.class); bind(AccountByEmailCacheImpl.class); bind(AccountByEmailCache.class).to(AccountByEmailCacheImpl.class); } @@ -62,8 +56,7 @@ public class AccountByEmailCacheImpl implements AccountByEmailCache { private final LoadingCache> cache; @Inject - AccountByEmailCacheImpl( - @Named(CACHE_NAME) LoadingCache> cache) { + AccountByEmailCacheImpl(@Named(CACHE_NAME) LoadingCache> cache) { this.cache = cache; } @@ -89,8 +82,7 @@ public class AccountByEmailCacheImpl implements AccountByEmailCache { private final Provider accountQueryProvider; @Inject - Loader(SchemaFactory schema, - Provider accountQueryProvider) { + Loader(SchemaFactory schema, Provider accountQueryProvider) { this.schema = schema; this.accountQueryProvider = accountQueryProvider; } @@ -102,10 +94,11 @@ public class AccountByEmailCacheImpl implements AccountByEmailCache { for (Account a : db.accounts().byPreferredEmail(email)) { r.add(a.getId()); } - for (AccountState accountState : accountQueryProvider.get() - .byExternalId( - (new AccountExternalId.Key(AccountExternalId.SCHEME_MAILTO, - email)).get())) { + for (AccountState accountState : + accountQueryProvider + .get() + .byExternalId( + (new AccountExternalId.Key(AccountExternalId.SCHEME_MAILTO, email)).get())) { r.add(accountState.getAccount().getId()); } return ImmutableSet.copyOf(r); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountCache.java index 3a4566aa8c..c28021c5fc 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountCache.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountCache.java @@ -15,7 +15,6 @@ package com.google.gerrit.server.account; import com.google.gerrit.reviewdb.client.Account; - import java.io.IOException; /** Caches important (but small) account state to avoid database hits. */ diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountCacheImpl.java index 0ba84f360b..535dfcb1f0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountCacheImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountCacheImpl.java @@ -37,11 +37,6 @@ import com.google.inject.Provider; import com.google.inject.Singleton; import com.google.inject.TypeLiteral; import com.google.inject.name.Named; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.util.Collection; import java.util.Collections; @@ -50,12 +45,14 @@ import java.util.HashSet; import java.util.Optional; import java.util.Set; import java.util.concurrent.ExecutionException; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** Caches important (but small) account state to avoid database hits. */ @Singleton public class AccountCacheImpl implements AccountCache { - private static final Logger log = LoggerFactory - .getLogger(AccountCacheImpl.class); + private static final Logger log = LoggerFactory.getLogger(AccountCacheImpl.class); private static final String BYID_NAME = "accounts"; private static final String BYUSER_NAME = "accounts_byname"; @@ -64,13 +61,10 @@ public class AccountCacheImpl implements AccountCache { return new CacheModule() { @Override protected void configure() { - cache(BYID_NAME, Account.Id.class, AccountState.class) - .loader(ByIdLoader.class); + cache(BYID_NAME, Account.Id.class, AccountState.class).loader(ByIdLoader.class); - cache(BYUSER_NAME, - String.class, - new TypeLiteral>() {}) - .loader(ByNameLoader.class); + cache(BYUSER_NAME, String.class, new TypeLiteral>() {}) + .loader(ByNameLoader.class); bind(AccountCacheImpl.class); bind(AccountCache.class).to(AccountCacheImpl.class); @@ -83,7 +77,8 @@ public class AccountCacheImpl implements AccountCache { private final Provider indexer; @Inject - AccountCacheImpl(@Named(BYID_NAME) LoadingCache byId, + AccountCacheImpl( + @Named(BYID_NAME) LoadingCache byId, @Named(BYUSER_NAME) LoadingCache> byUsername, Provider indexer) { this.byId = byId; @@ -145,8 +140,7 @@ public class AccountCacheImpl implements AccountCache { account.setActive(false); Collection ids = Collections.emptySet(); Set anon = ImmutableSet.of(); - return new AccountState(account, anon, ids, - new HashMap>()); + return new AccountState(account, anon, ids, new HashMap>()); } static class ByIdLoader extends CacheLoader { @@ -157,11 +151,11 @@ public class AccountCacheImpl implements AccountCache { private final Provider watchConfig; @Inject - ByIdLoader(SchemaFactory sf, + ByIdLoader( + SchemaFactory sf, GroupCache groupCache, GeneralPreferencesLoader loader, - @Named(BYUSER_NAME) LoadingCache> byUsername, + @Named(BYUSER_NAME) LoadingCache> byUsername, Provider watchConfig) { this.schema = sf; this.groupCache = groupCache; @@ -191,8 +185,7 @@ public class AccountCacheImpl implements AccountCache { } Collection externalIds = - Collections.unmodifiableCollection( - db.accountExternalIds().byAccount(who).toList()); + Collections.unmodifiableCollection(db.accountExternalIds().byAccount(who).toList()); Set internalGroups = new HashSet<>(); for (AccountGroupMember g : db.accountGroupMembers().byAccount(who)) { @@ -207,13 +200,12 @@ public class AccountCacheImpl implements AccountCache { try { account.setGeneralPreferences(loader.load(who)); } catch (IOException | ConfigInvalidException e) { - log.warn("Cannot load GeneralPreferences for " + who + - " (using default)", e); + log.warn("Cannot load GeneralPreferences for " + who + " (using default)", e); account.setGeneralPreferences(GeneralPreferencesInfo.defaults()); } - return new AccountState(account, internalGroups, externalIds, - watchConfig.get().getProjectWatches(who)); + return new AccountState( + account, internalGroups, externalIds, watchConfig.get().getProjectWatches(who)); } } @@ -227,13 +219,12 @@ public class AccountCacheImpl implements AccountCache { @Override public Optional load(String username) throws Exception { - AccountExternalId.Key key = new AccountExternalId.Key( // - AccountExternalId.SCHEME_USERNAME, // - username); - AccountState accountState = - accountQueryProvider.get().oneByExternalId(key.get()); - return Optional.ofNullable(accountState) - .map(s -> s.getAccount().getId()); + AccountExternalId.Key key = + new AccountExternalId.Key( // + AccountExternalId.SCHEME_USERNAME, // + username); + AccountState accountState = accountQueryProvider.get().oneByExternalId(key.get()); + return Optional.ofNullable(accountState).map(s -> s.getAccount().getId()); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountControl.java index db2a98f6f2..88a241158c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountControl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountControl.java @@ -27,7 +27,6 @@ import com.google.gerrit.server.group.SystemGroupBackend; import com.google.gerrit.server.project.ProjectCache; import com.google.inject.Inject; import com.google.inject.Provider; - import java.util.Set; /** Access control management for one account's access to other accounts. */ @@ -40,7 +39,8 @@ public class AccountControl { private final AccountVisibility accountVisibility; @Inject - Factory(final ProjectCache projectCache, + Factory( + final ProjectCache projectCache, final GroupControl.Factory groupControlFactory, final Provider user, final IdentifiedUser.GenericFactory userFactory, @@ -53,8 +53,8 @@ public class AccountControl { } public AccountControl get() { - return new AccountControl(projectCache, groupControlFactory, user.get(), - userFactory, accountVisibility); + return new AccountControl( + projectCache, groupControlFactory, user.get(), userFactory, accountVisibility); } } @@ -64,13 +64,13 @@ public class AccountControl { private final IdentifiedUser.GenericFactory userFactory; private final AccountVisibility accountVisibility; - AccountControl(final ProjectCache projectCache, - final GroupControl.Factory groupControlFactory, - final CurrentUser user, - final IdentifiedUser.GenericFactory userFactory, - final AccountVisibility accountVisibility) { - this.accountsSection = - projectCache.getAllProjects().getConfig().getAccountsSection(); + AccountControl( + final ProjectCache projectCache, + final GroupControl.Factory groupControlFactory, + final CurrentUser user, + final IdentifiedUser.GenericFactory userFactory, + final AccountVisibility accountVisibility) { + this.accountsSection = projectCache.getAllProjects().getConfig().getAccountsSection(); this.groupControlFactory = groupControlFactory; this.user = user; this.userFactory = userFactory; @@ -82,65 +82,63 @@ public class AccountControl { } /** - * Returns true if the current user is allowed to see the otherUser, based - * on the account visibility policy. Depending on the group membership - * realms supported, this may not be able to determine SAME_GROUP or - * VISIBLE_GROUP correctly (defaulting to not being visible). This is because - * {@link GroupMembership#getKnownGroups()} may only return a subset of the - * effective groups. + * Returns true if the current user is allowed to see the otherUser, based on the account + * visibility policy. Depending on the group membership realms supported, this may not be able to + * determine SAME_GROUP or VISIBLE_GROUP correctly (defaulting to not being visible). This is + * because {@link GroupMembership#getKnownGroups()} may only return a subset of the effective + * groups. */ public boolean canSee(Account otherUser) { return canSee(otherUser.getId()); } /** - * Returns true if the current user is allowed to see the otherUser, based - * on the account visibility policy. Depending on the group membership - * realms supported, this may not be able to determine SAME_GROUP or - * VISIBLE_GROUP correctly (defaulting to not being visible). This is because - * {@link GroupMembership#getKnownGroups()} may only return a subset of the - * effective groups. + * Returns true if the current user is allowed to see the otherUser, based on the account + * visibility policy. Depending on the group membership realms supported, this may not be able to + * determine SAME_GROUP or VISIBLE_GROUP correctly (defaulting to not being visible). This is + * because {@link GroupMembership#getKnownGroups()} may only return a subset of the effective + * groups. */ public boolean canSee(final Account.Id otherUser) { - return canSee(new OtherUser() { - @Override - Account.Id getId() { - return otherUser; - } + return canSee( + new OtherUser() { + @Override + Account.Id getId() { + return otherUser; + } - @Override - IdentifiedUser createUser() { - return userFactory.create(otherUser); - } - }); + @Override + IdentifiedUser createUser() { + return userFactory.create(otherUser); + } + }); } /** - * Returns true if the current user is allowed to see the otherUser, based - * on the account visibility policy. Depending on the group membership - * realms supported, this may not be able to determine SAME_GROUP or - * VISIBLE_GROUP correctly (defaulting to not being visible). This is because - * {@link GroupMembership#getKnownGroups()} may only return a subset of the - * effective groups. + * Returns true if the current user is allowed to see the otherUser, based on the account + * visibility policy. Depending on the group membership realms supported, this may not be able to + * determine SAME_GROUP or VISIBLE_GROUP correctly (defaulting to not being visible). This is + * because {@link GroupMembership#getKnownGroups()} may only return a subset of the effective + * groups. */ public boolean canSee(final AccountState otherUser) { - return canSee(new OtherUser() { - @Override - Account.Id getId() { - return otherUser.getAccount().getId(); - } + return canSee( + new OtherUser() { + @Override + Account.Id getId() { + return otherUser.getAccount().getId(); + } - @Override - IdentifiedUser createUser() { - return userFactory.create(otherUser); - } - }); + @Override + IdentifiedUser createUser() { + return userFactory.create(otherUser); + } + }); } private boolean canSee(OtherUser otherUser) { // Special case: I can always see myself. - if (user.isIdentifiedUser() - && user.getAccountId().equals(otherUser.getId())) { + if (user.isIdentifiedUser() && user.getAccountId().equals(otherUser.getId())) { return true; } if (user.getCapabilities().canViewAllAccounts()) { @@ -150,32 +148,34 @@ public class AccountControl { switch (accountVisibility) { case ALL: return true; - case SAME_GROUP: { - Set usersGroups = groupsOf(otherUser.getUser()); - for (PermissionRule rule : accountsSection.getSameGroupVisibility()) { - if (rule.isBlock() || rule.isDeny()) { - usersGroups.remove(rule.getGroup().getUUID()); - } - } - - if (user.getEffectiveGroups().containsAnyOf(usersGroups)) { - return true; - } - break; - } - case VISIBLE_GROUP: { - Set usersGroups = groupsOf(otherUser.getUser()); - for (AccountGroup.UUID usersGroup : usersGroups) { - try { - if (groupControlFactory.controlFor(usersGroup).isVisible()) { - return true; + case SAME_GROUP: + { + Set usersGroups = groupsOf(otherUser.getUser()); + for (PermissionRule rule : accountsSection.getSameGroupVisibility()) { + if (rule.isBlock() || rule.isDeny()) { + usersGroups.remove(rule.getGroup().getUUID()); } - } catch (NoSuchGroupException e) { - continue; } + + if (user.getEffectiveGroups().containsAnyOf(usersGroups)) { + return true; + } + break; + } + case VISIBLE_GROUP: + { + Set usersGroups = groupsOf(otherUser.getUser()); + for (AccountGroup.UUID usersGroup : usersGroups) { + try { + if (groupControlFactory.controlFor(usersGroup).isVisible()) { + return true; + } + } catch (NoSuchGroupException e) { + continue; + } + } + break; } - break; - } case NONE: break; default: @@ -185,7 +185,9 @@ public class AccountControl { } private Set groupsOf(IdentifiedUser user) { - return user.getEffectiveGroups().getKnownGroups().stream() + return user.getEffectiveGroups() + .getKnownGroups() + .stream() .filter(a -> !SystemGroupBackend.isSystemGroup(a)) .collect(toSet()); } @@ -201,6 +203,7 @@ public class AccountControl { } abstract IdentifiedUser createUser(); + abstract Account.Id getId(); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountDirectory.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountDirectory.java index eebf868e37..5c14c9450c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountDirectory.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountDirectory.java @@ -15,13 +15,12 @@ package com.google.gerrit.server.account; import com.google.gerrit.extensions.common.AccountInfo; - import java.util.Set; /** * Directory of user account information. * - * Implementations supply data to Gerrit about user accounts. + *

Implementations supply data to Gerrit about user accounts. */ public abstract class AccountDirectory { /** Fields to be populated for a REST API response. */ @@ -48,9 +47,7 @@ public abstract class AccountDirectory { STATUS } - public abstract void fillAccountInfo( - Iterable in, - Set options) + public abstract void fillAccountInfo(Iterable in, Set options) throws DirectoryException; @SuppressWarnings("serial") diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountLoader.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountLoader.java index 1ddc7620e9..a137256be7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountLoader.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountLoader.java @@ -25,7 +25,6 @@ import com.google.gerrit.server.account.AccountDirectory.FillOptions; import com.google.gwtorm.server.OrmException; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -37,16 +36,18 @@ import java.util.Set; public class AccountLoader { public static final Set DETAILED_OPTIONS = - Collections.unmodifiableSet(EnumSet.of( - FillOptions.ID, - FillOptions.NAME, - FillOptions.EMAIL, - FillOptions.USERNAME, - FillOptions.STATUS, - FillOptions.AVATARS)); + Collections.unmodifiableSet( + EnumSet.of( + FillOptions.ID, + FillOptions.NAME, + FillOptions.EMAIL, + FillOptions.USERNAME, + FillOptions.STATUS, + FillOptions.AVATARS)); public interface Factory { AccountLoader create(boolean detailed); + AccountLoader create(Set options); } @@ -56,17 +57,12 @@ public class AccountLoader { private final List provided; @AssistedInject - AccountLoader(InternalAccountDirectory directory, - @Assisted boolean detailed) { - this(directory, - detailed - ? DETAILED_OPTIONS - : InternalAccountDirectory.ID_ONLY); + AccountLoader(InternalAccountDirectory directory, @Assisted boolean detailed) { + this(directory, detailed ? DETAILED_OPTIONS : InternalAccountDirectory.ID_ONLY); } @AssistedInject - AccountLoader(InternalAccountDirectory directory, - @Assisted Set options) { + AccountLoader(InternalAccountDirectory directory, @Assisted Set options) { this.directory = directory; this.options = options; created = new HashMap<>(); @@ -92,16 +88,14 @@ public class AccountLoader { public void fill() throws OrmException { try { - directory.fillAccountInfo( - Iterables.concat(created.values(), provided), options); + directory.fillAccountInfo(Iterables.concat(created.values(), provided), options); } catch (DirectoryException e) { Throwables.throwIfInstanceOf(e.getCause(), OrmException.class); throw new OrmException(e); } } - public void fill(Collection infos) - throws OrmException { + public void fill(Collection infos) throws OrmException { for (AccountInfo info : infos) { put(info); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountManager.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountManager.java index 7236604988..9bbf8ac7fb 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountManager.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountManager.java @@ -36,22 +36,19 @@ import com.google.gwtorm.server.SchemaFactory; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.concurrent.atomic.AtomicBoolean; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** Tracks authentication related details for user accounts. */ @Singleton public class AccountManager { - private static final Logger log = - LoggerFactory.getLogger(AccountManager.class); + private static final Logger log = LoggerFactory.getLogger(AccountManager.class); private final SchemaFactory schema; private final AccountCache byIdCache; @@ -65,7 +62,8 @@ public class AccountManager { private final Provider accountQueryProvider; @Inject - AccountManager(SchemaFactory schema, + AccountManager( + SchemaFactory schema, AccountCache byIdCache, AccountByEmailCache byEmailCache, Realm accountMapper, @@ -86,14 +84,10 @@ public class AccountManager { this.accountQueryProvider = accountQueryProvider; } - /** - * @return user identified by this external identity string - */ - public Optional lookup(String externalId) - throws AccountException { + /** @return user identified by this external identity string */ + public Optional lookup(String externalId) throws AccountException { try { - AccountState accountState = - accountQueryProvider.get().oneByExternalId(externalId); + AccountState accountState = accountQueryProvider.get().oneByExternalId(externalId); return accountState != null ? Optional.of(accountState.getAccount().getId()) : Optional.empty(); @@ -107,11 +101,10 @@ public class AccountManager { * * @param who identity of the user, with any details we received about them. * @return the result of authenticating the user. - * @throws AccountException the account does not exist, and cannot be created, - * or exists, but cannot be located, or is inactive. + * @throws AccountException the account does not exist, and cannot be created, or exists, but + * cannot be located, or is inactive. */ - public AuthResult authenticate(AuthRequest who) - throws AccountException, IOException { + public AuthResult authenticate(AuthRequest who) throws AccountException, IOException { who = realm.authenticate(who); try { try (ReviewDb db = schema.open()) { @@ -138,10 +131,8 @@ public class AccountManager { } } - private AccountExternalId getAccountExternalId(AccountExternalId.Key key) - throws OrmException { - AccountState accountState = - accountQueryProvider.get().oneByExternalId(key.get()); + private AccountExternalId getAccountExternalId(AccountExternalId.Key key) throws OrmException { + AccountState accountState = accountQueryProvider.get().oneByExternalId(key.get()); if (accountState != null) { for (AccountExternalId extId : accountState.getExternalIds()) { if (extId.getKey().equals(key)) { @@ -163,8 +154,7 @@ public class AccountManager { String newEmail = who.getEmailAddress(); String oldEmail = extId.getEmailAddress(); if (newEmail != null && !newEmail.equals(oldEmail)) { - if (oldEmail != null - && oldEmail.equals(user.getAccount().getPreferredEmail())) { + if (oldEmail != null && oldEmail.equals(user.getAccount().getPreferredEmail())) { toUpdate = load(toUpdate, user.getAccountId(), db); toUpdate.setPreferredEmail(newEmail); } @@ -183,8 +173,9 @@ public class AccountManager { if (!realm.allowsEdit(AccountFieldName.USER_NAME) && who.getUserName() != null && !eq(user.getUserName(), who.getUserName())) { - log.warn(String.format("Not changing already set username %s to %s", - user.getUserName(), who.getUserName())); + log.warn( + String.format( + "Not changing already set username %s to %s", user.getUserName(), who.getUserName())); } if (toUpdate != null) { @@ -200,8 +191,7 @@ public class AccountManager { } } - private Account load(Account toUpdate, Account.Id accountId, ReviewDb db) - throws OrmException { + private Account load(Account toUpdate, Account.Id accountId, ReviewDb db) throws OrmException { if (toUpdate == null) { toUpdate = db.accounts().get(accountId); if (toUpdate == null) { @@ -225,21 +215,22 @@ public class AccountManager { account.setFullName(who.getDisplayName()); account.setPreferredEmail(extId.getEmailAddress()); - boolean isFirstAccount = awaitsFirstAccountCheck.getAndSet(false) - && db.accounts().anyAccounts().toList().isEmpty(); + boolean isFirstAccount = + awaitsFirstAccountCheck.getAndSet(false) && db.accounts().anyAccounts().toList().isEmpty(); try { db.accounts().upsert(Collections.singleton(account)); - AccountExternalId existingExtId = - db.accountExternalIds().get(extId.getKey()); - if (existingExtId != null - && !existingExtId.getAccountId().equals(extId.getAccountId())) { + AccountExternalId existingExtId = db.accountExternalIds().get(extId.getKey()); + if (existingExtId != null && !existingExtId.getAccountId().equals(extId.getAccountId())) { // external ID is assigned to another account, do not overwrite db.accounts().delete(Collections.singleton(account)); throw new AccountException( - "Cannot assign external ID \"" + extId.getExternalId() - + "\" to account " + newId + "; external ID already in use."); + "Cannot assign external ID \"" + + extId.getExternalId() + + "\" to account " + + newId + + "; external ID already in use."); } db.accountExternalIds().upsert(Collections.singleton(extId)); } finally { @@ -254,16 +245,17 @@ public class AccountManager { // is going to be the site's administrator and just make them that // to bootstrap the authentication database. // - Permission admin = projectCache.getAllProjects() - .getConfig() - .getAccessSection(AccessSection.GLOBAL_CAPABILITIES) - .getPermission(GlobalCapability.ADMINISTRATE_SERVER); + Permission admin = + projectCache + .getAllProjects() + .getConfig() + .getAccessSection(AccessSection.GLOBAL_CAPABILITIES) + .getPermission(GlobalCapability.ADMINISTRATE_SERVER); AccountGroup.UUID uuid = admin.getRules().get(0).getGroup().getUUID(); AccountGroup g = db.accountGroups().byUUID(uuid).iterator().next(); AccountGroup.Id adminId = g.getId(); - AccountGroupMember m = - new AccountGroupMember(new AccountGroupMember.Key(newId, adminId)); + AccountGroupMember m = new AccountGroupMember(new AccountGroupMember.Key(newId, adminId)); auditService.dispatchAddAccountsToGroup(newId, Collections.singleton(m)); db.accountGroupMembers().insert(Collections.singleton(m)); } @@ -276,13 +268,19 @@ public class AccountManager { changeUserNameFactory.create(db, user, who.getUserName()).call(); } catch (NameAlreadyUsedException e) { String message = - "Cannot assign user name \"" + who.getUserName() + "\" to account " - + newId + "; name already in use."; + "Cannot assign user name \"" + + who.getUserName() + + "\" to account " + + newId + + "; name already in use."; handleSettingUserNameFailure(db, account, extId, message, e, false); } catch (InvalidUserNameException e) { String message = - "Cannot assign user name \"" + who.getUserName() + "\" to account " - + newId + "; name does not conform."; + "Cannot assign user name \"" + + who.getUserName() + + "\" to account " + + newId + + "; name does not conform."; handleSettingUserNameFailure(db, account, extId, message, e, false); } catch (OrmException e) { String message = "Cannot assign user name"; @@ -297,26 +295,27 @@ public class AccountManager { } /** - * This method handles an exception that occurred during the setting of the - * user name for a newly created account. If the realm does not allow the user - * to set a user name manually this method deletes the newly created account - * and throws an {@link AccountUserNameException}. In any case the error - * message is logged. + * This method handles an exception that occurred during the setting of the user name for a newly + * created account. If the realm does not allow the user to set a user name manually this method + * deletes the newly created account and throws an {@link AccountUserNameException}. In any case + * the error message is logged. * * @param db the database * @param account the newly created account * @param extId the newly created external id * @param errorMessage the error message - * @param e the exception that occurred during the setting of the user name - * for the new account - * @param logException flag that decides whether the exception should be - * included into the log - * @throws AccountUserNameException thrown if the realm does not allow the - * user to manually set the user name + * @param e the exception that occurred during the setting of the user name for the new account + * @param logException flag that decides whether the exception should be included into the log + * @throws AccountUserNameException thrown if the realm does not allow the user to manually set + * the user name * @throws OrmException thrown if cleaning the database failed */ - private void handleSettingUserNameFailure(ReviewDb db, Account account, - AccountExternalId extId, String errorMessage, Exception e, + private void handleSettingUserNameFailure( + ReviewDb db, + Account account, + AccountExternalId extId, + String errorMessage, + Exception e, boolean logException) throws AccountUserNameException, OrmException { if (logException) { @@ -350,8 +349,8 @@ public class AccountManager { * @param to account to link the identity onto. * @param who the additional identity. * @return the result of linking the identity to the user. - * @throws AccountException the identity belongs to a different account, or it - * cannot be linked at this time. + * @throws AccountException the identity belongs to a different account, or it cannot be linked at + * this time. */ public AuthResult link(Account.Id to, AuthRequest who) throws AccountException, OrmException, IOException { @@ -383,33 +382,30 @@ public class AccountManager { } return new AuthResult(to, key, false); - } } /** * Update the link to another unique authentication identity to an existing account. * - * Existing external identities with the same scheme will be removed and replaced - * with the new one. + *

Existing external identities with the same scheme will be removed and replaced with the new + * one. * * @param to account to link the identity onto. * @param who the additional identity. * @return the result of linking the identity to the user. * @throws OrmException - * @throws AccountException the identity belongs to a different account, or it - * cannot be linked at this time. + * @throws AccountException the identity belongs to a different account, or it cannot be linked at + * this time. */ - public AuthResult updateLink(Account.Id to, AuthRequest who) throws OrmException, - AccountException, IOException { + public AuthResult updateLink(Account.Id to, AuthRequest who) + throws OrmException, AccountException, IOException { try (ReviewDb db = schema.open()) { AccountExternalId.Key key = id(who); List filteredKeysByScheme = - filterKeysByScheme(key.getScheme(), db.accountExternalIds() - .byAccount(to)); + filterKeysByScheme(key.getScheme(), db.accountExternalIds().byAccount(to)); if (!filteredKeysByScheme.isEmpty() - && (filteredKeysByScheme.size() > 1 || !filteredKeysByScheme - .contains(key))) { + && (filteredKeysByScheme.size() > 1 || !filteredKeysByScheme.contains(key))) { db.accountExternalIds().deleteKeys(filteredKeysByScheme); } byIdCache.evict(to); @@ -434,8 +430,8 @@ public class AccountManager { * @param from account to unlink the identity from. * @param who the identity to delete * @return the result of unlinking the identity from the user. - * @throws AccountException the identity belongs to a different account, or it - * cannot be unlinked at this time. + * @throws AccountException the identity belongs to a different account, or it cannot be unlinked + * at this time. */ public AuthResult unlink(Account.Id from, AuthRequest who) throws AccountException, OrmException, IOException { @@ -444,8 +440,7 @@ public class AccountManager { AccountExternalId extId = getAccountExternalId(key); if (extId != null) { if (!extId.getAccountId().equals(from)) { - throw new AccountException( - "Identity '" + key.get() + "' in use by another account"); + throw new AccountException("Identity '" + key.get() + "' in use by another account"); } db.accountExternalIds().delete(Collections.singleton(extId)); @@ -465,11 +460,9 @@ public class AccountManager { } return new AuthResult(from, key, false); - } } - private static AccountExternalId.Key id(AuthRequest who) { return new AccountExternalId.Key(who.getExternalId()); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountResolver.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountResolver.java index f3356e58f8..9803143247 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountResolver.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountResolver.java @@ -23,7 +23,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -39,7 +38,8 @@ public class AccountResolver { private final Provider accountQueryProvider; @Inject - AccountResolver(Realm realm, + AccountResolver( + Realm realm, AccountByEmailCache byEmail, AccountCache byId, Provider accountQueryProvider) { @@ -52,12 +52,11 @@ public class AccountResolver { /** * Locate exactly one account matching the name or name/email string. * - * @param nameOrEmail a string of the format - * "Full Name <email@example>", just the email address - * ("email@example"), a full name ("Full Name"), an account id - * ("18419") or an user name ("username"). - * @return the single account that matches; null if no account matches or - * there are multiple candidates. + * @param nameOrEmail a string of the format "Full Name <email@example>", just the email + * address ("email@example"), a full name ("Full Name"), an account id ("18419") or an user + * name ("username"). + * @return the single account that matches; null if no account matches or there are multiple + * candidates. */ public Account find(ReviewDb db, String nameOrEmail) throws OrmException { Set r = findAll(db, nameOrEmail); @@ -83,14 +82,12 @@ public class AccountResolver { * Find all accounts matching the name or name/email string. * * @param db open database handle. - * @param nameOrEmail a string of the format - * "Full Name <email@example>", just the email address - * ("email@example"), a full name ("Full Name"), an account id - * ("18419") or an user name ("username"). - * @return the accounts that match, empty collection if none. Never null. + * @param nameOrEmail a string of the format "Full Name <email@example>", just the email + * address ("email@example"), a full name ("Full Name"), an account id ("18419") or an user + * name ("username"). + * @return the accounts that match, empty collection if none. Never null. */ - public Set findAll(ReviewDb db, String nameOrEmail) - throws OrmException { + public Set findAll(ReviewDb db, String nameOrEmail) throws OrmException { Matcher m = Pattern.compile("^.* \\(([1-9][0-9]*)\\)$").matcher(nameOrEmail); if (m.matches()) { Account.Id id = Account.Id.parse(m.group(1)); @@ -126,14 +123,12 @@ public class AccountResolver { * Locate exactly one account matching the name or name/email string. * * @param db open database handle. - * @param nameOrEmail a string of the format - * "Full Name <email@example>", just the email address - * ("email@example"), a full name ("Full Name"). - * @return the single account that matches; null if no account matches or - * there are multiple candidates. + * @param nameOrEmail a string of the format "Full Name <email@example>", just the email + * address ("email@example"), a full name ("Full Name"). + * @return the single account that matches; null if no account matches or there are multiple + * candidates. */ - public Account findByNameOrEmail(ReviewDb db, String nameOrEmail) - throws OrmException { + public Account findByNameOrEmail(ReviewDb db, String nameOrEmail) throws OrmException { Set r = findAllByNameOrEmail(db, nameOrEmail); return r.size() == 1 ? byId.get(r.iterator().next()).getAccount() : null; } @@ -142,13 +137,11 @@ public class AccountResolver { * Locate exactly one account matching the name or name/email string. * * @param db open database handle. - * @param nameOrEmail a string of the format - * "Full Name <email@example>", just the email address - * ("email@example"), a full name ("Full Name"). + * @param nameOrEmail a string of the format "Full Name <email@example>", just the email + * address ("email@example"), a full name ("Full Name"). * @return the accounts that match, empty collection if none. Never null. */ - public Set findAllByNameOrEmail(ReviewDb db, String nameOrEmail) - throws OrmException { + public Set findAllByNameOrEmail(ReviewDb db, String nameOrEmail) throws OrmException { int lt = nameOrEmail.indexOf('<'); int gt = nameOrEmail.indexOf('>'); if (lt >= 0 && gt > lt && nameOrEmail.contains("@")) { @@ -185,7 +178,10 @@ public class AccountResolver { // At this point we have no clue. Just perform a whole bunch of suggestions // and pray we come up with a reasonable result list. - return accountQueryProvider.get().byDefault(nameOrEmail).stream() + return accountQueryProvider + .get() + .byDefault(nameOrEmail) + .stream() .map(a -> a.getAccount().getId()) .collect(toSet()); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountResource.java index 8bebf52771..a016b98a76 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountResource.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountResource.java @@ -21,7 +21,6 @@ import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.change.ChangeResource; import com.google.inject.TypeLiteral; - import java.util.Set; public class AccountResource implements RestResource { @@ -119,8 +118,7 @@ public class AccountResource implements RestResource { private final ChangeResource change; private final Set labels; - public Star(IdentifiedUser user, ChangeResource change, - Set labels) { + public Star(IdentifiedUser user, ChangeResource change, Set labels) { this.user = user; this.change = change; this.labels = labels; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountState.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountState.java index 827bdee651..b811c846e8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountState.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountState.java @@ -28,7 +28,6 @@ import com.google.gerrit.server.CurrentUser.PropertyKey; import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.account.WatchConfig.NotifyType; import com.google.gerrit.server.account.WatchConfig.ProjectWatchKey; - import java.util.Collection; import java.util.HashSet; import java.util.Map; @@ -44,7 +43,8 @@ public class AccountState { private final Map> projectWatches; private Cache, Object> properties; - public AccountState(Account account, + public AccountState( + Account account, Set actualGroups, Collection externalIds, Map> projectWatches) { @@ -62,9 +62,9 @@ public class AccountState { /** * Get the username, if one has been declared for this user. - *

- * The username is the {@link AccountExternalId} using the scheme - * {@link AccountExternalId#SCHEME_USERNAME}. + * + *

The username is the {@link AccountExternalId} using the scheme {@link + * AccountExternalId#SCHEME_USERNAME}. */ public String getUserName() { return account.getUserName(); @@ -73,8 +73,7 @@ public class AccountState { /** @return the password matching the requested username; or null. */ public String getPassword(String username) { for (AccountExternalId id : getExternalIds()) { - if (id.isScheme(AccountExternalId.SCHEME_USERNAME) - && username.equals(id.getSchemeRest())) { + if (id.isScheme(AccountExternalId.SCHEME_USERNAME) && username.equals(id.getSchemeRest())) { return id.getPassword(); } } @@ -117,9 +116,9 @@ public class AccountState { /** * Lookup a previously stored property. - *

- * All properties are automatically cleared when the account cache invalidates - * the {@code AccountState}. This method is thread-safe. + * + *

All properties are automatically cleared when the account cache invalidates the {@code + * AccountState}. This method is thread-safe. * * @param key unique property key. * @return previously stored value, or {@code null}. @@ -137,8 +136,8 @@ public class AccountState { /** * Store a property for later retrieval. - *

- * This method is thread-safe. + * + *

This method is thread-safe. * * @param key unique property key. * @param value value to store; or {@code null} to clear the value. @@ -156,16 +155,16 @@ public class AccountState { } } - private synchronized Cache, Object> properties( - boolean allocate) { + private synchronized Cache, Object> properties(boolean allocate) { if (properties == null && allocate) { - properties = CacheBuilder.newBuilder() - .concurrencyLevel(1) - .initialCapacity(16) - // Use weakKeys to ensure plugins that garbage collect will also - // eventually release data held in any still live AccountState. - .weakKeys() - .build(); + properties = + CacheBuilder.newBuilder() + .concurrencyLevel(1) + .initialCapacity(16) + // Use weakKeys to ensure plugins that garbage collect will also + // eventually release data held in any still live AccountState. + .weakKeys() + .build(); } return properties; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountUserNameException.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountUserNameException.java index 1cf8be80e4..19fd34dcc0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountUserNameException.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountUserNameException.java @@ -15,9 +15,8 @@ package com.google.gerrit.server.account; /** - * Thrown by {@link AccountManager} if the user name for a newly created account - * could not be set and the realm does not allow the user to set a user name - * manually. + * Thrown by {@link AccountManager} if the user name for a newly created account could not be set + * and the realm does not allow the user to set a user name manually. */ public class AccountUserNameException extends AccountException { private static final long serialVersionUID = 1L; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountVisibility.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountVisibility.java index 7ee8db656f..9957134582 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountVisibility.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountVisibility.java @@ -26,8 +26,8 @@ public enum AccountVisibility { VISIBLE_GROUP, /** - * Other accounts are not visible to the given user unless they are explicitly - * collaborating on a change. + * Other accounts are not visible to the given user unless they are explicitly collaborating on a + * change. */ NONE } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountVisibilityProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountVisibilityProvider.java index 25f0a7d6f8..4521cd53de 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountVisibilityProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountVisibilityProvider.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.account; import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; import com.google.inject.Provider; - import org.eclipse.jgit.lib.Config; public class AccountVisibilityProvider implements Provider { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountsCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountsCollection.java index c7ce1b7723..081ea26757 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountsCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountsCollection.java @@ -35,9 +35,8 @@ import com.google.inject.Provider; import com.google.inject.Singleton; @Singleton -public class AccountsCollection implements - RestCollection, - AcceptsCreate { +public class AccountsCollection + implements RestCollection, AcceptsCreate { private final Provider db; private final Provider self; private final AccountResolver resolver; @@ -48,7 +47,8 @@ public class AccountsCollection implements private final CreateAccount.Factory createAccountFactory; @Inject - AccountsCollection(Provider db, + AccountsCollection( + Provider db, Provider self, AccountResolver resolver, AccountControl.Factory accountControlFactory, @@ -81,30 +81,28 @@ public class AccountsCollection implements /** * Parses a account ID from a request body and returns the user. * - * @param id ID of the account, can be a string of the format - * "{@code Full Name }", just the email address, - * a full name if it is unique, an account ID, a user name or - * "{@code self}" for the calling user + * @param id ID of the account, can be a string of the format "{@code Full Name + * }", just the email address, a full name if it is unique, an account ID, + * a user name or "{@code self}" for the calling user * @return the user, never null. - * @throws UnprocessableEntityException thrown if the account ID cannot be - * resolved or if the account is not visible to the calling user + * @throws UnprocessableEntityException thrown if the account ID cannot be resolved or if the + * account is not visible to the calling user */ - public IdentifiedUser parse(String id) throws AuthException, - UnprocessableEntityException, OrmException { + public IdentifiedUser parse(String id) + throws AuthException, UnprocessableEntityException, OrmException { return parseOnBehalfOf(null, id); } /** - * Parses an account ID and returns the user without making any permission - * check whether the current user can see the account. + * Parses an account ID and returns the user without making any permission check whether the + * current user can see the account. * - * @param id ID of the account, can be a string of the format - * "{@code Full Name }", just the email address, - * a full name if it is unique, an account ID, a user name or - * "{@code self}" for the calling user + * @param id ID of the account, can be a string of the format "{@code Full Name + * }", just the email address, a full name if it is unique, an account ID, + * a user name or "{@code self}" for the calling user * @return the user, null if no user is found for the given account ID - * @throws AuthException thrown if 'self' is used as account ID and the - * current user is not authenticated + * @throws AuthException thrown if 'self' is used as account ID and the current user is not + * authenticated * @throws OrmException */ public IdentifiedUser parseId(String id) throws AuthException, OrmException { @@ -112,25 +110,21 @@ public class AccountsCollection implements } /** - * Like {@link #parse(String)}, but also sets the {@link - * CurrentUser#getRealUser()} on the result. + * Like {@link #parse(String)}, but also sets the {@link CurrentUser#getRealUser()} on the result. */ - public IdentifiedUser parseOnBehalfOf(@Nullable CurrentUser caller, - String id) + public IdentifiedUser parseOnBehalfOf(@Nullable CurrentUser caller, String id) throws AuthException, UnprocessableEntityException, OrmException { IdentifiedUser user = parseIdOnBehalfOf(caller, id); if (user == null) { - throw new UnprocessableEntityException(String.format( - "Account Not Found: %s", id)); + throw new UnprocessableEntityException(String.format("Account Not Found: %s", id)); } else if (!accountControlFactory.get().canSee(user.getAccount())) { - throw new UnprocessableEntityException(String.format( - "Account Not Found: %s", id)); + throw new UnprocessableEntityException(String.format("Account Not Found: %s", id)); } return user; } - private IdentifiedUser parseIdOnBehalfOf(@Nullable CurrentUser caller, - String id) throws AuthException, OrmException { + private IdentifiedUser parseIdOnBehalfOf(@Nullable CurrentUser caller, String id) + throws AuthException, OrmException { if (id.equals("self")) { CurrentUser user = self.get(); if (user.isIdentifiedUser()) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AddSshKey.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AddSshKey.java index 8cc392a921..8c10c737c3 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AddSshKey.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AddSshKey.java @@ -35,14 +35,12 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; +import java.io.InputStream; import org.eclipse.jgit.errors.ConfigInvalidException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.io.InputStream; - @Singleton public class AddSshKey implements RestModifyView { private static final Logger log = LoggerFactory.getLogger(AddSshKey.class); @@ -57,7 +55,8 @@ public class AddSshKey implements RestModifyView { private final AddKeySender.Factory addKeyFactory; @Inject - AddSshKey(Provider self, + AddSshKey( + Provider self, VersionedAuthorizedKeys.Accessor authorizedKeys, SshKeyCache sshKeyCache, AddKeySender.Factory addKeyFactory) { @@ -69,18 +68,15 @@ public class AddSshKey implements RestModifyView { @Override public Response apply(AccountResource rsrc, Input input) - throws AuthException, BadRequestException, OrmException, IOException, - ConfigInvalidException { - if (self.get() != rsrc.getUser() - && !self.get().getCapabilities().canAdministrateServer()) { + throws AuthException, BadRequestException, OrmException, IOException, ConfigInvalidException { + if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canAdministrateServer()) { throw new AuthException("not allowed to add SSH keys"); } return apply(rsrc.getUser(), input); } public Response apply(IdentifiedUser user, Input input) - throws BadRequestException, IOException, - ConfigInvalidException { + throws BadRequestException, IOException, ConfigInvalidException { if (input == null) { input = new Input(); } @@ -89,22 +85,22 @@ public class AddSshKey implements RestModifyView { } final RawInput rawKey = input.raw; - String sshPublicKey = new ByteSource() { - @Override - public InputStream openStream() throws IOException { - return rawKey.getInputStream(); - } - }.asCharSource(UTF_8).read(); + String sshPublicKey = + new ByteSource() { + @Override + public InputStream openStream() throws IOException { + return rawKey.getInputStream(); + } + }.asCharSource(UTF_8).read(); try { - AccountSshKey sshKey = - authorizedKeys.addKey(user.getAccountId(), sshPublicKey); + AccountSshKey sshKey = authorizedKeys.addKey(user.getAccountId(), sshPublicKey); try { addKeyFactory.create(user, sshKey).send(); } catch (EmailException e) { - log.error("Cannot send SSH key added message to " - + user.getAccount().getPreferredEmail(), e); + log.error( + "Cannot send SSH key added message to " + user.getAccount().getPreferredEmail(), e); } sshKeyCache.evict(user.getUserName()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AuthRequest.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AuthRequest.java index c585f97cf4..143164039d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AuthRequest.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AuthRequest.java @@ -22,18 +22,16 @@ import com.google.gerrit.reviewdb.client.AccountExternalId; /** * Information for {@link AccountManager#authenticate(AuthRequest)}. - *

- * Callers should populate this object with as much information as possible - * about the user account. For example, OpenID authentication might return - * registration information including a display name for the user, and an email - * address for them. These fields however are optional, as not all OpenID - * providers return them, and not all non-OpenID systems can use them. + * + *

Callers should populate this object with as much information as possible about the user + * account. For example, OpenID authentication might return registration information including a + * display name for the user, and an email address for them. These fields however are optional, as + * not all OpenID providers return them, and not all non-OpenID systems can use them. */ public class AuthRequest { /** Create a request for a local username, such as from LDAP. */ public static AuthRequest forUser(final String username) { - final AccountExternalId.Key i = - new AccountExternalId.Key(SCHEME_GERRIT, username); + final AccountExternalId.Key i = new AccountExternalId.Key(SCHEME_GERRIT, username); final AuthRequest r = new AuthRequest(i.get()); r.setUserName(username); return r; @@ -41,8 +39,7 @@ public class AuthRequest { /** Create a request for an external username. */ public static AuthRequest forExternalUser(String username) { - AccountExternalId.Key i = - new AccountExternalId.Key(SCHEME_EXTERNAL, username); + AccountExternalId.Key i = new AccountExternalId.Key(SCHEME_EXTERNAL, username); AuthRequest r = new AuthRequest(i.get()); r.setUserName(username); return r; @@ -50,13 +47,12 @@ public class AuthRequest { /** * Create a request for an email address registration. - *

- * This type of request should be used only to attach a new email address to - * an existing user account. + * + *

This type of request should be used only to attach a new email address to an existing user + * account. */ public static AuthRequest forEmail(final String email) { - final AccountExternalId.Key i = - new AccountExternalId.Key(SCHEME_MAILTO, email); + final AccountExternalId.Key i = new AccountExternalId.Key(SCHEME_MAILTO, email); final AuthRequest r = new AuthRequest(i.get()); r.setEmailAddress(email); return r; @@ -92,8 +88,7 @@ public class AuthRequest { public void setLocalUser(final String localUser) { if (isScheme(SCHEME_GERRIT)) { - final AccountExternalId.Key key = - new AccountExternalId.Key(SCHEME_GERRIT, localUser); + final AccountExternalId.Key key = new AccountExternalId.Key(SCHEME_GERRIT, localUser); externalId = key.get(); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AuthResult.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AuthResult.java index b94e41ae5e..1e75b635a0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AuthResult.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AuthResult.java @@ -23,8 +23,8 @@ public class AuthResult { private final AccountExternalId.Key externalId; private final boolean isNew; - public AuthResult(final Account.Id accountId, - final AccountExternalId.Key externalId, final boolean isNew) { + public AuthResult( + final Account.Id accountId, final AccountExternalId.Key externalId, final boolean isNew) { this.accountId = accountId; this.externalId = externalId; this.isNew = isNew; @@ -42,9 +42,9 @@ public class AuthResult { /** * True if this account was recently created for the user. - *

- * New users should be redirected to the registration screen, so they can - * configure their new user account. + * + *

New users should be redirected to the registration screen, so they can configure their new + * user account. */ public boolean isNew() { return isNew; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AuthorizedKeys.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AuthorizedKeys.java index 45dbe6035e..4d86ab22fd 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AuthorizedKeys.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AuthorizedKeys.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.account; import com.google.common.annotations.VisibleForTesting; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.AccountSshKey; - import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -26,14 +25,11 @@ import java.util.Optional; public class AuthorizedKeys { public static final String FILE_NAME = "authorized_keys"; - @VisibleForTesting - public static final String INVALID_KEY_COMMENT_PREFIX = "# INVALID "; + @VisibleForTesting public static final String INVALID_KEY_COMMENT_PREFIX = "# INVALID "; - @VisibleForTesting - public static final String DELETED_KEY_COMMENT = "# DELETED"; + @VisibleForTesting public static final String DELETED_KEY_COMMENT = "# DELETED"; - public static List> parse( - Account.Id accountId, String s) { + public static List> parse(Account.Id accountId, String s) { List> keys = new ArrayList<>(); int seq = 1; for (String line : s.split("\\r?\\n")) { @@ -42,8 +38,7 @@ public class AuthorizedKeys { continue; } else if (line.startsWith(INVALID_KEY_COMMENT_PREFIX)) { String pub = line.substring(INVALID_KEY_COMMENT_PREFIX.length()); - AccountSshKey key = - new AccountSshKey(new AccountSshKey.Id(accountId, seq++), pub); + AccountSshKey key = new AccountSshKey(new AccountSshKey.Id(accountId, seq++), pub); key.setInvalid(); keys.add(Optional.of(key)); } else if (line.startsWith(DELETED_KEY_COMMENT)) { @@ -52,8 +47,7 @@ public class AuthorizedKeys { } else if (line.startsWith("#")) { continue; } else { - AccountSshKey key = - new AccountSshKey(new AccountSshKey.Id(accountId, seq++), line); + AccountSshKey key = new AccountSshKey(new AccountSshKey.Id(accountId, seq++), line); keys.add(Optional.of(key)); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/Capabilities.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/Capabilities.java index 95338fe82e..d35656c46d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/Capabilities.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/Capabilities.java @@ -28,8 +28,7 @@ import com.google.inject.Provider; import com.google.inject.Singleton; @Singleton -class Capabilities implements - ChildCollection { +class Capabilities implements ChildCollection { private final Provider self; private final DynamicMap> views; private final Provider get; @@ -52,8 +51,7 @@ class Capabilities implements @Override public Capability parse(AccountResource parent, IdString id) throws ResourceNotFoundException, AuthException { - if (self.get() != parent.getUser() - && !self.get().getCapabilities().canAdministrateServer()) { + if (self.get() != parent.getUser() && !self.get().getCapabilities().canAdministrateServer()) { throw new AuthException("restricted to administrator"); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/CapabilityCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/CapabilityCollection.java index 6d245a3863..05d771e4c0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/CapabilityCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/CapabilityCollection.java @@ -28,7 +28,6 @@ import com.google.gerrit.server.config.AdministrateServerGroups; import com.google.gerrit.server.group.SystemGroupBackend; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -100,8 +99,8 @@ public class CapabilityCollection { queryLimit = getPermission(GlobalCapability.QUERY_LIMIT); } - private static List mergeAdmin(Set admins, - List rules) { + private static List mergeAdmin( + Set admins, List rules) { if (admins.isEmpty()) { return rules; } @@ -120,17 +119,22 @@ public class CapabilityCollection { public ImmutableList getPermission(String permissionName) { ImmutableList r = permissions.get(permissionName); - return r != null ? r : ImmutableList. of(); + return r != null ? r : ImmutableList.of(); } - private void configureDefaults(Map> out, - AccessSection section) { - configureDefault(out, section, GlobalCapability.QUERY_LIMIT, + private void configureDefaults(Map> out, AccessSection section) { + configureDefault( + out, + section, + GlobalCapability.QUERY_LIMIT, systemGroupBackend.getGroup(SystemGroupBackend.ANONYMOUS_USERS)); } - private static void configureDefault(Map> out, - AccessSection section, String capName, GroupReference group) { + private static void configureDefault( + Map> out, + AccessSection section, + String capName, + GroupReference group) { if (doesNotDeclare(section, capName)) { PermissionRange.WithDefaults range = GlobalCapability.getRange(capName); if (range != null) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/CapabilityControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/CapabilityControl.java index d86d27cd55..66d0bf9aeb 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/CapabilityControl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/CapabilityControl.java @@ -29,7 +29,6 @@ import com.google.gerrit.server.group.SystemGroupBackend; import com.google.gerrit.server.project.ProjectCache; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -68,8 +67,9 @@ public class CapabilityControl { if (user.getRealUser() != user) { canAdministrateServer = false; } else { - canAdministrateServer = user instanceof PeerDaemonUser - || matchAny(capabilities.administrateServer, ALLOWED_RULE); + canAdministrateServer = + user instanceof PeerDaemonUser + || matchAny(capabilities.administrateServer, ALLOWED_RULE); } } return canAdministrateServer; @@ -77,20 +77,17 @@ public class CapabilityControl { /** @return true if the user can create an account for another user. */ public boolean canCreateAccount() { - return canPerform(GlobalCapability.CREATE_ACCOUNT) - || canAdministrateServer(); + return canPerform(GlobalCapability.CREATE_ACCOUNT) || canAdministrateServer(); } /** @return true if the user can create a group. */ public boolean canCreateGroup() { - return canPerform(GlobalCapability.CREATE_GROUP) - || canAdministrateServer(); + return canPerform(GlobalCapability.CREATE_GROUP) || canAdministrateServer(); } /** @return true if the user can create a project. */ public boolean canCreateProject() { - return canPerform(GlobalCapability.CREATE_PROJECT) - || canAdministrateServer(); + return canPerform(GlobalCapability.CREATE_PROJECT) || canAdministrateServer(); } /** @return true if the user can email reviewers. */ @@ -98,64 +95,54 @@ public class CapabilityControl { if (canEmailReviewers == null) { canEmailReviewers = matchAny(capabilities.emailReviewers, ALLOWED_RULE) - || !matchAny(capabilities.emailReviewers, not(ALLOWED_RULE)); - + || !matchAny(capabilities.emailReviewers, not(ALLOWED_RULE)); } return canEmailReviewers; } /** @return true if the user can kill any running task. */ public boolean canKillTask() { - return canPerform(GlobalCapability.KILL_TASK) - || canMaintainServer(); + return canPerform(GlobalCapability.KILL_TASK) || canMaintainServer(); } /** @return true if the user can modify an account for another user. */ public boolean canModifyAccount() { - return canPerform(GlobalCapability.MODIFY_ACCOUNT) - || canAdministrateServer(); + return canPerform(GlobalCapability.MODIFY_ACCOUNT) || canAdministrateServer(); } /** @return true if the user can view all accounts. */ public boolean canViewAllAccounts() { - return canPerform(GlobalCapability.VIEW_ALL_ACCOUNTS) - || canAdministrateServer(); + return canPerform(GlobalCapability.VIEW_ALL_ACCOUNTS) || canAdministrateServer(); } /** @return true if the user can view the server caches. */ public boolean canViewCaches() { - return canPerform(GlobalCapability.VIEW_CACHES) - || canMaintainServer(); + return canPerform(GlobalCapability.VIEW_CACHES) || canMaintainServer(); } /** @return true if the user can flush the server's caches. */ public boolean canFlushCaches() { - return canPerform(GlobalCapability.FLUSH_CACHES) - || canMaintainServer(); + return canPerform(GlobalCapability.FLUSH_CACHES) || canMaintainServer(); } /** @return true if the user can perform basic server maintenance. */ public boolean canMaintainServer() { - return canPerform(GlobalCapability.MAINTAIN_SERVER) - || canAdministrateServer(); + return canPerform(GlobalCapability.MAINTAIN_SERVER) || canAdministrateServer(); } /** @return true if the user can view open connections. */ public boolean canViewConnections() { - return canPerform(GlobalCapability.VIEW_CONNECTIONS) - || canAdministrateServer(); + return canPerform(GlobalCapability.VIEW_CONNECTIONS) || canAdministrateServer(); } /** @return true if the user can view the installed plugins. */ public boolean canViewPlugins() { - return canPerform(GlobalCapability.VIEW_PLUGINS) - || canAdministrateServer(); + return canPerform(GlobalCapability.VIEW_PLUGINS) || canAdministrateServer(); } /** @return true if the user can view the entire queue. */ public boolean canViewQueue() { - return canPerform(GlobalCapability.VIEW_QUEUE) - || canMaintainServer(); + return canPerform(GlobalCapability.VIEW_QUEUE) || canMaintainServer(); } /** @return true if the user can access the database (with gsql). */ @@ -165,14 +152,12 @@ public class CapabilityControl { /** @return true if the user can stream Gerrit events. */ public boolean canStreamEvents() { - return canPerform(GlobalCapability.STREAM_EVENTS) - || canAdministrateServer(); + return canPerform(GlobalCapability.STREAM_EVENTS) || canAdministrateServer(); } /** @return true if the user can run the Git garbage collection. */ public boolean canRunGC() { - return canPerform(GlobalCapability.RUN_GC) - || canMaintainServer(); + return canPerform(GlobalCapability.RUN_GC) || canMaintainServer(); } /** @return true if the user can impersonate another user. */ @@ -235,13 +220,11 @@ public class CapabilityControl { return null; } - private static PermissionRange toRange(String permissionName, - List ruleList) { + private static PermissionRange toRange(String permissionName, List ruleList) { int min = 0; int max = 0; if (ruleList.isEmpty()) { - PermissionRange.WithDefaults defaultRange = - GlobalCapability.getRange(permissionName); + PermissionRange.WithDefaults defaultRange = GlobalCapability.getRange(permissionName); if (defaultRange != null) { min = defaultRange.getDefaultMin(); max = defaultRange.getDefaultMax(); @@ -279,20 +262,15 @@ public class CapabilityControl { return mine; } - private static final Predicate ALLOWED_RULE = - r -> r.getAction() == Action.ALLOW; + private static final Predicate ALLOWED_RULE = r -> r.getAction() == Action.ALLOW; - private boolean matchAny(Collection rules, - Predicate predicate) { + private boolean matchAny(Collection rules, Predicate predicate) { return user.getEffectiveGroups() .containsAnyOf( - FluentIterable.from(rules) - .filter(predicate) - .transform(r -> r.getGroup().getUUID())); + FluentIterable.from(rules).filter(predicate).transform(r -> r.getGroup().getUUID())); } - private static boolean match(GroupMembership groups, - PermissionRule rule) { + private static boolean match(GroupMembership groups, PermissionRule rule) { return groups.contains(rule.getGroup().getUUID()); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/CapabilityUtils.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/CapabilityUtils.java index 2bf147d674..21399f43e4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/CapabilityUtils.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/CapabilityUtils.java @@ -20,34 +20,30 @@ import com.google.gerrit.extensions.annotations.RequiresCapability; import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.server.CurrentUser; import com.google.inject.Provider; - +import java.lang.annotation.Annotation; +import java.util.Arrays; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.lang.annotation.Annotation; -import java.util.Arrays; - public class CapabilityUtils { - private static final Logger log = LoggerFactory - .getLogger(CapabilityUtils.class); + private static final Logger log = LoggerFactory.getLogger(CapabilityUtils.class); - public static void checkRequiresCapability(Provider userProvider, - String pluginName, Class clazz) throws AuthException { + public static void checkRequiresCapability( + Provider userProvider, String pluginName, Class clazz) throws AuthException { checkRequiresCapability(userProvider.get(), pluginName, clazz); } - public static void checkRequiresCapability(CurrentUser user, - String pluginName, Class clazz) + public static void checkRequiresCapability(CurrentUser user, String pluginName, Class clazz) throws AuthException { RequiresCapability rc = getClassAnnotation(clazz, RequiresCapability.class); - RequiresAnyCapability rac = - getClassAnnotation(clazz, RequiresAnyCapability.class); + RequiresAnyCapability rac = getClassAnnotation(clazz, RequiresAnyCapability.class); if (rc != null && rac != null) { - log.error(String.format( - "Class %s uses both @%s and @%s", - clazz.getName(), - RequiresCapability.class.getSimpleName(), - RequiresAnyCapability.class.getSimpleName())); + log.error( + String.format( + "Class %s uses both @%s and @%s", + clazz.getName(), + RequiresCapability.class.getSimpleName(), + RequiresAnyCapability.class.getSimpleName())); throw new AuthException("cannot check capability"); } CapabilityControl ctl = user.getCapabilities(); @@ -58,74 +54,73 @@ public class CapabilityUtils { checkRequiresAnyCapability(ctl, pluginName, clazz, rac); } - private static void checkRequiresCapability(CapabilityControl ctl, - String pluginName, Class clazz, RequiresCapability rc) + private static void checkRequiresCapability( + CapabilityControl ctl, String pluginName, Class clazz, RequiresCapability rc) throws AuthException { if (rc == null) { return; } - String capability = - resolveCapability(pluginName, rc.value(), rc.scope(), clazz); + String capability = resolveCapability(pluginName, rc.value(), rc.scope(), clazz); if (!ctl.canPerform(capability)) { - throw new AuthException(String.format( - "Capability %s is required to access this resource", - capability)); + throw new AuthException( + String.format("Capability %s is required to access this resource", capability)); } } - private static void checkRequiresAnyCapability(CapabilityControl ctl, - String pluginName, Class clazz, RequiresAnyCapability rac) + private static void checkRequiresAnyCapability( + CapabilityControl ctl, String pluginName, Class clazz, RequiresAnyCapability rac) throws AuthException { if (rac == null) { return; } if (rac.value().length == 0) { - log.error(String.format( - "Class %s uses @%s with no capabilities listed", - clazz.getName(), - RequiresAnyCapability.class.getSimpleName())); + log.error( + String.format( + "Class %s uses @%s with no capabilities listed", + clazz.getName(), RequiresAnyCapability.class.getSimpleName())); throw new AuthException("cannot check capability"); } for (String capability : rac.value()) { - capability = - resolveCapability(pluginName, capability, rac.scope(), clazz); + capability = resolveCapability(pluginName, capability, rac.scope(), clazz); if (ctl.canPerform(capability)) { return; } } throw new AuthException( "One of the following capabilities is required to access this" - + " resource: " + Arrays.asList(rac.value())); + + " resource: " + + Arrays.asList(rac.value())); } - private static String resolveCapability(String pluginName, String capability, - CapabilityScope scope, Class clazz) throws AuthException { - if (pluginName != null && !"gerrit".equals(pluginName) - && (scope == CapabilityScope.PLUGIN - || scope == CapabilityScope.CONTEXT)) { + private static String resolveCapability( + String pluginName, String capability, CapabilityScope scope, Class clazz) + throws AuthException { + if (pluginName != null + && !"gerrit".equals(pluginName) + && (scope == CapabilityScope.PLUGIN || scope == CapabilityScope.CONTEXT)) { capability = String.format("%s-%s", pluginName, capability); } else if (scope == CapabilityScope.PLUGIN) { - log.error(String.format( - "Class %s uses @%s(scope=%s), but is not within a plugin", - clazz.getName(), - RequiresCapability.class.getSimpleName(), - CapabilityScope.PLUGIN.name())); + log.error( + String.format( + "Class %s uses @%s(scope=%s), but is not within a plugin", + clazz.getName(), + RequiresCapability.class.getSimpleName(), + CapabilityScope.PLUGIN.name())); throw new AuthException("cannot check capability"); } return capability; } /** - * Find an instance of the specified annotation, walking up the inheritance - * tree if necessary. + * Find an instance of the specified annotation, walking up the inheritance tree if necessary. * * @param Annotation type to search for * @param clazz root class to search, may be null * @param annotationClass class object of Annotation subclass to search for * @return the requested annotation or null if none */ - private static T getClassAnnotation(Class clazz, - Class annotationClass) { + private static T getClassAnnotation( + Class clazz, Class annotationClass) { for (; clazz != null; clazz = clazz.getSuperclass()) { T t = clazz.getAnnotation(annotationClass); if (t != null) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/ChangeUserName.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/ChangeUserName.java index c1ecafddf2..39c732e06f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/ChangeUserName.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/ChangeUserName.java @@ -28,7 +28,6 @@ import com.google.gwtorm.server.OrmDuplicateKeyException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - import java.io.IOException; import java.util.ArrayList; import java.util.Collection; @@ -38,11 +37,9 @@ import java.util.regex.Pattern; /** Operation to change the username of an account. */ public class ChangeUserName implements Callable { - public static final String USERNAME_CANNOT_BE_CHANGED = - "Username cannot be changed."; + public static final String USERNAME_CANNOT_BE_CHANGED = "Username cannot be changed."; - private static final Pattern USER_NAME_PATTERN = - Pattern.compile(Account.USER_NAME_PATTERN); + private static final Pattern USER_NAME_PATTERN = Pattern.compile(Account.USER_NAME_PATTERN); /** Generic factory to change any user's username. */ public interface Factory { @@ -57,10 +54,11 @@ public class ChangeUserName implements Callable { private final String newUsername; @Inject - ChangeUserName(final AccountCache accountCache, + ChangeUserName( + final AccountCache accountCache, final SshKeyCache sshKeyCache, - - @Assisted final ReviewDb db, @Assisted final IdentifiedUser user, + @Assisted final ReviewDb db, + @Assisted final IdentifiedUser user, @Nullable @Assisted final String newUsername) { this.accountCache = accountCache; this.sshKeyCache = sshKeyCache; @@ -71,8 +69,8 @@ public class ChangeUserName implements Callable { } @Override - public VoidResult call() throws OrmException, NameAlreadyUsedException, - InvalidUserNameException, IOException { + public VoidResult call() + throws OrmException, NameAlreadyUsedException, InvalidUserNameException, IOException { final Collection old = old(); if (!old.isEmpty()) { throw new IllegalStateException(USERNAME_CANNOT_BE_CHANGED); @@ -83,11 +81,9 @@ public class ChangeUserName implements Callable { throw new InvalidUserNameException(); } - final AccountExternalId.Key key = - new AccountExternalId.Key(SCHEME_USERNAME, newUsername); + final AccountExternalId.Key key = new AccountExternalId.Key(SCHEME_USERNAME, newUsername); try { - final AccountExternalId id = - new AccountExternalId(user.getAccountId(), key); + final AccountExternalId id = new AccountExternalId(user.getAccountId(), key); for (AccountExternalId i : old) { if (i.getPassword() != null) { @@ -126,8 +122,7 @@ public class ChangeUserName implements Callable { private Collection old() throws OrmException { final Collection r = new ArrayList<>(1); - for (AccountExternalId i : db.accountExternalIds().byAccount( - user.getAccountId())) { + for (AccountExternalId i : db.accountExternalIds().byAccount(user.getAccountId())) { if (i.isScheme(SCHEME_USERNAME)) { r.add(i); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateAccount.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateAccount.java index b0dea008d2..cf253ff8a9 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateAccount.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateAccount.java @@ -45,19 +45,16 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; - -import org.eclipse.jgit.errors.ConfigInvalidException; - import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; +import org.eclipse.jgit.errors.ConfigInvalidException; @RequiresCapability(GlobalCapability.CREATE_ACCOUNT) -public class CreateAccount - implements RestModifyView { +public class CreateAccount implements RestModifyView { public interface Factory { CreateAccount create(String username); } @@ -76,7 +73,8 @@ public class CreateAccount private final String username; @Inject - CreateAccount(ReviewDb db, + CreateAccount( + ReviewDb db, Provider currentUser, GroupsCollection groupsCollection, VersionedAuthorizedKeys.Accessor authorizedKeys, @@ -104,9 +102,8 @@ public class CreateAccount @Override public Response apply(TopLevelResource rsrc, AccountInput input) - throws BadRequestException, ResourceConflictException, - UnprocessableEntityException, OrmException, IOException, - ConfigInvalidException { + throws BadRequestException, ResourceConflictException, UnprocessableEntityException, + OrmException, IOException, ConfigInvalidException { if (input == null) { input = new AccountInput(); } @@ -115,8 +112,8 @@ public class CreateAccount } if (!username.matches(Account.USER_NAME_PATTERN)) { - throw new BadRequestException("Username '" + username + "'" - + " must contain only letters, numbers, _, - or ."); + throw new BadRequestException( + "Username '" + username + "'" + " must contain only letters, numbers, _, - or ."); } Set groups = parseGroups(input.groups); @@ -124,21 +121,19 @@ public class CreateAccount Account.Id id = new Account.Id(db.nextAccountId()); AccountExternalId extUser = - new AccountExternalId(id, new AccountExternalId.Key( - AccountExternalId.SCHEME_USERNAME, username)); + new AccountExternalId( + id, new AccountExternalId.Key(AccountExternalId.SCHEME_USERNAME, username)); if (input.httpPassword != null) { extUser.setPassword(input.httpPassword); } if (db.accountExternalIds().get(extUser.getKey()) != null) { - throw new ResourceConflictException( - "username '" + username + "' already exists"); + throw new ResourceConflictException("username '" + username + "' already exists"); } if (input.email != null) { if (db.accountExternalIds().get(getEmailKey(input.email)) != null) { - throw new UnprocessableEntityException( - "email '" + input.email + "' already exists"); + throw new UnprocessableEntityException("email '" + input.email + "' already exists"); } if (!OutgoingEmailValidator.isValid(input.email)) { throw new BadRequestException("invalid email address"); @@ -154,13 +149,11 @@ public class CreateAccount try { db.accountExternalIds().insert(externalIds); } catch (OrmDuplicateKeyException duplicateKey) { - throw new ResourceConflictException( - "username '" + username + "' already exists"); + throw new ResourceConflictException("username '" + username + "' already exists"); } if (input.email != null) { - AccountExternalId extMailto = - new AccountExternalId(id, getEmailKey(input.email)); + AccountExternalId extMailto = new AccountExternalId(id, getEmailKey(input.email)); extMailto.setEmailAddress(input.email); try { db.accountExternalIds().insert(Collections.singleton(extMailto)); @@ -170,8 +163,7 @@ public class CreateAccount } catch (OrmException cleanupError) { // Ignored } - throw new UnprocessableEntityException( - "email '" + input.email + "' already exists"); + throw new UnprocessableEntityException("email '" + input.email + "' already exists"); } } @@ -181,10 +173,9 @@ public class CreateAccount db.accounts().insert(Collections.singleton(a)); for (AccountGroup.Id groupId : groups) { - AccountGroupMember m = - new AccountGroupMember(new AccountGroupMember.Key(id, groupId)); - auditService.dispatchAddAccountsToGroup(currentUser.get().getAccountId(), - Collections.singleton(m)); + AccountGroupMember m = new AccountGroupMember(new AccountGroupMember.Key(id, groupId)); + auditService.dispatchAddAccountsToGroup( + currentUser.get().getAccountId(), Collections.singleton(m)); db.accountGroupMembers().insert(Collections.singleton(m)); } @@ -212,8 +203,7 @@ public class CreateAccount Set groupIds = new HashSet<>(); if (groups != null) { for (String g : groups) { - groupIds.add(GroupDescriptions.toAccountGroup( - groupsCollection.parseInternal(g)).getId()); + groupIds.add(GroupDescriptions.toAccountGroup(groupsCollection.parseInternal(g)).getId()); } } return groupIds; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateEmail.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateEmail.java index ecee4b8aa0..8aa356f21f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateEmail.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateEmail.java @@ -36,12 +36,10 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; - +import java.io.IOException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; - public class CreateEmail implements RestModifyView { private static final Logger log = LoggerFactory.getLogger(CreateEmail.class); @@ -58,7 +56,8 @@ public class CreateEmail implements RestModifyView private final boolean isDevMode; @Inject - CreateEmail(Provider self, + CreateEmail( + Provider self, Realm realm, AuthConfig authConfig, AccountManager accountManager, @@ -77,10 +76,9 @@ public class CreateEmail implements RestModifyView @Override public Response apply(AccountResource rsrc, EmailInput input) throws AuthException, BadRequestException, ResourceConflictException, - ResourceNotFoundException, OrmException, EmailException, - MethodNotAllowedException, IOException { - if (self.get() != rsrc.getUser() - && !self.get().getCapabilities().canModifyAccount()) { + ResourceNotFoundException, OrmException, EmailException, MethodNotAllowedException, + IOException { + if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canModifyAccount()) { throw new AuthException("not allowed to add email address"); } @@ -92,8 +90,7 @@ public class CreateEmail implements RestModifyView throw new BadRequestException("invalid email address"); } - if (input.noConfirmation - && !self.get().getCapabilities().canModifyAccount()) { + if (input.noConfirmation && !self.get().getCapabilities().canModifyAccount()) { throw new AuthException("not allowed to use no_confirmation"); } @@ -106,8 +103,8 @@ public class CreateEmail implements RestModifyView public Response apply(IdentifiedUser user, EmailInput input) throws AuthException, BadRequestException, ResourceConflictException, - ResourceNotFoundException, OrmException, EmailException, - MethodNotAllowedException, IOException { + ResourceNotFoundException, OrmException, EmailException, MethodNotAllowedException, + IOException { if (input.email != null && !email.equals(input.email)) { throw new BadRequestException("email address must match URL"); } @@ -119,15 +116,12 @@ public class CreateEmail implements RestModifyView log.warn("skipping email validation in developer mode"); } try { - accountManager.link(user.getAccountId(), - AuthRequest.forEmail(email)); + accountManager.link(user.getAccountId(), AuthRequest.forEmail(email)); } catch (AccountException e) { throw new ResourceConflictException(e.getMessage()); } if (input.preferred) { - putPreferred.apply( - new AccountResource.Email(user, email), - null); + putPreferred.apply(new AccountResource.Email(user, email), null); info.preferred = true; } } else { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateGroupArgs.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateGroupArgs.java index 9ddef3aa16..0c0778c470 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateGroupArgs.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateGroupArgs.java @@ -16,7 +16,6 @@ package com.google.gerrit.server.account; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.AccountGroup; - import java.util.Collection; public class CreateGroupArgs { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/DefaultRealm.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/DefaultRealm.java index 57af333f9d..795f1c5704 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/DefaultRealm.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/DefaultRealm.java @@ -21,7 +21,6 @@ import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.server.config.AuthConfig; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.util.Set; @Singleton @@ -31,9 +30,7 @@ public class DefaultRealm extends AbstractRealm { private final AuthConfig authConfig; @Inject - DefaultRealm(EmailExpander emailExpander, - AccountByEmailCache byEmail, - AuthConfig authConfig) { + DefaultRealm(EmailExpander emailExpander, AccountByEmailCache byEmail, AuthConfig authConfig) { this.emailExpander = emailExpander; this.byEmail = byEmail; this.authConfig = authConfig; @@ -66,7 +63,8 @@ public class DefaultRealm extends AbstractRealm { @Override public AuthRequest authenticate(final AuthRequest who) { - if (who.getEmailAddress() == null && who.getLocalUser() != null + if (who.getEmailAddress() == null + && who.getLocalUser() != null && emailExpander.canExpand(who.getLocalUser())) { who.setEmailAddress(emailExpander.expand(who.getLocalUser())); } @@ -74,8 +72,7 @@ public class DefaultRealm extends AbstractRealm { } @Override - public void onCreateAccount(final AuthRequest who, final Account account) { - } + public void onCreateAccount(final AuthRequest who, final Account account) {} @Override public Account.Id lookup(final String accountName) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteActive.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteActive.java index 94c099e4d1..8710e91c2d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteActive.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteActive.java @@ -29,23 +29,21 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; import java.util.Collections; @RequiresCapability(GlobalCapability.MODIFY_ACCOUNT) @Singleton public class DeleteActive implements RestModifyView { - public static class Input { - } + public static class Input {} private final Provider dbProvider; private final AccountCache byIdCache; private final Provider self; @Inject - DeleteActive(Provider dbProvider, AccountCache byIdCache, - Provider self) { + DeleteActive( + Provider dbProvider, AccountCache byIdCache, Provider self) { this.dbProvider = dbProvider; this.byIdCache = byIdCache; this.self = self; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteEmail.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteEmail.java index 1f073ae465..96c4b8d07f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteEmail.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteEmail.java @@ -30,13 +30,11 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; @Singleton public class DeleteEmail implements RestModifyView { - public static class Input { - } + public static class Input {} private final Provider self; private final Realm realm; @@ -44,8 +42,11 @@ public class DeleteEmail implements RestModifyView private final AccountManager accountManager; @Inject - DeleteEmail(Provider self, Realm realm, - Provider dbProvider, AccountManager accountManager) { + DeleteEmail( + Provider self, + Realm realm, + Provider dbProvider, + AccountManager accountManager) { this.self = self; this.realm = realm; this.dbProvider = dbProvider; @@ -54,31 +55,27 @@ public class DeleteEmail implements RestModifyView @Override public Response apply(AccountResource.Email rsrc, Input input) - throws AuthException, ResourceNotFoundException, - ResourceConflictException, MethodNotAllowedException, OrmException, - IOException { - if (self.get() != rsrc.getUser() - && !self.get().getCapabilities().canModifyAccount()) { + throws AuthException, ResourceNotFoundException, ResourceConflictException, + MethodNotAllowedException, OrmException, IOException { + if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canModifyAccount()) { throw new AuthException("not allowed to delete email address"); } return apply(rsrc.getUser(), rsrc.getEmail()); } public Response apply(IdentifiedUser user, String email) - throws ResourceNotFoundException, ResourceConflictException, - MethodNotAllowedException, OrmException, IOException { + throws ResourceNotFoundException, ResourceConflictException, MethodNotAllowedException, + OrmException, IOException { if (!realm.allowsEdit(AccountFieldName.REGISTER_NEW_EMAIL)) { throw new MethodNotAllowedException("realm does not allow deleting emails"); } - AccountExternalId.Key key = new AccountExternalId.Key( - AccountExternalId.SCHEME_MAILTO, email); + AccountExternalId.Key key = new AccountExternalId.Key(AccountExternalId.SCHEME_MAILTO, email); AccountExternalId extId = dbProvider.get().accountExternalIds().get(key); if (extId == null) { throw new ResourceNotFoundException(email); } try { - accountManager.unlink(user.getAccountId(), - AuthRequest.forEmail(email)); + accountManager.unlink(user.getAccountId(), AuthRequest.forEmail(email)); } catch (AccountException e) { throw new ResourceConflictException(e.getMessage()); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteExternalIds.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteExternalIds.java index cadb3f118c..55e0581588 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteExternalIds.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteExternalIds.java @@ -31,7 +31,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -39,8 +38,7 @@ import java.util.Map; import java.util.stream.Collectors; @Singleton -public class DeleteExternalIds implements - RestModifyView> { +public class DeleteExternalIds implements RestModifyView> { private final Provider db; private final AccountByEmailCache accountByEmailCache; private final AccountCache accountCache; @@ -74,27 +72,29 @@ public class DeleteExternalIds implements Account.Id accountId = resource.getUser().getAccountId(); Map externalIdMap = - db.get().accountExternalIds().byAccount( - resource.getUser().getAccountId()).toList() - .stream().collect(Collectors.toMap(i -> i.getKey(), i -> i)); + db.get() + .accountExternalIds() + .byAccount(resource.getUser().getAccountId()) + .toList() + .stream() + .collect(Collectors.toMap(i -> i.getKey(), i -> i)); List toDelete = new ArrayList<>(); AccountExternalId.Key last = resource.getUser().getLastLoginExternalIdKey(); for (String externalIdStr : externalIds) { - AccountExternalId id = externalIdMap.get( - new AccountExternalId.Key(externalIdStr)); + AccountExternalId id = externalIdMap.get(new AccountExternalId.Key(externalIdStr)); if (id == null) { - throw new UnprocessableEntityException(String.format( - "External id %s does not exist", externalIdStr)); + throw new UnprocessableEntityException( + String.format("External id %s does not exist", externalIdStr)); } if ((!id.isScheme(SCHEME_USERNAME)) && ((last == null) || (!last.get().equals(id.getExternalId())))) { toDelete.add(id); } else { - throw new ResourceConflictException(String.format( - "External id %s cannot be deleted", externalIdStr)); + throw new ResourceConflictException( + String.format("External id %s cannot be deleted", externalIdStr)); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteSshKey.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteSshKey.java index 9212002b38..3d5d38e6d0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteSshKey.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteSshKey.java @@ -24,24 +24,21 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.RepositoryNotFoundException; -import java.io.IOException; - @Singleton -public class DeleteSshKey implements - RestModifyView { - public static class Input { - } +public class DeleteSshKey implements RestModifyView { + public static class Input {} private final Provider self; private final VersionedAuthorizedKeys.Accessor authorizedKeys; private final SshKeyCache sshKeyCache; @Inject - DeleteSshKey(Provider self, + DeleteSshKey( + Provider self, VersionedAuthorizedKeys.Accessor authorizedKeys, SshKeyCache sshKeyCache) { this.self = self; @@ -51,15 +48,13 @@ public class DeleteSshKey implements @Override public Response apply(AccountResource.SshKey rsrc, Input input) - throws AuthException, OrmException, RepositoryNotFoundException, - IOException, ConfigInvalidException { - if (self.get() != rsrc.getUser() - && !self.get().getCapabilities().canAdministrateServer()) { + throws AuthException, OrmException, RepositoryNotFoundException, IOException, + ConfigInvalidException { + if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canAdministrateServer()) { throw new AuthException("not allowed to delete SSH keys"); } - authorizedKeys.deleteKey(rsrc.getUser().getAccountId(), - rsrc.getSshKey().getKey().get()); + authorizedKeys.deleteKey(rsrc.getUser().getAccountId(), rsrc.getSshKey().getKey().get()); sshKeyCache.evict(rsrc.getUser().getUserName()); return Response.none(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteWatchedProjects.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteWatchedProjects.java index 990a563915..b3a99ebeaa 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteWatchedProjects.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteWatchedProjects.java @@ -29,11 +29,9 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.eclipse.jgit.errors.ConfigInvalidException; - import java.io.IOException; import java.util.List; +import org.eclipse.jgit.errors.ConfigInvalidException; @Singleton public class DeleteWatchedProjects @@ -43,9 +41,8 @@ public class DeleteWatchedProjects private final WatchConfig.Accessor watchConfig; @Inject - DeleteWatchedProjects(Provider self, - AccountCache accountCache, - WatchConfig.Accessor watchConfig) { + DeleteWatchedProjects( + Provider self, AccountCache accountCache, WatchConfig.Accessor watchConfig) { this.self = self; this.accountCache = accountCache; this.watchConfig = watchConfig; @@ -53,12 +50,10 @@ public class DeleteWatchedProjects @Override public Response apply(AccountResource rsrc, List input) - throws AuthException, UnprocessableEntityException, OrmException, - IOException, ConfigInvalidException { - if (self.get() != rsrc.getUser() - && !self.get().getCapabilities().canAdministrateServer()) { - throw new AuthException("It is not allowed to edit project watches " - + "of other users"); + throws AuthException, UnprocessableEntityException, OrmException, IOException, + ConfigInvalidException { + if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canAdministrateServer()) { + throw new AuthException("It is not allowed to edit project watches " + "of other users"); } if (input == null) { return Response.none(); @@ -67,8 +62,9 @@ public class DeleteWatchedProjects Account.Id accountId = rsrc.getUser().getAccountId(); watchConfig.deleteProjectWatches( accountId, - input.stream().map(w -> ProjectWatchKey.create( - new Project.NameKey(w.project), w.filter)) + input + .stream() + .map(w -> ProjectWatchKey.create(new Project.NameKey(w.project), w.filter)) .collect(toList())); accountCache.evict(accountId); return Response.none(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/EmailExpander.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/EmailExpander.java index 75408c89bb..3c501e9a80 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/EmailExpander.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/EmailExpander.java @@ -14,10 +14,7 @@ package com.google.gerrit.server.account; - -/** - * Expands user name to a local email address, usually by adding a domain. - */ +/** Expands user name to a local email address, usually by adding a domain. */ public interface EmailExpander { boolean canExpand(String user); @@ -30,8 +27,7 @@ public interface EmailExpander { return fmt == null || fmt.isEmpty(); } - private None() { - } + private None() {} @Override public boolean canExpand(String user) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/Emails.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/Emails.java index 733cf5bd5b..b894f5673b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/Emails.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/Emails.java @@ -28,16 +28,17 @@ import com.google.inject.Provider; import com.google.inject.Singleton; @Singleton -public class Emails implements - ChildCollection, - AcceptsCreate { +public class Emails + implements ChildCollection, + AcceptsCreate { private final DynamicMap> views; private final GetEmails list; private final Provider self; private final CreateEmail.Factory createEmailFactory; @Inject - Emails(DynamicMap> views, + Emails( + DynamicMap> views, GetEmails list, Provider self, CreateEmail.Factory createEmailFactory) { @@ -55,8 +56,7 @@ public class Emails implements @Override public AccountResource.Email parse(AccountResource rsrc, IdString id) throws ResourceNotFoundException { - if (self.get() != rsrc.getUser() - && !self.get().getCapabilities().canAdministrateServer()) { + if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canAdministrateServer()) { throw new ResourceNotFoundException(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GeneralPreferencesLoader.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GeneralPreferencesLoader.java index 24a0dae829..1c44670985 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GeneralPreferencesLoader.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GeneralPreferencesLoader.java @@ -35,7 +35,12 @@ import com.google.gerrit.server.git.GitRepositoryManager; import com.google.gerrit.server.git.UserConfigSections; import com.google.inject.Inject; import com.google.inject.Singleton; - +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.Config; @@ -43,24 +48,15 @@ import org.eclipse.jgit.lib.Repository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - @Singleton public class GeneralPreferencesLoader { - private static final Logger log = - LoggerFactory.getLogger(GeneralPreferencesLoader.class); + private static final Logger log = LoggerFactory.getLogger(GeneralPreferencesLoader.class); private final GitRepositoryManager gitMgr; private final AllUsersName allUsersName; @Inject - public GeneralPreferencesLoader(GitRepositoryManager gitMgr, - AllUsersName allUsersName) { + public GeneralPreferencesLoader(GitRepositoryManager gitMgr, AllUsersName allUsersName) { this.gitMgr = gitMgr; this.allUsersName = allUsersName; } @@ -70,30 +66,37 @@ public class GeneralPreferencesLoader { return read(id, null); } - public GeneralPreferencesInfo merge(Account.Id id, - GeneralPreferencesInfo in) throws IOException, - ConfigInvalidException, RepositoryNotFoundException { + public GeneralPreferencesInfo merge(Account.Id id, GeneralPreferencesInfo in) + throws IOException, ConfigInvalidException, RepositoryNotFoundException { return read(id, in); } - private GeneralPreferencesInfo read(Account.Id id, - GeneralPreferencesInfo in) throws IOException, - ConfigInvalidException, RepositoryNotFoundException { + private GeneralPreferencesInfo read(Account.Id id, GeneralPreferencesInfo in) + throws IOException, ConfigInvalidException, RepositoryNotFoundException { try (Repository allUsers = gitMgr.openRepository(allUsersName)) { // Load all users default prefs VersionedAccountPreferences dp = VersionedAccountPreferences.forDefault(); dp.load(allUsers); GeneralPreferencesInfo allUserPrefs = new GeneralPreferencesInfo(); - loadSection(dp.getConfig(), UserConfigSections.GENERAL, null, allUserPrefs, - GeneralPreferencesInfo.defaults(), in); + loadSection( + dp.getConfig(), + UserConfigSections.GENERAL, + null, + allUserPrefs, + GeneralPreferencesInfo.defaults(), + in); // Load user prefs VersionedAccountPreferences p = VersionedAccountPreferences.forUser(id); p.load(allUsers); GeneralPreferencesInfo r = - loadSection(p.getConfig(), UserConfigSections.GENERAL, null, - new GeneralPreferencesInfo(), - updateDefaults(allUserPrefs), in); + loadSection( + p.getConfig(), + UserConfigSections.GENERAL, + null, + new GeneralPreferencesInfo(), + updateDefaults(allUserPrefs), + in); loadChangeTableColumns(r, p, dp); return loadMyMenusAndUrlAliases(r, p, dp); } @@ -112,9 +115,7 @@ public class GeneralPreferencesLoader { } } } catch (IllegalAccessException e) { - log.error( - "Cannot get default general preferences from " + allUsersName.get(), - e); + log.error("Cannot get default general preferences from " + allUsersName.get(), e); return GeneralPreferencesInfo.defaults(); } return result; @@ -131,8 +132,7 @@ public class GeneralPreferencesLoader { r.my.add(new MenuItem("Drafts", "#/q/owner:self+is:draft", null)); r.my.add(new MenuItem("Draft Comments", "#/q/has:draft", null)); r.my.add(new MenuItem("Edits", "#/q/has:edit", null)); - r.my.add(new MenuItem("Watched Changes", "#/q/is:watched+is:open", - null)); + r.my.add(new MenuItem("Watched Changes", "#/q/is:watched+is:open", null)); r.my.add(new MenuItem("Starred Changes", "#/q/is:starred", null)); r.my.add(new MenuItem("Groups", "#/groups/self", null)); } @@ -149,23 +149,19 @@ public class GeneralPreferencesLoader { Config cfg = v.getConfig(); for (String subsection : cfg.getSubsections(UserConfigSections.MY)) { String url = my(cfg, subsection, KEY_URL, "#/"); - String target = my(cfg, subsection, KEY_TARGET, - url.startsWith("#") ? null : "_blank"); - my.add(new MenuItem( - subsection, url, target, - my(cfg, subsection, KEY_ID, null))); + String target = my(cfg, subsection, KEY_TARGET, url.startsWith("#") ? null : "_blank"); + my.add(new MenuItem(subsection, url, target, my(cfg, subsection, KEY_ID, null))); } return my; } - private static String my(Config cfg, String subsection, String key, - String defaultValue) { + private static String my(Config cfg, String subsection, String key, String defaultValue) { String val = cfg.getString(UserConfigSections.MY, subsection, key); return !Strings.isNullOrEmpty(val) ? val : defaultValue; } - public GeneralPreferencesInfo loadChangeTableColumns(GeneralPreferencesInfo r, - VersionedAccountPreferences v, VersionedAccountPreferences d) { + public GeneralPreferencesInfo loadChangeTableColumns( + GeneralPreferencesInfo r, VersionedAccountPreferences v, VersionedAccountPreferences d) { r.changeTable = changeTable(v); if (r.changeTable.isEmpty() && !v.isDefaults()) { @@ -175,16 +171,16 @@ public class GeneralPreferencesLoader { } private static List changeTable(VersionedAccountPreferences v) { - return Lists.newArrayList(v.getConfig().getStringList( - CHANGE_TABLE, null, CHANGE_TABLE_COLUMN)); + return Lists.newArrayList(v.getConfig().getStringList(CHANGE_TABLE, null, CHANGE_TABLE_COLUMN)); } private static Map urlAliases(VersionedAccountPreferences v) { HashMap urlAliases = new HashMap<>(); Config cfg = v.getConfig(); for (String subsection : cfg.getSubsections(URL_ALIAS)) { - urlAliases.put(cfg.getString(URL_ALIAS, subsection, KEY_MATCH), - cfg.getString(URL_ALIAS, subsection, KEY_TOKEN)); + urlAliases.put( + cfg.getString(URL_ALIAS, subsection, KEY_MATCH), + cfg.getString(URL_ALIAS, subsection, KEY_TOKEN)); } return !urlAliases.isEmpty() ? urlAliases : null; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAgreements.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAgreements.java index 46d6f114ef..dfbde96c50 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAgreements.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAgreements.java @@ -31,19 +31,16 @@ import com.google.gerrit.server.project.ProjectCache; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import org.eclipse.jgit.lib.Config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - @Singleton public class GetAgreements implements RestReadView { - private static final Logger log = - LoggerFactory.getLogger(GetAgreements.class); + private static final Logger log = LoggerFactory.getLogger(GetAgreements.class); private final Provider self; private final ProjectCache projectCache; @@ -51,20 +48,19 @@ public class GetAgreements implements RestReadView { private final boolean agreementsEnabled; @Inject - GetAgreements(Provider self, + GetAgreements( + Provider self, ProjectCache projectCache, AgreementJson agreementJson, @GerritServerConfig Config config) { this.self = self; this.projectCache = projectCache; this.agreementJson = agreementJson; - this.agreementsEnabled = - config.getBoolean("auth", "contributorAgreements", false); + this.agreementsEnabled = config.getBoolean("auth", "contributorAgreements", false); } @Override - public List apply(AccountResource resource) - throws RestApiException { + public List apply(AccountResource resource) throws RestApiException { if (!agreementsEnabled) { throw new MethodNotAllowedException("contributor agreements disabled"); } @@ -88,8 +84,13 @@ public class GetAgreements implements RestReadView { if (rule.getGroup().getUUID() != null) { groupIds.add(rule.getGroup().getUUID()); } else { - log.warn("group \"" + rule.getGroup().getName() + "\" does not " + - "exist, referenced in CLA \"" + ca.getName() + "\""); + log.warn( + "group \"" + + rule.getGroup().getName() + + "\" does not " + + "exist, referenced in CLA \"" + + ca.getName() + + "\""); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAvatar.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAvatar.java index 1953c63195..0818a0ef80 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAvatar.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAvatar.java @@ -22,18 +22,19 @@ import com.google.gerrit.extensions.restapi.Response; import com.google.gerrit.extensions.restapi.RestReadView; import com.google.gerrit.server.avatar.AvatarProvider; import com.google.inject.Inject; - -import org.kohsuke.args4j.Option; - import java.util.concurrent.TimeUnit; +import org.kohsuke.args4j.Option; public class GetAvatar implements RestReadView { private final DynamicItem avatarProvider; private int size; - @Option(name = "--size", aliases = {"-s"}, - usage = "recommended size in pixels, height and width") + @Option( + name = "--size", + aliases = {"-s"}, + usage = "recommended size in pixels, height and width" + ) public void setSize(int s) { size = s; } @@ -44,18 +45,15 @@ public class GetAvatar implements RestReadView { } @Override - public Response.Redirect apply(AccountResource rsrc) - throws ResourceNotFoundException { + public Response.Redirect apply(AccountResource rsrc) throws ResourceNotFoundException { AvatarProvider impl = avatarProvider.get(); if (impl == null) { - throw (new ResourceNotFoundException()) - .caching(CacheControl.PUBLIC(1, TimeUnit.DAYS)); + throw (new ResourceNotFoundException()).caching(CacheControl.PUBLIC(1, TimeUnit.DAYS)); } String url = impl.getUrl(rsrc.getUser(), size); if (Strings.isNullOrEmpty(url)) { - throw (new ResourceNotFoundException()) - .caching(CacheControl.PUBLIC(1, TimeUnit.HOURS)); + throw (new ResourceNotFoundException()).caching(CacheControl.PUBLIC(1, TimeUnit.HOURS)); } return Response.redirect(url); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAvatarChangeUrl.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAvatarChangeUrl.java index ec020fb774..d340772e20 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAvatarChangeUrl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAvatarChangeUrl.java @@ -32,8 +32,7 @@ public class GetAvatarChangeUrl implements RestReadView { } @Override - public String apply(AccountResource rsrc) - throws ResourceNotFoundException { + public String apply(AccountResource rsrc) throws ResourceNotFoundException { AvatarProvider impl = avatarProvider.get(); if (impl == null) { throw new ResourceNotFoundException(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetCapabilities.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetCapabilities.java index cbd0e3244c..cd3c0c81f8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetCapabilities.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetCapabilities.java @@ -49,14 +49,12 @@ import com.google.gson.reflect.TypeToken; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.kohsuke.args4j.Option; - import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; +import org.kohsuke.args4j.Option; class GetCapabilities implements RestReadView { @Option(name = "-q", metaVar = "CAP", usage = "Capability to inspect") @@ -66,22 +64,21 @@ class GetCapabilities implements RestReadView { } Iterables.addAll(query, OptionUtil.splitOptionValue(name)); } + private Set query; private final Provider self; private final DynamicMap pluginCapabilities; @Inject - GetCapabilities(Provider self, - DynamicMap pluginCapabilities) { + GetCapabilities(Provider self, DynamicMap pluginCapabilities) { this.self = self; this.pluginCapabilities = pluginCapabilities; } @Override public Object apply(AccountResource resource) throws AuthException { - if (self.get() != resource.getUser() - && !self.get().getCapabilities().canAdministrateServer()) { + if (self.get() != resource.getUser() && !self.get().getCapabilities().canAdministrateServer()) { throw new AuthException("restricted to administrator"); } @@ -138,9 +135,9 @@ class GetCapabilities implements RestReadView { } } - return OutputFormat.JSON.newGson().toJsonTree( - have, - new TypeToken>() {}.getType()); + return OutputFormat.JSON + .newGson() + .toJsonTree(have, new TypeToken>() {}.getType()); } private boolean want(String name) { @@ -149,8 +146,10 @@ class GetCapabilities implements RestReadView { private static class Range { private transient PermissionRange range; + @SuppressWarnings("unused") private int min; + @SuppressWarnings("unused") private int max; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetDetail.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetDetail.java index e47ceb3fc6..9eafec00ad 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetDetail.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetDetail.java @@ -23,7 +23,6 @@ import com.google.gerrit.server.account.AccountDirectory.FillOptions; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.sql.Timestamp; import java.util.Collections; import java.util.EnumSet; @@ -44,8 +43,7 @@ public class GetDetail implements RestReadView { AccountDetailInfo info = new AccountDetailInfo(a.getId().get()); info.registeredOn = a.getRegisteredOn(); try { - directory.fillAccountInfo(Collections.singleton(info), - EnumSet.allOf(FillOptions.class)); + directory.fillAccountInfo(Collections.singleton(info), EnumSet.allOf(FillOptions.class)); } catch (DirectoryException e) { Throwables.throwIfInstanceOf(e.getCause(), OrmException.class); throw new OrmException(e); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetDiffPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetDiffPreferences.java index 2c4a840ff4..5a39bea5fe 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetDiffPreferences.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetDiffPreferences.java @@ -28,27 +28,25 @@ import com.google.gerrit.server.git.UserConfigSections; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; +import java.lang.reflect.Field; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.Repository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.lang.reflect.Field; - @Singleton public class GetDiffPreferences implements RestReadView { - private static final Logger log = - LoggerFactory.getLogger(GetDiffPreferences.class); + private static final Logger log = LoggerFactory.getLogger(GetDiffPreferences.class); private final Provider self; private final Provider allUsersName; private final GitRepositoryManager gitMgr; @Inject - GetDiffPreferences(Provider self, + GetDiffPreferences( + Provider self, Provider allUsersName, GitRepositoryManager gitMgr) { this.self = self; @@ -59,8 +57,7 @@ public class GetDiffPreferences implements RestReadView { @Override public DiffPreferencesInfo apply(AccountResource rsrc) throws AuthException, ConfigInvalidException, IOException { - if (self.get() != rsrc.getUser() - && !self.get().getCapabilities().canAdministrateServer()) { + if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canAdministrateServer()) { throw new AuthException("restricted to administrator"); } @@ -68,26 +65,28 @@ public class GetDiffPreferences implements RestReadView { return readFromGit(id, gitMgr, allUsersName.get(), null); } - static DiffPreferencesInfo readFromGit(Account.Id id, - GitRepositoryManager gitMgr, AllUsersName allUsersName, - DiffPreferencesInfo in) + static DiffPreferencesInfo readFromGit( + Account.Id id, GitRepositoryManager gitMgr, AllUsersName allUsersName, DiffPreferencesInfo in) throws IOException, ConfigInvalidException, RepositoryNotFoundException { try (Repository git = gitMgr.openRepository(allUsersName)) { // Load all users prefs. - VersionedAccountPreferences dp = - VersionedAccountPreferences.forDefault(); + VersionedAccountPreferences dp = VersionedAccountPreferences.forDefault(); dp.load(git); DiffPreferencesInfo allUserPrefs = new DiffPreferencesInfo(); - loadSection(dp.getConfig(), UserConfigSections.DIFF, null, allUserPrefs, - DiffPreferencesInfo.defaults(), in); + loadSection( + dp.getConfig(), + UserConfigSections.DIFF, + null, + allUserPrefs, + DiffPreferencesInfo.defaults(), + in); // Load user prefs - VersionedAccountPreferences p = - VersionedAccountPreferences.forUser(id); + VersionedAccountPreferences p = VersionedAccountPreferences.forUser(id); p.load(git); DiffPreferencesInfo prefs = new DiffPreferencesInfo(); - loadSection(p.getConfig(), UserConfigSections.DIFF, null, prefs, - updateDefaults(allUserPrefs), in); + loadSection( + p.getConfig(), UserConfigSections.DIFF, null, prefs, updateDefaults(allUserPrefs), in); return prefs; } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetEditPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetEditPreferences.java index 02cfaa08f9..e385020182 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetEditPreferences.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetEditPreferences.java @@ -27,13 +27,11 @@ import com.google.gerrit.server.git.UserConfigSections; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.Repository; -import java.io.IOException; - @Singleton public class GetEditPreferences implements RestReadView { private final Provider self; @@ -41,37 +39,37 @@ public class GetEditPreferences implements RestReadView { private final GitRepositoryManager gitMgr; @Inject - GetEditPreferences(Provider self, - AllUsersName allUsersName, - GitRepositoryManager gitMgr) { + GetEditPreferences( + Provider self, AllUsersName allUsersName, GitRepositoryManager gitMgr) { this.self = self; this.allUsersName = allUsersName; this.gitMgr = gitMgr; } @Override - public EditPreferencesInfo apply(AccountResource rsrc) throws AuthException, - IOException, ConfigInvalidException { - if (self.get() != rsrc.getUser() - && !self.get().getCapabilities().canModifyAccount()) { + public EditPreferencesInfo apply(AccountResource rsrc) + throws AuthException, IOException, ConfigInvalidException { + if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canModifyAccount()) { throw new AuthException("requires Modify Account capability"); } - return readFromGit( - rsrc.getUser().getAccountId(), gitMgr, allUsersName, null); + return readFromGit(rsrc.getUser().getAccountId(), gitMgr, allUsersName, null); } - static EditPreferencesInfo readFromGit(Account.Id id, - GitRepositoryManager gitMgr, AllUsersName allUsersName, - EditPreferencesInfo in) throws IOException, ConfigInvalidException, - RepositoryNotFoundException { + static EditPreferencesInfo readFromGit( + Account.Id id, GitRepositoryManager gitMgr, AllUsersName allUsersName, EditPreferencesInfo in) + throws IOException, ConfigInvalidException, RepositoryNotFoundException { try (Repository git = gitMgr.openRepository(allUsersName)) { - VersionedAccountPreferences p = - VersionedAccountPreferences.forUser(id); + VersionedAccountPreferences p = VersionedAccountPreferences.forUser(id); p.load(git); - return loadSection(p.getConfig(), UserConfigSections.EDIT, null, - new EditPreferencesInfo(), EditPreferencesInfo.defaults(), in); + return loadSection( + p.getConfig(), + UserConfigSections.EDIT, + null, + new EditPreferencesInfo(), + EditPreferencesInfo.defaults(), + in); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetEmail.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetEmail.java index 6763578b7c..edc2592056 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetEmail.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetEmail.java @@ -22,8 +22,7 @@ import com.google.inject.Singleton; @Singleton public class GetEmail implements RestReadView { @Inject - public GetEmail() { - } + public GetEmail() {} @Override public EmailInfo apply(AccountResource.Email rsrc) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetEmails.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetEmails.java index 14cc74ea27..5d4fd9d470 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetEmails.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetEmails.java @@ -16,7 +16,6 @@ package com.google.gerrit.server.account; import com.google.gerrit.extensions.restapi.RestReadView; import com.google.inject.Singleton; - import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -36,12 +35,14 @@ public class GetEmails implements RestReadView { emails.add(e); } } - Collections.sort(emails, new Comparator() { - @Override - public int compare(EmailInfo a, EmailInfo b) { - return a.email.compareTo(b.email); - } - }); + Collections.sort( + emails, + new Comparator() { + @Override + public int compare(EmailInfo a, EmailInfo b) { + return a.email.compareTo(b.email); + } + }); return emails; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetExternalIds.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetExternalIds.java index 0b3674c90d..e215c9bdef 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetExternalIds.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetExternalIds.java @@ -30,7 +30,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.util.Collection; import java.util.Collections; import java.util.List; @@ -42,9 +41,7 @@ public class GetExternalIds implements RestReadView { private final AuthConfig authConfig; @Inject - GetExternalIds(Provider db, - Provider self, - AuthConfig authConfig) { + GetExternalIds(Provider db, Provider self, AuthConfig authConfig) { this.db = db; this.self = self; this.authConfig = authConfig; @@ -57,27 +54,23 @@ public class GetExternalIds implements RestReadView { throw new AuthException("not allowed to get external IDs"); } - Collection ids = db.get().accountExternalIds() - .byAccount(resource.getUser().getAccountId()).toList(); + Collection ids = + db.get().accountExternalIds().byAccount(resource.getUser().getAccountId()).toList(); if (ids.isEmpty()) { return ImmutableList.of(); } - List result = - Lists.newArrayListWithCapacity(ids.size()); + List result = Lists.newArrayListWithCapacity(ids.size()); for (AccountExternalId id : ids) { AccountExternalIdInfo info = new AccountExternalIdInfo(); info.identity = id.getExternalId(); info.emailAddress = id.getEmailAddress(); - info.trusted = - toBoolean(authConfig.isIdentityTrustable(Collections.singleton(id))); + info.trusted = toBoolean(authConfig.isIdentityTrustable(Collections.singleton(id))); // The identity can be deleted only if its not the one used to // establish this web session, and if only if an identity was // actually used to establish this web session. if (!id.isScheme(SCHEME_USERNAME)) { - AccountExternalId.Key last = resource.getUser() - .getLastLoginExternalIdKey(); - info.canDelete = - toBoolean(last == null || !last.get().equals(info.identity)); + AccountExternalId.Key last = resource.getUser().getLastLoginExternalIdKey(); + info.canDelete = toBoolean(last == null || !last.get().equals(info.identity)); } result.add(info); } @@ -88,4 +81,3 @@ public class GetExternalIds implements RestReadView { return v ? v : null; } } - diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetGroups.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetGroups.java index 5b71e0b9cc..757cb44d8c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetGroups.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetGroups.java @@ -24,7 +24,6 @@ import com.google.gerrit.server.group.GroupJson; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.util.ArrayList; import java.util.List; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetHttpPassword.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetHttpPassword.java index c49ab98937..135cdf69a1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetHttpPassword.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetHttpPassword.java @@ -33,10 +33,8 @@ public class GetHttpPassword implements RestReadView { } @Override - public String apply(AccountResource rsrc) throws AuthException, - ResourceNotFoundException { - if (self.get() != rsrc.getUser() - && !self.get().getCapabilities().canAdministrateServer()) { + public String apply(AccountResource rsrc) throws AuthException, ResourceNotFoundException { + if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canAdministrateServer()) { throw new AuthException("not allowed to get http password"); } AccountState s = rsrc.getUser().state(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetOAuthToken.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetOAuthToken.java index 5d343c45d8..8df8c6bbc7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetOAuthToken.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetOAuthToken.java @@ -25,12 +25,11 @@ import com.google.gerrit.server.config.CanonicalWebUrl; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.net.URI; import java.net.URISyntaxException; @Singleton -class GetOAuthToken implements RestReadView{ +class GetOAuthToken implements RestReadView { private static final String BEARER_TYPE = "bearer"; @@ -39,7 +38,8 @@ class GetOAuthToken implements RestReadView{ private final String hostName; @Inject - GetOAuthToken(Provider self, + GetOAuthToken( + Provider self, OAuthTokenCache tokenCache, @CanonicalWebUrl Provider urlProvider) { this.self = self; @@ -48,8 +48,8 @@ class GetOAuthToken implements RestReadView{ } @Override - public OAuthTokenInfo apply(AccountResource rsrc) throws AuthException, - ResourceNotFoundException { + public OAuthTokenInfo apply(AccountResource rsrc) + throws AuthException, ResourceNotFoundException { if (self.get() != rsrc.getUser()) { throw new AuthException("not allowed to get access token"); } @@ -84,5 +84,4 @@ class GetOAuthToken implements RestReadView{ public String expiresAt; public String type; } - } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetPreferences.java index 3e83f4c19c..77cdbd451d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetPreferences.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetPreferences.java @@ -29,17 +29,14 @@ public class GetPreferences implements RestReadView { private final AccountCache accountCache; @Inject - GetPreferences(Provider self, - AccountCache accountCache) { + GetPreferences(Provider self, AccountCache accountCache) { this.self = self; this.accountCache = accountCache; } @Override - public GeneralPreferencesInfo apply(AccountResource rsrc) - throws AuthException { - if (self.get() != rsrc.getUser() - && !self.get().getCapabilities().canModifyAccount()) { + public GeneralPreferencesInfo apply(AccountResource rsrc) throws AuthException { + if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canModifyAccount()) { throw new AuthException("requires Modify Account capability"); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetSshKeys.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetSshKeys.java index df125e05bb..980d880173 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetSshKeys.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetSshKeys.java @@ -26,12 +26,10 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.errors.RepositoryNotFoundException; - import java.io.IOException; import java.util.List; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.errors.RepositoryNotFoundException; @Singleton public class GetSshKeys implements RestReadView { @@ -40,18 +38,16 @@ public class GetSshKeys implements RestReadView { private final VersionedAuthorizedKeys.Accessor authorizedKeys; @Inject - GetSshKeys(Provider self, - VersionedAuthorizedKeys.Accessor authorizedKeys) { + GetSshKeys(Provider self, VersionedAuthorizedKeys.Accessor authorizedKeys) { this.self = self; this.authorizedKeys = authorizedKeys; } @Override public List apply(AccountResource rsrc) - throws AuthException, OrmException, RepositoryNotFoundException, - IOException, ConfigInvalidException { - if (self.get() != rsrc.getUser() - && !self.get().getCapabilities().canModifyAccount()) { + throws AuthException, OrmException, RepositoryNotFoundException, IOException, + ConfigInvalidException { + if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canModifyAccount()) { throw new AuthException("not allowed to get SSH keys"); } return apply(rsrc.getUser()); @@ -59,9 +55,7 @@ public class GetSshKeys implements RestReadView { public List apply(IdentifiedUser user) throws RepositoryNotFoundException, IOException, ConfigInvalidException { - return Lists.transform( - authorizedKeys.getKeys(user.getAccountId()), - GetSshKeys::newSshKeyInfo); + return Lists.transform(authorizedKeys.getKeys(user.getAccountId()), GetSshKeys::newSshKeyInfo); } public static SshKeyInfo newSshKeyInfo(AccountSshKey sshKey) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetUsername.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetUsername.java index a5f271d53e..6541f559e5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetUsername.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetUsername.java @@ -23,12 +23,10 @@ import com.google.inject.Singleton; @Singleton public class GetUsername implements RestReadView { @Inject - public GetUsername() { - } + public GetUsername() {} @Override - public String apply(AccountResource rsrc) throws AuthException, - ResourceNotFoundException { + public String apply(AccountResource rsrc) throws AuthException, ResourceNotFoundException { String username = rsrc.getUser().getAccount().getUserName(); if (username == null) { throw new ResourceNotFoundException(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetWatchedProjects.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetWatchedProjects.java index 61600f4e5f..f61704ab7f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetWatchedProjects.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetWatchedProjects.java @@ -27,9 +27,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.eclipse.jgit.errors.ConfigInvalidException; - import java.io.IOException; import java.util.ArrayList; import java.util.Collections; @@ -37,6 +34,7 @@ import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Set; +import org.eclipse.jgit.errors.ConfigInvalidException; @Singleton public class GetWatchedProjects implements RestReadView { @@ -45,8 +43,7 @@ public class GetWatchedProjects implements RestReadView { private final WatchConfig.Accessor watchConfig; @Inject - public GetWatchedProjects(Provider self, - WatchConfig.Accessor watchConfig) { + public GetWatchedProjects(Provider self, WatchConfig.Accessor watchConfig) { this.self = self; this.watchConfig = watchConfig; } @@ -54,40 +51,34 @@ public class GetWatchedProjects implements RestReadView { @Override public List apply(AccountResource rsrc) throws OrmException, AuthException, IOException, ConfigInvalidException { - if (self.get() != rsrc.getUser() - && !self.get().getCapabilities().canAdministrateServer()) { - throw new AuthException("It is not allowed to list project watches " - + "of other users"); + if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canAdministrateServer()) { + throw new AuthException("It is not allowed to list project watches " + "of other users"); } Account.Id accountId = rsrc.getUser().getAccountId(); List projectWatchInfos = new ArrayList<>(); - for (Map.Entry> e : watchConfig - .getProjectWatches(accountId).entrySet()) { + for (Map.Entry> e : + watchConfig.getProjectWatches(accountId).entrySet()) { ProjectWatchInfo pwi = new ProjectWatchInfo(); pwi.filter = e.getKey().filter(); pwi.project = e.getKey().project().get(); - pwi.notifyAbandonedChanges = - toBoolean(e.getValue().contains(NotifyType.ABANDONED_CHANGES)); - pwi.notifyNewChanges = - toBoolean(e.getValue().contains(NotifyType.NEW_CHANGES)); - pwi.notifyNewPatchSets = - toBoolean(e.getValue().contains(NotifyType.NEW_PATCHSETS)); - pwi.notifySubmittedChanges = - toBoolean(e.getValue().contains(NotifyType.SUBMITTED_CHANGES)); - pwi.notifyAllComments = - toBoolean(e.getValue().contains(NotifyType.ALL_COMMENTS)); + pwi.notifyAbandonedChanges = toBoolean(e.getValue().contains(NotifyType.ABANDONED_CHANGES)); + pwi.notifyNewChanges = toBoolean(e.getValue().contains(NotifyType.NEW_CHANGES)); + pwi.notifyNewPatchSets = toBoolean(e.getValue().contains(NotifyType.NEW_PATCHSETS)); + pwi.notifySubmittedChanges = toBoolean(e.getValue().contains(NotifyType.SUBMITTED_CHANGES)); + pwi.notifyAllComments = toBoolean(e.getValue().contains(NotifyType.ALL_COMMENTS)); projectWatchInfos.add(pwi); } - Collections.sort(projectWatchInfos, new Comparator() { - @Override - public int compare(ProjectWatchInfo pwi1, ProjectWatchInfo pwi2) { - return ComparisonChain.start() - .compare(pwi1.project, pwi2.project) - .compare(Strings.nullToEmpty(pwi1.filter), - Strings.nullToEmpty(pwi2.filter)) - .result(); - } - }); + Collections.sort( + projectWatchInfos, + new Comparator() { + @Override + public int compare(ProjectWatchInfo pwi1, ProjectWatchInfo pwi2) { + return ComparisonChain.start() + .compare(pwi1.project, pwi2.project) + .compare(Strings.nullToEmpty(pwi1.filter), Strings.nullToEmpty(pwi2.filter)) + .result(); + } + }); return projectWatchInfos; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupBackend.java index c65f6d6abd..bf71732afb 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupBackend.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupBackend.java @@ -21,21 +21,16 @@ import com.google.gerrit.extensions.annotations.ExtensionPoint; import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.project.ProjectControl; - import java.util.Collection; -/** - * Implementations of GroupBackend provide lookup and membership accessors - * to a group system. - */ +/** Implementations of GroupBackend provide lookup and membership accessors to a group system. */ @ExtensionPoint public interface GroupBackend { /** @return {@code true} if the backend can operate on the UUID. */ boolean handles(AccountGroup.UUID uuid); /** - * Looks up a group in the backend. If the group does not exist, null is - * returned. + * Looks up a group in the backend. If the group does not exist, null is returned. * * @param uuid the group identifier * @return the group @@ -44,16 +39,11 @@ public interface GroupBackend { GroupDescription.Basic get(AccountGroup.UUID uuid); /** @return suggestions for the group name sorted by name. */ - Collection suggest( - String name, - @Nullable ProjectControl project); + Collection suggest(String name, @Nullable ProjectControl project); /** @return the group membership checker for the backend. */ GroupMembership membershipsOf(IdentifiedUser user); - /** - * @return {@code true} if the group with the given UUID is visible to all - * registered users. - */ + /** @return {@code true} if the group with the given UUID is visible to all registered users. */ boolean isVisibleToAll(AccountGroup.UUID uuid); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupBackends.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupBackends.java index 69ca1e9351..e02995475d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupBackends.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupBackends.java @@ -18,40 +18,36 @@ import com.google.common.collect.Iterables; import com.google.gerrit.common.Nullable; import com.google.gerrit.common.data.GroupReference; import com.google.gerrit.server.project.ProjectControl; - import java.util.Collection; import java.util.Comparator; -/** - * Utility class for dealing with a GroupBackend. - */ +/** Utility class for dealing with a GroupBackend. */ public class GroupBackends { public static final Comparator GROUP_REF_NAME_COMPARATOR = new Comparator() { - @Override - public int compare(GroupReference a, GroupReference b) { - return a.getName().compareTo(b.getName()); - } - }; + @Override + public int compare(GroupReference a, GroupReference b) { + return a.getName().compareTo(b.getName()); + } + }; /** - * Runs {@link GroupBackend#suggest(String, ProjectControl)} and filters the - * result to return the best suggestion, or null if one does not exist. + * Runs {@link GroupBackend#suggest(String, ProjectControl)} and filters the result to return the + * best suggestion, or null if one does not exist. * * @param groupBackend the group backend * @param name the name for which to suggest groups * @return the best single GroupReference suggestion */ @Nullable - public static GroupReference findBestSuggestion(GroupBackend groupBackend, - String name) { + public static GroupReference findBestSuggestion(GroupBackend groupBackend, String name) { return findBestSuggestion(groupBackend, name, null); } /** - * Runs {@link GroupBackend#suggest(String, ProjectControl)} and filters the - * result to return the best suggestion, or null if one does not exist. + * Runs {@link GroupBackend#suggest(String, ProjectControl)} and filters the result to return the + * best suggestion, or null if one does not exist. * * @param groupBackend the group backend * @param name the name for which to suggest groups @@ -59,8 +55,8 @@ public class GroupBackends { * @return the best single GroupReference suggestion */ @Nullable - public static GroupReference findBestSuggestion(GroupBackend groupBackend, - String name, @Nullable ProjectControl project) { + public static GroupReference findBestSuggestion( + GroupBackend groupBackend, String name, @Nullable ProjectControl project) { Collection refs = groupBackend.suggest(name, project); if (refs.size() == 1) { return Iterables.getOnlyElement(refs); @@ -75,22 +71,21 @@ public class GroupBackends { } /** - * Runs {@link GroupBackend#suggest(String, ProjectControl)} and filters the - * result to return the exact suggestion, or null if one does not exist. + * Runs {@link GroupBackend#suggest(String, ProjectControl)} and filters the result to return the + * exact suggestion, or null if one does not exist. * * @param groupBackend the group backend * @param name the name for which to suggest groups * @return the exact single GroupReference suggestion */ @Nullable - public static GroupReference findExactSuggestion( - GroupBackend groupBackend, String name) { + public static GroupReference findExactSuggestion(GroupBackend groupBackend, String name) { return findExactSuggestion(groupBackend, name, null); } /** - * Runs {@link GroupBackend#suggest(String, ProjectControl)} and filters the - * result to return the exact suggestion, or null if one does not exist. + * Runs {@link GroupBackend#suggest(String, ProjectControl)} and filters the result to return the + * exact suggestion, or null if one does not exist. * * @param groupBackend the group backend * @param name the name for which to suggest groups @@ -114,6 +109,5 @@ public class GroupBackends { return ref.getName().equalsIgnoreCase(name) || ref.getUUID().get().equals(name); } - private GroupBackends() { - } + private GroupBackends() {} } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCache.java index 3214b35acc..8e30a243ec 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCache.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCache.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.account; import com.google.common.collect.ImmutableList; import com.google.gerrit.common.Nullable; import com.google.gerrit.reviewdb.client.AccountGroup; - import java.io.IOException; /** Tracks group objects in memory for efficient access. */ @@ -27,9 +26,8 @@ public interface GroupCache { AccountGroup get(AccountGroup.NameKey name); /** - * Lookup a group definition by its UUID. The returned definition may be null - * if the group has been deleted and the UUID reference is stale, or was - * copied from another server. + * Lookup a group definition by its UUID. The returned definition may be null if the group has + * been deleted and the UUID reference is stale, or was copied from another server. */ @Nullable AccountGroup get(AccountGroup.UUID uuid); @@ -42,6 +40,6 @@ public interface GroupCache { void evict(AccountGroup group) throws IOException; - void evictAfterRename(AccountGroup.NameKey oldName, - AccountGroup.NameKey newName) throws IOException; + void evictAfterRename(AccountGroup.NameKey oldName, AccountGroup.NameKey newName) + throws IOException; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCacheImpl.java index a920c22385..5c8e3e9f3c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCacheImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCacheImpl.java @@ -31,20 +31,17 @@ import com.google.inject.Provider; import com.google.inject.Singleton; import com.google.inject.TypeLiteral; import com.google.inject.name.Named; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.util.List; import java.util.Optional; import java.util.concurrent.ExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** Tracks group objects in memory for efficient access. */ @Singleton public class GroupCacheImpl implements GroupCache { - private static final Logger log = LoggerFactory - .getLogger(GroupCacheImpl.class); + private static final Logger log = LoggerFactory.getLogger(GroupCacheImpl.class); private static final String BYID_NAME = "groups"; private static final String BYNAME_NAME = "groups_byname"; @@ -54,20 +51,14 @@ public class GroupCacheImpl implements GroupCache { return new CacheModule() { @Override protected void configure() { - cache(BYID_NAME, - AccountGroup.Id.class, - new TypeLiteral>() {}) - .loader(ByIdLoader.class); + cache(BYID_NAME, AccountGroup.Id.class, new TypeLiteral>() {}) + .loader(ByIdLoader.class); - cache(BYNAME_NAME, - String.class, - new TypeLiteral>() {}) - .loader(ByNameLoader.class); + cache(BYNAME_NAME, String.class, new TypeLiteral>() {}) + .loader(ByNameLoader.class); - cache(BYUUID_NAME, - String.class, - new TypeLiteral>() {}) - .loader(ByUUIDLoader.class); + cache(BYUUID_NAME, String.class, new TypeLiteral>() {}) + .loader(ByUUIDLoader.class); bind(GroupCacheImpl.class); bind(GroupCache.class).to(GroupCacheImpl.class); @@ -121,8 +112,8 @@ public class GroupCacheImpl implements GroupCache { } @Override - public void evictAfterRename(final AccountGroup.NameKey oldName, - final AccountGroup.NameKey newName) throws IOException { + public void evictAfterRename( + final AccountGroup.NameKey oldName, final AccountGroup.NameKey newName) throws IOException { if (oldName != null) { byName.invalidate(oldName.get()); } @@ -169,8 +160,7 @@ public class GroupCacheImpl implements GroupCache { } @Override - public void onCreateGroup(AccountGroup.NameKey newGroupName) - throws IOException { + public void onCreateGroup(AccountGroup.NameKey newGroupName) throws IOException { byName.invalidate(newGroupName.get()); indexer.get().index(get(newGroupName).getGroupUUID()); } @@ -180,8 +170,7 @@ public class GroupCacheImpl implements GroupCache { return new AccountGroup(name, key, null); } - static class ByIdLoader extends - CacheLoader> { + static class ByIdLoader extends CacheLoader> { private final SchemaFactory schema; @Inject @@ -190,8 +179,7 @@ public class GroupCacheImpl implements GroupCache { } @Override - public Optional load(final AccountGroup.Id key) - throws Exception { + public Optional load(final AccountGroup.Id key) throws Exception { try (ReviewDb db = schema.open()) { return Optional.ofNullable(db.accountGroups().get(key)); } @@ -207,8 +195,7 @@ public class GroupCacheImpl implements GroupCache { } @Override - public Optional load(String name) - throws Exception { + public Optional load(String name) throws Exception { try (ReviewDb db = schema.open()) { AccountGroup.NameKey key = new AccountGroup.NameKey(name); AccountGroupName r = db.accountGroupNames().get(key); @@ -229,8 +216,7 @@ public class GroupCacheImpl implements GroupCache { } @Override - public Optional load(String uuid) - throws Exception { + public Optional load(String uuid) throws Exception { try (ReviewDb db = schema.open()) { List r; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupComparator.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupComparator.java index 13800b52f1..4bab3a7559 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupComparator.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupComparator.java @@ -15,7 +15,6 @@ package com.google.gerrit.server.account; import com.google.gerrit.reviewdb.client.AccountGroup; - import java.util.Comparator; public class GroupComparator implements Comparator { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupControl.java index 2e039136af..ee788ec6ff 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupControl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupControl.java @@ -36,8 +36,7 @@ public class GroupControl { groupBackend = gb; } - public GroupControl controlFor(final CurrentUser who, - final AccountGroup.UUID groupId) + public GroupControl controlFor(final CurrentUser who, final AccountGroup.UUID groupId) throws NoSuchGroupException { final GroupDescription.Basic group = groupBackend.get(groupId); if (group == null) { @@ -53,15 +52,13 @@ public class GroupControl { private final GroupBackend groupBackend; @Inject - Factory(final GroupCache gc, final Provider cu, - final GroupBackend gb) { + Factory(final GroupCache gc, final Provider cu, final GroupBackend gb) { groupCache = gc; user = cu; groupBackend = gb; } - public GroupControl controlFor(final AccountGroup.Id groupId) - throws NoSuchGroupException { + public GroupControl controlFor(final AccountGroup.Id groupId) throws NoSuchGroupException { final AccountGroup group = groupCache.get(groupId); if (group == null) { throw new NoSuchGroupException(groupId); @@ -69,8 +66,7 @@ public class GroupControl { return controlFor(GroupDescriptions.forAccountGroup(group)); } - public GroupControl controlFor(final AccountGroup.UUID groupId) - throws NoSuchGroupException { + public GroupControl controlFor(final AccountGroup.UUID groupId) throws NoSuchGroupException { final GroupDescription.Basic group = groupBackend.get(groupId); if (group == null) { throw new NoSuchGroupException(groupId); @@ -86,8 +82,7 @@ public class GroupControl { return new GroupControl(user.get(), group, groupBackend); } - public GroupControl validateFor(final AccountGroup.Id groupId) - throws NoSuchGroupException { + public GroupControl validateFor(final AccountGroup.Id groupId) throws NoSuchGroupException { final GroupControl c = controlFor(groupId); if (!c.isVisible()) { throw new NoSuchGroupException(groupId); @@ -95,8 +90,7 @@ public class GroupControl { return c; } - public GroupControl validateFor(final AccountGroup.UUID groupUUID) - throws NoSuchGroupException { + public GroupControl validateFor(final AccountGroup.UUID groupUUID) throws NoSuchGroupException { final GroupControl c = controlFor(groupUUID); if (!c.isVisible()) { throw new NoSuchGroupException(groupUUID); @@ -112,7 +106,7 @@ public class GroupControl { GroupControl(CurrentUser who, GroupDescription.Basic gd, GroupBackend gb) { user = who; - group = gd; + group = gd; groupBackend = gb; } @@ -131,10 +125,10 @@ public class GroupControl { * server administrators. */ return user.isInternalUser() - || groupBackend.isVisibleToAll(group.getGroupUUID()) - || user.getEffectiveGroups().contains(group.getGroupUUID()) - || user.getCapabilities().canAdministrateServer() - || isOwner(); + || groupBackend.isVisibleToAll(group.getGroupUUID()) + || user.getEffectiveGroups().contains(group.getGroupUUID()) + || user.getCapabilities().canAdministrateServer() + || isOwner(); } public boolean isOwner() { @@ -143,8 +137,9 @@ public class GroupControl { isOwner = false; } else if (isOwner == null) { AccountGroup.UUID ownerUUID = accountGroup.getOwnerGroupUUID(); - isOwner = getUser().getEffectiveGroups().contains(ownerUUID) - || getUser().getCapabilities().canAdministrateServer(); + isOwner = + getUser().getEffectiveGroups().contains(ownerUUID) + || getUser().getCapabilities().canAdministrateServer(); } return isOwner; } @@ -178,7 +173,6 @@ public class GroupControl { private boolean canSeeMembers() { AccountGroup accountGroup = GroupDescriptions.toAccountGroup(group); - return (accountGroup != null && accountGroup.isVisibleToAll()) - || isOwner(); + return (accountGroup != null && accountGroup.isVisibleToAll()) || isOwner(); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupDetailFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupDetailFactory.java index 5f1840f602..fb7d7e7463 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupDetailFactory.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupDetailFactory.java @@ -23,7 +23,6 @@ import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; @@ -41,7 +40,8 @@ public class GroupDetailFactory implements Callable { private GroupControl control; @Inject - GroupDetailFactory(ReviewDb db, + GroupDetailFactory( + ReviewDb db, GroupControl.Factory groupControl, GroupCache groupCache, @Assisted AccountGroup.Id groupId) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupIncludeCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupIncludeCache.java index 0d1fd20ecd..c702aef030 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupIncludeCache.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupIncludeCache.java @@ -15,7 +15,6 @@ package com.google.gerrit.server.account; import com.google.gerrit.reviewdb.client.AccountGroup; - import java.util.Collection; /** Tracks group inclusions in memory for efficient access. */ @@ -30,5 +29,6 @@ public interface GroupIncludeCache { Collection allExternalMembers(); void evictSubgroupsOf(AccountGroup.UUID groupId); + void evictParentGroupsOf(AccountGroup.UUID groupId); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupIncludeCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupIncludeCacheImpl.java index 02889bf9b4..1c9baf846a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupIncludeCacheImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupIncludeCacheImpl.java @@ -28,22 +28,19 @@ import com.google.inject.Module; import com.google.inject.Singleton; import com.google.inject.TypeLiteral; import com.google.inject.name.Named; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.concurrent.ExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** Tracks group inclusions in memory for efficient access. */ @Singleton public class GroupIncludeCacheImpl implements GroupIncludeCache { - private static final Logger log = LoggerFactory - .getLogger(GroupIncludeCacheImpl.class); + private static final Logger log = LoggerFactory.getLogger(GroupIncludeCacheImpl.class); private static final String PARENT_GROUPS_NAME = "groups_byinclude"; private static final String SUBGROUPS_NAME = "groups_members"; private static final String EXTERNAL_NAME = "groups_external"; @@ -52,20 +49,20 @@ public class GroupIncludeCacheImpl implements GroupIncludeCache { return new CacheModule() { @Override protected void configure() { - cache(PARENT_GROUPS_NAME, - AccountGroup.UUID.class, - new TypeLiteral>() {}) - .loader(ParentGroupsLoader.class); + cache( + PARENT_GROUPS_NAME, + AccountGroup.UUID.class, + new TypeLiteral>() {}) + .loader(ParentGroupsLoader.class); - cache(SUBGROUPS_NAME, - AccountGroup.UUID.class, - new TypeLiteral>() {}) - .loader(SubgroupsLoader.class); + cache( + SUBGROUPS_NAME, + AccountGroup.UUID.class, + new TypeLiteral>() {}) + .loader(SubgroupsLoader.class); - cache(EXTERNAL_NAME, - String.class, - new TypeLiteral>() {}) - .loader(AllExternalLoader.class); + cache(EXTERNAL_NAME, String.class, new TypeLiteral>() {}) + .loader(AllExternalLoader.class); bind(GroupIncludeCacheImpl.class); bind(GroupIncludeCache.class).to(GroupIncludeCacheImpl.class); @@ -73,24 +70,17 @@ public class GroupIncludeCacheImpl implements GroupIncludeCache { }; } - private final - LoadingCache> - subgroups; - private final - LoadingCache> - parentGroups; + private final LoadingCache> subgroups; + private final LoadingCache> parentGroups; private final LoadingCache> external; @Inject GroupIncludeCacheImpl( @Named(SUBGROUPS_NAME) - LoadingCache> - subgroups, + LoadingCache> subgroups, @Named(PARENT_GROUPS_NAME) - LoadingCache> - parentGroups, - @Named(EXTERNAL_NAME) - LoadingCache> external) { + LoadingCache> parentGroups, + @Named(EXTERNAL_NAME) LoadingCache> external) { this.subgroups = subgroups; this.parentGroups = parentGroups; this.external = external; @@ -107,8 +97,7 @@ public class GroupIncludeCacheImpl implements GroupIncludeCache { } @Override - public Collection parentGroupsOf( - AccountGroup.UUID groupId) { + public Collection parentGroupsOf(AccountGroup.UUID groupId) { try { return parentGroups.get(groupId); } catch (ExecutionException e) { @@ -145,8 +134,8 @@ public class GroupIncludeCacheImpl implements GroupIncludeCache { } } - static class SubgroupsLoader extends - CacheLoader> { + static class SubgroupsLoader + extends CacheLoader> { private final SchemaFactory schema; @Inject @@ -155,8 +144,7 @@ public class GroupIncludeCacheImpl implements GroupIncludeCache { } @Override - public ImmutableList load( - AccountGroup.UUID key) throws OrmException { + public ImmutableList load(AccountGroup.UUID key) throws OrmException { try (ReviewDb db = schema.open()) { List group = db.accountGroups().byUUID(key).toList(); if (group.size() != 1) { @@ -164,8 +152,7 @@ public class GroupIncludeCacheImpl implements GroupIncludeCache { } Set ids = new HashSet<>(); - for (AccountGroupById agi : db.accountGroupById() - .byGroup(group.get(0).getId())) { + for (AccountGroupById agi : db.accountGroupById().byGroup(group.get(0).getId())) { ids.add(agi.getIncludeUUID()); } return ImmutableList.copyOf(ids); @@ -173,8 +160,8 @@ public class GroupIncludeCacheImpl implements GroupIncludeCache { } } - static class ParentGroupsLoader extends - CacheLoader> { + static class ParentGroupsLoader + extends CacheLoader> { private final SchemaFactory schema; @Inject @@ -183,12 +170,10 @@ public class GroupIncludeCacheImpl implements GroupIncludeCache { } @Override - public ImmutableList load(AccountGroup.UUID key) - throws OrmException { + public ImmutableList load(AccountGroup.UUID key) throws OrmException { try (ReviewDb db = schema.open()) { Set ids = new HashSet<>(); - for (AccountGroupById agi : db.accountGroupById() - .byIncludeUUID(key)) { + for (AccountGroupById agi : db.accountGroupById().byIncludeUUID(key)) { ids.add(agi.getGroupId()); } @@ -201,8 +186,7 @@ public class GroupIncludeCacheImpl implements GroupIncludeCache { } } - static class AllExternalLoader extends - CacheLoader> { + static class AllExternalLoader extends CacheLoader> { private final SchemaFactory schema; @Inject diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupMembers.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupMembers.java index 61f13d60c4..ea99b9bae1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupMembers.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupMembers.java @@ -28,7 +28,6 @@ import com.google.gerrit.server.project.ProjectControl; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - import java.io.IOException; import java.util.Collections; import java.util.HashSet; @@ -46,7 +45,8 @@ public class GroupMembers { private final CurrentUser currentUser; @Inject - GroupMembers(final GroupCache groupCache, + GroupMembers( + final GroupCache groupCache, final GroupDetailFactory.Factory groupDetailFactory, final AccountCache accountCache, final ProjectControl.GenericFactory projectControl, @@ -58,14 +58,15 @@ public class GroupMembers { this.currentUser = currentUser; } - public Set listAccounts(final AccountGroup.UUID groupUUID, - final Project.NameKey project) throws NoSuchGroupException, - NoSuchProjectException, OrmException, IOException { + public Set listAccounts(final AccountGroup.UUID groupUUID, final Project.NameKey project) + throws NoSuchGroupException, NoSuchProjectException, OrmException, IOException { return listAccounts(groupUUID, project, new HashSet()); } - private Set listAccounts(final AccountGroup.UUID groupUUID, - final Project.NameKey project, final Set seen) + private Set listAccounts( + final AccountGroup.UUID groupUUID, + final Project.NameKey project, + final Set seen) throws NoSuchGroupException, OrmException, NoSuchProjectException, IOException { if (SystemGroupBackend.PROJECT_OWNERS.equals(groupUUID)) { return getProjectOwners(project, seen); @@ -77,17 +78,16 @@ public class GroupMembers { return Collections.emptySet(); } - private Set getProjectOwners(final Project.NameKey project, - final Set seen) throws NoSuchProjectException, - NoSuchGroupException, OrmException, IOException { + private Set getProjectOwners( + final Project.NameKey project, final Set seen) + throws NoSuchProjectException, NoSuchGroupException, OrmException, IOException { seen.add(SystemGroupBackend.PROJECT_OWNERS); if (project == null) { return Collections.emptySet(); } final Iterable ownerGroups = - projectControl.controlFor(project, currentUser).getProjectState() - .getAllOwners(); + projectControl.controlFor(project, currentUser).getProjectState().getAllOwners(); final HashSet projectOwners = new HashSet<>(); for (final AccountGroup.UUID ownerGroup : ownerGroups) { @@ -98,12 +98,11 @@ public class GroupMembers { return projectOwners; } - private Set getGroupMembers(final AccountGroup group, - final Project.NameKey project, final Set seen) + private Set getGroupMembers( + final AccountGroup group, final Project.NameKey project, final Set seen) throws NoSuchGroupException, OrmException, NoSuchProjectException, IOException { seen.add(group.getGroupUUID()); - final GroupDetail groupDetail = - groupDetailFactory.create(group.getId()).call(); + final GroupDetail groupDetail = groupDetailFactory.create(group.getId()).call(); final Set members = new HashSet<>(); if (groupDetail.members != null) { @@ -113,8 +112,7 @@ public class GroupMembers { } if (groupDetail.includes != null) { for (final AccountGroupById groupInclude : groupDetail.includes) { - final AccountGroup includedGroup = - groupCache.get(groupInclude.getIncludeUUID()); + final AccountGroup includedGroup = groupCache.get(groupInclude.getIncludeUUID()); if (includedGroup != null && !seen.contains(includedGroup.getGroupUUID())) { members.addAll(listAccounts(includedGroup.getGroupUUID(), project, seen)); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupMembership.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupMembership.java index c45b7b7f10..59b992ab3d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupMembership.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupMembership.java @@ -15,35 +15,33 @@ package com.google.gerrit.server.account; import com.google.gerrit.reviewdb.client.AccountGroup; - import java.util.Collections; import java.util.Set; /** - * Implementations of GroupMembership provide methods to test - * the presence of a user in a particular group. + * Implementations of GroupMembership provide methods to test the presence of a user in a particular + * group. */ public interface GroupMembership { - GroupMembership EMPTY = - new ListGroupMembership(Collections.emptySet()); + GroupMembership EMPTY = new ListGroupMembership(Collections.emptySet()); /** - * Returns {@code true} when the user this object was created for is a member - * of the specified group. + * Returns {@code true} when the user this object was created for is a member of the specified + * group. */ boolean contains(AccountGroup.UUID groupId); /** - * Returns {@code true} when the user this object was created for is a member - * of any of the specified group. + * Returns {@code true} when the user this object was created for is a member of any of the + * specified group. */ boolean containsAnyOf(Iterable groupIds); /** * Returns a set containing an input member of {@code contains(id)} is true. - *

- * This is batch form of contains that returns specific group information. - * Implementors may implement the method as: + * + *

This is batch form of contains that returns specific group information. Implementors may + * implement the method as: * *

    * Set<AccountGroup.UUID> r = new HashSet<>();
@@ -54,11 +52,10 @@ public interface GroupMembership {
   Set intersection(Iterable groupIds);
 
   /**
-   * Returns the set of groups that can be determined by the implementation.
-   * This may not return all groups the {@link #contains(AccountGroup.UUID)}
-   * would return {@code true} for, but will at least contain all top level
-   * groups. This restriction stems from the API of some group systems, which
-   * make it expensive to enumerate the members of a group.
+   * Returns the set of groups that can be determined by the implementation. This may not return all
+   * groups the {@link #contains(AccountGroup.UUID)} would return {@code true} for, but will at
+   * least contain all top level groups. This restriction stems from the API of some group systems,
+   * which make it expensive to enumerate the members of a group.
    */
   Set getKnownGroups();
 }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupUUID.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupUUID.java
index b871c685b6..45c7052e39 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupUUID.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupUUID.java
@@ -15,13 +15,11 @@
 package com.google.gerrit.server.account;
 
 import com.google.gerrit.reviewdb.client.AccountGroup;
-
+import java.security.MessageDigest;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.PersonIdent;
 
-import java.security.MessageDigest;
-
 public class GroupUUID {
   public static AccountGroup.UUID make(String groupName, PersonIdent creator) {
     MessageDigest md = Constants.newMessageDigest();
@@ -30,6 +28,5 @@ public class GroupUUID {
     return new AccountGroup.UUID(ObjectId.fromRaw(md.digest()).name());
   }
 
-  private GroupUUID() {
-  }
+  private GroupUUID() {}
 }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/IncludingGroupMembership.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/IncludingGroupMembership.java
index f38d0714e7..70801c3f47 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/IncludingGroupMembership.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/IncludingGroupMembership.java
@@ -21,7 +21,6 @@ import com.google.gerrit.reviewdb.client.AccountGroup;
 import com.google.gerrit.server.IdentifiedUser;
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
-
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -30,12 +29,11 @@ import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * Group membership checker for the internal group system.
- * 

- * Groups the user is directly a member of are pulled from the in-memory - * AccountCache by way of the IdentifiedUser. Transitive group memberhips are - * resolved on demand starting from the requested group and looking for a path - * to a group the user is a member of. Other group backends are supported by - * recursively invoking the universal GroupMembership. + * + *

Groups the user is directly a member of are pulled from the in-memory AccountCache by way of + * the IdentifiedUser. Transitive group memberhips are resolved on demand starting from the + * requested group and looking for a path to a group the user is a member of. Other group backends + * are supported by recursively invoking the universal GroupMembership. */ public class IncludingGroupMembership implements GroupMembership { public interface Factory { @@ -48,8 +46,7 @@ public class IncludingGroupMembership implements GroupMembership { private Set knownGroups; @Inject - IncludingGroupMembership(GroupIncludeCache includeCache, - @Assisted IdentifiedUser user) { + IncludingGroupMembership(GroupIncludeCache includeCache, @Assisted IdentifiedUser user) { this.includeCache = includeCache; this.user = user; @@ -123,8 +120,7 @@ public class IncludingGroupMembership implements GroupMembership { r.remove(null); List q = Lists.newArrayList(r); - for (AccountGroup.UUID g : membership.intersection( - includeCache.allExternalMembers())) { + for (AccountGroup.UUID g : membership.intersection(includeCache.allExternalMembers())) { if (g != null && r.add(g)) { q.add(g); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/Index.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/Index.java index 53b0467477..6943dca47e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/Index.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/Index.java @@ -22,29 +22,24 @@ import com.google.gerrit.server.account.Index.Input; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; @Singleton public class Index implements RestModifyView { - public static class Input { - } + public static class Input {} private final AccountCache accountCache; private final Provider self; @Inject - Index(AccountCache accountCache, - Provider self) { + Index(AccountCache accountCache, Provider self) { this.accountCache = accountCache; this.self = self; } @Override - public Response apply(AccountResource rsrc, Input input) - throws IOException, AuthException { - if (self.get() != rsrc.getUser() - && !self.get().getCapabilities().canModifyAccount()) { + public Response apply(AccountResource rsrc, Input input) throws IOException, AuthException { + if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canModifyAccount()) { throw new AuthException("not allowed to index account"); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/InternalAccountDirectory.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/InternalAccountDirectory.java index d18babf4da..88eb8fa6d4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/InternalAccountDirectory.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/InternalAccountDirectory.java @@ -26,7 +26,6 @@ import com.google.gerrit.server.avatar.AvatarProvider; import com.google.inject.AbstractModule; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -36,8 +35,7 @@ import java.util.Set; @Singleton public class InternalAccountDirectory extends AccountDirectory { - static final Set ID_ONLY = - Collections.unmodifiableSet(EnumSet.of(FillOptions.ID)); + static final Set ID_ONLY = Collections.unmodifiableSet(EnumSet.of(FillOptions.ID)); public static class Module extends AbstractModule { @Override @@ -51,7 +49,8 @@ public class InternalAccountDirectory extends AccountDirectory { private final IdentifiedUser.GenericFactory userFactory; @Inject - InternalAccountDirectory(AccountCache accountCache, + InternalAccountDirectory( + AccountCache accountCache, DynamicItem avatar, IdentifiedUser.GenericFactory userFactory) { this.accountCache = accountCache; @@ -60,9 +59,7 @@ public class InternalAccountDirectory extends AccountDirectory { } @Override - public void fillAccountInfo( - Iterable in, - Set options) + public void fillAccountInfo(Iterable in, Set options) throws DirectoryException { if (options.equals(ID_ONLY)) { return; @@ -74,7 +71,8 @@ public class InternalAccountDirectory extends AccountDirectory { } } - private void fill(AccountInfo info, + private void fill( + AccountInfo info, Account account, @Nullable Collection externalIds, Set options) { @@ -94,14 +92,10 @@ public class InternalAccountDirectory extends AccountDirectory { info.email = account.getPreferredEmail(); } if (options.contains(FillOptions.SECONDARY_EMAILS)) { - info.secondaryEmails = externalIds != null - ? getSecondaryEmails(account, externalIds) - : null; + info.secondaryEmails = externalIds != null ? getSecondaryEmails(account, externalIds) : null; } if (options.contains(FillOptions.USERNAME)) { - info.username = externalIds != null - ? AccountState.getUserName(externalIds) - : null; + info.username = externalIds != null ? AccountState.getUserName(externalIds) : null; } if (options.contains(FillOptions.STATUS)) { @@ -130,8 +124,8 @@ public class InternalAccountDirectory extends AccountDirectory { } } - public List getSecondaryEmails(Account account, - Collection externalIds) { + public List getSecondaryEmails( + Account account, Collection externalIds) { List emails = new ArrayList<>(AccountState.getEmails(externalIds)); if (account.getPreferredEmail() != null) { emails.remove(account.getPreferredEmail()); @@ -141,10 +135,7 @@ public class InternalAccountDirectory extends AccountDirectory { } private static void addAvatar( - AvatarProvider provider, - AccountInfo account, - IdentifiedUser user, - int size) { + AvatarProvider provider, AccountInfo account, IdentifiedUser user, int size) { String url = provider.getUrl(user, size); if (url != null) { AvatarInfo avatar = new AvatarInfo(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/InternalGroupBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/InternalGroupBackend.java index 2028654fbf..b0ada0df44 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/InternalGroupBackend.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/InternalGroupBackend.java @@ -24,10 +24,8 @@ import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.project.ProjectControl; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.ObjectId; - import java.util.Collection; +import org.eclipse.jgit.lib.ObjectId; /** Implementation of GroupBackend for the internal group system. */ @Singleton @@ -37,7 +35,8 @@ public class InternalGroupBackend implements GroupBackend { private final IncludingGroupMembership.Factory groupMembershipFactory; @Inject - InternalGroupBackend(GroupControl.Factory groupControlFactory, + InternalGroupBackend( + GroupControl.Factory groupControlFactory, GroupCache groupCache, IncludingGroupMembership.Factory groupMembershipFactory) { this.groupControlFactory = groupControlFactory; @@ -65,13 +64,15 @@ public class InternalGroupBackend implements GroupBackend { } @Override - public Collection suggest(final String name, - final ProjectControl project) { - return groupCache.all().stream() - .filter(group -> - // startsWithIgnoreCase && isVisible - group.getName().regionMatches(true, 0, name, 0, name.length()) - && groupControlFactory.controlFor(group).isVisible()) + public Collection suggest(final String name, final ProjectControl project) { + return groupCache + .all() + .stream() + .filter( + group -> + // startsWithIgnoreCase && isVisible + group.getName().regionMatches(true, 0, name, 0, name.length()) + && groupControlFactory.controlFor(group).isVisible()) .map(GroupReference::forGroup) .collect(toList()); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/ListGroupMembership.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/ListGroupMembership.java index 118940f9bf..60e73454fc 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/ListGroupMembership.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/ListGroupMembership.java @@ -17,12 +17,9 @@ package com.google.gerrit.server.account; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; import com.google.gerrit.reviewdb.client.AccountGroup; - import java.util.Set; -/** - * GroupMembership over an explicit list. - */ +/** GroupMembership over an explicit list. */ public class ListGroupMembership implements GroupMembership { private final Set groups; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/Module.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/Module.java index c78008ddd6..0080e34c19 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/Module.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/Module.java @@ -63,8 +63,7 @@ public class Module extends RestApiModule { post(ACCOUNT_KIND, "sshkeys").to(AddSshKey.class); get(ACCOUNT_KIND, "watched.projects").to(GetWatchedProjects.class); post(ACCOUNT_KIND, "watched.projects").to(PostWatchedProjects.class); - post(ACCOUNT_KIND, "watched.projects:delete") - .to(DeleteWatchedProjects.class); + post(ACCOUNT_KIND, "watched.projects:delete").to(DeleteWatchedProjects.class); get(SSH_KEY_KIND).to(GetSshKey.class); delete(SSH_KEY_KIND).to(DeleteSshKey.class); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/PostWatchedProjects.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/PostWatchedProjects.java index 92fe837465..55ba912dcc 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/PostWatchedProjects.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/PostWatchedProjects.java @@ -29,15 +29,13 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.eclipse.jgit.errors.ConfigInvalidException; - import java.io.IOException; import java.util.EnumSet; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import org.eclipse.jgit.errors.ConfigInvalidException; @Singleton public class PostWatchedProjects @@ -49,7 +47,8 @@ public class PostWatchedProjects private final WatchConfig.Accessor watchConfig; @Inject - public PostWatchedProjects(Provider self, + public PostWatchedProjects( + Provider self, GetWatchedProjects getWatchedProjects, ProjectsCollection projectsCollection, AccountCache accountCache, @@ -62,11 +61,9 @@ public class PostWatchedProjects } @Override - public List apply(AccountResource rsrc, - List input) throws OrmException, RestApiException, - IOException, ConfigInvalidException { - if (self.get() != rsrc.getUser() - && !self.get().getCapabilities().canAdministrateServer()) { + public List apply(AccountResource rsrc, List input) + throws OrmException, RestApiException, IOException, ConfigInvalidException { + if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canAdministrateServer()) { throw new AuthException("not allowed to edit project watches"); } Account.Id accountId = rsrc.getUser().getAccountId(); @@ -75,17 +72,16 @@ public class PostWatchedProjects return getWatchedProjects.apply(rsrc); } - private Map> asMap( - List input) throws BadRequestException, - UnprocessableEntityException, IOException { + private Map> asMap(List input) + throws BadRequestException, UnprocessableEntityException, IOException { Map> m = new HashMap<>(); for (ProjectWatchInfo info : input) { if (info.project == null) { throw new BadRequestException("project name must be specified"); } - ProjectWatchKey key = ProjectWatchKey.create( - projectsCollection.parse(info.project).getNameKey(), info.filter); + ProjectWatchKey key = + ProjectWatchKey.create(projectsCollection.parse(info.project).getNameKey(), info.filter); if (m.containsKey(key)) { throw new BadRequestException( "duplicate entry for project " + format(info.project, info.filter)); @@ -119,8 +115,6 @@ public class PostWatchedProjects private static String format(String project, String filter) { return project - + (filter != null && !WatchConfig.FILTER_ALL.equals(filter) - ? " and filter " + filter - : ""); + + (filter != null && !WatchConfig.FILTER_ALL.equals(filter) ? " and filter " + filter : ""); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutAccount.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutAccount.java index 239b954608..da5a58fe76 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutAccount.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutAccount.java @@ -22,8 +22,7 @@ import com.google.gerrit.extensions.restapi.RestModifyView; import com.google.inject.Singleton; @Singleton -public class PutAccount - implements RestModifyView { +public class PutAccount implements RestModifyView { @Override public Response apply(AccountResource resource, AccountInput input) throws ResourceConflictException { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutActive.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutActive.java index 8cc134f921..cbddefdc9a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutActive.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutActive.java @@ -26,15 +26,13 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; import java.util.Collections; @RequiresCapability(GlobalCapability.MODIFY_ACCOUNT) @Singleton public class PutActive implements RestModifyView { - public static class Input { - } + public static class Input {} private final Provider dbProvider; private final AccountCache byIdCache; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutAgreement.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutAgreement.java index b8b902fc15..423d5a1be5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutAgreement.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutAgreement.java @@ -37,14 +37,11 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; import org.eclipse.jgit.lib.Config; -import java.io.IOException; - @Singleton -public class PutAgreement - implements RestModifyView { +public class PutAgreement implements RestModifyView { private final ProjectCache projectCache; private final GroupCache groupCache; private final Provider self; @@ -53,7 +50,8 @@ public class PutAgreement private final boolean agreementsEnabled; @Inject - PutAgreement(ProjectCache projectCache, + PutAgreement( + ProjectCache projectCache, GroupCache groupCache, Provider self, AgreementSignup agreementSignup, @@ -64,8 +62,7 @@ public class PutAgreement this.self = self; this.agreementSignup = agreementSignup; this.addMembers = addMembers; - this.agreementsEnabled = - config.getBoolean("auth", "contributorAgreements", false); + this.agreementsEnabled = config.getBoolean("auth", "contributorAgreements", false); } @Override @@ -80,8 +77,8 @@ public class PutAgreement } String agreementName = Strings.nullToEmpty(input.name); - ContributorAgreement ca = projectCache.getAllProjects().getConfig() - .getContributorAgreement(agreementName); + ContributorAgreement ca = + projectCache.getAllProjects().getConfig().getContributorAgreement(agreementName); if (ca == null) { throw new UnprocessableEntityException("contributor agreement not found"); } @@ -106,5 +103,4 @@ public class PutAgreement return Response.ok(agreementName); } - } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutHttpPassword.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutHttpPassword.java index 0cd93f1ea8..311c12b7f2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutHttpPassword.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutHttpPassword.java @@ -31,13 +31,11 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.apache.commons.codec.binary.Base64; - import java.io.IOException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Collections; +import org.apache.commons.codec.binary.Base64; @Singleton public class PutHttpPassword implements RestModifyView { @@ -62,8 +60,8 @@ public class PutHttpPassword implements RestModifyView { private final AccountCache accountCache; @Inject - PutHttpPassword(Provider self, Provider dbProvider, - AccountCache accountCache) { + PutHttpPassword( + Provider self, Provider dbProvider, AccountCache accountCache) { this.self = self; this.dbProvider = dbProvider; this.accountCache = accountCache; @@ -71,8 +69,8 @@ public class PutHttpPassword implements RestModifyView { @Override public Response apply(AccountResource rsrc, Input input) - throws AuthException, ResourceNotFoundException, - ResourceConflictException, OrmException, IOException { + throws AuthException, ResourceNotFoundException, ResourceConflictException, OrmException, + IOException { if (input == null) { input = new Input(); } @@ -80,22 +78,21 @@ public class PutHttpPassword implements RestModifyView { String newPassword; if (input.generate) { - if (self.get() != rsrc.getUser() - && !self.get().getCapabilities().canAdministrateServer()) { + if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canAdministrateServer()) { throw new AuthException("not allowed to generate HTTP password"); } newPassword = generate(); } else if (input.httpPassword == null) { - if (self.get() != rsrc.getUser() - && !self.get().getCapabilities().canAdministrateServer()) { + if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canAdministrateServer()) { throw new AuthException("not allowed to clear HTTP password"); } newPassword = null; } else { if (!self.get().getCapabilities().canAdministrateServer()) { - throw new AuthException("not allowed to set HTTP password directly, " - + "requires the Administrate Server permission"); + throw new AuthException( + "not allowed to set HTTP password directly, " + + "requires the Administrate Server permission"); } newPassword = input.httpPassword; } @@ -103,15 +100,16 @@ public class PutHttpPassword implements RestModifyView { } public Response apply(IdentifiedUser user, String newPassword) - throws ResourceNotFoundException, ResourceConflictException, OrmException, - IOException { + throws ResourceNotFoundException, ResourceConflictException, OrmException, IOException { if (user.getUserName() == null) { throw new ResourceConflictException("username must be set"); } - AccountExternalId id = dbProvider.get().accountExternalIds() - .get(new AccountExternalId.Key( - SCHEME_USERNAME, user.getUserName())); + AccountExternalId id = + dbProvider + .get() + .accountExternalIds() + .get(new AccountExternalId.Key(SCHEME_USERNAME, user.getUserName())); if (id == null) { throw new ResourceNotFoundException(); } @@ -119,9 +117,7 @@ public class PutHttpPassword implements RestModifyView { dbProvider.get().accountExternalIds().update(Collections.singleton(id)); accountCache.evict(user.getAccountId()); - return Strings.isNullOrEmpty(newPassword) - ? Response.none() - : Response.ok(newPassword); + return Strings.isNullOrEmpty(newPassword) ? Response.none() : Response.ok(newPassword); } public static String generate() { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutName.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutName.java index 74c07e8e5a..726508f8d4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutName.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutName.java @@ -31,15 +31,13 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; import java.util.Collections; @Singleton public class PutName implements RestModifyView { public static class Input { - @DefaultInput - public String name; + @DefaultInput public String name; } private final Provider self; @@ -48,8 +46,11 @@ public class PutName implements RestModifyView { private final AccountCache byIdCache; @Inject - PutName(Provider self, Realm realm, - Provider dbProvider, AccountCache byIdCache) { + PutName( + Provider self, + Realm realm, + Provider dbProvider, + AccountCache byIdCache) { this.self = self; this.realm = realm; this.dbProvider = dbProvider; @@ -58,18 +59,16 @@ public class PutName implements RestModifyView { @Override public Response apply(AccountResource rsrc, Input input) - throws AuthException, MethodNotAllowedException, - ResourceNotFoundException, OrmException, IOException { - if (self.get() != rsrc.getUser() - && !self.get().getCapabilities().canModifyAccount()) { + throws AuthException, MethodNotAllowedException, ResourceNotFoundException, OrmException, + IOException { + if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canModifyAccount()) { throw new AuthException("not allowed to change name"); } return apply(rsrc.getUser(), input); } public Response apply(IdentifiedUser user, Input input) - throws MethodNotAllowedException, ResourceNotFoundException, OrmException, - IOException { + throws MethodNotAllowedException, ResourceNotFoundException, OrmException, IOException { if (input == null) { input = new Input(); } @@ -86,7 +85,7 @@ public class PutName implements RestModifyView { dbProvider.get().accounts().update(Collections.singleton(a)); byIdCache.evict(a.getId()); return Strings.isNullOrEmpty(a.getFullName()) - ? Response. none() + ? Response.none() : Response.ok(a.getFullName()); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutPreferred.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutPreferred.java index 92357b5cf8..3c80d2cd9d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutPreferred.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutPreferred.java @@ -27,23 +27,19 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; import java.util.Collections; @Singleton -public class PutPreferred implements - RestModifyView { - static class Input { - } +public class PutPreferred implements RestModifyView { + static class Input {} private final Provider self; private final Provider dbProvider; private final AccountCache byIdCache; @Inject - PutPreferred(Provider self, Provider dbProvider, - AccountCache byIdCache) { + PutPreferred(Provider self, Provider dbProvider, AccountCache byIdCache) { this.self = self; this.dbProvider = dbProvider; this.byIdCache = byIdCache; @@ -51,10 +47,8 @@ public class PutPreferred implements @Override public Response apply(AccountResource.Email rsrc, Input input) - throws AuthException, ResourceNotFoundException, OrmException, - IOException { - if (self.get() != rsrc.getUser() - && !self.get().getCapabilities().canModifyAccount()) { + throws AuthException, ResourceNotFoundException, OrmException, IOException { + if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canModifyAccount()) { throw new AuthException("not allowed to set preferred email address"); } return apply(rsrc.getUser(), rsrc.getEmail()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutStatus.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutStatus.java index c61c356d4e..d82689970d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutStatus.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutStatus.java @@ -29,22 +29,19 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; import java.util.Collections; @Singleton public class PutStatus implements RestModifyView { public static class Input { - @DefaultInput - String status; + @DefaultInput String status; public Input(String status) { this.status = status; } - public Input() { - } + public Input() {} } private final Provider self; @@ -52,8 +49,7 @@ public class PutStatus implements RestModifyView { private final AccountCache byIdCache; @Inject - PutStatus(Provider self, Provider dbProvider, - AccountCache byIdCache) { + PutStatus(Provider self, Provider dbProvider, AccountCache byIdCache) { this.self = self; this.dbProvider = dbProvider; this.byIdCache = byIdCache; @@ -61,18 +57,15 @@ public class PutStatus implements RestModifyView { @Override public Response apply(AccountResource rsrc, Input input) - throws AuthException, - ResourceNotFoundException, OrmException, IOException { - if (self.get() != rsrc.getUser() - && !self.get().getCapabilities().canModifyAccount()) { + throws AuthException, ResourceNotFoundException, OrmException, IOException { + if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canModifyAccount()) { throw new AuthException("not allowed to set status"); } return apply(rsrc.getUser(), input); } public Response apply(IdentifiedUser user, Input input) - throws ResourceNotFoundException, OrmException, - IOException { + throws ResourceNotFoundException, OrmException, IOException { if (input == null) { input = new Input(); } @@ -84,8 +77,6 @@ public class PutStatus implements RestModifyView { a.setStatus(Strings.nullToEmpty(input.status)); dbProvider.get().accounts().update(Collections.singleton(a)); byIdCache.evict(a.getId()); - return Strings.isNullOrEmpty(a.getStatus()) - ? Response.none() - : Response.ok(a.getStatus()); + return Strings.isNullOrEmpty(a.getStatus()) ? Response.none() : Response.ok(a.getStatus()); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutUsername.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutUsername.java index 29168edc22..9be57d9781 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutUsername.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutUsername.java @@ -29,14 +29,12 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; @Singleton public class PutUsername implements RestModifyView { public static class Input { - @DefaultInput - public String username; + @DefaultInput public String username; } private final Provider self; @@ -45,7 +43,8 @@ public class PutUsername implements RestModifyView { private final Provider db; @Inject - PutUsername(Provider self, + PutUsername( + Provider self, ChangeUserName.Factory changeUserNameFactory, Realm realm, Provider db) { @@ -56,11 +55,10 @@ public class PutUsername implements RestModifyView { } @Override - public String apply(AccountResource rsrc, Input input) throws AuthException, - MethodNotAllowedException, UnprocessableEntityException, - ResourceConflictException, OrmException, IOException { - if (self.get() != rsrc.getUser() - && !self.get().getCapabilities().canAdministrateServer()) { + public String apply(AccountResource rsrc, Input input) + throws AuthException, MethodNotAllowedException, UnprocessableEntityException, + ResourceConflictException, OrmException, IOException { + if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canAdministrateServer()) { throw new AuthException("not allowed to set username"); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/QueryAccounts.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/QueryAccounts.java index cef829f38a..a8e6dc046d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/QueryAccounts.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/QueryAccounts.java @@ -33,16 +33,14 @@ import com.google.gerrit.server.query.account.AccountQueryBuilder; import com.google.gerrit.server.query.account.AccountQueryProcessor; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - -import org.eclipse.jgit.lib.Config; -import org.kohsuke.args4j.Option; - import java.util.Collections; import java.util.EnumSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; +import org.eclipse.jgit.lib.Config; +import org.kohsuke.args4j.Option; public class QueryAccounts implements RestReadView { private static final int MAX_SUGGEST_RESULTS = 100; @@ -65,7 +63,12 @@ public class QueryAccounts implements RestReadView { this.suggest = suggest; } - @Option(name = "--limit", aliases = {"-n"}, metaVar = "CNT", usage = "maximum number of users to return") + @Option( + name = "--limit", + aliases = {"-n"}, + metaVar = "CNT", + usage = "maximum number of users to return" + ) public void setLimit(int n) { queryProcessor.setLimit(n); @@ -88,19 +91,29 @@ public class QueryAccounts implements RestReadView { options.addAll(ListAccountsOption.fromBits(Integer.parseInt(hex, 16))); } - @Option(name = "--query", aliases = {"-q"}, metaVar = "QUERY", usage = "match users") + @Option( + name = "--query", + aliases = {"-q"}, + metaVar = "QUERY", + usage = "match users" + ) public void setQuery(String query) { this.query = query; } - @Option(name = "--start", aliases = {"-S"}, metaVar = "CNT", - usage = "Number of accounts to skip") + @Option( + name = "--start", + aliases = {"-S"}, + metaVar = "CNT", + usage = "Number of accounts to skip" + ) public void setStart(int start) { this.start = start; } @Inject - QueryAccounts(AccountLoader.Factory accountLoaderFactory, + QueryAccounts( + AccountLoader.Factory accountLoaderFactory, AccountQueryBuilder queryBuilder, AccountQueryProcessor queryProcessor, @GerritServerConfig Config cfg) { @@ -115,8 +128,7 @@ public class QueryAccounts implements RestReadView { } else { boolean suggest; try { - AccountVisibility av = - cfg.getEnum("suggest", null, "accounts", AccountVisibility.ALL); + AccountVisibility av = cfg.getEnum("suggest", null, "accounts", AccountVisibility.ALL); suggest = (av != AccountVisibility.NONE); } catch (IllegalArgumentException err) { suggest = cfg.getBoolean("suggest", null, "accounts", true); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/Realm.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/Realm.java index 627f529660..5d551bc9e9 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/Realm.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/Realm.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.account; import com.google.gerrit.extensions.client.AccountFieldName; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.server.IdentifiedUser; - import java.util.Set; public interface Realm { @@ -39,11 +38,10 @@ public interface Realm { /** * Locate an account whose local username is the given account name. - *

- * Generally this only works for local realms, such as one backed by an LDAP - * directory, or where there is an {@link EmailExpander} configured that knows - * how to convert the accountName into an email address, and then locate the - * user by that email address. + * + *

Generally this only works for local realms, such as one backed by an LDAP directory, or + * where there is an {@link EmailExpander} configured that knows how to convert the accountName + * into an email address, and then locate the user by that email address. */ Account.Id lookup(String accountName); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/SetDiffPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/SetDiffPreferences.java index c4081559eb..986124a8e1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/SetDiffPreferences.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/SetDiffPreferences.java @@ -31,22 +31,20 @@ import com.google.gerrit.server.git.UserConfigSections; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.RepositoryNotFoundException; -import java.io.IOException; - @Singleton -public class SetDiffPreferences implements - RestModifyView { +public class SetDiffPreferences implements RestModifyView { private final Provider self; private final Provider metaDataUpdateFactory; private final AllUsersName allUsersName; private final GitRepositoryManager gitMgr; @Inject - SetDiffPreferences(Provider self, + SetDiffPreferences( + Provider self, Provider metaDataUpdateFactory, AllUsersName allUsersName, GitRepositoryManager gitMgr) { @@ -59,9 +57,8 @@ public class SetDiffPreferences implements @Override public DiffPreferencesInfo apply(AccountResource rsrc, DiffPreferencesInfo in) throws AuthException, BadRequestException, ConfigInvalidException, - RepositoryNotFoundException, IOException { - if (self.get() != rsrc.getUser() - && !self.get().getCapabilities().canModifyAccount()) { + RepositoryNotFoundException, IOException { + if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canModifyAccount()) { throw new AuthException("requires Modify Account capability"); } @@ -73,20 +70,22 @@ public class SetDiffPreferences implements return writeToGit(readFromGit(id, gitMgr, allUsersName, in), id); } - private DiffPreferencesInfo writeToGit(DiffPreferencesInfo in, - Account.Id userId) throws RepositoryNotFoundException, IOException, - ConfigInvalidException { + private DiffPreferencesInfo writeToGit(DiffPreferencesInfo in, Account.Id userId) + throws RepositoryNotFoundException, IOException, ConfigInvalidException { DiffPreferencesInfo out = new DiffPreferencesInfo(); try (MetaDataUpdate md = metaDataUpdateFactory.get().create(allUsersName)) { - VersionedAccountPreferences prefs = VersionedAccountPreferences.forUser( - userId); + VersionedAccountPreferences prefs = VersionedAccountPreferences.forUser(userId); prefs.load(md); DiffPreferencesInfo defaults = DiffPreferencesInfo.defaults(); - storeSection(prefs.getConfig(), UserConfigSections.DIFF, null, in, - defaults); + storeSection(prefs.getConfig(), UserConfigSections.DIFF, null, in, defaults); prefs.commit(md); - loadSection(prefs.getConfig(), UserConfigSections.DIFF, null, out, - DiffPreferencesInfo.defaults(), null); + loadSection( + prefs.getConfig(), + UserConfigSections.DIFF, + null, + out, + DiffPreferencesInfo.defaults(), + null); } return out; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/SetEditPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/SetEditPreferences.java index 7bff42ba2d..ca981b8d5f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/SetEditPreferences.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/SetEditPreferences.java @@ -31,15 +31,12 @@ import com.google.gerrit.server.git.UserConfigSections; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.RepositoryNotFoundException; -import java.io.IOException; - @Singleton -public class SetEditPreferences implements - RestModifyView { +public class SetEditPreferences implements RestModifyView { private final Provider self; private final Provider metaDataUpdateFactory; @@ -47,7 +44,8 @@ public class SetEditPreferences implements private final AllUsersName allUsersName; @Inject - SetEditPreferences(Provider self, + SetEditPreferences( + Provider self, Provider metaDataUpdateFactory, GitRepositoryManager gitMgr, AllUsersName allUsersName) { @@ -59,10 +57,9 @@ public class SetEditPreferences implements @Override public EditPreferencesInfo apply(AccountResource rsrc, EditPreferencesInfo in) - throws AuthException, BadRequestException, RepositoryNotFoundException, - IOException, ConfigInvalidException { - if (self.get() != rsrc.getUser() - && !self.get().getCapabilities().canModifyAccount()) { + throws AuthException, BadRequestException, RepositoryNotFoundException, IOException, + ConfigInvalidException { + if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canModifyAccount()) { throw new AuthException("requires Modify Account capability"); } @@ -77,12 +74,21 @@ public class SetEditPreferences implements try (MetaDataUpdate md = metaDataUpdateFactory.get().create(allUsersName)) { prefs = VersionedAccountPreferences.forUser(accountId); prefs.load(md); - storeSection(prefs.getConfig(), UserConfigSections.EDIT, null, + storeSection( + prefs.getConfig(), + UserConfigSections.EDIT, + null, readFromGit(accountId, gitMgr, allUsersName, in), EditPreferencesInfo.defaults()); prefs.commit(md); - out = loadSection(prefs.getConfig(), UserConfigSections.EDIT, null, out, - EditPreferencesInfo.defaults(), null); + out = + loadSection( + prefs.getConfig(), + UserConfigSections.EDIT, + null, + out, + EditPreferencesInfo.defaults(), + null); } return out; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/SetPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/SetPreferences.java index 3714cee7c0..e1ed6aaed6 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/SetPreferences.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/SetPreferences.java @@ -39,19 +39,16 @@ import com.google.gerrit.server.git.UserConfigSections; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.errors.RepositoryNotFoundException; -import org.eclipse.jgit.lib.Config; - import java.io.IOException; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.errors.RepositoryNotFoundException; +import org.eclipse.jgit.lib.Config; @Singleton -public class SetPreferences implements - RestModifyView { +public class SetPreferences implements RestModifyView { private final Provider self; private final AccountCache cache; private final GeneralPreferencesLoader loader; @@ -60,7 +57,8 @@ public class SetPreferences implements private final DynamicMap downloadSchemes; @Inject - SetPreferences(Provider self, + SetPreferences( + Provider self, AccountCache cache, GeneralPreferencesLoader loader, Provider metaDataUpdateFactory, @@ -75,12 +73,9 @@ public class SetPreferences implements } @Override - public GeneralPreferencesInfo apply(AccountResource rsrc, - GeneralPreferencesInfo i) - throws AuthException, BadRequestException, IOException, - ConfigInvalidException { - if (self.get() != rsrc.getUser() - && !self.get().getCapabilities().canModifyAccount()) { + public GeneralPreferencesInfo apply(AccountResource rsrc, GeneralPreferencesInfo i) + throws AuthException, BadRequestException, IOException, ConfigInvalidException { + if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canModifyAccount()) { throw new AuthException("requires Modify Account capability"); } @@ -104,7 +99,11 @@ public class SetPreferences implements prefs = VersionedAccountPreferences.forUser(id); prefs.load(md); - storeSection(prefs.getConfig(), UserConfigSections.GENERAL, null, i, + storeSection( + prefs.getConfig(), + UserConfigSections.GENERAL, + null, + i, GeneralPreferencesInfo.defaults()); storeMyChangeTableColumns(prefs, i.changeTable); @@ -115,8 +114,7 @@ public class SetPreferences implements } } - public static void storeMyMenus(VersionedAccountPreferences prefs, - List my) { + public static void storeMyMenus(VersionedAccountPreferences prefs, List my) { Config cfg = prefs.getConfig(); if (my != null) { unsetSection(cfg, UserConfigSections.MY); @@ -128,13 +126,12 @@ public class SetPreferences implements } } - public static void storeMyChangeTableColumns(VersionedAccountPreferences - prefs, List changeTable) { + public static void storeMyChangeTableColumns( + VersionedAccountPreferences prefs, List changeTable) { Config cfg = prefs.getConfig(); if (changeTable != null) { unsetSection(cfg, UserConfigSections.CHANGE_TABLE); - cfg.setStringList(UserConfigSections.CHANGE_TABLE, null, - CHANGE_TABLE_COLUMN, changeTable); + cfg.setStringList(UserConfigSections.CHANGE_TABLE, null, CHANGE_TABLE_COLUMN, changeTable); } } @@ -148,13 +145,13 @@ public class SetPreferences implements private static void unsetSection(Config cfg, String section) { cfg.unsetSection(section, null); - for (String subsection: cfg.getSubsections(section)) { + for (String subsection : cfg.getSubsections(section)) { cfg.unsetSection(section, subsection); } } - public static void storeUrlAliases(VersionedAccountPreferences prefs, - Map urlAliases) { + public static void storeUrlAliases( + VersionedAccountPreferences prefs, Map urlAliases) { if (urlAliases != null) { Config cfg = prefs.getConfig(); for (String subsection : cfg.getSubsections(URL_ALIAS)) { @@ -170,19 +167,16 @@ public class SetPreferences implements } } - private void checkDownloadScheme(String downloadScheme) - throws BadRequestException { + private void checkDownloadScheme(String downloadScheme) throws BadRequestException { if (Strings.isNullOrEmpty(downloadScheme)) { return; } for (DynamicMap.Entry e : downloadSchemes) { - if (e.getExportName().equals(downloadScheme) - && e.getProvider().get().isEnabled()) { + if (e.getExportName().equals(downloadScheme) && e.getProvider().get().isEnabled()) { return; } } - throw new BadRequestException( - "Unsupported download scheme: " + downloadScheme); + throw new BadRequestException("Unsupported download scheme: " + downloadScheme); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/SshKeys.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/SshKeys.java index 44a3192811..6336e08529 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/SshKeys.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/SshKeys.java @@ -26,22 +26,21 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; import org.eclipse.jgit.errors.ConfigInvalidException; -import java.io.IOException; - @Singleton -public class SshKeys implements - ChildCollection { +public class SshKeys implements ChildCollection { private final DynamicMap> views; private final GetSshKeys list; private final Provider self; private final VersionedAuthorizedKeys.Accessor authorizedKeys; @Inject - SshKeys(DynamicMap> views, - GetSshKeys list, Provider self, + SshKeys( + DynamicMap> views, + GetSshKeys list, + Provider self, VersionedAuthorizedKeys.Accessor authorizedKeys) { this.views = views; this.list = list; @@ -56,10 +55,8 @@ public class SshKeys implements @Override public AccountResource.SshKey parse(AccountResource rsrc, IdString id) - throws ResourceNotFoundException, OrmException, IOException, - ConfigInvalidException { - if (self.get() != rsrc.getUser() - && !self.get().getCapabilities().canModifyAccount()) { + throws ResourceNotFoundException, OrmException, IOException, ConfigInvalidException { + if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canModifyAccount()) { throw new ResourceNotFoundException(); } return parse(rsrc.getUser(), id); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/StarredChanges.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/StarredChanges.java index b71fc68c16..995aaa5a4e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/StarredChanges.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/StarredChanges.java @@ -38,16 +38,14 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; - @Singleton -public class StarredChanges implements - ChildCollection, - AcceptsCreate { +public class StarredChanges + implements ChildCollection, + AcceptsCreate { private static final Logger log = LoggerFactory.getLogger(StarredChanges.class); private final ChangesCollection changes; @@ -56,7 +54,8 @@ public class StarredChanges implements private final StarredChangesUtil starredChangesUtil; @Inject - StarredChanges(ChangesCollection changes, + StarredChanges( + ChangesCollection changes, DynamicMap> views, Provider createProvider, StarredChangesUtil starredChangesUtil) { @@ -71,7 +70,8 @@ public class StarredChanges implements throws ResourceNotFoundException, OrmException { IdentifiedUser user = parent.getUser(); ChangeResource change = changes.parse(TopLevelResource.INSTANCE, id); - if (starredChangesUtil.getLabels(user.getAccountId(), change.getId()) + if (starredChangesUtil + .getLabels(user.getAccountId(), change.getId()) .contains(StarredChangesUtil.DEFAULT_LABEL)) { return new AccountResource.StarredChange(user, change); } @@ -87,8 +87,8 @@ public class StarredChanges implements public RestView list() throws ResourceNotFoundException { return new RestReadView() { @Override - public Object apply(AccountResource self) throws BadRequestException, - AuthException, OrmException { + public Object apply(AccountResource self) + throws BadRequestException, AuthException, OrmException { QueryChanges query = changes.list(); query.addQuery("starredby:" + self.getUser().getAccountId().get()); return query.apply(TopLevelResource.INSTANCE); @@ -98,11 +98,10 @@ public class StarredChanges implements @SuppressWarnings("unchecked") @Override - public RestModifyView create( - AccountResource parent, IdString id) throws UnprocessableEntityException { + public RestModifyView create(AccountResource parent, IdString id) + throws UnprocessableEntityException { try { - return createProvider.get() - .setChange(changes.parse(TopLevelResource.INSTANCE, id)); + return createProvider.get().setChange(changes.parse(TopLevelResource.INSTANCE, id)); } catch (ResourceNotFoundException e) { throw new UnprocessableEntityException(String.format("change %s not found", id.get())); } catch (OrmException e) { @@ -135,8 +134,12 @@ public class StarredChanges implements throw new AuthException("not allowed to add starred change"); } try { - starredChangesUtil.star(self.get().getAccountId(), change.getProject(), - change.getId(), StarredChangesUtil.DEFAULT_LABELS, null); + starredChangesUtil.star( + self.get().getAccountId(), + change.getProject(), + change.getId(), + StarredChangesUtil.DEFAULT_LABELS, + null); } catch (OrmDuplicateKeyException e) { return Response.none(); } @@ -145,8 +148,7 @@ public class StarredChanges implements } @Singleton - static class Put implements - RestModifyView { + static class Put implements RestModifyView { private final Provider self; @Inject @@ -165,8 +167,7 @@ public class StarredChanges implements } @Singleton - public static class Delete implements - RestModifyView { + public static class Delete implements RestModifyView { private final Provider self; private final StarredChangesUtil starredChangesUtil; @@ -177,18 +178,20 @@ public class StarredChanges implements } @Override - public Response apply(AccountResource.StarredChange rsrc, - EmptyInput in) throws AuthException, OrmException, IOException { + public Response apply(AccountResource.StarredChange rsrc, EmptyInput in) + throws AuthException, OrmException, IOException { if (self.get() != rsrc.getUser()) { throw new AuthException("not allowed remove starred change"); } - starredChangesUtil.star(self.get().getAccountId(), - rsrc.getChange().getProject(), rsrc.getChange().getId(), null, + starredChangesUtil.star( + self.get().getAccountId(), + rsrc.getChange().getProject(), + rsrc.getChange().getId(), + null, StarredChangesUtil.DEFAULT_LABELS); return Response.none(); } } - public static class EmptyInput { - } + public static class EmptyInput {} } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/Stars.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/Stars.java index fddbb6aec7..52c6cdfa9f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/Stars.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/Stars.java @@ -38,15 +38,13 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.util.Collection; import java.util.List; import java.util.Set; import java.util.SortedSet; @Singleton -public class Stars implements - ChildCollection { +public class Stars implements ChildCollection { private final ChangesCollection changes; private final ListStarredChanges listStarredChanges; @@ -54,7 +52,8 @@ public class Stars implements private final DynamicMap> views; @Inject - Stars(ChangesCollection changes, + Stars( + ChangesCollection changes, ListStarredChanges listStarredChanges, StarredChangesUtil starredChangesUtil, DynamicMap> views) { @@ -69,8 +68,7 @@ public class Stars implements throws ResourceNotFoundException, OrmException { IdentifiedUser user = parent.getUser(); ChangeResource change = changes.parse(TopLevelResource.INSTANCE, id); - Set labels = - starredChangesUtil.getLabels(user.getAccountId(), change.getId()); + Set labels = starredChangesUtil.getLabels(user.getAccountId(), change.getId()); return new AccountResource.Star(user, change, labels); } @@ -85,14 +83,12 @@ public class Stars implements } @Singleton - public static class ListStarredChanges - implements RestReadView { + public static class ListStarredChanges implements RestReadView { private final Provider self; private final ChangesCollection changes; @Inject - ListStarredChanges(Provider self, - ChangesCollection changes) { + ListStarredChanges(Provider self, ChangesCollection changes) { this.self = self; this.changes = changes; } @@ -102,8 +98,7 @@ public class Stars implements public List apply(AccountResource rsrc) throws BadRequestException, AuthException, OrmException { if (self.get() != rsrc.getUser()) { - throw new AuthException( - "not allowed to list stars of another account"); + throw new AuthException("not allowed to list stars of another account"); } QueryChanges query = changes.list(); query.addQuery("has:stars"); @@ -112,38 +107,32 @@ public class Stars implements } @Singleton - public static class Get implements - RestReadView { + public static class Get implements RestReadView { private final Provider self; private final StarredChangesUtil starredChangesUtil; @Inject - Get(Provider self, - StarredChangesUtil starredChangesUtil) { + Get(Provider self, StarredChangesUtil starredChangesUtil) { this.self = self; this.starredChangesUtil = starredChangesUtil; } @Override - public SortedSet apply(AccountResource.Star rsrc) - throws AuthException, OrmException { + public SortedSet apply(AccountResource.Star rsrc) throws AuthException, OrmException { if (self.get() != rsrc.getUser()) { throw new AuthException("not allowed to get stars of another account"); } - return starredChangesUtil.getLabels(self.get().getAccountId(), - rsrc.getChange().getId()); + return starredChangesUtil.getLabels(self.get().getAccountId(), rsrc.getChange().getId()); } } @Singleton - public static class Post implements - RestModifyView { + public static class Post implements RestModifyView { private final Provider self; private final StarredChangesUtil starredChangesUtil; @Inject - Post(Provider self, - StarredChangesUtil starredChangesUtil) { + Post(Provider self, StarredChangesUtil starredChangesUtil) { this.self = self; this.starredChangesUtil = starredChangesUtil; } @@ -152,12 +141,14 @@ public class Stars implements public Collection apply(AccountResource.Star rsrc, StarsInput in) throws AuthException, BadRequestException, OrmException { if (self.get() != rsrc.getUser()) { - throw new AuthException( - "not allowed to update stars of another account"); + throw new AuthException("not allowed to update stars of another account"); } try { - return starredChangesUtil.star(self.get().getAccountId(), - rsrc.getChange().getProject(), rsrc.getChange().getId(), in.add, + return starredChangesUtil.star( + self.get().getAccountId(), + rsrc.getChange().getProject(), + rsrc.getChange().getId(), + in.add, in.remove); } catch (IllegalLabelException e) { throw new BadRequestException(e.getMessage()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/UniversalGroupBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/UniversalGroupBackend.java index 31a3f22838..a3223d9bef 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/UniversalGroupBackend.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/UniversalGroupBackend.java @@ -34,24 +34,20 @@ import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.project.ProjectControl; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.Config; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.Collection; import java.util.HashSet; import java.util.Map; import java.util.Set; +import org.eclipse.jgit.lib.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** - * Universal implementation of the GroupBackend that works with the injected - * set of GroupBackends. + * Universal implementation of the GroupBackend that works with the injected set of GroupBackends. */ @Singleton public class UniversalGroupBackend implements GroupBackend { - private static final Logger log = - LoggerFactory.getLogger(UniversalGroupBackend.class); + private static final Logger log = LoggerFactory.getLogger(UniversalGroupBackend.class); private final DynamicSet backends; @@ -105,41 +101,40 @@ public class UniversalGroupBackend implements GroupBackend { } private class UniversalGroupMembership implements GroupMembership { - private final Map memberships; + private final Map memberships; - private UniversalGroupMembership(IdentifiedUser user) { - ImmutableMap.Builder builder = - ImmutableMap.builder(); - for (GroupBackend g : backends) { - builder.put(g, g.membershipsOf(user)); - } - this.memberships = builder.build(); - } + private UniversalGroupMembership(IdentifiedUser user) { + ImmutableMap.Builder builder = ImmutableMap.builder(); + for (GroupBackend g : backends) { + builder.put(g, g.membershipsOf(user)); + } + this.memberships = builder.build(); + } - @Nullable - private GroupMembership membership(AccountGroup.UUID uuid) { - if (uuid != null) { - for (Map.Entry m : memberships.entrySet()) { - if (m.getKey().handles(uuid)) { - return m.getValue(); - } - } - } - return null; - } + @Nullable + private GroupMembership membership(AccountGroup.UUID uuid) { + if (uuid != null) { + for (Map.Entry m : memberships.entrySet()) { + if (m.getKey().handles(uuid)) { + return m.getValue(); + } + } + } + return null; + } - @Override - public boolean contains(AccountGroup.UUID uuid) { - if (uuid == null) { - return false; - } - GroupMembership m = membership(uuid); - if (m == null) { - log.debug("Unknown GroupMembership for UUID: " + uuid); - return false; - } - return m.contains(uuid); - } + @Override + public boolean contains(AccountGroup.UUID uuid) { + if (uuid == null) { + return false; + } + GroupMembership m = membership(uuid); + if (m == null) { + log.debug("Unknown GroupMembership for UUID: " + uuid); + return false; + } + return m.contains(uuid); + } @Override public boolean containsAnyOf(Iterable uuids) { @@ -156,8 +151,8 @@ public class UniversalGroupBackend implements GroupBackend { } lookups.put(m, uuid); } - for (Map.Entry> entry - : lookups .asMap().entrySet()) { + for (Map.Entry> entry : + lookups.asMap().entrySet()) { GroupMembership m = entry.getKey(); Collection ids = entry.getValue(); if (ids.size() == 1) { @@ -187,8 +182,8 @@ public class UniversalGroupBackend implements GroupBackend { lookups.put(m, uuid); } Set groups = new HashSet<>(); - for (Map.Entry> entry - : lookups.asMap().entrySet()) { + for (Map.Entry> entry : + lookups.asMap().entrySet()) { groups.addAll(entry.getKey().intersection(entry.getValue())); } return groups; @@ -219,31 +214,33 @@ public class UniversalGroupBackend implements GroupBackend { private final UniversalGroupBackend universalGroupBackend; @Inject - ConfigCheck(@GerritServerConfig Config cfg, - UniversalGroupBackend groupBackend) { + ConfigCheck(@GerritServerConfig Config cfg, UniversalGroupBackend groupBackend) { this.cfg = cfg; this.universalGroupBackend = groupBackend; } @Override public void check() throws StartupException { - String invalid = cfg.getSubsections("groups").stream() - .filter( - sub -> { - AccountGroup.UUID uuid = new AccountGroup.UUID(sub); - GroupBackend groupBackend = universalGroupBackend.backend(uuid); - return groupBackend == null || groupBackend.get(uuid) == null; - }) - .map(u -> "'" + u + "'") - .collect(joining(",")); + String invalid = + cfg.getSubsections("groups") + .stream() + .filter( + sub -> { + AccountGroup.UUID uuid = new AccountGroup.UUID(sub); + GroupBackend groupBackend = universalGroupBackend.backend(uuid); + return groupBackend == null || groupBackend.get(uuid) == null; + }) + .map(u -> "'" + u + "'") + .collect(joining(",")); if (!invalid.isEmpty()) { - throw new StartupException(String.format( - "Subsections for 'groups' in gerrit.config must be valid group" - + " UUIDs. The following group UUIDs could not be resolved: " - + invalid - + " Please remove/fix these 'groups' subsections in" - + " gerrit.config.")); + throw new StartupException( + String.format( + "Subsections for 'groups' in gerrit.config must be valid group" + + " UUIDs. The following group UUIDs could not be resolved: " + + invalid + + " Please remove/fix these 'groups' subsections in" + + " gerrit.config.")); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAccountDestinations.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAccountDestinations.java index 426c6f6341..f18e535968 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAccountDestinations.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAccountDestinations.java @@ -20,15 +20,13 @@ import com.google.gerrit.server.git.DestinationList; import com.google.gerrit.server.git.TabFile; import com.google.gerrit.server.git.ValidationError; import com.google.gerrit.server.git.VersionedMetaData; - +import java.io.IOException; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.CommitBuilder; import org.eclipse.jgit.lib.FileMode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; - /** Preferences for user accounts. */ public class VersionedAccountDestinations extends VersionedMetaData { private static final Logger log = LoggerFactory.getLogger(VersionedAccountDestinations.class); @@ -73,8 +71,7 @@ public class VersionedAccountDestinations extends VersionedMetaData { } @Override - protected boolean onSave(CommitBuilder commit) throws IOException, - ConfigInvalidException { + protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException { throw new UnsupportedOperationException("Cannot yet save destinations"); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAccountPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAccountPreferences.java index 2273426da9..2eb0b54698 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAccountPreferences.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAccountPreferences.java @@ -18,13 +18,11 @@ import com.google.common.base.Strings; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.RefNames; import com.google.gerrit.server.git.VersionedMetaData; - +import java.io.IOException; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.CommitBuilder; import org.eclipse.jgit.lib.Config; -import java.io.IOException; - /** Preferences for user accounts. */ public class VersionedAccountPreferences extends VersionedMetaData { public static final String PREFERENCES = "preferences.config"; @@ -63,8 +61,7 @@ public class VersionedAccountPreferences extends VersionedMetaData { } @Override - protected boolean onSave(CommitBuilder commit) throws IOException, - ConfigInvalidException { + protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException { if (Strings.isNullOrEmpty(commit.getMessage())) { commit.setMessage("Updated preferences\n"); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAccountQueries.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAccountQueries.java index 2ea6c535ad..e1fa8d6b69 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAccountQueries.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAccountQueries.java @@ -18,14 +18,12 @@ import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.RefNames; import com.google.gerrit.server.git.QueryList; import com.google.gerrit.server.git.VersionedMetaData; - +import java.io.IOException; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.CommitBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; - /** Named Queries for user accounts. */ public class VersionedAccountQueries extends VersionedMetaData { private static final Logger log = LoggerFactory.getLogger(VersionedAccountQueries.class); @@ -52,13 +50,13 @@ public class VersionedAccountQueries extends VersionedMetaData { @Override protected void onLoad() throws IOException, ConfigInvalidException { - queryList = QueryList.parse(readUTF8(QueryList.FILE_NAME), - QueryList.createLoggerSink(QueryList.FILE_NAME, log)); + queryList = + QueryList.parse( + readUTF8(QueryList.FILE_NAME), QueryList.createLoggerSink(QueryList.FILE_NAME, log)); } @Override - protected boolean onSave(CommitBuilder commit) throws IOException, - ConfigInvalidException { + protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException { throw new UnsupportedOperationException("Cannot yet save named queries"); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAuthorizedKeys.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAuthorizedKeys.java index 41ae498103..8cffe92aa2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAuthorizedKeys.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAuthorizedKeys.java @@ -35,38 +35,32 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; import com.google.inject.assistedinject.Assisted; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.CommitBuilder; -import org.eclipse.jgit.lib.Repository; - import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Optional; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.CommitBuilder; +import org.eclipse.jgit.lib.Repository; /** - * 'authorized_keys' file in the refs/users/CD/ABCD branches of the All-Users - * repository. + * 'authorized_keys' file in the refs/users/CD/ABCD branches of the All-Users repository. * - * The `authorized_keys' files stores the public SSH keys of the user. The file - * format matches the standard SSH file format, which means that each key is - * stored on a separate line (see + *

The `authorized_keys' files stores the public SSH keys of the user. The file format matches + * the standard SSH file format, which means that each key is stored on a separate line (see * https://en.wikibooks.org/wiki/OpenSSH/Client_Configuration_Files#.7E.2F.ssh.2Fauthorized_keys). * - * The order of the keys in the file determines the sequence numbers of the - * keys. The first line corresponds to sequence number 1. + *

The order of the keys in the file determines the sequence numbers of the keys. The first line + * corresponds to sequence number 1. * - * Invalid keys are marked with the prefix # INVALID. + *

Invalid keys are marked with the prefix # INVALID. * - * To keep the sequence numbers intact when a key is deleted, a - * # DELETED line is inserted at the position where the key was - * deleted. + *

To keep the sequence numbers intact when a key is deleted, a # DELETED line is + * inserted at the position where the key was deleted. * - * Other comment lines are ignored on read, and are not written back when the - * file is modified. + *

Other comment lines are ignored on read, and are not written back when the file is modified. */ public class VersionedAuthorizedKeys extends VersionedMetaData { @Singleton @@ -128,17 +122,17 @@ public class VersionedAuthorizedKeys extends VersionedMetaData { private VersionedAuthorizedKeys read(Account.Id accountId) throws IOException, ConfigInvalidException { try (Repository git = repoManager.openRepository(allUsersName)) { - VersionedAuthorizedKeys authorizedKeys = - authorizedKeysFactory.create(accountId); + VersionedAuthorizedKeys authorizedKeys = authorizedKeysFactory.create(accountId); authorizedKeys.load(git); return authorizedKeys; } } - private void commit(VersionedAuthorizedKeys authorizedKeys) - throws IOException { - try (MetaDataUpdate md = metaDataUpdateFactory.get().create(allUsersName, - userFactory.create(authorizedKeys.accountId))) { + private void commit(VersionedAuthorizedKeys authorizedKeys) throws IOException { + try (MetaDataUpdate md = + metaDataUpdateFactory + .get() + .create(allUsersName, userFactory.create(authorizedKeys.accountId))) { authorizedKeys.commit(md); } } @@ -161,9 +155,7 @@ public class VersionedAuthorizedKeys extends VersionedMetaData { private List> keys; @Inject - public VersionedAuthorizedKeys( - SshKeyCreator sshKeyCreator, - @Assisted Account.Id accountId) { + public VersionedAuthorizedKeys(SshKeyCreator sshKeyCreator, @Assisted Account.Id accountId) { this.sshKeyCreator = sshKeyCreator; this.accountId = accountId; this.ref = RefNames.refsUsers(accountId); @@ -192,17 +184,15 @@ public class VersionedAuthorizedKeys extends VersionedMetaData { /** Returns all SSH keys. */ private List getKeys() { checkLoaded(); - return keys.stream().filter(Optional::isPresent).map(Optional::get) - .collect(toList()); + return keys.stream().filter(Optional::isPresent).map(Optional::get).collect(toList()); } /** * Returns the SSH key with the given sequence number. * * @param seq sequence number - * @return the SSH key, null if there is no SSH key with this - * sequence number, or if the SSH key with this sequence number has - * been deleted + * @return the SSH key, null if there is no SSH key with this sequence number, or if + * the SSH key with this sequence number has been deleted */ private AccountSshKey getKey(int seq) { checkLoaded(); @@ -212,7 +202,7 @@ public class VersionedAuthorizedKeys extends VersionedMetaData { /** * Adds a new public SSH key. * - * If the specified public key exists already, the existing key is returned. + *

If the specified public key exists already, the existing key is returned. * * @param pub the public SSH key to be added * @return the new SSH key @@ -222,8 +212,7 @@ public class VersionedAuthorizedKeys extends VersionedMetaData { checkLoaded(); for (Optional key : keys) { - if (key.isPresent() - && key.get().getSshPublicKey().trim().equals(pub.trim())) { + if (key.isPresent() && key.get().getSshPublicKey().trim().equals(pub.trim())) { return key.get(); } } @@ -239,9 +228,8 @@ public class VersionedAuthorizedKeys extends VersionedMetaData { * Deletes the SSH key with the given sequence number. * * @param seq the sequence number - * @return true if a key with this sequence number was found and - * deleted, false if no key with the given sequence - * number exists + * @return true if a key with this sequence number was found and deleted, false + * if no key with the given sequence number exists */ private boolean deleteKey(int seq) { checkLoaded(); @@ -256,9 +244,9 @@ public class VersionedAuthorizedKeys extends VersionedMetaData { * Marks the SSH key with the given sequence number as invalid. * * @param seq the sequence number - * @return true if a key with this sequence number was found and - * marked as invalid, false if no key with the given - * sequence number exists or if the key was already marked as invalid + * @return true if a key with this sequence number was found and marked as invalid, + * false if no key with the given sequence number exists or if the key was + * already marked as invalid */ private boolean markKeyInvalid(int seq) { checkLoaded(); @@ -273,15 +261,13 @@ public class VersionedAuthorizedKeys extends VersionedMetaData { /** * Sets new SSH keys. * - * The existing SSH keys are overwritten. + *

The existing SSH keys are overwritten. * * @param newKeys the new public SSH keys */ public void setKeys(Collection newKeys) { Ordering o = Ordering.from(comparing(k -> k.getKey().get())); - keys = new ArrayList<>( - Collections.nCopies(o.max(newKeys).getKey().get(), - Optional.empty())); + keys = new ArrayList<>(Collections.nCopies(o.max(newKeys).getKey().get(), Optional.empty())); for (AccountSshKey key : newKeys) { keys.set(key.getKey().get() - 1, Optional.of(key)); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/WatchConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/WatchConfig.java index 2976ab5f13..667ca37642 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/WatchConfig.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/WatchConfig.java @@ -41,12 +41,6 @@ import com.google.gerrit.server.git.VersionedMetaData; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.CommitBuilder; -import org.eclipse.jgit.lib.Config; -import org.eclipse.jgit.lib.Repository; - import java.io.IOException; import java.util.ArrayList; import java.util.Collection; @@ -55,18 +49,22 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.CommitBuilder; +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.lib.Repository; /** - * ‘watch.config’ file in the user branch in the All-Users repository that - * contains the watch configuration of the user. - *

- * The 'watch.config' file is a git config file that has one 'project' section - * for all project watches of a project. - *

- * The project name is used as subsection name and the filters with the notify - * types that decide for which events email notifications should be sent are - * represented as 'notify' values in the subsection. A 'notify' value is - * formatted as {@code []}: + * ‘watch.config’ file in the user branch in the All-Users repository that contains the watch + * configuration of the user. + * + *

The 'watch.config' file is a git config file that has one 'project' section for all project + * watches of a project. + * + *

The project name is used as subsection name and the filters with the notify types that decide + * for which events email notifications should be sent are represented as 'notify' values in the + * subsection. A 'notify' value is formatted as {@code + * []}: * *

  *   [project "foo"]
@@ -74,22 +72,20 @@ import java.util.Set;
  *     notify = branch:master [ALL_COMMENTS, NEW_PATCHSETS]
  *     notify = branch:master owner:self [SUBMITTED_CHANGES]
  * 
- *

- * If two notify values in the same subsection have the same filter they are - * merged on the next save, taking the union of the notify types. - *

- * For watch configurations that notify on no event the list of notify types is - * empty: + * + *

If two notify values in the same subsection have the same filter they are merged on the next + * save, taking the union of the notify types. + * + *

For watch configurations that notify on no event the list of notify types is empty: * *

  *   [project "foo"]
  *     notify = branch:master []
  * 
- *

- * Unknown notify types are ignored and removed on save. + * + *

Unknown notify types are ignored and removed on save. */ -public class WatchConfig extends VersionedMetaData - implements ValidationError.Sink { +public class WatchConfig extends VersionedMetaData implements ValidationError.Sink { @Singleton public static class Accessor { private final GitRepositoryManager repoManager; @@ -109,8 +105,8 @@ public class WatchConfig extends VersionedMetaData this.userFactory = userFactory; } - public Map> getProjectWatches( - Account.Id accountId) throws IOException, ConfigInvalidException { + public Map> getProjectWatches(Account.Id accountId) + throws IOException, ConfigInvalidException { try (Repository git = repoManager.openRepository(allUsersName)) { WatchConfig watchConfig = new WatchConfig(accountId); watchConfig.load(git); @@ -118,22 +114,20 @@ public class WatchConfig extends VersionedMetaData } } - public synchronized void upsertProjectWatches(Account.Id accountId, - Map> newProjectWatches) + public synchronized void upsertProjectWatches( + Account.Id accountId, Map> newProjectWatches) throws IOException, ConfigInvalidException { WatchConfig watchConfig = read(accountId); - Map> projectWatches = - watchConfig.getProjectWatches(); + Map> projectWatches = watchConfig.getProjectWatches(); projectWatches.putAll(newProjectWatches); commit(watchConfig); } - public synchronized void deleteProjectWatches(Account.Id accountId, - Collection projectWatchKeys) - throws IOException, ConfigInvalidException { + public synchronized void deleteProjectWatches( + Account.Id accountId, Collection projectWatchKeys) + throws IOException, ConfigInvalidException { WatchConfig watchConfig = read(accountId); - Map> projectWatches = - watchConfig.getProjectWatches(); + Map> projectWatches = watchConfig.getProjectWatches(); boolean commit = false; for (ProjectWatchKey key : projectWatchKeys) { if (projectWatches.remove(key) != null) { @@ -158,8 +152,7 @@ public class WatchConfig extends VersionedMetaData } } - private WatchConfig read(Account.Id accountId) - throws IOException, ConfigInvalidException { + private WatchConfig read(Account.Id accountId) throws IOException, ConfigInvalidException { try (Repository git = repoManager.openRepository(allUsersName)) { WatchConfig watchConfig = new WatchConfig(accountId); watchConfig.load(git); @@ -167,10 +160,11 @@ public class WatchConfig extends VersionedMetaData } } - private void commit(WatchConfig watchConfig) - throws IOException { - try (MetaDataUpdate md = metaDataUpdateFactory.get().create(allUsersName, - userFactory.create(watchConfig.accountId))) { + private void commit(WatchConfig watchConfig) throws IOException { + try (MetaDataUpdate md = + metaDataUpdateFactory + .get() + .create(allUsersName, userFactory.create(watchConfig.accountId))) { watchConfig.commit(md); } } @@ -178,13 +172,12 @@ public class WatchConfig extends VersionedMetaData @AutoValue public abstract static class ProjectWatchKey { - public static ProjectWatchKey create(Project.NameKey project, - @Nullable String filter) { - return new AutoValue_WatchConfig_ProjectWatchKey(project, - Strings.emptyToNull(filter)); + public static ProjectWatchKey create(Project.NameKey project, @Nullable String filter) { + return new AutoValue_WatchConfig_ProjectWatchKey(project, Strings.emptyToNull(filter)); } public abstract Project.NameKey project(); + public abstract @Nullable String filter(); } @@ -229,12 +222,10 @@ public class WatchConfig extends VersionedMetaData @VisibleForTesting public static Map> parse( - Account.Id accountId, Config cfg, - ValidationError.Sink validationErrorSink) { + Account.Id accountId, Config cfg, ValidationError.Sink validationErrorSink) { Map> projectWatches = new HashMap<>(); for (String projectName : cfg.getSubsections(PROJECT)) { - String[] notifyValues = - cfg.getStringList(PROJECT, projectName, KEY_NOTIFY); + String[] notifyValues = cfg.getStringList(PROJECT, projectName, KEY_NOTIFY); for (String nv : notifyValues) { if (Strings.isNullOrEmpty(nv)) { continue; @@ -246,8 +237,8 @@ public class WatchConfig extends VersionedMetaData continue; } - ProjectWatchKey key = ProjectWatchKey - .create(new Project.NameKey(projectName), notifyValue.filter()); + ProjectWatchKey key = + ProjectWatchKey.create(new Project.NameKey(projectName), notifyValue.filter()); if (!projectWatches.containsKey(key)) { projectWatches.put(key, EnumSet.noneOf(NotifyType.class)); } @@ -262,14 +253,12 @@ public class WatchConfig extends VersionedMetaData return projectWatches; } - public void setProjectWatches( - Map> projectWatches) { + public void setProjectWatches(Map> projectWatches) { this.projectWatches = projectWatches; } @Override - protected boolean onSave(CommitBuilder commit) - throws IOException, ConfigInvalidException { + protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException { checkLoaded(); if (Strings.isNullOrEmpty(commit.getMessage())) { @@ -284,18 +273,13 @@ public class WatchConfig extends VersionedMetaData ListMultimap notifyValuesByProject = MultimapBuilder.hashKeys().arrayListValues().build(); - for (Map.Entry> e : projectWatches - .entrySet()) { - NotifyValue notifyValue = - NotifyValue.create(e.getKey().filter(), e.getValue()); - notifyValuesByProject.put(e.getKey().project().get(), - notifyValue.toString()); + for (Map.Entry> e : projectWatches.entrySet()) { + NotifyValue notifyValue = NotifyValue.create(e.getKey().filter(), e.getValue()); + notifyValuesByProject.put(e.getKey().project().get(), notifyValue.toString()); } - for (Map.Entry> e : notifyValuesByProject.asMap() - .entrySet()) { - cfg.setStringList(PROJECT, e.getKey(), KEY_NOTIFY, - new ArrayList<>(e.getValue())); + for (Map.Entry> e : notifyValuesByProject.asMap().entrySet()) { + cfg.setStringList(PROJECT, e.getKey(), KEY_NOTIFY, new ArrayList<>(e.getValue())); } saveConfig(WATCH_CONFIG, cfg); @@ -328,15 +312,20 @@ public class WatchConfig extends VersionedMetaData @AutoValue public abstract static class NotifyValue { - public static NotifyValue parse(Account.Id accountId, String project, - String notifyValue, ValidationError.Sink validationErrorSink) { + public static NotifyValue parse( + Account.Id accountId, + String project, + String notifyValue, + ValidationError.Sink validationErrorSink) { notifyValue = notifyValue.trim(); int i = notifyValue.lastIndexOf('['); if (i < 0 || notifyValue.charAt(notifyValue.length() - 1) != ']') { - validationErrorSink.error(new ValidationError(WATCH_CONFIG, - String.format( - "Invalid project watch of account %d for project %s: %s", - accountId.get(), project, notifyValue))); + validationErrorSink.error( + new ValidationError( + WATCH_CONFIG, + String.format( + "Invalid project watch of account %d for project %s: %s", + accountId.get(), project, notifyValue))); return null; } String filter = notifyValue.substring(0, i).trim(); @@ -346,16 +335,19 @@ public class WatchConfig extends VersionedMetaData Set notifyTypes = EnumSet.noneOf(NotifyType.class); if (i + 1 < notifyValue.length() - 2) { - for (String nt : Splitter.on(',').trimResults().splitToList( - notifyValue.substring(i + 1, notifyValue.length() - 1))) { - NotifyType notifyType = - Enums.getIfPresent(NotifyType.class, nt).orNull(); + for (String nt : + Splitter.on(',') + .trimResults() + .splitToList(notifyValue.substring(i + 1, notifyValue.length() - 1))) { + NotifyType notifyType = Enums.getIfPresent(NotifyType.class, nt).orNull(); if (notifyType == null) { - validationErrorSink.error(new ValidationError(WATCH_CONFIG, - String.format( - "Invalid notify type %s in project watch " - + "of account %d for project %s: %s", - nt, accountId.get(), project, notifyValue))); + validationErrorSink.error( + new ValidationError( + WATCH_CONFIG, + String.format( + "Invalid notify type %s in project watch " + + "of account %d for project %s: %s", + nt, accountId.get(), project, notifyValue))); continue; } notifyTypes.add(notifyType); @@ -364,21 +356,20 @@ public class WatchConfig extends VersionedMetaData return create(filter, notifyTypes); } - public static NotifyValue create(@Nullable String filter, - Set notifyTypes) { - return new AutoValue_WatchConfig_NotifyValue(Strings.emptyToNull(filter), - Sets.immutableEnumSet(notifyTypes)); + public static NotifyValue create(@Nullable String filter, Set notifyTypes) { + return new AutoValue_WatchConfig_NotifyValue( + Strings.emptyToNull(filter), Sets.immutableEnumSet(notifyTypes)); } public abstract @Nullable String filter(); + public abstract ImmutableSet notifyTypes(); @Override public String toString() { List notifyTypes = new ArrayList<>(notifyTypes()); StringBuilder notifyValue = new StringBuilder(); - notifyValue.append(firstNonNull(filter(), FILTER_ALL)) - .append(" ["); + notifyValue.append(firstNonNull(filter(), FILTER_ALL)).append(" ["); Joiner.on(", ").appendTo(notifyValue, notifyTypes); notifyValue.append("]"); return notifyValue.toString(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/GerritApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/GerritApiImpl.java index 577abe1ae6..6241276003 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/GerritApiImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/GerritApiImpl.java @@ -32,11 +32,8 @@ class GerritApiImpl implements GerritApi { private final Projects projects; @Inject - GerritApiImpl(Accounts accounts, - Changes changes, - Config config, - Groups groups, - Projects projects) { + GerritApiImpl( + Accounts accounts, Changes changes, Config config, Groups groups, Projects projects) { this.accounts = accounts; this.changes = changes; this.config = config; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountApiImpl.java index 3c20719103..e1eb11951e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountApiImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountApiImpl.java @@ -71,13 +71,11 @@ import com.google.gerrit.server.change.ChangesCollection; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - -import org.eclipse.jgit.errors.ConfigInvalidException; - import java.io.IOException; import java.util.List; import java.util.Map; import java.util.SortedSet; +import org.eclipse.jgit.errors.ConfigInvalidException; public class AccountApiImpl implements AccountApi { interface Factory { @@ -119,7 +117,8 @@ public class AccountApiImpl implements AccountApi { private final PutStatus putStatus; @Inject - AccountApiImpl(AccountLoader.Factory ailf, + AccountApiImpl( + AccountLoader.Factory ailf, ChangesCollection changes, GetAvatar getAvatar, GetPreferences getPreferences, @@ -188,8 +187,7 @@ public class AccountApiImpl implements AccountApi { } @Override - public com.google.gerrit.extensions.common.AccountInfo get() - throws RestApiException { + public com.google.gerrit.extensions.common.AccountInfo get() throws RestApiException { AccountLoader accountLoader = accountLoaderFactory.create(true); try { AccountInfo ai = accountLoader.get(account.getUser().getAccountId()); @@ -231,8 +229,7 @@ public class AccountApiImpl implements AccountApi { } @Override - public GeneralPreferencesInfo setPreferences(GeneralPreferencesInfo in) - throws RestApiException { + public GeneralPreferencesInfo setPreferences(GeneralPreferencesInfo in) throws RestApiException { try { return setPreferences.apply(account, in); } catch (IOException | ConfigInvalidException e) { @@ -250,8 +247,7 @@ public class AccountApiImpl implements AccountApi { } @Override - public DiffPreferencesInfo setDiffPreferences(DiffPreferencesInfo in) - throws RestApiException { + public DiffPreferencesInfo setDiffPreferences(DiffPreferencesInfo in) throws RestApiException { try { return setDiffPreferences.apply(account, in); } catch (IOException | ConfigInvalidException e) { @@ -269,8 +265,7 @@ public class AccountApiImpl implements AccountApi { } @Override - public EditPreferencesInfo setEditPreferences(EditPreferencesInfo in) - throws RestApiException { + public EditPreferencesInfo setEditPreferences(EditPreferencesInfo in) throws RestApiException { try { return setEditPreferences.apply(account, in); } catch (IOException | ConfigInvalidException e) { @@ -288,8 +283,8 @@ public class AccountApiImpl implements AccountApi { } @Override - public List setWatchedProjects( - List in) throws RestApiException { + public List setWatchedProjects(List in) + throws RestApiException { try { return postWatchedProjects.apply(account, in); } catch (OrmException | IOException | ConfigInvalidException e) { @@ -298,8 +293,7 @@ public class AccountApiImpl implements AccountApi { } @Override - public void deleteWatchedProjects(List in) - throws RestApiException { + public void deleteWatchedProjects(List in) throws RestApiException { try { deleteWatchedProjects.apply(account, in); } catch (OrmException | IOException | ConfigInvalidException e) { @@ -310,9 +304,7 @@ public class AccountApiImpl implements AccountApi { @Override public void starChange(String changeId) throws RestApiException { try { - ChangeResource rsrc = changes.parse( - TopLevelResource.INSTANCE, - IdString.fromUrl(changeId)); + ChangeResource rsrc = changes.parse(TopLevelResource.INSTANCE, IdString.fromUrl(changeId)); starredChangesCreate.setChange(rsrc); starredChangesCreate.apply(account, new StarredChanges.EmptyInput()); } catch (OrmException | IOException e) { @@ -323,23 +315,19 @@ public class AccountApiImpl implements AccountApi { @Override public void unstarChange(String changeId) throws RestApiException { try { - ChangeResource rsrc = - changes.parse(TopLevelResource.INSTANCE, IdString.fromUrl(changeId)); + ChangeResource rsrc = changes.parse(TopLevelResource.INSTANCE, IdString.fromUrl(changeId)); AccountResource.StarredChange starredChange = new AccountResource.StarredChange(account.getUser(), rsrc); - starredChangesDelete.apply(starredChange, - new StarredChanges.EmptyInput()); + starredChangesDelete.apply(starredChange, new StarredChanges.EmptyInput()); } catch (OrmException | IOException e) { throw new RestApiException("Cannot unstar change", e); } } @Override - public void setStars(String changeId, StarsInput input) - throws RestApiException { + public void setStars(String changeId, StarsInput input) throws RestApiException { try { - AccountResource.Star rsrc = - stars.parse(account, IdString.fromUrl(changeId)); + AccountResource.Star rsrc = stars.parse(account, IdString.fromUrl(changeId)); starsPost.apply(rsrc, input); } catch (OrmException e) { throw new RestApiException("Cannot post stars", e); @@ -349,8 +337,7 @@ public class AccountApiImpl implements AccountApi { @Override public SortedSet getStars(String changeId) throws RestApiException { try { - AccountResource.Star rsrc = - stars.parse(account, IdString.fromUrl(changeId)); + AccountResource.Star rsrc = stars.parse(account, IdString.fromUrl(changeId)); return starsGet.apply(rsrc); } catch (OrmException e) { throw new RestApiException("Cannot get stars", e); @@ -368,8 +355,7 @@ public class AccountApiImpl implements AccountApi { @Override public void addEmail(EmailInput input) throws RestApiException { - AccountResource.Email rsrc = - new AccountResource.Email(account.getUser(), input.email); + AccountResource.Email rsrc = new AccountResource.Email(account.getUser(), input.email); try { createEmailFactory.create(input.email).apply(rsrc, input); } catch (EmailException | OrmException | IOException e) { @@ -428,8 +414,8 @@ public class AccountApiImpl implements AccountApi { } @Override - public Map putGpgKeys(List add, - List delete) throws RestApiException { + public Map putGpgKeys(List add, List delete) + throws RestApiException { try { return gpgApiAdapter.putGpgKeys(account, add, delete); } catch (GpgException e) { @@ -481,8 +467,7 @@ public class AccountApiImpl implements AccountApi { } @Override - public void deleteExternalIds(List externalIds) - throws RestApiException { + public void deleteExternalIds(List externalIds) throws RestApiException { try { deleteExternalIds.apply(account, externalIds); } catch (IOException | OrmException e) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountExternalIdCreator.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountExternalIdCreator.java index a0b9b4e02f..8be7c4d4db 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountExternalIdCreator.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountExternalIdCreator.java @@ -16,22 +16,17 @@ package com.google.gerrit.server.api.accounts; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.AccountExternalId; - import java.util.List; public interface AccountExternalIdCreator { /** - * Returns additional external identifiers to assign to a given - * user when creating an account. + * Returns additional external identifiers to assign to a given user when creating an account. * * @param id the identifier of the account. * @param username the name of the user. - * @param email an optional email address to assign to the external - * identifiers, or {@code null}. - * + * @param email an optional email address to assign to the external identifiers, or {@code null}. * @return a list of external identifiers, or an empty list. */ - List create(Account.Id id, String username, - String email); + List create(Account.Id id, String username, String email); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountInfoComparator.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountInfoComparator.java index f89e5ca57a..7c468fc89a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountInfoComparator.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountInfoComparator.java @@ -17,20 +17,17 @@ package com.google.gerrit.server.api.accounts; import com.google.common.collect.ComparisonChain; import com.google.common.collect.Ordering; import com.google.gerrit.extensions.common.AccountInfo; - import java.util.Comparator; public class AccountInfoComparator extends Ordering implements Comparator { - public static final AccountInfoComparator ORDER_NULLS_FIRST = - new AccountInfoComparator(); + public static final AccountInfoComparator ORDER_NULLS_FIRST = new AccountInfoComparator(); public static final AccountInfoComparator ORDER_NULLS_LAST = new AccountInfoComparator().setNullsLast(); private boolean nullsLast; - private AccountInfoComparator() { - } + private AccountInfoComparator() {} private AccountInfoComparator setNullsLast() { this.nullsLast = true; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountsImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountsImpl.java index 6a248f7182..498b720686 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountsImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountsImpl.java @@ -36,11 +36,9 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.eclipse.jgit.errors.ConfigInvalidException; - import java.io.IOException; import java.util.List; +import org.eclipse.jgit.errors.ConfigInvalidException; @Singleton public class AccountsImpl implements Accounts { @@ -51,7 +49,8 @@ public class AccountsImpl implements Accounts { private final Provider queryAccountsProvider; @Inject - AccountsImpl(AccountsCollection accounts, + AccountsImpl( + AccountsCollection accounts, AccountApiImpl.Factory api, Provider self, CreateAccount.Factory createAccount, @@ -66,8 +65,7 @@ public class AccountsImpl implements Accounts { @Override public AccountApi id(String id) throws RestApiException { try { - return api.create(accounts.parse(TopLevelResource.INSTANCE, - IdString.fromDecoded(id))); + return api.create(accounts.parse(TopLevelResource.INSTANCE, IdString.fromDecoded(id))); } catch (OrmException e) { throw new RestApiException("Cannot parse change", e); } @@ -100,8 +98,8 @@ public class AccountsImpl implements Accounts { } checkRequiresCapability(self, null, CreateAccount.class); try { - AccountInfo info = createAccount.create(in.username) - .apply(TopLevelResource.INSTANCE, in).value(); + AccountInfo info = + createAccount.create(in.username).apply(TopLevelResource.INSTANCE, in).value(); return id(info._accountId); } catch (OrmException | IOException | ConfigInvalidException e) { throw new RestApiException("Cannot create account " + in.username, e); @@ -119,13 +117,11 @@ public class AccountsImpl implements Accounts { } @Override - public SuggestAccountsRequest suggestAccounts(String query) - throws RestApiException { + public SuggestAccountsRequest suggestAccounts(String query) throws RestApiException { return suggestAccounts().withQuery(query); } - private List suggestAccounts(SuggestAccountsRequest r) - throws RestApiException { + private List suggestAccounts(SuggestAccountsRequest r) throws RestApiException { try { QueryAccounts myQueryAccounts = queryAccountsProvider.get(); myQueryAccounts.setSuggest(true); @@ -152,8 +148,7 @@ public class AccountsImpl implements Accounts { return query().withQuery(query); } - private List query(QueryRequest r) - throws RestApiException { + private List query(QueryRequest r) throws RestApiException { try { QueryAccounts myQueryAccounts = queryAccountsProvider.get(); myQueryAccounts.setQuery(r.getQuery()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/GpgApiAdapter.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/GpgApiAdapter.java index a83110c335..7def6fa63d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/GpgApiAdapter.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/GpgApiAdapter.java @@ -22,7 +22,6 @@ import com.google.gerrit.extensions.restapi.RestApiException; import com.google.gerrit.server.GpgException; import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.account.AccountResource; - import java.util.List; import java.util.Map; @@ -32,12 +31,11 @@ public interface GpgApiAdapter { Map listGpgKeys(AccountResource account) throws RestApiException, GpgException; - Map putGpgKeys(AccountResource account, List add, - List delete) throws RestApiException, GpgException; - - GpgKeyApi gpgKey(AccountResource account, IdString idStr) + Map putGpgKeys(AccountResource account, List add, List delete) throws RestApiException, GpgException; - PushCertificateInfo checkPushCertificate(String certStr, - IdentifiedUser expectedUser) throws GpgException; + GpgKeyApi gpgKey(AccountResource account, IdString idStr) throws RestApiException, GpgException; + + PushCertificateInfo checkPushCertificate(String certStr, IdentifiedUser expectedUser) + throws GpgException; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java index 2a4b5caed9..52353ca696 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java @@ -75,7 +75,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; - import java.io.IOException; import java.util.EnumSet; import java.util.List; @@ -99,8 +98,7 @@ class ChangeApiImpl implements ChangeApi { private final Restore restore; private final CreateMergePatchSet updateByMerge; private final Provider submittedTogether; - private final PublishDraftPatchSet.CurrentRevision - publishDraftChange; + private final PublishDraftPatchSet.CurrentRevision publishDraftChange; private final DeleteChange deleteChange; private final GetTopic getTopic; private final PutTopic putTopic; @@ -122,7 +120,8 @@ class ChangeApiImpl implements ChangeApi { private final Move move; @Inject - ChangeApiImpl(Changes changeApi, + ChangeApiImpl( + Changes changeApi, Reviewers reviewers, Revisions revisions, ReviewerApiImpl.Factory reviewerApi, @@ -206,8 +205,7 @@ class ChangeApiImpl implements ChangeApi { @Override public RevisionApi revision(String id) throws RestApiException { try { - return revisionApi.create( - revisions.parse(change, IdString.fromDecoded(id))); + return revisionApi.create(revisions.parse(change, IdString.fromDecoded(id))); } catch (OrmException | IOException e) { throw new RestApiException("Cannot parse revision", e); } @@ -216,8 +214,7 @@ class ChangeApiImpl implements ChangeApi { @Override public ReviewerApi reviewer(String id) throws RestApiException { try { - return reviewerApi.create( - reviewers.parse(change, IdString.fromDecoded(id))); + return reviewerApi.create(reviewers.parse(change, IdString.fromDecoded(id))); } catch (OrmException e) { throw new RestApiException("Cannot parse reviewer", e); } @@ -282,36 +279,35 @@ class ChangeApiImpl implements ChangeApi { } @Override - public ChangeInfo createMergePatchSet(MergePatchSetInput in) - throws RestApiException { + public ChangeInfo createMergePatchSet(MergePatchSetInput in) throws RestApiException { try { return updateByMerge.apply(change, in).value(); - } catch (IOException | UpdateException | InvalidChangeOperationException - | OrmException e) { + } catch (IOException | UpdateException | InvalidChangeOperationException | OrmException e) { throw new RestApiException("Cannot update change by merge", e); } } @Override public List submittedTogether() throws RestApiException { - SubmittedTogetherInfo info = submittedTogether( - EnumSet.noneOf(ListChangesOption.class), - EnumSet.noneOf(SubmittedTogetherOption.class)); + SubmittedTogetherInfo info = + submittedTogether( + EnumSet.noneOf(ListChangesOption.class), EnumSet.noneOf(SubmittedTogetherOption.class)); return info.changes; } @Override - public SubmittedTogetherInfo submittedTogether( - EnumSet options) throws RestApiException { + public SubmittedTogetherInfo submittedTogether(EnumSet options) + throws RestApiException { return submittedTogether(EnumSet.noneOf(ListChangesOption.class), options); } @Override public SubmittedTogetherInfo submittedTogether( - EnumSet listOptions, - EnumSet submitOptions) throws RestApiException { + EnumSet listOptions, EnumSet submitOptions) + throws RestApiException { try { - return submittedTogether.get() + return submittedTogether + .get() .addListChangesOption(listOptions) .addSubmittedTogetherOption(submitOptions) .applyInfo(change); @@ -390,8 +386,7 @@ class ChangeApiImpl implements ChangeApi { } @Override - public SuggestedReviewersRequest suggestReviewers(String query) - throws RestApiException { + public SuggestedReviewersRequest suggestReviewers(String query) throws RestApiException { return suggestReviewers().withQuery(query); } @@ -407,8 +402,7 @@ class ChangeApiImpl implements ChangeApi { } @Override - public ChangeInfo get(EnumSet s) - throws RestApiException { + public ChangeInfo get(EnumSet s) throws RestApiException { try { return changeJson.create(s).format(change); } catch (OrmException e) { @@ -455,8 +449,7 @@ class ChangeApiImpl implements ChangeApi { } @Override - public AccountInfo setAssignee(AssigneeInput input) - throws RestApiException { + public AccountInfo setAssignee(AssigneeInput input) throws RestApiException { try { return putAssignee.apply(change, input).value(); } catch (UpdateException | IOException | OrmException e) { @@ -503,8 +496,7 @@ class ChangeApiImpl implements ChangeApi { } @Override - public Map> robotComments() - throws RestApiException { + public Map> robotComments() throws RestApiException { try { return listChangeRobotComments.apply(change); } catch (OrmException e) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeEditApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeEditApiImpl.java index b186767e41..de5c764fd1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeEditApiImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeEditApiImpl.java @@ -34,7 +34,6 @@ import com.google.gerrit.server.git.UpdateException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - import java.io.IOException; import java.util.Optional; @@ -57,7 +56,8 @@ public class ChangeEditApiImpl implements ChangeEditApi { private final ChangeResource changeResource; @Inject - public ChangeEditApiImpl(ChangeEdits.Detail editDetail, + public ChangeEditApiImpl( + ChangeEdits.Detail editDetail, ChangeEdits.Post changeEditsPost, DeleteChangeEdit deleteChangeEdit, RebaseChangeEdit.Rebase rebaseChangeEdit, @@ -126,8 +126,7 @@ public class ChangeEditApiImpl implements ChangeEditApi { } @Override - public void publish(PublishChangeEditInput publishChangeEditInput) - throws RestApiException { + public void publish(PublishChangeEditInput publishChangeEditInput) throws RestApiException { try { publishChangeEdit.apply(changeResource, publishChangeEditInput); } catch (IOException | OrmException | UpdateException e) { @@ -136,23 +135,18 @@ public class ChangeEditApiImpl implements ChangeEditApi { } @Override - public Optional getFile(String filePath) - throws RestApiException { + public Optional getFile(String filePath) throws RestApiException { try { ChangeEditResource changeEditResource = getChangeEditResource(filePath); - Response fileResponse = - changeEditsGet.apply(changeEditResource); - return fileResponse.isNone() - ? Optional.empty() - : Optional.of(fileResponse.value()); + Response fileResponse = changeEditsGet.apply(changeEditResource); + return fileResponse.isNone() ? Optional.empty() : Optional.of(fileResponse.value()); } catch (IOException | OrmException e) { throw new RestApiException("Cannot retrieve file of change edit", e); } } @Override - public void renameFile(String oldFilePath, String newFilePath) - throws RestApiException { + public void renameFile(String oldFilePath, String newFilePath) throws RestApiException { try { ChangeEdits.Post.Input renameInput = new ChangeEdits.Post.Input(); renameInput.oldPath = oldFilePath; @@ -175,8 +169,7 @@ public class ChangeEditApiImpl implements ChangeEditApi { } @Override - public void modifyFile(String filePath, RawInput newContent) - throws RestApiException { + public void modifyFile(String filePath, RawInput newContent) throws RestApiException { try { changeEditsPut.apply(changeResource.getControl(), filePath, newContent); } catch (IOException | OrmException e) { @@ -196,8 +189,7 @@ public class ChangeEditApiImpl implements ChangeEditApi { @Override public String getCommitMessage() throws RestApiException { try { - try (BinaryResult binaryResult = - getChangeEditCommitMessage.apply(changeResource)) { + try (BinaryResult binaryResult = getChangeEditCommitMessage.apply(changeResource)) { return binaryResult.asString(); } } catch (IOException | OrmException e) { @@ -206,21 +198,18 @@ public class ChangeEditApiImpl implements ChangeEditApi { } @Override - public void modifyCommitMessage(String newCommitMessage) - throws RestApiException { + public void modifyCommitMessage(String newCommitMessage) throws RestApiException { ChangeEdits.EditMessage.Input input = new ChangeEdits.EditMessage.Input(); input.message = newCommitMessage; try { modifyChangeEditCommitMessage.apply(changeResource, input); } catch (IOException | OrmException e) { - throw new RestApiException("Cannot modify commit message of change edit", - e); + throw new RestApiException("Cannot modify commit message of change edit", e); } } private ChangeEditResource getChangeEditResource(String filePath) - throws ResourceNotFoundException, AuthException, IOException, - OrmException { + throws ResourceNotFoundException, AuthException, IOException, OrmException { return changeEdits.parse(changeResource, IdString.fromDecoded(filePath)); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangesImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangesImpl.java index bb2eea7866..65218cd97c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangesImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangesImpl.java @@ -39,7 +39,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; import java.util.List; @@ -51,7 +50,8 @@ class ChangesImpl implements Changes { private final Provider queryProvider; @Inject - ChangesImpl(ChangesCollection changes, + ChangesImpl( + ChangesCollection changes, ChangeApiImpl.Factory api, CreateChange createChange, Provider queryProvider) { @@ -67,20 +67,16 @@ class ChangesImpl implements Changes { } @Override - public ChangeApi id(String project, String branch, String id) - throws RestApiException { - return id(Joiner.on('~').join(ImmutableList.of( - Url.encode(project), - Url.encode(branch), - Url.encode(id)))); + public ChangeApi id(String project, String branch, String id) throws RestApiException { + return id( + Joiner.on('~') + .join(ImmutableList.of(Url.encode(project), Url.encode(branch), Url.encode(id)))); } @Override public ChangeApi id(String id) throws RestApiException { try { - return api.create(changes.parse( - TopLevelResource.INSTANCE, - IdString.fromUrl(id))); + return api.create(changes.parse(TopLevelResource.INSTANCE, IdString.fromUrl(id))); } catch (OrmException e) { throw new RestApiException("Cannot parse change", e); } @@ -89,11 +85,9 @@ class ChangesImpl implements Changes { @Override public ChangeApi create(ChangeInput in) throws RestApiException { try { - ChangeInfo out = createChange.apply( - TopLevelResource.INSTANCE, in).value(); + ChangeInfo out = createChange.apply(TopLevelResource.INSTANCE, in).value(); return api.create(changes.parse(new Change.Id(out._number))); - } catch (OrmException | IOException | InvalidChangeOperationException - | UpdateException e) { + } catch (OrmException | IOException | InvalidChangeOperationException | UpdateException e) { throw new RestApiException("Cannot create change", e); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/CommentApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/CommentApiImpl.java index 0352aff56a..5c61e23df7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/CommentApiImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/CommentApiImpl.java @@ -32,8 +32,7 @@ class CommentApiImpl implements CommentApi { private final CommentResource comment; @Inject - CommentApiImpl(GetComment getComment, - @Assisted CommentResource comment) { + CommentApiImpl(GetComment getComment, @Assisted CommentResource comment) { this.getComment = getComment; this.comment = comment; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/DraftApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/DraftApiImpl.java index 2e2dfccac4..e631501c6c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/DraftApiImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/DraftApiImpl.java @@ -38,7 +38,8 @@ class DraftApiImpl implements DraftApi { private final DraftCommentResource draft; @Inject - DraftApiImpl(DeleteDraftComment deleteDraft, + DraftApiImpl( + DeleteDraftComment deleteDraft, GetDraftComment getDraft, PutDraftComment putDraft, @Assisted DraftCommentResource draft) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/FileApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/FileApiImpl.java index 2aa0f3ddb4..aa66e7bf77 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/FileApiImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/FileApiImpl.java @@ -25,7 +25,6 @@ import com.google.gerrit.server.project.InvalidChangeOperationException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - import java.io.IOException; class FileApiImpl implements FileApi { @@ -38,9 +37,7 @@ class FileApiImpl implements FileApi { private final FileResource file; @Inject - FileApiImpl(GetContent getContent, - GetDiff getDiff, - @Assisted FileResource file) { + FileApiImpl(GetContent getContent, GetDiff getDiff, @Assisted FileResource file) { this.getContent = getContent; this.getDiff = getDiff; this.file = file; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ReviewerApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ReviewerApiImpl.java index afda5fa4ec..c57a371396 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ReviewerApiImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ReviewerApiImpl.java @@ -27,7 +27,6 @@ import com.google.gerrit.server.git.UpdateException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - import java.util.Map; public class ReviewerApiImpl implements ReviewerApi { @@ -41,7 +40,8 @@ public class ReviewerApiImpl implements ReviewerApi { private final DeleteReviewer deleteReviewer; @Inject - ReviewerApiImpl(Votes.List listVotes, + ReviewerApiImpl( + Votes.List listVotes, DeleteVote deleteVote, DeleteReviewer deleteReviewer, @Assisted ReviewerResource reviewer) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java index a7aa2d04ce..fe821e6324 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java @@ -75,14 +75,12 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; - -import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.revwalk.RevWalk; - import java.io.IOException; import java.util.List; import java.util.Map; import java.util.Set; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevWalk; class RevisionApiImpl implements RevisionApi { interface Factory { @@ -127,7 +125,8 @@ class RevisionApiImpl implements RevisionApi { private final GetDescription getDescription; @Inject - RevisionApiImpl(GitRepositoryManager repoManager, + RevisionApiImpl( + GitRepositoryManager repoManager, Changes changes, RevisionReviewers revisionReviewers, RevisionReviewerApiImpl.Factory revisionReviewerApi, @@ -273,8 +272,7 @@ class RevisionApiImpl implements RevisionApi { public boolean canRebase() throws RestApiException { try (Repository repo = repoManager.openRepository(revision.getProject()); RevWalk rw = new RevWalk(repo)) { - return rebaseUtil.canRebase( - revision.getPatchSet(), revision.getChange().getDest(), repo, rw); + return rebaseUtil.canRebase(revision.getPatchSet(), revision.getChange().getDest(), repo, rw); } catch (IOException e) { throw new RestApiException("Cannot check if rebase is possible", e); } @@ -308,9 +306,7 @@ class RevisionApiImpl implements RevisionApi { } else { view = deleteReviewed; } - view.apply( - files.parse(revision, IdString.fromDecoded(path)), - new Reviewed.Input()); + view.apply(files.parse(revision, IdString.fromDecoded(path)), new Reviewed.Input()); } catch (Exception e) { throw new RestApiException("Cannot update reviewed flag", e); } @@ -320,9 +316,8 @@ class RevisionApiImpl implements RevisionApi { @Override public Set reviewed() throws RestApiException { try { - return ImmutableSet.copyOf((Iterable) listFiles - .setReviewed(true) - .apply(revision).value()); + return ImmutableSet.copyOf( + (Iterable) listFiles.setReviewed(true).apply(revision).value()); } catch (OrmException | IOException | PatchListNotAvailableException e) { throw new RestApiException("Cannot list reviewed files", e); } @@ -351,7 +346,7 @@ class RevisionApiImpl implements RevisionApi { @Override public Map files() throws RestApiException { try { - return (Map)listFiles.apply(revision).value(); + return (Map) listFiles.apply(revision).value(); } catch (OrmException | IOException | PatchListNotAvailableException e) { throw new RestApiException("Cannot retrieve files", e); } @@ -361,8 +356,7 @@ class RevisionApiImpl implements RevisionApi { @Override public Map files(String base) throws RestApiException { try { - return (Map) listFiles.setBase(base) - .apply(revision).value(); + return (Map) listFiles.setBase(base).apply(revision).value(); } catch (OrmException | IOException | PatchListNotAvailableException e) { throw new RestApiException("Cannot retrieve files", e); } @@ -372,8 +366,7 @@ class RevisionApiImpl implements RevisionApi { @Override public Map files(int parentNum) throws RestApiException { try { - return (Map) listFiles.setParent(parentNum) - .apply(revision).value(); + return (Map) listFiles.setParent(parentNum).apply(revision).value(); } catch (OrmException | IOException | PatchListNotAvailableException e) { throw new RestApiException("Cannot retrieve files", e); } @@ -381,8 +374,7 @@ class RevisionApiImpl implements RevisionApi { @Override public FileApi file(String path) { - return fileApi.create(files.parse(revision, - IdString.fromDecoded(path))); + return fileApi.create(files.parse(revision, IdString.fromDecoded(path))); } @Override @@ -442,8 +434,7 @@ class RevisionApiImpl implements RevisionApi { @Override public DraftApi draft(String id) throws RestApiException { try { - return draftFactory.create(drafts.parse(revision, - IdString.fromDecoded(id))); + return draftFactory.create(drafts.parse(revision, IdString.fromDecoded(id))); } catch (OrmException e) { throw new RestApiException("Cannot retrieve draft", e); } @@ -454,7 +445,8 @@ class RevisionApiImpl implements RevisionApi { try { String id = createDraft.apply(revision, in).value().id; // Reread change to pick up new notes refs. - return changes.id(revision.getChange().getId().get()) + return changes + .id(revision.getChange().getId().get()) .revision(revision.getPatchSet().getId().get()) .draft(id); } catch (UpdateException | OrmException e) { @@ -465,8 +457,7 @@ class RevisionApiImpl implements RevisionApi { @Override public CommentApi comment(String id) throws RestApiException { try { - return commentFactory.create(comments.parse(revision, - IdString.fromDecoded(id))); + return commentFactory.create(comments.parse(revision, IdString.fromDecoded(id))); } catch (OrmException e) { throw new RestApiException("Cannot retrieve comment", e); } @@ -475,8 +466,7 @@ class RevisionApiImpl implements RevisionApi { @Override public RobotCommentApi robotComment(String id) throws RestApiException { try { - return robotCommentFactory - .create(robotComments.parse(revision, IdString.fromDecoded(id))); + return robotCommentFactory.create(robotComments.parse(revision, IdString.fromDecoded(id))); } catch (OrmException e) { throw new RestApiException("Cannot retrieve robot comment", e); } @@ -519,8 +509,7 @@ class RevisionApiImpl implements RevisionApi { } @Override - public SubmitType testSubmitType(TestSubmitRuleInput in) - throws RestApiException { + public SubmitType testSubmitType(TestSubmitRuleInput in) throws RestApiException { try { return testSubmitType.apply(revision, in); } catch (OrmException e) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionReviewerApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionReviewerApiImpl.java index 82740c42c7..b5828c19c7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionReviewerApiImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionReviewerApiImpl.java @@ -25,7 +25,6 @@ import com.google.gerrit.server.git.UpdateException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - import java.util.Map; public class RevisionReviewerApiImpl implements RevisionReviewerApi { @@ -38,9 +37,8 @@ public class RevisionReviewerApiImpl implements RevisionReviewerApi { private final DeleteVote deleteVote; @Inject - RevisionReviewerApiImpl(Votes.List listVotes, - DeleteVote deleteVote, - @Assisted ReviewerResource reviewer) { + RevisionReviewerApiImpl( + Votes.List listVotes, DeleteVote deleteVote, @Assisted ReviewerResource reviewer) { this.listVotes = listVotes; this.deleteVote = deleteVote; this.reviewer = reviewer; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RobotCommentApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RobotCommentApiImpl.java index 9169a4fcf4..ded98cb6a2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RobotCommentApiImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RobotCommentApiImpl.java @@ -32,8 +32,7 @@ public class RobotCommentApiImpl implements RobotCommentApi { private final RobotCommentResource comment; @Inject - RobotCommentApiImpl(GetRobotComment getComment, - @Assisted RobotCommentResource comment) { + RobotCommentApiImpl(GetRobotComment getComment, @Assisted RobotCommentResource comment) { this.getComment = getComment; this.comment = comment; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/config/ServerImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/config/ServerImpl.java index f433d2b231..9b6ead0c96 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/config/ServerImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/config/ServerImpl.java @@ -28,10 +28,8 @@ import com.google.gerrit.server.config.SetDiffPreferences; import com.google.gerrit.server.config.SetPreferences; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.errors.ConfigInvalidException; - import java.io.IOException; +import org.eclipse.jgit.errors.ConfigInvalidException; @Singleton public class ServerImpl implements Server { @@ -42,7 +40,8 @@ public class ServerImpl implements Server { private final GetServerInfo getServerInfo; @Inject - ServerImpl(GetPreferences getPreferences, + ServerImpl( + GetPreferences getPreferences, SetPreferences setPreferences, GetDiffPreferences getDiffPreferences, SetDiffPreferences setDiffPreferences, @@ -69,8 +68,7 @@ public class ServerImpl implements Server { } @Override - public GeneralPreferencesInfo getDefaultPreferences() - throws RestApiException { + public GeneralPreferencesInfo getDefaultPreferences() throws RestApiException { try { return getPreferences.apply(new ConfigResource()); } catch (IOException | ConfigInvalidException e) { @@ -79,8 +77,8 @@ public class ServerImpl implements Server { } @Override - public GeneralPreferencesInfo setDefaultPreferences( - GeneralPreferencesInfo in) throws RestApiException { + public GeneralPreferencesInfo setDefaultPreferences(GeneralPreferencesInfo in) + throws RestApiException { try { return setPreferences.apply(new ConfigResource(), in); } catch (IOException | ConfigInvalidException e) { @@ -89,8 +87,7 @@ public class ServerImpl implements Server { } @Override - public DiffPreferencesInfo getDefaultDiffPreferences() - throws RestApiException { + public DiffPreferencesInfo getDefaultDiffPreferences() throws RestApiException { try { return getDiffPreferences.apply(new ConfigResource()); } catch (IOException | ConfigInvalidException e) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/groups/GroupApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/groups/GroupApiImpl.java index b939a3bf64..15120d224d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/groups/GroupApiImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/groups/GroupApiImpl.java @@ -44,7 +44,6 @@ import com.google.gerrit.server.group.PutOwner; import com.google.gwtorm.server.OrmException; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - import java.io.IOException; import java.util.Arrays; import java.util.List; @@ -220,8 +219,7 @@ class GroupApiImpl implements GroupApi { @Override public void addMembers(String... members) throws RestApiException { try { - addMembers.apply( - rsrc, AddMembers.Input.fromMembers(Arrays.asList(members))); + addMembers.apply(rsrc, AddMembers.Input.fromMembers(Arrays.asList(members))); } catch (OrmException | IOException e) { throw new RestApiException("Cannot add group members", e); } @@ -230,8 +228,7 @@ class GroupApiImpl implements GroupApi { @Override public void removeMembers(String... members) throws RestApiException { try { - deleteMembers.apply( - rsrc, AddMembers.Input.fromMembers(Arrays.asList(members))); + deleteMembers.apply(rsrc, AddMembers.Input.fromMembers(Arrays.asList(members))); } catch (OrmException | IOException e) { throw new RestApiException("Cannot remove group members", e); } @@ -249,8 +246,7 @@ class GroupApiImpl implements GroupApi { @Override public void addGroups(String... groups) throws RestApiException { try { - addGroups.apply( - rsrc, AddIncludedGroups.Input.fromGroups(Arrays.asList(groups))); + addGroups.apply(rsrc, AddIncludedGroups.Input.fromGroups(Arrays.asList(groups))); } catch (OrmException e) { throw new RestApiException("Cannot add group members", e); } @@ -259,8 +255,7 @@ class GroupApiImpl implements GroupApi { @Override public void removeGroups(String... groups) throws RestApiException { try { - deleteGroups.apply( - rsrc, AddIncludedGroups.Input.fromGroups(Arrays.asList(groups))); + deleteGroups.apply(rsrc, AddIncludedGroups.Input.fromGroups(Arrays.asList(groups))); } catch (OrmException e) { throw new RestApiException("Cannot remove group members", e); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/groups/GroupsImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/groups/GroupsImpl.java index dcd8761102..1d725a8b08 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/groups/GroupsImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/groups/GroupsImpl.java @@ -37,7 +37,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; import java.util.List; import java.util.SortedMap; @@ -75,8 +74,7 @@ class GroupsImpl implements Groups { @Override public GroupApi id(String id) throws RestApiException { - return api.create( - groups.parse(TopLevelResource.INSTANCE, IdString.fromDecoded(id))); + return api.create(groups.parse(TopLevelResource.INSTANCE, IdString.fromDecoded(id))); } @Override @@ -93,8 +91,7 @@ class GroupsImpl implements Groups { } checkRequiresCapability(user, null, CreateGroup.class); try { - GroupInfo info = createGroup.create(in.name) - .apply(TopLevelResource.INSTANCE, in); + GroupInfo info = createGroup.create(in.name).apply(TopLevelResource.INSTANCE, in); return id(info.id); } catch (OrmException | IOException e) { throw new RestApiException("Cannot create group " + in.name, e); @@ -111,16 +108,14 @@ class GroupsImpl implements Groups { }; } - private SortedMap list(ListRequest req) - throws RestApiException { + private SortedMap list(ListRequest req) throws RestApiException { TopLevelResource tlr = TopLevelResource.INSTANCE; ListGroups list = listGroups.get(); list.setOptions(req.getOptions()); for (String project : req.getProjects()) { try { - list.addProject( - projects.parse(tlr, IdString.fromDecoded(project)).getControl()); + list.addProject(projects.parse(tlr, IdString.fromDecoded(project)).getControl()); } catch (IOException e) { throw new RestApiException("Error looking up project " + project, e); } @@ -167,8 +162,7 @@ class GroupsImpl implements Groups { return query().withQuery(query); } - private List query(QueryRequest r) - throws RestApiException { + private List query(QueryRequest r) throws RestApiException { try { QueryGroups myQueryGroups = queryGroups.get(); myQueryGroups.setQuery(r.getQuery()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/BranchApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/BranchApiImpl.java index 7fbb1f6e40..2fc78337ee 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/BranchApiImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/BranchApiImpl.java @@ -31,7 +31,6 @@ import com.google.gerrit.server.project.ProjectResource; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - import java.io.IOException; public class BranchApiImpl implements BranchApi { @@ -48,7 +47,8 @@ public class BranchApiImpl implements BranchApi { private final ProjectResource project; @Inject - BranchApiImpl(BranchesCollection branches, + BranchApiImpl( + BranchesCollection branches, CreateBranch.Factory createBranchFactory, DeleteBranch deleteBranch, FilesCollection filesCollection, @@ -95,8 +95,7 @@ public class BranchApiImpl implements BranchApi { @Override public BinaryResult file(String path) throws RestApiException { try { - FileResource resource = filesCollection.parse(resource(), - IdString.fromDecoded(path)); + FileResource resource = filesCollection.parse(resource(), IdString.fromDecoded(path)); return getContent.apply(resource); } catch (IOException e) { throw new RestApiException("Cannot retrieve file", e); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ChildProjectApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ChildProjectApiImpl.java index b972f5e577..925b6472f1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ChildProjectApiImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ChildProjectApiImpl.java @@ -31,9 +31,7 @@ public class ChildProjectApiImpl implements ChildProjectApi { private final ChildProjectResource rsrc; @AssistedInject - ChildProjectApiImpl( - GetChildProject getChildProject, - @Assisted ChildProjectResource rsrc) { + ChildProjectApiImpl(GetChildProject getChildProject, @Assisted ChildProjectResource rsrc) { this.getChildProject = getChildProject; this.rsrc = rsrc; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java index 8f7f1b21f6..e29d633fd8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java @@ -57,15 +57,14 @@ import com.google.gerrit.server.project.SetAccess; import com.google.gwtorm.server.OrmException; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - -import org.eclipse.jgit.errors.ConfigInvalidException; - import java.io.IOException; import java.util.List; +import org.eclipse.jgit.errors.ConfigInvalidException; public class ProjectApiImpl implements ProjectApi { interface Factory { ProjectApiImpl create(ProjectResource project); + ProjectApiImpl create(String name); } @@ -92,7 +91,8 @@ public class ProjectApiImpl implements ProjectApi { private final DeleteTags deleteTags; @AssistedInject - ProjectApiImpl(CurrentUser user, + ProjectApiImpl( + CurrentUser user, CreateProject.Factory createProjectFactory, ProjectApiImpl.Factory projectApi, ProjectsCollection projects, @@ -112,14 +112,33 @@ public class ProjectApiImpl implements ProjectApi { DeleteBranches deleteBranches, DeleteTags deleteTags, @Assisted ProjectResource project) { - this(user, createProjectFactory, projectApi, projects, getDescription, - putDescription, childApi, children, projectJson, branchApiFactory, - tagApiFactory, getAccess, setAccess, getConfig, putConfig, listBranches, - listTags, deleteBranches, deleteTags, project, null); + this( + user, + createProjectFactory, + projectApi, + projects, + getDescription, + putDescription, + childApi, + children, + projectJson, + branchApiFactory, + tagApiFactory, + getAccess, + setAccess, + getConfig, + putConfig, + listBranches, + listTags, + deleteBranches, + deleteTags, + project, + null); } @AssistedInject - ProjectApiImpl(CurrentUser user, + ProjectApiImpl( + CurrentUser user, CreateProject.Factory createProjectFactory, ProjectApiImpl.Factory projectApi, ProjectsCollection projects, @@ -139,13 +158,32 @@ public class ProjectApiImpl implements ProjectApi { DeleteBranches deleteBranches, DeleteTags deleteTags, @Assisted String name) { - this(user, createProjectFactory, projectApi, projects, getDescription, - putDescription, childApi, children, projectJson, branchApiFactory, - tagApiFactory, getAccess, setAccess, getConfig, putConfig, listBranches, - listTags, deleteBranches, deleteTags, null, name); + this( + user, + createProjectFactory, + projectApi, + projects, + getDescription, + putDescription, + childApi, + children, + projectJson, + branchApiFactory, + tagApiFactory, + getAccess, + setAccess, + getConfig, + putConfig, + listBranches, + listTags, + deleteBranches, + deleteTags, + null, + name); } - private ProjectApiImpl(CurrentUser user, + private ProjectApiImpl( + CurrentUser user, CreateProject.Factory createProjectFactory, ProjectApiImpl.Factory projectApi, ProjectsCollection projects, @@ -204,8 +242,7 @@ public class ProjectApiImpl implements ProjectApi { throw new BadRequestException("name must match input.name"); } checkRequiresCapability(user, null, CreateProject.class); - createProjectFactory.create(name) - .apply(TopLevelResource.INSTANCE, in); + createProjectFactory.create(name).apply(TopLevelResource.INSTANCE, in); return projectApi.create(projects.parse(name)); } catch (IOException | ConfigInvalidException e) { throw new RestApiException("Cannot create project: " + e.getMessage(), e); @@ -235,8 +272,7 @@ public class ProjectApiImpl implements ProjectApi { } @Override - public ProjectAccessInfo access(ProjectAccessInput p) - throws RestApiException { + public ProjectAccessInfo access(ProjectAccessInput p) throws RestApiException { try { return setAccess.apply(checkExists(), p); } catch (IOException e) { @@ -245,8 +281,7 @@ public class ProjectApiImpl implements ProjectApi { } @Override - public void description(DescriptionInput in) - throws RestApiException { + public void description(DescriptionInput in) throws RestApiException { try { putDescription.apply(checkExists(), in); } catch (IOException e) { @@ -297,8 +332,7 @@ public class ProjectApiImpl implements ProjectApi { }; } - private List listTags(ListRefsRequest request) - throws RestApiException { + private List listTags(ListRefsRequest request) throws RestApiException { listTags.setLimit(request.getLimit()); listTags.setStart(request.getStart()); listTags.setMatchSubstring(request.getSubstring()); @@ -316,8 +350,7 @@ public class ProjectApiImpl implements ProjectApi { } @Override - public List children(boolean recursive) - throws RestApiException { + public List children(boolean recursive) throws RestApiException { ListChildProjects list = children.list(); list.setRecursive(recursive); return list.apply(checkExists()); @@ -326,8 +359,7 @@ public class ProjectApiImpl implements ProjectApi { @Override public ChildProjectApi child(String name) throws RestApiException { try { - return childApi.create( - children.parse(checkExists(), IdString.fromDecoded(name))); + return childApi.create(children.parse(checkExists(), IdString.fromDecoded(name))); } catch (IOException e) { throw new RestApiException("Cannot parse child project", e); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectsImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectsImpl.java index 5d21c45d7f..9483508398 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectsImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectsImpl.java @@ -27,7 +27,6 @@ import com.google.gerrit.server.project.ProjectsCollection; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; import java.util.SortedMap; @@ -38,7 +37,8 @@ class ProjectsImpl implements Projects { private final Provider listProvider; @Inject - ProjectsImpl(ProjectsCollection projects, + ProjectsImpl( + ProjectsCollection projects, ProjectApiImpl.Factory api, Provider listProvider) { this.projects = projects; @@ -82,8 +82,7 @@ class ProjectsImpl implements Projects { }; } - private SortedMap list(ListRequest request) - throws RestApiException { + private SortedMap list(ListRequest request) throws RestApiException { ListProjects lp = listProvider.get(); lp.setShowDescription(request.getDescription()); lp.setLimit(request.getLimit()); @@ -112,8 +111,7 @@ class ProjectsImpl implements Projects { type = FilterType.PERMISSIONS; break; default: - throw new BadRequestException( - "Unknown filter type: " + request.getFilterType()); + throw new BadRequestException("Unknown filter type: " + request.getFilterType()); } lp.setFilterType(type); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/TagApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/TagApiImpl.java index aa2c402a4b..4e81407f98 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/TagApiImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/TagApiImpl.java @@ -28,7 +28,6 @@ import com.google.gerrit.server.project.TagsCollection; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - import java.io.IOException; public class TagApiImpl implements TagApi { @@ -44,7 +43,8 @@ public class TagApiImpl implements TagApi { private final ProjectResource project; @Inject - TagApiImpl(ListTags listTags, + TagApiImpl( + ListTags listTags, CreateTag.Factory createTagFactory, DeleteTag deleteTag, TagsCollection tags, diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/AccountGroupIdHandler.java b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/AccountGroupIdHandler.java index bf74a4afbd..4d135b846f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/AccountGroupIdHandler.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/AccountGroupIdHandler.java @@ -18,7 +18,6 @@ import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gerrit.server.account.GroupCache; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - import org.kohsuke.args4j.CmdLineException; import org.kohsuke.args4j.CmdLineParser; import org.kohsuke.args4j.OptionDef; @@ -30,16 +29,17 @@ public class AccountGroupIdHandler extends OptionHandler { private final GroupCache groupCache; @Inject - public AccountGroupIdHandler(final GroupCache groupCache, - @Assisted final CmdLineParser parser, @Assisted final OptionDef option, + public AccountGroupIdHandler( + final GroupCache groupCache, + @Assisted final CmdLineParser parser, + @Assisted final OptionDef option, @Assisted final Setter setter) { super(parser, option, setter); this.groupCache = groupCache; } @Override - public final int parseArguments(final Parameters params) - throws CmdLineException { + public final int parseArguments(final Parameters params) throws CmdLineException { final String n = params.getParameter(0); final AccountGroup group = groupCache.get(new AccountGroup.NameKey(n)); if (group == null) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/AccountGroupUUIDHandler.java b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/AccountGroupUUIDHandler.java index 674fe086c4..79ab8c8726 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/AccountGroupUUIDHandler.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/AccountGroupUUIDHandler.java @@ -20,7 +20,6 @@ import com.google.gerrit.server.account.GroupBackend; import com.google.gerrit.server.account.GroupBackends; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - import org.kohsuke.args4j.CmdLineException; import org.kohsuke.args4j.CmdLineParser; import org.kohsuke.args4j.OptionDef; @@ -32,16 +31,17 @@ public class AccountGroupUUIDHandler extends OptionHandler { private final GroupBackend groupBackend; @Inject - public AccountGroupUUIDHandler(final GroupBackend groupBackend, - @Assisted final CmdLineParser parser, @Assisted final OptionDef option, + public AccountGroupUUIDHandler( + final GroupBackend groupBackend, + @Assisted final CmdLineParser parser, + @Assisted final OptionDef option, @Assisted final Setter setter) { super(parser, option, setter); this.groupBackend = groupBackend; } @Override - public final int parseArguments(final Parameters params) - throws CmdLineException { + public final int parseArguments(final Parameters params) throws CmdLineException { final String n = params.getParameter(0); GroupReference group = GroupBackends.findExactSuggestion(groupBackend, n); if (group == null) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/AccountIdHandler.java b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/AccountIdHandler.java index 4cb96b3c18..75628015bb 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/AccountIdHandler.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/AccountIdHandler.java @@ -26,7 +26,7 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; - +import java.io.IOException; import org.kohsuke.args4j.CmdLineException; import org.kohsuke.args4j.CmdLineParser; import org.kohsuke.args4j.OptionDef; @@ -34,8 +34,6 @@ import org.kohsuke.args4j.spi.OptionHandler; import org.kohsuke.args4j.spi.Parameters; import org.kohsuke.args4j.spi.Setter; -import java.io.IOException; - public class AccountIdHandler extends OptionHandler { private final Provider db; private final AccountResolver accountResolver; @@ -59,8 +57,7 @@ public class AccountIdHandler extends OptionHandler { } @Override - public int parseArguments(Parameters params) - throws CmdLineException { + public int parseArguments(Parameters params) throws CmdLineException { String token = params.getParameter(0); Account.Id accountId; try { @@ -92,8 +89,7 @@ public class AccountIdHandler extends OptionHandler { return 1; } - private Account.Id createAccountByLdap(String user) - throws CmdLineException, IOException { + private Account.Id createAccountByLdap(String user) throws CmdLineException, IOException { if (!user.matches(Account.USER_NAME_PATTERN)) { throw new CmdLineException(owner, "user \"" + user + "\" not found"); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/ChangeIdHandler.java b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/ChangeIdHandler.java index 00eaf94623..fe2a94bef1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/ChangeIdHandler.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/ChangeIdHandler.java @@ -23,7 +23,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; - import org.kohsuke.args4j.CmdLineException; import org.kohsuke.args4j.CmdLineParser; import org.kohsuke.args4j.OptionDef; @@ -38,20 +37,20 @@ public class ChangeIdHandler extends OptionHandler { public ChangeIdHandler( // TODO(dborowitz): Not sure whether this is injectable here. Provider queryProvider, - @Assisted final CmdLineParser parser, @Assisted final OptionDef option, + @Assisted final CmdLineParser parser, + @Assisted final OptionDef option, @Assisted final Setter setter) { super(parser, option, setter); this.queryProvider = queryProvider; } @Override - public final int parseArguments(final Parameters params) - throws CmdLineException { + public final int parseArguments(final Parameters params) throws CmdLineException { final String token = params.getParameter(0); final String[] tokens = token.split(","); if (tokens.length != 3) { - throw new CmdLineException(owner, "change should be specified as " - + ",,"); + throw new CmdLineException( + owner, "change should be specified as " + ",,"); } try { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/ObjectIdHandler.java b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/ObjectIdHandler.java index b7f2fb9232..aa8a9583b1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/ObjectIdHandler.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/ObjectIdHandler.java @@ -16,7 +16,6 @@ package com.google.gerrit.server.args4j; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - import org.eclipse.jgit.lib.ObjectId; import org.kohsuke.args4j.CmdLineException; import org.kohsuke.args4j.CmdLineParser; @@ -28,8 +27,10 @@ import org.kohsuke.args4j.spi.Setter; public class ObjectIdHandler extends OptionHandler { @Inject - public ObjectIdHandler(@Assisted final CmdLineParser parser, - @Assisted final OptionDef option, @Assisted final Setter setter) { + public ObjectIdHandler( + @Assisted final CmdLineParser parser, + @Assisted final OptionDef option, + @Assisted final Setter setter) { super(parser, option, setter); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/PatchSetIdHandler.java b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/PatchSetIdHandler.java index a48568f9fc..e8283bee1f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/PatchSetIdHandler.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/PatchSetIdHandler.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.args4j; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - import org.kohsuke.args4j.CmdLineException; import org.kohsuke.args4j.CmdLineParser; import org.kohsuke.args4j.OptionDef; @@ -28,21 +27,21 @@ import org.kohsuke.args4j.spi.Setter; public class PatchSetIdHandler extends OptionHandler { @Inject - public PatchSetIdHandler(@Assisted final CmdLineParser parser, - @Assisted final OptionDef option, @Assisted final Setter setter) { + public PatchSetIdHandler( + @Assisted final CmdLineParser parser, + @Assisted final OptionDef option, + @Assisted final Setter setter) { super(parser, option, setter); } @Override - public final int parseArguments(final Parameters params) - throws CmdLineException { + public final int parseArguments(final Parameters params) throws CmdLineException { final String token = params.getParameter(0); final PatchSet.Id id; try { id = PatchSet.Id.parse(token); } catch (IllegalArgumentException e) { - throw new CmdLineException(owner, "\"" + token - + "\" is not a valid patch set"); + throw new CmdLineException(owner, "\"" + token + "\" is not a valid patch set"); } setter.addValue(id); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/ProjectControlHandler.java b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/ProjectControlHandler.java index 8771c23def..02e907f4d5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/ProjectControlHandler.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/ProjectControlHandler.java @@ -22,7 +22,7 @@ import com.google.gerrit.server.project.ProjectControl; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; - +import java.io.IOException; import org.kohsuke.args4j.CmdLineException; import org.kohsuke.args4j.CmdLineParser; import org.kohsuke.args4j.OptionDef; @@ -32,11 +32,8 @@ import org.kohsuke.args4j.spi.Setter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; - public class ProjectControlHandler extends OptionHandler { - private static final Logger log = LoggerFactory - .getLogger(ProjectControlHandler.class); + private static final Logger log = LoggerFactory.getLogger(ProjectControlHandler.class); private final ProjectControl.GenericFactory projectControlFactory; private final Provider user; @@ -44,7 +41,8 @@ public class ProjectControlHandler extends OptionHandler { public ProjectControlHandler( final ProjectControl.GenericFactory projectControlFactory, Provider user, - @Assisted final CmdLineParser parser, @Assisted final OptionDef option, + @Assisted final CmdLineParser parser, + @Assisted final OptionDef option, @Assisted final Setter setter) { super(parser, option, setter); this.projectControlFactory = projectControlFactory; @@ -52,8 +50,7 @@ public class ProjectControlHandler extends OptionHandler { } @Override - public final int parseArguments(final Parameters params) - throws CmdLineException { + public final int parseArguments(final Parameters params) throws CmdLineException { String projectName = params.getParameter(0); while (projectName.endsWith("/")) { @@ -74,17 +71,14 @@ public class ProjectControlHandler extends OptionHandler { final ProjectControl control; try { - control = projectControlFactory.validateFor( - nameKey, - ProjectControl.OWNER | ProjectControl.VISIBLE, - user.get()); + control = + projectControlFactory.validateFor( + nameKey, ProjectControl.OWNER | ProjectControl.VISIBLE, user.get()); } catch (NoSuchProjectException e) { throw new CmdLineException(owner, e.getMessage()); } catch (IOException e) { log.warn("Cannot load project " + nameWithoutSuffix, e); - throw new CmdLineException( - owner, - new NoSuchProjectException(nameKey).getMessage()); + throw new CmdLineException(owner, new NoSuchProjectException(nameKey).getMessage()); } setter.addValue(control); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/SocketAddressHandler.java b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/SocketAddressHandler.java index 0c20b2d61b..e0193c51ae 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/SocketAddressHandler.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/SocketAddressHandler.java @@ -17,7 +17,7 @@ package com.google.gerrit.server.args4j; import com.google.gerrit.server.util.SocketUtil; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - +import java.net.SocketAddress; import org.kohsuke.args4j.CmdLineException; import org.kohsuke.args4j.CmdLineParser; import org.kohsuke.args4j.OptionDef; @@ -25,19 +25,18 @@ import org.kohsuke.args4j.spi.OptionHandler; import org.kohsuke.args4j.spi.Parameters; import org.kohsuke.args4j.spi.Setter; -import java.net.SocketAddress; - public class SocketAddressHandler extends OptionHandler { @Inject - public SocketAddressHandler(@Assisted final CmdLineParser parser, - @Assisted final OptionDef option, @Assisted final Setter setter) { + public SocketAddressHandler( + @Assisted final CmdLineParser parser, + @Assisted final OptionDef option, + @Assisted final Setter setter) { super(parser, option, setter); } @Override - public final int parseArguments(final Parameters params) - throws CmdLineException { + public final int parseArguments(final Parameters params) throws CmdLineException { final String token = params.getParameter(0); try { setter.addValue(SocketUtil.parse(token, 0)); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/SubcommandHandler.java b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/SubcommandHandler.java index 619ec1f6b7..b7af2e7194 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/SubcommandHandler.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/SubcommandHandler.java @@ -16,7 +16,6 @@ package com.google.gerrit.server.args4j; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - import org.kohsuke.args4j.CmdLineException; import org.kohsuke.args4j.CmdLineParser; import org.kohsuke.args4j.OptionDef; @@ -27,14 +26,15 @@ import org.kohsuke.args4j.spi.Setter; public class SubcommandHandler extends OptionHandler { @Inject - public SubcommandHandler(@Assisted final CmdLineParser parser, - @Assisted final OptionDef option, @Assisted final Setter setter) { + public SubcommandHandler( + @Assisted final CmdLineParser parser, + @Assisted final OptionDef option, + @Assisted final Setter setter) { super(parser, option, setter); } @Override - public final int parseArguments(final Parameters params) - throws CmdLineException { + public final int parseArguments(final Parameters params) throws CmdLineException { setter.addValue(params.getParameter(0)); owner.stopOptionParsing(); return 1; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/TimestampHandler.java b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/TimestampHandler.java index 21ef31af10..eddfbcdfde 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/TimestampHandler.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/TimestampHandler.java @@ -16,7 +16,11 @@ package com.google.gerrit.server.args4j; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - +import java.sql.Timestamp; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.TimeZone; import org.kohsuke.args4j.CmdLineException; import org.kohsuke.args4j.CmdLineParser; import org.kohsuke.args4j.OptionDef; @@ -24,18 +28,14 @@ import org.kohsuke.args4j.spi.OptionHandler; import org.kohsuke.args4j.spi.Parameters; import org.kohsuke.args4j.spi.Setter; -import java.sql.Timestamp; -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.TimeZone; - public class TimestampHandler extends OptionHandler { public static final String TIMESTAMP_FORMAT = "yyyyMMdd_HHmm"; @Inject - public TimestampHandler(@Assisted CmdLineParser parser, - @Assisted OptionDef option, @Assisted Setter setter) { + public TimestampHandler( + @Assisted CmdLineParser parser, + @Assisted OptionDef option, + @Assisted Setter setter) { super(parser, option, setter); } @@ -48,9 +48,10 @@ public class TimestampHandler extends OptionHandler { setter.addValue(new Timestamp(fmt.parse(timestamp).getTime())); return 1; } catch (ParseException e) { - throw new CmdLineException(owner, - String.format("Invalid timestamp: %s; expected format: %s", - timestamp, TIMESTAMP_FORMAT), e); + throw new CmdLineException( + owner, + String.format("Invalid timestamp: %s; expected format: %s", timestamp, TIMESTAMP_FORMAT), + e); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/AuthBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/AuthBackend.java index 1050926813..9ec3366947 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/AuthBackend.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/AuthBackend.java @@ -16,9 +16,7 @@ package com.google.gerrit.server.auth; import com.google.gerrit.extensions.annotations.ExtensionPoint; -/** - * Implementations of AuthBackend authenticate users for incoming request. - */ +/** Implementations of AuthBackend authenticate users for incoming request. */ @ExtensionPoint public interface AuthBackend { @@ -26,24 +24,20 @@ public interface AuthBackend { String getDomain(); /** - * Authenticate inspects the AuthRequest and returns authenticated user. If - * the request is unable to be authenticated, an exception will be thrown. The - * {@link MissingCredentialsException} must be thrown when there are no - * credentials for the request. It is expected that at most one AuthBackend - * will either return an AuthUser or throw a non-MissingCredentialsException. + * Authenticate inspects the AuthRequest and returns authenticated user. If the request is unable + * to be authenticated, an exception will be thrown. The {@link MissingCredentialsException} must + * be thrown when there are no credentials for the request. It is expected that at most one + * AuthBackend will either return an AuthUser or throw a non-MissingCredentialsException. * * @param req the object describing the request. * @return the successfully authenticated user. * @throws MissingCredentialsException when there are no credentials. - * @throws InvalidCredentialsException when the credentials are present and - * invalid. - * @throws UnknownUserException when the credentials are valid but there is - * no matching user. - * @throws UserNotAllowedException when the credentials are valid but the user - * is not allowed. + * @throws InvalidCredentialsException when the credentials are present and invalid. + * @throws UnknownUserException when the credentials are valid but there is no matching user. + * @throws UserNotAllowedException when the credentials are valid but the user is not allowed. * @throws AuthException when any other error occurs. */ - AuthUser authenticate(AuthRequest req) throws MissingCredentialsException, - InvalidCredentialsException, UnknownUserException, - UserNotAllowedException, AuthException; + AuthUser authenticate(AuthRequest req) + throws MissingCredentialsException, InvalidCredentialsException, UnknownUserException, + UserNotAllowedException, AuthException; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/AuthException.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/AuthException.java index 8cf4a0a613..0c41f5b80b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/AuthException.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/AuthException.java @@ -14,14 +14,11 @@ package com.google.gerrit.server.auth; -/** - * Base type for authentication exceptions. - */ +/** Base type for authentication exceptions. */ public class AuthException extends Exception { private static final long serialVersionUID = -8946302676525580372L; - public AuthException() { - } + public AuthException() {} public AuthException(String msg) { super(msg); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/AuthRequest.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/AuthRequest.java index e194eb743c..c9331908cd 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/AuthRequest.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/AuthRequest.java @@ -15,12 +15,9 @@ package com.google.gerrit.server.auth; import com.google.gerrit.common.Nullable; - import java.util.Objects; -/** - * Defines an abstract request for user authentication to Gerrit. - */ +/** Defines an abstract request for user authentication to Gerrit. */ public abstract class AuthRequest { private final String username; private final String password; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/AuthUser.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/AuthUser.java index f2c8222d22..71f29a4f9a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/AuthUser.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/AuthUser.java @@ -19,14 +19,10 @@ import static com.google.common.base.Preconditions.checkNotNull; import com.google.auto.value.AutoValue; import com.google.gerrit.common.Nullable; -/** - * An authenticated user as specified by the AuthBackend. - */ +/** An authenticated user as specified by the AuthBackend. */ public class AuthUser { - /** - * Globally unique identifier for the user. - */ + /** Globally unique identifier for the user. */ @AutoValue public abstract static class UUID { /** @@ -87,7 +83,6 @@ public class AuthUser { @Override public String toString() { - return String.format("AuthUser[uuid=%s, username=%s]", getUUID(), - getUsername()); + return String.format("AuthUser[uuid=%s, username=%s]", getUUID(), getUsername()); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/InternalAuthBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/InternalAuthBackend.java index 6ecea5e221..3f2938f105 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/InternalAuthBackend.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/InternalAuthBackend.java @@ -20,7 +20,6 @@ import com.google.gerrit.server.account.AccountState; import com.google.gerrit.server.config.AuthConfig; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.util.Locale; @Singleton @@ -41,10 +40,9 @@ public class InternalAuthBackend implements AuthBackend { @Override public AuthUser authenticate(AuthRequest req) - throws MissingCredentialsException, InvalidCredentialsException, - UnknownUserException, UserNotAllowedException, AuthException { - if (Strings.isNullOrEmpty(req.getUsername()) - || Strings.isNullOrEmpty(req.getPassword())) { + throws MissingCredentialsException, InvalidCredentialsException, UnknownUserException, + UserNotAllowedException, AuthException { + if (Strings.isNullOrEmpty(req.getUsername()) || Strings.isNullOrEmpty(req.getPassword())) { throw new MissingCredentialsException(); } @@ -59,8 +57,10 @@ public class InternalAuthBackend implements AuthBackend { if (who == null) { throw new UnknownUserException(); } else if (!who.getAccount().isActive()) { - throw new UserNotAllowedException("Authentication failed for " + username - + ": account inactive or not provisioned in Gerrit"); + throw new UserNotAllowedException( + "Authentication failed for " + + username + + ": account inactive or not provisioned in Gerrit"); } req.checkPassword(who.getPassword(username)); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/InvalidCredentialsException.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/InvalidCredentialsException.java index bca858691b..c96a429664 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/InvalidCredentialsException.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/InvalidCredentialsException.java @@ -15,14 +15,13 @@ package com.google.gerrit.server.auth; /** - * An authentication exception that is thrown when the credentials are present - * and are unable to be verified. + * An authentication exception that is thrown when the credentials are present and are unable to be + * verified. */ public class InvalidCredentialsException extends AuthException { private static final long serialVersionUID = 3709201042080444276L; - public InvalidCredentialsException() { - } + public InvalidCredentialsException() {} public InvalidCredentialsException(String msg) { super(msg); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/MissingCredentialsException.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/MissingCredentialsException.java index 062728a6f5..f8533707c0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/MissingCredentialsException.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/MissingCredentialsException.java @@ -15,17 +15,15 @@ package com.google.gerrit.server.auth; /** - * An authentication exception that is thrown when the credentials are not - * present. This indicates that the AuthBackend has none of the needed - * information in the request to perform authentication. If parts of the - * authentication information is available to the backend, then a different + * An authentication exception that is thrown when the credentials are not present. This indicates + * that the AuthBackend has none of the needed information in the request to perform authentication. + * If parts of the authentication information is available to the backend, then a different * AuthException should be used. */ public class MissingCredentialsException extends AuthException { private static final long serialVersionUID = -6499866977513508051L; - public MissingCredentialsException() { - } + public MissingCredentialsException() {} public MissingCredentialsException(String msg) { super(msg); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/UniversalAuthBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/UniversalAuthBackend.java index 76a9fd676f..b0360e4e18 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/UniversalAuthBackend.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/UniversalAuthBackend.java @@ -19,14 +19,10 @@ import static com.google.common.base.Preconditions.checkNotNull; import com.google.gerrit.extensions.registration.DynamicSet; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.util.ArrayList; import java.util.List; -/** - * Universal implementation of the AuthBackend that works with the injected - * set of AuthBackends. - */ +/** Universal implementation of the AuthBackend that works with the injected set of AuthBackends. */ @Singleton public final class UniversalAuthBackend implements AuthBackend { private final DynamicSet authBackends; @@ -59,14 +55,15 @@ public final class UniversalAuthBackend implements AuthBackend { throw new MissingCredentialsException(); } - String msg = String.format("Multiple AuthBackends attempted to handle request:" - + " authUsers=%s authExs=%s", authUsers, authExs); + String msg = + String.format( + "Multiple AuthBackends attempted to handle request:" + " authUsers=%s authExs=%s", + authUsers, authExs); throw new AuthException(msg); } @Override public String getDomain() { - throw new UnsupportedOperationException( - "UniversalAuthBackend doesn't support domain."); + throw new UnsupportedOperationException("UniversalAuthBackend doesn't support domain."); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/UnknownUserException.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/UnknownUserException.java index 124912ab6c..289d7d8e41 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/UnknownUserException.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/UnknownUserException.java @@ -15,14 +15,12 @@ package com.google.gerrit.server.auth; /** - * An authentication exception that is thrown when credentials are presented for - * an unknown user. + * An authentication exception that is thrown when credentials are presented for an unknown user. */ public class UnknownUserException extends AuthException { private static final long serialVersionUID = 1626186166924670754L; - public UnknownUserException() { - } + public UnknownUserException() {} public UnknownUserException(String msg) { super(msg); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/UserNotAllowedException.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/UserNotAllowedException.java index 2420330295..1b23cb1ab1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/UserNotAllowedException.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/UserNotAllowedException.java @@ -15,15 +15,13 @@ package com.google.gerrit.server.auth; /** - * An authentication exception that is thrown when the user credentials are - * valid, but not allowed to authenticate for other reasons i.e. account - * disabled. + * An authentication exception that is thrown when the user credentials are valid, but not allowed + * to authenticate for other reasons i.e. account disabled. */ public class UserNotAllowedException extends AuthException { private static final long serialVersionUID = -1531411999932922558L; - public UserNotAllowedException() { - } + public UserNotAllowedException() {} public UserNotAllowedException(String msg) { super(msg); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/Helper.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/Helper.java index 1e453870f9..1acd647d33 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/Helper.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/Helper.java @@ -28,9 +28,6 @@ import com.google.gerrit.util.ssl.BlindSSLSocketFactory; import com.google.inject.Inject; import com.google.inject.Singleton; import com.google.inject.name.Named; - -import org.eclipse.jgit.lib.Config; - import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; import java.util.ArrayList; @@ -41,7 +38,6 @@ import java.util.List; import java.util.Properties; import java.util.Set; import java.util.concurrent.TimeUnit; - import javax.naming.CompositeName; import javax.naming.Context; import javax.naming.Name; @@ -55,8 +51,10 @@ import javax.net.ssl.SSLSocketFactory; import javax.security.auth.Subject; import javax.security.auth.login.LoginContext; import javax.security.auth.login.LoginException; +import org.eclipse.jgit.lib.Config; -@Singleton class Helper { +@Singleton +class Helper { static final String LDAP_UUID = "ldap:"; private final Cache> parentGroups; @@ -74,9 +72,9 @@ import javax.security.auth.login.LoginException; private final boolean groupsVisibleToAll; @Inject - Helper(@GerritServerConfig final Config config, - @Named(LdapModule.PARENT_GROUPS_CACHE) - Cache> parentGroups) { + Helper( + @GerritServerConfig final Config config, + @Named(LdapModule.PARENT_GROUPS_CACHE) Cache> parentGroups) { this.config = config; this.server = LdapRealm.optional(config, "server"); this.username = LdapRealm.optional(config, "username"); @@ -84,27 +82,23 @@ import javax.security.auth.login.LoginException; this.referral = LdapRealm.optional(config, "referral", "ignore"); this.sslVerify = config.getBoolean("ldap", "sslverify", true); this.groupsVisibleToAll = config.getBoolean("ldap", "groupsVisibleToAll", false); - this.authentication = - LdapRealm.optional(config, "authentication", "simple"); + this.authentication = LdapRealm.optional(config, "authentication", "simple"); String readTimeout = LdapRealm.optional(config, "readTimeout"); if (readTimeout != null) { readTimeoutMillis = - Long.toString(ConfigUtil.getTimeUnit(readTimeout, 0, - TimeUnit.MILLISECONDS)); + Long.toString(ConfigUtil.getTimeUnit(readTimeout, 0, TimeUnit.MILLISECONDS)); } else { readTimeoutMillis = null; } String connectTimeout = LdapRealm.optional(config, "connectTimeout"); if (connectTimeout != null) { connectTimeoutMillis = - Long.toString(ConfigUtil.getTimeUnit(connectTimeout, 0, - TimeUnit.MILLISECONDS)); + Long.toString(ConfigUtil.getTimeUnit(connectTimeout, 0, TimeUnit.MILLISECONDS)); } else { connectTimeoutMillis = null; } this.parentGroups = parentGroups; - this.useConnectionPooling = - LdapRealm.optional(config, "useConnectionPooling", false); + this.useConnectionPooling = LdapRealm.optional(config, "useConnectionPooling", false); } private Properties createContextProperties() { @@ -141,18 +135,19 @@ import javax.security.auth.login.LoginException; return new InitialDirContext(env); } - private DirContext kerberosOpen(final Properties env) throws LoginException, - NamingException { + private DirContext kerberosOpen(final Properties env) throws LoginException, NamingException { LoginContext ctx = new LoginContext("KerberosLogin"); ctx.login(); Subject subject = ctx.getSubject(); try { - return Subject.doAs(subject, new PrivilegedExceptionAction() { - @Override - public DirContext run() throws NamingException { - return new InitialDirContext(env); - } - }); + return Subject.doAs( + subject, + new PrivilegedExceptionAction() { + @Override + public DirContext run() throws NamingException { + return new InitialDirContext(env); + } + }); } catch (PrivilegedActionException e) { Throwables.throwIfInstanceOf(e.getException(), NamingException.class); Throwables.throwIfInstanceOf(e.getException(), RuntimeException.class); @@ -187,8 +182,8 @@ import javax.security.auth.login.LoginException; return ldapSchema; } - LdapQuery.Result findAccount(Helper.LdapSchema schema, - DirContext ctx, String username, boolean fetchMemberOf) + LdapQuery.Result findAccount( + Helper.LdapSchema schema, DirContext ctx, String username, boolean fetchMemberOf) throws NamingException, AccountException { final HashMap params = new HashMap<>(); params.put(LdapRealm.USERNAME, username); @@ -211,8 +206,8 @@ import javax.security.auth.login.LoginException; throw new NoSuchUserException(username); } - Set queryForGroups(final DirContext ctx, - final String username, LdapQuery.Result account) + Set queryForGroups( + final DirContext ctx, final String username, LdapQuery.Result account) throws NamingException { final LdapSchema schema = getSchema(ctx); final Set groupDNs = new HashSet<>(); @@ -274,9 +269,13 @@ import javax.security.auth.login.LoginException; return ImmutableSet.copyOf(actual); } - private void recursivelyExpandGroups(final Set groupDNs, - final LdapSchema schema, final DirContext ctx, final String groupDN) { - if (groupDNs.add(groupDN) && schema.accountMemberField != null + private void recursivelyExpandGroups( + final Set groupDNs, + final LdapSchema schema, + final DirContext ctx, + final String groupDN) { + if (groupDNs.add(groupDN) + && schema.accountMemberField != null && schema.accountMemberExpandGroups) { ImmutableSet cachedParentsDNs = parentGroups.getIfPresent(groupDN); if (cachedParentsDNs == null) { @@ -286,7 +285,7 @@ import javax.security.auth.login.LoginException; final Name compositeGroupName = new CompositeName().add(groupDN); final Attribute in = ctx.getAttributes(compositeGroupName, schema.accountMemberFieldArray) - .get(schema.accountMemberField); + .get(schema.accountMemberField); if (in != null) { final NamingEnumeration groups = in.getAll(); try { @@ -352,11 +351,13 @@ import javax.security.auth.login.LoginException; for (String groupBase : groupBases) { if (groupMemberPattern != null) { final LdapQuery groupMemberQuery = - new LdapQuery(groupBase, groupScope, new ParameterizedString( - groupMemberPattern), Collections. emptySet()); + new LdapQuery( + groupBase, + groupScope, + new ParameterizedString(groupMemberPattern), + Collections.emptySet()); if (groupMemberQuery.getParameters().isEmpty()) { - throw new IllegalArgumentException( - "No variables in ldap.groupMemberPattern"); + throw new IllegalArgumentException("No variables in ldap.groupMemberPattern"); } for (final String name : groupMemberQuery.getParameters()) { @@ -369,14 +370,12 @@ import javax.security.auth.login.LoginException; // Account query // - accountFullName = - LdapRealm.paramString(config, "accountFullName", type.accountFullName()); + accountFullName = LdapRealm.paramString(config, "accountFullName", type.accountFullName()); if (accountFullName != null) { accountAtts.addAll(accountFullName.getParameterNames()); } accountEmailAddress = - LdapRealm.paramString(config, "accountEmailAddress", type - .accountEmailAddress()); + LdapRealm.paramString(config, "accountEmailAddress", type.accountEmailAddress()); if (accountEmailAddress != null) { accountAtts.addAll(accountEmailAddress.getParameterNames()); } @@ -393,8 +392,7 @@ import javax.security.auth.login.LoginException; accountMemberFieldArray = null; } accountMemberExpandGroups = - LdapRealm.optional(config, "accountMemberExpandGroups", - type.accountMemberExpandGroups()); + LdapRealm.optional(config, "accountMemberExpandGroups", type.accountMemberExpandGroups()); final SearchScope accountScope = LdapRealm.scope(config, "accountScope"); final String accountPattern = @@ -409,18 +407,20 @@ import javax.security.auth.login.LoginException; } for (String accountBase : LdapRealm.requiredList(config, "accountBase")) { LdapQuery accountQuery = - new LdapQuery(accountBase, accountScope, new ParameterizedString( - accountPattern), accountAtts); + new LdapQuery( + accountBase, accountScope, new ParameterizedString(accountPattern), accountAtts); if (accountQuery.getParameters().isEmpty()) { - throw new IllegalArgumentException( - "No variables in ldap.accountPattern"); + throw new IllegalArgumentException("No variables in ldap.accountPattern"); } accountQueryList.add(accountQuery); if (accountWithMemberOfAtts != null) { LdapQuery accountWithMemberOfQuery = - new LdapQuery(accountBase, accountScope, new ParameterizedString( - accountPattern), accountWithMemberOfAtts); + new LdapQuery( + accountBase, + accountScope, + new ParameterizedString(accountPattern), + accountWithMemberOfAtts); accountWithMemberOfQueryList.add(accountWithMemberOfQuery); } } @@ -430,8 +430,11 @@ import javax.security.auth.login.LoginException; try { return LdapType.guessType(ctx); } catch (NamingException e) { - LdapRealm.log.warn("Cannot discover type of LDAP server at " + server - + ", assuming the server is RFC 2307 compliant.", e); + LdapRealm.log.warn( + "Cannot discover type of LDAP server at " + + server + + ", assuming the server is RFC 2307 compliant.", + e); return LdapType.RFC_2307; } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapAuthBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapAuthBackend.java index 3dddf4d975..2854294287 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapAuthBackend.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapAuthBackend.java @@ -27,20 +27,15 @@ import com.google.gerrit.server.auth.UserNotAllowedException; import com.google.gerrit.server.config.AuthConfig; import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; - +import java.util.Locale; +import javax.naming.NamingException; +import javax.naming.directory.DirContext; +import javax.security.auth.login.LoginException; import org.eclipse.jgit.lib.Config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Locale; - -import javax.naming.NamingException; -import javax.naming.directory.DirContext; -import javax.security.auth.login.LoginException; - -/** - * Implementation of AuthBackend for the LDAP authentication system. - */ +/** Implementation of AuthBackend for the LDAP authentication system. */ public class LdapAuthBackend implements AuthBackend { private static final Logger log = LoggerFactory.getLogger(LdapAuthBackend.class); @@ -49,13 +44,10 @@ public class LdapAuthBackend implements AuthBackend { private final boolean lowerCaseUsername; @Inject - public LdapAuthBackend(Helper helper, - AuthConfig authConfig, - @GerritServerConfig Config config) { + public LdapAuthBackend(Helper helper, AuthConfig authConfig, @GerritServerConfig Config config) { this.helper = helper; this.authConfig = authConfig; - this.lowerCaseUsername = - config.getBoolean("ldap", "localUsernameToLowerCase", false); + this.lowerCaseUsername = config.getBoolean("ldap", "localUsernameToLowerCase", false); } @Override @@ -65,15 +57,14 @@ public class LdapAuthBackend implements AuthBackend { @Override public AuthUser authenticate(AuthRequest req) - throws MissingCredentialsException, InvalidCredentialsException, - UnknownUserException, UserNotAllowedException, AuthException { + throws MissingCredentialsException, InvalidCredentialsException, UnknownUserException, + UserNotAllowedException, AuthException { if (req.getUsername() == null) { throw new MissingCredentialsException(); } - final String username = lowerCaseUsername - ? req.getUsername().toLowerCase(Locale.US) - : req.getUsername(); + final String username = + lowerCaseUsername ? req.getUsername().toLowerCase(Locale.US) : req.getUsername(); try { final DirContext ctx; if (authConfig.getAuthType() == AuthType.LDAP_BIND) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupBackend.java index bd4a3b0de5..8511318d4c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupBackend.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupBackend.java @@ -37,27 +37,22 @@ import com.google.gerrit.server.project.ProjectControl; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.name.Named; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.concurrent.ExecutionException; - import javax.naming.InvalidNameException; import javax.naming.NamingException; import javax.naming.directory.DirContext; import javax.naming.ldap.LdapName; import javax.naming.ldap.Rdn; import javax.security.auth.login.LoginException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -/** - * Implementation of GroupBackend for the LDAP group system. - */ +/** Implementation of GroupBackend for the LDAP group system. */ public class LdapGroupBackend implements GroupBackend { static final Logger log = LoggerFactory.getLogger(LdapGroupBackend.class); @@ -88,11 +83,10 @@ public class LdapGroupBackend implements GroupBackend { return uuid.get().startsWith(LDAP_UUID); } - private static GroupReference groupReference(ParameterizedString p, - LdapQuery.Result res) throws NamingException { + private static GroupReference groupReference(ParameterizedString p, LdapQuery.Result res) + throws NamingException { return new GroupReference( - new AccountGroup.UUID(LDAP_UUID + res.getDN()), - LDAP_NAME + LdapRealm.apply(p, res)); + new AccountGroup.UUID(LDAP_UUID + res.getDN()), LDAP_NAME + LdapRealm.apply(p, res)); } private static String cnFor(String dn) { @@ -125,8 +119,7 @@ public class LdapGroupBackend implements GroupBackend { String groupDn = uuid.get().substring(LDAP_UUID.length()); CurrentUser user = userProvider.get(); - if (!(user.isIdentifiedUser()) - || !membershipsOf(user.asIdentifiedUser()).contains(uuid)) { + if (!(user.isIdentifiedUser()) || !membershipsOf(user.asIdentifiedUser()).contains(uuid)) { try { if (!existsCache.get(groupDn)) { return null; @@ -196,7 +189,6 @@ public class LdapGroupBackend implements GroupBackend { return null; } - private Set suggestLdap(String name) { if (name.isEmpty()) { return Collections.emptySet(); @@ -209,14 +201,12 @@ public class LdapGroupBackend implements GroupBackend { // Do exact lookups until there are at least 3 characters. name = Rdn.escapeValue(name) + ((name.length() >= 3) ? "*" : ""); LdapSchema schema = helper.getSchema(ctx); - ParameterizedString filter = ParameterizedString.asis( - schema.groupPattern.replace(GROUPNAME, name).toString()); - Set returnAttrs = - new HashSet<>(schema.groupName.getParameterNames()); + ParameterizedString filter = + ParameterizedString.asis(schema.groupPattern.replace(GROUPNAME, name).toString()); + Set returnAttrs = new HashSet<>(schema.groupName.getParameterNames()); Map params = Collections.emptyMap(); for (String groupBase : schema.groupBases) { - LdapQuery query = new LdapQuery( - groupBase, schema.groupScope, filter, returnAttrs); + LdapQuery query = new LdapQuery(groupBase, schema.groupScope, filter, returnAttrs); for (LdapQuery.Result res : query.query(ctx, params)) { out.add(groupReference(schema.groupName, res)); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupMembership.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupMembership.java index 785332037f..7bef2e7e06 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupMembership.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupMembership.java @@ -19,7 +19,6 @@ import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gerrit.server.account.GroupMembership; import com.google.gerrit.server.account.ListGroupMembership; import com.google.gerrit.server.project.ProjectCache; - import java.util.HashSet; import java.util.Set; import java.util.concurrent.ExecutionException; @@ -66,8 +65,7 @@ class LdapGroupMembership implements GroupMembership { try { membership = new ListGroupMembership(membershipCache.get(id)); } catch (ExecutionException e) { - LdapGroupBackend.log.warn(String.format( - "Cannot lookup membershipsOf %s in LDAP", id), e); + LdapGroupBackend.log.warn(String.format("Cannot lookup membershipsOf %s in LDAP", id), e); membership = GroupMembership.EMPTY; } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapModule.java index 217df2f4df..05228b4168 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapModule.java @@ -25,7 +25,6 @@ import com.google.gerrit.server.account.Realm; import com.google.gerrit.server.cache.CacheModule; import com.google.inject.Scopes; import com.google.inject.TypeLiteral; - import java.util.Optional; import java.util.Set; @@ -35,30 +34,21 @@ public class LdapModule extends CacheModule { static final String GROUP_EXIST_CACHE = "ldap_group_existence"; static final String PARENT_GROUPS_CACHE = "ldap_groups_byinclude"; - @Override protected void configure() { - cache(GROUP_CACHE, - String.class, - new TypeLiteral>() {}) - .expireAfterWrite(1, HOURS) - .loader(LdapRealm.MemberLoader.class); + cache(GROUP_CACHE, String.class, new TypeLiteral>() {}) + .expireAfterWrite(1, HOURS) + .loader(LdapRealm.MemberLoader.class); - cache(USERNAME_CACHE, - String.class, - new TypeLiteral>() {}) - .loader(LdapRealm.UserLoader.class); + cache(USERNAME_CACHE, String.class, new TypeLiteral>() {}) + .loader(LdapRealm.UserLoader.class); - cache(GROUP_EXIST_CACHE, - String.class, - new TypeLiteral() {}) - .expireAfterWrite(1, HOURS) - .loader(LdapRealm.ExistenceLoader.class); + cache(GROUP_EXIST_CACHE, String.class, new TypeLiteral() {}) + .expireAfterWrite(1, HOURS) + .loader(LdapRealm.ExistenceLoader.class); - cache(PARENT_GROUPS_CACHE, - String.class, - new TypeLiteral>() {}) - .expireAfterWrite(1, HOURS); + cache(PARENT_GROUPS_CACHE, String.class, new TypeLiteral>() {}) + .expireAfterWrite(1, HOURS); bind(Helper.class); bind(Realm.class).to(LdapRealm.class).in(Scopes.SINGLETON); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapQuery.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapQuery.java index e9ae8f529f..28eb05da44 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapQuery.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapQuery.java @@ -15,14 +15,12 @@ package com.google.gerrit.server.auth.ldap; import com.google.gerrit.common.data.ParameterizedString; - import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; - import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.PartialResultException; @@ -41,8 +39,11 @@ class LdapQuery { private final ParameterizedString pattern; private final String[] returnAttributes; - LdapQuery(final String base, final SearchScope searchScope, - final ParameterizedString pattern, final Set returnAttributes) { + LdapQuery( + final String base, + final SearchScope searchScope, + final ParameterizedString pattern, + final Set returnAttributes) { this.base = base; this.searchScope = searchScope; @@ -126,9 +127,9 @@ class LdapQuery { @Override public String toString() { try { - return getDN(); + return getDN(); } catch (NamingException e) { - return ""; + return ""; } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapRealm.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapRealm.java index 4af066f853..0e05330b2e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapRealm.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapRealm.java @@ -39,11 +39,6 @@ import com.google.gwtorm.server.SchemaFactory; import com.google.inject.Inject; import com.google.inject.Singleton; import com.google.inject.name.Named; - -import org.eclipse.jgit.lib.Config; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; @@ -53,12 +48,14 @@ import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.concurrent.ExecutionException; - import javax.naming.CompositeName; import javax.naming.Name; import javax.naming.NamingException; import javax.naming.directory.DirContext; import javax.security.auth.login.LoginException; +import org.eclipse.jgit.lib.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Singleton class LdapRealm extends AbstractRealm { @@ -85,8 +82,10 @@ class LdapRealm extends AbstractRealm { AuthConfig authConfig, EmailExpander emailExpander, LdapGroupBackend groupBackend, - @Named(LdapModule.GROUP_CACHE) final LoadingCache> membershipCache, - @Named(LdapModule.USERNAME_CACHE) final LoadingCache> usernameCache, + @Named(LdapModule.GROUP_CACHE) + final LoadingCache> membershipCache, + @Named(LdapModule.USERNAME_CACHE) + final LoadingCache> usernameCache, @GerritServerConfig final Config config) { this.helper = helper; this.authConfig = authConfig; @@ -144,14 +143,12 @@ class LdapRealm extends AbstractRealm { return v; } - static List optionalList(final Config config, - final String name) { + static List optionalList(final Config config, final String name) { String[] s = config.getStringList("ldap", null, name); return Arrays.asList(s); } - static List requiredList(final Config config, - final String name) { + static List requiredList(final Config config, final String name) { List vlist = optionalList(config, name); if (vlist.isEmpty()) { @@ -194,11 +191,10 @@ class LdapRealm extends AbstractRealm { } } - private static void checkBackendCompliance(String configOption, - String suppliedValue, boolean disabledByBackend) { + private static void checkBackendCompliance( + String configOption, String suppliedValue, boolean disabledByBackend) { if (disabledByBackend && !Strings.isNullOrEmpty(suppliedValue)) { - String msg = String.format("LDAP backend doesn't support: ldap.%s", - configOption); + String msg = String.format("LDAP backend doesn't support: ldap.%s", configOption); log.error(msg); throw new IllegalArgumentException(msg); } @@ -209,8 +205,7 @@ class LdapRealm extends AbstractRealm { return !readOnlyAccountFields.contains(field); } - static String apply(ParameterizedString p, LdapQuery.Result m) - throws NamingException { + static String apply(ParameterizedString p, LdapQuery.Result m) throws NamingException { if (p == null) { return null; } @@ -225,8 +220,7 @@ class LdapRealm extends AbstractRealm { } @Override - public AuthRequest authenticate(final AuthRequest who) - throws AccountException { + public AuthRequest authenticate(final AuthRequest who) throws AccountException { if (config.getBoolean("ldap", "localUsernameToLowerCase", false)) { who.setLocalUser(who.getLocalUser().toLowerCase(Locale.US)); } @@ -241,8 +235,7 @@ class LdapRealm extends AbstractRealm { } try { final Helper.LdapSchema schema = helper.getSchema(ctx); - final LdapQuery.Result m = helper.findAccount(schema, ctx, username, - fetchMemberOfEagerly); + final LdapQuery.Result m = helper.findAccount(schema, ctx, username, fetchMemberOfEagerly); if (authConfig.getAuthType() == AuthType.LDAP && !who.isSkipAuthentication()) { // We found the user account, but we need to verify @@ -277,12 +270,11 @@ class LdapRealm extends AbstractRealm { GroupReference mandatoryGroupRef = GroupBackends.findExactSuggestion(groupBackend, mandatoryGroup); if (mandatoryGroupRef == null) { - throw new AccountException("Could not identify mandatory group: " + - mandatoryGroup); + throw new AccountException("Could not identify mandatory group: " + mandatoryGroup); } if (!groups.contains(mandatoryGroupRef.getUUID())) { - throw new AccountException("Not member of mandatory LDAP group: " + - mandatoryGroupRef.getName()); + throw new AccountException( + "Not member of mandatory LDAP group: " + mandatoryGroupRef.getName()); } } // Regardless if we enabled fetchMemberOfEagerly, we already have the @@ -337,8 +329,7 @@ class LdapRealm extends AbstractRealm { public Optional load(String username) throws Exception { try (ReviewDb db = schema.open()) { return Optional.ofNullable( - db.accountExternalIds().get( - new AccountExternalId.Key(SCHEME_GERRIT, username))) + db.accountExternalIds().get(new AccountExternalId.Key(SCHEME_GERRIT, username))) .map(AccountExternalId::getAccountId); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapType.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapType.java index 4e68653929..5df13f9a75 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapType.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapType.java @@ -25,8 +25,9 @@ abstract class LdapType { static LdapType guessType(final DirContext ctx) throws NamingException { final Attributes rootAtts = ctx.getAttributes(""); Attribute supported = rootAtts.get("supportedCapabilities"); - if (supported != null && (supported.contains("1.2.840.113556.1.4.800") - || supported.contains("1.2.840.113556.1.4.1851"))) { + if (supported != null + && (supported.contains("1.2.840.113556.1.4.800") + || supported.contains("1.2.840.113556.1.4.1851"))) { return new ActiveDirectory(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/oauth/OAuthRealm.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/oauth/OAuthRealm.java index 6b9228988e..a1d9350542 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/oauth/OAuthRealm.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/oauth/OAuthRealm.java @@ -27,12 +27,10 @@ import com.google.gerrit.server.account.AuthRequest; import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.Config; - import java.io.IOException; import java.util.HashSet; import java.util.Set; +import org.eclipse.jgit.lib.Config; @Singleton public class OAuthRealm extends AbstractRealm { @@ -40,8 +38,7 @@ public class OAuthRealm extends AbstractRealm { private final Set editableAccountFields; @Inject - OAuthRealm(DynamicMap loginProviders, - @GerritServerConfig Config config) { + OAuthRealm(DynamicMap loginProviders, @GerritServerConfig Config config) { this.loginProviders = loginProviders; this.editableAccountFields = new HashSet<>(); // User name should be always editable, because not all OAuth providers @@ -61,23 +58,17 @@ public class OAuthRealm extends AbstractRealm { } /** - * Authenticates with the {@link OAuthLoginProvider} specified - * in the authentication request. + * Authenticates with the {@link OAuthLoginProvider} specified in the authentication request. * - * {@link AccountManager} calls this method without password - * if authenticity of the user has already been established. - * In that case we can skip the authentication request to the - * {@code OAuthLoginService}. + *

{@link AccountManager} calls this method without password if authenticity of the user has + * already been established. In that case we can skip the authentication request to the {@code + * OAuthLoginService}. * * @param who the authentication request. - * - * @return the authentication request with resolved email address - * and display name in case the authenticity of the user could - * be established; otherwise {@code who} is returned unchanged. - * - * @throws AccountException if the authentication request with - * the OAuth2 server failed or no {@code OAuthLoginProvider} was - * available to handle the request. + * @return the authentication request with resolved email address and display name in case the + * authenticity of the user could be established; otherwise {@code who} is returned unchanged. + * @throws AccountException if the authentication request with the OAuth2 server failed or no + * {@code OAuthLoginProvider} was available to handle the request. */ @Override public AuthRequest authenticate(AuthRequest who) throws AccountException { @@ -118,8 +109,7 @@ public class OAuthRealm extends AbstractRealm { } @Override - public void onCreateAccount(AuthRequest who, Account account) { - } + public void onCreateAccount(AuthRequest who, Account account) {} @Override public Account.Id lookup(String accountName) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/oauth/OAuthTokenCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/oauth/OAuthTokenCache.java index 94bdb0618d..1ac3bca354 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/oauth/OAuthTokenCache.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/oauth/OAuthTokenCache.java @@ -45,7 +45,8 @@ public class OAuthTokenCache { private final Cache cache; @Inject - OAuthTokenCache(@Named(OAUTH_TOKENS) Cache cache, + OAuthTokenCache( + @Named(OAUTH_TOKENS) Cache cache, DynamicItem encrypter) { this.cache = cache; this.encrypter = encrypter; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/openid/OpenIdProviderPattern.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/openid/OpenIdProviderPattern.java index 7e15f523ff..43500377ba 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/openid/OpenIdProviderPattern.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/openid/OpenIdProviderPattern.java @@ -27,8 +27,7 @@ public class OpenIdProviderPattern { protected boolean regex; protected String pattern; - protected OpenIdProviderPattern() { - } + protected OpenIdProviderPattern() {} public boolean matches(String id) { return regex ? id.matches(pattern) : id.startsWith(pattern); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/avatar/AvatarProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/avatar/AvatarProvider.java index 571a7e5307..72134c14de 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/avatar/AvatarProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/avatar/AvatarProvider.java @@ -20,7 +20,7 @@ import com.google.gerrit.server.IdentifiedUser; /** * Provide avatar URLs for specified user. * - * Invoked by Gerrit when Avatar image requests are made. + *

Invoked by Gerrit when Avatar image requests are made. */ @ExtensionPoint public interface AvatarProvider { @@ -28,14 +28,13 @@ public interface AvatarProvider { * Get avatar URL. * * @param forUser The user for which to load an avatar image - * @param imageSize A requested image size, in pixels. An imageSize of 0 - * indicates to use whatever default size the provider determines. - * AvatarProviders may ignore the requested image size. The web - * interface will resize any image to match imageSize, so ideally the - * provider should return an image sized correctly. - * @return a URL of an avatar image for the specified user. A return value of - * {@code null} is acceptable, and results in the server responding - * with a 404. This will hide the avatar image in the web UI. + * @param imageSize A requested image size, in pixels. An imageSize of 0 indicates to use whatever + * default size the provider determines. AvatarProviders may ignore the requested image size. + * The web interface will resize any image to match imageSize, so ideally the provider should + * return an image sized correctly. + * @return a URL of an avatar image for the specified user. A return value of {@code null} is + * acceptable, and results in the server responding with a 404. This will hide the avatar + * image in the web UI. */ String getUrl(IdentifiedUser forUser, int imageSize); @@ -43,8 +42,8 @@ public interface AvatarProvider { * Gets a URL for a user to modify their avatar image. * * @param forUser The user wishing to change their avatar image - * @return a URL the user should visit to modify their avatar, or null if - * modification is not possible. + * @return a URL the user should visit to modify their avatar, or null if modification is not + * possible. */ String getChangeAvatarUrl(IdentifiedUser forUser); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheBinding.java b/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheBinding.java index 343827cb83..abb0f326ed 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheBinding.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheBinding.java @@ -18,7 +18,6 @@ import com.google.common.cache.CacheLoader; import com.google.common.cache.Weigher; import com.google.gerrit.common.Nullable; import com.google.inject.TypeLiteral; - import java.util.concurrent.TimeUnit; /** Configure a cache declared within a {@link CacheModule} instance. */ @@ -39,11 +38,21 @@ public interface CacheBinding { CacheBinding weigher(Class> clazz); String name(); + TypeLiteral keyType(); + TypeLiteral valueType(); + long maximumWeight(); + long diskLimit(); - @Nullable Long expireAfterWrite(TimeUnit unit); - @Nullable Weigher weigher(); - @Nullable CacheLoader loader(); + + @Nullable + Long expireAfterWrite(TimeUnit unit); + + @Nullable + Weigher weigher(); + + @Nullable + CacheLoader loader(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheMetrics.java b/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheMetrics.java index ebf8259eec..862f4e8946 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheMetrics.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheMetrics.java @@ -25,65 +25,71 @@ import com.google.gerrit.metrics.Field; import com.google.gerrit.metrics.MetricMaker; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.util.Set; @Singleton public class CacheMetrics { @Inject - public CacheMetrics(MetricMaker metrics, - final DynamicMap> cacheMap) { + public CacheMetrics(MetricMaker metrics, final DynamicMap> cacheMap) { Field F_NAME = Field.ofString("cache_name"); final CallbackMetric1 memEnt = - metrics.newCallbackMetric("caches/memory_cached", Long.class, + metrics.newCallbackMetric( + "caches/memory_cached", + Long.class, new Description("Memory entries").setGauge().setUnit("entries"), F_NAME); final CallbackMetric1 memHit = - metrics.newCallbackMetric("caches/memory_hit_ratio", Double.class, + metrics.newCallbackMetric( + "caches/memory_hit_ratio", + Double.class, new Description("Memory hit ratio").setGauge().setUnit("percent"), F_NAME); final CallbackMetric1 memEvict = - metrics.newCallbackMetric("caches/memory_eviction_count", Long.class, - new Description("Memory eviction count").setGauge() - .setUnit("evicted entries"), + metrics.newCallbackMetric( + "caches/memory_eviction_count", + Long.class, + new Description("Memory eviction count").setGauge().setUnit("evicted entries"), F_NAME); final CallbackMetric1 perDiskEnt = - metrics.newCallbackMetric("caches/disk_cached", Long.class, - new Description("Disk entries used by persistent cache").setGauge() - .setUnit("entries"), + metrics.newCallbackMetric( + "caches/disk_cached", + Long.class, + new Description("Disk entries used by persistent cache").setGauge().setUnit("entries"), F_NAME); final CallbackMetric1 perDiskHit = - metrics.newCallbackMetric("caches/disk_hit_ratio", Double.class, - new Description("Disk hit ratio for persistent cache").setGauge() - .setUnit("percent"), + metrics.newCallbackMetric( + "caches/disk_hit_ratio", + Double.class, + new Description("Disk hit ratio for persistent cache").setGauge().setUnit("percent"), F_NAME); final Set> cacheMetrics = - ImmutableSet.> of(memEnt, memHit, memEvict, - perDiskEnt, perDiskHit); + ImmutableSet.>of(memEnt, memHit, memEvict, perDiskEnt, perDiskHit); - metrics.newTrigger(cacheMetrics, new Runnable() { - @Override - public void run() { - for (DynamicMap.Entry> e : cacheMap) { - Cache c = e.getProvider().get(); - String name = metricNameOf(e); - CacheStats cstats = c.stats(); - memEnt.set(name, c.size()); - memHit.set(name, cstats.hitRate() * 100); - memEvict.set(name, cstats.evictionCount()); - if (c instanceof PersistentCache) { - PersistentCache.DiskStats d = ((PersistentCache) c).diskStats(); - perDiskEnt.set(name, d.size()); - perDiskHit.set(name, hitRatio(d)); + metrics.newTrigger( + cacheMetrics, + new Runnable() { + @Override + public void run() { + for (DynamicMap.Entry> e : cacheMap) { + Cache c = e.getProvider().get(); + String name = metricNameOf(e); + CacheStats cstats = c.stats(); + memEnt.set(name, c.size()); + memHit.set(name, cstats.hitRate() * 100); + memEvict.set(name, cstats.evictionCount()); + if (c instanceof PersistentCache) { + PersistentCache.DiskStats d = ((PersistentCache) c).diskStats(); + perDiskEnt.set(name, d.size()); + perDiskHit.set(name, hitRatio(d)); + } + } + for (CallbackMetric cbm : cacheMetrics) { + cbm.prune(); + } } - } - for (CallbackMetric cbm : cacheMetrics) { - cbm.prune(); - } - } - }); + }); } private static double hitRatio(PersistentCache.DiskStats d) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheModule.java index 9f51de7e0a..e68eb43256 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheModule.java @@ -26,16 +26,12 @@ import com.google.inject.Scopes; import com.google.inject.TypeLiteral; import com.google.inject.name.Names; import com.google.inject.util.Types; - import java.io.Serializable; import java.lang.reflect.Type; -/** - * Miniature DSL to support binding {@link Cache} instances in Guice. - */ +/** Miniature DSL to support binding {@link Cache} instances in Guice. */ public abstract class CacheModule extends FactoryModule { - private static final TypeLiteral> ANY_CACHE = - new TypeLiteral>() {}; + private static final TypeLiteral> ANY_CACHE = new TypeLiteral>() {}; /** * Declare a named in-memory cache. @@ -44,10 +40,7 @@ public abstract class CacheModule extends FactoryModule { * @param type of value stored by the cache. * @return binding to describe the cache. */ - protected CacheBinding cache( - String name, - Class keyType, - Class valType) { + protected CacheBinding cache(String name, Class keyType, Class valType) { return cache(name, TypeLiteral.get(keyType), TypeLiteral.get(valType)); } @@ -58,10 +51,7 @@ public abstract class CacheModule extends FactoryModule { * @param type of value stored by the cache. * @return binding to describe the cache. */ - protected CacheBinding cache( - String name, - Class keyType, - TypeLiteral valType) { + protected CacheBinding cache(String name, Class keyType, TypeLiteral valType) { return cache(name, TypeLiteral.get(keyType), valType); } @@ -73,12 +63,8 @@ public abstract class CacheModule extends FactoryModule { * @return binding to describe the cache. */ protected CacheBinding cache( - String name, - TypeLiteral keyType, - TypeLiteral valType) { - Type type = Types.newParameterizedType( - Cache.class, - keyType.getType(), valType.getType()); + String name, TypeLiteral keyType, TypeLiteral valType) { + Type type = Types.newParameterizedType(Cache.class, keyType.getType(), valType.getType()); @SuppressWarnings("unchecked") Key> key = (Key>) Key.get(type, Names.named(name)); @@ -89,24 +75,21 @@ public abstract class CacheModule extends FactoryModule { return m.maximumWeight(1024); } - Provider> bindCacheLoader( - CacheProvider m, - Class> impl) { - Type type = Types.newParameterizedType( - Cache.class, - m.keyType().getType(), m.valueType().getType()); + Provider> bindCacheLoader( + CacheProvider m, Class> impl) { + Type type = + Types.newParameterizedType(Cache.class, m.keyType().getType(), m.valueType().getType()); - Type loadingType = Types.newParameterizedType( - LoadingCache.class, - m.keyType().getType(), m.valueType().getType()); + Type loadingType = + Types.newParameterizedType( + LoadingCache.class, m.keyType().getType(), m.valueType().getType()); - Type loaderType = Types.newParameterizedType( - CacheLoader.class, - m.keyType().getType(), m.valueType().getType()); + Type loaderType = + Types.newParameterizedType( + CacheLoader.class, m.keyType().getType(), m.valueType().getType()); @SuppressWarnings("unchecked") - Key> key = - (Key>) Key.get(type, Names.named(m.name)); + Key> key = (Key>) Key.get(type, Names.named(m.name)); @SuppressWarnings("unchecked") Key> loadingKey = @@ -121,16 +104,13 @@ public abstract class CacheModule extends FactoryModule { return getProvider(loaderKey); } - Provider> bindWeigher( - CacheProvider m, - Class> impl) { - Type weigherType = Types.newParameterizedType( - Weigher.class, - m.keyType().getType(), m.valueType().getType()); + Provider> bindWeigher( + CacheProvider m, Class> impl) { + Type weigherType = + Types.newParameterizedType(Weigher.class, m.keyType().getType(), m.valueType().getType()); @SuppressWarnings("unchecked") - Key> key = - (Key>) Key.get(weigherType, Names.named(m.name)); + Key> key = (Key>) Key.get(weigherType, Names.named(m.name)); bind(key).to(impl).in(Scopes.SINGLETON); return getProvider(key); @@ -144,9 +124,7 @@ public abstract class CacheModule extends FactoryModule { * @return binding to describe the cache. */ protected CacheBinding persist( - String name, - Class keyType, - Class valType) { + String name, Class keyType, Class valType) { return persist(name, TypeLiteral.get(keyType), TypeLiteral.get(valType)); } @@ -158,9 +136,7 @@ public abstract class CacheModule extends FactoryModule { * @return binding to describe the cache. */ protected CacheBinding persist( - String name, - Class keyType, - TypeLiteral valType) { + String name, Class keyType, TypeLiteral valType) { return persist(name, TypeLiteral.get(keyType), valType); } @@ -172,10 +148,7 @@ public abstract class CacheModule extends FactoryModule { * @return binding to describe the cache. */ protected CacheBinding persist( - String name, - TypeLiteral keyType, - TypeLiteral valType) { - return ((CacheProvider) cache(name, keyType, valType)) - .persist(true); + String name, TypeLiteral keyType, TypeLiteral valType) { + return ((CacheProvider) cache(name, keyType, valType)).persist(true); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheProvider.java index c73760c259..86df10415d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheProvider.java @@ -26,12 +26,9 @@ import com.google.gerrit.extensions.annotations.PluginName; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.TypeLiteral; - import java.util.concurrent.TimeUnit; -class CacheProvider - implements Provider>, - CacheBinding { +class CacheProvider implements Provider>, CacheBinding { private final CacheModule module; final String name; private final TypeLiteral keyType; @@ -48,10 +45,7 @@ class CacheProvider private PersistentCacheFactory persistentCacheFactory; private boolean frozen; - CacheProvider(CacheModule module, - String name, - TypeLiteral keyType, - TypeLiteral valType) { + CacheProvider(CacheModule module, String name, TypeLiteral keyType, TypeLiteral valType) { this.module = module; this.name = name; this.keyType = keyType; @@ -89,8 +83,7 @@ class CacheProvider @Override public CacheBinding diskLimit(long limit) { Preconditions.checkState(!frozen, "binding frozen, cannot be modified"); - Preconditions.checkState(persist, - "diskLimit supported for persistent caches only"); + Preconditions.checkState(persist, "diskLimit supported for persistent caches only"); diskLimit = limit; return this; } @@ -150,9 +143,7 @@ class CacheProvider @Override @Nullable public Long expireAfterWrite(TimeUnit unit) { - return expireAfterWrite != null - ? unit.convert(expireAfterWrite, SECONDS) - : null; + return expireAfterWrite != null ? unit.convert(expireAfterWrite, SECONDS) : null; } @Override diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheRemovalListener.java b/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheRemovalListener.java index bdc12200e7..2f9ed591da 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheRemovalListener.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheRemovalListener.java @@ -16,8 +16,6 @@ package com.google.gerrit.server.cache; import com.google.common.cache.RemovalNotification; -public interface CacheRemovalListener { - void onRemoval(String pluginName, - String cacheName, - RemovalNotification notification); +public interface CacheRemovalListener { + void onRemoval(String pluginName, String cacheName, RemovalNotification notification); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/cache/ForwardingRemovalListener.java b/gerrit-server/src/main/java/com/google/gerrit/server/cache/ForwardingRemovalListener.java index 96b437dc65..be066012d7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/cache/ForwardingRemovalListener.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/cache/ForwardingRemovalListener.java @@ -22,8 +22,8 @@ import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; /** - * This listener dispatches removal events to all other RemovalListeners - * attached via the DynamicSet API. + * This listener dispatches removal events to all other RemovalListeners attached via the DynamicSet + * API. * * @param * @param @@ -39,8 +39,8 @@ public class ForwardingRemovalListener implements RemovalListener { private String pluginName = "gerrit"; @Inject - ForwardingRemovalListener(DynamicSet listeners, - @Assisted String cacheName) { + ForwardingRemovalListener( + DynamicSet listeners, @Assisted String cacheName) { this.listeners = listeners; this.cacheName = cacheName; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/cache/MemoryCacheFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/cache/MemoryCacheFactory.java index 6b8b489611..49fcd5b34f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/cache/MemoryCacheFactory.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/cache/MemoryCacheFactory.java @@ -21,7 +21,5 @@ import com.google.common.cache.LoadingCache; public interface MemoryCacheFactory { Cache build(CacheBinding def); - LoadingCache build( - CacheBinding def, - CacheLoader loader); + LoadingCache build(CacheBinding def, CacheLoader loader); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/cache/PersistentCacheFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/cache/PersistentCacheFactory.java index 0769b2a5d6..c52c2321ad 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/cache/PersistentCacheFactory.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/cache/PersistentCacheFactory.java @@ -22,9 +22,7 @@ import com.google.gerrit.server.plugins.Plugin; public interface PersistentCacheFactory { Cache build(CacheBinding def); - LoadingCache build( - CacheBinding def, - CacheLoader loader); + LoadingCache build(CacheBinding def, CacheLoader loader); void onStop(Plugin plugin); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Abandon.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Abandon.java index 54c217d8e1..2f523e01dc 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Abandon.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Abandon.java @@ -39,15 +39,13 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.util.Collection; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Collection; - @Singleton -public class Abandon implements RestModifyView, - UiAction { +public class Abandon + implements RestModifyView, UiAction { private static final Logger log = LoggerFactory.getLogger(Abandon.class); private final Provider dbProvider; @@ -77,32 +75,30 @@ public class Abandon implements RestModifyView, if (!control.canAbandon(dbProvider.get())) { throw new AuthException("abandon not permitted"); } - Change change = abandon(control, input.message, input.notify, - notifyUtil.resolveAccounts(input.notifyDetails)); + Change change = + abandon( + control, input.message, input.notify, notifyUtil.resolveAccounts(input.notifyDetails)); return json.create(ChangeJson.NO_OPTIONS).format(change); } - public Change abandon(ChangeControl control) - throws RestApiException, UpdateException { + public Change abandon(ChangeControl control) throws RestApiException, UpdateException { return abandon(control, "", NotifyHandling.ALL, ImmutableListMultimap.of()); } public Change abandon(ChangeControl control, String msgTxt) throws RestApiException, UpdateException { - return abandon(control, msgTxt, NotifyHandling.ALL, - ImmutableListMultimap.of()); + return abandon(control, msgTxt, NotifyHandling.ALL, ImmutableListMultimap.of()); } - public Change abandon(ChangeControl control, String msgTxt, + public Change abandon( + ChangeControl control, + String msgTxt, NotifyHandling notifyHandling, ListMultimap accountsToNotify) - throws RestApiException, UpdateException { + throws RestApiException, UpdateException { CurrentUser user = control.getUser(); - Account account = user.isIdentifiedUser() - ? user.asIdentifiedUser().getAccount() - : null; - AbandonOp op = abandonOpFactory.create(account, msgTxt, notifyHandling, - accountsToNotify); + Account account = user.isIdentifiedUser() ? user.asIdentifiedUser().getAccount() : null; + AbandonOp op = abandonOpFactory.create(account, msgTxt, notifyHandling, accountsToNotify); try (BatchUpdate u = batchUpdateFactory.create( dbProvider.get(), @@ -115,55 +111,51 @@ public class Abandon implements RestModifyView, } /** - * If an extension has more than one changes to abandon that belong to the - * same project, they should use the batch instead of abandoning one by one. - *

- * It's the caller's responsibility to ensure that all jobs inside the same - * batch have the matching project from its ChangeControl. Violations will - * result in a ResourceConflictException. + * If an extension has more than one changes to abandon that belong to the same project, they + * should use the batch instead of abandoning one by one. + * + *

It's the caller's responsibility to ensure that all jobs inside the same batch have the + * matching project from its ChangeControl. Violations will result in a ResourceConflictException. */ - public void batchAbandon(Project.NameKey project, CurrentUser user, - Collection controls, String msgTxt, + public void batchAbandon( + Project.NameKey project, + CurrentUser user, + Collection controls, + String msgTxt, NotifyHandling notifyHandling, ListMultimap accountsToNotify) - throws RestApiException, UpdateException { + throws RestApiException, UpdateException { if (controls.isEmpty()) { return; } - Account account = user.isIdentifiedUser() - ? user.asIdentifiedUser().getAccount() - : null; - try (BatchUpdate u = batchUpdateFactory.create( - dbProvider.get(), project, user, TimeUtil.nowTs())) { + Account account = user.isIdentifiedUser() ? user.asIdentifiedUser().getAccount() : null; + try (BatchUpdate u = + batchUpdateFactory.create(dbProvider.get(), project, user, TimeUtil.nowTs())) { for (ChangeControl control : controls) { if (!project.equals(control.getProject().getNameKey())) { throw new ResourceConflictException( String.format( "Project name \"%s\" doesn't match \"%s\"", - control.getProject().getNameKey().get(), - project.get())); + control.getProject().getNameKey().get(), project.get())); } u.addOp( control.getId(), - abandonOpFactory.create(account, msgTxt, notifyHandling, - accountsToNotify)); + abandonOpFactory.create(account, msgTxt, notifyHandling, accountsToNotify)); } u.execute(); } } - public void batchAbandon(Project.NameKey project, CurrentUser user, - Collection controls, String msgTxt) + public void batchAbandon( + Project.NameKey project, CurrentUser user, Collection controls, String msgTxt) throws RestApiException, UpdateException { - batchAbandon(project, user, controls, msgTxt, NotifyHandling.ALL, - ImmutableListMultimap.of()); + batchAbandon(project, user, controls, msgTxt, NotifyHandling.ALL, ImmutableListMultimap.of()); } - public void batchAbandon(Project.NameKey project, CurrentUser user, - Collection controls) + public void batchAbandon( + Project.NameKey project, CurrentUser user, Collection controls) throws RestApiException, UpdateException { - batchAbandon(project, user, controls, "", NotifyHandling.ALL, - ImmutableListMultimap.of()); + batchAbandon(project, user, controls, "", NotifyHandling.ALL, ImmutableListMultimap.of()); } @Override @@ -175,10 +167,11 @@ public class Abandon implements RestModifyView, log.error("Cannot check canAbandon status. Assuming false.", e); } return new UiAction.Description() - .setLabel("Abandon") - .setTitle("Abandon the change") - .setVisible(resource.getChange().getStatus().isOpen() - && resource.getChange().getStatus() != Change.Status.DRAFT - && canAbandon); + .setLabel("Abandon") + .setTitle("Abandon the change") + .setVisible( + resource.getChange().getStatus().isOpen() + && resource.getChange().getStatus() != Change.Status.DRAFT + && canAbandon); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/AbandonUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/AbandonUtil.java index 566e9fa732..7c408c86c1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/AbandonUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/AbandonUtil.java @@ -27,14 +27,12 @@ import com.google.gerrit.server.query.change.ChangeQueryProcessor; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.concurrent.TimeUnit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Singleton public class AbandonUtil { @@ -66,18 +64,14 @@ public class AbandonUtil { } try { - String query = "status:new age:" - + TimeUnit.MILLISECONDS.toMinutes(cfg.getAbandonAfter()) - + "m"; + String query = + "status:new age:" + TimeUnit.MILLISECONDS.toMinutes(cfg.getAbandonAfter()) + "m"; if (!cfg.getAbandonIfMergeable()) { query += " -is:mergeable"; } List changesToAbandon = - queryProcessor - .enforceVisibility(false) - .query(queryBuilder.parse(query)) - .entities(); + queryProcessor.enforceVisibility(false).query(queryBuilder.parse(query)).entities(); ImmutableListMultimap.Builder builder = ImmutableListMultimap.builder(); for (ChangeData cd : changesToAbandon) { @@ -89,14 +83,12 @@ public class AbandonUtil { ListMultimap abandons = builder.build(); String message = cfg.getAbandonMessage(); for (Project.NameKey project : abandons.keySet()) { - Collection changes = - getValidChanges(abandons.get(project), query); + Collection changes = getValidChanges(abandons.get(project), query); try { abandon.batchAbandon(project, internalUser, changes, message); count += changes.size(); } catch (Throwable e) { - StringBuilder msg = - new StringBuilder("Failed to auto-abandon inactive change(s):"); + StringBuilder msg = new StringBuilder("Failed to auto-abandon inactive change(s):"); for (ChangeControl change : changes) { msg.append(" ").append(change.getId().get()); } @@ -104,11 +96,9 @@ public class AbandonUtil { log.error(msg.toString(), e); } } - log.info(String.format("Auto-Abandoned %d of %d changes.", - count, changesToAbandon.size())); + log.info(String.format("Auto-Abandoned %d of %d changes.", count, changesToAbandon.size())); } catch (QueryParseException | OrmException e) { - log.error( - "Failed to query inactive open changes for auto-abandoning.", e); + log.error("Failed to query inactive open changes for auto-abandoning.", e); } } @@ -119,15 +109,15 @@ public class AbandonUtil { for (ChangeControl cc : changeControls) { String newQuery = query + " change:" + cc.getId(); List changesToAbandon = - queryProcessor.enforceVisibility(false) - .query(queryBuilder.parse(newQuery)).entities(); + queryProcessor.enforceVisibility(false).query(queryBuilder.parse(newQuery)).entities(); if (!changesToAbandon.isEmpty()) { validChanges.add(cc); } else { log.debug( "Change data with id \"{}\" does not satisfy the query \"{}\"" + " any more, hence skipping it in clean up", - cc.getId(), query); + cc.getId(), + query); } } return validChanges; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/AccountPatchReviewStore.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/AccountPatchReviewStore.java index 1ea84040f6..944b2cb9d1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/AccountPatchReviewStore.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/AccountPatchReviewStore.java @@ -17,19 +17,17 @@ package com.google.gerrit.server.change; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gwtorm.server.OrmException; - import java.util.Collection; /** * Store for reviewed flags on changes. * - * A reviewed flag is a tuple of (patch set ID, file, account ID) and records - * whether the user has reviewed a file in a patch set. Each user can easily - * have thousands of reviewed flags and the number of reviewed flags is growing - * without bound. The store must be able handle this data volume efficiently. + *

A reviewed flag is a tuple of (patch set ID, file, account ID) and records whether the user + * has reviewed a file in a patch set. Each user can easily have thousands of reviewed flags and the + * number of reviewed flags is growing without bound. The store must be able handle this data volume + * efficiently. * - * For a multi-master setup the store must replicate the data between the - * masters. + *

For a multi-master setup the store must replicate the data between the masters. */ public interface AccountPatchReviewStore { /** @@ -38,12 +36,11 @@ public interface AccountPatchReviewStore { * @param psId patch set ID * @param accountId account ID of the user * @param path file path - * @return {@code true} if the reviewed flag was updated, {@code false} if the - * reviewed flag was already set + * @return {@code true} if the reviewed flag was updated, {@code false} if the reviewed flag was + * already set * @throws OrmException thrown if updating the reviewed flag failed */ - boolean markReviewed(PatchSet.Id psId, Account.Id accountId, String path) - throws OrmException; + boolean markReviewed(PatchSet.Id psId, Account.Id accountId, String path) throws OrmException; /** * Marks the given files in the given patch set as reviewed by the given user. @@ -53,41 +50,34 @@ public interface AccountPatchReviewStore { * @param paths file paths * @throws OrmException thrown if updating the reviewed flag failed */ - void markReviewed(PatchSet.Id psId, Account.Id accountId, - Collection paths) throws OrmException; + void markReviewed(PatchSet.Id psId, Account.Id accountId, Collection paths) + throws OrmException; /** - * Clears the reviewed flag for the given file in the given patch set for the - * given user. + * Clears the reviewed flag for the given file in the given patch set for the given user. * * @param psId patch set ID * @param accountId account ID of the user * @param path file path * @throws OrmException thrown if clearing the reviewed flag failed */ - void clearReviewed(PatchSet.Id psId, Account.Id accountId, String path) - throws OrmException; + void clearReviewed(PatchSet.Id psId, Account.Id accountId, String path) throws OrmException; /** - * Clears the reviewed flags for all files in the given patch set for all - * users. + * Clears the reviewed flags for all files in the given patch set for all users. * * @param psId patch set ID * @throws OrmException thrown if clearing the reviewed flags failed */ void clearReviewed(PatchSet.Id psId) throws OrmException; - /** - * Returns the paths of all files in the given patch set the have been - * reviewed by the given user. + * Returns the paths of all files in the given patch set the have been reviewed by the given user. * * @param psId patch set ID * @param accountId account ID of the user - * @return the paths of all files in the given patch set the have been - * reviewed by the given user + * @return the paths of all files in the given patch set the have been reviewed by the given user * @throws OrmException thrown if accessing the reviewed flags failed */ - Collection findReviewed(PatchSet.Id psId, Account.Id accountId) - throws OrmException; + Collection findReviewed(PatchSet.Id psId, Account.Id accountId) throws OrmException; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ActionJson.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ActionJson.java index 4c405d976a..779f4db0e5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ActionJson.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ActionJson.java @@ -39,7 +39,6 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; import com.google.inject.util.Providers; - import java.util.ArrayList; import java.util.EnumSet; import java.util.LinkedHashMap; @@ -68,15 +67,13 @@ public class ActionJson { this.visitorSet = visitorSet; } - public Map format(RevisionResource rsrc) - throws OrmException { + public Map format(RevisionResource rsrc) throws OrmException { ChangeInfo changeInfo = null; RevisionInfo revisionInfo = null; List visitors = visitors(); if (!visitors.isEmpty()) { changeInfo = changeJson().format(rsrc); - revisionInfo = - checkNotNull(Iterables.getOnlyElement(changeInfo.revisions.values())); + revisionInfo = checkNotNull(Iterables.getOnlyElement(changeInfo.revisions.values())); changeInfo.revisions = null; } return toActionMap(rsrc, visitors, changeInfo, revisionInfo); @@ -96,8 +93,8 @@ public class ActionJson { return to; } - public RevisionInfo addRevisionActions(@Nullable ChangeInfo changeInfo, - RevisionInfo to, RevisionResource rsrc) throws OrmException { + public RevisionInfo addRevisionActions( + @Nullable ChangeInfo changeInfo, RevisionInfo to, RevisionResource rsrc) throws OrmException { List visitors = visitors(); if (!visitors.isEmpty()) { if (changeInfo != null) { @@ -140,8 +137,7 @@ public class ActionJson { return copy; } - private RevisionInfo copy(List visitors, - RevisionInfo revisionInfo) { + private RevisionInfo copy(List visitors, RevisionInfo revisionInfo) { if (visitors.isEmpty()) { return null; } @@ -168,10 +164,8 @@ public class ActionJson { } Provider userProvider = Providers.of(ctl.getUser()); - FluentIterable descs = UiActions.from( - changeViews, - changeResourceFactory.create(ctl), - userProvider); + FluentIterable descs = + UiActions.from(changeViews, changeResourceFactory.create(ctl), userProvider); // The followup action is a client-side only operation that does not // have a server side handler. It must be manually registered into the // resulting action map. @@ -184,7 +178,8 @@ public class ActionJson { descs = descs.append(descr); } - ACTION: for (UiAction.Description d : descs) { + ACTION: + for (UiAction.Description d : descs) { ActionInfo actionInfo = new ActionInfo(d); for (ActionVisitor visitor : visitors) { if (!visitor.visit(d.getId(), actionInfo, changeInfo)) { @@ -196,17 +191,18 @@ public class ActionJson { return out; } - private Map toActionMap(RevisionResource rsrc, - List visitors, ChangeInfo changeInfo, + private Map toActionMap( + RevisionResource rsrc, + List visitors, + ChangeInfo changeInfo, RevisionInfo revisionInfo) { if (!rsrc.getControl().getUser().isIdentifiedUser()) { return ImmutableMap.of(); } Map out = new LinkedHashMap<>(); - Provider userProvider = Providers.of( - rsrc.getControl().getUser()); - ACTION: for (UiAction.Description d : UiActions.from( - revisions, rsrc, userProvider)) { + Provider userProvider = Providers.of(rsrc.getControl().getUser()); + ACTION: + for (UiAction.Description d : UiActions.from(revisions, rsrc, userProvider)) { ActionInfo actionInfo = new ActionInfo(d); for (ActionVisitor visitor : visitors) { if (!visitor.visit(d.getId(), actionInfo, changeInfo, revisionInfo)) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/AllowedFormats.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/AllowedFormats.java index 756ce88f60..20e586f36e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/AllowedFormats.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/AllowedFormats.java @@ -21,7 +21,6 @@ import com.google.common.collect.Sets; import com.google.gerrit.server.config.DownloadConfig; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.util.HashMap; import java.util.Map; import java.util.Set; @@ -44,8 +43,9 @@ public class AllowedFormats { // Zip is not supported because it may be interpreted by a Java plugin as a // valid JAR file, whose code would have access to cookies on the domain. - allowed = Sets.immutableEnumSet( - Iterables.filter(cfg.getArchiveFormats(), f -> f != ArchiveFormat.ZIP)); + allowed = + Sets.immutableEnumSet( + Iterables.filter(cfg.getArchiveFormats(), f -> f != ArchiveFormat.ZIP)); } public Set getAllowed() { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ArchiveFormat.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ArchiveFormat.java index 9c517f0239..73ef23e20d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ArchiveFormat.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ArchiveFormat.java @@ -14,6 +14,9 @@ package com.google.gerrit.server.change; +import java.io.Closeable; +import java.io.IOException; +import java.io.OutputStream; import org.apache.commons.compress.archivers.ArchiveOutputStream; import org.eclipse.jgit.api.ArchiveCommand; import org.eclipse.jgit.api.ArchiveCommand.Format; @@ -25,10 +28,6 @@ import org.eclipse.jgit.archive.ZipFormat; import org.eclipse.jgit.lib.FileMode; import org.eclipse.jgit.lib.ObjectLoader; -import java.io.Closeable; -import java.io.IOException; -import java.io.OutputStream; - public enum ArchiveFormat { TGZ("application/x-gzip", new TgzFormat()), TAR("application/x-tar", new TarFormat()), @@ -61,16 +60,14 @@ public enum ArchiveFormat { return format.suffixes(); } - public ArchiveOutputStream createArchiveOutputStream(OutputStream o) - throws IOException { - return (ArchiveOutputStream)this.format.createArchiveOutputStream(o); + public ArchiveOutputStream createArchiveOutputStream(OutputStream o) throws IOException { + return (ArchiveOutputStream) this.format.createArchiveOutputStream(o); } - public void putEntry(T out, String path, byte[] data) - throws IOException { + public void putEntry(T out, String path, byte[] data) throws IOException { @SuppressWarnings("unchecked") ArchiveCommand.Format fmt = (Format) format; - fmt.putEntry(out, path, FileMode.REGULAR_FILE, - new ObjectLoader.SmallObject(FileMode.TYPE_FILE, data)); + fmt.putEntry( + out, path, FileMode.REGULAR_FILE, new ObjectLoader.SmallObject(FileMode.TYPE_FILE, data)); } -} \ No newline at end of file +} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeCleanupRunner.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeCleanupRunner.java index 310c8cbef6..04899edbb6 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeCleanupRunner.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeCleanupRunner.java @@ -25,16 +25,13 @@ import com.google.gerrit.server.util.ManualRequestContext; import com.google.gerrit.server.util.OneOffRequestContext; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - +import java.util.concurrent.TimeUnit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.concurrent.TimeUnit; - /** Runnable to enable scheduling change cleanups to run periodically */ public class ChangeCleanupRunner implements Runnable { - private static final Logger log = LoggerFactory - .getLogger(ChangeCleanupRunner.class); + private static final Logger log = LoggerFactory.getLogger(ChangeCleanupRunner.class); public static class Module extends LifecycleModule { @Override @@ -49,9 +46,7 @@ public class ChangeCleanupRunner implements Runnable { private final ChangeCleanupConfig cfg; @Inject - Lifecycle(WorkQueue queue, - ChangeCleanupRunner runner, - ChangeCleanupConfig cfg) { + Lifecycle(WorkQueue queue, ChangeCleanupRunner runner, ChangeCleanupConfig cfg) { this.queue = queue; this.runner = runner; this.cfg = cfg; @@ -65,12 +60,11 @@ public class ChangeCleanupRunner implements Runnable { if (delay == MISSING_CONFIG && interval == MISSING_CONFIG) { log.info("Ignoring missing changeCleanup schedule configuration"); } else if (delay < 0 || interval <= 0) { - log.warn(String.format( - "Ignoring invalid changeCleanup schedule configuration: %s", - scheduleConfig)); + log.warn( + String.format( + "Ignoring invalid changeCleanup schedule configuration: %s", scheduleConfig)); } else { - queue.getDefaultQueue().scheduleAtFixedRate(runner, delay, - interval, TimeUnit.MILLISECONDS); + queue.getDefaultQueue().scheduleAtFixedRate(runner, delay, interval, TimeUnit.MILLISECONDS); } } @@ -84,9 +78,7 @@ public class ChangeCleanupRunner implements Runnable { private final AbandonUtil abandonUtil; @Inject - ChangeCleanupRunner( - OneOffRequestContext oneOffRequestContext, - AbandonUtil abandonUtil) { + ChangeCleanupRunner(OneOffRequestContext oneOffRequestContext, AbandonUtil abandonUtil) { this.oneOffRequestContext = oneOffRequestContext; this.abandonUtil = abandonUtil; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeEditResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeEditResource.java index 9deb864dd3..108e180bf8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeEditResource.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeEditResource.java @@ -24,10 +24,12 @@ import com.google.inject.TypeLiteral; /** * Represents change edit resource, that is actualy two kinds of resources: + * *

    - *
  • the change edit itself
  • - *
  • a path within the edit
  • + *
  • the change edit itself + *
  • a path within the edit *
+ * * distinguished by whether path is null or not. */ public class ChangeEditResource implements RestResource { @@ -38,8 +40,7 @@ public class ChangeEditResource implements RestResource { private final ChangeEdit edit; private final String path; - public ChangeEditResource(ChangeResource change, ChangeEdit edit, - String path) { + public ChangeEditResource(ChangeResource change, ChangeEdit edit, String path) { this.change = change; this.edit = edit; this.path = path; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeEdits.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeEdits.java index 86527b2d6e..22254600db 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeEdits.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeEdits.java @@ -53,23 +53,21 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; import com.google.inject.assistedinject.Assisted; - +import java.io.IOException; +import java.util.List; +import java.util.Optional; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; import org.kohsuke.args4j.Option; -import java.io.IOException; -import java.util.List; -import java.util.Optional; - @Singleton -public class ChangeEdits implements - ChildCollection, - AcceptsCreate, - AcceptsPost, - AcceptsDelete { +public class ChangeEdits + implements ChildCollection, + AcceptsCreate, + AcceptsPost, + AcceptsDelete { private final DynamicMap> views; private final Create.Factory createFactory; private final DeleteFile.Factory deleteFileFactory; @@ -78,7 +76,8 @@ public class ChangeEdits implements private final Post post; @Inject - ChangeEdits(DynamicMap> views, + ChangeEdits( + DynamicMap> views, Create.Factory createFactory, Provider detail, ChangeEditUtil editUtil, @@ -104,8 +103,7 @@ public class ChangeEdits implements @Override public ChangeEditResource parse(ChangeResource rsrc, IdString id) - throws ResourceNotFoundException, AuthException, IOException, - OrmException { + throws ResourceNotFoundException, AuthException, IOException, OrmException { Optional edit = editUtil.byChange(rsrc.getChange()); if (!edit.isPresent()) { throw new ResourceNotFoundException(id); @@ -115,12 +113,10 @@ public class ChangeEdits implements @SuppressWarnings("unchecked") @Override - public Create create(ChangeResource parent, IdString id) - throws RestApiException { + public Create create(ChangeResource parent, IdString id) throws RestApiException { return createFactory.create(id.get()); } - @SuppressWarnings("unchecked") @Override public Post post(ChangeResource parent) throws RestApiException { @@ -128,23 +124,20 @@ public class ChangeEdits implements } /** - * Create handler that is activated when collection element is accessed - * but doesn't exist, e. g. PUT request with a path was called but - * change edit wasn't created yet. Change edit is created and PUT - * handler is called. - */ + * Create handler that is activated when collection element is accessed but doesn't exist, e. g. + * PUT request with a path was called but change edit wasn't created yet. Change edit is created + * and PUT handler is called. + */ @SuppressWarnings("unchecked") @Override - public DeleteFile delete(ChangeResource parent, IdString id) - throws RestApiException { + public DeleteFile delete(ChangeResource parent, IdString id) throws RestApiException { // It's safe to assume that id can never be null, because // otherwise we would end up in dedicated endpoint for // deleting of change edits and not a file in change edit return deleteFileFactory.create(id.get()); } - public static class Create implements - RestModifyView { + public static class Create implements RestModifyView { interface Factory { Create create(String path); @@ -154,25 +147,21 @@ public class ChangeEdits implements private final String path; @Inject - Create(Put putEdit, - @Assisted String path) { + Create(Put putEdit, @Assisted String path) { this.putEdit = putEdit; this.path = path; } @Override public Response apply(ChangeResource resource, Put.Input input) - throws AuthException, ResourceConflictException, IOException, - OrmException { + throws AuthException, ResourceConflictException, IOException, OrmException { putEdit.apply(resource.getControl(), path, input.content); return Response.none(); } } - public static class DeleteFile implements - RestModifyView { - public static class Input { - } + public static class DeleteFile implements RestModifyView { + public static class Input {} interface Factory { DeleteFile create(String path); @@ -182,16 +171,14 @@ public class ChangeEdits implements private final String path; @Inject - DeleteFile(DeleteContent deleteContent, - @Assisted String path) { + DeleteFile(DeleteContent deleteContent, @Assisted String path) { this.deleteContent = deleteContent; this.path = path; } @Override public Response apply(ChangeResource rsrc, DeleteFile.Input in) - throws IOException, AuthException, ResourceConflictException, - OrmException { + throws IOException, AuthException, ResourceConflictException, OrmException { return deleteContent.apply(rsrc.getControl(), path); } } @@ -214,7 +201,8 @@ public class ChangeEdits implements boolean downloadCommands; @Inject - Detail(ChangeEditUtil editUtil, + Detail( + ChangeEditUtil editUtil, ChangeEditJson editJson, FileInfoJson fileInfoJson, Revisions revisions) { @@ -225,8 +213,8 @@ public class ChangeEdits implements } @Override - public Response apply(ChangeResource rsrc) throws AuthException, - IOException, ResourceNotFoundException, OrmException { + public Response apply(ChangeResource rsrc) + throws AuthException, IOException, ResourceNotFoundException, OrmException { Optional edit = editUtil.byChange(rsrc.getChange()); if (!edit.isPresent()) { return Response.none(); @@ -236,16 +224,12 @@ public class ChangeEdits implements if (list) { PatchSet basePatchSet = null; if (base != null) { - RevisionResource baseResource = revisions.parse( - rsrc, IdString.fromDecoded(base)); + RevisionResource baseResource = revisions.parse(rsrc, IdString.fromDecoded(base)); basePatchSet = baseResource.getPatchSet(); } try { editInfo.files = - fileInfoJson.toFileInfoMap( - rsrc.getChange(), - edit.get().getRevision(), - basePatchSet); + fileInfoJson.toFileInfoMap(rsrc.getChange(), edit.get().getRevision(), basePatchSet); } catch (PatchListNotAvailableException e) { throw new ResourceNotFoundException(e.getMessage()); } @@ -255,17 +239,17 @@ public class ChangeEdits implements } /** - * Post to edit collection resource. Two different operations are - * supported: + * Post to edit collection resource. Two different operations are supported: + * *
    - *
  • Create non existing change edit
  • - *
  • Restore path in existing change edit
  • + *
  • Create non existing change edit + *
  • Restore path in existing change edit *
+ * * The combination of two operations in one request is supported. */ @Singleton - public static class Post implements - RestModifyView { + public static class Post implements RestModifyView { public static class Input { public String restorePath; public String oldPath; @@ -276,25 +260,21 @@ public class ChangeEdits implements private final GitRepositoryManager repositoryManager; @Inject - Post(ChangeEditModifier editModifier, - GitRepositoryManager repositoryManager) { + Post(ChangeEditModifier editModifier, GitRepositoryManager repositoryManager) { this.editModifier = editModifier; this.repositoryManager = repositoryManager; } @Override public Response apply(ChangeResource resource, Post.Input input) - throws AuthException, IOException, ResourceConflictException, - OrmException { + throws AuthException, IOException, ResourceConflictException, OrmException { Project.NameKey project = resource.getProject(); try (Repository repository = repositoryManager.openRepository(project)) { ChangeControl changeControl = resource.getControl(); if (isRestoreFile(input)) { - editModifier.restoreFile(repository, changeControl, - input.restorePath); + editModifier.restoreFile(repository, changeControl, input.restorePath); } else if (isRenameFile(input)) { - editModifier.renameFile(repository, changeControl, input.oldPath, - input.newPath); + editModifier.renameFile(repository, changeControl, input.oldPath, input.newPath); } else { editModifier.createEdit(repository, changeControl); } @@ -315,38 +295,30 @@ public class ChangeEdits implements } } - /** - * Put handler that is activated when PUT request is called on - * collection element. - */ + /** Put handler that is activated when PUT request is called on collection element. */ @Singleton - public static class Put implements - RestModifyView { + public static class Put implements RestModifyView { public static class Input { - @DefaultInput - public RawInput content; + @DefaultInput public RawInput content; } private final ChangeEditModifier editModifier; private final GitRepositoryManager repositoryManager; @Inject - Put(ChangeEditModifier editModifier, - GitRepositoryManager repositoryManager) { + Put(ChangeEditModifier editModifier, GitRepositoryManager repositoryManager) { this.editModifier = editModifier; this.repositoryManager = repositoryManager; } @Override public Response apply(ChangeEditResource rsrc, Input input) - throws AuthException, ResourceConflictException, IOException, - OrmException { + throws AuthException, ResourceConflictException, IOException, OrmException { return apply(rsrc.getControl(), rsrc.getPath(), input.content); } - public Response apply(ChangeControl changeControl, String path, - RawInput newContent) throws ResourceConflictException, AuthException, - IOException, OrmException { + public Response apply(ChangeControl changeControl, String path, RawInput newContent) + throws ResourceConflictException, AuthException, IOException, OrmException { if (Strings.isNullOrEmpty(path) || path.charAt(0) == '/') { throw new ResourceConflictException("Invalid path: " + path); } @@ -363,36 +335,32 @@ public class ChangeEdits implements /** * Handler to delete a file. - *

- * This deletes the file from the repository completely. This is not the same - * as reverting or restoring a file to its previous contents. + * + *

This deletes the file from the repository completely. This is not the same as reverting or + * restoring a file to its previous contents. */ @Singleton - public static class DeleteContent implements - RestModifyView { - public static class Input { - } + public static class DeleteContent + implements RestModifyView { + public static class Input {} private final ChangeEditModifier editModifier; private final GitRepositoryManager repositoryManager; @Inject - DeleteContent(ChangeEditModifier editModifier, - GitRepositoryManager repositoryManager) { + DeleteContent(ChangeEditModifier editModifier, GitRepositoryManager repositoryManager) { this.editModifier = editModifier; this.repositoryManager = repositoryManager; } @Override public Response apply(ChangeEditResource rsrc, DeleteContent.Input input) - throws AuthException, ResourceConflictException, OrmException, - IOException { + throws AuthException, ResourceConflictException, OrmException, IOException { return apply(rsrc.getControl(), rsrc.getPath()); } public Response apply(ChangeControl changeControl, String filePath) - throws AuthException, IOException, OrmException, - ResourceConflictException { + throws AuthException, IOException, OrmException, ResourceConflictException { Project.NameKey project = changeControl.getChange().getProject(); try (Repository repository = repositoryManager.openRepository(project)) { editModifier.deleteFile(repository, changeControl, filePath); @@ -406,9 +374,11 @@ public class ChangeEdits implements public static class Get implements RestReadView { private final FileContentUtil fileContentUtil; - @Option(name = "--base", aliases = {"-b"}, - usage = "whether to load the content on the base revision instead of the" - + " change edit") + @Option( + name = "--base", + aliases = {"-b"}, + usage = "whether to load the content on the base revision instead of the" + " change edit" + ) private boolean base; @Inject @@ -417,17 +387,16 @@ public class ChangeEdits implements } @Override - public Response apply(ChangeEditResource rsrc) - throws IOException { + public Response apply(ChangeEditResource rsrc) throws IOException { try { ChangeEdit edit = rsrc.getChangeEdit(); - return Response.ok(fileContentUtil.getContent( - rsrc.getControl().getProjectControl().getProjectState(), - base - ? ObjectId.fromString( - edit.getBasePatchSet().getRevision().get()) - : ObjectId.fromString(edit.getRevision().get()), - rsrc.getPath())); + return Response.ok( + fileContentUtil.getContent( + rsrc.getControl().getProjectControl().getProjectState(), + base + ? ObjectId.fromString(edit.getBasePatchSet().getRevision().get()) + : ObjectId.fromString(edit.getRevision().get()), + rsrc.getPath())); } catch (ResourceNotFoundException rnfe) { return Response.none(); } @@ -449,7 +418,8 @@ public class ChangeEdits implements ChangeEdit edit = rsrc.getChangeEdit(); Change change = edit.getChange(); List links = - webLinks.getDiffLinks(change.getProject().get(), + webLinks.getDiffLinks( + change.getProject().get(), change.getChangeId(), edit.getBasePatchSet().getPatchSetId(), edit.getBasePatchSet().getRefName(), @@ -467,27 +437,24 @@ public class ChangeEdits implements } @Singleton - public static class EditMessage implements - RestModifyView { + public static class EditMessage implements RestModifyView { public static class Input { - @DefaultInput - public String message; + @DefaultInput public String message; } private final ChangeEditModifier editModifier; private final GitRepositoryManager repositoryManager; @Inject - EditMessage(ChangeEditModifier editModifier, - GitRepositoryManager repositoryManager) { + EditMessage(ChangeEditModifier editModifier, GitRepositoryManager repositoryManager) { this.editModifier = editModifier; this.repositoryManager = repositoryManager; } @Override - public Object apply(ChangeResource rsrc, Input input) throws AuthException, - IOException, BadRequestException, ResourceConflictException, - OrmException { + public Object apply(ChangeResource rsrc, Input input) + throws AuthException, IOException, BadRequestException, ResourceConflictException, + OrmException { if (input == null || Strings.isNullOrEmpty(input.message)) { throw new BadRequestException("commit message must be provided"); } @@ -508,29 +475,31 @@ public class ChangeEdits implements private final GitRepositoryManager repoManager; private final ChangeEditUtil editUtil; - @Option(name = "--base", aliases = {"-b"}, - usage = "whether to load the message on the base revision instead" - + " of the change edit") + @Option( + name = "--base", + aliases = {"-b"}, + usage = "whether to load the message on the base revision instead" + " of the change edit" + ) private boolean base; @Inject - GetMessage(GitRepositoryManager repoManager, - ChangeEditUtil editUtil) { + GetMessage(GitRepositoryManager repoManager, ChangeEditUtil editUtil) { this.repoManager = repoManager; this.editUtil = editUtil; } @Override - public BinaryResult apply(ChangeResource rsrc) throws AuthException, - IOException, ResourceNotFoundException, OrmException { + public BinaryResult apply(ChangeResource rsrc) + throws AuthException, IOException, ResourceNotFoundException, OrmException { Optional edit = editUtil.byChange(rsrc.getChange()); String msg; if (edit.isPresent()) { if (base) { try (Repository repo = repoManager.openRepository(rsrc.getProject()); RevWalk rw = new RevWalk(repo)) { - RevCommit commit = rw.parseCommit(ObjectId.fromString( - edit.get().getBasePatchSet().getRevision().get())); + RevCommit commit = + rw.parseCommit( + ObjectId.fromString(edit.get().getBasePatchSet().getRevision().get())); msg = commit.getFullMessage(); } } else { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeIncludedIn.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeIncludedIn.java index 77e69421f3..f852a97c72 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeIncludedIn.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeIncludedIn.java @@ -26,7 +26,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; @Singleton @@ -36,9 +35,7 @@ public class ChangeIncludedIn implements RestReadView { private IncludedIn includedIn; @Inject - ChangeIncludedIn(Provider db, - PatchSetUtil psUtil, - IncludedIn includedIn) { + ChangeIncludedIn(Provider db, PatchSetUtil psUtil, IncludedIn includedIn) { this.db = db; this.psUtil = psUtil; this.includedIn = includedIn; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeInserter.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeInserter.java index 19566434ce..2562557f6f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeInserter.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeInserter.java @@ -63,14 +63,6 @@ import com.google.gerrit.server.util.RequestScopePropagator; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.revwalk.RevCommit; -import org.eclipse.jgit.transport.ReceiveCommand; -import org.eclipse.jgit.util.ChangeIdUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.util.Collections; import java.util.HashMap; @@ -78,14 +70,19 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ExecutorService; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.transport.ReceiveCommand; +import org.eclipse.jgit.util.ChangeIdUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class ChangeInserter extends BatchUpdate.InsertChangeOp { public interface Factory { ChangeInserter create(Change.Id cid, RevCommit rc, String refName); } - private static final Logger log = - LoggerFactory.getLogger(ChangeInserter.class); + private static final Logger log = LoggerFactory.getLogger(ChangeInserter.class); private final ProjectControl.GenericFactory projectControlFactory; private final IdentifiedUser.GenericFactory userFactory; @@ -111,11 +108,9 @@ public class ChangeInserter extends BatchUpdate.InsertChangeOp { private String message; private String patchSetDescription; private List groups = Collections.emptyList(); - private CommitValidators.Policy validatePolicy = - CommitValidators.Policy.GERRIT; + private CommitValidators.Policy validatePolicy = CommitValidators.Policy.GERRIT; private NotifyHandling notify = NotifyHandling.ALL; - private ListMultimap accountsToNotify = - ImmutableListMultimap.of(); + private ListMultimap accountsToNotify = ImmutableListMultimap.of(); private Set reviewers; private Set extraCC; private Map approvals; @@ -133,7 +128,8 @@ public class ChangeInserter extends BatchUpdate.InsertChangeOp { private String pushCert; @Inject - ChangeInserter(ProjectControl.GenericFactory projectControlFactory, + ChangeInserter( + ProjectControl.GenericFactory projectControlFactory, IdentifiedUser.GenericFactory userFactory, ChangeControl.GenericFactory changeControlFactory, PatchSetInfoFactory patchSetInfoFactory, @@ -176,12 +172,13 @@ public class ChangeInserter extends BatchUpdate.InsertChangeOp { @Override public Change createChange(Context ctx) { - change = new Change( - getChangeKey(commit), - changeId, - ctx.getAccountId(), - new Branch.NameKey(ctx.getProject(), refName), - ctx.getWhen()); + change = + new Change( + getChangeKey(commit), + changeId, + ctx.getAccountId(), + new Branch.NameKey(ctx.getProject(), refName), + ctx.getWhen()); change.setStatus(MoreObjects.firstNonNull(status, Change.Status.NEW)); change.setTopic(topic); return change; @@ -192,9 +189,13 @@ public class ChangeInserter extends BatchUpdate.InsertChangeOp { if (!idList.isEmpty()) { return new Change.Key(idList.get(idList.size() - 1).trim()); } - ObjectId id = ChangeIdUtil.computeChangeId(commit.getTree(), commit, - commit.getAuthorIdent(), commit.getCommitterIdent(), - commit.getShortMessage()); + ObjectId id = + ChangeIdUtil.computeChangeId( + commit.getTree(), + commit, + commit.getAuthorIdent(), + commit.getCommitterIdent(), + commit.getShortMessage()); StringBuilder changeId = new StringBuilder(); changeId.append("I").append(ObjectId.toString(id)); return new Change.Key(changeId.toString()); @@ -256,22 +257,19 @@ public class ChangeInserter extends BatchUpdate.InsertChangeOp { } public ChangeInserter setDraft(boolean draft) { - checkState(change == null, - "setDraft(boolean) only valid before creating change"); + checkState(change == null, "setDraft(boolean) only valid before creating change"); return setStatus(draft ? Change.Status.DRAFT : Change.Status.NEW); } public ChangeInserter setStatus(Change.Status status) { - checkState(change == null, - "setStatus(Change.Status) only valid before creating change"); + checkState(change == null, "setStatus(Change.Status) only valid before creating change"); this.status = status; return this; } public ChangeInserter setGroups(List groups) { checkNotNull(groups, "groups may not be empty"); - checkState(patchSet == null, - "setGroups(Iterable) only valid before creating change"); + checkState(patchSet == null, "setGroups(Iterable) only valid before creating change"); this.groups = groups; return this; } @@ -300,8 +298,7 @@ public class ChangeInserter extends BatchUpdate.InsertChangeOp { } public PatchSet getPatchSet() { - checkState(patchSet != null, - "getPatchSet() only valid after creating change"); + checkState(patchSet != null, "getPatchSet() only valid after creating change"); return patchSet; } @@ -319,21 +316,18 @@ public class ChangeInserter extends BatchUpdate.InsertChangeOp { if (message == null) { return null; } - checkState(changeMessage != null, - "getChangeMessage() only valid after inserting change"); + checkState(changeMessage != null, "getChangeMessage() only valid after inserting change"); return changeMessage; } @Override - public void updateRepo(RepoContext ctx) - throws ResourceConflictException, IOException { + public void updateRepo(RepoContext ctx) throws ResourceConflictException, IOException { validate(ctx); if (!updateRef) { return; } if (updateRefCommand == null) { - ctx.addRefUpdate( - new ReceiveCommand(ObjectId.zeroId(), commit, psId.toRefName())); + ctx.addRefUpdate(new ReceiveCommand(ObjectId.zeroId(), commit, psId.toRefName())); } else { ctx.addRefUpdate(updateRefCommand); } @@ -359,8 +353,17 @@ public class ChangeInserter extends BatchUpdate.InsertChangeOp { if (newGroups.isEmpty()) { newGroups = GroupCollector.getDefaultGroups(commit); } - patchSet = psUtil.insert(ctx.getDb(), ctx.getRevWalk(), update, psId, - commit, draft, newGroups, pushCert, patchSetDescription); + patchSet = + psUtil.insert( + ctx.getDb(), + ctx.getRevWalk(), + update, + psId, + commit, + draft, + newGroups, + pushCert, + patchSetDescription); /* TODO: fixStatus is used here because the tests * (byStatusClosed() in AbstractQueryChangesTest) @@ -373,30 +376,39 @@ public class ChangeInserter extends BatchUpdate.InsertChangeOp { update.fixStatus(change.getStatus()); LabelTypes labelTypes = ctl.getProjectControl().getLabelTypes(); - approvalsUtil.addReviewers(db, update, labelTypes, change, patchSet, + approvalsUtil.addReviewers( + db, + update, + labelTypes, + change, + patchSet, patchSetInfo, filterOnChangeVisibility(db, ctx.getNotes(), reviewers), - Collections. emptySet()); + Collections.emptySet()); approvalsUtil.addApprovalsForNewPatchSet( db, update, labelTypes, patchSet, ctx.getControl(), approvals); if (message != null) { - changeMessage = ChangeMessagesUtil.newMessage( - patchSet.getId(), ctx.getUser(), patchSet.getCreatedOn(), - message, ChangeMessagesUtil.TAG_UPLOADED_PATCH_SET); + changeMessage = + ChangeMessagesUtil.newMessage( + patchSet.getId(), + ctx.getUser(), + patchSet.getCreatedOn(), + message, + ChangeMessagesUtil.TAG_UPLOADED_PATCH_SET); cmUtil.addChangeMessage(db, update, changeMessage); } return true; } - private Set filterOnChangeVisibility(final ReviewDb db, - final ChangeNotes notes, Set accounts) { - return accounts.stream() + private Set filterOnChangeVisibility( + final ReviewDb db, final ChangeNotes notes, Set accounts) { + return accounts + .stream() .filter( accountId -> { try { IdentifiedUser user = userFactory.create(accountId); - return changeControlFactory.controlFor(notes, user) - .isVisible(db); + return changeControlFactory.controlFor(notes, user).isVisible(db); } catch (OrmException e) { log.warn( String.format( @@ -411,31 +423,31 @@ public class ChangeInserter extends BatchUpdate.InsertChangeOp { @Override public void postUpdate(Context ctx) throws OrmException { - if (sendMail - && (notify != NotifyHandling.NONE || !accountsToNotify.isEmpty())) { - Runnable sender = new Runnable() { - @Override - public void run() { - try { - CreateChangeSender cm = createChangeSenderFactory - .create(change.getProject(), change.getId()); - cm.setFrom(change.getOwner()); - cm.setPatchSet(patchSet, patchSetInfo); - cm.setNotify(notify); - cm.setAccountsToNotify(accountsToNotify); - cm.addReviewers(reviewers); - cm.addExtraCC(extraCC); - cm.send(); - } catch (Exception e) { - log.error("Cannot send email for new change " + change.getId(), e); - } - } + if (sendMail && (notify != NotifyHandling.NONE || !accountsToNotify.isEmpty())) { + Runnable sender = + new Runnable() { + @Override + public void run() { + try { + CreateChangeSender cm = + createChangeSenderFactory.create(change.getProject(), change.getId()); + cm.setFrom(change.getOwner()); + cm.setPatchSet(patchSet, patchSetInfo); + cm.setNotify(notify); + cm.setAccountsToNotify(accountsToNotify); + cm.addReviewers(reviewers); + cm.addExtraCC(extraCC); + cm.send(); + } catch (Exception e) { + log.error("Cannot send email for new change " + change.getId(), e); + } + } - @Override - public String toString() { - return "send-email newchange"; - } - }; + @Override + public String toString() { + return "send-email newchange"; + } + }; if (requestScopePropagator != null) { sendEmailExecutor.submit(requestScopePropagator.wrap(sender)); } else { @@ -449,11 +461,10 @@ public class ChangeInserter extends BatchUpdate.InsertChangeOp { * show a transition from an oldValue of 0 to the new value. */ if (fireRevisionCreated) { - revisionCreated.fire(change, patchSet, ctx.getAccount(), - ctx.getWhen(), notify); + revisionCreated.fire(change, patchSet, ctx.getAccount(), ctx.getWhen(), notify); if (approvals != null && !approvals.isEmpty()) { - ChangeControl changeControl = changeControlFactory.controlFor( - ctx.getDb(), change, ctx.getUser()); + ChangeControl changeControl = + changeControlFactory.controlFor(ctx.getDb(), change, ctx.getUser()); List labels = changeControl.getLabelTypes().getLabelTypes(); Map allApprovals = new HashMap<>(); Map oldApprovals = new HashMap<>(); @@ -467,35 +478,30 @@ public class ChangeInserter extends BatchUpdate.InsertChangeOp { oldApprovals.put(entry.getKey(), (short) 0); } } - commentAdded.fire(change, patchSet, - ctx.getAccount(), null, - allApprovals, oldApprovals, ctx.getWhen()); + commentAdded.fire( + change, patchSet, ctx.getAccount(), null, allApprovals, oldApprovals, ctx.getWhen()); } } } - private void validate(RepoContext ctx) - throws IOException, ResourceConflictException { + private void validate(RepoContext ctx) throws IOException, ResourceConflictException { if (validatePolicy == CommitValidators.Policy.NONE) { return; } try { - RefControl refControl = projectControlFactory - .controlFor(ctx.getProject(), ctx.getUser()).controlForRef(refName); + RefControl refControl = + projectControlFactory.controlFor(ctx.getProject(), ctx.getUser()).controlForRef(refName); String refName = psId.toRefName(); - CommitReceivedEvent event = new CommitReceivedEvent( - new ReceiveCommand( - ObjectId.zeroId(), - commit.getId(), - refName), - refControl.getProjectControl().getProject(), - change.getDest().get(), - commit, - ctx.getIdentifiedUser()); + CommitReceivedEvent event = + new CommitReceivedEvent( + new ReceiveCommand(ObjectId.zeroId(), commit.getId(), refName), + refControl.getProjectControl().getProject(), + change.getDest().get(), + commit, + ctx.getIdentifiedUser()); commitValidatorsFactory - .create( - validatePolicy, refControl, new NoSshInfo(), ctx.getRepository()) + .create(validatePolicy, refControl, new NoSshInfo(), ctx.getRepository()) .validate(event); } catch (CommitValidationException e) { throw new ResourceConflictException(e.getFullMessage()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeJson.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeJson.java index f4d7f8a622..8e1ab10463 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeJson.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeJson.java @@ -121,15 +121,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.Ref; -import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.revwalk.RevCommit; -import org.eclipse.jgit.revwalk.RevWalk; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.sql.Timestamp; import java.util.ArrayList; @@ -144,6 +135,13 @@ import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.TreeMap; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.revwalk.RevWalk; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class ChangeJson { private static final Logger log = LoggerFactory.getLogger(ChangeJson.class); @@ -152,19 +150,12 @@ public class ChangeJson { // efficiency reasons. Callers that care about submittability after taking // vote squashing into account should be looking at the submit action. public static final SubmitRuleOptions SUBMIT_RULE_OPTIONS_LENIENT = - ChangeField.SUBMIT_RULE_OPTIONS_LENIENT - .toBuilder() - .fastEvalLabels(true) - .build(); + ChangeField.SUBMIT_RULE_OPTIONS_LENIENT.toBuilder().fastEvalLabels(true).build(); public static final SubmitRuleOptions SUBMIT_RULE_OPTIONS_STRICT = - ChangeField.SUBMIT_RULE_OPTIONS_STRICT - .toBuilder() - .fastEvalLabels(true) - .build(); + ChangeField.SUBMIT_RULE_OPTIONS_STRICT.toBuilder().fastEvalLabels(true).build(); - public static final Set NO_OPTIONS = - Collections.emptySet(); + public static final Set NO_OPTIONS = Collections.emptySet(); public static final ImmutableSet REQUIRE_LAZY_LOAD = ImmutableSet.of(ALL_REVISIONS, MESSAGES); @@ -251,9 +242,8 @@ public class ChangeJson { this.changeKindCache = changeKindCache; this.indexes = indexes; this.approvalsUtil = approvalsUtil; - this.options = options.isEmpty() - ? EnumSet.noneOf(ListChangesOption.class) - : EnumSet.copyOf(options); + this.options = + options.isEmpty() ? EnumSet.noneOf(ListChangesOption.class) : EnumSet.copyOf(options); } public ChangeJson lazyLoad(boolean load) { @@ -274,8 +264,7 @@ public class ChangeJson { return format(changeDataFactory.create(db.get(), change)); } - public ChangeInfo format(Project.NameKey project, Change.Id id) - throws OrmException { + public ChangeInfo format(Project.NameKey project, Change.Id id) throws OrmException { ChangeNotes notes; try { notes = notesFactory.createChecked(db.get(), project, id); @@ -292,8 +281,8 @@ public class ChangeJson { return format(cd, Optional.empty(), true); } - private ChangeInfo format(ChangeData cd, Optional limitToPsId, - boolean fillAccountLoader) + private ChangeInfo format( + ChangeData cd, Optional limitToPsId, boolean fillAccountLoader) throws OrmException { try { if (fillAccountLoader) { @@ -303,8 +292,11 @@ public class ChangeJson { return res; } return toChangeInfo(cd, limitToPsId); - } catch (PatchListNotAvailableException | GpgException | OrmException - | IOException | RuntimeException e) { + } catch (PatchListNotAvailableException + | GpgException + | OrmException + | IOException + | RuntimeException e) { if (!has(CHECK)) { Throwables.throwIfInstanceOf(e, OrmException.class); throw new OrmException(e); @@ -318,11 +310,10 @@ public class ChangeJson { return format(cd, Optional.of(rsrc.getPatchSet().getId()), true); } - public List> formatQueryResults( - List> in) throws OrmException { + public List> formatQueryResults(List> in) + throws OrmException { accountLoader = accountLoaderFactory.create(has(DETAILED_ACCOUNTS)); - ensureLoaded( - FluentIterable.from(in).transformAndConcat(QueryResult::entities)); + ensureLoaded(FluentIterable.from(in).transformAndConcat(QueryResult::entities)); List> res = Lists.newArrayListWithCapacity(in.size()); Map out = new HashMap<>(); @@ -337,8 +328,7 @@ public class ChangeJson { return res; } - public List formatChangeDatas(Collection in) - throws OrmException { + public List formatChangeDatas(Collection in) throws OrmException { accountLoader = accountLoaderFactory.create(has(DETAILED_ACCOUNTS)); ensureLoaded(in); List out = new ArrayList<>(in.size()); @@ -372,21 +362,22 @@ public class ChangeJson { return options.contains(option); } - private List toChangeInfo(Map out, - List changes) { + private List toChangeInfo(Map out, List changes) { List info = Lists.newArrayListWithCapacity(changes.size()); for (ChangeData cd : changes) { ChangeInfo i = out.get(cd.getId()); if (i == null) { try { i = toChangeInfo(cd, Optional.empty()); - } catch (PatchListNotAvailableException | GpgException | OrmException - | IOException | RuntimeException e) { + } catch (PatchListNotAvailableException + | GpgException + | OrmException + | IOException + | RuntimeException e) { if (has(CHECK)) { i = checkOnly(cd); } else { - log.warn( - "Omitting corrupt change " + cd.getId() + " from results", e); + log.warn("Omitting corrupt change " + cd.getId() + " from results", e); continue; } } @@ -437,9 +428,8 @@ public class ChangeJson { return info; } - private ChangeInfo toChangeInfo(ChangeData cd, - Optional limitToPsId) throws PatchListNotAvailableException, - GpgException, OrmException, IOException { + private ChangeInfo toChangeInfo(ChangeData cd, Optional limitToPsId) + throws PatchListNotAvailableException, GpgException, OrmException, IOException { ChangeInfo out = new ChangeInfo(); CurrentUser user = userProvider.get(); ChangeControl ctl = cd.changeControl().forUser(user); @@ -490,9 +480,7 @@ public class ChangeJson { if (user.isIdentifiedUser()) { Collection stars = cd.stars().get(user.getAccountId()); - out.starred = stars.contains(StarredChangesUtil.DEFAULT_LABEL) - ? true - : null; + out.starred = stars.contains(StarredChangesUtil.DEFAULT_LABEL) ? true : null; if (!stars.isEmpty()) { out.stars = stars; } @@ -509,8 +497,7 @@ public class ChangeJson { if (out.labels != null && has(DETAILED_LABELS)) { // If limited to specific patch sets but not the current patch set, don't // list permitted labels, since users can't vote on those patch sets. - if (!limitToPsId.isPresent() - || limitToPsId.get().equals(in.currentPatchSetId())) { + if (!limitToPsId.isPresent() || limitToPsId.get().equals(in.currentPatchSetId())) { out.permittedLabels = cd.change().getStatus() != Change.Status.ABANDONED ? permittedLabels(ctl, cd) @@ -518,10 +505,9 @@ public class ChangeJson { } out.reviewers = new HashMap<>(); - for (Map.Entry> e - : cd.reviewers().asTable().rowMap().entrySet()) { - out.reviewers.put(e.getKey().asReviewerState(), - toAccountInfo(e.getValue().keySet())); + for (Map.Entry> e : + cd.reviewers().asTable().rowMap().entrySet()) { + out.reviewers.put(e.getKey().asReviewerState(), toAccountInfo(e.getValue().keySet())); } out.removableReviewers = removableReviewers(ctl, out); @@ -532,9 +518,7 @@ public class ChangeJson { } boolean needMessages = has(MESSAGES); - boolean needRevisions = has(ALL_REVISIONS) - || has(CURRENT_REVISION) - || limitToPsId.isPresent(); + boolean needRevisions = has(ALL_REVISIONS) || has(CURRENT_REVISION) || limitToPsId.isPresent(); Map src; if (needMessages || needRevisions) { src = loadPatchSets(cd, limitToPsId); @@ -567,8 +551,7 @@ public class ChangeJson { return out; } - private Collection reviewerUpdates(ChangeData cd) - throws OrmException { + private Collection reviewerUpdates(ChangeData cd) throws OrmException { List reviewerUpdates = cd.reviewerUpdates(); List result = new ArrayList<>(reviewerUpdates.size()); for (ReviewerStatusUpdate c : reviewerUpdates) { @@ -583,17 +566,15 @@ public class ChangeJson { } private boolean submittable(ChangeData cd) throws OrmException { - return SubmitRecord.findOkRecord( - cd.submitRecords(SUBMIT_RULE_OPTIONS_STRICT)) - .isPresent(); + return SubmitRecord.findOkRecord(cd.submitRecords(SUBMIT_RULE_OPTIONS_STRICT)).isPresent(); } private List submitRecords(ChangeData cd) throws OrmException { return cd.submitRecords(SUBMIT_RULE_OPTIONS_LENIENT); } - private Map labelsFor(ChangeControl ctl, - ChangeData cd, boolean standard, boolean detailed) throws OrmException { + private Map labelsFor( + ChangeControl ctl, ChangeData cd, boolean standard, boolean detailed) throws OrmException { if (!standard && !detailed) { return null; } @@ -603,15 +584,15 @@ public class ChangeJson { } LabelTypes labelTypes = ctl.getLabelTypes(); - Map withStatus = cd.change().getStatus().isOpen() - ? labelsForOpenChange(ctl, cd, labelTypes, standard, detailed) - : labelsForClosedChange(ctl, cd, labelTypes, standard, detailed); - return ImmutableMap.copyOf( - Maps.transformValues(withStatus, LabelWithStatus::label)); + Map withStatus = + cd.change().getStatus().isOpen() + ? labelsForOpenChange(ctl, cd, labelTypes, standard, detailed) + : labelsForClosedChange(ctl, cd, labelTypes, standard, detailed); + return ImmutableMap.copyOf(Maps.transformValues(withStatus, LabelWithStatus::label)); } - private Map labelsForOpenChange(ChangeControl ctl, - ChangeData cd, LabelTypes labelTypes, boolean standard, boolean detailed) + private Map labelsForOpenChange( + ChangeControl ctl, ChangeData cd, LabelTypes labelTypes, boolean standard, boolean detailed) throws OrmException { Map labels = initLabels(cd, labelTypes, standard); if (detailed) { @@ -638,8 +619,8 @@ public class ChangeJson { return labels; } - private Map initLabels(ChangeData cd, - LabelTypes labelTypes, boolean standard) throws OrmException { + private Map initLabels( + ChangeData cd, LabelTypes labelTypes, boolean standard) throws OrmException { // Don't use Maps.newTreeMap(Comparator) due to OpenJDK bug 100167. Map labels = new TreeMap<>(labelTypes.nameComparator()); for (SubmitRecord rec : submitRecords(cd)) { @@ -675,8 +656,8 @@ public class ChangeJson { return labels; } - private void setLabelScores(LabelType type, - LabelWithStatus l, short score, Account.Id accountId) { + private void setLabelScores( + LabelType type, LabelWithStatus l, short score, Account.Id accountId) { if (l.label().approved != null || l.label().rejected != null) { return; } @@ -701,11 +682,11 @@ public class ChangeJson { } } - private void setAllApprovals(ChangeControl baseCtrl, ChangeData cd, - Map labels) throws OrmException { + private void setAllApprovals( + ChangeControl baseCtrl, ChangeData cd, Map labels) + throws OrmException { Change.Status status = cd.change().getStatus(); - checkState(status.isOpen(), - "should not call setAllApprovals on %s change", status); + checkState(status.isOpen(), "should not call setAllApprovals on %s change", status); // Include a user in the output for this label if either: // - They are an explicit reviewer. @@ -716,8 +697,8 @@ public class ChangeJson { allUsers.add(psa.getAccountId()); } - Table current = HashBasedTable.create( - allUsers.size(), baseCtrl.getLabelTypes().getLabelTypes().size()); + Table current = + HashBasedTable.create(allUsers.size(), baseCtrl.getLabelTypes().getLabelTypes().size()); for (PatchSetApproval psa : cd.currentApprovals()) { current.put(psa.getAccountId(), psa.getLabel(), psa); } @@ -725,8 +706,7 @@ public class ChangeJson { for (Account.Id accountId : allUsers) { IdentifiedUser user = userFactory.create(accountId); ChangeControl ctl = baseCtrl.forUser(user); - Map pvr = - getPermittedVotingRanges(permittedLabels(ctl, cd)); + Map pvr = getPermittedVotingRanges(permittedLabels(ctl, cd)); for (Map.Entry e : labels.entrySet()) { LabelType lt = ctl.getLabelTypes().byLabel(e.getKey()); if (lt == null) { @@ -735,8 +715,7 @@ public class ChangeJson { continue; } Integer value; - VotingRangeInfo permittedVotingRange = - pvr.getOrDefault(lt.getName(), null); + VotingRangeInfo permittedVotingRange = pvr.getOrDefault(lt.getName(), null); String tag = null; Timestamp date = null; PatchSetApproval psa = current.get(accountId, lt.getName()); @@ -759,8 +738,8 @@ public class ChangeJson { // user can vote on this label. value = labelNormalizer.canVote(ctl, lt, accountId) ? 0 : null; } - addApproval(e.getValue().label(), - approvalInfo(accountId, value, permittedVotingRange, tag, date)); + addApproval( + e.getValue().label(), approvalInfo(accountId, value, permittedVotingRange, tag, date)); } } } @@ -768,22 +747,23 @@ public class ChangeJson { private Map getPermittedVotingRanges( Map> permittedLabels) { Map permittedVotingRanges = - Maps.newHashMapWithExpectedSize(permittedLabels.size()); + Maps.newHashMapWithExpectedSize(permittedLabels.size()); for (String label : permittedLabels.keySet()) { - List permittedVotingRange = permittedLabels.get(label) - .stream() - .map(this::parseRangeValue) - .filter(java.util.Objects::nonNull) - .sorted() - .collect(toList()); + List permittedVotingRange = + permittedLabels + .get(label) + .stream() + .map(this::parseRangeValue) + .filter(java.util.Objects::nonNull) + .sorted() + .collect(toList()); if (permittedVotingRange.isEmpty()) { permittedVotingRanges.put(label, null); } else { int minPermittedValue = permittedVotingRange.get(0); int maxPermittedValue = Iterables.getLast(permittedVotingRange); - permittedVotingRanges.put(label, - new VotingRangeInfo(minPermittedValue, maxPermittedValue)); + permittedVotingRanges.put(label, new VotingRangeInfo(minPermittedValue, maxPermittedValue)); } } return permittedVotingRanges; @@ -798,15 +778,17 @@ public class ChangeJson { return Ints.tryParse(value); } - private Timestamp getSubmittedOn(ChangeData cd) - throws OrmException { + private Timestamp getSubmittedOn(ChangeData cd) throws OrmException { Optional s = cd.getSubmitApproval(); return s.isPresent() ? s.get().getGranted() : null; } private Map labelsForClosedChange( - ChangeControl baseCtrl, ChangeData cd, LabelTypes labelTypes, - boolean standard, boolean detailed) + ChangeControl baseCtrl, + ChangeData cd, + LabelTypes labelTypes, + boolean standard, + boolean detailed) throws OrmException { Set allUsers = new HashSet<>(); if (detailed) { @@ -864,15 +846,15 @@ public class ChangeJson { } if (detailed) { - labels.entrySet().stream() + labels + .entrySet() + .stream() .filter(e -> labelTypes.byLabel(e.getKey()) != null) - .forEach(e -> setLabelValues(labelTypes.byLabel(e.getKey()), - e.getValue())); + .forEach(e -> setLabelValues(labelTypes.byLabel(e.getKey()), e.getValue())); } for (Account.Id accountId : allUsers) { - Map byLabel = - Maps.newHashMapWithExpectedSize(labels.size()); + Map byLabel = Maps.newHashMapWithExpectedSize(labels.size()); Map pvr = Collections.emptyMap(); if (detailed) { ChangeControl ctl = baseCtrl.forUser(userFactory.create(accountId)); @@ -910,15 +892,23 @@ public class ChangeJson { return labels; } - private ApprovalInfo approvalInfo(Account.Id id, Integer value, - VotingRangeInfo permittedVotingRange, String tag, Timestamp date) { + private ApprovalInfo approvalInfo( + Account.Id id, + Integer value, + VotingRangeInfo permittedVotingRange, + String tag, + Timestamp date) { ApprovalInfo ai = getApprovalInfo(id, value, permittedVotingRange, tag, date); accountLoader.put(ai); return ai; } - public static ApprovalInfo getApprovalInfo(Account.Id id, Integer value, - VotingRangeInfo permittedVotingRange, String tag, Timestamp date) { + public static ApprovalInfo getApprovalInfo( + Account.Id id, + Integer value, + VotingRangeInfo permittedVotingRange, + String tag, + Timestamp date) { ApprovalInfo ai = new ApprovalInfo(id.get()); ai.value = value; ai.permittedVotingRange = permittedVotingRange; @@ -977,10 +967,8 @@ public class ChangeJson { } } } - List toClear = - Lists.newArrayListWithCapacity(permitted.keySet().size()); - for (Map.Entry> e - : permitted.asMap().entrySet()) { + List toClear = Lists.newArrayListWithCapacity(permitted.keySet().size()); + for (Map.Entry> e : permitted.asMap().entrySet()) { if (isOnlyZero(e.getValue())) { toClear.add(e.getKey()); } @@ -991,27 +979,24 @@ public class ChangeJson { return permitted.asMap(); } - private Map currentLabels(ChangeControl ctl) - throws OrmException { + private Map currentLabels(ChangeControl ctl) throws OrmException { Map result = new HashMap<>(); - for (PatchSetApproval psa : approvalsUtil.byPatchSetUser( - db.get(), ctl, ctl.getChange().currentPatchSetId(), - ctl.getUser().getAccountId())) { + for (PatchSetApproval psa : + approvalsUtil.byPatchSetUser( + db.get(), ctl, ctl.getChange().currentPatchSetId(), ctl.getUser().getAccountId())) { result.put(psa.getLabel(), psa.getValue()); } return result; } - private Collection messages(ChangeControl ctl, ChangeData cd, - Map map) - throws OrmException { + private Collection messages( + ChangeControl ctl, ChangeData cd, Map map) throws OrmException { List messages = cmUtil.byChange(db.get(), cd.notes()); if (messages.isEmpty()) { return Collections.emptyList(); } - List result = - Lists.newArrayListWithCapacity(messages.size()); + List result = Lists.newArrayListWithCapacity(messages.size()); for (ChangeMessage message : messages) { PatchSet.Id patchNum = message.getPatchSetId(); PatchSet ps = patchNum != null ? map.get(patchNum) : null; @@ -1029,8 +1014,7 @@ public class ChangeJson { return result; } - private Collection removableReviewers(ChangeControl ctl, - ChangeInfo out) { + private Collection removableReviewers(ChangeControl ctl, ChangeInfo out) { // Although this is called removableReviewers, this method also determines // which CCs are removable. // @@ -1084,9 +1068,9 @@ public class ChangeJson { return result; } - private Collection toAccountInfo( - Collection accounts) { - return accounts.stream() + private Collection toAccountInfo(Collection accounts) { + return accounts + .stream() .map(accountLoader::get) .sorted(AccountInfoComparator.ORDER_NULLS_FIRST) .collect(toList()); @@ -1100,26 +1084,23 @@ public class ChangeJson { return null; } - private Map revisions(ChangeControl ctl, ChangeData cd, - Map map, ChangeInfo changeInfo) - throws PatchListNotAvailableException, GpgException, OrmException, - IOException { + private Map revisions( + ChangeControl ctl, ChangeData cd, Map map, ChangeInfo changeInfo) + throws PatchListNotAvailableException, GpgException, OrmException, IOException { Map res = new LinkedHashMap<>(); try (Repository repo = openRepoIfNecessary(ctl)) { for (PatchSet in : map.values()) { - if ((has(ALL_REVISIONS) - || in.getId().equals(ctl.getChange().currentPatchSetId())) + if ((has(ALL_REVISIONS) || in.getId().equals(ctl.getChange().currentPatchSetId())) && ctl.isPatchVisible(in, db.get())) { - res.put(in.getRevision().get(), - toRevisionInfo(ctl, cd, in, repo, false, changeInfo)); + res.put(in.getRevision().get(), toRevisionInfo(ctl, cd, in, repo, false, changeInfo)); } } return res; } } - private Map loadPatchSets(ChangeData cd, - Optional limitToPsId) throws OrmException { + private Map loadPatchSets(ChangeData cd, Optional limitToPsId) + throws OrmException { Collection src; if (has(ALL_REVISIONS) || has(MESSAGES)) { src = cd.patchSets(); @@ -1133,8 +1114,7 @@ public class ChangeJson { } else { ps = cd.currentPatchSet(); if (ps == null) { - throw new OrmException( - "missing current patch set for change " + cd.getId()); + throw new OrmException("missing current patch set for change " + cd.getId()); } } src = Collections.singletonList(ps); @@ -1147,21 +1127,24 @@ public class ChangeJson { } public RevisionInfo getRevisionInfo(ChangeControl ctl, PatchSet in) - throws PatchListNotAvailableException, GpgException, OrmException, - IOException { + throws PatchListNotAvailableException, GpgException, OrmException, IOException { accountLoader = accountLoaderFactory.create(has(DETAILED_ACCOUNTS)); try (Repository repo = openRepoIfNecessary(ctl)) { - RevisionInfo rev = toRevisionInfo( - ctl, changeDataFactory.create(db.get(), ctl), in, repo, true, null); + RevisionInfo rev = + toRevisionInfo(ctl, changeDataFactory.create(db.get(), ctl), in, repo, true, null); accountLoader.fill(); return rev; } } - private RevisionInfo toRevisionInfo(ChangeControl ctl, ChangeData cd, - PatchSet in, @Nullable Repository repo, boolean fillCommit, - @Nullable ChangeInfo changeInfo) throws PatchListNotAvailableException, - GpgException, OrmException, IOException { + private RevisionInfo toRevisionInfo( + ChangeControl ctl, + ChangeData cd, + PatchSet in, + @Nullable Repository repo, + boolean fillCommit, + @Nullable ChangeInfo changeInfo) + throws PatchListNotAvailableException, GpgException, OrmException, IOException { Change c = ctl.getChange(); RevisionInfo out = new RevisionInfo(); out.isCurrent = in.getId().equals(c.currentPatchSetId()); @@ -1174,8 +1157,7 @@ public class ChangeJson { out.kind = changeKindCache.getChangeKind(repo, cd, in); out.description = in.getDescription(); - boolean setCommit = has(ALL_COMMITS) - || (out.isCurrent && has(CURRENT_COMMIT)); + boolean setCommit = has(ALL_COMMITS) || (out.isCurrent && has(CURRENT_COMMIT)); boolean addFooters = out.isCurrent && has(COMMIT_FOOTERS); if (setCommit || addFooters) { Project.NameKey project = c.getProject(); @@ -1189,13 +1171,14 @@ public class ChangeJson { if (addFooters) { Ref ref = repo.exactRef(ctl.getChange().getDest().get()); RevCommit mergeTip = null; - if (ref != null){ + if (ref != null) { mergeTip = rw.parseCommit(ref.getObjectId()); rw.parseBody(mergeTip); } - out.commitWithFooters = mergeUtilFactory - .create(projectCache.get(project)) - .createCommitMessageOnSubmit(commit, mergeTip, ctl, in.getId()); + out.commitWithFooters = + mergeUtilFactory + .create(projectCache.get(project)) + .createCommitMessageOnSubmit(commit, mergeTip, ctl, in.getId()); } } } @@ -1210,15 +1193,15 @@ public class ChangeJson { && has(CURRENT_ACTIONS) && userProvider.get().isIdentifiedUser()) { - actionJson.addRevisionActions(changeInfo, out, - new RevisionResource(changeResourceFactory.create(ctl), in)); + actionJson.addRevisionActions( + changeInfo, out, new RevisionResource(changeResourceFactory.create(ctl), in)); } if (gpgApi.isEnabled() && has(PUSH_CERTIFICATES)) { if (in.getPushCertificate() != null) { - out.pushCertificate = gpgApi.checkPushCertificate( - in.getPushCertificate(), - userFactory.create(in.getUploader())); + out.pushCertificate = + gpgApi.checkPushCertificate( + in.getPushCertificate(), userFactory.create(in.getUploader())); } else { out.pushCertificate = new PushCertificateInfo(); } @@ -1227,8 +1210,9 @@ public class ChangeJson { return out; } - CommitInfo toCommit(ChangeControl ctl, RevWalk rw, RevCommit commit, - boolean addLinks, boolean fillCommit) throws IOException { + CommitInfo toCommit( + ChangeControl ctl, RevWalk rw, RevCommit commit, boolean addLinks, boolean fillCommit) + throws IOException { Project.NameKey project = ctl.getProject().getNameKey(); CommitInfo info = new CommitInfo(); if (fillCommit) { @@ -1241,8 +1225,7 @@ public class ChangeJson { info.message = commit.getFullMessage(); if (addLinks) { - List links = - webLinks.getPatchSetLinks(project, commit.name()); + List links = webLinks.getPatchSetLinks(project, commit.name()); info.webLinks = links.isEmpty() ? null : links; } @@ -1252,8 +1235,7 @@ public class ChangeJson { i.commit = parent.name(); i.subject = parent.getShortMessage(); if (addLinks) { - List parentLinks = - webLinks.getParentLinks(project, parent.name()); + List parentLinks = webLinks.getParentLinks(project, parent.name()); i.webLinks = parentLinks.isEmpty() ? null : parentLinks; } info.parents.add(i); @@ -1261,8 +1243,7 @@ public class ChangeJson { return info; } - private Map makeFetchMap(ChangeControl ctl, PatchSet in) - throws OrmException { + private Map makeFetchMap(ChangeControl ctl, PatchSet in) throws OrmException { Map r = new LinkedHashMap<>(); for (DynamicMap.Entry e : downloadSchemes) { @@ -1273,8 +1254,7 @@ public class ChangeJson { continue; } - if (!scheme.isAuthSupported() - && !ctl.forUser(anonymous).isPatchVisible(in, db.get())) { + if (!scheme.isAuthSupported() && !ctl.forUser(anonymous).isPatchVisible(in, db.get())) { continue; } @@ -1285,17 +1265,19 @@ public class ChangeJson { r.put(schemeName, fetchInfo); if (has(DOWNLOAD_COMMANDS)) { - populateFetchMap(scheme, downloadCommands, projectName, refName, - fetchInfo); + populateFetchMap(scheme, downloadCommands, projectName, refName, fetchInfo); } } return r; } - public static void populateFetchMap(DownloadScheme scheme, - DynamicMap commands, String projectName, - String refName, FetchInfo fetchInfo) { + public static void populateFetchMap( + DownloadScheme scheme, + DynamicMap commands, + String projectName, + String refName, + FetchInfo fetchInfo) { for (DynamicMap.Entry e2 : commands) { String commandName = e2.getExportName(); DownloadCommand command = e2.getProvider().get(); @@ -1306,8 +1288,7 @@ public class ChangeJson { } } - private static void addCommand(FetchInfo fetchInfo, String commandName, - String c) { + private static void addCommand(FetchInfo fetchInfo, String commandName, String c) { if (fetchInfo.commands == null) { fetchInfo.commands = new TreeMap<>(); } @@ -1315,10 +1296,9 @@ public class ChangeJson { } static void finish(ChangeInfo info) { - info.id = Joiner.on('~').join( - Url.encode(info.project), - Url.encode(info.branch), - Url.encode(info.changeId)); + info.id = + Joiner.on('~') + .join(Url.encode(info.project), Url.encode(info.branch), Url.encode(info.changeId)); } private static void addApproval(LabelInfo label, ApprovalInfo approval) { @@ -1330,12 +1310,13 @@ public class ChangeJson { @AutoValue abstract static class LabelWithStatus { - private static LabelWithStatus create(LabelInfo label, - SubmitRecord.Label.Status status) { + private static LabelWithStatus create(LabelInfo label, SubmitRecord.Label.Status status) { return new AutoValue_ChangeJson_LabelWithStatus(label, status); } abstract LabelInfo label(); - @Nullable abstract SubmitRecord.Label.Status status(); + + @Nullable + abstract SubmitRecord.Label.Status status(); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeKindCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeKindCache.java index e971eff904..aa478274f7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeKindCache.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeKindCache.java @@ -21,22 +21,20 @@ import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.server.query.change.ChangeData; - import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; /** * Cache of {@link ChangeKind} per commit. - *

- * This is immutable conditioned on the merge strategy (unless the JGit strategy - * implementation changes, which might invalidate old entries). + * + *

This is immutable conditioned on the merge strategy (unless the JGit strategy implementation + * changes, which might invalidate old entries). */ public interface ChangeKindCache { - ChangeKind getChangeKind(Project.NameKey project, @Nullable Repository repo, - ObjectId prior, ObjectId next); + ChangeKind getChangeKind( + Project.NameKey project, @Nullable Repository repo, ObjectId prior, ObjectId next); ChangeKind getChangeKind(ReviewDb db, Change change, PatchSet patch); - ChangeKind getChangeKind(@Nullable Repository repo, ChangeData cd, - PatchSet patch); + ChangeKind getChangeKind(@Nullable Repository repo, ChangeData cd, PatchSet patch); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeKindCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeKindCacheImpl.java index b3207e9812..030ddd2a15 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeKindCacheImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeKindCacheImpl.java @@ -38,7 +38,16 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Module; import com.google.inject.name.Named; - +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; +import java.util.Arrays; +import java.util.Collection; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; import org.eclipse.jgit.errors.LargeObjectException; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.ObjectId; @@ -50,20 +59,8 @@ import org.eclipse.jgit.revwalk.RevWalk; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.Arrays; -import java.util.Collection; -import java.util.Objects; -import java.util.Set; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; - public class ChangeKindCacheImpl implements ChangeKindCache { - private static final Logger log = - LoggerFactory.getLogger(ChangeKindCacheImpl.class); + private static final Logger log = LoggerFactory.getLogger(ChangeKindCacheImpl.class); private static final String ID_CACHE = "change_kind"; @@ -85,7 +82,6 @@ public class ChangeKindCacheImpl implements ChangeKindCache { private final ChangeData.Factory changeDataFactory; private final GitRepositoryManager repoManager; - @Inject NoCache( @GerritServerConfig Config serverConfig, @@ -97,28 +93,25 @@ public class ChangeKindCacheImpl implements ChangeKindCache { } @Override - public ChangeKind getChangeKind(Project.NameKey project, - @Nullable Repository repo, ObjectId prior, ObjectId next) { + public ChangeKind getChangeKind( + Project.NameKey project, @Nullable Repository repo, ObjectId prior, ObjectId next) { try { Key key = new Key(prior, next, useRecursiveMerge); return new Loader(key, repoManager, project, repo).call(); } catch (IOException e) { - log.warn("Cannot check trivial rebase of new patch set " + next.name() - + " in " + project, e); + log.warn( + "Cannot check trivial rebase of new patch set " + next.name() + " in " + project, e); return ChangeKind.REWORK; } } @Override - public ChangeKind getChangeKind(ReviewDb db, Change change, - PatchSet patch) { - return getChangeKindInternal(this, db, change, patch, changeDataFactory, - repoManager); + public ChangeKind getChangeKind(ReviewDb db, Change change, PatchSet patch) { + return getChangeKindInternal(this, db, change, patch, changeDataFactory, repoManager); } @Override - public ChangeKind getChangeKind(@Nullable Repository repo, ChangeData cd, - PatchSet patch) { + public ChangeKind getChangeKind(@Nullable Repository repo, ChangeData cd, PatchSet patch) { return getChangeKindInternal(this, repo, cd, patch); } } @@ -132,8 +125,7 @@ public class ChangeKindCacheImpl implements ChangeKindCache { private Key(ObjectId prior, ObjectId next, boolean useRecursiveMerge) { checkNotNull(next, "next"); - String strategyName = MergeUtil.mergeStrategyName( - true, useRecursiveMerge); + String strategyName = MergeUtil.mergeStrategyName(true, useRecursiveMerge); this.prior = prior.copy(); this.next = next.copy(); this.strategyName = strategyName; @@ -192,8 +184,11 @@ public class ChangeKindCacheImpl implements ChangeKindCache { private final Project.NameKey projectName; private final Repository alreadyOpenRepo; - private Loader(Key key, GitRepositoryManager repoManager, - Project.NameKey projectName, @Nullable Repository alreadyOpenRepo) { + private Loader( + Key key, + GitRepositoryManager repoManager, + Project.NameKey projectName, + @Nullable Repository alreadyOpenRepo) { this.key = key; this.repoManager = repoManager; this.projectName = projectName; @@ -230,8 +225,7 @@ public class ChangeKindCacheImpl implements ChangeKindCache { } if ((prior.getParentCount() != 1 || next.getParentCount() != 1) - && (!onlyFirstParentChanged(prior, next) - || prior.getParentCount() == 0)) { + && (!onlyFirstParentChanged(prior, next) || prior.getParentCount() == 0)) { // Trivial rebases done by machine only work well on 1 parent. return ChangeKind.REWORK; } @@ -240,8 +234,7 @@ public class ChangeKindCacheImpl implements ChangeKindCache { // having the same tree as would exist when the prior commit is // cherry-picked onto the next commit's new first parent. try (ObjectInserter ins = new InMemoryInserter(repo)) { - ThreeWayMerger merger = - MergeUtil.newThreeWayMerger(repo, ins, key.strategyName); + ThreeWayMerger merger = MergeUtil.newThreeWayMerger(repo, ins, key.strategyName); merger.setBase(prior.getParent(0)); if (merger.merge(next.getParent(0), prior) && merger.getResultTreeId().equals(next.getTree())) { @@ -308,7 +301,9 @@ public class ChangeKindCacheImpl implements ChangeKindCache { public static class ChangeKindWeigher implements Weigher { @Override public int weigh(Key key, ChangeKind changeKind) { - return 16 + 2 * 36 + 2 * key.strategyName.length() // Size of Key, 64 bit JVM + return 16 + + 2 * 36 + + 2 * key.strategyName.length() // Size of Key, 64 bit JVM + 2 * changeKind.name().length(); // Size of ChangeKind, 64 bit JVM } } @@ -331,35 +326,29 @@ public class ChangeKindCacheImpl implements ChangeKindCache { } @Override - public ChangeKind getChangeKind(Project.NameKey project, - @Nullable Repository repo, ObjectId prior, ObjectId next) { + public ChangeKind getChangeKind( + Project.NameKey project, @Nullable Repository repo, ObjectId prior, ObjectId next) { try { Key key = new Key(prior, next, useRecursiveMerge); return cache.get(key, new Loader(key, repoManager, project, repo)); } catch (ExecutionException e) { - log.warn("Cannot check trivial rebase of new patch set " + next.name() - + " in " + project, e); + log.warn("Cannot check trivial rebase of new patch set " + next.name() + " in " + project, e); return ChangeKind.REWORK; } } @Override public ChangeKind getChangeKind(ReviewDb db, Change change, PatchSet patch) { - return getChangeKindInternal(this, db, change, patch, changeDataFactory, - repoManager); + return getChangeKindInternal(this, db, change, patch, changeDataFactory, repoManager); } @Override - public ChangeKind getChangeKind(@Nullable Repository repo, ChangeData cd, - PatchSet patch) { + public ChangeKind getChangeKind(@Nullable Repository repo, ChangeData cd, PatchSet patch) { return getChangeKindInternal(this, repo, cd, patch); } private static ChangeKind getChangeKindInternal( - ChangeKindCache cache, - @Nullable Repository repo, - ChangeData change, - PatchSet patch) { + ChangeKindCache cache, @Nullable Repository repo, ChangeData change, PatchSet patch) { ChangeKind kind = ChangeKind.REWORK; // Trivial case: if we're on the first patch, we don't need to use // the repository. @@ -368,9 +357,8 @@ public class ChangeKindCacheImpl implements ChangeKindCache { Collection patchSetCollection = change.patchSets(); PatchSet priorPs = patch; for (PatchSet ps : patchSetCollection) { - if (ps.getId().get() < patch.getId().get() && - (ps.getId().get() > priorPs.getId().get() || - priorPs == patch)) { + if (ps.getId().get() < patch.getId().get() + && (ps.getId().get() > priorPs.getId().get() || priorPs == patch)) { // We only want the previous patch set, so walk until the last one priorPs = ps; } @@ -382,14 +370,20 @@ public class ChangeKindCacheImpl implements ChangeKindCache { // and deletes the draft. if (priorPs != patch) { kind = - cache.getChangeKind(change.project(), repo, + cache.getChangeKind( + change.project(), + repo, ObjectId.fromString(priorPs.getRevision().get()), ObjectId.fromString(patch.getRevision().get())); } } catch (OrmException e) { // Do nothing; assume we have a complex change - log.warn("Unable to get change kind for patchSet " + patch.getPatchSetId() + - "of change " + change.getId(), e); + log.warn( + "Unable to get change kind for patchSet " + + patch.getPatchSetId() + + "of change " + + change.getId(), + e); } } return kind; @@ -408,12 +402,15 @@ public class ChangeKindCacheImpl implements ChangeKindCache { // the repository. if (patch.getId().get() > 1) { try (Repository repo = repoManager.openRepository(change.getProject())) { - kind = getChangeKindInternal(cache, repo, - changeDataFactory.create(db, change), patch); + kind = getChangeKindInternal(cache, repo, changeDataFactory.create(db, change), patch); } catch (IOException e) { // Do nothing; assume we have a complex change - log.warn("Unable to get change kind for patchSet " + patch.getPatchSetId() + - "of change " + change.getChangeId(), e); + log.warn( + "Unable to get change kind for patchSet " + + patch.getPatchSetId() + + "of change " + + change.getChangeId(), + e); } } return kind; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeResource.java index 05d12b3488..236ecadf5a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeResource.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeResource.java @@ -35,15 +35,14 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.TypeLiteral; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - import org.eclipse.jgit.lib.ObjectId; public class ChangeResource implements RestResource, HasETag { /** * JSON format version number for ETag computations. - *

- * Should be bumped on any JSON format change (new fields, etc.) so that - * otherwise unmodified changes get new ETags. + * + *

Should be bumped on any JSON format change (new fields, etc.) so that otherwise unmodified + * changes get new ETags. */ public static final int JSON_FORMAT_VERSION = 1; @@ -58,8 +57,7 @@ public class ChangeResource implements RestResource, HasETag { private final ChangeControl control; @AssistedInject - ChangeResource(StarredChangesUtil starredChangesUtil, - @Assisted ChangeControl control) { + ChangeResource(StarredChangesUtil starredChangesUtil, @Assisted ChangeControl control) { this.starredChangesUtil = starredChangesUtil; this.control = control; } @@ -92,9 +90,9 @@ public class ChangeResource implements RestResource, HasETag { // unrelated to the UI. public void prepareETag(Hasher h, CurrentUser user) { h.putInt(JSON_FORMAT_VERSION) - .putLong(getChange().getLastUpdatedOn().getTime()) - .putInt(getChange().getRowVersion()) - .putInt(user.isIdentifiedUser() ? user.getAccountId().get() : 0); + .putLong(getChange().getLastUpdatedOn().getTime()) + .putInt(getChange().getRowVersion()) + .putInt(user.isIdentifiedUser() ? user.getAccountId().get() : 0); if (user.isIdentifiedUser()) { for (AccountGroup.UUID uuid : user.getEffectiveGroups().getKnownGroups()) { @@ -123,9 +121,7 @@ public class ChangeResource implements RestResource, HasETag { CurrentUser user = control.getUser(); Hasher h = Hashing.md5().newHasher(); if (user.isIdentifiedUser()) { - h.putString( - starredChangesUtil.getObjectId(user.getAccountId(), getId()).name(), - UTF_8); + h.putString(starredChangesUtil.getObjectId(user.getAccountId(), getId()).name(), UTF_8); } prepareETag(h, user); return h.hash().toString(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeTriplet.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeTriplet.java index fc3e70aa90..71a3db723f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeTriplet.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeTriplet.java @@ -19,7 +19,6 @@ import com.google.gerrit.extensions.restapi.Url; import com.google.gerrit.reviewdb.client.Branch; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Project; - import java.util.Optional; @AutoValue @@ -29,17 +28,14 @@ public abstract class ChangeTriplet { } private static String format(Branch.NameKey branch, Change.Key change) { - return branch.getParentKey().get() - + "~" + branch.getShortName() - + "~" + change.get(); + return branch.getParentKey().get() + "~" + branch.getShortName() + "~" + change.get(); } /** * Parse a triplet out of a string. * * @param triplet string of the form "project~branch~id". - * @return the triplet if the input string has the proper format, or absent if - * not. + * @return the triplet if the input string has the proper format, or absent if not. */ public static Optional parse(String triplet) { int t2 = triplet.lastIndexOf('~'); @@ -52,9 +48,9 @@ public abstract class ChangeTriplet { String branch = Url.decode(triplet.substring(t1 + 1, t2)); String changeId = Url.decode(triplet.substring(t2 + 1)); - ChangeTriplet result = new AutoValue_ChangeTriplet( - new Branch.NameKey(new Project.NameKey(project), branch), - new Change.Key(changeId)); + ChangeTriplet result = + new AutoValue_ChangeTriplet( + new Branch.NameKey(new Project.NameKey(project), branch), new Change.Key(changeId)); return Optional.of(result); } @@ -63,6 +59,7 @@ public abstract class ChangeTriplet { } public abstract Branch.NameKey branch(); + public abstract Change.Key id(); @Override diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangesCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangesCollection.java index b89691acfb..eeb1ab3c64 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangesCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangesCollection.java @@ -32,13 +32,11 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.util.List; @Singleton -public class ChangesCollection implements - RestCollection, - AcceptsPost { +public class ChangesCollection + implements RestCollection, AcceptsPost { private final Provider db; private final Provider user; private final Provider queryFactory; @@ -92,8 +90,7 @@ public class ChangesCollection implements return changeResourceFactory.create(ctl); } - public ChangeResource parse(Change.Id id) - throws ResourceNotFoundException, OrmException { + public ChangeResource parse(Change.Id id) throws ResourceNotFoundException, OrmException { List ctls = changeFinder.find(id, user.get()); if (ctls.isEmpty()) { throw new ResourceNotFoundException(toIdString(id)); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Check.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Check.java index f4869bedb1..1f24afb3b8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Check.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Check.java @@ -25,11 +25,10 @@ import com.google.gerrit.extensions.restapi.RestReadView; import com.google.gerrit.server.project.ChangeControl; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - import java.util.EnumSet; -public class Check implements RestReadView, - RestModifyView { +public class Check + implements RestReadView, RestModifyView { private final ChangeJson.Factory jsonFactory; @Inject @@ -38,8 +37,7 @@ public class Check implements RestReadView, } @Override - public Response apply(ChangeResource rsrc) - throws RestApiException, OrmException { + public Response apply(ChangeResource rsrc) throws RestApiException, OrmException { return Response.withMustRevalidate(newChangeJson().format(rsrc)); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPick.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPick.java index b5eb193ad4..5178774bd2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPick.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPick.java @@ -37,20 +37,18 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; @Singleton -public class CherryPick implements RestModifyView, - UiAction { +public class CherryPick + implements RestModifyView, UiAction { private final Provider dbProvider; private final CherryPickChange cherryPickChange; private final ChangeJson.Factory json; @Inject - CherryPick(Provider dbProvider, - CherryPickChange cherryPickChange, - ChangeJson.Factory json) { + CherryPick( + Provider dbProvider, CherryPickChange cherryPickChange, ChangeJson.Factory json) { this.dbProvider = dbProvider; this.cherryPickChange = cherryPickChange; this.json = json; @@ -64,8 +62,7 @@ public class CherryPick implements RestModifyView db, + CherryPickChange( + Provider db, Sequences seq, Provider queryProvider, @GerritPersonIdent PersonIdent myIdent, @@ -113,13 +112,16 @@ public class CherryPickChange { this.batchUpdateFactory = batchUpdateFactory; } - public Change.Id cherryPick(Change change, PatchSet patch, - final String message, final String ref, final RefControl refControl, - int parent) throws NoSuchChangeException, - OrmException, MissingObjectException, - IncorrectObjectTypeException, IOException, - InvalidChangeOperationException, IntegrationException, UpdateException, - RestApiException { + public Change.Id cherryPick( + Change change, + PatchSet patch, + final String message, + final String ref, + final RefControl refControl, + int parent) + throws NoSuchChangeException, OrmException, MissingObjectException, + IncorrectObjectTypeException, IOException, InvalidChangeOperationException, + IntegrationException, UpdateException, RestApiException { if (Strings.isNullOrEmpty(ref)) { throw new InvalidChangeOperationException( @@ -134,12 +136,11 @@ public class CherryPickChange { // created later on, to ensure the cherry-picked commit is flushed // before patch sets are updated. ObjectInserter oi = git.newObjectInserter(); - CodeReviewRevWalk revWalk = - CodeReviewCommit.newRevWalk(oi.newReader())) { + CodeReviewRevWalk revWalk = CodeReviewCommit.newRevWalk(oi.newReader())) { Ref destRef = git.getRefDatabase().exactRef(ref); if (destRef == null) { - throw new InvalidChangeOperationException(String.format( - "Branch %s does not exist.", destinationBranch)); + throw new InvalidChangeOperationException( + String.format("Branch %s does not exist.", destinationBranch)); } CodeReviewCommit mergeTip = revWalk.parseCommit(destRef.getObjectId()); @@ -148,35 +149,44 @@ public class CherryPickChange { revWalk.parseCommit(ObjectId.fromString(patch.getRevision().get())); if (parent <= 0 || parent > commitToCherryPick.getParentCount()) { - throw new InvalidChangeOperationException(String.format( - "Cherry Pick: Parent %s does not exist. Please specify a parent in" - + " range [1, %s].", - parent, commitToCherryPick.getParentCount())); + throw new InvalidChangeOperationException( + String.format( + "Cherry Pick: Parent %s does not exist. Please specify a parent in" + + " range [1, %s].", + parent, commitToCherryPick.getParentCount())); } Timestamp now = TimeUtil.nowTs(); - PersonIdent committerIdent = - identifiedUser.newCommitterIdent(now, serverTimeZone); + PersonIdent committerIdent = identifiedUser.newCommitterIdent(now, serverTimeZone); final ObjectId computedChangeId = - ChangeIdUtil - .computeChangeId(commitToCherryPick.getTree(), mergeTip, - commitToCherryPick.getAuthorIdent(), committerIdent, message); - String commitMessage = - ChangeIdUtil.insertId(message, computedChangeId).trim() + '\n'; + ChangeIdUtil.computeChangeId( + commitToCherryPick.getTree(), + mergeTip, + commitToCherryPick.getAuthorIdent(), + committerIdent, + message); + String commitMessage = ChangeIdUtil.insertId(message, computedChangeId).trim() + '\n'; CodeReviewCommit cherryPickCommit; try { - ProjectState projectState = refControl.getProjectControl() - .getProjectState(); - cherryPickCommit = mergeUtilFactory.create(projectState) - .createCherryPickFromCommit(git, oi, mergeTip, - commitToCherryPick, committerIdent, commitMessage, revWalk, - parent - 1, false); + ProjectState projectState = refControl.getProjectControl().getProjectState(); + cherryPickCommit = + mergeUtilFactory + .create(projectState) + .createCherryPickFromCommit( + git, + oi, + mergeTip, + commitToCherryPick, + committerIdent, + commitMessage, + revWalk, + parent - 1, + false); Change.Key changeKey; - final List idList = cherryPickCommit.getFooterLines( - FooterConstants.CHANGE_ID); + final List idList = cherryPickCommit.getFooterLines(FooterConstants.CHANGE_ID); if (!idList.isEmpty()) { final String idStr = idList.get(idList.size() - 1).trim(); changeKey = new Change.Key(idStr); @@ -184,27 +194,27 @@ public class CherryPickChange { changeKey = new Change.Key("I" + computedChangeId.name()); } - Branch.NameKey newDest = - new Branch.NameKey(change.getProject(), destRef.getName()); - List destChanges = queryProvider.get() - .setLimit(2) - .byBranchKey(newDest, changeKey); + Branch.NameKey newDest = new Branch.NameKey(change.getProject(), destRef.getName()); + List destChanges = + queryProvider.get().setLimit(2).byBranchKey(newDest, changeKey); if (destChanges.size() > 1) { - throw new InvalidChangeOperationException("Several changes with key " - + changeKey + " reside on the same branch. " - + "Cannot create a new patch set."); + throw new InvalidChangeOperationException( + "Several changes with key " + + changeKey + + " reside on the same branch. " + + "Cannot create a new patch set."); } - try (BatchUpdate bu = batchUpdateFactory.create( - db.get(), change.getDest().getParentKey(), identifiedUser, now)) { + try (BatchUpdate bu = + batchUpdateFactory.create( + db.get(), change.getDest().getParentKey(), identifiedUser, now)) { bu.setRepository(git, revWalk, oi); Change.Id result; if (destChanges.size() == 1) { // The change key exists on the destination branch. The cherry pick // will be added as a new patch set. - ChangeControl destCtl = refControl.getProjectControl() - .controlFor(destChanges.get(0).notes()); - result = insertPatchSet( - bu, git, destCtl, cherryPickCommit); + ChangeControl destCtl = + refControl.getProjectControl().controlFor(destChanges.get(0).notes()); + result = insertPatchSet(bu, git, destCtl, cherryPickCommit); } else { // Change key not found on destination branch. We can create a new // change. @@ -213,13 +223,13 @@ public class CherryPickChange { newTopic = change.getTopic() + "-" + newDest.getShortName(); } result = - createNewChange(bu, cherryPickCommit, - refControl.getRefName(), newTopic, change.getDest()); + createNewChange( + bu, cherryPickCommit, refControl.getRefName(), newTopic, change.getDest()); - bu.addOp(change.getId(), + bu.addOp( + change.getId(), new AddMessageToSourceChangeOp( - changeMessagesUtil, patch.getId(), destinationBranch, - cherryPickCommit)); + changeMessagesUtil, patch.getId(), destinationBranch, cherryPickCommit)); } bu.execute(); return result; @@ -232,35 +242,39 @@ public class CherryPickChange { } } - private Change.Id insertPatchSet(BatchUpdate bu, Repository git, - ChangeControl destCtl, CodeReviewCommit cherryPickCommit) + private Change.Id insertPatchSet( + BatchUpdate bu, Repository git, ChangeControl destCtl, CodeReviewCommit cherryPickCommit) throws IOException, OrmException { Change destChange = destCtl.getChange(); - PatchSet.Id psId = - ChangeUtil.nextPatchSetId(git, destChange.currentPatchSetId()); - PatchSetInserter inserter = patchSetInserterFactory - .create(destCtl, psId, cherryPickCommit); + PatchSet.Id psId = ChangeUtil.nextPatchSetId(git, destChange.currentPatchSetId()); + PatchSetInserter inserter = patchSetInserterFactory.create(destCtl, psId, cherryPickCommit); PatchSet.Id newPatchSetId = inserter.getPatchSetId(); PatchSet current = psUtil.current(db.get(), destCtl.getNotes()); - bu.addOp(destChange.getId(), inserter - .setMessage("Uploaded patch set " + newPatchSetId.get() + ".") - .setDraft(current.isDraft()) - .setNotify(NotifyHandling.NONE)); + bu.addOp( + destChange.getId(), + inserter + .setMessage("Uploaded patch set " + newPatchSetId.get() + ".") + .setDraft(current.isDraft()) + .setNotify(NotifyHandling.NONE)); return destChange.getId(); } - private Change.Id createNewChange(BatchUpdate bu, - CodeReviewCommit cherryPickCommit, String refName, String topic, - Branch.NameKey sourceBranch) throws OrmException { + private Change.Id createNewChange( + BatchUpdate bu, + CodeReviewCommit cherryPickCommit, + String refName, + String topic, + Branch.NameKey sourceBranch) + throws OrmException { Change.Id changeId = new Change.Id(seq.nextChangeId()); - ChangeInserter ins = changeInserterFactory.create( - changeId, cherryPickCommit, refName) - .setValidatePolicy(CommitValidators.Policy.GERRIT) - .setTopic(topic); + ChangeInserter ins = + changeInserterFactory + .create(changeId, cherryPickCommit, refName) + .setValidatePolicy(CommitValidators.Policy.GERRIT) + .setTopic(topic); - ins.setMessage( - messageForDestinationChange(ins.getPatchSetId(), sourceBranch)); + ins.setMessage(messageForDestinationChange(ins.getPatchSetId(), sourceBranch)); bu.insertChange(ins); return changeId; } @@ -271,8 +285,8 @@ public class CherryPickChange { private final String destBranch; private final ObjectId cherryPickCommit; - private AddMessageToSourceChangeOp(ChangeMessagesUtil cmUtil, - PatchSet.Id psId, String destBranch, ObjectId cherryPickCommit) { + private AddMessageToSourceChangeOp( + ChangeMessagesUtil cmUtil, PatchSet.Id psId, String destBranch, ObjectId cherryPickCommit) { this.cmUtil = cmUtil; this.psId = psId; this.destBranch = destBranch; @@ -281,29 +295,33 @@ public class CherryPickChange { @Override public boolean updateChange(ChangeContext ctx) throws OrmException { - StringBuilder sb = new StringBuilder("Patch Set ") - .append(psId.get()) - .append(": Cherry Picked") - .append("\n\n") - .append("This patchset was cherry picked to branch ") - .append(destBranch) - .append(" as commit ") - .append(cherryPickCommit.name()); - ChangeMessage changeMessage = ChangeMessagesUtil.newMessage( - psId, ctx.getUser(), ctx.getWhen(), sb.toString(), - ChangeMessagesUtil.TAG_CHERRY_PICK_CHANGE); + StringBuilder sb = + new StringBuilder("Patch Set ") + .append(psId.get()) + .append(": Cherry Picked") + .append("\n\n") + .append("This patchset was cherry picked to branch ") + .append(destBranch) + .append(" as commit ") + .append(cherryPickCommit.name()); + ChangeMessage changeMessage = + ChangeMessagesUtil.newMessage( + psId, + ctx.getUser(), + ctx.getWhen(), + sb.toString(), + ChangeMessagesUtil.TAG_CHERRY_PICK_CHANGE); cmUtil.addChangeMessage(ctx.getDb(), ctx.getUpdate(psId), changeMessage); return true; } } - private String messageForDestinationChange(PatchSet.Id patchSetId, - Branch.NameKey sourceBranch) { + private String messageForDestinationChange(PatchSet.Id patchSetId, Branch.NameKey sourceBranch) { return new StringBuilder("Patch Set ") - .append(patchSetId.get()) - .append(": Cherry Picked from branch ") - .append(sourceBranch.getShortName()) - .append(".") - .toString(); + .append(patchSetId.get()) + .append(": Cherry Picked from branch ") + .append(sourceBranch.getShortName()) + .append(".") + .toString(); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/CommentJson.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/CommentJson.java index eb6d151c53..4651c6bb91 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/CommentJson.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/CommentJson.java @@ -33,7 +33,6 @@ import com.google.gerrit.reviewdb.client.RobotComment; import com.google.gerrit.server.account.AccountLoader; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -71,11 +70,9 @@ class CommentJson { return new RobotCommentFormatter(); } - private abstract class BaseCommentFormatter { + private abstract class BaseCommentFormatter { public T format(F comment) throws OrmException { - AccountLoader loader = - fillAccounts ? accountLoaderFactory.create(true) : null; + AccountLoader loader = fillAccounts ? accountLoaderFactory.create(true) : null; T info = toInfo(comment, loader); if (loader != null) { loader.fill(); @@ -83,10 +80,8 @@ class CommentJson { return info; } - public Map> format(Iterable comments) - throws OrmException { - AccountLoader loader = - fillAccounts ? accountLoaderFactory.create(true) : null; + public Map> format(Iterable comments) throws OrmException { + AccountLoader loader = fillAccounts ? accountLoaderFactory.create(true) : null; Map> out = new TreeMap<>(); @@ -112,12 +107,12 @@ class CommentJson { } public List formatAsList(Iterable comments) throws OrmException { - AccountLoader loader = - fillAccounts ? accountLoaderFactory.create(true) : null; + AccountLoader loader = fillAccounts ? accountLoaderFactory.create(true) : null; - List out = FluentIterable.from(comments) - .transform(c -> toInfo(c, loader)) - .toSortedList(COMMENT_INFO_ORDER); + List out = + FluentIterable.from(comments) + .transform(c -> toInfo(c, loader)) + .toSortedList(COMMENT_INFO_ORDER); if (loader != null) { loader.fill(); @@ -127,8 +122,7 @@ class CommentJson { protected abstract T toInfo(F comment, AccountLoader loader); - protected void fillCommentInfo(Comment c, CommentInfo r, - AccountLoader loader) { + protected void fillCommentInfo(Comment c, CommentInfo r, AccountLoader loader) { if (fillPatchSet) { r.patchSet = c.key.patchSetId; } @@ -175,12 +169,10 @@ class CommentJson { return ci; } - private CommentFormatter() { - } + private CommentFormatter() {} } - class RobotCommentFormatter - extends BaseCommentFormatter { + class RobotCommentFormatter extends BaseCommentFormatter { @Override protected RobotCommentInfo toInfo(RobotComment c, AccountLoader loader) { RobotCommentInfo rci = new RobotCommentInfo(); @@ -199,23 +191,23 @@ class CommentJson { return null; } - return fixSuggestions.stream() - .map(this::toFixSuggestionInfo) - .collect(Collectors.toList()); + return fixSuggestions.stream().map(this::toFixSuggestionInfo).collect(Collectors.toList()); } private FixSuggestionInfo toFixSuggestionInfo(FixSuggestion fixSuggestion) { FixSuggestionInfo fixSuggestionInfo = new FixSuggestionInfo(); fixSuggestionInfo.fixId = fixSuggestion.fixId; fixSuggestionInfo.description = fixSuggestion.description; - fixSuggestionInfo.replacements = fixSuggestion.replacements.stream() - .map(this::toFixReplacementInfo) - .collect(Collectors.toList()); + fixSuggestionInfo.replacements = + fixSuggestion + .replacements + .stream() + .map(this::toFixReplacementInfo) + .collect(Collectors.toList()); return fixSuggestionInfo; } - private FixReplacementInfo toFixReplacementInfo( - FixReplacement fixReplacement) { + private FixReplacementInfo toFixReplacementInfo(FixReplacement fixReplacement) { FixReplacementInfo fixReplacementInfo = new FixReplacementInfo(); fixReplacementInfo.path = fixReplacement.path; fixReplacementInfo.range = toRange(fixReplacement.range); @@ -223,7 +215,6 @@ class CommentJson { return fixReplacementInfo; } - private RobotCommentFormatter() { - } + private RobotCommentFormatter() {} } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Comments.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Comments.java index 6ce7ddaf0b..935aa4e485 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Comments.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Comments.java @@ -36,8 +36,10 @@ public class Comments implements ChildCollection> views, - ListRevisionComments list, Provider dbProvider, + Comments( + DynamicMap> views, + ListRevisionComments list, + Provider dbProvider, CommentsUtil commentsUtil) { this.views = views; this.list = list; @@ -61,8 +63,8 @@ public class Comments implements ChildCollection - * A single instance may be reused for checking multiple changes, but not - * concurrently. + * + *

A single instance may be reused for checking multiple changes, but not concurrently. */ public class ConsistencyChecker { - private static final Logger log = - LoggerFactory.getLogger(ConsistencyChecker.class); + private static final Logger log = LoggerFactory.getLogger(ConsistencyChecker.class); @AutoValue public abstract static class Result { - private static Result create(ChangeControl ctl, - List problems) { - return new AutoValue_ConsistencyChecker_Result( - ctl.getId(), ctl.getChange(), problems); + private static Result create(ChangeControl ctl, List problems) { + return new AutoValue_ConsistencyChecker_Result(ctl.getId(), ctl.getChange(), problems); } public abstract Change.Id id(); @@ -216,8 +210,8 @@ public class ConsistencyChecker { try { currPs = psUtil.current(db.get(), ctl.getNotes()); if (currPs == null) { - problem(String.format("Current patch set %d not found", - change().currentPatchSetId().get())); + problem( + String.format("Current patch set %d not found", change().currentPatchSetId().get())); } } catch (OrmException e) { error("Failed to look up current patch set", e); @@ -245,16 +239,13 @@ public class ConsistencyChecker { } catch (OrmException e) { return error("Failed to look up patch sets", e); } - patchSetsBySha = MultimapBuilder.hashKeys(all.size()) - .treeSetValues(PS_ID_ORDER) - .build(); + patchSetsBySha = MultimapBuilder.hashKeys(all.size()).treeSetValues(PS_ID_ORDER).build(); Map refs; try { - refs = repo.getRefDatabase().exactRef( - all.stream() - .map(ps -> ps.getId().toRefName()) - .toArray(String[]::new)); + refs = + repo.getRefDatabase() + .exactRef(all.stream().map(ps -> ps.getId().toRefName()).toArray(String[]::new)); } catch (IOException e) { error("error reading refs", e); refs = Collections.emptyMap(); @@ -265,8 +256,7 @@ public class ConsistencyChecker { // Check revision format. int psNum = ps.getId().get(); String refName = ps.getId().toRefName(); - ObjectId objId = - parseObjectId(ps.getRevision().get(), "patch set " + psNum); + ObjectId objId = parseObjectId(ps.getRevision().get(), "patch set " + psNum); if (objId == null) { continue; } @@ -278,21 +268,18 @@ public class ConsistencyChecker { if (ref == null) { refProblem = problem("Ref missing: " + refName); } else if (!objId.equals(ref.getObjectId())) { - String actual = ref.getObjectId() != null - ? ref.getObjectId().name() - : "null"; - refProblem = problem(String.format( - "Expected %s to point to %s, found %s", - ref.getName(), objId.name(), actual)); + String actual = ref.getObjectId() != null ? ref.getObjectId().name() : "null"; + refProblem = + problem( + String.format( + "Expected %s to point to %s, found %s", ref.getName(), objId.name(), actual)); } // Check object existence. - RevCommit psCommit = parseCommit( - objId, String.format("patch set %d", psNum)); + RevCommit psCommit = parseCommit(objId, String.format("patch set %d", psNum)); if (psCommit == null) { if (fix != null && fix.deletePatchSetIfCommitMissing) { - deletePatchSetOps.add( - new DeletePatchSetFromDbOp(lastProblem(), ps.getId())); + deletePatchSetOps.add(new DeletePatchSetFromDbOp(lastProblem(), ps.getId())); } continue; } else if (refProblem != null && fix != null) { @@ -307,12 +294,12 @@ public class ConsistencyChecker { deletePatchSets(deletePatchSetOps); // Check for duplicates. - for (Map.Entry> e - : patchSetsBySha.asMap().entrySet()) { + for (Map.Entry> e : patchSetsBySha.asMap().entrySet()) { if (e.getValue().size() > 1) { - problem(String.format("Multiple patch sets pointing to %s: %s", - e.getKey().name(), - Collections2.transform(e.getValue(), PatchSet::getPatchSetId))); + problem( + String.format( + "Multiple patch sets pointing to %s: %s", + e.getKey().name(), Collections2.transform(e.getValue(), PatchSet::getPatchSetId))); } } @@ -332,8 +319,7 @@ public class ConsistencyChecker { problem("Destination ref not found (may be new branch): " + refName); return; } - tip = parseCommit(dest.getObjectId(), - "destination ref " + refName); + tip = parseCommit(dest.getObjectId(), "destination ref " + refName); if (tip == null) { return; } @@ -345,8 +331,7 @@ public class ConsistencyChecker { try { merged = rw.isMergedInto(currPsCommit, tip); } catch (IOException e) { - problem("Error checking whether patch set " + currPs.getId().get() - + " is merged"); + problem("Error checking whether patch set " + currPs.getId().get() + " is merged"); return; } checkMergedBitMatchesStatus(currPs.getId(), currPsCommit, merged); @@ -355,14 +340,14 @@ public class ConsistencyChecker { private ProblemInfo wrongChangeStatus(PatchSet.Id psId, RevCommit commit) { String refName = change().getDest().get(); - return problem(String.format( - "Patch set %d (%s) is merged into destination ref %s (%s), but change" - + " status is %s", psId.get(), commit.name(), - refName, tip.name(), change().getStatus())); + return problem( + String.format( + "Patch set %d (%s) is merged into destination ref %s (%s), but change" + + " status is %s", + psId.get(), commit.name(), refName, tip.name(), change().getStatus())); } - private void checkMergedBitMatchesStatus(PatchSet.Id psId, RevCommit commit, - boolean merged) { + private void checkMergedBitMatchesStatus(PatchSet.Id psId, RevCommit commit, boolean merged) { String refName = change().getDest().get(); if (merged && change().getStatus() != Change.Status.MERGED) { ProblemInfo p = wrongChangeStatus(psId, commit); @@ -370,16 +355,16 @@ public class ConsistencyChecker { fixMerged(p); } } else if (!merged && change().getStatus() == Change.Status.MERGED) { - problem(String.format("Patch set %d (%s) is not merged into" - + " destination ref %s (%s), but change status is %s", - currPs.getId().get(), commit.name(), refName, tip.name(), - change().getStatus())); + problem( + String.format( + "Patch set %d (%s) is not merged into" + + " destination ref %s (%s), but change status is %s", + currPs.getId().get(), commit.name(), refName, tip.name(), change().getStatus())); } } private void checkExpectMergedAs() { - ObjectId objId = - parseObjectId(fix.expectMergedAs, "expected merged commit"); + ObjectId objId = parseObjectId(fix.expectMergedAs, "expected merged commit"); RevCommit commit = parseCommit(objId, "expected merged commit"); if (commit == null) { return; @@ -387,9 +372,10 @@ public class ConsistencyChecker { try { if (!rw.isMergedInto(commit, tip)) { - problem(String.format("Expected merged commit %s is not merged into" - + " destination ref %s (%s)", - commit.name(), change().getDest().get(), tip.name())); + problem( + String.format( + "Expected merged commit %s is not merged into" + " destination ref %s (%s)", + commit.name(), change().getDest().get(), tip.name())); return; } @@ -403,8 +389,10 @@ public class ConsistencyChecker { continue; } try { - Change c = notesFactory.createChecked( - db.get(), change().getProject(), psId.getParentKey()).getChange(); + Change c = + notesFactory + .createChecked(db.get(), change().getProject(), psId.getParentKey()) + .getChange(); if (!c.getDest().equals(change().getDest())) { continue; } @@ -418,13 +406,14 @@ public class ConsistencyChecker { case 0: // No patch set for this commit; insert one. rw.parseBody(commit); - String changeId = Iterables.getFirst( - commit.getFooterLines(FooterConstants.CHANGE_ID), null); + String changeId = + Iterables.getFirst(commit.getFooterLines(FooterConstants.CHANGE_ID), null); // Missing Change-Id footer is ok, but mismatched is not. if (changeId != null && !changeId.equals(change().getKey().get())) { - problem(String.format("Expected merged commit %s has Change-Id: %s," - + " but expected %s", - commit.name(), changeId, change().getKey().get())); + problem( + String.format( + "Expected merged commit %s has Change-Id: %s," + " but expected %s", + commit.name(), changeId, change().getKey().get())); return; } insertMergedPatchSet(commit, null, false); @@ -448,41 +437,40 @@ public class ConsistencyChecker { break; default: - problem(String.format( - "Multiple patch sets for expected merged commit %s: %s", - commit.name(), intKeyOrdering().sortedCopy(thisCommitPsIds))); + problem( + String.format( + "Multiple patch sets for expected merged commit %s: %s", + commit.name(), intKeyOrdering().sortedCopy(thisCommitPsIds))); break; } } catch (IOException e) { - error("Error looking up expected merged commit " + fix.expectMergedAs, - e); + error("Error looking up expected merged commit " + fix.expectMergedAs, e); } } - private void insertMergedPatchSet(final RevCommit commit, - final @Nullable PatchSet.Id psIdToDelete, boolean reuseOldPsId) { - ProblemInfo notFound = - problem("No patch set found for merged commit " + commit.name()); + private void insertMergedPatchSet( + final RevCommit commit, final @Nullable PatchSet.Id psIdToDelete, boolean reuseOldPsId) { + ProblemInfo notFound = problem("No patch set found for merged commit " + commit.name()); if (!user.get().isIdentifiedUser()) { notFound.status = Status.FIX_FAILED; - notFound.outcome = - "Must be called by an identified user to insert new patch set"; + notFound.outcome = "Must be called by an identified user to insert new patch set"; return; } ProblemInfo insertPatchSetProblem; ProblemInfo deleteOldPatchSetProblem; if (psIdToDelete == null) { - insertPatchSetProblem = problem(String.format( - "Expected merged commit %s has no associated patch set", - commit.name())); + insertPatchSetProblem = + problem( + String.format( + "Expected merged commit %s has no associated patch set", commit.name())); deleteOldPatchSetProblem = null; } else { - String msg = String.format( - "Expected merge commit %s corresponds to patch set %s," - + " not the current patch set %s", - commit.name(), psIdToDelete.get(), - change().currentPatchSetId().get()); + String msg = + String.format( + "Expected merge commit %s corresponds to patch set %s," + + " not the current patch set %s", + commit.name(), psIdToDelete.get(), change().currentPatchSetId().get()); // Maybe an identical problem, but different fix. deleteOldPatchSetProblem = reuseOldPsId ? null : problem(msg); insertPatchSetProblem = problem(msg); @@ -496,11 +484,11 @@ public class ConsistencyChecker { currProblems.add(insertPatchSetProblem); try { - PatchSet.Id psId = (psIdToDelete != null && reuseOldPsId) - ? psIdToDelete - : ChangeUtil.nextPatchSetId(repo, change().currentPatchSetId()); - PatchSetInserter inserter = - patchSetInserterFactory.create(ctl, psId, commit); + PatchSet.Id psId = + (psIdToDelete != null && reuseOldPsId) + ? psIdToDelete + : ChangeUtil.nextPatchSetId(repo, change().currentPatchSetId()); + PatchSetInserter inserter = patchSetInserterFactory.create(ctl, psId, commit); try (BatchUpdate bu = newBatchUpdate(); ObjectInserter oi = repo.newObjectInserter()) { bu.setRepository(repo, rw, oi); @@ -508,35 +496,37 @@ public class ConsistencyChecker { if (psIdToDelete != null) { // Delete the given patch set ref. If reuseOldPsId is true, // PatchSetInserter will reinsert the same ref, making it a no-op. - bu.addOp(ctl.getId(), new BatchUpdate.Op() { - @Override - public void updateRepo(RepoContext ctx) throws IOException { - ctx.addRefUpdate(new ReceiveCommand( - commit, ObjectId.zeroId(), psIdToDelete.toRefName())); - } - }); + bu.addOp( + ctl.getId(), + new BatchUpdate.Op() { + @Override + public void updateRepo(RepoContext ctx) throws IOException { + ctx.addRefUpdate( + new ReceiveCommand(commit, ObjectId.zeroId(), psIdToDelete.toRefName())); + } + }); if (!reuseOldPsId) { - bu.addOp(ctl.getId(), new DeletePatchSetFromDbOp( - checkNotNull(deleteOldPatchSetProblem), psIdToDelete)); + bu.addOp( + ctl.getId(), + new DeletePatchSetFromDbOp(checkNotNull(deleteOldPatchSetProblem), psIdToDelete)); } } - bu.addOp(ctl.getId(), inserter - .setValidatePolicy(CommitValidators.Policy.NONE) - .setFireRevisionCreated(false) - .setNotify(NotifyHandling.NONE) - .setAllowClosed(true) - .setMessage( - "Patch set for merged commit inserted by consistency checker")); + bu.addOp( + ctl.getId(), + inserter + .setValidatePolicy(CommitValidators.Policy.NONE) + .setFireRevisionCreated(false) + .setNotify(NotifyHandling.NONE) + .setAllowClosed(true) + .setMessage("Patch set for merged commit inserted by consistency checker")); bu.addOp(ctl.getId(), new FixMergedOp(notFound)); bu.execute(); } - ctl = changeControlFactory.controlFor( - db.get(), inserter.getChange(), ctl.getUser()); + ctl = changeControlFactory.controlFor(db.get(), inserter.getChange(), ctl.getUser()); insertPatchSetProblem.status = Status.FIXED; insertPatchSetProblem.outcome = "Inserted as patch set " + psId.get(); - } catch (OrmException | IOException | UpdateException - | RestApiException e) { + } catch (OrmException | IOException | UpdateException | RestApiException e) { warn(e); for (ProblemInfo pi : currProblems) { pi.status = Status.FIX_FAILED; @@ -556,8 +546,7 @@ public class ConsistencyChecker { @Override public boolean updateChange(ChangeContext ctx) throws OrmException { ctx.getChange().setStatus(Change.Status.MERGED); - ctx.getUpdate(ctx.getChange().currentPatchSetId()) - .fixStatus(Change.Status.MERGED); + ctx.getUpdate(ctx.getChange().currentPatchSetId()).fixStatus(Change.Status.MERGED); p.status = Status.FIXED; p.outcome = "Marked change as merged"; return true; @@ -578,8 +567,7 @@ public class ConsistencyChecker { } private BatchUpdate newBatchUpdate() { - return updateFactory.create( - db.get(), change().getProject(), ctl.getUser(), TimeUtil.nowTs()); + return updateFactory.create(db.get(), change().getProject(), ctl.getUser(), TimeUtil.nowTs()); } private void fixPatchSetRef(ProblemInfo p, PatchSet ps) { @@ -659,12 +647,9 @@ public class ConsistencyChecker { // Delete dangling key references. ReviewDb db = DeleteChangeOp.unwrap(ctx.getDb()); accountPatchReviewStore.get().clearReviewed(psId); - db.changeMessages().delete( - db.changeMessages().byChange(psId.getParentKey())); - db.patchSetApprovals().delete( - db.patchSetApprovals().byPatchSet(psId)); - db.patchComments().delete( - db.patchComments().byPatchSet(psId)); + db.changeMessages().delete(db.changeMessages().byChange(psId.getParentKey())); + db.patchSetApprovals().delete(db.patchSetApprovals().byPatchSet(psId)); + db.patchComments().delete(db.patchComments().byPatchSet(psId)); db.patchSets().deleteKeys(Collections.singleton(psId)); // NoteDb requires no additional fiddling; setting the state to deleted is @@ -677,8 +662,7 @@ public class ConsistencyChecker { } } - private static class NoPatchSetsWouldRemainException - extends RestApiException { + private static class NoPatchSetsWouldRemainException extends RestApiException { private static final long serialVersionUID = 1L; private NoPatchSetsWouldRemainException() { @@ -698,8 +682,7 @@ public class ConsistencyChecker { @Override public boolean updateChange(ChangeContext ctx) - throws OrmException, PatchSetInfoNotAvailableException, - NoPatchSetsWouldRemainException { + throws OrmException, PatchSetInfoNotAvailableException, NoPatchSetsWouldRemainException { if (!toDelete.contains(ctx.getChange().currentPatchSetId())) { return false; } @@ -716,8 +699,8 @@ public class ConsistencyChecker { throw new NoPatchSetsWouldRemainException(); } PatchSet.Id latest = ReviewDbUtil.intKeyOrdering().max(all); - ctx.getChange().setCurrentPatchSet( - patchSetInfoFactory.get(ctx.getDb(), ctx.getNotes(), latest)); + ctx.getChange() + .setCurrentPatchSet(patchSetInfoFactory.get(ctx.getDb(), ctx.getNotes(), latest)); return true; } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateChange.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateChange.java index 62d9b53eab..f6f6879f91 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateChange.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateChange.java @@ -66,7 +66,12 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.sql.Timestamp; +import java.util.Collections; +import java.util.List; +import java.util.TimeZone; import org.eclipse.jgit.lib.CommitBuilder; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.ObjectId; @@ -79,16 +84,8 @@ import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.util.ChangeIdUtil; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.sql.Timestamp; -import java.util.Collections; -import java.util.List; -import java.util.TimeZone; - @Singleton -public class CreateChange implements - RestModifyView { +public class CreateChange implements RestModifyView { private final String anonymousCowardName; private final Provider db; @@ -109,7 +106,8 @@ public class CreateChange implements private final NotifyUtil notifyUtil; @Inject - CreateChange(@AnonymousCowardName String anonymousCowardName, + CreateChange( + @AnonymousCowardName String anonymousCowardName, Provider db, GitRepositoryManager gitManager, AccountCache accountCache, @@ -139,16 +137,15 @@ public class CreateChange implements this.updateFactory = updateFactory; this.psUtil = psUtil; this.allowDrafts = config.getBoolean("change", "allowDrafts", true); - this.submitType = config - .getEnum("project", null, "submitType", SubmitType.MERGE_IF_NECESSARY); + this.submitType = config.getEnum("project", null, "submitType", SubmitType.MERGE_IF_NECESSARY); this.mergeUtilFactory = mergeUtilFactory; this.notifyUtil = notifyUtil; } @Override public Response apply(TopLevelResource parent, ChangeInput input) - throws OrmException, IOException, InvalidChangeOperationException, - RestApiException, UpdateException { + throws OrmException, IOException, InvalidChangeOperationException, RestApiException, + UpdateException { if (Strings.isNullOrEmpty(input.project)) { throw new BadRequestException("project must be non-empty"); } @@ -162,8 +159,7 @@ public class CreateChange implements } if (input.status != null) { - if (input.status != ChangeStatus.NEW - && input.status != ChangeStatus.DRAFT) { + if (input.status != ChangeStatus.NEW && input.status != ChangeStatus.DRAFT) { throw new BadRequestException("unsupported change status"); } @@ -187,21 +183,18 @@ public class CreateChange implements Project.NameKey project = rsrc.getNameKey(); try (Repository git = gitManager.openRepository(project); - ObjectInserter oi = git.newObjectInserter(); - RevWalk rw = new RevWalk(oi.newReader())) { + ObjectInserter oi = git.newObjectInserter(); + RevWalk rw = new RevWalk(oi.newReader())) { ObjectId parentCommit; List groups; if (input.baseChange != null) { - List ctls = changeFinder.find( - input.baseChange, rsrc.getControl().getUser()); + List ctls = changeFinder.find(input.baseChange, rsrc.getControl().getUser()); if (ctls.size() != 1) { - throw new InvalidChangeOperationException( - "Base change not found: " + input.baseChange); + throw new InvalidChangeOperationException("Base change not found: " + input.baseChange); } ChangeControl ctl = Iterables.getOnlyElement(ctls); if (!ctl.isVisible(db.get())) { - throw new InvalidChangeOperationException( - "Base change not found: " + input.baseChange); + throw new InvalidChangeOperationException("Base change not found: " + input.baseChange); } PatchSet ps = psUtil.current(db.get(), ctl.getNotes()); parentCommit = ObjectId.fromString(ps.getRevision().get()); @@ -210,61 +203,58 @@ public class CreateChange implements Ref destRef = git.getRefDatabase().exactRef(refName); if (destRef != null) { if (Boolean.TRUE.equals(input.newBranch)) { - throw new ResourceConflictException(String.format( - "Branch %s already exists.", refName)); + throw new ResourceConflictException( + String.format("Branch %s already exists.", refName)); } parentCommit = destRef.getObjectId(); } else { if (Boolean.TRUE.equals(input.newBranch)) { parentCommit = null; } else { - throw new UnprocessableEntityException(String.format( - "Branch %s does not exist.", refName)); + throw new UnprocessableEntityException( + String.format("Branch %s does not exist.", refName)); } } groups = Collections.emptyList(); } - RevCommit mergeTip = - parentCommit == null ? null : rw.parseCommit(parentCommit); + RevCommit mergeTip = parentCommit == null ? null : rw.parseCommit(parentCommit); Timestamp now = TimeUtil.nowTs(); IdentifiedUser me = user.get().asIdentifiedUser(); PersonIdent author = me.newCommitterIdent(now, serverTimeZone); AccountState account = accountCache.get(me.getAccountId()); - GeneralPreferencesInfo info = - account.getAccount().getGeneralPreferencesInfo(); + GeneralPreferencesInfo info = account.getAccount().getGeneralPreferencesInfo(); - ObjectId treeId = - mergeTip == null ? emptyTreeId(oi) : mergeTip.getTree(); - ObjectId id = ChangeIdUtil.computeChangeId(treeId, - mergeTip, author, author, input.subject); + ObjectId treeId = mergeTip == null ? emptyTreeId(oi) : mergeTip.getTree(); + ObjectId id = ChangeIdUtil.computeChangeId(treeId, mergeTip, author, author, input.subject); String commitMessage = ChangeIdUtil.insertId(input.subject, id); if (Boolean.TRUE.equals(info.signedOffBy)) { - commitMessage += String.format("%s%s", - SIGNED_OFF_BY_TAG, - account.getAccount().getNameEmail(anonymousCowardName)); + commitMessage += + String.format( + "%s%s", SIGNED_OFF_BY_TAG, account.getAccount().getNameEmail(anonymousCowardName)); } RevCommit c; if (input.merge != null) { // create a merge commit - if (!(submitType.equals(SubmitType.MERGE_ALWAYS) || - submitType.equals(SubmitType.MERGE_IF_NECESSARY))) { - throw new BadRequestException( - "Submit type: " + submitType + " is not supported"); + if (!(submitType.equals(SubmitType.MERGE_ALWAYS) + || submitType.equals(SubmitType.MERGE_IF_NECESSARY))) { + throw new BadRequestException("Submit type: " + submitType + " is not supported"); } - c = newMergeCommit(git, oi, rw, rsrc.getControl(), mergeTip, input.merge, - author, commitMessage); + c = + newMergeCommit( + git, oi, rw, rsrc.getControl(), mergeTip, input.merge, author, commitMessage); } else { // create an empty commit c = newCommit(oi, rw, author, mergeTip, commitMessage); } Change.Id changeId = new Change.Id(seq.nextChangeId()); - ChangeInserter ins = changeInserterFactory.create(changeId, c, refName) - .setValidatePolicy(CommitValidators.Policy.GERRIT); - ins.setMessage(String.format("Uploaded patch set %s.", - ins.getPatchSetId().get())); + ChangeInserter ins = + changeInserterFactory + .create(changeId, c, refName) + .setValidatePolicy(CommitValidators.Policy.GERRIT); + ins.setMessage(String.format("Uploaded patch set %s.", ins.getPatchSetId().get())); String topic = input.topic; if (topic != null) { topic = Strings.emptyToNull(topic.trim()); @@ -274,8 +264,7 @@ public class CreateChange implements ins.setGroups(groups); ins.setNotify(input.notify); ins.setAccountsToNotify(notifyUtil.resolveAccounts(input.notifyDetails)); - try (BatchUpdate bu = updateFactory.create( - db.get(), project, me, now)) { + try (BatchUpdate bu = updateFactory.create(db.get(), project, me, now)) { bu.setRepository(git, rw, oi); bu.insertChange(ins); bu.execute(); @@ -287,8 +276,12 @@ public class CreateChange implements } } - private static RevCommit newCommit(ObjectInserter oi, RevWalk rw, - PersonIdent authorIdent, RevCommit mergeTip, String commitMessage) + private static RevCommit newCommit( + ObjectInserter oi, + RevWalk rw, + PersonIdent authorIdent, + RevCommit mergeTip, + String commitMessage) throws IOException { CommitBuilder commit = new CommitBuilder(); if (mergeTip == null) { @@ -303,9 +296,15 @@ public class CreateChange implements return rw.parseCommit(insert(oi, commit)); } - private RevCommit newMergeCommit(Repository repo, ObjectInserter oi, - RevWalk rw, ProjectControl projectControl, RevCommit mergeTip, - MergeInput merge, PersonIdent authorIdent, String commitMessage) + private RevCommit newMergeCommit( + Repository repo, + ObjectInserter oi, + RevWalk rw, + ProjectControl projectControl, + RevCommit mergeTip, + MergeInput merge, + PersonIdent authorIdent, + String commitMessage) throws RestApiException, IOException { if (Strings.isNullOrEmpty(merge.source)) { throw new BadRequestException("merge.source must be non-empty"); @@ -313,31 +312,27 @@ public class CreateChange implements RevCommit sourceCommit = MergeUtil.resolveCommit(repo, rw, merge.source); if (!projectControl.canReadCommit(db.get(), repo, sourceCommit)) { - throw new BadRequestException( - "do not have read permission for: " + merge.source); + throw new BadRequestException("do not have read permission for: " + merge.source); } - MergeUtil mergeUtil = - mergeUtilFactory.create(projectControl.getProjectState()); + MergeUtil mergeUtil = mergeUtilFactory.create(projectControl.getProjectState()); // default merge strategy from project settings - String mergeStrategy = MoreObjects.firstNonNull( - Strings.emptyToNull(merge.strategy), - mergeUtil.mergeStrategyName()); + String mergeStrategy = + MoreObjects.firstNonNull( + Strings.emptyToNull(merge.strategy), mergeUtil.mergeStrategyName()); - return MergeUtil.createMergeCommit(repo, oi, mergeTip, sourceCommit, - mergeStrategy, authorIdent, commitMessage, rw); + return MergeUtil.createMergeCommit( + repo, oi, mergeTip, sourceCommit, mergeStrategy, authorIdent, commitMessage, rw); } - private static ObjectId insert(ObjectInserter inserter, - CommitBuilder commit) throws IOException, - UnsupportedEncodingException { + private static ObjectId insert(ObjectInserter inserter, CommitBuilder commit) + throws IOException, UnsupportedEncodingException { ObjectId id = inserter.insert(commit); inserter.flush(); return id; } - private static ObjectId emptyTreeId(ObjectInserter inserter) - throws IOException { + private static ObjectId emptyTreeId(ObjectInserter inserter) throws IOException { return inserter.insert(new TreeFormatter()); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateDraftComment.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateDraftComment.java index 5a7b75675e..6a7647cef0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateDraftComment.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateDraftComment.java @@ -41,7 +41,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.util.Collections; @Singleton @@ -54,7 +53,8 @@ public class CreateDraftComment implements RestModifyView db, + CreateDraftComment( + Provider db, BatchUpdate.Factory updateFactory, Provider commentJson, CommentsUtil commentsUtil, @@ -81,13 +81,13 @@ public class CreateDraftComment implements RestModifyView { +public class CreateMergePatchSet implements RestModifyView { private final Provider db; private final GitRepositoryManager gitManager; @@ -81,7 +78,8 @@ public class CreateMergePatchSet implements private final PatchSetInserter.Factory patchSetInserterFactory; @Inject - CreateMergePatchSet(Provider db, + CreateMergePatchSet( + Provider db, GitRepositoryManager gitManager, @GerritPersonIdent PersonIdent myIdent, Provider user, @@ -103,8 +101,8 @@ public class CreateMergePatchSet implements @Override public Response apply(ChangeResource req, MergePatchSetInput in) - throws OrmException, IOException, InvalidChangeOperationException, - RestApiException, UpdateException { + throws OrmException, IOException, InvalidChangeOperationException, RestApiException, + UpdateException { if (in.merge == null) { throw new BadRequestException("merge field is required"); } @@ -116,8 +114,7 @@ public class CreateMergePatchSet implements ChangeControl ctl = req.getControl(); if (!ctl.isVisible(db.get())) { - throw new InvalidChangeOperationException( - "Base change not found: " + req.getId()); + throw new InvalidChangeOperationException("Base change not found: " + req.getId()); } PatchSet ps = psUtil.current(db.get(), ctl.getNotes()); if (!ctl.canAddPatchSet(db.get())) { @@ -132,50 +129,62 @@ public class CreateMergePatchSet implements ObjectInserter oi = git.newObjectInserter(); RevWalk rw = new RevWalk(oi.newReader())) { - RevCommit sourceCommit = - MergeUtil.resolveCommit(git, rw, merge.source); + RevCommit sourceCommit = MergeUtil.resolveCommit(git, rw, merge.source); if (!projectControl.canReadCommit(db.get(), git, sourceCommit)) { throw new ResourceNotFoundException( "cannot find source commit: " + merge.source + " to merge."); } - RevCommit currentPsCommit = - rw.parseCommit(ObjectId.fromString(ps.getRevision().get())); + RevCommit currentPsCommit = rw.parseCommit(ObjectId.fromString(ps.getRevision().get())); Timestamp now = TimeUtil.nowTs(); IdentifiedUser me = user.get().asIdentifiedUser(); PersonIdent author = me.newCommitterIdent(now, serverTimeZone); RevCommit newCommit = - createMergeCommit(in, projectControl, dest, git, oi, rw, - currentPsCommit, sourceCommit, author, + createMergeCommit( + in, + projectControl, + dest, + git, + oi, + rw, + currentPsCommit, + sourceCommit, + author, ObjectId.fromString(change.getKey().get().substring(1))); PatchSet.Id nextPsId = ChangeUtil.nextPatchSetId(ps.getId()); - PatchSetInserter psInserter = - patchSetInserterFactory.create(ctl, nextPsId, newCommit); - try (BatchUpdate bu = batchUpdateFactory - .create(db.get(), project, me, now)) { + PatchSetInserter psInserter = patchSetInserterFactory.create(ctl, nextPsId, newCommit); + try (BatchUpdate bu = batchUpdateFactory.create(db.get(), project, me, now)) { bu.setRepository(git, rw, oi); - bu.addOp(ctl.getId(), psInserter - .setMessage("Uploaded patch set " + nextPsId.get() + ".") - .setDraft(ps.isDraft()) - .setNotify(NotifyHandling.NONE)); + bu.addOp( + ctl.getId(), + psInserter + .setMessage("Uploaded patch set " + nextPsId.get() + ".") + .setDraft(ps.isDraft()) + .setNotify(NotifyHandling.NONE)); bu.execute(); } - ChangeJson json = - jsonFactory.create(EnumSet.of(ListChangesOption.CURRENT_REVISION)); + ChangeJson json = jsonFactory.create(EnumSet.of(ListChangesOption.CURRENT_REVISION)); return Response.ok(json.format(psInserter.getChange())); } } - private RevCommit createMergeCommit(MergePatchSetInput in, - ProjectControl projectControl, Branch.NameKey dest, Repository git, - ObjectInserter oi, RevWalk rw, RevCommit currentPsCommit, - RevCommit sourceCommit, PersonIdent author, ObjectId changeId) - throws ResourceNotFoundException, MergeIdenticalTreeException, - MergeConflictException, IOException { + private RevCommit createMergeCommit( + MergePatchSetInput in, + ProjectControl projectControl, + Branch.NameKey dest, + Repository git, + ObjectInserter oi, + RevWalk rw, + RevCommit currentPsCommit, + RevCommit sourceCommit, + PersonIdent author, + ObjectId changeId) + throws ResourceNotFoundException, MergeIdenticalTreeException, MergeConflictException, + IOException { ObjectId parentCommit; if (in.inheritParent) { @@ -200,12 +209,12 @@ public class CreateMergePatchSet implements commitMsg = currentPsCommit.getFullMessage(); } - String mergeStrategy = MoreObjects.firstNonNull( - Strings.emptyToNull(in.merge.strategy), - mergeUtilFactory.create(projectControl.getProjectState()) - .mergeStrategyName()); + String mergeStrategy = + MoreObjects.firstNonNull( + Strings.emptyToNull(in.merge.strategy), + mergeUtilFactory.create(projectControl.getProjectState()).mergeStrategyName()); - return MergeUtil.createMergeCommit(git, oi, mergeTip, sourceCommit, - mergeStrategy, author, commitMsg, rw); + return MergeUtil.createMergeCommit( + git, oi, mergeTip, sourceCommit, mergeStrategy, author, commitMsg, rw); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteAssignee.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteAssignee.java index 4d5b739762..f1769f6850 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteAssignee.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteAssignee.java @@ -41,9 +41,8 @@ import com.google.inject.Singleton; @Singleton public class DeleteAssignee implements RestModifyView { - public static class Input { + public static class Input {} - } private final BatchUpdate.Factory batchUpdateFactory; private final ChangeMessagesUtil cmUtil; private final Provider db; @@ -52,7 +51,8 @@ public class DeleteAssignee implements RestModifyView { private final AccountLoader.Factory accountLoaderFactory; @Inject - DeleteAssignee(BatchUpdate.Factory batchUpdateFactory, + DeleteAssignee( + BatchUpdate.Factory batchUpdateFactory, ChangeMessagesUtil cmUtil, Provider db, AssigneeChanged assigneeChanged, @@ -69,17 +69,15 @@ public class DeleteAssignee implements RestModifyView { @Override public Response apply(ChangeResource rsrc, Input input) throws RestApiException, UpdateException, OrmException { - try (BatchUpdate bu = batchUpdateFactory.create(db.get(), - rsrc.getProject(), - rsrc.getUser(), TimeUtil.nowTs())) { + try (BatchUpdate bu = + batchUpdateFactory.create(db.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) { Op op = new Op(); bu.addOp(rsrc.getChange().getId(), op); bu.execute(); Account.Id deletedAssignee = op.getDeletedAssignee(); return deletedAssignee == null ? Response.none() - : Response.ok(accountLoaderFactory.create(true) - .fillOne(deletedAssignee)); + : Response.ok(accountLoaderFactory.create(true).fillOne(deletedAssignee)); } } @@ -88,8 +86,7 @@ public class DeleteAssignee implements RestModifyView { private Account deletedAssignee; @Override - public boolean updateChange(ChangeContext ctx) - throws RestApiException, OrmException{ + public boolean updateChange(ChangeContext ctx) throws RestApiException, OrmException { if (!ctx.getControl().canEditAssignee()) { throw new AuthException("Delete Assignee not permitted"); } @@ -99,8 +96,7 @@ public class DeleteAssignee implements RestModifyView { if (currentAssigneeId == null) { return false; } - IdentifiedUser deletedAssigneeUser = - userFactory.create(currentAssigneeId); + IdentifiedUser deletedAssigneeUser = userFactory.create(currentAssigneeId); deletedAssignee = deletedAssigneeUser.getAccount(); // noteDb update.removeAssignee(); @@ -114,18 +110,20 @@ public class DeleteAssignee implements RestModifyView { return deletedAssignee != null ? deletedAssignee.getId() : null; } - private void addMessage(BatchUpdate.ChangeContext ctx, ChangeUpdate update, - IdentifiedUser deletedAssignee) throws OrmException { - ChangeMessage cmsg = ChangeMessagesUtil.newMessage( - ctx, "Assignee deleted: " + deletedAssignee.getNameEmail(), - ChangeMessagesUtil.TAG_DELETE_ASSIGNEE); + private void addMessage( + BatchUpdate.ChangeContext ctx, ChangeUpdate update, IdentifiedUser deletedAssignee) + throws OrmException { + ChangeMessage cmsg = + ChangeMessagesUtil.newMessage( + ctx, + "Assignee deleted: " + deletedAssignee.getNameEmail(), + ChangeMessagesUtil.TAG_DELETE_ASSIGNEE); cmUtil.addChangeMessage(ctx.getDb(), update, cmsg); } @Override public void postUpdate(Context ctx) throws OrmException { - assigneeChanged.fire(change, ctx.getAccount(), deletedAssignee, - ctx.getWhen()); + assigneeChanged.fire(change, ctx.getAccount(), deletedAssignee, ctx.getWhen()); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteChange.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteChange.java index 18d7074001..d0c9a250e4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteChange.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteChange.java @@ -31,14 +31,12 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import org.eclipse.jgit.lib.Config; @Singleton -public class DeleteChange implements - RestModifyView, UiAction { - public static class Input { - } +public class DeleteChange + implements RestModifyView, UiAction { + public static class Input {} private final Provider db; private final BatchUpdate.Factory updateFactory; @@ -46,7 +44,8 @@ public class DeleteChange implements private final boolean allowDrafts; @Inject - public DeleteChange(Provider db, + public DeleteChange( + Provider db, BatchUpdate.Factory updateFactory, Provider opProvider, @GerritServerConfig Config cfg) { @@ -59,8 +58,8 @@ public class DeleteChange implements @Override public Response apply(ChangeResource rsrc, Input input) throws RestApiException, UpdateException { - try (BatchUpdate bu = updateFactory.create( - db.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) { + try (BatchUpdate bu = + updateFactory.create(db.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) { Change.Id id = rsrc.getChange().getId(); bu.setOrder(BatchUpdate.Order.DB_BEFORE_REPO); bu.addOp(id, opProvider.get()); @@ -74,19 +73,18 @@ public class DeleteChange implements try { Change.Status status = rsrc.getChange().getStatus(); ChangeControl changeControl = rsrc.getControl(); - boolean visible = isActionAllowed(changeControl, status) - && changeControl.canDelete(db.get(), status); + boolean visible = + isActionAllowed(changeControl, status) && changeControl.canDelete(db.get(), status); return new UiAction.Description() - .setLabel("Delete") - .setTitle("Delete change " + rsrc.getId()) - .setVisible(visible); + .setLabel("Delete") + .setTitle("Delete change " + rsrc.getId()) + .setVisible(visible); } catch (OrmException e) { throw new IllegalStateException(e); } } - private boolean isActionAllowed(ChangeControl changeControl, - Status status) { + private boolean isActionAllowed(ChangeControl changeControl, Status status) { return status != Status.DRAFT || allowDrafts || changeControl.isAdmin(); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteChangeEdit.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteChangeEdit.java index 604b615f80..f196ec8778 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteChangeEdit.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteChangeEdit.java @@ -24,14 +24,12 @@ import com.google.gerrit.server.edit.ChangeEditUtil; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.io.IOException; import java.util.Optional; @Singleton public class DeleteChangeEdit implements RestModifyView { - public static class Input { - } + public static class Input {} private final ChangeEditUtil editUtil; @@ -42,8 +40,7 @@ public class DeleteChangeEdit implements RestModifyView { @Override public Response apply(ChangeResource rsrc, Input input) - throws AuthException, ResourceNotFoundException, IOException, - OrmException { + throws AuthException, ResourceNotFoundException, IOException, OrmException { Optional edit = editUtil.byChange(rsrc.getChange()); if (edit.isPresent()) { editUtil.delete(edit.get()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteChangeOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteChangeOp.java index d1f7cace9d..034a6691df 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteChangeOp.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteChangeOp.java @@ -35,7 +35,9 @@ import com.google.gerrit.server.git.BatchUpdateReviewDb; import com.google.gerrit.server.project.NoSuchChangeException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - +import java.io.IOException; +import java.util.Collection; +import java.util.Collections; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Ref; @@ -44,10 +46,6 @@ import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.transport.ReceiveCommand; -import java.io.IOException; -import java.util.Collection; -import java.util.Collections; - class DeleteChangeOp extends BatchUpdate.Op { static boolean allowDrafts(Config cfg) { return cfg.getBoolean("change", "allowDrafts", true); @@ -63,7 +61,6 @@ class DeleteChangeOp extends BatchUpdate.Op { return ReviewDbUtil.unwrapDb(db); } - private final PatchSetUtil psUtil; private final StarredChangesUtil starredChangesUtil; private final DynamicItem accountPatchReviewStore; @@ -72,7 +69,8 @@ class DeleteChangeOp extends BatchUpdate.Op { private Change.Id id; @Inject - DeleteChangeOp(PatchSetUtil psUtil, + DeleteChangeOp( + PatchSetUtil psUtil, StarredChangesUtil starredChangesUtil, DynamicItem accountPatchReviewStore, @GerritServerConfig Config cfg) { @@ -83,15 +81,15 @@ class DeleteChangeOp extends BatchUpdate.Op { } @Override - public boolean updateChange(ChangeContext ctx) throws RestApiException, - OrmException, IOException, NoSuchChangeException { - checkState(ctx.getOrder() == BatchUpdate.Order.DB_BEFORE_REPO, + public boolean updateChange(ChangeContext ctx) + throws RestApiException, OrmException, IOException, NoSuchChangeException { + checkState( + ctx.getOrder() == BatchUpdate.Order.DB_BEFORE_REPO, "must use DeleteChangeOp with DB_BEFORE_REPO"); checkState(id == null, "cannot reuse DeleteChangeOp"); id = ctx.getChange().getId(); - Collection patchSets = psUtil.byChange(ctx.getDb(), - ctx.getNotes()); + Collection patchSets = psUtil.byChange(ctx.getDb(), ctx.getNotes()); ensureDeletable(ctx, id, patchSets); // Cleaning up is only possible as long as the change and its elements are @@ -103,19 +101,19 @@ class DeleteChangeOp extends BatchUpdate.Op { return true; } - private void ensureDeletable(ChangeContext ctx, Change.Id id, - Collection patchSets) throws ResourceConflictException, - MethodNotAllowedException, OrmException, AuthException, IOException { + private void ensureDeletable(ChangeContext ctx, Change.Id id, Collection patchSets) + throws ResourceConflictException, MethodNotAllowedException, OrmException, AuthException, + IOException { Change.Status status = ctx.getChange().getStatus(); if (status == Change.Status.MERGED) { - throw new MethodNotAllowedException("Deleting merged change " + id - + " is not allowed"); + throw new MethodNotAllowedException("Deleting merged change " + id + " is not allowed"); } for (PatchSet patchSet : patchSets) { if (isPatchSetMerged(ctx, patchSet)) { - throw new ResourceConflictException(String.format( - "Cannot delete change %s: patch set %s is already merged", - id, patchSet.getPatchSetId())); + throw new ResourceConflictException( + String.format( + "Cannot delete change %s: patch set %s is already merged", + id, patchSet.getPatchSetId())); } } @@ -129,15 +127,18 @@ class DeleteChangeOp extends BatchUpdate.Op { } for (PatchSet ps : patchSets) { if (!ps.isDraft()) { - throw new ResourceConflictException("Cannot delete draft change " + id - + ": patch set " + ps.getPatchSetId() + " is not a draft"); + throw new ResourceConflictException( + "Cannot delete draft change " + + id + + ": patch set " + + ps.getPatchSetId() + + " is not a draft"); } } } } - private boolean isPatchSetMerged(ChangeContext ctx, PatchSet patchSet) - throws IOException { + private boolean isPatchSetMerged(ChangeContext ctx, PatchSet patchSet) throws IOException { Repository repository = ctx.getRepository(); Ref destinationRef = repository.exactRef(ctx.getChange().getDest().get()); if (destinationRef == null) { @@ -147,12 +148,11 @@ class DeleteChangeOp extends BatchUpdate.Op { RevWalk revWalk = ctx.getRevWalk(); ObjectId objectId = ObjectId.fromString(patchSet.getRevision().get()); RevCommit revCommit = revWalk.parseCommit(objectId); - return IncludedInResolver.includedInOne(repository, revWalk, revCommit, - Collections.singletonList(destinationRef)); + return IncludedInResolver.includedInOne( + repository, revWalk, revCommit, Collections.singletonList(destinationRef)); } - private void deleteChangeElementsFromDb(ChangeContext ctx, Change.Id id) - throws OrmException { + private void deleteChangeElementsFromDb(ChangeContext ctx, Change.Id id) throws OrmException { // Only delete from ReviewDb here; deletion from NoteDb is handled in // BatchUpdate. ReviewDb db = unwrap(ctx.getDb()); @@ -162,9 +162,8 @@ class DeleteChangeOp extends BatchUpdate.Op { db.changeMessages().delete(db.changeMessages().byChange(id)); } - private void cleanUpReferences(ChangeContext ctx, Change.Id id, - Collection patchSets) throws OrmException, - NoSuchChangeException { + private void cleanUpReferences(ChangeContext ctx, Change.Id id, Collection patchSets) + throws OrmException, NoSuchChangeException { for (PatchSet ps : patchSets) { accountPatchReviewStore.get().clearReviewed(ps.getId()); } @@ -178,11 +177,8 @@ class DeleteChangeOp extends BatchUpdate.Op { public void updateRepo(RepoContext ctx) throws IOException { String prefix = new PatchSet.Id(id, 1).toRefName(); prefix = prefix.substring(0, prefix.length() - 1); - for (Ref ref - : ctx.getRepository().getRefDatabase().getRefs(prefix).values()) { - ctx.addRefUpdate( - new ReceiveCommand( - ref.getObjectId(), ObjectId.zeroId(), ref.getName())); + for (Ref ref : ctx.getRepository().getRefDatabase().getRefs(prefix).values()) { + ctx.addRefUpdate(new ReceiveCommand(ref.getObjectId(), ObjectId.zeroId(), ref.getName())); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftComment.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftComment.java index 37930dd9f8..645238b90d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftComment.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftComment.java @@ -36,15 +36,12 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.util.Collections; import java.util.Optional; @Singleton -public class DeleteDraftComment - implements RestModifyView { - static class Input { - } +public class DeleteDraftComment implements RestModifyView { + static class Input {} private final Provider db; private final CommentsUtil commentsUtil; @@ -53,7 +50,8 @@ public class DeleteDraftComment private final PatchListCache patchListCache; @Inject - DeleteDraftComment(Provider db, + DeleteDraftComment( + Provider db, CommentsUtil commentsUtil, PatchSetUtil psUtil, BatchUpdate.Factory updateFactory, @@ -68,9 +66,12 @@ public class DeleteDraftComment @Override public Response apply(DraftCommentResource rsrc, Input input) throws RestApiException, UpdateException { - try (BatchUpdate bu = updateFactory.create( - db.get(), rsrc.getChange().getProject(), rsrc.getControl().getUser(), - TimeUtil.nowTs())) { + try (BatchUpdate bu = + updateFactory.create( + db.get(), + rsrc.getChange().getProject(), + rsrc.getControl().getUser(), + TimeUtil.nowTs())) { Op op = new Op(rsrc.getComment().key); bu.addOp(rsrc.getChange().getId(), op); bu.execute(); @@ -86,23 +87,19 @@ public class DeleteDraftComment } @Override - public boolean updateChange(ChangeContext ctx) - throws ResourceNotFoundException, OrmException { - Optional maybeComment = - commentsUtil.get(ctx.getDb(), ctx.getNotes(), key); + public boolean updateChange(ChangeContext ctx) throws ResourceNotFoundException, OrmException { + Optional maybeComment = commentsUtil.get(ctx.getDb(), ctx.getNotes(), key); if (!maybeComment.isPresent()) { return false; // Nothing to do. } - PatchSet.Id psId = - new PatchSet.Id(ctx.getChange().getId(), key.patchSetId); + PatchSet.Id psId = new PatchSet.Id(ctx.getChange().getId(), key.patchSetId); PatchSet ps = psUtil.get(ctx.getDb(), ctx.getNotes(), psId); if (ps == null) { throw new ResourceNotFoundException("patch set not found: " + psId); } Comment c = maybeComment.get(); setCommentRevId(c, patchListCache, ctx.getChange(), ps); - commentsUtil.deleteComments( - ctx.getDb(), ctx.getUpdate(psId), Collections.singleton(c)); + commentsUtil.deleteComments(ctx.getDb(), ctx.getUpdate(psId), Collections.singleton(c)); ctx.bumpLastUpdatedOn(false); return true; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftPatchSet.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftPatchSet.java index e473e39583..76d366e3ce 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftPatchSet.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftPatchSet.java @@ -41,19 +41,16 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; +import java.util.Collection; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.transport.ReceiveCommand; -import java.io.IOException; -import java.util.Collection; - @Singleton -public class DeleteDraftPatchSet implements RestModifyView, - UiAction { - public static class Input { - } +public class DeleteDraftPatchSet + implements RestModifyView, UiAction { + public static class Input {} private final Provider db; private final BatchUpdate.Factory updateFactory; @@ -64,7 +61,8 @@ public class DeleteDraftPatchSet implements RestModifyView db, + public DeleteDraftPatchSet( + Provider db, BatchUpdate.Factory updateFactory, PatchSetInfoFactory patchSetInfoFactory, PatchSetUtil psUtil, @@ -83,8 +81,8 @@ public class DeleteDraftPatchSet implements RestModifyView apply(RevisionResource rsrc, Input input) throws RestApiException, UpdateException { - try (BatchUpdate bu = updateFactory.create( - db.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) { + try (BatchUpdate bu = + updateFactory.create(db.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) { bu.setOrder(BatchUpdate.Order.DB_BEFORE_REPO); bu.addOp(rsrc.getChange().getId(), new Op(rsrc.getPatchSet().getId())); bu.execute(); @@ -104,8 +102,8 @@ public class DeleteDraftPatchSet implements RestModifyView 1); + .setLabel("Delete") + .setTitle(String.format("Delete draft revision %d", rsrc.getPatchSet().getPatchSetId())) + .setVisible( + allowDrafts + && rsrc.getPatchSet().isDraft() + && rsrc.getControl().canDelete(db.get(), Change.Status.DRAFT) + && psCount > 1); } catch (OrmException e) { throw new IllegalStateException(e); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteReviewer.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteReviewer.java index 3c5aeb5ae7..71e2aa464c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteReviewer.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteReviewer.java @@ -51,21 +51,17 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Singleton -public class DeleteReviewer - implements RestModifyView { - private static final Logger log = LoggerFactory - .getLogger(DeleteReviewer.class); +public class DeleteReviewer implements RestModifyView { + private static final Logger log = LoggerFactory.getLogger(DeleteReviewer.class); private final Provider dbProvider; private final ApprovalsUtil approvalsUtil; @@ -80,7 +76,8 @@ public class DeleteReviewer private final NotifyUtil notifyUtil; @Inject - DeleteReviewer(Provider dbProvider, + DeleteReviewer( + Provider dbProvider, ApprovalsUtil approvalsUtil, PatchSetUtil psUtil, ChangeMessagesUtil cmUtil, @@ -114,9 +111,12 @@ public class DeleteReviewer input.notify = NotifyHandling.ALL; } - try (BatchUpdate bu = batchUpdateFactory.create(dbProvider.get(), - rsrc.getChangeResource().getProject(), - rsrc.getChangeResource().getUser(), TimeUtil.nowTs())) { + try (BatchUpdate bu = + batchUpdateFactory.create( + dbProvider.get(), + rsrc.getChangeResource().getProject(), + rsrc.getChangeResource().getUser(), + TimeUtil.nowTs())) { Op op = new Op(rsrc.getReviewerUser().getAccount(), input); bu.addOp(rsrc.getChange().getId(), op); bu.execute(); @@ -143,8 +143,7 @@ public class DeleteReviewer public boolean updateChange(ChangeContext ctx) throws AuthException, ResourceNotFoundException, OrmException { Account.Id reviewerId = reviewer.getId(); - if (!approvalsUtil.getReviewers(ctx.getDb(), ctx.getNotes()).all() - .contains(reviewerId)) { + if (!approvalsUtil.getReviewers(ctx.getDb(), ctx.getNotes()).all().contains(reviewerId)) { throw new ResourceNotFoundException(); } currChange = ctx.getChange(); @@ -167,8 +166,11 @@ public class DeleteReviewer del.add(a); if (a.getPatchSetId().equals(currPs.getId()) && a.getValue() != 0) { oldApprovals.put(a.getLabel(), a.getValue()); - removedVotesMsg.append("* ").append(a.getLabel()) - .append(formatLabelValue(a.getValue())).append(" by ") + removedVotesMsg + .append("* ") + .append(a.getLabel()) + .append(formatLabelValue(a.getValue())) + .append(" by ") .append(userFactory.create(a.getAccountId()).getNameEmail()) .append("\n"); votesRemoved = true; @@ -187,8 +189,9 @@ public class DeleteReviewer ChangeUpdate update = ctx.getUpdate(currPs.getId()); update.removeReviewer(reviewerId); - changeMessage = ChangeMessagesUtil.newMessage(ctx, msg.toString(), - ChangeMessagesUtil.TAG_DELETE_REVIEWER); + changeMessage = + ChangeMessagesUtil.newMessage( + ctx, msg.toString(), ChangeMessagesUtil.TAG_DELETE_REVIEWER); cmUtil.addChangeMessage(ctx.getDb(), update, changeMessage); return true; @@ -199,22 +202,25 @@ public class DeleteReviewer if (NotifyUtil.shouldNotify(input.notify, input.notifyDetails)) { emailReviewers(ctx.getProject(), currChange, changeMessage); } - reviewerDeleted.fire(currChange, currPs, reviewer, + reviewerDeleted.fire( + currChange, + currPs, + reviewer, ctx.getAccount(), changeMessage.getMessage(), - newApprovals, oldApprovals, + newApprovals, + oldApprovals, input.notify, ctx.getWhen()); } - private Iterable approvals(ChangeContext ctx, - Account.Id accountId) throws OrmException { + private Iterable approvals(ChangeContext ctx, Account.Id accountId) + throws OrmException { Change.Id changeId = ctx.getNotes().getChangeId(); Iterable approvals; PrimaryStorage r = PrimaryStorage.of(ctx.getChange()); - if (migration.readChanges() - && r == PrimaryStorage.REVIEW_DB) { + if (migration.readChanges() && r == PrimaryStorage.REVIEW_DB) { // Because NoteDb and ReviewDb have different semantics for zero-value // approvals, we must fall back to ReviewDb as the source of truth here. ReviewDb db = ctx.getDb(); @@ -225,12 +231,10 @@ public class DeleteReviewer db = ReviewDbUtil.unwrapDb(db); approvals = db.patchSetApprovals().byChange(changeId); } else { - approvals = - approvalsUtil.byChange(ctx.getDb(), ctx.getNotes()).values(); + approvals = approvalsUtil.byChange(ctx.getDb(), ctx.getNotes()).values(); } - return Iterables.filter( - approvals, psa -> accountId.equals(psa.getAccountId())); + return Iterables.filter(approvals, psa -> accountId.equals(psa.getAccountId())); } private String formatLabelValue(short value) { @@ -240,23 +244,20 @@ public class DeleteReviewer return Short.toString(value); } - private void emailReviewers(Project.NameKey projectName, Change change, - ChangeMessage changeMessage) { + private void emailReviewers( + Project.NameKey projectName, Change change, ChangeMessage changeMessage) { Account.Id userId = user.get().getAccountId(); if (userId.equals(reviewer.getId())) { // The user knows they removed themselves, don't bother emailing them. return; } try { - DeleteReviewerSender cm = - deleteReviewerSenderFactory.create(projectName, change.getId()); + DeleteReviewerSender cm = deleteReviewerSenderFactory.create(projectName, change.getId()); cm.setFrom(userId); cm.addReviewers(Collections.singleton(reviewer.getId())); - cm.setChangeMessage(changeMessage.getMessage(), - changeMessage.getWrittenOn()); + cm.setChangeMessage(changeMessage.getMessage(), changeMessage.getWrittenOn()); cm.setNotify(input.notify); - cm.setAccountsToNotify( - notifyUtil.resolveAccounts(input.notifyDetails)); + cm.setAccountsToNotify(notifyUtil.resolveAccounts(input.notifyDetails)); cm.send(); } catch (Exception err) { log.error("Cannot email update for change " + change.getId(), err); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteVote.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteVote.java index 9a0807d2e7..62325285a4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteVote.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteVote.java @@ -51,17 +51,14 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.Collections; import java.util.HashMap; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Singleton -public class DeleteVote - implements RestModifyView { +public class DeleteVote implements RestModifyView { private static final Logger log = LoggerFactory.getLogger(DeleteVote.class); private final Provider db; @@ -75,7 +72,8 @@ public class DeleteVote private final NotifyUtil notifyUtil; @Inject - DeleteVote(Provider db, + DeleteVote( + Provider db, BatchUpdate.Factory batchUpdateFactory, ApprovalsUtil approvalsUtil, PatchSetUtil psUtil, @@ -110,16 +108,14 @@ public class DeleteVote ReviewerResource r = rsrc.getReviewer(); Change change = r.getChange(); - if (r.getRevisionResource() != null - && !r.getRevisionResource().isCurrent()) { - throw new MethodNotAllowedException( - "Cannot delete vote on non-current patch set"); + if (r.getRevisionResource() != null && !r.getRevisionResource().isCurrent()) { + throw new MethodNotAllowedException("Cannot delete vote on non-current patch set"); } - try (BatchUpdate bu = batchUpdateFactory.create(db.get(), - change.getProject(), r.getControl().getUser(), TimeUtil.nowTs())) { - bu.addOp(change.getId(), - new Op(r.getReviewerUser().getAccountId(), rsrc.getLabel(), input)); + try (BatchUpdate bu = + batchUpdateFactory.create( + db.get(), change.getProject(), r.getControl().getUser(), TimeUtil.nowTs())) { + bu.addOp(change.getId(), new Op(r.getReviewerUser().getAccountId(), rsrc.getLabel(), input)); bu.execute(); } @@ -153,8 +149,7 @@ public class DeleteVote boolean found = false; LabelTypes labelTypes = ctx.getControl().getLabelTypes(); - for (PatchSetApproval a : approvalsUtil.byPatchSetUser( - ctx.getDb(), ctl, psId, accountId)) { + for (PatchSetApproval a : approvalsUtil.byPatchSetUser(ctx.getDb(), ctl, psId, accountId)) { if (labelTypes.byLabel(a.getLabelId()) == null) { continue; // Ignore undefined labels. } else if (!a.getLabel().equals(label)) { @@ -177,19 +172,15 @@ public class DeleteVote } ctx.getUpdate(psId).removeApprovalFor(accountId, label); - ctx.getDb().patchSetApprovals().upsert( - Collections.singleton(deletedApproval(ctx))); + ctx.getDb().patchSetApprovals().upsert(Collections.singleton(deletedApproval(ctx))); StringBuilder msg = new StringBuilder(); msg.append("Removed "); LabelVote.appendTo(msg, label, checkNotNull(oldApprovals.get(label))); - msg.append(" by ") - .append(userFactory.create(accountId).getNameEmail()) - .append("\n"); - changeMessage = ChangeMessagesUtil.newMessage(ctx, msg.toString(), - ChangeMessagesUtil.TAG_DELETE_VOTE); - cmUtil.addChangeMessage(ctx.getDb(), ctx.getUpdate(psId), - changeMessage); + msg.append(" by ").append(userFactory.create(accountId).getNameEmail()).append("\n"); + changeMessage = + ChangeMessagesUtil.newMessage(ctx, msg.toString(), ChangeMessagesUtil.TAG_DELETE_VOTE); + cmUtil.addChangeMessage(ctx.getDb(), ctx.getUpdate(psId), changeMessage); return true; } @@ -199,10 +190,7 @@ public class DeleteVote // set the real user; this preserves the calling user as the NoteDb // committer. return new PatchSetApproval( - new PatchSetApproval.Key( - ps.getId(), - accountId, - new LabelId(label)), + new PatchSetApproval.Key(ps.getId(), accountId, new LabelId(label)), (short) 0, ctx.getWhen()); } @@ -216,22 +204,26 @@ public class DeleteVote IdentifiedUser user = ctx.getIdentifiedUser(); if (NotifyUtil.shouldNotify(input.notify, input.notifyDetails)) { try { - ReplyToChangeSender cm = deleteVoteSenderFactory.create( - ctx.getProject(), change.getId()); + ReplyToChangeSender cm = deleteVoteSenderFactory.create(ctx.getProject(), change.getId()); cm.setFrom(user.getAccountId()); cm.setChangeMessage(changeMessage.getMessage(), ctx.getWhen()); cm.setNotify(input.notify); - cm.setAccountsToNotify( - notifyUtil.resolveAccounts(input.notifyDetails)); + cm.setAccountsToNotify(notifyUtil.resolveAccounts(input.notifyDetails)); cm.send(); } catch (Exception e) { log.error("Cannot email update for change " + change.getId(), e); } } - voteDeleted.fire(change, ps, - newApprovals, oldApprovals, input.notify, changeMessage.getMessage(), - user.getAccount(), ctx.getWhen()); + voteDeleted.fire( + change, + ps, + newApprovals, + oldApprovals, + input.notify, + changeMessage.getMessage(), + user.getAccount(), + ctx.getWhen()); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DownloadContent.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DownloadContent.java index 24c2f0ebab..827dfcd93d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DownloadContent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/DownloadContent.java @@ -21,12 +21,10 @@ import com.google.gerrit.server.project.NoSuchChangeException; import com.google.gerrit.server.project.ProjectState; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - +import java.io.IOException; import org.eclipse.jgit.lib.ObjectId; import org.kohsuke.args4j.Option; -import java.io.IOException; - public class DownloadContent implements RestReadView { private final FileContentUtil fileContentUtil; @@ -40,13 +38,11 @@ public class DownloadContent implements RestReadView { @Override public BinaryResult apply(FileResource rsrc) - throws ResourceNotFoundException, IOException, NoSuchChangeException, - OrmException { + throws ResourceNotFoundException, IOException, NoSuchChangeException, OrmException { String path = rsrc.getPatchKey().get(); ProjectState projectState = rsrc.getRevision().getControl().getProjectControl().getProjectState(); - ObjectId revstr = ObjectId.fromString( - rsrc.getRevision().getPatchSet().getRevision().get()); + ObjectId revstr = ObjectId.fromString(rsrc.getRevision().getPatchSet().getRevision().get()); return fileContentUtil.downloadContent(projectState, revstr, path, parent); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DraftComments.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DraftComments.java index fe82d6652b..4befc5b6ea 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DraftComments.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/DraftComments.java @@ -38,7 +38,8 @@ public class DraftComments implements ChildCollection> views, + DraftComments( + DynamicMap> views, Provider user, ListRevisionDrafts list, Provider dbProvider, @@ -66,8 +67,9 @@ public class DraftComments implements ChildCollection toFileInfoMap(Change change, RevId revision, @Nullable PatchSet base) throws PatchListNotAvailableException { - ObjectId a = (base == null) - ? null - : ObjectId.fromString(base.getRevision().get()); + ObjectId a = (base == null) ? null : ObjectId.fromString(base.getRevision().get()); ObjectId b = ObjectId.fromString(revision.get()); return toFileInfoMap(change, new PatchListKey(a, b, Whitespace.IGNORE_NONE)); } @@ -61,19 +56,19 @@ public class FileInfoJson { Map toFileInfoMap(Change change, RevId revision, int parent) throws PatchListNotAvailableException { ObjectId b = ObjectId.fromString(revision.get()); - return toFileInfoMap(change, - PatchListKey.againstParentNum(parent + 1, b, Whitespace.IGNORE_NONE)); + return toFileInfoMap( + change, PatchListKey.againstParentNum(parent + 1, b, Whitespace.IGNORE_NONE)); } - private Map toFileInfoMap(Change change, - PatchListKey key) throws PatchListNotAvailableException { + private Map toFileInfoMap(Change change, PatchListKey key) + throws PatchListNotAvailableException { PatchList list = patchListCache.get(key, change.getProject()); Map files = new TreeMap<>(); for (PatchListEntry e : list.getPatches()) { FileInfo d = new FileInfo(); - d.status = e.getChangeType() != Patch.ChangeType.MODIFIED - ? e.getChangeType().getCode() : null; + d.status = + e.getChangeType() != Patch.ChangeType.MODIFIED ? e.getChangeType().getCode() : null; d.oldPath = e.getOldName(); d.sizeDelta = e.getSizeDelta(); d.size = e.getSize(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Files.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Files.java index c077bbb1dd..b7bd75a7e8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Files.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Files.java @@ -42,7 +42,13 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectReader; @@ -55,14 +61,6 @@ import org.kohsuke.args4j.Option; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.TimeUnit; - @Singleton public class Files implements ChildCollection { private final DynamicMap> views; @@ -114,7 +112,8 @@ public class Files implements ChildCollection { private final DynamicItem accountPatchReviewStore; @Inject - ListFiles(Provider db, + ListFiles( + Provider db, Provider self, FileInfoJson fileInfoJson, Revisions revisions, @@ -139,9 +138,8 @@ public class Files implements ChildCollection { @Override public Response apply(RevisionResource resource) - throws AuthException, BadRequestException, ResourceNotFoundException, - OrmException, RepositoryNotFoundException, IOException, - PatchListNotAvailableException { + throws AuthException, BadRequestException, ResourceNotFoundException, OrmException, + RepositoryNotFoundException, IOException, PatchListNotAvailableException { checkOptions(); if (reviewed) { return Response.ok(reviewed(resource)); @@ -151,21 +149,21 @@ public class Files implements ChildCollection { Response> r; if (base != null) { - RevisionResource baseResource = revisions.parse( - resource.getChangeResource(), IdString.fromDecoded(base)); - r = Response.ok(fileInfoJson.toFileInfoMap( - resource.getChange(), - resource.getPatchSet().getRevision(), - baseResource.getPatchSet())); + RevisionResource baseResource = + revisions.parse(resource.getChangeResource(), IdString.fromDecoded(base)); + r = + Response.ok( + fileInfoJson.toFileInfoMap( + resource.getChange(), + resource.getPatchSet().getRevision(), + baseResource.getPatchSet())); } else if (parentNum > 0) { - r = Response.ok(fileInfoJson.toFileInfoMap( - resource.getChange(), - resource.getPatchSet().getRevision(), - parentNum - 1)); + r = + Response.ok( + fileInfoJson.toFileInfoMap( + resource.getChange(), resource.getPatchSet().getRevision(), parentNum - 1)); } else { - r = Response.ok(fileInfoJson.toFileInfoMap( - resource.getChange(), - resource.getPatchSet())); + r = Response.ok(fileInfoJson.toFileInfoMap(resource.getChange(), resource.getPatchSet())); } if (resource.isCacheable()) { @@ -189,8 +187,7 @@ public class Files implements ChildCollection { supplied++; } if (supplied > 1) { - throw new BadRequestException( - "cannot combine base, parent, reviewed, query"); + throw new BadRequestException("cannot combine base, parent, reviewed, query"); } } @@ -201,8 +198,8 @@ public class Files implements ChildCollection { ObjectReader or = git.newObjectReader(); RevWalk rw = new RevWalk(or); TreeWalk tw = new TreeWalk(or)) { - RevCommit c = rw.parseCommit( - ObjectId.fromString(resource.getPatchSet().getRevision().get())); + RevCommit c = + rw.parseCommit(ObjectId.fromString(resource.getPatchSet().getRevision().get())); tw.addTree(c.getTree()); tw.setRecursive(true); @@ -225,13 +222,12 @@ public class Files implements ChildCollection { } Account.Id userId = user.getAccountId(); - Collection r = accountPatchReviewStore.get() - .findReviewed(resource.getPatchSet().getId(), userId); + Collection r = + accountPatchReviewStore.get().findReviewed(resource.getPatchSet().getId(), userId); if (r.isEmpty() && 1 < resource.getPatchSet().getPatchSetId()) { for (PatchSet ps : reversePatchSets(resource)) { - Collection o = - accountPatchReviewStore.get().findReviewed(ps.getId(), userId); + Collection o = accountPatchReviewStore.get().findReviewed(ps.getId(), userId); if (!o.isEmpty()) { try { r = copy(Sets.newHashSet(o), ps.getId(), resource, userId); @@ -246,31 +242,26 @@ public class Files implements ChildCollection { return r; } - private List reversePatchSets(RevisionResource resource) - throws OrmException { - Collection patchSets = - psUtil.byChange(db.get(), resource.getNotes()); - List list = (patchSets instanceof List) ? - (List) patchSets - : new ArrayList<>(patchSets); + private List reversePatchSets(RevisionResource resource) throws OrmException { + Collection patchSets = psUtil.byChange(db.get(), resource.getNotes()); + List list = + (patchSets instanceof List) ? (List) patchSets : new ArrayList<>(patchSets); return Lists.reverse(list); } - private List copy(Set paths, PatchSet.Id old, - RevisionResource resource, Account.Id userId) throws IOException, - PatchListNotAvailableException, OrmException { + private List copy( + Set paths, PatchSet.Id old, RevisionResource resource, Account.Id userId) + throws IOException, PatchListNotAvailableException, OrmException { Project.NameKey project = resource.getChange().getProject(); try (Repository git = gitManager.openRepository(project); ObjectReader reader = git.newObjectReader(); RevWalk rw = new RevWalk(reader); TreeWalk tw = new TreeWalk(reader)) { - PatchList oldList = patchListCache.get( - resource.getChange(), - psUtil.get(db.get(), resource.getNotes(), old)); + PatchList oldList = + patchListCache.get( + resource.getChange(), psUtil.get(db.get(), resource.getNotes(), old)); - PatchList curList = patchListCache.get( - resource.getChange(), - resource.getPatchSet()); + PatchList curList = patchListCache.get(resource.getChange(), resource.getPatchSet()); int sz = paths.size(); List pathList = Lists.newArrayListWithCapacity(sz); @@ -292,15 +283,19 @@ public class Files implements ChildCollection { while (tw.next()) { String path = tw.getPathString(); - if (tw.getRawMode(o) != 0 && tw.getRawMode(c) != 0 + if (tw.getRawMode(o) != 0 + && tw.getRawMode(c) != 0 && tw.idEqual(o, c) && paths.contains(path)) { // File exists in previously reviewed oldList and in curList. // File content is identical. pathList.add(path); - } else if (op >= 0 && cp >= 0 - && tw.getRawMode(o) == 0 && tw.getRawMode(c) == 0 - && tw.getRawMode(op) != 0 && tw.getRawMode(cp) != 0 + } else if (op >= 0 + && cp >= 0 + && tw.getRawMode(o) == 0 + && tw.getRawMode(c) == 0 + && tw.getRawMode(op) != 0 + && tw.getRawMode(cp) != 0 && tw.idEqual(op, cp) && paths.contains(path)) { // File was deleted in previously reviewed oldList and curList. @@ -309,7 +304,8 @@ public class Files implements ChildCollection { pathList.add(path); } } - accountPatchReviewStore.get() + accountPatchReviewStore + .get() .markReviewed(resource.getPatchSet().getId(), userId, pathList); return pathList; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetArchive.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetArchive.java index e99eb872ad..371127bae5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetArchive.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetArchive.java @@ -21,7 +21,8 @@ import com.google.gerrit.extensions.restapi.MethodNotAllowedException; import com.google.gerrit.extensions.restapi.RestReadView; import com.google.gerrit.server.git.GitRepositoryManager; import com.google.inject.Inject; - +import java.io.IOException; +import java.io.OutputStream; import org.eclipse.jgit.api.ArchiveCommand; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.lib.ObjectId; @@ -30,9 +31,6 @@ import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; import org.kohsuke.args4j.Option; -import java.io.IOException; -import java.io.OutputStream; - public class GetArchive implements RestReadView { private final GitRepositoryManager repoManager; private final AllowedFormats allowedFormats; @@ -47,8 +45,8 @@ public class GetArchive implements RestReadView { } @Override - public BinaryResult apply(RevisionResource rsrc) throws BadRequestException, - IOException, MethodNotAllowedException { + public BinaryResult apply(RevisionResource rsrc) + throws BadRequestException, IOException, MethodNotAllowedException { if (Strings.isNullOrEmpty(format)) { throw new BadRequestException("format is not specified"); } @@ -60,40 +58,37 @@ public class GetArchive implements RestReadView { throw new MethodNotAllowedException("zip format is disabled"); } boolean close = true; - final Repository repo = repoManager - .openRepository(rsrc.getControl().getProject().getNameKey()); + final Repository repo = repoManager.openRepository(rsrc.getControl().getProject().getNameKey()); try { final RevCommit commit; String name; try (RevWalk rw = new RevWalk(repo)) { - commit = rw.parseCommit(ObjectId.fromString( - rsrc.getPatchSet().getRevision().get())); + commit = rw.parseCommit(ObjectId.fromString(rsrc.getPatchSet().getRevision().get())); name = name(f, rw, commit); } - BinaryResult bin = new BinaryResult() { - @Override - public void writeTo(OutputStream out) throws IOException { - try { - new ArchiveCommand(repo) - .setFormat(f.name()) - .setTree(commit.getTree()) - .setOutputStream(out) - .call(); - } catch (GitAPIException e) { - throw new IOException(e); - } - } + BinaryResult bin = + new BinaryResult() { + @Override + public void writeTo(OutputStream out) throws IOException { + try { + new ArchiveCommand(repo) + .setFormat(f.name()) + .setTree(commit.getTree()) + .setOutputStream(out) + .call(); + } catch (GitAPIException e) { + throw new IOException(e); + } + } - @Override - public void close() throws IOException { - repo.close(); - } - }; + @Override + public void close() throws IOException { + repo.close(); + } + }; - bin.disableGzip() - .setContentType(f.getMimeType()) - .setAttachmentName(name); + bin.disableGzip().setContentType(f.getMimeType()).setAttachmentName(name); close = false; return bin; @@ -106,8 +101,7 @@ public class GetArchive implements RestReadView { private static String name(ArchiveFormat format, RevWalk rw, RevCommit commit) throws IOException { - return String.format("%s%s", - rw.getObjectReader().abbreviate(commit,7).name(), - format.getDefaultSuffix()); + return String.format( + "%s%s", rw.getObjectReader().abbreviate(commit, 7).name(), format.getDefaultSuffix()); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetAssignee.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetAssignee.java index ea81ad361d..d491b9125c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetAssignee.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetAssignee.java @@ -22,7 +22,6 @@ import com.google.gerrit.server.account.AccountLoader; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.util.Optional; @Singleton @@ -36,11 +35,9 @@ public class GetAssignee implements RestReadView { @Override public Response apply(ChangeResource rsrc) throws OrmException { - Optional assignee = - Optional.ofNullable(rsrc.getChange().getAssignee()); + Optional assignee = Optional.ofNullable(rsrc.getChange().getAssignee()); if (assignee.isPresent()) { - return Response.ok( - accountLoaderFactory.create(true).fillOne(assignee.get())); + return Response.ok(accountLoaderFactory.create(true).fillOne(assignee.get())); } return Response.none(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetBlame.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetBlame.java index 408a1ae9d0..7abddcf12f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetBlame.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetBlame.java @@ -34,7 +34,10 @@ import com.google.gitiles.blame.BlameCache; import com.google.gitiles.blame.Region; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectInserter; @@ -46,11 +49,6 @@ import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; import org.kohsuke.args4j.Option; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.TimeUnit; - public class GetBlame implements RestReadView { private final GitRepositoryManager repoManager; @@ -59,13 +57,18 @@ public class GetBlame implements RestReadView { private final ThreeWayMergeStrategy mergeStrategy; private final AutoMerger autoMerger; - @Option(name = "--base", aliases = {"-b"}, - usage = "whether to load the blame of the base revision (the direct" - + " parent of the change) instead of the change") + @Option( + name = "--base", + aliases = {"-b"}, + usage = + "whether to load the blame of the base revision (the direct" + + " parent of the change) instead of the change" + ) private boolean base; @Inject - GetBlame(GitRepositoryManager repoManager, + GetBlame( + GitRepositoryManager repoManager, BlameCache blameCache, @GerritServerConfig Config cfg, AutoMerger autoMerger) { @@ -78,8 +81,7 @@ public class GetBlame implements RestReadView { @Override public Response> apply(FileResource resource) - throws RestApiException, OrmException, IOException, - InvalidChangeOperationException { + throws RestApiException, OrmException, IOException, InvalidChangeOperationException { if (!allowBlame) { throw new BadRequestException("blame is disabled"); } @@ -88,9 +90,10 @@ public class GetBlame implements RestReadView { try (Repository repository = repoManager.openRepository(project); ObjectInserter ins = repository.newObjectInserter(); RevWalk revWalk = new RevWalk(ins.newReader())) { - String refName = resource.getRevision().getEdit().isPresent() - ? resource.getRevision().getEdit().get().getRefName() - : resource.getRevision().getPatchSet().getRefName(); + String refName = + resource.getRevision().getEdit().isPresent() + ? resource.getRevision().getEdit().get().getRefName() + : resource.getRevision().getPatchSet().getRefName(); Ref ref = repository.findRef(refName); if (ref == null) { @@ -113,8 +116,7 @@ public class GetBlame implements RestReadView { result = blame(parents[0], path, repository, revWalk); } else if (parents.length == 2) { - ObjectId automerge = autoMerger.merge(repository, revWalk, ins, - revCommit, mergeStrategy); + ObjectId automerge = autoMerger.merge(repository, revWalk, ins, revCommit, mergeStrategy); result = blame(automerge, path, repository, revWalk); } else { @@ -130,8 +132,8 @@ public class GetBlame implements RestReadView { } } - private List blame(ObjectId id, String path, - Repository repository, RevWalk revWalk) throws IOException { + private List blame(ObjectId id, String path, Repository repository, RevWalk revWalk) + throws IOException { ListMultimap ranges = MultimapBuilder.hashKeys().arrayListValues().build(); List result = new ArrayList<>(); @@ -155,8 +157,7 @@ public class GetBlame implements RestReadView { return result; } - private static BlameInfo toBlameInfo(RevCommit commit, - PersonIdent sourceAuthor) { + private static BlameInfo toBlameInfo(RevCommit commit, PersonIdent sourceAuthor) { BlameInfo blameInfo = new BlameInfo(); blameInfo.author = sourceAuthor.getName(); blameInfo.id = commit.getName(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetChange.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetChange.java index b66a18b263..22b0b1cec2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetChange.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetChange.java @@ -20,15 +20,12 @@ import com.google.gerrit.extensions.restapi.Response; import com.google.gerrit.extensions.restapi.RestReadView; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - -import org.kohsuke.args4j.Option; - import java.util.EnumSet; +import org.kohsuke.args4j.Option; public class GetChange implements RestReadView { private final ChangeJson.Factory json; - private final EnumSet options = - EnumSet.noneOf(ListChangesOption.class); + private final EnumSet options = EnumSet.noneOf(ListChangesOption.class); @Option(name = "-o", usage = "Output options") void addOption(ListChangesOption o) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetCommit.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetCommit.java index e51d37b28d..832e08dc99 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetCommit.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetCommit.java @@ -21,16 +21,14 @@ import com.google.gerrit.extensions.restapi.RestReadView; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.git.GitRepositoryManager; import com.google.inject.Inject; - +import java.io.IOException; +import java.util.concurrent.TimeUnit; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; import org.kohsuke.args4j.Option; -import java.io.IOException; -import java.util.concurrent.TimeUnit; - public class GetCommit implements RestReadView { private final GitRepositoryManager repoManager; private final ChangeJson.Factory json; @@ -52,8 +50,9 @@ public class GetCommit implements RestReadView { String rev = rsrc.getPatchSet().getRevision().get(); RevCommit commit = rw.parseCommit(ObjectId.fromString(rev)); rw.parseBody(commit); - CommitInfo info = json.create(ChangeJson.NO_OPTIONS) - .toCommit(rsrc.getControl(), rw, commit, addLinks, true); + CommitInfo info = + json.create(ChangeJson.NO_OPTIONS) + .toCommit(rsrc.getControl(), rw, commit, addLinks, true); Response r = Response.ok(info); if (rsrc.isCacheable()) { r.caching(CacheControl.PRIVATE(7, TimeUnit.DAYS)); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetContent.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetContent.java index d8216f01a8..abb9e66456 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetContent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetContent.java @@ -31,15 +31,13 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; -import java.io.IOException; - @Singleton public class GetContent implements RestReadView { private final Provider db; @@ -61,18 +59,15 @@ public class GetContent implements RestReadView { @Override public BinaryResult apply(FileResource rsrc) - throws ResourceNotFoundException, IOException, NoSuchChangeException, - OrmException { + throws ResourceNotFoundException, IOException, NoSuchChangeException, OrmException { String path = rsrc.getPatchKey().get(); if (Patch.COMMIT_MSG.equals(path)) { - String msg = getMessage( - rsrc.getRevision().getChangeResource().getNotes()); + String msg = getMessage(rsrc.getRevision().getChangeResource().getNotes()); return BinaryResult.create(msg) .setContentType(FileContentUtil.TEXT_X_GERRIT_COMMIT_MESSAGE) .base64(); } else if (Patch.MERGE_LIST.equals(path)) { - byte[] mergeList = getMergeList( - rsrc.getRevision().getChangeResource().getNotes()); + byte[] mergeList = getMergeList(rsrc.getRevision().getChangeResource().getNotes()); return BinaryResult.create(mergeList) .setContentType(FileContentUtil.TEXT_X_GERRIT_MERGE_LIST) .base64(); @@ -83,8 +78,7 @@ public class GetContent implements RestReadView { path); } - private String getMessage(ChangeNotes notes) - throws OrmException, IOException { + private String getMessage(ChangeNotes notes) throws OrmException, IOException { Change.Id changeId = notes.getChangeId(); PatchSet ps = psUtil.current(db.get(), notes); if (ps == null) { @@ -93,16 +87,14 @@ public class GetContent implements RestReadView { try (Repository git = gitManager.openRepository(notes.getProjectName()); RevWalk revWalk = new RevWalk(git)) { - RevCommit commit = revWalk.parseCommit( - ObjectId.fromString(ps.getRevision().get())); + RevCommit commit = revWalk.parseCommit(ObjectId.fromString(ps.getRevision().get())); return commit.getFullMessage(); } catch (RepositoryNotFoundException e) { throw new NoSuchChangeException(changeId, e); } } - private byte[] getMergeList(ChangeNotes notes) - throws OrmException, IOException { + private byte[] getMergeList(ChangeNotes notes) throws OrmException, IOException { Change.Id changeId = notes.getChangeId(); PatchSet ps = psUtil.current(db.get(), notes); if (ps == null) { @@ -111,9 +103,11 @@ public class GetContent implements RestReadView { try (Repository git = gitManager.openRepository(notes.getProjectName()); RevWalk revWalk = new RevWalk(git)) { - return Text.forMergeList(ComparisonType.againstAutoMerge(), - revWalk.getObjectReader(), - ObjectId.fromString(ps.getRevision().get())).getContent(); + return Text.forMergeList( + ComparisonType.againstAutoMerge(), + revWalk.getObjectReader(), + ObjectId.fromString(ps.getRevision().get())) + .getContent(); } catch (RepositoryNotFoundException e) { throw new NoSuchChangeException(changeId, e); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDetail.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDetail.java index 48bd2f4ba0..8213193738 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDetail.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDetail.java @@ -20,7 +20,6 @@ import com.google.gerrit.extensions.restapi.Response; import com.google.gerrit.extensions.restapi.RestReadView; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - import org.kohsuke.args4j.Option; public class GetDetail implements RestReadView { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDiff.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDiff.java index c688f3ac2a..5daf69aa1c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDiff.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDiff.java @@ -52,7 +52,9 @@ import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.project.ProjectState; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - +import java.io.IOException; +import java.util.List; +import java.util.concurrent.TimeUnit; import org.eclipse.jgit.diff.Edit; import org.eclipse.jgit.diff.ReplaceEdit; import org.kohsuke.args4j.CmdLineException; @@ -64,10 +66,6 @@ import org.kohsuke.args4j.spi.OptionHandler; import org.kohsuke.args4j.spi.Parameters; import org.kohsuke.args4j.spi.Setter; -import java.io.IOException; -import java.util.List; -import java.util.concurrent.TimeUnit; - public class GetDiff implements RestReadView { private static final ImmutableMap CHANGE_TYPE = Maps.immutableEnumMap( @@ -108,7 +106,8 @@ public class GetDiff implements RestReadView { boolean webLinksOnly; @Inject - GetDiff(ProjectCache projectCache, + GetDiff( + ProjectCache projectCache, PatchScriptFactory.Factory patchScriptFactoryFactory, Revisions revisions, WebLinks webLinks) { @@ -120,8 +119,8 @@ public class GetDiff implements RestReadView { @Override public Response apply(FileResource resource) - throws ResourceConflictException, ResourceNotFoundException, - OrmException, AuthException, InvalidChangeOperationException, IOException { + throws ResourceConflictException, ResourceNotFoundException, OrmException, AuthException, + InvalidChangeOperationException, IOException { DiffPreferencesInfo prefs = new DiffPreferencesInfo(); if (whitespace != null) { prefs.ignoreWhitespace = whitespace; @@ -136,29 +135,32 @@ public class GetDiff implements RestReadView { PatchScriptFactory psf; PatchSet basePatchSet = null; if (base != null) { - RevisionResource baseResource = revisions.parse( - resource.getRevision().getChangeResource(), IdString.fromDecoded(base)); + RevisionResource baseResource = + revisions.parse(resource.getRevision().getChangeResource(), IdString.fromDecoded(base)); basePatchSet = baseResource.getPatchSet(); - psf = patchScriptFactoryFactory.create( - resource.getRevision().getControl(), - resource.getPatchKey().getFileName(), - basePatchSet.getId(), - resource.getPatchKey().getParentKey(), - prefs); + psf = + patchScriptFactoryFactory.create( + resource.getRevision().getControl(), + resource.getPatchKey().getFileName(), + basePatchSet.getId(), + resource.getPatchKey().getParentKey(), + prefs); } else if (parentNum > 0) { - psf = patchScriptFactoryFactory.create( - resource.getRevision().getControl(), - resource.getPatchKey().getFileName(), - parentNum - 1, - resource.getPatchKey().getParentKey(), - prefs); + psf = + patchScriptFactoryFactory.create( + resource.getRevision().getControl(), + resource.getPatchKey().getFileName(), + parentNum - 1, + resource.getPatchKey().getParentKey(), + prefs); } else { - psf = patchScriptFactoryFactory.create( - resource.getRevision().getControl(), - resource.getPatchKey().getFileName(), - null, - resource.getPatchKey().getParentKey(), - prefs); + psf = + patchScriptFactoryFactory.create( + resource.getRevision().getControl(), + resource.getPatchKey().getFileName(), + null, + resource.getPatchKey().getParentKey(), + prefs); } try { @@ -172,17 +174,22 @@ public class GetDiff implements RestReadView { } content.addCommon(edit.getBeginA()); - checkState(content.nextA == edit.getBeginA(), - "nextA = %s; want %s", content.nextA, edit.getBeginA()); - checkState(content.nextB == edit.getBeginB(), - "nextB = %s; want %s", content.nextB, edit.getBeginB()); + checkState( + content.nextA == edit.getBeginA(), + "nextA = %s; want %s", + content.nextA, + edit.getBeginA()); + checkState( + content.nextB == edit.getBeginB(), + "nextB = %s; want %s", + content.nextB, + edit.getBeginB()); switch (edit.getType()) { case DELETE: case INSERT: case REPLACE: - List internalEdit = edit instanceof ReplaceEdit - ? ((ReplaceEdit) edit).getInternalEdits() - : null; + List internalEdit = + edit instanceof ReplaceEdit ? ((ReplaceEdit) edit).getInternalEdits() : null; content.addDiff(edit.getEndA(), edit.getEndB(), internalEdit); break; case EMPTY: @@ -192,21 +199,23 @@ public class GetDiff implements RestReadView { } content.addCommon(ps.getA().size()); - ProjectState state = - projectCache.get(resource.getRevision().getChange().getProject()); + ProjectState state = projectCache.get(resource.getRevision().getChange().getProject()); DiffInfo result = new DiffInfo(); // TODO referring to the parent commit by refs/changes/12/60012/1^1 // will likely not work for inline edits - String revA = basePatchSet != null - ? basePatchSet.getRefName() - : resource.getRevision().getPatchSet().getRefName() + "^1"; - String revB = resource.getRevision().getEdit().isPresent() - ? resource.getRevision().getEdit().get().getRefName() - : resource.getRevision().getPatchSet().getRefName(); + String revA = + basePatchSet != null + ? basePatchSet.getRefName() + : resource.getRevision().getPatchSet().getRefName() + "^1"; + String revB = + resource.getRevision().getEdit().isPresent() + ? resource.getRevision().getEdit().get().getRefName() + : resource.getRevision().getPatchSet().getRefName(); List links = - webLinks.getDiffLinks(state.getProject().getName(), + webLinks.getDiffLinks( + state.getProject().getName(), resource.getPatchKey().getParentKey().getParentKey().get(), basePatchSet != null ? basePatchSet.getId().get() : null, revA, @@ -222,24 +231,23 @@ public class GetDiff implements RestReadView { } if (ps.getDisplayMethodA() != DisplayMethod.NONE) { result.metaA = new FileMeta(); - result.metaA.name = MoreObjects.firstNonNull(ps.getOldName(), - ps.getNewName()); - result.metaA.contentType = FileContentUtil.resolveContentType( - state, result.metaA.name, ps.getFileModeA(), ps.getMimeTypeA()); + result.metaA.name = MoreObjects.firstNonNull(ps.getOldName(), ps.getNewName()); + result.metaA.contentType = + FileContentUtil.resolveContentType( + state, result.metaA.name, ps.getFileModeA(), ps.getMimeTypeA()); result.metaA.lines = ps.getA().size(); - result.metaA.webLinks = - getFileWebLinks(state.getProject(), revA, result.metaA.name); + result.metaA.webLinks = getFileWebLinks(state.getProject(), revA, result.metaA.name); result.metaA.commitId = content.commitIdA; } if (ps.getDisplayMethodB() != DisplayMethod.NONE) { result.metaB = new FileMeta(); result.metaB.name = ps.getNewName(); - result.metaB.contentType = FileContentUtil.resolveContentType( - state, result.metaB.name, ps.getFileModeB(), ps.getMimeTypeB()); + result.metaB.contentType = + FileContentUtil.resolveContentType( + state, result.metaB.name, ps.getFileModeB(), ps.getMimeTypeB()); result.metaB.lines = ps.getB().size(); - result.metaB.webLinks = - getFileWebLinks(state.getProject(), revB, result.metaB.name); + result.metaB.webLinks = getFileWebLinks(state.getProject(), revB, result.metaB.name); result.metaB.commitId = content.commitIdB; } @@ -255,8 +263,7 @@ public class GetDiff implements RestReadView { result.changeType = CHANGE_TYPE.get(ps.getChangeType()); if (result.changeType == null) { - throw new IllegalStateException( - "unknown change type: " + ps.getChangeType()); + throw new IllegalStateException("unknown change type: " + ps.getChangeType()); } if (ps.getPatchHeader().size() > 0) { @@ -277,10 +284,8 @@ public class GetDiff implements RestReadView { } } - private List getFileWebLinks(Project project, String rev, - String file) { - List links = - webLinks.getFileLinks(project.getName(), rev, file); + private List getFileWebLinks(Project project, String rev, String file) { + List links = webLinks.getFileLinks(project.getName(), rev, file); return links.isEmpty() ? null : links; } @@ -337,9 +342,7 @@ public class GetDiff implements RestReadView { while (nextA < end) { if (!fileA.contains(nextA)) { - int endRegion = Math.min( - end, - nextA == 0 ? fileA.first() : fileA.next(nextA - 1)); + int endRegion = Math.min(end, nextA == 0 ? fileA.first() : fileA.next(nextA - 1)); int len = endRegion - nextA; entry().skip = len; nextA = endRegion; @@ -348,9 +351,7 @@ public class GetDiff implements RestReadView { } ContentEntry e = null; - for (int i = nextA; - i == nextA && i < end; - i = fileA.next(i), nextA++, nextB++) { + for (int i = nextA; i == nextA && i < end; i = fileA.next(i), nextA++, nextB++) { if (ignoreWS && fileB.contains(nextB)) { if (e == null || e.common == null) { e = entry(); @@ -396,13 +397,13 @@ public class GetDiff implements RestReadView { int lastB = 0; for (Edit edit : internalEdit) { if (edit.getBeginA() != edit.getEndA()) { - e.editA.add(ImmutableList.of( - edit.getBeginA() - lastA, edit.getEndA() - edit.getBeginA())); + e.editA.add( + ImmutableList.of(edit.getBeginA() - lastA, edit.getEndA() - edit.getBeginA())); lastA = edit.getEndA(); } if (edit.getBeginB() != edit.getEndB()) { - e.editB.add(ImmutableList.of( - edit.getBeginB() - lastB, edit.getEndB() - edit.getBeginB())); + e.editB.add( + ImmutableList.of(edit.getBeginB() - lastB, edit.getEndB() - edit.getBeginB())); lastB = edit.getEndB(); } } @@ -431,14 +432,12 @@ public class GetDiff implements RestReadView { } public static class ContextOptionHandler extends OptionHandler { - public ContextOptionHandler( - CmdLineParser parser, OptionDef option, Setter setter) { + public ContextOptionHandler(CmdLineParser parser, OptionDef option, Setter setter) { super(parser, option, setter); } @Override - public final int parseArguments(final Parameters params) - throws CmdLineException { + public final int parseArguments(final Parameters params) throws CmdLineException { final String value = params.getParameter(0); short context; if ("all".equalsIgnoreCase(value)) { @@ -450,8 +449,10 @@ public class GetDiff implements RestReadView { throw new NumberFormatException(); } } catch (NumberFormatException e) { - throw new CmdLineException(owner, - String.format("\"%s\" is not a valid value for \"%s\"", + throw new CmdLineException( + owner, + String.format( + "\"%s\" is not a valid value for \"%s\"", value, ((NamedOptionDef) option).name())); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetHashtags.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetHashtags.java index d0c1e8330d..4ea1c02086 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetHashtags.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetHashtags.java @@ -22,7 +22,6 @@ import com.google.gerrit.server.notedb.ChangeNotes; import com.google.gerrit.server.project.ChangeControl; import com.google.gwtorm.server.OrmException; import com.google.inject.Singleton; - import java.io.IOException; import java.util.Collections; import java.util.Set; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetMergeList.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetMergeList.java index b15810c248..eed4c71109 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetMergeList.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetMergeList.java @@ -24,18 +24,16 @@ import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.git.GitRepositoryManager; import com.google.gerrit.server.patch.MergeListBuilder; import com.google.inject.Inject; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; import org.kohsuke.args4j.Option; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.TimeUnit; - public class GetMergeList implements RestReadView { private final GitRepositoryManager repoManager; private final ChangeJson.Factory json; @@ -47,8 +45,7 @@ public class GetMergeList implements RestReadView { private boolean addLinks; @Inject - GetMergeList(GitRepositoryManager repoManager, - ChangeJson.Factory json) { + GetMergeList(GitRepositoryManager repoManager, ChangeJson.Factory json) { this.repoManager = repoManager; this.json = json; } @@ -71,17 +68,15 @@ public class GetMergeList implements RestReadView { RevCommit commit = rw.parseCommit(ObjectId.fromString(rev)); rw.parseBody(commit); - if (uninterestingParent < 1 - || uninterestingParent > commit.getParentCount()) { + if (uninterestingParent < 1 || uninterestingParent > commit.getParentCount()) { throw new BadRequestException("No such parent: " + uninterestingParent); } if (commit.getParentCount() < 2) { - return createResponse(rsrc, ImmutableList. of()); + return createResponse(rsrc, ImmutableList.of()); } - List commits = - MergeListBuilder.build(rw, commit, uninterestingParent); + List commits = MergeListBuilder.build(rw, commit, uninterestingParent); List result = new ArrayList<>(commits.size()); ChangeJson changeJson = json.create(ChangeJson.NO_OPTIONS); for (RevCommit c : commits) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetPastAssignees.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetPastAssignees.java index c37efed2ae..eaa3a289e4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetPastAssignees.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetPastAssignees.java @@ -24,7 +24,6 @@ import com.google.gerrit.server.account.AccountLoader; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.util.Collections; import java.util.List; import java.util.Set; @@ -39,18 +38,15 @@ public class GetPastAssignees implements RestReadView { } @Override - public Response> apply(ChangeResource rsrc) - throws OrmException { + public Response> apply(ChangeResource rsrc) throws OrmException { - Set pastAssignees = - rsrc.getControl().getNotes().load().getPastAssignees(); + Set pastAssignees = rsrc.getControl().getNotes().load().getPastAssignees(); if (pastAssignees == null) { return Response.ok(Collections.emptyList()); } AccountLoader accountLoader = accountLoaderFactory.create(true); - List infos = - pastAssignees.stream().map(accountLoader::get).collect(toList()); + List infos = pastAssignees.stream().map(accountLoader::get).collect(toList()); accountLoader.fill(); return Response.ok(infos); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetPatch.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetPatch.java index 365b204c89..2275e06215 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetPatch.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetPatch.java @@ -23,7 +23,13 @@ import com.google.gerrit.extensions.restapi.RestReadView; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.git.GitRepositoryManager; import com.google.inject.Inject; - +import java.io.IOException; +import java.io.OutputStream; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Locale; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; import org.eclipse.jgit.diff.DiffFormatter; import org.eclipse.jgit.lib.AbbreviatedObjectId; import org.eclipse.jgit.lib.ObjectId; @@ -34,14 +40,6 @@ import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.treewalk.filter.PathFilter; import org.kohsuke.args4j.Option; -import java.io.IOException; -import java.io.OutputStream; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Locale; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; - public class GetPatch implements RestReadView { private final GitRepositoryManager repoManager; @@ -62,8 +60,8 @@ public class GetPatch implements RestReadView { } @Override - public BinaryResult apply(RevisionResource rsrc) throws - ResourceConflictException, IOException, ResourceNotFoundException { + public BinaryResult apply(RevisionResource rsrc) + throws ResourceConflictException, IOException, ResourceNotFoundException { Project.NameKey project = rsrc.getControl().getProject().getNameKey(); final Repository repo = repoManager.openRepository(project); boolean close = true; @@ -71,71 +69,67 @@ public class GetPatch implements RestReadView { final RevWalk rw = new RevWalk(repo); try { final RevCommit commit = - rw.parseCommit(ObjectId.fromString(rsrc.getPatchSet() - .getRevision().get())); + rw.parseCommit(ObjectId.fromString(rsrc.getPatchSet().getRevision().get())); RevCommit[] parents = commit.getParents(); if (parents.length > 1) { - throw new ResourceConflictException( - "Revision has more than 1 parent."); + throw new ResourceConflictException("Revision has more than 1 parent."); } else if (parents.length == 0) { throw new ResourceConflictException("Revision has no parent."); } final RevCommit base = parents[0]; rw.parseBody(base); - BinaryResult bin = new BinaryResult() { - @Override - public void writeTo(OutputStream out) throws IOException { - if (zip) { - ZipOutputStream zos = new ZipOutputStream(out); - ZipEntry e = new ZipEntry(fileName(rw, commit)); - e.setTime(commit.getCommitTime() * 1000L); - zos.putNextEntry(e); - format(zos); - zos.closeEntry(); - zos.finish(); - } else { - format(out); - } - } - - private void format(OutputStream out) throws IOException { - // Only add header if no path is specified - if (path == null) { - out.write(formatEmailHeader(commit).getBytes(UTF_8)); - } - try (DiffFormatter fmt = new DiffFormatter(out)) { - fmt.setRepository(repo); - if (path != null) { - fmt.setPathFilter(PathFilter.create(path)); + BinaryResult bin = + new BinaryResult() { + @Override + public void writeTo(OutputStream out) throws IOException { + if (zip) { + ZipOutputStream zos = new ZipOutputStream(out); + ZipEntry e = new ZipEntry(fileName(rw, commit)); + e.setTime(commit.getCommitTime() * 1000L); + zos.putNextEntry(e); + format(zos); + zos.closeEntry(); + zos.finish(); + } else { + format(out); + } } - fmt.format(base.getTree(), commit.getTree()); - fmt.flush(); - } - } - @Override - public void close() throws IOException { - rw.close(); - repo.close(); - } - }; + private void format(OutputStream out) throws IOException { + // Only add header if no path is specified + if (path == null) { + out.write(formatEmailHeader(commit).getBytes(UTF_8)); + } + try (DiffFormatter fmt = new DiffFormatter(out)) { + fmt.setRepository(repo); + if (path != null) { + fmt.setPathFilter(PathFilter.create(path)); + } + fmt.format(base.getTree(), commit.getTree()); + fmt.flush(); + } + } + + @Override + public void close() throws IOException { + rw.close(); + repo.close(); + } + }; if (path != null && bin.asString().isEmpty()) { - throw new ResourceNotFoundException( - String.format(FILE_NOT_FOUND, path)); + throw new ResourceNotFoundException(String.format(FILE_NOT_FOUND, path)); } if (zip) { bin.disableGzip() - .setContentType("application/zip") - .setAttachmentName(fileName(rw, commit) + ".zip"); + .setContentType("application/zip") + .setAttachmentName(fileName(rw, commit) + ".zip"); } else { bin.base64() - .setContentType("application/mbox") - .setAttachmentName(download - ? fileName(rw, commit) + ".base64" - : null); + .setContentType("application/mbox") + .setAttachmentName(download ? fileName(rw, commit) + ".base64" : null); } close = false; @@ -165,31 +159,37 @@ public class GetPatch implements RestReadView { if (msg.startsWith("\n\n")) { msg = msg.substring(2); } - b.append("From ").append(commit.getName()) - .append(' ') - .append("Mon Sep 17 00:00:00 2001\n") // Fixed timestamp to match output of C Git's format-patch - .append("From: ").append(author.getName()) - .append(" <").append(author.getEmailAddress()).append(">\n") - .append("Date: ").append(formatDate(author)).append('\n') - .append("Subject: [PATCH] ").append(subject).append('\n') - .append('\n') - .append(msg); + b.append("From ") + .append(commit.getName()) + .append(' ') + .append( + "Mon Sep 17 00:00:00 2001\n") // Fixed timestamp to match output of C Git's format-patch + .append("From: ") + .append(author.getName()) + .append(" <") + .append(author.getEmailAddress()) + .append(">\n") + .append("Date: ") + .append(formatDate(author)) + .append('\n') + .append("Subject: [PATCH] ") + .append(subject) + .append('\n') + .append('\n') + .append(msg); if (!msg.endsWith("\n")) { - b.append('\n'); + b.append('\n'); } return b.append("---\n\n").toString(); } private static String formatDate(PersonIdent author) { - SimpleDateFormat df = new SimpleDateFormat( - "EEE, dd MMM yyyy HH:mm:ss Z", - Locale.US); + SimpleDateFormat df = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US); df.setCalendar(Calendar.getInstance(author.getTimeZone(), Locale.US)); return df.format(author.getWhen()); } - private static String fileName(RevWalk rw, RevCommit commit) - throws IOException { + private static String fileName(RevWalk rw, RevCommit commit) throws IOException { AbbreviatedObjectId id = rw.getObjectReader().abbreviate(commit, 7); return id.name() + ".diff"; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRelated.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRelated.java index 0a7452bc27..10c7a5a986 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRelated.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRelated.java @@ -32,16 +32,14 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.eclipse.jgit.errors.RepositoryNotFoundException; -import org.eclipse.jgit.revwalk.RevCommit; - import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; +import org.eclipse.jgit.errors.RepositoryNotFoundException; +import org.eclipse.jgit.revwalk.RevCommit; @Singleton public class GetRelated implements RestReadView { @@ -51,7 +49,8 @@ public class GetRelated implements RestReadView { private final RelatedChangesSorter sorter; @Inject - GetRelated(Provider db, + GetRelated( + Provider db, Provider queryProvider, PatchSetUtil psUtil, RelatedChangesSorter sorter) { @@ -69,29 +68,27 @@ public class GetRelated implements RestReadView { return relatedInfo; } - private List getRelated(RevisionResource rsrc) - throws OrmException, IOException { + private List getRelated(RevisionResource rsrc) throws OrmException, IOException { Set groups = getAllGroups(rsrc.getNotes()); if (groups.isEmpty()) { return Collections.emptyList(); } - List cds = queryProvider.get() - .enforceVisibility(true) - .byProjectGroups(rsrc.getChange().getProject(), groups); + List cds = + queryProvider + .get() + .enforceVisibility(true) + .byProjectGroups(rsrc.getChange().getProject(), groups); if (cds.isEmpty()) { return Collections.emptyList(); } - if (cds.size() == 1 - && cds.get(0).getId().equals(rsrc.getChange().getId())) { + if (cds.size() == 1 && cds.get(0).getId().equals(rsrc.getChange().getId())) { return Collections.emptyList(); } List result = new ArrayList<>(cds.size()); boolean isEdit = rsrc.getEdit().isPresent(); - PatchSet basePs = isEdit - ? rsrc.getEdit().get().getBasePatchSet() - : rsrc.getPatchSet(); + PatchSet basePs = isEdit ? rsrc.getEdit().get().getBasePatchSet() : rsrc.getPatchSet(); reloadChangeIfStale(cds, basePs); @@ -110,8 +107,7 @@ public class GetRelated implements RestReadView { if (result.size() == 1) { ChangeAndCommit r = result.get(0); - if (r.commit != null - && r.commit.commit.equals(rsrc.getPatchSet().getRevision().get())) { + if (r.commit != null && r.commit.commit.equals(rsrc.getPatchSet().getRevision().get())) { return Collections.emptyList(); } } @@ -126,8 +122,7 @@ public class GetRelated implements RestReadView { return result; } - private void reloadChangeIfStale(List cds, PatchSet wantedPs) - throws OrmException { + private void reloadChangeIfStale(List cds, PatchSet wantedPs) throws OrmException { for (ChangeData cd : cds) { if (cd.getId().equals(wantedPs.getId().getParentKey())) { if (cd.patchSet(wantedPs.getId()) == null) { @@ -149,8 +144,7 @@ public class GetRelated implements RestReadView { public Integer _currentRevisionNumber; public String status; - public ChangeAndCommit() { - } + public ChangeAndCommit() {} ChangeAndCommit(@Nullable Change change, @Nullable PatchSet ps, RevCommit c) { if (change != null) { @@ -188,14 +182,14 @@ public class GetRelated implements RestReadView { private static String toString(CommitInfo commit) { return MoreObjects.toStringHelper(commit) - .add("commit", commit.commit) - .add("parent", commit.parents) - .add("author", commit.author) - .add("committer", commit.committer) - .add("subject", commit.subject) - .add("message", commit.message) - .add("webLinks", commit.webLinks) - .toString(); + .add("commit", commit.commit) + .add("parent", commit.parents) + .add("author", commit.author) + .add("committer", commit.committer) + .add("subject", commit.subject) + .add("message", commit.message) + .add("webLinks", commit.webLinks) + .toString(); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetReviewer.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetReviewer.java index 533468d175..aa0b339f4a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetReviewer.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetReviewer.java @@ -19,7 +19,6 @@ import com.google.gerrit.extensions.restapi.RestReadView; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.util.List; @Singleton diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRevisionActions.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRevisionActions.java index 57e5cea6b7..e476e73ddb 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRevisionActions.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRevisionActions.java @@ -30,11 +30,9 @@ import com.google.gwtorm.server.OrmRuntimeException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.Config; - import java.io.IOException; import java.util.Map; +import org.eclipse.jgit.lib.Config; @Singleton public class GetRevisionActions implements ETagView { @@ -59,8 +57,7 @@ public class GetRevisionActions implements ETagView { } @Override - public Response> apply(RevisionResource rsrc) - throws OrmException { + public Response> apply(RevisionResource rsrc) throws OrmException { return Response.withMustRevalidate(delegate.format(rsrc)); } @@ -72,8 +69,7 @@ public class GetRevisionActions implements ETagView { rsrc.getChangeResource().prepareETag(h, user); h.putBoolean(Submit.wholeTopicEnabled(config)); ReviewDb db = dbProvider.get(); - ChangeSet cs = - mergeSuperSet.get().completeChangeSet(db, rsrc.getChange(), user); + ChangeSet cs = mergeSuperSet.get().completeChangeSet(db, rsrc.getChange(), user); for (ChangeData cd : cs.changes()) { changeResourceFactory.create(cd.changeControl()).prepareETag(h, user); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRobotComment.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRobotComment.java index c10cd2e6d1..d4d53adf58 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRobotComment.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRobotComment.java @@ -33,7 +33,6 @@ public class GetRobotComment implements RestReadView { @Override public RobotCommentInfo apply(RobotCommentResource rsrc) throws OrmException { - return commentJson.get().newRobotCommentFormatter() - .format(rsrc.getComment()); + return commentJson.get().newRobotCommentFormatter().format(rsrc.getComment()); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/HashtagsUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/HashtagsUtil.java index 39fdf3eedf..e9b0af28d6 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/HashtagsUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/HashtagsUtil.java @@ -16,7 +16,6 @@ package com.google.gerrit.server.change; import com.google.common.base.CharMatcher; import com.google.common.base.Strings; - import java.util.Collections; import java.util.HashSet; import java.util.Set; @@ -24,8 +23,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; public class HashtagsUtil { - private static final CharMatcher LEADER = - CharMatcher.whitespace().or(CharMatcher.is('#')); + private static final CharMatcher LEADER = CharMatcher.whitespace().or(CharMatcher.is('#')); private static final String PATTERN = "(?:\\s|\\A)#[\\p{L}[0-9]-_]+"; public static String cleanupHashtag(String hashtag) { @@ -45,8 +43,7 @@ public class HashtagsUtil { return result; } - static Set extractTags(Set input) - throws IllegalArgumentException { + static Set extractTags(Set input) throws IllegalArgumentException { if (input == null) { return Collections.emptySet(); } @@ -63,6 +60,5 @@ public class HashtagsUtil { return result; } - private HashtagsUtil() { - } + private HashtagsUtil() {} } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/IncludedIn.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/IncludedIn.java index 0c2d0790bb..8f8925a75c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/IncludedIn.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/IncludedIn.java @@ -26,7 +26,7 @@ import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.git.GitRepositoryManager; import com.google.inject.Inject; import com.google.inject.Singleton; - +import java.io.IOException; import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.lib.ObjectId; @@ -34,16 +34,13 @@ import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; -import java.io.IOException; - @Singleton public class IncludedIn { private final GitRepositoryManager repoManager; private final DynamicSet externalIncludedIn; @Inject - IncludedIn(GitRepositoryManager repoManager, - DynamicSet externalIncludedIn) { + IncludedIn(GitRepositoryManager repoManager, DynamicSet externalIncludedIn) { this.repoManager = repoManager; this.externalIncludedIn = externalIncludedIn; } @@ -63,17 +60,16 @@ public class IncludedIn { } IncludedInResolver.Result d = IncludedInResolver.resolve(r, rw, rev); - ListMultimap external = - MultimapBuilder.hashKeys().arrayListValues().build(); + ListMultimap external = MultimapBuilder.hashKeys().arrayListValues().build(); for (ExternalIncludedIn ext : externalIncludedIn) { - ListMultimap extIncludedIns = ext.getIncludedIn( - project.get(), rev.name(), d.getTags(), d.getBranches()); + ListMultimap extIncludedIns = + ext.getIncludedIn(project.get(), rev.name(), d.getTags(), d.getBranches()); if (extIncludedIns != null) { external.putAll(extIncludedIns); } } - return new IncludedInInfo(d.getBranches(), d.getTags(), - (!external.isEmpty() ? external.asMap() : null)); + return new IncludedInInfo( + d.getBranches(), d.getTags(), (!external.isEmpty() ? external.asMap() : null)); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/IncludedInResolver.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/IncludedInResolver.java index 7843b15979..14e1f92491 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/IncludedInResolver.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/IncludedInResolver.java @@ -17,7 +17,14 @@ package com.google.gerrit.server.change; import com.google.common.collect.LinkedListMultimap; import com.google.common.collect.ListMultimap; import com.google.common.collect.Lists; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.lib.Constants; @@ -30,25 +37,13 @@ import org.eclipse.jgit.revwalk.RevWalk; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -/** - * Resolve in which tags and branches a commit is included. - */ +/** Resolve in which tags and branches a commit is included. */ public class IncludedInResolver { - private static final Logger log = LoggerFactory - .getLogger(IncludedInResolver.class); + private static final Logger log = LoggerFactory.getLogger(IncludedInResolver.class); - public static Result resolve(final Repository repo, - final RevWalk rw, final RevCommit commit) throws IOException { + public static Result resolve(final Repository repo, final RevWalk rw, final RevCommit commit) + throws IOException { RevFlag flag = newFlag(rw); try { return new IncludedInResolver(repo, rw, commit, flag).resolve(); @@ -57,8 +52,9 @@ public class IncludedInResolver { } } - public static boolean includedInOne(final Repository repo, final RevWalk rw, - final RevCommit commit, final Collection refs) throws IOException { + public static boolean includedInOne( + final Repository repo, final RevWalk rw, final RevCommit commit, final Collection refs) + throws IOException { RevFlag flag = newFlag(rw); try { return new IncludedInResolver(repo, rw, commit, flag).includedInOne(refs); @@ -79,8 +75,8 @@ public class IncludedInResolver { private ListMultimap commitToRef; private List tipsByCommitTime; - private IncludedInResolver(Repository repo, RevWalk rw, RevCommit target, - RevFlag containsTarget) { + private IncludedInResolver( + Repository repo, RevWalk rw, RevCommit target, RevFlag containsTarget) { this.repo = repo; this.rw = rw; this.target = target; @@ -91,16 +87,14 @@ public class IncludedInResolver { RefDatabase refDb = repo.getRefDatabase(); Collection tags = refDb.getRefs(Constants.R_TAGS).values(); Collection branches = refDb.getRefs(Constants.R_HEADS).values(); - List allTagsAndBranches = Lists.newArrayListWithCapacity( - tags.size() + branches.size()); + List allTagsAndBranches = Lists.newArrayListWithCapacity(tags.size() + branches.size()); allTagsAndBranches.addAll(tags); allTagsAndBranches.addAll(branches); parseCommits(allTagsAndBranches); Set allMatchingTagsAndBranches = includedIn(tipsByCommitTime, 0); Result detail = new Result(); - detail - .setBranches(getMatchingRefNames(allMatchingTagsAndBranches, branches)); + detail.setBranches(getMatchingRefNames(allMatchingTagsAndBranches, branches)); detail.setTags(getMatchingRefNames(allMatchingTagsAndBranches, tags)); return detail; @@ -117,9 +111,7 @@ public class IncludedInResolver { return !includedIn(after, 1).isEmpty() || !includedIn(before, 1).isEmpty(); } - /** - * Resolves which tip refs include the target commit. - */ + /** Resolves which tip refs include the target commit. */ private Set includedIn(final Collection tips, int limit) throws IOException, MissingObjectException, IncorrectObjectTypeException { Set result = new HashSet<>(); @@ -146,9 +138,10 @@ public class IncludedInResolver { /** * Partition the reference tips into two sets: + * *

    - *
  • before = commits with time < target.getCommitTime() - *
  • after = commits with time >= target.getCommitTime() + *
  • before = commits with time < target.getCommitTime() + *
  • after = commits with time >= target.getCommitTime() *
* * Each of the before/after lists is sorted by the the commit time. @@ -156,17 +149,19 @@ public class IncludedInResolver { * @param before * @param after */ - private void partition(final List before, - final List after) { - int insertionPoint = Collections.binarySearch(tipsByCommitTime, target, - new Comparator() { - @Override - public int compare(RevCommit c1, RevCommit c2) { - return c1.getCommitTime() - c2.getCommitTime(); - } - }); + private void partition(final List before, final List after) { + int insertionPoint = + Collections.binarySearch( + tipsByCommitTime, + target, + new Comparator() { + @Override + public int compare(RevCommit c1, RevCommit c2) { + return c1.getCommitTime() - c2.getCommitTime(); + } + }); if (insertionPoint < 0) { - insertionPoint = - (insertionPoint + 1); + insertionPoint = -(insertionPoint + 1); } if (0 < insertionPoint) { before.addAll(tipsByCommitTime.subList(0, insertionPoint)); @@ -177,11 +172,11 @@ public class IncludedInResolver { } /** - * Returns the short names of refs which are as well in the matchingRefs list - * as well as in the allRef list. + * Returns the short names of refs which are as well in the matchingRefs list as well as in the + * allRef list. */ - private static List getMatchingRefNames(Set matchingRefs, - Collection allRefs) { + private static List getMatchingRefNames( + Set matchingRefs, Collection allRefs) { List refNames = Lists.newArrayListWithCapacity(matchingRefs.size()); for (Ref r : allRefs) { if (matchingRefs.contains(r.getName())) { @@ -191,9 +186,7 @@ public class IncludedInResolver { return refNames; } - /** - * Parse commit of ref and store the relation between ref and commit. - */ + /** Parse commit of ref and store the relation between ref and commit. */ private void parseCommits(final Collection refs) throws IOException { if (commitToRef != null) { return; @@ -211,8 +204,13 @@ public class IncludedInResolver { } catch (MissingObjectException notHere) { // Log the problem with this branch, but keep processing. // - log.warn("Reference " + ref.getName() + " in " + repo.getDirectory() - + " points to dangling object " + ref.getObjectId()); + log.warn( + "Reference " + + ref.getName() + + " in " + + repo.getDirectory() + + " points to dangling object " + + ref.getObjectId()); continue; } commitToRef.put(commit, ref.getName()); @@ -222,20 +220,21 @@ public class IncludedInResolver { } private void sortOlderFirst(final List tips) { - Collections.sort(tips, new Comparator() { - @Override - public int compare(RevCommit c1, RevCommit c2) { - return c1.getCommitTime() - c2.getCommitTime(); - } - }); + Collections.sort( + tips, + new Comparator() { + @Override + public int compare(RevCommit c1, RevCommit c2) { + return c1.getCommitTime() - c2.getCommitTime(); + } + }); } public static class Result { private List branches; private List tags; - public Result() { - } + public Result() {} public void setBranches(final List b) { Collections.sort(b); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Index.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Index.java index 44a9975bfa..9257445972 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Index.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Index.java @@ -25,20 +25,17 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; @Singleton public class Index implements RestModifyView { - public static class Input { - } + public static class Input {} private final Provider db; private final ChangeIndexer indexer; @Inject - Index(Provider db, - ChangeIndexer indexer) { + Index(Provider db, ChangeIndexer indexer) { this.db = db; this.indexer = indexer; } @@ -47,10 +44,8 @@ public class Index implements RestModifyView { public Response apply(ChangeResource rsrc, Input input) throws IOException, AuthException, OrmException { ChangeControl ctl = rsrc.getControl(); - if (!ctl.isOwner() - && !ctl.getUser().getCapabilities().canMaintainServer()) { - throw new AuthException( - "Only change owner or server maintainer can reindex"); + if (!ctl.isOwner() && !ctl.getUser().getCapabilities().canMaintainServer()) { + throw new AuthException("Only change owner or server maintainer can reindex"); } indexer.index(db.get(), rsrc.getChange()); return Response.none(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/LimitedByteArrayOutputStream.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/LimitedByteArrayOutputStream.java index b34404fe0a..facc03c99c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/LimitedByteArrayOutputStream.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/LimitedByteArrayOutputStream.java @@ -26,9 +26,8 @@ class LimitedByteArrayOutputStream extends OutputStream { private final ByteArrayOutputStream buffer; /** - * Constructs a LimitedByteArrayOutputStream, which stores output - * in memory up to a certain specified size. When the output exceeds - * the specified size a LimitExceededException is thrown. + * Constructs a LimitedByteArrayOutputStream, which stores output in memory up to a certain + * specified size. When the output exceeds the specified size a LimitExceededException is thrown. * * @param max the maximum size in bytes which may be stored. * @param initial the initial size. It must be smaller than the max size. @@ -46,7 +45,7 @@ class LimitedByteArrayOutputStream extends OutputStream { } @Override - public void write(int b) throws IOException{ + public void write(int b) throws IOException { checkOversize(1); buffer.write(b); } @@ -57,9 +56,7 @@ class LimitedByteArrayOutputStream extends OutputStream { buffer.write(b, off, len); } - /** - * @return a newly allocated byte array with contents of the buffer. - */ + /** @return a newly allocated byte array with contents of the buffer. */ public byte[] toByteArray() { return buffer.toByteArray(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListChangeComments.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ListChangeComments.java index 32b5ae8e66..942c3b4655 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListChangeComments.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ListChangeComments.java @@ -24,7 +24,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.util.List; import java.util.Map; @@ -36,7 +35,8 @@ public class ListChangeComments implements RestReadView { private final CommentsUtil commentsUtil; @Inject - ListChangeComments(Provider db, + ListChangeComments( + Provider db, ChangeData.Factory changeDataFactory, Provider commentJson, CommentsUtil commentsUtil) { @@ -47,10 +47,11 @@ public class ListChangeComments implements RestReadView { } @Override - public Map> apply( - ChangeResource rsrc) throws AuthException, OrmException { + public Map> apply(ChangeResource rsrc) + throws AuthException, OrmException { ChangeData cd = changeDataFactory.create(db.get(), rsrc.getControl()); - return commentJson.get() + return commentJson + .get() .setFillAccounts(true) .setFillPatchSet(true) .newCommentFormatter() diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListChangeDrafts.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ListChangeDrafts.java index 6a3e237a1c..2bf7aa092e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListChangeDrafts.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ListChangeDrafts.java @@ -25,7 +25,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.util.List; import java.util.Map; @@ -37,7 +36,8 @@ public class ListChangeDrafts implements RestReadView { private final CommentsUtil commentsUtil; @Inject - ListChangeDrafts(Provider db, + ListChangeDrafts( + Provider db, ChangeData.Factory changeDataFactory, Provider commentJson, CommentsUtil commentsUtil) { @@ -48,17 +48,20 @@ public class ListChangeDrafts implements RestReadView { } @Override - public Map> apply( - ChangeResource rsrc) throws AuthException, OrmException { + public Map> apply(ChangeResource rsrc) + throws AuthException, OrmException { if (!rsrc.getControl().getUser().isIdentifiedUser()) { throw new AuthException("Authentication required"); } ChangeData cd = changeDataFactory.create(db.get(), rsrc.getControl()); - List drafts = commentsUtil.draftByChangeAuthor( - db.get(), cd.notes(), rsrc.getControl().getUser().getAccountId()); - return commentJson.get() + List drafts = + commentsUtil.draftByChangeAuthor( + db.get(), cd.notes(), rsrc.getControl().getUser().getAccountId()); + return commentJson + .get() .setFillAccounts(false) .setFillPatchSet(true) - .newCommentFormatter().format(drafts); + .newCommentFormatter() + .format(drafts); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListChangeRobotComments.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ListChangeRobotComments.java index abfe869eca..881c6f53c4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListChangeRobotComments.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ListChangeRobotComments.java @@ -23,7 +23,6 @@ import com.google.gerrit.server.query.change.ChangeData; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - import java.util.List; import java.util.Map; @@ -34,7 +33,8 @@ public class ListChangeRobotComments implements RestReadView { private final CommentsUtil commentsUtil; @Inject - ListChangeRobotComments(Provider db, + ListChangeRobotComments( + Provider db, ChangeData.Factory changeDataFactory, Provider commentJson, CommentsUtil commentsUtil) { @@ -45,14 +45,14 @@ public class ListChangeRobotComments implements RestReadView { } @Override - public Map> apply( - ChangeResource rsrc) throws AuthException, OrmException { + public Map> apply(ChangeResource rsrc) + throws AuthException, OrmException { ChangeData cd = changeDataFactory.create(db.get(), rsrc.getControl()); - return commentJson.get() + return commentJson + .get() .setFillAccounts(true) .setFillPatchSet(true) .newRobotCommentFormatter() .format(commentsUtil.robotCommentsByChange(cd.notes())); } } - diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListReviewers.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ListReviewers.java index ccbd552700..27ec89dc73 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListReviewers.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ListReviewers.java @@ -23,7 +23,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -36,7 +35,8 @@ class ListReviewers implements RestReadView { private final ReviewerResource.Factory resourceFactory; @Inject - ListReviewers(Provider dbProvider, + ListReviewers( + Provider dbProvider, ApprovalsUtil approvalsUtil, ReviewerResource.Factory resourceFactory, ReviewerJson json) { @@ -50,8 +50,7 @@ class ListReviewers implements RestReadView { public List apply(ChangeResource rsrc) throws OrmException { Map reviewers = new LinkedHashMap<>(); ReviewDb db = dbProvider.get(); - for (Account.Id accountId - : approvalsUtil.getReviewers(db, rsrc.getNotes()).all()) { + for (Account.Id accountId : approvalsUtil.getReviewers(db, rsrc.getNotes()).all()) { if (!reviewers.containsKey(accountId)) { reviewers.put(accountId, resourceFactory.create(rsrc, accountId)); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListRevisionComments.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ListRevisionComments.java index 8524b8e9a6..037a856318 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListRevisionComments.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ListRevisionComments.java @@ -26,9 +26,8 @@ import com.google.inject.Singleton; @Singleton public class ListRevisionComments extends ListRevisionDrafts { @Inject - ListRevisionComments(Provider db, - Provider commentJson, - CommentsUtil commentsUtil) { + ListRevisionComments( + Provider db, Provider commentJson, CommentsUtil commentsUtil) { super(db, commentJson, commentsUtil); } @@ -38,10 +37,8 @@ public class ListRevisionComments extends ListRevisionDrafts { } @Override - protected Iterable listComments(RevisionResource rsrc) - throws OrmException { + protected Iterable listComments(RevisionResource rsrc) throws OrmException { ChangeNotes notes = rsrc.getNotes(); - return commentsUtil.publishedByPatchSet(db.get(), notes, - rsrc.getPatchSet().getId()); + return commentsUtil.publishedByPatchSet(db.get(), notes, rsrc.getPatchSet().getId()); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListRevisionDrafts.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ListRevisionDrafts.java index 21d427ceb7..04636018ff 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListRevisionDrafts.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ListRevisionDrafts.java @@ -23,7 +23,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.util.List; import java.util.Map; @@ -34,18 +33,16 @@ public class ListRevisionDrafts implements RestReadView { protected final CommentsUtil commentsUtil; @Inject - ListRevisionDrafts(Provider db, - Provider commentJson, - CommentsUtil commentsUtil) { + ListRevisionDrafts( + Provider db, Provider commentJson, CommentsUtil commentsUtil) { this.db = db; this.commentJson = commentJson; this.commentsUtil = commentsUtil; } - protected Iterable listComments(RevisionResource rsrc) - throws OrmException { - return commentsUtil.draftByPatchSetAuthor(db.get(), rsrc.getPatchSet().getId(), - rsrc.getAccountId(), rsrc.getNotes()); + protected Iterable listComments(RevisionResource rsrc) throws OrmException { + return commentsUtil.draftByPatchSetAuthor( + db.get(), rsrc.getPatchSet().getId(), rsrc.getAccountId(), rsrc.getNotes()); } protected boolean includeAuthorInfo() { @@ -53,17 +50,19 @@ public class ListRevisionDrafts implements RestReadView { } @Override - public Map> apply(RevisionResource rsrc) - throws OrmException { - return commentJson.get() + public Map> apply(RevisionResource rsrc) throws OrmException { + return commentJson + .get() .setFillAccounts(includeAuthorInfo()) - .newCommentFormatter().format(listComments(rsrc)); + .newCommentFormatter() + .format(listComments(rsrc)); } - public List getComments(RevisionResource rsrc) - throws OrmException { - return commentJson.get() + public List getComments(RevisionResource rsrc) throws OrmException { + return commentJson + .get() .setFillAccounts(includeAuthorInfo()) - .newCommentFormatter().formatAsList(listComments(rsrc)); + .newCommentFormatter() + .formatAsList(listComments(rsrc)); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListRevisionReviewers.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ListRevisionReviewers.java index 5d9819e30e..d0c8ca0f25 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListRevisionReviewers.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ListRevisionReviewers.java @@ -24,7 +24,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -37,7 +36,8 @@ class ListRevisionReviewers implements RestReadView { private final ReviewerResource.Factory resourceFactory; @Inject - ListRevisionReviewers(Provider dbProvider, + ListRevisionReviewers( + Provider dbProvider, ApprovalsUtil approvalsUtil, ReviewerResource.Factory resourceFactory, ReviewerJson json) { @@ -48,17 +48,15 @@ class ListRevisionReviewers implements RestReadView { } @Override - public List apply(RevisionResource rsrc) throws OrmException, - MethodNotAllowedException { + public List apply(RevisionResource rsrc) + throws OrmException, MethodNotAllowedException { if (!rsrc.isCurrent()) { - throw new MethodNotAllowedException( - "Cannot list reviewers on non-current patch set"); + throw new MethodNotAllowedException("Cannot list reviewers on non-current patch set"); } Map reviewers = new LinkedHashMap<>(); ReviewDb db = dbProvider.get(); - for (Account.Id accountId - : approvalsUtil.getReviewers(db, rsrc.getNotes()).all()) { + for (Account.Id accountId : approvalsUtil.getReviewers(db, rsrc.getNotes()).all()) { if (!reviewers.containsKey(accountId)) { reviewers.put(accountId, resourceFactory.create(rsrc, accountId)); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListRobotComments.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ListRobotComments.java index 01ad9eebec..de2b91ac70 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListRobotComments.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ListRobotComments.java @@ -23,7 +23,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.util.List; import java.util.Map; @@ -34,34 +33,31 @@ public class ListRobotComments implements RestReadView { protected final CommentsUtil commentsUtil; @Inject - ListRobotComments(Provider db, - Provider commentJson, - CommentsUtil commentsUtil) { + ListRobotComments( + Provider db, Provider commentJson, CommentsUtil commentsUtil) { this.db = db; this.commentJson = commentJson; this.commentsUtil = commentsUtil; } @Override - public Map> apply(RevisionResource rsrc) - throws OrmException { - return commentJson.get() + public Map> apply(RevisionResource rsrc) throws OrmException { + return commentJson + .get() .setFillAccounts(true) .newRobotCommentFormatter() .format(listComments(rsrc)); } - public List getComments(RevisionResource rsrc) - throws OrmException { - return commentJson.get() + public List getComments(RevisionResource rsrc) throws OrmException { + return commentJson + .get() .setFillAccounts(true) .newRobotCommentFormatter() .formatAsList(listComments(rsrc)); } - private Iterable listComments(RevisionResource rsrc) - throws OrmException { - return commentsUtil.robotCommentsByPatchSet( - rsrc.getNotes(), rsrc.getPatchSet().getId()); + private Iterable listComments(RevisionResource rsrc) throws OrmException { + return commentsUtil.robotCommentsByPatchSet(rsrc.getNotes(), rsrc.getPatchSet().getId()); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityCache.java index 93c4ac3f7c..3a7f3ab2c2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityCache.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityCache.java @@ -16,7 +16,6 @@ package com.google.gerrit.server.change; import com.google.gerrit.extensions.client.SubmitType; import com.google.gerrit.reviewdb.client.Branch; - import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; @@ -25,21 +24,30 @@ import org.eclipse.jgit.lib.Repository; public interface MergeabilityCache { class NotImplemented implements MergeabilityCache { @Override - public boolean get(ObjectId commit, Ref intoRef, SubmitType submitType, - String mergeStrategy, Branch.NameKey dest, Repository repo) { + public boolean get( + ObjectId commit, + Ref intoRef, + SubmitType submitType, + String mergeStrategy, + Branch.NameKey dest, + Repository repo) { throw new UnsupportedOperationException("Mergeability checking disabled"); } @Override - public Boolean getIfPresent(ObjectId commit, Ref intoRef, - SubmitType submitType, String mergeStrategy) { + public Boolean getIfPresent( + ObjectId commit, Ref intoRef, SubmitType submitType, String mergeStrategy) { throw new UnsupportedOperationException("Mergeability checking disabled"); } } - boolean get(ObjectId commit, Ref intoRef, SubmitType submitType, - String mergeStrategy, Branch.NameKey dest, Repository repo); + boolean get( + ObjectId commit, + Ref intoRef, + SubmitType submitType, + String mergeStrategy, + Branch.NameKey dest, + Repository repo); - Boolean getIfPresent(ObjectId commit, Ref intoRef, - SubmitType submitType, String mergeStrategy); + Boolean getIfPresent(ObjectId commit, Ref intoRef, SubmitType submitType, String mergeStrategy); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityCacheImpl.java index a6e093588e..7d012772f7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityCacheImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityCacheImpl.java @@ -39,14 +39,6 @@ import com.google.inject.Inject; import com.google.inject.Module; import com.google.inject.Singleton; import com.google.inject.name.Named; - -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.Ref; -import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.revwalk.RevCommit; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; @@ -56,11 +48,16 @@ import java.util.Objects; import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Singleton public class MergeabilityCacheImpl implements MergeabilityCache { - private static final Logger log = - LoggerFactory.getLogger(MergeabilityCacheImpl.class); + private static final Logger log = LoggerFactory.getLogger(MergeabilityCacheImpl.class); private static final String CACHE_NAME = "mergeability"; @@ -75,7 +72,8 @@ public class MergeabilityCacheImpl implements MergeabilityCache { .build(); static { - checkState(SUBMIT_TYPES.size() == SubmitType.values().length, + checkState( + SUBMIT_TYPES.size() == SubmitType.values().length, "SubmitType <-> char BiMap needs updating"); } @@ -92,9 +90,7 @@ public class MergeabilityCacheImpl implements MergeabilityCache { } public static ObjectId toId(Ref ref) { - return ref != null && ref.getObjectId() != null - ? ref.getObjectId() - : ObjectId.zeroId(); + return ref != null && ref.getObjectId() != null ? ref.getObjectId() : ObjectId.zeroId(); } public static class EntryKey implements Serializable { @@ -105,8 +101,7 @@ public class MergeabilityCacheImpl implements MergeabilityCache { private SubmitType submitType; private String mergeStrategy; - public EntryKey(ObjectId commit, ObjectId into, SubmitType submitType, - String mergeStrategy) { + public EntryKey(ObjectId commit, ObjectId into, SubmitType submitType, String mergeStrategy) { this.commit = checkNotNull(commit, "commit"); this.into = checkNotNull(into, "into"); this.submitType = checkNotNull(submitType, "submitType"); @@ -191,8 +186,7 @@ public class MergeabilityCacheImpl implements MergeabilityCache { } @Override - public Boolean call() - throws NoSuchProjectException, IntegrationException, IOException { + public Boolean call() throws NoSuchProjectException, IntegrationException, IOException { if (key.into.equals(ObjectId.zeroId())) { return true; // Assume yes on new branch. } @@ -200,17 +194,17 @@ public class MergeabilityCacheImpl implements MergeabilityCache { Set accepted = SubmitDryRun.getAlreadyAccepted(repo, rw); accepted.add(rw.parseCommit(key.into)); accepted.addAll(Arrays.asList(rw.parseCommit(key.commit).getParents())); - return submitDryRun.run( - key.submitType, repo, rw, dest, key.into, key.commit, accepted); + return submitDryRun.run(key.submitType, repo, rw, dest, key.into, key.commit, accepted); } } } - public static class MergeabilityWeigher - implements Weigher { + public static class MergeabilityWeigher implements Weigher { @Override public int weigh(EntryKey k, Boolean v) { - return 16 + 2 * (16 + 20) + 3 * 8 // Size of EntryKey, 64-bit JVM. + return 16 + + 2 * (16 + 20) + + 3 * 8 // Size of EntryKey, 64-bit JVM. + 8; // Size of Boolean. } } @@ -220,31 +214,36 @@ public class MergeabilityCacheImpl implements MergeabilityCache { @Inject MergeabilityCacheImpl( - SubmitDryRun submitDryRun, - @Named(CACHE_NAME) Cache cache) { + SubmitDryRun submitDryRun, @Named(CACHE_NAME) Cache cache) { this.submitDryRun = submitDryRun; this.cache = cache; } @Override - public boolean get(ObjectId commit, Ref intoRef, SubmitType submitType, - String mergeStrategy, Branch.NameKey dest, Repository repo) { + public boolean get( + ObjectId commit, + Ref intoRef, + SubmitType submitType, + String mergeStrategy, + Branch.NameKey dest, + Repository repo) { ObjectId into = intoRef != null ? intoRef.getObjectId() : ObjectId.zeroId(); EntryKey key = new EntryKey(commit, into, submitType, mergeStrategy); try { return cache.get(key, new Loader(key, dest, repo)); } catch (ExecutionException | UncheckedExecutionException e) { - log.error(String.format("Error checking mergeability of %s into %s (%s)", - key.commit.name(), key.into.name(), key.submitType.name()), + log.error( + String.format( + "Error checking mergeability of %s into %s (%s)", + key.commit.name(), key.into.name(), key.submitType.name()), e.getCause()); return false; } } @Override - public Boolean getIfPresent(ObjectId commit, Ref intoRef, - SubmitType submitType, String mergeStrategy) { - return cache.getIfPresent( - new EntryKey(commit, toId(intoRef), submitType, mergeStrategy)); + public Boolean getIfPresent( + ObjectId commit, Ref intoRef, SubmitType submitType, String mergeStrategy) { + return cache.getIfPresent(new EntryKey(commit, toId(intoRef), submitType, mergeStrategy)); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Mergeable.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Mergeable.java index 7796d18c88..e5f9352bdf 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Mergeable.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Mergeable.java @@ -36,7 +36,11 @@ import com.google.gerrit.server.query.change.ChangeData; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; +import java.util.Objects; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Ref; @@ -45,17 +49,14 @@ import org.kohsuke.args4j.Option; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Map; -import java.util.Objects; - public class Mergeable implements RestReadView { private static final Logger log = LoggerFactory.getLogger(Mergeable.class); - @Option(name = "--other-branches", aliases = {"-o"}, - usage = "test mergeability for other branches too") + @Option( + name = "--other-branches", + aliases = {"-o"}, + usage = "test mergeability for other branches too" + ) private boolean otherBranches; private final GitRepositoryManager gitManager; @@ -67,7 +68,8 @@ public class Mergeable implements RestReadView { private final MergeabilityCache cache; @Inject - Mergeable(GitRepositoryManager gitManager, + Mergeable( + GitRepositoryManager gitManager, ProjectCache projectCache, MergeUtil.Factory mergeUtilFactory, ChangeData.Factory changeDataFactory, @@ -88,8 +90,9 @@ public class Mergeable implements RestReadView { } @Override - public MergeableInfo apply(RevisionResource resource) throws AuthException, - ResourceConflictException, BadRequestException, OrmException, IOException { + public MergeableInfo apply(RevisionResource resource) + throws AuthException, ResourceConflictException, BadRequestException, OrmException, + IOException { Change change = resource.getChange(); PatchSet ps = resource.getPatchSet(); MergeableInfo result = new MergeableInfo(); @@ -108,11 +111,9 @@ public class Mergeable implements RestReadView { ObjectId commit = toId(ps); Ref ref = git.getRefDatabase().exactRef(change.getDest().get()); ProjectState projectState = projectCache.get(change.getProject()); - String strategy = mergeUtilFactory.create(projectState) - .mergeStrategyName(); + String strategy = mergeUtilFactory.create(projectState).mergeStrategyName(); result.strategy = strategy; - result.mergeable = - isMergable(git, change, commit, ref, result.submitType, strategy); + result.mergeable = isMergable(git, change, commit, ref, result.submitType, strategy); if (otherBranches) { result.mergeableInto = new ArrayList<>(); @@ -126,8 +127,7 @@ public class Mergeable implements RestReadView { if (other == null) { continue; } - if (cache.get(commit, other, SubmitType.CHERRY_PICK, strategy, - change.getDest(), git)) { + if (cache.get(commit, other, SubmitType.CHERRY_PICK, strategy, change.getDest(), git)) { result.mergeableInto.add(other.getName().substring(prefixLen)); } } @@ -137,19 +137,22 @@ public class Mergeable implements RestReadView { return result; } - private SubmitType getSubmitType(ChangeData cd, PatchSet patchSet) - throws OrmException { - SubmitTypeRecord rec = - new SubmitRuleEvaluator(cd).setPatchSet(patchSet).getSubmitType(); + private SubmitType getSubmitType(ChangeData cd, PatchSet patchSet) throws OrmException { + SubmitTypeRecord rec = new SubmitRuleEvaluator(cd).setPatchSet(patchSet).getSubmitType(); if (rec.status != SubmitTypeRecord.Status.OK) { throw new OrmException("Submit type rule failed: " + rec); } return rec.type; } - private boolean isMergable(Repository git, Change change, ObjectId commit, - Ref ref, SubmitType submitType, String strategy) - throws IOException, OrmException { + private boolean isMergable( + Repository git, + Change change, + ObjectId commit, + Ref ref, + SubmitType submitType, + String strategy) + throws IOException, OrmException { if (commit == null) { return false; } @@ -158,8 +161,7 @@ public class Mergeable implements RestReadView { if (old != null) { return old; } - return refresh(change, commit, ref, submitType, - strategy, git, old); + return refresh(change, commit, ref, submitType, strategy, git, old); } private static ObjectId toId(PatchSet ps) { @@ -171,11 +173,16 @@ public class Mergeable implements RestReadView { } } - private boolean refresh(final Change change, ObjectId commit, - final Ref ref, SubmitType type, String strategy, Repository git, - Boolean old) throws OrmException, IOException { - final boolean mergeable = - cache.get(commit, ref, type, strategy, change.getDest(), git); + private boolean refresh( + final Change change, + ObjectId commit, + final Ref ref, + SubmitType type, + String strategy, + Repository git, + Boolean old) + throws OrmException, IOException { + final boolean mergeable = cache.get(commit, ref, type, strategy, change.getDest(), git); if (!Objects.equals(mergeable, old)) { invalidateETag(change.getId(), db.get()); indexer.index(db.get(), change); @@ -183,8 +190,7 @@ public class Mergeable implements RestReadView { return mergeable; } - private static void invalidateETag(Change.Id id, ReviewDb db) - throws OrmException { + private static void invalidateETag(Change.Id id, ReviewDb db) throws OrmException { // Empty update of Change to bump rowVersion, changing its ETag. // TODO(dborowitz): Include cache info in ETag somehow instead. db = ReviewDbUtil.unwrapDb(db); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Move.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Move.java index 4a3f45a345..09e3377eea 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Move.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Move.java @@ -45,15 +45,13 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; -import java.io.IOException; - @Singleton public class Move implements RestModifyView { private final Provider dbProvider; @@ -65,7 +63,8 @@ public class Move implements RestModifyView { private final PatchSetUtil psUtil; @Inject - Move(Provider dbProvider, + Move( + Provider dbProvider, ChangeJson.Factory json, GitRepositoryManager repoManager, Provider queryProvider, @@ -90,8 +89,9 @@ public class Move implements RestModifyView { throw new AuthException("Move not permitted"); } - try (BatchUpdate u = batchUpdateFactory.create(dbProvider.get(), - req.getChange().getProject(), control.getUser(), TimeUtil.nowTs())) { + try (BatchUpdate u = + batchUpdateFactory.create( + dbProvider.get(), req.getChange().getProject(), control.getUser(), TimeUtil.nowTs())) { u.addOp(req.getChange().getId(), new Op(input)); u.execute(); } @@ -110,11 +110,10 @@ public class Move implements RestModifyView { } @Override - public boolean updateChange(ChangeContext ctx) throws OrmException, - ResourceConflictException, RepositoryNotFoundException, IOException { + public boolean updateChange(ChangeContext ctx) + throws OrmException, ResourceConflictException, RepositoryNotFoundException, IOException { change = ctx.getChange(); - if (change.getStatus() != Status.NEW - && change.getStatus() != Status.DRAFT) { + if (change.getStatus() != Status.NEW && change.getStatus() != Status.DRAFT) { throw new ResourceConflictException("Change is " + status(change)); } @@ -122,16 +121,16 @@ public class Move implements RestModifyView { newDestKey = new Branch.NameKey(projectKey, input.destinationBranch); Branch.NameKey changePrevDest = change.getDest(); if (changePrevDest.equals(newDestKey)) { - throw new ResourceConflictException( - "Change is already destined for the specified branch"); + throw new ResourceConflictException("Change is already destined for the specified branch"); } final PatchSet.Id patchSetId = change.currentPatchSetId(); try (Repository repo = repoManager.openRepository(projectKey); RevWalk revWalk = new RevWalk(repo)) { - RevCommit currPatchsetRevCommit = revWalk.parseCommit( - ObjectId.fromString(psUtil.current(ctx.getDb(), ctx.getNotes()) - .getRevision().get())); + RevCommit currPatchsetRevCommit = + revWalk.parseCommit( + ObjectId.fromString( + psUtil.current(ctx.getDb(), ctx.getNotes()).getRevision().get())); if (currPatchsetRevCommit.getParentCount() > 1) { throw new ResourceConflictException("Merge commit cannot be moved"); } @@ -145,17 +144,17 @@ public class Move implements RestModifyView { RevCommit refCommit = revWalk.parseCommit(refId); if (revWalk.isMergedInto(currPatchsetRevCommit, refCommit)) { throw new ResourceConflictException( - "Current patchset revision is reachable from tip of " - + input.destinationBranch); + "Current patchset revision is reachable from tip of " + input.destinationBranch); } } Change.Key changeKey = change.getKey(); - if (!asChanges(queryProvider.get().byBranchKey(newDestKey, changeKey)) - .isEmpty()) { + if (!asChanges(queryProvider.get().byBranchKey(newDestKey, changeKey)).isEmpty()) { throw new ResourceConflictException( - "Destination " + newDestKey.getShortName() - + " has a different change with same change key " + changeKey); + "Destination " + + newDestKey.getShortName() + + " has a different change with same change key " + + changeKey); } if (!change.currentPatchSetId().equals(patchSetId)) { @@ -176,8 +175,7 @@ public class Move implements RestModifyView { msgBuf.append(input.message); } ChangeMessage cmsg = - ChangeMessagesUtil.newMessage( - ctx, msgBuf.toString(), ChangeMessagesUtil.TAG_MOVE); + ChangeMessagesUtil.newMessage(ctx, msgBuf.toString(), ChangeMessagesUtil.TAG_MOVE); cmUtil.addChangeMessage(ctx.getDb(), update, cmsg); return true; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/NotifyUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/NotifyUtil.java index e5633cd224..8516615870 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/NotifyUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/NotifyUtil.java @@ -31,7 +31,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -43,14 +42,13 @@ public class NotifyUtil { private final AccountResolver accountResolver; @Inject - NotifyUtil(Provider dbProvider, - AccountResolver accountResolver) { + NotifyUtil(Provider dbProvider, AccountResolver accountResolver) { this.dbProvider = dbProvider; this.accountResolver = accountResolver; } - public static boolean shouldNotify(NotifyHandling notify, - @Nullable Map notifyDetails) { + public static boolean shouldNotify( + NotifyHandling notify, @Nullable Map notifyDetails) { if (!isNullOrEmpty(notifyDetails)) { return true; } @@ -58,8 +56,7 @@ public class NotifyUtil { return notify.compareTo(NotifyHandling.NONE) > 0; } - private static boolean isNullOrEmpty( - @Nullable Map notifyDetails) { + private static boolean isNullOrEmpty(@Nullable Map notifyDetails) { if (notifyDetails == null || notifyDetails.isEmpty()) { return true; } @@ -79,7 +76,7 @@ public class NotifyUtil { public ListMultimap resolveAccounts( @Nullable Map notifyDetails) - throws OrmException, BadRequestException { + throws OrmException, BadRequestException { if (isNullOrEmpty(notifyDetails)) { return ImmutableListMultimap.of(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PatchSetInserter.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PatchSetInserter.java index c9b4df2610..d7a043f742 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PatchSetInserter.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/PatchSetInserter.java @@ -52,24 +52,20 @@ import com.google.gerrit.server.ssh.NoSshInfo; import com.google.gwtorm.server.OrmException; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - +import java.io.IOException; +import java.util.Collections; +import java.util.List; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.transport.ReceiveCommand; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.Collections; -import java.util.List; - public class PatchSetInserter extends BatchUpdate.Op { - private static final Logger log = - LoggerFactory.getLogger(PatchSetInserter.class); + private static final Logger log = LoggerFactory.getLogger(PatchSetInserter.class); public interface Factory { - PatchSetInserter create(ChangeControl ctl, PatchSet.Id psId, - RevCommit commit); + PatchSetInserter create(ChangeControl ctl, PatchSet.Id psId, RevCommit commit); } // Injected fields. @@ -93,15 +89,13 @@ public class PatchSetInserter extends BatchUpdate.Op { // Fields exposed as setters. private String message; private String description; - private CommitValidators.Policy validatePolicy = - CommitValidators.Policy.GERRIT; + private CommitValidators.Policy validatePolicy = CommitValidators.Policy.GERRIT; private boolean checkAddPatchSetPermission = true; private boolean draft; private List groups = Collections.emptyList(); private boolean fireRevisionCreated = true; private NotifyHandling notify = NotifyHandling.ALL; - private ListMultimap accountsToNotify = - ImmutableListMultimap.of(); + private ListMultimap accountsToNotify = ImmutableListMultimap.of(); private boolean allowClosed; private boolean copyApprovals = true; @@ -113,7 +107,8 @@ public class PatchSetInserter extends BatchUpdate.Op { private ReviewerSet oldReviewers; @AssistedInject - public PatchSetInserter(ApprovalsUtil approvalsUtil, + public PatchSetInserter( + ApprovalsUtil approvalsUtil, ApprovalCopier approvalCopier, ChangeMessagesUtil cmUtil, PatchSetInfoFactory patchSetInfoFactory, @@ -157,8 +152,7 @@ public class PatchSetInserter extends BatchUpdate.Op { return this; } - public PatchSetInserter setCheckAddPatchSetPermission( - boolean checkAddPatchSetPermission) { + public PatchSetInserter setCheckAddPatchSetPermission(boolean checkAddPatchSetPermission) { this.checkAddPatchSetPermission = checkAddPatchSetPermission; return this; } @@ -214,8 +208,9 @@ public class PatchSetInserter extends BatchUpdate.Op { public void updateRepo(RepoContext ctx) throws AuthException, ResourceConflictException, IOException, OrmException { validate(ctx); - ctx.addRefUpdate(new ReceiveCommand(ObjectId.zeroId(), - commit, getPatchSetId().toRefName(), ReceiveCommand.Type.CREATE)); + ctx.addRefUpdate( + new ReceiveCommand( + ObjectId.zeroId(), commit, getPatchSetId().toRefName(), ReceiveCommand.Type.CREATE)); } @Override @@ -229,9 +224,10 @@ public class PatchSetInserter extends BatchUpdate.Op { update.setSubjectForCommit("Create patch set " + psId.get()); if (!change.getStatus().isOpen() && !allowClosed) { - throw new ResourceConflictException(String.format( - "Cannot create new patch set of change %s because it is %s", - change.getId(), change.getStatus().name().toLowerCase())); + throw new ResourceConflictException( + String.format( + "Cannot create new patch set of change %s because it is %s", + change.getId(), change.getStatus().name().toLowerCase())); } List newGroups = groups; @@ -241,17 +237,30 @@ public class PatchSetInserter extends BatchUpdate.Op { newGroups = prevPs.getGroups(); } } - patchSet = psUtil.insert(db, ctx.getRevWalk(), ctx.getUpdate(psId), - psId, commit, draft, newGroups, null, description); + patchSet = + psUtil.insert( + db, + ctx.getRevWalk(), + ctx.getUpdate(psId), + psId, + commit, + draft, + newGroups, + null, + description); if (notify != NotifyHandling.NONE) { oldReviewers = approvalsUtil.getReviewers(db, ctl.getNotes()); } if (message != null) { - changeMessage = ChangeMessagesUtil.newMessage( - patchSet.getId(), ctx.getUser(), ctx.getWhen(), message, - ChangeMessagesUtil.TAG_UPLOADED_PATCH_SET); + changeMessage = + ChangeMessagesUtil.newMessage( + patchSet.getId(), + ctx.getUser(), + ctx.getWhen(), + message, + ChangeMessagesUtil.TAG_UPLOADED_PATCH_SET); changeMessage.setMessage(message); } @@ -273,8 +282,7 @@ public class PatchSetInserter extends BatchUpdate.Op { public void postUpdate(Context ctx) throws OrmException { if (notify != NotifyHandling.NONE || !accountsToNotify.isEmpty()) { try { - ReplacePatchSetSender cm = replacePatchSetFactory.create( - ctx.getProject(), change.getId()); + ReplacePatchSetSender cm = replacePatchSetFactory.create(ctx.getProject(), change.getId()); cm.setFrom(ctx.getAccountId()); cm.setPatchSet(patchSet, patchSetInfo); cm.setChangeMessage(changeMessage.getMessage(), ctx.getWhen()); @@ -284,20 +292,17 @@ public class PatchSetInserter extends BatchUpdate.Op { cm.setAccountsToNotify(accountsToNotify); cm.send(); } catch (Exception err) { - log.error("Cannot send email for new patch set on change " - + change.getId(), err); + log.error("Cannot send email for new patch set on change " + change.getId(), err); } } if (fireRevisionCreated) { - revisionCreated.fire(change, patchSet, ctx.getAccount(), - ctx.getWhen(), notify); + revisionCreated.fire(change, patchSet, ctx.getAccount(), ctx.getWhen(), notify); } } private void validate(RepoContext ctx) - throws AuthException, ResourceConflictException, IOException, - OrmException { + throws AuthException, ResourceConflictException, IOException, OrmException { if (checkAddPatchSetPermission && !origCtl.canAddPatchSet(ctx.getDb())) { throw new AuthException("cannot add patch set"); } @@ -306,20 +311,20 @@ public class PatchSetInserter extends BatchUpdate.Op { } String refName = getPatchSetId().toRefName(); - CommitReceivedEvent event = new CommitReceivedEvent( - new ReceiveCommand( - ObjectId.zeroId(), - commit.getId(), - refName.substring(0, refName.lastIndexOf('/') + 1) + "new"), - origCtl.getProjectControl().getProject(), - origCtl.getRefControl().getRefName(), - commit, ctx.getIdentifiedUser()); + CommitReceivedEvent event = + new CommitReceivedEvent( + new ReceiveCommand( + ObjectId.zeroId(), + commit.getId(), + refName.substring(0, refName.lastIndexOf('/') + 1) + "new"), + origCtl.getProjectControl().getProject(), + origCtl.getRefControl().getRefName(), + commit, + ctx.getIdentifiedUser()); try { commitValidatorsFactory - .create( - validatePolicy, origCtl.getRefControl(), new NoSshInfo(), - ctx.getRepository()) + .create(validatePolicy, origCtl.getRefControl(), new NoSshInfo(), ctx.getRepository()) .validate(event); } catch (CommitValidationException e) { throw new ResourceConflictException(e.getFullMessage()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PostHashtags.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PostHashtags.java index 6d7720d25d..55e476b724 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PostHashtags.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/PostHashtags.java @@ -30,14 +30,14 @@ import com.google.inject.Singleton; @Singleton public class PostHashtags - implements RestModifyView, - UiAction { + implements RestModifyView, UiAction { private final Provider db; private final BatchUpdate.Factory batchUpdateFactory; private final SetHashtagsOp.Factory hashtagsFactory; @Inject - PostHashtags(Provider db, + PostHashtags( + Provider db, BatchUpdate.Factory batchUpdateFactory, SetHashtagsOp.Factory hashtagsFactory) { this.db = db; @@ -46,22 +46,22 @@ public class PostHashtags } @Override - public Response> apply(ChangeResource req, - HashtagsInput input) throws RestApiException, UpdateException { - try (BatchUpdate bu = batchUpdateFactory.create(db.get(), - req.getChange().getProject(), req.getControl().getUser(), - TimeUtil.nowTs())) { + public Response> apply(ChangeResource req, HashtagsInput input) + throws RestApiException, UpdateException { + try (BatchUpdate bu = + batchUpdateFactory.create( + db.get(), req.getChange().getProject(), req.getControl().getUser(), TimeUtil.nowTs())) { SetHashtagsOp op = hashtagsFactory.create(input); bu.addOp(req.getId(), op); bu.execute(); - return Response.> ok(op.getUpdatedHashtags()); + return Response.>ok(op.getUpdatedHashtags()); } } @Override public UiAction.Description getDescription(ChangeResource resource) { return new UiAction.Description() - .setLabel("Edit Hashtags") - .setVisible(resource.getControl().canEditHashtags()); + .setLabel("Edit Hashtags") + .setVisible(resource.getControl().canEditHashtags()); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReview.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReview.java index aaea82c99a..790c24145d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReview.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReview.java @@ -100,10 +100,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.sql.Timestamp; import java.util.ArrayList; @@ -117,6 +113,8 @@ import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Singleton public class PostReview implements RestModifyView { @@ -139,7 +137,8 @@ public class PostReview implements RestModifyView private final NotifyUtil notifyUtil; @Inject - PostReview(Provider db, + PostReview( + Provider db, BatchUpdate.Factory batchUpdateFactory, ChangesCollection changes, ChangeData.Factory changeDataFactory, @@ -177,8 +176,7 @@ public class PostReview implements RestModifyView return apply(revision, input, TimeUtil.nowTs()); } - public Response apply(RevisionResource revision, ReviewInput input, - Timestamp ts) + public Response apply(RevisionResource revision, ReviewInput input, Timestamp ts) throws RestApiException, UpdateException, OrmException, IOException { // Respect timestamp, but truncate at change created-on time. ts = Ordering.natural().max(ts, revision.getChange().getCreatedOn()); @@ -220,8 +218,8 @@ public class PostReview implements RestModifyView // Prevent notifications because setting reviewers is batched. reviewerInput.notify = NotifyHandling.NONE; - PostReviewers.Addition result = postReviewers.prepareApplication( - revision.getChangeResource(), reviewerInput, true); + PostReviewers.Addition result = + postReviewers.prepareApplication(revision.getChangeResource(), reviewerInput, true); reviewerJsonResults.put(reviewerInput.reviewer, result.result); if (result.result.error != null) { hasError = true; @@ -242,15 +240,16 @@ public class PostReview implements RestModifyView } output.labels = input.labels; - try (BatchUpdate bu = batchUpdateFactory.create(db.get(), - revision.getChange().getProject(), revision.getUser(), ts)) { + try (BatchUpdate bu = + batchUpdateFactory.create( + db.get(), revision.getChange().getProject(), revision.getUser(), ts)) { Account.Id id = bu.getUser().getAccountId(); boolean ccOrReviewer = input.labels != null && !input.labels.isEmpty(); if (!ccOrReviewer) { // Check if user was already CCed or reviewing prior to this review. - ReviewerSet currentReviewers = approvalsUtil.getReviewers( - db.get(), revision.getChangeResource().getNotes()); + ReviewerSet currentReviewers = + approvalsUtil.getReviewers(db.get(), revision.getChangeResource().getNotes()); ccOrReviewer = currentReviewers.all().contains(id); } @@ -281,29 +280,29 @@ public class PostReview implements RestModifyView // User posting this review isn't currently in the reviewer or CC list, // isn't being explicitly added, and isn't voting on any label. // Automatically CC them on this change so they receive replies. - PostReviewers.Addition selfAddition = - postReviewers.ccCurrentUser(bu.getUser(), revision); + PostReviewers.Addition selfAddition = postReviewers.ccCurrentUser(bu.getUser(), revision); bu.addOp(revision.getChange().getId(), selfAddition.op); } - bu.addOp(revision.getChange().getId(), - new Op(revision.getPatchSet().getId(), input, accountsToNotify, - reviewerResults)); + bu.addOp( + revision.getChange().getId(), + new Op(revision.getPatchSet().getId(), input, accountsToNotify, reviewerResults)); bu.execute(); for (PostReviewers.Addition reviewerResult : reviewerResults) { reviewerResult.gatherResults(); } - emailReviewers(revision.getChange(), reviewerResults, input.notify, - accountsToNotify); + emailReviewers(revision.getChange(), reviewerResults, input.notify, accountsToNotify); } return Response.ok(output); } - private void emailReviewers(Change change, - List reviewerAdditions, NotifyHandling notify, + private void emailReviewers( + Change change, + List reviewerAdditions, + NotifyHandling notify, ListMultimap accountsToNotify) { List to = new ArrayList<>(); List cc = new ArrayList<>(); @@ -318,12 +317,10 @@ public class PostReview implements RestModifyView } private RevisionResource onBehalfOf(RevisionResource rev, ReviewInput in) - throws BadRequestException, AuthException, UnprocessableEntityException, - OrmException { + throws BadRequestException, AuthException, UnprocessableEntityException, OrmException { if (in.labels == null || in.labels.isEmpty()) { - throw new AuthException(String.format( - "label required to post review on behalf of \"%s\"", - in.onBehalfOf)); + throw new AuthException( + String.format("label required to post review on behalf of \"%s\"", in.onBehalfOf)); } if (in.drafts == null) { in.drafts = DraftHandling.KEEP; @@ -332,15 +329,14 @@ public class PostReview implements RestModifyView throw new AuthException("not allowed to modify other user's drafts"); } - ChangeControl caller = rev.getControl(); Iterator> itr = in.labels.entrySet().iterator(); while (itr.hasNext()) { Map.Entry ent = itr.next(); LabelType type = caller.getLabelTypes().byLabel(ent.getKey()); if (type == null && in.strictLabels) { - throw new BadRequestException(String.format( - "label \"%s\" is not a configured label", ent.getKey())); + throw new BadRequestException( + String.format("label \"%s\" is not a configured label", ent.getKey())); } else if (type == null) { itr.remove(); continue; @@ -352,40 +348,40 @@ public class PostReview implements RestModifyView PermissionRange r = caller.getRange(Permission.forLabelAs(type.getName())); if (r == null || r.isEmpty() || !r.contains(ent.getValue())) { - throw new AuthException(String.format( - "not permitted to modify label \"%s\" on behalf of \"%s\"", - ent.getKey(), in.onBehalfOf)); + throw new AuthException( + String.format( + "not permitted to modify label \"%s\" on behalf of \"%s\"", + ent.getKey(), in.onBehalfOf)); } } if (in.labels.isEmpty()) { - throw new AuthException(String.format( - "label required to post review on behalf of \"%s\"", - in.onBehalfOf)); + throw new AuthException( + String.format("label required to post review on behalf of \"%s\"", in.onBehalfOf)); } - ChangeControl target = caller.forUser( - accounts.parseOnBehalfOf(caller.getUser(), in.onBehalfOf)); + ChangeControl target = + caller.forUser(accounts.parseOnBehalfOf(caller.getUser(), in.onBehalfOf)); if (!target.getRefControl().isVisible()) { - throw new UnprocessableEntityException(String.format( - "on_behalf_of account %s cannot see destination ref", - target.getUser().getAccountId())); + throw new UnprocessableEntityException( + String.format( + "on_behalf_of account %s cannot see destination ref", + target.getUser().getAccountId())); } return new RevisionResource(changes.parse(target), rev.getPatchSet()); } - private void checkLabels(RevisionResource revision, boolean strict, - Map labels) throws BadRequestException, AuthException { + private void checkLabels(RevisionResource revision, boolean strict, Map labels) + throws BadRequestException, AuthException { ChangeControl ctl = revision.getControl(); Iterator> itr = labels.entrySet().iterator(); while (itr.hasNext()) { Map.Entry ent = itr.next(); - LabelType lt = revision.getControl().getLabelTypes() - .byLabel(ent.getKey()); + LabelType lt = revision.getControl().getLabelTypes().byLabel(ent.getKey()); if (lt == null) { if (strict) { - throw new BadRequestException(String.format( - "label \"%s\" is not a configured label", ent.getKey())); + throw new BadRequestException( + String.format("label \"%s\" is not a configured label", ent.getKey())); } itr.remove(); continue; @@ -399,9 +395,8 @@ public class PostReview implements RestModifyView if (lt.getValue(ent.getValue()) == null) { if (strict) { - throw new BadRequestException(String.format( - "label \"%s\": %d is not a valid value", - ent.getKey(), ent.getValue())); + throw new BadRequestException( + String.format("label \"%s\": %d is not a valid value", ent.getKey(), ent.getValue())); } itr.remove(); continue; @@ -411,9 +406,9 @@ public class PostReview implements RestModifyView PermissionRange range = ctl.getRange(Permission.forLabel(name)); if (range == null || !range.contains(ent.getValue())) { if (strict) { - throw new AuthException(String.format( - "Applying label \"%s\": %d is restricted", - ent.getKey(), ent.getValue())); + throw new AuthException( + String.format( + "Applying label \"%s\": %d is restricted", ent.getKey(), ent.getValue())); } else if (range == null || range.isEmpty()) { ent.setValue((short) 0); } else { @@ -423,15 +418,14 @@ public class PostReview implements RestModifyView } } - private void checkComments(RevisionResource revision, - Map> commentsPerPath) + private void checkComments( + RevisionResource revision, Map> commentsPerPath) throws BadRequestException, OrmException { cleanUpComments(commentsPerPath); ensureCommentsAreAddable(revision, commentsPerPath); } - private void cleanUpComments( - Map> commentsPerPath) { + private void cleanUpComments(Map> commentsPerPath) { Iterator> mapValueIterator = commentsPerPath.values().iterator(); while (mapValueIterator.hasNext()) { List comments = mapValueIterator.next(); @@ -471,8 +465,7 @@ public class PostReview implements RestModifyView for (Map.Entry> entry : commentsPerPath.entrySet()) { String path = entry.getKey(); PatchSet.Id patchSetId = revision.getChange().currentPatchSetId(); - ensurePathRefersToAvailableOrMagicFile(path, revisionFilePaths, - patchSetId); + ensurePathRefersToAvailableOrMagicFile(path, revisionFilePaths, patchSetId); List comments = entry.getValue(); for (T comment : comments) { @@ -482,42 +475,37 @@ public class PostReview implements RestModifyView } } - private Set getAffectedFilePaths(RevisionResource revision) - throws OrmException { - ChangeData changeData = changeDataFactory.create(db.get(), - revision.getControl()); + private Set getAffectedFilePaths(RevisionResource revision) throws OrmException { + ChangeData changeData = changeDataFactory.create(db.get(), revision.getControl()); return new HashSet<>(changeData.filePaths(revision.getPatchSet())); } - private void ensurePathRefersToAvailableOrMagicFile(String path, - Set availableFilePaths, PatchSet.Id patchSetId) + private void ensurePathRefersToAvailableOrMagicFile( + String path, Set availableFilePaths, PatchSet.Id patchSetId) throws BadRequestException { if (!availableFilePaths.contains(path) && !Patch.isMagic(path)) { - throw new BadRequestException(String.format( - "file %s not found in revision %s", path, patchSetId)); + throw new BadRequestException( + String.format("file %s not found in revision %s", path, patchSetId)); } } - private void ensureLineIsNonNegative(Integer line, String path) - throws BadRequestException { + private void ensureLineIsNonNegative(Integer line, String path) throws BadRequestException { if (line != null && line < 0) { - throw new BadRequestException(String.format( - "negative line number %d not allowed on %s", line, path)); + throw new BadRequestException( + String.format("negative line number %d not allowed on %s", line, path)); } } private void ensureCommentNotOnMagicFilesOfAutoMerge( String path, T comment) throws BadRequestException { - if (Patch.isMagic(path) && comment.side == Side.PARENT - && comment.parent == null) { - throw new BadRequestException( - String.format("cannot comment on %s on auto-merge", path)); + if (Patch.isMagic(path) && comment.side == Side.PARENT && comment.parent == null) { + throw new BadRequestException(String.format("cannot comment on %s on auto-merge", path)); } } - private void checkRobotComments(RevisionResource revision, - Map> in) - throws BadRequestException, OrmException { + private void checkRobotComments( + RevisionResource revision, Map> in) + throws BadRequestException, OrmException { for (Map.Entry> e : in.entrySet()) { String commentPath = e.getKey(); for (RobotCommentInput c : e.getValue()) { @@ -529,130 +517,146 @@ public class PostReview implements RestModifyView checkComments(revision, in); } - private void ensureRobotIdIsSet(String robotId, String commentPath) - throws BadRequestException { + private void ensureRobotIdIsSet(String robotId, String commentPath) throws BadRequestException { if (robotId == null) { - throw new BadRequestException(String - .format("robotId is missing for robot comment on %s", commentPath)); + throw new BadRequestException( + String.format("robotId is missing for robot comment on %s", commentPath)); } } private void ensureRobotRunIdIsSet(String robotRunId, String commentPath) throws BadRequestException { if (robotRunId == null) { - throw new BadRequestException(String - .format("robotRunId is missing for robot comment on %s", - commentPath)); + throw new BadRequestException( + String.format("robotRunId is missing for robot comment on %s", commentPath)); } } private void ensureFixSuggestionsAreAddable( - List fixSuggestionInfos, String commentPath) - throws BadRequestException { + List fixSuggestionInfos, String commentPath) throws BadRequestException { if (fixSuggestionInfos == null) { return; } for (FixSuggestionInfo fixSuggestionInfo : fixSuggestionInfos) { ensureDescriptionIsSet(commentPath, fixSuggestionInfo.description); - ensureFixReplacementsAreAddable(commentPath, - fixSuggestionInfo.replacements); + ensureFixReplacementsAreAddable(commentPath, fixSuggestionInfo.replacements); } } private void ensureDescriptionIsSet(String commentPath, String description) throws BadRequestException { if (description == null) { - throw new BadRequestException(String.format("A description is required " - + "for the suggested fix of the robot comment on %s", commentPath)); + throw new BadRequestException( + String.format( + "A description is required " + "for the suggested fix of the robot comment on %s", + commentPath)); } } - private void ensureFixReplacementsAreAddable(String commentPath, - List fixReplacementInfos) throws BadRequestException { + private void ensureFixReplacementsAreAddable( + String commentPath, List fixReplacementInfos) throws BadRequestException { ensureReplacementsArePresent(commentPath, fixReplacementInfos); for (FixReplacementInfo fixReplacementInfo : fixReplacementInfos) { ensureReplacementPathIsSet(commentPath, fixReplacementInfo.path); - ensureReplacementPathRefersToFileOfComment(commentPath, - fixReplacementInfo.path); + ensureReplacementPathRefersToFileOfComment(commentPath, fixReplacementInfo.path); ensureRangeIsSet(commentPath, fixReplacementInfo.range); ensureRangeIsValid(commentPath, fixReplacementInfo.range); ensureReplacementStringIsSet(commentPath, fixReplacementInfo.replacement); } } - private void ensureReplacementsArePresent(String commentPath, - List fixReplacementInfos) throws BadRequestException { + private void ensureReplacementsArePresent( + String commentPath, List fixReplacementInfos) throws BadRequestException { if (fixReplacementInfos == null || fixReplacementInfos.isEmpty()) { - throw new BadRequestException(String.format("At least one replacement is " - + "required for the suggested fix of the robot comment on %s", - commentPath)); + throw new BadRequestException( + String.format( + "At least one replacement is " + + "required for the suggested fix of the robot comment on %s", + commentPath)); } } - private void ensureReplacementPathIsSet(String commentPath, - String replacementPath) throws BadRequestException { + private void ensureReplacementPathIsSet(String commentPath, String replacementPath) + throws BadRequestException { if (replacementPath == null) { - throw new BadRequestException(String.format("A file path must be given " - + "for the replacement of the robot comment on %s", commentPath)); + throw new BadRequestException( + String.format( + "A file path must be given " + "for the replacement of the robot comment on %s", + commentPath)); } } - private void ensureReplacementPathRefersToFileOfComment(String commentPath, - String replacementPath) throws BadRequestException { + private void ensureReplacementPathRefersToFileOfComment( + String commentPath, String replacementPath) throws BadRequestException { if (!Objects.equals(commentPath, replacementPath)) { - throw new BadRequestException(String.format("Replacements may only be " - + "specified for the file %s on which the robot comment was added", - commentPath)); + throw new BadRequestException( + String.format( + "Replacements may only be " + + "specified for the file %s on which the robot comment was added", + commentPath)); } } - private void ensureRangeIsSet(String commentPath, - com.google.gerrit.extensions.client.Comment.Range range) + private void ensureRangeIsSet( + String commentPath, com.google.gerrit.extensions.client.Comment.Range range) throws BadRequestException { if (range == null) { - throw new BadRequestException(String.format("A range must be given " - + "for the replacement of the robot comment on %s", commentPath)); + throw new BadRequestException( + String.format( + "A range must be given " + "for the replacement of the robot comment on %s", + commentPath)); } } - private void ensureRangeIsValid(String commentPath, - com.google.gerrit.extensions.client.Comment.Range range) + private void ensureRangeIsValid( + String commentPath, com.google.gerrit.extensions.client.Comment.Range range) throws BadRequestException { if (range == null) { return; } if (!range.isValid()) { - throw new BadRequestException(String.format("Range (%s:%s - %s:%s) is not" - + " valid for the replacement of the robot comment on %s", - range.startLine, range.startCharacter, range.endLine, - range.endCharacter, commentPath)); + throw new BadRequestException( + String.format( + "Range (%s:%s - %s:%s) is not" + + " valid for the replacement of the robot comment on %s", + range.startLine, + range.startCharacter, + range.endLine, + range.endCharacter, + commentPath)); } } - private void ensureReplacementStringIsSet(String commentPath, - String replacement) throws BadRequestException { + private void ensureReplacementStringIsSet(String commentPath, String replacement) + throws BadRequestException { if (replacement == null) { - throw new BadRequestException(String.format("A content for replacement " - + "must be indicated for the replacement of the robot comment on %s", - commentPath)); + throw new BadRequestException( + String.format( + "A content for replacement " + + "must be indicated for the replacement of the robot comment on %s", + commentPath)); } } - /** - * Used to compare Comments with CommentInput comments. - */ + /** Used to compare Comments with CommentInput comments. */ @AutoValue abstract static class CommentSetEntry { - private static CommentSetEntry create(String filename, int patchSetId, - Integer line, Side side, HashCode message, Comment.Range range) { - return new AutoValue_PostReview_CommentSetEntry(filename, patchSetId, - line, side, message, range); + private static CommentSetEntry create( + String filename, + int patchSetId, + Integer line, + Side side, + HashCode message, + Comment.Range range) { + return new AutoValue_PostReview_CommentSetEntry( + filename, patchSetId, line, side, message, range); } public static CommentSetEntry create(Comment comment) { - return create(comment.key.filename, + return create( + comment.key.filename, comment.key.patchSetId, comment.lineNbr, Side.fromShort(comment.side), @@ -661,11 +665,18 @@ public class PostReview implements RestModifyView } abstract String filename(); + abstract int patchSetId(); - @Nullable abstract Integer line(); + + @Nullable + abstract Integer line(); + abstract Side side(); + abstract HashCode message(); - @Nullable abstract Comment.Range range(); + + @Nullable + abstract Comment.Range range(); } private class Op extends BatchUpdate.Op { @@ -683,7 +694,9 @@ public class PostReview implements RestModifyView private Map approvals = new HashMap<>(); private Map oldApprovals = new HashMap<>(); - private Op(PatchSet.Id psId, ReviewInput in, + private Op( + PatchSet.Id psId, + ReviewInput in, ListMultimap accountsToNotify, List reviewerResults) { this.psId = psId; @@ -694,8 +707,7 @@ public class PostReview implements RestModifyView @Override public boolean updateChange(ChangeContext ctx) - throws OrmException, ResourceConflictException, - UnprocessableEntityException { + throws OrmException, ResourceConflictException, UnprocessableEntityException { user = ctx.getIdentifiedUser(); notes = ctx.getNotes(); ps = psUtil.get(ctx.getDb(), ctx.getNotes(), psId); @@ -712,22 +724,28 @@ public class PostReview implements RestModifyView if (message == null) { return; } - if (in.notify.compareTo(NotifyHandling.NONE) > 0 - || !accountsToNotify.isEmpty()) { - email.create( - in.notify, - accountsToNotify, - notes, - ps, - user, - message, - comments, - in.message, - labelDelta).sendAsync(); + if (in.notify.compareTo(NotifyHandling.NONE) > 0 || !accountsToNotify.isEmpty()) { + email + .create( + in.notify, + accountsToNotify, + notes, + ps, + user, + message, + comments, + in.message, + labelDelta) + .sendAsync(); } commentAdded.fire( - notes.getChange(), ps, user.getAccount(), message.getMessage(), - approvals, oldApprovals, ctx.getWhen()); + notes.getChange(), + ps, + user.getAccount(), + message.getMessage(), + approvals, + oldApprovals, + ctx.getWhen()); } private boolean insertComments(ChangeContext ctx) @@ -749,9 +767,8 @@ public class PostReview implements RestModifyView List toDel = new ArrayList<>(); List toPublish = new ArrayList<>(); - Set existingIds = in.omitDuplicateComments - ? readExistingComments(ctx) - : Collections.emptySet(); + Set existingIds = + in.omitDuplicateComments ? readExistingComments(ctx) : Collections.emptySet(); for (Map.Entry> ent : map.entrySet()) { String path = ent.getKey(); @@ -759,8 +776,7 @@ public class PostReview implements RestModifyView String parent = Url.decode(c.inReplyTo); Comment e = drafts.remove(Url.decode(c.id)); if (e == null) { - e = commentsUtil.newComment(ctx, path, psId, c.side(), c.message, - c.unresolved, parent); + e = commentsUtil.newComment(ctx, path, psId, c.side(), c.message, c.unresolved, parent); } else { e.writtenOn = ctx.getWhen(); e.side = c.side(); @@ -812,16 +828,13 @@ public class PostReview implements RestModifyView return !newRobotComments.isEmpty(); } - private List getNewRobotComments(ChangeContext ctx) - throws OrmException { + private List getNewRobotComments(ChangeContext ctx) throws OrmException { List toAdd = new ArrayList<>(in.robotComments.size()); - Set existingIds = in.omitDuplicateComments - ? readExistingRobotComments(ctx) - : Collections.emptySet(); + Set existingIds = + in.omitDuplicateComments ? readExistingRobotComments(ctx) : Collections.emptySet(); - for (Map.Entry> ent : - in.robotComments.entrySet()) { + for (Map.Entry> ent : in.robotComments.entrySet()) { String path = ent.getKey(); for (RobotCommentInput c : ent.getValue()) { RobotComment e = createRobotCommentFromInput(ctx, path, c); @@ -834,20 +847,24 @@ public class PostReview implements RestModifyView return toAdd; } - private RobotComment createRobotCommentFromInput(ChangeContext ctx, - String path, RobotCommentInput robotCommentInput) throws OrmException { - RobotComment robotComment = commentsUtil.newRobotComment( - ctx, path, psId, robotCommentInput.side(), robotCommentInput.message, - robotCommentInput.robotId, robotCommentInput.robotRunId); + private RobotComment createRobotCommentFromInput( + ChangeContext ctx, String path, RobotCommentInput robotCommentInput) throws OrmException { + RobotComment robotComment = + commentsUtil.newRobotComment( + ctx, + path, + psId, + robotCommentInput.side(), + robotCommentInput.message, + robotCommentInput.robotId, + robotCommentInput.robotRunId); robotComment.parentUuid = Url.decode(robotCommentInput.inReplyTo); robotComment.url = robotCommentInput.url; robotComment.properties = robotCommentInput.properties; - robotComment.setLineNbrAndRange(robotCommentInput.line, - robotCommentInput.range); + robotComment.setLineNbrAndRange(robotCommentInput.line, robotCommentInput.range); robotComment.tag = in.tag; setCommentRevId(robotComment, patchListCache, ctx.getChange(), ps); - robotComment.fixSuggestions = - createFixSuggestionsFromInput(robotCommentInput.fixSuggestions); + robotComment.fixSuggestions = createFixSuggestionsFromInput(robotCommentInput.fixSuggestions); return robotComment; } @@ -857,72 +874,65 @@ public class PostReview implements RestModifyView return Collections.emptyList(); } - List fixSuggestions = - new ArrayList<>(fixSuggestionInfos.size()); + List fixSuggestions = new ArrayList<>(fixSuggestionInfos.size()); for (FixSuggestionInfo fixSuggestionInfo : fixSuggestionInfos) { fixSuggestions.add(createFixSuggestionFromInput(fixSuggestionInfo)); } return fixSuggestions; } - private FixSuggestion createFixSuggestionFromInput( - FixSuggestionInfo fixSuggestionInfo) { - List fixReplacements = - toFixReplacements(fixSuggestionInfo.replacements); + private FixSuggestion createFixSuggestionFromInput(FixSuggestionInfo fixSuggestionInfo) { + List fixReplacements = toFixReplacements(fixSuggestionInfo.replacements); String fixId = ChangeUtil.messageUuid(); - return new FixSuggestion(fixId, fixSuggestionInfo.description, - fixReplacements); + return new FixSuggestion(fixId, fixSuggestionInfo.description, fixReplacements); } - private List toFixReplacements( - List fixReplacementInfos) { - return fixReplacementInfos.stream() - .map(this::toFixReplacement) - .collect(Collectors.toList()); + private List toFixReplacements(List fixReplacementInfos) { + return fixReplacementInfos.stream().map(this::toFixReplacement).collect(Collectors.toList()); } - private FixReplacement toFixReplacement( - FixReplacementInfo fixReplacementInfo) { + private FixReplacement toFixReplacement(FixReplacementInfo fixReplacementInfo) { Comment.Range range = new Comment.Range(fixReplacementInfo.range); - return new FixReplacement(fixReplacementInfo.path, range, - fixReplacementInfo.replacement); + return new FixReplacement(fixReplacementInfo.path, range, fixReplacementInfo.replacement); } - private Set readExistingComments(ChangeContext ctx) - throws OrmException { - return commentsUtil.publishedByChange(ctx.getDb(), ctx.getNotes()) - .stream().map(CommentSetEntry::create).collect(toSet()); + private Set readExistingComments(ChangeContext ctx) throws OrmException { + return commentsUtil + .publishedByChange(ctx.getDb(), ctx.getNotes()) + .stream() + .map(CommentSetEntry::create) + .collect(toSet()); } - private Set readExistingRobotComments(ChangeContext ctx) - throws OrmException { - return commentsUtil.robotCommentsByChange(ctx.getNotes()) - .stream().map(CommentSetEntry::create).collect(toSet()); + private Set readExistingRobotComments(ChangeContext ctx) throws OrmException { + return commentsUtil + .robotCommentsByChange(ctx.getNotes()) + .stream() + .map(CommentSetEntry::create) + .collect(toSet()); } - private Map changeDrafts(ChangeContext ctx) - throws OrmException { + private Map changeDrafts(ChangeContext ctx) throws OrmException { Map drafts = new HashMap<>(); - for (Comment c : commentsUtil.draftByChangeAuthor( - ctx.getDb(), ctx.getNotes(), user.getAccountId())) { + for (Comment c : + commentsUtil.draftByChangeAuthor(ctx.getDb(), ctx.getNotes(), user.getAccountId())) { c.tag = in.tag; drafts.put(c.key.uuid, c); } return drafts; } - private Map patchSetDrafts(ChangeContext ctx) - throws OrmException { + private Map patchSetDrafts(ChangeContext ctx) throws OrmException { Map drafts = new HashMap<>(); - for (Comment c : commentsUtil.draftByPatchSetAuthor(ctx.getDb(), - psId, user.getAccountId(), ctx.getNotes())) { + for (Comment c : + commentsUtil.draftByPatchSetAuthor( + ctx.getDb(), psId, user.getAccountId(), ctx.getNotes())) { drafts.put(c.key.uuid, c); } return drafts; } - private Map approvalsByKey( - Collection patchsetApprovals) { + private Map approvalsByKey(Collection patchsetApprovals) { Map labels = new HashMap<>(); for (PatchSetApproval psa : patchsetApprovals) { labels.put(psa.getLabel(), psa.getValue()); @@ -930,8 +940,7 @@ public class PostReview implements RestModifyView return labels; } - private Comment publishComment(ChangeContext ctx, - Comment c, PatchSet ps) throws OrmException { + private Comment publishComment(ChangeContext ctx, Comment c, PatchSet ps) throws OrmException { c.writtenOn = ctx.getWhen(); c.tag = in.tag; // Draft may have been created by a different real user; copy the current @@ -942,9 +951,8 @@ public class PostReview implements RestModifyView return c; } - private void publishAllRevisions(ChangeContext ctx, - Map drafts, List ups) - throws OrmException { + private void publishAllRevisions( + ChangeContext ctx, Map drafts, List ups) throws OrmException { boolean needOtherPatchSets = false; for (Comment c : drafts.values()) { if (c.key.patchSetId != psId.get()) { @@ -952,17 +960,19 @@ public class PostReview implements RestModifyView break; } } - Map patchSets = needOtherPatchSets - ? psUtil.byChangeAsMap(ctx.getDb(), ctx.getNotes()) - : ImmutableMap.of(psId, ps); + Map patchSets = + needOtherPatchSets + ? psUtil.byChangeAsMap(ctx.getDb(), ctx.getNotes()) + : ImmutableMap.of(psId, ps); for (Comment e : drafts.values()) { - ups.add(publishComment(ctx, e, patchSets - .get(new PatchSet.Id(ctx.getChange().getId(), e.key.patchSetId)))); + ups.add( + publishComment( + ctx, e, patchSets.get(new PatchSet.Id(ctx.getChange().getId(), e.key.patchSetId)))); } } - private Map getAllApprovals(LabelTypes labelTypes, - Map current, Map input) { + private Map getAllApprovals( + LabelTypes labelTypes, Map current, Map input) { Map allApprovals = new HashMap<>(); for (LabelType lt : labelTypes.getLabelTypes()) { allApprovals.put(lt.getName(), (short) 0); @@ -1014,10 +1024,9 @@ public class PostReview implements RestModifyView return false; } - private boolean updateLabels(ChangeContext ctx) - throws OrmException, ResourceConflictException { - Map inLabels = MoreObjects.firstNonNull(in.labels, - Collections. emptyMap()); + private boolean updateLabels(ChangeContext ctx) throws OrmException, ResourceConflictException { + Map inLabels = + MoreObjects.firstNonNull(in.labels, Collections.emptyMap()); // If no labels were modified and change is closed, abort early. // This avoids trying to record a modified label caused by a user @@ -1030,10 +1039,10 @@ public class PostReview implements RestModifyView List ups = new ArrayList<>(); Map current = scanLabels(ctx, del); LabelTypes labelTypes = ctx.getControl().getLabelTypes(); - Map allApprovals = getAllApprovals(labelTypes, - approvalsByKey(current.values()), inLabels); - Map previous = getPreviousApprovals(allApprovals, - approvalsByKey(current.values())); + Map allApprovals = + getAllApprovals(labelTypes, approvalsByKey(current.values()), inLabels); + Map previous = + getPreviousApprovals(allApprovals, approvalsByKey(current.values())); ChangeUpdate update = ctx.getUpdate(psId); for (Map.Entry ent : allApprovals.entrySet()) { @@ -1069,8 +1078,7 @@ public class PostReview implements RestModifyView oldApprovals.put(normName, null); approvals.put(normName, c.getValue()); } else if (c == null) { - c = ApprovalsUtil.newApproval( - psId, user, lt.getLabelId(), ent.getValue(), ctx.getWhen()); + c = ApprovalsUtil.newApproval(psId, user, lt.getLabelId(), ent.getValue(), ctx.getWhen()); c.setTag(in.tag); c.setGranted(ctx.getWhen()); ups.add(c); @@ -1086,8 +1094,7 @@ public class PostReview implements RestModifyView // Return early if user is not a reviewer and not posting any labels. // This allows us to preserve their CC status. - if (current.isEmpty() && del.isEmpty() && ups.isEmpty() && - !isReviewer(ctx)) { + if (current.isEmpty() && del.isEmpty() && ups.isEmpty() && !isReviewer(ctx)) { return false; } @@ -1097,9 +1104,12 @@ public class PostReview implements RestModifyView return !del.isEmpty() || !ups.isEmpty(); } - private void validatePostSubmitLabels(ChangeContext ctx, - LabelTypes labelTypes, Map previous, - List ups, List del) + private void validatePostSubmitLabels( + ChangeContext ctx, + LabelTypes labelTypes, + Map previous, + List ups, + List del) throws ResourceConflictException { if (ctx.getChange().getStatus().isOpen()) { return; // Not closed, nothing to validate. @@ -1114,8 +1124,7 @@ public class PostReview implements RestModifyView // make it possible to take a merged change and make it no longer // submittable. List reduced = new ArrayList<>(ups.size() + del.size()); - List disallowed = - new ArrayList<>(labelTypes.getLabelTypes().size()); + List disallowed = new ArrayList<>(labelTypes.getLabelTypes().size()); for (PatchSetApproval psa : del) { LabelType lt = checkNotNull(labelTypes.byLabel(psa.getLabel())); @@ -1152,29 +1161,32 @@ public class PostReview implements RestModifyView if (!disallowed.isEmpty()) { throw new ResourceConflictException( "Voting on labels disallowed after submit: " - + disallowed.stream().distinct().sorted() - .collect(joining(", "))); + + disallowed.stream().distinct().sorted().collect(joining(", "))); } if (!reduced.isEmpty()) { throw new ResourceConflictException( "Cannot reduce vote on labels for closed change: " - + reduced.stream().map(p -> p.getLabel()).distinct().sorted() + + reduced + .stream() + .map(p -> p.getLabel()) + .distinct() + .sorted() .collect(joining(", "))); } } - private void forceCallerAsReviewer(ChangeContext ctx, - Map current, List ups, + private void forceCallerAsReviewer( + ChangeContext ctx, + Map current, + List ups, List del) { if (current.isEmpty() && ups.isEmpty()) { // TODO Find another way to link reviewers to changes. if (del.isEmpty()) { // If no existing label is being set to 0, hack in the caller // as a reviewer by picking the first server-wide LabelType. - LabelId labelId = ctx.getControl().getLabelTypes().getLabelTypes() - .get(0).getLabelId(); - PatchSetApproval c = ApprovalsUtil.newApproval( - psId, user, labelId, 0, ctx.getWhen()); + LabelId labelId = ctx.getControl().getLabelTypes().getLabelTypes().get(0).getLabelId(); + PatchSetApproval c = ApprovalsUtil.newApproval(psId, user, labelId, 0, ctx.getWhen()); c.setTag(in.tag); c.setGranted(ctx.getWhen()); ups.add(c); @@ -1188,17 +1200,16 @@ public class PostReview implements RestModifyView ups.add(c); } } - ctx.getUpdate(ctx.getChange().currentPatchSetId()) - .putReviewer(user.getAccountId(), REVIEWER); + ctx.getUpdate(ctx.getChange().currentPatchSetId()).putReviewer(user.getAccountId(), REVIEWER); } - private Map scanLabels(ChangeContext ctx, - List del) throws OrmException { + private Map scanLabels(ChangeContext ctx, List del) + throws OrmException { LabelTypes labelTypes = ctx.getControl().getLabelTypes(); Map current = new HashMap<>(); - for (PatchSetApproval a : approvalsUtil.byPatchSetUser( - ctx.getDb(), ctx.getControl(), psId, user.getAccountId())) { + for (PatchSetApproval a : + approvalsUtil.byPatchSetUser(ctx.getDb(), ctx.getControl(), psId, user.getAccountId())) { if (a.isLegacySubmit()) { continue; } @@ -1213,8 +1224,7 @@ public class PostReview implements RestModifyView return current; } - private boolean insertMessage(ChangeContext ctx) - throws OrmException { + private boolean insertMessage(ChangeContext ctx) throws OrmException { String msg = Strings.nullToEmpty(in.message).trim(); StringBuilder buf = new StringBuilder(); @@ -1233,9 +1243,9 @@ public class PostReview implements RestModifyView return false; } - message = ChangeMessagesUtil.newMessage( - psId, user, ctx.getWhen(), - "Patch Set " + psId.get() + ":" + buf, in.tag); + message = + ChangeMessagesUtil.newMessage( + psId, user, ctx.getWhen(), "Patch Set " + psId.get() + ":" + buf, in.tag); cmUtil.addChangeMessage(ctx.getDb(), ctx.getUpdate(psId), message); return true; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReviewers.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReviewers.java index 116f84e1d3..2873bd92a0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReviewers.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReviewers.java @@ -66,11 +66,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.Config; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.text.MessageFormat; import java.util.ArrayList; @@ -79,12 +74,13 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import org.eclipse.jgit.lib.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Singleton -public class PostReviewers - implements RestModifyView { - private static final Logger log = - LoggerFactory.getLogger(PostReviewers.class); +public class PostReviewers implements RestModifyView { + private static final Logger log = LoggerFactory.getLogger(PostReviewers.class); public static final int DEFAULT_MAX_REVIEWERS_WITHOUT_CHECK = 10; public static final int DEFAULT_MAX_REVIEWERS = 20; @@ -109,7 +105,8 @@ public class PostReviewers private final NotifyUtil notifyUtil; @Inject - PostReviewers(AccountsCollection accounts, + PostReviewers( + AccountsCollection accounts, ReviewerResource.Factory reviewerFactory, ApprovalsUtil approvalsUtil, PatchSetUtil psUtil, @@ -158,8 +155,9 @@ public class PostReviewers if (addition.op == null) { return addition.result; } - try (BatchUpdate bu = batchUpdateFactory.create(dbProvider.get(), - rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) { + try (BatchUpdate bu = + batchUpdateFactory.create( + dbProvider.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) { Change.Id id = rsrc.getChange().getId(); bu.addOp(id, addition.op); bu.execute(); @@ -168,9 +166,9 @@ public class PostReviewers return addition.result; } - public Addition prepareApplication(ChangeResource rsrc, - AddReviewerInput input, boolean allowGroup) - throws OrmException, RestApiException, IOException { + public Addition prepareApplication( + ChangeResource rsrc, AddReviewerInput input, boolean allowGroup) + throws OrmException, RestApiException, IOException { Account.Id accountId; try { accountId = accounts.parse(input.reviewer).getAccountId(); @@ -179,60 +177,73 @@ public class PostReviewers try { return putGroup(rsrc, input); } catch (UnprocessableEntityException e2) { - throw new UnprocessableEntityException(MessageFormat.format( - ChangeMessages.get().reviewerNotFoundUserOrGroup, - input.reviewer)); + throw new UnprocessableEntityException( + MessageFormat.format( + ChangeMessages.get().reviewerNotFoundUserOrGroup, input.reviewer)); } } - throw new UnprocessableEntityException(MessageFormat - .format(ChangeMessages.get().reviewerNotFoundUser, input.reviewer)); + throw new UnprocessableEntityException( + MessageFormat.format(ChangeMessages.get().reviewerNotFoundUser, input.reviewer)); } - return putAccount(input.reviewer, reviewerFactory.create(rsrc, accountId), - input.state(), input.notify, + return putAccount( + input.reviewer, + reviewerFactory.create(rsrc, accountId), + input.state(), + input.notify, notifyUtil.resolveAccounts(input.notifyDetails)); } Addition ccCurrentUser(CurrentUser user, RevisionResource revision) { return new Addition( - user.getUserName(), revision.getChangeResource(), + user.getUserName(), + revision.getChangeResource(), ImmutableMap.of(user.getAccountId(), revision.getControl()), - CC, NotifyHandling.NONE, ImmutableListMultimap.of()); + CC, + NotifyHandling.NONE, + ImmutableListMultimap.of()); } - private Addition putAccount(String reviewer, ReviewerResource rsrc, - ReviewerState state, NotifyHandling notify, + private Addition putAccount( + String reviewer, + ReviewerResource rsrc, + ReviewerState state, + NotifyHandling notify, ListMultimap accountsToNotify) - throws UnprocessableEntityException { + throws UnprocessableEntityException { Account member = rsrc.getReviewerUser().getAccount(); ChangeControl control = rsrc.getReviewerControl(); if (isValidReviewer(member, control)) { - return new Addition(reviewer, rsrc.getChangeResource(), - ImmutableMap.of(member.getId(), control), state, notify, + return new Addition( + reviewer, + rsrc.getChangeResource(), + ImmutableMap.of(member.getId(), control), + state, + notify, accountsToNotify); } if (member.isActive()) { - throw new UnprocessableEntityException( - String.format("Change not visible to %s", reviewer)); + throw new UnprocessableEntityException(String.format("Change not visible to %s", reviewer)); } - throw new UnprocessableEntityException( - String.format("Account of %s is inactive.", reviewer)); + throw new UnprocessableEntityException(String.format("Account of %s is inactive.", reviewer)); } private Addition putGroup(ChangeResource rsrc, AddReviewerInput input) throws RestApiException, OrmException, IOException { - GroupDescription.Basic group = - groupsCollection.parseInternal(input.reviewer); + GroupDescription.Basic group = groupsCollection.parseInternal(input.reviewer); if (!isLegalReviewerGroup(group.getGroupUUID())) { - return fail(input.reviewer, MessageFormat.format(ChangeMessages.get().groupIsNotAllowed, - group.getName())); + return fail( + input.reviewer, + MessageFormat.format(ChangeMessages.get().groupIsNotAllowed, group.getName())); } Map reviewers = new HashMap<>(); ChangeControl control = rsrc.getControl(); Set members; try { - members = groupMembersFactory.create(control.getUser()).listAccounts( - group.getGroupUUID(), control.getProject().getNameKey()); + members = + groupMembersFactory + .create(control.getUser()) + .listAccounts(group.getGroupUUID(), control.getProject().getNameKey()); } catch (NoSuchGroupException e) { throw new UnprocessableEntityException(e.getMessage()); } catch (NoSuchProjectException e) { @@ -241,22 +252,24 @@ public class PostReviewers // if maxAllowed is set to 0, it is allowed to add any number of // reviewers - int maxAllowed = - cfg.getInt("addreviewer", "maxAllowed", DEFAULT_MAX_REVIEWERS); + int maxAllowed = cfg.getInt("addreviewer", "maxAllowed", DEFAULT_MAX_REVIEWERS); if (maxAllowed > 0 && members.size() > maxAllowed) { - return fail(input.reviewer, MessageFormat.format( - ChangeMessages.get().groupHasTooManyMembers, group.getName())); + return fail( + input.reviewer, + MessageFormat.format(ChangeMessages.get().groupHasTooManyMembers, group.getName())); } // if maxWithoutCheck is set to 0, we never ask for confirmation - int maxWithoutConfirmation = cfg.getInt("addreviewer", - "maxWithoutConfirmation", DEFAULT_MAX_REVIEWERS_WITHOUT_CHECK); - if (!input.confirmed() && maxWithoutConfirmation > 0 + int maxWithoutConfirmation = + cfg.getInt("addreviewer", "maxWithoutConfirmation", DEFAULT_MAX_REVIEWERS_WITHOUT_CHECK); + if (!input.confirmed() + && maxWithoutConfirmation > 0 && members.size() > maxWithoutConfirmation) { - return fail(input.reviewer, true, + return fail( + input.reviewer, + true, MessageFormat.format( - ChangeMessages.get().groupManyMembersConfirmation, - group.getName(), members.size())); + ChangeMessages.get().groupManyMembersConfirmation, group.getName(), members.size())); } for (Account member : members) { @@ -265,8 +278,13 @@ public class PostReviewers } } - return new Addition(input.reviewer, rsrc, reviewers, input.state(), - input.notify, notifyUtil.resolveAccounts(input.notifyDetails)); + return new Addition( + input.reviewer, + rsrc, + reviewers, + input.state(), + input.notify, + notifyUtil.resolveAccounts(input.notifyDetails)); } private boolean isValidReviewer(Account member, ChangeControl control) { @@ -300,8 +318,11 @@ public class PostReviewers this(reviewer, null, null, REVIEWER, null, ImmutableListMultimap.of()); } - protected Addition(String reviewer, ChangeResource rsrc, - Map reviewers, ReviewerState state, + protected Addition( + String reviewer, + ChangeResource rsrc, + Map reviewers, + ReviewerState state, NotifyHandling notify, ListMultimap accountsToNotify) { result = new AddReviewerResult(reviewer); @@ -320,8 +341,7 @@ public class PostReviewers if (migration.readChanges() && op.state == CC) { result.ccs = Lists.newArrayListWithCapacity(op.addedCCs.size()); for (Account.Id accountId : op.addedCCs) { - result.ccs.add( - json.format(new ReviewerInfo(accountId.get()), reviewers.get(accountId))); + result.ccs.add(json.format(new ReviewerInfo(accountId.get()), reviewers.get(accountId))); } accountLoaderFactory.create(true).fill(result.ccs); } else { @@ -329,9 +349,10 @@ public class PostReviewers for (PatchSetApproval psa : op.addedReviewers) { // New reviewers have value 0, don't bother normalizing. result.reviewers.add( - json.format(new ReviewerInfo(psa.getAccountId().get()), - reviewers.get(psa.getAccountId()), - ImmutableList.of(psa))); + json.format( + new ReviewerInfo(psa.getAccountId().get()), + reviewers.get(psa.getAccountId()), + ImmutableList.of(psa))); } accountLoaderFactory.create(true).fill(result.reviewers); } @@ -349,8 +370,11 @@ public class PostReviewers private final ChangeResource rsrc; private PatchSet patchSet; - Op(ChangeResource rsrc, Map reviewers, - ReviewerState state, NotifyHandling notify, + Op( + ChangeResource rsrc, + Map reviewers, + ReviewerState state, + NotifyHandling notify, ListMultimap accountsToNotify) { this.rsrc = rsrc; this.reviewers = reviewers; @@ -363,17 +387,23 @@ public class PostReviewers public boolean updateChange(ChangeContext ctx) throws RestApiException, OrmException, IOException { if (migration.readChanges() && state == CC) { - addedCCs = approvalsUtil.addCcs(ctx.getNotes(), - ctx.getUpdate(ctx.getChange().currentPatchSetId()), - reviewers.keySet()); + addedCCs = + approvalsUtil.addCcs( + ctx.getNotes(), + ctx.getUpdate(ctx.getChange().currentPatchSetId()), + reviewers.keySet()); if (addedCCs.isEmpty()) { return false; } } else { - addedReviewers = approvalsUtil.addReviewers(ctx.getDb(), ctx.getNotes(), - ctx.getUpdate(ctx.getChange().currentPatchSetId()), - rsrc.getControl().getLabelTypes(), rsrc.getChange(), - reviewers.keySet()); + addedReviewers = + approvalsUtil.addReviewers( + ctx.getDb(), + ctx.getNotes(), + ctx.getUpdate(ctx.getChange().currentPatchSetId()), + rsrc.getControl().getLabelTypes(), + rsrc.getChange(), + reviewers.keySet()); if (addedReviewers.isEmpty()) { return false; } @@ -392,21 +422,28 @@ public class PostReviewers if (addedCCs == null) { addedCCs = new ArrayList<>(); } - emailReviewers(rsrc.getChange(), - Lists.transform(addedReviewers, r -> r.getAccountId()), addedCCs, - notify, accountsToNotify); + emailReviewers( + rsrc.getChange(), + Lists.transform(addedReviewers, r -> r.getAccountId()), + addedCCs, + notify, + accountsToNotify); if (!addedReviewers.isEmpty()) { - List reviewers = Lists.transform(addedReviewers, - psa -> accountCache.get(psa.getAccountId()).getAccount()); - reviewerAdded.fire(rsrc.getChange(), patchSet, reviewers, - ctx.getAccount(), ctx.getWhen()); + List reviewers = + Lists.transform( + addedReviewers, psa -> accountCache.get(psa.getAccountId()).getAccount()); + reviewerAdded.fire( + rsrc.getChange(), patchSet, reviewers, ctx.getAccount(), ctx.getWhen()); } } } } - public void emailReviewers(Change change, Collection added, - Collection copied, NotifyHandling notify, + public void emailReviewers( + Change change, + Collection added, + Collection copied, + NotifyHandling notify, ListMultimap accountsToNotify) { if (added.isEmpty() && copied.isEmpty()) { return; @@ -433,8 +470,7 @@ public class PostReviewers } try { - AddReviewerSender cm = addReviewerSenderFactory - .create(change.getProject(), change.getId()); + AddReviewerSender cm = addReviewerSenderFactory.create(change.getProject(), change.getId()); if (notify != null) { cm.setNotify(notify); } @@ -444,8 +480,7 @@ public class PostReviewers cm.addExtraCC(toCopy); cm.send(); } catch (Exception err) { - log.error("Cannot send email to new reviewers of change " - + change.getId(), err); + log.error("Cannot send email to new reviewers of change " + change.getId(), err); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PreviewSubmit.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PreviewSubmit.java index b783447fee..8b71eca3d7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PreviewSubmit.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/PreviewSubmit.java @@ -37,7 +37,10 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; +import java.io.OutputStream; +import java.util.Collection; +import java.util.Set; import org.apache.commons.compress.archivers.ArchiveOutputStream; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.NullProgressMonitor; @@ -46,11 +49,6 @@ import org.eclipse.jgit.transport.BundleWriter; import org.eclipse.jgit.transport.ReceiveCommand; import org.kohsuke.args4j.Option; -import java.io.IOException; -import java.io.OutputStream; -import java.util.Collection; -import java.util.Set; - @Singleton public class PreviewSubmit implements RestReadView { private static int MAX_DEFAULT_BUNDLE_SIZE = 100 * 1024 * 1024; @@ -67,15 +65,15 @@ public class PreviewSubmit implements RestReadView { } @Inject - PreviewSubmit(Provider dbProvider, + PreviewSubmit( + Provider dbProvider, Provider mergeOpProvider, AllowedFormats allowedFormats, @GerritServerConfig Config cfg) { this.dbProvider = dbProvider; this.mergeOpProvider = mergeOpProvider; this.allowedFormats = allowedFormats; - this.maxBundleSize = cfg.getInt("download", "maxBundleSize", - MAX_DEFAULT_BUNDLE_SIZE); + this.maxBundleSize = cfg.getInt("download", "maxBundleSize", MAX_DEFAULT_BUNDLE_SIZE); } @Override @@ -105,8 +103,7 @@ public class PreviewSubmit implements RestReadView { try (BinaryResult b = getBundles(rsrc, f)) { b.disableGzip() .setContentType(f.getMimeType()) - .setAttachmentName("submit-preview-" - + change.getChangeId() + "." + format); + .setAttachmentName("submit-preview-" + change.getChangeId() + "." + format); return b; } catch (OrmException | IOException e) { throw new RestApiException("Error generating submit preview"); @@ -126,38 +123,39 @@ public class PreviewSubmit implements RestReadView { final MergeOpRepoManager orm = op.getMergeOpRepoManager(); final Set projects = op.getAllProjects(); - bin = new BinaryResult() { - @Override - public void writeTo(OutputStream out) throws IOException { - try (ArchiveOutputStream aos = f.createArchiveOutputStream(out)) { - for (Project.NameKey p : projects) { - OpenRepo or = orm.getRepo(p); - BundleWriter bw = new BundleWriter(or.getRepo()); - bw.setObjectCountCallback(null); - bw.setPackConfig(null); - Collection refs = or.getUpdate().getRefUpdates(); - for (ReceiveCommand r : refs) { - bw.include(r.getRefName(), r.getNewId()); - ObjectId oldId = r.getOldId(); - if (!oldId.equals(ObjectId.zeroId())) { - bw.assume(or.getCodeReviewRevWalk().parseCommit(oldId)); - } - } - // This naming scheme cannot produce directory/file conflicts - // as no projects contains ".git/": - String path = p.get() + ".git"; + bin = + new BinaryResult() { + @Override + public void writeTo(OutputStream out) throws IOException { + try (ArchiveOutputStream aos = f.createArchiveOutputStream(out)) { + for (Project.NameKey p : projects) { + OpenRepo or = orm.getRepo(p); + BundleWriter bw = new BundleWriter(or.getRepo()); + bw.setObjectCountCallback(null); + bw.setPackConfig(null); + Collection refs = or.getUpdate().getRefUpdates(); + for (ReceiveCommand r : refs) { + bw.include(r.getRefName(), r.getNewId()); + ObjectId oldId = r.getOldId(); + if (!oldId.equals(ObjectId.zeroId())) { + bw.assume(or.getCodeReviewRevWalk().parseCommit(oldId)); + } + } + // This naming scheme cannot produce directory/file conflicts + // as no projects contains ".git/": + String path = p.get() + ".git"; - LimitedByteArrayOutputStream bos = - new LimitedByteArrayOutputStream(maxBundleSize, 1024); - bw.writeBundle(NullProgressMonitor.INSTANCE, bos); - f.putEntry(aos, path, bos.toByteArray()); + LimitedByteArrayOutputStream bos = + new LimitedByteArrayOutputStream(maxBundleSize, 1024); + bw.writeBundle(NullProgressMonitor.INSTANCE, bos); + f.putEntry(aos, path, bos.toByteArray()); + } + } catch (LimitExceededException e) { + throw new NotImplementedException( + "The bundle is too big to " + "generate at the server"); + } } - } catch (LimitExceededException e) { - throw new NotImplementedException("The bundle is too big to " - + "generate at the server"); - } - } - }; + }; } return bin; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PublishChangeEdit.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PublishChangeEdit.java index 9f61e65b40..89079fc312 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PublishChangeEdit.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/PublishChangeEdit.java @@ -33,14 +33,12 @@ import com.google.gerrit.server.git.UpdateException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.io.IOException; import java.util.Optional; @Singleton -public class PublishChangeEdit implements - ChildCollection, - AcceptsPost { +public class PublishChangeEdit + implements ChildCollection, AcceptsPost { private final Publish publish; @@ -71,15 +69,13 @@ public class PublishChangeEdit implements } @Singleton - public static class Publish - implements RestModifyView { + public static class Publish implements RestModifyView { private final ChangeEditUtil editUtil; private final NotifyUtil notifyUtil; @Inject - Publish(ChangeEditUtil editUtil, - NotifyUtil notifyUtil) { + Publish(ChangeEditUtil editUtil, NotifyUtil notifyUtil) { this.editUtil = editUtil; this.notifyUtil = notifyUtil; } @@ -87,23 +83,20 @@ public class PublishChangeEdit implements @Override public Response apply(ChangeResource rsrc, PublishChangeEditInput in) throws IOException, OrmException, RestApiException, UpdateException { - Capable r = - rsrc.getControl().getProjectControl().canPushToAtLeastOneRef(); + Capable r = rsrc.getControl().getProjectControl().canPushToAtLeastOneRef(); if (r != Capable.OK) { throw new AuthException(r.getMessage()); } Optional edit = editUtil.byChange(rsrc.getChange()); if (!edit.isPresent()) { - throw new ResourceConflictException(String.format( - "no edit exists for change %s", - rsrc.getChange().getChangeId())); + throw new ResourceConflictException( + String.format("no edit exists for change %s", rsrc.getChange().getChangeId())); } if (in == null) { in = new PublishChangeEditInput(); } - editUtil.publish(edit.get(), in.notify, - notifyUtil.resolveAccounts(in.notifyDetails)); + editUtil.publish(edit.get(), in.notify, notifyUtil.resolveAccounts(in.notifyDetails)); return Response.none(); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PublishDraftPatchSet.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PublishDraftPatchSet.java index 5a9a1e5565..5dbc757eb1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PublishDraftPatchSet.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/PublishDraftPatchSet.java @@ -53,25 +53,21 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; +import java.util.Collection; +import java.util.List; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.revwalk.FooterLine; import org.eclipse.jgit.revwalk.RevCommit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.Collection; -import java.util.List; - @Singleton -public class PublishDraftPatchSet implements RestModifyView, - UiAction { - private static final Logger log = - LoggerFactory.getLogger(PublishDraftPatchSet.class); +public class PublishDraftPatchSet + implements RestModifyView, UiAction { + private static final Logger log = LoggerFactory.getLogger(PublishDraftPatchSet.class); - public static class Input { - } + public static class Input {} private final AccountResolver accountResolver; private final ApprovalsUtil approvalsUtil; @@ -108,14 +104,13 @@ public class PublishDraftPatchSet implements RestModifyView apply(RevisionResource rsrc, Input input) throws RestApiException, UpdateException { - return apply(rsrc.getUser(), rsrc.getChange(), rsrc.getPatchSet().getId(), - rsrc.getPatchSet()); + return apply(rsrc.getUser(), rsrc.getChange(), rsrc.getPatchSet().getId(), rsrc.getPatchSet()); } - private Response apply(CurrentUser u, Change c, PatchSet.Id psId, - PatchSet ps) throws RestApiException, UpdateException { - try (BatchUpdate bu = updateFactory.create( - dbProvider.get(), c.getProject(), u, TimeUtil.nowTs())) { + private Response apply(CurrentUser u, Change c, PatchSet.Id psId, PatchSet ps) + throws RestApiException, UpdateException { + try (BatchUpdate bu = + updateFactory.create(dbProvider.get(), c.getProject(), u, TimeUtil.nowTs())) { bu.addOp(c.getId(), new Op(psId, ps)); bu.execute(); } @@ -126,18 +121,16 @@ public class PublishDraftPatchSet implements RestModifyView { + public static class CurrentRevision implements RestModifyView { private final PublishDraftPatchSet publish; @Inject @@ -148,8 +141,11 @@ public class PublishDraftPatchSet implements RestModifyView apply(ChangeResource rsrc, Input input) throws RestApiException, UpdateException { - return publish.apply(rsrc.getControl().getUser(), rsrc.getChange(), - rsrc.getChange().currentPatchSetId(), null); + return publish.apply( + rsrc.getControl().getUser(), + rsrc.getChange(), + rsrc.getChange().currentPatchSetId(), + null); } } @@ -195,36 +191,39 @@ public class PublishDraftPatchSet implements RestModifyView oldReviewers = approvalsUtil.getReviewers( - ctx.getDb(), ctx.getNotes()).all(); - RevCommit commit = ctx.getRevWalk().parseCommit( - ObjectId.fromString(patchSet.getRevision().get())); + Collection oldReviewers = + approvalsUtil.getReviewers(ctx.getDb(), ctx.getNotes()).all(); + RevCommit commit = + ctx.getRevWalk().parseCommit(ObjectId.fromString(patchSet.getRevision().get())); patchSetInfo = patchSetInfoFactory.get(ctx.getRevWalk(), commit, psId); List footerLines = commit.getFooterLines(); - recipients = getRecipientsFromFooters( - ctx.getDb(), accountResolver, patchSet.isDraft(), footerLines); + recipients = + getRecipientsFromFooters(ctx.getDb(), accountResolver, patchSet.isDraft(), footerLines); recipients.remove(ctx.getAccountId()); - approvalsUtil.addReviewers(ctx.getDb(), ctx.getUpdate(psId), labelTypes, - change, patchSet, patchSetInfo, recipients.getReviewers(), + approvalsUtil.addReviewers( + ctx.getDb(), + ctx.getUpdate(psId), + labelTypes, + change, + patchSet, + patchSetInfo, + recipients.getReviewers(), oldReviewers); } @Override public void postUpdate(Context ctx) throws OrmException { - draftPublished.fire(change, patchSet, ctx.getAccount(), - ctx.getWhen()); + draftPublished.fire(change, patchSet, ctx.getAccount(), ctx.getWhen()); if (patchSet.isDraft() && change.getStatus() == Change.Status.DRAFT) { // Skip emails if the patch set is still a draft. return; @@ -241,8 +240,7 @@ public class PublishDraftPatchSet implements RestModifyView, UiAction { +public class PutAssignee + implements RestModifyView, UiAction { private final SetAssigneeOp.Factory assigneeFactory; private final BatchUpdate.Factory batchUpdateFactory; @@ -49,7 +48,8 @@ public class PutAssignee implements private final AccountLoader.Factory accountLoaderFactory; @Inject - PutAssignee(SetAssigneeOp.Factory assigneeFactory, + PutAssignee( + SetAssigneeOp.Factory assigneeFactory, BatchUpdate.Factory batchUpdateFactory, Provider db, PostReviewers postReviewers, @@ -71,19 +71,20 @@ public class PutAssignee implements throw new BadRequestException("missing assignee field"); } - try (BatchUpdate bu = batchUpdateFactory.create(db.get(), - rsrc.getChange().getProject(), rsrc.getControl().getUser(), - TimeUtil.nowTs())) { + try (BatchUpdate bu = + batchUpdateFactory.create( + db.get(), + rsrc.getChange().getProject(), + rsrc.getControl().getUser(), + TimeUtil.nowTs())) { SetAssigneeOp op = assigneeFactory.create(input.assignee); bu.addOp(rsrc.getId(), op); - PostReviewers.Addition reviewersAddition = - addAssigneeAsCC(rsrc, input.assignee); + PostReviewers.Addition reviewersAddition = addAssigneeAsCC(rsrc, input.assignee); bu.addOp(rsrc.getId(), reviewersAddition.op); bu.execute(); - return Response.ok( - accountLoaderFactory.create(true).fillOne(op.getNewAssignee())); + return Response.ok(accountLoaderFactory.create(true).fillOne(op.getNewAssignee())); } } @@ -100,7 +101,7 @@ public class PutAssignee implements @Override public UiAction.Description getDescription(ChangeResource resource) { return new UiAction.Description() - .setLabel("Edit Assignee") - .setVisible(resource.getControl().canEditAssignee()); + .setLabel("Edit Assignee") + .setVisible(resource.getControl().canEditAssignee()); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PutDescription.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PutDescription.java index 5480fb463e..4ce3ccbaae 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PutDescription.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/PutDescription.java @@ -36,24 +36,23 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.util.Collections; @Singleton -public class PutDescription implements RestModifyView, UiAction { +public class PutDescription + implements RestModifyView, UiAction { private final Provider dbProvider; private final ChangeMessagesUtil cmUtil; private final BatchUpdate.Factory batchUpdateFactory; private final PatchSetUtil psUtil; public static class Input { - @DefaultInput - public String description; + @DefaultInput public String description; } @Inject - PutDescription(Provider dbProvider, + PutDescription( + Provider dbProvider, ChangeMessagesUtil cmUtil, BatchUpdate.Factory batchUpdateFactory, PatchSetUtil psUtil) { @@ -70,14 +69,15 @@ public class PutDescription implements RestModifyView db, + PutDraftComment( + Provider db, DeleteDraftComment delete, CommentsUtil commentsUtil, PatchSetUtil psUtil, @@ -74,8 +74,8 @@ public class PutDraftComment implements RestModifyView apply(DraftCommentResource rsrc, DraftInput in) throws - RestApiException, UpdateException, OrmException { + public Response apply(DraftCommentResource rsrc, DraftInput in) + throws RestApiException, UpdateException, OrmException { if (in == null || in.message == null || in.message.trim().isEmpty()) { return delete.apply(rsrc, null); } else if (in.id != null && !rsrc.getId().equals(in.id)) { @@ -86,15 +86,17 @@ public class PutDraftComment implements RestModifyView maybeComment = - commentsUtil.get(ctx.getDb(), ctx.getNotes(), key); + public boolean updateChange(ChangeContext ctx) throws ResourceNotFoundException, OrmException { + Optional maybeComment = commentsUtil.get(ctx.getDb(), ctx.getNotes(), key); if (!maybeComment.isPresent()) { // Disappeared out from under us. Can't easily fall back to insert, // because the input might be missing required fields. Just give up. @@ -125,25 +125,25 @@ public class PutDraftComment implements RestModifyView, - UiAction { +public class PutTopic implements RestModifyView, UiAction { private final Provider dbProvider; private final ChangeMessagesUtil cmUtil; private final BatchUpdate.Factory batchUpdateFactory; private final TopicEdited topicEdited; public static class Input { - @DefaultInput - public String topic; + @DefaultInput public String topic; } @Inject - PutTopic(Provider dbProvider, + PutTopic( + Provider dbProvider, ChangeMessagesUtil cmUtil, BatchUpdate.Factory batchUpdateFactory, TopicEdited topicEdited) { @@ -72,13 +71,14 @@ public class PutTopic implements RestModifyView, } Op op = new Op(input != null ? input : new Input()); - try (BatchUpdate u = batchUpdateFactory.create(dbProvider.get(), - req.getChange().getProject(), ctl.getUser(), TimeUtil.nowTs())) { + try (BatchUpdate u = + batchUpdateFactory.create( + dbProvider.get(), req.getChange().getProject(), ctl.getUser(), TimeUtil.nowTs())) { u.addOp(req.getId(), op); u.execute(); } return Strings.isNullOrEmpty(op.newTopicName) - ? Response. none() + ? Response.none() : Response.ok(op.newTopicName); } @@ -108,14 +108,13 @@ public class PutTopic implements RestModifyView, } else if (newTopicName.isEmpty()) { summary = "Topic " + oldTopicName + " removed"; } else { - summary = String.format("Topic changed from %s to %s", - oldTopicName, newTopicName); + summary = String.format("Topic changed from %s to %s", oldTopicName, newTopicName); } change.setTopic(Strings.emptyToNull(newTopicName)); update.setTopic(change.getTopic()); - ChangeMessage cmsg = ChangeMessagesUtil.newMessage(ctx, summary, - ChangeMessagesUtil.TAG_SET_TOPIC); + ChangeMessage cmsg = + ChangeMessagesUtil.newMessage(ctx, summary, ChangeMessagesUtil.TAG_SET_TOPIC); cmUtil.addChangeMessage(ctx.getDb(), update, cmsg); return true; } @@ -123,10 +122,7 @@ public class PutTopic implements RestModifyView, @Override public void postUpdate(Context ctx) { if (change != null) { - topicEdited.fire(change, - ctx.getAccount(), - oldTopicName, - ctx.getWhen()); + topicEdited.fire(change, ctx.getAccount(), oldTopicName, ctx.getWhen()); } } } @@ -134,7 +130,7 @@ public class PutTopic implements RestModifyView, @Override public UiAction.Description getDescription(ChangeResource resource) { return new UiAction.Description() - .setLabel("Edit Topic") - .setVisible(resource.getControl().canEditTopicName()); + .setLabel("Edit Topic") + .setVisible(resource.getControl().canEditTopicName()); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Rebase.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Rebase.java index 4b81c3164b..046712db30 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Rebase.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Rebase.java @@ -40,7 +40,8 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; +import java.util.EnumSet; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectInserter; import org.eclipse.jgit.lib.Repository; @@ -49,16 +50,12 @@ import org.eclipse.jgit.revwalk.RevWalk; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.EnumSet; - @Singleton -public class Rebase implements RestModifyView, - UiAction { +public class Rebase + implements RestModifyView, UiAction { private static final Logger log = LoggerFactory.getLogger(Rebase.class); - private static final EnumSet OPTIONS = EnumSet.of( - ListChangesOption.CURRENT_REVISION, - ListChangesOption.CURRENT_COMMIT); + private static final EnumSet OPTIONS = + EnumSet.of(ListChangesOption.CURRENT_REVISION, ListChangesOption.CURRENT_COMMIT); private final BatchUpdate.Factory updateFactory; private final GitRepositoryManager repoManager; @@ -68,7 +65,8 @@ public class Rebase implements RestModifyView, private final Provider dbProvider; @Inject - public Rebase(BatchUpdate.Factory updateFactory, + public Rebase( + BatchUpdate.Factory updateFactory, GitRepositoryManager repoManager, RebaseChangeOp.Factory rebaseFactory, RebaseUtil rebaseUtil, @@ -84,39 +82,40 @@ public class Rebase implements RestModifyView, @Override public ChangeInfo apply(RevisionResource rsrc, RebaseInput input) - throws EmailException, OrmException, UpdateException, RestApiException, - IOException, NoSuchChangeException { + throws EmailException, OrmException, UpdateException, RestApiException, IOException, + NoSuchChangeException { ChangeControl control = rsrc.getControl(); Change change = rsrc.getChange(); try (Repository repo = repoManager.openRepository(change.getProject()); RevWalk rw = new RevWalk(repo); ObjectInserter oi = repo.newObjectInserter(); - BatchUpdate bu = updateFactory.create(dbProvider.get(), - change.getProject(), rsrc.getUser(), TimeUtil.nowTs())) { + BatchUpdate bu = + updateFactory.create( + dbProvider.get(), change.getProject(), rsrc.getUser(), TimeUtil.nowTs())) { if (!control.canRebase(dbProvider.get())) { throw new AuthException("rebase not permitted"); } else if (!change.getStatus().isOpen()) { - throw new ResourceConflictException("change is " - + change.getStatus().name().toLowerCase()); + throw new ResourceConflictException("change is " + change.getStatus().name().toLowerCase()); } else if (!hasOneParent(rw, rsrc.getPatchSet())) { throw new ResourceConflictException( "cannot rebase merge commits or commit with no ancestor"); } bu.setRepository(repo, rw, oi); - bu.addOp(change.getId(), rebaseFactory.create( - control, rsrc.getPatchSet(), - findBaseRev(rw, rsrc, input)) - .setForceContentMerge(true) - .setFireRevisionCreated(true) - .setValidatePolicy(CommitValidators.Policy.GERRIT)); + bu.addOp( + change.getId(), + rebaseFactory + .create(control, rsrc.getPatchSet(), findBaseRev(rw, rsrc, input)) + .setForceContentMerge(true) + .setFireRevisionCreated(true) + .setValidatePolicy(CommitValidators.Policy.GERRIT)); bu.execute(); } return json.create(OPTIONS).format(change.getProject(), change.getId()); } - private String findBaseRev(RevWalk rw, RevisionResource rsrc, - RebaseInput input) throws AuthException, ResourceConflictException, - OrmException, IOException, NoSuchChangeException { + private String findBaseRev(RevWalk rw, RevisionResource rsrc, RebaseInput input) + throws AuthException, ResourceConflictException, OrmException, IOException, + NoSuchChangeException { if (input == null || input.base == null) { return null; } @@ -149,18 +148,17 @@ public class Rebase implements RestModifyView, throw new ResourceConflictException( "base change is targeting wrong branch: " + baseChange.getDest()); } else if (baseChange.getStatus() == Status.ABANDONED) { - throw new ResourceConflictException( - "base change is abandoned: " + baseChange.getKey()); + throw new ResourceConflictException("base change is abandoned: " + baseChange.getKey()); } else if (isMergedInto(rw, rsrc.getPatchSet(), base.patchSet())) { throw new ResourceConflictException( - "base change " + baseChange.getKey() - + " is a descendant of the current change - recursion not allowed"); + "base change " + + baseChange.getKey() + + " is a descendant of the current change - recursion not allowed"); } return base.patchSet().getRevision().get(); } - private boolean isMergedInto(RevWalk rw, PatchSet base, PatchSet tip) - throws IOException { + private boolean isMergedInto(RevWalk rw, PatchSet base, PatchSet tip) throws IOException { ObjectId baseId = ObjectId.fromString(base.getRevision().get()); ObjectId tipId = ObjectId.fromString(tip.getRevision().get()); return rw.isMergedInto(rw.parseCommit(baseId), rw.parseCommit(tipId)); @@ -182,9 +180,8 @@ public class Rebase implements RestModifyView, } catch (OrmException e) { log.error("Cannot check canRebase status. Assuming false.", e); } - boolean visible = resource.getChange().getStatus().isOpen() - && resource.isCurrent() - && canRebase; + boolean visible = + resource.getChange().getStatus().isOpen() && resource.isCurrent() && canRebase; boolean enabled = true; if (visible) { @@ -193,21 +190,20 @@ public class Rebase implements RestModifyView, visible = hasOneParent(rw, resource.getPatchSet()); enabled = rebaseUtil.canRebase(patchSet, dest, repo, rw); } catch (IOException e) { - log.error("Failed to check if patch set can be rebased: " - + resource.getPatchSet(), e); + log.error("Failed to check if patch set can be rebased: " + resource.getPatchSet(), e); visible = false; } } - UiAction.Description descr = new UiAction.Description() - .setLabel("Rebase") - .setTitle("Rebase onto tip of branch or parent change") - .setVisible(visible) - .setEnabled(enabled); + UiAction.Description descr = + new UiAction.Description() + .setLabel("Rebase") + .setTitle("Rebase onto tip of branch or parent change") + .setVisible(visible) + .setEnabled(enabled); return descr; } - public static class CurrentRevision implements - RestModifyView { + public static class CurrentRevision implements RestModifyView { private final Rebase rebase; @Inject @@ -217,11 +213,9 @@ public class Rebase implements RestModifyView, @Override public ChangeInfo apply(ChangeResource rsrc, RebaseInput input) - throws EmailException, OrmException, UpdateException, RestApiException, - IOException, NoSuchChangeException { - PatchSet ps = - rebase.dbProvider.get().patchSets() - .get(rsrc.getChange().currentPatchSetId()); + throws EmailException, OrmException, UpdateException, RestApiException, IOException, + NoSuchChangeException { + PatchSet ps = rebase.dbProvider.get().patchSets().get(rsrc.getChange().currentPatchSetId()); if (ps == null) { throw new ResourceConflictException("current revision is missing"); } else if (!rsrc.getControl().isPatchVisible(ps, rebase.dbProvider.get())) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/RebaseChangeEdit.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/RebaseChangeEdit.java index db125eb1d1..7b673dd6b8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/RebaseChangeEdit.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/RebaseChangeEdit.java @@ -32,15 +32,12 @@ import com.google.gerrit.server.project.InvalidChangeOperationException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Singleton; - +import java.io.IOException; import org.eclipse.jgit.lib.Repository; -import java.io.IOException; - @Singleton -public class RebaseChangeEdit implements - ChildCollection, - AcceptsPost { +public class RebaseChangeEdit + implements ChildCollection, AcceptsPost { private final Rebase rebase; @@ -72,23 +69,20 @@ public class RebaseChangeEdit implements @Singleton public static class Rebase implements RestModifyView { - public static class Input { - } + public static class Input {} private final GitRepositoryManager repositoryManager; private final ChangeEditModifier editModifier; @Inject - Rebase(GitRepositoryManager repositoryManager, - ChangeEditModifier editModifier) { + Rebase(GitRepositoryManager repositoryManager, ChangeEditModifier editModifier) { this.repositoryManager = repositoryManager; this.editModifier = editModifier; } @Override public Response apply(ChangeResource rsrc, Rebase.Input in) - throws AuthException, ResourceConflictException, IOException, - OrmException { + throws AuthException, ResourceConflictException, IOException, OrmException { Project.NameKey project = rsrc.getProject(); try (Repository repository = repositoryManager.openRepository(project)) { editModifier.rebaseEdit(repository, rsrc.getControl()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/RebaseChangeOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/RebaseChangeOp.java index 91734ff5e1..89b1c6ba56 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/RebaseChangeOp.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/RebaseChangeOp.java @@ -38,7 +38,7 @@ import com.google.gerrit.server.project.ProjectState; import com.google.gwtorm.server.OrmException; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - +import java.io.IOException; import org.eclipse.jgit.lib.CommitBuilder; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.PersonIdent; @@ -46,12 +46,10 @@ import org.eclipse.jgit.merge.ThreeWayMerger; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; -import java.io.IOException; - public class RebaseChangeOp extends BatchUpdate.Op { public interface Factory { - RebaseChangeOp create(ChangeControl ctl, PatchSet originalPatchSet, - @Nullable String baseCommitish); + RebaseChangeOp create( + ChangeControl ctl, PatchSet originalPatchSet, @Nullable String baseCommitish); } private final PatchSetInserter.Factory patchSetInserterFactory; @@ -105,8 +103,7 @@ public class RebaseChangeOp extends BatchUpdate.Op { return this; } - public RebaseChangeOp setCheckAddPatchSetPermission( - boolean checkAddPatchSetPermission) { + public RebaseChangeOp setCheckAddPatchSetPermission(boolean checkAddPatchSetPermission) { this.checkAddPatchSetPermission = checkAddPatchSetPermission; return this; } @@ -126,8 +123,7 @@ public class RebaseChangeOp extends BatchUpdate.Op { return this; } - public RebaseChangeOp setDetailedCommitMessage( - boolean detailedCommitMessage) { + public RebaseChangeOp setDetailedCommitMessage(boolean detailedCommitMessage) { this.detailedCommitMessage = detailedCommitMessage; return this; } @@ -138,9 +134,9 @@ public class RebaseChangeOp extends BatchUpdate.Op { } @Override - public void updateRepo(RepoContext ctx) throws MergeConflictException, - InvalidChangeOperationException, RestApiException, IOException, - OrmException, NoSuchChangeException { + public void updateRepo(RepoContext ctx) + throws MergeConflictException, InvalidChangeOperationException, RestApiException, IOException, + OrmException, NoSuchChangeException { // Ok that originalPatchSet was not read in a transaction, since we just // need its revision. RevId oldRev = originalPatchSet.getRevision(); @@ -151,44 +147,54 @@ public class RebaseChangeOp extends BatchUpdate.Op { RevCommit baseCommit; if (baseCommitish != null) { - baseCommit = rw.parseCommit(ctx.getRepository().resolve(baseCommitish)); + baseCommit = rw.parseCommit(ctx.getRepository().resolve(baseCommitish)); } else { - baseCommit = rw.parseCommit(rebaseUtil.findBaseRevision( - originalPatchSet, ctl.getChange().getDest(), - ctx.getRepository(), ctx.getRevWalk())); + baseCommit = + rw.parseCommit( + rebaseUtil.findBaseRevision( + originalPatchSet, + ctl.getChange().getDest(), + ctx.getRepository(), + ctx.getRevWalk())); } String newCommitMessage; if (detailedCommitMessage) { rw.parseBody(baseCommit); - newCommitMessage = newMergeUtil().createCommitMessageOnSubmit(original, - baseCommit, ctl, originalPatchSet.getId()); + newCommitMessage = + newMergeUtil() + .createCommitMessageOnSubmit(original, baseCommit, ctl, originalPatchSet.getId()); } else { newCommitMessage = original.getFullMessage(); } rebasedCommit = rebaseCommit(ctx, original, baseCommit, newCommitMessage); - RevId baseRevId = new RevId((baseCommitish != null) ? baseCommitish - : ObjectId.toString(baseCommit.getId())); - Base base = rebaseUtil.parseBase( - new RevisionResource( - changeResourceFactory.create(ctl), originalPatchSet), - baseRevId.get()); + RevId baseRevId = + new RevId((baseCommitish != null) ? baseCommitish : ObjectId.toString(baseCommit.getId())); + Base base = + rebaseUtil.parseBase( + new RevisionResource(changeResourceFactory.create(ctl), originalPatchSet), + baseRevId.get()); - rebasedPatchSetId = ChangeUtil.nextPatchSetId( - ctx.getRepository(), ctl.getChange().currentPatchSetId()); - patchSetInserter = patchSetInserterFactory - .create(ctl, rebasedPatchSetId, rebasedCommit) - .setDescription("Rebase") - .setDraft(originalPatchSet.isDraft()) - .setNotify(NotifyHandling.NONE) - .setFireRevisionCreated(fireRevisionCreated) - .setCopyApprovals(copyApprovals) - .setCheckAddPatchSetPermission(checkAddPatchSetPermission); + rebasedPatchSetId = + ChangeUtil.nextPatchSetId(ctx.getRepository(), ctl.getChange().currentPatchSetId()); + patchSetInserter = + patchSetInserterFactory + .create(ctl, rebasedPatchSetId, rebasedCommit) + .setDescription("Rebase") + .setDraft(originalPatchSet.isDraft()) + .setNotify(NotifyHandling.NONE) + .setFireRevisionCreated(fireRevisionCreated) + .setCopyApprovals(copyApprovals) + .setCheckAddPatchSetPermission(checkAddPatchSetPermission); if (postMessage) { - patchSetInserter.setMessage("Patch Set " + rebasedPatchSetId.get() - + ": Patch Set " + originalPatchSet.getId().get() + " was rebased"); + patchSetInserter.setMessage( + "Patch Set " + + rebasedPatchSetId.get() + + ": Patch Set " + + originalPatchSet.getId().get() + + " was rebased"); } if (base != null) { @@ -214,20 +220,17 @@ public class RebaseChangeOp extends BatchUpdate.Op { } public RevCommit getRebasedCommit() { - checkState(rebasedCommit != null, - "getRebasedCommit() only valid after updateRepo"); + checkState(rebasedCommit != null, "getRebasedCommit() only valid after updateRepo"); return rebasedCommit; } public PatchSet.Id getPatchSetId() { - checkState(rebasedPatchSetId != null, - "getPatchSetId() only valid after updateRepo"); + checkState(rebasedPatchSetId != null, "getPatchSetId() only valid after updateRepo"); return rebasedPatchSetId; } public PatchSet getPatchSet() { - checkState(rebasedPatchSet != null, - "getPatchSet() only valid after executing update"); + checkState(rebasedPatchSet != null, "getPatchSet() only valid after executing update"); return rebasedPatchSet; } @@ -257,8 +260,8 @@ public class RebaseChangeOp extends BatchUpdate.Op { throw new ResourceConflictException("Change is already up to date."); } - ThreeWayMerger merger = newMergeUtil().newThreeWayMerger( - ctx.getRepository(), ctx.getInserter()); + ThreeWayMerger merger = + newMergeUtil().newThreeWayMerger(ctx.getRepository(), ctx.getInserter()); merger.setBase(parentCommit); merger.merge(original, base); @@ -275,8 +278,7 @@ public class RebaseChangeOp extends BatchUpdate.Op { if (committerIdent != null) { cb.setCommitter(committerIdent); } else { - cb.setCommitter(ctx.getIdentifiedUser() - .newCommitterIdent(ctx.getWhen(), ctx.getTimeZone())); + cb.setCommitter(ctx.getIdentifiedUser().newCommitterIdent(ctx.getWhen(), ctx.getTimeZone())); } ObjectId objectId = ctx.getInserter().insert(cb); ctx.getInserter().flush(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/RebaseUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/RebaseUtil.java index 4a9d19ca46..88fc1b3e62 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/RebaseUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/RebaseUtil.java @@ -33,7 +33,7 @@ import com.google.gerrit.server.query.change.InternalChangeQuery; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - +import java.io.IOException; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; @@ -42,8 +42,6 @@ import org.eclipse.jgit.revwalk.RevWalk; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; - /** Utility methods related to rebasing changes. */ public class RebaseUtil { private static final Logger log = LoggerFactory.getLogger(RebaseUtil.class); @@ -54,7 +52,8 @@ public class RebaseUtil { private final PatchSetUtil psUtil; @Inject - RebaseUtil(Provider queryProvider, + RebaseUtil( + Provider queryProvider, ChangeNotes.Factory notesFactory, Provider dbProvider, PatchSetUtil psUtil) { @@ -64,17 +63,17 @@ public class RebaseUtil { this.psUtil = psUtil; } - public boolean canRebase(PatchSet patchSet, Branch.NameKey dest, - Repository git, RevWalk rw) { + public boolean canRebase(PatchSet patchSet, Branch.NameKey dest, Repository git, RevWalk rw) { try { findBaseRevision(patchSet, dest, git, rw); return true; } catch (RestApiException e) { return false; } catch (OrmException | IOException e) { - log.warn(String.format( - "Error checking if patch set %s on %s can be rebased", - patchSet.getId(), dest), e); + log.warn( + String.format( + "Error checking if patch set %s on %s can be rebased", patchSet.getId(), dest), + e); return false; } } @@ -89,6 +88,7 @@ public class RebaseUtil { } abstract ChangeControl control(); + abstract PatchSet patchSet(); } @@ -118,38 +118,32 @@ public class RebaseUtil { // Try parsing as SHA-1. Base ret = null; - for (ChangeData cd : queryProvider.get() - .byProjectCommit(rsrc.getProject(), base)) { + for (ChangeData cd : queryProvider.get().byProjectCommit(rsrc.getProject(), base)) { for (PatchSet ps : cd.patchSets()) { if (!ps.getRevision().matches(base)) { continue; } if (ret == null || ret.patchSet().getId().get() < ps.getId().get()) { - ret = Base.create( - rsrc.getControl().getProjectControl().controlFor(cd.notes()), - ps); + ret = Base.create(rsrc.getControl().getProjectControl().controlFor(cd.notes()), ps); } } } return ret; } - private ChangeControl controlFor(RevisionResource rsrc, Change.Id id) - throws OrmException { + private ChangeControl controlFor(RevisionResource rsrc, Change.Id id) throws OrmException { if (rsrc.getChange().getId().equals(id)) { return rsrc.getControl(); } - ChangeNotes notes = - notesFactory.createChecked(dbProvider.get(), rsrc.getProject(), id); + ChangeNotes notes = notesFactory.createChecked(dbProvider.get(), rsrc.getProject(), id); return rsrc.getControl().getProjectControl().controlFor(notes); } /** * Find the commit onto which a patch set should be rebased. - *

- * This is defined as the latest patch set of the change corresponding to - * this commit's parent, or the destination branch tip in the case where the - * parent's change is merged. + * + *

This is defined as the latest patch set of the change corresponding to this commit's parent, + * or the destination branch tip in the case where the parent's change is merged. * * @param patchSet patch set for which the new base commit should be found. * @param destBranch the destination branch. @@ -160,26 +154,23 @@ public class RebaseUtil { * @throws IOException if accessing the repository fails. * @throws OrmException if accessing the database fails. */ - ObjectId findBaseRevision(PatchSet patchSet, Branch.NameKey destBranch, - Repository git, RevWalk rw) + ObjectId findBaseRevision( + PatchSet patchSet, Branch.NameKey destBranch, Repository git, RevWalk rw) throws RestApiException, IOException, OrmException { String baseRev = null; - RevCommit commit = rw.parseCommit( - ObjectId.fromString(patchSet.getRevision().get())); + RevCommit commit = rw.parseCommit(ObjectId.fromString(patchSet.getRevision().get())); if (commit.getParentCount() > 1) { - throw new UnprocessableEntityException( - "Cannot rebase a change with multiple parents."); + throw new UnprocessableEntityException("Cannot rebase a change with multiple parents."); } else if (commit.getParentCount() == 0) { throw new UnprocessableEntityException( - "Cannot rebase a change without any parents" - + " (is this the initial commit?)."); + "Cannot rebase a change without any parents" + " (is this the initial commit?)."); } RevId parentRev = new RevId(commit.getParent(0).name()); - CHANGES: for (ChangeData cd : queryProvider.get() - .byBranchCommit(destBranch, parentRev.get())) { + CHANGES: + for (ChangeData cd : queryProvider.get().byBranchCommit(destBranch, parentRev.get())) { for (PatchSet depPatchSet : cd.patchSets()) { if (!depPatchSet.getRevision().equals(parentRev)) { continue; @@ -187,15 +178,13 @@ public class RebaseUtil { Change depChange = cd.change(); if (depChange.getStatus() == Status.ABANDONED) { throw new ResourceConflictException( - "Cannot rebase a change with an abandoned parent: " - + depChange.getKey()); + "Cannot rebase a change with an abandoned parent: " + depChange.getKey()); } if (depChange.getStatus().isOpen()) { if (depPatchSet.getId().equals(depChange.currentPatchSetId())) { throw new ResourceConflictException( - "Change is already based on the latest patch set of the" - + " dependent change."); + "Change is already based on the latest patch set of the" + " dependent change."); } baseRev = cd.currentPatchSet().getRevision().get(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Rebuild.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Rebuild.java index b9f44835b6..682b45fa5d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Rebuild.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Rebuild.java @@ -34,16 +34,13 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.eclipse.jgit.errors.ConfigInvalidException; - import java.io.IOException; import java.util.List; +import org.eclipse.jgit.errors.ConfigInvalidException; @Singleton public class Rebuild implements RestModifyView { - public static class Input { - } + public static class Input {} private final Provider db; private final NotesMigration migration; @@ -53,7 +50,8 @@ public class Rebuild implements RestModifyView { private final ChangeNotes.Factory notesFactory; @Inject - Rebuild(Provider db, + Rebuild( + Provider db, NotesMigration migration, ChangeRebuilder rebuilder, ChangeBundleReader bundleReader, @@ -69,11 +67,11 @@ public class Rebuild implements RestModifyView { @Override public BinaryResult apply(ChangeResource rsrc, Input input) - throws ResourceNotFoundException, IOException, OrmException, - ConfigInvalidException { + throws ResourceNotFoundException, IOException, OrmException, ConfigInvalidException { if (!migration.commitChangeWrites()) { throw new ResourceNotFoundException(); - } if (!migration.readChanges()) { + } + if (!migration.readChanges()) { // ChangeBundle#fromNotes currently doesn't work if reading isn't enabled, // so don't attempt a diff. rebuild(rsrc); @@ -82,29 +80,25 @@ public class Rebuild implements RestModifyView { // Not the same transaction as the rebuild, so may result in spurious diffs // in the case of races. This should be easy enough to detect by rerunning. - ChangeBundle reviewDbBundle = bundleReader.fromReviewDb( - ReviewDbUtil.unwrapDb(db.get()), rsrc.getId()); + ChangeBundle reviewDbBundle = + bundleReader.fromReviewDb(ReviewDbUtil.unwrapDb(db.get()), rsrc.getId()); rebuild(rsrc); - ChangeNotes notes = notesFactory.create( - db.get(), rsrc.getChange().getProject(), rsrc.getId()); + ChangeNotes notes = notesFactory.create(db.get(), rsrc.getChange().getProject(), rsrc.getId()); ChangeBundle noteDbBundle = ChangeBundle.fromNotes(commentsUtil, notes); List diffs = reviewDbBundle.differencesFrom(noteDbBundle); if (diffs.isEmpty()) { return BinaryResult.create("No differences between ReviewDb and NoteDb"); } return BinaryResult.create( - diffs.stream() - .collect(joining( - "\n", "Differences between ReviewDb and NoteDb:\n", "\n"))); + diffs.stream().collect(joining("\n", "Differences between ReviewDb and NoteDb:\n", "\n"))); } - private void rebuild(ChangeResource rsrc) throws ResourceNotFoundException, - OrmException, IOException { + private void rebuild(ChangeResource rsrc) + throws ResourceNotFoundException, OrmException, IOException { try { rebuilder.rebuild(db.get(), rsrc.getId()); } catch (NoSuchChangeException e) { - throw new ResourceNotFoundException( - IdString.fromDecoded(rsrc.getId().toString())); + throw new ResourceNotFoundException(IdString.fromDecoded(rsrc.getId().toString())); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/RelatedChangesSorter.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/RelatedChangesSorter.java index e7a346f072..4810a0267e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/RelatedChangesSorter.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/RelatedChangesSorter.java @@ -33,12 +33,6 @@ import com.google.gerrit.server.query.change.ChangeData; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.revwalk.RevCommit; -import org.eclipse.jgit.revwalk.RevWalk; - import java.io.IOException; import java.util.ArrayDeque; import java.util.ArrayList; @@ -51,6 +45,10 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.revwalk.RevWalk; @Singleton class RelatedChangesSorter { @@ -98,8 +96,7 @@ class RelatedChangesSorter { Collection ancestors = walkAncestors(ctl, parents, start); List descendants = walkDescendants(ctl, children, start, otherPatchSetsOfStart, ancestors); - List result = - new ArrayList<>(ancestors.size() + descendants.size() - 1); + List result = new ArrayList<>(ancestors.size() + descendants.size() - 1); result.addAll(Lists.reverse(descendants)); result.addAll(ancestors); return result; @@ -108,15 +105,17 @@ class RelatedChangesSorter { private Map collectById(List in) throws OrmException, IOException { Project.NameKey project = in.get(0).change().getProject(); - Map result = - Maps.newHashMapWithExpectedSize(in.size() * 3); + Map result = Maps.newHashMapWithExpectedSize(in.size() * 3); try (Repository repo = repoManager.openRepository(project); RevWalk rw = new RevWalk(repo)) { rw.setRetainBody(true); for (ChangeData cd : in) { - checkArgument(cd.change().getProject().equals(project), + checkArgument( + cd.change().getProject().equals(project), "Expected change %s in project %s, found %s", - cd.getId(), project, cd.change().getProject()); + cd.getId(), + project, + cd.change().getProject()); for (PatchSet ps : cd.patchSets()) { String id = ps.getRevision().get(); RevCommit c = rw.parseCommit(ObjectId.fromString(id)); @@ -128,8 +127,8 @@ class RelatedChangesSorter { return result; } - private static Collection walkAncestors(ProjectControl ctl, - ListMultimap parents, PatchSetData start) + private static Collection walkAncestors( + ProjectControl ctl, ListMultimap parents, PatchSetData start) throws OrmException { LinkedHashSet result = new LinkedHashSet<>(); Deque pending = new ArrayDeque<>(); @@ -145,38 +144,41 @@ class RelatedChangesSorter { return result; } - private static List walkDescendants(ProjectControl ctl, + private static List walkDescendants( + ProjectControl ctl, ListMultimap children, - PatchSetData start, List otherPatchSetsOfStart, + PatchSetData start, + List otherPatchSetsOfStart, Iterable ancestors) throws OrmException { Set alreadyEmittedChanges = new HashSet<>(); addAllChangeIds(alreadyEmittedChanges, ancestors); // Prefer descendants found by following the original patch set passed in. - List result = walkDescendentsImpl( - ctl, alreadyEmittedChanges, children, ImmutableList.of(start)); + List result = + walkDescendentsImpl(ctl, alreadyEmittedChanges, children, ImmutableList.of(start)); addAllChangeIds(alreadyEmittedChanges, result); // Then, go back and add new indirect descendants found by following any // other patch sets of start. These show up after all direct descendants, // because we wouldn't know where in the walk to insert them. - result.addAll(walkDescendentsImpl( - ctl, alreadyEmittedChanges, children, otherPatchSetsOfStart)); + result.addAll(walkDescendentsImpl(ctl, alreadyEmittedChanges, children, otherPatchSetsOfStart)); return result; } - private static void addAllChangeIds(Collection changeIds, - Iterable psds) { + private static void addAllChangeIds( + Collection changeIds, Iterable psds) { for (PatchSetData psd : psds) { changeIds.add(psd.id()); } } - private static List walkDescendentsImpl(ProjectControl ctl, + private static List walkDescendentsImpl( + ProjectControl ctl, Set alreadyEmittedChanges, ListMultimap children, - List start) throws OrmException { + List start) + throws OrmException { if (start.isEmpty()) { return ImmutableList.of(); } @@ -218,12 +220,10 @@ class RelatedChangesSorter { return result; } - private static boolean isVisible(PatchSetData psd, ProjectControl ctl) - throws OrmException { + private static boolean isVisible(PatchSetData psd, ProjectControl ctl) throws OrmException { // Reuse existing project control rather than lazily creating a new one for // each ChangeData. - return ctl.controlFor(psd.data().notes()) - .isPatchVisible(psd.patchSet(), psd.data()); + return ctl.controlFor(psd.data().notes()).isPatchVisible(psd.patchSet(), psd.data()); } @AutoValue @@ -234,7 +234,9 @@ class RelatedChangesSorter { } abstract ChangeData data(); + abstract PatchSet patchSet(); + abstract RevCommit commit(); PatchSet.Id psId() { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Restore.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Restore.java index b1d9c0d906..2c373be3d4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Restore.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Restore.java @@ -43,13 +43,12 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Singleton -public class Restore implements RestModifyView, - UiAction { +public class Restore + implements RestModifyView, UiAction { private static final Logger log = LoggerFactory.getLogger(Restore.class); private final RestoredSender.Factory restoredSenderFactory; @@ -61,7 +60,8 @@ public class Restore implements RestModifyView, private final ChangeRestored changeRestored; @Inject - Restore(RestoredSender.Factory restoredSenderFactory, + Restore( + RestoredSender.Factory restoredSenderFactory, Provider dbProvider, ChangeJson.Factory json, ChangeMessagesUtil cmUtil, @@ -86,8 +86,9 @@ public class Restore implements RestModifyView, } Op op = new Op(input); - try (BatchUpdate u = batchUpdateFactory.create(dbProvider.get(), - req.getChange().getProject(), ctl.getUser(), TimeUtil.nowTs())) { + try (BatchUpdate u = + batchUpdateFactory.create( + dbProvider.get(), req.getChange().getProject(), ctl.getUser(), TimeUtil.nowTs())) { u.addOp(req.getId(), op).execute(); } return json.create(ChangeJson.NO_OPTIONS).format(op.change); @@ -105,8 +106,7 @@ public class Restore implements RestModifyView, } @Override - public boolean updateChange(ChangeContext ctx) throws OrmException, - ResourceConflictException { + public boolean updateChange(ChangeContext ctx) throws OrmException, ResourceConflictException { change = ctx.getChange(); if (change == null || change.getStatus() != Status.ABANDONED) { throw new ResourceConflictException("change is " + status(change)); @@ -130,25 +130,21 @@ public class Restore implements RestModifyView, msg.append("\n\n"); msg.append(input.message.trim()); } - return ChangeMessagesUtil.newMessage(ctx, msg.toString(), - ChangeMessagesUtil.TAG_RESTORE); + return ChangeMessagesUtil.newMessage(ctx, msg.toString(), ChangeMessagesUtil.TAG_RESTORE); } @Override public void postUpdate(Context ctx) throws OrmException { try { - ReplyToChangeSender cm = - restoredSenderFactory.create(ctx.getProject(), change.getId()); + ReplyToChangeSender cm = restoredSenderFactory.create(ctx.getProject(), change.getId()); cm.setFrom(ctx.getAccountId()); cm.setChangeMessage(message.getMessage(), ctx.getWhen()); cm.send(); } catch (Exception e) { log.error("Cannot email update for change " + change.getId(), e); } - changeRestored.fire(change, patchSet, - ctx.getAccount(), - Strings.emptyToNull(input.message), - ctx.getWhen()); + changeRestored.fire( + change, patchSet, ctx.getAccount(), Strings.emptyToNull(input.message), ctx.getWhen()); } } @@ -161,10 +157,9 @@ public class Restore implements RestModifyView, log.error("Cannot check canRestore status. Assuming false.", e); } return new UiAction.Description() - .setLabel("Restore") - .setTitle("Restore the change") - .setVisible(resource.getChange().getStatus() == Status.ABANDONED - && canRestore); + .setLabel("Restore") + .setTitle("Restore the change") + .setVisible(resource.getChange().getStatus() == Status.ABANDONED && canRestore); } private static String status(Change change) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Revert.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Revert.java index ab318c169b..95f64b7a4b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Revert.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Revert.java @@ -54,7 +54,11 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; +import java.sql.Timestamp; +import java.text.MessageFormat; +import java.util.HashSet; +import java.util.Set; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.CommitBuilder; import org.eclipse.jgit.lib.ObjectId; @@ -67,15 +71,9 @@ import org.eclipse.jgit.util.ChangeIdUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.sql.Timestamp; -import java.text.MessageFormat; -import java.util.HashSet; -import java.util.Set; - @Singleton -public class Revert implements RestModifyView, - UiAction { +public class Revert + implements RestModifyView, UiAction { private static final Logger log = LoggerFactory.getLogger(Revert.class); private final Provider db; @@ -92,7 +90,8 @@ public class Revert implements RestModifyView, private final ChangeReverted changeReverted; @Inject - Revert(Provider db, + Revert( + Provider db, GitRepositoryManager repoManager, ChangeInserter.Factory changeInserterFactory, ChangeMessagesUtil cmUtil, @@ -120,8 +119,7 @@ public class Revert implements RestModifyView, @Override public ChangeInfo apply(ChangeResource req, RevertInput input) - throws IOException, OrmException, RestApiException, - UpdateException, NoSuchChangeException { + throws IOException, OrmException, RestApiException, UpdateException, NoSuchChangeException { RefControl refControl = req.getControl().getRefControl(); ProjectControl projectControl = req.getControl().getProjectControl(); @@ -137,10 +135,8 @@ public class Revert implements RestModifyView, throw new ResourceConflictException("change is " + status(change)); } - Change.Id revertedChangeId = - revert(req.getControl(), Strings.emptyToNull(input.message)); - return json.create(ChangeJson.NO_OPTIONS).format(req.getProject(), - revertedChangeId); + Change.Id revertedChangeId = revert(req.getControl(), Strings.emptyToNull(input.message)); + return json.create(ChangeJson.NO_OPTIONS).format(req.getProject(), revertedChangeId); } private Change.Id revert(ChangeControl ctl, String message) @@ -164,8 +160,8 @@ public class Revert implements RestModifyView, Timestamp now = TimeUtil.nowTs(); PersonIdent committerIdent = new PersonIdent(serverIdent, now); - PersonIdent authorIdent = user.asIdentifiedUser() - .newCommitterIdent(now, committerIdent.getTimeZone()); + PersonIdent authorIdent = + user.asIdentifiedUser().newCommitterIdent(now, committerIdent.getTimeZone()); RevCommit parentToCommitToRevert = commitToRevert.getParent(0); revWalk.parseHeaders(parentToCommitToRevert); @@ -178,16 +174,21 @@ public class Revert implements RestModifyView, Change changeToRevert = ctl.getChange(); if (message == null) { - message = MessageFormat.format( - ChangeMessages.get().revertChangeDefaultMessage, - changeToRevert.getSubject(), patch.getRevision().get()); + message = + MessageFormat.format( + ChangeMessages.get().revertChangeDefaultMessage, + changeToRevert.getSubject(), + patch.getRevision().get()); } ObjectId computedChangeId = - ChangeIdUtil.computeChangeId(parentToCommitToRevert.getTree(), - commitToRevert, authorIdent, committerIdent, message); - revertCommitBuilder.setMessage( - ChangeIdUtil.insertId(message, computedChangeId, true)); + ChangeIdUtil.computeChangeId( + parentToCommitToRevert.getTree(), + commitToRevert, + authorIdent, + committerIdent, + message); + revertCommitBuilder.setMessage(ChangeIdUtil.insertId(message, computedChangeId, true)); Change.Id changeId = new Change.Id(seq.nextChangeId()); try (ObjectInserter oi = git.newObjectInserter()) { @@ -195,26 +196,24 @@ public class Revert implements RestModifyView, oi.flush(); RevCommit revertCommit = revWalk.parseCommit(id); - ChangeInserter ins = changeInserterFactory.create( - changeId, revertCommit, ctl.getChange().getDest().get()) - .setValidatePolicy(CommitValidators.Policy.GERRIT) - .setTopic(changeToRevert.getTopic()); + ChangeInserter ins = + changeInserterFactory + .create(changeId, revertCommit, ctl.getChange().getDest().get()) + .setValidatePolicy(CommitValidators.Policy.GERRIT) + .setTopic(changeToRevert.getTopic()); ins.setMessage("Uploaded patch set 1."); Set reviewers = new HashSet<>(); reviewers.add(changeToRevert.getOwner()); - reviewers.addAll( - approvalsUtil.getReviewers(db.get(), ctl.getNotes()).all()); + reviewers.addAll(approvalsUtil.getReviewers(db.get(), ctl.getNotes()).all()); reviewers.remove(user.getAccountId()); ins.setReviewers(reviewers); - try (BatchUpdate bu = updateFactory.create( - db.get(), project, user, now)) { + try (BatchUpdate bu = updateFactory.create(db.get(), project, user, now)) { bu.setRepository(git, revWalk, oi); bu.insertChange(ins); bu.addOp(changeId, new NotifyOp(ctl.getChange(), ins)); - bu.addOp(changeToRevert.getId(), - new PostRevertedMessageOp(computedChangeId)); + bu.addOp(changeToRevert.getId(), new PostRevertedMessageOp(computedChangeId)); bu.execute(); } } @@ -227,10 +226,11 @@ public class Revert implements RestModifyView, @Override public UiAction.Description getDescription(ChangeResource resource) { return new UiAction.Description() - .setLabel("Revert") - .setTitle("Revert the change") - .setVisible(resource.getChange().getStatus() == Status.MERGED - && resource.getControl().getRefControl().canUpload()); + .setLabel("Revert") + .setTitle("Revert the change") + .setVisible( + resource.getChange().getStatus() == Status.MERGED + && resource.getControl().getRefControl().canUpload()); } private static String status(Change change) { @@ -251,8 +251,7 @@ public class Revert implements RestModifyView, changeReverted.fire(change, ins.getChange(), ctx.getWhen()); Change.Id changeId = ins.getChange().getId(); try { - RevertedSender cm = - revertedSenderFactory.create(ctx.getProject(), changeId); + RevertedSender cm = revertedSenderFactory.create(ctx.getProject(), changeId); cm.setFrom(ctx.getAccountId()); cm.setChangeMessage(ins.getChangeMessage().getMessage(), ctx.getWhen()); cm.send(); @@ -273,11 +272,12 @@ public class Revert implements RestModifyView, public boolean updateChange(ChangeContext ctx) throws Exception { Change change = ctx.getChange(); PatchSet.Id patchSetId = change.currentPatchSetId(); - ChangeMessage changeMessage = ChangeMessagesUtil.newMessage(ctx, - "Created a revert of this change as I" + computedChangeId.name(), - ChangeMessagesUtil.TAG_REVERT); - cmUtil.addChangeMessage(ctx.getDb(), ctx.getUpdate(patchSetId), - changeMessage); + ChangeMessage changeMessage = + ChangeMessagesUtil.newMessage( + ctx, + "Created a revert of this change as I" + computedChangeId.name(), + ChangeMessagesUtil.TAG_REVERT); + cmUtil.addChangeMessage(ctx.getDb(), ctx.getUpdate(patchSetId), changeMessage); return true; } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Reviewed.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Reviewed.java index 997a8f9598..0d25d35117 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Reviewed.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Reviewed.java @@ -22,12 +22,10 @@ import com.google.inject.Inject; import com.google.inject.Singleton; public class Reviewed { - public static class Input { - } + public static class Input {} @Singleton - public static class PutReviewed - implements RestModifyView { + public static class PutReviewed implements RestModifyView { private final DynamicItem accountPatchReviewStore; @Inject @@ -36,11 +34,13 @@ public class Reviewed { } @Override - public Response apply(FileResource resource, Input input) - throws OrmException { - if (accountPatchReviewStore.get().markReviewed( - resource.getPatchKey().getParentKey(), resource.getAccountId(), - resource.getPatchKey().getFileName())) { + public Response apply(FileResource resource, Input input) throws OrmException { + if (accountPatchReviewStore + .get() + .markReviewed( + resource.getPatchKey().getParentKey(), + resource.getAccountId(), + resource.getPatchKey().getFileName())) { return Response.created(""); } return Response.ok(""); @@ -48,26 +48,25 @@ public class Reviewed { } @Singleton - public static class DeleteReviewed - implements RestModifyView { + public static class DeleteReviewed implements RestModifyView { private final DynamicItem accountPatchReviewStore; @Inject - DeleteReviewed( - DynamicItem accountPatchReviewStore) { + DeleteReviewed(DynamicItem accountPatchReviewStore) { this.accountPatchReviewStore = accountPatchReviewStore; } @Override - public Response apply(FileResource resource, Input input) - throws OrmException { - accountPatchReviewStore.get().clearReviewed( - resource.getPatchKey().getParentKey(), resource.getAccountId(), - resource.getPatchKey().getFileName()); + public Response apply(FileResource resource, Input input) throws OrmException { + accountPatchReviewStore + .get() + .clearReviewed( + resource.getPatchKey().getParentKey(), + resource.getAccountId(), + resource.getPatchKey().getFileName()); return Response.none(); } } - private Reviewed() { - } + private Reviewed() {} } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ReviewerJson.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ReviewerJson.java index 69cd4393df..ac7f15ebbe 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ReviewerJson.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ReviewerJson.java @@ -37,7 +37,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.util.Collection; import java.util.List; import java.util.TreeMap; @@ -50,7 +49,8 @@ public class ReviewerJson { private final AccountLoader.Factory accountLoaderFactory; @Inject - ReviewerJson(Provider db, + ReviewerJson( + Provider db, ChangeData.Factory changeDataFactory, ApprovalsUtil approvalsUtil, AccountLoader.Factory accountLoaderFactory) { @@ -60,14 +60,14 @@ public class ReviewerJson { this.accountLoaderFactory = accountLoaderFactory; } - public List format(Collection rsrcs) - throws OrmException { + public List format(Collection rsrcs) throws OrmException { List infos = Lists.newArrayListWithCapacity(rsrcs.size()); AccountLoader loader = accountLoaderFactory.create(true); for (ReviewerResource rsrc : rsrcs) { - ReviewerInfo info = format(new ReviewerInfo( - rsrc.getReviewerUser().getAccountId().get()), - rsrc.getReviewerControl()); + ReviewerInfo info = + format( + new ReviewerInfo(rsrc.getReviewerUser().getAccountId().get()), + rsrc.getReviewerControl()); loader.put(info); infos.add(info); } @@ -76,18 +76,20 @@ public class ReviewerJson { } public List format(ReviewerResource rsrc) throws OrmException { - return format(ImmutableList. of(rsrc)); + return format(ImmutableList.of(rsrc)); } public ReviewerInfo format(ReviewerInfo out, ChangeControl ctl) throws OrmException { PatchSet.Id psId = ctl.getChange().currentPatchSetId(); - return format(out, ctl, - approvalsUtil.byPatchSetUser(db.get(), ctl, psId, - new Account.Id(out._accountId))); + return format( + out, + ctl, + approvalsUtil.byPatchSetUser(db.get(), ctl, psId, new Account.Id(out._accountId))); } - public ReviewerInfo format(ReviewerInfo out, ChangeControl ctl, - Iterable approvals) throws OrmException { + public ReviewerInfo format( + ReviewerInfo out, ChangeControl ctl, Iterable approvals) + throws OrmException { LabelTypes labelTypes = ctl.getLabelTypes(); // Don't use Maps.newTreeMap(Comparator) due to OpenJDK bug 100167. @@ -108,10 +110,8 @@ public class ReviewerJson { ChangeData cd = changeDataFactory.create(db.get(), ctl); PatchSet ps = cd.currentPatchSet(); if (ps != null) { - for (SubmitRecord rec : new SubmitRuleEvaluator(cd) - .setFastEvalLabels(true) - .setAllowDraft(true) - .evaluate()) { + for (SubmitRecord rec : + new SubmitRuleEvaluator(cd).setFastEvalLabels(true).setAllowDraft(true).evaluate()) { if (rec.labels == null) { continue; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ReviewerResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ReviewerResource.java index f362a49629..6ff4a50fd6 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ReviewerResource.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ReviewerResource.java @@ -30,6 +30,7 @@ public class ReviewerResource implements RestResource { public interface Factory { ReviewerResource create(ChangeResource change, Account.Id id); + ReviewerResource create(RevisionResource revision, Account.Id id); } @@ -38,7 +39,8 @@ public class ReviewerResource implements RestResource { private final IdentifiedUser user; @AssistedInject - ReviewerResource(IdentifiedUser.GenericFactory userFactory, + ReviewerResource( + IdentifiedUser.GenericFactory userFactory, @Assisted ChangeResource change, @Assisted Account.Id id) { this.change = change; @@ -47,7 +49,8 @@ public class ReviewerResource implements RestResource { } @AssistedInject - ReviewerResource(IdentifiedUser.GenericFactory userFactory, + ReviewerResource( + IdentifiedUser.GenericFactory userFactory, @Assisted RevisionResource revision, @Assisted Account.Id id) { this.revision = revision; @@ -76,16 +79,16 @@ public class ReviewerResource implements RestResource { } /** - * @return the control for the caller's user (as opposed to the reviewer's - * user as returned by {@link #getReviewerControl()}). + * @return the control for the caller's user (as opposed to the reviewer's user as returned by + * {@link #getReviewerControl()}). */ public ChangeControl getControl() { return change.getControl(); } /** - * @return the control for the reviewer's user (as opposed to the caller's - * user as returned by {@link #getControl()}). + * @return the control for the reviewer's user (as opposed to the caller's user as returned by + * {@link #getControl()}). */ public ChangeControl getReviewerControl() { return change.getControl().forUser(user); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ReviewerSuggestion.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ReviewerSuggestion.java index 6affd9fa2e..a2dd8b5fd6 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ReviewerSuggestion.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ReviewerSuggestion.java @@ -19,13 +19,12 @@ import com.google.gerrit.extensions.annotations.ExtensionPoint; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Project; - import java.util.Set; /** * Listener to provide reviewer suggestions. - *

- * Invoked by Gerrit a user who is searching for a reviewer to add to a change. + * + *

Invoked by Gerrit a user who is searching for a reviewer to add to a change. */ @ExtensionPoint public interface ReviewerSuggestion { @@ -36,10 +35,12 @@ public interface ReviewerSuggestion { * @param changeId The changeId that the suggestion is for. Can be an {@code null}. * @param query The query as typed by the user. Can be an {@code null}. * @param candidates A set of candidates for the ranking. Can be empty. - * @return Set of suggested reviewers as a tuple of account id and score. - * The account ids listed here don't have to be a part of candidates. + * @return Set of suggested reviewers as a tuple of account id and score. The account ids listed + * here don't have to be a part of candidates. */ - Set suggestReviewers(Project.NameKey project, - @Nullable Change.Id changeId, @Nullable String query, + Set suggestReviewers( + Project.NameKey project, + @Nullable Change.Id changeId, + @Nullable String query, Set candidates); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Reviewers.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Reviewers.java index d45d260dbd..14c74bcdd0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Reviewers.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Reviewers.java @@ -29,12 +29,10 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.util.Collection; @Singleton -public class Reviewers implements - ChildCollection { +public class Reviewers implements ChildCollection { private final DynamicMap> views; private final Provider dbProvider; private final ApprovalsUtil approvalsUtil; @@ -43,7 +41,8 @@ public class Reviewers implements private final ListReviewers list; @Inject - Reviewers(Provider dbProvider, + Reviewers( + Provider dbProvider, ApprovalsUtil approvalsUtil, AccountsCollection accounts, ReviewerResource.Factory resourceFactory, @@ -70,8 +69,7 @@ public class Reviewers implements @Override public ReviewerResource parse(ChangeResource rsrc, IdString id) throws OrmException, ResourceNotFoundException, AuthException { - Account.Id accountId = - accounts.parse(TopLevelResource.INSTANCE, id).getUser().getAccountId(); + Account.Id accountId = accounts.parse(TopLevelResource.INSTANCE, id).getUser().getAccountId(); // See if the id exists as a reviewer for this change if (fetchAccountIds(rsrc).contains(accountId)) { @@ -80,9 +78,7 @@ public class Reviewers implements throw new ResourceNotFoundException(id); } - private Collection fetchAccountIds(ChangeResource rsrc) - throws OrmException { - return approvalsUtil.getReviewers( - dbProvider.get(), rsrc.getNotes()).all(); + private Collection fetchAccountIds(ChangeResource rsrc) throws OrmException { + return approvalsUtil.getReviewers(dbProvider.get(), rsrc.getNotes()).all(); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/RevisionResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/RevisionResource.java index 152563b061..4d35f9ee9f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/RevisionResource.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/RevisionResource.java @@ -26,7 +26,6 @@ import com.google.gerrit.server.edit.ChangeEdit; import com.google.gerrit.server.notedb.ChangeNotes; import com.google.gerrit.server.project.ChangeControl; import com.google.inject.TypeLiteral; - import java.util.Optional; public class RevisionResource implements RestResource, HasETag { @@ -42,8 +41,7 @@ public class RevisionResource implements RestResource, HasETag { this(change, ps, Optional.empty()); } - public RevisionResource(ChangeResource change, PatchSet ps, - Optional edit) { + public RevisionResource(ChangeResource change, PatchSet ps, Optional edit) { this.change = change; this.ps = ps; this.edit = edit; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/RevisionReviewers.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/RevisionReviewers.java index 3ad860c145..d3623cf28c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/RevisionReviewers.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/RevisionReviewers.java @@ -30,12 +30,10 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.util.Collection; @Singleton -public class RevisionReviewers implements - ChildCollection { +public class RevisionReviewers implements ChildCollection { private final DynamicMap> views; private final Provider dbProvider; private final ApprovalsUtil approvalsUtil; @@ -44,7 +42,8 @@ public class RevisionReviewers implements private final ListRevisionReviewers list; @Inject - RevisionReviewers(Provider dbProvider, + RevisionReviewers( + Provider dbProvider, ApprovalsUtil approvalsUtil, AccountsCollection accounts, ReviewerResource.Factory resourceFactory, @@ -70,18 +69,15 @@ public class RevisionReviewers implements @Override public ReviewerResource parse(RevisionResource rsrc, IdString id) - throws OrmException, ResourceNotFoundException, AuthException, - MethodNotAllowedException { + throws OrmException, ResourceNotFoundException, AuthException, MethodNotAllowedException { if (!rsrc.isCurrent()) { - throw new MethodNotAllowedException( - "Cannot access on non-current patch set"); + throw new MethodNotAllowedException("Cannot access on non-current patch set"); } - Account.Id accountId = - accounts.parse(TopLevelResource.INSTANCE, id).getUser().getAccountId(); + Account.Id accountId = accounts.parse(TopLevelResource.INSTANCE, id).getUser().getAccountId(); - Collection reviewers = approvalsUtil.getReviewers( - dbProvider.get(), rsrc.getNotes()).all(); + Collection reviewers = + approvalsUtil.getReviewers(dbProvider.get(), rsrc.getNotes()).all(); if (reviewers.contains(accountId)) { return resourceFactory.create(rsrc, accountId); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Revisions.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Revisions.java index 4572994cbd..a16f2f92cd 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Revisions.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Revisions.java @@ -32,7 +32,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; import java.util.ArrayList; import java.util.Collections; @@ -47,7 +46,8 @@ public class Revisions implements ChildCollection> views, + Revisions( + DynamicMap> views, Provider dbProvider, ChangeEditUtil editUtil, PatchSetUtil psUtil) { @@ -69,8 +69,7 @@ public class Revisions implements ChildCollection byLegacyPatchSetId(ChangeResource change, - String id) throws OrmException { - PatchSet ps = psUtil.get(dbProvider.get(), change.getNotes(), - new PatchSet.Id(change.getId(), Integer.parseInt(id))); + private List byLegacyPatchSetId(ChangeResource change, String id) + throws OrmException { + PatchSet ps = + psUtil.get( + dbProvider.get(), + change.getNotes(), + new PatchSet.Id(change.getId(), Integer.parseInt(id))); if (ps != null) { return Collections.singletonList(new RevisionResource(change, ps)); } @@ -145,8 +145,7 @@ public class Revisions implements ChildCollection { +public class RobotComments implements ChildCollection { private final DynamicMap> views; private final ListRobotComments list; private final CommentsUtil commentsUtil; @Inject - RobotComments(DynamicMap> views, + RobotComments( + DynamicMap> views, ListRobotComments list, CommentsUtil commentsUtil) { this.views = views; @@ -58,8 +58,7 @@ public class RobotComments String uuid = id.get(); ChangeNotes notes = rev.getNotes(); - for (RobotComment c : commentsUtil.robotCommentsByPatchSet( - notes, rev.getPatchSet().getId())) { + for (RobotComment c : commentsUtil.robotCommentsByPatchSet(notes, rev.getPatchSet().getId())) { if (uuid.equals(c.key.uuid)) { return new RobotCommentResource(rev, c); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/SetAssigneeOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/SetAssigneeOp.java index f687400b3c..80e0017c24 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/SetAssigneeOp.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/SetAssigneeOp.java @@ -38,13 +38,11 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SetAssigneeOp extends BatchUpdate.Op { - private static final Logger log = - LoggerFactory.getLogger(SetAssigneeOp.class); + private static final Logger log = LoggerFactory.getLogger(SetAssigneeOp.class); public interface Factory { SetAssigneeOp create(String assignee); @@ -64,7 +62,8 @@ public class SetAssigneeOp extends BatchUpdate.Op { private Account oldAssignee; @AssistedInject - SetAssigneeOp(AccountsCollection accounts, + SetAssigneeOp( + AccountsCollection accounts, ChangeMessagesUtil cmUtil, DynamicSet validationListeners, AssigneeChanged assigneeChanged, @@ -83,8 +82,7 @@ public class SetAssigneeOp extends BatchUpdate.Op { } @Override - public boolean updateChange(BatchUpdate.ChangeContext ctx) - throws OrmException, RestApiException { + public boolean updateChange(BatchUpdate.ChangeContext ctx) throws OrmException, RestApiException { change = ctx.getChange(); ChangeUpdate update = ctx.getUpdate(change.currentPatchSetId()); IdentifiedUser newAssigneeUser = accounts.parse(assignee); @@ -98,14 +96,12 @@ public class SetAssigneeOp extends BatchUpdate.Op { } } if (!newAssignee.isActive()) { - throw new UnprocessableEntityException(String.format( - "Account of %s is not active", assignee)); + throw new UnprocessableEntityException( + String.format("Account of %s is not active", assignee)); } if (!ctx.getControl().forUser(newAssigneeUser).isRefVisible()) { - throw new AuthException(String.format( - "Change %s is not visible to %s.", - change.getChangeId(), - assignee)); + throw new AuthException( + String.format("Change %s is not visible to %s.", change.getChangeId(), assignee)); } try { for (AssigneeValidationListener validator : validationListeners) { @@ -122,9 +118,12 @@ public class SetAssigneeOp extends BatchUpdate.Op { return true; } - private void addMessage(BatchUpdate.ChangeContext ctx, ChangeUpdate update, - IdentifiedUser previousAssignee, IdentifiedUser newAssignee) - throws OrmException { + private void addMessage( + BatchUpdate.ChangeContext ctx, + ChangeUpdate update, + IdentifiedUser previousAssignee, + IdentifiedUser newAssignee) + throws OrmException { StringBuilder msg = new StringBuilder(); msg.append("Assignee "); if (previousAssignee == null) { @@ -136,21 +135,20 @@ public class SetAssigneeOp extends BatchUpdate.Op { msg.append(" to: "); msg.append(newAssignee.getNameEmail()); } - ChangeMessage cmsg = ChangeMessagesUtil.newMessage(ctx, msg.toString(), - ChangeMessagesUtil.TAG_SET_ASSIGNEE); + ChangeMessage cmsg = + ChangeMessagesUtil.newMessage(ctx, msg.toString(), ChangeMessagesUtil.TAG_SET_ASSIGNEE); cmUtil.addChangeMessage(ctx.getDb(), update, cmsg); } @Override public void postUpdate(Context ctx) throws OrmException { try { - SetAssigneeSender cm = setAssigneeSenderFactory - .create(change.getProject(), change.getId(), newAssignee.getId()); + SetAssigneeSender cm = + setAssigneeSenderFactory.create(change.getProject(), change.getId(), newAssignee.getId()); cm.setFrom(user.get().getAccountId()); cm.send(); } catch (Exception err) { - log.error("Cannot send email to new assignee of change " + change.getId(), - err); + log.error("Cannot send email to new assignee of change " + change.getId(), err); } assigneeChanged.fire(change, ctx.getAccount(), oldAssignee, ctx.getWhen()); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/SetHashtagsOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/SetHashtagsOp.java index 3b2117d18e..c266d7ea64 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/SetHashtagsOp.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/SetHashtagsOp.java @@ -41,7 +41,6 @@ import com.google.gerrit.server.validators.ValidationException; import com.google.gwtorm.server.OrmException; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - import java.io.IOException; import java.util.Collection; import java.util.HashSet; @@ -86,14 +85,12 @@ public class SetHashtagsOp extends BatchUpdate.Op { @Override public boolean updateChange(ChangeContext ctx) - throws AuthException, BadRequestException, MethodNotAllowedException, - OrmException, IOException { + throws AuthException, BadRequestException, MethodNotAllowedException, OrmException, + IOException { if (!notesMigration.readChanges()) { - throw new MethodNotAllowedException( - "Cannot add hashtags; NoteDb is disabled"); + throw new MethodNotAllowedException("Cannot add hashtags; NoteDb is disabled"); } - if (input == null - || (input.add == null && input.remove == null)) { + if (input == null || (input.add == null && input.remove == null)) { updatedHashtags = ImmutableSortedSet.of(); return false; } @@ -131,18 +128,16 @@ public class SetHashtagsOp extends BatchUpdate.Op { return true; } - private void addMessage(ChangeContext ctx, ChangeUpdate update) - throws OrmException { + private void addMessage(ChangeContext ctx, ChangeUpdate update) throws OrmException { StringBuilder msg = new StringBuilder(); appendHashtagMessage(msg, "added", toAdd); appendHashtagMessage(msg, "removed", toRemove); - ChangeMessage cmsg = ChangeMessagesUtil.newMessage(ctx, msg.toString(), - ChangeMessagesUtil.TAG_SET_HASHTAGS); + ChangeMessage cmsg = + ChangeMessagesUtil.newMessage(ctx, msg.toString(), ChangeMessagesUtil.TAG_SET_HASHTAGS); cmUtil.addChangeMessage(ctx.getDb(), update, cmsg); } - private void appendHashtagMessage(StringBuilder b, String action, - Set hashtags) { + private void appendHashtagMessage(StringBuilder b, String action, Set hashtags) { if (isNullOrEmpty(hashtags)) { return; } @@ -163,14 +158,13 @@ public class SetHashtagsOp extends BatchUpdate.Op { @Override public void postUpdate(Context ctx) throws OrmException { if (updated() && fireEvent) { - hashtagsEdited.fire(change, ctx.getAccount(), updatedHashtags, - toAdd, toRemove, ctx.getWhen()); + hashtagsEdited.fire( + change, ctx.getAccount(), updatedHashtags, toAdd, toRemove, ctx.getWhen()); } } public ImmutableSortedSet getUpdatedHashtags() { - checkState(updatedHashtags != null, - "getUpdatedHashtags() only valid after executing op"); + checkState(updatedHashtags != null, "getUpdatedHashtags() only valid after executing op"); return updatedHashtags; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Submit.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Submit.java index 654471f91f..8013d8754d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Submit.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Submit.java @@ -60,7 +60,13 @@ import com.google.gwtorm.server.OrmRuntimeException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.ObjectId; @@ -70,38 +76,26 @@ import org.eclipse.jgit.revwalk.RevWalk; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - @Singleton -public class Submit implements RestModifyView, - UiAction { +public class Submit + implements RestModifyView, UiAction { private static final Logger log = LoggerFactory.getLogger(Submit.class); - private static final String DEFAULT_TOOLTIP = - "Submit patch set ${patchSet} into ${branch}"; + private static final String DEFAULT_TOOLTIP = "Submit patch set ${patchSet} into ${branch}"; private static final String DEFAULT_TOOLTIP_ANCESTORS = - "Submit patch set ${patchSet} and ancestors (${submitSize} changes " + - "altogether) into ${branch}"; + "Submit patch set ${patchSet} and ancestors (${submitSize} changes " + + "altogether) into ${branch}"; private static final String DEFAULT_TOPIC_TOOLTIP = - "Submit all ${topicSize} changes of the same topic " + - "(${submitSize} changes including ancestors and other " + - "changes related by topic)"; + "Submit all ${topicSize} changes of the same topic " + + "(${submitSize} changes including ancestors and other " + + "changes related by topic)"; private static final String BLOCKED_SUBMIT_TOOLTIP = "This change depends on other changes which are not ready"; private static final String BLOCKED_HIDDEN_SUBMIT_TOOLTIP = "This change depends on other hidden changes which are not ready"; - private static final String CLICK_FAILURE_TOOLTIP = - "Clicking the button would fail"; - private static final String CHANGE_UNMERGEABLE = - "Problems with integrating this change"; - private static final String CHANGES_NOT_MERGEABLE = - "Problems with change(s): "; + private static final String CLICK_FAILURE_TOOLTIP = "Clicking the button would fail"; + private static final String CHANGE_UNMERGEABLE = "Problems with integrating this change"; + private static final String CHANGES_NOT_MERGEABLE = "Problems with change(s): "; public static class Output { transient Change change; @@ -112,8 +106,8 @@ public class Submit implements RestModifyView, } /** - * Subclass of {@link SubmitInput} with special bits that may be flipped for - * testing purposes only. + * Subclass of {@link SubmitInput} with special bits that may be flipped for testing purposes + * only. */ @VisibleForTesting public static class TestSubmitInput extends SubmitInput { @@ -146,7 +140,8 @@ public class Submit implements RestModifyView, private final PatchSetUtil psUtil; @Inject - Submit(Provider dbProvider, + Submit( + Provider dbProvider, GitRepositoryManager repoManager, ChangeData.Factory changeDataFactory, ChangeMessagesUtil cmUtil, @@ -167,35 +162,38 @@ public class Submit implements RestModifyView, this.mergeSuperSet = mergeSuperSet; this.accounts = accounts; this.changes = changes; - this.label = MoreObjects.firstNonNull( - Strings.emptyToNull(cfg.getString("change", null, "submitLabel")), - "Submit"); - this.labelWithParents = MoreObjects.firstNonNull( - Strings.emptyToNull( - cfg.getString("change", null, "submitLabelWithParents")), - "Submit including parents"); - this.titlePattern = new ParameterizedString(MoreObjects.firstNonNull( - cfg.getString("change", null, "submitTooltip"), - DEFAULT_TOOLTIP)); - this.titlePatternWithAncestors = new ParameterizedString( + this.label = MoreObjects.firstNonNull( - cfg.getString("change", null, "submitTooltipAncestors"), - DEFAULT_TOOLTIP_ANCESTORS)); + Strings.emptyToNull(cfg.getString("change", null, "submitLabel")), "Submit"); + this.labelWithParents = + MoreObjects.firstNonNull( + Strings.emptyToNull(cfg.getString("change", null, "submitLabelWithParents")), + "Submit including parents"); + this.titlePattern = + new ParameterizedString( + MoreObjects.firstNonNull( + cfg.getString("change", null, "submitTooltip"), DEFAULT_TOOLTIP)); + this.titlePatternWithAncestors = + new ParameterizedString( + MoreObjects.firstNonNull( + cfg.getString("change", null, "submitTooltipAncestors"), + DEFAULT_TOOLTIP_ANCESTORS)); submitWholeTopic = wholeTopicEnabled(cfg); - this.submitTopicLabel = MoreObjects.firstNonNull( - Strings.emptyToNull(cfg.getString("change", null, "submitTopicLabel")), - "Submit whole topic"); - this.submitTopicTooltip = new ParameterizedString(MoreObjects.firstNonNull( - cfg.getString("change", null, "submitTopicTooltip"), - DEFAULT_TOPIC_TOOLTIP)); + this.submitTopicLabel = + MoreObjects.firstNonNull( + Strings.emptyToNull(cfg.getString("change", null, "submitTopicLabel")), + "Submit whole topic"); + this.submitTopicTooltip = + new ParameterizedString( + MoreObjects.firstNonNull( + cfg.getString("change", null, "submitTopicTooltip"), DEFAULT_TOPIC_TOOLTIP)); this.queryProvider = queryProvider; this.psUtil = psUtil; } @Override public Output apply(RevisionResource rsrc, SubmitInput input) - throws RestApiException, RepositoryNotFoundException, IOException, - OrmException { + throws RestApiException, RepositoryNotFoundException, IOException, OrmException { input.onBehalfOf = Strings.emptyToNull(input.onBehalfOf); if (input.onBehalfOf != null) { rsrc = onBehalfOf(rsrc, input); @@ -208,22 +206,21 @@ public class Submit implements RestModifyView, } else if (!change.getStatus().isOpen()) { throw new ResourceConflictException("change is " + status(change)); } else if (!ProjectUtil.branchExists(repoManager, change.getDest())) { - throw new ResourceConflictException(String.format( - "destination branch \"%s\" not found.", - change.getDest().get())); + throw new ResourceConflictException( + String.format("destination branch \"%s\" not found.", change.getDest().get())); } else if (!rsrc.getPatchSet().getId().equals(change.currentPatchSetId())) { // TODO Allow submitting non-current revision by changing the current. - throw new ResourceConflictException(String.format( - "revision %s is not current revision", - rsrc.getPatchSet().getRevision().get())); + throw new ResourceConflictException( + String.format( + "revision %s is not current revision", rsrc.getPatchSet().getRevision().get())); } try (MergeOp op = mergeOpProvider.get()) { ReviewDb db = dbProvider.get(); op.merge(db, change, caller, true, input, false); try { - change = changeNotesFactory - .createChecked(db, change.getProject(), change.getId()).getChange(); + change = + changeNotesFactory.createChecked(db, change.getProject(), change.getId()).getChange(); } catch (NoSuchChangeException e) { throw new ResourceConflictException("change is deleted"); } @@ -251,8 +248,7 @@ public class Submit implements RestModifyView, * @param user the user who is checking to submit * @return a reason why any of the changes is not submittable or null */ - private String problemsForSubmittingChangeset(ChangeData cd, ChangeSet cs, - CurrentUser user) { + private String problemsForSubmittingChangeset(ChangeData cd, ChangeSet cs, CurrentUser user) { try { @SuppressWarnings("resource") ReviewDb db = dbProvider.get(); @@ -280,10 +276,8 @@ public class Submit implements RestModifyView, return CHANGE_UNMERGEABLE; } } - return CHANGES_NOT_MERGEABLE + - unmergeable.stream() - .map(c -> c.getId().toString()) - .collect(joining(", ")); + return CHANGES_NOT_MERGEABLE + + unmergeable.stream().map(c -> c.getId().toString()).collect(joining(", ")); } } catch (ResourceConflictException e) { return BLOCKED_SUBMIT_TOOLTIP; @@ -298,10 +292,11 @@ public class Submit implements RestModifyView, public UiAction.Description getDescription(RevisionResource resource) { PatchSet.Id current = resource.getChange().currentPatchSetId(); String topic = resource.getChange().getTopic(); - boolean visible = !resource.getPatchSet().isDraft() - && resource.getChange().getStatus().isOpen() - && resource.getPatchSet().getId().equals(current) - && resource.getControl().canSubmit(); + boolean visible = + !resource.getPatchSet().isDraft() + && resource.getChange().getStatus().isOpen() + && resource.getPatchSet().getId().equals(current) + && resource.getControl().canSubmit(); ReviewDb db = dbProvider.get(); ChangeData cd = changeDataFactory.create(db, resource.getControl()); @@ -315,31 +310,24 @@ public class Submit implements RestModifyView, } if (!visible) { - return new UiAction.Description() - .setLabel("") - .setTitle("") - .setVisible(false); + return new UiAction.Description().setLabel("").setTitle("").setVisible(false); } ChangeSet cs; try { - cs = mergeSuperSet.get().completeChangeSet( - db, cd.change(), resource.getControl().getUser()); + cs = mergeSuperSet.get().completeChangeSet(db, cd.change(), resource.getControl().getUser()); } catch (OrmException | IOException e) { - throw new OrmRuntimeException("Could not determine complete set of " + - "changes to be submitted", e); + throw new OrmRuntimeException( + "Could not determine complete set of " + "changes to be submitted", e); } int topicSize = 0; if (!Strings.isNullOrEmpty(topic)) { topicSize = getChangesByTopic(topic).size(); } - boolean treatWithTopic = submitWholeTopic - && !Strings.isNullOrEmpty(topic) - && topicSize > 1; + boolean treatWithTopic = submitWholeTopic && !Strings.isNullOrEmpty(topic) && topicSize > 1; - String submitProblems = - problemsForSubmittingChangeset(cd, cs, resource.getUser()); + String submitProblems = problemsForSubmittingChangeset(cd, cs, resource.getUser()); Boolean enabled; try { @@ -358,50 +346,45 @@ public class Submit implements RestModifyView, if (submitProblems != null) { return new UiAction.Description() - .setLabel(treatWithTopic - ? submitTopicLabel : (cs.size() > 1) - ? labelWithParents : label) - .setTitle(submitProblems) - .setVisible(true) - .setEnabled(false); + .setLabel(treatWithTopic ? submitTopicLabel : (cs.size() > 1) ? labelWithParents : label) + .setTitle(submitProblems) + .setVisible(true) + .setEnabled(false); } if (treatWithTopic) { - Map params = ImmutableMap.of( - "topicSize", String.valueOf(topicSize), - "submitSize", String.valueOf(cs.size())); + Map params = + ImmutableMap.of( + "topicSize", String.valueOf(topicSize), + "submitSize", String.valueOf(cs.size())); return new UiAction.Description() .setLabel(submitTopicLabel) - .setTitle(Strings.emptyToNull( - submitTopicTooltip.replace(params))) + .setTitle(Strings.emptyToNull(submitTopicTooltip.replace(params))) .setVisible(true) .setEnabled(Boolean.TRUE.equals(enabled)); } RevId revId = resource.getPatchSet().getRevision(); - Map params = ImmutableMap.of( - "patchSet", String.valueOf(resource.getPatchSet().getPatchSetId()), - "branch", resource.getChange().getDest().getShortName(), - "commit", ObjectId.fromString(revId.get()).abbreviate(7).name(), - "submitSize", String.valueOf(cs.size())); - ParameterizedString tp = cs.size() > 1 ? titlePatternWithAncestors : - titlePattern; + Map params = + ImmutableMap.of( + "patchSet", String.valueOf(resource.getPatchSet().getPatchSetId()), + "branch", resource.getChange().getDest().getShortName(), + "commit", ObjectId.fromString(revId.get()).abbreviate(7).name(), + "submitSize", String.valueOf(cs.size())); + ParameterizedString tp = cs.size() > 1 ? titlePatternWithAncestors : titlePattern; return new UiAction.Description() - .setLabel(cs.size() > 1 ? labelWithParents : label) - .setTitle(Strings.emptyToNull(tp.replace(params))) - .setVisible(true) - .setEnabled(Boolean.TRUE.equals(enabled)); + .setLabel(cs.size() > 1 ? labelWithParents : label) + .setTitle(Strings.emptyToNull(tp.replace(params))) + .setVisible(true) + .setEnabled(Boolean.TRUE.equals(enabled)); } /** - * If the merge was attempted and it failed the system usually writes a - * comment as a ChangeMessage and sets status to NEW. Find the relevant - * message and return it. + * If the merge was attempted and it failed the system usually writes a comment as a ChangeMessage + * and sets status to NEW. Find the relevant message and return it. */ - public ChangeMessage getConflictMessage(RevisionResource rsrc) - throws OrmException { + public ChangeMessage getConflictMessage(RevisionResource rsrc) throws OrmException { return FluentIterable.from( - cmUtil.byPatchSet( - dbProvider.get(), rsrc.getNotes(), rsrc.getPatchSet().getId())) + cmUtil.byPatchSet(dbProvider.get(), rsrc.getNotes(), rsrc.getPatchSet().getId())) .filter(cm -> cm.getAuthor() == null) .last() .orNull(); @@ -411,8 +394,7 @@ public class Submit implements RestModifyView, return change != null ? change.getStatus().name().toLowerCase() : "deleted"; } - public Collection unmergeableChanges(ChangeSet cs) - throws OrmException, IOException { + public Collection unmergeableChanges(ChangeSet cs) throws OrmException, IOException { Set mergeabilityMap = new HashSet<>(); for (ChangeData change : cs.changes()) { mergeabilityMap.add(change); @@ -421,8 +403,7 @@ public class Submit implements RestModifyView, ListMultimap cbb = cs.changesByBranch(); for (Branch.NameKey branch : cbb.keySet()) { Collection targetBranch = cbb.get(branch); - HashMap commits = - findCommits(targetBranch, branch.getParentKey()); + HashMap commits = findCommits(targetBranch, branch.getParentKey()); Set allParents = Sets.newHashSetWithExpectedSize(cs.size()); for (RevCommit commit : commits.values()) { @@ -462,14 +443,15 @@ public class Submit implements RestModifyView, } private HashMap findCommits( - Collection changes, Project.NameKey project) - throws IOException, OrmException { + Collection changes, Project.NameKey project) throws IOException, OrmException { HashMap commits = new HashMap<>(); try (Repository repo = repoManager.openRepository(project); RevWalk walk = new RevWalk(repo)) { for (ChangeData change : changes) { - RevCommit commit = walk.parseCommit(ObjectId.fromString( - psUtil.current(dbProvider.get(), change.notes()).getRevision().get())); + RevCommit commit = + walk.parseCommit( + ObjectId.fromString( + psUtil.current(dbProvider.get(), change.notes()).getRevision().get())); commits.put(change.getId(), commit); } } @@ -485,18 +467,19 @@ public class Submit implements RestModifyView, if (!caller.canSubmitAs()) { throw new AuthException("submit on behalf of not permitted"); } - ChangeControl target = caller.forUser( - accounts.parseOnBehalfOf(caller.getUser(), in.onBehalfOf)); + ChangeControl target = + caller.forUser(accounts.parseOnBehalfOf(caller.getUser(), in.onBehalfOf)); if (!target.getRefControl().isVisible()) { - throw new UnprocessableEntityException(String.format( - "on_behalf_of account %s cannot see destination ref", - target.getUser().getAccountId())); + throw new UnprocessableEntityException( + String.format( + "on_behalf_of account %s cannot see destination ref", + target.getUser().getAccountId())); } return new RevisionResource(changes.parse(target), rsrc.getPatchSet()); } public static boolean wholeTopicEnabled(Config config) { - return config.getBoolean("change", null, "submitWholeTopic" , false); + return config.getBoolean("change", null, "submitWholeTopic", false); } private List getChangesByTopic(String topic) { @@ -507,15 +490,15 @@ public class Submit implements RestModifyView, } } - public static class CurrentRevision implements - RestModifyView { + public static class CurrentRevision implements RestModifyView { private final Provider dbProvider; private final Submit submit; private final ChangeJson.Factory json; private final PatchSetUtil psUtil; @Inject - CurrentRevision(Provider dbProvider, + CurrentRevision( + Provider dbProvider, Submit submit, ChangeJson.Factory json, PatchSetUtil psUtil) { @@ -527,8 +510,7 @@ public class Submit implements RestModifyView, @Override public ChangeInfo apply(ChangeResource rsrc, SubmitInput input) - throws RestApiException, RepositoryNotFoundException, IOException, - OrmException { + throws RestApiException, RepositoryNotFoundException, IOException, OrmException { PatchSet ps = psUtil.current(dbProvider.get(), rsrc.getNotes()); if (ps == null) { throw new ResourceConflictException("current revision is missing"); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/SubmittedTogether.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/SubmittedTogether.java index 23e7d8b235..568b50aaa7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/SubmittedTogether.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/SubmittedTogether.java @@ -34,28 +34,26 @@ import com.google.gerrit.server.query.change.InternalChangeQuery; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - -import org.kohsuke.args4j.Option; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.EnumSet; import java.util.List; +import org.kohsuke.args4j.Option; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class SubmittedTogether implements RestReadView { - private static final Logger log = LoggerFactory.getLogger( - SubmittedTogether.class); + private static final Logger log = LoggerFactory.getLogger(SubmittedTogether.class); private final EnumSet options = EnumSet.noneOf(SubmittedTogetherOption.class); - private final EnumSet jsonOpt = EnumSet.of( - ListChangesOption.CURRENT_REVISION, - ListChangesOption.CURRENT_COMMIT, - ListChangesOption.SUBMITTABLE); + private final EnumSet jsonOpt = + EnumSet.of( + ListChangesOption.CURRENT_REVISION, + ListChangesOption.CURRENT_COMMIT, + ListChangesOption.SUBMITTABLE); private final ChangeJson.Factory json; private final Provider dbProvider; @@ -83,7 +81,8 @@ public class SubmittedTogether implements RestReadView { } @Inject - SubmittedTogether(ChangeJson.Factory json, + SubmittedTogether( + ChangeJson.Factory json, Provider dbProvider, Provider queryProvider, Provider mergeSuperSet, @@ -100,16 +99,15 @@ public class SubmittedTogether implements RestReadView { return this; } - public SubmittedTogether addSubmittedTogetherOption( - EnumSet o) { + public SubmittedTogether addSubmittedTogetherOption(EnumSet o) { options.addAll(o); return this; } @Override public Object apply(ChangeResource resource) - throws AuthException, BadRequestException, - ResourceConflictException, IOException, OrmException { + throws AuthException, BadRequestException, ResourceConflictException, IOException, + OrmException { SubmittedTogetherInfo info = applyInfo(resource); if (options.isEmpty()) { return info.changes; @@ -126,8 +124,9 @@ public class SubmittedTogether implements RestReadView { if (c.getStatus().isOpen()) { ChangeSet cs = - mergeSuperSet.get().completeChangeSet( - dbProvider.get(), c, resource.getControl().getUser()); + mergeSuperSet + .get() + .completeChangeSet(dbProvider.get(), c, resource.getControl().getUser()); cds = cs.changes().asList(); hidden = cs.nonVisibleChanges().size(); } else if (c.getStatus().asChangeStatus() == ChangeStatus.MERGED) { @@ -138,10 +137,8 @@ public class SubmittedTogether implements RestReadView { hidden = 0; } - if (hidden != 0 - && !options.contains(NON_VISIBLE_CHANGES)) { - throw new AuthException( - "change would be submitted with a change that you cannot see"); + if (hidden != 0 && !options.contains(NON_VISIBLE_CHANGES)) { + throw new AuthException("change would be submitted with a change that you cannot see"); } if (cds.size() <= 1 && hidden == 0) { @@ -162,8 +159,7 @@ public class SubmittedTogether implements RestReadView { } } - private List sort(List cds) - throws OrmException, IOException { + private List sort(List cds) throws OrmException, IOException { List sorted = new ArrayList<>(cds.size()); for (PatchSetData psd : sorter.get().sort(cds)) { sorted.add(psd.data()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/SuggestChangeReviewers.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/SuggestChangeReviewers.java index 0753769123..5260730f43 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/SuggestChangeReviewers.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/SuggestChangeReviewers.java @@ -30,24 +30,26 @@ import com.google.gerrit.server.config.GerritServerConfig; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - -import org.eclipse.jgit.lib.Config; -import org.kohsuke.args4j.Option; - import java.io.IOException; import java.util.List; +import org.eclipse.jgit.lib.Config; +import org.kohsuke.args4j.Option; public class SuggestChangeReviewers extends SuggestReviewers implements RestReadView { - @Option(name = "--exclude-groups", aliases = {"-e"}, - usage = "exclude groups from query") + @Option( + name = "--exclude-groups", + aliases = {"-e"}, + usage = "exclude groups from query" + ) boolean excludeGroups; private final Provider self; @Inject - SuggestChangeReviewers(AccountVisibility av, + SuggestChangeReviewers( + AccountVisibility av, GenericFactory identifiedUserFactory, Provider dbProvider, Provider self, @@ -63,8 +65,12 @@ public class SuggestChangeReviewers extends SuggestReviewers if (!self.get().isIdentifiedUser()) { throw new AuthException("Authentication required"); } - return reviewersUtil.suggestReviewers(rsrc.getNotes(), this, - rsrc.getControl().getProjectControl(), getVisibility(rsrc), excludeGroups); + return reviewersUtil.suggestReviewers( + rsrc.getNotes(), + this, + rsrc.getControl().getProjectControl(), + getVisibility(rsrc), + excludeGroups); } private VisibilityControl getVisibility(final ChangeResource rsrc) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/SuggestReviewers.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/SuggestReviewers.java index 2af1f6bae7..47fb5135cd 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/SuggestReviewers.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/SuggestReviewers.java @@ -21,7 +21,6 @@ import com.google.gerrit.server.account.AccountVisibility; import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; import com.google.inject.Provider; - import org.eclipse.jgit.lib.Config; import org.kohsuke.args4j.Option; @@ -39,16 +38,22 @@ public class SuggestReviewers { protected String query; protected final int maxSuggestedReviewers; - @Option(name = "--limit", aliases = {"-n"}, metaVar = "CNT", - usage = "maximum number of reviewers to list") + @Option( + name = "--limit", + aliases = {"-n"}, + metaVar = "CNT", + usage = "maximum number of reviewers to list" + ) public void setLimit(int l) { - this.limit = - l <= 0 ? maxSuggestedReviewers : Math.min(l, - maxSuggestedReviewers); + this.limit = l <= 0 ? maxSuggestedReviewers : Math.min(l, maxSuggestedReviewers); } - @Option(name = "--query", aliases = {"-q"}, metaVar = "QUERY", - usage = "match reviewers query") + @Option( + name = "--query", + aliases = {"-q"}, + metaVar = "QUERY", + usage = "match reviewers query" + ) public void setQuery(String q) { this.query = q; } @@ -74,7 +79,8 @@ public class SuggestReviewers { } @Inject - public SuggestReviewers(AccountVisibility av, + public SuggestReviewers( + AccountVisibility av, IdentifiedUser.GenericFactory identifiedUserFactory, Provider dbProvider, @GerritServerConfig Config cfg, @@ -86,17 +92,17 @@ public class SuggestReviewers { cfg.getInt("suggest", "maxSuggestedReviewers", DEFAULT_MAX_SUGGESTED); this.limit = this.maxSuggestedReviewers; String suggest = cfg.getString("suggest", null, "accounts"); - if ("OFF".equalsIgnoreCase(suggest) - || "false".equalsIgnoreCase(suggest)) { + if ("OFF".equalsIgnoreCase(suggest) || "false".equalsIgnoreCase(suggest)) { this.suggestAccounts = false; } else { this.suggestAccounts = (av != AccountVisibility.NONE); } - this.maxAllowed = cfg.getInt("addreviewer", "maxAllowed", - PostReviewers.DEFAULT_MAX_REVIEWERS); - this.maxAllowedWithoutConfirmation = cfg.getInt( - "addreviewer", "maxWithoutConfirmation", - PostReviewers.DEFAULT_MAX_REVIEWERS_WITHOUT_CHECK); + this.maxAllowed = cfg.getInt("addreviewer", "maxAllowed", PostReviewers.DEFAULT_MAX_REVIEWERS); + this.maxAllowedWithoutConfirmation = + cfg.getInt( + "addreviewer", + "maxWithoutConfirmation", + PostReviewers.DEFAULT_MAX_REVIEWERS_WITHOUT_CHECK); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/TestSubmitRule.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/TestSubmitRule.java index 45d9669a2a..524f4d63c7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/TestSubmitRule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/TestSubmitRule.java @@ -30,15 +30,12 @@ import com.google.gerrit.server.query.change.ChangeData; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - -import org.kohsuke.args4j.Option; - import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import org.kohsuke.args4j.Option; -public class TestSubmitRule - implements RestModifyView { +public class TestSubmitRule implements RestModifyView { private final Provider db; private final ChangeData.Factory changeDataFactory; private final RulesCache rules; @@ -48,7 +45,8 @@ public class TestSubmitRule private Filters filters = Filters.RUN; @Inject - TestSubmitRule(Provider db, + TestSubmitRule( + Provider db, ChangeData.Factory changeDataFactory, RulesCache rules, AccountLoader.Factory infoFactory) { @@ -68,14 +66,16 @@ public class TestSubmitRule throw new AuthException("project rules are disabled"); } input.filters = MoreObjects.firstNonNull(input.filters, filters); - SubmitRuleEvaluator evaluator = new SubmitRuleEvaluator( - changeDataFactory.create(db.get(), rsrc.getControl())); + SubmitRuleEvaluator evaluator = + new SubmitRuleEvaluator(changeDataFactory.create(db.get(), rsrc.getControl())); - List records = evaluator.setPatchSet(rsrc.getPatchSet()) - .setLogErrors(false) - .setSkipSubmitFilters(input.filters == Filters.SKIP) - .setRule(input.rule) - .evaluate(); + List records = + evaluator + .setPatchSet(rsrc.getPatchSet()) + .setLogErrors(false) + .setSkipSubmitFilters(input.filters == Filters.SKIP) + .setRule(input.rule) + .evaluate(); List out = Lists.newArrayListWithCapacity(records.size()); AccountLoader accounts = accountInfoFactory.create(true); for (SubmitRecord r : records) { @@ -104,9 +104,7 @@ public class TestSubmitRule if (r.labels != null) { for (SubmitRecord.Label n : r.labels) { - AccountInfo who = n.appliedBy != null - ? accounts.get(n.appliedBy) - : new AccountInfo(null); + AccountInfo who = n.appliedBy != null ? accounts.get(n.appliedBy) : new AccountInfo(null); label(n, who); } } @@ -148,6 +146,5 @@ public class TestSubmitRule } } - static class None { - } + static class None {} } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/TestSubmitType.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/TestSubmitType.java index 4855012304..b19f1d1a77 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/TestSubmitType.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/TestSubmitType.java @@ -30,11 +30,9 @@ import com.google.gerrit.server.query.change.ChangeData; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - import org.kohsuke.args4j.Option; -public class TestSubmitType - implements RestModifyView { +public class TestSubmitType implements RestModifyView { private final Provider db; private final ChangeData.Factory changeDataFactory; private final RulesCache rules; @@ -43,9 +41,7 @@ public class TestSubmitType private Filters filters = Filters.RUN; @Inject - TestSubmitType(Provider db, - ChangeData.Factory changeDataFactory, - RulesCache rules) { + TestSubmitType(Provider db, ChangeData.Factory changeDataFactory, RulesCache rules) { this.db = db; this.changeDataFactory = changeDataFactory; this.rules = rules; @@ -61,18 +57,19 @@ public class TestSubmitType throw new AuthException("project rules are disabled"); } input.filters = MoreObjects.firstNonNull(input.filters, filters); - SubmitRuleEvaluator evaluator = new SubmitRuleEvaluator( - changeDataFactory.create(db.get(), rsrc.getControl())); + SubmitRuleEvaluator evaluator = + new SubmitRuleEvaluator(changeDataFactory.create(db.get(), rsrc.getControl())); - SubmitTypeRecord rec = evaluator.setPatchSet(rsrc.getPatchSet()) - .setLogErrors(false) - .setSkipSubmitFilters(input.filters == Filters.SKIP) - .setRule(input.rule) - .getSubmitType(); + SubmitTypeRecord rec = + evaluator + .setPatchSet(rsrc.getPatchSet()) + .setLogErrors(false) + .setSkipSubmitFilters(input.filters == Filters.SKIP) + .setRule(input.rule) + .getSubmitType(); if (rec.status != SubmitTypeRecord.Status.OK) { - throw new BadRequestException(String.format( - "rule %s produced invalid result: %s", - evaluator.getSubmitRuleName(), rec)); + throw new BadRequestException( + String.format("rule %s produced invalid result: %s", evaluator.getSubmitRuleName(), rec)); } return rec.type; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Votes.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Votes.java index 78cdf75052..b2ca40594b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Votes.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Votes.java @@ -29,7 +29,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.util.Map; import java.util.TreeMap; @@ -39,8 +38,7 @@ public class Votes implements ChildCollection { private final List list; @Inject - Votes(DynamicMap> views, - List list) { + Votes(DynamicMap> views, List list) { this.views = views; this.list = list; } @@ -57,12 +55,9 @@ public class Votes implements ChildCollection { @Override public VoteResource parse(ReviewerResource reviewer, IdString id) - throws ResourceNotFoundException, OrmException, AuthException, - MethodNotAllowedException { - if (reviewer.getRevisionResource() != null - && !reviewer.getRevisionResource().isCurrent()) { - throw new MethodNotAllowedException( - "Cannot access on non-current patch set"); + throws ResourceNotFoundException, OrmException, AuthException, MethodNotAllowedException { + if (reviewer.getRevisionResource() != null && !reviewer.getRevisionResource().isCurrent()) { + throw new MethodNotAllowedException("Cannot access on non-current patch set"); } return new VoteResource(reviewer, id.get()); } @@ -73,8 +68,7 @@ public class Votes implements ChildCollection { private final ApprovalsUtil approvalsUtil; @Inject - List(Provider db, - ApprovalsUtil approvalsUtil) { + List(Provider db, ApprovalsUtil approvalsUtil) { this.db = db; this.approvalsUtil = approvalsUtil; } @@ -82,18 +76,17 @@ public class Votes implements ChildCollection { @Override public Map apply(ReviewerResource rsrc) throws OrmException, MethodNotAllowedException { - if (rsrc.getRevisionResource() != null - && !rsrc.getRevisionResource().isCurrent()) { - throw new MethodNotAllowedException( - "Cannot list votes on non-current patch set"); + if (rsrc.getRevisionResource() != null && !rsrc.getRevisionResource().isCurrent()) { + throw new MethodNotAllowedException("Cannot list votes on non-current patch set"); } Map votes = new TreeMap<>(); - Iterable byPatchSetUser = approvalsUtil.byPatchSetUser( - db.get(), - rsrc.getControl(), - rsrc.getChange().currentPatchSetId(), - rsrc.getReviewerUser().getAccountId()); + Iterable byPatchSetUser = + approvalsUtil.byPatchSetUser( + db.get(), + rsrc.getControl(), + rsrc.getChange().currentPatchSetId(), + rsrc.getReviewerUser().getAccountId()); for (PatchSetApproval psa : byPatchSetUser) { votes.put(psa.getLabel(), psa.getValue()); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/WalkSorter.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/WalkSorter.java index e0113b29cc..56d7ec0239 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/WalkSorter.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/WalkSorter.java @@ -29,17 +29,6 @@ import com.google.gerrit.server.git.GitRepositoryManager; import com.google.gerrit.server.query.change.ChangeData; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - -import org.eclipse.jgit.errors.IncorrectObjectTypeException; -import org.eclipse.jgit.errors.MissingObjectException; -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.revwalk.RevCommit; -import org.eclipse.jgit.revwalk.RevFlag; -import org.eclipse.jgit.revwalk.RevWalk; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.util.ArrayDeque; import java.util.ArrayList; @@ -50,38 +39,46 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import org.eclipse.jgit.errors.IncorrectObjectTypeException; +import org.eclipse.jgit.errors.MissingObjectException; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.revwalk.RevFlag; +import org.eclipse.jgit.revwalk.RevWalk; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Helper to sort {@link ChangeData}s based on {@link RevWalk} ordering. - *

- * Split changes by project, and map each change to a single commit based on the - * latest patch set. The set of patch sets considered may be limited by calling - * {@link #includePatchSets(Iterable)}. Perform a standard {@link RevWalk} on - * each project repository, do an approximate topo sort, and record the order in - * which each change's commit is seen. - *

- * Once an order within each project is determined, groups of changes are sorted - * based on the project name. This is slightly more stable than sorting on - * something like the commit or change timestamp, as it will not unexpectedly - * reorder large groups of changes on subsequent calls if one of the changes was - * updated. + * + *

Split changes by project, and map each change to a single commit based on the latest patch + * set. The set of patch sets considered may be limited by calling {@link + * #includePatchSets(Iterable)}. Perform a standard {@link RevWalk} on each project repository, do + * an approximate topo sort, and record the order in which each change's commit is seen. + * + *

Once an order within each project is determined, groups of changes are sorted based on the + * project name. This is slightly more stable than sorting on something like the commit or change + * timestamp, as it will not unexpectedly reorder large groups of changes on subsequent calls if one + * of the changes was updated. */ class WalkSorter { - private static final Logger log = - LoggerFactory.getLogger(WalkSorter.class); + private static final Logger log = LoggerFactory.getLogger(WalkSorter.class); private static final Ordering> PROJECT_LIST_SORTER = - Ordering.natural().nullsFirst().onResultOf( - (List in) -> { - if (in == null || in.isEmpty()) { - return null; - } - try { - return in.get(0).data().change().getProject(); - } catch (OrmException e) { - throw new IllegalStateException(e); - } - }); + Ordering.natural() + .nullsFirst() + .onResultOf( + (List in) -> { + if (in == null || in.isEmpty()) { + return null; + } + try { + return in.get(0).data().change().getProject(); + } catch (OrmException e) { + throw new IllegalStateException(e); + } + }); private final GitRepositoryManager repoManager; private final Set includePatchSets; @@ -103,26 +100,23 @@ class WalkSorter { return this; } - public Iterable sort(Iterable in) - throws OrmException, IOException { + public Iterable sort(Iterable in) throws OrmException, IOException { ListMultimap byProject = MultimapBuilder.hashKeys().arrayListValues().build(); for (ChangeData cd : in) { byProject.put(cd.change().getProject(), cd); } - List> sortedByProject = - new ArrayList<>(byProject.keySet().size()); - for (Map.Entry> e - : byProject.asMap().entrySet()) { + List> sortedByProject = new ArrayList<>(byProject.keySet().size()); + for (Map.Entry> e : byProject.asMap().entrySet()) { sortedByProject.add(sortProject(e.getKey(), e.getValue())); } Collections.sort(sortedByProject, PROJECT_LIST_SORTER); return Iterables.concat(sortedByProject); } - private List sortProject(Project.NameKey project, - Collection in) throws OrmException, IOException { + private List sortProject(Project.NameKey project, Collection in) + throws OrmException, IOException { try (Repository repo = repoManager.openRepository(project); RevWalk rw = new RevWalk(repo)) { rw.setRetainBody(retainBody); @@ -172,8 +166,7 @@ class WalkSorter { while (!todo.isEmpty()) { // Sanity check: we can't pop more than N pending commits, otherwise // we have an infinite loop due to programmer error or something. - checkState(++i <= commits.size(), - "Too many pending steps while sorting %s", commits); + checkState(++i <= commits.size(), "Too many pending steps while sorting %s", commits); RevCommit t = todo.removeFirst(); if (t.has(done)) { continue; @@ -195,8 +188,7 @@ class WalkSorter { } } - private static ListMultimap collectChildren( - Set commits) { + private static ListMultimap collectChildren(Set commits) { ListMultimap children = MultimapBuilder.hashKeys().arrayListValues().build(); for (RevCommit c : commits) { @@ -209,8 +201,10 @@ class WalkSorter { return children; } - private static int emit(RevCommit c, - ListMultimap byCommit, List result, + private static int emit( + RevCommit c, + ListMultimap byCommit, + List result, RevFlag done) { if (c.has(done)) { return 0; @@ -224,29 +218,26 @@ class WalkSorter { return 0; } - private ListMultimap byCommit(RevWalk rw, - Collection in) throws OrmException, IOException { + private ListMultimap byCommit(RevWalk rw, Collection in) + throws OrmException, IOException { ListMultimap byCommit = MultimapBuilder.hashKeys(in.size()).arrayListValues(1).build(); for (ChangeData cd : in) { PatchSet maxPs = null; for (PatchSet ps : cd.patchSets()) { - if (shouldInclude(ps) - && (maxPs == null || ps.getId().get() > maxPs.getId().get())) { + if (shouldInclude(ps) && (maxPs == null || ps.getId().get() > maxPs.getId().get())) { maxPs = ps; } } if (maxPs == null) { - continue; // No patch sets matched. + continue; // No patch sets matched. } ObjectId id = ObjectId.fromString(maxPs.getRevision().get()); try { RevCommit c = rw.parseCommit(id); byCommit.put(c, PatchSetData.create(cd, maxPs, c)); } catch (MissingObjectException | IncorrectObjectTypeException e) { - log.warn( - "missing commit " + id.name() + " for patch set " + maxPs.getId(), - e); + log.warn("missing commit " + id.name() + " for patch set " + maxPs.getId(), e); } } return byCommit; @@ -256,8 +247,7 @@ class WalkSorter { return includePatchSets.isEmpty() || includePatchSets.contains(ps.getId()); } - private static void markStart(RevWalk rw, Iterable commits) - throws IOException { + private static void markStart(RevWalk rw, Iterable commits) throws IOException { for (RevCommit c : commits) { rw.markStart(c); } @@ -271,7 +261,9 @@ class WalkSorter { } abstract ChangeData data(); + abstract PatchSet patchSet(); + abstract RevCommit commit(); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/AdministrateServerGroups.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/AdministrateServerGroups.java index caeb771e98..89090f4b2e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/AdministrateServerGroups.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/AdministrateServerGroups.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.config; import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.google.inject.BindingAnnotation; - import java.lang.annotation.Retention; /** @@ -30,5 +29,4 @@ import java.lang.annotation.Retention; */ @Retention(RUNTIME) @BindingAnnotation -public @interface AdministrateServerGroups { -} +public @interface AdministrateServerGroups {} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/AdministrateServerGroupsProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/AdministrateServerGroupsProvider.java index dd3b83292a..29f288a4f2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/AdministrateServerGroupsProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/AdministrateServerGroupsProvider.java @@ -24,7 +24,6 @@ import com.google.gerrit.server.util.ServerRequestContext; import com.google.gerrit.server.util.ThreadLocalRequestContext; import com.google.inject.Inject; import com.google.inject.Provider; - import org.eclipse.jgit.lib.Config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,7 +33,8 @@ public class AdministrateServerGroupsProvider implements Provider groups; @Inject - public AdministrateServerGroupsProvider(GroupBackend groupBackend, + public AdministrateServerGroupsProvider( + GroupBackend groupBackend, @GerritServerConfig Config config, ThreadLocalRequestContext threadContext, ServerRequestContext serverCtx) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/AgreementJson.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/AgreementJson.java index 3ababbc2f4..83eca9c27f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/AgreementJson.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/AgreementJson.java @@ -26,13 +26,11 @@ import com.google.gerrit.server.group.GroupResource; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class AgreementJson { - private static final Logger log = - LoggerFactory.getLogger(AgreementJson.class); + private static final Logger log = LoggerFactory.getLogger(AgreementJson.class); private final Provider self; private final IdentifiedUser.GenericFactory identifiedUserFactory; @@ -40,7 +38,8 @@ public class AgreementJson { private final GroupJson groupJson; @Inject - AgreementJson(Provider self, + AgreementJson( + Provider self, IdentifiedUser.GenericFactory identifiedUserFactory, GroupControl.GenericFactory genericGroupControlFactory, GroupJson groupJson) { @@ -57,16 +56,18 @@ public class AgreementJson { info.url = ca.getAgreementUrl(); GroupReference autoVerifyGroup = ca.getAutoVerify(); if (autoVerifyGroup != null && self.get().isIdentifiedUser()) { - IdentifiedUser user = - identifiedUserFactory.create(self.get().getAccountId()); + IdentifiedUser user = identifiedUserFactory.create(self.get().getAccountId()); try { - GroupControl gc = genericGroupControlFactory.controlFor( - user, autoVerifyGroup.getUUID()); + GroupControl gc = genericGroupControlFactory.controlFor(user, autoVerifyGroup.getUUID()); GroupResource group = new GroupResource(gc); info.autoVerifyGroup = groupJson.format(group); } catch (NoSuchGroupException | OrmException e) { - log.warn("autoverify group \"" + autoVerifyGroup.getName() + - "\" does not exist, referenced in CLA \"" + ca.getName() + "\""); + log.warn( + "autoverify group \"" + + autoVerifyGroup.getName() + + "\" does not exist, referenced in CLA \"" + + ca.getName() + + "\""); } } return info; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/AllProjectsNameProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/AllProjectsNameProvider.java index af681dbfa5..3250185239 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/AllProjectsNameProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/AllProjectsNameProvider.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.config; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import org.eclipse.jgit.lib.Config; @Singleton diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/AllUsersNameProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/AllUsersNameProvider.java index 09f1c50950..0020d5cabb 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/AllUsersNameProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/AllUsersNameProvider.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.config; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import org.eclipse.jgit.lib.Config; @Singleton diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/AnonymousCowardName.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/AnonymousCowardName.java index 197d64e779..3cc0a8f514 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/AnonymousCowardName.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/AnonymousCowardName.java @@ -17,11 +17,9 @@ package com.google.gerrit.server.config; import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.google.inject.BindingAnnotation; - import java.lang.annotation.Retention; /** Special name for a user that hasn't set a name. */ @Retention(RUNTIME) @BindingAnnotation -public @interface AnonymousCowardName { -} +public @interface AnonymousCowardName {} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/AnonymousCowardNameProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/AnonymousCowardNameProvider.java index b44affa4c8..3f3d6fd269 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/AnonymousCowardNameProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/AnonymousCowardNameProvider.java @@ -16,7 +16,6 @@ package com.google.gerrit.server.config; import com.google.inject.Inject; import com.google.inject.Provider; - import org.eclipse.jgit.lib.Config; public class AnonymousCowardNameProvider implements Provider { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/AuthConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/AuthConfig.java index 11a34f7de4..db7d5675e1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/AuthConfig.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/AuthConfig.java @@ -22,15 +22,13 @@ import com.google.gwtjsonrpc.server.SignedToken; import com.google.gwtjsonrpc.server.XsrfException; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.Config; - import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.concurrent.TimeUnit; +import org.eclipse.jgit.lib.Config; /** Authentication related settings from {@code gerrit.config}. */ @Singleton @@ -66,8 +64,7 @@ public class AuthConfig { private GitBasicAuthPolicy gitBasicAuthPolicy; @Inject - AuthConfig(@GerritServerConfig final Config cfg) - throws XsrfException { + AuthConfig(@GerritServerConfig final Config cfg) throws XsrfException { authType = toType(cfg); httpHeader = cfg.getString("auth", null, "httpheader"); httpDisplaynameHeader = cfg.getString("auth", null, "httpdisplaynameheader"); @@ -93,17 +90,21 @@ public class AuthConfig { enableRunAs = cfg.getBoolean("auth", null, "enableRunAs", true); gitBasicAuth = cfg.getBoolean("auth", "gitBasicAuth", false); gitBasicAuthPolicy = getBasicAuthPolicy(cfg); - useContributorAgreements = - cfg.getBoolean("auth", "contributoragreements", false); + useContributorAgreements = cfg.getBoolean("auth", "contributoragreements", false); userNameToLowerCase = cfg.getBoolean("auth", "userNameToLowerCase", false); allowRegisterNewEmail = cfg.getBoolean("auth", "allowRegisterNewEmail", true); String key = cfg.getString("auth", null, "registerEmailPrivateKey"); if (key != null && !key.isEmpty()) { - int age = (int) ConfigUtil.getTimeUnit(cfg, - "auth", null, "maxRegisterEmailTokenAge", - TimeUnit.SECONDS.convert(12, TimeUnit.HOURS), - TimeUnit.SECONDS); + int age = + (int) + ConfigUtil.getTimeUnit( + cfg, + "auth", + null, + "maxRegisterEmailTokenAge", + TimeUnit.SECONDS.convert(12, TimeUnit.HOURS), + TimeUnit.SECONDS); emailReg = new SignedToken(age, key); } else { emailReg = null; @@ -314,8 +315,7 @@ public class AuthConfig { } public boolean isLdapAuthType() { - return authType == AuthType.LDAP || - authType == AuthType.LDAP_BIND; + return authType == AuthType.LDAP || authType == AuthType.LDAP_BIND; } public boolean isAllowRegisterNewEmail() { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/CacheResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/CacheResource.java index 05ad33d131..7b407865de 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/CacheResource.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/CacheResource.java @@ -32,12 +32,15 @@ public class CacheResource extends ConfigResource { } public CacheResource(String pluginName, String cacheName, final Cache cache) { - this(pluginName, cacheName, new Provider>() { - @Override - public Cache get() { - return cache; - } - }); + this( + pluginName, + cacheName, + new Provider>() { + @Override + public Cache get() { + return cache; + } + }); } public String getName() { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/CachesCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/CachesCollection.java index 7b567e1e9d..f002f8d721 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/CachesCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/CachesCollection.java @@ -35,8 +35,8 @@ import com.google.inject.Singleton; @RequiresAnyCapability({VIEW_CACHES, MAINTAIN_SERVER}) @Singleton -public class CachesCollection implements - ChildCollection, AcceptsPost { +public class CachesCollection + implements ChildCollection, AcceptsPost { private final DynamicMap> views; private final Provider list; @@ -45,8 +45,10 @@ public class CachesCollection implements private final PostCaches postCaches; @Inject - CachesCollection(DynamicMap> views, - Provider list, Provider self, + CachesCollection( + DynamicMap> views, + Provider list, + Provider self, DynamicMap> cacheMap, PostCaches postCaches) { this.views = views; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/CanonicalWebUrl.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/CanonicalWebUrl.java index e40c6a15d2..c8d39b0a3a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/CanonicalWebUrl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/CanonicalWebUrl.java @@ -17,17 +17,15 @@ package com.google.gerrit.server.config; import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.google.inject.BindingAnnotation; - import java.lang.annotation.Retention; /** * Marker on a {@link String} holding the canonical address for this server. - *

- * Note that the String may be null, if the administrator has not configured the - * value and we are not in an HTTP request where the URL can be guessed from the - * request state. Clients must handle such cases explicitly. + * + *

Note that the String may be null, if the administrator has not configured the value and we are + * not in an HTTP request where the URL can be guessed from the request state. Clients must handle + * such cases explicitly. */ @Retention(RUNTIME) @BindingAnnotation -public @interface CanonicalWebUrl { -} +public @interface CanonicalWebUrl {} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/CanonicalWebUrlModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/CanonicalWebUrlModule.java index 8d66d33562..646d395225 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/CanonicalWebUrlModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/CanonicalWebUrlModule.java @@ -29,8 +29,7 @@ public abstract class CanonicalWebUrlModule extends AbstractModule { // running in an HTTP environment. // final Class> provider = provider(); - bind(String.class).annotatedWith(CanonicalWebUrl.class) - .toProvider(provider); + bind(String.class).annotatedWith(CanonicalWebUrl.class).toProvider(provider); } protected abstract Class> provider(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/CanonicalWebUrlProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/CanonicalWebUrlProvider.java index 3cce4f0810..e670e2cdc5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/CanonicalWebUrlProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/CanonicalWebUrlProvider.java @@ -16,7 +16,6 @@ package com.google.gerrit.server.config; import com.google.inject.Inject; import com.google.inject.Provider; - import org.eclipse.jgit.lib.Config; /** Provides {@link CanonicalWebUrl} from {@code gerrit.canonicalWebUrl}. */ diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/CapabilitiesCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/CapabilitiesCollection.java index 7ce5a88559..1124048df2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/CapabilitiesCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/CapabilitiesCollection.java @@ -23,14 +23,12 @@ import com.google.inject.Inject; import com.google.inject.Singleton; @Singleton -public class CapabilitiesCollection implements - ChildCollection { +public class CapabilitiesCollection implements ChildCollection { private final DynamicMap> views; private final ListCapabilities list; @Inject - CapabilitiesCollection(DynamicMap> views, - ListCapabilities list) { + CapabilitiesCollection(DynamicMap> views, ListCapabilities list) { this.views = views; this.list = list; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ChangeCleanupConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/ChangeCleanupConfig.java index b4b1865a43..b2b5fab1f8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/ChangeCleanupConfig.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/ChangeCleanupConfig.java @@ -18,10 +18,8 @@ import com.google.common.base.Strings; import com.google.gerrit.common.Nullable; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.Config; - import java.util.concurrent.TimeUnit; +import org.eclipse.jgit.lib.Config; @Singleton public class ChangeCleanupConfig { @@ -31,9 +29,9 @@ public class ChangeCleanupConfig { private static String KEY_ABANDON_MESSAGE = "abandonMessage"; private static String DEFAULT_ABANDON_MESSAGE = "Auto-Abandoned due to inactivity, see " - + "${URL}Documentation/user-change-cleanup.html#auto-abandon\n" - + "\n" - + "If this change is still wanted it should be restored."; + + "${URL}Documentation/user-change-cleanup.html#auto-abandon\n" + + "\n" + + "If this change is still wanted it should be restored."; private final ScheduleConfig scheduleConfig; private final long abandonAfter; @@ -41,19 +39,17 @@ public class ChangeCleanupConfig { private final String abandonMessage; @Inject - ChangeCleanupConfig(@GerritServerConfig Config cfg, - @CanonicalWebUrl @Nullable String canonicalWebUrl) { + ChangeCleanupConfig( + @GerritServerConfig Config cfg, @CanonicalWebUrl @Nullable String canonicalWebUrl) { scheduleConfig = new ScheduleConfig(cfg, SECTION); abandonAfter = readAbandonAfter(cfg); - abandonIfMergeable = - cfg.getBoolean(SECTION, null, KEY_ABANDON_IF_MERGEABLE, true); + abandonIfMergeable = cfg.getBoolean(SECTION, null, KEY_ABANDON_IF_MERGEABLE, true); abandonMessage = readAbandonMessage(cfg, canonicalWebUrl); } private long readAbandonAfter(Config cfg) { long abandonAfter = - ConfigUtil.getTimeUnit(cfg, SECTION, null, KEY_ABANDON_AFTER, 0, - TimeUnit.MILLISECONDS); + ConfigUtil.getTimeUnit(cfg, SECTION, null, KEY_ABANDON_AFTER, 0, TimeUnit.MILLISECONDS); return abandonAfter >= 0 ? abandonAfter : 0; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfigCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfigCollection.java index 72c4f2e92d..d5d29608a7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfigCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfigCollection.java @@ -24,8 +24,7 @@ import com.google.inject.Inject; import com.google.inject.Singleton; @Singleton -public class ConfigCollection implements - RestCollection { +public class ConfigCollection implements RestCollection { private final DynamicMap> views; @Inject @@ -44,8 +43,7 @@ public class ConfigCollection implements } @Override - public ConfigResource parse(TopLevelResource root, IdString id) - throws ResourceNotFoundException { + public ConfigResource parse(TopLevelResource root, IdString id) throws ResourceNotFoundException { if (id.equals("server")) { return new ConfigResource(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfigUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfigUtil.java index eaeb850643..0da1d3b9aa 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfigUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfigUtil.java @@ -15,10 +15,6 @@ package com.google.gerrit.server.config; import com.google.common.base.Preconditions; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.Config; - import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Modifier; @@ -29,6 +25,8 @@ import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.Config; public class ConfigUtil { @@ -36,8 +34,10 @@ public class ConfigUtil { private static T[] allValuesOf(final T defaultValue) { try { return (T[]) defaultValue.getClass().getMethod("values").invoke(null); - } catch (IllegalArgumentException | NoSuchMethodException - | InvocationTargetException | IllegalAccessException + } catch (IllegalArgumentException + | NoSuchMethodException + | InvocationTargetException + | IllegalAccessException | SecurityException e) { throw new IllegalArgumentException("Cannot obtain enumeration values", e); } @@ -51,12 +51,15 @@ public class ConfigUtil { * @param subsection subsection the key is in, or null if not in a subsection. * @param setting name of the setting to read. * @param valueString string value from git Config - * @param all all possible values in the enumeration which should be - * recognized. This should be {@code EnumType.values()}. + * @param all all possible values in the enumeration which should be recognized. This should be + * {@code EnumType.values()}. * @return the selected enumeration value, or {@code defaultValue}. */ - private static > T getEnum(final String section, - final String subsection, final String setting, String valueString, + private static > T getEnum( + final String section, + final String subsection, + final String setting, + String valueString, final T[] all) { String n = valueString.replace(' ', '_').replace('-', '_'); @@ -94,12 +97,15 @@ public class ConfigUtil { * @param section section the key is in. * @param subsection subsection the key is in, or null if not in a subsection. * @param setting name of the setting to read. - * @param defaultValue default value to return if the setting was not set. - * Must not be null as the enumeration values are derived from this. + * @param defaultValue default value to return if the setting was not set. Must not be null as the + * enumeration values are derived from this. * @return the selected enumeration values list, or {@code defaultValue}. */ - public static > List getEnumList(final Config config, - final String section, final String subsection, final String setting, + public static > List getEnumList( + final Config config, + final String section, + final String subsection, + final String setting, final T defaultValue) { final T[] all = allValuesOf(defaultValue); return getEnumList(config, section, subsection, setting, all, defaultValue); @@ -113,15 +119,18 @@ public class ConfigUtil { * @param section section the key is in. * @param subsection subsection the key is in, or null if not in a subsection. * @param setting name of the setting to read. - * @param all all possible values in the enumeration which should be - * recognized. This should be {@code EnumType.values()}. - * @param defaultValue default value to return if the setting was not set. - * This value may be null. + * @param all all possible values in the enumeration which should be recognized. This should be + * {@code EnumType.values()}. + * @param defaultValue default value to return if the setting was not set. This value may be null. * @return the selected enumeration values list, or {@code defaultValue}. */ - public static > List getEnumList(final Config config, - final String section, final String subsection, final String setting, - final T[] all, final T defaultValue) { + public static > List getEnumList( + final Config config, + final String section, + final String subsection, + final String setting, + final T[] all, + final T defaultValue) { final List list = new ArrayList<>(); final String[] values = config.getStringList(section, subsection, setting); if (values.length == 0) { @@ -143,16 +152,17 @@ public class ConfigUtil { * @param section section the key is in. * @param subsection subsection the key is in, or null if not in a subsection. * @param setting name of the setting to read. - * @param defaultValue default value to return if no value was set in the - * configuration file. - * @param wantUnit the units of {@code defaultValue} and the return value, as - * well as the units to assume if the value does not contain an - * indication of the units. - * @return the setting, or {@code defaultValue} if not set, expressed in - * {@code units}. + * @param defaultValue default value to return if no value was set in the configuration file. + * @param wantUnit the units of {@code defaultValue} and the return value, as well as the units to + * assume if the value does not contain an indication of the units. + * @return the setting, or {@code defaultValue} if not set, expressed in {@code units}. */ - public static long getTimeUnit(final Config config, final String section, - final String subsection, final String setting, final long defaultValue, + public static long getTimeUnit( + final Config config, + final String section, + final String subsection, + final String setting, + final long defaultValue, final TimeUnit wantUnit) { final String valueString = config.getString(section, subsection, setting); if (valueString == null) { @@ -164,7 +174,7 @@ public class ConfigUtil { return defaultValue; } - if (s.startsWith("-")/* negative */) { + if (s.startsWith("-") /* negative */) { throw notTimeUnit(section, subsection, setting, valueString); } @@ -179,16 +189,12 @@ public class ConfigUtil { * Parse a numerical time unit, such as "1 minute", from a string. * * @param valueString the string to parse. - * @param defaultValue default value to return if no value was set in the - * configuration file. - * @param wantUnit the units of {@code defaultValue} and the return value, as - * well as the units to assume if the value does not contain an - * indication of the units. - * @return the setting, or {@code defaultValue} if not set, expressed in - * {@code units}. + * @param defaultValue default value to return if no value was set in the configuration file. + * @param wantUnit the units of {@code defaultValue} and the return value, as well as the units to + * assume if the value does not contain an indication of the units. + * @return the setting, or {@code defaultValue} if not set, expressed in {@code units}. */ - public static long getTimeUnit(final String valueString, long defaultValue, - TimeUnit wantUnit) { + public static long getTimeUnit(final String valueString, long defaultValue, TimeUnit wantUnit) { Matcher m = Pattern.compile("^(0|[1-9][0-9]*)\\s*(.*)$").matcher(valueString); if (!m.matches()) { return defaultValue; @@ -250,19 +256,18 @@ public class ConfigUtil { public static String getRequired(Config cfg, String section, String name) { final String v = cfg.getString(section, null, name); if (v == null || "".equals(v)) { - throw new IllegalArgumentException("No " + section + "." + name - + " configured"); + throw new IllegalArgumentException("No " + section + "." + name + " configured"); } return v; } /** * Store section by inspecting Java class attributes. - *

- * Optimize the storage by unsetting a variable if it is - * being set to default value by the server. - *

- * Fields marked with final or transient modifiers are skipped. + * + *

Optimize the storage by unsetting a variable if it is being set to default value by the + * server. + * + *

Fields marked with final or transient modifiers are skipped. * * @param cfg config in which the values should be stored * @param section section @@ -271,8 +276,8 @@ public class ConfigUtil { * @param defaults instance of class with default values * @throws ConfigInvalidException */ - public static void storeSection(Config cfg, String section, String sub, - T s, T defaults) throws ConfigInvalidException { + public static void storeSection(Config cfg, String section, String sub, T s, T defaults) + throws ConfigInvalidException { try { for (Field f : s.getClass().getDeclaredFields()) { if (skipField(f)) { @@ -307,32 +312,31 @@ public class ConfigUtil { } } } - } catch (SecurityException | IllegalArgumentException - | IllegalAccessException e) { + } catch (SecurityException | IllegalArgumentException | IllegalAccessException e) { throw new ConfigInvalidException("cannot save values", e); } } /** * Load section by inspecting Java class attributes. - *

- * Config values are stored optimized: no default values are stored. - * The loading is performed eagerly: all values are set. - *

- * Fields marked with final or transient modifiers are skipped. + * + *

Config values are stored optimized: no default values are stored. The loading is performed + * eagerly: all values are set. + * + *

Fields marked with final or transient modifiers are skipped. * * @param cfg config from which the values are loaded * @param section section * @param sub subsection * @param s instance of class in which the values are set * @param defaults instance of class with default values - * @param i instance to merge during the load. When present, the - * boolean fields are not nullified when their values are false + * @param i instance to merge during the load. When present, the boolean fields are not nullified + * when their values are false * @return loaded instance * @throws ConfigInvalidException */ - public static T loadSection(Config cfg, String section, String sub, - T s, T defaults, T i) throws ConfigInvalidException { + public static T loadSection(Config cfg, String section, String sub, T s, T defaults, T i) + throws ConfigInvalidException { try { for (Field f : s.getClass().getDeclaredFields()) { if (skipField(f)) { @@ -348,7 +352,7 @@ public class ConfigUtil { if (isString(t)) { String v = cfg.getString(section, sub, n); if (v == null) { - v = (String)d; + v = (String) d; } f.set(s, v); } else if (isInteger(t)) { @@ -375,8 +379,7 @@ public class ConfigUtil { } } } - } catch (SecurityException | IllegalArgumentException - | IllegalAccessException e) { + } catch (SecurityException | IllegalArgumentException | IllegalAccessException e) { throw new ConfigInvalidException("cannot load values", e); } return s; @@ -388,8 +391,7 @@ public class ConfigUtil { } private static boolean isCollectionOrMap(Class t) { - return Collection.class.isAssignableFrom(t) - || Map.class.isAssignableFrom(t); + return Collection.class.isAssignableFrom(t) || Map.class.isAssignableFrom(t); } private static boolean isString(Class t) { @@ -417,17 +419,24 @@ public class ConfigUtil { return false; } - private static IllegalArgumentException notTimeUnit(final String section, - final String subsection, final String setting, final String valueString) { - return new IllegalArgumentException("Invalid time unit value: " + section - + (subsection != null ? "." + subsection : "") + "." + setting + " = " - + valueString); + private static IllegalArgumentException notTimeUnit( + final String section, + final String subsection, + final String setting, + final String valueString) { + return new IllegalArgumentException( + "Invalid time unit value: " + + section + + (subsection != null ? "." + subsection : "") + + "." + + setting + + " = " + + valueString); } private static IllegalArgumentException notTimeUnit(final String val) { return new IllegalArgumentException("Invalid time unit value: " + val); } - private ConfigUtil() { - } + private ConfigUtil() {} } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfirmEmail.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfirmEmail.java index 81a33660aa..35c9012d59 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfirmEmail.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfirmEmail.java @@ -29,14 +29,12 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; @Singleton public class ConfirmEmail implements RestModifyView { public static class Input { - @DefaultInput - public String token; + @DefaultInput public String token; } private final Provider self; @@ -44,7 +42,8 @@ public class ConfirmEmail implements RestModifyView { private final AccountManager accountManager; @Inject - public ConfirmEmail(Provider self, + public ConfirmEmail( + Provider self, EmailTokenVerifier emailTokenVerifier, AccountManager accountManager) { this.self = self; @@ -54,8 +53,8 @@ public class ConfirmEmail implements RestModifyView { @Override public Response apply(ConfigResource rsrc, Input input) - throws AuthException, UnprocessableEntityException, AccountException, - OrmException, IOException { + throws AuthException, UnprocessableEntityException, AccountException, OrmException, + IOException { CurrentUser user = self.get(); if (!user.isIdentifiedUser()) { throw new AuthException("Authentication required"); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/DeleteTask.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/DeleteTask.java index 1e8afbac82..29ca20f993 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/DeleteTask.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/DeleteTask.java @@ -28,14 +28,14 @@ import com.google.inject.Singleton; @Singleton @RequiresAnyCapability({KILL_TASK, MAINTAIN_SERVER}) public class DeleteTask implements RestModifyView { - public static class Input { - } + public static class Input {} @Override public Response apply(TaskResource rsrc, Input input) { Task task = rsrc.getTask(); boolean taskDeleted = task.cancel(true); - return taskDeleted ? Response.none() : Response.withStatusCode( - SC_INTERNAL_SERVER_ERROR, "Unable to kill task " + task); + return taskDeleted + ? Response.none() + : Response.withStatusCode(SC_INTERNAL_SERVER_ERROR, "Unable to kill task " + task); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/DisableReverseDnsLookup.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/DisableReverseDnsLookup.java index 04712f96a0..336edeb491 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/DisableReverseDnsLookup.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/DisableReverseDnsLookup.java @@ -17,10 +17,8 @@ package com.google.gerrit.server.config; import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.google.inject.BindingAnnotation; - import java.lang.annotation.Retention; @Retention(RUNTIME) @BindingAnnotation -public @interface DisableReverseDnsLookup { -} +public @interface DisableReverseDnsLookup {} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/DisableReverseDnsLookupProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/DisableReverseDnsLookupProvider.java index 8c4271493c..87d6bac24c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/DisableReverseDnsLookupProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/DisableReverseDnsLookupProvider.java @@ -16,7 +16,6 @@ package com.google.gerrit.server.config; import com.google.inject.Inject; import com.google.inject.Provider; - import org.eclipse.jgit.lib.Config; public class DisableReverseDnsLookupProvider implements Provider { @@ -24,8 +23,7 @@ public class DisableReverseDnsLookupProvider implements Provider { @Inject DisableReverseDnsLookupProvider(@GerritServerConfig Config config) { - disableReverseDnsLookup = - config.getBoolean("gerrit", null, "disableReverseDnsLookup", false); + disableReverseDnsLookup = config.getBoolean("gerrit", null, "disableReverseDnsLookup", false); } @Override diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/DownloadConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/DownloadConfig.java index 2db4ec9c3a..48d4507d61 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/DownloadConfig.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/DownloadConfig.java @@ -20,20 +20,18 @@ import com.google.gerrit.reviewdb.client.CoreDownloadSchemes; import com.google.gerrit.server.change.ArchiveFormat; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.Config; - import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.EnumSet; import java.util.List; +import org.eclipse.jgit.lib.Config; /** * Download protocol from {@code gerrit.config}. - *

- * Only used to configure the built-in set of schemes and commands in the core - * download-commands plugin; not used by other plugins. + * + *

Only used to configure the built-in set of schemes and commands in the core download-commands + * plugin; not used by other plugins. */ @Singleton public class DownloadConfig { @@ -45,17 +43,15 @@ public class DownloadConfig { DownloadConfig(@GerritServerConfig final Config cfg) { String[] allSchemes = cfg.getStringList("download", null, "scheme"); if (allSchemes.length == 0) { - downloadSchemes = ImmutableSet.of( - CoreDownloadSchemes.SSH, - CoreDownloadSchemes.HTTP, - CoreDownloadSchemes.ANON_HTTP); + downloadSchemes = + ImmutableSet.of( + CoreDownloadSchemes.SSH, CoreDownloadSchemes.HTTP, CoreDownloadSchemes.ANON_HTTP); } else { List normalized = new ArrayList<>(allSchemes.length); for (String s : allSchemes) { String core = toCoreScheme(s); if (core == null) { - throw new IllegalArgumentException( - "not a core download scheme: " + s); + throw new IllegalArgumentException("not a core download scheme: " + s); } normalized.add(core); } @@ -64,8 +60,7 @@ public class DownloadConfig { DownloadCommand[] downloadCommandValues = DownloadCommand.values(); List allCommands = - ConfigUtil.getEnumList(cfg, "download", null, "command", - downloadCommandValues, null); + ConfigUtil.getEnumList(cfg, "download", null, "command", downloadCommandValues, null); if (isOnlyNull(allCommands)) { downloadCommands = ImmutableSet.copyOf(downloadCommandValues); } else { @@ -78,9 +73,9 @@ public class DownloadConfig { } else if (v.isEmpty() || "off".equalsIgnoreCase(v)) { archiveFormats = ImmutableSet.of(); } else { - archiveFormats = ImmutableSet.copyOf(ConfigUtil.getEnumList(cfg, - "download", null, "archive", - ArchiveFormat.TGZ)); + archiveFormats = + ImmutableSet.copyOf( + ConfigUtil.getEnumList(cfg, "download", null, "archive", ArchiveFormat.TGZ)); } } @@ -96,7 +91,9 @@ public class DownloadConfig { return (String) f.get(null); } return null; - } catch (NoSuchFieldException | SecurityException | IllegalArgumentException + } catch (NoSuchFieldException + | SecurityException + | IllegalArgumentException | IllegalAccessException e) { return null; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/EmailExpanderProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/EmailExpanderProvider.java index a55ef84de5..1c42c09a47 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/EmailExpanderProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/EmailExpanderProvider.java @@ -12,13 +12,11 @@ // See the License for the specific language governing permissions and // limitations under the License. - package com.google.gerrit.server.config; import com.google.gerrit.server.account.EmailExpander; import com.google.inject.Inject; import com.google.inject.Provider; - import org.eclipse.jgit.lib.Config; class EmailExpanderProvider implements Provider { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/FlushCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/FlushCache.java index eb5ef225fb..5e190910a9 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/FlushCache.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/FlushCache.java @@ -30,8 +30,7 @@ import com.google.inject.Singleton; @RequiresAnyCapability({FLUSH_CACHES, MAINTAIN_SERVER}) @Singleton public class FlushCache implements RestModifyView { - public static class Input { - } + public static class Input {} public static final String WEB_SESSIONS = "web_sessions"; @@ -43,12 +42,9 @@ public class FlushCache implements RestModifyView { } @Override - public Response apply(CacheResource rsrc, Input input) - throws AuthException { - if (WEB_SESSIONS.equals(rsrc.getName()) - && !self.get().getCapabilities().canMaintainServer()) { - throw new AuthException(String.format( - "only site maintainers can flush %s", WEB_SESSIONS)); + public Response apply(CacheResource rsrc, Input input) throws AuthException { + if (WEB_SESSIONS.equals(rsrc.getName()) && !self.get().getCapabilities().canMaintainServer()) { + throw new AuthException(String.format("only site maintainers can flush %s", WEB_SESSIONS)); } rsrc.getCache().invalidateAll(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GcConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GcConfig.java index 572b56ec73..36f5e29f1f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GcConfig.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GcConfig.java @@ -16,7 +16,6 @@ package com.google.gerrit.server.config; import com.google.inject.Inject; import com.google.inject.Singleton; - import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.ConfigConstants; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritConfig.java index fff29fa2cf..fdc3b7f3b8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritConfig.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritConfig.java @@ -15,7 +15,6 @@ package com.google.gerrit.server.config; import com.google.gerrit.server.securestore.SecureStore; - import org.eclipse.jgit.lib.Config; class GerritConfig extends Config { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java index e941de04dc..a0867ae239 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java @@ -181,33 +181,27 @@ import com.google.inject.Inject; import com.google.inject.TypeLiteral; import com.google.inject.internal.UniqueAnnotations; import com.google.template.soy.tofu.SoyTofu; - +import java.util.List; import org.apache.velocity.runtime.RuntimeInstance; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.transport.PostReceiveHook; import org.eclipse.jgit.transport.PostUploadHook; import org.eclipse.jgit.transport.PreUploadHook; -import java.util.List; - - /** Starts global state with standard dependencies. */ public class GerritGlobalModule extends FactoryModule { private final Config cfg; private final AuthModule authModule; @Inject - GerritGlobalModule( - @GerritServerConfig Config cfg, - AuthModule authModule) { + GerritGlobalModule(@GerritServerConfig Config cfg, AuthModule authModule) { this.cfg = cfg; this.authModule = authModule; } @Override protected void configure() { - bind(EmailExpander.class).toProvider(EmailExpanderProvider.class).in( - SINGLETON); + bind(EmailExpander.class).toProvider(EmailExpanderProvider.class).in(SINGLETON); bind(IdGenerator.class); bind(RulesCache.class); @@ -262,9 +256,7 @@ public class GerritGlobalModule extends FactoryModule { factory(ReplacePatchSetSender.Factory.class); factory(SetAssigneeSender.Factory.class); bind(PermissionCollection.Factory.class); - bind(AccountVisibility.class) - .toProvider(AccountVisibilityProvider.class) - .in(SINGLETON); + bind(AccountVisibility.class).toProvider(AccountVisibilityProvider.class).in(SINGLETON); factory(ProjectOwnerGroupsProvider.Factory.class); bind(AuthBackend.class).to(UniversalAuthBackend.class).in(SINGLETON); @@ -283,15 +275,13 @@ public class GerritGlobalModule extends FactoryModule { bind(ApprovalsUtil.class); - bind(RuntimeInstance.class) - .toProvider(VelocityRuntimeProvider.class); - bind(SoyTofu.class) - .annotatedWith(MailTemplates.class) - .toProvider(MailSoyTofuProvider.class); - bind(FromAddressGenerator.class).toProvider( - FromAddressGeneratorProvider.class).in(SINGLETON); - bind(Boolean.class).annotatedWith(DisableReverseDnsLookup.class) - .toProvider(DisableReverseDnsLookupProvider.class).in(SINGLETON); + bind(RuntimeInstance.class).toProvider(VelocityRuntimeProvider.class); + bind(SoyTofu.class).annotatedWith(MailTemplates.class).toProvider(MailSoyTofuProvider.class); + bind(FromAddressGenerator.class).toProvider(FromAddressGeneratorProvider.class).in(SINGLETON); + bind(Boolean.class) + .annotatedWith(DisableReverseDnsLookup.class) + .toProvider(DisableReverseDnsLookupProvider.class) + .in(SINGLETON); bind(PatchSetInfoFactory.class); bind(IdentifiedUser.GenericFactory.class).in(SINGLETON); @@ -404,7 +394,8 @@ public class GerritGlobalModule extends FactoryModule { factory(ChangeUserName.Factory.class); bind(new TypeLiteral>() {}) - .toProvider(CommentLinkProvider.class).in(SINGLETON); + .toProvider(CommentLinkProvider.class) + .in(SINGLETON); bind(ReloadPluginListener.class) .annotatedWith(UniqueAnnotations.create()) diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritOptions.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritOptions.java index ab4b463ead..725a69a220 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritOptions.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritOptions.java @@ -18,7 +18,6 @@ import static com.google.common.base.MoreObjects.firstNonNull; import static com.google.common.base.Preconditions.checkArgument; import com.google.gerrit.extensions.client.UiType; - import org.eclipse.jgit.lib.Config; public class GerritOptions { @@ -29,31 +28,24 @@ public class GerritOptions { private final boolean forcePolyGerritDev; private final UiType defaultUi; - public GerritOptions(Config cfg, boolean headless, boolean slave, - boolean forcePolyGerritDev) { + public GerritOptions(Config cfg, boolean headless, boolean slave, boolean forcePolyGerritDev) { this.slave = slave; - this.enablePolyGerrit = forcePolyGerritDev - || cfg.getBoolean("gerrit", null, "enablePolyGerrit", true); + this.enablePolyGerrit = + forcePolyGerritDev || cfg.getBoolean("gerrit", null, "enablePolyGerrit", true); this.enableGwtUi = cfg.getBoolean("gerrit", null, "enableGwtUi", true); this.forcePolyGerritDev = forcePolyGerritDev; this.headless = headless || (!enableGwtUi && !enablePolyGerrit); - UiType defaultUi = enablePolyGerrit && !enableGwtUi - ? UiType.POLYGERRIT - : UiType.GWT; - String uiStr = firstNonNull( - cfg.getString("gerrit", null, "ui"), - defaultUi.name()); + UiType defaultUi = enablePolyGerrit && !enableGwtUi ? UiType.POLYGERRIT : UiType.GWT; + String uiStr = firstNonNull(cfg.getString("gerrit", null, "ui"), defaultUi.name()); this.defaultUi = firstNonNull(UiType.parse(uiStr), UiType.NONE); switch (defaultUi) { case GWT: - checkArgument(enableGwtUi, - "gerrit.ui = %s but GWT UI is disabled", defaultUi); + checkArgument(enableGwtUi, "gerrit.ui = %s but GWT UI is disabled", defaultUi); break; case POLYGERRIT: - checkArgument(enablePolyGerrit, - "gerrit.ui = %s but PolyGerrit is disabled", defaultUi); + checkArgument(enablePolyGerrit, "gerrit.ui = %s but PolyGerrit is disabled", defaultUi); break; case NONE: default: diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerConfig.java index 0dc1e683b8..ead0d6362a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerConfig.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerConfig.java @@ -17,16 +17,14 @@ package com.google.gerrit.server.config; import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.google.inject.BindingAnnotation; - import java.lang.annotation.Retention; /** * Marker on {@link org.eclipse.jgit.lib.Config} holding {@code gerrit.config} . - *

- * The {@code gerrit.config} file contains almost all site-wide configuration - * settings for the Gerrit Code Review server. + * + *

The {@code gerrit.config} file contains almost all site-wide configuration settings for the + * Gerrit Code Review server. */ @Retention(RUNTIME) @BindingAnnotation -public @interface GerritServerConfig { -} +public @interface GerritServerConfig {} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerConfigModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerConfigModule.java index 281600d05f..100a7cde9a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerConfigModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerConfigModule.java @@ -23,15 +23,13 @@ import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.ProvisionException; - +import java.io.IOException; +import java.nio.file.Path; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.storage.file.FileBasedConfig; import org.eclipse.jgit.util.FS; -import java.io.IOException; -import java.nio.file.Path; - /** Creates {@link GerritServerConfig}. */ public class GerritServerConfigModule extends AbstractModule { public static String getSecureStoreClassName(final Path sitePath) { @@ -44,13 +42,14 @@ public class GerritServerConfigModule extends AbstractModule { } private static String getSecureStoreFromGerritConfig(final Path sitePath) { - AbstractModule m = new AbstractModule() { - @Override - protected void configure() { - bind(Path.class).annotatedWith(SitePath.class).toInstance(sitePath); - bind(SitePaths.class); - } - }; + AbstractModule m = + new AbstractModule() { + @Override + protected void configure() { + bind(Path.class).annotatedWith(SitePath.class).toInstance(sitePath); + bind(SitePaths.class); + } + }; Injector injector = Guice.createInjector(m); SitePaths site = injector.getInstance(SitePaths.class); FileBasedConfig cfg = new FileBasedConfig(site.gerrit_config.toFile(), FS.DETECTED); @@ -74,9 +73,11 @@ public class GerritServerConfigModule extends AbstractModule { @Override protected void configure() { bind(SitePaths.class); - bind(TrackingFooters.class).toProvider(TrackingFootersProvider.class).in(SINGLETON) ; - bind(Config.class).annotatedWith(GerritServerConfig.class).toProvider( - GerritServerConfigProvider.class).in(SINGLETON); + bind(TrackingFooters.class).toProvider(TrackingFootersProvider.class).in(SINGLETON); + bind(Config.class) + .annotatedWith(GerritServerConfig.class) + .toProvider(GerritServerConfigProvider.class) + .in(SINGLETON); bind(SecureStore.class).toProvider(SecureStoreProvider.class).in(SINGLETON); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerConfigProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerConfigProvider.java index 8be42db7bd..494b63a98e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerConfigProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerConfigProvider.java @@ -18,7 +18,7 @@ import com.google.gerrit.server.securestore.SecureStore; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.ProvisionException; - +import java.io.IOException; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.storage.file.FileBasedConfig; @@ -26,12 +26,9 @@ import org.eclipse.jgit.util.FS; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; - /** Provides {@link Config} annotated with {@link GerritServerConfig}. */ class GerritServerConfigProvider implements Provider { - private static final Logger log = - LoggerFactory.getLogger(GerritServerConfigProvider.class); + private static final Logger log = LoggerFactory.getLogger(GerritServerConfigProvider.class); private final SitePaths site; private final SecureStore secureStore; @@ -44,12 +41,10 @@ class GerritServerConfigProvider implements Provider { @Override public Config get() { - FileBasedConfig cfg = - new FileBasedConfig(site.gerrit_config.toFile(), FS.DETECTED); + FileBasedConfig cfg = new FileBasedConfig(site.gerrit_config.toFile(), FS.DETECTED); if (!cfg.getFile().exists()) { - log.info("No " + site.gerrit_config.toAbsolutePath() - + "; assuming defaults"); + log.info("No " + site.gerrit_config.toAbsolutePath() + "; assuming defaults"); return new GerritConfig(cfg, secureStore); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerId.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerId.java index f3fa9b1787..87dc44a3e5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerId.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerId.java @@ -17,16 +17,13 @@ package com.google.gerrit.server.config; import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.google.inject.BindingAnnotation; - import java.lang.annotation.Retention; /** * Marker on a string holding a unique identifier for the server. - *

- * This value is generated on first use and stored in {@code - * $site_path/etc/uuid}. + * + *

This value is generated on first use and stored in {@code $site_path/etc/uuid}. */ @Retention(RUNTIME) @BindingAnnotation -public @interface GerritServerId { -} +public @interface GerritServerId {} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerIdProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerIdProvider.java index 94794382d6..83b60e2f1a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerIdProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerIdProvider.java @@ -19,16 +19,14 @@ import static java.nio.charset.StandardCharsets.UTF_8; import com.google.common.base.Strings; import com.google.inject.Inject; import com.google.inject.Provider; - +import java.io.IOException; +import java.nio.file.Files; +import java.util.UUID; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.storage.file.FileBasedConfig; import org.eclipse.jgit.util.FS; -import java.io.IOException; -import java.nio.file.Files; -import java.util.UUID; - public class GerritServerIdProvider implements Provider { public static final String SECTION = "gerrit"; public static final String KEY = "serverId"; @@ -40,8 +38,8 @@ public class GerritServerIdProvider implements Provider { private final String id; @Inject - GerritServerIdProvider(@GerritServerConfig Config cfg, - SitePaths sitePaths) throws IOException, ConfigInvalidException { + GerritServerIdProvider(@GerritServerConfig Config cfg, SitePaths sitePaths) + throws IOException, ConfigInvalidException { String origId = cfg.getString(SECTION, null, KEY); if (!Strings.isNullOrEmpty(origId)) { id = origId; @@ -69,8 +67,7 @@ public class GerritServerIdProvider implements Provider { // Reread gerrit.config from disk before writing. We can't just use // cfg.toText(), as the @GerritServerConfig only has gerrit.config as a // fallback. - FileBasedConfig cfg = - new FileBasedConfig(sitePaths.gerrit_config.toFile(), FS.DETECTED); + FileBasedConfig cfg = new FileBasedConfig(sitePaths.gerrit_config.toFile(), FS.DETECTED); if (!cfg.getFile().exists()) { return new Config(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetDiffPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GetDiffPreferences.java index 9f18fc3449..8393fb4298 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetDiffPreferences.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GetDiffPreferences.java @@ -24,13 +24,11 @@ import com.google.gerrit.server.git.GitRepositoryManager; import com.google.gerrit.server.git.UserConfigSections; import com.google.inject.Inject; import com.google.inject.Singleton; - +import java.io.IOException; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.Repository; -import java.io.IOException; - @Singleton public class GetDiffPreferences implements RestReadView { @@ -38,30 +36,32 @@ public class GetDiffPreferences implements RestReadView { private final GitRepositoryManager gitManager; @Inject - GetDiffPreferences(GitRepositoryManager gitManager, - AllUsersName allUsersName) { + GetDiffPreferences(GitRepositoryManager gitManager, AllUsersName allUsersName) { this.allUsersName = allUsersName; this.gitManager = gitManager; } @Override public DiffPreferencesInfo apply(ConfigResource configResource) - throws BadRequestException, ResourceConflictException, IOException, - ConfigInvalidException { + throws BadRequestException, ResourceConflictException, IOException, ConfigInvalidException { return readFromGit(gitManager, allUsersName, null); } - static DiffPreferencesInfo readFromGit(GitRepositoryManager gitMgr, - AllUsersName allUsersName, DiffPreferencesInfo in) + static DiffPreferencesInfo readFromGit( + GitRepositoryManager gitMgr, AllUsersName allUsersName, DiffPreferencesInfo in) throws IOException, ConfigInvalidException, RepositoryNotFoundException { try (Repository git = gitMgr.openRepository(allUsersName)) { // Load all users prefs. - VersionedAccountPreferences dp = - VersionedAccountPreferences.forDefault(); + VersionedAccountPreferences dp = VersionedAccountPreferences.forDefault(); dp.load(git); DiffPreferencesInfo allUserPrefs = new DiffPreferencesInfo(); - loadSection(dp.getConfig(), UserConfigSections.DIFF, null, allUserPrefs, - DiffPreferencesInfo.defaults(), in); + loadSection( + dp.getConfig(), + UserConfigSections.DIFF, + null, + allUserPrefs, + DiffPreferencesInfo.defaults(), + in); return allUserPrefs; } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GetPreferences.java index 66e45b6a13..ed212f4a66 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetPreferences.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GetPreferences.java @@ -24,13 +24,11 @@ import com.google.gerrit.server.git.GitRepositoryManager; import com.google.gerrit.server.git.UserConfigSections; import com.google.inject.Inject; import com.google.inject.Singleton; - +import java.io.IOException; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.Repository; -import java.io.IOException; - @Singleton public class GetPreferences implements RestReadView { private final GeneralPreferencesLoader loader; @@ -38,8 +36,8 @@ public class GetPreferences implements RestReadView { private final AllUsersName allUsersName; @Inject - public GetPreferences(GeneralPreferencesLoader loader, - GitRepositoryManager gitMgr, AllUsersName allUsersName) { + public GetPreferences( + GeneralPreferencesLoader loader, GitRepositoryManager gitMgr, AllUsersName allUsersName) { this.loader = loader; this.gitMgr = gitMgr; this.allUsersName = allUsersName; @@ -51,17 +49,24 @@ public class GetPreferences implements RestReadView { return readFromGit(gitMgr, loader, allUsersName, null); } - static GeneralPreferencesInfo readFromGit(GitRepositoryManager gitMgr, - GeneralPreferencesLoader loader, AllUsersName allUsersName, - GeneralPreferencesInfo in) throws IOException, ConfigInvalidException, - RepositoryNotFoundException { + static GeneralPreferencesInfo readFromGit( + GitRepositoryManager gitMgr, + GeneralPreferencesLoader loader, + AllUsersName allUsersName, + GeneralPreferencesInfo in) + throws IOException, ConfigInvalidException, RepositoryNotFoundException { try (Repository git = gitMgr.openRepository(allUsersName)) { VersionedAccountPreferences p = VersionedAccountPreferences.forDefault(); p.load(git); - GeneralPreferencesInfo r = loadSection(p.getConfig(), - UserConfigSections.GENERAL, null, new GeneralPreferencesInfo(), - GeneralPreferencesInfo.defaults(), in); + GeneralPreferencesInfo r = + loadSection( + p.getConfig(), + UserConfigSections.GENERAL, + null, + new GeneralPreferencesInfo(), + GeneralPreferencesInfo.defaults(), + in); // TODO(davido): Maintain cache of default values in AllUsers repository return loader.loadMyMenusAndUrlAliases(r, p, null); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetServerInfo.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GetServerInfo.java index 54fc3fab8a..2ecbb54e59 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetServerInfo.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GetServerInfo.java @@ -52,9 +52,6 @@ import com.google.gerrit.server.index.change.ChangeIndexCollection; import com.google.gerrit.server.notedb.NotesMigration; import com.google.gerrit.server.project.ProjectCache; import com.google.inject.Inject; - -import org.eclipse.jgit.lib.Config; - import java.net.MalformedURLException; import java.util.ArrayList; import java.util.Collection; @@ -63,6 +60,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.concurrent.TimeUnit; +import org.eclipse.jgit.lib.Config; public class GetServerInfo implements RestReadView { private static final String URL_ALIAS = "urlAlias"; @@ -137,8 +135,7 @@ public class GetServerInfo implements RestReadView { info.auth = getAuthInfo(authConfig, realm); info.change = getChangeInfo(config); info.download = - getDownloadInfo(downloadSchemes, downloadCommands, cloneCommands, - archiveFormats); + getDownloadInfo(downloadSchemes, downloadCommands, cloneCommands, archiveFormats); info.gerrit = getGerritInfo(config, allProjectsName, allUsersName); info.noteDbEnabled = toBoolean(isNoteDbEnabled()); info.plugin = getPluginInfo(); @@ -166,9 +163,8 @@ public class GetServerInfo implements RestReadView { Collection agreements = projectCache.getAllProjects().getConfig().getContributorAgreements(); if (!agreements.isEmpty()) { - info.contributorAgreements = - Lists.newArrayListWithCapacity(agreements.size()); - for (ContributorAgreement agreement: agreements) { + info.contributorAgreements = Lists.newArrayListWithCapacity(agreements.size()); + for (ContributorAgreement agreement : agreements) { info.contributorAgreements.add(agreementJson.format(agreement)); } } @@ -209,19 +205,18 @@ public class GetServerInfo implements RestReadView { ChangeConfigInfo info = new ChangeConfigInfo(); info.allowBlame = toBoolean(cfg.getBoolean("change", "allowBlame", true)); info.allowDrafts = toBoolean(cfg.getBoolean("change", "allowDrafts", true)); - info.showAssignee = toBoolean( - cfg.getBoolean("change", "showAssignee", true) - && indexes.getSearchIndex().getSchema() - .hasField(ChangeField.ASSIGNEE)); + info.showAssignee = + toBoolean( + cfg.getBoolean("change", "showAssignee", true) + && indexes.getSearchIndex().getSchema().hasField(ChangeField.ASSIGNEE)); info.largeChange = cfg.getInt("change", "largeChange", 500); info.replyTooltip = - Optional.ofNullable(cfg.getString("change", null, "replyTooltip")) - .orElse("Reply and score") + " (Shortcut: a)"; + Optional.ofNullable(cfg.getString("change", null, "replyTooltip")).orElse("Reply and score") + + " (Shortcut: a)"; info.replyLabel = - Optional.ofNullable(cfg.getString("change", null, "replyLabel")) - .orElse("Reply") + "\u2026"; - info.updateDelay = (int) ConfigUtil.getTimeUnit( - cfg, "change", null, "updateDelay", 30, TimeUnit.SECONDS); + Optional.ofNullable(cfg.getString("change", null, "replyLabel")).orElse("Reply") + "\u2026"; + info.updateDelay = + (int) ConfigUtil.getTimeUnit(cfg, "change", null, "updateDelay", 30, TimeUnit.SECONDS); info.submitWholeTopic = Submit.wholeTopicEnabled(cfg); return info; } @@ -236,16 +231,17 @@ public class GetServerInfo implements RestReadView { for (DynamicMap.Entry e : downloadSchemes) { DownloadScheme scheme = e.getProvider().get(); if (scheme.isEnabled() && scheme.getUrl("${project}") != null) { - info.schemes.put(e.getExportName(), - getDownloadSchemeInfo(scheme, downloadCommands, cloneCommands)); + info.schemes.put( + e.getExportName(), getDownloadSchemeInfo(scheme, downloadCommands, cloneCommands)); } } - info.archives = archiveFormats.getAllowed().stream() - .map(ArchiveFormat::getShortName).collect(toList()); + info.archives = + archiveFormats.getAllowed().stream().map(ArchiveFormat::getShortName).collect(toList()); return info; } - private DownloadSchemeInfo getDownloadSchemeInfo(DownloadScheme scheme, + private DownloadSchemeInfo getDownloadSchemeInfo( + DownloadScheme scheme, DynamicMap downloadCommands, DynamicMap cloneCommands) { DownloadSchemeInfo info = new DownloadSchemeInfo(); @@ -269,8 +265,7 @@ public class GetServerInfo implements RestReadView { CloneCommand command = e.getProvider().get(); String c = command.getCommand(scheme, "${project-path}/${project-base-name}"); if (c != null) { - c = c.replaceAll("\\$\\{project-path\\}/\\$\\{project-base-name\\}", - "\\$\\{project\\}"); + c = c.replaceAll("\\$\\{project-path\\}/\\$\\{project-base-name\\}", "\\$\\{project\\}"); info.cloneCommands.put(commandName, c); } } @@ -278,8 +273,8 @@ public class GetServerInfo implements RestReadView { return info; } - private GerritInfo getGerritInfo(Config cfg, AllProjectsName allProjectsName, - AllUsersName allUsersName) { + private GerritInfo getGerritInfo( + Config cfg, AllProjectsName allProjectsName, AllUsersName allUsersName) { GerritInfo info = new GerritInfo(); info.allProjects = allProjectsName.get(); info.allUsers = allUsersName.get(); @@ -287,8 +282,8 @@ public class GetServerInfo implements RestReadView { info.reportBugText = cfg.getString("gerrit", null, "reportBugText"); info.docUrl = getDocUrl(cfg); info.docSearch = docSearcher.isAvailable(); - info.editGpgKeys = toBoolean(enableSignedPush - && cfg.getBoolean("gerrit", null, "editGpgKeys", true)); + info.editGpgKeys = + toBoolean(enableSignedPush && cfg.getBoolean("gerrit", null, "editGpgKeys", true)); info.webUis = EnumSet.noneOf(UiType.class); if (gerritOptions.enableGwtUi()) { info.webUis.add(UiType.GWT); @@ -316,9 +311,8 @@ public class GetServerInfo implements RestReadView { info.hasAvatars = toBoolean(avatar.get() != null); info.jsResourcePaths = new ArrayList<>(); for (WebUiPlugin u : plugins) { - info.jsResourcePaths.add(String.format("plugins/%s/%s", - u.getPluginName(), - u.getJavaScriptResourcePath())); + info.jsResourcePaths.add( + String.format("plugins/%s/%s", u.getPluginName(), u.getJavaScriptResourcePath())); } return info; } @@ -326,8 +320,9 @@ public class GetServerInfo implements RestReadView { private Map getUrlAliasesInfo(Config cfg) { Map urlAliases = new HashMap<>(); for (String subsection : cfg.getSubsections(URL_ALIAS)) { - urlAliases.put(cfg.getString(URL_ALIAS, subsection, KEY_MATCH), - cfg.getString(URL_ALIAS, subsection, KEY_TOKEN)); + urlAliases.put( + cfg.getString(URL_ALIAS, subsection, KEY_MATCH), + cfg.getString(URL_ALIAS, subsection, KEY_TOKEN)); } return urlAliases; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetSummary.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GetSummary.java index 722eb91df6..62de6883bf 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetSummary.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GetSummary.java @@ -20,10 +20,6 @@ import com.google.gerrit.extensions.restapi.RestReadView; import com.google.gerrit.server.git.WorkQueue; import com.google.gerrit.server.git.WorkQueue.Task; import com.google.inject.Inject; - -import org.eclipse.jgit.internal.storage.file.WindowCacheStatAccessor; -import org.kohsuke.args4j.Option; - import java.io.IOException; import java.lang.management.ManagementFactory; import java.lang.management.OperatingSystemMXBean; @@ -39,6 +35,8 @@ import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.eclipse.jgit.internal.storage.file.WindowCacheStatAccessor; +import org.kohsuke.args4j.Option; @RequiresCapability(GlobalCapability.MAINTAIN_SERVER) public class GetSummary implements RestReadView { @@ -69,7 +67,7 @@ public class GetSummary implements RestReadView { } @Override - public SummaryInfo apply(ConfigResource rsrc) { + public SummaryInfo apply(ConfigResource rsrc) { if (gc) { System.gc(); System.runFinalization(); @@ -94,11 +92,14 @@ public class GetSummary implements RestReadView { int tasksSleeping = 0; for (Task task : pending) { switch (task.getState()) { - case RUNNING: tasksRunning++; + case RUNNING: + tasksRunning++; break; - case READY: tasksReady++; + case READY: + tasksReady++; break; - case SLEEPING: tasksSleeping++; + case SLEEPING: + tasksSleeping++; break; case CANCELLED: case DONE: @@ -141,9 +142,16 @@ public class GetSummary implements RestReadView { threadInfo.cpus = r.availableProcessors(); threadInfo.threads = toInteger(ManagementFactory.getThreadMXBean().getThreadCount()); - List prefixes = Arrays.asList("HTTP", "IntraLineDiff", "ReceiveCommits", - "SSH git-receive-pack", "SSH git-upload-pack", "SSH-Interactive-Worker", - "SSH-Stream-Worker", "SshCommandStart"); + List prefixes = + Arrays.asList( + "HTTP", + "IntraLineDiff", + "ReceiveCommits", + "SSH git-receive-pack", + "SSH git-upload-pack", + "SSH-Interactive-Worker", + "SSH-Stream-Worker", + "SshCommandStart"); String other = "Other"; ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); @@ -193,8 +201,7 @@ public class GetSummary implements RestReadView { // Ignored } - jvmSummary.currentWorkingDirectory = - path(Paths.get(".").toAbsolutePath().getParent()); + jvmSummary.currentWorkingDirectory = path(Paths.get(".").toAbsolutePath().getParent()); jvmSummary.site = path(sitePath); return jvmSummary; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GitReceivePackGroups.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GitReceivePackGroups.java index 35ea9e6c2f..d74ce79f06 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GitReceivePackGroups.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GitReceivePackGroups.java @@ -17,14 +17,12 @@ package com.google.gerrit.server.config; import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.google.inject.BindingAnnotation; - import java.lang.annotation.Retention; /** - * Used to populate the groups of users that are allowed to run - * receive-pack on the server. + * Used to populate the groups of users that are allowed to run receive-pack on the server. * - * Gerrit.config example: + *

Gerrit.config example: * *

  * [receive]
@@ -33,5 +31,4 @@ import java.lang.annotation.Retention;
  */
 @Retention(RUNTIME)
 @BindingAnnotation
-public @interface GitReceivePackGroups {
-}
+public @interface GitReceivePackGroups {}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GitReceivePackGroupsProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GitReceivePackGroupsProvider.java
index 49b34672d8..d28f87a9c0 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GitReceivePackGroupsProvider.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GitReceivePackGroupsProvider.java
@@ -20,19 +20,21 @@ import com.google.gerrit.server.group.SystemGroupBackend;
 import com.google.gerrit.server.util.ServerRequestContext;
 import com.google.gerrit.server.util.ThreadLocalRequestContext;
 import com.google.inject.Inject;
-
-import org.eclipse.jgit.lib.Config;
-
 import java.util.Collections;
+import org.eclipse.jgit.lib.Config;
 
 public class GitReceivePackGroupsProvider extends GroupSetProvider {
   @Inject
-  public GitReceivePackGroupsProvider(GroupBackend gb,
+  public GitReceivePackGroupsProvider(
+      GroupBackend gb,
       @GerritServerConfig Config config,
       ThreadLocalRequestContext threadContext,
       ServerRequestContext serverCtx) {
-    super(gb, threadContext, serverCtx, ImmutableList.copyOf(
-        config.getStringList("receive", null, "allowGroup")));
+    super(
+        gb,
+        threadContext,
+        serverCtx,
+        ImmutableList.copyOf(config.getStringList("receive", null, "allowGroup")));
 
     // If no group was set, default to "registered users"
     //
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GitUploadPackGroups.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GitUploadPackGroups.java
index fa8ccb7244..a41d0a9f06 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GitUploadPackGroups.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GitUploadPackGroups.java
@@ -17,14 +17,12 @@ package com.google.gerrit.server.config;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 import com.google.inject.BindingAnnotation;
-
 import java.lang.annotation.Retention;
 
 /**
- * Used to populate the groups of users that are allowed to run
- * upload-pack on the server.
+ * Used to populate the groups of users that are allowed to run upload-pack on the server.
  *
- * Gerrit.config example:
+ * 

Gerrit.config example: * *

  * [upload]
@@ -33,5 +31,4 @@ import java.lang.annotation.Retention;
  */
 @Retention(RUNTIME)
 @BindingAnnotation
-public @interface GitUploadPackGroups {
-}
+public @interface GitUploadPackGroups {}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GitUploadPackGroupsProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GitUploadPackGroupsProvider.java
index b7720891e3..8d6926a27f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GitUploadPackGroupsProvider.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GitUploadPackGroupsProvider.java
@@ -21,24 +21,26 @@ import com.google.gerrit.server.group.SystemGroupBackend;
 import com.google.gerrit.server.util.ServerRequestContext;
 import com.google.gerrit.server.util.ThreadLocalRequestContext;
 import com.google.inject.Inject;
-
 import org.eclipse.jgit.lib.Config;
 
 public class GitUploadPackGroupsProvider extends GroupSetProvider {
   @Inject
-  public GitUploadPackGroupsProvider(GroupBackend gb,
+  public GitUploadPackGroupsProvider(
+      GroupBackend gb,
       @GerritServerConfig Config config,
       ThreadLocalRequestContext threadContext,
       ServerRequestContext serverCtx) {
-    super(gb, threadContext, serverCtx, ImmutableList.copyOf(
-        config.getStringList("upload", null, "allowGroup")));
+    super(
+        gb,
+        threadContext,
+        serverCtx,
+        ImmutableList.copyOf(config.getStringList("upload", null, "allowGroup")));
 
     // If no group was set, default to "registered users" and "anonymous"
     //
     if (groupIds.isEmpty()) {
-      groupIds = ImmutableSet.of(
-          SystemGroupBackend.REGISTERED_USERS,
-          SystemGroupBackend.ANONYMOUS_USERS);
+      groupIds =
+          ImmutableSet.of(SystemGroupBackend.REGISTERED_USERS, SystemGroupBackend.ANONYMOUS_USERS);
     }
   }
 }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GitwebCgiConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GitwebCgiConfig.java
index 830579ff01..153cddc1d8 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GitwebCgiConfig.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GitwebCgiConfig.java
@@ -19,18 +19,15 @@ import static java.nio.file.Files.isRegularFile;
 
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
-
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import org.eclipse.jgit.lib.Config;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.nio.file.Path;
-import java.nio.file.Paths;
-
 @Singleton
 public class GitwebCgiConfig {
-  private static final Logger log =
-      LoggerFactory.getLogger(GitwebCgiConfig.class);
+  private static final Logger log = LoggerFactory.getLogger(GitwebCgiConfig.class);
 
   public GitwebCgiConfig disabled() {
     return new GitwebCgiConfig();
@@ -54,10 +51,7 @@ public class GitwebCgiConfig {
     String cfgCgi = cfg.getString("gitweb", null, "cgi");
     Path pkgCgi = Paths.get("/usr/lib/cgi-bin/gitweb.cgi");
     String[] resourcePaths = {
-        "/usr/share/gitweb/static",
-        "/usr/share/gitweb",
-        "/var/www/static",
-        "/var/www",
+      "/usr/share/gitweb/static", "/usr/share/gitweb", "/var/www/static", "/var/www",
     };
     Path cgi;
 
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GitwebConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GitwebConfig.java
index d8fc9f80af..723e9bfd9d 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GitwebConfig.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GitwebConfig.java
@@ -34,7 +34,6 @@ import com.google.gerrit.extensions.webui.ProjectWebLink;
 import com.google.inject.AbstractModule;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
-
 import org.eclipse.jgit.lib.Config;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -65,8 +64,7 @@ public class GitwebConfig {
           DynamicSet.bind(binder(), BranchWebLink.class).to(GitwebLinks.class);
         }
 
-        if (!isNullOrEmpty(type.getFile())
-            || !isNullOrEmpty(type.getRootTree())) {
+        if (!isNullOrEmpty(type.getFile()) || !isNullOrEmpty(type.getRootTree())) {
           DynamicSet.bind(binder(), FileWebLink.class).to(GitwebLinks.class);
         }
 
@@ -86,8 +84,7 @@ public class GitwebConfig {
     }
   }
 
-  private static boolean isEmptyString(Config cfg, String section,
-      String subsection, String name) {
+  private static boolean isEmptyString(Config cfg, String section, String subsection, String name) {
     // This is currently the only way to check for the empty string in a JGit
     // config. Fun!
     String[] values = cfg.getStringList(section, subsection, name);
@@ -101,43 +98,30 @@ public class GitwebConfig {
     }
     GitwebType type = new GitwebType();
 
-    type.setLinkName(firstNonNull(
-        cfg.getString("gitweb", null, "linkname"),
-        defaultType.getLinkName()));
-    type.setBranch(firstNonNull(
-        cfg.getString("gitweb", null, "branch"),
-        defaultType.getBranch()));
-    type.setProject(firstNonNull(
-        cfg.getString("gitweb", null, "project"),
-        defaultType.getProject()));
-    type.setRevision(firstNonNull(
-        cfg.getString("gitweb", null, "revision"),
-        defaultType.getRevision()));
-    type.setRootTree(firstNonNull(
-        cfg.getString("gitweb", null, "roottree"),
-        defaultType.getRootTree()));
-    type.setFile(firstNonNull(
-        cfg.getString("gitweb", null, "file"),
-        defaultType.getFile()));
-    type.setFileHistory(firstNonNull(
-        cfg.getString("gitweb", null, "filehistory"),
-        defaultType.getFileHistory()));
-    type.setUrlEncode(
-        cfg.getBoolean("gitweb", null, "urlencode",
-            defaultType.getUrlEncode()));
+    type.setLinkName(
+        firstNonNull(cfg.getString("gitweb", null, "linkname"), defaultType.getLinkName()));
+    type.setBranch(firstNonNull(cfg.getString("gitweb", null, "branch"), defaultType.getBranch()));
+    type.setProject(
+        firstNonNull(cfg.getString("gitweb", null, "project"), defaultType.getProject()));
+    type.setRevision(
+        firstNonNull(cfg.getString("gitweb", null, "revision"), defaultType.getRevision()));
+    type.setRootTree(
+        firstNonNull(cfg.getString("gitweb", null, "roottree"), defaultType.getRootTree()));
+    type.setFile(firstNonNull(cfg.getString("gitweb", null, "file"), defaultType.getFile()));
+    type.setFileHistory(
+        firstNonNull(cfg.getString("gitweb", null, "filehistory"), defaultType.getFileHistory()));
+    type.setUrlEncode(cfg.getBoolean("gitweb", null, "urlencode", defaultType.getUrlEncode()));
     String pathSeparator = cfg.getString("gitweb", null, "pathSeparator");
     if (pathSeparator != null) {
       if (pathSeparator.length() == 1) {
         char c = pathSeparator.charAt(0);
         if (isValidPathSeparator(c)) {
-          type.setPathSeparator(
-              firstNonNull(c, defaultType.getPathSeparator()));
+          type.setPathSeparator(firstNonNull(c, defaultType.getPathSeparator()));
         } else {
           log.warn("Invalid gitweb.pathSeparator: " + c);
         }
       } else {
-        log.warn(
-            "gitweb.pathSeparator is not a single character: " + pathSeparator);
+        log.warn("gitweb.pathSeparator is not a single character: " + pathSeparator);
       }
     }
     return type;
@@ -153,8 +137,7 @@ public class GitwebConfig {
         type.setBranch("?p=${project}.git;a=shortlog;h=${branch}");
         type.setRootTree("?p=${project}.git;a=tree;hb=${commit}");
         type.setFile("?p=${project}.git;hb=${commit};f=${file}");
-        type.setFileHistory(
-            "?p=${project}.git;a=history;hb=${branch};f=${file}");
+        type.setFileHistory("?p=${project}.git;a=history;hb=${branch};f=${file}");
         break;
       case "cgit":
         type.setLinkName("cgit");
@@ -205,36 +188,35 @@ public class GitwebConfig {
     }
   }
 
-   /** @return GitwebType for gitweb viewer. */
-   @Nullable
-   public GitwebType getGitwebType() {
-     return type;
-   }
+  /** @return GitwebType for gitweb viewer. */
+  @Nullable
+  public GitwebType getGitwebType() {
+    return type;
+  }
 
   /**
-   * @return URL of the entry point into gitweb. This URL may be relative to our
-   *         context if gitweb is hosted by ourselves; or absolute if its hosted
-   *         elsewhere; or null if gitweb has not been configured.
+   * @return URL of the entry point into gitweb. This URL may be relative to our context if gitweb
+   *     is hosted by ourselves; or absolute if its hosted elsewhere; or null if gitweb has not been
+   *     configured.
    */
   public String getUrl() {
     return url;
   }
 
   /**
-   * Determines if a given character can be used unencoded in an URL as a
-   * replacement for the path separator '/'.
+   * Determines if a given character can be used unencoded in an URL as a replacement for the path
+   * separator '/'.
    *
-   * Reasoning: http://www.ietf.org/rfc/rfc1738.txt § 2.2:
+   * 

Reasoning: http://www.ietf.org/rfc/rfc1738.txt § 2.2: * - * ... only alphanumerics, the special characters "$-_.+!*'(),", and - * reserved characters used for their reserved purposes may be used - * unencoded within a URL. + *

... only alphanumerics, the special characters "$-_.+!*'(),", and reserved characters used + * for their reserved purposes may be used unencoded within a URL. * - * The following characters might occur in file names, however: + *

The following characters might occur in file names, however: * - * alphanumeric characters, + *

alphanumeric characters, * - * "$-_.+!'," + *

"$-_.+!'," */ static boolean isValidPathSeparator(char c) { switch (c) { @@ -248,8 +230,13 @@ public class GitwebConfig { } @Singleton - static class GitwebLinks implements BranchWebLink, FileHistoryWebLink, - FileWebLink, PatchSetWebLink, ParentWebLink, ProjectWebLink { + static class GitwebLinks + implements BranchWebLink, + FileHistoryWebLink, + FileWebLink, + PatchSetWebLink, + ParentWebLink, + ProjectWebLink { private final String url; private final GitwebType type; private final ParameterizedString branch; @@ -263,9 +250,7 @@ public class GitwebConfig { this.url = config.getUrl(); this.type = type; this.branch = parse(type.getBranch()); - this.file = parse(firstNonNull( - emptyToNull(type.getFile()), - nullToEmpty(type.getRootTree()))); + this.file = parse(firstNonNull(emptyToNull(type.getFile()), nullToEmpty(type.getRootTree()))); this.fileHistory = parse(type.getFileHistory()); this.project = parse(type.getProject()); this.revision = parse(type.getRevision()); @@ -274,36 +259,36 @@ public class GitwebConfig { @Override public WebLinkInfo getBranchWebLink(String projectName, String branchName) { if (branch != null) { - return link(branch - .replace("project", encode(projectName)) - .replace("branch", encode(branchName)) - .toString()); + return link( + branch + .replace("project", encode(projectName)) + .replace("branch", encode(branchName)) + .toString()); } return null; } @Override - public WebLinkInfo getFileHistoryWebLink(String projectName, - String revision, String fileName) { + public WebLinkInfo getFileHistoryWebLink(String projectName, String revision, String fileName) { if (fileHistory != null) { - return link(fileHistory - .replace("project", encode(projectName)) - .replace("branch", encode(revision)) - .replace("file", encode(fileName)) - .toString()); + return link( + fileHistory + .replace("project", encode(projectName)) + .replace("branch", encode(revision)) + .replace("file", encode(fileName)) + .toString()); } return null; } @Override - public WebLinkInfo getFileWebLink(String projectName, String revision, - String fileName) { + public WebLinkInfo getFileWebLink(String projectName, String revision, String fileName) { if (file != null) { - return link(file - .replace("project", encode(projectName)) - .replace("commit", encode(revision)) - .replace("file", encode(fileName)) - .toString()); + return link( + file.replace("project", encode(projectName)) + .replace("commit", encode(revision)) + .replace("file", encode(fileName)) + .toString()); } return null; } @@ -311,10 +296,11 @@ public class GitwebConfig { @Override public WebLinkInfo getPatchSetWebLink(String projectName, String commit) { if (revision != null) { - return link(revision - .replace("project", encode(projectName)) - .replace("commit", encode(commit)) - .toString()); + return link( + revision + .replace("project", encode(projectName)) + .replace("commit", encode(commit)) + .toString()); } return null; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GlobalPluginConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GlobalPluginConfig.java index 2a2c31638d..19ceaa140b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GlobalPluginConfig.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GlobalPluginConfig.java @@ -15,18 +15,14 @@ package com.google.gerrit.server.config; import com.google.gerrit.server.securestore.SecureStore; - import org.eclipse.jgit.lib.Config; -/** - * Plugin configuration in etc/$PLUGIN.config and etc/$PLUGIN.secure.config. - */ +/** Plugin configuration in etc/$PLUGIN.config and etc/$PLUGIN.secure.config. */ public class GlobalPluginConfig extends Config { private final SecureStore secureStore; private final String pluginName; - GlobalPluginConfig(String pluginName, Config baseConfig, - SecureStore secureStore) { + GlobalPluginConfig(String pluginName, Config baseConfig, SecureStore secureStore) { super(baseConfig); this.pluginName = pluginName; this.secureStore = secureStore; @@ -34,8 +30,7 @@ public class GlobalPluginConfig extends Config { @Override public String getString(String section, String subsection, String name) { - String secure = secureStore.getForPlugin( - pluginName, section, subsection, name); + String secure = secureStore.getForPlugin(pluginName, section, subsection, name); if (secure != null) { return secure; } @@ -44,8 +39,7 @@ public class GlobalPluginConfig extends Config { @Override public String[] getStringList(String section, String subsection, String name) { - String[] secure = secureStore.getListForPlugin( - pluginName, section, subsection, name); + String[] secure = secureStore.getListForPlugin(pluginName, section, subsection, name); if (secure != null && secure.length > 0) { return secure; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GroupSetProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GroupSetProvider.java index 78af1ae7e0..a8c16741bb 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GroupSetProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GroupSetProvider.java @@ -23,22 +23,21 @@ import com.google.gerrit.server.util.RequestContext; import com.google.gerrit.server.util.ServerRequestContext; import com.google.gerrit.server.util.ThreadLocalRequestContext; import com.google.inject.Provider; - +import java.util.List; +import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.List; -import java.util.Set; - /** Parses groups referenced in the {@code gerrit.config} file. */ -public abstract class GroupSetProvider implements - Provider> { +public abstract class GroupSetProvider implements Provider> { protected Set groupIds; - protected GroupSetProvider(GroupBackend groupBackend, + protected GroupSetProvider( + GroupBackend groupBackend, ThreadLocalRequestContext threadContext, - ServerRequestContext serverCtx, List groupNames) { + ServerRequestContext serverCtx, + List groupNames) { RequestContext ctx = threadContext.setContext(serverCtx); try { ImmutableSet.Builder builder = ImmutableSet.builder(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ListCaches.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/ListCaches.java index 15981d0030..d78f61dc21 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/ListCaches.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/ListCaches.java @@ -28,21 +28,20 @@ import com.google.gerrit.extensions.restapi.BinaryResult; import com.google.gerrit.extensions.restapi.RestReadView; import com.google.gerrit.server.cache.PersistentCache; import com.google.inject.Inject; - -import org.kohsuke.args4j.Option; - import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.TreeMap; +import org.kohsuke.args4j.Option; @RequiresAnyCapability({VIEW_CACHES, MAINTAIN_SERVER}) public class ListCaches implements RestReadView { private final DynamicMap> cacheMap; public enum OutputFormat { - LIST, TEXT_LIST + LIST, + TEXT_LIST } @Option(name = "--format", usage = "output format") @@ -61,8 +60,8 @@ public class ListCaches implements RestReadView { public Map getCacheInfos() { Map cacheInfos = new TreeMap<>(); for (DynamicMap.Entry> e : cacheMap) { - cacheInfos.put(cacheNameOf(e.getPluginName(), e.getExportName()), - new CacheInfo(e.getProvider().get())); + cacheInfos.put( + cacheNameOf(e.getPluginName(), e.getExportName()), new CacheInfo(e.getProvider().get())); } return cacheInfos; } @@ -88,7 +87,8 @@ public class ListCaches implements RestReadView { } public enum CacheType { - MEM, DISK + MEM, + DISK } public static class CacheInfo { @@ -98,11 +98,11 @@ public class ListCaches implements RestReadView { public String averageGet; public HitRatioInfo hitRatio; - public CacheInfo(Cache cache) { + public CacheInfo(Cache cache) { this(null, cache); } - public CacheInfo(String name, Cache cache) { + public CacheInfo(String name, Cache cache) { this.name = name; CacheStats stat = cache.stats(); @@ -117,8 +117,7 @@ public class ListCaches implements RestReadView { if (cache instanceof PersistentCache) { type = CacheType.DISK; - PersistentCache.DiskStats diskStats = - ((PersistentCache) cache).diskStats(); + PersistentCache.DiskStats diskStats = ((PersistentCache) cache).diskStats(); entries.setDisk(diskStats.size()); entries.setSpace(diskStats.space()); hitRatio.setDisk(diskStats.hitCount(), diskStats.requestCount()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ListCapabilities.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/ListCapabilities.java index 3a8723908b..d21b5fa478 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/ListCapabilities.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/ListCapabilities.java @@ -22,12 +22,10 @@ import com.google.gerrit.extensions.restapi.RestReadView; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.Map; import java.util.TreeMap; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** List capabilities visible to the calling user. */ @Singleton @@ -51,8 +49,7 @@ public class ListCapabilities implements RestReadView { private void collectCoreCapabilities(Map output) throws IllegalAccessException, NoSuchFieldException { - Class bundleClass = - CapabilityConstants.get().getClass(); + Class bundleClass = CapabilityConstants.get().getClass(); CapabilityConstants c = CapabilityConstants.get(); for (String id : GlobalCapability.getAllNames()) { String name = (String) bundleClass.getField(id).get(c); @@ -63,26 +60,23 @@ public class ListCapabilities implements RestReadView { private void collectPluginCapabilities(Map output) { for (String pluginName : pluginCapabilities.plugins()) { if (!isPluginNameSane(pluginName)) { - log.warn(String.format( - "Plugin name %s must match [A-Za-z0-9-]+ to use capabilities;" - + " rename the plugin", - pluginName)); + log.warn( + String.format( + "Plugin name %s must match [A-Za-z0-9-]+ to use capabilities;" + + " rename the plugin", + pluginName)); continue; } for (Map.Entry> entry : pluginCapabilities.byPlugin(pluginName).entrySet()) { String id = String.format("%s-%s", pluginName, entry.getKey()); - output.put(id, new CapabilityInfo( - id, - entry.getValue().get().getDescription())); + output.put(id, new CapabilityInfo(id, entry.getValue().get().getDescription())); } } } private static boolean isPluginNameSane(String pluginName) { - return CharMatcher.javaLetterOrDigit() - .or(CharMatcher.is('-')) - .matchesAllOf(pluginName); + return CharMatcher.javaLetterOrDigit().or(CharMatcher.is('-')).matchesAllOf(pluginName); } public static class CapabilityInfo { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ListTasks.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/ListTasks.java index b96d5d9b4a..7e9bd71494 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/ListTasks.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/ListTasks.java @@ -30,7 +30,6 @@ import com.google.gerrit.server.util.IdGenerator; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collections; @@ -47,8 +46,7 @@ public class ListTasks implements RestReadView { private final Provider self; @Inject - public ListTasks(WorkQueue workQueue, ProjectCache projectCache, - Provider self) { + public ListTasks(WorkQueue workQueue, ProjectCache projectCache, Provider self) { this.workQueue = workQueue; this.projectCache = projectCache; this.self = self; @@ -86,22 +84,25 @@ public class ListTasks implements RestReadView { private List getTasks() { List taskInfos = - workQueue.getTaskInfos(new TaskInfoFactory() { + workQueue.getTaskInfos( + new TaskInfoFactory() { + @Override + public TaskInfo getTaskInfo(Task task) { + return new TaskInfo(task); + } + }); + Collections.sort( + taskInfos, + new Comparator() { @Override - public TaskInfo getTaskInfo(Task task) { - return new TaskInfo(task); + public int compare(TaskInfo a, TaskInfo b) { + return ComparisonChain.start() + .compare(a.state.ordinal(), b.state.ordinal()) + .compare(a.delay, b.delay) + .compare(a.command, b.command) + .result(); } }); - Collections.sort(taskInfos, new Comparator() { - @Override - public int compare(TaskInfo a, TaskInfo b) { - return ComparisonChain.start() - .compare(a.state.ordinal(), b.state.ordinal()) - .compare(a.delay, b.delay) - .compare(a.command, b.command) - .result(); - } - }); return taskInfos; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ListTopMenus.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/ListTopMenus.java index c7d10a3e45..a7ba938613 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/ListTopMenus.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/ListTopMenus.java @@ -19,7 +19,6 @@ import com.google.gerrit.extensions.restapi.RestReadView; import com.google.gerrit.extensions.webui.TopMenu; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.util.ArrayList; import java.util.List; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfig.java index d8485fe778..1b124959b3 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfig.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfig.java @@ -19,13 +19,11 @@ import com.google.common.base.Strings; import com.google.common.collect.Iterables; import com.google.gerrit.server.git.ProjectConfig; import com.google.gerrit.server.project.ProjectState; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.Config; - import java.util.Arrays; import java.util.List; import java.util.Set; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.Config; public class PluginConfig { private static final String PLUGIN = "plugin"; @@ -53,14 +51,16 @@ public class PluginConfig { ProjectState parent = Iterables.getFirst(state.parents(), null); if (parent != null) { PluginConfig parentPluginConfig = - parent.getConfig().getPluginConfig(pluginName) - .withInheritance(projectStateFactory); + parent.getConfig().getPluginConfig(pluginName).withInheritance(projectStateFactory); Set allNames = cfg.getNames(PLUGIN, pluginName); cfg = copyConfig(cfg); for (String name : parentPluginConfig.cfg.getNames(PLUGIN, pluginName)) { if (!allNames.contains(name)) { - cfg.setStringList(PLUGIN, pluginName, name, Arrays - .asList(parentPluginConfig.cfg.getStringList(PLUGIN, pluginName, name))); + cfg.setStringList( + PLUGIN, + pluginName, + name, + Arrays.asList(parentPluginConfig.cfg.getStringList(PLUGIN, pluginName, name))); } } } @@ -86,8 +86,7 @@ public class PluginConfig { if (defaultValue == null) { return cfg.getString(PLUGIN, pluginName, name); } - return MoreObjects.firstNonNull(cfg.getString(PLUGIN, pluginName, name), - defaultValue); + return MoreObjects.firstNonNull(cfg.getString(PLUGIN, pluginName, name), defaultValue); } public void setString(String name, String value) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfigFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfigFactory.java index e12cc2442c..ce295bd5c9 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfigFactory.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfigFactory.java @@ -25,7 +25,11 @@ import com.google.gerrit.server.securestore.SecureStore; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.Map; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.internal.storage.file.FileSnapshot; import org.eclipse.jgit.lib.Config; @@ -34,16 +38,9 @@ import org.eclipse.jgit.util.FS; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.File; -import java.io.IOException; -import java.nio.file.Path; -import java.util.HashMap; -import java.util.Map; - @Singleton public class PluginConfigFactory implements ReloadPluginListener { - private static final Logger log = - LoggerFactory.getLogger(PluginConfigFactory.class); + private static final Logger log = LoggerFactory.getLogger(PluginConfigFactory.class); private static final String EXTENSION = ".config"; private final SitePaths site; @@ -75,19 +72,14 @@ public class PluginConfigFactory implements ReloadPluginListener { } /** - * Returns the configuration for the specified plugin that is stored in the - * 'gerrit.config' file. + * Returns the configuration for the specified plugin that is stored in the 'gerrit.config' file. * - * The returned plugin configuration provides access to all parameters of the - * 'gerrit.config' file that are set in the 'plugin' subsection of the - * specified plugin. + *

The returned plugin configuration provides access to all parameters of the 'gerrit.config' + * file that are set in the 'plugin' subsection of the specified plugin. * - * E.g.: - * [plugin "my-plugin"] - * myKey = myValue + *

E.g.: [plugin "my-plugin"] myKey = myValue * - * @param pluginName the name of the plugin for which the configuration should - * be returned + * @param pluginName the name of the plugin for which the configuration should be returned * @return the plugin configuration from the 'gerrit.config' file */ public PluginConfig getFromGerritConfig(String pluginName) { @@ -95,20 +87,17 @@ public class PluginConfigFactory implements ReloadPluginListener { } /** - * Returns the configuration for the specified plugin that is stored in the - * 'gerrit.config' file. + * Returns the configuration for the specified plugin that is stored in the 'gerrit.config' file. * - * The returned plugin configuration provides access to all parameters of the - * 'gerrit.config' file that are set in the 'plugin' subsection of the - * specified plugin. + *

The returned plugin configuration provides access to all parameters of the 'gerrit.config' + * file that are set in the 'plugin' subsection of the specified plugin. * - * E.g.: [plugin "my-plugin"] myKey = myValue + *

E.g.: [plugin "my-plugin"] myKey = myValue * - * @param pluginName the name of the plugin for which the configuration should - * be returned - * @param refresh if true it is checked if the 'gerrit.config' - * file was modified and if yes the Gerrit configuration is reloaded, - * if false the cached Gerrit configuration is used + * @param pluginName the name of the plugin for which the configuration should be returned + * @param refresh if true it is checked if the 'gerrit.config' file was modified and + * if yes the Gerrit configuration is reloaded, if false the cached Gerrit + * configuration is used * @return the plugin configuration from the 'gerrit.config' file */ public PluginConfig getFromGerritConfig(String pluginName, boolean refresh) { @@ -121,28 +110,22 @@ public class PluginConfigFactory implements ReloadPluginListener { } /** - * Returns the configuration for the specified plugin that is stored in the - * 'project.config' file of the specified project. + * Returns the configuration for the specified plugin that is stored in the 'project.config' file + * of the specified project. * - * The returned plugin configuration provides access to all parameters of the - * 'project.config' file that are set in the 'plugin' subsection of the - * specified plugin. + *

The returned plugin configuration provides access to all parameters of the 'project.config' + * file that are set in the 'plugin' subsection of the specified plugin. * - * E.g.: - * [plugin "my-plugin"] - * myKey = myValue + *

E.g.: [plugin "my-plugin"] myKey = myValue * - * @param projectName the name of the project for which the plugin - * configuration should be returned - * @param pluginName the name of the plugin for which the configuration should - * be returned - * @return the plugin configuration from the 'project.config' file of the - * specified project - * @throws NoSuchProjectException thrown if the specified project does not - * exist + * @param projectName the name of the project for which the plugin configuration should be + * returned + * @param pluginName the name of the plugin for which the configuration should be returned + * @return the plugin configuration from the 'project.config' file of the specified project + * @throws NoSuchProjectException thrown if the specified project does not exist */ - public PluginConfig getFromProjectConfig(Project.NameKey projectName, - String pluginName) throws NoSuchProjectException { + public PluginConfig getFromProjectConfig(Project.NameKey projectName, String pluginName) + throws NoSuchProjectException { ProjectState projectState = projectCache.get(projectName); if (projectState == null) { throw new NoSuchProjectException(projectName); @@ -151,110 +134,80 @@ public class PluginConfigFactory implements ReloadPluginListener { } /** - * Returns the configuration for the specified plugin that is stored in the - * 'project.config' file of the specified project. + * Returns the configuration for the specified plugin that is stored in the 'project.config' file + * of the specified project. * - * The returned plugin configuration provides access to all parameters of the - * 'project.config' file that are set in the 'plugin' subsection of the - * specified plugin. + *

The returned plugin configuration provides access to all parameters of the 'project.config' + * file that are set in the 'plugin' subsection of the specified plugin. * - * E.g.: [plugin "my-plugin"] myKey = myValue + *

E.g.: [plugin "my-plugin"] myKey = myValue * - * @param projectState the project for which the plugin configuration should - * be returned - * @param pluginName the name of the plugin for which the configuration should - * be returned - * @return the plugin configuration from the 'project.config' file of the - * specified project + * @param projectState the project for which the plugin configuration should be returned + * @param pluginName the name of the plugin for which the configuration should be returned + * @return the plugin configuration from the 'project.config' file of the specified project */ - public PluginConfig getFromProjectConfig(ProjectState projectState, - String pluginName) { + public PluginConfig getFromProjectConfig(ProjectState projectState, String pluginName) { return projectState.getConfig().getPluginConfig(pluginName); } /** - * Returns the configuration for the specified plugin that is stored in the - * 'project.config' file of the specified project. Parameters which are not - * set in the 'project.config' of this project are inherited from the parent - * project's 'project.config' files. + * Returns the configuration for the specified plugin that is stored in the 'project.config' file + * of the specified project. Parameters which are not set in the 'project.config' of this project + * are inherited from the parent project's 'project.config' files. * - * The returned plugin configuration provides access to all parameters of the - * 'project.config' file that are set in the 'plugin' subsection of the - * specified plugin. + *

The returned plugin configuration provides access to all parameters of the 'project.config' + * file that are set in the 'plugin' subsection of the specified plugin. * - * E.g.: - * child project: - * [plugin "my-plugin"] - * myKey = childValue + *

E.g.: child project: [plugin "my-plugin"] myKey = childValue * - * parent project: - * [plugin "my-plugin"] - * myKey = parentValue - * anotherKey = someValue + *

parent project: [plugin "my-plugin"] myKey = parentValue anotherKey = someValue * - * return: - * [plugin "my-plugin"] - * myKey = childValue - * anotherKey = someValue + *

return: [plugin "my-plugin"] myKey = childValue anotherKey = someValue * - * @param projectName the name of the project for which the plugin - * configuration should be returned - * @param pluginName the name of the plugin for which the configuration should - * be returned - * @return the plugin configuration from the 'project.config' file of the - * specified project with inherited non-set parameters from the - * parent projects - * @throws NoSuchProjectException thrown if the specified project does not - * exist + * @param projectName the name of the project for which the plugin configuration should be + * returned + * @param pluginName the name of the plugin for which the configuration should be returned + * @return the plugin configuration from the 'project.config' file of the specified project with + * inherited non-set parameters from the parent projects + * @throws NoSuchProjectException thrown if the specified project does not exist */ public PluginConfig getFromProjectConfigWithInheritance( - Project.NameKey projectName, String pluginName) - throws NoSuchProjectException { - return getFromProjectConfig(projectName, pluginName).withInheritance( - projectStateFactory); + Project.NameKey projectName, String pluginName) throws NoSuchProjectException { + return getFromProjectConfig(projectName, pluginName).withInheritance(projectStateFactory); } /** - * Returns the configuration for the specified plugin that is stored in the - * 'project.config' file of the specified project. Parameters which are not - * set in the 'project.config' of this project are inherited from the parent - * project's 'project.config' files. + * Returns the configuration for the specified plugin that is stored in the 'project.config' file + * of the specified project. Parameters which are not set in the 'project.config' of this project + * are inherited from the parent project's 'project.config' files. * - * The returned plugin configuration provides access to all parameters of the - * 'project.config' file that are set in the 'plugin' subsection of the - * specified plugin. + *

The returned plugin configuration provides access to all parameters of the 'project.config' + * file that are set in the 'plugin' subsection of the specified plugin. * - * E.g.: child project: [plugin "my-plugin"] myKey = childValue + *

E.g.: child project: [plugin "my-plugin"] myKey = childValue * - * parent project: [plugin "my-plugin"] myKey = parentValue anotherKey = - * someValue + *

parent project: [plugin "my-plugin"] myKey = parentValue anotherKey = someValue * - * return: [plugin "my-plugin"] myKey = childValue anotherKey = someValue + *

return: [plugin "my-plugin"] myKey = childValue anotherKey = someValue * - * @param projectState the project for which the plugin configuration should - * be returned - * @param pluginName the name of the plugin for which the configuration should - * be returned - * @return the plugin configuration from the 'project.config' file of the - * specified project with inherited non-set parameters from the parent - * projects + * @param projectState the project for which the plugin configuration should be returned + * @param pluginName the name of the plugin for which the configuration should be returned + * @return the plugin configuration from the 'project.config' file of the specified project with + * inherited non-set parameters from the parent projects */ public PluginConfig getFromProjectConfigWithInheritance( ProjectState projectState, String pluginName) { - return getFromProjectConfig(projectState, pluginName).withInheritance( - projectStateFactory); + return getFromProjectConfig(projectState, pluginName).withInheritance(projectStateFactory); } /** - * Returns the configuration for the specified plugin that is stored in the - * plugin configuration file '{@code etc/.config}'. + * Returns the configuration for the specified plugin that is stored in the plugin configuration + * file '{@code etc/.config}'. * - * The plugin configuration is only loaded once and is then cached. + *

The plugin configuration is only loaded once and is then cached. * - * @param pluginName the name of the plugin for which the configuration should - * be returned - * @return the plugin configuration from the - * '{@code etc/.config}' file + * @param pluginName the name of the plugin for which the configuration should be returned + * @return the plugin configuration from the '{@code etc/.config}' file */ public synchronized Config getGlobalPluginConfig(String pluginName) { if (pluginConfigs.containsKey(pluginName)) { @@ -262,10 +215,8 @@ public class PluginConfigFactory implements ReloadPluginListener { } Path pluginConfigFile = site.etc_dir.resolve(pluginName + ".config"); - FileBasedConfig cfg = - new FileBasedConfig(pluginConfigFile.toFile(), FS.DETECTED); - GlobalPluginConfig pluginConfig = - new GlobalPluginConfig(pluginName, cfg, secureStore); + FileBasedConfig cfg = new FileBasedConfig(pluginConfigFile.toFile(), FS.DETECTED); + GlobalPluginConfig pluginConfig = new GlobalPluginConfig(pluginName, cfg, secureStore); pluginConfigs.put(pluginName, pluginConfig); if (!cfg.getFile().exists()) { log.info("No " + pluginConfigFile.toAbsolutePath() + "; assuming defaults"); @@ -276,8 +227,7 @@ public class PluginConfigFactory implements ReloadPluginListener { cfg.load(); } catch (ConfigInvalidException e) { // This is an error in user input, don't spam logs with a stack trace. - log.warn( - "Failed to load " + pluginConfigFile.toAbsolutePath() + ": " + e); + log.warn("Failed to load " + pluginConfigFile.toAbsolutePath() + ": " + e); } catch (IOException e) { log.warn("Failed to load " + pluginConfigFile.toAbsolutePath(), e); } @@ -286,101 +236,82 @@ public class PluginConfigFactory implements ReloadPluginListener { } /** - * Returns the configuration for the specified plugin that is stored in the - * '{@code .config}' file in the 'refs/meta/config' branch of - * the specified project. + * Returns the configuration for the specified plugin that is stored in the '{@code + * .config}' file in the 'refs/meta/config' branch of the specified project. * - * @param projectName the name of the project for which the plugin - * configuration should be returned - * @param pluginName the name of the plugin for which the configuration should - * be returned - * @return the plugin configuration from the '{@code .config}' - * file of the specified project - * @throws NoSuchProjectException thrown if the specified project does not - * exist + * @param projectName the name of the project for which the plugin configuration should be + * returned + * @param pluginName the name of the plugin for which the configuration should be returned + * @return the plugin configuration from the '{@code .config}' file of the specified + * project + * @throws NoSuchProjectException thrown if the specified project does not exist */ - public Config getProjectPluginConfig(Project.NameKey projectName, - String pluginName) throws NoSuchProjectException { + public Config getProjectPluginConfig(Project.NameKey projectName, String pluginName) + throws NoSuchProjectException { return getPluginConfig(projectName, pluginName).get(); } /** - * Returns the configuration for the specified plugin that is stored in the - * '{@code .config}' file in the 'refs/meta/config' branch of - * the specified project. + * Returns the configuration for the specified plugin that is stored in the '{@code + * .config}' file in the 'refs/meta/config' branch of the specified project. * - * @param projectState the project for which the plugin configuration should - * be returned - * @param pluginName the name of the plugin for which the configuration should - * be returned - * @return the plugin configuration from the '{@code .config}' - * file of the specified project + * @param projectState the project for which the plugin configuration should be returned + * @param pluginName the name of the plugin for which the configuration should be returned + * @return the plugin configuration from the '{@code .config}' file of the specified + * project */ - public Config getProjectPluginConfig(ProjectState projectState, - String pluginName) { + public Config getProjectPluginConfig(ProjectState projectState, String pluginName) { return projectState.getConfig(pluginName + EXTENSION).get(); } /** - * Returns the configuration for the specified plugin that is stored in the - * '{@code .config}' file in the 'refs/meta/config' branch of - * the specified project. Parameters which are not set in the - * '{@code .config}' of this project are inherited from the - * parent project's '{@code .config}' files. + * Returns the configuration for the specified plugin that is stored in the '{@code + * .config}' file in the 'refs/meta/config' branch of the specified project. + * Parameters which are not set in the '{@code .config}' of this project are + * inherited from the parent project's '{@code .config}' files. * - * E.g.: child project: [mySection "mySubsection"] myKey = childValue + *

E.g.: child project: [mySection "mySubsection"] myKey = childValue * - * parent project: [mySection "mySubsection"] myKey = parentValue anotherKey = - * someValue + *

parent project: [mySection "mySubsection"] myKey = parentValue anotherKey = someValue * - * return: [mySection "mySubsection"] myKey = childValue anotherKey = - * someValue + *

return: [mySection "mySubsection"] myKey = childValue anotherKey = someValue * - * @param projectName the name of the project for which the plugin - * configuration should be returned - * @param pluginName the name of the plugin for which the configuration should - * be returned - * @return the plugin configuration from the '{@code .config}' - * file of the specified project with inheriting non-set parameters - * from the parent projects - * @throws NoSuchProjectException thrown if the specified project does not - * exist + * @param projectName the name of the project for which the plugin configuration should be + * returned + * @param pluginName the name of the plugin for which the configuration should be returned + * @return the plugin configuration from the '{@code .config}' file of the specified + * project with inheriting non-set parameters from the parent projects + * @throws NoSuchProjectException thrown if the specified project does not exist */ - public Config getProjectPluginConfigWithInheritance(Project.NameKey projectName, - String pluginName) throws NoSuchProjectException { + public Config getProjectPluginConfigWithInheritance( + Project.NameKey projectName, String pluginName) throws NoSuchProjectException { return getPluginConfig(projectName, pluginName).getWithInheritance(); } /** - * Returns the configuration for the specified plugin that is stored in the - * '{@code .config}' file in the 'refs/meta/config' branch of - * the specified project. Parameters which are not set in the - * '{@code .config}' of this project are inherited from the - * parent project's '{@code .config}' files. + * Returns the configuration for the specified plugin that is stored in the '{@code + * .config}' file in the 'refs/meta/config' branch of the specified project. + * Parameters which are not set in the '{@code .config}' of this project are + * inherited from the parent project's '{@code .config}' files. * - * E.g.: child project: [mySection "mySubsection"] myKey = childValue + *

E.g.: child project: [mySection "mySubsection"] myKey = childValue * - * parent project: [mySection "mySubsection"] myKey = parentValue anotherKey = - * someValue + *

parent project: [mySection "mySubsection"] myKey = parentValue anotherKey = someValue * - * return: [mySection "mySubsection"] myKey = childValue anotherKey = - * someValue + *

return: [mySection "mySubsection"] myKey = childValue anotherKey = someValue * - * @param projectState the project for which the plugin configuration should - * be returned - * @param pluginName the name of the plugin for which the configuration should - * be returned - * @return the plugin configuration from the '{@code .config}' - * file of the specified project with inheriting non-set parameters - * from the parent projects + * @param projectState the project for which the plugin configuration should be returned + * @param pluginName the name of the plugin for which the configuration should be returned + * @return the plugin configuration from the '{@code .config}' file of the specified + * project with inheriting non-set parameters from the parent projects */ - public Config getProjectPluginConfigWithInheritance(ProjectState projectState, - String pluginName) { + public Config getProjectPluginConfigWithInheritance( + ProjectState projectState, String pluginName) { return projectState.getConfig(pluginName + EXTENSION).getWithInheritance(); } - private ProjectLevelConfig getPluginConfig(Project.NameKey projectName, - String pluginName) throws NoSuchProjectException { + private ProjectLevelConfig getPluginConfig(Project.NameKey projectName, String pluginName) + throws NoSuchProjectException { ProjectState projectState = projectCache.get(projectName); if (projectState == null) { throw new NoSuchProjectException(projectName); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/PostCaches.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/PostCaches.java index f7968c818a..3cfa2b911b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/PostCaches.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/PostCaches.java @@ -28,7 +28,6 @@ import com.google.gerrit.extensions.restapi.UnprocessableEntityException; import com.google.gerrit.server.config.PostCaches.Input; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.util.ArrayList; import java.util.List; @@ -39,8 +38,7 @@ public class PostCaches implements RestModifyView { public Operation operation; public List caches; - public Input() { - } + public Input() {} public Input(Operation op) { this(op, null); @@ -53,15 +51,15 @@ public class PostCaches implements RestModifyView { } public enum Operation { - FLUSH_ALL, FLUSH + FLUSH_ALL, + FLUSH } private final DynamicMap> cacheMap; private final FlushCache flushCache; @Inject - public PostCaches(DynamicMap> cacheMap, - FlushCache flushCache) { + public PostCaches(DynamicMap> cacheMap, FlushCache flushCache) { this.cacheMap = cacheMap; this.flushCache = flushCache; } @@ -83,8 +81,7 @@ public class PostCaches implements RestModifyView { return Response.ok(""); case FLUSH: if (input.caches == null || input.caches.isEmpty()) { - throw new BadRequestException( - "caches must be specified for operation 'FLUSH'"); + throw new BadRequestException("caches must be specified for operation 'FLUSH'"); } flush(input.caches); return Response.ok(""); @@ -96,8 +93,7 @@ public class PostCaches implements RestModifyView { private void flushAll() throws AuthException { for (DynamicMap.Entry> e : cacheMap) { CacheResource cacheResource = - new CacheResource(e.getPluginName(), e.getExportName(), - e.getProvider()); + new CacheResource(e.getPluginName(), e.getExportName(), e.getProvider()); if (FlushCache.WEB_SESSIONS.equals(cacheResource.getName())) { continue; } @@ -105,8 +101,7 @@ public class PostCaches implements RestModifyView { } } - private void flush(List cacheNames) - throws UnprocessableEntityException, AuthException { + private void flush(List cacheNames) throws UnprocessableEntityException, AuthException { List cacheResources = new ArrayList<>(cacheNames.size()); for (String n : cacheNames) { @@ -122,8 +117,7 @@ public class PostCaches implements RestModifyView { if (cache != null) { cacheResources.add(new CacheResource(pluginName, cacheName, cache)); } else { - throw new UnprocessableEntityException(String.format( - "cache %s not found", n)); + throw new UnprocessableEntityException(String.format("cache %s not found", n)); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ProjectConfigEntry.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/ProjectConfigEntry.java index 7d11ff4958..65d880ec31 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/ProjectConfigEntry.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/ProjectConfigEntry.java @@ -29,7 +29,9 @@ import com.google.gerrit.server.git.ProjectConfig; import com.google.gerrit.server.project.ProjectState; import com.google.inject.Inject; import com.google.inject.ProvisionException; - +import java.io.IOException; +import java.util.Arrays; +import java.util.List; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.ObjectId; @@ -37,10 +39,6 @@ import org.eclipse.jgit.lib.Repository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.Arrays; -import java.util.List; - @ExtensionPoint public class ProjectConfigEntry { private final String displayName; @@ -54,45 +52,51 @@ public class ProjectConfigEntry { this(displayName, defaultValue, false); } - public ProjectConfigEntry(String displayName, String defaultValue, - boolean inheritable) { + public ProjectConfigEntry(String displayName, String defaultValue, boolean inheritable) { this(displayName, defaultValue, inheritable, null); } - public ProjectConfigEntry(String displayName, String defaultValue, - boolean inheritable, String description) { - this(displayName, defaultValue, ProjectConfigEntryType.STRING, null, - inheritable, description); + public ProjectConfigEntry( + String displayName, String defaultValue, boolean inheritable, String description) { + this(displayName, defaultValue, ProjectConfigEntryType.STRING, null, inheritable, description); } public ProjectConfigEntry(String displayName, int defaultValue) { this(displayName, defaultValue, false); } - public ProjectConfigEntry(String displayName, int defaultValue, - boolean inheritable) { + public ProjectConfigEntry(String displayName, int defaultValue, boolean inheritable) { this(displayName, defaultValue, inheritable, null); } - public ProjectConfigEntry(String displayName, int defaultValue, - boolean inheritable, String description) { - this(displayName, Integer.toString(defaultValue), - ProjectConfigEntryType.INT, null, inheritable, description); + public ProjectConfigEntry( + String displayName, int defaultValue, boolean inheritable, String description) { + this( + displayName, + Integer.toString(defaultValue), + ProjectConfigEntryType.INT, + null, + inheritable, + description); } public ProjectConfigEntry(String displayName, long defaultValue) { this(displayName, defaultValue, false); } - public ProjectConfigEntry(String displayName, long defaultValue, - boolean inheritable) { + public ProjectConfigEntry(String displayName, long defaultValue, boolean inheritable) { this(displayName, defaultValue, inheritable, null); } - public ProjectConfigEntry(String displayName, long defaultValue, - boolean inheritable, String description) { - this(displayName, Long.toString(defaultValue), - ProjectConfigEntryType.LONG, null, inheritable, description); + public ProjectConfigEntry( + String displayName, long defaultValue, boolean inheritable, String description) { + this( + displayName, + Long.toString(defaultValue), + ProjectConfigEntryType.LONG, + null, + inheritable, + description); } // For inheritable boolean use 'LIST' type with InheritableBoolean @@ -101,50 +105,72 @@ public class ProjectConfigEntry { } //For inheritable boolean use 'LIST' type with InheritableBoolean - public ProjectConfigEntry(String displayName, boolean defaultValue, - String description) { - this(displayName, Boolean.toString(defaultValue), - ProjectConfigEntryType.BOOLEAN, null, false, description); + public ProjectConfigEntry(String displayName, boolean defaultValue, String description) { + this( + displayName, + Boolean.toString(defaultValue), + ProjectConfigEntryType.BOOLEAN, + null, + false, + description); } - public ProjectConfigEntry(String displayName, String defaultValue, - List permittedValues) { + public ProjectConfigEntry(String displayName, String defaultValue, List permittedValues) { this(displayName, defaultValue, permittedValues, false); } - public ProjectConfigEntry(String displayName, String defaultValue, - List permittedValues, boolean inheritable) { + public ProjectConfigEntry( + String displayName, String defaultValue, List permittedValues, boolean inheritable) { this(displayName, defaultValue, permittedValues, inheritable, null); } - public ProjectConfigEntry(String displayName, String defaultValue, - List permittedValues, boolean inheritable, String description) { - this(displayName, defaultValue, ProjectConfigEntryType.LIST, - permittedValues, inheritable, description); + public ProjectConfigEntry( + String displayName, + String defaultValue, + List permittedValues, + boolean inheritable, + String description) { + this( + displayName, + defaultValue, + ProjectConfigEntryType.LIST, + permittedValues, + inheritable, + description); } - public > ProjectConfigEntry(String displayName, - T defaultValue, Class permittedValues) { + public > ProjectConfigEntry( + String displayName, T defaultValue, Class permittedValues) { this(displayName, defaultValue, permittedValues, false); } - public > ProjectConfigEntry(String displayName, - T defaultValue, Class permittedValues, boolean inheritable) { + public > ProjectConfigEntry( + String displayName, T defaultValue, Class permittedValues, boolean inheritable) { this(displayName, defaultValue, permittedValues, inheritable, null); } - public > ProjectConfigEntry(String displayName, - T defaultValue, Class permittedValues, boolean inheritable, + public > ProjectConfigEntry( + String displayName, + T defaultValue, + Class permittedValues, + boolean inheritable, String description) { - this(displayName, defaultValue.name(), ProjectConfigEntryType.LIST, - Arrays.stream(permittedValues.getEnumConstants()) - .map(Enum::name).collect(toList()), - inheritable, description); + this( + displayName, + defaultValue.name(), + ProjectConfigEntryType.LIST, + Arrays.stream(permittedValues.getEnumConstants()).map(Enum::name).collect(toList()), + inheritable, + description); } - public ProjectConfigEntry(String displayName, String defaultValue, - ProjectConfigEntryType type, List permittedValues, - boolean inheritable, String description) { + public ProjectConfigEntry( + String displayName, + String defaultValue, + ProjectConfigEntryType type, + List permittedValues, + boolean inheritable, + String description) { this.displayName = displayName; this.defaultValue = defaultValue; this.type = type; @@ -152,8 +178,7 @@ public class ProjectConfigEntry { this.inheritable = inheritable; this.description = description; if (type == ProjectConfigEntryType.ARRAY && inheritable) { - throw new ProvisionException( - "ARRAY doesn't support inheritable values"); + throw new ProvisionException("ARRAY doesn't support inheritable values"); } } @@ -198,9 +223,9 @@ public class ProjectConfigEntry { } /** - * Called before the project config is updated. To modify the value before the - * project config is updated, override this method and return the modified - * value. Default implementation returns the same value. + * Called before the project config is updated. To modify the value before the project config is + * updated, override this method and return the modified value. Default implementation returns the + * same value. * * @param configValue the original configValue that was entered. * @return the modified configValue. @@ -210,13 +235,13 @@ public class ProjectConfigEntry { } /** - * Called after reading the project config value. To modify the value before - * returning it to the client, override this method and return the modified - * value. Default implementation returns the same value. + * Called after reading the project config value. To modify the value before returning it to the + * client, override this method and return the modified value. Default implementation returns the + * same value. * * @param project the project. - * @param value the actual value of the config entry (computed out of the - * configured value, the inherited value and the default value). + * @param value the actual value of the config entry (computed out of the configured value, the + * inherited value and the default value). * @return the modified value. */ public String onRead(ProjectState project, String value) { @@ -224,13 +249,13 @@ public class ProjectConfigEntry { } /** - * Called after reading the project config value of type ARRAY. To modify the - * values before returning it to the client, override this method and return - * the modified values. Default implementation returns the same values. + * Called after reading the project config value of type ARRAY. To modify the values before + * returning it to the client, override this method and return the modified values. Default + * implementation returns the same values. * * @param project the project. - * @param values the actual values of the config entry (computed out of the - * configured value, the inherited value and the default value). + * @param values the actual values of the config entry (computed out of the configured value, the + * inherited value and the default value). * @return the modified values. */ public List onRead(ProjectState project, List values) { @@ -244,8 +269,7 @@ public class ProjectConfigEntry { * @param oldValue old entry value. * @param newValue new entry value. */ - public void onUpdate(Project.NameKey project, String oldValue, String newValue) { - } + public void onUpdate(Project.NameKey project, String oldValue, String newValue) {} /** * Called after a project config is updated. @@ -254,8 +278,7 @@ public class ProjectConfigEntry { * @param oldValue old entry value. * @param newValue new entry value. */ - public void onUpdate(Project.NameKey project, Boolean oldValue, Boolean newValue) { - } + public void onUpdate(Project.NameKey project, Boolean oldValue, Boolean newValue) {} /** * Called after a project config is updated. @@ -264,8 +287,7 @@ public class ProjectConfigEntry { * @param oldValue old entry value. * @param newValue new entry value. */ - public void onUpdate(Project.NameKey project, Integer oldValue, Integer newValue) { - } + public void onUpdate(Project.NameKey project, Integer oldValue, Integer newValue) {} /** * Called after a project config is updated. @@ -274,8 +296,7 @@ public class ProjectConfigEntry { * @param oldValue old entry value. * @param newValue new entry value. */ - public void onUpdate(Project.NameKey project, Long oldValue, Long newValue) { - } + public void onUpdate(Project.NameKey project, Long oldValue, Long newValue) {} public static class UpdateChecker implements GitReferenceUpdatedListener { private static final Logger log = LoggerFactory.getLogger(UpdateChecker.class); @@ -284,8 +305,8 @@ public class ProjectConfigEntry { private final DynamicMap pluginConfigEntries; @Inject - UpdateChecker(GitRepositoryManager repoManager, - DynamicMap pluginConfigEntries) { + UpdateChecker( + GitRepositoryManager repoManager, DynamicMap pluginConfigEntries) { this.repoManager = repoManager; this.pluginConfigEntries = pluginConfigEntries; } @@ -329,9 +350,9 @@ public class ProjectConfigEntry { } } } catch (IOException | ConfigInvalidException e) { - log.error(String.format( - "Failed to check if plugin config of project %s was updated.", - p.get()), e); + log.error( + String.format("Failed to check if plugin config of project %s was updated.", p.get()), + e); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ProjectOwnerGroupsProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/ProjectOwnerGroupsProvider.java index 34946ec239..33e68d3553 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/ProjectOwnerGroupsProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/ProjectOwnerGroupsProvider.java @@ -22,9 +22,9 @@ import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; /** - * Provider of the group(s) which should become owners of a newly created - * project. The only matching patterns supported are exact match or wildcard - * matching which can be specified by ending the name with a {@code *}. + * Provider of the group(s) which should become owners of a newly created project. The only matching + * patterns supported are exact match or wildcard matching which can be specified by ending the name + * with a {@code *}. * *

  * [repository "*"]
@@ -41,8 +41,10 @@ public class ProjectOwnerGroupsProvider extends GroupSetProvider {
   }
 
   @AssistedInject
-  public ProjectOwnerGroupsProvider(GroupBackend gb,
-      ThreadLocalRequestContext context, ServerRequestContext serverCtx,
+  public ProjectOwnerGroupsProvider(
+      GroupBackend gb,
+      ThreadLocalRequestContext context,
+      ServerRequestContext serverCtx,
       RepositoryConfig repositoryCfg,
       @Assisted Project.NameKey project) {
     super(gb, context, serverCtx, repositoryCfg.getOwnerGroups(project));
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/RepositoryConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/RepositoryConfig.java
index e25039528e..4f35fc7b35 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/RepositoryConfig.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/RepositoryConfig.java
@@ -19,13 +19,11 @@ import com.google.gerrit.extensions.client.SubmitType;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
-
-import org.eclipse.jgit.lib.Config;
-
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.List;
+import org.eclipse.jgit.lib.Config;
 
 @Singleton
 public class RepositoryConfig {
@@ -43,18 +41,20 @@ public class RepositoryConfig {
   }
 
   public SubmitType getDefaultSubmitType(Project.NameKey project) {
-    return cfg.getEnum(SECTION_NAME, findSubSection(project.get()),
-        DEFAULT_SUBMIT_TYPE_NAME, SubmitType.MERGE_IF_NECESSARY);
+    return cfg.getEnum(
+        SECTION_NAME,
+        findSubSection(project.get()),
+        DEFAULT_SUBMIT_TYPE_NAME,
+        SubmitType.MERGE_IF_NECESSARY);
   }
 
   public List getOwnerGroups(Project.NameKey project) {
-    return ImmutableList.copyOf(cfg.getStringList(SECTION_NAME,
-        findSubSection(project.get()), OWNER_GROUP_NAME));
+    return ImmutableList.copyOf(
+        cfg.getStringList(SECTION_NAME, findSubSection(project.get()), OWNER_GROUP_NAME));
   }
 
   public Path getBasePath(Project.NameKey project) {
-    String basePath = cfg.getString(SECTION_NAME, findSubSection(project.get()),
-        BASE_PATH_NAME);
+    String basePath = cfg.getString(SECTION_NAME, findSubSection(project.get()), BASE_PATH_NAME);
     return basePath != null ? Paths.get(basePath) : null;
   }
 
@@ -71,10 +71,9 @@ public class RepositoryConfig {
 
   /**
    * Find the subSection to get repository configuration from.
-   * 

- * SubSection can use the * pattern so if project name matches more than one - * section, return the more precise one. E.g if the following subSections are - * defined: + * + *

SubSection can use the * pattern so if project name matches more than one section, return + * the more precise one. E.g if the following subSections are defined: * *

    * [repository "somePath/*"]
@@ -83,8 +82,8 @@ public class RepositoryConfig {
    *   name = value
    * 
* - * and this method is called with "somePath/somePath/someProject" as project - * name, it will return the subSection "somePath/somePath/*" + * and this method is called with "somePath/somePath/someProject" as project name, it will return + * the subSection "somePath/somePath/*" * * @param project Name of the project * @return the name of the subSection, null if none is found @@ -93,8 +92,7 @@ public class RepositoryConfig { String subSectionFound = null; for (String subSection : cfg.getSubsections(SECTION_NAME)) { if (isMatch(subSection, project) - && (subSectionFound == null || subSectionFound.length() < subSection - .length())) { + && (subSectionFound == null || subSectionFound.length() < subSection.length())) { subSectionFound = subSection; } } @@ -103,7 +101,7 @@ public class RepositoryConfig { private boolean isMatch(String subSection, String project) { return project.equals(subSection) - || (subSection.endsWith("*") && project.startsWith(subSection - .substring(0, subSection.length() - 1))); + || (subSection.endsWith("*") + && project.startsWith(subSection.substring(0, subSection.length() - 1))); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/RequestScopedReviewDbProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/RequestScopedReviewDbProvider.java index c2c002e7ef..3987aed456 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/RequestScopedReviewDbProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/RequestScopedReviewDbProvider.java @@ -31,8 +31,8 @@ public class RequestScopedReviewDbProvider implements Provider { private ReviewDb db; @Inject - public RequestScopedReviewDbProvider(final SchemaFactory schema, - final Provider cleanup) { + public RequestScopedReviewDbProvider( + final SchemaFactory schema, final Provider cleanup) { this.schema = schema; this.cleanup = cleanup; } @@ -48,13 +48,16 @@ public class RequestScopedReviewDbProvider implements Provider { throw new ProvisionException("Cannot open ReviewDb", e); } try { - cleanup.get().add(new Runnable() { - @Override - public void run() { - c.close(); - db = null; - } - }); + cleanup + .get() + .add( + new Runnable() { + @Override + public void run() { + c.close(); + db = null; + } + }); } catch (Throwable e) { c.close(); throw new ProvisionException("Cannot defer cleanup of ReviewDb", e); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ScheduleConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/ScheduleConfig.java index a2835a66fd..4a87474059 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/ScheduleConfig.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/ScheduleConfig.java @@ -15,7 +15,9 @@ package com.google.gerrit.server.config; import com.google.common.annotations.VisibleForTesting; - +import java.text.MessageFormat; +import java.util.Locale; +import java.util.concurrent.TimeUnit; import org.eclipse.jgit.lib.Config; import org.joda.time.DateTime; import org.joda.time.LocalDateTime; @@ -27,13 +29,8 @@ import org.joda.time.format.ISODateTimeFormat; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.text.MessageFormat; -import java.util.Locale; -import java.util.concurrent.TimeUnit; - public class ScheduleConfig { - private static final Logger log = LoggerFactory - .getLogger(ScheduleConfig.class); + private static final Logger log = LoggerFactory.getLogger(ScheduleConfig.class); public static final long MISSING_CONFIG = -1L; public static final long INVALID_CONFIG = -2L; private static final String KEY_INTERVAL = "interval"; @@ -55,8 +52,8 @@ public class ScheduleConfig { this(rc, section, subsection, DateTime.now()); } - public ScheduleConfig(Config rc, String section, String subsection, - String keyInterval, String keyStartTime) { + public ScheduleConfig( + Config rc, String section, String subsection, String keyInterval, String keyStartTime) { this(rc, section, subsection, keyInterval, keyStartTime, DateTime.now()); } @@ -66,8 +63,13 @@ public class ScheduleConfig { } @VisibleForTesting - ScheduleConfig(Config rc, String section, String subsection, - String keyInterval, String keyStartTime, DateTime now) { + ScheduleConfig( + Config rc, + String section, + String subsection, + String keyInterval, + String keyStartTime, + DateTime now) { this.rc = rc; this.section = section; this.subsection = subsection; @@ -75,8 +77,7 @@ public class ScheduleConfig { this.keyStartTime = keyStartTime; this.interval = interval(rc, section, subsection, keyInterval); if (interval > 0) { - this.initialDelay = initialDelay(rc, section, subsection, keyStartTime, now, - interval); + this.initialDelay = initialDelay(rc, section, subsection, keyStartTime, now, interval); } else { this.initialDelay = interval; } @@ -84,10 +85,9 @@ public class ScheduleConfig { /** * Milliseconds between constructor invocation and first event time. - *

- * If there is any lag between the constructor invocation and queuing the - * object into an executor the event will run later, as there is no method - * to adjust for the scheduling delay. + * + *

If there is any lag between the constructor invocation and queuing the object into an + * executor the event will run later, as there is no method to adjust for the scheduling delay. */ public long getInitialDelay() { return initialDelay; @@ -98,29 +98,32 @@ public class ScheduleConfig { return interval; } - private static long interval(Config rc, String section, String subsection, - String keyInterval) { + private static long interval(Config rc, String section, String subsection, String keyInterval) { long interval = MISSING_CONFIG; try { interval = - ConfigUtil.getTimeUnit(rc, section, subsection, keyInterval, -1, - TimeUnit.MILLISECONDS); + ConfigUtil.getTimeUnit(rc, section, subsection, keyInterval, -1, TimeUnit.MILLISECONDS); if (interval == MISSING_CONFIG) { - log.info(MessageFormat.format( - "{0} schedule parameter \"{0}.{1}\" is not configured", section, - keyInterval)); + log.info( + MessageFormat.format( + "{0} schedule parameter \"{0}.{1}\" is not configured", section, keyInterval)); } } catch (IllegalArgumentException e) { - log.error(MessageFormat.format( - "Invalid {0} schedule parameter \"{0}.{1}\"", section, keyInterval), + log.error( + MessageFormat.format("Invalid {0} schedule parameter \"{0}.{1}\"", section, keyInterval), e); interval = INVALID_CONFIG; } return interval; } - private static long initialDelay(Config rc, String section, - String subsection, String keyStartTime, DateTime now, long interval) { + private static long initialDelay( + Config rc, + String section, + String subsection, + String keyStartTime, + DateTime now, + long interval) { long delay = MISSING_CONFIG; String start = rc.getString(section, subsection, keyStartTime); try { @@ -133,8 +136,7 @@ public class ScheduleConfig { startTime.hourOfDay().set(firstStartTime.getHourOfDay()); startTime.minuteOfHour().set(firstStartTime.getMinuteOfHour()); } catch (IllegalArgumentException e1) { - formatter = DateTimeFormat.forPattern("E HH:mm") - .withLocale(Locale.US); + formatter = DateTimeFormat.forPattern("E HH:mm").withLocale(Locale.US); LocalDateTime firstStartDateTime = formatter.parseLocalDateTime(start); startTime.dayOfWeek().set(firstStartDateTime.getDayOfWeek()); startTime.hourOfDay().set(firstStartDateTime.getHourOfDay()); @@ -149,14 +151,14 @@ public class ScheduleConfig { delay += interval; } } else { - log.info(MessageFormat.format( - "{0} schedule parameter \"{0}.{1}\" is not configured", section, - keyStartTime)); + log.info( + MessageFormat.format( + "{0} schedule parameter \"{0}.{1}\" is not configured", section, keyStartTime)); } } catch (IllegalArgumentException e2) { log.error( - MessageFormat.format("Invalid {0} schedule parameter \"{0}.{1}\"", - section, keyStartTime), e2); + MessageFormat.format("Invalid {0} schedule parameter \"{0}.{1}\"", section, keyStartTime), + e2); delay = INVALID_CONFIG; } return delay; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/SetDiffPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/SetDiffPreferences.java index 8ca072ac10..80c4625f21 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/SetDiffPreferences.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/SetDiffPreferences.java @@ -30,28 +30,25 @@ import com.google.gerrit.server.git.UserConfigSections; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; +import java.lang.reflect.Field; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.lang.reflect.Field; - @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER) @Singleton -public class SetDiffPreferences implements - RestModifyView { - private static final Logger log = - LoggerFactory.getLogger(SetDiffPreferences.class); +public class SetDiffPreferences implements RestModifyView { + private static final Logger log = LoggerFactory.getLogger(SetDiffPreferences.class); private final Provider metaDataUpdateFactory; private final AllUsersName allUsersName; private final GitRepositoryManager gitManager; @Inject - SetDiffPreferences(GitRepositoryManager gitManager, + SetDiffPreferences( + GitRepositoryManager gitManager, Provider metaDataUpdateFactory, AllUsersName allUsersName) { this.gitManager = gitManager; @@ -60,9 +57,8 @@ public class SetDiffPreferences implements } @Override - public DiffPreferencesInfo apply(ConfigResource configResource, - DiffPreferencesInfo in) - throws BadRequestException, IOException, ConfigInvalidException { + public DiffPreferencesInfo apply(ConfigResource configResource, DiffPreferencesInfo in) + throws BadRequestException, IOException, ConfigInvalidException { if (in == null) { throw new BadRequestException("input must be provided"); } @@ -76,15 +72,18 @@ public class SetDiffPreferences implements throws RepositoryNotFoundException, IOException, ConfigInvalidException { DiffPreferencesInfo out = new DiffPreferencesInfo(); try (MetaDataUpdate md = metaDataUpdateFactory.get().create(allUsersName)) { - VersionedAccountPreferences prefs = - VersionedAccountPreferences.forDefault(); + VersionedAccountPreferences prefs = VersionedAccountPreferences.forDefault(); prefs.load(md); DiffPreferencesInfo defaults = DiffPreferencesInfo.defaults(); - storeSection(prefs.getConfig(), UserConfigSections.DIFF, null, in, - defaults); + storeSection(prefs.getConfig(), UserConfigSections.DIFF, null, in, defaults); prefs.commit(md); - loadSection(prefs.getConfig(), UserConfigSections.DIFF, null, out, - DiffPreferencesInfo.defaults(), null); + loadSection( + prefs.getConfig(), + UserConfigSections.DIFF, + null, + out, + DiffPreferencesInfo.defaults(), + null); } return out; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/SetPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/SetPreferences.java index c5c75eee77..4792131889 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/SetPreferences.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/SetPreferences.java @@ -33,21 +33,17 @@ import com.google.gerrit.server.git.UserConfigSections; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; +import java.lang.reflect.Field; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.lang.reflect.Field; - @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER) @Singleton -public class SetPreferences implements - RestModifyView { - private static final Logger log = - LoggerFactory.getLogger(SetPreferences.class); +public class SetPreferences implements RestModifyView { + private static final Logger log = LoggerFactory.getLogger(SetPreferences.class); private final GeneralPreferencesLoader loader; private final GitRepositoryManager gitManager; @@ -56,7 +52,8 @@ public class SetPreferences implements private final AccountCache accountCache; @Inject - SetPreferences(GeneralPreferencesLoader loader, + SetPreferences( + GeneralPreferencesLoader loader, GitRepositoryManager gitManager, Provider metaDataUpdateFactory, AllUsersName allUsersName, @@ -69,9 +66,8 @@ public class SetPreferences implements } @Override - public GeneralPreferencesInfo apply(ConfigResource rsrc, - GeneralPreferencesInfo i) - throws BadRequestException, IOException, ConfigInvalidException { + public GeneralPreferencesInfo apply(ConfigResource rsrc, GeneralPreferencesInfo i) + throws BadRequestException, IOException, ConfigInvalidException { if (!hasSetFields(i)) { throw new BadRequestException("unsupported option"); } @@ -83,22 +79,26 @@ public class SetPreferences implements try (MetaDataUpdate md = metaDataUpdateFactory.get().create(allUsersName)) { VersionedAccountPreferences p = VersionedAccountPreferences.forDefault(); p.load(md); - storeSection(p.getConfig(), UserConfigSections.GENERAL, null, i, - GeneralPreferencesInfo.defaults()); + storeSection( + p.getConfig(), UserConfigSections.GENERAL, null, i, GeneralPreferencesInfo.defaults()); com.google.gerrit.server.account.SetPreferences.storeMyMenus(p, i.my); com.google.gerrit.server.account.SetPreferences.storeUrlAliases(p, i.urlAliases); p.commit(md); accountCache.evictAll(); - GeneralPreferencesInfo r = loadSection(p.getConfig(), - UserConfigSections.GENERAL, null, new GeneralPreferencesInfo(), - GeneralPreferencesInfo.defaults(), null); + GeneralPreferencesInfo r = + loadSection( + p.getConfig(), + UserConfigSections.GENERAL, + null, + new GeneralPreferencesInfo(), + GeneralPreferencesInfo.defaults(), + null); return loader.loadMyMenusAndUrlAliases(r, p, null); } } - private static boolean hasSetFields(GeneralPreferencesInfo in) { try { for (Field field : in.getClass().getDeclaredFields()) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/SitePath.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/SitePath.java index d0b3905252..a1e66fc386 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/SitePath.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/SitePath.java @@ -17,15 +17,13 @@ package com.google.gerrit.server.config; import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.google.inject.BindingAnnotation; - import java.lang.annotation.Retention; /** * Marker on a {@link java.io.File} pointing to the site path. - *

- * The site path is where Gerrit Code Review stores most of its configuration. + * + *

The site path is where Gerrit Code Review stores most of its configuration. */ @Retention(RUNTIME) @BindingAnnotation -public @interface SitePath { -} +public @interface SitePath {} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/SitePaths.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/SitePaths.java index 192ca49cbc..a810077ab8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/SitePaths.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/SitePaths.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.config; import com.google.common.collect.Iterables; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.io.IOException; import java.nio.file.DirectoryStream; import java.nio.file.Files; @@ -113,8 +112,8 @@ public final class SitePaths { /** * Resolve an absolute or relative path. - *

- * Relative paths are resolved relative to the {@link #site_path}. + * + *

Relative paths are resolved relative to the {@link #site_path}. * * @param path the path string to resolve. May be null. * @return the resolved path; null if {@code path} was null or empty. diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/TasksCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/TasksCollection.java index b92cfc20b1..b239856776 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/TasksCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/TasksCollection.java @@ -32,8 +32,7 @@ import com.google.inject.Provider; import com.google.inject.Singleton; @Singleton -public class TasksCollection implements - ChildCollection { +public class TasksCollection implements ChildCollection { private final DynamicMap> views; private final ListTasks list; private final WorkQueue workQueue; @@ -41,8 +40,11 @@ public class TasksCollection implements private final ProjectCache projectCache; @Inject - TasksCollection(DynamicMap> views, ListTasks list, - WorkQueue workQueue, Provider self, + TasksCollection( + DynamicMap> views, + ListTasks list, + WorkQueue workQueue, + Provider self, ProjectCache projectCache) { this.views = views; this.list = list; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ThreadSettingsConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/ThreadSettingsConfig.java index c62583e341..6cb32cc0e5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/ThreadSettingsConfig.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/ThreadSettingsConfig.java @@ -16,7 +16,6 @@ package com.google.gerrit.server.config; import com.google.inject.Inject; import com.google.inject.Singleton; - import org.eclipse.jgit.lib.Config; @Singleton @@ -32,8 +31,7 @@ public class ThreadSettingsConfig { sshdThreads = cfg.getInt("sshd", "threads", 2 * cores); httpdMaxThreads = cfg.getInt("httpd", "maxThreads", 25); int defaultDatabasePoolLimit = sshdThreads + httpdMaxThreads + 2; - databasePoolLimit = - cfg.getInt("database", "poolLimit", defaultDatabasePoolLimit); + databasePoolLimit = cfg.getInt("database", "poolLimit", defaultDatabasePoolLimit); sshdBatchThreads = cores == 1 ? 1 : 2; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/TopMenuCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/TopMenuCollection.java index 32416c529d..2fc2dc1df9 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/TopMenuCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/TopMenuCollection.java @@ -23,14 +23,12 @@ import com.google.inject.Inject; import com.google.inject.Singleton; @Singleton -class TopMenuCollection implements - ChildCollection { +class TopMenuCollection implements ChildCollection { private final DynamicMap> views; private final ListTopMenus list; @Inject - TopMenuCollection(DynamicMap> views, - ListTopMenus list) { + TopMenuCollection(DynamicMap> views, ListTopMenus list) { this.views = views; this.list = list; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/TrackingFooter.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/TrackingFooter.java index aeedecd963..ac2f0c6fd1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/TrackingFooter.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/TrackingFooter.java @@ -14,11 +14,10 @@ package com.google.gerrit.server.config; -import org.eclipse.jgit.revwalk.FooterKey; -import org.eclipse.jgit.revwalk.FooterLine; - import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; +import org.eclipse.jgit.revwalk.FooterKey; +import org.eclipse.jgit.revwalk.FooterLine; /** Tracking entry in the configuration file */ public class TrackingFooter { @@ -26,8 +25,7 @@ public class TrackingFooter { private final Pattern match; private final String system; - public TrackingFooter(String f, final String m, final String s) - throws PatternSyntaxException { + public TrackingFooter(String f, final String m, final String s) throws PatternSyntaxException { f = f.trim(); if (f.endsWith(":")) { f = f.substring(0, f.length() - 1); @@ -54,7 +52,6 @@ public class TrackingFooter { @Override public String toString() { - return "footer = " + key.getName() + ", match = " + match.pattern() - + ", system = " + system; + return "footer = " + key.getName() + ", match = " + match.pattern() + ", system = " + system; } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/TrackingFooters.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/TrackingFooters.java index ee013084cc..a897bdc6ea 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/TrackingFooters.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/TrackingFooters.java @@ -16,16 +16,14 @@ package com.google.gerrit.server.config; import com.google.common.collect.ListMultimap; import com.google.common.collect.MultimapBuilder; - -import org.eclipse.jgit.revwalk.FooterLine; - import java.util.List; import java.util.regex.Matcher; +import org.eclipse.jgit.revwalk.FooterLine; public class TrackingFooters { protected List trackingFooters; - public TrackingFooters (final List trFooters) { + public TrackingFooters(final List trFooters) { trackingFooters = trFooters; } @@ -38,8 +36,7 @@ public class TrackingFooters { } public ListMultimap extract(List lines) { - ListMultimap r = - MultimapBuilder.hashKeys().arrayListValues().build(); + ListMultimap r = MultimapBuilder.hashKeys().arrayListValues().build(); if (lines == null) { return r; } @@ -49,9 +46,7 @@ public class TrackingFooters { if (footer.matches(config.footerKey())) { Matcher m = config.match().matcher(footer.getValue()); while (m.find()) { - String id = m.groupCount() > 0 - ? m.group(1) - : m.group(); + String id = m.groupCount() > 0 ? m.group(1) : m.group(); if (!id.isEmpty()) { r.put(config.system(), id); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/TrackingFootersProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/TrackingFootersProvider.java index 4c1bde9774..5389b1f9f6 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/TrackingFootersProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/TrackingFootersProvider.java @@ -18,11 +18,6 @@ import com.google.gerrit.reviewdb.client.TrackingId; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.Config; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -30,6 +25,9 @@ import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.regex.PatternSyntaxException; +import org.eclipse.jgit.lib.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** Provides a list of all configured {@link TrackingFooter}s. */ @Singleton @@ -39,41 +37,49 @@ public class TrackingFootersProvider implements Provider { private static String SYSTEM_TAG = "system"; private static String REGEX_TAG = "match"; private final List trackingFooters = new ArrayList<>(); - private static final Logger log = - LoggerFactory.getLogger(TrackingFootersProvider.class); + private static final Logger log = LoggerFactory.getLogger(TrackingFootersProvider.class); @Inject TrackingFootersProvider(@GerritServerConfig final Config cfg) { for (String name : cfg.getSubsections(TRACKING_ID_TAG)) { boolean configValid = true; - Set footers = new HashSet<>( - Arrays.asList(cfg.getStringList(TRACKING_ID_TAG, name, FOOTER_TAG))); + Set footers = + new HashSet<>(Arrays.asList(cfg.getStringList(TRACKING_ID_TAG, name, FOOTER_TAG))); footers.removeAll(Collections.singleton(null)); if (footers.isEmpty()) { configValid = false; - log.error("Missing " + TRACKING_ID_TAG + "." + name + "." + FOOTER_TAG - + " in gerrit.config"); + log.error( + "Missing " + TRACKING_ID_TAG + "." + name + "." + FOOTER_TAG + " in gerrit.config"); } String system = cfg.getString(TRACKING_ID_TAG, name, SYSTEM_TAG); if (system == null || system.isEmpty()) { configValid = false; - log.error("Missing " + TRACKING_ID_TAG + "." + name + "." + SYSTEM_TAG - + " in gerrit.config"); + log.error( + "Missing " + TRACKING_ID_TAG + "." + name + "." + SYSTEM_TAG + " in gerrit.config"); } else if (system.length() > TrackingId.TRACKING_SYSTEM_MAX_CHAR) { configValid = false; - log.error("String to long \"" + system + "\" in gerrit.config " - + TRACKING_ID_TAG + "." + name + "." + SYSTEM_TAG + " (max " - + TrackingId.TRACKING_SYSTEM_MAX_CHAR + " char)"); + log.error( + "String to long \"" + + system + + "\" in gerrit.config " + + TRACKING_ID_TAG + + "." + + name + + "." + + SYSTEM_TAG + + " (max " + + TrackingId.TRACKING_SYSTEM_MAX_CHAR + + " char)"); } String match = cfg.getString(TRACKING_ID_TAG, name, REGEX_TAG); if (match == null || match.isEmpty()) { configValid = false; - log.error("Missing " + TRACKING_ID_TAG + "." + name + "." + REGEX_TAG - + " in gerrit.config"); + log.error( + "Missing " + TRACKING_ID_TAG + "." + name + "." + REGEX_TAG + " in gerrit.config"); } if (configValid) { @@ -82,9 +88,17 @@ public class TrackingFootersProvider implements Provider { trackingFooters.add(new TrackingFooter(footer, match, system)); } } catch (PatternSyntaxException e) { - log.error("Invalid pattern \"" + match + "\" in gerrit.config " - + TRACKING_ID_TAG + "." + name + "." + REGEX_TAG + ": " - + e.getMessage()); + log.error( + "Invalid pattern \"" + + match + + "\" in gerrit.config " + + TRACKING_ID_TAG + + "." + + name + + "." + + REGEX_TAG + + ": " + + e.getMessage()); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/VerboseSuperprojectUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/VerboseSuperprojectUpdate.java index f328b1ffc7..96467a84c9 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/VerboseSuperprojectUpdate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/VerboseSuperprojectUpdate.java @@ -14,9 +14,7 @@ package com.google.gerrit.server.config; -/** - * Verbosity level of the commit message for submodule subscriptions. - */ +/** Verbosity level of the commit message for submodule subscriptions. */ public enum VerboseSuperprojectUpdate { /** Do not include any commit messages for the gitlink update. */ FALSE, diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/data/AccountAttribute.java b/gerrit-server/src/main/java/com/google/gerrit/server/data/AccountAttribute.java index e5627c261e..19605a2c7b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/data/AccountAttribute.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/data/AccountAttribute.java @@ -15,7 +15,7 @@ package com.google.gerrit.server.data; public class AccountAttribute { - public String name; - public String email; - public String username; + public String name; + public String email; + public String username; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/data/ApprovalAttribute.java b/gerrit-server/src/main/java/com/google/gerrit/server/data/ApprovalAttribute.java index 90b6fc4d3e..8928a5d18d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/data/ApprovalAttribute.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/data/ApprovalAttribute.java @@ -15,10 +15,10 @@ package com.google.gerrit.server.data; public class ApprovalAttribute { - public String type; - public String description; - public String value; - public String oldValue; - public Long grantedOn; - public AccountAttribute by; + public String type; + public String description; + public String value; + public String oldValue; + public Long grantedOn; + public AccountAttribute by; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/data/ChangeAttribute.java b/gerrit-server/src/main/java/com/google/gerrit/server/data/ChangeAttribute.java index 48a1744b8c..1a8a78830f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/data/ChangeAttribute.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/data/ChangeAttribute.java @@ -15,33 +15,32 @@ package com.google.gerrit.server.data; import com.google.gerrit.reviewdb.client.Change; - import java.util.List; public class ChangeAttribute { - public String project; - public String branch; - public String topic; - public String id; - public int number; - public String subject; - public AccountAttribute owner; - public AccountAttribute assignee; - public String url; - public String commitMessage; + public String project; + public String branch; + public String topic; + public String id; + public int number; + public String subject; + public AccountAttribute owner; + public AccountAttribute assignee; + public String url; + public String commitMessage; - public Long createdOn; - public Long lastUpdated; - public Boolean open; - public Change.Status status; - public List comments; + public Long createdOn; + public Long lastUpdated; + public Boolean open; + public Change.Status status; + public List comments; - public List trackingIds; - public PatchSetAttribute currentPatchSet; - public List patchSets; + public List trackingIds; + public PatchSetAttribute currentPatchSet; + public List patchSets; - public List dependsOn; - public List neededBy; - public List submitRecords; - public List allReviewers; + public List dependsOn; + public List neededBy; + public List submitRecords; + public List allReviewers; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/data/MessageAttribute.java b/gerrit-server/src/main/java/com/google/gerrit/server/data/MessageAttribute.java index f18bebad41..6837d449ac 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/data/MessageAttribute.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/data/MessageAttribute.java @@ -15,7 +15,7 @@ package com.google.gerrit.server.data; public class MessageAttribute { - public Long timestamp; - public AccountAttribute reviewer; - public String message; + public Long timestamp; + public AccountAttribute reviewer; + public String message; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/data/PatchAttribute.java b/gerrit-server/src/main/java/com/google/gerrit/server/data/PatchAttribute.java index 12ac30a8ce..22f18afaae 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/data/PatchAttribute.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/data/PatchAttribute.java @@ -17,9 +17,9 @@ package com.google.gerrit.server.data; import com.google.gerrit.reviewdb.client.Patch.ChangeType; public class PatchAttribute { - public String file; - public String fileOld; - public ChangeType type; - public int insertions; - public int deletions; + public String file; + public String fileOld; + public ChangeType type; + public int insertions; + public int deletions; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/data/PatchSetAttribute.java b/gerrit-server/src/main/java/com/google/gerrit/server/data/PatchSetAttribute.java index 8e436579d6..d3b3786d5a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/data/PatchSetAttribute.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/data/PatchSetAttribute.java @@ -15,7 +15,6 @@ package com.google.gerrit.server.data; import com.google.gerrit.extensions.client.ChangeKind; - import java.util.List; public class PatchSetAttribute { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/data/PatchSetCommentAttribute.java b/gerrit-server/src/main/java/com/google/gerrit/server/data/PatchSetCommentAttribute.java index 7610068a44..d004e6ceae 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/data/PatchSetCommentAttribute.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/data/PatchSetCommentAttribute.java @@ -15,8 +15,8 @@ package com.google.gerrit.server.data; public class PatchSetCommentAttribute { - public String file; - public Integer line; - public AccountAttribute reviewer; - public String message; + public String file; + public Integer line; + public AccountAttribute reviewer; + public String message; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/data/SubmitLabelAttribute.java b/gerrit-server/src/main/java/com/google/gerrit/server/data/SubmitLabelAttribute.java index 4c774c27db..1b3c6a4831 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/data/SubmitLabelAttribute.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/data/SubmitLabelAttribute.java @@ -15,7 +15,7 @@ package com.google.gerrit.server.data; public class SubmitLabelAttribute { - public String label; - public String status; - public AccountAttribute by; + public String label; + public String status; + public AccountAttribute by; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/data/SubmitRecordAttribute.java b/gerrit-server/src/main/java/com/google/gerrit/server/data/SubmitRecordAttribute.java index 1ce2ce6fab..fec870f365 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/data/SubmitRecordAttribute.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/data/SubmitRecordAttribute.java @@ -17,6 +17,6 @@ package com.google.gerrit.server.data; import java.util.List; public class SubmitRecordAttribute { - public String status; - public List labels; + public String status; + public List labels; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/documentation/MarkdownFormatter.java b/gerrit-server/src/main/java/com/google/gerrit/server/documentation/MarkdownFormatter.java index 1d9c7957d5..68d2a347df 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/documentation/MarkdownFormatter.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/documentation/MarkdownFormatter.java @@ -20,7 +20,13 @@ import static org.pegdown.Extensions.HARDWRAPS; import static org.pegdown.Extensions.SUPPRESS_ALL_HTML; import com.google.common.base.Strings; - +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.URL; +import java.nio.charset.Charset; +import java.util.concurrent.atomic.AtomicBoolean; import org.apache.commons.lang.StringEscapeUtils; import org.eclipse.jgit.util.RawParseUtils; import org.eclipse.jgit.util.TemporaryBuffer; @@ -34,17 +40,8 @@ import org.pegdown.ast.TextNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.UnsupportedEncodingException; -import java.net.URL; -import java.nio.charset.Charset; -import java.util.concurrent.atomic.AtomicBoolean; - public class MarkdownFormatter { - private static final Logger log = - LoggerFactory.getLogger(MarkdownFormatter.class); + private static final Logger log = LoggerFactory.getLogger(MarkdownFormatter.class); private static final String defaultCss; @@ -85,8 +82,7 @@ public class MarkdownFormatter { return this; } - public byte[] markdownToDocHtml(String md, String charEnc) - throws UnsupportedEncodingException { + public byte[] markdownToDocHtml(String md, String charEnc) throws UnsupportedEncodingException { RootNode root = parseMarkdown(md); String title = findTitle(root); @@ -118,9 +114,7 @@ public class MarkdownFormatter { private String findTitle(Node root) { if (root instanceof HeaderNode) { HeaderNode h = (HeaderNode) root; - if (h.getLevel() == 1 - && h.getChildren() != null - && !h.getChildren().isEmpty()) { + if (h.getLevel() == 1 && h.getChildren() != null && !h.getChildren().isEmpty()) { StringBuilder b = new StringBuilder(); for (Node n : root.getChildren()) { if (n instanceof TextNode) { @@ -145,12 +139,10 @@ public class MarkdownFormatter { if (suppressHtml) { options |= SUPPRESS_ALL_HTML; } - return new PegDownProcessor(options) - .parseMarkdown(md.toCharArray()); + return new PegDownProcessor(options).parseMarkdown(md.toCharArray()); } - private static String readPegdownCss(AtomicBoolean file) - throws IOException { + private static String readPegdownCss(AtomicBoolean file) throws IOException { String name = "pegdown.css"; URL url = MarkdownFormatter.class.getResource(name); if (url == null) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/documentation/QueryDocumentationExecutor.java b/gerrit-server/src/main/java/com/google/gerrit/server/documentation/QueryDocumentationExecutor.java index 9b15a426c1..eef6d3509c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/documentation/QueryDocumentationExecutor.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/documentation/QueryDocumentationExecutor.java @@ -18,7 +18,12 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.inject.Inject; import com.google.inject.Singleton; - +import java.io.IOException; +import java.io.InputStream; +import java.util.List; +import java.util.Map; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.index.DirectoryReader; @@ -34,21 +39,14 @@ import org.apache.lucene.store.RAMDirectory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.io.InputStream; -import java.util.List; -import java.util.Map; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; - @Singleton public class QueryDocumentationExecutor { - private static final Logger log = - LoggerFactory.getLogger(QueryDocumentationExecutor.class); + private static final Logger log = LoggerFactory.getLogger(QueryDocumentationExecutor.class); - private static Map WEIGHTS = ImmutableMap.of( - Constants.TITLE_FIELD, 2.0f, - Constants.DOC_FIELD, 1.0f); + private static Map WEIGHTS = + ImmutableMap.of( + Constants.TITLE_FIELD, 2.0f, + Constants.DOC_FIELD, 1.0f); private IndexSearcher searcher; private SimpleQueryParser parser; @@ -134,8 +132,7 @@ public class QueryDocumentationExecutor { @SuppressWarnings("serial") public static class DocQueryException extends Exception { - DocQueryException() { - } + DocQueryException() {} DocQueryException(String msg) { super(msg); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEdit.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEdit.java index b7bb36092c..a6464a7461 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEdit.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEdit.java @@ -21,18 +21,16 @@ import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.reviewdb.client.RefNames; import com.google.gerrit.reviewdb.client.RevId; import com.google.gerrit.server.IdentifiedUser; - import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.revwalk.RevCommit; /** * A single user's edit for a change. - *

- * There is max. one edit per user per change. Edits are stored on refs: - * refs/users/UU/UUUU/edit-CCCC/P where UU/UUUU is sharded representation - * of user account, CCCC is change number and P is the patch set number it - * is based on. + * + *

There is max. one edit per user per change. Edits are stored on refs: + * refs/users/UU/UUUU/edit-CCCC/P where UU/UUUU is sharded representation of user account, CCCC is + * change number and P is the patch set number it is based on. */ public class ChangeEdit { private final IdentifiedUser user; @@ -41,8 +39,8 @@ public class ChangeEdit { private final RevCommit editCommit; private final PatchSet basePatchSet; - public ChangeEdit(IdentifiedUser user, Change change, Ref ref, - RevCommit editCommit, PatchSet basePatchSet) { + public ChangeEdit( + IdentifiedUser user, Change change, Ref ref, RevCommit editCommit, PatchSet basePatchSet) { checkNotNull(user); checkNotNull(change); checkNotNull(ref); @@ -72,8 +70,7 @@ public class ChangeEdit { } public String getRefName() { - return RefNames.refsEdit(user.getAccountId(), change.getId(), - basePatchSet.getId()); + return RefNames.refsEdit(user.getAccountId(), change.getId(), basePatchSet.getId()); } public RevCommit getEditCommit() { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditJson.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditJson.java index be9e1b5b4c..41af77d30e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditJson.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditJson.java @@ -26,12 +26,10 @@ import com.google.gerrit.server.change.ChangeJson; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.eclipse.jgit.revwalk.RevCommit; - import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.Map; +import org.eclipse.jgit.revwalk.RevCommit; @Singleton public class ChangeEditJson { @@ -40,7 +38,8 @@ public class ChangeEditJson { private final Provider userProvider; @Inject - ChangeEditJson(DynamicMap downloadCommand, + ChangeEditJson( + DynamicMap downloadCommand, DynamicMap downloadSchemes, Provider userProvider) { this.downloadCommands = downloadCommand; @@ -62,8 +61,7 @@ public class ChangeEditJson { CommitInfo commit = new CommitInfo(); commit.commit = editCommit.toObjectId().getName(); commit.author = CommonConverters.toGitPerson(editCommit.getAuthorIdent()); - commit.committer = CommonConverters.toGitPerson( - editCommit.getCommitterIdent()); + commit.committer = CommonConverters.toGitPerson(editCommit.getCommitterIdent()); commit.subject = editCommit.getShortMessage(); commit.message = editCommit.getFullMessage(); @@ -83,8 +81,7 @@ public class ChangeEditJson { String schemeName = e.getExportName(); DownloadScheme scheme = e.getProvider().get(); if (!scheme.isEnabled() - || (scheme.isAuthRequired() - && !userProvider.get().isIdentifiedUser())) { + || (scheme.isAuthRequired() && !userProvider.get().isIdentifiedUser())) { continue; } @@ -98,8 +95,7 @@ public class ChangeEditJson { FetchInfo fetchInfo = new FetchInfo(scheme.getUrl(projectName), refName); r.put(schemeName, fetchInfo); - ChangeJson.populateFetchMap(scheme, downloadCommands, projectName, - refName, fetchInfo); + ChangeJson.populateFetchMap(scheme, downloadCommands, projectName, refName, fetchInfo); } return r; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java index e7e093aa8b..4a7f7daf34 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java @@ -42,7 +42,10 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; +import java.sql.Timestamp; +import java.util.Optional; +import java.util.TimeZone; import org.eclipse.jgit.lib.BatchRefUpdate; import org.eclipse.jgit.lib.CommitBuilder; import org.eclipse.jgit.lib.NullProgressMonitor; @@ -58,17 +61,12 @@ import org.eclipse.jgit.revwalk.RevTree; import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.transport.ReceiveCommand; -import java.io.IOException; -import java.sql.Timestamp; -import java.util.Optional; -import java.util.TimeZone; - /** * Utility functions to manipulate change edits. - *

- * This class contains methods to modify edit's content. - * For retrieving, publishing and deleting edit see - * {@link ChangeEditUtil}. + * + *

This class contains methods to modify edit's content. For retrieving, publishing and deleting + * edit see {@link ChangeEditUtil}. + * *

*/ @Singleton @@ -82,7 +80,8 @@ public class ChangeEditModifier { private final PatchSetUtil patchSetUtil; @Inject - ChangeEditModifier(@GerritPersonIdent PersonIdent gerritIdent, + ChangeEditModifier( + @GerritPersonIdent PersonIdent gerritIdent, ChangeIndexer indexer, Provider reviewDb, Provider currentUser, @@ -100,68 +99,64 @@ public class ChangeEditModifier { * Creates a new change edit. * * @param repository the affected Git repository - * @param changeControl the {@code ChangeControl} of the change for which - * the change edit should be created - * @throws AuthException if the user isn't authenticated or not allowed to - * use change edits - * @throws InvalidChangeOperationException if a change edit already existed - * for the change + * @param changeControl the {@code ChangeControl} of the change for which the change edit should + * be created + * @throws AuthException if the user isn't authenticated or not allowed to use change edits + * @throws InvalidChangeOperationException if a change edit already existed for the change */ public void createEdit(Repository repository, ChangeControl changeControl) - throws AuthException, IOException, InvalidChangeOperationException, - OrmException { + throws AuthException, IOException, InvalidChangeOperationException, OrmException { ensureAuthenticatedAndPermitted(changeControl); Optional changeEdit = lookupChangeEdit(changeControl); if (changeEdit.isPresent()) { - throw new InvalidChangeOperationException(String.format("A change edit " - + "already exists for change %s", changeControl.getId())); + throw new InvalidChangeOperationException( + String.format("A change edit " + "already exists for change %s", changeControl.getId())); } PatchSet currentPatchSet = lookupCurrentPatchSet(changeControl); ObjectId patchSetCommitId = getPatchSetCommitId(currentPatchSet); - createEditReference(repository, changeControl, currentPatchSet, - patchSetCommitId, TimeUtil.nowTs()); + createEditReference( + repository, changeControl, currentPatchSet, patchSetCommitId, TimeUtil.nowTs()); } /** * Rebase change edit on latest patch set * * @param repository the affected Git repository - * @param changeControl the {@code ChangeControl} of the change whose change - * edit should be rebased - * @throws AuthException if the user isn't authenticated or not allowed to - * use change edits - * @throws InvalidChangeOperationException if a change edit doesn't exist - * for the specified change, the change edit is already based on the latest - * patch set, or the change represents the root commit + * @param changeControl the {@code ChangeControl} of the change whose change edit should be + * rebased + * @throws AuthException if the user isn't authenticated or not allowed to use change edits + * @throws InvalidChangeOperationException if a change edit doesn't exist for the specified + * change, the change edit is already based on the latest patch set, or the change represents + * the root commit * @throws MergeConflictException if rebase fails due to merge conflicts */ public void rebaseEdit(Repository repository, ChangeControl changeControl) - throws AuthException, InvalidChangeOperationException, IOException, - OrmException, MergeConflictException { + throws AuthException, InvalidChangeOperationException, IOException, OrmException, + MergeConflictException { ensureAuthenticatedAndPermitted(changeControl); Optional optionalChangeEdit = lookupChangeEdit(changeControl); if (!optionalChangeEdit.isPresent()) { - throw new InvalidChangeOperationException(String.format( - "No change edit exists for change %s", changeControl.getId())); + throw new InvalidChangeOperationException( + String.format("No change edit exists for change %s", changeControl.getId())); } ChangeEdit changeEdit = optionalChangeEdit.get(); PatchSet currentPatchSet = lookupCurrentPatchSet(changeControl); if (isBasedOn(changeEdit, currentPatchSet)) { - throw new InvalidChangeOperationException(String.format( - "Change edit for change %s is already based on latest patch set %s", - changeControl.getId(), currentPatchSet.getId())); + throw new InvalidChangeOperationException( + String.format( + "Change edit for change %s is already based on latest patch set %s", + changeControl.getId(), currentPatchSet.getId())); } rebase(repository, changeEdit, currentPatchSet); } - private void rebase(Repository repository, ChangeEdit changeEdit, - PatchSet currentPatchSet) throws IOException, MergeConflictException, - InvalidChangeOperationException, OrmException { + private void rebase(Repository repository, ChangeEdit changeEdit, PatchSet currentPatchSet) + throws IOException, MergeConflictException, InvalidChangeOperationException, OrmException { RevCommit currentEditCommit = changeEdit.getEditCommit(); if (currentEditCommit.getParentCount() == 0) { throw new InvalidChangeOperationException( @@ -175,39 +170,42 @@ public class ChangeEditModifier { ObjectId newTreeId = merge(repository, changeEdit, basePatchSetTree); Timestamp nowTimestamp = TimeUtil.nowTs(); String commitMessage = currentEditCommit.getFullMessage(); - ObjectId newEditCommitId = createCommit(repository, basePatchSetCommit, - newTreeId, commitMessage, nowTimestamp); + ObjectId newEditCommitId = + createCommit(repository, basePatchSetCommit, newTreeId, commitMessage, nowTimestamp); String newEditRefName = getEditRefName(change, currentPatchSet); - updateReferenceWithNameChange(repository, changeEdit.getRefName(), - currentEditCommit, newEditRefName, newEditCommitId, nowTimestamp); + updateReferenceWithNameChange( + repository, + changeEdit.getRefName(), + currentEditCommit, + newEditRefName, + newEditCommitId, + nowTimestamp); reindex(change); } /** - * Modifies the commit message of a change edit. If the change edit doesn't - * exist, a new one will be created based on the current patch set. + * Modifies the commit message of a change edit. If the change edit doesn't exist, a new one will + * be created based on the current patch set. * * @param repository the affected Git repository - * @param changeControl the {@code ChangeControl} of the change whose change - * edit's message should be modified + * @param changeControl the {@code ChangeControl} of the change whose change edit's message should + * be modified * @param newCommitMessage the new commit message - * @throws AuthException if the user isn't authenticated or not allowed to - * use change edits - * @throws UnchangedCommitMessageException if the commit message is the same - * as before + * @throws AuthException if the user isn't authenticated or not allowed to use change edits + * @throws UnchangedCommitMessageException if the commit message is the same as before */ - public void modifyMessage(Repository repository, ChangeControl changeControl, - String newCommitMessage) throws AuthException, IOException, - UnchangedCommitMessageException, OrmException { + public void modifyMessage( + Repository repository, ChangeControl changeControl, String newCommitMessage) + throws AuthException, IOException, UnchangedCommitMessageException, OrmException { ensureAuthenticatedAndPermitted(changeControl); newCommitMessage = getWellFormedCommitMessage(newCommitMessage); Optional optionalChangeEdit = lookupChangeEdit(changeControl); PatchSet basePatchSet = getBasePatchSet(optionalChangeEdit, changeControl); RevCommit basePatchSetCommit = lookupCommit(repository, basePatchSet); - RevCommit baseCommit = optionalChangeEdit.map(ChangeEdit::getEditCommit) - .orElse(basePatchSetCommit); + RevCommit baseCommit = + optionalChangeEdit.map(ChangeEdit::getEditCommit).orElse(basePatchSetCommit); String currentCommitMessage = baseCommit.getFullMessage(); if (newCommitMessage.equals(currentCommitMessage)) { @@ -216,123 +214,111 @@ public class ChangeEditModifier { RevTree baseTree = baseCommit.getTree(); Timestamp nowTimestamp = TimeUtil.nowTs(); - ObjectId newEditCommit = createCommit(repository, basePatchSetCommit, - baseTree, newCommitMessage, nowTimestamp); + ObjectId newEditCommit = + createCommit(repository, basePatchSetCommit, baseTree, newCommitMessage, nowTimestamp); if (optionalChangeEdit.isPresent()) { - updateEditReference(repository, optionalChangeEdit.get(), newEditCommit, - nowTimestamp); + updateEditReference(repository, optionalChangeEdit.get(), newEditCommit, nowTimestamp); } else { - createEditReference(repository, changeControl, basePatchSet, - newEditCommit, nowTimestamp); + createEditReference(repository, changeControl, basePatchSet, newEditCommit, nowTimestamp); } } /** - * Modifies the contents of a file of a change edit. If the change edit - * doesn't exist, a new one will be created based on the current patch set. + * Modifies the contents of a file of a change edit. If the change edit doesn't exist, a new one + * will be created based on the current patch set. * * @param repository the affected Git repository - * @param changeControl the {@code ChangeControl} of the change whose change - * edit should be modified + * @param changeControl the {@code ChangeControl} of the change whose change edit should be + * modified * @param filePath the path of the file whose contents should be modified * @param newContent the new file content - * @throws AuthException if the user isn't authenticated or not allowed to - * use change edits - * @throws InvalidChangeOperationException if the file already had the - * specified content + * @throws AuthException if the user isn't authenticated or not allowed to use change edits + * @throws InvalidChangeOperationException if the file already had the specified content */ - public void modifyFile(Repository repository, ChangeControl changeControl, - String filePath, RawInput newContent) throws AuthException, - InvalidChangeOperationException, IOException, OrmException { - modifyTree(repository, changeControl, - new ChangeFileContentModification(filePath, newContent)); + public void modifyFile( + Repository repository, ChangeControl changeControl, String filePath, RawInput newContent) + throws AuthException, InvalidChangeOperationException, IOException, OrmException { + modifyTree(repository, changeControl, new ChangeFileContentModification(filePath, newContent)); } /** - * Deletes a file from the Git tree of a change edit. If the change edit - * doesn't exist, a new one will be created based on the current patch set. + * Deletes a file from the Git tree of a change edit. If the change edit doesn't exist, a new one + * will be created based on the current patch set. * * @param repository the affected Git repository - * @param changeControl the {@code ChangeControl} of the change whose change - * edit should be modified + * @param changeControl the {@code ChangeControl} of the change whose change edit should be + * modified * @param file path of the file which should be deleted - * @throws AuthException if the user isn't authenticated or not allowed to - * use change edits + * @throws AuthException if the user isn't authenticated or not allowed to use change edits * @throws InvalidChangeOperationException if the file does not exist */ - public void deleteFile(Repository repository, ChangeControl changeControl, - String file) throws AuthException, InvalidChangeOperationException, - IOException, OrmException { + public void deleteFile(Repository repository, ChangeControl changeControl, String file) + throws AuthException, InvalidChangeOperationException, IOException, OrmException { modifyTree(repository, changeControl, new DeleteFileModification(file)); } /** - * Renames a file of a change edit or moves it to another directory. If the - * change edit doesn't exist, a new one will be created based on the current - * patch set. + * Renames a file of a change edit or moves it to another directory. If the change edit doesn't + * exist, a new one will be created based on the current patch set. * * @param repository the affected Git repository - * @param changeControl the {@code ChangeControl} of the change whose change - * edit should be modified + * @param changeControl the {@code ChangeControl} of the change whose change edit should be + * modified * @param currentFilePath the current path/name of the file * @param newFilePath the desired path/name of the file - * @throws AuthException if the user isn't authenticated or not allowed to - * use change edits - * @throws InvalidChangeOperationException if the file was already renamed - * to the specified new name + * @throws AuthException if the user isn't authenticated or not allowed to use change edits + * @throws InvalidChangeOperationException if the file was already renamed to the specified new + * name */ - public void renameFile(Repository repository, ChangeControl changeControl, - String currentFilePath, String newFilePath) throws AuthException, - InvalidChangeOperationException, IOException, OrmException { - modifyTree(repository, changeControl, - new RenameFileModification(currentFilePath, newFilePath)); + public void renameFile( + Repository repository, + ChangeControl changeControl, + String currentFilePath, + String newFilePath) + throws AuthException, InvalidChangeOperationException, IOException, OrmException { + modifyTree(repository, changeControl, new RenameFileModification(currentFilePath, newFilePath)); } /** - * Restores a file of a change edit to the state it was in before the patch - * set on which the change edit is based. If the change edit doesn't exist, a - * new one will be created based on the current patch set. + * Restores a file of a change edit to the state it was in before the patch set on which the + * change edit is based. If the change edit doesn't exist, a new one will be created based on the + * current patch set. * * @param repository the affected Git repository - * @param changeControl the {@code ChangeControl} of the change whose change - * edit should be modified + * @param changeControl the {@code ChangeControl} of the change whose change edit should be + * modified * @param file the path of the file which should be restored - * @throws AuthException if the user isn't authenticated or not allowed to - * use change edits + * @throws AuthException if the user isn't authenticated or not allowed to use change edits * @throws InvalidChangeOperationException if the file was already restored */ - public void restoreFile(Repository repository, ChangeControl changeControl, - String file) throws AuthException, InvalidChangeOperationException, - IOException, OrmException { + public void restoreFile(Repository repository, ChangeControl changeControl, String file) + throws AuthException, InvalidChangeOperationException, IOException, OrmException { modifyTree(repository, changeControl, new RestoreFileModification(file)); } - private void modifyTree(Repository repository, ChangeControl changeControl, - TreeModification treeModification) throws AuthException, IOException, - OrmException, InvalidChangeOperationException { + private void modifyTree( + Repository repository, ChangeControl changeControl, TreeModification treeModification) + throws AuthException, IOException, OrmException, InvalidChangeOperationException { ensureAuthenticatedAndPermitted(changeControl); Optional optionalChangeEdit = lookupChangeEdit(changeControl); PatchSet basePatchSet = getBasePatchSet(optionalChangeEdit, changeControl); RevCommit basePatchSetCommit = lookupCommit(repository, basePatchSet); - RevCommit baseCommit = optionalChangeEdit.map(ChangeEdit::getEditCommit) - .orElse(basePatchSetCommit); + RevCommit baseCommit = + optionalChangeEdit.map(ChangeEdit::getEditCommit).orElse(basePatchSetCommit); - ObjectId newTreeId = createNewTree(repository, baseCommit, - treeModification); + ObjectId newTreeId = createNewTree(repository, baseCommit, treeModification); String commitMessage = baseCommit.getFullMessage(); Timestamp nowTimestamp = TimeUtil.nowTs(); - ObjectId newEditCommit = createCommit(repository, basePatchSetCommit, - newTreeId, commitMessage, nowTimestamp); + ObjectId newEditCommit = + createCommit(repository, basePatchSetCommit, newTreeId, commitMessage, nowTimestamp); if (optionalChangeEdit.isPresent()) { - updateEditReference(repository, optionalChangeEdit.get(), newEditCommit, - nowTimestamp); + updateEditReference(repository, optionalChangeEdit.get(), newEditCommit, nowTimestamp); } else { - createEditReference(repository, changeControl, basePatchSet, - newEditCommit, nowTimestamp); + createEditReference(repository, changeControl, basePatchSet, newEditCommit, nowTimestamp); } } @@ -348,8 +334,7 @@ public class ChangeEditModifier { } } - private void ensurePermitted(ChangeControl changeControl) - throws OrmException, AuthException { + private void ensurePermitted(ChangeControl changeControl) throws OrmException, AuthException { if (!changeControl.canAddPatchSet(reviewDb.get())) { throw new AuthException("Not allowed to edit a change."); } @@ -357,8 +342,7 @@ public class ChangeEditModifier { private String getWellFormedCommitMessage(String commitMessage) { String wellFormedMessage = Strings.nullToEmpty(commitMessage).trim(); - checkState(!wellFormedMessage.isEmpty(), - "Commit message cannot be null or empty"); + checkState(!wellFormedMessage.isEmpty(), "Commit message cannot be null or empty"); wellFormedMessage = wellFormedMessage + "\n"; return wellFormedMessage; } @@ -368,17 +352,15 @@ public class ChangeEditModifier { return changeEditUtil.byChange(changeControl); } - private PatchSet getBasePatchSet(Optional optionalChangeEdit, - ChangeControl changeControl) throws OrmException { - Optional editBasePatchSet = - optionalChangeEdit.map(ChangeEdit::getBasePatchSet); + private PatchSet getBasePatchSet( + Optional optionalChangeEdit, ChangeControl changeControl) throws OrmException { + Optional editBasePatchSet = optionalChangeEdit.map(ChangeEdit::getBasePatchSet); return editBasePatchSet.isPresent() ? editBasePatchSet.get() : lookupCurrentPatchSet(changeControl); } - private PatchSet lookupCurrentPatchSet(ChangeControl changeControl) - throws OrmException { + private PatchSet lookupCurrentPatchSet(ChangeControl changeControl) throws OrmException { return patchSetUtil.current(reviewDb.get(), changeControl.getNotes()); } @@ -387,16 +369,16 @@ public class ChangeEditModifier { return editBasePatchSet.getId().equals(patchSet.getId()); } - private static RevCommit lookupCommit(Repository repository, - PatchSet patchSet) throws IOException { + private static RevCommit lookupCommit(Repository repository, PatchSet patchSet) + throws IOException { ObjectId patchSetCommitId = getPatchSetCommitId(patchSet); try (RevWalk revWalk = new RevWalk(repository)) { return revWalk.parseCommit(patchSetCommitId); } } - private static ObjectId createNewTree(Repository repository, - RevCommit baseCommit, TreeModification treeModification) + private static ObjectId createNewTree( + Repository repository, RevCommit baseCommit, TreeModification treeModification) throws IOException, InvalidChangeOperationException { TreeCreator treeCreator = new TreeCreator(baseCommit); treeCreator.addTreeModification(treeModification); @@ -408,14 +390,13 @@ public class ChangeEditModifier { return newTreeId; } - private ObjectId merge(Repository repository, ChangeEdit changeEdit, - ObjectId newTreeId) throws IOException, MergeConflictException { + private ObjectId merge(Repository repository, ChangeEdit changeEdit, ObjectId newTreeId) + throws IOException, MergeConflictException { PatchSet basePatchSet = changeEdit.getBasePatchSet(); ObjectId basePatchSetCommitId = getPatchSetCommitId(basePatchSet); ObjectId editCommitId = changeEdit.getEditCommit(); - ThreeWayMerger threeWayMerger = - MergeStrategy.RESOLVE.newMerger(repository, true); + ThreeWayMerger threeWayMerger = MergeStrategy.RESOLVE.newMerger(repository, true); threeWayMerger.setBase(basePatchSetCommitId); boolean successful = threeWayMerger.merge(newTreeId, editCommitId); @@ -426,9 +407,13 @@ public class ChangeEditModifier { return threeWayMerger.getResultTreeId(); } - private ObjectId createCommit(Repository repository, - RevCommit basePatchSetCommit, ObjectId tree, String commitMessage, - Timestamp timestamp) throws IOException { + private ObjectId createCommit( + Repository repository, + RevCommit basePatchSetCommit, + ObjectId tree, + String commitMessage, + Timestamp timestamp) + throws IOException { try (ObjectInserter objectInserter = repository.newObjectInserter()) { CommitBuilder builder = new CommitBuilder(); builder.setTreeId(tree); @@ -451,35 +436,39 @@ public class ChangeEditModifier { return ObjectId.fromString(patchSet.getRevision().get()); } - private void createEditReference(Repository repository, - ChangeControl changeControl, PatchSet basePatchSet, - ObjectId newEditCommit, Timestamp timestamp) + private void createEditReference( + Repository repository, + ChangeControl changeControl, + PatchSet basePatchSet, + ObjectId newEditCommit, + Timestamp timestamp) throws IOException, OrmException { Change change = changeControl.getChange(); String editRefName = getEditRefName(change, basePatchSet); - updateReference(repository, editRefName, ObjectId.zeroId(), newEditCommit, - timestamp); + updateReference(repository, editRefName, ObjectId.zeroId(), newEditCommit, timestamp); reindex(change); } private String getEditRefName(Change change, PatchSet basePatchSet) { IdentifiedUser me = currentUser.get().asIdentifiedUser(); - return RefNames.refsEdit(me.getAccountId(), change.getId(), - basePatchSet.getId()); + return RefNames.refsEdit(me.getAccountId(), change.getId(), basePatchSet.getId()); } - private void updateEditReference(Repository repository, ChangeEdit changeEdit, - ObjectId newEditCommit, Timestamp timestamp) + private void updateEditReference( + Repository repository, ChangeEdit changeEdit, ObjectId newEditCommit, Timestamp timestamp) throws IOException, OrmException { String editRefName = changeEdit.getRefName(); RevCommit currentEditCommit = changeEdit.getEditCommit(); - updateReference(repository, editRefName, currentEditCommit, newEditCommit, - timestamp); + updateReference(repository, editRefName, currentEditCommit, newEditCommit, timestamp); reindex(changeEdit.getChange()); } - private void updateReference(Repository repository, String refName, - ObjectId currentObjectId, ObjectId targetObjectId, Timestamp timestamp) + private void updateReference( + Repository repository, + String refName, + ObjectId currentObjectId, + ObjectId targetObjectId, + Timestamp timestamp) throws IOException { RefUpdate ru = repository.updateRef(refName); ru.setExpectedOldObjectId(currentObjectId); @@ -495,16 +484,18 @@ public class ChangeEditModifier { } } - private void updateReferenceWithNameChange(Repository repository, - String currentRefName, ObjectId currentObjectId, String newRefName, - ObjectId targetObjectId, Timestamp timestamp) + private void updateReferenceWithNameChange( + Repository repository, + String currentRefName, + ObjectId currentObjectId, + String newRefName, + ObjectId targetObjectId, + Timestamp timestamp) throws IOException { - BatchRefUpdate batchRefUpdate = - repository.getRefDatabase().newBatchUpdate(); - batchRefUpdate.addCommand(new ReceiveCommand(ObjectId.zeroId(), - targetObjectId, newRefName)); - batchRefUpdate.addCommand(new ReceiveCommand(currentObjectId, - ObjectId.zeroId(), currentRefName)); + BatchRefUpdate batchRefUpdate = repository.getRefDatabase().newBatchUpdate(); + batchRefUpdate.addCommand(new ReceiveCommand(ObjectId.zeroId(), targetObjectId, newRefName)); + batchRefUpdate.addCommand( + new ReceiveCommand(currentObjectId, ObjectId.zeroId(), currentRefName)); batchRefUpdate.setRefLogMessage("rebase edit", false); batchRefUpdate.setRefLogIdent(getRefLogIdent(timestamp)); try (RevWalk revWalk = new RevWalk(repository)) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java index 784d4d6aec..31712f37d7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java @@ -47,7 +47,8 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; +import java.util.Optional; import org.eclipse.jgit.lib.CommitBuilder; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectInserter; @@ -57,14 +58,11 @@ import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; -import java.io.IOException; -import java.util.Optional; - /** * Utility functions to manipulate change edits. - *

- * This class contains methods to retrieve, publish and delete edits. - * For changing edits see {@link ChangeEditModifier}. + * + *

This class contains methods to retrieve, publish and delete edits. For changing edits see + * {@link ChangeEditModifier}. */ @Singleton public class ChangeEditUtil { @@ -79,7 +77,8 @@ public class ChangeEditUtil { private final PatchSetUtil psUtil; @Inject - ChangeEditUtil(GitRepositoryManager gitManager, + ChangeEditUtil( + GitRepositoryManager gitManager, PatchSetInserter.Factory patchSetInserterFactory, ChangeControl.GenericFactory changeControlFactory, ChangeIndexer indexer, @@ -101,8 +100,8 @@ public class ChangeEditUtil { /** * Retrieve edit for a change and the user from the request scope. - *

- * At most one change edit can exist per user and change. + * + *

At most one change edit can exist per user and change. * * @param change * @return edit for this change for this user, if present. @@ -113,8 +112,7 @@ public class ChangeEditUtil { public Optional byChange(Change change) throws AuthException, IOException, OrmException { try { - return byChange( - changeControlFactory.controlFor(db.get(), change, user.get())); + return byChange(changeControlFactory.controlFor(db.get(), change, user.get())); } catch (NoSuchChangeException e) { throw new IOException(e); } @@ -122,16 +120,15 @@ public class ChangeEditUtil { /** * Retrieve edit for a change and the given user. - *

- * At most one change edit can exist per user and change. + * + *

At most one change edit can exist per user and change. * * @param ctl control with user to retrieve change edits for. * @return edit for this change for this user, if present. * @throws AuthException if this is not a logged-in user. * @throws IOException if an error occurs. */ - public Optional byChange(ChangeControl ctl) - throws AuthException, IOException { + public Optional byChange(ChangeControl ctl) throws AuthException, IOException { if (!ctl.getUser().isIdentifiedUser()) { throw new AuthException("Authentication required"); } @@ -141,9 +138,8 @@ public class ChangeEditUtil { int n = change.currentPatchSetId().get(); String[] refNames = new String[n]; for (int i = n; i > 0; i--) { - refNames[i - 1] = RefNames.refsEdit( - u.getAccountId(), change.getId(), - new PatchSet.Id(change.getId(), i)); + refNames[i - 1] = + RefNames.refsEdit(u.getAccountId(), change.getId(), new PatchSet.Id(change.getId(), i)); } Ref ref = repo.getRefDatabase().firstExactRef(refNames); if (ref == null) { @@ -161,16 +157,17 @@ public class ChangeEditUtil { * Promote change edit to patch set, by squashing the edit into its parent. * * @param edit change edit to publish - * @param notify Notify handling that defines to whom email notifications - * should be sent after the change edit is published. - * @param accountsToNotify Accounts that should be notified after the change - * edit is published. + * @param notify Notify handling that defines to whom email notifications should be sent after the + * change edit is published. + * @param accountsToNotify Accounts that should be notified after the change edit is published. * @throws IOException * @throws OrmException * @throws UpdateException * @throws RestApiException */ - public void publish(final ChangeEdit edit, NotifyHandling notify, + public void publish( + final ChangeEdit edit, + NotifyHandling notify, ListMultimap accountsToNotify) throws IOException, OrmException, RestApiException, UpdateException { Change change = edit.getChange(); @@ -179,57 +176,60 @@ public class ChangeEditUtil { ObjectInserter oi = repo.newObjectInserter()) { PatchSet basePatchSet = edit.getBasePatchSet(); if (!basePatchSet.getId().equals(change.currentPatchSetId())) { - throw new ResourceConflictException( - "only edit for current patch set can be published"); + throw new ResourceConflictException("only edit for current patch set can be published"); } RevCommit squashed = squashEdit(rw, oi, edit.getEditCommit(), basePatchSet); - ChangeControl ctl = - changeControlFactory.controlFor(db.get(), change, edit.getUser()); - PatchSet.Id psId = - ChangeUtil.nextPatchSetId(repo, change.currentPatchSetId()); - PatchSetInserter inserter = patchSetInserterFactory - .create(ctl, psId, squashed) - .setNotify(notify) - .setAccountsToNotify(accountsToNotify); + ChangeControl ctl = changeControlFactory.controlFor(db.get(), change, edit.getUser()); + PatchSet.Id psId = ChangeUtil.nextPatchSetId(repo, change.currentPatchSetId()); + PatchSetInserter inserter = + patchSetInserterFactory + .create(ctl, psId, squashed) + .setNotify(notify) + .setAccountsToNotify(accountsToNotify); - StringBuilder message = new StringBuilder("Patch Set ") - .append(inserter.getPatchSetId().get()) - .append(": "); + StringBuilder message = + new StringBuilder("Patch Set ").append(inserter.getPatchSetId().get()).append(": "); // Previously checked that the base patch set is the current patch set. ObjectId prior = ObjectId.fromString(basePatchSet.getRevision().get()); - ChangeKind kind = changeKindCache.getChangeKind( - change.getProject(), repo, prior, squashed); + ChangeKind kind = changeKindCache.getChangeKind(change.getProject(), repo, prior, squashed); if (kind == ChangeKind.NO_CODE_CHANGE) { message.append("Commit message was updated."); inserter.setDescription("Edit commit message"); } else { - message.append("Published edit on patch set ") - .append(basePatchSet.getPatchSetId()) - .append("."); + message + .append("Published edit on patch set ") + .append(basePatchSet.getPatchSetId()) + .append("."); } - try (BatchUpdate bu = updateFactory.create( - db.get(), change.getProject(), ctl.getUser(), - TimeUtil.nowTs())) { + try (BatchUpdate bu = + updateFactory.create(db.get(), change.getProject(), ctl.getUser(), TimeUtil.nowTs())) { bu.setRepository(repo, rw, oi); - bu.addOp(change.getId(), inserter - .setDraft(change.getStatus() == Status.DRAFT || - basePatchSet.isDraft()) - .setMessage(message.toString())); - bu.addOp(change.getId(), new BatchUpdate.Op() { - @Override - public void updateRepo(RepoContext ctx) throws Exception { - deleteRef(ctx.getRepository(), edit); - } - }); + bu.addOp( + change.getId(), + inserter + .setDraft(change.getStatus() == Status.DRAFT || basePatchSet.isDraft()) + .setMessage(message.toString())); + bu.addOp( + change.getId(), + new BatchUpdate.Op() { + @Override + public void updateRepo(RepoContext ctx) throws Exception { + deleteRef(ctx.getRepository(), edit); + } + }); bu.execute(); } catch (UpdateException e) { - if (e.getCause() instanceof IOException && e.getMessage() - .equals(String.format("%s: Failed to delete ref %s: %s", - IOException.class.getName(), edit.getRefName(), - RefUpdate.Result.LOCK_FAILURE.name()))) { + if (e.getCause() instanceof IOException + && e.getMessage() + .equals( + String.format( + "%s: Failed to delete ref %s: %s", + IOException.class.getName(), + edit.getRefName(), + RefUpdate.Result.LOCK_FAILURE.name()))) { throw new ResourceConflictException("edit ref was updated"); } } @@ -245,8 +245,7 @@ public class ChangeEditUtil { * @throws IOException * @throws OrmException */ - public void delete(ChangeEdit edit) - throws IOException, OrmException { + public void delete(ChangeEdit edit) throws IOException, OrmException { Change change = edit.getChange(); try (Repository repo = gitManager.openRepository(change.getProject())) { deleteRef(repo, edit); @@ -254,24 +253,22 @@ public class ChangeEditUtil { indexer.index(db.get(), change); } - private PatchSet getBasePatchSet(ChangeControl ctl, Ref ref) - throws IOException { + private PatchSet getBasePatchSet(ChangeControl ctl, Ref ref) throws IOException { try { int pos = ref.getName().lastIndexOf("/"); checkArgument(pos > 0, "invalid edit ref: %s", ref.getName()); String psId = ref.getName().substring(pos + 1); - return psUtil.get(db.get(), ctl.getNotes(), - new PatchSet.Id(ctl.getId(), Integer.parseInt(psId))); + return psUtil.get( + db.get(), ctl.getNotes(), new PatchSet.Id(ctl.getId(), Integer.parseInt(psId))); } catch (OrmException | NumberFormatException e) { throw new IOException(e); } } - private RevCommit squashEdit(RevWalk rw, ObjectInserter inserter, - RevCommit edit, PatchSet basePatchSet) + private RevCommit squashEdit( + RevWalk rw, ObjectInserter inserter, RevCommit edit, PatchSet basePatchSet) throws IOException, ResourceConflictException { - RevCommit parent = rw.parseCommit(ObjectId.fromString( - basePatchSet.getRevision().get())); + RevCommit parent = rw.parseCommit(ObjectId.fromString(basePatchSet.getRevision().get())); if (parent.getTree().equals(edit.getTree()) && edit.getFullMessage().equals(parent.getFullMessage())) { throw new ResourceConflictException("identical tree and message"); @@ -279,8 +276,7 @@ public class ChangeEditUtil { return writeSquashedCommit(rw, inserter, parent, edit); } - private static void deleteRef(Repository repo, ChangeEdit edit) - throws IOException { + private static void deleteRef(Repository repo, ChangeEdit edit) throws IOException { String refName = edit.getRefName(); RefUpdate ru = repo.updateRef(refName, true); ru.setExpectedOldObjectId(edit.getRef().getObjectId()); @@ -299,14 +295,12 @@ public class ChangeEditUtil { case REJECTED_CURRENT_BRANCH: case RENAMED: default: - throw new IOException(String.format("Failed to delete ref %s: %s", - refName, result)); + throw new IOException(String.format("Failed to delete ref %s: %s", refName, result)); } } - private static RevCommit writeSquashedCommit(RevWalk rw, - ObjectInserter inserter, RevCommit parent, RevCommit edit) - throws IOException { + private static RevCommit writeSquashedCommit( + RevWalk rw, ObjectInserter inserter, RevCommit parent, RevCommit edit) throws IOException { CommitBuilder mergeCommit = new CommitBuilder(); for (int i = 0; i < parent.getParentCount(); i++) { mergeCommit.addParentId(parent.getParent(i)); @@ -319,8 +313,8 @@ public class ChangeEditUtil { return rw.parseCommit(commit(inserter, mergeCommit)); } - private static ObjectId commit(ObjectInserter inserter, - CommitBuilder mergeCommit) throws IOException { + private static ObjectId commit(ObjectInserter inserter, CommitBuilder mergeCommit) + throws IOException { ObjectId id = inserter.insert(mergeCommit); inserter.flush(); return id; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/AddPath.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/AddPath.java index 9bf8e2cbec..d7cf29ddbd 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/AddPath.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/AddPath.java @@ -20,8 +20,8 @@ import org.eclipse.jgit.lib.FileMode; import org.eclipse.jgit.lib.ObjectId; /** - * A {@code PathEdit} which adds a file path to the index. This operation is the - * counterpart to {@link org.eclipse.jgit.dircache.DirCacheEditor.DeletePath}. + * A {@code PathEdit} which adds a file path to the index. This operation is the counterpart to + * {@link org.eclipse.jgit.dircache.DirCacheEditor.DeletePath}. */ class AddPath extends DirCacheEditor.PathEdit { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/ChangeFileContentModification.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/ChangeFileContentModification.java index e83155d882..dc353093f4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/ChangeFileContentModification.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/ChangeFileContentModification.java @@ -19,7 +19,10 @@ import static org.eclipse.jgit.lib.Constants.OBJ_BLOB; import com.google.common.io.ByteStreams; import com.google.gerrit.extensions.restapi.RawInput; - +import java.io.IOException; +import java.io.InputStream; +import java.util.Collections; +import java.util.List; import org.eclipse.jgit.dircache.DirCacheEditor; import org.eclipse.jgit.dircache.DirCacheEntry; import org.eclipse.jgit.errors.InvalidObjectIdException; @@ -31,18 +34,10 @@ import org.eclipse.jgit.revwalk.RevCommit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.io.InputStream; -import java.util.Collections; -import java.util.List; - -/** - * A {@code TreeModification} which changes the content of a file. - */ +/** A {@code TreeModification} which changes the content of a file. */ public class ChangeFileContentModification implements TreeModification { - private static final Logger log = - LoggerFactory.getLogger(ChangeFileContentModification.class); + private static final Logger log = LoggerFactory.getLogger(ChangeFileContentModification.class); private final String filePath; private final RawInput newContent; @@ -53,16 +48,12 @@ public class ChangeFileContentModification implements TreeModification { } @Override - public List getPathEdits(Repository repository, - RevCommit baseCommit) { - DirCacheEditor.PathEdit changeContentEdit = new ChangeContent(filePath, - newContent, repository); + public List getPathEdits(Repository repository, RevCommit baseCommit) { + DirCacheEditor.PathEdit changeContentEdit = new ChangeContent(filePath, newContent, repository); return Collections.singletonList(changeContentEdit); } - /** - * A {@code PathEdit} which changes the contents of a file. - */ + /** A {@code PathEdit} which changes the contents of a file. */ private static class ChangeContent extends DirCacheEditor.PathEdit { private final RawInput newContent; @@ -93,8 +84,8 @@ public class ChangeFileContentModification implements TreeModification { // situation, we log them now. However, we should think of a better // approach. } catch (IOException e) { - String message = String.format("Could not change the content of %s", - dirCacheEntry.getPathString()); + String message = + String.format("Could not change the content of %s", dirCacheEntry.getPathString()); log.error(message, e); } catch (InvalidObjectIdException e) { log.error("Invalid object id in submodule link", e); @@ -109,8 +100,7 @@ public class ChangeFileContentModification implements TreeModification { } } - private ObjectId createNewBlobAndGetItsId(ObjectInserter objectInserter) - throws IOException { + private ObjectId createNewBlobAndGetItsId(ObjectInserter objectInserter) throws IOException { long contentLength = newContent.getContentLength(); if (contentLength < 0) { return objectInserter.insert(OBJ_BLOB, getNewContentBytes()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/DeleteFileModification.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/DeleteFileModification.java index 64fe63bc83..62da19ad1f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/DeleteFileModification.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/DeleteFileModification.java @@ -14,16 +14,13 @@ package com.google.gerrit.server.edit.tree; +import java.util.Collections; +import java.util.List; import org.eclipse.jgit.dircache.DirCacheEditor; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; -import java.util.Collections; -import java.util.List; - -/** - * A {@code TreeModification} which deletes a file. - */ +/** A {@code TreeModification} which deletes a file. */ public class DeleteFileModification implements TreeModification { private final String filePath; @@ -33,10 +30,8 @@ public class DeleteFileModification implements TreeModification { } @Override - public List getPathEdits(Repository repository, - RevCommit baseCommit) { - DirCacheEditor.DeletePath deletePathEdit = - new DirCacheEditor.DeletePath(filePath); + public List getPathEdits(Repository repository, RevCommit baseCommit) { + DirCacheEditor.DeletePath deletePathEdit = new DirCacheEditor.DeletePath(filePath); return Collections.singletonList(deletePathEdit); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/RenameFileModification.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/RenameFileModification.java index 32c1e0d537..aeacd2365d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/RenameFileModification.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/RenameFileModification.java @@ -14,21 +14,17 @@ package com.google.gerrit.server.edit.tree; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; import org.eclipse.jgit.dircache.DirCacheEditor; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.treewalk.TreeWalk; -import java.io.IOException; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -/** - * A {@code TreeModification} which renames a file or moves it to a different - * path. - */ +/** A {@code TreeModification} which renames a file or moves it to a different path. */ public class RenameFileModification implements TreeModification { private final String currentFilePath; @@ -40,20 +36,18 @@ public class RenameFileModification implements TreeModification { } @Override - public List getPathEdits(Repository repository, - RevCommit baseCommit) + public List getPathEdits(Repository repository, RevCommit baseCommit) throws IOException { try (RevWalk revWalk = new RevWalk(repository)) { revWalk.parseHeaders(baseCommit); - try (TreeWalk treeWalk = TreeWalk.forPath(revWalk.getObjectReader(), - currentFilePath, baseCommit.getTree())) { + try (TreeWalk treeWalk = + TreeWalk.forPath(revWalk.getObjectReader(), currentFilePath, baseCommit.getTree())) { if (treeWalk == null) { return Collections.emptyList(); } - DirCacheEditor.DeletePath deletePathEdit = - new DirCacheEditor.DeletePath(currentFilePath); - AddPath addPathEdit = new AddPath(newFilePath, treeWalk.getFileMode(0), - treeWalk.getObjectId(0)); + DirCacheEditor.DeletePath deletePathEdit = new DirCacheEditor.DeletePath(currentFilePath); + AddPath addPathEdit = + new AddPath(newFilePath, treeWalk.getFileMode(0), treeWalk.getObjectId(0)); return Arrays.asList(deletePathEdit, addPathEdit); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/RestoreFileModification.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/RestoreFileModification.java index b5cc9e6236..1bd55f62e7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/RestoreFileModification.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/RestoreFileModification.java @@ -14,19 +14,18 @@ package com.google.gerrit.server.edit.tree; +import java.io.IOException; +import java.util.Collections; +import java.util.List; import org.eclipse.jgit.dircache.DirCacheEditor; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.treewalk.TreeWalk; -import java.io.IOException; -import java.util.Collections; -import java.util.List; - /** - * A {@code TreeModification} which restores a file. The file is added again if - * it was present before the specified commit or deleted if it was absent. + * A {@code TreeModification} which restores a file. The file is added again if it was present + * before the specified commit or deleted if it was absent. */ public class RestoreFileModification implements TreeModification { @@ -37,28 +36,24 @@ public class RestoreFileModification implements TreeModification { } @Override - public List getPathEdits(Repository repository, - RevCommit baseCommit) + public List getPathEdits(Repository repository, RevCommit baseCommit) throws IOException { if (baseCommit.getParentCount() == 0) { - DirCacheEditor.DeletePath deletePath = - new DirCacheEditor.DeletePath(filePath); + DirCacheEditor.DeletePath deletePath = new DirCacheEditor.DeletePath(filePath); return Collections.singletonList(deletePath); } RevCommit base = baseCommit.getParent(0); try (RevWalk revWalk = new RevWalk(repository)) { revWalk.parseHeaders(base); - try (TreeWalk treeWalk = TreeWalk.forPath(revWalk.getObjectReader(), - filePath, base.getTree())) { + try (TreeWalk treeWalk = + TreeWalk.forPath(revWalk.getObjectReader(), filePath, base.getTree())) { if (treeWalk == null) { - DirCacheEditor.DeletePath deletePath = - new DirCacheEditor.DeletePath(filePath); + DirCacheEditor.DeletePath deletePath = new DirCacheEditor.DeletePath(filePath); return Collections.singletonList(deletePath); } - AddPath addPath = new AddPath(filePath, treeWalk.getFileMode(0), - treeWalk.getObjectId(0)); + AddPath addPath = new AddPath(filePath, treeWalk.getFileMode(0), treeWalk.getObjectId(0)); return Collections.singletonList(addPath); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/TreeCreator.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/TreeCreator.java index 39e6ac46d3..7e9a96a542 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/TreeCreator.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/TreeCreator.java @@ -16,6 +16,9 @@ package com.google.gerrit.server.edit.tree; import static com.google.common.base.Preconditions.checkNotNull; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import org.eclipse.jgit.dircache.DirCache; import org.eclipse.jgit.dircache.DirCacheBuilder; import org.eclipse.jgit.dircache.DirCacheEditor; @@ -26,13 +29,9 @@ import org.eclipse.jgit.lib.ObjectReader; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - /** - * A creator for a new Git tree. To create the new tree, the tree of another - * commit is taken as a basis and modified. + * A creator for a new Git tree. To create the new tree, the tree of another commit is taken as a + * basis and modified. */ public class TreeCreator { @@ -46,12 +45,10 @@ public class TreeCreator { } /** - * Apply a modification to the tree which is taken as a basis. If this - * method is called multiple times, the modifications are applied - * subsequently in exactly the order they were provided. + * Apply a modification to the tree which is taken as a basis. If this method is called multiple + * times, the modifications are applied subsequently in exactly the order they were provided. * - * @param treeModification a modification which should be applied to the - * base tree + * @param treeModification a modification which should be applied to the base tree */ public void addTreeModification(TreeModification treeModification) { checkNotNull(treeModification, "treeModification must not be null"); @@ -59,16 +56,15 @@ public class TreeCreator { } /** - * Creates the new tree. When this method is called, the specified base tree - * is read from the repository, the specified modifications are applied, and - * the resulting tree is written to the object store of the repository. + * Creates the new tree. When this method is called, the specified base tree is read from the + * repository, the specified modifications are applied, and the resulting tree is written to the + * object store of the repository. * * @param repository the affected Git repository * @return the {@code ObjectId} of the created tree * @throws IOException if problems arise when accessing the repository */ - public ObjectId createNewTreeAndGetId(Repository repository) - throws IOException { + public ObjectId createNewTreeAndGetId(Repository repository) throws IOException { DirCache newTree = createNewTree(repository); return writeAndGetId(repository, newTree); } @@ -84,15 +80,14 @@ public class TreeCreator { try (ObjectReader objectReader = repository.newObjectReader()) { DirCache dirCache = DirCache.newInCore(); DirCacheBuilder dirCacheBuilder = dirCache.builder(); - dirCacheBuilder.addTree(new byte[0], DirCacheEntry.STAGE_0, objectReader, - baseCommit.getTree()); + dirCacheBuilder.addTree( + new byte[0], DirCacheEntry.STAGE_0, objectReader, baseCommit.getTree()); dirCacheBuilder.finish(); return dirCache; } } - private List getPathEdits(Repository repository) - throws IOException { + private List getPathEdits(Repository repository) throws IOException { List pathEdits = new ArrayList<>(); for (TreeModification treeModification : treeModifications) { pathEdits.addAll(treeModification.getPathEdits(repository, baseCommit)); @@ -100,15 +95,13 @@ public class TreeCreator { return pathEdits; } - private static void applyPathEdits(DirCache tree, - List pathEdits) { + private static void applyPathEdits(DirCache tree, List pathEdits) { DirCacheEditor dirCacheEditor = tree.editor(); pathEdits.forEach(dirCacheEditor::add); dirCacheEditor.finish(); } - private static ObjectId writeAndGetId(Repository repository, DirCache tree) - throws IOException { + private static ObjectId writeAndGetId(Repository repository, DirCache tree) throws IOException { try (ObjectInserter objectInserter = repository.newObjectInserter()) { ObjectId treeId = tree.writeTree(objectInserter); objectInserter.flush(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/TreeModification.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/TreeModification.java index 4b66cd48dc..217a309d4d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/TreeModification.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/TreeModification.java @@ -14,29 +14,25 @@ package com.google.gerrit.server.edit.tree; +import java.io.IOException; +import java.util.List; import org.eclipse.jgit.dircache.DirCacheEditor; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; -import java.io.IOException; -import java.util.List; - -/** - * A specific modification of a Git tree. - */ +/** A specific modification of a Git tree. */ public interface TreeModification { /** - * Returns a list of {@code PathEdit}s which are necessary in order to - * achieve the desired modification of the Git tree. The order of the - * {@code PathEdit}s can be crucial and hence shouldn't be changed. + * Returns a list of {@code PathEdit}s which are necessary in order to achieve the desired + * modification of the Git tree. The order of the {@code PathEdit}s can be crucial and hence + * shouldn't be changed. * * @param repository the affected Git repository * @param baseCommit the commit to whose tree this modification is applied * @return an ordered list of necessary {@code PathEdit}s * @throws IOException if problems arise when accessing the repository */ - List getPathEdits(Repository repository, - RevCommit baseCommit) throws IOException; - + List getPathEdits(Repository repository, RevCommit baseCommit) + throws IOException; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/ChangeRestoredEvent.java b/gerrit-server/src/main/java/com/google/gerrit/server/events/ChangeRestoredEvent.java index 639ca550a9..7c86d70722 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/events/ChangeRestoredEvent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/events/ChangeRestoredEvent.java @@ -23,7 +23,7 @@ public class ChangeRestoredEvent extends PatchSetEvent { public Supplier restorer; public String reason; - public ChangeRestoredEvent (Change change) { + public ChangeRestoredEvent(Change change) { super(TYPE, change); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/CommitReceivedEvent.java b/gerrit-server/src/main/java/com/google/gerrit/server/events/CommitReceivedEvent.java index 085abe33a7..17fc52bba5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/events/CommitReceivedEvent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/events/CommitReceivedEvent.java @@ -16,7 +16,6 @@ package com.google.gerrit.server.events; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.IdentifiedUser; - import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.transport.ReceiveCommand; @@ -32,8 +31,12 @@ public class CommitReceivedEvent extends RefEvent { super(TYPE); } - public CommitReceivedEvent(ReceiveCommand command, Project project, - String refName, RevCommit commit, IdentifiedUser user) { + public CommitReceivedEvent( + ReceiveCommand command, + Project project, + String refName, + RevCommit commit, + IdentifiedUser user) { this(); this.command = command; this.project = project; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/EventDeserializer.java b/gerrit-server/src/main/java/com/google/gerrit/server/events/EventDeserializer.java index 3508acfd94..2a7eada646 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/events/EventDeserializer.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/events/EventDeserializer.java @@ -18,24 +18,24 @@ import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonParseException; - import java.lang.reflect.Type; /** * JSON deserializer for {@link Event}s. - *

- * Deserialized objects are of an appropriate subclass based on the value of the - * top-level "type" element. + * + *

Deserialized objects are of an appropriate subclass based on the value of the top-level "type" + * element. */ public class EventDeserializer implements JsonDeserializer { @Override - public Event deserialize(JsonElement json, Type typeOfT, - JsonDeserializationContext context) throws JsonParseException { + public Event deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) + throws JsonParseException { if (!json.isJsonObject()) { throw new JsonParseException("Not an object"); } JsonElement typeJson = json.getAsJsonObject().get("type"); - if (typeJson == null || !typeJson.isJsonPrimitive() + if (typeJson == null + || !typeJson.isJsonPrimitive() || !typeJson.getAsJsonPrimitive().isString()) { throw new JsonParseException("Type is not a string: " + typeJson); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/EventFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/events/EventFactory.java index 88df57d927..3de12438be 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/events/EventFactory.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/events/EventFactory.java @@ -63,14 +63,6 @@ import com.google.gwtorm.server.SchemaFactory; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.PersonIdent; -import org.eclipse.jgit.revwalk.RevCommit; -import org.eclipse.jgit.revwalk.RevWalk; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.sql.Timestamp; import java.util.ArrayList; @@ -79,6 +71,12 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.PersonIdent; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.revwalk.RevWalk; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Singleton public class EventFactory { @@ -96,7 +94,8 @@ public class EventFactory { private final SchemaFactory schema; @Inject - EventFactory(AccountCache accountCache, + EventFactory( + AccountCache accountCache, @CanonicalWebUrl @Nullable Provider urlProvider, AccountByEmailCache byEmailCache, PatchListCache patchListCache, @@ -119,8 +118,7 @@ public class EventFactory { } /** - * Create a ChangeAttribute for the given change suitable for serialization to - * JSON. + * Create a ChangeAttribute for the given change suitable for serialization to JSON. * * @param change * @return object suitable for serialization to JSON @@ -135,8 +133,7 @@ public class EventFactory { } /** - * Create a ChangeAttribute for the given change suitable for serialization to - * JSON. + * Create a ChangeAttribute for the given change suitable for serialization to JSON. * * @param db Review database * @param change @@ -153,8 +150,7 @@ public class EventFactory { try { a.commitMessage = changeDataFactory.create(db, change).commitMessage(); } catch (Exception e) { - log.error("Error while getting full commit message for" - + " change " + a.number); + log.error("Error while getting full commit message for" + " change " + a.number); } a.url = getChangeUrl(change); a.owner = asAccountAttribute(change.getOwner()); @@ -164,16 +160,16 @@ public class EventFactory { } /** - * Create a RefUpdateAttribute for the given old ObjectId, new ObjectId, and - * branch that is suitable for serialization to JSON. + * Create a RefUpdateAttribute for the given old ObjectId, new ObjectId, and branch that is + * suitable for serialization to JSON. * * @param oldId * @param newId * @param refName * @return object suitable for serialization to JSON */ - public RefUpdateAttribute asRefUpdateAttribute(ObjectId oldId, ObjectId newId, - Branch.NameKey refName) { + public RefUpdateAttribute asRefUpdateAttribute( + ObjectId oldId, ObjectId newId, Branch.NameKey refName) { RefUpdateAttribute ru = new RefUpdateAttribute(); ru.newRev = newId != null ? newId.getName() : ObjectId.zeroId().getName(); ru.oldRev = oldId != null ? oldId.getName() : ObjectId.zeroId().getName(); @@ -202,8 +198,7 @@ public class EventFactory { */ public void addAllReviewers(ReviewDb db, ChangeAttribute a, ChangeNotes notes) throws OrmException { - Collection reviewers = - approvalsUtil.getReviewers(db, notes).all(); + Collection reviewers = approvalsUtil.getReviewers(db, notes).all(); if (!reviewers.isEmpty()) { a.allReviewers = Lists.newArrayListWithCapacity(reviewers.size()); for (Account.Id id : reviewers) { @@ -218,8 +213,7 @@ public class EventFactory { * @param ca * @param submitRecords */ - public void addSubmitRecords(ChangeAttribute ca, - List submitRecords) { + public void addSubmitRecords(ChangeAttribute ca, List submitRecords) { ca.submitRecords = new ArrayList<>(); for (SubmitRecord submitRecord : submitRecords) { @@ -236,8 +230,7 @@ public class EventFactory { } } - private void addSubmitRecordLabels(SubmitRecord submitRecord, - SubmitRecordAttribute sa) { + private void addSubmitRecordLabels(SubmitRecord submitRecord, SubmitRecordAttribute sa) { if (submitRecord.labels != null && !submitRecord.labels.isEmpty()) { sa.labels = new ArrayList<>(); for (SubmitRecord.Label lbl : submitRecord.labels) { @@ -253,8 +246,7 @@ public class EventFactory { } } - public void addDependencies(RevWalk rw, ChangeAttribute ca, Change change, - PatchSet currentPs) { + public void addDependencies(RevWalk rw, ChangeAttribute ca, Change change, PatchSet currentPs) { if (change == null || currentPs == null) { return; } @@ -275,10 +267,9 @@ public class EventFactory { } } - private void addDependsOn(RevWalk rw, ChangeAttribute ca, Change change, - PatchSet currentPs) throws OrmException, IOException { - RevCommit commit = - rw.parseCommit(ObjectId.fromString(currentPs.getRevision().get())); + private void addDependsOn(RevWalk rw, ChangeAttribute ca, Change change, PatchSet currentPs) + throws OrmException, IOException { + RevCommit commit = rw.parseCommit(ObjectId.fromString(currentPs.getRevision().get())); final List parentNames = new ArrayList<>(commit.getParentCount()); for (RevCommit p : commit.getParents()) { parentNames.add(p.name()); @@ -286,8 +277,7 @@ public class EventFactory { // Find changes in this project having a patch set matching any parent of // this patch set's revision. - for (ChangeData cd : queryProvider.get().byProjectCommits( - change.getProject(), parentNames)) { + for (ChangeData cd : queryProvider.get().byProjectCommits(change.getProject(), parentNames)) { for (PatchSet ps : cd.patchSets()) { for (String p : parentNames) { if (!ps.getRevision().get().equals(p)) { @@ -319,11 +309,11 @@ public class EventFactory { String rev = currentPs.getRevision().get(); // Find changes in the same related group as this patch set, having a patch // set whose parent matches this patch set's revision. - for (ChangeData cd : queryProvider.get().byProjectGroups( - change.getProject(), currentPs.getGroups())) { - patchSets: for (PatchSet ps : cd.patchSets()) { - RevCommit commit = - rw.parseCommit(ObjectId.fromString(ps.getRevision().get())); + for (ChangeData cd : + queryProvider.get().byProjectGroups(change.getProject(), currentPs.getGroups())) { + patchSets: + for (PatchSet ps : cd.patchSets()) { + RevCommit commit = rw.parseCommit(ObjectId.fromString(ps.getRevision().get())); for (RevCommit p : commit.getParents()) { if (!p.name().equals(rev)) { continue; @@ -354,8 +344,7 @@ public class EventFactory { return d; } - public void addTrackingIds(ChangeAttribute a, - ListMultimap set) { + public void addTrackingIds(ChangeAttribute a, ListMultimap set) { if (!set.isEmpty()) { a.trackingIds = new ArrayList<>(set.size()); for (Map.Entry> e : set.asMap().entrySet()) { @@ -373,17 +362,25 @@ public class EventFactory { a.commitMessage = commitMessage; } - public void addPatchSets(ReviewDb db, RevWalk revWalk, ChangeAttribute ca, + public void addPatchSets( + ReviewDb db, + RevWalk revWalk, + ChangeAttribute ca, Collection ps, Map> approvals, LabelTypes labelTypes) { addPatchSets(db, revWalk, ca, ps, approvals, false, null, labelTypes); } - public void addPatchSets(ReviewDb db, RevWalk revWalk, ChangeAttribute ca, + public void addPatchSets( + ReviewDb db, + RevWalk revWalk, + ChangeAttribute ca, Collection ps, Map> approvals, - boolean includeFiles, Change change, LabelTypes labelTypes) { + boolean includeFiles, + Change change, + LabelTypes labelTypes) { if (!ps.isEmpty()) { ca.patchSets = new ArrayList<>(ps.size()); for (PatchSet p : ps) { @@ -399,8 +396,8 @@ public class EventFactory { } } - public void addPatchSetComments(PatchSetAttribute patchSetAttribute, - Collection comments) { + public void addPatchSetComments( + PatchSetAttribute patchSetAttribute, Collection comments) { for (Comment comment : comments) { if (comment.key.patchSetId == patchSetAttribute.number) { if (patchSetAttribute.comments == null) { @@ -411,8 +408,8 @@ public class EventFactory { } } - public void addPatchSetFileNames(PatchSetAttribute patchSetAttribute, - Change change, PatchSet patchSet) { + public void addPatchSetFileNames( + PatchSetAttribute patchSetAttribute, Change change, PatchSet patchSet) { try { PatchList patchList = patchListCache.get(change, patchSet); for (PatchListEntry patch : patchList.getPatches()) { @@ -433,8 +430,7 @@ public class EventFactory { } } - public void addComments(ChangeAttribute ca, - Collection messages) { + public void addComments(ChangeAttribute ca, Collection messages) { if (!messages.isEmpty()) { ca.comments = new ArrayList<>(); for (ChangeMessage message : messages) { @@ -444,15 +440,13 @@ public class EventFactory { } /** - * Create a PatchSetAttribute for the given patchset suitable for - * serialization to JSON. + * Create a PatchSetAttribute for the given patchset suitable for serialization to JSON. * * @param revWalk * @param patchSet * @return object suitable for serialization to JSON */ - public PatchSetAttribute asPatchSetAttribute(RevWalk revWalk, - Change change, PatchSet patchSet) { + public PatchSetAttribute asPatchSetAttribute(RevWalk revWalk, Change change, PatchSet patchSet) { try (ReviewDb db = schema.open()) { return asPatchSetAttribute(db, revWalk, change, patchSet); } catch (OrmException e) { @@ -462,15 +456,14 @@ public class EventFactory { } /** - * Create a PatchSetAttribute for the given patchset suitable for - * serialization to JSON. + * Create a PatchSetAttribute for the given patchset suitable for serialization to JSON. * * @param db Review database * @param patchSet * @return object suitable for serialization to JSON */ - public PatchSetAttribute asPatchSetAttribute(ReviewDb db, RevWalk revWalk, - Change change, PatchSet patchSet) { + public PatchSetAttribute asPatchSetAttribute( + ReviewDb db, RevWalk revWalk, Change change, PatchSet patchSet) { PatchSetAttribute p = new PatchSetAttribute(); p.revision = patchSet.getRevision().get(); p.number = patchSet.getPatchSetId(); @@ -496,8 +489,7 @@ public class EventFactory { p.author = asAccountAttribute(author.getAccount()); } - List list = - patchListCache.get(change, patchSet).toPatchList(pId); + List list = patchListCache.get(change, patchSet).toPatchList(pId); for (Patch pe : list) { if (!Patch.isMagic(pe.getFileName())) { p.sizeDeletions -= pe.getDeletions(); @@ -533,7 +525,9 @@ public class EventFactory { return u; } - public void addApprovals(PatchSetAttribute p, PatchSet.Id id, + public void addApprovals( + PatchSetAttribute p, + PatchSet.Id id, Map> all, LabelTypes labelTypes) { Collection list = all.get(id); @@ -542,8 +536,8 @@ public class EventFactory { } } - public void addApprovals(PatchSetAttribute p, - Collection list, LabelTypes labelTypes) { + public void addApprovals( + PatchSetAttribute p, Collection list, LabelTypes labelTypes) { if (!list.isEmpty()) { p.approvals = new ArrayList<>(list.size()); for (PatchSetApproval a : list) { @@ -558,8 +552,7 @@ public class EventFactory { } /** - * Create an AuthorAttribute for the given account suitable for serialization - * to JSON. + * Create an AuthorAttribute for the given account suitable for serialization to JSON. * * @param id * @return object suitable for serialization to JSON @@ -572,8 +565,7 @@ public class EventFactory { } /** - * Create an AuthorAttribute for the given account suitable for serialization - * to JSON. + * Create an AuthorAttribute for the given account suitable for serialization to JSON. * * @param account * @return object suitable for serialization to JSON @@ -591,8 +583,7 @@ public class EventFactory { } /** - * Create an AuthorAttribute for the given person ident suitable for - * serialization to JSON. + * Create an AuthorAttribute for the given person ident suitable for serialization to JSON. * * @param ident * @return object suitable for serialization to JSON @@ -605,15 +596,13 @@ public class EventFactory { } /** - * Create an ApprovalAttribute for the given approval suitable for - * serialization to JSON. + * Create an ApprovalAttribute for the given approval suitable for serialization to JSON. * * @param approval * @param labelTypes label types for the containing project * @return object suitable for serialization to JSON */ - public ApprovalAttribute asApprovalAttribute(PatchSetApproval approval, - LabelTypes labelTypes) { + public ApprovalAttribute asApprovalAttribute(PatchSetApproval approval, LabelTypes labelTypes) { ApprovalAttribute a = new ApprovalAttribute(); a.type = approval.getLabelId().get(); a.value = Short.toString(approval.getValue()); @@ -632,7 +621,8 @@ public class EventFactory { MessageAttribute a = new MessageAttribute(); a.timestamp = message.getWrittenOn().getTime() / 1000L; a.reviewer = - message.getAuthor() != null ? asAccountAttribute(message.getAuthor()) + message.getAuthor() != null + ? asAccountAttribute(message.getAuthor()) : asAccountAttribute(myIdent); a.message = message.getMessage(); return a; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/EventTypes.java b/gerrit-server/src/main/java/com/google/gerrit/server/events/EventTypes.java index cd6e2f98b7..74453f3803 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/events/EventTypes.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/events/EventTypes.java @@ -44,18 +44,17 @@ public class EventTypes { * * @param eventType The event type to register. * @param eventClass The event class to register. - **/ - public static void register(String eventType, - Class eventClass) { + */ + public static void register(String eventType, Class eventClass) { typesByString.put(eventType, eventClass); } - /** Get the class for an event type. + /** + * Get the class for an event type. * * @param type The type. - * @return The event class, or null if no class is registered with the - * given type - **/ + * @return The event class, or null if no class is registered with the given type + */ public static Class getClass(String type) { return typesByString.get(type); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/EventsMetrics.java b/gerrit-server/src/main/java/com/google/gerrit/server/events/EventsMetrics.java index eaaf1a830c..fcf4a08d05 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/events/EventsMetrics.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/events/EventsMetrics.java @@ -28,12 +28,11 @@ public class EventsMetrics implements EventListener { @Inject public EventsMetrics(MetricMaker metricMaker) { - events = metricMaker.newCounter( - "events", - new Description("Triggered events") - .setRate() - .setUnit("triggered events"), - Field.ofString("type")); + events = + metricMaker.newCounter( + "events", + new Description("Triggered events").setRate().setUnit("triggered events"), + Field.ofString("type")); } @Override diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/HashtagsChangedEvent.java b/gerrit-server/src/main/java/com/google/gerrit/server/events/HashtagsChangedEvent.java index 4365c74a77..1de0fc3c19 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/events/HashtagsChangedEvent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/events/HashtagsChangedEvent.java @@ -25,7 +25,7 @@ public class HashtagsChangedEvent extends ChangeEvent { public String[] removed; public String[] hashtags; - public HashtagsChangedEvent (Change change) { + public HashtagsChangedEvent(Change change) { super(TYPE, change); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/ProjectNameKeySerializer.java b/gerrit-server/src/main/java/com/google/gerrit/server/events/ProjectNameKeySerializer.java index e2f51aca95..743b3145d8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/events/ProjectNameKeySerializer.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/events/ProjectNameKeySerializer.java @@ -19,14 +19,12 @@ import com.google.gson.JsonElement; import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; - import java.lang.reflect.Type; -public class ProjectNameKeySerializer - implements JsonSerializer { +public class ProjectNameKeySerializer implements JsonSerializer { @Override - public JsonElement serialize(Project.NameKey project, Type typeOfSrc, - JsonSerializationContext context) { + public JsonElement serialize( + Project.NameKey project, Type typeOfSrc, JsonSerializationContext context) { return new JsonPrimitive(project.get()); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/RefReceivedEvent.java b/gerrit-server/src/main/java/com/google/gerrit/server/events/RefReceivedEvent.java index 6cc1ae577e..aa02d11b9f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/events/RefReceivedEvent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/events/RefReceivedEvent.java @@ -15,7 +15,6 @@ package com.google.gerrit.server.events; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.IdentifiedUser; - import org.eclipse.jgit.transport.ReceiveCommand; public class RefReceivedEvent extends RefEvent { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/StreamEventsApiListener.java b/gerrit-server/src/main/java/com/google/gerrit/server/events/StreamEventsApiListener.java index c867d2695b..15c1ae99c3 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/events/StreamEventsApiListener.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/events/StreamEventsApiListener.java @@ -59,66 +59,51 @@ import com.google.inject.AbstractModule; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevWalk; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; - @Singleton -public class StreamEventsApiListener implements - AssigneeChangedListener, - ChangeAbandonedListener, - ChangeMergedListener, - ChangeRestoredListener, - CommentAddedListener, - DraftPublishedListener, - GitReferenceUpdatedListener, - HashtagsEditedListener, - NewProjectCreatedListener, - ReviewerAddedListener, - ReviewerDeletedListener, - RevisionCreatedListener, - TopicEditedListener { - private static final Logger log = - LoggerFactory.getLogger(StreamEventsApiListener.class); +public class StreamEventsApiListener + implements AssigneeChangedListener, + ChangeAbandonedListener, + ChangeMergedListener, + ChangeRestoredListener, + CommentAddedListener, + DraftPublishedListener, + GitReferenceUpdatedListener, + HashtagsEditedListener, + NewProjectCreatedListener, + ReviewerAddedListener, + ReviewerDeletedListener, + RevisionCreatedListener, + TopicEditedListener { + private static final Logger log = LoggerFactory.getLogger(StreamEventsApiListener.class); public static class Module extends AbstractModule { @Override protected void configure() { - DynamicSet.bind(binder(), AssigneeChangedListener.class) - .to(StreamEventsApiListener.class); - DynamicSet.bind(binder(), ChangeAbandonedListener.class) - .to(StreamEventsApiListener.class); - DynamicSet.bind(binder(), ChangeMergedListener.class) - .to(StreamEventsApiListener.class); - DynamicSet.bind(binder(), ChangeRestoredListener.class) - .to(StreamEventsApiListener.class); - DynamicSet.bind(binder(), CommentAddedListener.class) - .to(StreamEventsApiListener.class); - DynamicSet.bind(binder(), DraftPublishedListener.class) - .to(StreamEventsApiListener.class); + DynamicSet.bind(binder(), AssigneeChangedListener.class).to(StreamEventsApiListener.class); + DynamicSet.bind(binder(), ChangeAbandonedListener.class).to(StreamEventsApiListener.class); + DynamicSet.bind(binder(), ChangeMergedListener.class).to(StreamEventsApiListener.class); + DynamicSet.bind(binder(), ChangeRestoredListener.class).to(StreamEventsApiListener.class); + DynamicSet.bind(binder(), CommentAddedListener.class).to(StreamEventsApiListener.class); + DynamicSet.bind(binder(), DraftPublishedListener.class).to(StreamEventsApiListener.class); DynamicSet.bind(binder(), GitReferenceUpdatedListener.class) - .to(StreamEventsApiListener.class); - DynamicSet.bind(binder(), HashtagsEditedListener.class) - .to(StreamEventsApiListener.class); - DynamicSet.bind(binder(), NewProjectCreatedListener.class) - .to(StreamEventsApiListener.class); - DynamicSet.bind(binder(), ReviewerAddedListener.class) - .to(StreamEventsApiListener.class); - DynamicSet.bind(binder(), ReviewerDeletedListener.class) - .to(StreamEventsApiListener.class); - DynamicSet.bind(binder(), RevisionCreatedListener.class) - .to(StreamEventsApiListener.class); - DynamicSet.bind(binder(), TopicEditedListener.class) - .to(StreamEventsApiListener.class); + .to(StreamEventsApiListener.class); + DynamicSet.bind(binder(), HashtagsEditedListener.class).to(StreamEventsApiListener.class); + DynamicSet.bind(binder(), NewProjectCreatedListener.class).to(StreamEventsApiListener.class); + DynamicSet.bind(binder(), ReviewerAddedListener.class).to(StreamEventsApiListener.class); + DynamicSet.bind(binder(), ReviewerDeletedListener.class).to(StreamEventsApiListener.class); + DynamicSet.bind(binder(), RevisionCreatedListener.class).to(StreamEventsApiListener.class); + DynamicSet.bind(binder(), TopicEditedListener.class).to(StreamEventsApiListener.class); } } @@ -131,7 +116,8 @@ public class StreamEventsApiListener implements private final ChangeNotes.Factory changeNotesFactory; @Inject - StreamEventsApiListener(DynamicItem dispatcher, + StreamEventsApiListener( + DynamicItem dispatcher, Provider db, EventFactory eventFactory, ProjectCache projectCache, @@ -159,13 +145,11 @@ public class StreamEventsApiListener implements return getNotes(info).getChange(); } - private PatchSet getPatchSet(ChangeNotes notes, RevisionInfo info) - throws OrmException { + private PatchSet getPatchSet(ChangeNotes notes, RevisionInfo info) throws OrmException { return psUtil.get(db.get(), notes, PatchSet.Id.fromRef(info.ref)); } - private Supplier changeAttributeSupplier( - final Change change) { + private Supplier changeAttributeSupplier(final Change change) { return Suppliers.memoize( new Supplier() { @Override @@ -175,14 +159,14 @@ public class StreamEventsApiListener implements }); } - private Supplier accountAttributeSupplier( - final AccountInfo account) { + private Supplier accountAttributeSupplier(final AccountInfo account) { return Suppliers.memoize( new Supplier() { @Override public AccountAttribute get() { - return account != null ? eventFactory.asAccountAttribute( - new Account.Id(account._accountId)) : null; + return account != null + ? eventFactory.asAccountAttribute(new Account.Id(account._accountId)) + : null; } }); } @@ -193,11 +177,9 @@ public class StreamEventsApiListener implements new Supplier() { @Override public PatchSetAttribute get() { - try (Repository repo = - repoManager.openRepository(change.getProject()); + try (Repository repo = repoManager.openRepository(change.getProject()); RevWalk revWalk = new RevWalk(repo)) { - return eventFactory.asPatchSetAttribute( - revWalk, change, patchSet); + return eventFactory.asPatchSetAttribute(revWalk, change, patchSet); } catch (IOException e) { throw new RuntimeException(e); } @@ -205,21 +187,18 @@ public class StreamEventsApiListener implements }); } - private static Map convertApprovalsMap( - Map approvals) { + private static Map convertApprovalsMap(Map approvals) { Map result = new HashMap<>(); for (Entry e : approvals.entrySet()) { - Short value = - e.getValue().value == null ? null : e.getValue().value.shortValue(); + Short value = e.getValue().value == null ? null : e.getValue().value.shortValue(); result.put(e.getKey(), value); } return result; } - private ApprovalAttribute getApprovalAttribute(LabelTypes labelTypes, - Entry approval, - Map oldApprovals) { - ApprovalAttribute a = new ApprovalAttribute(); + private ApprovalAttribute getApprovalAttribute( + LabelTypes labelTypes, Entry approval, Map oldApprovals) { + ApprovalAttribute a = new ApprovalAttribute(); a.type = approval.getKey(); if (oldApprovals != null && !oldApprovals.isEmpty()) { @@ -238,21 +217,21 @@ public class StreamEventsApiListener implements } private Supplier approvalsAttributeSupplier( - final Change change, Map newApprovals, + final Change change, + Map newApprovals, final Map oldApprovals) { final Map approvals = convertApprovalsMap(newApprovals); return Suppliers.memoize( new Supplier() { @Override public ApprovalAttribute[] get() { - LabelTypes labelTypes = projectCache.get( - change.getProject()).getLabelTypes(); + LabelTypes labelTypes = projectCache.get(change.getProject()).getLabelTypes(); if (approvals.size() > 0) { ApprovalAttribute[] r = new ApprovalAttribute[approvals.size()]; int i = 0; for (Map.Entry approval : approvals.entrySet()) { - r[i++] = getApprovalAttribute(labelTypes, approval, - convertApprovalsMap(oldApprovals)); + r[i++] = + getApprovalAttribute(labelTypes, approval, convertApprovalsMap(oldApprovals)); } return r; } @@ -263,8 +242,7 @@ public class StreamEventsApiListener implements String[] hashtagArray(Collection hashtags) { if (hashtags != null && hashtags.size() > 0) { - return Sets.newHashSet(hashtags).toArray( - new String[hashtags.size()]); + return Sets.newHashSet(hashtags).toArray(new String[hashtags.size()]); } return null; } @@ -326,18 +304,16 @@ public class StreamEventsApiListener implements Change change = notes.getChange(); ReviewerDeletedEvent event = new ReviewerDeletedEvent(change); event.change = changeAttributeSupplier(change); - event.patchSet = patchSetAttributeSupplier(change, - psUtil.current(db.get(), notes)); + event.patchSet = patchSetAttributeSupplier(change, psUtil.current(db.get(), notes)); event.reviewer = accountAttributeSupplier(ev.getReviewer()); event.comment = ev.getComment(); - event.approvals = approvalsAttributeSupplier(change, - ev.getNewApprovals(), ev.getOldApprovals()); + event.approvals = + approvalsAttributeSupplier(change, ev.getNewApprovals(), ev.getOldApprovals()); dispatcher.get().postEvent(change, event); } catch (OrmException e) { log.error("Failed to dispatch event", e); } - } @Override @@ -348,8 +324,7 @@ public class StreamEventsApiListener implements ReviewerAddedEvent event = new ReviewerAddedEvent(change); event.change = changeAttributeSupplier(change); - event.patchSet = patchSetAttributeSupplier(change, - psUtil.current(db.get(), notes)); + event.patchSet = patchSetAttributeSupplier(change, psUtil.current(db.get(), notes)); for (AccountInfo reviewer : ev.getReviewers()) { event.reviewer = accountAttributeSupplier(reviewer); dispatcher.get().postEvent(change, event); @@ -392,18 +367,18 @@ public class StreamEventsApiListener implements if (ev.getUpdater() != null) { event.submitter = accountAttributeSupplier(ev.getUpdater()); } - final Branch.NameKey refName = - new Branch.NameKey(ev.getProjectName(), ev.getRefName()); - event.refUpdate = Suppliers.memoize( - new Supplier() { - @Override - public RefUpdateAttribute get() { - return eventFactory.asRefUpdateAttribute( - ObjectId.fromString(ev.getOldObjectId()), - ObjectId.fromString(ev.getNewObjectId()), - refName); - } - }); + final Branch.NameKey refName = new Branch.NameKey(ev.getProjectName(), ev.getRefName()); + event.refUpdate = + Suppliers.memoize( + new Supplier() { + @Override + public RefUpdateAttribute get() { + return eventFactory.asRefUpdateAttribute( + ObjectId.fromString(ev.getOldObjectId()), + ObjectId.fromString(ev.getNewObjectId()), + refName); + } + }); dispatcher.get().postEvent(refName, event); } @@ -434,11 +409,10 @@ public class StreamEventsApiListener implements CommentAddedEvent event = new CommentAddedEvent(change); event.change = changeAttributeSupplier(change); - event.author = accountAttributeSupplier(ev.getWho()); + event.author = accountAttributeSupplier(ev.getWho()); event.patchSet = patchSetAttributeSupplier(change, ps); event.comment = ev.getComment(); - event.approvals = approvalsAttributeSupplier( - change, ev.getApprovals(), ev.getOldApprovals()); + event.approvals = approvalsAttributeSupplier(change, ev.getApprovals(), ev.getOldApprovals()); dispatcher.get().postEvent(change, event); } catch (OrmException e) { @@ -455,8 +429,7 @@ public class StreamEventsApiListener implements event.change = changeAttributeSupplier(change); event.restorer = accountAttributeSupplier(ev.getWho()); - event.patchSet = patchSetAttributeSupplier(change, - psUtil.current(db.get(), notes)); + event.patchSet = patchSetAttributeSupplier(change, psUtil.current(db.get(), notes)); event.reason = ev.getReason(); dispatcher.get().postEvent(change, event); @@ -474,8 +447,7 @@ public class StreamEventsApiListener implements event.change = changeAttributeSupplier(change); event.submitter = accountAttributeSupplier(ev.getWho()); - event.patchSet = patchSetAttributeSupplier(change, - psUtil.current(db.get(), notes)); + event.patchSet = patchSetAttributeSupplier(change, psUtil.current(db.get(), notes)); event.newRev = ev.getNewRevisionId(); dispatcher.get().postEvent(change, event); @@ -493,8 +465,7 @@ public class StreamEventsApiListener implements event.change = changeAttributeSupplier(change); event.abandoner = accountAttributeSupplier(ev.getWho()); - event.patchSet = patchSetAttributeSupplier(change, - psUtil.current(db.get(), notes)); + event.patchSet = patchSetAttributeSupplier(change, psUtil.current(db.get(), notes)); event.reason = ev.getReason(); dispatcher.get().postEvent(change, event); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/SupplierDeserializer.java b/gerrit-server/src/main/java/com/google/gerrit/server/events/SupplierDeserializer.java index fd7b350467..a6e27b8eb1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/events/SupplierDeserializer.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/events/SupplierDeserializer.java @@ -21,20 +21,18 @@ import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonParseException; - import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; public class SupplierDeserializer implements JsonDeserializer> { @Override - public Supplier deserialize(JsonElement json, Type typeOfT, - JsonDeserializationContext context) throws JsonParseException { + public Supplier deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) + throws JsonParseException { checkArgument(typeOfT instanceof ParameterizedType); ParameterizedType parameterizedType = (ParameterizedType) typeOfT; if (parameterizedType.getActualTypeArguments().length != 1) { - throw new JsonParseException( - "Expected one parameter type in Supplier interface."); + throw new JsonParseException("Expected one parameter type in Supplier interface."); } Type supplierOf = parameterizedType.getActualTypeArguments()[0]; return Suppliers.ofInstance(context.deserialize(json, supplierOf)); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/SupplierSerializer.java b/gerrit-server/src/main/java/com/google/gerrit/server/events/SupplierSerializer.java index 76138b0001..5f66c49220 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/events/SupplierSerializer.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/events/SupplierSerializer.java @@ -18,14 +18,12 @@ import com.google.common.base.Supplier; import com.google.gson.JsonElement; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; - import java.lang.reflect.Type; public class SupplierSerializer implements JsonSerializer> { @Override - public JsonElement serialize(Supplier src, Type typeOfSrc, - JsonSerializationContext context) { + public JsonElement serialize(Supplier src, Type typeOfSrc, JsonSerializationContext context) { return context.serialize(src.get()); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AbstractChangeEvent.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AbstractChangeEvent.java index be6f6926cb..a5800fb220 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AbstractChangeEvent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AbstractChangeEvent.java @@ -18,7 +18,6 @@ import com.google.gerrit.extensions.api.changes.NotifyHandling; import com.google.gerrit.extensions.common.AccountInfo; import com.google.gerrit.extensions.common.ChangeInfo; import com.google.gerrit.extensions.events.ChangeEvent; - import java.sql.Timestamp; public abstract class AbstractChangeEvent implements ChangeEvent { @@ -27,8 +26,8 @@ public abstract class AbstractChangeEvent implements ChangeEvent { private final Timestamp when; private final NotifyHandling notify; - protected AbstractChangeEvent(ChangeInfo change, AccountInfo who, - Timestamp when, NotifyHandling notify) { + protected AbstractChangeEvent( + ChangeInfo change, AccountInfo who, Timestamp when, NotifyHandling notify) { this.changeInfo = change; this.who = who; this.when = when; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AbstractRevisionEvent.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AbstractRevisionEvent.java index d3d7e09daa..6b72b5e582 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AbstractRevisionEvent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AbstractRevisionEvent.java @@ -19,16 +19,18 @@ import com.google.gerrit.extensions.common.AccountInfo; import com.google.gerrit.extensions.common.ChangeInfo; import com.google.gerrit.extensions.common.RevisionInfo; import com.google.gerrit.extensions.events.RevisionEvent; - import java.sql.Timestamp; -public abstract class AbstractRevisionEvent extends AbstractChangeEvent - implements RevisionEvent { +public abstract class AbstractRevisionEvent extends AbstractChangeEvent implements RevisionEvent { private final RevisionInfo revisionInfo; - protected AbstractRevisionEvent(ChangeInfo change, RevisionInfo revision, - AccountInfo who, Timestamp when, NotifyHandling notify) { + protected AbstractRevisionEvent( + ChangeInfo change, + RevisionInfo revision, + AccountInfo who, + Timestamp when, + NotifyHandling notify) { super(change, who, when, notify); revisionInfo = revision; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AgreementSignup.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AgreementSignup.java index c910a7ac6b..669690af28 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AgreementSignup.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AgreementSignup.java @@ -25,8 +25,7 @@ public class AgreementSignup { private final EventUtil util; @Inject - AgreementSignup(DynamicSet listeners, - EventUtil util) { + AgreementSignup(DynamicSet listeners, EventUtil util) { this.listeners = listeners; this.util = util; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AssigneeChanged.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AssigneeChanged.java index 53d837f53c..2583744a30 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AssigneeChanged.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AssigneeChanged.java @@ -23,37 +23,33 @@ import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.Change; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - +import java.sql.Timestamp; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.sql.Timestamp; - public class AssigneeChanged { - private static final Logger log = - LoggerFactory.getLogger(AssigneeChanged.class); + private static final Logger log = LoggerFactory.getLogger(AssigneeChanged.class); private final DynamicSet listeners; private final EventUtil util; @Inject - AssigneeChanged(DynamicSet listeners, - EventUtil util) { + AssigneeChanged(DynamicSet listeners, EventUtil util) { this.listeners = listeners; this.util = util; } - public void fire(Change change, Account account, Account oldAssignee, - Timestamp when) { + public void fire(Change change, Account account, Account oldAssignee, Timestamp when) { if (!listeners.iterator().hasNext()) { return; } try { - Event event = new Event( - util.changeInfo(change), - util.accountInfo(account), - util.accountInfo(oldAssignee), - when); + Event event = + new Event( + util.changeInfo(change), + util.accountInfo(account), + util.accountInfo(oldAssignee), + when); for (AssigneeChangedListener l : listeners) { try { l.onAssigneeChanged(event); @@ -66,12 +62,10 @@ public class AssigneeChanged { } } - private static class Event extends AbstractChangeEvent - implements AssigneeChangedListener.Event { + private static class Event extends AbstractChangeEvent implements AssigneeChangedListener.Event { private final AccountInfo oldAssignee; - Event(ChangeInfo change, AccountInfo editor, AccountInfo oldAssignee, - Timestamp when) { + Event(ChangeInfo change, AccountInfo editor, AccountInfo oldAssignee, Timestamp when) { super(change, editor, when, NotifyHandling.ALL); this.oldAssignee = oldAssignee; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeAbandoned.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeAbandoned.java index 5a7aec24eb..f9fc60a1da 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeAbandoned.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeAbandoned.java @@ -27,38 +27,42 @@ import com.google.gerrit.server.GpgException; import com.google.gerrit.server.patch.PatchListNotAvailableException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - +import java.io.IOException; +import java.sql.Timestamp; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.sql.Timestamp; - public class ChangeAbandoned { - private static final Logger log = - LoggerFactory.getLogger(ChangeAbandoned.class); + private static final Logger log = LoggerFactory.getLogger(ChangeAbandoned.class); private final DynamicSet listeners; private final EventUtil util; @Inject - ChangeAbandoned(DynamicSet listeners, - EventUtil util) { + ChangeAbandoned(DynamicSet listeners, EventUtil util) { this.listeners = listeners; this.util = util; } - public void fire(Change change, PatchSet ps, Account abandoner, String reason, - Timestamp when, NotifyHandling notifyHandling) { + public void fire( + Change change, + PatchSet ps, + Account abandoner, + String reason, + Timestamp when, + NotifyHandling notifyHandling) { if (!listeners.iterator().hasNext()) { return; } try { - Event event = new Event( - util.changeInfo(change), - util.revisionInfo(change.getProject(), ps), - util.accountInfo(abandoner), - reason, when, notifyHandling); + Event event = + new Event( + util.changeInfo(change), + util.revisionInfo(change.getProject(), ps), + util.accountInfo(abandoner), + reason, + when, + notifyHandling); for (ChangeAbandonedListener l : listeners) { try { l.onChangeAbandoned(event); @@ -66,8 +70,7 @@ public class ChangeAbandoned { util.logEventListenerError(this, l, e); } } - } catch (PatchListNotAvailableException | GpgException | IOException - | OrmException e) { + } catch (PatchListNotAvailableException | GpgException | IOException | OrmException e) { log.error("Couldn't fire event", e); } } @@ -76,8 +79,13 @@ public class ChangeAbandoned { implements ChangeAbandonedListener.Event { private final String reason; - Event(ChangeInfo change, RevisionInfo revision, AccountInfo abandoner, - String reason, Timestamp when, NotifyHandling notifyHandling) { + Event( + ChangeInfo change, + RevisionInfo revision, + AccountInfo abandoner, + String reason, + Timestamp when, + NotifyHandling notifyHandling) { super(change, revision, abandoner, when, notifyHandling); this.reason = reason; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeMerged.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeMerged.java index 8b4a6a0031..feaa54a12c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeMerged.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeMerged.java @@ -27,38 +27,36 @@ import com.google.gerrit.server.GpgException; import com.google.gerrit.server.patch.PatchListNotAvailableException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - +import java.io.IOException; +import java.sql.Timestamp; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.sql.Timestamp; - public class ChangeMerged { - private static final Logger log = - LoggerFactory.getLogger(ChangeMerged.class); + private static final Logger log = LoggerFactory.getLogger(ChangeMerged.class); private final DynamicSet listeners; private final EventUtil util; @Inject - ChangeMerged(DynamicSet listeners, - EventUtil util) { + ChangeMerged(DynamicSet listeners, EventUtil util) { this.listeners = listeners; this.util = util; } - public void fire(Change change, PatchSet ps, Account merger, - String newRevisionId, Timestamp when) { + public void fire( + Change change, PatchSet ps, Account merger, String newRevisionId, Timestamp when) { if (!listeners.iterator().hasNext()) { return; } try { - Event event = new Event( - util.changeInfo(change), - util.revisionInfo(change.getProject(), ps), - util.accountInfo(merger), - newRevisionId, when); + Event event = + new Event( + util.changeInfo(change), + util.revisionInfo(change.getProject(), ps), + util.accountInfo(merger), + newRevisionId, + when); for (ChangeMergedListener l : listeners) { try { l.onChangeMerged(event); @@ -66,18 +64,20 @@ public class ChangeMerged { util.logEventListenerError(this, l, e); } } - } catch (PatchListNotAvailableException | GpgException | IOException - | OrmException e) { + } catch (PatchListNotAvailableException | GpgException | IOException | OrmException e) { log.error("Couldn't fire event", e); } } - private static class Event extends AbstractRevisionEvent - implements ChangeMergedListener.Event { + private static class Event extends AbstractRevisionEvent implements ChangeMergedListener.Event { private final String newRevisionId; - Event(ChangeInfo change, RevisionInfo revision, AccountInfo merger, - String newRevisionId, Timestamp when) { + Event( + ChangeInfo change, + RevisionInfo revision, + AccountInfo merger, + String newRevisionId, + Timestamp when) { super(change, revision, merger, when, NotifyHandling.ALL); this.newRevisionId = newRevisionId; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeRestored.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeRestored.java index 1d2682a5b3..03a6f1f03b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeRestored.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeRestored.java @@ -27,38 +27,35 @@ import com.google.gerrit.server.GpgException; import com.google.gerrit.server.patch.PatchListNotAvailableException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - +import java.io.IOException; +import java.sql.Timestamp; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.sql.Timestamp; - public class ChangeRestored { - private static final Logger log = - LoggerFactory.getLogger(ChangeRestored.class); + private static final Logger log = LoggerFactory.getLogger(ChangeRestored.class); private final DynamicSet listeners; private final EventUtil util; @Inject - ChangeRestored(DynamicSet listeners, - EventUtil util) { + ChangeRestored(DynamicSet listeners, EventUtil util) { this.listeners = listeners; this.util = util; } - public void fire(Change change, PatchSet ps, Account restorer, String reason, - Timestamp when) { + public void fire(Change change, PatchSet ps, Account restorer, String reason, Timestamp when) { if (!listeners.iterator().hasNext()) { return; } try { - Event event = new Event( - util.changeInfo(change), - util.revisionInfo(change.getProject(), ps), - util.accountInfo(restorer), - reason, when); + Event event = + new Event( + util.changeInfo(change), + util.revisionInfo(change.getProject(), ps), + util.accountInfo(restorer), + reason, + when); for (ChangeRestoredListener l : listeners) { try { l.onChangeRestored(event); @@ -66,19 +63,21 @@ public class ChangeRestored { util.logEventListenerError(this, l, e); } } - } catch (PatchListNotAvailableException | GpgException | IOException - | OrmException e) { + } catch (PatchListNotAvailableException | GpgException | IOException | OrmException e) { log.error("Couldn't fire event", e); } } - private static class Event extends AbstractRevisionEvent - implements ChangeRestoredListener.Event { + private static class Event extends AbstractRevisionEvent implements ChangeRestoredListener.Event { private String reason; - Event(ChangeInfo change, RevisionInfo revision, AccountInfo restorer, - String reason, Timestamp when) { + Event( + ChangeInfo change, + RevisionInfo revision, + AccountInfo restorer, + String reason, + Timestamp when) { super(change, revision, restorer, when, NotifyHandling.ALL); this.reason = reason; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeReverted.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeReverted.java index d963a47598..e57cbdd0cf 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeReverted.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeReverted.java @@ -21,22 +21,18 @@ import com.google.gerrit.extensions.registration.DynamicSet; import com.google.gerrit.reviewdb.client.Change; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - +import java.sql.Timestamp; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.sql.Timestamp; - public class ChangeReverted { - private static final Logger log = - LoggerFactory.getLogger(ChangeReverted.class); + private static final Logger log = LoggerFactory.getLogger(ChangeReverted.class); private final DynamicSet listeners; private final EventUtil util; @Inject - ChangeReverted(DynamicSet listeners, - EventUtil util) { + ChangeReverted(DynamicSet listeners, EventUtil util) { this.listeners = listeners; this.util = util; } @@ -46,8 +42,7 @@ public class ChangeReverted { return; } try { - Event event = new Event( - util.changeInfo(change), util.changeInfo(revertChange), when); + Event event = new Event(util.changeInfo(change), util.changeInfo(revertChange), when); for (ChangeRevertedListener l : listeners) { try { l.onChangeReverted(event); @@ -60,8 +55,7 @@ public class ChangeReverted { } } - private static class Event extends AbstractChangeEvent - implements ChangeRevertedListener.Event { + private static class Event extends AbstractChangeEvent implements ChangeRevertedListener.Event { private final ChangeInfo revertChange; Event(ChangeInfo change, ChangeInfo revertChange, Timestamp when) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/CommentAdded.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/CommentAdded.java index f1bb50a78e..e76a032a74 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/CommentAdded.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/CommentAdded.java @@ -28,42 +28,45 @@ import com.google.gerrit.server.GpgException; import com.google.gerrit.server.patch.PatchListNotAvailableException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.sql.Timestamp; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class CommentAdded { - private static final Logger log = - LoggerFactory.getLogger(CommentAdded.class); + private static final Logger log = LoggerFactory.getLogger(CommentAdded.class); private final DynamicSet listeners; private final EventUtil util; @Inject - CommentAdded(DynamicSet listeners, - EventUtil util) { + CommentAdded(DynamicSet listeners, EventUtil util) { this.listeners = listeners; this.util = util; } - public void fire(Change change, PatchSet ps, Account author, - String comment, Map approvals, - Map oldApprovals, Timestamp when) { + public void fire( + Change change, + PatchSet ps, + Account author, + String comment, + Map approvals, + Map oldApprovals, + Timestamp when) { if (!listeners.iterator().hasNext()) { return; } try { - Event event = new Event(util.changeInfo(change), - util.revisionInfo(change.getProject(), ps), - util.accountInfo(author), - comment, - util.approvals(author, approvals, when), - util.approvals(author, oldApprovals, when), - when); + Event event = + new Event( + util.changeInfo(change), + util.revisionInfo(change.getProject(), ps), + util.accountInfo(author), + comment, + util.approvals(author, approvals, when), + util.approvals(author, oldApprovals, when), + when); for (CommentAddedListener l : listeners) { try { l.onCommentAdded(event); @@ -71,22 +74,25 @@ public class CommentAdded { util.logEventListenerError(this, l, e); } } - } catch (PatchListNotAvailableException | GpgException | IOException - | OrmException e) { + } catch (PatchListNotAvailableException | GpgException | IOException | OrmException e) { log.error("Couldn't fire event", e); } } - private static class Event extends AbstractRevisionEvent - implements CommentAddedListener.Event { + private static class Event extends AbstractRevisionEvent implements CommentAddedListener.Event { private final String comment; private final Map approvals; private final Map oldApprovals; - Event(ChangeInfo change, RevisionInfo revision, AccountInfo author, - String comment, Map approvals, - Map oldApprovals, Timestamp when) { + Event( + ChangeInfo change, + RevisionInfo revision, + AccountInfo author, + String comment, + Map approvals, + Map oldApprovals, + Timestamp when) { super(change, revision, author, when, NotifyHandling.ALL); this.comment = comment; this.approvals = approvals; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/DraftPublished.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/DraftPublished.java index 4f6d29859a..b5db0daf4e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/DraftPublished.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/DraftPublished.java @@ -27,35 +27,31 @@ import com.google.gerrit.server.GpgException; import com.google.gerrit.server.patch.PatchListNotAvailableException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - +import java.io.IOException; +import java.sql.Timestamp; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.sql.Timestamp; - public class DraftPublished { - private static final Logger log = - LoggerFactory.getLogger(DraftPublished.class); + private static final Logger log = LoggerFactory.getLogger(DraftPublished.class); private final DynamicSet listeners; private final EventUtil util; @Inject - public DraftPublished(DynamicSet listeners, - EventUtil util) { + public DraftPublished(DynamicSet listeners, EventUtil util) { this.listeners = listeners; this.util = util; } - public void fire(Change change, PatchSet patchSet, Account accountId, - Timestamp when) { + public void fire(Change change, PatchSet patchSet, Account accountId, Timestamp when) { try { - Event event = new Event( - util.changeInfo(change), - util.revisionInfo(change.getProject(), patchSet), - util.accountInfo(accountId), - when); + Event event = + new Event( + util.changeInfo(change), + util.revisionInfo(change.getProject(), patchSet), + util.accountInfo(accountId), + when); for (DraftPublishedListener l : listeners) { try { l.onDraftPublished(event); @@ -63,17 +59,14 @@ public class DraftPublished { util.logEventListenerError(this, l, e); } } - } catch (PatchListNotAvailableException | GpgException | IOException - | OrmException e) { + } catch (PatchListNotAvailableException | GpgException | IOException | OrmException e) { log.error("Couldn't fire event", e); } } - private static class Event extends AbstractRevisionEvent - implements DraftPublishedListener.Event { + private static class Event extends AbstractRevisionEvent implements DraftPublishedListener.Event { - Event(ChangeInfo change, RevisionInfo revision, AccountInfo publisher, - Timestamp when) { + Event(ChangeInfo change, RevisionInfo revision, AccountInfo publisher, Timestamp when) { super(change, revision, publisher, when, NotifyHandling.ALL); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/EventUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/EventUtil.java index a2678022f0..887ce57866 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/EventUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/EventUtil.java @@ -32,15 +32,13 @@ import com.google.gerrit.server.query.change.ChangeData; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.sql.Timestamp; import java.util.EnumSet; import java.util.HashMap; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class EventUtil { private static final Logger log = LoggerFactory.getLogger(EventUtil.class); @@ -50,7 +48,8 @@ public class EventUtil { private final ChangeJson changeJson; @Inject - EventUtil(ChangeJson.Factory changeJsonFactory, + EventUtil( + ChangeJson.Factory changeJsonFactory, ChangeData.Factory changeDataFactory, Provider db) { this.changeDataFactory = changeDataFactory; @@ -65,16 +64,13 @@ public class EventUtil { } public RevisionInfo revisionInfo(Project project, PatchSet ps) - throws OrmException, PatchListNotAvailableException, GpgException, - IOException { + throws OrmException, PatchListNotAvailableException, GpgException, IOException { return revisionInfo(project.getNameKey(), ps); } public RevisionInfo revisionInfo(Project.NameKey project, PatchSet ps) - throws OrmException, PatchListNotAvailableException, GpgException, - IOException { - ChangeData cd = changeDataFactory.create(db.get(), - project, ps.getId().getParentKey()); + throws OrmException, PatchListNotAvailableException, GpgException, IOException { + ChangeData cd = changeDataFactory.create(db.get(), project, ps.getId().getParentKey()); ChangeControl ctl = cd.changeControl(); return changeJson.getRevisionInfo(ctl, ps); } @@ -90,25 +86,22 @@ public class EventUtil { return accountInfo; } - public Map approvals(Account a, - Map approvals, Timestamp ts) { + public Map approvals( + Account a, Map approvals, Timestamp ts) { Map result = new HashMap<>(); for (Map.Entry e : approvals.entrySet()) { Integer value = e.getValue() != null ? Integer.valueOf(e.getValue()) : null; - result.put(e.getKey(), - ChangeJson.getApprovalInfo(a.getId(), value, null, null, ts)); + result.put(e.getKey(), ChangeJson.getApprovalInfo(a.getId(), value, null, null, ts)); } return result; } - public void logEventListenerError(Object event, Object listener, - Exception error) { + public void logEventListenerError(Object event, Object listener, Exception error) { if (log.isDebugEnabled()) { log.debug( String.format( "Error in event listener %s for event %s", - listener.getClass().getName(), - event.getClass().getName()), + listener.getClass().getName(), event.getClass().getName()), error); } else { log.warn( @@ -121,15 +114,9 @@ public class EventUtil { public static void logEventListenerError(Object listener, Exception error) { if (log.isDebugEnabled()) { - log.debug( - String.format( - "Error in event listener %s", listener.getClass().getName()), - error); + log.debug(String.format("Error in event listener %s", listener.getClass().getName()), error); } else { - log.warn( - "Error in listener {}: {}", - listener.getClass().getName(), - error.getMessage()); + log.warn("Error in listener {}: {}", listener.getClass().getName(), error.getMessage()); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/GitReferenceUpdated.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/GitReferenceUpdated.java index 381dced45c..2b65965c0b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/GitReferenceUpdated.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/GitReferenceUpdated.java @@ -21,41 +21,44 @@ import com.google.gerrit.extensions.registration.DynamicSet; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.Project; import com.google.inject.Inject; - import org.eclipse.jgit.lib.BatchRefUpdate; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.RefUpdate; import org.eclipse.jgit.transport.ReceiveCommand; public class GitReferenceUpdated { - public static final GitReferenceUpdated DISABLED = new GitReferenceUpdated() { - @Override - public void fire(Project.NameKey project, RefUpdate refUpdate, - ReceiveCommand.Type type, Account updater) {} + public static final GitReferenceUpdated DISABLED = + new GitReferenceUpdated() { + @Override + public void fire( + Project.NameKey project, + RefUpdate refUpdate, + ReceiveCommand.Type type, + Account updater) {} - @Override - public void fire(Project.NameKey project, RefUpdate refUpdate, - Account updater) {} + @Override + public void fire(Project.NameKey project, RefUpdate refUpdate, Account updater) {} - @Override - public void fire(Project.NameKey project, String ref, ObjectId oldObjectId, - ObjectId newObjectId, Account updater) {} + @Override + public void fire( + Project.NameKey project, + String ref, + ObjectId oldObjectId, + ObjectId newObjectId, + Account updater) {} - @Override - public void fire(Project.NameKey project, ReceiveCommand cmd, - Account updater) {} + @Override + public void fire(Project.NameKey project, ReceiveCommand cmd, Account updater) {} - @Override - public void fire(Project.NameKey project, BatchRefUpdate batchRefUpdate, - Account updater) {} - }; + @Override + public void fire(Project.NameKey project, BatchRefUpdate batchRefUpdate, Account updater) {} + }; private final DynamicSet listeners; private final EventUtil util; @Inject - GitReferenceUpdated(DynamicSet listeners, - EventUtil util) { + GitReferenceUpdated(DynamicSet listeners, EventUtil util) { this.listeners = listeners; this.util = util; } @@ -65,38 +68,60 @@ public class GitReferenceUpdated { this.util = null; } - public void fire(Project.NameKey project, RefUpdate refUpdate, - ReceiveCommand.Type type, Account updater) { - fire(project, refUpdate.getName(), refUpdate.getOldObjectId(), - refUpdate.getNewObjectId(), type, util.accountInfo(updater)); - } - - public void fire(Project.NameKey project, RefUpdate refUpdate, - Account updater) { - fire(project, refUpdate.getName(), refUpdate.getOldObjectId(), - refUpdate.getNewObjectId(), ReceiveCommand.Type.UPDATE, + public void fire( + Project.NameKey project, RefUpdate refUpdate, ReceiveCommand.Type type, Account updater) { + fire( + project, + refUpdate.getName(), + refUpdate.getOldObjectId(), + refUpdate.getNewObjectId(), + type, util.accountInfo(updater)); } - public void fire(Project.NameKey project, String ref, ObjectId oldObjectId, - ObjectId newObjectId, Account updater) { - fire(project, ref, oldObjectId, newObjectId, ReceiveCommand.Type.UPDATE, + public void fire(Project.NameKey project, RefUpdate refUpdate, Account updater) { + fire( + project, + refUpdate.getName(), + refUpdate.getOldObjectId(), + refUpdate.getNewObjectId(), + ReceiveCommand.Type.UPDATE, + util.accountInfo(updater)); + } + + public void fire( + Project.NameKey project, + String ref, + ObjectId oldObjectId, + ObjectId newObjectId, + Account updater) { + fire( + project, + ref, + oldObjectId, + newObjectId, + ReceiveCommand.Type.UPDATE, util.accountInfo(updater)); } public void fire(Project.NameKey project, ReceiveCommand cmd, Account updater) { - fire(project, cmd.getRefName(), cmd.getOldId(), cmd.getNewId(), cmd.getType(), + fire( + project, + cmd.getRefName(), + cmd.getOldId(), + cmd.getNewId(), + cmd.getType(), util.accountInfo(updater)); } - public void fire(Project.NameKey project, BatchRefUpdate batchRefUpdate, - Account updater) { + public void fire(Project.NameKey project, BatchRefUpdate batchRefUpdate, Account updater) { if (!listeners.iterator().hasNext()) { return; } for (ReceiveCommand cmd : batchRefUpdate.getCommands()) { if (cmd.getResult() == ReceiveCommand.Result.OK) { - fire(project, + fire( + project, cmd.getRefName(), cmd.getOldId(), cmd.getNewId(), @@ -106,8 +131,13 @@ public class GitReferenceUpdated { } } - private void fire(Project.NameKey project, String ref, ObjectId oldObjectId, - ObjectId newObjectId, ReceiveCommand.Type type, AccountInfo updater) { + private void fire( + Project.NameKey project, + String ref, + ObjectId oldObjectId, + ObjectId newObjectId, + ReceiveCommand.Type type, + AccountInfo updater) { if (!listeners.iterator().hasNext()) { return; } @@ -131,8 +161,11 @@ public class GitReferenceUpdated { private final ReceiveCommand.Type type; private final AccountInfo updater; - Event(Project.NameKey project, String ref, - String oldObjectId, String newObjectId, + Event( + Project.NameKey project, + String ref, + String oldObjectId, + String newObjectId, ReceiveCommand.Type type, AccountInfo updater) { this.projectName = project.get(); @@ -185,8 +218,9 @@ public class GitReferenceUpdated { @Override public String toString() { - return String.format("%s[%s,%s: %s -> %s]", getClass().getSimpleName(), - projectName, ref, oldObjectId, newObjectId); + return String.format( + "%s[%s,%s: %s -> %s]", + getClass().getSimpleName(), projectName, ref, oldObjectId, newObjectId); } @Override diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/HashtagsEdited.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/HashtagsEdited.java index 233a89e44c..b086beba75 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/HashtagsEdited.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/HashtagsEdited.java @@ -24,40 +24,38 @@ import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.Change; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.sql.Timestamp; import java.util.Collection; import java.util.Set; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class HashtagsEdited { - private static final Logger log = - LoggerFactory.getLogger(HashtagsEdited.class); + private static final Logger log = LoggerFactory.getLogger(HashtagsEdited.class); private final DynamicSet listeners; private final EventUtil util; @Inject - public HashtagsEdited(DynamicSet listeners, - EventUtil util) { + public HashtagsEdited(DynamicSet listeners, EventUtil util) { this.listeners = listeners; this.util = util; } - public void fire(Change change, Account editor, - ImmutableSortedSet hashtags, Set added, - Set removed, Timestamp when) { + public void fire( + Change change, + Account editor, + ImmutableSortedSet hashtags, + Set added, + Set removed, + Timestamp when) { if (!listeners.iterator().hasNext()) { return; } try { - Event event = new Event( - util.changeInfo(change), - util.accountInfo(editor), - hashtags, added, removed, - when); + Event event = + new Event( + util.changeInfo(change), util.accountInfo(editor), hashtags, added, removed, when); for (HashtagsEditedListener l : listeners) { try { l.onHashtagsEdited(event); @@ -70,15 +68,19 @@ public class HashtagsEdited { } } - private static class Event extends AbstractChangeEvent - implements HashtagsEditedListener.Event { + private static class Event extends AbstractChangeEvent implements HashtagsEditedListener.Event { private Collection updatedHashtags; private Collection addedHashtags; private Collection removedHashtags; - Event(ChangeInfo change, AccountInfo editor, Collection updated, - Collection added, Collection removed, Timestamp when) { + Event( + ChangeInfo change, + AccountInfo editor, + Collection updated, + Collection added, + Collection removed, + Timestamp when) { super(change, editor, when, NotifyHandling.ALL); this.updatedHashtags = updated; this.addedHashtags = added; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/PluginEvent.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/PluginEvent.java index fbca02e7e4..bd643e2020 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/PluginEvent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/PluginEvent.java @@ -36,8 +36,7 @@ public class PluginEvent { } } - private static class Event extends AbstractNoNotifyEvent - implements PluginEventListener.Event { + private static class Event extends AbstractNoNotifyEvent implements PluginEventListener.Event { private final String pluginName; private final String type; private final String data; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ReviewerAdded.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ReviewerAdded.java index 8860a424f6..e4f85720c8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ReviewerAdded.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ReviewerAdded.java @@ -28,41 +28,38 @@ import com.google.gerrit.server.GpgException; import com.google.gerrit.server.patch.PatchListNotAvailableException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.sql.Timestamp; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class ReviewerAdded { - private static final Logger log = - LoggerFactory.getLogger(ReviewerAdded.class); + private static final Logger log = LoggerFactory.getLogger(ReviewerAdded.class); private final DynamicSet listeners; private final EventUtil util; @Inject - ReviewerAdded(DynamicSet listeners, - EventUtil util) { + ReviewerAdded(DynamicSet listeners, EventUtil util) { this.listeners = listeners; this.util = util; } - public void fire(Change change, PatchSet patchSet, List reviewers, - Account adder, Timestamp when) { + public void fire( + Change change, PatchSet patchSet, List reviewers, Account adder, Timestamp when) { if (!listeners.iterator().hasNext() || reviewers.isEmpty()) { return; } try { - Event event = new Event( - util.changeInfo(change), - util.revisionInfo(change.getProject(), patchSet), - Lists.transform(reviewers, util::accountInfo), - util.accountInfo(adder), - when); + Event event = + new Event( + util.changeInfo(change), + util.revisionInfo(change.getProject(), patchSet), + Lists.transform(reviewers, util::accountInfo), + util.accountInfo(adder), + when); for (ReviewerAddedListener l : listeners) { try { l.onReviewersAdded(event); @@ -70,18 +67,20 @@ public class ReviewerAdded { util.logEventListenerError(this, l, e); } } - } catch (PatchListNotAvailableException | GpgException | IOException - | OrmException e) { + } catch (PatchListNotAvailableException | GpgException | IOException | OrmException e) { log.error("Couldn't fire event", e); } } - private static class Event extends AbstractRevisionEvent - implements ReviewerAddedListener.Event { + private static class Event extends AbstractRevisionEvent implements ReviewerAddedListener.Event { private final List reviewers; - Event(ChangeInfo change, RevisionInfo revision, List reviewers, - AccountInfo adder, Timestamp when) { + Event( + ChangeInfo change, + RevisionInfo revision, + List reviewers, + AccountInfo adder, + Timestamp when) { super(change, revision, adder, when, NotifyHandling.ALL); this.reviewers = reviewers; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ReviewerDeleted.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ReviewerDeleted.java index 4bc47644c7..033efe29ea 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ReviewerDeleted.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ReviewerDeleted.java @@ -28,45 +28,49 @@ import com.google.gerrit.server.GpgException; import com.google.gerrit.server.patch.PatchListNotAvailableException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.sql.Timestamp; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class ReviewerDeleted { - private static final Logger log = - LoggerFactory.getLogger(ReviewerDeleted.class); + private static final Logger log = LoggerFactory.getLogger(ReviewerDeleted.class); private final DynamicSet listeners; private final EventUtil util; @Inject - ReviewerDeleted(DynamicSet listeners, - EventUtil util) { + ReviewerDeleted(DynamicSet listeners, EventUtil util) { this.listeners = listeners; this.util = util; } - public void fire(Change change, PatchSet patchSet, Account reviewer, - Account remover, String message, Map newApprovals, - Map oldApprovals, NotifyHandling notify, Timestamp when) { + public void fire( + Change change, + PatchSet patchSet, + Account reviewer, + Account remover, + String message, + Map newApprovals, + Map oldApprovals, + NotifyHandling notify, + Timestamp when) { if (!listeners.iterator().hasNext()) { return; } try { - Event event = new Event( - util.changeInfo(change), - util.revisionInfo(change.getProject(), patchSet), - util.accountInfo(reviewer), - util.accountInfo(remover), - message, - util.approvals(reviewer, newApprovals, when), - util.approvals(reviewer, oldApprovals, when), - notify, - when); + Event event = + new Event( + util.changeInfo(change), + util.revisionInfo(change.getProject(), patchSet), + util.accountInfo(reviewer), + util.accountInfo(remover), + message, + util.approvals(reviewer, newApprovals, when), + util.approvals(reviewer, oldApprovals, when), + notify, + when); for (ReviewerDeletedListener listener : listeners) { try { listener.onReviewerDeleted(event); @@ -74,11 +78,9 @@ public class ReviewerDeleted { util.logEventListenerError(this, listener, e); } } - } catch (PatchListNotAvailableException | GpgException | IOException - | OrmException e) { + } catch (PatchListNotAvailableException | GpgException | IOException | OrmException e) { log.error("Couldn't fire event", e); } - } private static class Event extends AbstractRevisionEvent @@ -88,10 +90,15 @@ public class ReviewerDeleted { private final Map newApprovals; private final Map oldApprovals; - Event(ChangeInfo change, RevisionInfo revision, AccountInfo reviewer, - AccountInfo remover, String comment, + Event( + ChangeInfo change, + RevisionInfo revision, + AccountInfo reviewer, + AccountInfo remover, + String comment, Map newApprovals, - Map oldApprovals, NotifyHandling notify, + Map oldApprovals, + NotifyHandling notify, Timestamp when) { super(change, revision, remover, when, notify); this.reviewer = reviewer; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/RevisionCreated.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/RevisionCreated.java index 7f03c636e8..8a781d0856 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/RevisionCreated.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/RevisionCreated.java @@ -27,38 +27,36 @@ import com.google.gerrit.server.GpgException; import com.google.gerrit.server.patch.PatchListNotAvailableException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - +import java.io.IOException; +import java.sql.Timestamp; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.sql.Timestamp; - public class RevisionCreated { - private static final Logger log = - LoggerFactory.getLogger(RevisionCreated.class); + private static final Logger log = LoggerFactory.getLogger(RevisionCreated.class); private final DynamicSet listeners; private final EventUtil util; @Inject - RevisionCreated(DynamicSet listeners, - EventUtil util) { + RevisionCreated(DynamicSet listeners, EventUtil util) { this.listeners = listeners; this.util = util; } - public void fire(Change change, PatchSet patchSet, Account uploader, - Timestamp when, NotifyHandling notify) { + public void fire( + Change change, PatchSet patchSet, Account uploader, Timestamp when, NotifyHandling notify) { if (!listeners.iterator().hasNext()) { return; } try { - Event event = new Event( - util.changeInfo(change), - util.revisionInfo(change.getProject(), patchSet), - util.accountInfo(uploader), - when, notify); + Event event = + new Event( + util.changeInfo(change), + util.revisionInfo(change.getProject(), patchSet), + util.accountInfo(uploader), + when, + notify); for (RevisionCreatedListener l : listeners) { try { l.onRevisionCreated(event); @@ -66,8 +64,7 @@ public class RevisionCreated { util.logEventListenerError(this, l, e); } } - } catch ( PatchListNotAvailableException | GpgException | IOException - | OrmException e) { + } catch (PatchListNotAvailableException | GpgException | IOException | OrmException e) { log.error("Couldn't fire event", e); } } @@ -75,8 +72,12 @@ public class RevisionCreated { private static class Event extends AbstractRevisionEvent implements RevisionCreatedListener.Event { - Event(ChangeInfo change, RevisionInfo revision, AccountInfo uploader, - Timestamp when, NotifyHandling notify) { + Event( + ChangeInfo change, + RevisionInfo revision, + AccountInfo uploader, + Timestamp when, + NotifyHandling notify) { super(change, revision, uploader, when, notify); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/TopicEdited.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/TopicEdited.java index 2e583a853b..d7e7245864 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/TopicEdited.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/TopicEdited.java @@ -23,37 +23,29 @@ import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.Change; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - +import java.sql.Timestamp; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.sql.Timestamp; - public class TopicEdited { - private static final Logger log = - LoggerFactory.getLogger(TopicEdited.class); + private static final Logger log = LoggerFactory.getLogger(TopicEdited.class); private final DynamicSet listeners; private final EventUtil util; @Inject - TopicEdited(DynamicSet listeners, - EventUtil util) { + TopicEdited(DynamicSet listeners, EventUtil util) { this.listeners = listeners; this.util = util; } - public void fire(Change change, Account account, String oldTopicName, - Timestamp when) { + public void fire(Change change, Account account, String oldTopicName, Timestamp when) { if (!listeners.iterator().hasNext()) { return; } try { - Event event = new Event( - util.changeInfo(change), - util.accountInfo(account), - oldTopicName, - when); + Event event = + new Event(util.changeInfo(change), util.accountInfo(account), oldTopicName, when); for (TopicEditedListener l : listeners) { try { l.onTopicEdited(event); @@ -66,12 +58,10 @@ public class TopicEdited { } } - private static class Event extends AbstractChangeEvent - implements TopicEditedListener.Event { + private static class Event extends AbstractChangeEvent implements TopicEditedListener.Event { private final String oldTopic; - Event(ChangeInfo change, AccountInfo editor, String oldTopic, - Timestamp when) { + Event(ChangeInfo change, AccountInfo editor, String oldTopic, Timestamp when) { super(change, editor, when, NotifyHandling.ALL); this.oldTopic = oldTopic; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/VoteDeleted.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/VoteDeleted.java index e421ea6440..acb332d23e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/VoteDeleted.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/VoteDeleted.java @@ -29,44 +29,47 @@ import com.google.gerrit.server.GpgException; import com.google.gerrit.server.patch.PatchListNotAvailableException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.sql.Timestamp; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class VoteDeleted { - private static final Logger log = - LoggerFactory.getLogger(VoteDeleted.class); + private static final Logger log = LoggerFactory.getLogger(VoteDeleted.class); private final DynamicSet listeners; private final EventUtil util; @Inject - VoteDeleted(DynamicSet listeners, - EventUtil util) { + VoteDeleted(DynamicSet listeners, EventUtil util) { this.listeners = listeners; this.util = util; } - public void fire(Change change, PatchSet ps, + public void fire( + Change change, + PatchSet ps, Map approvals, Map oldApprovals, - NotifyHandling notify, String message, - Account remover, Timestamp when) { + NotifyHandling notify, + String message, + Account remover, + Timestamp when) { if (!listeners.iterator().hasNext()) { return; } try { - Event event = new Event( - util.changeInfo(change), - util.revisionInfo(change.getProject(), ps), - util.approvals(remover, approvals, when), - util.approvals(remover, oldApprovals, when), - notify, message, - util.accountInfo(remover), when); + Event event = + new Event( + util.changeInfo(change), + util.revisionInfo(change.getProject(), ps), + util.approvals(remover, approvals, when), + util.approvals(remover, oldApprovals, when), + notify, + message, + util.accountInfo(remover), + when); for (VoteDeletedListener l : listeners) { try { l.onVoteDeleted(event); @@ -74,24 +77,26 @@ public class VoteDeleted { util.logEventListenerError(this, l, e); } } - } catch (PatchListNotAvailableException | GpgException | IOException - | OrmException e) { + } catch (PatchListNotAvailableException | GpgException | IOException | OrmException e) { log.error("Couldn't fire event", e); } } - private static class Event extends AbstractRevisionEvent - implements VoteDeletedListener.Event { + private static class Event extends AbstractRevisionEvent implements VoteDeletedListener.Event { private final Map approvals; private final Map oldApprovals; private final String message; - Event(ChangeInfo change, RevisionInfo revision, + Event( + ChangeInfo change, + RevisionInfo revision, Map approvals, Map oldApprovals, - NotifyHandling notify, String message, - AccountInfo remover, Timestamp when) { + NotifyHandling notify, + String message, + AccountInfo remover, + Timestamp when) { super(change, revision, remover, when, notify); this.approvals = approvals; this.oldApprovals = oldApprovals; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/webui/UiActions.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/webui/UiActions.java index fe261e90c1..85ee4f923a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/webui/UiActions.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/webui/UiActions.java @@ -26,12 +26,10 @@ import com.google.gerrit.extensions.webui.UiAction; import com.google.gerrit.server.CurrentUser; import com.google.gerrit.server.account.CapabilityUtils; import com.google.inject.Provider; - +import java.util.Objects; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Objects; - public class UiActions { private static final Logger log = LoggerFactory.getLogger(UiActions.class); @@ -39,21 +37,16 @@ public class UiActions { return UiAction.Description::isEnabled; } - public static FluentIterable - from( - RestCollection collection, - R resource, - Provider userProvider) { + public static FluentIterable from( + RestCollection collection, R resource, Provider userProvider) { return from(collection.views(), resource, userProvider); } - public static FluentIterable - from( - DynamicMap> views, - R resource, - Provider userProvider) { + public static FluentIterable from( + DynamicMap> views, R resource, Provider userProvider) { return FluentIterable.from(views) - .transform((DynamicMap.Entry> e) -> { + .transform( + (DynamicMap.Entry> e) -> { int d = e.getExportName().indexOf('.'); if (d < 0) { return null; @@ -63,9 +56,10 @@ public class UiActions { try { view = e.getProvider().get(); } catch (RuntimeException err) { - log.error(String.format( - "error creating view %s.%s", - e.getPluginName(), e.getExportName()), err); + log.error( + String.format( + "error creating view %s.%s", e.getPluginName(), e.getExportName()), + err); return null; } @@ -74,32 +68,26 @@ public class UiActions { } try { - CapabilityUtils.checkRequiresCapability(userProvider, - e.getPluginName(), view.getClass()); + CapabilityUtils.checkRequiresCapability( + userProvider, e.getPluginName(), view.getClass()); } catch (AuthException exc) { return null; } - UiAction.Description dsc = - ((UiAction) view).getDescription(resource); + UiAction.Description dsc = ((UiAction) view).getDescription(resource); if (dsc == null || !dsc.isVisible()) { return null; } String name = e.getExportName().substring(d + 1); PrivateInternals_UiActionDescription.setMethod( - dsc, - e.getExportName().substring(0, d)); + dsc, e.getExportName().substring(0, d)); PrivateInternals_UiActionDescription.setId( - dsc, - "gerrit".equals(e.getPluginName()) - ? name - : e.getPluginName() + '~' + name); + dsc, "gerrit".equals(e.getPluginName()) ? name : e.getPluginName() + '~' + name); return dsc; }) .filter(Objects::nonNull); } - private UiActions() { - } + private UiActions() {} } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/AbandonOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/AbandonOp.java index f4e84b2e6e..bebff612dd 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/AbandonOp.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/AbandonOp.java @@ -35,7 +35,6 @@ import com.google.gerrit.server.notedb.ChangeUpdate; import com.google.gwtorm.server.OrmException; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -91,8 +90,7 @@ public class AbandonOp extends BatchUpdate.Op { } @Override - public boolean updateChange(ChangeContext ctx) - throws OrmException, ResourceConflictException { + public boolean updateChange(ChangeContext ctx) throws OrmException, ResourceConflictException { change = ctx.getChange(); PatchSet.Id psId = change.currentPatchSetId(); ChangeUpdate update = ctx.getUpdate(psId); @@ -119,15 +117,13 @@ public class AbandonOp extends BatchUpdate.Op { msg.append(msgTxt.trim()); } - return ChangeMessagesUtil.newMessage( - ctx, msg.toString(), ChangeMessagesUtil.TAG_ABANDON); + return ChangeMessagesUtil.newMessage(ctx, msg.toString(), ChangeMessagesUtil.TAG_ABANDON); } @Override public void postUpdate(Context ctx) throws OrmException { try { - ReplyToChangeSender cm = - abandonedSenderFactory.create(ctx.getProject(), change.getId()); + ReplyToChangeSender cm = abandonedSenderFactory.create(ctx.getProject(), change.getId()); if (account != null) { cm.setFrom(account.getId()); } @@ -138,8 +134,7 @@ public class AbandonOp extends BatchUpdate.Op { } catch (Exception e) { log.error("Cannot email update for change " + change.getId(), e); } - changeAbandoned.fire( - change, patchSet, account, msgTxt, ctx.getWhen(), notifyHandling); + changeAbandoned.fire(change, patchSet, account, msgTxt, ctx.getWhen(), notifyHandling); } private static String status(Change change) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/AccountsSection.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/AccountsSection.java index 4ea24ef829..ffecc3644f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/AccountsSection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/AccountsSection.java @@ -15,7 +15,6 @@ package com.google.gerrit.server.git; import com.google.gerrit.common.data.PermissionRule; - import java.util.ArrayList; import java.util.List; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/AsyncReceiveCommits.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/AsyncReceiveCommits.java index 899b06a47f..a3ea7f8eec 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/AsyncReceiveCommits.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/AsyncReceiveCommits.java @@ -27,7 +27,10 @@ import com.google.inject.Singleton; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.FactoryModuleBuilder; import com.google.inject.name.Named; - +import java.io.OutputStream; +import java.util.Collection; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.transport.PreReceiveHook; @@ -37,33 +40,24 @@ import org.eclipse.jgit.transport.ReceivePack; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.OutputStream; -import java.util.Collection; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; - /** Hook that delegates to {@link ReceiveCommits} in a worker thread. */ public class AsyncReceiveCommits implements PreReceiveHook { - private static final Logger log = - LoggerFactory.getLogger(AsyncReceiveCommits.class); + private static final Logger log = LoggerFactory.getLogger(AsyncReceiveCommits.class); private static final String TIMEOUT_NAME = "ReceiveCommitsOverallTimeout"; public interface Factory { - AsyncReceiveCommits create(ProjectControl projectControl, - Repository repository); + AsyncReceiveCommits create(ProjectControl projectControl, Repository repository); } public static class Module extends PrivateModule { @Override public void configure() { - install(new FactoryModuleBuilder() - .build(AsyncReceiveCommits.Factory.class)); + install(new FactoryModuleBuilder().build(AsyncReceiveCommits.Factory.class)); expose(AsyncReceiveCommits.Factory.class); // Don't expose the binding for ReceiveCommits.Factory. All callers should // be using AsyncReceiveCommits.Factory instead. - install(new FactoryModuleBuilder() - .build(ReceiveCommits.Factory.class)); + install(new FactoryModuleBuilder().build(ReceiveCommits.Factory.class)); } @Provides @@ -71,9 +65,7 @@ public class AsyncReceiveCommits implements PreReceiveHook { @Named(TIMEOUT_NAME) long getTimeoutMillis(@GerritServerConfig final Config cfg) { return ConfigUtil.getTimeUnit( - cfg, "receive", null, "timeout", - TimeUnit.MINUTES.toMillis(4), - TimeUnit.MILLISECONDS); + cfg, "receive", null, "timeout", TimeUnit.MINUTES.toMillis(4), TimeUnit.MILLISECONDS); } } @@ -113,7 +105,7 @@ public class AsyncReceiveCommits implements PreReceiveHook { private class MessageSenderOutputStream extends OutputStream { @Override public void write(int b) { - rc.getMessageSender().sendBytes(new byte[]{(byte)b}); + rc.getMessageSender().sendBytes(new byte[] {(byte) b}); } @Override @@ -139,7 +131,8 @@ public class AsyncReceiveCommits implements PreReceiveHook { private final long timeoutMillis; @Inject - AsyncReceiveCommits(final ReceiveCommits.Factory factory, + AsyncReceiveCommits( + final ReceiveCommits.Factory factory, @ReceiveCommitsExecutor final Executor executor, final RequestScopePropagator scopePropagator, @Named(TIMEOUT_NAME) final long timeoutMillis, @@ -150,22 +143,23 @@ public class AsyncReceiveCommits implements PreReceiveHook { rc = factory.create(projectControl, repo); rc.getReceivePack().setPreReceiveHook(this); - progress = new MultiProgressMonitor( - new MessageSenderOutputStream(), "Processing changes"); + progress = new MultiProgressMonitor(new MessageSenderOutputStream(), "Processing changes"); this.timeoutMillis = timeoutMillis; } @Override - public void onPreReceive(final ReceivePack rp, - final Collection commands) { + public void onPreReceive(final ReceivePack rp, final Collection commands) { try { progress.waitFor( executor.submit(scopePropagator.wrap(new Worker(commands))), - timeoutMillis, TimeUnit.MILLISECONDS); + timeoutMillis, + TimeUnit.MILLISECONDS); } catch (ExecutionException e) { - log.warn(String.format( - "Error in ReceiveCommits while processing changes for project %s", - rc.getProject().getName()), e); + log.warn( + String.format( + "Error in ReceiveCommits while processing changes for project %s", + rc.getProject().getName()), + e); rc.addError("internal error while processing changes"); // ReceiveCommits has tried its best to catch errors, so anything at this // point is very bad. diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/BanCommit.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/BanCommit.java index be1777631d..d09e857e01 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/BanCommit.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/BanCommit.java @@ -26,7 +26,10 @@ import com.google.gerrit.server.project.ProjectControl; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException; import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.errors.MissingObjectException; @@ -41,11 +44,6 @@ import org.eclipse.jgit.notes.NoteMap; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; -import java.io.IOException; -import java.util.Date; -import java.util.List; -import java.util.TimeZone; - @Singleton public class BanCommit { /** @@ -56,8 +54,7 @@ public class BanCommit { * @return NoteMap of commits to be rejected, null if there are none. * @throws IOException the map cannot be loaded. */ - public static NoteMap loadRejectCommitsMap(Repository repo, RevWalk walk) - throws IOException { + public static NoteMap loadRejectCommitsMap(Repository repo, RevWalk walk) throws IOException { try { Ref ref = repo.getRefDatabase().exactRef(RefNames.REFS_REJECT_COMMITS); if (ref == null) { @@ -67,8 +64,7 @@ public class BanCommit { RevCommit map = walk.parseCommit(ref.getObjectId()); return NoteMap.read(walk.getObjectReader(), map); } catch (IOException badMap) { - throw new IOException("Cannot load " + RefNames.REFS_REJECT_COMMITS, - badMap); + throw new IOException("Cannot load " + RefNames.REFS_REJECT_COMMITS, badMap); } } @@ -78,7 +74,8 @@ public class BanCommit { private NotesBranchUtil.Factory notesBranchUtilFactory; @Inject - BanCommit(final Provider currentUser, + BanCommit( + final Provider currentUser, final GitRepositoryManager repoManager, @GerritPersonIdent final PersonIdent gerritIdent, final NotesBranchUtil.Factory notesBranchUtilFactory) { @@ -88,13 +85,11 @@ public class BanCommit { this.tz = gerritIdent.getTimeZone(); } - public BanCommitResult ban(final ProjectControl projectControl, - final List commitsToBan, final String reason) - throws PermissionDeniedException, IOException, - ConcurrentRefUpdateException { + public BanCommitResult ban( + final ProjectControl projectControl, final List commitsToBan, final String reason) + throws PermissionDeniedException, IOException, ConcurrentRefUpdateException { if (!projectControl.isOwner()) { - throw new PermissionDeniedException( - "Not project owner: not permitted to ban commits"); + throw new PermissionDeniedException("Not project owner: not permitted to ban commits"); } final BanCommitResult result = new BanCommitResult(); @@ -119,11 +114,13 @@ public class BanCommit { } banCommitNotes.set(commitToBan, noteId); } - NotesBranchUtil notesBranchUtil = - notesBranchUtilFactory.create(project, repo, inserter); + NotesBranchUtil notesBranchUtil = notesBranchUtilFactory.create(project, repo, inserter); NoteMap newlyCreated = - notesBranchUtil.commitNewNotes(banCommitNotes, REFS_REJECT_COMMITS, - createPersonIdent(), buildCommitMessage(commitsToBan, reason)); + notesBranchUtil.commitNewNotes( + banCommitNotes, + REFS_REJECT_COMMITS, + createPersonIdent(), + buildCommitMessage(commitsToBan, reason)); for (Note n : banCommitNotes) { if (newlyCreated.contains(n)) { @@ -136,8 +133,7 @@ public class BanCommit { } } - private ObjectId createNoteContent(String reason, ObjectInserter inserter) - throws IOException { + private ObjectId createNoteContent(String reason, ObjectInserter inserter) throws IOException { String noteContent = reason != null ? reason : ""; if (noteContent.length() > 0 && !noteContent.endsWith("\n")) { noteContent = noteContent + "\n"; @@ -150,8 +146,8 @@ public class BanCommit { return currentUser.get().newCommitterIdent(now, tz); } - private static String buildCommitMessage(final List bannedCommits, - final String reason) { + private static String buildCommitMessage( + final List bannedCommits, final String reason) { final StringBuilder commitMsg = new StringBuilder(); commitMsg.append("Banning "); commitMsg.append(bannedCommits.size()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/BanCommitResult.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/BanCommitResult.java index 92c3b6c64e..baa601399e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/BanCommitResult.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/BanCommitResult.java @@ -14,10 +14,9 @@ package com.google.gerrit.server.git; -import org.eclipse.jgit.lib.ObjectId; - import java.util.ArrayList; import java.util.List; +import org.eclipse.jgit.lib.ObjectId; public class BanCommitResult { private final List newlyBannedCommits = new ArrayList<>(4); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/BatchUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/BatchUpdate.java index 93571d6637..38a8199461 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/BatchUpdate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/BatchUpdate.java @@ -72,19 +72,6 @@ import com.google.inject.Inject; import com.google.inject.Singleton; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - -import org.eclipse.jgit.lib.BatchRefUpdate; -import org.eclipse.jgit.lib.Config; -import org.eclipse.jgit.lib.NullProgressMonitor; -import org.eclipse.jgit.lib.ObjectInserter; -import org.eclipse.jgit.lib.ObjectReader; -import org.eclipse.jgit.lib.PersonIdent; -import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.revwalk.RevWalk; -import org.eclipse.jgit.transport.ReceiveCommand; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.sql.Timestamp; import java.util.ArrayList; @@ -97,53 +84,62 @@ import java.util.TimeZone; import java.util.TreeMap; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; +import org.eclipse.jgit.lib.BatchRefUpdate; +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.lib.NullProgressMonitor; +import org.eclipse.jgit.lib.ObjectInserter; +import org.eclipse.jgit.lib.ObjectReader; +import org.eclipse.jgit.lib.PersonIdent; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevWalk; +import org.eclipse.jgit.transport.ReceiveCommand; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Context for a set of updates that should be applied for a site. - *

- * An update operation can be divided into three phases: + * + *

An update operation can be divided into three phases: + * *

    - *
  1. Git reference updates
  2. - *
  3. Database updates
  4. - *
  5. Post-update steps
  6. + *
  7. Git reference updates + *
  8. Database updates + *
  9. Post-update steps + *
  10. *
- * A single conceptual operation, such as a REST API call or a merge operation, - * may make multiple changes at each step, which all need to be serialized - * relative to each other. Moreover, for consistency, all git ref - * updates must be performed before any database updates, since - * database updates might refer to newly-created patch set refs. And all - * post-update steps, such as hooks, should run only after all storage - * mutations have completed. - *

- * Depending on the backend used, each step might support batching, for example - * in a {@code BatchRefUpdate} or one or more database transactions. All - * operations in one phase must complete successfully before proceeding to the - * next phase. + * + * A single conceptual operation, such as a REST API call or a merge operation, may make multiple + * changes at each step, which all need to be serialized relative to each other. Moreover, for + * consistency, all git ref updates must be performed before any database updates, + * since database updates might refer to newly-created patch set refs. And all post-update steps, + * such as hooks, should run only after all storage mutations have completed. + * + *

Depending on the backend used, each step might support batching, for example in a {@code + * BatchRefUpdate} or one or more database transactions. All operations in one phase must complete + * successfully before proceeding to the next phase. */ public class BatchUpdate implements AutoCloseable { private static final Logger log = LoggerFactory.getLogger(BatchUpdate.class); public interface Factory { - BatchUpdate create(ReviewDb db, Project.NameKey project, - CurrentUser user, Timestamp when); + BatchUpdate create(ReviewDb db, Project.NameKey project, CurrentUser user, Timestamp when); } /** Order of execution of the various phases. */ public enum Order { /** - * Update the repository and execute all ref updates before touching the - * database. - *

- * The default and most common, as Gerrit does not behave well when a patch - * set has no corresponding ref in the repo. + * Update the repository and execute all ref updates before touching the database. + * + *

The default and most common, as Gerrit does not behave well when a patch set has no + * corresponding ref in the repo. */ REPO_BEFORE_DB, /** * Update the database before touching the repository. - *

- * Generally only used when deleting patch sets, which should be deleted - * first from the database (for the same reason as above.) + * + *

Generally only used when deleting patch sets, which should be deleted first from the + * database (for the same reason as above.) */ DB_BEFORE_REPO; } @@ -228,8 +224,8 @@ public class BatchUpdate implements AutoCloseable { private boolean deleted; private boolean bumpLastUpdatedOn = true; - protected ChangeContext(ChangeControl ctl, ReviewDbWrapper dbWrapper, - Repository repo, RevWalk rw) { + protected ChangeContext( + ChangeControl ctl, ReviewDbWrapper dbWrapper, Repository repo, RevWalk rw) { this.ctl = ctl; this.dbWrapper = dbWrapper; this.threadLocalRepo = repo; @@ -298,18 +294,15 @@ public class BatchUpdate implements AutoCloseable { * * @param ctx context */ - public void updateRepo(RepoContext ctx) throws Exception { - } + public void updateRepo(RepoContext ctx) throws Exception {} /** - * Override this method to do something after the update - * e.g. send email or run hooks + * Override this method to do something after the update e.g. send email or run hooks * * @param ctx context */ //TODO(dborowitz): Support async operations? - public void postUpdate(Context ctx) throws Exception { - } + public void postUpdate(Context ctx) throws Exception {} } public static class Op extends RepoOnlyOp { @@ -317,8 +310,7 @@ public class BatchUpdate implements AutoCloseable { * Override this method to modify a change. * * @param ctx context - * @return whether anything was changed that might require a write to - * the metadata storage. + * @return whether anything was changed that might require a write to the metadata storage. */ public boolean updateChange(ChangeContext ctx) throws Exception { return false; @@ -331,27 +323,21 @@ public class BatchUpdate implements AutoCloseable { /** * Interface for listening during batch update execution. - *

- * When used during execution of multiple batch updates, the {@code after*} - * methods are called after that phase has been completed for all updates. + * + *

When used during execution of multiple batch updates, the {@code after*} methods are called + * after that phase has been completed for all updates. */ public static class Listener { public static final Listener NONE = new Listener(); - /** - * Called after updating all repositories and flushing objects but before - * updating any refs. - */ - public void afterUpdateRepos() throws Exception { - } + /** Called after updating all repositories and flushing objects but before updating any refs. */ + public void afterUpdateRepos() throws Exception {} /** Called after updating all refs. */ - public void afterRefUpdates() throws Exception { - } + public void afterRefUpdates() throws Exception {} /** Called after updating all changes. */ - public void afterUpdateChanges() throws Exception { - } + public void afterUpdateChanges() throws Exception {} } @Singleton @@ -360,13 +346,13 @@ public class BatchUpdate implements AutoCloseable { @Inject Metrics(MetricMaker metricMaker) { - executeChangeOpsLatency = metricMaker.newTimer( - "batch_update/execute_change_ops", - new Description( - "BatchUpdate change update latency, excluding reindexing") - .setCumulative() - .setUnit(Units.MILLISECONDS), - Field.ofBoolean("success")); + executeChangeOpsLatency = + metricMaker.newTimer( + "batch_update/execute_change_ops", + new Description("BatchUpdate change update latency, excluding reindexing") + .setCumulative() + .setUnit(Units.MILLISECONDS), + Field.ofBoolean("success")); } } @@ -382,37 +368,41 @@ public class BatchUpdate implements AutoCloseable { return o; } - private static boolean getUpdateChangesInParallel( - Collection updates) { + private static boolean getUpdateChangesInParallel(Collection updates) { checkArgument(!updates.isEmpty()); Boolean p = null; for (BatchUpdate u : updates) { if (p == null) { p = u.updateChangesInParallel; } else if (u.updateChangesInParallel != p) { - throw new IllegalArgumentException( - "cannot mix parallel and non-parallel operations"); + throw new IllegalArgumentException("cannot mix parallel and non-parallel operations"); } } // Properly implementing this would involve hoisting the parallel loop up // even further. As of this writing, the only user is ReceiveCommits, // which only executes a single BatchUpdate at a time. So bail for now. - checkArgument(!p || updates.size() <= 1, + checkArgument( + !p || updates.size() <= 1, "cannot execute ChangeOps in parallel with more than 1 BatchUpdate"); return p; } - static void execute(Collection updates, Listener listener, - @Nullable RequestId requestId, boolean dryrun) - throws UpdateException, RestApiException { + static void execute( + Collection updates, + Listener listener, + @Nullable RequestId requestId, + boolean dryrun) + throws UpdateException, RestApiException { if (updates.isEmpty()) { return; } if (requestId != null) { for (BatchUpdate u : updates) { - checkArgument(u.requestId == null || u.requestId == requestId, + checkArgument( + u.requestId == null || u.requestId == requestId, "refusing to overwrite RequestId %s in update with %s", - u.requestId, requestId); + u.requestId, + requestId); u.setRequestId(requestId); } } @@ -430,15 +420,13 @@ public class BatchUpdate implements AutoCloseable { } listener.afterRefUpdates(); for (BatchUpdate u : updates) { - u.reindexChanges( - u.executeChangeOps(updateChangesInParallel, dryrun)); + u.reindexChanges(u.executeChangeOps(updateChangesInParallel, dryrun)); } listener.afterUpdateChanges(); break; case DB_BEFORE_REPO: for (BatchUpdate u : updates) { - u.reindexChanges( - u.executeChangeOps(updateChangesInParallel, dryrun)); + u.reindexChanges(u.executeChangeOps(updateChangesInParallel, dryrun)); } listener.afterUpdateChanges(); for (BatchUpdate u : updates) { @@ -469,9 +457,7 @@ public class BatchUpdate implements AutoCloseable { u.gitRefUpdated.fire( u.project, u.batchRefUpdate, - u.getUser().isIdentifiedUser() - ? u.getUser().asIdentifiedUser().getAccount() - : null); + u.getUser().isIdentifiedUser() ? u.getUser().asIdentifiedUser().getAccount() : null); } } if (!dryrun) { @@ -485,12 +471,11 @@ public class BatchUpdate implements AutoCloseable { // failure. throw e; - // Convert other common non-REST exception types with user-visible - // messages to corresponding REST exception types + // Convert other common non-REST exception types with user-visible + // messages to corresponding REST exception types } catch (InvalidChangeOperationException e) { throw new ResourceConflictException(e.getMessage(), e); - } catch (NoSuchChangeException | NoSuchRefException - | NoSuchProjectException e) { + } catch (NoSuchChangeException | NoSuchRefException | NoSuchProjectException e) { throw new ResourceNotFoundException(e.getMessage(), e); } catch (Exception e) { @@ -522,8 +507,7 @@ public class BatchUpdate implements AutoCloseable { private final ListMultimap ops = MultimapBuilder.linkedHashKeys().arrayListValues().build(); private final Map newChanges = new HashMap<>(); - private final List> indexFutures = - new ArrayList<>(); + private final List> indexFutures = new ArrayList<>(); private final List repoOnlyOps = new ArrayList<>(); private Repository repo; @@ -592,8 +576,7 @@ public class BatchUpdate implements AutoCloseable { return this; } - public BatchUpdate setRepository(Repository repo, RevWalk revWalk, - ObjectInserter inserter) { + public BatchUpdate setRepository(Repository repo, RevWalk revWalk, ObjectInserter inserter) { checkState(this.repo == null, "repo already set"); closeRepo = false; this.repo = checkNotNull(repo, "repo"); @@ -609,17 +592,15 @@ public class BatchUpdate implements AutoCloseable { } /** - * Add a validation step for intended ref operations, which will be performed - * at the end of {@link RepoOnlyOp#updateRepo(RepoContext)} step. + * Add a validation step for intended ref operations, which will be performed at the end of {@link + * RepoOnlyOp#updateRepo(RepoContext)} step. */ BatchUpdate setOnSubmitValidators(OnSubmitValidators onSubmitValidators) { this.onSubmitValidators = onSubmitValidators; return this; } - /** - * Execute {@link Op#updateChange(ChangeContext)} in parallel for each change. - */ + /** Execute {@link Op#updateChange(ChangeContext)} in parallel for each change. */ public BatchUpdate updateChangesInParallel() { this.updateChangesInParallel = true; return this; @@ -670,8 +651,8 @@ public class BatchUpdate implements AutoCloseable { public BatchUpdate insertChange(InsertChangeOp op) { Context ctx = new Context(); Change c = op.createChange(ctx); - checkArgument(!newChanges.containsKey(c.getId()), - "only one op allowed to create change %s", c.getId()); + checkArgument( + !newChanges.containsKey(c.getId()), "only one op allowed to create change %s", c.getId()); newChanges.put(c.getId(), c); ops.get(c.getId()).add(0, op); return this; @@ -685,8 +666,7 @@ public class BatchUpdate implements AutoCloseable { execute(Listener.NONE); } - public void execute(Listener listener) - throws UpdateException, RestApiException { + public void execute(Listener listener) throws UpdateException, RestApiException { execute(ImmutableList.of(this), listener, requestId, false); } @@ -703,16 +683,17 @@ public class BatchUpdate implements AutoCloseable { op.updateRepo(ctx); } - if (onSubmitValidators != null && commands != null - && !commands.isEmpty()) { + if (onSubmitValidators != null && commands != null && !commands.isEmpty()) { // Validation of refs has to take place here and not at the beginning // executeRefUpdates. Otherwise failing validation in a second // BatchUpdate object will happen *after* first object's // executeRefUpdates has finished, hence after first repo's refs have // been updated, which is too late. - onSubmitValidators.validate(project, + onSubmitValidators.validate( + project, new ReadOnlyRepository(getRepository()), - ctx.getInserter().newReader(), commands.getCommands()); + ctx.getInserter().newReader(), + commands.getCommands()); } if (inserter != null) { @@ -727,8 +708,7 @@ public class BatchUpdate implements AutoCloseable { } } - private void executeRefUpdates(boolean dryrun) - throws IOException, RestApiException { + private void executeRefUpdates(boolean dryrun) throws IOException, RestApiException { if (commands == null || commands.isEmpty()) { logDebug("No ref updates to execute"); return; @@ -737,8 +717,7 @@ public class BatchUpdate implements AutoCloseable { initRepository(); batchRefUpdate = repo.getRefDatabase().newBatchUpdate(); commands.addTo(batchRefUpdate); - logDebug("Executing batch of {} ref updates", - batchRefUpdate.getCommands().size()); + logDebug("Executing batch of {} ref updates", batchRefUpdate.getCommands().size()); if (dryrun) { return; } @@ -756,17 +735,15 @@ public class BatchUpdate implements AutoCloseable { } } - private List executeChangeOps(boolean parallel, - boolean dryrun) throws UpdateException, - RestApiException { + private List executeChangeOps(boolean parallel, boolean dryrun) + throws UpdateException, RestApiException { List tasks; boolean success = false; Stopwatch sw = Stopwatch.createStarted(); try { logDebug("Executing change ops (parallel? {})", parallel); - ListeningExecutorService executor = parallel - ? changeUpdateExector - : MoreExecutors.newDirectExecutorService(); + ListeningExecutorService executor = + parallel ? changeUpdateExector : MoreExecutors.newDirectExecutorService(); tasks = new ArrayList<>(ops.keySet().size()); try { @@ -782,12 +759,10 @@ public class BatchUpdate implements AutoCloseable { logDebug("Failing early due to read-only Changes table"); throw new OrmException(NoteDbUpdateManager.CHANGES_READ_ONLY); } - List> futures = - new ArrayList<>(ops.keySet().size()); + List> futures = new ArrayList<>(ops.keySet().size()); for (Map.Entry> e : ops.asMap().entrySet()) { ChangeTask task = - new ChangeTask(e.getKey(), e.getValue(), Thread.currentThread(), - dryrun); + new ChangeTask(e.getKey(), e.getValue(), Thread.currentThread(), dryrun); tasks.add(task); if (!parallel) { logDebug("Direct execution of task for ops: {}", ops); @@ -795,8 +770,8 @@ public class BatchUpdate implements AutoCloseable { futures.add(executor.submit(task)); } if (parallel) { - logDebug("Waiting on futures for {} ops spanning {} changes", - ops.size(), ops.keySet().size()); + logDebug( + "Waiting on futures for {} ops spanning {} changes", ops.size(), ops.keySet().size()); } Futures.allAsList(futures).get(); @@ -814,8 +789,7 @@ public class BatchUpdate implements AutoCloseable { throw new UpdateException(e); } } finally { - metrics.executeChangeOpsLatency.record( - success, sw.elapsed(NANOSECONDS), NANOSECONDS); + metrics.executeChangeOpsLatency.record(success, sw.elapsed(NANOSECONDS), NANOSECONDS); } return tasks; } @@ -844,8 +818,7 @@ public class BatchUpdate implements AutoCloseable { // updates on the change repo first. logDebug("Executing NoteDb updates for {} changes", tasks.size()); try { - BatchRefUpdate changeRefUpdate = - getRepository().getRefDatabase().newBatchUpdate(); + BatchRefUpdate changeRefUpdate = getRepository().getRefDatabase().newBatchUpdate(); boolean hasAllUsersCommands = false; try (ObjectInserter ins = getRepository().newObjectInserter()) { int objs = 0; @@ -861,11 +834,12 @@ public class BatchUpdate implements AutoCloseable { objs++; ins.insert(obj.type(), obj.data().toByteArray()); } - hasAllUsersCommands |= - !task.noteDbResult.allUsersCommands().isEmpty(); + hasAllUsersCommands |= !task.noteDbResult.allUsersCommands().isEmpty(); } - logDebug("Collected {} objects and {} ref updates to change repo", - objs, changeRefUpdate.getCommands().size()); + logDebug( + "Collected {} objects and {} ref updates to change repo", + objs, + changeRefUpdate.getCommands().size()); executeNoteDbUpdate(getRevWalk(), ins, changeRefUpdate); } @@ -874,8 +848,7 @@ public class BatchUpdate implements AutoCloseable { RevWalk allUsersRw = new RevWalk(allUsersRepo); ObjectInserter allUsersIns = allUsersRepo.newObjectInserter()) { int objs = 0; - BatchRefUpdate allUsersRefUpdate = - allUsersRepo.getRefDatabase().newBatchUpdate(); + BatchRefUpdate allUsersRefUpdate = allUsersRepo.getRefDatabase().newBatchUpdate(); for (ChangeTask task : tasks) { for (ReceiveCommand cmd : task.noteDbResult.allUsersCommands()) { allUsersRefUpdate.addCommand(cmd); @@ -884,8 +857,10 @@ public class BatchUpdate implements AutoCloseable { allUsersIns.insert(obj.type(), obj.data().toByteArray()); } } - logDebug("Collected {} objects and {} ref updates to All-Users", - objs, allUsersRefUpdate.getCommands().size()); + logDebug( + "Collected {} objects and {} ref updates to All-Users", + objs, + allUsersRefUpdate.getCommands().size()); executeNoteDbUpdate(allUsersRw, allUsersIns, allUsersRefUpdate); } } else { @@ -898,20 +873,18 @@ public class BatchUpdate implements AutoCloseable { // if any state is out of date it will be rebuilt the next time it // is needed. // Always log even without RequestId. - log.debug( - "Ignoring NoteDb update error after ReviewDb write", e); + log.debug("Ignoring NoteDb update error after ReviewDb write", e); } else { // We can't prove it's safe to ignore the error, either because some // change had NOTE_DB primary, or a task failed before determining the // primary storage. throw e; } - } } - private void executeNoteDbUpdate(RevWalk rw, ObjectInserter ins, - BatchRefUpdate bru) throws IOException { + private void executeNoteDbUpdate(RevWalk rw, ObjectInserter ins, BatchRefUpdate bru) + throws IOException { if (bru.getCommands().isEmpty()) { logDebug("No commands, skipping flush and ref update"); return; @@ -939,8 +912,7 @@ public class BatchUpdate implements AutoCloseable { boolean deleted; private String taskId; - private ChangeTask(Change.Id id, Collection changeOps, - Thread mainThread, boolean dryrun) { + private ChangeTask(Change.Id id, Collection changeOps, Thread mainThread, boolean dryrun) { this.id = id; this.changeOps = changeOps; this.mainThread = mainThread; @@ -972,8 +944,7 @@ public class BatchUpdate implements AutoCloseable { return null; } - private void call(ReviewDb db, Repository repo, RevWalk rw) - throws Exception { + private void call(ReviewDb db, Repository repo, RevWalk rw) throws Exception { @SuppressWarnings("resource") // Not always opened. NoteDbUpdateManager updateManager = null; try { @@ -984,10 +955,8 @@ public class BatchUpdate implements AutoCloseable { NoteDbChangeState.checkNotReadOnly(oldState, skewMs); storage = PrimaryStorage.of(oldState); - if (storage == PrimaryStorage.NOTE_DB - && !notesMigration.readChanges()) { - throw new OrmException( - "must have NoteDb enabled to update change " + id); + if (storage == PrimaryStorage.NOTE_DB && !notesMigration.readChanges()) { + throw new OrmException("must have NoteDb enabled to update change " + id); } // Call updateChange on each op. @@ -1029,8 +998,7 @@ public class BatchUpdate implements AutoCloseable { db.commit(); } } else { - logDebug( - "Skipping ReviewDb write since primary storage is {}", storage); + logDebug("Skipping ReviewDb write since primary storage is {}", storage); } } finally { db.rollback(); @@ -1054,8 +1022,7 @@ public class BatchUpdate implements AutoCloseable { // already written the NoteDbChangeState to ReviewDb, which means // if the state is out of date it will be rebuilt the next time it // is needed. - log.debug( - "Ignoring NoteDb update error after ReviewDb write", ex); + log.debug("Ignoring NoteDb update error after ReviewDb write", ex); } } } catch (Exception e) { @@ -1069,14 +1036,13 @@ public class BatchUpdate implements AutoCloseable { } } - private ChangeContext newChangeContext(ReviewDb db, Repository repo, - RevWalk rw, Change.Id id) throws OrmException { + private ChangeContext newChangeContext(ReviewDb db, Repository repo, RevWalk rw, Change.Id id) + throws OrmException { Change c = newChanges.get(id); boolean isNew = c != null; if (isNew) { // New change: populate noteDbState. - checkState(c.getNoteDbState() == null, - "noteDbState should not be filled in by callers"); + checkState(c.getNoteDbState() == null, "noteDbState should not be filled in by callers"); if (notesMigration.changePrimaryStorage() == PrimaryStorage.NOTE_DB) { c.setNoteDbState(NoteDbChangeState.NOTE_DB_PRIMARY_STATE); } @@ -1110,13 +1076,14 @@ public class BatchUpdate implements AutoCloseable { return new ChangeContext(ctl, new BatchUpdateReviewDb(db), repo, rw); } - private NoteDbUpdateManager stageNoteDbUpdate(ChangeContext ctx, - boolean deleted) throws OrmException, IOException { + private NoteDbUpdateManager stageNoteDbUpdate(ChangeContext ctx, boolean deleted) + throws OrmException, IOException { logDebug("Staging NoteDb update"); - NoteDbUpdateManager updateManager = updateManagerFactory - .create(ctx.getProject()) - .setChangeRepo(ctx.getRepository(), ctx.getRevWalk(), null, - new ChainedReceiveCommands(repo)); + NoteDbUpdateManager updateManager = + updateManagerFactory + .create(ctx.getProject()) + .setChangeRepo( + ctx.getRepository(), ctx.getRevWalk(), null, new ChainedReceiveCommands(repo)); if (ctx.getUser().isIdentifiedUser()) { updateManager.setRefLogIdent( ctx.getUser().asIdentifiedUser().newRefLogIdent(ctx.getWhen(), tz)); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/BatchUpdateReviewDb.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/BatchUpdateReviewDb.java index 1de98d389d..1f476fa4f1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/BatchUpdateReviewDb.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/BatchUpdateReviewDb.java @@ -64,7 +64,7 @@ public class BatchUpdateReviewDb extends ReviewDbWrapper { public void upsert(Iterable instances) { throw new UnsupportedOperationException( "do not call upsert; existing changes are updated automatically," - + " or use InsertChangeOp for insertion"); + + " or use InsertChangeOp for insertion"); } @Override @@ -75,8 +75,7 @@ public class BatchUpdateReviewDb extends ReviewDbWrapper { @Override public void beginTransaction(Change.Id key) { - throw new UnsupportedOperationException( - "updateChange is always called within a transaction"); + throw new UnsupportedOperationException("updateChange is always called within a transaction"); } @Override @@ -92,11 +91,9 @@ public class BatchUpdateReviewDb extends ReviewDbWrapper { } @Override - public Change atomicUpdate(Change.Id key, - AtomicUpdate update) { + public Change atomicUpdate(Change.Id key, AtomicUpdate update) { throw new UnsupportedOperationException( - "do not call atomicUpdate; updateChange is always called within a" - + " transaction"); + "do not call atomicUpdate; updateChange is always called within a" + " transaction"); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/BranchOrderSection.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/BranchOrderSection.java index 0ef9e0c187..d4b537e268 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/BranchOrderSection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/BranchOrderSection.java @@ -16,7 +16,6 @@ package com.google.gerrit.server.git; import com.google.common.collect.ImmutableList; import com.google.gerrit.reviewdb.client.RefNames; - import java.util.List; public class BranchOrderSection { @@ -24,7 +23,7 @@ public class BranchOrderSection { /** * Branch names ordered from least to the most stable. * - * Typically the order will be like: master, stable-M.N, stable-M.N-1, ... + *

Typically the order will be like: master, stable-M.N, stable-M.N-1, ... */ private final ImmutableList order; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ChainedReceiveCommands.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ChainedReceiveCommands.java index a3b30d1900..424f9ed290 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ChainedReceiveCommands.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ChainedReceiveCommands.java @@ -17,24 +17,22 @@ package com.google.gerrit.server.git; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; -import org.eclipse.jgit.lib.BatchRefUpdate; -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.transport.ReceiveCommand; - import java.io.IOException; import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; import java.util.Optional; +import org.eclipse.jgit.lib.BatchRefUpdate; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.transport.ReceiveCommand; /** * Collection of {@link ReceiveCommand}s that supports multiple updates per ref. - *

- * The underlying behavior of {@link BatchRefUpdate} is undefined (an - * implementations vary) when more than one command per ref is added. This class - * works around that limitation by allowing multiple updates per ref, as long as - * the previous new SHA-1 matches the next old SHA-1. + * + *

The underlying behavior of {@link BatchRefUpdate} is undefined (an implementations vary) when + * more than one command per ref is added. This class works around that limitation by allowing + * multiple updates per ref, as long as the previous new SHA-1 matches the next old SHA-1. */ public class ChainedReceiveCommands implements RefCache { private final Map commands = new LinkedHashMap<>(); @@ -59,33 +57,36 @@ public class ChainedReceiveCommands implements RefCache { /** * Add a command. * - * @param cmd command to add. If a command has been previously added for the - * same ref, the new SHA-1 of the most recent previous command must match - * the old SHA-1 of this command. + * @param cmd command to add. If a command has been previously added for the same ref, the new + * SHA-1 of the most recent previous command must match the old SHA-1 of this command. */ public void add(ReceiveCommand cmd) { - checkArgument(!cmd.getOldId().equals(cmd.getNewId()), - "ref update is a no-op: %s", cmd); + checkArgument(!cmd.getOldId().equals(cmd.getNewId()), "ref update is a no-op: %s", cmd); ReceiveCommand old = commands.get(cmd.getRefName()); if (old == null) { commands.put(cmd.getRefName(), cmd); return; } - checkArgument(old.getResult() == ReceiveCommand.Result.NOT_ATTEMPTED, + checkArgument( + old.getResult() == ReceiveCommand.Result.NOT_ATTEMPTED, "cannot chain ref update %s after update %s with result %s", - cmd, old, old.getResult()); - checkArgument(cmd.getOldId().equals(old.getNewId()), + cmd, + old, + old.getResult()); + checkArgument( + cmd.getOldId().equals(old.getNewId()), "cannot chain ref update %s after update %s with different new ID", - cmd, old); - commands.put(cmd.getRefName(), new ReceiveCommand( - old.getOldId(), cmd.getNewId(), cmd.getRefName())); + cmd, + old); + commands.put( + cmd.getRefName(), new ReceiveCommand(old.getOldId(), cmd.getNewId(), cmd.getRefName())); } /** * Get the latest value of a ref according to this sequence of commands. - *

- * After the value for a ref is read from the repo once, it is cached as in - * {@link RepoRefCache}. + * + *

After the value for a ref is read from the repo once, it is cached as in {@link + * RepoRefCache}. * * @see RefCache#get(String) */ @@ -102,10 +103,10 @@ public class ChainedReceiveCommands implements RefCache { /** * Add commands from this instance to a native JGit batch update. - *

- * Exactly one command per ref will be added to the update. The old SHA-1 will - * be the old SHA-1 of the first command added to this instance for that ref; - * the new SHA-1 will be the new SHA-1 of the last command. + * + *

Exactly one command per ref will be added to the update. The old SHA-1 will be the old SHA-1 + * of the first command added to this instance for that ref; the new SHA-1 will be the new SHA-1 + * of the last command. * * @param bru batch update */ diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeAlreadyMergedException.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeAlreadyMergedException.java index f2e7f78a1b..0af4b72384 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeAlreadyMergedException.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeAlreadyMergedException.java @@ -14,9 +14,7 @@ package com.google.gerrit.server.git; -/** - * Indicates that the change or commit is already in the source tree. - */ +/** Indicates that the change or commit is already in the source tree. */ public class ChangeAlreadyMergedException extends MergeIdenticalTreeException { private static final long serialVersionUID = 1L; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeMessageModifier.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeMessageModifier.java index 75911f3f5f..7d4edcf317 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeMessageModifier.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeMessageModifier.java @@ -16,15 +16,13 @@ package com.google.gerrit.server.git; import com.google.gerrit.extensions.annotations.ExtensionPoint; import com.google.gerrit.reviewdb.client.Branch; - import org.eclipse.jgit.revwalk.RevCommit; /** - * Allows to modify the commit message for new commits generated by Rebase - * Always submit strategy. + * Allows to modify the commit message for new commits generated by Rebase Always submit strategy. * - * Invoked by Gerrit when all information about new commit is already known such - * as parent(s), tree hash, etc, but commit's message can still be modified. + *

Invoked by Gerrit when all information about new commit is already known such as parent(s), + * tree hash, etc, but commit's message can still be modified. */ @ExtensionPoint public interface ChangeMessageModifier { @@ -32,22 +30,22 @@ public interface ChangeMessageModifier { /** * Implementation must return non-Null commit message. * - * mergeTip and original commit are guaranteed to have their body parsed, - * meaning that their commit messages and footers can be accessed. + *

mergeTip and original commit are guaranteed to have their body parsed, meaning that their + * commit messages and footers can be accessed. * * @param newCommitMessage the new commit message that was result of either - *

    - *
  • {@link MergeUtil#createDetailedCommitMessage} called before
  • - *
  • other extensions or plugins implementing the same point and - * called before.
  • - *
- * @param original the commit of the change being submitted. Note that its - * commit message may be different than newCommitMessage argument. - * @param mergeTip the current HEAD of the destination branch, which will be a - * parent of a new commit being generated + *
    + *
  • {@link MergeUtil#createDetailedCommitMessage} called before + *
  • other extensions or plugins implementing the same point and called before. + *
+ * + * @param original the commit of the change being submitted. Note that its commit message may + * be different than newCommitMessage argument. + * @param mergeTip the current HEAD of the destination branch, which will be a parent of a new + * commit being generated * @param destination the branch onto which the change is being submitted * @return a new not null commit message. */ - String onSubmit(String newCommitMessage, RevCommit original, - RevCommit mergeTip, Branch.NameKey destination); + String onSubmit( + String newCommitMessage, RevCommit original, RevCommit mergeTip, Branch.NameKey destination); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeProgressOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeProgressOp.java index 370bc2dfc8..9612873cd6 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeProgressOp.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeProgressOp.java @@ -15,7 +15,6 @@ package com.google.gerrit.server.git; import com.google.gerrit.server.git.BatchUpdate.ChangeContext; - import org.eclipse.jgit.lib.ProgressMonitor; /** Trivial op to update a counter during {@code updateChange} */ diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeSet.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeSet.java index 400532dba9..03d44cacd1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeSet.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeSet.java @@ -24,29 +24,26 @@ import com.google.gerrit.reviewdb.client.Branch; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.server.query.change.ChangeData; import com.google.gwtorm.server.OrmException; - import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; /** * A set of changes grouped together to be submitted atomically. - *

- * MergeSuperSet constructs ChangeSets to accumulate intermediate - * results toward the ChangeSet it returns when done. - *

- * This class is not thread safe. + * + *

MergeSuperSet constructs ChangeSets to accumulate intermediate results toward the ChangeSet it + * returns when done. + * + *

This class is not thread safe. */ public class ChangeSet { private final ImmutableMap changeData; /** - * Additional changes not included in changeData because their - * connection to the original change is not visible to the - * current user. That is, this map includes both - * - changes that are not visible to the current user, and - * - changes whose only relationship to the set is via a change - * that is not visible to the current user + * Additional changes not included in changeData because their connection to the original change + * is not visible to the current user. That is, this map includes both - changes that are not + * visible to the current user, and - changes whose only relationship to the set is via a change + * that is not visible to the current user */ private final ImmutableMap nonVisibleChanges; @@ -62,14 +59,14 @@ public class ChangeSet { return ImmutableMap.copyOf(ret); } - public ChangeSet( - Iterable changes, Iterable hiddenChanges) { + public ChangeSet(Iterable changes, Iterable hiddenChanges) { changeData = index(changes, ImmutableList.of()); nonVisibleChanges = index(hiddenChanges, changeData.keySet()); } public ChangeSet(ChangeData change, boolean visible) { - this(visible ? ImmutableList.of(change) : ImmutableList.of(), + this( + visible ? ImmutableList.of(change) : ImmutableList.of(), ImmutableList.of(change)); } @@ -81,8 +78,7 @@ public class ChangeSet { return changeData; } - public ListMultimap changesByBranch() - throws OrmException { + public ListMultimap changesByBranch() throws OrmException { ListMultimap ret = MultimapBuilder.hashKeys().arrayListValues().build(); for (ChangeData cd : changeData.values()) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeUpdateExecutor.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeUpdateExecutor.java index 3452bb056f..ace8a3844e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeUpdateExecutor.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeUpdateExecutor.java @@ -18,14 +18,12 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.inject.BindingAnnotation; - import java.lang.annotation.Retention; /** - * Marker on the global {@link ListeningExecutorService} used by - * {@link ReceiveCommits} to create or replace changes. + * Marker on the global {@link ListeningExecutorService} used by {@link ReceiveCommits} to create or + * replace changes. */ @Retention(RUNTIME) @BindingAnnotation -public @interface ChangeUpdateExecutor { -} +public @interface ChangeUpdateExecutor {} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/CodeReviewCommit.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/CodeReviewCommit.java index 6fa3c2a828..80c705eb18 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/CodeReviewCommit.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/CodeReviewCommit.java @@ -22,7 +22,7 @@ import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.server.git.strategy.CommitMergeStatus; import com.google.gerrit.server.notedb.ChangeNotes; import com.google.gerrit.server.project.ChangeControl; - +import java.io.IOException; import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.lib.AnyObjectId; @@ -31,24 +31,22 @@ import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; -import java.io.IOException; - /** Extended commit entity with code review specific metadata. */ public class CodeReviewCommit extends RevCommit { /** * Default ordering when merging multiple topologically-equivalent commits. - *

- * Operates only on these commits and does not take ancestry into account. - *

- * Use this in preference to the default order, which comes from {@link - * AnyObjectId} and only orders on SHA-1. + * + *

Operates only on these commits and does not take ancestry into account. + * + *

Use this in preference to the default order, which comes from {@link AnyObjectId} and only + * orders on SHA-1. */ - public static final Ordering ORDER = Ordering.natural() - .onResultOf((CodeReviewCommit c) -> - c.getPatchsetId() != null - ? c.getPatchsetId().getParentKey().get() - : null) - .nullsFirst(); + public static final Ordering ORDER = + Ordering.natural() + .onResultOf( + (CodeReviewCommit c) -> + c.getPatchsetId() != null ? c.getPatchsetId().getParentKey().get() : null) + .nullsFirst(); public static CodeReviewRevWalk newRevWalk(Repository repo) { return new CodeReviewRevWalk(repo); @@ -73,22 +71,21 @@ public class CodeReviewCommit extends RevCommit { } @Override - public CodeReviewCommit next() throws MissingObjectException, - IncorrectObjectTypeException, IOException { + public CodeReviewCommit next() + throws MissingObjectException, IncorrectObjectTypeException, IOException { return (CodeReviewCommit) super.next(); } @Override - public void markStart(RevCommit c) throws MissingObjectException, - IncorrectObjectTypeException, IOException { + public void markStart(RevCommit c) + throws MissingObjectException, IncorrectObjectTypeException, IOException { checkArgument(c instanceof CodeReviewCommit); super.markStart(c); } @Override public void markUninteresting(final RevCommit c) - throws MissingObjectException, IncorrectObjectTypeException, - IOException { + throws MissingObjectException, IncorrectObjectTypeException, IOException { checkArgument(c instanceof CodeReviewCommit); super.markUninteresting(c); } @@ -100,17 +97,16 @@ public class CodeReviewCommit extends RevCommit { @Override public CodeReviewCommit parseCommit(AnyObjectId id) - throws MissingObjectException, IncorrectObjectTypeException, - IOException { + throws MissingObjectException, IncorrectObjectTypeException, IOException { return (CodeReviewCommit) super.parseCommit(id); } } /** * Unique key of the PatchSet entity from the code review system. - *

- * This value is only available on commits that have a PatchSet represented in - * the code review system. + * + *

This value is only available on commits that have a PatchSet represented in the code review + * system. */ private PatchSet.Id patchsetId; @@ -119,8 +115,8 @@ public class CodeReviewCommit extends RevCommit { /** * The result status for this commit. - *

- * Only valid if {@link #patchsetId} is not null. + * + *

Only valid if {@link #patchsetId} is not null. */ private CommitMergeStatus statusCode; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ConfiguredMimeTypes.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ConfiguredMimeTypes.java index 082e1a2b67..9f77fdea48 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ConfiguredMimeTypes.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ConfiguredMimeTypes.java @@ -14,22 +14,20 @@ package com.google.gerrit.server.git; -import org.eclipse.jgit.errors.InvalidPatternException; -import org.eclipse.jgit.fnmatch.FileNameMatcher; -import org.eclipse.jgit.lib.Config; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; +import org.eclipse.jgit.errors.InvalidPatternException; +import org.eclipse.jgit.fnmatch.FileNameMatcher; +import org.eclipse.jgit.lib.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class ConfiguredMimeTypes { - private static final Logger log = LoggerFactory - .getLogger(ConfiguredMimeTypes.class); + private static final Logger log = LoggerFactory.getLogger(ConfiguredMimeTypes.class); private static final String MIMETYPE = "mimetype"; private static final String KEY_PATH = "path"; @@ -47,10 +45,10 @@ public class ConfiguredMimeTypes { try { add(typeName, path); } catch (PatternSyntaxException | InvalidPatternException e) { - log.warn(String.format( - "Ignoring invalid %s.%s.%s = %s in project %s: %s", - MIMETYPE, typeName, KEY_PATH, - path, projectName, e.getMessage())); + log.warn( + String.format( + "Ignoring invalid %s.%s.%s = %s in project %s: %s", + MIMETYPE, typeName, KEY_PATH, path, projectName, e.getMessage())); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/DefaultQueueOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/DefaultQueueOp.java index cff69c6fe4..a9c21ff575 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/DefaultQueueOp.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/DefaultQueueOp.java @@ -28,9 +28,7 @@ public abstract class DefaultQueueOp implements Runnable { return workQueue.getDefaultQueue().schedule(this, delay, unit); } - public ScheduledFuture startWithFixedDelay(long initialDelay, long delay, - TimeUnit unit) { - return workQueue.getDefaultQueue() - .scheduleWithFixedDelay(this, initialDelay, delay, unit); + public ScheduledFuture startWithFixedDelay(long initialDelay, long delay, TimeUnit unit) { + return workQueue.getDefaultQueue().scheduleWithFixedDelay(this, initialDelay, delay, unit); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/DestinationList.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/DestinationList.java index c4d4d61fed..eacf66e9cf 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/DestinationList.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/DestinationList.java @@ -20,7 +20,6 @@ import com.google.common.collect.SetMultimap; import com.google.common.collect.Sets; import com.google.gerrit.reviewdb.client.Branch; import com.google.gerrit.reviewdb.client.Project; - import java.io.IOException; import java.util.List; import java.util.Set; @@ -34,10 +33,9 @@ public class DestinationList extends TabFile { return destinations.get(label); } - public void parseLabel(String label, String text, - ValidationError.Sink errors) throws IOException { - destinations.replaceValues(label, - toSet(parse(text, DIR_NAME + label, TRIM, null, errors))); + public void parseLabel(String label, String text, ValidationError.Sink errors) + throws IOException { + destinations.replaceValues(label, toSet(parse(text, DIR_NAME + label, TRIM, null, errors))); } public String asText(String label) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/EmailMerge.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/EmailMerge.java index 1da5257b59..e80bbd8baf 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/EmailMerge.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/EmailMerge.java @@ -34,18 +34,19 @@ import com.google.inject.OutOfScopeException; import com.google.inject.Provider; import com.google.inject.ProvisionException; import com.google.inject.assistedinject.Assisted; - +import java.util.concurrent.ExecutorService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.concurrent.ExecutorService; - public class EmailMerge implements Runnable, RequestContext { private static final Logger log = LoggerFactory.getLogger(EmailMerge.class); public interface Factory { - EmailMerge create(Project.NameKey project, Change.Id changeId, - Account.Id submitter, NotifyHandling notifyHandling, + EmailMerge create( + Project.NameKey project, + Change.Id changeId, + Account.Id submitter, + NotifyHandling notifyHandling, ListMultimap accountsToNotify); } @@ -64,7 +65,8 @@ public class EmailMerge implements Runnable, RequestContext { private ReviewDb db; @Inject - EmailMerge(@SendEmailExecutor ExecutorService executor, + EmailMerge( + @SendEmailExecutor ExecutorService executor, MergedSender.Factory mergedSenderFactory, SchemaFactory schemaFactory, ThreadLocalRequestContext requestContext, diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollection.java index 5bb4dfd1b3..33c31fd116 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollection.java @@ -22,7 +22,10 @@ import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.config.GcConfig; import com.google.gerrit.server.extensions.events.AbstractNoNotifyEvent; import com.google.inject.Inject; - +import java.io.PrintWriter; +import java.util.List; +import java.util.Properties; +import java.util.Set; import org.eclipse.jgit.api.GarbageCollectCommand; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.errors.RepositoryNotFoundException; @@ -35,19 +38,12 @@ import org.eclipse.jgit.storage.pack.PackConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.PrintWriter; -import java.util.List; -import java.util.Properties; -import java.util.Set; - public class GarbageCollection { - private static final Logger log = LoggerFactory - .getLogger(GarbageCollection.class); + private static final Logger log = LoggerFactory.getLogger(GarbageCollection.class); public static final String LOG_NAME = "gc_log"; private static final Logger gcLog = LoggerFactory.getLogger(LOG_NAME); - private final GitRepositoryManager repoManager; private final GarbageCollectionQueue gcQueue; private final GcConfig gcConfig; @@ -58,8 +54,10 @@ public class GarbageCollection { } @Inject - GarbageCollection(GitRepositoryManager repoManager, - GarbageCollectionQueue gcQueue, GcConfig config, + GarbageCollection( + GitRepositoryManager repoManager, + GarbageCollectionQueue gcQueue, + GcConfig config, DynamicSet listeners) { this.repoManager = repoManager; this.gcQueue = gcQueue; @@ -71,19 +69,19 @@ public class GarbageCollection { return run(projectNames, null); } - public GarbageCollectionResult run(List projectNames, - PrintWriter writer) { + public GarbageCollectionResult run(List projectNames, PrintWriter writer) { return run(projectNames, gcConfig.isAggressive(), writer); } - public GarbageCollectionResult run(List projectNames, - boolean aggressive, PrintWriter writer) { + public GarbageCollectionResult run( + List projectNames, boolean aggressive, PrintWriter writer) { GarbageCollectionResult result = new GarbageCollectionResult(); Set projectsToGc = gcQueue.addAll(projectNames); - for (Project.NameKey projectName : Sets.difference( - Sets.newHashSet(projectNames), projectsToGc)) { - result.addError(new GarbageCollectionResult.Error( - GarbageCollectionResult.Error.Type.GC_ALREADY_SCHEDULED, projectName)); + for (Project.NameKey projectName : + Sets.difference(Sets.newHashSet(projectNames), projectsToGc)) { + result.addError( + new GarbageCollectionResult.Error( + GarbageCollectionResult.Error.Type.GC_ALREADY_SCHEDULED, projectName)); } for (Project.NameKey p : projectsToGc) { try (Repository repo = repoManager.openRepository(p)) { @@ -92,21 +90,21 @@ public class GarbageCollection { GarbageCollectCommand gc = Git.wrap(repo).gc(); gc.setAggressive(aggressive); logGcInfo(p, "before:", gc.getStatistics()); - gc.setProgressMonitor(writer != null ? new TextProgressMonitor(writer) - : NullProgressMonitor.INSTANCE); + gc.setProgressMonitor( + writer != null ? new TextProgressMonitor(writer) : NullProgressMonitor.INSTANCE); Properties statistics = gc.call(); logGcInfo(p, "after: ", statistics); print(writer, "done.\n\n"); fire(p, statistics); } catch (RepositoryNotFoundException e) { logGcError(writer, p, e); - result.addError(new GarbageCollectionResult.Error( - GarbageCollectionResult.Error.Type.REPOSITORY_NOT_FOUND, - p)); + result.addError( + new GarbageCollectionResult.Error( + GarbageCollectionResult.Error.Type.REPOSITORY_NOT_FOUND, p)); } catch (Exception e) { logGcError(writer, p, e); - result.addError(new GarbageCollectionResult.Error( - GarbageCollectionResult.Error.Type.GC_FAILED, p)); + result.addError( + new GarbageCollectionResult.Error(GarbageCollectionResult.Error.Type.GC_FAILED, p)); } finally { gcQueue.gcFinished(p); } @@ -132,8 +130,7 @@ public class GarbageCollection { logGcInfo(projectName, msg, null); } - private static void logGcInfo(Project.NameKey projectName, String msg, - Properties statistics) { + private static void logGcInfo(Project.NameKey projectName, String msg, Properties statistics) { StringBuilder b = new StringBuilder(); b.append("[").append(projectName.get()).append("] "); b.append(msg); @@ -148,15 +145,14 @@ public class GarbageCollection { gcLog.info(b.toString()); } - private static void logGcConfiguration(Project.NameKey projectName, - Repository repo, boolean aggressive) { + private static void logGcConfiguration( + Project.NameKey projectName, Repository repo, boolean aggressive) { StringBuilder b = new StringBuilder(); Config cfg = repo.getConfig(); b.append("gc.aggressive=").append(aggressive).append("; "); b.append(formatConfigValues(cfg, ConfigConstants.CONFIG_GC_SECTION, null)); for (String subsection : cfg.getSubsections(ConfigConstants.CONFIG_GC_SECTION)) { - b.append(formatConfigValues(cfg, ConfigConstants.CONFIG_GC_SECTION, - subsection)); + b.append(formatConfigValues(cfg, ConfigConstants.CONFIG_GC_SECTION, subsection)); } if (b.length() == 0) { b.append("no set"); @@ -166,8 +162,7 @@ public class GarbageCollection { logGcInfo(projectName, "pack config: " + (new PackConfig(repo)).toString()); } - private static String formatConfigValues(Config config, String section, - String subsection) { + private static String formatConfigValues(Config config, String section, String subsection) { StringBuilder b = new StringBuilder(); Set names = config.getNames(section, subsection); for (String name : names) { @@ -183,8 +178,7 @@ public class GarbageCollection { return b.toString(); } - private static void logGcError(PrintWriter writer, - Project.NameKey projectName, Exception e) { + private static void logGcError(PrintWriter writer, Project.NameKey projectName, Exception e) { print(writer, "failed.\n\n"); StringBuilder b = new StringBuilder(); b.append("[").append(projectName.get()).append("]"); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionLogFile.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionLogFile.java index b2a4311653..e1f0594575 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionLogFile.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionLogFile.java @@ -18,13 +18,11 @@ import com.google.gerrit.extensions.events.LifecycleListener; import com.google.gerrit.server.config.SitePaths; import com.google.gerrit.server.util.SystemLog; import com.google.inject.Inject; - +import java.nio.file.Path; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.apache.log4j.PatternLayout; -import java.nio.file.Path; - public class GarbageCollectionLogFile implements LifecycleListener { @Inject @@ -35,8 +33,7 @@ public class GarbageCollectionLogFile implements LifecycleListener { } @Override - public void start() { - } + public void start() {} @Override public void stop() { @@ -46,8 +43,9 @@ public class GarbageCollectionLogFile implements LifecycleListener { private static void initLogSystem(Path logdir) { Logger gcLogger = LogManager.getLogger(GarbageCollection.LOG_NAME); gcLogger.removeAllAppenders(); - gcLogger.addAppender(SystemLog.createAppender(logdir, - GarbageCollection.LOG_NAME, new PatternLayout("[%d] %-5p %x: %m%n"))); + gcLogger.addAppender( + SystemLog.createAppender( + logdir, GarbageCollection.LOG_NAME, new PatternLayout("[%d] %-5p %x: %m%n"))); gcLogger.setAdditivity(false); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionQueue.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionQueue.java index 90e2aac2a5..31cd880d1e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionQueue.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionQueue.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.git; import com.google.common.collect.Sets; import com.google.gerrit.reviewdb.client.Project; import com.google.inject.Singleton; - import java.util.Collection; import java.util.HashSet; import java.util.Set; @@ -27,8 +26,7 @@ public class GarbageCollectionQueue { private final Set projectsScheduledForGc = new HashSet<>(); public synchronized Set addAll(Collection projects) { - Set added = - Sets.newLinkedHashSetWithExpectedSize(projects.size()); + Set added = Sets.newLinkedHashSetWithExpectedSize(projects.size()); for (Project.NameKey p : projects) { if (projectsScheduledForGc.add(p)) { added.add(p); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionRunner.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionRunner.java index e01924e522..eba5177eaf 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionRunner.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionRunner.java @@ -22,16 +22,13 @@ import com.google.gerrit.server.config.GcConfig; import com.google.gerrit.server.config.ScheduleConfig; import com.google.gerrit.server.project.ProjectCache; import com.google.inject.Inject; - +import java.util.concurrent.TimeUnit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.concurrent.TimeUnit; - /** Runnable to enable scheduling gc to run periodically */ public class GarbageCollectionRunner implements Runnable { - private static final Logger gcLog = LoggerFactory - .getLogger(GarbageCollection.LOG_NAME); + private static final Logger gcLog = LoggerFactory.getLogger(GarbageCollection.LOG_NAME); static class Lifecycle implements LifecycleListener { private final WorkQueue queue; @@ -39,8 +36,7 @@ public class GarbageCollectionRunner implements Runnable { private final GcConfig gcConfig; @Inject - Lifecycle(WorkQueue queue, GarbageCollectionRunner gcRunner, - GcConfig config) { + Lifecycle(WorkQueue queue, GarbageCollectionRunner gcRunner, GcConfig config) { this.queue = queue; this.gcRunner = gcRunner; this.gcConfig = config; @@ -54,11 +50,11 @@ public class GarbageCollectionRunner implements Runnable { if (delay == MISSING_CONFIG && interval == MISSING_CONFIG) { gcLog.info("Ignoring missing gc schedule configuration"); } else if (delay < 0 || interval <= 0) { - gcLog.warn(String.format( - "Ignoring invalid gc schedule configuration: %s", scheduleConfig)); + gcLog.warn(String.format("Ignoring invalid gc schedule configuration: %s", scheduleConfig)); } else { - queue.getDefaultQueue().scheduleAtFixedRate(gcRunner, delay, - interval, TimeUnit.MILLISECONDS); + queue + .getDefaultQueue() + .scheduleAtFixedRate(gcRunner, delay, interval, TimeUnit.MILLISECONDS); } } @@ -72,8 +68,8 @@ public class GarbageCollectionRunner implements Runnable { private final ProjectCache projectCache; @Inject - GarbageCollectionRunner(GarbageCollection.Factory garbageCollectionFactory, - ProjectCache projectCache) { + GarbageCollectionRunner( + GarbageCollection.Factory garbageCollectionFactory, ProjectCache projectCache) { this.garbageCollectionFactory = garbageCollectionFactory; this.projectCache = projectCache; } @@ -81,8 +77,7 @@ public class GarbageCollectionRunner implements Runnable { @Override public void run() { gcLog.info("Triggering gc on all repositories"); - garbageCollectionFactory.create().run( - Lists.newArrayList(projectCache.all())); + garbageCollectionFactory.create().run(Lists.newArrayList(projectCache.all())); } @Override diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/GitModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/GitModule.java index e609d68ad6..36805d676f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/GitModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/GitModule.java @@ -16,7 +16,6 @@ package com.google.gerrit.server.git; import com.google.gerrit.extensions.config.FactoryModule; import com.google.gerrit.extensions.registration.DynamicSet; - import org.eclipse.jgit.transport.PostUploadHook; /** Configures the Git support. */ @@ -27,7 +26,6 @@ public class GitModule extends FactoryModule { factory(MetaDataUpdate.InternalFactory.class); bind(MetaDataUpdate.Server.class); bind(ReceiveConfig.class); - DynamicSet.bind(binder(), PostUploadHook.class) - .to(UploadPackMetricsHook.class); + DynamicSet.bind(binder(), PostUploadHook.class).to(UploadPackMetricsHook.class); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/GitModules.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/GitModules.java index 192691dda6..1c749846ee 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/GitModules.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/GitModules.java @@ -25,7 +25,11 @@ import com.google.gerrit.server.util.RequestId; import com.google.gerrit.server.util.SubmoduleSectionParser; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Set; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.BlobBasedConfig; import org.eclipse.jgit.lib.FileMode; @@ -35,15 +39,9 @@ import org.eclipse.jgit.treewalk.TreeWalk; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Set; - /** - * Loads the .gitmodules file of the specified project/branch. - * It can be queried which submodules this branch is subscribed to. + * Loads the .gitmodules file of the specified project/branch. It can be queried which submodules + * this branch is subscribed to. */ public class GitModules { private static final Logger log = LoggerFactory.getLogger(GitModules.class); @@ -61,7 +59,8 @@ public class GitModules { GitModules( @CanonicalWebUrl @Nullable String canonicalWebUrl, @Assisted Branch.NameKey branch, - @Assisted MergeOpRepoManager orm) throws IOException { + @Assisted MergeOpRepoManager orm) + throws IOException { this.submissionId = orm.getSubmissionId(); Project.NameKey project = branch.getParentKey(); logDebug("Loading .gitmodules of {} for project {}", branch, project); @@ -74,10 +73,8 @@ public class GitModules { } RevCommit commit = or.rw.parseCommit(id); - try (TreeWalk tw = - TreeWalk.forPath(or.repo, GIT_MODULES, commit.getTree())) { - if (tw == null - || (tw.getRawMode(0) & FileMode.TYPE_MASK) != FileMode.TYPE_FILE) { + try (TreeWalk tw = TreeWalk.forPath(or.repo, GIT_MODULES, commit.getTree())) { + if (tw == null || (tw.getRawMode(0) & FileMode.TYPE_MASK) != FileMode.TYPE_FILE) { subscriptions = Collections.emptySet(); logDebug("The .gitmodules file doesn't exist in " + branch); return; @@ -87,11 +84,10 @@ public class GitModules { try { bbc = new BlobBasedConfig(null, or.repo, commit, GIT_MODULES); } catch (ConfigInvalidException e) { - throw new IOException("Could not read .gitmodules of super project: " + - branch.getParentKey(), e); + throw new IOException( + "Could not read .gitmodules of super project: " + branch.getParentKey(), e); } - subscriptions = new SubmoduleSectionParser(bbc, canonicalWebUrl, - branch).parseAllSections(); + subscriptions = new SubmoduleSectionParser(bbc, canonicalWebUrl, branch).parseAllSections(); } catch (NoSuchProjectException e) { throw new IOException(e); } finally { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/GitRepositoryManager.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/GitRepositoryManager.java index 17248088d5..f8d8a49062 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/GitRepositoryManager.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/GitRepositoryManager.java @@ -17,19 +17,16 @@ package com.google.gerrit.server.git; import com.google.gerrit.reviewdb.client.Project; import com.google.inject.ImplementedBy; import com.google.inject.Singleton; - +import java.io.IOException; +import java.util.SortedSet; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.Repository; -import java.io.IOException; -import java.util.SortedSet; - /** * Manages Git repositories for the Gerrit server process. - *

- * Implementations of this interface should be a {@link Singleton} and - * registered in Guice so they are globally available within the server - * environment. + * + *

Implementations of this interface should be a {@link Singleton} and registered in Guice so + * they are globally available within the server environment. */ @ImplementedBy(value = LocalDiskRepositoryManager.class) public interface GitRepositoryManager { @@ -37,29 +34,26 @@ public interface GitRepositoryManager { * Get (or open) a repository by name. * * @param name the repository name, relative to the base directory. - * @return the cached Repository instance. Caller must call {@code close()} - * when done to decrement the resource handle. - * @throws RepositoryNotFoundException the name does not denote an existing - * repository. + * @return the cached Repository instance. Caller must call {@code close()} when done to decrement + * the resource handle. + * @throws RepositoryNotFoundException the name does not denote an existing repository. * @throws IOException the name cannot be read as a repository. */ - Repository openRepository(Project.NameKey name) - throws RepositoryNotFoundException, IOException; + Repository openRepository(Project.NameKey name) throws RepositoryNotFoundException, IOException; /** * Create (and open) a repository by name. * * @param name the repository name, relative to the base directory. - * @return the cached Repository instance. Caller must call {@code close()} - * when done to decrement the resource handle. - * @throws RepositoryCaseMismatchException the name collides with an existing - * repository name, but only in case of a character within the name. + * @return the cached Repository instance. Caller must call {@code close()} when done to decrement + * the resource handle. + * @throws RepositoryCaseMismatchException the name collides with an existing repository name, but + * only in case of a character within the name. * @throws RepositoryNotFoundException the name is invalid. * @throws IOException the repository cannot be created. */ Repository createRepository(Project.NameKey name) - throws RepositoryCaseMismatchException, RepositoryNotFoundException, - IOException; + throws RepositoryCaseMismatchException, RepositoryNotFoundException, IOException; /** @return set of all known projects, sorted by natural NameKey order. */ SortedSet list(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/GroupCollector.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/GroupCollector.java index 0ac39ad51b..960c72a8b9 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/GroupCollector.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/GroupCollector.java @@ -34,13 +34,6 @@ import com.google.gerrit.server.PatchSetUtil; import com.google.gerrit.server.change.RevisionResource; import com.google.gerrit.server.notedb.ChangeNotes; import com.google.gwtorm.server.OrmException; - -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.Ref; -import org.eclipse.jgit.revwalk.RevCommit; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.ArrayDeque; import java.util.Collection; import java.util.Deque; @@ -48,38 +41,41 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.revwalk.RevCommit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Helper for assigning groups to commits during {@link ReceiveCommits}. - *

- * For each commit encountered along a walk between the branch tip and the tip - * of the push, the group of a commit is defined as follows: + * + *

For each commit encountered along a walk between the branch tip and the tip of the push, the + * group of a commit is defined as follows: + * *

    - *
  • If the commit is an existing patch set of a change, the group is read - * from the group field in the corresponding {@link PatchSet} record.
  • - *
  • If all of a commit's parents are merged into the branch, then its group - * is its own SHA-1.
  • - *
  • If the commit has a single parent that is not yet merged into the - * branch, then its group is the same as the parent's group.
  • - *
  • For a merge commit, choose a parent and use that parent's group. If one - * of the parents has a group from a patch set, use that group, otherwise, use - * the group from the first parent. In addition to setting this merge commit's - * group, use the chosen group for all commits that would otherwise use a - * group from the parents that were not chosen.
  • - *
  • If a merge commit has multiple parents whose group comes from separate - * patch sets, concatenate the groups from those parents together. This - * indicates two side branches were pushed separately, followed by the merge. + *
  • If the commit is an existing patch set of a change, the group is read from the group field + * in the corresponding {@link PatchSet} record. + *
  • If all of a commit's parents are merged into the branch, then its group is its own SHA-1. + *
  • If the commit has a single parent that is not yet merged into the branch, then its group is + * the same as the parent's group. + *
  • + *
  • For a merge commit, choose a parent and use that parent's group. If one of the parents has + * a group from a patch set, use that group, otherwise, use the group from the first parent. + * In addition to setting this merge commit's group, use the chosen group for all commits that + * would otherwise use a group from the parents that were not chosen. + *
  • If a merge commit has multiple parents whose group comes from separate patch sets, + * concatenate the groups from those parents together. This indicates two side branches were + * pushed separately, followed by the merge. *
  • *
- *

- * Callers must call {@link #visit(RevCommit)} on all commits between the - * current branch tip and the tip of a push, in reverse topo order (parents - * before children). Once all commits have been visited, call {@link - * #getGroups()} for the result. + * + *

Callers must call {@link #visit(RevCommit)} on all commits between the current branch tip and + * the tip of a push, in reverse topo order (parents before children). Once all commits have been + * visited, call {@link #getGroups()} for the result. */ public class GroupCollector { - private static final Logger log = - LoggerFactory.getLogger(GroupCollector.class); + private static final Logger log = LoggerFactory.getLogger(GroupCollector.class); public static List getDefaultGroups(PatchSet ps) { return ImmutableList.of(ps.getRevision().get()); @@ -109,8 +105,11 @@ public class GroupCollector { private boolean done; - public static GroupCollector create(ListMultimap changeRefsById, - ReviewDb db, PatchSetUtil psUtil, ChangeNotes.Factory notesFactory, + public static GroupCollector create( + ListMultimap changeRefsById, + ReviewDb db, + PatchSetUtil psUtil, + ChangeNotes.Factory notesFactory, Project.NameKey project) { return new GroupCollector( transformRefs(changeRefsById), @@ -118,8 +117,7 @@ public class GroupCollector { @Override public List lookup(PatchSet.Id psId) throws OrmException { // TODO(dborowitz): Reuse open repository from caller. - ChangeNotes notes = - notesFactory.createChecked(db, project, psId.getParentKey()); + ChangeNotes notes = notesFactory.createChecked(db, project, psId.getParentKey()); PatchSet ps = psUtil.get(db, notes, psId); return ps != null ? ps.getGroups() : null; } @@ -139,9 +137,7 @@ public class GroupCollector { }); } - private GroupCollector( - ListMultimap patchSetsBySha, - Lookup groupLookup) { + private GroupCollector(ListMultimap patchSetsBySha, Lookup groupLookup) { this.patchSetsBySha = patchSetsBySha; this.groupLookup = groupLookup; groups = MultimapBuilder.hashKeys().arrayListValues().build(); @@ -150,8 +146,7 @@ public class GroupCollector { private static ListMultimap transformRefs( ListMultimap refs) { - return Multimaps.transformValues( - refs, r -> PatchSet.Id.fromRef(r.getName())); + return Multimaps.transformValues(refs, r -> PatchSet.Id.fromRef(r.getName())); } @VisibleForTesting @@ -195,8 +190,8 @@ public class GroupCollector { for (RevCommit p : interestingParents) { Collection parentGroups = groups.get(p); if (parentGroups.isEmpty()) { - throw new IllegalStateException(String.format( - "no group assigned to parent %s of commit %s", p.name(), c.name())); + throw new IllegalStateException( + String.format("no group assigned to parent %s of commit %s", p.name(), c.name())); } for (String parentGroup : parentGroups) { @@ -231,12 +226,9 @@ public class GroupCollector { public SortedSetMultimap getGroups() throws OrmException { done = true; - SortedSetMultimap result = MultimapBuilder - .hashKeys(groups.keySet().size()) - .treeSetValues() - .build(); - for (Map.Entry> e - : groups.asMap().entrySet()) { + SortedSetMultimap result = + MultimapBuilder.hashKeys(groups.keySet().size()).treeSetValues().build(); + for (Map.Entry> e : groups.asMap().entrySet()) { ObjectId id = e.getKey(); result.putAll(id.copy(), resolveGroups(id, e.getValue())); } @@ -244,8 +236,7 @@ public class GroupCollector { } private Set getInterestingParents(RevCommit commit) { - Set result = - Sets.newLinkedHashSetWithExpectedSize(commit.getParentCount()); + Set result = Sets.newLinkedHashSetWithExpectedSize(commit.getParentCount()); for (RevCommit p : commit.getParents()) { if (!p.has(UNINTERESTING)) { result.add(p); @@ -259,8 +250,8 @@ public class GroupCollector { return id != null && patchSetsBySha.containsKey(id); } - private Set resolveGroups(ObjectId forCommit, - Collection candidates) throws OrmException { + private Set resolveGroups(ObjectId forCommit, Collection candidates) + throws OrmException { Set actual = Sets.newTreeSet(); Set done = Sets.newHashSetWithExpectedSize(candidates.size()); Set seen = Sets.newHashSetWithExpectedSize(candidates.size()); @@ -290,14 +281,12 @@ public class GroupCollector { return ObjectId.fromString(group); } catch (IllegalArgumentException e) { // Shouldn't happen; some sort of corruption or manual tinkering? - log.warn("group for commit {} is not a SHA-1: {}", - forCommit.name(), group); + log.warn("group for commit {} is not a SHA-1: {}", forCommit.name(), group); return null; } } - private Iterable resolveGroup(ObjectId forCommit, String group) - throws OrmException { + private Iterable resolveGroup(ObjectId forCommit, String group) throws OrmException { ObjectId id = parseGroup(forCommit, group); if (id != null) { PatchSet.Id psId = Iterables.getFirst(patchSetsBySha.get(id), null); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/GroupList.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/GroupList.java index 880fc0b6b1..5791843975 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/GroupList.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/GroupList.java @@ -17,10 +17,6 @@ package com.google.gerrit.server.git; import com.google.gerrit.common.data.GroupReference; import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gerrit.reviewdb.client.Project; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.util.ArrayList; import java.util.Collection; @@ -28,6 +24,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class GroupList extends TabFile { private static final Logger log = LoggerFactory.getLogger(GroupList.class); @@ -40,11 +38,10 @@ public class GroupList extends TabFile { this.byUUID = byUUID; } - public static GroupList parse(Project.NameKey project, String text, - ValidationError.Sink errors) throws IOException { + public static GroupList parse(Project.NameKey project, String text, ValidationError.Sink errors) + throws IOException { List rows = parse(text, FILE_NAME, TRIM, TRIM, errors); - Map groupsByUUID = - new HashMap<>(rows.size()); + Map groupsByUUID = new HashMap<>(rows.size()); for (Row row : rows) { if (row.left == null) { log.warn("null field in group list for {}:\n{}", project, text); @@ -115,5 +112,4 @@ public class GroupList extends TabFile { public void retainUUIDs(Collection toBeRetained) { byUUID.keySet().retainAll(toBeRetained); } - } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/HackPushNegotiateHook.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/HackPushNegotiateHook.java index 8080419e44..0011994a32 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/HackPushNegotiateHook.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/HackPushNegotiateHook.java @@ -17,7 +17,11 @@ package com.google.gerrit.server.git; import static org.eclipse.jgit.lib.RefDatabase.ALL; import com.google.common.collect.Sets; - +import java.io.IOException; +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import java.util.Set; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Ref; @@ -30,43 +34,32 @@ import org.eclipse.jgit.transport.UploadPack; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.Collection; -import java.util.Collections; -import java.util.Map; -import java.util.Set; - /** * Advertises part of history to git push clients. - *

- * This is a hack to work around the lack of negotiation in the - * send-pack/receive-pack wire protocol. - *

- * When the server is frequently advancing master by creating merge commits, the - * client may not be able to discover a common ancestor during push. Attempting - * to push will re-upload a very large amount of history. This hook hacks in a - * fake negotiation replacement by walking history and sending recent commits as - * {@code ".have"} lines in the wire protocol, allowing the client to find a - * common ancestor. + * + *

This is a hack to work around the lack of negotiation in the send-pack/receive-pack wire + * protocol. + * + *

When the server is frequently advancing master by creating merge commits, the client may not + * be able to discover a common ancestor during push. Attempting to push will re-upload a very large + * amount of history. This hook hacks in a fake negotiation replacement by walking history and + * sending recent commits as {@code ".have"} lines in the wire protocol, allowing the client to find + * a common ancestor. */ public class HackPushNegotiateHook implements AdvertiseRefsHook { - private static final Logger log = LoggerFactory - .getLogger(HackPushNegotiateHook.class); + private static final Logger log = LoggerFactory.getLogger(HackPushNegotiateHook.class); /** Size of an additional ".have" line. */ - private static final int HAVE_LINE_LEN = 4 - + Constants.OBJECT_ID_STRING_LENGTH - + 1 + 5 + 1; + private static final int HAVE_LINE_LEN = 4 + Constants.OBJECT_ID_STRING_LENGTH + 1 + 5 + 1; /** - * Maximum number of bytes to "waste" in the advertisement with a peek at this - * repository's current reachable history. + * Maximum number of bytes to "waste" in the advertisement with a peek at this repository's + * current reachable history. */ private static final int MAX_EXTRA_BYTES = 8192; /** - * Number of recent commits to advertise immediately, hoping to show a client - * a nearby merge base. + * Number of recent commits to advertise immediately, hoping to show a client a nearby merge base. */ private static final int BASE_COMMITS = 64; @@ -78,13 +71,11 @@ public class HackPushNegotiateHook implements AdvertiseRefsHook { @Override public void advertiseRefs(UploadPack us) { - throw new UnsupportedOperationException( - "HackPushNegotiateHook cannot be used for UploadPack"); + throw new UnsupportedOperationException("HackPushNegotiateHook cannot be used for UploadPack"); } @Override - public void advertiseRefs(BaseReceivePack rp) - throws ServiceMayNotContinueException { + public void advertiseRefs(BaseReceivePack rp) throws ServiceMayNotContinueException { Map r = rp.getAdvertisedRefs(); if (r == null) { try { @@ -128,7 +119,7 @@ public class HackPushNegotiateHook implements AdvertiseRefsHook { Set history = Sets.newHashSetWithExpectedSize(max); try { int stepCnt = 0; - for (RevCommit c; history.size() < max && (c = rw.next()) != null;) { + for (RevCommit c; history.size() < max && (c = rw.next()) != null; ) { if (c.getParentCount() <= 1 && !alreadySending.contains(c) && (history.size() < BASE_COMMITS || (++stepCnt % STEP_COMMITS) == 0)) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/InMemoryInserter.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/InMemoryInserter.java index a70c2355c1..9c43bdbebc 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/InMemoryInserter.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/InMemoryInserter.java @@ -17,7 +17,13 @@ package com.google.gerrit.server.git; import static com.google.common.base.Preconditions.checkNotNull; import com.google.common.collect.ImmutableList; - +import java.io.IOException; +import java.io.InputStream; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.lib.AbbreviatedObjectId; import org.eclipse.jgit.lib.AnyObjectId; @@ -28,14 +34,6 @@ import org.eclipse.jgit.lib.ObjectReader; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.transport.PackParser; -import java.io.IOException; -import java.io.InputStream; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Set; - public class InMemoryInserter extends ObjectInserter { private final ObjectReader reader; private final Map inserted = new LinkedHashMap<>(); @@ -52,8 +50,7 @@ public class InMemoryInserter extends ObjectInserter { } @Override - public ObjectId insert(int type, long length, InputStream in) - throws IOException { + public ObjectId insert(int type, long length, InputStream in) throws IOException { return insert(InsertedObject.create(type, in)); } @@ -109,8 +106,7 @@ public class InMemoryInserter extends ObjectInserter { } @Override - public Collection resolve(AbbreviatedObjectId id) - throws IOException { + public Collection resolve(AbbreviatedObjectId id) throws IOException { Set result = new HashSet<>(); for (ObjectId insId : inserted.keySet()) { if (id.prefixCompare(insId) == 0) { @@ -122,8 +118,7 @@ public class InMemoryInserter extends ObjectInserter { } @Override - public ObjectLoader open(AnyObjectId objectId, int typeHint) - throws IOException { + public ObjectLoader open(AnyObjectId objectId, int typeHint) throws IOException { InsertedObject obj = inserted.get(objectId); if (obj == null) { return reader.open(objectId, typeHint); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/InsertedObject.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/InsertedObject.java index 1aee14f6ec..8a766af905 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/InsertedObject.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/InsertedObject.java @@ -16,14 +16,12 @@ package com.google.gerrit.server.git; import com.google.auto.value.AutoValue; import com.google.protobuf.ByteString; - +import java.io.IOException; +import java.io.InputStream; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectInserter; import org.eclipse.jgit.lib.ObjectLoader; -import java.io.IOException; -import java.io.InputStream; - @AutoValue public abstract class InsertedObject { static InsertedObject create(int type, InputStream in) throws IOException { @@ -45,7 +43,9 @@ public abstract class InsertedObject { } public abstract ObjectId id(); + public abstract int type(); + public abstract ByteString data(); ObjectLoader newLoader() { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/LabelNormalizer.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/LabelNormalizer.java index 7832e0b63f..6a05d22671 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/LabelNormalizer.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/LabelNormalizer.java @@ -36,18 +36,16 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.util.Collection; import java.util.List; /** * Normalizes votes on labels according to project config and permissions. - *

- * Votes are recorded in the database for a user based on the state of the - * project at that time: what labels are defined for the project, and what the - * user is allowed to vote on. Both of those can change between the time a vote - * is originally made and a later point, for example when a change is submitted. - * This class normalizes old votes against current project configuration. + * + *

Votes are recorded in the database for a user based on the state of the project at that time: + * what labels are defined for the project, and what the user is allowed to vote on. Both of those + * can change between the time a vote is originally made and a later point, for example when a + * change is submitted. This class normalizes old votes against current project configuration. */ @Singleton public class LabelNormalizer { @@ -65,7 +63,9 @@ public class LabelNormalizer { } public abstract ImmutableList unchanged(); + public abstract ImmutableList updated(); + public abstract ImmutableList deleted(); public Iterable getNormalized() { @@ -90,41 +90,36 @@ public class LabelNormalizer { /** * @param change change containing the given approvals. * @param approvals list of approvals. - * @return copies of approvals normalized to the defined ranges for the label - * type and permissions for the user. Approvals for unknown labels are not - * included in the output, nor are approvals where the user has no - * permissions for that label. + * @return copies of approvals normalized to the defined ranges for the label type and permissions + * for the user. Approvals for unknown labels are not included in the output, nor are + * approvals where the user has no permissions for that label. * @throws OrmException */ public Result normalize(Change change, Collection approvals) throws OrmException { IdentifiedUser user = userFactory.create(change.getOwner()); - return normalize( - changeFactory.controlFor(db.get(), change, user), approvals); + return normalize(changeFactory.controlFor(db.get(), change, user), approvals); } /** * @param ctl change control containing the given approvals. * @param approvals list of approvals. - * @return copies of approvals normalized to the defined ranges for the label - * type and permissions for the user. Approvals for unknown labels are not - * included in the output, nor are approvals where the user has no - * permissions for that label. + * @return copies of approvals normalized to the defined ranges for the label type and permissions + * for the user. Approvals for unknown labels are not included in the output, nor are + * approvals where the user has no permissions for that label. */ - public Result normalize(ChangeControl ctl, - Collection approvals) { - List unchanged = - Lists.newArrayListWithCapacity(approvals.size()); - List updated = - Lists.newArrayListWithCapacity(approvals.size()); - List deleted = - Lists.newArrayListWithCapacity(approvals.size()); + public Result normalize(ChangeControl ctl, Collection approvals) { + List unchanged = Lists.newArrayListWithCapacity(approvals.size()); + List updated = Lists.newArrayListWithCapacity(approvals.size()); + List deleted = Lists.newArrayListWithCapacity(approvals.size()); LabelTypes labelTypes = ctl.getLabelTypes(); for (PatchSetApproval psa : approvals) { Change.Id changeId = psa.getKey().getParentKey().getParentKey(); - checkArgument(changeId.equals(ctl.getId()), + checkArgument( + changeId.equals(ctl.getId()), "Approval %s does not match change %s", - psa.getKey(), ctl.getChange().getKey()); + psa.getKey(), + ctl.getChange().getKey()); if (psa.isLegacySubmit()) { unchanged.add(psa); continue; @@ -151,8 +146,7 @@ public class LabelNormalizer { * @param ctl change control (for any user). * @param lt label type. * @param id account ID. - * @return whether the given account ID has any permissions to vote on this - * label for this change. + * @return whether the given account ID has any permissions to vote on this label for this change. */ public boolean canVote(ChangeControl ctl, LabelType lt, Account.Id id) { return !getRange(ctl, lt, id).isEmpty(); @@ -162,15 +156,13 @@ public class LabelNormalizer { return new PatchSetApproval(src.getPatchSetId(), src); } - private PermissionRange getRange(ChangeControl ctl, LabelType lt, - Account.Id id) { + private PermissionRange getRange(ChangeControl ctl, LabelType lt, Account.Id id) { String permission = Permission.forLabel(lt.getName()); IdentifiedUser user = userFactory.create(id); return ctl.forUser(user).getRange(permission); } - private boolean applyRightFloor(ChangeControl ctl, LabelType lt, - PatchSetApproval a) { + private boolean applyRightFloor(ChangeControl ctl, LabelType lt, PatchSetApproval a) { PermissionRange range = getRange(ctl, lt, a.getAccountId()); if (range.isEmpty()) { return false; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/LargeObjectException.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/LargeObjectException.java index d08b87683e..bcde7f8d72 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/LargeObjectException.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/LargeObjectException.java @@ -16,18 +16,17 @@ package com.google.gerrit.server.git; /** * Wrapper for {@link org.eclipse.jgit.errors.LargeObjectException}. Since - * org.eclipse.jgit.errors.LargeObjectException is a {@link RuntimeException} - * the GerritJsonServlet would treat it as internal failure and as result the - * web ui would just show 'Internal Server Error'. Wrapping - * org.eclipse.jgit.errors.LargeObjectException into a normal {@link Exception} + * org.eclipse.jgit.errors.LargeObjectException is a {@link RuntimeException} the GerritJsonServlet + * would treat it as internal failure and as result the web ui would just show 'Internal Server + * Error'. Wrapping org.eclipse.jgit.errors.LargeObjectException into a normal {@link Exception} * allows to display a proper error message. */ public class LargeObjectException extends Exception { private static final long serialVersionUID = 1L; - public LargeObjectException(final String message, - final org.eclipse.jgit.errors.LargeObjectException cause) { + public LargeObjectException( + final String message, final org.eclipse.jgit.errors.LargeObjectException cause) { super(message, cause); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/LazyPostReceiveHookChain.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/LazyPostReceiveHookChain.java index ebfaae777d..bc12e02b00 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/LazyPostReceiveHookChain.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/LazyPostReceiveHookChain.java @@ -16,13 +16,11 @@ package com.google.gerrit.server.git; import com.google.gerrit.extensions.registration.DynamicSet; import com.google.inject.Inject; - +import java.util.Collection; import org.eclipse.jgit.transport.PostReceiveHook; import org.eclipse.jgit.transport.ReceiveCommand; import org.eclipse.jgit.transport.ReceivePack; -import java.util.Collection; - class LazyPostReceiveHookChain implements PostReceiveHook { private final DynamicSet hooks; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java index dc15a8bde8..592f4a5300 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java @@ -22,21 +22,6 @@ import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.config.SitePaths; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.errors.RepositoryNotFoundException; -import org.eclipse.jgit.lib.Config; -import org.eclipse.jgit.lib.ConfigConstants; -import org.eclipse.jgit.lib.Constants; -import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.lib.RepositoryCache; -import org.eclipse.jgit.lib.RepositoryCache.FileKey; -import org.eclipse.jgit.lib.RepositoryCacheConfig; -import org.eclipse.jgit.lib.StoredConfig; -import org.eclipse.jgit.storage.file.WindowCacheConfig; -import org.eclipse.jgit.util.FS; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.File; import java.io.IOException; import java.nio.file.FileVisitOption; @@ -51,12 +36,24 @@ import java.util.SortedSet; import java.util.TreeSet; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; +import org.eclipse.jgit.errors.RepositoryNotFoundException; +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.lib.ConfigConstants; +import org.eclipse.jgit.lib.Constants; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.lib.RepositoryCache; +import org.eclipse.jgit.lib.RepositoryCache.FileKey; +import org.eclipse.jgit.lib.RepositoryCacheConfig; +import org.eclipse.jgit.lib.StoredConfig; +import org.eclipse.jgit.storage.file.WindowCacheConfig; +import org.eclipse.jgit.util.FS; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** Manages Git repositories stored on the local filesystem. */ @Singleton public class LocalDiskRepositoryManager implements GitRepositoryManager { - private static final Logger log = - LoggerFactory.getLogger(LocalDiskRepositoryManager.class); + private static final Logger log = LoggerFactory.getLogger(LocalDiskRepositoryManager.class); public static class Module extends LifecycleModule { @Override @@ -83,9 +80,11 @@ public class LocalDiskRepositoryManager implements GitRepositoryManager { cfg.fromConfig(serverConfig); if (serverConfig.getString("core", null, "streamFileThreshold") == null) { long mx = Runtime.getRuntime().maxMemory(); - int limit = (int) Math.min( - mx / 4, // don't use more than 1/4 of the heap. - 2047 << 20); // cannot exceed array length + int limit = + (int) + Math.min( + mx / 4, // don't use more than 1/4 of the heap. + 2047 << 20); // cannot exceed array length if ((5 << 20) < limit && limit % (1 << 20) != 0) { // If the limit is at least 5 MiB but is not a whole multiple // of MiB round up to the next one full megabyte. This is a very @@ -101,17 +100,14 @@ public class LocalDiskRepositoryManager implements GitRepositoryManager { } else { desc = String.format("%d", limit); } - log.info(String.format( - "Defaulting core.streamFileThreshold to %s", - desc)); + log.info(String.format("Defaulting core.streamFileThreshold to %s", desc)); cfg.setStreamFileThreshold(limit); } cfg.install(); } @Override - public void stop() { - } + public void stop() {} } private final Path basePath; @@ -119,8 +115,7 @@ public class LocalDiskRepositoryManager implements GitRepositoryManager { private volatile SortedSet names = new TreeSet<>(); @Inject - LocalDiskRepositoryManager(SitePaths site, - @GerritServerConfig Config cfg) { + LocalDiskRepositoryManager(SitePaths site, @GerritServerConfig Config cfg) { basePath = site.resolve(cfg.getString("gerrit", null, "basePath")); if (basePath == null) { throw new IllegalStateException("gerrit.basePath must be configured"); @@ -140,8 +135,7 @@ public class LocalDiskRepositoryManager implements GitRepositoryManager { } @Override - public Repository openRepository(Project.NameKey name) - throws RepositoryNotFoundException { + public Repository openRepository(Project.NameKey name) throws RepositoryNotFoundException { return openRepository(getBasePath(name), name); } @@ -164,11 +158,11 @@ public class LocalDiskRepositoryManager implements GitRepositoryManager { } } else { final File directory = gitDir; - if (FileKey.isGitRepository(new File(directory, Constants.DOT_GIT), - FS.DETECTED)) { + if (FileKey.isGitRepository(new File(directory, Constants.DOT_GIT), FS.DETECTED)) { onCreateProject(name); - } else if (FileKey.isGitRepository(new File(directory.getParentFile(), - directory.getName() + Constants.DOT_GIT_EXT), FS.DETECTED)) { + } else if (FileKey.isGitRepository( + new File(directory.getParentFile(), directory.getName() + Constants.DOT_GIT_EXT), + FS.DETECTED)) { onCreateProject(name); } else { throw new RepositoryNotFoundException(gitDir); @@ -188,8 +182,7 @@ public class LocalDiskRepositoryManager implements GitRepositoryManager { @Override public Repository createRepository(Project.NameKey name) - throws RepositoryNotFoundException, RepositoryCaseMismatchException, - IOException { + throws RepositoryNotFoundException, RepositoryCaseMismatchException, IOException { Path path = getBasePath(name); if (isUnreasonableName(name)) { throw new RepositoryNotFoundException("Invalid name: " + name); @@ -200,8 +193,7 @@ public class LocalDiskRepositoryManager implements GitRepositoryManager { if (dir != null) { // Already exists on disk, use the repository we found. // - Project.NameKey onDiskName = getProjectName( - path, dir.getCanonicalFile().toPath()); + Project.NameKey onDiskName = getProjectName(path, dir.getCanonicalFile().toPath()); onCreateProject(onDiskName); loc = FileKey.exact(dir, FS.DETECTED); @@ -222,20 +214,21 @@ public class LocalDiskRepositoryManager implements GitRepositoryManager { db.create(true /* bare */); StoredConfig config = db.getConfig(); - config.setBoolean(ConfigConstants.CONFIG_CORE_SECTION, - null, ConfigConstants.CONFIG_KEY_LOGALLREFUPDATES, true); + config.setBoolean( + ConfigConstants.CONFIG_CORE_SECTION, + null, + ConfigConstants.CONFIG_KEY_LOGALLREFUPDATES, + true); config.save(); // JGit only writes to the reflog for refs/meta/config if the log file // already exists. // - File metaConfigLog = - new File(db.getDirectory(), "logs/" + RefNames.REFS_CONFIG); - if (!metaConfigLog.getParentFile().mkdirs() - || !metaConfigLog.createNewFile()) { - log.error(String.format( - "Failed to create ref log for %s in repository %s", - RefNames.REFS_CONFIG, name)); + File metaConfigLog = new File(db.getDirectory(), "logs/" + RefNames.REFS_CONFIG); + if (!metaConfigLog.getParentFile().mkdirs() || !metaConfigLog.createNewFile()) { + log.error( + String.format( + "Failed to create ref log for %s in repository %s", RefNames.REFS_CONFIG, name)); } onCreateProject(name); @@ -263,25 +256,25 @@ public class LocalDiskRepositoryManager implements GitRepositoryManager { private boolean isUnreasonableName(final Project.NameKey nameKey) { final String name = nameKey.get(); - return name.length() == 0 // no empty paths - || name.charAt(name.length() - 1) == '/' // no suffix - || name.indexOf('\\') >= 0 // no windows/dos style paths - || name.charAt(0) == '/' // no absolute paths - || new File(name).isAbsolute() // no absolute paths - || name.startsWith("../") // no "l../etc/passwd" - || name.contains("/../") // no "foo/../etc/passwd" - || name.contains("/./") // "foo/./foo" is insane to ask - || name.contains("//") // windows UNC path can be "//..." - || name.contains(".git/") // no path segments that end with '.git' as "foo.git/bar" - || name.contains("?") // common unix wildcard - || name.contains("%") // wildcard or string parameter - || name.contains("*") // wildcard - || name.contains(":") // Could be used for absolute paths in windows? - || name.contains("<") // redirect input - || name.contains(">") // redirect output - || name.contains("|") // pipe - || name.contains("$") // dollar sign - || name.contains("\r"); // carriage return + return name.length() == 0 // no empty paths + || name.charAt(name.length() - 1) == '/' // no suffix + || name.indexOf('\\') >= 0 // no windows/dos style paths + || name.charAt(0) == '/' // no absolute paths + || new File(name).isAbsolute() // no absolute paths + || name.startsWith("../") // no "l../etc/passwd" + || name.contains("/../") // no "foo/../etc/passwd" + || name.contains("/./") // "foo/./foo" is insane to ask + || name.contains("//") // windows UNC path can be "//..." + || name.contains(".git/") // no path segments that end with '.git' as "foo.git/bar" + || name.contains("?") // common unix wildcard + || name.contains("%") // wildcard or string parameter + || name.contains("*") // wildcard + || name.contains(":") // Could be used for absolute paths in windows? + || name.contains("<") // redirect input + || name.contains(">") // redirect output + || name.contains("|") // pipe + || name.contains("$") // dollar sign + || name.contains("\r"); // carriage return } @Override @@ -305,11 +298,13 @@ public class LocalDiskRepositoryManager implements GitRepositoryManager { protected void scanProjects(ProjectVisitor visitor) { try { - Files.walkFileTree(visitor.startFolder, - EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE, visitor); + Files.walkFileTree( + visitor.startFolder, + EnumSet.of(FileVisitOption.FOLLOW_LINKS), + Integer.MAX_VALUE, + visitor); } catch (IOException e) { - log.error("Error walking repository tree " - + visitor.startFolder.toAbsolutePath(), e); + log.error("Error walking repository tree " + visitor.startFolder.toAbsolutePath(), e); } } @@ -338,8 +333,8 @@ public class LocalDiskRepositoryManager implements GitRepositoryManager { } @Override - public FileVisitResult preVisitDirectory(Path dir, - BasicFileAttributes attrs) throws IOException { + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) + throws IOException { if (!dir.equals(startFolder) && isRepo(dir)) { addProject(dir); return FileVisitResult.SKIP_SUBTREE; @@ -358,8 +353,7 @@ public class LocalDiskRepositoryManager implements GitRepositoryManager { Project.NameKey nameKey = getProjectName(startFolder, p); if (getBasePath(nameKey).equals(startFolder)) { if (isUnreasonableName(nameKey)) { - log.warn( - "Ignoring unreasonably named repository " + p.toAbsolutePath()); + log.warn("Ignoring unreasonably named repository " + p.toAbsolutePath()); } else { found.add(nameKey); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeIdenticalTreeException.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeIdenticalTreeException.java index dd6b717f1e..cee08d4cb5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeIdenticalTreeException.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeIdenticalTreeException.java @@ -17,8 +17,8 @@ package com.google.gerrit.server.git; import com.google.gerrit.extensions.restapi.RestApiException; /** - * Indicates that the commit is already contained in destination branch. - * Either the commit itself is in the source tree, or the content is merged + * Indicates that the commit is already contained in destination branch. Either the commit itself is + * in the source tree, or the content is merged */ public class MergeIdenticalTreeException extends RestApiException { private static final long serialVersionUID = 1L; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java index 55b236af3b..3da17a4d8e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java @@ -65,15 +65,6 @@ import com.google.gerrit.server.query.change.InternalChangeQuery; import com.google.gerrit.server.util.RequestId; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - -import org.eclipse.jgit.errors.IncorrectObjectTypeException; -import org.eclipse.jgit.lib.Constants; -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.Ref; -import org.eclipse.jgit.revwalk.RevCommit; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.sql.Timestamp; import java.util.ArrayList; @@ -85,26 +76,29 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import org.eclipse.jgit.errors.IncorrectObjectTypeException; +import org.eclipse.jgit.lib.Constants; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.revwalk.RevCommit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Merges changes in submission order into a single branch. - *

- * Branches are reduced to the minimum number of heads needed to merge - * everything. This allows commits to be entered into the queue in any order - * (such as ancestors before descendants) and only the most recent commit on any - * line of development will be merged. All unmerged commits along a line of - * development must be in the submission queue in order to merge the tip of that - * line. - *

- * Conflicts are handled by discarding the entire line of development and - * marking it as conflicting, even if an earlier commit along that same line can - * be merged cleanly. + * + *

Branches are reduced to the minimum number of heads needed to merge everything. This allows + * commits to be entered into the queue in any order (such as ancestors before descendants) and only + * the most recent commit on any line of development will be merged. All unmerged commits along a + * line of development must be in the submission queue in order to merge the tip of that line. + * + *

Conflicts are handled by discarding the entire line of development and marking it as + * conflicting, even if an earlier commit along that same line can be merged cleanly. */ public class MergeOp implements AutoCloseable { private static final Logger log = LoggerFactory.getLogger(MergeOp.class); - private static final SubmitRuleOptions SUBMIT_RULE_OPTIONS = - SubmitRuleOptions.defaults().build(); + private static final SubmitRuleOptions SUBMIT_RULE_OPTIONS = SubmitRuleOptions.defaults().build(); public static class CommitStatus { private final ImmutableMap changes; @@ -113,20 +107,16 @@ public class MergeOp implements AutoCloseable { private final ListMultimap problems; private CommitStatus(ChangeSet cs) throws OrmException { - checkArgument(!cs.furtherHiddenChanges(), - "CommitStatus must not be called with hidden changes"); + checkArgument( + !cs.furtherHiddenChanges(), "CommitStatus must not be called with hidden changes"); changes = cs.changesById(); - ImmutableSetMultimap.Builder bb = - ImmutableSetMultimap.builder(); + ImmutableSetMultimap.Builder bb = ImmutableSetMultimap.builder(); for (ChangeData cd : cs.changes()) { bb.put(cd.change().getDest(), cd.getId()); } byBranch = bb.build(); commits = new HashMap<>(); - problems = MultimapBuilder - .treeKeys(comparing(Change.Id::get)) - .arrayListValues(1) - .build(); + problems = MultimapBuilder.treeKeys(comparing(Change.Id::get)).arrayListValues(1).build(); } public ImmutableSet getChangeIds() { @@ -178,7 +168,8 @@ public class MergeOp implements AutoCloseable { // However, do NOT expose that ChangeData directly, as it is way out of // date by this point. ChangeData cd = checkNotNull(changes.get(id), "ChangeData for %s", id); - return checkNotNull(cd.getSubmitRecords(SUBMIT_RULE_OPTIONS), + return checkNotNull( + cd.getSubmitRecords(SUBMIT_RULE_OPTIONS), "getSubmitRecord only valid after submit rules are evalutated"); } @@ -186,9 +177,12 @@ public class MergeOp implements AutoCloseable { if (isOk()) { return; } - String msg = "Failed to submit " + changes.size() + " change" - + (changes.size() > 1 ? "s" : "") - + " due to the following problems:\n"; + String msg = + "Failed to submit " + + changes.size() + + " change" + + (changes.size() > 1 ? "s" : "") + + " due to the following problems:\n"; List ps = new ArrayList<>(problems.keySet().size()); for (Change.Id id : problems.keySet()) { ps.add("Change " + id + ": " + Joiner.on("; ").join(problems.get(id))); @@ -234,7 +228,8 @@ public class MergeOp implements AutoCloseable { private boolean dryrun; @Inject - MergeOp(ChangeMessagesUtil cmUtil, + MergeOp( + ChangeMessagesUtil cmUtil, BatchUpdate.Factory batchUpdateFactory, InternalUser.Factory internalUserFactory, MergeSuperSet mergeSuperSet, @@ -261,24 +256,20 @@ public class MergeOp implements AutoCloseable { orm.close(); } - public static void checkSubmitRule(ChangeData cd) - throws ResourceConflictException, OrmException { + public static void checkSubmitRule(ChangeData cd) throws ResourceConflictException, OrmException { PatchSet patchSet = cd.currentPatchSet(); if (patchSet == null) { - throw new ResourceConflictException( - "missing current patch set for change " + cd.getId()); + throw new ResourceConflictException("missing current patch set for change " + cd.getId()); } List results = getSubmitRecords(cd); if (SubmitRecord.findOkRecord(results).isPresent()) { // Rules supplied a valid solution. return; } else if (results.isEmpty()) { - throw new IllegalStateException(String.format( - "SubmitRuleEvaluator.evaluate for change %s " + - "returned empty list for %s in %s", - cd.getId(), - patchSet.getId(), - cd.change().getProject().get())); + throw new IllegalStateException( + String.format( + "SubmitRuleEvaluator.evaluate for change %s " + "returned empty list for %s in %s", + cd.getId(), patchSet.getId(), cd.change().getProject().get())); } for (SubmitRecord record : results) { @@ -287,33 +278,29 @@ public class MergeOp implements AutoCloseable { throw new ResourceConflictException("change is closed"); case RULE_ERROR: - throw new ResourceConflictException( - "submit rule error: " + record.errorMessage); + throw new ResourceConflictException("submit rule error: " + record.errorMessage); case NOT_READY: - throw new ResourceConflictException( - describeLabels(cd, record.labels)); + throw new ResourceConflictException(describeLabels(cd, record.labels)); case FORCED: case OK: default: - throw new IllegalStateException(String.format( - "Unexpected SubmitRecord status %s for %s in %s", - record.status, - patchSet.getId().getId(), - cd.change().getProject().get())); + throw new IllegalStateException( + String.format( + "Unexpected SubmitRecord status %s for %s in %s", + record.status, patchSet.getId().getId(), cd.change().getProject().get())); } } throw new IllegalStateException(); } - private static List getSubmitRecords(ChangeData cd) - throws OrmException { + private static List getSubmitRecords(ChangeData cd) throws OrmException { return cd.submitRecords(SUBMIT_RULE_OPTIONS); } - private static String describeLabels(ChangeData cd, - List labels) throws OrmException { + private static String describeLabels(ChangeData cd, List labels) + throws OrmException { List labelResults = new ArrayList<>(); for (SubmitRecord.Label lbl : labels) { switch (lbl.status) { @@ -330,30 +317,28 @@ public class MergeOp implements AutoCloseable { break; case IMPOSSIBLE: - labelResults.add( - "needs " + lbl.label + " (check project access)"); + labelResults.add("needs " + lbl.label + " (check project access)"); break; default: - throw new IllegalStateException(String.format( - "Unsupported SubmitRecord.Label %s for %s in %s", - lbl, - cd.change().currentPatchSetId(), - cd.change().getProject())); + throw new IllegalStateException( + String.format( + "Unsupported SubmitRecord.Label %s for %s in %s", + lbl, cd.change().currentPatchSetId(), cd.change().getProject())); } } return Joiner.on("; ").join(labelResults); } - private void checkSubmitRulesAndState(ChangeSet cs) - throws ResourceConflictException { - checkArgument(!cs.furtherHiddenChanges(), - "checkSubmitRulesAndState called for topic with hidden change"); + private void checkSubmitRulesAndState(ChangeSet cs) throws ResourceConflictException { + checkArgument( + !cs.furtherHiddenChanges(), "checkSubmitRulesAndState called for topic with hidden change"); for (ChangeData cd : cs.changes()) { try { if (cd.change().getStatus() != Change.Status.NEW) { - commitStatus.problem(cd.getId(), "Change " + cd.getId() + " is " - + cd.change().getStatus().toString().toLowerCase()); + commitStatus.problem( + cd.getId(), + "Change " + cd.getId() + " is " + cd.change().getStatus().toString().toLowerCase()); } else { checkSubmitRule(cd); } @@ -369,8 +354,8 @@ public class MergeOp implements AutoCloseable { } private void bypassSubmitRules(ChangeSet cs) { - checkArgument(!cs.furtherHiddenChanges(), - "cannot bypass submit rules for topic with hidden change"); + checkArgument( + !cs.furtherHiddenChanges(), "cannot bypass submit rules for topic with hidden change"); for (ChangeData cd : cs.changes()) { List records; try { @@ -389,9 +374,9 @@ public class MergeOp implements AutoCloseable { /** * Merges the given change. * - * Depending on the server configuration, more changes may be affected, e.g. - * by submission of a topic or via superproject subscriptions. All affected - * changes are integrated using the projects integration strategy. + *

Depending on the server configuration, more changes may be affected, e.g. by submission of a + * topic or via superproject subscriptions. All affected changes are integrated using the projects + * integration strategy. * * @param db the review database. * @param change the change to be merged. @@ -401,12 +386,16 @@ public class MergeOp implements AutoCloseable { * @throws OrmException an error occurred reading or writing the database. * @throws RestApiException if an error occurred. */ - public void merge(ReviewDb db, Change change, IdentifiedUser caller, - boolean checkSubmitRules, SubmitInput submitInput, boolean dryrun) + public void merge( + ReviewDb db, + Change change, + IdentifiedUser caller, + boolean checkSubmitRules, + SubmitInput submitInput, + boolean dryrun) throws OrmException, RestApiException { this.submitInput = submitInput; - this.accountsToNotify = - notifyUtil.resolveAccounts(submitInput.notifyDetails); + this.accountsToNotify = notifyUtil.resolveAccounts(submitInput.notifyDetails); this.dryrun = dryrun; this.caller = caller; this.ts = TimeUtil.nowTs(); @@ -416,13 +405,12 @@ public class MergeOp implements AutoCloseable { logDebug("Beginning integration of {}", change); try { - ChangeSet cs = mergeSuperSet.setMergeOpRepoManager(orm) - .completeChangeSet(db, change, caller); - checkState(cs.ids().contains(change.getId()), - "change %s missing from %s", change.getId(), cs); + ChangeSet cs = mergeSuperSet.setMergeOpRepoManager(orm).completeChangeSet(db, change, caller); + checkState( + cs.ids().contains(change.getId()), "change %s missing from %s", change.getId(), cs); if (cs.furtherHiddenChanges()) { - throw new AuthException("A change to be submitted with " - + change.getId() + " is not visible"); + throw new AuthException( + "A change to be submitted with " + change.getId() + " is not visible"); } this.commitStatus = new CommitStatus(cs); MergeSuperSet.reloadChanges(cs); @@ -446,10 +434,8 @@ public class MergeOp implements AutoCloseable { } } - private void integrateIntoHistory(ChangeSet cs) - throws IntegrationException, RestApiException { - checkArgument(!cs.furtherHiddenChanges(), - "cannot integrate hidden changes into history"); + private void integrateIntoHistory(ChangeSet cs) throws IntegrationException, RestApiException { + checkArgument(!cs.furtherHiddenChanges(), "cannot integrate hidden changes into history"); logDebug("Beginning merge attempt on {}", cs); Map toSubmit = new HashMap<>(); @@ -470,12 +456,13 @@ public class MergeOp implements AutoCloseable { commitStatus.maybeFailVerbose(); SubmoduleOp submoduleOp = subOpFactory.create(branches, orm); try { - List strategies = getSubmitStrategies(toSubmit, - submoduleOp, dryrun); + List strategies = getSubmitStrategies(toSubmit, submoduleOp, dryrun); this.allProjects = submoduleOp.getProjectsInOrder(); - BatchUpdate.execute(orm.batchUpdates(allProjects), + BatchUpdate.execute( + orm.batchUpdates(allProjects), new SubmitStrategyListener(submitInput, strategies, commitStatus), - submissionId, dryrun); + submissionId, + dryrun); } catch (SubmoduleException e) { throw new IntegrationException(e); } catch (UpdateException e) { @@ -505,32 +492,51 @@ public class MergeOp implements AutoCloseable { } private List getSubmitStrategies( - Map toSubmit, SubmoduleOp submoduleOp, - boolean dryrun) throws IntegrationException { + Map toSubmit, SubmoduleOp submoduleOp, boolean dryrun) + throws IntegrationException { List strategies = new ArrayList<>(); Set allBranches = submoduleOp.getBranchesInOrder(); Set allCommits = - toSubmit.values().stream().map(BranchBatch::commits) - .flatMap(Set::stream).collect(Collectors.toSet()); + toSubmit + .values() + .stream() + .map(BranchBatch::commits) + .flatMap(Set::stream) + .collect(Collectors.toSet()); for (Branch.NameKey branch : allBranches) { OpenRepo or = orm.getRepo(branch.getParentKey()); if (toSubmit.containsKey(branch)) { BranchBatch submitting = toSubmit.get(branch); OpenBranch ob = or.getBranch(branch); - checkNotNull(submitting.submitType(), + checkNotNull( + submitting.submitType(), "null submit type for %s; expected to previously fail fast", submitting); Set commitsToSubmit = submitting.commits(); ob.mergeTip = new MergeTip(ob.oldTip, commitsToSubmit); - SubmitStrategy strategy = submitStrategyFactory - .create(submitting.submitType(), db, or.repo, or.rw, or.ins, - or.canMergeFlag, getAlreadyAccepted(or, ob.oldTip), allCommits, - branch, caller, ob.mergeTip, commitStatus, submissionId, - submitInput.notify, accountsToNotify, submoduleOp, dryrun); + SubmitStrategy strategy = + submitStrategyFactory.create( + submitting.submitType(), + db, + or.repo, + or.rw, + or.ins, + or.canMergeFlag, + getAlreadyAccepted(or, ob.oldTip), + allCommits, + branch, + caller, + ob.mergeTip, + commitStatus, + submissionId, + submitInput.notify, + accountsToNotify, + submoduleOp, + dryrun); strategies.add(strategy); strategy.addOps(or.getUpdate(), commitsToSubmit); - if (submitting.submitType().equals(SubmitType.FAST_FORWARD_ONLY) && - submoduleOp.hasSubscription(branch)) { + if (submitting.submitType().equals(SubmitType.FAST_FORWARD_ONLY) + && submoduleOp.hasSubscription(branch)) { submoduleOp.addOp(or.getUpdate(), branch); } } else { @@ -542,8 +548,8 @@ public class MergeOp implements AutoCloseable { return strategies; } - private Set getAlreadyAccepted(OpenRepo or, - CodeReviewCommit branchTip) throws IntegrationException { + private Set getAlreadyAccepted(OpenRepo or, CodeReviewCommit branchTip) + throws IntegrationException { Set alreadyAccepted = new HashSet<>(); if (branchTip != null) { @@ -551,8 +557,7 @@ public class MergeOp implements AutoCloseable { } try { - for (Ref r : or.repo.getRefDatabase().getRefs(Constants.R_HEADS) - .values()) { + for (Ref r : or.repo.getRefDatabase().getRefs(Constants.R_HEADS).values()) { try { CodeReviewCommit aac = or.rw.parseCommit(r.getObjectId()); if (!commitStatus.commits.values().contains(aac)) { @@ -563,8 +568,7 @@ public class MergeOp implements AutoCloseable { } } } catch (IOException e) { - throw new IntegrationException( - "Failed to determine already accepted commits.", e); + throw new IntegrationException("Failed to determine already accepted commits.", e); } logDebug("Found {} existing heads", alreadyAccepted.size()); @@ -573,12 +577,14 @@ public class MergeOp implements AutoCloseable { @AutoValue abstract static class BranchBatch { - @Nullable abstract SubmitType submitType(); + @Nullable + abstract SubmitType submitType(); + abstract Set commits(); } - private BranchBatch validateChangeList(OpenRepo or, - Collection submitted) throws IntegrationException { + private BranchBatch validateChangeList(OpenRepo or, Collection submitted) + throws IntegrationException { logDebug("Validating {} changes", submitted.size()); Set toSubmit = new LinkedHashSet<>(submitted.size()); SetMultimap revisions = getRevisions(or, submitted); @@ -606,10 +612,12 @@ public class MergeOp implements AutoCloseable { submitType = st; choseSubmitTypeFrom = cd; } else if (st != submitType) { - commitStatus.problem(changeId, String.format( - "Change has submit type %s, but previously chose submit type %s " - + "from change %s in the same batch", - st, submitType, choseSubmitTypeFrom.getId())); + commitStatus.problem( + changeId, + String.format( + "Change has submit type %s, but previously chose submit type %s " + + "from change %s in the same batch", + st, submitType, choseSubmitTypeFrom.getId())); continue; } if (chg.currentPatchSetId() == null) { @@ -627,8 +635,7 @@ public class MergeOp implements AutoCloseable { commitStatus.logProblem(changeId, e); continue; } - if (ps == null || ps.getRevision() == null - || ps.getRevision().get() == null) { + if (ps == null || ps.getRevision() == null || ps.getRevision().get() == null) { commitStatus.logProblem(changeId, "Missing patch set or revision on change"); continue; } @@ -647,9 +654,15 @@ public class MergeOp implements AutoCloseable { // want to merge the issue. We can't safely do that if the // tip is not reachable. // - commitStatus.logProblem(changeId, "Revision " + idstr + " of patch set " - + ps.getPatchSetId() + " does not match " + ps.getId().toRefName() - + " for change"); + commitStatus.logProblem( + changeId, + "Revision " + + idstr + + " of patch set " + + ps.getPatchSetId() + + " does not match " + + ps.getId().toRefName() + + " for change"); continue; } @@ -681,8 +694,8 @@ public class MergeOp implements AutoCloseable { return new AutoValue_MergeOp_BranchBatch(submitType, toSubmit); } - private SetMultimap getRevisions(OpenRepo or, - Collection cds) throws IntegrationException { + private SetMultimap getRevisions(OpenRepo or, Collection cds) + throws IntegrationException { try { List refNames = new ArrayList<>(cds.size()); for (ChangeData cd : cds) { @@ -693,10 +706,12 @@ public class MergeOp implements AutoCloseable { } SetMultimap revisions = MultimapBuilder.hashKeys(cds.size()).hashSetValues(1).build(); - for (Map.Entry e : or.repo.getRefDatabase().exactRef( - refNames.toArray(new String[refNames.size()])).entrySet()) { - revisions.put( - e.getValue().getObjectId(), PatchSet.Id.fromRef(e.getKey())); + for (Map.Entry e : + or.repo + .getRefDatabase() + .exactRef(refNames.toArray(new String[refNames.size()])) + .entrySet()) { + revisions.put(e.getValue().getObjectId(), PatchSet.Id.fromRef(e.getKey())); } return revisions; } catch (IOException | OrmException e) { @@ -714,13 +729,11 @@ public class MergeOp implements AutoCloseable { } } - private OpenRepo openRepo(Project.NameKey project) - throws IntegrationException { + private OpenRepo openRepo(Project.NameKey project) throws IntegrationException { try { return orm.openRepo(project); } catch (NoSuchProjectException noProject) { - logWarn("Project " + noProject.project() + " no longer exists, " - + "abandoning open changes"); + logWarn("Project " + noProject.project() + " no longer exists, " + "abandoning open changes"); abandonAllOpenChangeForDeletedProject(noProject.project()); } catch (IOException e) { throw new IntegrationException("Error opening project " + project, e); @@ -728,39 +741,41 @@ public class MergeOp implements AutoCloseable { return null; } - private void abandonAllOpenChangeForDeletedProject( - Project.NameKey destProject) { + private void abandonAllOpenChangeForDeletedProject(Project.NameKey destProject) { try { for (ChangeData cd : internalChangeQuery.byProjectOpen(destProject)) { - try (BatchUpdate bu = batchUpdateFactory.create(db, destProject, - internalUserFactory.create(), ts)) { + try (BatchUpdate bu = + batchUpdateFactory.create(db, destProject, internalUserFactory.create(), ts)) { bu.setRequestId(submissionId); - bu.addOp(cd.getId(), new BatchUpdate.Op() { - @Override - public boolean updateChange(ChangeContext ctx) throws OrmException { - Change change = ctx.getChange(); - if (!change.getStatus().isOpen()) { - return false; - } + bu.addOp( + cd.getId(), + new BatchUpdate.Op() { + @Override + public boolean updateChange(ChangeContext ctx) throws OrmException { + Change change = ctx.getChange(); + if (!change.getStatus().isOpen()) { + return false; + } - change.setStatus(Change.Status.ABANDONED); + change.setStatus(Change.Status.ABANDONED); - ChangeMessage msg = ChangeMessagesUtil.newMessage( - change.currentPatchSetId(), - internalUserFactory.create(), change.getLastUpdatedOn(), - ChangeMessagesUtil.TAG_MERGED, - "Project was deleted."); - cmUtil.addChangeMessage(ctx.getDb(), - ctx.getUpdate(change.currentPatchSetId()), msg); + ChangeMessage msg = + ChangeMessagesUtil.newMessage( + change.currentPatchSetId(), + internalUserFactory.create(), + change.getLastUpdatedOn(), + ChangeMessagesUtil.TAG_MERGED, + "Project was deleted."); + cmUtil.addChangeMessage( + ctx.getDb(), ctx.getUpdate(change.currentPatchSetId()), msg); - return true; - } - }); + return true; + } + }); try { bu.execute(); } catch (UpdateException | RestApiException e) { - logWarn("Cannot abandon changes for deleted project " + destProject, - e); + logWarn("Cannot abandon changes for deleted project " + destProject, e); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOpRepoManager.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOpRepoManager.java index 1244ad39cc..97ac2653f4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOpRepoManager.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOpRepoManager.java @@ -28,7 +28,14 @@ import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.project.ProjectState; import com.google.gerrit.server.util.RequestId; import com.google.inject.Inject; - +import java.io.IOException; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectInserter; @@ -38,21 +45,11 @@ import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevFlag; import org.eclipse.jgit.revwalk.RevSort; -import java.io.IOException; -import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; - /** * This is a helper class for MergeOp and not intended for general use. * - * Some database backends require to open a repository just once within - * a transaction of a submission, this caches open repositories to satisfy - * that requirement. + *

Some database backends require to open a repository just once within a transaction of a + * submission, this caches open repositories to satisfy that requirement. */ public class MergeOpRepoManager implements AutoCloseable { public class OpenRepo { @@ -106,17 +103,19 @@ public class MergeOpRepoManager implements AutoCloseable { public BatchUpdate getUpdate() { checkState(db != null, "call setContext before getUpdate"); if (update == null) { - update = batchUpdateFactory.create(db, getProjectName(), caller, ts) - .setRepository(repo, rw, ins) - .setRequestId(submissionId) - .setOnSubmitValidators(onSubmitValidatorsFactory.create()); + update = + batchUpdateFactory + .create(db, getProjectName(), caller, ts) + .setRepository(repo, rw, ins) + .setRequestId(submissionId) + .setOnSubmitValidators(onSubmitValidatorsFactory.create()); } return update; } /** - * Make sure the update has already executed before reset it. - * TODO:czhen Have a flag in BatchUpdate to mark if it has been executed + * Make sure the update has already executed before reset it. TODO:czhen Have a flag in + * BatchUpdate to mark if it has been executed */ void resetUpdate() { update = null; @@ -147,8 +146,8 @@ public class MergeOpRepoManager implements AutoCloseable { oldTip = null; update.setExpectedOldObjectId(ObjectId.zeroId()); } else { - throw new IntegrationException("The destination branch " - + name + " does not exist anymore."); + throw new IntegrationException( + "The destination branch " + name + " does not exist anymore."); } } catch (IOException e) { throw new IntegrationException("Cannot open branch " + name, e); @@ -156,7 +155,6 @@ public class MergeOpRepoManager implements AutoCloseable { } } - private final Map openRepos; private final BatchUpdate.Factory batchUpdateFactory; private final OnSubmitValidators.Factory onSubmitValidatorsFactory; @@ -182,8 +180,7 @@ public class MergeOpRepoManager implements AutoCloseable { openRepos = new HashMap<>(); } - void setContext(ReviewDb db, Timestamp ts, IdentifiedUser caller, - RequestId submissionId) { + void setContext(ReviewDb db, Timestamp ts, IdentifiedUser caller, RequestId submissionId) { this.db = db; this.ts = ts; this.caller = caller; @@ -200,8 +197,7 @@ public class MergeOpRepoManager implements AutoCloseable { return or; } - public OpenRepo openRepo(Project.NameKey project) - throws NoSuchProjectException, IOException { + public OpenRepo openRepo(Project.NameKey project) throws NoSuchProjectException, IOException { if (openRepos.containsKey(project)) { return openRepos.get(project); } @@ -211,8 +207,7 @@ public class MergeOpRepoManager implements AutoCloseable { throw new NoSuchProjectException(project); } try { - OpenRepo or = - new OpenRepo(repoManager.openRepository(project), projectState); + OpenRepo or = new OpenRepo(repoManager.openRepository(project), projectState); openRepos.put(project, or); return or; } catch (RepositoryNotFoundException e) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeSorter.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeSorter.java index 059a23e56a..78fc49563e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeSorter.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeSorter.java @@ -16,36 +16,33 @@ package com.google.gerrit.server.git; import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk; import com.google.gerrit.server.git.strategy.CommitMergeStatus; - -import org.eclipse.jgit.revwalk.RevCommit; -import org.eclipse.jgit.revwalk.RevCommitList; -import org.eclipse.jgit.revwalk.RevFlag; - import java.io.IOException; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.Set; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.revwalk.RevCommitList; +import org.eclipse.jgit.revwalk.RevFlag; public class MergeSorter { private final CodeReviewRevWalk rw; private final RevFlag canMergeFlag; private final Set accepted; - public MergeSorter(CodeReviewRevWalk rw, Set alreadyAccepted, - RevFlag canMergeFlag) { + public MergeSorter(CodeReviewRevWalk rw, Set alreadyAccepted, RevFlag canMergeFlag) { this.rw = rw; this.canMergeFlag = canMergeFlag; this.accepted = alreadyAccepted; } - Collection sort(final Collection toMerge) - throws IOException { + Collection sort(final Collection toMerge) throws IOException { return sort(toMerge, toMerge); } - Collection sort(final Collection toMerge, - final Collection incoming) throws IOException { + Collection sort( + final Collection toMerge, final Collection incoming) + throws IOException { final Set heads = new HashSet<>(); final Set sort = new HashSet<>(toMerge); while (!sort.isEmpty()) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeSuperSet.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeSuperSet.java index 751933cf85..cdbe9cf2ac 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeSuperSet.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeSuperSet.java @@ -43,15 +43,6 @@ import com.google.gerrit.server.query.change.InternalChangeQuery; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - -import org.eclipse.jgit.lib.Config; -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.Ref; -import org.eclipse.jgit.revwalk.RevCommit; -import org.eclipse.jgit.revwalk.RevSort; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.util.ArrayList; import java.util.Collection; @@ -62,16 +53,23 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.revwalk.RevSort; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Calculates the minimal superset of changes required to be merged. - *

- * This includes all parents between a change and the tip of its target - * branch for the merging/rebasing submit strategies. For the cherry-pick - * strategy no additional changes are included. - *

- * If change.submitWholeTopic is enabled, also all changes of the topic - * and their parents are included. + * + *

This includes all parents between a change and the tip of its target branch for the + * merging/rebasing submit strategies. For the cherry-pick strategy no additional changes are + * included. + * + *

If change.submitWholeTopic is enabled, also all changes of the topic and their parents are + * included. */ public class MergeSuperSet { private static final Logger log = LoggerFactory.getLogger(MergeOp.class); @@ -87,13 +85,12 @@ public class MergeSuperSet { @AutoValue abstract static class QueryKey { - private static QueryKey create( - Branch.NameKey branch, Iterable hashes) { - return new AutoValue_MergeSuperSet_QueryKey( - branch, ImmutableSet.copyOf(hashes)); + private static QueryKey create(Branch.NameKey branch, Iterable hashes) { + return new AutoValue_MergeSuperSet_QueryKey(branch, ImmutableSet.copyOf(hashes)); } abstract Branch.NameKey branch(); + abstract ImmutableSet hashes(); } @@ -108,7 +105,8 @@ public class MergeSuperSet { private boolean closeOrm; @Inject - MergeSuperSet(@GerritServerConfig Config cfg, + MergeSuperSet( + @GerritServerConfig Config cfg, ChangeData.Factory changeDataFactory, Provider queryProvider, Provider repoManagerProvider) { @@ -127,11 +125,10 @@ public class MergeSuperSet { return this; } - public ChangeSet completeChangeSet(ReviewDb db, Change change, - CurrentUser user) throws IOException, OrmException { + public ChangeSet completeChangeSet(ReviewDb db, Change change, CurrentUser user) + throws IOException, OrmException { try { - ChangeData cd = - changeDataFactory.create(db, change.getProject(), change.getId()); + ChangeData cd = changeDataFactory.create(db, change.getProject(), change.getId()); cd.changeControl(user); ChangeSet cs = new ChangeSet(cd, cd.changeControl().isVisible(db, cd)); if (Submit.wholeTopicEnabled(cfg)) { @@ -146,8 +143,7 @@ public class MergeSuperSet { } } - private SubmitType submitType(ChangeData cd, PatchSet ps, boolean visible) - throws OrmException { + private SubmitType submitType(ChangeData cd, PatchSet ps, boolean visible) throws OrmException { // Submit type prolog rules mean that the submit type can depend on the // submitting user and the content of the change. // @@ -167,14 +163,13 @@ public class MergeSuperSet { ? cd.submitTypeRecord() : new SubmitRuleEvaluator(cd).setPatchSet(ps).getSubmitType(); if (!str.isOk()) { - logErrorAndThrow("Failed to get submit type for " + cd.getId() - + ": " + str.errorMessage); + logErrorAndThrow("Failed to get submit type for " + cd.getId() + ": " + str.errorMessage); } return str.type; } - private static ImmutableListMultimap - byBranch(Iterable changes) throws OrmException { + private static ImmutableListMultimap byBranch( + Iterable changes) throws OrmException { ImmutableListMultimap.Builder builder = ImmutableListMultimap.builder(); for (ChangeData cd : changes) { @@ -183,8 +178,8 @@ public class MergeSuperSet { return builder.build(); } - private Set walkChangesByHashes(Collection sourceCommits, - Set ignoreHashes, OpenRepo or, Branch.NameKey b) + private Set walkChangesByHashes( + Collection sourceCommits, Set ignoreHashes, OpenRepo or, Branch.NameKey b) throws IOException { Set destHashes = new HashSet<>(); or.rw.reset(); @@ -208,21 +203,22 @@ public class MergeSuperSet { return destHashes; } - private ChangeSet completeChangeSetWithoutTopic(ReviewDb db, - ChangeSet changes, CurrentUser user) throws IOException, OrmException { + private ChangeSet completeChangeSetWithoutTopic(ReviewDb db, ChangeSet changes, CurrentUser user) + throws IOException, OrmException { Collection visibleChanges = new ArrayList<>(); Collection nonVisibleChanges = new ArrayList<>(); // For each target branch we run a separate rev walk to find open changes // reachable from changes already in the merge super set. - ImmutableListMultimap bc = byBranch( - Iterables.concat(changes.changes(), changes.nonVisibleChanges())); + ImmutableListMultimap bc = + byBranch(Iterables.concat(changes.changes(), changes.nonVisibleChanges())); for (Branch.NameKey b : bc.keySet()) { OpenRepo or = getRepo(b.getParentKey()); List visibleCommits = new ArrayList<>(); List nonVisibleCommits = new ArrayList<>(); for (ChangeData cd : bc.get(b)) { - checkState(cd.hasChangeControl(), + checkState( + cd.hasChangeControl(), "completeChangeSet forgot to set changeControl for current user" + " at ChangeData creation time"); @@ -233,8 +229,7 @@ public class MergeSuperSet { // completeChangeSet computation, for example. visible = false; } - Collection toWalk = visible ? - visibleCommits : nonVisibleCommits; + Collection toWalk = visible ? visibleCommits : nonVisibleCommits; // Pick a revision to use for traversal. If any of the patch sets // is visible, we use the most recent one. Otherwise, use the current @@ -271,20 +266,17 @@ public class MergeSuperSet { } Set emptySet = Collections.emptySet(); - Set visibleHashes = - walkChangesByHashes(visibleCommits, emptySet, or, b); + Set visibleHashes = walkChangesByHashes(visibleCommits, emptySet, or, b); - List cds = - byCommitsOnBranchNotMerged(or, db, user, b, visibleHashes); + List cds = byCommitsOnBranchNotMerged(or, db, user, b, visibleHashes); for (ChangeData chd : cds) { chd.changeControl(user); visibleChanges.add(chd); } - Set nonVisibleHashes = - walkChangesByHashes(nonVisibleCommits, visibleHashes, or, b); - Iterables.addAll(nonVisibleChanges, - byCommitsOnBranchNotMerged(or, db, user, b, nonVisibleHashes)); + Set nonVisibleHashes = walkChangesByHashes(nonVisibleCommits, visibleHashes, or, b); + Iterables.addAll( + nonVisibleChanges, byCommitsOnBranchNotMerged(or, db, user, b, nonVisibleHashes)); } return new ChangeSet(visibleChanges, nonVisibleChanges); @@ -304,14 +296,11 @@ public class MergeSuperSet { } } - private void markHeadUninteresting(OpenRepo or, Branch.NameKey b) - throws IOException { + private void markHeadUninteresting(OpenRepo or, Branch.NameKey b) throws IOException { Optional head = heads.get(b); if (head == null) { Ref ref = or.repo.getRefDatabase().exactRef(b.get()); - head = ref != null - ? Optional.of(or.rw.parseCommit(ref.getObjectId())) - : Optional.empty(); + head = ref != null ? Optional.of(or.rw.parseCommit(ref.getObjectId())) : Optional.empty(); heads.put(b, head); } if (head.isPresent()) { @@ -319,8 +308,8 @@ public class MergeSuperSet { } } - private List byCommitsOnBranchNotMerged(OpenRepo or, ReviewDb db, - CurrentUser user, Branch.NameKey branch, Set hashes) + private List byCommitsOnBranchNotMerged( + OpenRepo or, ReviewDb db, CurrentUser user, Branch.NameKey branch, Set hashes) throws OrmException, IOException { if (hashes.isEmpty()) { return ImmutableList.of(); @@ -332,8 +321,8 @@ public class MergeSuperSet { } List result = new ArrayList<>(); - Iterable destChanges = query() - .byCommitsOnBranchNotMerged(or.repo, db, branch, hashes); + Iterable destChanges = + query().byCommitsOnBranchNotMerged(or.repo, db, branch, hashes); for (ChangeData chd : destChanges) { chd.changeControl(user); result.add(chd); @@ -344,20 +333,22 @@ public class MergeSuperSet { /** * Completes {@code cs} with any additional changes from its topics - *

- * {@link #completeChangeSetIncludingTopics} calls this repeatedly, - * alternating with {@link #completeChangeSetWithoutTopic}, to discover - * what additional changes should be submitted with a change until the - * set stops growing. - *

- * {@code topicsSeen} and {@code visibleTopicsSeen} keep track of topics - * already explored to avoid wasted work. + * + *

{@link #completeChangeSetIncludingTopics} calls this repeatedly, alternating with {@link + * #completeChangeSetWithoutTopic}, to discover what additional changes should be submitted with a + * change until the set stops growing. + * + *

{@code topicsSeen} and {@code visibleTopicsSeen} keep track of topics already explored to + * avoid wasted work. * * @return the resulting larger {@link ChangeSet} */ private ChangeSet topicClosure( - ReviewDb db, ChangeSet cs, CurrentUser user, - Set topicsSeen, Set visibleTopicsSeen) + ReviewDb db, + ChangeSet cs, + CurrentUser user, + Set topicsSeen, + Set visibleTopicsSeen) throws OrmException { List visibleChanges = new ArrayList<>(); List nonVisibleChanges = new ArrayList<>(); @@ -403,8 +394,7 @@ public class MergeSuperSet { } private ChangeSet completeChangeSetIncludingTopics( - ReviewDb db, ChangeSet changes, CurrentUser user) - throws IOException, OrmException { + ReviewDb db, ChangeSet changes, CurrentUser user) throws IOException, OrmException { Set topicsSeen = new HashSet<>(); Set visibleTopicsSeen = new HashSet<>(); int oldSeen; @@ -427,10 +417,11 @@ public class MergeSuperSet { // more than necessary. This provides reasonable performance when loading // the change screen; callers that care about reading the latest value of // these fields should clear them explicitly using reloadChanges(). - Set fields = ImmutableSet.of( - ChangeField.CHANGE.getName(), - ChangeField.PATCH_SET.getName(), - ChangeField.MERGEABLE.getName()); + Set fields = + ImmutableSet.of( + ChangeField.CHANGE.getName(), + ChangeField.PATCH_SET.getName(), + ChangeField.MERGEABLE.getName()); return queryProvider.get().setRequestedFields(fields); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeTip.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeTip.java index 5ea0c02079..3bd0f38278 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeTip.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeTip.java @@ -18,20 +18,17 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import com.google.gerrit.common.Nullable; - -import org.eclipse.jgit.lib.ObjectId; - import java.util.Collection; import java.util.HashMap; import java.util.Map; +import org.eclipse.jgit.lib.ObjectId; /** * Class describing a merge tip during merge operation. - *

- * The current tip of a {@link MergeTip} may be null if the merge operation is - * against an unborn branch, and has not yet been attempted. This is distinct - * from a null {@link MergeTip} instance, which may be used to indicate that a - * merge failed or another error state. + * + *

The current tip of a {@link MergeTip} may be null if the merge operation is against an unborn + * branch, and has not yet been attempted. This is distinct from a null {@link MergeTip} instance, + * which may be used to indicate that a merge failed or another error state. */ public class MergeTip { private CodeReviewCommit initialTip; @@ -39,13 +36,10 @@ public class MergeTip { private Map mergeResults; /** - * @param initialTip tip before the merge operation; may be null, indicating - * an unborn branch. - * @param toMerge list of commits to be merged in merge operation; may not be - * null or empty. + * @param initialTip tip before the merge operation; may be null, indicating an unborn branch. + * @param toMerge list of commits to be merged in merge operation; may not be null or empty. */ - public MergeTip(@Nullable CodeReviewCommit initialTip, - Collection toMerge) { + public MergeTip(@Nullable CodeReviewCommit initialTip, Collection toMerge) { checkNotNull(toMerge, "toMerge may not be null"); checkArgument(!toMerge.isEmpty(), "toMerge may not be empty"); this.initialTip = initialTip; @@ -58,8 +52,8 @@ public class MergeTip { } /** - * @return the initial tip of the branch before the merge operation started; - * may be null, indicating a previously unborn branch. + * @return the initial tip of the branch before the merge operation started; may be null, + * indicating a previously unborn branch. */ public CodeReviewCommit getInitialTip() { return initialTip; @@ -80,16 +74,16 @@ public class MergeTip { /** * The merge results of all the merges of this merge operation. * - * @return The merge results of the merge operation as a map of SHA-1 to be - * merged to SHA-1 of the merge result. + * @return The merge results of the merge operation as a map of SHA-1 to be merged to SHA-1 of the + * merge result. */ public Map getMergeResults() { return mergeResults; } /** - * @return The current tip of the current merge operation; may be null, - * indicating an unborn branch. + * @return The current tip of the current merge operation; may be null, indicating an unborn + * branch. */ @Nullable public CodeReviewCommit getCurrentTip() { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeUtil.java index 0c304a273b..c7e02221a3 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeUtil.java @@ -51,7 +51,15 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; import org.eclipse.jgit.errors.AmbiguousObjectException; import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.errors.LargeObjectException; @@ -81,24 +89,13 @@ import org.eclipse.jgit.revwalk.RevWalk; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Objects; -import java.util.Set; - /** * Utility methods used during the merge process. - *

- * Note: Unless otherwise specified, the methods in this class - * do not flush {@link ObjectInserter}s. Callers that want to - * read back objects before flushing should use {@link - * ObjectInserter#newReader()}. This is already the default behavior of {@code - * BatchUpdate}. + * + *

Note: Unless otherwise specified, the methods in this class do + * not flush {@link ObjectInserter}s. Callers that want to read back objects before + * flushing should use {@link ObjectInserter#newReader()}. This is already the default behavior of + * {@code BatchUpdate}. */ public class MergeUtil { private static final Logger log = LoggerFactory.getLogger(MergeUtil.class); @@ -107,42 +104,41 @@ public class MergeUtil { private final DynamicSet changeMessageModifiers; @Inject - PluggableCommitMessageGenerator( - DynamicSet changeMessageModifiers) { + PluggableCommitMessageGenerator(DynamicSet changeMessageModifiers) { this.changeMessageModifiers = changeMessageModifiers; } - public String generate(RevCommit original, RevCommit mergeTip, - ChangeControl ctl, String current) { + public String generate( + RevCommit original, RevCommit mergeTip, ChangeControl ctl, String current) { checkNotNull(original.getRawBuffer()); if (mergeTip != null) { checkNotNull(mergeTip.getRawBuffer()); } for (ChangeMessageModifier changeMessageModifier : changeMessageModifiers) { - current = changeMessageModifier.onSubmit(current, original, - mergeTip, ctl.getChange().getDest()); - checkNotNull(current, changeMessageModifier.getClass().getName() - + ".OnSubmit returned null instead of new commit message"); + current = + changeMessageModifier.onSubmit(current, original, mergeTip, ctl.getChange().getDest()); + checkNotNull( + current, + changeMessageModifier.getClass().getName() + + ".OnSubmit returned null instead of new commit message"); } return current; } } - private static final String R_HEADS_MASTER = - Constants.R_HEADS + Constants.MASTER; + private static final String R_HEADS_MASTER = Constants.R_HEADS + Constants.MASTER; public static boolean useRecursiveMerge(Config cfg) { return cfg.getBoolean("core", null, "useRecursiveMerge", true); } public static ThreeWayMergeStrategy getMergeStrategy(Config cfg) { - return useRecursiveMerge(cfg) - ? MergeStrategy.RECURSIVE - : MergeStrategy.RESOLVE; + return useRecursiveMerge(cfg) ? MergeStrategy.RECURSIVE : MergeStrategy.RESOLVE; } public interface Factory { MergeUtil create(ProjectState project); + MergeUtil create(ProjectState project, boolean useContentMerge); } @@ -156,19 +152,28 @@ public class MergeUtil { private final PluggableCommitMessageGenerator commitMessageGenerator; @AssistedInject - MergeUtil(@GerritServerConfig Config serverConfig, + MergeUtil( + @GerritServerConfig Config serverConfig, Provider db, IdentifiedUser.GenericFactory identifiedUserFactory, @CanonicalWebUrl @Nullable Provider urlProvider, ApprovalsUtil approvalsUtil, PluggableCommitMessageGenerator commitMessageGenerator, @Assisted ProjectState project) { - this(serverConfig, db, identifiedUserFactory, urlProvider, approvalsUtil, - project, commitMessageGenerator, project.isUseContentMerge()); + this( + serverConfig, + db, + identifiedUserFactory, + urlProvider, + approvalsUtil, + project, + commitMessageGenerator, + project.isUseContentMerge()); } @AssistedInject - MergeUtil(@GerritServerConfig Config serverConfig, + MergeUtil( + @GerritServerConfig Config serverConfig, Provider db, IdentifiedUser.GenericFactory identifiedUserFactory, @CanonicalWebUrl @Nullable Provider urlProvider, @@ -187,9 +192,9 @@ public class MergeUtil { } public CodeReviewCommit getFirstFastForward( - final CodeReviewCommit mergeTip, final RevWalk rw, - final List toMerge) throws IntegrationException { - for (final Iterator i = toMerge.iterator(); i.hasNext();) { + final CodeReviewCommit mergeTip, final RevWalk rw, final List toMerge) + throws IntegrationException { + for (final Iterator i = toMerge.iterator(); i.hasNext(); ) { try { final CodeReviewCommit n = i.next(); if (mergeTip == null || rw.isMergedInto(mergeTip, n)) { @@ -197,15 +202,14 @@ public class MergeUtil { return n; } } catch (IOException e) { - throw new IntegrationException( - "Cannot fast-forward test during merge", e); + throw new IntegrationException("Cannot fast-forward test during merge", e); } } return mergeTip; } - public List reduceToMinimalMerge(MergeSorter mergeSorter, - Collection toSort, Set incoming) + public List reduceToMinimalMerge( + MergeSorter mergeSorter, Collection toSort, Set incoming) throws IntegrationException { List result = new ArrayList<>(); try { @@ -217,12 +221,18 @@ public class MergeUtil { return result; } - public CodeReviewCommit createCherryPickFromCommit(Repository repo, - ObjectInserter inserter, RevCommit mergeTip, RevCommit originalCommit, - PersonIdent cherryPickCommitterIdent, String commitMsg, - CodeReviewRevWalk rw, int parentIndex, boolean ignoreIdenticalTree) + public CodeReviewCommit createCherryPickFromCommit( + Repository repo, + ObjectInserter inserter, + RevCommit mergeTip, + RevCommit originalCommit, + PersonIdent cherryPickCommitterIdent, + String commitMsg, + CodeReviewRevWalk rw, + int parentIndex, + boolean ignoreIdenticalTree) throws MissingObjectException, IncorrectObjectTypeException, IOException, - MergeIdenticalTreeException, MergeConflictException { + MergeIdenticalTreeException, MergeConflictException { final ThreeWayMerger m = newThreeWayMerger(repo, inserter); @@ -244,13 +254,19 @@ public class MergeUtil { throw new MergeConflictException("merge conflict"); } - public static RevCommit createMergeCommit(Repository repo, ObjectInserter inserter, - RevCommit mergeTip, RevCommit originalCommit, String mergeStrategy, - PersonIdent committerIndent, String commitMsg, RevWalk rw) + public static RevCommit createMergeCommit( + Repository repo, + ObjectInserter inserter, + RevCommit mergeTip, + RevCommit originalCommit, + String mergeStrategy, + PersonIdent committerIndent, + String commitMsg, + RevWalk rw) throws IOException, MergeIdenticalTreeException, MergeConflictException { - if (!MergeStrategy.THEIRS.getName().equals(mergeStrategy) && - rw.isMergedInto(originalCommit, mergeTip)) { + if (!MergeStrategy.THEIRS.getName().equals(mergeStrategy) + && rw.isMergedInto(originalCommit, mergeTip)) { throw new ChangeAlreadyMergedException( "'" + originalCommit.getName() + "' has already been merged"); } @@ -285,13 +301,12 @@ public class MergeUtil { /** * Adds footers to existing commit message based on the state of the change. * - * This adds the following footers if they are missing: + *

This adds the following footers if they are missing: * *

    - *
  • Reviewed-on: url
  • + *
  • Reviewed-on: url *
  • Reviewed-by | Tested-by | Other-Label-Name: reviewer - *
  • - *
  • Change-Id
  • + *
  • Change-Id *
* * @param n @@ -299,8 +314,7 @@ public class MergeUtil { * @param psId * @return new message */ - private String createDetailedCommitMessage(RevCommit n, ChangeControl ctl, - PatchSet.Id psId) { + private String createDetailedCommitMessage(RevCommit n, ChangeControl ctl, PatchSet.Id psId) { Change c = ctl.getChange(); final List footers = n.getFooterLines(); final StringBuilder msgbuf = new StringBuilder(); @@ -350,15 +364,13 @@ public class MergeUtil { if (a.isLegacySubmit()) { // Submit is treated specially, below (becomes committer) // - if (submitAudit == null - || a.getGranted().compareTo(submitAudit.getGranted()) > 0) { + if (submitAudit == null || a.getGranted().compareTo(submitAudit.getGranted()) > 0) { submitAudit = a; } continue; } - final Account acc = - identifiedUserFactory.create(a.getAccountId()).getAccount(); + final Account acc = identifiedUserFactory.create(a.getAccountId()).getAccount(); final StringBuilder identbuf = new StringBuilder(); if (acc.getFullName() != null && acc.getFullName().length() > 0) { if (identbuf.length() > 0) { @@ -366,8 +378,7 @@ public class MergeUtil { } identbuf.append(acc.getFullName()); } - if (acc.getPreferredEmail() != null - && acc.getPreferredEmail().length() > 0) { + if (acc.getPreferredEmail() != null && acc.getPreferredEmail().length() > 0) { if (isSignedOffBy(footers, acc.getPreferredEmail())) { continue; } @@ -406,18 +417,16 @@ public class MergeUtil { return msgbuf.toString(); } - public String createCommitMessageOnSubmit(CodeReviewCommit n, - RevCommit mergeTip) { - return createCommitMessageOnSubmit(n, mergeTip, n.getControl(), - n.getPatchsetId()); + public String createCommitMessageOnSubmit(CodeReviewCommit n, RevCommit mergeTip) { + return createCommitMessageOnSubmit(n, mergeTip, n.getControl(), n.getPatchsetId()); } /** * Creates a commit message for a change, which can be customized by plugins. * - * By default, adds footers to existing commit message based on the state of - * the change. Plugins implementing {@link ChangeMessageModifier} can modify - * the resulting commit message arbitrarily. + *

By default, adds footers to existing commit message based on the state of the change. + * Plugins implementing {@link ChangeMessageModifier} can modify the resulting commit message + * arbitrarily. * * @param n * @param mergeTip @@ -425,10 +434,10 @@ public class MergeUtil { * @param id * @return new message */ - public String createCommitMessageOnSubmit(RevCommit n, RevCommit mergeTip, - ChangeControl ctl, Id id) { - return commitMessageGenerator.generate(n, mergeTip, ctl, - createDetailedCommitMessage(n, ctl, id)); + public String createCommitMessageOnSubmit( + RevCommit n, RevCommit mergeTip, ChangeControl ctl, Id id) { + return commitMessageGenerator.generate( + n, mergeTip, ctl, createDetailedCommitMessage(n, ctl, id)); } private static boolean isCodeReview(LabelId id) { @@ -439,8 +448,7 @@ public class MergeUtil { return "Verified".equalsIgnoreCase(id.get()); } - private Iterable safeGetApprovals( - ChangeControl ctl, PatchSet.Id psId) { + private Iterable safeGetApprovals(ChangeControl ctl, PatchSet.Id psId) { try { return approvalsUtil.byPatchSet(db.get(), ctl, psId); } catch (OrmException e) { @@ -460,16 +468,17 @@ public class MergeUtil { private static boolean isSignedOffBy(List footers, String email) { for (final FooterLine line : footers) { - if (line.matches(FooterKey.SIGNED_OFF_BY) - && email.equals(line.getEmailAddress())) { + if (line.matches(FooterKey.SIGNED_OFF_BY) && email.equals(line.getEmailAddress())) { return true; } } return false; } - public boolean canMerge(final MergeSorter mergeSorter, - final Repository repo, final CodeReviewCommit mergeTip, + public boolean canMerge( + final MergeSorter mergeSorter, + final Repository repo, + final CodeReviewCommit mergeTip, final CodeReviewCommit toMerge) throws IntegrationException { if (hasMissingDependencies(mergeSorter, toMerge)) { @@ -477,8 +486,7 @@ public class MergeUtil { } try (ObjectInserter ins = new InMemoryInserter(repo)) { - return newThreeWayMerger(repo, ins) - .merge(new AnyObjectId[] {mergeTip, toMerge}); + return newThreeWayMerger(repo, ins).merge(new AnyObjectId[] {mergeTip, toMerge}); } catch (LargeObjectException e) { log.warn("Cannot merge due to LargeObjectException: " + toMerge.name()); return false; @@ -489,23 +497,31 @@ public class MergeUtil { } } - public boolean canFastForward(MergeSorter mergeSorter, - CodeReviewCommit mergeTip, CodeReviewRevWalk rw, CodeReviewCommit toMerge) + public boolean canFastForward( + MergeSorter mergeSorter, + CodeReviewCommit mergeTip, + CodeReviewRevWalk rw, + CodeReviewCommit toMerge) throws IntegrationException { if (hasMissingDependencies(mergeSorter, toMerge)) { return false; } try { - return mergeTip == null || rw.isMergedInto(mergeTip, toMerge) + return mergeTip == null + || rw.isMergedInto(mergeTip, toMerge) || rw.isMergedInto(toMerge, mergeTip); } catch (IOException e) { throw new IntegrationException("Cannot fast-forward test during merge", e); } } - public boolean canCherryPick(MergeSorter mergeSorter, Repository repo, - CodeReviewCommit mergeTip, CodeReviewRevWalk rw, CodeReviewCommit toMerge) + public boolean canCherryPick( + MergeSorter mergeSorter, + Repository repo, + CodeReviewCommit mergeTip, + CodeReviewRevWalk rw, + CodeReviewCommit toMerge) throws IntegrationException { if (mergeTip == null) { // The branch is unborn. Fast-forward is possible. @@ -531,8 +547,8 @@ public class MergeUtil { return m.merge(mergeTip, toMerge); } catch (IOException e) { throw new IntegrationException( - String.format("Cannot merge commit %s with mergetip %s", - toMerge.name(), mergeTip.name()), + String.format( + "Cannot merge commit %s with mergetip %s", toMerge.name(), mergeTip.name()), e); } } @@ -547,8 +563,8 @@ public class MergeUtil { || canMerge(mergeSorter, repo, mergeTip, toMerge); } - public boolean hasMissingDependencies(final MergeSorter mergeSorter, - final CodeReviewCommit toMerge) throws IntegrationException { + public boolean hasMissingDependencies( + final MergeSorter mergeSorter, final CodeReviewCommit toMerge) throws IntegrationException { try { return !mergeSorter.sort(Collections.singleton(toMerge)).contains(toMerge); } catch (IOException e) { @@ -556,16 +572,21 @@ public class MergeUtil { } } - public CodeReviewCommit mergeOneCommit(PersonIdent author, - PersonIdent committer, Repository repo, CodeReviewRevWalk rw, - ObjectInserter inserter, Branch.NameKey destBranch, - CodeReviewCommit mergeTip, CodeReviewCommit n) + public CodeReviewCommit mergeOneCommit( + PersonIdent author, + PersonIdent committer, + Repository repo, + CodeReviewRevWalk rw, + ObjectInserter inserter, + Branch.NameKey destBranch, + CodeReviewCommit mergeTip, + CodeReviewCommit n) throws IntegrationException { final ThreeWayMerger m = newThreeWayMerger(repo, inserter); try { if (m.merge(new AnyObjectId[] {mergeTip, n})) { - return writeMergeCommit(author, committer, rw, inserter, destBranch, - mergeTip, m.getResultTreeId(), n); + return writeMergeCommit( + author, committer, rw, inserter, destBranch, mergeTip, m.getResultTreeId(), n); } failed(rw, mergeTip, n, CommitMergeStatus.PATH_CONFLICT); } catch (NoMergeBaseException e) { @@ -580,8 +601,7 @@ public class MergeUtil { return mergeTip; } - private static CommitMergeStatus getCommitMergeStatus( - MergeBaseFailureReason reason) { + private static CommitMergeStatus getCommitMergeStatus(MergeBaseFailureReason reason) { switch (reason) { case MULTIPLE_MERGE_BASES_NOT_SUPPORTED: case TOO_MANY_MERGE_BASES: @@ -592,8 +612,11 @@ public class MergeUtil { } } - private static CodeReviewCommit failed(CodeReviewRevWalk rw, - CodeReviewCommit mergeTip, CodeReviewCommit n, CommitMergeStatus failure) + private static CodeReviewCommit failed( + CodeReviewRevWalk rw, + CodeReviewCommit mergeTip, + CodeReviewCommit n, + CommitMergeStatus failure) throws MissingObjectException, IncorrectObjectTypeException, IOException { rw.reset(); rw.markStart(n); @@ -605,11 +628,16 @@ public class MergeUtil { return failed; } - public CodeReviewCommit writeMergeCommit(PersonIdent author, - PersonIdent committer, CodeReviewRevWalk rw, ObjectInserter inserter, - Branch.NameKey destBranch, CodeReviewCommit mergeTip, ObjectId treeId, - CodeReviewCommit n) throws IOException, MissingObjectException, - IncorrectObjectTypeException { + public CodeReviewCommit writeMergeCommit( + PersonIdent author, + PersonIdent committer, + CodeReviewRevWalk rw, + ObjectInserter inserter, + Branch.NameKey destBranch, + CodeReviewCommit mergeTip, + ObjectId treeId, + CodeReviewCommit n) + throws IOException, MissingObjectException, IncorrectObjectTypeException { final List merged = new ArrayList<>(); rw.reset(); rw.markStart(n); @@ -644,14 +672,12 @@ public class MergeUtil { mergeCommit.setCommitter(committer); mergeCommit.setMessage(msgbuf.toString()); - CodeReviewCommit mergeResult = - rw.parseCommit(inserter.insert(mergeCommit)); + CodeReviewCommit mergeResult = rw.parseCommit(inserter.insert(mergeCommit)); mergeResult.setControl(n.getControl()); return mergeResult; } - private String summarize(RevWalk rw, List merged) - throws IOException { + private String summarize(RevWalk rw, List merged) throws IOException { if (merged.size() == 1) { CodeReviewCommit c = merged.get(0); rw.parseBody(c); @@ -666,13 +692,12 @@ public class MergeUtil { } if (topics.size() == 1) { - return String.format("Merge changes from topic '%s'", - Iterables.getFirst(topics, null)); + return String.format("Merge changes from topic '%s'", Iterables.getFirst(topics, null)); } else if (topics.size() > 1) { - return String.format("Merge changes from topics '%s'", - Joiner.on("', '").join(topics)); + return String.format("Merge changes from topics '%s'", Joiner.on("', '").join(topics)); } else { - return String.format("Merge changes %s%s", + return String.format( + "Merge changes %s%s", FluentIterable.from(merged) .limit(5) .transform(c -> c.change().getKey().abbreviate()) @@ -681,8 +706,7 @@ public class MergeUtil { } } - public ThreeWayMerger newThreeWayMerger(final Repository repo, - final ObjectInserter inserter) { + public ThreeWayMerger newThreeWayMerger(final Repository repo, final ObjectInserter inserter) { return newThreeWayMerger(repo, inserter, mergeStrategyName()); } @@ -690,8 +714,7 @@ public class MergeUtil { return mergeStrategyName(useContentMerge, useRecursiveMerge); } - public static String mergeStrategyName(boolean useContentMerge, - boolean useRecursiveMerge) { + public static String mergeStrategyName(boolean useContentMerge, boolean useRecursiveMerge) { if (useContentMerge) { // Settings for this project allow us to try and automatically resolve // conflicts within files if needed. Use either the old resolve merger or @@ -706,39 +729,43 @@ public class MergeUtil { return MergeStrategy.SIMPLE_TWO_WAY_IN_CORE.getName(); } - public static ThreeWayMerger newThreeWayMerger(Repository repo, - final ObjectInserter inserter, String strategyName) { + public static ThreeWayMerger newThreeWayMerger( + Repository repo, final ObjectInserter inserter, String strategyName) { Merger m = newMerger(repo, inserter, strategyName); - checkArgument(m instanceof ThreeWayMerger, - "merge strategy %s does not support three-way merging", strategyName); + checkArgument( + m instanceof ThreeWayMerger, + "merge strategy %s does not support three-way merging", + strategyName); return (ThreeWayMerger) m; } - public static Merger newMerger(Repository repo, - final ObjectInserter inserter, String strategyName) { + public static Merger newMerger( + Repository repo, final ObjectInserter inserter, String strategyName) { MergeStrategy strategy = MergeStrategy.get(strategyName); checkArgument(strategy != null, "invalid merge strategy: %s", strategyName); Merger m = strategy.newMerger(repo, true); - m.setObjectInserter(new ObjectInserter.Filter() { - @Override - protected ObjectInserter delegate() { - return inserter; - } + m.setObjectInserter( + new ObjectInserter.Filter() { + @Override + protected ObjectInserter delegate() { + return inserter; + } - @Override - public void flush() { - } + @Override + public void flush() {} - @Override - public void close() { - } - }); + @Override + public void close() {} + }); return m; } - public void markCleanMerges(final RevWalk rw, - final RevFlag canMergeFlag, final CodeReviewCommit mergeTip, - final Set alreadyAccepted) throws IntegrationException { + public void markCleanMerges( + final RevWalk rw, + final RevFlag canMergeFlag, + final CodeReviewCommit mergeTip, + final Set alreadyAccepted) + throws IntegrationException { if (mergeTip == null) { // If mergeTip is null here, branchTip was null, indicating a new branch // at the start of the merge process. We also elected to merge nothing, @@ -770,9 +797,13 @@ public class MergeUtil { } } - public Set findUnmergedChanges(Set expected, - CodeReviewRevWalk rw, RevFlag canMergeFlag, CodeReviewCommit oldTip, - CodeReviewCommit mergeTip, Iterable alreadyMerged) + public Set findUnmergedChanges( + Set expected, + CodeReviewRevWalk rw, + RevFlag canMergeFlag, + CodeReviewCommit oldTip, + CodeReviewCommit mergeTip, + Iterable alreadyMerged) throws IntegrationException { if (mergeTip == null) { return expected; @@ -808,8 +839,9 @@ public class MergeUtil { } } - public static CodeReviewCommit findAnyMergedInto(CodeReviewRevWalk rw, - Iterable commits, CodeReviewCommit tip) throws IOException { + public static CodeReviewCommit findAnyMergedInto( + CodeReviewRevWalk rw, Iterable commits, CodeReviewCommit tip) + throws IOException { for (CodeReviewCommit c : commits) { // TODO(dborowitz): Seems like this could get expensive for many patch // sets. Is there a more efficient implementation? @@ -825,12 +857,10 @@ public class MergeUtil { try { ObjectId commitId = repo.resolve(str); if (commitId == null) { - throw new BadRequestException( - "Cannot resolve '" + str + "' to a commit"); + throw new BadRequestException("Cannot resolve '" + str + "' to a commit"); } return rw.parseCommit(commitId); - } catch (AmbiguousObjectException | IncorrectObjectTypeException | - RevisionSyntaxException e) { + } catch (AmbiguousObjectException | IncorrectObjectTypeException | RevisionSyntaxException e) { throw new BadRequestException(e.getMessage()); } catch (MissingObjectException e) { throw new ResourceNotFoundException(e.getMessage()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergedByPushOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergedByPushOp.java index 1502c4ae28..8946042768 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergedByPushOp.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergedByPushOp.java @@ -36,7 +36,9 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - +import java.io.IOException; +import java.util.Collections; +import java.util.concurrent.ExecutorService; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; @@ -45,17 +47,12 @@ import org.eclipse.jgit.revwalk.RevWalk; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.Collections; -import java.util.concurrent.ExecutorService; - public class MergedByPushOp extends BatchUpdate.Op { - private static final Logger log = - LoggerFactory.getLogger(MergedByPushOp.class); + private static final Logger log = LoggerFactory.getLogger(MergedByPushOp.class); public interface Factory { - MergedByPushOp create(RequestScopePropagator requestScopePropagator, - PatchSet.Id psId, String refName); + MergedByPushOp create( + RequestScopePropagator requestScopePropagator, PatchSet.Id psId, String refName); } private final RequestScopePropagator requestScopePropagator; @@ -101,15 +98,13 @@ public class MergedByPushOp extends BatchUpdate.Op { return refName; } - public MergedByPushOp setPatchSetProvider( - Provider patchSetProvider) { + public MergedByPushOp setPatchSetProvider(Provider patchSetProvider) { this.patchSetProvider = checkNotNull(patchSetProvider); return this; } @Override - public boolean updateChange(ChangeContext ctx) - throws OrmException, IOException { + public boolean updateChange(ChangeContext ctx) throws OrmException, IOException { change = ctx.getChange(); correctBranch = refName.equals(change.getDest().get()); if (!correctBranch) { @@ -121,9 +116,9 @@ public class MergedByPushOp extends BatchUpdate.Op { // that is not present in the old notes so we can't use PatchSetUtil. patchSet = patchSetProvider.get(); } else { - patchSet = checkNotNull( - psUtil.get(ctx.getDb(), ctx.getNotes(), psId), - "patch set %s not found", psId); + patchSet = + checkNotNull( + psUtil.get(ctx.getDb(), ctx.getNotes(), psId), "patch set %s not found", psId); } info = getPatchSetInfo(ctx); @@ -150,17 +145,16 @@ public class MergedByPushOp extends BatchUpdate.Op { } } msgBuf.append("."); - ChangeMessage msg = ChangeMessagesUtil.newMessage( - psId, ctx.getUser(), ctx.getWhen(), msgBuf.toString(), - ChangeMessagesUtil.TAG_MERGED); + ChangeMessage msg = + ChangeMessagesUtil.newMessage( + psId, ctx.getUser(), ctx.getWhen(), msgBuf.toString(), ChangeMessagesUtil.TAG_MERGED); cmUtil.addChangeMessage(ctx.getDb(), update, msg); - PatchSetApproval submitter = ApprovalsUtil.newApproval( - change.currentPatchSetId(), ctx.getUser(), LabelId.legacySubmit(), - 1, ctx.getWhen()); + PatchSetApproval submitter = + ApprovalsUtil.newApproval( + change.currentPatchSetId(), ctx.getUser(), LabelId.legacySubmit(), 1, ctx.getWhen()); update.putApproval(submitter.getLabel(), submitter.getValue()); - ctx.getDb().patchSetApprovals().upsert( - Collections.singleton(submitter)); + ctx.getDb().patchSetApprovals().upsert(Collections.singleton(submitter)); return true; } @@ -170,36 +164,36 @@ public class MergedByPushOp extends BatchUpdate.Op { if (!correctBranch) { return; } - sendEmailExecutor.submit(requestScopePropagator.wrap(new Runnable() { - @Override - public void run() { - try { - MergedSender cm = - mergedSenderFactory.create(ctx.getProject(), psId.getParentKey()); - cm.setFrom(ctx.getAccountId()); - cm.setPatchSet(patchSet, info); - cm.send(); - } catch (Exception e) { - log.error("Cannot send email for submitted patch set " + psId, e); - } - } + sendEmailExecutor.submit( + requestScopePropagator.wrap( + new Runnable() { + @Override + public void run() { + try { + MergedSender cm = + mergedSenderFactory.create(ctx.getProject(), psId.getParentKey()); + cm.setFrom(ctx.getAccountId()); + cm.setPatchSet(patchSet, info); + cm.send(); + } catch (Exception e) { + log.error("Cannot send email for submitted patch set " + psId, e); + } + } - @Override - public String toString() { - return "send-email merged"; - } - })); + @Override + public String toString() { + return "send-email merged"; + } + })); - changeMerged.fire(change, patchSet, - ctx.getAccount(), - patchSet.getRevision().get(), - ctx.getWhen()); + changeMerged.fire( + change, patchSet, ctx.getAccount(), patchSet.getRevision().get(), ctx.getWhen()); } private PatchSetInfo getPatchSetInfo(ChangeContext ctx) throws IOException { RevWalk rw = ctx.getRevWalk(); - RevCommit commit = rw.parseCommit( - ObjectId.fromString(checkNotNull(patchSet).getRevision().get())); + RevCommit commit = + rw.parseCommit(ObjectId.fromString(checkNotNull(patchSet).getRevision().get())); return patchSetInfoFactory.get(rw, commit, psId); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MetaDataUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MetaDataUpdate.java index 7e47d1e105..e3b1ad61e4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MetaDataUpdate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/MetaDataUpdate.java @@ -23,7 +23,7 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - +import java.io.IOException; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.BatchRefUpdate; import org.eclipse.jgit.lib.CommitBuilder; @@ -31,8 +31,6 @@ import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.RefUpdate; import org.eclipse.jgit.lib.Repository; -import java.io.IOException; - /** Helps with the updating of a {@link VersionedMetaData}. */ public class MetaDataUpdate implements AutoCloseable { public static class User { @@ -42,7 +40,9 @@ public class MetaDataUpdate implements AutoCloseable { private final Provider identifiedUser; @Inject - User(InternalFactory factory, GitRepositoryManager mgr, + User( + InternalFactory factory, + GitRepositoryManager mgr, @GerritPersonIdent PersonIdent serverIdent, Provider identifiedUser) { this.factory = factory; @@ -65,20 +65,18 @@ public class MetaDataUpdate implements AutoCloseable { return create(name, user, null); } - /** - * Create an update using an existing batch ref update. - *

- * This allows batching together updates to multiple metadata refs. For making - * multiple commits to a single metadata ref, see - * {@link VersionedMetaData#openUpdate(MetaDataUpdate)}. - * - * @param name project name. - * @param user user for the update. - * @param batch batch update to use; the caller is responsible for committing - * the update. - */ - public MetaDataUpdate create(Project.NameKey name, IdentifiedUser user, - BatchRefUpdate batch) throws RepositoryNotFoundException, IOException { + /** + * Create an update using an existing batch ref update. + * + *

This allows batching together updates to multiple metadata refs. For making multiple + * commits to a single metadata ref, see {@link VersionedMetaData#openUpdate(MetaDataUpdate)}. + * + * @param name project name. + * @param user user for the update. + * @param batch batch update to use; the caller is responsible for committing the update. + */ + public MetaDataUpdate create(Project.NameKey name, IdentifiedUser user, BatchRefUpdate batch) + throws RepositoryNotFoundException, IOException { Repository repo = mgr.openRepository(name); MetaDataUpdate md = create(name, repo, user, batch); md.setCloseRepository(true); @@ -87,12 +85,12 @@ public class MetaDataUpdate implements AutoCloseable { /** * Create an update using an existing batch ref update. - *

- * This allows batching together updates to multiple metadata refs. For making - * multiple commits to a single metadata ref, see - * {@link VersionedMetaData#openUpdate(MetaDataUpdate)}. * - * Important: Create a new MetaDataUpdate instance for each update: + *

This allows batching together updates to multiple metadata refs. For making multiple + * commits to a single metadata ref, see {@link VersionedMetaData#openUpdate(MetaDataUpdate)}. + * + *

Important: Create a new MetaDataUpdate instance for each update: + * *

      * 
      *   try (Repository repo = repoMgr.openRepository(allUsersName);
@@ -120,14 +118,13 @@ public class MetaDataUpdate implements AutoCloseable {
      * 
* * @param name project name. - * @param repository the repository to update; the caller is responsible for - * closing the repository. + * @param repository the repository to update; the caller is responsible for closing the + * repository. * @param user user for the update. - * @param batch batch update to use; the caller is responsible for committing - * the update. + * @param batch batch update to use; the caller is responsible for committing the update. */ - public MetaDataUpdate create(Project.NameKey name, Repository repository, - IdentifiedUser user, BatchRefUpdate batch) { + public MetaDataUpdate create( + Project.NameKey name, Repository repository, IdentifiedUser user, BatchRefUpdate batch) { MetaDataUpdate md = factory.create(name, repository, batch); md.getCommitBuilder().setCommitter(serverIdent); md.setAuthor(user); @@ -135,8 +132,7 @@ public class MetaDataUpdate implements AutoCloseable { } private PersonIdent createPersonIdent(IdentifiedUser user) { - return user.newCommitterIdent( - serverIdent.getWhen(), serverIdent.getTimeZone()); + return user.newCommitterIdent(serverIdent.getWhen(), serverIdent.getTimeZone()); } } @@ -146,7 +142,9 @@ public class MetaDataUpdate implements AutoCloseable { private final PersonIdent serverIdent; @Inject - Server(InternalFactory factory, GitRepositoryManager mgr, + Server( + InternalFactory factory, + GitRepositoryManager mgr, @GerritPersonIdent PersonIdent serverIdent) { this.factory = factory; this.mgr = mgr; @@ -171,7 +169,8 @@ public class MetaDataUpdate implements AutoCloseable { } interface InternalFactory { - MetaDataUpdate create(@Assisted Project.NameKey projectName, + MetaDataUpdate create( + @Assisted Project.NameKey projectName, @Assisted Repository repository, @Assisted @Nullable BatchRefUpdate batch); } @@ -187,8 +186,10 @@ public class MetaDataUpdate implements AutoCloseable { private IdentifiedUser author; @AssistedInject - public MetaDataUpdate(GitReferenceUpdated gitRefUpdated, - @Assisted Project.NameKey projectName, @Assisted Repository repository, + public MetaDataUpdate( + GitReferenceUpdated gitRefUpdated, + @Assisted Project.NameKey projectName, + @Assisted Repository repository, @Assisted @Nullable BatchRefUpdate batch) { this.gitRefUpdated = gitRefUpdated; this.projectName = projectName; @@ -197,8 +198,8 @@ public class MetaDataUpdate implements AutoCloseable { this.commit = new CommitBuilder(); } - public MetaDataUpdate(GitReferenceUpdated gitRefUpdated, - Project.NameKey projectName, Repository repository) { + public MetaDataUpdate( + GitReferenceUpdated gitRefUpdated, Project.NameKey projectName, Repository repository) { this(gitRefUpdated, projectName, repository, null); } @@ -209,9 +210,11 @@ public class MetaDataUpdate implements AutoCloseable { public void setAuthor(IdentifiedUser author) { this.author = author; - getCommitBuilder().setAuthor(author.newCommitterIdent( - getCommitBuilder().getCommitter().getWhen(), - getCommitBuilder().getCommitter().getTimeZone())); + getCommitBuilder() + .setAuthor( + author.newCommitterIdent( + getCommitBuilder().getCommitter().getWhen(), + getCommitBuilder().getCommitter().getTimeZone())); } public void setAllowEmpty(boolean allowEmpty) { @@ -260,7 +263,6 @@ public class MetaDataUpdate implements AutoCloseable { } protected void fireGitRefUpdatedEvent(RefUpdate ru) { - gitRefUpdated.fire( - projectName, ru, author == null ? null : author.getAccount()); + gitRefUpdated.fire(projectName, ru, author == null ? null : author.getAccount()); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MultiBaseLocalDiskRepositoryManager.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MultiBaseLocalDiskRepositoryManager.java index db739b149d..7928ac2119 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MultiBaseLocalDiskRepositoryManager.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/MultiBaseLocalDiskRepositoryManager.java @@ -22,19 +22,15 @@ import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.config.RepositoryConfig; import com.google.gerrit.server.config.SitePaths; import com.google.inject.Inject; - +import java.nio.file.Path; import org.eclipse.jgit.lib.Config; -import java.nio.file.Path; - -public class MultiBaseLocalDiskRepositoryManager extends - LocalDiskRepositoryManager { +public class MultiBaseLocalDiskRepositoryManager extends LocalDiskRepositoryManager { public static class Module extends LifecycleModule { @Override protected void configure() { - bind(GitRepositoryManager.class).to( - MultiBaseLocalDiskRepositoryManager.class); + bind(GitRepositoryManager.class).to(MultiBaseLocalDiskRepositoryManager.class); listener().to(MultiBaseLocalDiskRepositoryManager.Lifecycle.class); } } @@ -42,24 +38,23 @@ public class MultiBaseLocalDiskRepositoryManager extends private final RepositoryConfig config; @Inject - MultiBaseLocalDiskRepositoryManager(SitePaths site, - @GerritServerConfig Config cfg, - RepositoryConfig config) { + MultiBaseLocalDiskRepositoryManager( + SitePaths site, @GerritServerConfig Config cfg, RepositoryConfig config) { super(site, cfg); this.config = config; for (Path alternateBasePath : config.getAllBasePaths()) { - checkState(alternateBasePath.isAbsolute(), - "repository..basePath must be absolute: %s", alternateBasePath); + checkState( + alternateBasePath.isAbsolute(), + "repository..basePath must be absolute: %s", + alternateBasePath); } } @Override public Path getBasePath(NameKey name) { Path alternateBasePath = config.getBasePath(name); - return alternateBasePath != null - ? alternateBasePath - : super.getBasePath(name); + return alternateBasePath != null ? alternateBasePath : super.getBasePath(name); } @Override diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MultiProgressMonitor.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MultiProgressMonitor.java index 9810fec93d..a994af0146 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MultiProgressMonitor.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/MultiProgressMonitor.java @@ -17,12 +17,6 @@ package com.google.gerrit.server.git; import static java.util.concurrent.TimeUnit.NANOSECONDS; import com.google.common.base.Strings; - -import org.eclipse.jgit.lib.Constants; -import org.eclipse.jgit.lib.ProgressMonitor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.io.OutputStream; import java.util.List; @@ -32,31 +26,34 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import org.eclipse.jgit.lib.Constants; +import org.eclipse.jgit.lib.ProgressMonitor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Progress reporting interface that multiplexes multiple sub-tasks. - *

- * Output is of the format: + * + *

Output is of the format: + * *

  *   Task: subA: 1, subB: 75% (3/4) (-)\r
  *   Task: subA: 2, subB: 75% (3/4), subC: 1 (\)\r
  *   Task: subA: 2, subB: 100% (4/4), subC: 1 (|)\r
  *   Task: subA: 4, subB: 100% (4/4), subC: 4, done    \n
  * 
- *

- * Callers should try to keep task and sub-task descriptions short, since the - * output should fit on one terminal line. (Note that git clients do not accept - * terminal control characters, so true multi-line progress messages would be - * impossible.) + * + *

Callers should try to keep task and sub-task descriptions short, since the output should fit + * on one terminal line. (Note that git clients do not accept terminal control characters, so true + * multi-line progress messages would be impossible.) */ public class MultiProgressMonitor { - private static final Logger log = - LoggerFactory.getLogger(MultiProgressMonitor.class); + private static final Logger log = LoggerFactory.getLogger(MultiProgressMonitor.class); /** Constant indicating the total work units cannot be predicted. */ public static final int UNKNOWN = 0; - private static final char[] SPINNER_STATES = new char[]{'-', '\\', '|', '/'}; + private static final char[] SPINNER_STATES = new char[] {'-', '\\', '|', '/'}; private static final char NO_SPINNER = ' '; /** Handle for a sub-task. */ @@ -73,8 +70,8 @@ public class MultiProgressMonitor { /** * Indicate that work has been completed on this sub-task. - *

- * Must be called from a worker thread. + * + *

Must be called from a worker thread. * * @param completed number of work units completed. */ @@ -98,8 +95,8 @@ public class MultiProgressMonitor { /** * Indicate that this sub-task is finished. - *

- * Must be called from a worker thread. + * + *

Must be called from a worker thread. */ public void end() { if (total == UNKNOWN && getCount() > 0) { @@ -108,16 +105,13 @@ public class MultiProgressMonitor { } @Override - public void start(int totalTasks) { - } + public void start(int totalTasks) {} @Override - public void beginTask(String title, int totalWork) { - } + public void beginTask(String title, int totalWork) {} @Override - public void endTask() { - } + public void endTask() {} @Override public boolean isCancelled() { @@ -125,7 +119,7 @@ public class MultiProgressMonitor { } public int getCount() { - synchronized(MultiProgressMonitor.this) { + synchronized (MultiProgressMonitor.this) { return count; } } @@ -159,8 +153,11 @@ public class MultiProgressMonitor { * @param maxIntervalTime maximum interval between progress messages. * @param maxIntervalUnit time unit for progress interval. */ - public MultiProgressMonitor(final OutputStream out, final String taskName, - long maxIntervalTime, TimeUnit maxIntervalUnit) { + public MultiProgressMonitor( + final OutputStream out, + final String taskName, + long maxIntervalTime, + TimeUnit maxIntervalUnit) { this.out = out; this.taskName = taskName; maxIntervalNanos = NANOSECONDS.convert(maxIntervalTime, maxIntervalUnit); @@ -177,23 +174,21 @@ public class MultiProgressMonitor { /** * Wait for a task managed by a {@link Future}. - *

- * Must be called from the main thread, not a worker thread. Once a - * worker thread calls {@link #end()}, the future has an additional - * {@code maxInterval} to finish before it is forcefully cancelled and - * {@link ExecutionException} is thrown. + * + *

Must be called from the main thread, not a worker thread. Once a worker thread + * calls {@link #end()}, the future has an additional {@code maxInterval} to finish before it is + * forcefully cancelled and {@link ExecutionException} is thrown. * * @param workerFuture a future that returns when worker threads are finished. - * @param timeoutTime overall timeout for the task; the future is forcefully - * cancelled if the task exceeds the timeout. Non-positive values indicate - * no timeout. + * @param timeoutTime overall timeout for the task; the future is forcefully cancelled if the task + * exceeds the timeout. Non-positive values indicate no timeout. * @param timeoutUnit unit for overall task timeout. - * @throws ExecutionException if this thread or a worker thread was - * interrupted, the worker was cancelled, or timed out waiting for a - * worker to call {@link #end()}. + * @throws ExecutionException if this thread or a worker thread was interrupted, the worker was + * cancelled, or timed out waiting for a worker to call {@link #end()}. */ - public void waitFor(final Future workerFuture, final long timeoutTime, - final TimeUnit timeoutUnit) throws ExecutionException { + public void waitFor( + final Future workerFuture, final long timeoutTime, final TimeUnit timeoutUnit) + throws ExecutionException { long overallStart = System.nanoTime(); long deadline; String detailMessage = ""; @@ -220,10 +215,12 @@ public class MultiProgressMonitor { if (deadline > 0 && now > deadline) { workerFuture.cancel(true); if (workerFuture.isCancelled()) { - detailMessage = String.format( + detailMessage = + String.format( "(timeout %sms, cancelled)", TimeUnit.MILLISECONDS.convert(now - deadline, NANOSECONDS)); - log.warn(String.format( + log.warn( + String.format( "MultiProgressMonitor worker killed after %sms" + detailMessage, // TimeUnit.MILLISECONDS.convert(now - overallStart, NANOSECONDS))); } @@ -239,8 +236,7 @@ public class MultiProgressMonitor { if (!done && workerFuture.isDone()) { // The worker may not have called end() explicitly, which is likely a // programming error. - log.warn("MultiProgressMonitor worker did not call end()" - + " before returning"); + log.warn("MultiProgressMonitor worker did not call end()" + " before returning"); end(); } } @@ -280,8 +276,8 @@ public class MultiProgressMonitor { /** * End the overall task. - *

- * Must be called from a worker thread. + * + *

Must be called from a worker thread. */ public synchronized void end() { done = true; @@ -315,8 +311,7 @@ public class MultiProgressMonitor { } private StringBuilder format() { - StringBuilder s = new StringBuilder().append("\r").append(taskName) - .append(':'); + StringBuilder s = new StringBuilder().append("\r").append(taskName).append(':'); if (!tasks.isEmpty()) { boolean first = true; @@ -339,9 +334,7 @@ public class MultiProgressMonitor { if (t.total == UNKNOWN) { s.append(count); } else { - s.append(String.format("%d%% (%d/%d)", - count * 100 / t.total, - count, t.total)); + s.append(String.format("%d%% (%d/%d)", count * 100 / t.total, count, t.total)); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/NotesBranchUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/NotesBranchUtil.java index 99abbc8e84..2020550f6f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/NotesBranchUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/NotesBranchUtil.java @@ -19,7 +19,7 @@ import com.google.gerrit.server.GerritPersonIdent; import com.google.gerrit.server.extensions.events.GitReferenceUpdated; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - +import java.io.IOException; import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException; import org.eclipse.jgit.errors.CorruptObjectException; import org.eclipse.jgit.errors.IncorrectObjectTypeException; @@ -41,16 +41,10 @@ import org.eclipse.jgit.notes.NoteMerger; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; -import java.io.IOException; - -/** - * A utility class for updating a notes branch with automatic merge of note - * trees. - */ +/** A utility class for updating a notes branch with automatic merge of note trees. */ public class NotesBranchUtil { public interface Factory { - NotesBranchUtil create(Project.NameKey project, Repository db, - ObjectInserter inserter); + NotesBranchUtil create(Project.NameKey project, Repository db, ObjectInserter inserter); } private static final int MAX_LOCK_FAILURE_CALLS = 10; @@ -75,7 +69,8 @@ public class NotesBranchUtil { private ReviewNoteMerger noteMerger; @Inject - public NotesBranchUtil(@GerritPersonIdent final PersonIdent gerritIdent, + public NotesBranchUtil( + @GerritPersonIdent final PersonIdent gerritIdent, final GitReferenceUpdated gitRefUpdated, @Assisted Project.NameKey project, @Assisted Repository db, @@ -88,8 +83,8 @@ public class NotesBranchUtil { } /** - * Create a new commit in the {@code notesBranch} by updating existing - * or creating new notes from the {@code notes} map. + * Create a new commit in the {@code notesBranch} by updating existing or creating new notes from + * the {@code notes} map. * * @param notes map of notes * @param notesBranch notes branch to update @@ -98,31 +93,29 @@ public class NotesBranchUtil { * @throws IOException * @throws ConcurrentRefUpdateException */ - public final void commitAllNotes(NoteMap notes, String notesBranch, - PersonIdent commitAuthor, String commitMessage) throws IOException, - ConcurrentRefUpdateException { + public final void commitAllNotes( + NoteMap notes, String notesBranch, PersonIdent commitAuthor, String commitMessage) + throws IOException, ConcurrentRefUpdateException { this.overwrite = true; commitNotes(notes, notesBranch, commitAuthor, commitMessage); } /** - * Create a new commit in the {@code notesBranch} by creating not yet - * existing notes from the {@code notes} map. The notes from the - * {@code notes} map which already exist in the note-tree of the - * tip of the {@code notesBranch} will not be updated. + * Create a new commit in the {@code notesBranch} by creating not yet existing notes from the + * {@code notes} map. The notes from the {@code notes} map which already exist in the note-tree of + * the tip of the {@code notesBranch} will not be updated. * * @param notes map of notes * @param notesBranch notes branch to update * @param commitAuthor author of the commit in the notes branch * @param commitMessage for the commit in the notes branch - * @return map with those notes from the {@code notes} that were newly - * created + * @return map with those notes from the {@code notes} that were newly created * @throws IOException * @throws ConcurrentRefUpdateException */ - public final NoteMap commitNewNotes(NoteMap notes, String notesBranch, - PersonIdent commitAuthor, String commitMessage) throws IOException, - ConcurrentRefUpdateException { + public final NoteMap commitNewNotes( + NoteMap notes, String notesBranch, PersonIdent commitAuthor, String commitMessage) + throws IOException, ConcurrentRefUpdateException { this.overwrite = false; commitNotes(notes, notesBranch, commitAuthor, commitMessage); NoteMap newlyCreated = NoteMap.newEmptyMap(); @@ -134,9 +127,9 @@ public class NotesBranchUtil { return newlyCreated; } - private void commitNotes(NoteMap notes, String notesBranch, - PersonIdent commitAuthor, String commitMessage) throws IOException, - ConcurrentRefUpdateException { + private void commitNotes( + NoteMap notes, String notesBranch, PersonIdent commitAuthor, String commitMessage) + throws IOException, ConcurrentRefUpdateException { try { revWalk = new RevWalk(db); reader = db.newObjectReader(); @@ -160,7 +153,7 @@ public class NotesBranchUtil { private void addNewNotes(NoteMap notes) throws IOException { for (Note n : notes) { - if (! ours.contains(n)) { + if (!ours.contains(n)) { ours.set(n, n.getData()); } } @@ -172,8 +165,8 @@ public class NotesBranchUtil { // Merge the existing and the new note as if they are both new, // means: base == null // There is no really a common ancestry for these two note revisions - ObjectId noteContent = getNoteMerger().merge(null, n, ours.getNote(n), - reader, inserter).getData(); + ObjectId noteContent = + getNoteMerger().merge(null, n, ours.getNote(n), reader, inserter).getData(); ours.set(n, noteContent); } else { ours.set(n, n.getData()); @@ -201,8 +194,8 @@ public class NotesBranchUtil { } } - private RevCommit createCommit(NoteMap map, PersonIdent author, - String message, RevCommit... parents) throws IOException { + private RevCommit createCommit( + NoteMap map, PersonIdent author, String message, RevCommit... parents) throws IOException { CommitBuilder b = new CommitBuilder(); b.setTreeId(map.writeTree(inserter)); b.setAuthor(author != null ? author : gerritIdent); @@ -216,9 +209,9 @@ public class NotesBranchUtil { return revWalk.parseCommit(commitId); } - private void updateRef(String notesBranch) throws IOException, - MissingObjectException, IncorrectObjectTypeException, - CorruptObjectException, ConcurrentRefUpdateException { + private void updateRef(String notesBranch) + throws IOException, MissingObjectException, IncorrectObjectTypeException, + CorruptObjectException, ConcurrentRefUpdateException { if (baseCommit != null && oursCommit.getTree().equals(baseCommit.getTree())) { // If the trees are identical, there is no change in the notes. // Avoid saving this commit as it has no new information. @@ -228,7 +221,7 @@ public class NotesBranchUtil { int remainingLockFailureCalls = MAX_LOCK_FAILURE_CALLS; RefUpdate refUpdate = createRefUpdate(notesBranch, oursCommit, baseCommit); - for (;;) { + for (; ; ) { Result result = refUpdate.update(); if (result == Result.LOCK_FAILURE) { @@ -239,27 +232,22 @@ public class NotesBranchUtil { // ignore } } else { - throw new ConcurrentRefUpdateException("Failed to lock the ref: " - + notesBranch, refUpdate.getRef(), result); + throw new ConcurrentRefUpdateException( + "Failed to lock the ref: " + notesBranch, refUpdate.getRef(), result); } } else if (result == Result.REJECTED) { - RevCommit theirsCommit = - revWalk.parseCommit(refUpdate.getOldObjectId()); - NoteMap theirs = - NoteMap.read(revWalk.getObjectReader(), theirsCommit); - NoteMapMerger merger = - new NoteMapMerger(db, getNoteMerger(), MergeStrategy.RESOLVE); + RevCommit theirsCommit = revWalk.parseCommit(refUpdate.getOldObjectId()); + NoteMap theirs = NoteMap.read(revWalk.getObjectReader(), theirsCommit); + NoteMapMerger merger = new NoteMapMerger(db, getNoteMerger(), MergeStrategy.RESOLVE); NoteMap merged = merger.merge(base, ours, theirs); RevCommit mergeCommit = - createCommit(merged, gerritIdent, "Merged note commits\n", - theirsCommit, oursCommit); + createCommit(merged, gerritIdent, "Merged note commits\n", theirsCommit, oursCommit); refUpdate = createRefUpdate(notesBranch, mergeCommit, theirsCommit); remainingLockFailureCalls = MAX_LOCK_FAILURE_CALLS; } else if (result == Result.IO_FAILURE) { - throw new IOException("Couldn't update " + notesBranch + ". " - + result.name()); + throw new IOException("Couldn't update " + notesBranch + ". " + result.name()); } else { gitRefUpdated.fire(project, refUpdate, null); break; @@ -267,8 +255,8 @@ public class NotesBranchUtil { } } - private RefUpdate createRefUpdate(String notesBranch, ObjectId newObjectId, - ObjectId expectedOldObjectId) throws IOException { + private RefUpdate createRefUpdate( + String notesBranch, ObjectId newObjectId, ObjectId expectedOldObjectId) throws IOException { RefUpdate refUpdate = db.updateRef(notesBranch); refUpdate.setNewObjectId(newObjectId); if (expectedOldObjectId == null) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/NotifyConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/NotifyConfig.java index b04b0f7c5a..55b94e5875 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/NotifyConfig.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/NotifyConfig.java @@ -18,14 +18,15 @@ import com.google.common.base.Strings; import com.google.gerrit.common.data.GroupReference; import com.google.gerrit.server.account.WatchConfig.NotifyType; import com.google.gerrit.server.mail.Address; - import java.util.EnumSet; import java.util.HashSet; import java.util.Set; public class NotifyConfig implements Comparable { public enum Header { - TO, CC, BCC + TO, + CC, + BCC } private String name; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/PerThreadRequestScope.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/PerThreadRequestScope.java index 91bc428fda..20f053abb1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/PerThreadRequestScope.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/PerThreadRequestScope.java @@ -23,7 +23,6 @@ import com.google.inject.Key; import com.google.inject.OutOfScopeException; import com.google.inject.Provider; import com.google.inject.Scope; - import java.util.HashMap; import java.util.Map; import java.util.concurrent.Callable; @@ -53,7 +52,8 @@ public class PerThreadRequestScope { public static class Propagator extends ThreadLocalRequestScopePropagator { @Inject - Propagator(ThreadLocalRequestContext local, + Propagator( + ThreadLocalRequestContext local, Provider dbProviderProvider) { super(REQUEST, current, local, dbProviderProvider); } @@ -91,25 +91,26 @@ public class PerThreadRequestScope { return ctx; } - public static final Scope REQUEST = new Scope() { - @Override - public Provider scope(final Key key, final Provider creator) { - return new Provider() { + public static final Scope REQUEST = + new Scope() { @Override - public T get() { - return requireContext().get(key, creator); + public Provider scope(final Key key, final Provider creator) { + return new Provider() { + @Override + public T get() { + return requireContext().get(key, creator); + } + + @Override + public String toString() { + return String.format("%s[%s]", creator, REQUEST); + } + }; } @Override public String toString() { - return String.format("%s[%s]", creator, REQUEST); + return "PerThreadRequestScope.REQUEST"; } }; - } - - @Override - public String toString() { - return "PerThreadRequestScope.REQUEST"; - } - }; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java index c101bbb7ae..e9b22a7eb1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java @@ -55,14 +55,6 @@ import com.google.gerrit.server.config.PluginConfig; import com.google.gerrit.server.mail.Address; import com.google.gerrit.server.project.CommentLinkInfoImpl; import com.google.gerrit.server.project.RefPattern; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.CommitBuilder; -import org.eclipse.jgit.lib.Config; -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.transport.RefSpec; -import org.eclipse.jgit.util.StringUtils; - import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -78,6 +70,12 @@ import java.util.Map.Entry; import java.util.Set; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.CommitBuilder; +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.transport.RefSpec; +import org.eclipse.jgit.util.StringUtils; public class ProjectConfig extends VersionedMetaData implements ValidationError.Sink { public static final String COMMENTLINK = "commentlink"; @@ -117,11 +115,9 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. private static final String RECEIVE = "receive"; private static final String KEY_REQUIRE_SIGNED_OFF_BY = "requireSignedOffBy"; private static final String KEY_REQUIRE_CHANGE_ID = "requireChangeId"; - private static final String KEY_USE_ALL_NOT_IN_TARGET = - "createNewChangeForAllNotInTarget"; + private static final String KEY_USE_ALL_NOT_IN_TARGET = "createNewChangeForAllNotInTarget"; private static final String KEY_MAX_OBJECT_SIZE_LIMIT = "maxObjectSizeLimit"; - private static final String KEY_REQUIRE_CONTRIBUTOR_AGREEMENT = - "requireContributorAgreement"; + private static final String KEY_REQUIRE_CONTRIBUTOR_AGREEMENT = "requireContributorAgreement"; private static final String KEY_CHECK_RECEIVED_OBJECTS = "checkReceivedObjects"; private static final String KEY_ENABLE_SIGNED_PUSH = "enableSignedPush"; private static final String KEY_REQUIRE_SIGNED_PUSH = "requireSignedPush"; @@ -146,25 +142,26 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. private static final String KEY_COPY_MIN_SCORE = "copyMinScore"; private static final String KEY_ALLOW_POST_SUBMIT = "allowPostSubmit"; private static final String KEY_COPY_MAX_SCORE = "copyMaxScore"; - private static final String KEY_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE = "copyAllScoresOnMergeFirstParentUpdate"; - private static final String KEY_COPY_ALL_SCORES_ON_TRIVIAL_REBASE = "copyAllScoresOnTrivialRebase"; + private static final String KEY_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE = + "copyAllScoresOnMergeFirstParentUpdate"; + private static final String KEY_COPY_ALL_SCORES_ON_TRIVIAL_REBASE = + "copyAllScoresOnTrivialRebase"; private static final String KEY_COPY_ALL_SCORES_IF_NO_CODE_CHANGE = "copyAllScoresIfNoCodeChange"; private static final String KEY_COPY_ALL_SCORES_IF_NO_CHANGE = "copyAllScoresIfNoChange"; private static final String KEY_VALUE = "value"; private static final String KEY_CAN_OVERRIDE = "canOverride"; private static final String KEY_BRANCH = "branch"; - private static final Set LABEL_FUNCTIONS = ImmutableSet.of( - "MaxWithBlock", "AnyWithBlock", "MaxNoBlock", "NoBlock", "NoOp", "PatchSetLock"); + private static final Set LABEL_FUNCTIONS = + ImmutableSet.of( + "MaxWithBlock", "AnyWithBlock", "MaxNoBlock", "NoBlock", "NoOp", "PatchSetLock"); private static final String LEGACY_PERMISSION_PUSH_TAG = "pushTag"; private static final String LEGACY_PERMISSION_PUSH_SIGNED_TAG = "pushSignedTag"; private static final String PLUGIN = "plugin"; - private static final SubmitType DEFAULT_SUBMIT_ACTION = - SubmitType.MERGE_IF_NECESSARY; - private static final ProjectState DEFAULT_STATE_VALUE = - ProjectState.ACTIVE; + private static final SubmitType DEFAULT_SUBMIT_ACTION = SubmitType.MERGE_IF_NECESSARY; + private static final ProjectState DEFAULT_STATE_VALUE = ProjectState.ACTIVE; private Project.NameKey projectName; private Project project; @@ -186,8 +183,8 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. private Set sectionsWithUnknownPermissions; private boolean hasLegacyPermissions; - public static ProjectConfig read(MetaDataUpdate update) throws IOException, - ConfigInvalidException { + public static ProjectConfig read(MetaDataUpdate update) + throws IOException, ConfigInvalidException { ProjectConfig r = new ProjectConfig(update.getProjectName()); r.load(update); return r; @@ -200,8 +197,8 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. return r; } - public static CommentLinkInfoImpl buildCommentLink(Config cfg, String name, - boolean allowRaw) throws IllegalArgumentException { + public static CommentLinkInfoImpl buildCommentLink(Config cfg, String name, boolean allowRaw) + throws IllegalArgumentException { String match = cfg.getString(COMMENTLINK, name, KEY_MATCH); if (match != null) { // Unfortunately this validation isn't entirely complete. Clients @@ -225,7 +222,9 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. } checkArgument(allowRaw || !hasHtml, "Raw html replacement not allowed"); - if (Strings.isNullOrEmpty(match) && Strings.isNullOrEmpty(link) && !hasHtml + if (Strings.isNullOrEmpty(match) + && Strings.isNullOrEmpty(link) + && !hasHtml && enabled != null) { if (enabled) { return new CommentLinkInfoImpl.Enabled(name); @@ -276,8 +275,7 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. return subscribeSections; } - public Collection getSubscribeSections( - Branch.NameKey branch) { + public Collection getSubscribeSections(Branch.NameKey branch) { Collection ret = new ArrayList<>(); for (SubscribeSection s : subscribeSections.values()) { if (s.appliesTo(branch)) { @@ -315,8 +313,7 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. } } - public void remove(AccessSection section, - Permission permission, PermissionRule rule) { + public void remove(AccessSection section, Permission permission, PermissionRule rule) { if (rule == null) { remove(section, permission); } else if (section != null && permission != null) { @@ -419,24 +416,21 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. } /** - * @return the project's rules.pl ObjectId, if present in the branch. - * Null if it doesn't exist. + * @return the project's rules.pl ObjectId, if present in the branch. Null if it doesn't exist. */ public ObjectId getRulesId() { return rulesId; } /** - * @return the maxObjectSizeLimit for this project, if set. Zero if this - * project doesn't define own maxObjectSizeLimit. + * @return the maxObjectSizeLimit for this project, if set. Zero if this project doesn't define + * own maxObjectSizeLimit. */ public long getMaxObjectSizeLimit() { return maxObjectSizeLimit; } - /** - * @return the checkReceivedObjects for this project, default is true. - */ + /** @return the checkReceivedObjects for this project, default is true. */ public boolean getCheckReceivedObjects() { return checkReceivedObjects; } @@ -494,25 +488,27 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. if (rc.getStringList(ACCESS, null, KEY_INHERIT_FROM).length > 1) { // The config must not contain more than one parent to inherit from // as there is no guarantee which of the parents would be used then. - error(new ValidationError(PROJECT_CONFIG, - "Cannot inherit from multiple projects")); + error(new ValidationError(PROJECT_CONFIG, "Cannot inherit from multiple projects")); } p.setParentName(rc.getString(ACCESS, null, KEY_INHERIT_FROM)); - p.setUseContributorAgreements(getEnum(rc, RECEIVE, null, KEY_REQUIRE_CONTRIBUTOR_AGREEMENT, InheritableBoolean.INHERIT)); - p.setUseSignedOffBy(getEnum(rc, RECEIVE, null, KEY_REQUIRE_SIGNED_OFF_BY, InheritableBoolean.INHERIT)); - p.setRequireChangeID(getEnum(rc, RECEIVE, null, KEY_REQUIRE_CHANGE_ID, InheritableBoolean.INHERIT)); - p.setCreateNewChangeForAllNotInTarget(getEnum(rc, RECEIVE, null, KEY_USE_ALL_NOT_IN_TARGET, InheritableBoolean.INHERIT)); - p.setEnableSignedPush(getEnum(rc, RECEIVE, null, - KEY_ENABLE_SIGNED_PUSH, InheritableBoolean.INHERIT)); - p.setRequireSignedPush(getEnum(rc, RECEIVE, null, - KEY_REQUIRE_SIGNED_PUSH, InheritableBoolean.INHERIT)); + p.setUseContributorAgreements( + getEnum(rc, RECEIVE, null, KEY_REQUIRE_CONTRIBUTOR_AGREEMENT, InheritableBoolean.INHERIT)); + p.setUseSignedOffBy( + getEnum(rc, RECEIVE, null, KEY_REQUIRE_SIGNED_OFF_BY, InheritableBoolean.INHERIT)); + p.setRequireChangeID( + getEnum(rc, RECEIVE, null, KEY_REQUIRE_CHANGE_ID, InheritableBoolean.INHERIT)); + p.setCreateNewChangeForAllNotInTarget( + getEnum(rc, RECEIVE, null, KEY_USE_ALL_NOT_IN_TARGET, InheritableBoolean.INHERIT)); + p.setEnableSignedPush( + getEnum(rc, RECEIVE, null, KEY_ENABLE_SIGNED_PUSH, InheritableBoolean.INHERIT)); + p.setRequireSignedPush( + getEnum(rc, RECEIVE, null, KEY_REQUIRE_SIGNED_PUSH, InheritableBoolean.INHERIT)); p.setMaxObjectSizeLimit(rc.getString(RECEIVE, null, KEY_MAX_OBJECT_SIZE_LIMIT)); - p.setRejectImplicitMerges(getEnum(rc, RECEIVE, null, - KEY_REJECT_IMPLICIT_MERGES, InheritableBoolean.INHERIT)); + p.setRejectImplicitMerges( + getEnum(rc, RECEIVE, null, KEY_REJECT_IMPLICIT_MERGES, InheritableBoolean.INHERIT)); - p.setSubmitType(getEnum(rc, SUBMIT, null, KEY_ACTION, - DEFAULT_SUBMIT_ACTION)); + p.setSubmitType(getEnum(rc, SUBMIT, null, KEY_ACTION, DEFAULT_SUBMIT_ACTION)); p.setUseContentMerge(getEnum(rc, SUBMIT, null, KEY_MERGE_CONTENT, InheritableBoolean.INHERIT)); p.setState(getEnum(rc, PROJECT, null, KEY_STATE, DEFAULT_STATE_VALUE)); @@ -532,39 +528,48 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. loadReceiveSection(rc); } - private void loadAccountsSection( - Config rc, Map groupsByName) { + private void loadAccountsSection(Config rc, Map groupsByName) { accountsSection = new AccountsSection(); - accountsSection.setSameGroupVisibility(loadPermissionRules( - rc, ACCOUNTS, null, KEY_SAME_GROUP_VISIBILITY, groupsByName, false)); + accountsSection.setSameGroupVisibility( + loadPermissionRules(rc, ACCOUNTS, null, KEY_SAME_GROUP_VISIBILITY, groupsByName, false)); } - private void loadContributorAgreements( - Config rc, Map groupsByName) { + private void loadContributorAgreements(Config rc, Map groupsByName) { contributorAgreements = new HashMap<>(); for (String name : rc.getSubsections(CONTRIBUTOR_AGREEMENT)) { ContributorAgreement ca = getContributorAgreement(name, true); ca.setDescription(rc.getString(CONTRIBUTOR_AGREEMENT, name, KEY_DESCRIPTION)); ca.setAgreementUrl(rc.getString(CONTRIBUTOR_AGREEMENT, name, KEY_AGREEMENT_URL)); - ca.setAccepted(loadPermissionRules( - rc, CONTRIBUTOR_AGREEMENT, name, KEY_ACCEPTED, groupsByName, false)); + ca.setAccepted( + loadPermissionRules(rc, CONTRIBUTOR_AGREEMENT, name, KEY_ACCEPTED, groupsByName, false)); - List rules = loadPermissionRules( - rc, CONTRIBUTOR_AGREEMENT, name, KEY_AUTO_VERIFY, groupsByName, false); + List rules = + loadPermissionRules( + rc, CONTRIBUTOR_AGREEMENT, name, KEY_AUTO_VERIFY, groupsByName, false); if (rules.isEmpty()) { ca.setAutoVerify(null); } else if (rules.size() > 1) { - error(new ValidationError(PROJECT_CONFIG, "Invalid rule in " - + CONTRIBUTOR_AGREEMENT - + "." + name - + "." + KEY_AUTO_VERIFY - + ": at most one group may be set")); + error( + new ValidationError( + PROJECT_CONFIG, + "Invalid rule in " + + CONTRIBUTOR_AGREEMENT + + "." + + name + + "." + + KEY_AUTO_VERIFY + + ": at most one group may be set")); } else if (rules.get(0).getAction() != Action.ALLOW) { - error(new ValidationError(PROJECT_CONFIG, "Invalid rule in " - + CONTRIBUTOR_AGREEMENT - + "." + name - + "." + KEY_AUTO_VERIFY - + ": the group must be allowed")); + error( + new ValidationError( + PROJECT_CONFIG, + "Invalid rule in " + + CONTRIBUTOR_AGREEMENT + + "." + + name + + "." + + KEY_AUTO_VERIFY + + ": the group must be allowed")); } else { ca.setAutoVerify(rules.get(0).getGroup()); } @@ -589,8 +594,7 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. * type = submitted_changes *

*/ - private void loadNotifySections( - Config rc, Map groupsByName) { + private void loadNotifySections(Config rc, Map groupsByName) { notifySections = new HashMap<>(); for (String sectionName : rc.getSubsections(NOTIFY)) { NotifyConfig n = new NotifyConfig(); @@ -598,12 +602,9 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. n.setFilter(rc.getString(NOTIFY, sectionName, KEY_FILTER)); EnumSet types = EnumSet.noneOf(NotifyType.class); - types.addAll(ConfigUtil.getEnumList(rc, - NOTIFY, sectionName, KEY_TYPE, - NotifyType.ALL)); + types.addAll(ConfigUtil.getEnumList(rc, NOTIFY, sectionName, KEY_TYPE, NotifyType.ALL)); n.setTypes(types); - n.setHeader(rc.getEnum(NOTIFY, sectionName, KEY_HEADER, - NotifyConfig.Header.BCC)); + n.setHeader(rc.getEnum(NOTIFY, sectionName, KEY_HEADER, NotifyConfig.Header.BCC)); for (String dst : rc.getStringList(NOTIFY, sectionName, KEY_EMAIL)) { if (dst.startsWith("group ")) { @@ -616,8 +617,10 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. if (ref.getUUID() != null) { n.addEmail(ref); } else { - error(new ValidationError(PROJECT_CONFIG, - "group \"" + ref.getName() + "\" not in " + GroupList.FILE_NAME)); + error( + new ValidationError( + PROJECT_CONFIG, + "group \"" + ref.getName() + "\" not in " + GroupList.FILE_NAME)); } } else if (dst.startsWith("user ")) { error(new ValidationError(PROJECT_CONFIG, dst + " not supported")); @@ -625,8 +628,10 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. try { n.addEmail(Address.parse(dst)); } catch (IllegalArgumentException err) { - error(new ValidationError(PROJECT_CONFIG, - "notify section \"" + sectionName + "\" has invalid email \"" + dst + "\"")); + error( + new ValidationError( + PROJECT_CONFIG, + "notify section \"" + sectionName + "\" has invalid email \"" + dst + "\"")); } } } @@ -634,8 +639,7 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. } } - private void loadAccessSections( - Config rc, Map groupsByName) { + private void loadAccessSections(Config rc, Map groupsByName) { accessSections = new HashMap<>(); sectionsWithUnknownPermissions = new HashSet<>(); for (String refName : rc.getSubsections(ACCESS)) { @@ -655,8 +659,14 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. String convertedName = convertLegacyPermission(varName); if (isPermission(convertedName)) { Permission perm = as.getPermission(convertedName, true); - loadPermissionRules(rc, ACCESS, refName, varName, groupsByName, - perm, Permission.hasRange(convertedName)); + loadPermissionRules( + rc, + ACCESS, + refName, + varName, + groupsByName, + perm, + Permission.hasRange(convertedName)); } else { sectionsWithUnknownPermissions.add(as.getName()); } @@ -671,8 +681,8 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. accessSections.put(AccessSection.GLOBAL_CAPABILITIES, capability); } Permission perm = capability.getPermission(varName, true); - loadPermissionRules(rc, CAPABILITY, null, varName, groupsByName, perm, - GlobalCapability.hasRange(varName)); + loadPermissionRules( + rc, CAPABILITY, null, varName, groupsByName, perm, GlobalCapability.hasRange(varName)); } } @@ -680,8 +690,7 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. try { RefPattern.validateRegExp(refPattern); } catch (InvalidNameException e) { - error(new ValidationError(PROJECT_CONFIG, "Invalid ref name: " - + e.getMessage())); + error(new ValidationError(PROJECT_CONFIG, "Invalid ref name: " + e.getMessage())); return false; } return true; @@ -689,13 +698,15 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. private void loadBranchOrderSection(Config rc) { if (rc.getSections().contains(BRANCH_ORDER)) { - branchOrderSection = new BranchOrderSection( - rc.getStringList(BRANCH_ORDER, null, BRANCH)); + branchOrderSection = new BranchOrderSection(rc.getStringList(BRANCH_ORDER, null, BRANCH)); } } - private List loadPermissionRules(Config rc, String section, - String subsection, String varName, + private List loadPermissionRules( + Config rc, + String section, + String subsection, + String varName, Map groupsByName, boolean useRange) { Permission perm = new Permission(varName); @@ -703,20 +714,29 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. return perm.getRules(); } - private void loadPermissionRules(Config rc, String section, - String subsection, String varName, - Map groupsByName, Permission perm, + private void loadPermissionRules( + Config rc, + String section, + String subsection, + String varName, + Map groupsByName, + Permission perm, boolean useRange) { for (String ruleString : rc.getStringList(section, subsection, varName)) { PermissionRule rule; try { rule = PermissionRule.fromString(ruleString, useRange); } catch (IllegalArgumentException notRule) { - error(new ValidationError(PROJECT_CONFIG, "Invalid rule in " - + section - + (subsection != null ? "." + subsection : "") - + "." + varName + ": " - + notRule.getMessage())); + error( + new ValidationError( + PROJECT_CONFIG, + "Invalid rule in " + + section + + (subsection != null ? "." + subsection : "") + + "." + + varName + + ": " + + notRule.getMessage())); continue; } @@ -728,8 +748,9 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. // ref = rule.getGroup(); groupsByName.put(ref.getName(), ref); - error(new ValidationError(PROJECT_CONFIG, - "group \"" + ref.getName() + "\" not in " + GroupList.FILE_NAME)); + error( + new ValidationError( + PROJECT_CONFIG, "group \"" + ref.getName() + "\" not in " + GroupList.FILE_NAME)); } rule.setGroup(ref); @@ -738,16 +759,14 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. } private static LabelValue parseLabelValue(String src) { - List parts = ImmutableList.copyOf( - Splitter.on(CharMatcher.whitespace()).omitEmptyStrings().limit(2) - .split(src)); + List parts = + ImmutableList.copyOf( + Splitter.on(CharMatcher.whitespace()).omitEmptyStrings().limit(2).split(src)); if (parts.isEmpty()) { throw new IllegalArgumentException("empty value"); } String valueText = parts.size() > 1 ? parts.get(1) : ""; - return new LabelValue( - Shorts.checkedCast(PermissionRule.parseInt(parts.get(0))), - valueText); + return new LabelValue(Shorts.checkedCast(PermissionRule.parseInt(parts.get(0))), valueText); } private void loadLabelSections(Config rc) { @@ -756,9 +775,10 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. for (String name : rc.getSubsections(LABEL)) { String lower = name.toLowerCase(); if (lowerNames.containsKey(lower)) { - error(new ValidationError(PROJECT_CONFIG, String.format( - "Label \"%s\" conflicts with \"%s\"", - name, lowerNames.get(lower)))); + error( + new ValidationError( + PROJECT_CONFIG, + String.format("Label \"%s\" conflicts with \"%s\"", name, lowerNames.get(lower)))); } lowerNames.put(lower, name); @@ -767,9 +787,12 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. try { values.add(parseLabelValue(value)); } catch (IllegalArgumentException notValue) { - error(new ValidationError(PROJECT_CONFIG, String.format( - "Invalid %s \"%s\" for label \"%s\": %s", - KEY_VALUE, value, name, notValue.getMessage()))); + error( + new ValidationError( + PROJECT_CONFIG, + String.format( + "Invalid %s \"%s\" for label \"%s\": %s", + KEY_VALUE, value, name, notValue.getMessage()))); } } @@ -777,19 +800,21 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. try { label = new LabelType(name, values); } catch (IllegalArgumentException badName) { - error(new ValidationError(PROJECT_CONFIG, String.format( - "Invalid label \"%s\"", name))); + error(new ValidationError(PROJECT_CONFIG, String.format("Invalid label \"%s\"", name))); continue; } - String functionName = MoreObjects.firstNonNull( - rc.getString(LABEL, name, KEY_FUNCTION), "MaxWithBlock"); + String functionName = + MoreObjects.firstNonNull(rc.getString(LABEL, name, KEY_FUNCTION), "MaxWithBlock"); if (LABEL_FUNCTIONS.contains(functionName)) { label.setFunctionName(functionName); } else { - error(new ValidationError(PROJECT_CONFIG, String.format( - "Invalid %s for label \"%s\". Valid names are: %s", - KEY_FUNCTION, name, Joiner.on(", ").join(LABEL_FUNCTIONS)))); + error( + new ValidationError( + PROJECT_CONFIG, + String.format( + "Invalid %s for label \"%s\". Valid names are: %s", + KEY_FUNCTION, name, Joiner.on(", ").join(LABEL_FUNCTIONS)))); label.setFunctionName(null); } @@ -798,35 +823,45 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. if (isInRange(dv, values)) { label.setDefaultValue(dv); } else { - error(new ValidationError(PROJECT_CONFIG, String.format( - "Invalid %s \"%s\" for label \"%s\"", - KEY_DEFAULT_VALUE, dv, name))); + error( + new ValidationError( + PROJECT_CONFIG, + String.format( + "Invalid %s \"%s\" for label \"%s\"", KEY_DEFAULT_VALUE, dv, name))); } } label.setAllowPostSubmit( - rc.getBoolean(LABEL, name, KEY_ALLOW_POST_SUBMIT, - LabelType.DEF_ALLOW_POST_SUBMIT)); + rc.getBoolean(LABEL, name, KEY_ALLOW_POST_SUBMIT, LabelType.DEF_ALLOW_POST_SUBMIT)); label.setCopyMinScore( - rc.getBoolean(LABEL, name, KEY_COPY_MIN_SCORE, - LabelType.DEF_COPY_MIN_SCORE)); + rc.getBoolean(LABEL, name, KEY_COPY_MIN_SCORE, LabelType.DEF_COPY_MIN_SCORE)); label.setCopyMaxScore( - rc.getBoolean(LABEL, name, KEY_COPY_MAX_SCORE, - LabelType.DEF_COPY_MAX_SCORE)); + rc.getBoolean(LABEL, name, KEY_COPY_MAX_SCORE, LabelType.DEF_COPY_MAX_SCORE)); label.setCopyAllScoresOnMergeFirstParentUpdate( - rc.getBoolean(LABEL, name, KEY_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE, + rc.getBoolean( + LABEL, + name, + KEY_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE, LabelType.DEF_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE)); label.setCopyAllScoresOnTrivialRebase( - rc.getBoolean(LABEL, name, KEY_COPY_ALL_SCORES_ON_TRIVIAL_REBASE, + rc.getBoolean( + LABEL, + name, + KEY_COPY_ALL_SCORES_ON_TRIVIAL_REBASE, LabelType.DEF_COPY_ALL_SCORES_ON_TRIVIAL_REBASE)); label.setCopyAllScoresIfNoCodeChange( - rc.getBoolean(LABEL, name, KEY_COPY_ALL_SCORES_IF_NO_CODE_CHANGE, + rc.getBoolean( + LABEL, + name, + KEY_COPY_ALL_SCORES_IF_NO_CODE_CHANGE, LabelType.DEF_COPY_ALL_SCORES_IF_NO_CODE_CHANGE)); label.setCopyAllScoresIfNoChange( - rc.getBoolean(LABEL, name, KEY_COPY_ALL_SCORES_IF_NO_CHANGE, + rc.getBoolean( + LABEL, + name, + KEY_COPY_ALL_SCORES_IF_NO_CHANGE, LabelType.DEF_COPY_ALL_SCORES_IF_NO_CHANGE)); label.setCanOverride( - rc.getBoolean(LABEL, name, KEY_CAN_OVERRIDE, - LabelType.DEF_CAN_OVERRIDE)); + rc.getBoolean(LABEL, name, KEY_CAN_OVERRIDE, LabelType.DEF_CAN_OVERRIDE)); label.setRefPatterns(getStringListOrNull(rc, LABEL, name, KEY_BRANCH)); labelSections.put(name, label); } @@ -841,8 +876,8 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. return false; } - private List getStringListOrNull(Config rc, String section, - String subSection, String name) { + private List getStringListOrNull( + Config rc, String section, String subSection, String name) { String[] ac = rc.getStringList(section, subSection, name); return ac.length == 0 ? null : Arrays.asList(ac); } @@ -854,13 +889,19 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. try { commentLinkSections.add(buildCommentLink(rc, name, false)); } catch (PatternSyntaxException e) { - error(new ValidationError(PROJECT_CONFIG, String.format( - "Invalid pattern \"%s\" in commentlink.%s.match: %s", - rc.getString(COMMENTLINK, name, KEY_MATCH), name, e.getMessage()))); + error( + new ValidationError( + PROJECT_CONFIG, + String.format( + "Invalid pattern \"%s\" in commentlink.%s.match: %s", + rc.getString(COMMENTLINK, name, KEY_MATCH), name, e.getMessage()))); } catch (IllegalArgumentException e) { - error(new ValidationError(PROJECT_CONFIG, String.format( - "Error in pattern \"%s\" in commentlink.%s.match: %s", - rc.getString(COMMENTLINK, name, KEY_MATCH), name, e.getMessage()))); + error( + new ValidationError( + PROJECT_CONFIG, + String.format( + "Error in pattern \"%s\" in commentlink.%s.match: %s", + rc.getString(COMMENTLINK, name, KEY_MATCH), name, e.getMessage()))); } } commentLinkSections = ImmutableList.copyOf(commentLinkSections); @@ -873,12 +914,11 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. for (String projectName : subsections) { Project.NameKey p = new Project.NameKey(projectName); SubscribeSection ss = new SubscribeSection(p); - for (String s : rc.getStringList(SUBSCRIBE_SECTION, - projectName, SUBSCRIBE_MULTI_MATCH_REFS)) { + for (String s : + rc.getStringList(SUBSCRIBE_SECTION, projectName, SUBSCRIBE_MULTI_MATCH_REFS)) { ss.addMultiMatchRefSpec(s); } - for (String s : rc.getStringList(SUBSCRIBE_SECTION, - projectName, SUBSCRIBE_MATCH_REFS)) { + for (String s : rc.getStringList(SUBSCRIBE_SECTION, projectName, SUBSCRIBE_MATCH_REFS)) { ss.addMatchingRefSpec(s); } subscribeSections.put(p, ss); @@ -905,13 +945,15 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. GroupReference ref = groupList.byUUID(refFromString.getUUID()); if (ref == null) { ref = refFromString; - error(new ValidationError(PROJECT_CONFIG, - "group \"" + ref.getName() + "\" not in " + GroupList.FILE_NAME)); + error( + new ValidationError( + PROJECT_CONFIG, + "group \"" + ref.getName() + "\" not in " + GroupList.FILE_NAME)); } rc.setString(PLUGIN, plugin, name, ref.toString()); } - pluginConfig.setStringList(PLUGIN, plugin, name, - Arrays.asList(rc.getStringList(PLUGIN, plugin, name))); + pluginConfig.setStringList( + PLUGIN, plugin, name, Arrays.asList(rc.getStringList(PLUGIN, plugin, name))); } } } @@ -926,8 +968,7 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. } private void readGroupList() throws IOException { - groupList = GroupList.parse( - projectName, readUTF8(GroupList.FILE_NAME), this); + groupList = GroupList.parse(projectName, readUTF8(GroupList.FILE_NAME), this); } private Map mapGroupReferences() { @@ -941,8 +982,7 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. } @Override - protected boolean onSave(CommitBuilder commit) throws IOException, - ConfigInvalidException { + protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException { if (commit.getMessage() == null || "".equals(commit.getMessage())) { commit.setMessage("Updated project configuration\n"); } @@ -957,17 +997,61 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. } set(rc, ACCESS, null, KEY_INHERIT_FROM, p.getParentName()); - set(rc, RECEIVE, null, KEY_REQUIRE_CONTRIBUTOR_AGREEMENT, p.getUseContributorAgreements(), InheritableBoolean.INHERIT); - set(rc, RECEIVE, null, KEY_REQUIRE_SIGNED_OFF_BY, p.getUseSignedOffBy(), InheritableBoolean.INHERIT); - set(rc, RECEIVE, null, KEY_REQUIRE_CHANGE_ID, p.getRequireChangeID(), InheritableBoolean.INHERIT); - set(rc, RECEIVE, null, KEY_USE_ALL_NOT_IN_TARGET, p.getCreateNewChangeForAllNotInTarget(), InheritableBoolean.INHERIT); - set(rc, RECEIVE, null, KEY_MAX_OBJECT_SIZE_LIMIT, validMaxObjectSizeLimit(p.getMaxObjectSizeLimit())); - set(rc, RECEIVE, null, KEY_ENABLE_SIGNED_PUSH, - p.getEnableSignedPush(), InheritableBoolean.INHERIT); - set(rc, RECEIVE, null, KEY_REQUIRE_SIGNED_PUSH, - p.getRequireSignedPush(), InheritableBoolean.INHERIT); - set(rc, RECEIVE, null, KEY_REJECT_IMPLICIT_MERGES, - p.getRejectImplicitMerges(), InheritableBoolean.INHERIT); + set( + rc, + RECEIVE, + null, + KEY_REQUIRE_CONTRIBUTOR_AGREEMENT, + p.getUseContributorAgreements(), + InheritableBoolean.INHERIT); + set( + rc, + RECEIVE, + null, + KEY_REQUIRE_SIGNED_OFF_BY, + p.getUseSignedOffBy(), + InheritableBoolean.INHERIT); + set( + rc, + RECEIVE, + null, + KEY_REQUIRE_CHANGE_ID, + p.getRequireChangeID(), + InheritableBoolean.INHERIT); + set( + rc, + RECEIVE, + null, + KEY_USE_ALL_NOT_IN_TARGET, + p.getCreateNewChangeForAllNotInTarget(), + InheritableBoolean.INHERIT); + set( + rc, + RECEIVE, + null, + KEY_MAX_OBJECT_SIZE_LIMIT, + validMaxObjectSizeLimit(p.getMaxObjectSizeLimit())); + set( + rc, + RECEIVE, + null, + KEY_ENABLE_SIGNED_PUSH, + p.getEnableSignedPush(), + InheritableBoolean.INHERIT); + set( + rc, + RECEIVE, + null, + KEY_REQUIRE_SIGNED_PUSH, + p.getRequireSignedPush(), + InheritableBoolean.INHERIT); + set( + rc, + RECEIVE, + null, + KEY_REJECT_IMPLICIT_MERGES, + p.getRejectImplicitMerges(), + InheritableBoolean.INHERIT); set(rc, SUBMIT, null, KEY_ACTION, p.getSubmitType(), DEFAULT_SUBMIT_ACTION); set(rc, SUBMIT, null, KEY_MERGE_CONTENT, p.getUseContentMerge(), InheritableBoolean.INHERIT); @@ -992,8 +1076,7 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. return true; } - public static final String validMaxObjectSizeLimit(String value) - throws ConfigInvalidException { + public static final String validMaxObjectSizeLimit(String value) throws ConfigInvalidException { if (value == null) { return null; } @@ -1006,9 +1089,9 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. try { long s = cfg.getLong("s", "n", 0); if (s < 0) { - throw new ConfigInvalidException(String.format( - "Negative value '%s' not allowed as %s", value, - KEY_MAX_OBJECT_SIZE_LIMIT)); + throw new ConfigInvalidException( + String.format( + "Negative value '%s' not allowed as %s", value, KEY_MAX_OBJECT_SIZE_LIMIT)); } if (s == 0) { // return null for the default so that it is not persisted @@ -1023,13 +1106,15 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. private void saveAccountsSection(Config rc, Set keepGroups) { if (accountsSection != null) { - rc.setStringList(ACCOUNTS, null, KEY_SAME_GROUP_VISIBILITY, + rc.setStringList( + ACCOUNTS, + null, + KEY_SAME_GROUP_VISIBILITY, ruleToStringList(accountsSection.getSameGroupVisibility(), keepGroups)); } } - private void saveContributorAgreements( - Config rc, Set keepGroups) { + private void saveContributorAgreements(Config rc, Set keepGroups) { for (ContributorAgreement ca : sort(contributorAgreements.values())) { set(rc, CONTRIBUTOR_AGREEMENT, ca.getName(), KEY_DESCRIPTION, ca.getDescription()); set(rc, CONTRIBUTOR_AGREEMENT, ca.getName(), KEY_AGREEMENT_URL, ca.getAgreementUrl()); @@ -1044,13 +1129,15 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. rc.unset(CONTRIBUTOR_AGREEMENT, ca.getName(), KEY_AUTO_VERIFY); } - rc.setStringList(CONTRIBUTOR_AGREEMENT, ca.getName(), KEY_ACCEPTED, + rc.setStringList( + CONTRIBUTOR_AGREEMENT, + ca.getName(), + KEY_ACCEPTED, ruleToStringList(ca.getAccepted(), keepGroups)); } } - private void saveNotifySections( - Config rc, Set keepGroups) { + private void saveNotifySections(Config rc, Set keepGroups) { for (NotifyConfig nc : sort(notifySections.values())) { List email = new ArrayList<>(); for (GroupReference gr : nc.getGroups()) { @@ -1068,8 +1155,7 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. Collections.sort(addrs); email.addAll(addrs); - set(rc, NOTIFY, nc.getName(), KEY_HEADER, - nc.getHeader(), NotifyConfig.Header.BCC); + set(rc, NOTIFY, nc.getName(), KEY_HEADER, nc.getHeader(), NotifyConfig.Header.BCC); if (email.isEmpty()) { rc.unset(NOTIFY, nc.getName(), KEY_EMAIL); } else { @@ -1104,8 +1190,7 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. return rules; } - private void saveAccessSections( - Config rc, Set keepGroups) { + private void saveAccessSections(Config rc, Set keepGroups) { AccessSection capability = accessSections.get(AccessSection.GLOBAL_CAPABILITIES); if (capability != null) { Set have = new HashSet<>(); @@ -1201,28 +1286,43 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. rc.setString(LABEL, name, KEY_FUNCTION, label.getFunctionName()); rc.setInt(LABEL, name, KEY_DEFAULT_VALUE, label.getDefaultValue()); - setBooleanConfigKey(rc, name, KEY_ALLOW_POST_SUBMIT, label.allowPostSubmit(), + setBooleanConfigKey( + rc, + name, + KEY_ALLOW_POST_SUBMIT, + label.allowPostSubmit(), LabelType.DEF_ALLOW_POST_SUBMIT); - setBooleanConfigKey(rc, name, KEY_COPY_MIN_SCORE, label.isCopyMinScore(), - LabelType.DEF_COPY_MIN_SCORE); - setBooleanConfigKey(rc, name, KEY_COPY_MAX_SCORE, label.isCopyMaxScore(), - LabelType.DEF_COPY_MAX_SCORE); - setBooleanConfigKey(rc, name, KEY_COPY_ALL_SCORES_ON_TRIVIAL_REBASE, + setBooleanConfigKey( + rc, name, KEY_COPY_MIN_SCORE, label.isCopyMinScore(), LabelType.DEF_COPY_MIN_SCORE); + setBooleanConfigKey( + rc, name, KEY_COPY_MAX_SCORE, label.isCopyMaxScore(), LabelType.DEF_COPY_MAX_SCORE); + setBooleanConfigKey( + rc, + name, + KEY_COPY_ALL_SCORES_ON_TRIVIAL_REBASE, label.isCopyAllScoresOnTrivialRebase(), LabelType.DEF_COPY_ALL_SCORES_ON_TRIVIAL_REBASE); - setBooleanConfigKey(rc, name, KEY_COPY_ALL_SCORES_IF_NO_CODE_CHANGE, + setBooleanConfigKey( + rc, + name, + KEY_COPY_ALL_SCORES_IF_NO_CODE_CHANGE, label.isCopyAllScoresIfNoCodeChange(), LabelType.DEF_COPY_ALL_SCORES_IF_NO_CODE_CHANGE); - setBooleanConfigKey(rc, name, KEY_COPY_ALL_SCORES_IF_NO_CHANGE, + setBooleanConfigKey( + rc, + name, + KEY_COPY_ALL_SCORES_IF_NO_CHANGE, label.isCopyAllScoresIfNoChange(), LabelType.DEF_COPY_ALL_SCORES_IF_NO_CHANGE); - setBooleanConfigKey(rc, name, KEY_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE, + setBooleanConfigKey( + rc, + name, + KEY_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE, label.isCopyAllScoresOnMergeFirstParentUpdate(), LabelType.DEF_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE); - setBooleanConfigKey(rc, name, KEY_CAN_OVERRIDE, label.canOverride(), - LabelType.DEF_CAN_OVERRIDE); - List values = - Lists.newArrayListWithCapacity(label.getValues().size()); + setBooleanConfigKey( + rc, name, KEY_CAN_OVERRIDE, label.canOverride(), LabelType.DEF_CAN_OVERRIDE); + List values = Lists.newArrayListWithCapacity(label.getValues().size()); for (LabelValue value : label.getValues()) { values.add(value.format()); } @@ -1261,8 +1361,8 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. pluginConfig.setString(PLUGIN, plugin, name, ref.toString()); } } - rc.setStringList(PLUGIN, plugin, name, - Arrays.asList(pluginConfig.getStringList(PLUGIN, plugin, name))); + rc.setStringList( + PLUGIN, plugin, name, Arrays.asList(pluginConfig.getStringList(PLUGIN, plugin, name))); } } } @@ -1278,20 +1378,18 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. for (RefSpec r : s.getMatchingRefSpecs()) { matchings.add(r.toString()); } - rc.setStringList(SUBSCRIBE_SECTION, p.get(), SUBSCRIBE_MATCH_REFS, - matchings); + rc.setStringList(SUBSCRIBE_SECTION, p.get(), SUBSCRIBE_MATCH_REFS, matchings); List multimatchs = new ArrayList<>(); for (RefSpec r : s.getMultiMatchRefSpecs()) { multimatchs.add(r.toString()); } - rc.setStringList(SUBSCRIBE_SECTION, p.get(), - SUBSCRIBE_MULTI_MATCH_REFS, multimatchs); + rc.setStringList(SUBSCRIBE_SECTION, p.get(), SUBSCRIBE_MULTI_MATCH_REFS, multimatchs); } } - private > E getEnum(Config rc, String section, - String subsection, String name, E defaultValue) { + private > E getEnum( + Config rc, String section, String subsection, String name, E defaultValue) { try { return rc.getEnum(section, subsection, name, defaultValue); } catch (IllegalArgumentException err) { @@ -1319,7 +1417,7 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError. } private String convertLegacyPermission(String permissionName) { - switch(permissionName) { + switch (permissionName) { case LEGACY_PERMISSION_PUSH_TAG: hasLegacyPermissions = true; return Permission.CREATE_TAG; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectLevelConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectLevelConfig.java index b4f41a0182..18dcef88c5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectLevelConfig.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectLevelConfig.java @@ -17,14 +17,12 @@ package com.google.gerrit.server.git; import com.google.common.collect.Iterables; import com.google.gerrit.reviewdb.client.RefNames; import com.google.gerrit.server.project.ProjectState; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.CommitBuilder; -import org.eclipse.jgit.lib.Config; - import java.io.IOException; import java.util.Arrays; import java.util.Set; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.CommitBuilder; +import org.eclipse.jgit.lib.Config; /** Configuration file in the projects refs/meta/config branch. */ public class ProjectLevelConfig extends VersionedMetaData { @@ -68,8 +66,8 @@ public class ProjectLevelConfig extends VersionedMetaData { Set allNames = get().getNames(section); for (String name : parentCfg.getNames(section)) { if (!allNames.contains(name)) { - cfgWithInheritance.setStringList(section, null, name, - Arrays.asList(parentCfg.getStringList(section, null, name))); + cfgWithInheritance.setStringList( + section, null, name, Arrays.asList(parentCfg.getStringList(section, null, name))); } } @@ -77,7 +75,10 @@ public class ProjectLevelConfig extends VersionedMetaData { allNames = get().getNames(section, subsection); for (String name : parentCfg.getNames(section, subsection)) { if (!allNames.contains(name)) { - cfgWithInheritance.setStringList(section, subsection, name, + cfgWithInheritance.setStringList( + section, + subsection, + name, Arrays.asList(parentCfg.getStringList(section, subsection, name))); } } @@ -88,8 +89,7 @@ public class ProjectLevelConfig extends VersionedMetaData { } @Override - protected boolean onSave(CommitBuilder commit) throws IOException, - ConfigInvalidException { + protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException { if (commit.getMessage() == null || "".equals(commit.getMessage())) { commit.setMessage("Updated configuration\n"); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectRunnable.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectRunnable.java index 70328780bc..23d2326dee 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectRunnable.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectRunnable.java @@ -15,7 +15,7 @@ package com.google.gerrit.server.git; import com.google.gerrit.reviewdb.client.Project; -/** Used to retrieve the project name from an operation **/ +/** Used to retrieve the project name from an operation * */ public interface ProjectRunnable extends Runnable { Project.NameKey getProjectNameKey(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/QueryList.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/QueryList.java index dffb18a969..1666baef27 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/QueryList.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/QueryList.java @@ -26,8 +26,7 @@ public class QueryList extends TabFile { this.queriesByName = toMap(queriesByName); } - public static QueryList parse(String text, ValidationError.Sink errors) - throws IOException { + public static QueryList parse(String text, ValidationError.Sink errors) throws IOException { return new QueryList(parse(text, FILE_NAME, TRIM, TRIM, errors)); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/QueueProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/QueueProvider.java index 06b87f2a81..28425e0cbe 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/QueueProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/QueueProvider.java @@ -16,7 +16,8 @@ package com.google.gerrit.server.git; public interface QueueProvider { enum QueueType { - INTERACTIVE, BATCH + INTERACTIVE, + BATCH } WorkQueue.Executor getQueue(QueueType type); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReadOnlyRepository.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReadOnlyRepository.java index 2a16148143..f78a60463d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReadOnlyRepository.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReadOnlyRepository.java @@ -16,6 +16,9 @@ package com.google.gerrit.server.git; import static com.google.common.base.Preconditions.checkNotNull; +import java.io.IOException; +import java.util.List; +import java.util.Map; import org.eclipse.jgit.attributes.AttributesNodeProvider; import org.eclipse.jgit.lib.BaseRepositoryBuilder; import org.eclipse.jgit.lib.ObjectDatabase; @@ -29,23 +32,16 @@ import org.eclipse.jgit.lib.ReflogReader; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.StoredConfig; -import java.io.IOException; -import java.util.List; -import java.util.Map; - class ReadOnlyRepository extends Repository { - private static final String MSG = - "Cannot modify a " + ReadOnlyRepository.class.getSimpleName(); + private static final String MSG = "Cannot modify a " + ReadOnlyRepository.class.getSimpleName(); private static BaseRepositoryBuilder builder(Repository r) { checkNotNull(r); - BaseRepositoryBuilder builder = new BaseRepositoryBuilder<>() - .setFS(r.getFS()) - .setGitDir(r.getDirectory()); + BaseRepositoryBuilder builder = + new BaseRepositoryBuilder<>().setFS(r.getFS()).setGitDir(r.getDirectory()); if (!r.isBare()) { - builder.setWorkTree(r.getWorkTree()) - .setIndexFile(r.getIndexFile()); + builder.setWorkTree(r.getWorkTree()).setIndexFile(r.getIndexFile()); } return builder; } @@ -134,8 +130,7 @@ class ReadOnlyRepository extends Repository { } @Override - public RefRename newRename(String fromName, String toName) - throws IOException { + public RefRename newRename(String fromName, String toName) throws IOException { throw new UnsupportedOperationException(MSG); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/RebaseSorter.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/RebaseSorter.java index 3284c129ab..576f47335a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/RebaseSorter.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/RebaseSorter.java @@ -24,12 +24,6 @@ import com.google.gerrit.server.git.strategy.CommitMergeStatus; import com.google.gerrit.server.query.change.ChangeData; import com.google.gerrit.server.query.change.InternalChangeQuery; import com.google.gwtorm.server.OrmException; - -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.revwalk.RevCommit; -import org.eclipse.jgit.revwalk.RevFlag; - import java.io.IOException; import java.util.ArrayList; import java.util.Collection; @@ -38,6 +32,10 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.revwalk.RevFlag; public class RebaseSorter { private final CodeReviewRevWalk rw; @@ -48,10 +46,14 @@ public class RebaseSorter { private final ChangeKindCache changeKindCache; private final Repository repo; - public RebaseSorter(CodeReviewRevWalk rw, RevCommit initialTip, - Set alreadyAccepted, RevFlag canMergeFlag, + public RebaseSorter( + CodeReviewRevWalk rw, + RevCommit initialTip, + Set alreadyAccepted, + RevFlag canMergeFlag, InternalChangeQuery internalChangeQuery, - ChangeKindCache changeKindCache, Repository repo) { + ChangeKindCache changeKindCache, + Repository repo) { this.rw = rw; this.canMergeFlag = canMergeFlag; this.initialTip = initialTip; @@ -61,8 +63,7 @@ public class RebaseSorter { this.repo = repo; } - public List sort(Collection incoming) - throws IOException { + public List sort(Collection incoming) throws IOException { final List sorted = new ArrayList<>(); final Set sort = new HashSet<>(incoming); while (!sort.isEmpty()) { @@ -105,16 +106,13 @@ public class RebaseSorter { return sorted; } - private boolean isAlreadyMerged(CodeReviewCommit commit, Branch.NameKey dest) - throws IOException { - try (CodeReviewRevWalk mirw = - CodeReviewCommit.newRevWalk(rw.getObjectReader())) { + private boolean isAlreadyMerged(CodeReviewCommit commit, Branch.NameKey dest) throws IOException { + try (CodeReviewRevWalk mirw = CodeReviewCommit.newRevWalk(rw.getObjectReader())) { mirw.reset(); mirw.markStart(commit); // check if the commit is merged in other branches for (RevCommit accepted : alreadyAccepted) { - if (mirw.isMergedInto(mirw.parseCommit(accepted), - mirw.parseCommit(commit))) { + if (mirw.isMergedInto(mirw.parseCommit(accepted), mirw.parseCommit(commit))) { return true; } } @@ -134,12 +132,12 @@ public class RebaseSorter { } } - private boolean isRework(Project.NameKey project, RevCommit oldCommit, - ChangeData change) throws OrmException, IOException { - RevCommit currentCommit = rw.parseCommit( - ObjectId.fromString(change.currentPatchSet().getRevision().get())); - return ChangeKind.REWORK == changeKindCache - .getChangeKind(project, repo, oldCommit, currentCommit); + private boolean isRework(Project.NameKey project, RevCommit oldCommit, ChangeData change) + throws OrmException, IOException { + RevCommit currentCommit = + rw.parseCommit(ObjectId.fromString(change.currentPatchSet().getRevision().get())); + return ChangeKind.REWORK + == changeKindCache.getChangeKind(project, repo, oldCommit, currentCommit); } private static T removeOne(final Collection c) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java index bc7c5228a9..f9832883f9 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java @@ -123,7 +123,23 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; - +import java.io.IOException; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.ExecutionException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.lib.BatchRefUpdate; @@ -155,31 +171,12 @@ import org.kohsuke.args4j.Option; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.io.StringWriter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.concurrent.ExecutionException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - /** Receives change upload using the Git receive-pack protocol. */ public class ReceiveCommits { - private static final Logger log = - LoggerFactory.getLogger(ReceiveCommits.class); + private static final Logger log = LoggerFactory.getLogger(ReceiveCommits.class); - public static final Pattern NEW_PATCHSET = Pattern.compile( - "^" + REFS_CHANGES + "(?:[0-9][0-9]/)?([1-9][0-9]*)(?:/new)?$"); + public static final Pattern NEW_PATCHSET = + Pattern.compile("^" + REFS_CHANGES + "(?:[0-9][0-9]/)?([1-9][0-9]*)(?:/new)?$"); private static final String COMMAND_REJECTION_MESSAGE_FOOTER = "Please read the documentation and contact an administrator\n" @@ -191,15 +188,18 @@ public class ReceiveCommits { + "ensure Change-Ids are unique for each commit"; private enum Error { - CONFIG_UPDATE("You are not allowed to perform this operation.\n" - + "Configuration changes can only be pushed by project owners\n" - + "who also have 'Push' rights on " + RefNames.REFS_CONFIG), - UPDATE("You are not allowed to perform this operation.\n" - + "To push into this reference you need 'Push' rights."), - DELETE("You need 'Push' rights with the 'Force Push'\n" - + "flag set to delete references."), - DELETE_CHANGES("Cannot delete from '" + REFS_CHANGES + "'"), - CODE_REVIEW("You need 'Push' rights to upload code review requests.\n" + CONFIG_UPDATE( + "You are not allowed to perform this operation.\n" + + "Configuration changes can only be pushed by project owners\n" + + "who also have 'Push' rights on " + + RefNames.REFS_CONFIG), + UPDATE( + "You are not allowed to perform this operation.\n" + + "To push into this reference you need 'Push' rights."), + DELETE("You need 'Push' rights with the 'Force Push'\n" + "flag set to delete references."), + DELETE_CHANGES("Cannot delete from '" + REFS_CHANGES + "'"), + CODE_REVIEW( + "You need 'Push' rights to upload code review requests.\n" + "Verify that you are pushing to the right branch."); private final String value; @@ -219,9 +219,13 @@ public class ReceiveCommits { public interface MessageSender { void sendMessage(String what); + void sendError(String what); + void sendBytes(byte[] what); + void sendBytes(byte[] what, int off, int len); + void flush(); } @@ -313,12 +317,10 @@ public class ReceiveCommits { private final RequestId receiveId; private MagicBranchInput magicBranch; private boolean newChangeForAllNotInTarget; - private final ListMultimap pushOptions = - LinkedListMultimap.create(); + private final ListMultimap pushOptions = LinkedListMultimap.create(); private List newChanges = Collections.emptyList(); - private final Map replaceByChange = - new LinkedHashMap<>(); + private final Map replaceByChange = new LinkedHashMap<>(); private final List updateGroups = new ArrayList<>(); private final Set validCommits = new HashSet<>(); @@ -344,7 +346,8 @@ public class ReceiveCommits { private BatchRefUpdate batch; @Inject - ReceiveCommits(ReviewDb db, + ReceiveCommits( + ReviewDb db, Sequences seq, Provider queryProvider, ChangeNotes.Factory notesFactory, @@ -380,7 +383,8 @@ public class ReceiveCommits { BatchUpdate.Factory batchUpdateFactory, SetHashtagsOp.Factory hashtagsFactory, ReplaceOp.Factory replaceOpFactory, - MergedByPushOp.Factory mergedByPushOpFactory) throws IOException { + MergedByPushOp.Factory mergedByPushOpFactory) + throws IOException { this.user = projectControl.getUser().asIdentifiedUser(); this.db = db; this.seq = seq; @@ -435,59 +439,57 @@ public class ReceiveCommits { rp.setAllowNonFastForwards(true); rp.setRefLogIdent(user.newRefLogIdent()); rp.setTimeout(transferConfig.getTimeout()); - rp.setMaxObjectSizeLimit(transferConfig.getEffectiveMaxObjectSizeLimit( - projectControl.getProjectState())); + rp.setMaxObjectSizeLimit( + transferConfig.getEffectiveMaxObjectSizeLimit(projectControl.getProjectState())); rp.setCheckReceivedObjects(ps.getConfig().getCheckReceivedObjects()); - rp.setRefFilter(new RefFilter() { - @Override - public Map filter(Map refs) { - Map filteredRefs = - Maps.newHashMapWithExpectedSize(refs.size()); - for (Map.Entry e : refs.entrySet()) { - String name = e.getKey(); - if (!name.startsWith(REFS_CHANGES) - && !name.startsWith(RefNames.REFS_CACHE_AUTOMERGE)) { - filteredRefs.put(name, e.getValue()); + rp.setRefFilter( + new RefFilter() { + @Override + public Map filter(Map refs) { + Map filteredRefs = Maps.newHashMapWithExpectedSize(refs.size()); + for (Map.Entry e : refs.entrySet()) { + String name = e.getKey(); + if (!name.startsWith(REFS_CHANGES) + && !name.startsWith(RefNames.REFS_CACHE_AUTOMERGE)) { + filteredRefs.put(name, e.getValue()); + } + } + return filteredRefs; } - } - return filteredRefs; - } - }); + }); if (!projectControl.allRefsAreVisible()) { - rp.setCheckReferencedObjectsAreReachable( - receiveConfig.checkReferencedObjectsAreReachable); + rp.setCheckReferencedObjectsAreReachable(receiveConfig.checkReferencedObjectsAreReachable); } - rp.setAdvertiseRefsHook(new VisibleRefFilter(tagCache, notesFactory, - changeCache, repo, projectControl, db, false)); + rp.setAdvertiseRefsHook( + new VisibleRefFilter(tagCache, notesFactory, changeCache, repo, projectControl, db, false)); List advHooks = new ArrayList<>(3); - advHooks.add(new AdvertiseRefsHook() { - @Override - public void advertiseRefs(BaseReceivePack rp) - throws ServiceMayNotContinueException { - allRefs = rp.getAdvertisedRefs(); - if (allRefs == null) { - try { - allRefs = rp.getRepository().getRefDatabase().getRefs(ALL); - } catch (ServiceMayNotContinueException e) { - throw e; - } catch (IOException e) { - ServiceMayNotContinueException ex = - new ServiceMayNotContinueException(); - ex.initCause(e); - throw ex; + advHooks.add( + new AdvertiseRefsHook() { + @Override + public void advertiseRefs(BaseReceivePack rp) throws ServiceMayNotContinueException { + allRefs = rp.getAdvertisedRefs(); + if (allRefs == null) { + try { + allRefs = rp.getRepository().getRefDatabase().getRefs(ALL); + } catch (ServiceMayNotContinueException e) { + throw e; + } catch (IOException e) { + ServiceMayNotContinueException ex = new ServiceMayNotContinueException(); + ex.initCause(e); + throw ex; + } + } + rp.setAdvertisedRefs(allRefs, rp.getAdvertisedObjects()); } - } - rp.setAdvertisedRefs(allRefs, rp.getAdvertisedObjects()); - } - @Override - public void advertiseRefs(UploadPack uploadPack) { - } - }); + @Override + public void advertiseRefs(UploadPack uploadPack) {} + }); advHooks.add(rp.getAdvertiseRefsHook()); - advHooks.add(new ReceiveCommitsAdvertiseRefsHook( - queryProvider, projectControl.getProject().getNameKey())); + advHooks.add( + new ReceiveCommitsAdvertiseRefsHook( + queryProvider, projectControl.getProject().getNameKey())); advHooks.add(new HackPushNegotiateHook()); rp.setAdvertiseRefsHook(AdvertiseRefsHookChain.newChain(advHooks)); rp.setPostReceiveHook(lazyPostReceive.get()); @@ -561,8 +563,7 @@ public class ReceiveCommits { } } - void processCommands(Collection commands, - MultiProgressMonitor progress) { + void processCommands(Collection commands, MultiProgressMonitor progress) { newProgress = progress.beginSubTask("new", UNKNOWN); replaceProgress = progress.beginSubTask("updated", UNKNOWN); closeProgress = progress.beginSubTask("closed", UNKNOWN); @@ -582,8 +583,7 @@ public class ReceiveCommits { logDebug("Executing batch with {} commands", batch.getCommands().size()); if (!batch.getCommands().isEmpty()) { try { - if (!batch.isAllowNonFastForwards() && magicBranch != null - && magicBranch.edit) { + if (!batch.isAllowNonFastForwards() && magicBranch != null && magicBranch.edit) { logDebug("Allowing non-fast-forward for edit ref"); batch.setAllowNonFastForwards(true); } @@ -596,8 +596,7 @@ public class ReceiveCommits { cnt++; } } - logError(String.format( - "Failed to store %d refs in %s", cnt, project.getName()), err); + logError(String.format("Failed to store %d refs in %s", cnt, project.getName()), err); } } @@ -620,10 +619,7 @@ public class ReceiveCommits { String refName = c.getRefName(); if (c.getType() == ReceiveCommand.Type.UPDATE) { // aka fast-forward logDebug("Updating tag cache on fast-forward of {}", c.getRefName()); - tagCache.updateFastForward(project.getNameKey(), - refName, - c.getOldId(), - c.getNewId()); + tagCache.updateFastForward(project.getNameKey(), refName, c.getOldId(), c.getNewId()); } if (isHead(c) || isConfig(c)) { @@ -632,8 +628,7 @@ public class ReceiveCommits { case UPDATE: case UPDATE_NONFASTFORWARD: autoCloseChanges(c); - branches.add(new Branch.NameKey(project.getNameKey(), - refName)); + branches.add(new Branch.NameKey(project.getNameKey(), refName)); break; case DELETE: @@ -656,8 +651,7 @@ public class ReceiveCommits { logDebug("Firing ref update for {}", c.getRefName()); gitRefUpdated.fire(project.getNameKey(), c, user.getAccount()); } else { - logDebug("Assuming ref update event for {} has fired", - c.getRefName()); + logDebug("Assuming ref update event for {} has fired", c.getRefName()); } } } @@ -685,16 +679,23 @@ public class ReceiveCommits { addMessage("New Changes:"); for (CreateRequest c : created) { addMessage( - formatChangeUrl(canonicalWebUrl, c.change, c.change.getSubject(), - c.change.getStatus() == Change.Status.DRAFT, false)); + formatChangeUrl( + canonicalWebUrl, + c.change, + c.change.getSubject(), + c.change.getStatus() == Change.Status.DRAFT, + false)); } addMessage(""); } - List updated = replaceByChange.values().stream() - .filter(r -> !r.skip && r.inputCommand.getResult() == OK) - .sorted(comparingInt(r -> r.notes.getChangeId().get())) - .collect(toList()); + List updated = + replaceByChange + .values() + .stream() + .filter(r -> !r.skip && r.inputCommand.getResult() == OK) + .sorted(comparingInt(r -> r.notes.getChangeId().get())) + .collect(toList()); if (!updated.isEmpty()) { addMessage(""); addMessage("Updated Changes:"); @@ -703,8 +704,7 @@ public class ReceiveCommits { String subject; if (edit) { try { - subject = - rp.getRevWalk().parseCommit(u.newCommitId).getShortMessage(); + subject = rp.getRevWalk().parseCommit(u.newCommitId).getShortMessage(); } catch (IOException e) { // Log and fall back to original change subject logWarn("failed to get subject for edit patch set", e); @@ -713,22 +713,27 @@ public class ReceiveCommits { } else { subject = u.info.getSubject(); } - addMessage(formatChangeUrl(canonicalWebUrl, u.notes.getChange(), - subject, u.replaceOp != null && u.replaceOp.getPatchSet().isDraft(), - edit)); + addMessage( + formatChangeUrl( + canonicalWebUrl, + u.notes.getChange(), + subject, + u.replaceOp != null && u.replaceOp.getPatchSet().isDraft(), + edit)); } addMessage(""); } } - private static String formatChangeUrl(String url, Change change, - String subject, boolean draft, boolean edit) { - StringBuilder m = new StringBuilder() - .append(" ") - .append(url) - .append(change.getChangeId()) - .append(" ") - .append(ChangeUtil.cropSubject(subject)); + private static String formatChangeUrl( + String url, Change change, String subject, boolean draft, boolean edit) { + StringBuilder m = + new StringBuilder() + .append(" ") + .append(url) + .append(change.getChangeId()) + .append(" ") + .append(ChangeUtil.cropSubject(subject)); if (draft) { m.append(" [DRAFT]"); } @@ -754,23 +759,24 @@ public class ReceiveCommits { String refName = replace.inputCommand.getRefName(); checkState( NEW_PATCHSET.matcher(refName).matches(), - "expected a new patch set command as input when creating %s;" - + " got %s", - replace.cmd.getRefName(), refName); + "expected a new patch set command as input when creating %s;" + " got %s", + replace.cmd.getRefName(), + refName); try { logDebug("One-off insertion of patch set for {}", refName); replace.insertPatchSetWithoutBatchUpdate(); replace.inputCommand.setResult(OK); } catch (IOException | UpdateException | RestApiException err) { reject(replace.inputCommand, "internal server error"); - logError(String.format( - "Cannot add patch set to change %d in project %s", - e.getKey().get(), project.getName()), err); + logError( + String.format( + "Cannot add patch set to change %d in project %s", + e.getKey().get(), project.getName()), + err); } } else if (replace.inputCommand.getResult() == NOT_ATTEMPTED) { reject(replace.inputCommand, "internal server error"); - logError(String.format("Replacement for project %s was not attempted", - project.getName())); + logError(String.format("Replacement for project %s was not attempted", project.getName())); } } @@ -780,10 +786,12 @@ public class ReceiveCommits { logDebug("No magic branch, nothing more to do"); return; } else if (magicBranch.cmd.getResult() != NOT_ATTEMPTED) { - logWarn(String.format( - "Skipping change updates on %s because ref update failed: %s %s", - project.getName(), magicBranch.cmd.getResult(), - Strings.nullToEmpty(magicBranch.cmd.getMessage()))); + logWarn( + String.format( + "Skipping change updates on %s because ref update failed: %s %s", + project.getName(), + magicBranch.cmd.getResult(), + Strings.nullToEmpty(magicBranch.cmd.getMessage()))); return; } @@ -793,38 +801,44 @@ public class ReceiveCommits { okToInsert++; } else { String createChangeResult = - String.format("%s %s", - create.cmd.getResult(), - Strings.nullToEmpty(create.cmd.getMessage())).trim(); + String.format( + "%s %s", create.cmd.getResult(), Strings.nullToEmpty(create.cmd.getMessage())) + .trim(); lastCreateChangeErrors.add(createChangeResult); - logError(String.format("Command %s on %s:%s not completed: %s", - create.cmd.getType(), - project.getName(), - create.cmd.getRefName(), - createChangeResult)); + logError( + String.format( + "Command %s on %s:%s not completed: %s", + create.cmd.getType(), + project.getName(), + create.cmd.getRefName(), + createChangeResult)); } } - logDebug("Counted {} ok to insert, out of {} to replace and {} new", - okToInsert, replaceCount, newChanges.size()); + logDebug( + "Counted {} ok to insert, out of {} to replace and {} new", + okToInsert, + replaceCount, + newChanges.size()); if (okToInsert != replaceCount + newChanges.size()) { // One or more new references failed to create. Assume the // system isn't working correctly anymore and abort. - reject(magicBranch.cmd, "Unable to create changes: " - + lastCreateChangeErrors.stream().collect(joining(" "))); - logError(String.format( - "Only %d of %d new change refs created in %s; aborting", - okToInsert, replaceCount + newChanges.size(), project.getName())); + reject( + magicBranch.cmd, + "Unable to create changes: " + lastCreateChangeErrors.stream().collect(joining(" "))); + logError( + String.format( + "Only %d of %d new change refs created in %s; aborting", + okToInsert, replaceCount + newChanges.size(), project.getName())); return; } try (BatchUpdate bu = - batchUpdateFactory.create(db, magicBranch.dest.getParentKey(), - user.materializedCopy(), TimeUtil.nowTs()); + batchUpdateFactory.create( + db, magicBranch.dest.getParentKey(), user.materializedCopy(), TimeUtil.nowTs()); ObjectInserter ins = repo.newObjectInserter()) { - bu.setRepository(repo, rp.getRevWalk(), ins) - .updateChangesInParallel(); + bu.setRepository(repo, rp.getRevWalk(), ins).updateChangesInParallel(); bu.setRequestId(receiveId); for (ReplaceRequest replace : replaceByChange.values()) { if (replace.inputCommand == magicBranch.cmd) { @@ -921,8 +935,7 @@ public class ReceiveCommits { continue; } - if (!Repository.isValidRefName(cmd.getRefName()) - || cmd.getRefName().contains("//")) { + if (!Repository.isValidRefName(cmd.getRefName()) || cmd.getRefName().contains("//")) { reject(cmd, "not valid ref"); continue; } @@ -935,17 +948,16 @@ public class ReceiveCommits { if (projectControl.getProjectState().isAllUsers() && RefNames.REFS_USERS_SELF.equals(cmd.getRefName())) { String newName = RefNames.refsUsers(user.getAccountId()); - logDebug("Swapping out command for {} to {}", - RefNames.REFS_USERS_SELF, newName); + logDebug("Swapping out command for {} to {}", RefNames.REFS_USERS_SELF, newName); final ReceiveCommand orgCmd = cmd; - cmd = new ReceiveCommand(cmd.getOldId(), cmd.getNewId(), newName, - cmd.getType()) { - @Override - public void setResult(Result s, String m) { - super.setResult(s, m); - orgCmd.setResult(s, m); - } - }; + cmd = + new ReceiveCommand(cmd.getOldId(), cmd.getNewId(), newName, cmd.getType()) { + @Override + public void setResult(Result s, String m) { + super.setResult(s, m); + orgCmd.setResult(s, m); + } + }; } Matcher m = NEW_PATCHSET.matcher(cmd.getRefName()); @@ -1003,9 +1015,13 @@ public class ReceiveCommits { addError(" " + err.getMessage()); } reject(cmd, "invalid project configuration"); - logError("User " + user.getUserName() - + " tried to push invalid project configuration " - + cmd.getNewId().name() + " for " + project.getName()); + logError( + "User " + + user.getUserName() + + " tried to push invalid project configuration " + + cmd.getNewId().name() + + " for " + + project.getName()); continue; } Project.NameKey newParent = cfg.getProject().getParent(allProjectsName); @@ -1034,40 +1050,54 @@ public class ReceiveCommits { ProjectConfigEntry configEntry = e.getProvider().get(); String value = pluginCfg.getString(e.getExportName()); String oldValue = - projectControl.getProjectState().getConfig() + projectControl + .getProjectState() + .getConfig() .getPluginConfig(e.getPluginName()) .getString(e.getExportName()); if (configEntry.getType() == ProjectConfigEntryType.ARRAY) { oldValue = - Arrays.stream( - projectControl.getProjectState() - .getConfig().getPluginConfig(e.getPluginName()) - .getStringList(e.getExportName())) - .collect(joining("\n")); + Arrays.stream( + projectControl + .getProjectState() + .getConfig() + .getPluginConfig(e.getPluginName()) + .getStringList(e.getExportName())) + .collect(joining("\n")); } - if ((value == null ? oldValue != null : !value.equals(oldValue)) && - !configEntry.isEditable(projectControl.getProjectState())) { - reject(cmd, String.format( - "invalid project configuration: Not allowed to set parameter" - + " '%s' of plugin '%s' on project '%s'.", - e.getExportName(), e.getPluginName(), project.getName())); + if ((value == null ? oldValue != null : !value.equals(oldValue)) + && !configEntry.isEditable(projectControl.getProjectState())) { + reject( + cmd, + String.format( + "invalid project configuration: Not allowed to set parameter" + + " '%s' of plugin '%s' on project '%s'.", + e.getExportName(), e.getPluginName(), project.getName())); continue; } if (ProjectConfigEntryType.LIST.equals(configEntry.getType()) - && value != null && !configEntry.getPermittedValues().contains(value)) { - reject(cmd, String.format( - "invalid project configuration: The value '%s' is " - + "not permitted for parameter '%s' of plugin '%s'.", - value, e.getExportName(), e.getPluginName())); + && value != null + && !configEntry.getPermittedValues().contains(value)) { + reject( + cmd, + String.format( + "invalid project configuration: The value '%s' is " + + "not permitted for parameter '%s' of plugin '%s'.", + value, e.getExportName(), e.getPluginName())); } } } catch (Exception e) { reject(cmd, "invalid project configuration"); - logError("User " + user.getUserName() - + " tried to push invalid project configuration " - + cmd.getNewId().name() + " for " + project.getName(), e); + logError( + "User " + + user.getUserName() + + " tried to push invalid project configuration " + + cmd.getNewId().name() + + " for " + + project.getName(), + e); continue; } break; @@ -1088,8 +1118,9 @@ public class ReceiveCommits { try { obj = rp.getRevWalk().parseAny(cmd.getNewId()); } catch (IOException err) { - logError("Invalid object " + cmd.getNewId().name() + " for " - + cmd.getRefName() + " creation", err); + logError( + "Invalid object " + cmd.getNewId().name() + " for " + cmd.getRefName() + " creation", + err); reject(cmd, "invalid object"); return; } @@ -1139,8 +1170,7 @@ public class ReceiveCommits { try { obj = rp.getRevWalk().parseAny(cmd.getNewId()); } catch (IOException err) { - logError("Invalid object " + cmd.getNewId().name() + " for " - + cmd.getRefName(), err); + logError("Invalid object " + cmd.getNewId().name() + " for " + cmd.getRefName(), err); reject(cmd, "invalid object"); return false; } @@ -1180,8 +1210,9 @@ public class ReceiveCommits { } catch (IncorrectObjectTypeException notCommit) { newObject = null; } catch (IOException err) { - logError("Invalid object " + cmd.getNewId().name() + " for " - + cmd.getRefName() + " forced update", err); + logError( + "Invalid object " + cmd.getNewId().name() + " for " + cmd.getRefName() + " forced update", + err); reject(cmd, "invalid object"); return; } @@ -1201,8 +1232,8 @@ public class ReceiveCommits { } batch.setAllowNonFastForwards(true).addCommand(cmd); } else { - cmd.setResult(REJECTED_NONFASTFORWARD, " need '" - + PermissionRule.FORCE_PUSH + "' privilege."); + cmd.setResult( + REJECTED_NONFASTFORWARD, " need '" + PermissionRule.FORCE_PUSH + "' privilege."); } } @@ -1231,7 +1262,11 @@ public class ReceiveCommits { @Option(name = "--draft", usage = "mark new/updated changes as draft") boolean draft; - @Option(name = "--edit", aliases = {"-e"}, usage = "upload as change edit") + @Option( + name = "--edit", + aliases = {"-e"}, + usage = "upload as change edit" + ) boolean edit; @Option(name = "--submit", usage = "immediately submit the change") @@ -1240,26 +1275,30 @@ public class ReceiveCommits { @Option(name = "--merged", usage = "create single change for a merged commit") boolean merged; - @Option(name = "--notify", - usage = "Notify handling that defines to whom email notifications " - + "should be sent. Allowed values are NONE, OWNER, " - + "OWNER_REVIEWERS, ALL. If not set, the default is ALL.") + @Option( + name = "--notify", + usage = + "Notify handling that defines to whom email notifications " + + "should be sent. Allowed values are NONE, OWNER, " + + "OWNER_REVIEWERS, ALL. If not set, the default is ALL." + ) NotifyHandling notify = NotifyHandling.ALL; - @Option(name = "--notify-to", metaVar = "USER", - usage = "user that should be notified") + @Option(name = "--notify-to", metaVar = "USER", usage = "user that should be notified") List tos = new ArrayList<>(); - @Option(name = "--notify-cc", metaVar = "USER", - usage = "user that should be CC'd") + @Option(name = "--notify-cc", metaVar = "USER", usage = "user that should be CC'd") List ccs = new ArrayList<>(); - @Option(name = "--notify-bcc", metaVar = "USER", - usage = "user that should be BCC'd") + @Option(name = "--notify-bcc", metaVar = "USER", usage = "user that should be BCC'd") List bccs = new ArrayList<>(); - @Option(name = "--reviewer", aliases = {"-r"}, metaVar = "EMAIL", - usage = "add reviewer to changes") + @Option( + name = "--reviewer", + aliases = {"-r"}, + metaVar = "EMAIL", + usage = "add reviewer to changes" + ) void reviewer(Account.Id id) { reviewer.add(id); } @@ -1274,8 +1313,12 @@ public class ReceiveCommits { draft = !publish; } - @Option(name = "--label", aliases = {"-l"}, metaVar = "LABEL+VALUE", - usage = "label(s) to assign (defaults to +1 if no value provided") + @Option( + name = "--label", + aliases = {"-l"}, + metaVar = "LABEL+VALUE", + usage = "label(s) to assign (defaults to +1 if no value provided" + ) void addLabel(String token) throws CmdLineException { LabelVote v = LabelVote.parse(token); try { @@ -1287,15 +1330,23 @@ public class ReceiveCommits { labels.put(v.label(), v.value()); } - @Option(name = "--message", aliases = {"-m"}, metaVar = "MESSAGE", - usage = "Comment message to apply to the review") + @Option( + name = "--message", + aliases = {"-m"}, + metaVar = "MESSAGE", + usage = "Comment message to apply to the review" + ) void addMessage(final String token) { // git push does not allow spaces in refs. message = token.replace("_", " "); } - @Option(name = "--hashtag", aliases = {"-t"}, metaVar = "HASHTAG", - usage = "add hashtag to changes") + @Option( + name = "--hashtag", + aliases = {"-t"}, + metaVar = "HASHTAG", + usage = "add hashtag to changes" + ) void addHashtag(String token) throws CmdLineException { if (!notesMigration.readChanges()) { throw clp.reject("cannot add hashtags; noteDb is disabled"); @@ -1307,8 +1358,7 @@ public class ReceiveCommits { //TODO(dpursehouse): validate hashtags } - MagicBranchInput(ReceiveCommand cmd, LabelTypes labelTypes, - NotesMigration notesMigration) { + MagicBranchInput(ReceiveCommand cmd, LabelTypes labelTypes, NotesMigration notesMigration) { this.cmd = cmd; this.draft = cmd.getRefName().startsWith(MagicBranch.NEW_DRAFT_CHANGE); this.labelTypes = labelTypes; @@ -1328,10 +1378,13 @@ public class ReceiveCommits { return accountsToNotify; } - String parse(CmdLineParser clp, Repository repo, Set refs, - ListMultimap pushOptions) throws CmdLineException { - String ref = RefNames.fullName( - MagicBranch.getDestBranchName(cmd.getRefName())); + String parse( + CmdLineParser clp, + Repository repo, + Set refs, + ListMultimap pushOptions) + throws CmdLineException { + String ref = RefNames.fullName(MagicBranch.getDestBranchName(cmd.getRefName())); ListMultimap options = LinkedListMultimap.create(pushOptions); int optionStart = ref.indexOf('%'); @@ -1355,7 +1408,7 @@ public class ReceiveCommits { // suffix is entirely optional, so it might not even exist. String head = readHEAD(repo); int split = ref.length(); - for (;;) { + for (; ; ) { String name = ref.substring(0, split); if (refs.contains(name) || name.equals(head)) { break; @@ -1375,9 +1428,9 @@ public class ReceiveCommits { /** * Gets an unmodifiable view of the pushOptions. - *

- * The collection is empty if the client does not support push options, or if - * the client did not send any options. + * + *

The collection is empty if the client does not support push options, or if the client did + * not send any options. * * @return an unmodifiable view of pushOptions. */ @@ -1403,8 +1456,7 @@ public class ReceiveCommits { magicBranch.clp = clp; try { - ref = magicBranch.parse( - clp, repo, rp.getAdvertisedRefs().keySet(), pushOptions); + ref = magicBranch.parse(clp, repo, rp.getAdvertisedRefs().keySet(), pushOptions); } catch (CmdLineException e) { if (!clp.wasHelpRequestedByOption()) { logDebug("Invalid branch syntax"); @@ -1421,8 +1473,7 @@ public class ReceiveCommits { reject(cmd, "see help"); return; } - if (projectControl.getProjectState().isAllUsers() - && RefNames.REFS_USERS_SELF.equals(ref)) { + if (projectControl.getProjectState().isAllUsers() && RefNames.REFS_USERS_SELF.equals(ref)) { logDebug("Handling {}", RefNames.REFS_USERS_SELF); ref = RefNames.refsUsers(user.getAccountId()); } @@ -1469,8 +1520,8 @@ public class ReceiveCommits { return; } - if (magicBranch.submit && !projectControl.controlForRef( - MagicBranch.NEW_CHANGE + ref).canSubmit(true)) { + if (magicBranch.submit + && !projectControl.controlForRef(MagicBranch.NEW_CHANGE + ref).canSubmit(true)) { reject(cmd, "submit not allowed"); return; } @@ -1519,8 +1570,7 @@ public class ReceiveCommits { if (magicBranch.base != null) { logDebug("Handling %base: {}", magicBranch.base); - magicBranch.baseCommit = Lists.newArrayListWithCapacity( - magicBranch.base.size()); + magicBranch.baseCommit = Lists.newArrayListWithCapacity(magicBranch.base.size()); for (ObjectId id : magicBranch.base) { try { magicBranch.baseCommit.add(walk.parseCommit(id)); @@ -1531,9 +1581,7 @@ public class ReceiveCommits { reject(cmd, "base not found"); return; } catch (IOException e) { - logWarn(String.format( - "Project %s cannot read %s", - project.getName(), id.name()), e); + logWarn(String.format("Project %s cannot read %s", project.getName(), id.name()), e); reject(cmd, "internal server error"); return; } @@ -1547,8 +1595,8 @@ public class ReceiveCommits { logDebug("Set baseCommit = {}", magicBranch.baseCommit.get(0).name()); } } catch (IOException ex) { - logWarn(String.format("Error walking to %s in project %s", - destBranch, project.getName()), ex); + logWarn( + String.format("Error walking to %s in project %s", destBranch, project.getName()), ex); reject(cmd, "internal server error"); return; } @@ -1597,8 +1645,7 @@ public class ReceiveCommits { } } - private RevCommit readBranchTip(ReceiveCommand cmd, Branch.NameKey branch) - throws IOException { + private RevCommit readBranchTip(ReceiveCommand cmd, Branch.NameKey branch) throws IOException { Ref r = allRefs.get(branch.get()); if (r == null) { reject(cmd, branch.get() + " not found"); @@ -1626,8 +1673,7 @@ public class ReceiveCommits { Change changeEnt; try { - changeEnt = notesFactory.createChecked(db, project.getNameKey(), changeId) - .getChange(); + changeEnt = notesFactory.createChecked(db, project.getNameKey(), changeId).getChange(); } catch (NoSuchChangeException e) { logError("Change not found " + changeId, e); reject(cmd, "change " + changeId + " not found"); @@ -1646,15 +1692,14 @@ public class ReceiveCommits { requestReplace(cmd, true, changeEnt, newCommit); } - private boolean requestReplace(ReceiveCommand cmd, boolean checkMergedInto, - Change change, RevCommit newCommit) { + private boolean requestReplace( + ReceiveCommand cmd, boolean checkMergedInto, Change change, RevCommit newCommit) { if (change.getStatus().isClosed()) { reject(cmd, "change " + canonicalWebUrl + change.getId() + " closed"); return false; } - ReplaceRequest req = - new ReplaceRequest(change.getId(), newCommit, cmd, checkMergedInto); + ReplaceRequest req = new ReplaceRequest(change.getId(), newCommit, cmd, checkMergedInto); if (replaceByChange.containsKey(req.ontoChange)) { reject(cmd, "duplicate request"); return false; @@ -1668,9 +1713,8 @@ public class ReceiveCommits { newChanges = new ArrayList<>(); ListMultimap existing = changeRefsById(); - GroupCollector groupCollector = GroupCollector.create( - changeRefsById(), db, psUtil, - notesFactory, project.getNameKey()); + GroupCollector groupCollector = + GroupCollector.create(changeRefsById(), db, psUtil, notesFactory, project.getNameKey()); try { RevCommit start = setUpWalkForSelectingChanges(); @@ -1680,16 +1724,16 @@ public class ReceiveCommits { List pending = new ArrayList<>(); Set newChangeIds = new HashSet<>(); - int maxBatchChanges = - receiveConfig.getEffectiveMaxBatchChangesLimit(user); + int maxBatchChanges = receiveConfig.getEffectiveMaxBatchChangesLimit(user); int total = 0; int alreadyTracked = 0; - boolean rejectImplicitMerges = start.getParentCount() == 1 - && projectCache.get(project.getNameKey()).isRejectImplicitMerges() - // Don't worry about implicit merges when creating changes for - // already-merged commits; they're already in history, so it's too - // late. - && !magicBranch.merged; + boolean rejectImplicitMerges = + start.getParentCount() == 1 + && projectCache.get(project.getNameKey()).isRejectImplicitMerges() + // Don't worry about implicit merges when creating changes for + // already-merged commits; they're already in history, so it's too + // late. + && !magicBranch.merged; Set mergedParents; if (rejectImplicitMerges) { mergedParents = new HashSet<>(); @@ -1697,7 +1741,7 @@ public class ReceiveCommits { mergedParents = null; } - for (;;) { + for (; ; ) { RevCommit c = rp.getRevWalk().next(); if (c == null) { break; @@ -1733,12 +1777,10 @@ public class ReceiveCommits { if (!(newChangeForAllNotInTarget || magicBranch.base != null)) { continue; } - logDebug("Creating new change for {} even though it is already tracked", - name); + logDebug("Creating new change for {} even though it is already tracked", name); } - if (!validCommit( - rp.getRevWalk(), magicBranch.ctl, magicBranch.cmd, c)) { + if (!validCommit(rp.getRevWalk(), magicBranch.ctl, magicBranch.cmd, c)) { // Not a change the user can propose? Abort as early as possible. newChanges = Collections.emptyList(); logDebug("Aborting early due to invalid commit"); @@ -1747,11 +1789,11 @@ public class ReceiveCommits { // Don't allow merges to be uploaded in commit chain via all-not-in-target if (newChangeForAllNotInTarget && c.getParentCount() > 1) { - reject(magicBranch.cmd, + reject( + magicBranch.cmd, "Pushing merges in commit chains with 'all not in target' is not allowed,\n" - + "to override please set the base manually"); - logDebug("Rejecting merge commit {} with newChangeForAllNotInTarget", - name); + + "to override please set the base manually"); + logDebug("Rejecting merge commit {} with newChangeForAllNotInTarget", name); // TODO(dborowitz): Should we early return here? } @@ -1766,23 +1808,27 @@ public class ReceiveCommits { int n = pending.size() + newChanges.size(); if (maxBatchChanges != 0 && n > maxBatchChanges) { logDebug("{} changes exceeds limit of {}", n, maxBatchChanges); - reject(magicBranch.cmd, - "the number of pushed changes in a batch exceeds the max limit " - + maxBatchChanges); + reject( + magicBranch.cmd, + "the number of pushed changes in a batch exceeds the max limit " + maxBatchChanges); newChanges = Collections.emptyList(); return; } } - logDebug("Finished initial RevWalk with {} commits total: {} already" - + " tracked, {} new changes with no Change-Id, and {} deferred" - + " lookups", total, alreadyTracked, newChanges.size(), + logDebug( + "Finished initial RevWalk with {} commits total: {} already" + + " tracked, {} new changes with no Change-Id, and {} deferred" + + " lookups", + total, + alreadyTracked, + newChanges.size(), pending.size()); if (rejectImplicitMerges) { rejectImplicitMerges(mergedParents); } - for (Iterator itr = pending.iterator(); itr.hasNext();) { + for (Iterator itr = pending.iterator(); itr.hasNext(); ) { ChangeLookup p = itr.next(); if (newChangeIds.contains(p.changeKey)) { logDebug("Multiple commits with Change-Id {}", p.changeKey); @@ -1793,12 +1839,11 @@ public class ReceiveCommits { List changes = p.destChanges; if (changes.size() > 1) { - logDebug("Multiple changes in branch {} with Change-Id {}: {}", + logDebug( + "Multiple changes in branch {} with Change-Id {}: {}", magicBranch.dest, p.changeKey, - changes.stream() - .map(cd -> cd.getId().toString()) - .collect(joining())); + changes.stream().map(cd -> cd.getId().toString()).collect(joining())); // WTF, multiple changes in this branch have the same key? // Since the commit is new, the user should recreate it with // a different Change-Id. In practice, we should never see @@ -1827,8 +1872,7 @@ public class ReceiveCommits { continue; } } - if (requestReplace( - magicBranch.cmd, false, changes.get(0).change(), p.commit)) { + if (requestReplace(magicBranch.cmd, false, changes.get(0).change(), p.commit)) { continue; } newChanges = Collections.emptyList(); @@ -1846,8 +1890,7 @@ public class ReceiveCommits { // double check against the existing refs if (foundInExistingRef(existing.get(p.commit))) { if (pending.size() == 1) { - reject(magicBranch.cmd, - "commit(s) already exists (as current patchset)"); + reject(magicBranch.cmd, "commit(s) already exists (as current patchset)"); newChanges = Collections.emptyList(); return; } @@ -1858,8 +1901,10 @@ public class ReceiveCommits { } newChanges.add(new CreateRequest(p.commit, magicBranch.dest.get())); } - logDebug("Finished deferred lookups with {} updates and {} new changes", - replaceByChange.size(), newChanges.size()); + logDebug( + "Finished deferred lookups with {} updates and {} new changes", + replaceByChange.size(), + newChanges.size()); } catch (IOException e) { // Should never happen, the core receive process would have // identified the missing object earlier before we got control. @@ -1907,11 +1952,10 @@ public class ReceiveCommits { } } - private boolean foundInExistingRef(Collection existingRefs) - throws OrmException { + private boolean foundInExistingRef(Collection existingRefs) throws OrmException { for (Ref ref : existingRefs) { - ChangeNotes notes = notesFactory.create(db, project.getNameKey(), - Change.Id.fromRef(ref.getName())); + ChangeNotes notes = + notesFactory.create(db, project.getNameKey(), Change.Id.fromRef(ref.getName())); Change change = notes.getChange(); if (change.getDest().equals(magicBranch.dest)) { logDebug("Found change {} from existing refs.", change.getKey()); @@ -1934,35 +1978,32 @@ public class ReceiveCommits { if (magicBranch.baseCommit != null) { markExplicitBasesUninteresting(); } else if (magicBranch.merged) { - logDebug( - "Marking parents of merged commit {} uninteresting", start.name()); + logDebug("Marking parents of merged commit {} uninteresting", start.name()); for (RevCommit c : start.getParents()) { rw.markUninteresting(c); } } else { - markHeadsAsUninteresting( - rw, magicBranch.ctl != null ? magicBranch.ctl.getRefName() : null); + markHeadsAsUninteresting(rw, magicBranch.ctl != null ? magicBranch.ctl.getRefName() : null); } return start; } private void markExplicitBasesUninteresting() throws IOException { - logDebug("Marking {} base commits uninteresting", - magicBranch.baseCommit.size()); + logDebug("Marking {} base commits uninteresting", magicBranch.baseCommit.size()); for (RevCommit c : magicBranch.baseCommit) { rp.getRevWalk().markUninteresting(c); } Ref targetRef = allRefs.get(magicBranch.ctl.getRefName()); if (targetRef != null) { - logDebug("Marking target ref {} ({}) uninteresting", - magicBranch.ctl.getRefName(), targetRef.getObjectId().name()); - rp.getRevWalk().markUninteresting( - rp.getRevWalk().parseCommit(targetRef.getObjectId())); + logDebug( + "Marking target ref {} ({}) uninteresting", + magicBranch.ctl.getRefName(), + targetRef.getObjectId().name()); + rp.getRevWalk().markUninteresting(rp.getRevWalk().parseCommit(targetRef.getObjectId())); } } - private void rejectImplicitMerges(Set mergedParents) - throws IOException { + private void rejectImplicitMerges(Set mergedParents) throws IOException { if (!mergedParents.isEmpty()) { Ref targetRef = allRefs.get(magicBranch.ctl.getRefName()); if (targetRef != null) { @@ -1982,10 +2023,13 @@ public class ReceiveCommits { RevCommit c; while ((c = rw.next()) != null) { rw.parseBody(c); - messages.add(new CommitValidationMessage( - "ERROR: Implicit Merge of " + c.abbreviate(7).name() - + " " + c.getShortMessage(), false)); - + messages.add( + new CommitValidationMessage( + "ERROR: Implicit Merge of " + + c.abbreviate(7).name() + + " " + + c.getShortMessage(), + false)); } reject(magicBranch.cmd, "implicit merges detected"); } @@ -2002,8 +2046,7 @@ public class ReceiveCommits { rw.markUninteresting(rw.parseCommit(ref.getObjectId())); i++; } catch (IOException e) { - logWarn(String.format("Invalid ref %s in %s", - ref.getName(), project.getName()), e); + logWarn(String.format("Invalid ref %s in %s", ref.getName(), project.getName()), e); } } } @@ -2044,18 +2087,19 @@ public class ReceiveCommits { private void setChangeId(int id) { changeId = new Change.Id(id); - ins = changeInserterFactory.create(changeId, commit, refName) - .setTopic(magicBranch.topic) - // Changes already validated in validateNewCommits. - .setValidatePolicy(CommitValidators.Policy.NONE); + ins = + changeInserterFactory + .create(changeId, commit, refName) + .setTopic(magicBranch.topic) + // Changes already validated in validateNewCommits. + .setValidatePolicy(CommitValidators.Policy.NONE); if (magicBranch.draft) { ins.setDraft(magicBranch.draft); } else if (magicBranch.merged) { ins.setStatus(Change.Status.MERGED); } - cmd = new ReceiveCommand(ObjectId.zeroId(), commit, - ins.getPatchSetId().toRefName()); + cmd = new ReceiveCommand(ObjectId.zeroId(), commit, ins.getPatchSetId().toRefName()); if (rp.getPushCertificate() != null) { ins.setPushCertificate(rp.getPushCertificate().toTextWithSignature()); } @@ -2074,34 +2118,33 @@ public class ReceiveCommits { checkNotNull(magicBranch); recipients.add(magicBranch.getMailRecipients()); approvals = magicBranch.labels; - recipients.add(getRecipientsFromFooters( - db, accountResolver, magicBranch.draft, footerLines)); + recipients.add( + getRecipientsFromFooters(db, accountResolver, magicBranch.draft, footerLines)); recipients.remove(me); - StringBuilder msg = new StringBuilder( - ApprovalsUtil.renderMessageWithApprovals( - psId.get(), approvals, - Collections. emptyMap())); + StringBuilder msg = + new StringBuilder( + ApprovalsUtil.renderMessageWithApprovals( + psId.get(), approvals, Collections.emptyMap())); msg.append('.'); if (!Strings.isNullOrEmpty(magicBranch.message)) { msg.append("\n").append(magicBranch.message); } - bu.insertChange(ins - .setReviewers(recipients.getReviewers()) - .setExtraCC(recipients.getCcOnly()) - .setApprovals(approvals) - .setMessage(msg.toString()) - .setNotify(magicBranch.notify) - .setAccountsToNotify(magicBranch.getAccountsToNotify()) - .setRequestScopePropagator(requestScopePropagator) - .setSendMail(true) - .setUpdateRef(false) - .setPatchSetDescription(magicBranch.message)); + bu.insertChange( + ins.setReviewers(recipients.getReviewers()) + .setExtraCC(recipients.getCcOnly()) + .setApprovals(approvals) + .setMessage(msg.toString()) + .setNotify(magicBranch.notify) + .setAccountsToNotify(magicBranch.getAccountsToNotify()) + .setRequestScopePropagator(requestScopePropagator) + .setSendMail(true) + .setUpdateRef(false) + .setPatchSetDescription(magicBranch.message)); if (!magicBranch.hashtags.isEmpty()) { bu.addOp( changeId, - hashtagsFactory.create(new HashtagsInput(magicBranch.hashtags)) - .setFireEvent(false)); + hashtagsFactory.create(new HashtagsInput(magicBranch.hashtags)).setFireEvent(false)); } if (!Strings.isNullOrEmpty(magicBranch.topic)) { bu.addOp( @@ -2114,13 +2157,15 @@ public class ReceiveCommits { } }); } - bu.addOp(changeId, new BatchUpdate.Op() { - @Override - public boolean updateChange(ChangeContext ctx) { - change = ctx.getChange(); - return false; - } - }); + bu.addOp( + changeId, + new BatchUpdate.Op() { + @Override + public boolean updateChange(ChangeContext ctx) { + change = ctx.getChange(); + return false; + } + }); bu.addOp(changeId, new ChangeProgressOp(newProgress)); } catch (Exception e) { throw INSERT_EXCEPTION.apply(e); @@ -2128,26 +2173,22 @@ public class ReceiveCommits { } } - private void submit( - Collection create, Collection replace) + private void submit(Collection create, Collection replace) throws OrmException, RestApiException { - Map bySha = - Maps.newHashMapWithExpectedSize(create.size() + replace.size()); + Map bySha = Maps.newHashMapWithExpectedSize(create.size() + replace.size()); for (CreateRequest r : create) { - checkNotNull(r.change, - "cannot submit new change %s; op may not have run", r.changeId); + checkNotNull(r.change, "cannot submit new change %s; op may not have run", r.changeId); bySha.put(r.commit, r.change); } for (ReplaceRequest r : replace) { bySha.put(r.newCommitId, r.notes.getChange()); } Change tipChange = bySha.get(magicBranch.cmd.getNewId()); - checkNotNull(tipChange, - "tip of push does not correspond to a change; found these changes: %s", - bySha); - logDebug("Processing submit with tip change {} ({})", - tipChange.getId(), magicBranch.cmd.getNewId()); - try (MergeOp op = mergeOpProvider.get()) { + checkNotNull( + tipChange, "tip of push does not correspond to a change; found these changes: %s", bySha); + logDebug( + "Processing submit with tip change {} ({})", tipChange.getId(), magicBranch.cmd.getNewId()); + try (MergeOp op = mergeOpProvider.get()) { op.merge(db, tipChange, user, false, new SubmitInput(), false); } } @@ -2155,8 +2196,7 @@ public class ReceiveCommits { private void preparePatchSetsForReplace() { try { readChangesForReplace(); - for (Iterator itr = replaceByChange.values().iterator(); - itr.hasNext();) { + for (Iterator itr = replaceByChange.values().iterator(); itr.hasNext(); ) { ReplaceRequest req = itr.next(); if (req.inputCommand.getResult() == NOT_ATTEMPTED) { req.validate(false); @@ -2166,18 +2206,20 @@ public class ReceiveCommits { } } } catch (OrmException err) { - logError(String.format( - "Cannot read database before replacement for project %s", - project.getName()), err); + logError( + String.format( + "Cannot read database before replacement for project %s", project.getName()), + err); for (ReplaceRequest req : replaceByChange.values()) { if (req.inputCommand.getResult() == NOT_ATTEMPTED) { req.inputCommand.setResult(REJECTED_OTHER_REASON, "internal server error"); } } } catch (IOException err) { - logError(String.format( - "Cannot read repository before replacement for project %s", - project.getName()), err); + logError( + String.format( + "Cannot read repository before replacement for project %s", project.getName()), + err); for (ReplaceRequest req : replaceByChange.values()) { if (req.inputCommand.getResult() == NOT_ATTEMPTED) { req.inputCommand.setResult(REJECTED_OTHER_REASON, "internal server error"); @@ -2211,9 +2253,7 @@ public class ReceiveCommits { private void readChangesForReplace() throws OrmException { Collection allNotes = notesFactory.create( - db, - replaceByChange.values().stream() - .map(r -> r.ontoChange).collect(toList())); + db, replaceByChange.values().stream().map(r -> r.ontoChange).collect(toList())); for (ChangeNotes notes : allNotes) { replaceByChange.get(notes.getChangeId()).notes = notes; } @@ -2236,8 +2276,8 @@ public class ReceiveCommits { List groups = ImmutableList.of(); private ReplaceOp replaceOp; - ReplaceRequest(Change.Id toChange, RevCommit newCommit, ReceiveCommand cmd, - boolean checkMergedInto) { + ReplaceRequest( + Change.Id toChange, RevCommit newCommit, ReceiveCommand cmd, boolean checkMergedInto) { this.ontoChange = toChange; this.newCommitId = newCommit.copy(); this.inputCommand = cmd; @@ -2247,29 +2287,29 @@ public class ReceiveCommits { for (Ref ref : refs(toChange)) { try { revisions.forcePut( - rp.getRevWalk().parseCommit(ref.getObjectId()), - PatchSet.Id.fromRef(ref.getName())); + rp.getRevWalk().parseCommit(ref.getObjectId()), PatchSet.Id.fromRef(ref.getName())); } catch (IOException err) { - logWarn(String.format( - "Project %s contains invalid change ref %s", - project.getName(), ref.getName()), err); + logWarn( + String.format( + "Project %s contains invalid change ref %s", project.getName(), ref.getName()), + err); } } } /** * Validate the new patch set commit for this change. - *

- * Side effects: + * + *

Side effects: + * *

    - *
  • May add error or warning messages to the progress monitor
  • - *
  • Will reject {@code cmd} prior to returning false
  • - *
  • May reset {@code rp.getRevWalk()}; do not call in the middle of a - * walk.
  • + *
  • May add error or warning messages to the progress monitor + *
  • Will reject {@code cmd} prior to returning false + *
  • May reset {@code rp.getRevWalk()}; do not call in the middle of a walk. *
* - * @param autoClose whether the caller intends to auto-close the change - * after adding a new patch set. + * @param autoClose whether the caller intends to auto-close the change after adding a new patch + * set. * @return whether the new commit is valid * @throws IOException * @throws OrmException @@ -2297,8 +2337,7 @@ public class ReceiveCommits { if (changeCtl.isPatchSetLocked(db)) { locked = ". Change is patch set locked."; } - reject(inputCommand, "cannot add patch set to " - + ontoChange + locked); + reject(inputCommand, "cannot add patch set to " + ontoChange + locked); return false; } else if (notes.getChange().getStatus().isClosed()) { reject(inputCommand, "change " + ontoChange + " closed"); @@ -2308,8 +2347,7 @@ public class ReceiveCommits { return false; } - for (Ref r : rp.getRepository().getRefDatabase() - .getRefs("refs/changes").values()) { + for (Ref r : rp.getRepository().getRefDatabase().getRefs("refs/changes").values()) { if (r.getObjectId().equals(newCommit)) { reject(inputCommand, "commit already exists (in the project)"); return false; @@ -2326,8 +2364,7 @@ public class ReceiveCommits { } } - if (!validCommit(rp.getRevWalk(), changeCtl.getRefControl(), inputCommand, - newCommit)) { + if (!validCommit(rp.getRevWalk(), changeCtl.getRefControl(), inputCommand, newCommit)) { return false; } rp.getRevWalk().parseBody(priorCommit); @@ -2336,17 +2373,16 @@ public class ReceiveCommits { // or no parents were updated (rebase), else warn that only part // of the commit was modified. if (newCommit.getTree().equals(priorCommit.getTree())) { - boolean messageEq = - eq(newCommit.getFullMessage(), priorCommit.getFullMessage()); + boolean messageEq = eq(newCommit.getFullMessage(), priorCommit.getFullMessage()); boolean parentsEq = parentsEqual(newCommit, priorCommit); boolean authorEq = authorEqual(newCommit, priorCommit); ObjectReader reader = rp.getRevWalk().getObjectReader(); if (messageEq && parentsEq && authorEq && !autoClose) { - addMessage(String.format( - "(W) No changes between prior commit %s and new commit %s", - reader.abbreviate(priorCommit).name(), - reader.abbreviate(newCommit).name())); + addMessage( + String.format( + "(W) No changes between prior commit %s and new commit %s", + reader.abbreviate(priorCommit).name(), reader.abbreviate(newCommit).name())); } else { StringBuilder msg = new StringBuilder(); msg.append("(I) "); @@ -2388,16 +2424,14 @@ public class ReceiveCommits { if (edit.isPresent()) { if (edit.get().getBasePatchSet().getId().equals(psId)) { // replace edit - cmd = new ReceiveCommand( - edit.get().getRef().getObjectId(), - newCommitId, - edit.get().getRefName()); + cmd = + new ReceiveCommand( + edit.get().getRef().getObjectId(), newCommitId, edit.get().getRefName()); } else { // delete old edit ref on rebase - prev = new ReceiveCommand( - edit.get().getRef().getObjectId(), - ObjectId.zeroId(), - edit.get().getRefName()); + prev = + new ReceiveCommand( + edit.get().getRef().getObjectId(), ObjectId.zeroId(), edit.get().getRefName()); createEditCommand(); } } else { @@ -2409,29 +2443,21 @@ public class ReceiveCommits { private void createEditCommand() { // create new edit - cmd = new ReceiveCommand( - ObjectId.zeroId(), - newCommitId, - RefNames.refsEdit( - user.getAccountId(), - notes.getChangeId(), - psId)); + cmd = + new ReceiveCommand( + ObjectId.zeroId(), + newCommitId, + RefNames.refsEdit(user.getAccountId(), notes.getChangeId(), psId)); } private void newPatchSet() throws IOException { RevCommit newCommit = rp.getRevWalk().parseCommit(newCommitId); - psId = ChangeUtil.nextPatchSetId( - allRefs, notes.getChange().currentPatchSetId()); - info = patchSetInfoFactory.get( - rp.getRevWalk(), newCommit, psId); - cmd = new ReceiveCommand( - ObjectId.zeroId(), - newCommitId, - psId.toRefName()); + psId = ChangeUtil.nextPatchSetId(allRefs, notes.getChange().currentPatchSetId()); + info = patchSetInfoFactory.get(rp.getRevWalk(), newCommit, psId); + cmd = new ReceiveCommand(ObjectId.zeroId(), newCommitId, psId.toRefName()); } - void addOps(BatchUpdate bu, @Nullable Task progress) - throws IOException { + void addOps(BatchUpdate bu, @Nullable Task progress) throws IOException { if (cmd.getResult() == NOT_ATTEMPTED) { // TODO(dborowitz): When does this happen? Only when an edit ref is // involved? @@ -2446,22 +2472,32 @@ public class ReceiveCommits { rw.parseBody(newCommit); RevCommit priorCommit = revisions.inverse().get(priorPatchSet); - replaceOp = replaceOpFactory - .create(projectControl, notes.getChange().getDest(), checkMergedInto, - priorPatchSet, priorCommit, psId, newCommit, info, groups, - magicBranch, rp.getPushCertificate()) - .setRequestScopePropagator(requestScopePropagator) - .setUpdateRef(false); + replaceOp = + replaceOpFactory + .create( + projectControl, + notes.getChange().getDest(), + checkMergedInto, + priorPatchSet, + priorCommit, + psId, + newCommit, + info, + groups, + magicBranch, + rp.getPushCertificate()) + .setRequestScopePropagator(requestScopePropagator) + .setUpdateRef(false); bu.addOp(notes.getChangeId(), replaceOp); if (progress != null) { bu.addOp(notes.getChangeId(), new ChangeProgressOp(progress)); } } - void insertPatchSetWithoutBatchUpdate() - throws IOException, UpdateException, RestApiException { - try (BatchUpdate bu = batchUpdateFactory.create(db, - projectControl.getProject().getNameKey(), user, TimeUtil.nowTs()); + void insertPatchSetWithoutBatchUpdate() throws IOException, UpdateException, RestApiException { + try (BatchUpdate bu = + batchUpdateFactory.create( + db, projectControl.getProject().getNameKey(), user, TimeUtil.nowTs()); ObjectInserter ins = repo.newObjectInserter()) { bu.setRepository(repo, rp.getRevWalk(), ins); bu.setRequestId(receiveId); @@ -2486,22 +2522,24 @@ public class ReceiveCommits { } private void addOps(BatchUpdate bu) { - bu.addOp(psId.getParentKey(), new BatchUpdate.Op() { - @Override - public boolean updateChange(ChangeContext ctx) throws OrmException { - PatchSet ps = psUtil.get(ctx.getDb(), ctx.getNotes(), psId); - List oldGroups = ps.getGroups(); - if (oldGroups == null) { - if (groups == null) { - return false; + bu.addOp( + psId.getParentKey(), + new BatchUpdate.Op() { + @Override + public boolean updateChange(ChangeContext ctx) throws OrmException { + PatchSet ps = psUtil.get(ctx.getDb(), ctx.getNotes(), psId); + List oldGroups = ps.getGroups(); + if (oldGroups == null) { + if (groups == null) { + return false; + } + } else if (sameGroups(oldGroups, groups)) { + return false; + } + psUtil.setGroups(ctx.getDb(), ctx.getUpdate(psId), ps, groups); + return true; } - } else if (sameGroups(oldGroups, groups)) { - return false; - } - psUtil.setGroups(ctx.getDb(), ctx.getUpdate(psId), ps, groups); - return true; - } - }); + }); } private boolean sameGroups(List a, List b) { @@ -2581,8 +2619,7 @@ public class ReceiveCommits { } private boolean validRefOperation(ReceiveCommand cmd) { - RefOperationValidators refValidators = - refValidatorsFactory.create(getProject(), user, cmd); + RefOperationValidators refValidators = refValidatorsFactory.create(getProject(), user, cmd); try { messages.addAll(refValidators.validateForRefOperation()); @@ -2609,8 +2646,7 @@ public class ReceiveCommits { return; } - boolean defaultName = - Strings.isNullOrEmpty(user.getAccount().getFullName()); + boolean defaultName = Strings.isNullOrEmpty(user.getAccount().getFullName()); RevWalk walk = rp.getRevWalk(); walk.reset(); walk.sort(RevSort.NONE); @@ -2620,10 +2656,10 @@ public class ReceiveCommits { return; } ListMultimap existing = changeRefsById(); - walk.markStart((RevCommit)parsedObject); + walk.markStart((RevCommit) parsedObject); markHeadsAsUninteresting(walk, cmd.getRefName()); int i = 0; - for (RevCommit c; (c = walk.next()) != null;) { + for (RevCommit c; (c = walk.next()) != null; ) { i++; if (existing.keySet().contains(c)) { continue; @@ -2631,8 +2667,7 @@ public class ReceiveCommits { break; } - if (defaultName && user.hasEmailAddress( - c.getCommitterIdent().getEmailAddress())) { + if (defaultName && user.hasEmailAddress(c.getCommitterIdent().getEmailAddress())) { try { Account a = db.accounts().get(user.getAccountId()); if (a != null && Strings.isNullOrEmpty(a.getFullName())) { @@ -2655,8 +2690,8 @@ public class ReceiveCommits { } } - private boolean validCommit(RevWalk rw, RefControl ctl, ReceiveCommand cmd, - ObjectId id) throws IOException { + private boolean validCommit(RevWalk rw, RefControl ctl, ReceiveCommand cmd, ObjectId id) + throws IOException { if (validCommits.contains(id)) { return true; @@ -2678,8 +2713,7 @@ public class ReceiveCommits { try { messages.addAll( - commitValidatorsFactory.create(policy, ctl, sshInfo, repo) - .validate(receiveEvent)); + commitValidatorsFactory.create(policy, ctl, sshInfo, repo).validate(receiveEvent)); } catch (CommitValidationException e) { logDebug("Commit validation failed on {}", c.name()); messages.addAll(e.getMessages()); @@ -2693,22 +2727,23 @@ public class ReceiveCommits { private void autoCloseChanges(final ReceiveCommand cmd) { logDebug("Starting auto-closing of changes"); String refName = cmd.getRefName(); - checkState(!MagicBranch.isMagicBranch(refName), - "shouldn't be auto-closing changes on magic branch %s", refName); + checkState( + !MagicBranch.isMagicBranch(refName), + "shouldn't be auto-closing changes on magic branch %s", + refName); RevWalk rw = rp.getRevWalk(); // TODO(dborowitz): Combine this BatchUpdate with the main one in // insertChangesAndPatchSets. - try (BatchUpdate bu = batchUpdateFactory.create(db, - projectControl.getProject().getNameKey(), user, TimeUtil.nowTs()); + try (BatchUpdate bu = + batchUpdateFactory.create( + db, projectControl.getProject().getNameKey(), user, TimeUtil.nowTs()); ObjectInserter ins = repo.newObjectInserter()) { - bu.setRepository(repo, rp.getRevWalk(), ins) - .updateChangesInParallel(); + bu.setRepository(repo, rp.getRevWalk(), ins).updateChangesInParallel(); bu.setRequestId(receiveId); // TODO(dborowitz): Teach BatchUpdate to ignore missing changes. RevCommit newTip = rw.parseCommit(cmd.getNewId()); - Branch.NameKey branch = - new Branch.NameKey(project.getNameKey(), refName); + Branch.NameKey branch = new Branch.NameKey(project.getNameKey(), refName); rw.reset(); rw.markStart(newTip); @@ -2722,7 +2757,8 @@ public class ReceiveCommits { int existingPatchSets = 0; int newPatchSets = 0; - COMMIT: for (RevCommit c; (c = rw.next()) != null;) { + COMMIT: + for (RevCommit c; (c = rw.next()) != null; ) { rw.parseBody(c); for (Ref ref : byCommit.get(c.copy())) { @@ -2730,8 +2766,7 @@ public class ReceiveCommits { PatchSet.Id psId = PatchSet.Id.fromRef(ref.getName()); bu.addOp( psId.getParentKey(), - mergedByPushOpFactory.create( - requestScopePropagator, psId, refName)); + mergedByPushOpFactory.create(requestScopePropagator, psId, refName)); continue COMMIT; } @@ -2745,8 +2780,7 @@ public class ReceiveCommits { newPatchSets++; // Hold onto this until we're done with the walk, as the call to // req.validate below calls isMergedInto which resets the walk. - ReplaceRequest req = - new ReplaceRequest(onto.getChangeId(), c, cmd, false); + ReplaceRequest req = new ReplaceRequest(onto.getChangeId(), c, cmd, false); req.notes = onto; replaceAndClose.add(req); continue COMMIT; @@ -2763,19 +2797,22 @@ public class ReceiveCommits { req.addOps(bu, null); bu.addOp( id, - mergedByPushOpFactory.create( - requestScopePropagator, req.psId, refName) - .setPatchSetProvider(new Provider() { - @Override - public PatchSet get() { - return req.replaceOp.getPatchSet(); - } - })); + mergedByPushOpFactory + .create(requestScopePropagator, req.psId, refName) + .setPatchSetProvider( + new Provider() { + @Override + public PatchSet get() { + return req.replaceOp.getPatchSet(); + } + })); bu.addOp(id, new ChangeProgressOp(closeProgress)); } - logDebug("Auto-closing {} changes with existing patch sets and {} with" - + " new patch sets", existingPatchSets, newPatchSets); + logDebug( + "Auto-closing {} changes with existing patch sets and {} with" + " new patch sets", + existingPatchSets, + newPatchSets); bu.execute(); } catch (RestApiException e) { logError("Can't insert patchset", e); @@ -2784,8 +2821,8 @@ public class ReceiveCommits { } } - private Map openChangesByBranch( - Branch.NameKey branch) throws OrmException { + private Map openChangesByBranch(Branch.NameKey branch) + throws OrmException { Map r = new HashMap<>(); for (ChangeData cd : queryProvider.get().byBranchOpen(branch)) { r.put(cd.change().getKey(), cd.notes()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommitsAdvertiseRefsHook.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommitsAdvertiseRefsHook.java index 5871299b83..f4c086730a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommitsAdvertiseRefsHook.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommitsAdvertiseRefsHook.java @@ -30,7 +30,10 @@ import com.google.gerrit.server.query.change.InternalChangeQuery; import com.google.gerrit.server.util.MagicBranch; import com.google.gwtorm.server.OrmException; import com.google.inject.Provider; - +import java.io.IOException; +import java.util.Collections; +import java.util.Map; +import java.util.Set; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.transport.AdvertiseRefsHook; @@ -40,20 +43,15 @@ import org.eclipse.jgit.transport.UploadPack; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.Collections; -import java.util.Map; -import java.util.Set; - /** Exposes only the non refs/changes/ reference names. */ public class ReceiveCommitsAdvertiseRefsHook implements AdvertiseRefsHook { - private static final Logger log = LoggerFactory - .getLogger(ReceiveCommitsAdvertiseRefsHook.class); + private static final Logger log = LoggerFactory.getLogger(ReceiveCommitsAdvertiseRefsHook.class); @VisibleForTesting @AutoValue public abstract static class Result { public abstract Map allRefs(); + public abstract Set additionalHaves(); } @@ -61,8 +59,7 @@ public class ReceiveCommitsAdvertiseRefsHook implements AdvertiseRefsHook { private final Project.NameKey projectName; public ReceiveCommitsAdvertiseRefsHook( - Provider queryProvider, - Project.NameKey projectName) { + Provider queryProvider, Project.NameKey projectName) { this.queryProvider = queryProvider; this.projectName = projectName; } @@ -74,8 +71,7 @@ public class ReceiveCommitsAdvertiseRefsHook implements AdvertiseRefsHook { } @Override - public void advertiseRefs(BaseReceivePack rp) - throws ServiceMayNotContinueException { + public void advertiseRefs(BaseReceivePack rp) throws ServiceMayNotContinueException { Map oldRefs = rp.getAdvertisedRefs(); if (oldRefs == null) { try { @@ -121,11 +117,13 @@ public class ReceiveCommitsAdvertiseRefsHook implements AdvertiseRefsHook { int limit = 32; try { Set r = Sets.newHashSetWithExpectedSize(limit); - for (ChangeData cd : queryProvider.get() - .setRequestedFields(OPEN_CHANGES_FIELDS) - .enforceVisibility(true) - .setLimit(limit) - .byProjectOpen(projectName)) { + for (ChangeData cd : + queryProvider + .get() + .setRequestedFields(OPEN_CHANGES_FIELDS) + .enforceVisibility(true) + .setLimit(limit) + .byProjectOpen(projectName)) { PatchSet ps = cd.currentPatchSet(); if (ps != null) { ObjectId id = ObjectId.fromString(ps.getRevision().get()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommitsExecutor.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommitsExecutor.java index 2049ceada5..ddf24cdeb0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommitsExecutor.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommitsExecutor.java @@ -17,14 +17,9 @@ package com.google.gerrit.server.git; import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.google.inject.BindingAnnotation; - import java.lang.annotation.Retention; -/** - * Marker on the global {@link WorkQueue.Executor} used by - * {@link ReceiveCommits}. - */ +/** Marker on the global {@link WorkQueue.Executor} used by {@link ReceiveCommits}. */ @Retention(RUNTIME) @BindingAnnotation -public @interface ReceiveCommitsExecutor { -} +public @interface ReceiveCommitsExecutor {} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommitsExecutorModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommitsExecutorModule.java index 8c428a240a..da1c36c884 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommitsExecutorModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommitsExecutorModule.java @@ -21,28 +21,25 @@ import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.AbstractModule; import com.google.inject.Provides; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.Config; - import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import org.eclipse.jgit.lib.Config; /** Module providing the {@link ReceiveCommitsExecutor}. */ public class ReceiveCommitsExecutorModule extends AbstractModule { @Override - protected void configure() { - } + protected void configure() {} @Provides @Singleton @ReceiveCommitsExecutor public WorkQueue.Executor createReceiveCommitsExecutor( - @GerritServerConfig Config config, - WorkQueue queues) { - int poolSize = config.getInt("receive", null, "threadPoolSize", - Runtime.getRuntime().availableProcessors()); + @GerritServerConfig Config config, WorkQueue queues) { + int poolSize = + config.getInt( + "receive", null, "threadPoolSize", Runtime.getRuntime().availableProcessors()); return queues.createQueue(poolSize, "ReceiveCommits"); } @@ -68,13 +65,13 @@ public class ReceiveCommitsExecutorModule extends AbstractModule { } return MoreExecutors.listeningDecorator( MoreExecutors.getExitingExecutorService( - new ThreadPoolExecutor(1, poolSize, - 10, TimeUnit.MINUTES, - new ArrayBlockingQueue(poolSize), - new ThreadFactoryBuilder() - .setNameFormat("ChangeUpdate-%d") - .setDaemon(true) - .build(), - new ThreadPoolExecutor.CallerRunsPolicy()))); + new ThreadPoolExecutor( + 1, + poolSize, + 10, + TimeUnit.MINUTES, + new ArrayBlockingQueue(poolSize), + new ThreadFactoryBuilder().setNameFormat("ChangeUpdate-%d").setDaemon(true).build(), + new ThreadPoolExecutor.CallerRunsPolicy()))); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveConfig.java index ac6116c7ac..063f395053 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveConfig.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveConfig.java @@ -20,7 +20,6 @@ import com.google.gerrit.server.CurrentUser; import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; import com.google.inject.Singleton; - import org.eclipse.jgit.lib.Config; @Singleton @@ -32,15 +31,10 @@ class ReceiveConfig { @Inject ReceiveConfig(@GerritServerConfig Config config) { - checkMagicRefs = config.getBoolean( - "receive", null, "checkMagicRefs", - true); - checkReferencedObjectsAreReachable = config.getBoolean( - "receive", null, "checkReferencedObjectsAreReachable", - true); - allowDrafts = config.getBoolean( - "change", null, "allowDrafts", - true); + checkMagicRefs = config.getBoolean("receive", null, "checkMagicRefs", true); + checkReferencedObjectsAreReachable = + config.getBoolean("receive", null, "checkReferencedObjectsAreReachable", true); + allowDrafts = config.getBoolean("change", null, "allowDrafts", true); systemMaxBatchChanges = config.getInt("receive", "maxBatchChanges", 0); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceivePackInitializer.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceivePackInitializer.java index ee229d4958..f3742156e3 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceivePackInitializer.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceivePackInitializer.java @@ -16,7 +16,6 @@ package com.google.gerrit.server.git; import com.google.gerrit.extensions.annotations.ExtensionPoint; import com.google.gerrit.reviewdb.client.Project; - import org.eclipse.jgit.transport.ReceivePack; @ExtensionPoint @@ -25,9 +24,9 @@ public interface ReceivePackInitializer { /** * ReceivePack initialization. * - * Invoked by Gerrit when a new ReceivePack instance is created and just - * before it is used. Implementors will usually call setXXX methods on the - * receivePack parameter in order to set additional properties on it. + *

Invoked by Gerrit when a new ReceivePack instance is created and just before it is used. + * Implementors will usually call setXXX methods on the receivePack parameter in order to set + * additional properties on it. * * @param project project for which the ReceivePack is created * @param receivePack the ReceivePack instance which is being initialized diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/RefCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/RefCache.java index 96593ac3a2..5a5cae9332 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/RefCache.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/RefCache.java @@ -14,30 +14,27 @@ package com.google.gerrit.server.git; -import org.eclipse.jgit.lib.ObjectId; - import java.io.IOException; import java.util.Optional; +import org.eclipse.jgit.lib.ObjectId; /** * Simple short-lived cache of individual refs read from a repo. - *

- * Within a single request that is known to read a small bounded number of refs, - * this class can be used to ensure a consistent view of one ref, and avoid - * multiple system calls to read refs multiple times. - *

- * Note: Implementations of this class are only appropriate - * for short-term caching, and do not support invalidation. It is also not - * threadsafe. + * + *

Within a single request that is known to read a small bounded number of refs, this class can + * be used to ensure a consistent view of one ref, and avoid multiple system calls to read refs + * multiple times. + * + *

Note: Implementations of this class are only appropriate for short-term + * caching, and do not support invalidation. It is also not threadsafe. */ public interface RefCache { /** * Get the possibly-cached value of a ref. * * @param refName name of the ref. - * @return value of the ref; absent if the ref does not exist in the repo. - * Never null, and never present with a value of {@link - * ObjectId#zeroId()}. + * @return value of the ref; absent if the ref does not exist in the repo. Never null, and never + * present with a value of {@link ObjectId#zeroId()}. */ Optional get(String refName) throws IOException; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/RenameGroupOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/RenameGroupOp.java index 00c9a7c775..63d8641ca1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/RenameGroupOp.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/RenameGroupOp.java @@ -20,28 +20,27 @@ import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.project.ProjectCache; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.PersonIdent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.TimeUnit; - public class RenameGroupOp extends DefaultQueueOp { public interface Factory { - RenameGroupOp create(@Assisted("author") PersonIdent author, - @Assisted AccountGroup.UUID uuid, @Assisted("oldName") String oldName, + RenameGroupOp create( + @Assisted("author") PersonIdent author, + @Assisted AccountGroup.UUID uuid, + @Assisted("oldName") String oldName, @Assisted("newName") String newName); } private static final int MAX_TRIES = 10; - private static final Logger log = - LoggerFactory.getLogger(RenameGroupOp.class); + private static final Logger log = LoggerFactory.getLogger(RenameGroupOp.class); private final ProjectCache projectCache; private final MetaDataUpdate.Server metaDataUpdateFactory; @@ -55,11 +54,14 @@ public class RenameGroupOp extends DefaultQueueOp { private boolean tryingAgain; @Inject - public RenameGroupOp(WorkQueue workQueue, ProjectCache projectCache, + public RenameGroupOp( + WorkQueue workQueue, + ProjectCache projectCache, MetaDataUpdate.Server metaDataUpdateFactory, - - @Assisted("author") PersonIdent author, @Assisted AccountGroup.UUID uuid, - @Assisted("oldName") String oldName, @Assisted("newName") String newName) { + @Assisted("author") PersonIdent author, + @Assisted AccountGroup.UUID uuid, + @Assisted("oldName") String oldName, + @Assisted("newName") String newName) { super(workQueue); this.projectCache = projectCache; this.metaDataUpdateFactory = metaDataUpdateFactory; @@ -73,9 +75,7 @@ public class RenameGroupOp extends DefaultQueueOp { @Override public void run() { - Iterable names = tryingAgain - ? retryOn - : projectCache.all(); + Iterable names = tryingAgain ? retryOn : projectCache.all(); for (Project.NameKey projectName : names) { ProjectConfig config = projectCache.get(projectName).getConfig(); GroupReference ref = config.getGroup(uuid); @@ -100,8 +100,7 @@ public class RenameGroupOp extends DefaultQueueOp { } } - private void rename(MetaDataUpdate md) throws IOException, - ConfigInvalidException { + private void rename(MetaDataUpdate md) throws IOException, ConfigInvalidException { boolean success = false; for (int attempts = 0; !success && attempts < MAX_TRIES; attempts++) { ProjectConfig config = ProjectConfig.read(md); @@ -122,8 +121,14 @@ public class RenameGroupOp extends DefaultQueueOp { projectCache.evict(config.getProject()); success = true; } catch (IOException e) { - log.error("Could not commit rename of group " + oldName + " to " - + newName + " in " + md.getProjectName().get(), e); + log.error( + "Could not commit rename of group " + + oldName + + " to " + + newName + + " in " + + md.getProjectName().get(), + e); try { Thread.sleep(25 /* milliseconds */); } catch (InterruptedException wakeUp) { @@ -134,8 +139,13 @@ public class RenameGroupOp extends DefaultQueueOp { if (!success) { if (tryingAgain) { - log.warn("Could not rename group " + oldName + " to " + newName - + " in " + md.getProjectName().get()); + log.warn( + "Could not rename group " + + oldName + + " to " + + newName + + " in " + + md.getProjectName().get()); } else { retryOn.add(md.getProjectName()); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReplaceOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReplaceOp.java index 2de5378e66..bd1f2cd0ad 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReplaceOp.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReplaceOp.java @@ -55,7 +55,12 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; import com.google.inject.util.Providers; - +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ExecutorService; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Ref; @@ -67,13 +72,6 @@ import org.eclipse.jgit.transport.ReceiveCommand; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ExecutorService; - public class ReplaceOp extends BatchUpdate.Op { public interface Factory { ReplaceOp create( @@ -90,8 +88,7 @@ public class ReplaceOp extends BatchUpdate.Op { @Nullable PushCertificate pushCertificate); } - private static final Logger log = - LoggerFactory.getLogger(ReplaceOp.class); + private static final Logger log = LoggerFactory.getLogger(ReplaceOp.class); private static final String CHANGE_IS_CLOSED = "change is closed"; @@ -134,7 +131,8 @@ public class ReplaceOp extends BatchUpdate.Op { private boolean updateRef; @AssistedInject - ReplaceOp(AccountResolver accountResolver, + ReplaceOp( + AccountResolver accountResolver, ApprovalCopier approvalCopier, ApprovalsUtil approvalsUtil, ChangeControl.GenericFactory changeControlFactory, @@ -190,28 +188,25 @@ public class ReplaceOp extends BatchUpdate.Op { @Override public void updateRepo(RepoContext ctx) throws Exception { - changeKind = changeKindCache.getChangeKind( - projectControl.getProject().getNameKey(), - ctx.getRepository(), priorCommit, commit); + changeKind = + changeKindCache.getChangeKind( + projectControl.getProject().getNameKey(), ctx.getRepository(), priorCommit, commit); if (checkMergedInto) { Ref mergedInto = findMergedInto(ctx, dest.get(), commit); if (mergedInto != null) { - mergedByPushOp = mergedByPushOpFactory.create( - requestScopePropagator, patchSetId, mergedInto.getName()); + mergedByPushOp = + mergedByPushOpFactory.create(requestScopePropagator, patchSetId, mergedInto.getName()); } } if (updateRef) { - ctx.addRefUpdate( - new ReceiveCommand(ObjectId.zeroId(), commit, - patchSetId.toRefName())); + ctx.addRefUpdate(new ReceiveCommand(ObjectId.zeroId(), commit, patchSetId.toRefName())); } } @Override - public boolean updateChange(ChangeContext ctx) - throws OrmException, IOException { + public boolean updateChange(ChangeContext ctx) throws OrmException, IOException { change = ctx.getChange(); if (change == null || change.getStatus().isClosed()) { rejectMessage = CHANGE_IS_CLOSED; @@ -219,9 +214,7 @@ public class ReplaceOp extends BatchUpdate.Op { } if (groups.isEmpty()) { PatchSet prevPs = psUtil.current(ctx.getDb(), ctx.getNotes()); - groups = prevPs != null - ? prevPs.getGroups() - : ImmutableList. of(); + groups = prevPs != null ? prevPs.getGroups() : ImmutableList.of(); } ChangeUpdate update = ctx.getUpdate(patchSetId); @@ -239,8 +232,7 @@ public class ReplaceOp extends BatchUpdate.Op { hashtags.addAll(ctx.getNotes().getHashtags()); update.setHashtags(hashtags); } - if (magicBranch.topic != null - && !magicBranch.topic.equals(ctx.getChange().getTopic())) { + if (magicBranch.topic != null && !magicBranch.topic.equals(ctx.getChange().getTopic())) { update.setTopic(magicBranch.topic); } } @@ -249,32 +241,47 @@ public class ReplaceOp extends BatchUpdate.Op { if (change.getStatus() == Change.Status.DRAFT && !draft) { update.setStatus(Change.Status.NEW); } - newPatchSet = psUtil.insert( - ctx.getDb(), ctx.getRevWalk(), update, patchSetId, commit, draft, groups, - pushCertificate != null - ? pushCertificate.toTextWithSignature() - : null, psDescription); + newPatchSet = + psUtil.insert( + ctx.getDb(), + ctx.getRevWalk(), + update, + patchSetId, + commit, + draft, + groups, + pushCertificate != null ? pushCertificate.toTextWithSignature() : null, + psDescription); update.setPsDescription(psDescription); - recipients.add(getRecipientsFromFooters( - ctx.getDb(), accountResolver, draft, commit.getFooterLines())); + recipients.add( + getRecipientsFromFooters(ctx.getDb(), accountResolver, draft, commit.getFooterLines())); recipients.remove(ctx.getAccountId()); ChangeData cd = changeDataFactory.create(ctx.getDb(), ctx.getControl()); - MailRecipients oldRecipients = - getRecipientsFromReviewers(cd.reviewers()); + MailRecipients oldRecipients = getRecipientsFromReviewers(cd.reviewers()); Iterable newApprovals = - approvalsUtil.addApprovalsForNewPatchSet(ctx.getDb(), update, - projectControl.getLabelTypes(), newPatchSet, ctx.getControl(), + approvalsUtil.addApprovalsForNewPatchSet( + ctx.getDb(), + update, + projectControl.getLabelTypes(), + newPatchSet, + ctx.getControl(), approvals); - approvalCopier.copy(ctx.getDb(), ctx.getControl(), newPatchSet, - newApprovals); - approvalsUtil.addReviewers(ctx.getDb(), update, - projectControl.getLabelTypes(), change, newPatchSet, info, - recipients.getReviewers(), oldRecipients.getAll()); + approvalCopier.copy(ctx.getDb(), ctx.getControl(), newPatchSet, newApprovals); + approvalsUtil.addReviewers( + ctx.getDb(), + update, + projectControl.getLabelTypes(), + change, + newPatchSet, + info, + recipients.getReviewers(), + oldRecipients.getAll()); recipients.add(oldRecipients); - String approvalMessage = ApprovalsUtil.renderMessageWithApprovals( - patchSetId.get(), approvals, scanLabels(ctx, approvals)); + String approvalMessage = + ApprovalsUtil.renderMessageWithApprovals( + patchSetId.get(), approvals, scanLabels(ctx, approvals)); String kindMessage = changeKindMessage(changeKind); StringBuilder message = new StringBuilder(approvalMessage); if (!Strings.isNullOrEmpty(kindMessage)) { @@ -285,15 +292,19 @@ public class ReplaceOp extends BatchUpdate.Op { if (!Strings.isNullOrEmpty(reviewMessage)) { message.append("\n").append(reviewMessage); } - msg = ChangeMessagesUtil.newMessage(patchSetId, ctx.getUser(), - ctx.getWhen(), message.toString(), ChangeMessagesUtil.TAG_UPLOADED_PATCH_SET); + msg = + ChangeMessagesUtil.newMessage( + patchSetId, + ctx.getUser(), + ctx.getWhen(), + message.toString(), + ChangeMessagesUtil.TAG_UPLOADED_PATCH_SET); cmUtil.addChangeMessage(ctx.getDb(), update, msg); if (mergedByPushOp == null) { resetChange(ctx); } else { - mergedByPushOp.setPatchSetProvider(Providers.of(newPatchSet)) - .updateChange(ctx); + mergedByPushOp.setPatchSetProvider(Providers.of(newPatchSet)).updateChange(ctx); } return true; @@ -313,14 +324,14 @@ public class ReplaceOp extends BatchUpdate.Op { } } - private Map scanLabels(ChangeContext ctx, - Map approvals) throws OrmException { + private Map scanLabels(ChangeContext ctx, Map approvals) + throws OrmException { Map current = new HashMap<>(); // We optimize here and only retrieve current when approvals provided if (!approvals.isEmpty()) { - for (PatchSetApproval a : approvalsUtil.byPatchSetUser(ctx.getDb(), - ctx.getControl(), priorPatchSetId, - ctx.getAccountId())) { + for (PatchSetApproval a : + approvalsUtil.byPatchSetUser( + ctx.getDb(), ctx.getControl(), priorPatchSetId, ctx.getAccountId())) { if (a.isLegacySubmit()) { continue; } @@ -366,37 +377,39 @@ public class ReplaceOp extends BatchUpdate.Op { // manually. final Account account = ctx.getAccount(); if (!updateRef) { - gitRefUpdated.fire(ctx.getProject(), newPatchSet.getRefName(), - ObjectId.zeroId(), commit, account); + gitRefUpdated.fire( + ctx.getProject(), newPatchSet.getRefName(), ObjectId.zeroId(), commit, account); } if (changeKind != ChangeKind.TRIVIAL_REBASE) { - Runnable sender = new Runnable() { - @Override - public void run() { - try { - ReplacePatchSetSender cm = replacePatchSetFactory.create( - projectControl.getProject().getNameKey(), change.getId()); - cm.setFrom(account.getId()); - cm.setPatchSet(newPatchSet, info); - cm.setChangeMessage(msg.getMessage(), ctx.getWhen()); - if (magicBranch != null) { - cm.setNotify(magicBranch.notify); - cm.setAccountsToNotify(magicBranch.getAccountsToNotify()); + Runnable sender = + new Runnable() { + @Override + public void run() { + try { + ReplacePatchSetSender cm = + replacePatchSetFactory.create( + projectControl.getProject().getNameKey(), change.getId()); + cm.setFrom(account.getId()); + cm.setPatchSet(newPatchSet, info); + cm.setChangeMessage(msg.getMessage(), ctx.getWhen()); + if (magicBranch != null) { + cm.setNotify(magicBranch.notify); + cm.setAccountsToNotify(magicBranch.getAccountsToNotify()); + } + cm.addReviewers(recipients.getReviewers()); + cm.addExtraCC(recipients.getCcOnly()); + cm.send(); + } catch (Exception e) { + log.error("Cannot send email for new patch set " + newPatchSet.getId(), e); + } } - cm.addReviewers(recipients.getReviewers()); - cm.addExtraCC(recipients.getCcOnly()); - cm.send(); - } catch (Exception e) { - log.error("Cannot send email for new patch set " + newPatchSet.getId(), e); - } - } - @Override - public String toString() { - return "send-email newpatchset"; - } - }; + @Override + public String toString() { + return "send-email newpatchset"; + } + }; if (requestScopePropagator != null) { sendEmailExecutor.submit(requestScopePropagator.wrap(sender)); @@ -405,11 +418,9 @@ public class ReplaceOp extends BatchUpdate.Op { } } - NotifyHandling notify = magicBranch != null && magicBranch.notify != null - ? magicBranch.notify - : NotifyHandling.ALL; - revisionCreated.fire(change, newPatchSet, ctx.getAccount(), - ctx.getWhen(), notify); + NotifyHandling notify = + magicBranch != null && magicBranch.notify != null ? magicBranch.notify : NotifyHandling.ALL; + revisionCreated.fire(change, newPatchSet, ctx.getAccount(), ctx.getWhen(), notify); try { fireCommentAddedEvent(ctx); } catch (Exception e) { @@ -430,8 +441,8 @@ public class ReplaceOp extends BatchUpdate.Op { * For labels that are set in this operation, the value was modified, so * show a transition from an oldValue of 0 to the new value. */ - ChangeControl changeControl = changeControlFactory.controlFor( - ctx.getDb(), change, ctx.getUser()); + ChangeControl changeControl = + changeControlFactory.controlFor(ctx.getDb(), change, ctx.getUser()); List labels = changeControl.getLabelTypes().getLabelTypes(); Map allApprovals = new HashMap<>(); Map oldApprovals = new HashMap<>(); @@ -446,9 +457,8 @@ public class ReplaceOp extends BatchUpdate.Op { } } - commentAdded.fire(change, newPatchSet, - ctx.getAccount(), null, - allApprovals, oldApprovals, ctx.getWhen()); + commentAdded.fire( + change, newPatchSet, ctx.getAccount(), null, allApprovals, oldApprovals, ctx.getWhen()); } public PatchSet getPatchSet() { @@ -468,8 +478,7 @@ public class ReplaceOp extends BatchUpdate.Op { return this; } - public ReplaceOp setRequestScopePropagator( - RequestScopePropagator requestScopePropagator) { + public ReplaceOp setRequestScopePropagator(RequestScopePropagator requestScopePropagator) { this.requestScopePropagator = requestScopePropagator; return this; } @@ -479,8 +488,7 @@ public class ReplaceOp extends BatchUpdate.Op { RefDatabase refDatabase = ctx.getRepository().getRefDatabase(); Ref firstRef = refDatabase.exactRef(first); - if (firstRef != null - && isMergedInto(ctx.getRevWalk(), commit, firstRef)) { + if (firstRef != null && isMergedInto(ctx.getRevWalk(), commit, firstRef)) { return firstRef; } @@ -496,8 +504,7 @@ public class ReplaceOp extends BatchUpdate.Op { } } - private static boolean isMergedInto(RevWalk rw, RevCommit commit, Ref ref) - throws IOException { + private static boolean isMergedInto(RevWalk rw, RevCommit commit, Ref ref) throws IOException { return rw.isMergedInto(commit, rw.parseCommit(ref.getObjectId())); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/RepoRefCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/RepoRefCache.java index 77f697a731..e7a86f123e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/RepoRefCache.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/RepoRefCache.java @@ -14,15 +14,14 @@ package com.google.gerrit.server.git; -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.Ref; -import org.eclipse.jgit.lib.RefDatabase; -import org.eclipse.jgit.lib.Repository; - import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Optional; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.lib.RefDatabase; +import org.eclipse.jgit.lib.Repository; /** {@link RefCache} backed directly by a repository. */ public class RepoRefCache implements RefCache { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/RepositoryCaseMismatchException.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/RepositoryCaseMismatchException.java index 98ddf80434..45ec769da8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/RepositoryCaseMismatchException.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/RepositoryCaseMismatchException.java @@ -15,26 +15,20 @@ package com.google.gerrit.server.git; import com.google.gerrit.reviewdb.client.Project; - import org.eclipse.jgit.errors.RepositoryNotFoundException; /** - * This exception is thrown if a project cannot be created because a project - * with the same name in a different case already exists. This can only happen - * if the OS has a case insensitive file system (e.g. Windows), because in this - * case the name for the git repository in the file system is already occupied - * by the existing project. + * This exception is thrown if a project cannot be created because a project with the same name in a + * different case already exists. This can only happen if the OS has a case insensitive file system + * (e.g. Windows), because in this case the name for the git repository in the file system is + * already occupied by the existing project. */ -public class RepositoryCaseMismatchException extends - RepositoryNotFoundException { +public class RepositoryCaseMismatchException extends RepositoryNotFoundException { private static final long serialVersionUID = 1L; - /** - * @param projectName name of the project that cannot be created - */ + /** @param projectName name of the project that cannot be created */ public RepositoryCaseMismatchException(final Project.NameKey projectName) { - super("Name occupied in other case. Project " + projectName.get() - + " cannot be created."); + super("Name occupied in other case. Project " + projectName.get() + " cannot be created."); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReviewNoteMerger.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReviewNoteMerger.java index 8b6da7b178..2c302038b3 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReviewNoteMerger.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReviewNoteMerger.java @@ -38,6 +38,8 @@ package com.google.gerrit.server.git; +import java.io.ByteArrayInputStream; +import java.io.IOException; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectInserter; @@ -48,13 +50,10 @@ import org.eclipse.jgit.notes.Note; import org.eclipse.jgit.notes.NoteMerger; import org.eclipse.jgit.util.io.UnionInputStream; -import java.io.ByteArrayInputStream; -import java.io.IOException; - class ReviewNoteMerger implements NoteMerger { @Override - public Note merge(Note base, Note ours, Note theirs, ObjectReader reader, - ObjectInserter inserter) throws IOException { + public Note merge(Note base, Note ours, Note theirs, ObjectReader reader, ObjectInserter inserter) + throws IOException { if (ours == null) { return theirs; } @@ -72,8 +71,8 @@ class ReviewNoteMerger implements NoteMerger { ByteArrayInputStream b = new ByteArrayInputStream(sep); ObjectStream ts = lt.openStream(); UnionInputStream union = new UnionInputStream(os, b, ts)) { - ObjectId noteData = inserter.insert(Constants.OBJ_BLOB, - lo.getSize() + sep.length + lt.getSize(), union); + ObjectId noteData = + inserter.insert(Constants.OBJ_BLOB, lo.getSize() + sep.length + lt.getSize(), union); return new Note(ours, noteData); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/SearchingChangeCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/SearchingChangeCacheImpl.java index 54ec2494e3..947382b649 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/SearchingChangeCacheImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/SearchingChangeCacheImpl.java @@ -37,19 +37,16 @@ import com.google.inject.Singleton; import com.google.inject.TypeLiteral; import com.google.inject.name.Named; import com.google.inject.util.Providers; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.ExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Singleton public class SearchingChangeCacheImpl implements GitReferenceUpdatedListener { - private static final Logger log = - LoggerFactory.getLogger(SearchingChangeCacheImpl.class); + private static final Logger log = LoggerFactory.getLogger(SearchingChangeCacheImpl.class); static final String ID_CACHE = "changes"; public static class Module extends CacheModule { @@ -67,13 +64,11 @@ public class SearchingChangeCacheImpl implements GitReferenceUpdatedListener { protected void configure() { if (slave) { bind(SearchingChangeCacheImpl.class) - .toProvider(Providers. of(null)); + .toProvider(Providers.of(null)); } else { - cache(ID_CACHE, - Project.NameKey.class, - new TypeLiteral>() {}) - .maximumWeight(0) - .loader(Loader.class); + cache(ID_CACHE, Project.NameKey.class, new TypeLiteral>() {}) + .maximumWeight(0) + .loader(Loader.class); bind(SearchingChangeCacheImpl.class); DynamicSet.bind(binder(), GitReferenceUpdatedListener.class) @@ -88,7 +83,9 @@ public class SearchingChangeCacheImpl implements GitReferenceUpdatedListener { // VisibleRefFilter without touching the database. More can be added as // necessary. abstract Change change(); - @Nullable abstract ReviewerSet reviewers(); + + @Nullable + abstract ReviewerSet reviewers(); } private final LoadingCache> cache; @@ -104,12 +101,11 @@ public class SearchingChangeCacheImpl implements GitReferenceUpdatedListener { /** * Read changes for the project from the secondary index. - *

- * Returned changes only include the {@code Change} object (with id, branch) - * and the reviewers. Additional stored fields are not loaded from the index. * - * @param db database handle to populate missing change data (probably - * unused). + *

Returned changes only include the {@code Change} object (with id, branch) and the reviewers. + * Additional stored fields are not loaded from the index. + * + * @param db database handle to populate missing change data (probably unused). * @param project project to read. * @return list of known changes; empty if no changes. */ @@ -141,8 +137,7 @@ public class SearchingChangeCacheImpl implements GitReferenceUpdatedListener { private final Provider queryProvider; @Inject - Loader(OneOffRequestContext requestContext, - Provider queryProvider) { + Loader(OneOffRequestContext requestContext, Provider queryProvider) { this.requestContext = requestContext; this.queryProvider = queryProvider; } @@ -150,15 +145,16 @@ public class SearchingChangeCacheImpl implements GitReferenceUpdatedListener { @Override public List load(Project.NameKey key) throws Exception { try (AutoCloseable ctx = requestContext.open()) { - List cds = queryProvider.get() - .setRequestedFields(ImmutableSet.of( - ChangeField.CHANGE.getName(), - ChangeField.REVIEWER.getName())) - .byProject(key); + List cds = + queryProvider + .get() + .setRequestedFields( + ImmutableSet.of(ChangeField.CHANGE.getName(), ChangeField.REVIEWER.getName())) + .byProject(key); List result = new ArrayList<>(cds.size()); for (ChangeData cd : cds) { - result.add(new AutoValue_SearchingChangeCacheImpl_CachedChange( - cd.change(), cd.getReviewers())); + result.add( + new AutoValue_SearchingChangeCacheImpl_CachedChange(cd.change(), cd.getReviewers())); } return Collections.unmodifiableList(result); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/SendEmailExecutor.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/SendEmailExecutor.java index 68fa98ad32..feb32fabc3 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/SendEmailExecutor.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/SendEmailExecutor.java @@ -17,13 +17,9 @@ package com.google.gerrit.server.git; import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.google.inject.BindingAnnotation; - import java.lang.annotation.Retention; -/** - * Marker on the global {@link WorkQueue.Executor} used to send email. - */ +/** Marker on the global {@link WorkQueue.Executor} used to send email. */ @Retention(RUNTIME) @BindingAnnotation -public @interface SendEmailExecutor { -} +public @interface SendEmailExecutor {} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java index bd53ff5580..5ed3f9773e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java @@ -34,7 +34,18 @@ import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.project.ProjectState; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - +import java.io.IOException; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Deque; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Objects; +import java.util.Set; import org.eclipse.jgit.dircache.DirCache; import org.eclipse.jgit.dircache.DirCacheBuilder; import org.eclipse.jgit.dircache.DirCacheEditor; @@ -54,24 +65,9 @@ import org.eclipse.jgit.transport.RefSpec; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Deque; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashSet; -import java.util.Map; -import java.util.Objects; -import java.util.Set; - public class SubmoduleOp { - /** - * Only used for branches without code review changes - */ + /** Only used for branches without code review changes */ public class GitlinkOp extends BatchUpdate.RepoOnlyOp { private final Branch.NameKey branch; @@ -90,8 +86,7 @@ public class SubmoduleOp { } public interface Factory { - SubmoduleOp create( - Set updatedBranches, MergeOpRepoManager orm); + SubmoduleOp create(Set updatedBranches, MergeOpRepoManager orm); } private static final Logger log = LoggerFactory.getLogger(SubmoduleOp.class); @@ -126,16 +121,16 @@ public class SubmoduleOp { ProjectCache projectCache, ProjectState.Factory projectStateFactory, @Assisted Set updatedBranches, - @Assisted MergeOpRepoManager orm) throws SubmoduleException { + @Assisted MergeOpRepoManager orm) + throws SubmoduleException { this.gitmodulesFactory = gitmodulesFactory; this.myIdent = myIdent; this.projectCache = projectCache; this.projectStateFactory = projectStateFactory; this.verboseSuperProject = - cfg.getEnum("submodule", null, "verboseSuperprojectUpdate", - VerboseSuperprojectUpdate.TRUE); - this.enableSuperProjectSubscriptions = cfg.getBoolean("submodule", - "enableSuperProjectSubscriptions", true); + cfg.getEnum("submodule", null, "verboseSuperprojectUpdate", VerboseSuperprojectUpdate.TRUE); + this.enableSuperProjectSubscriptions = + cfg.getBoolean("submodule", "enableSuperProjectSubscriptions", true); this.orm = orm; this.updatedBranches = updatedBranches; this.targets = MultimapBuilder.hashKeys().hashSetValues().build(); @@ -146,8 +141,7 @@ public class SubmoduleOp { this.sortedBranches = calculateSubscriptionMap(); } - private ImmutableSet calculateSubscriptionMap() - throws SubmoduleException { + private ImmutableSet calculateSubscriptionMap() throws SubmoduleException { if (!enableSuperProjectSubscriptions) { logDebug("Updating superprojects disabled"); return null; @@ -160,8 +154,7 @@ public class SubmoduleOp { continue; } - searchForSuperprojects(updatedBranch, new LinkedHashSet(), - allVisited); + searchForSuperprojects(updatedBranch, new LinkedHashSet(), allVisited); } // Since the searchForSuperprojects will add all branches (related or @@ -173,7 +166,8 @@ public class SubmoduleOp { return ImmutableSet.copyOf(allVisited); } - private void searchForSuperprojects(Branch.NameKey current, + private void searchForSuperprojects( + Branch.NameKey current, LinkedHashSet currentVisited, LinkedHashSet allVisited) throws SubmoduleException { @@ -181,8 +175,8 @@ public class SubmoduleOp { if (currentVisited.contains(current)) { throw new SubmoduleException( - "Branch level circular subscriptions detected: " + - printCircularPath(currentVisited, current)); + "Branch level circular subscriptions detected: " + + printCircularPath(currentVisited, current)); } if (allVisited.contains(current)) { @@ -202,8 +196,7 @@ public class SubmoduleOp { affectedBranches.add(sub.getSubmodule()); } } catch (IOException e) { - throw new SubmoduleException("Cannot find superprojects for " + current, - e); + throw new SubmoduleException("Cannot find superprojects for " + current, e); } currentVisited.remove(current); allVisited.add(current); @@ -237,8 +230,8 @@ public class SubmoduleOp { return sb.toString(); } - private Collection getDestinationBranches(Branch.NameKey src, - SubscribeSection s) throws IOException { + private Collection getDestinationBranches(Branch.NameKey src, SubscribeSection s) + throws IOException { Collection ret = new HashSet<>(); logDebug("Inspecting SubscribeSection " + s); for (RefSpec r : s.getMatchingRefSpecs()) { @@ -248,8 +241,7 @@ public class SubmoduleOp { } if (r.isWildcard()) { // refs/heads/*[:refs/somewhere/*] - ret.add(new Branch.NameKey(s.getProject(), - r.expandFromSource(src.get()).getDestination())); + ret.add(new Branch.NameKey(s.getProject(), r.expandFromSource(src.get()).getDestination())); } else { // e.g. refs/heads/master[:refs/heads/stable] String dest = r.getDestination(); @@ -275,8 +267,7 @@ public class SubmoduleOp { continue; } - for (Ref ref : or.repo.getRefDatabase().getRefs( - RefNames.REFS_HEADS).values()) { + for (Ref ref : or.repo.getRefDatabase().getRefs(RefNames.REFS_HEADS).values()) { if (r.getDestination() != null && !r.matchDestination(ref.getName())) { continue; } @@ -286,23 +277,19 @@ public class SubmoduleOp { } } } - logDebug("Returning possible branches: " + ret + - "for project " + s.getProject()); + logDebug("Returning possible branches: " + ret + "for project " + s.getProject()); return ret; } - public Collection - superProjectSubscriptionsForSubmoduleBranch(Branch.NameKey srcBranch) - throws IOException { + public Collection superProjectSubscriptionsForSubmoduleBranch( + Branch.NameKey srcBranch) throws IOException { logDebug("Calculating possible superprojects for " + srcBranch); Collection ret = new ArrayList<>(); Project.NameKey srcProject = srcBranch.getParentKey(); ProjectConfig cfg = projectCache.get(srcProject).getConfig(); - for (SubscribeSection s : projectStateFactory.create(cfg) - .getSubscribeSections(srcBranch)) { + for (SubscribeSection s : projectStateFactory.create(cfg).getSubscribeSections(srcBranch)) { logDebug("Checking subscribe section " + s); - Collection branches = - getDestinationBranches(srcBranch, s); + Collection branches = getDestinationBranches(srcBranch, s); for (Branch.NameKey targetBranch : branches) { Project.NameKey targetProject = targetBranch.getParentKey(); try { @@ -348,17 +335,14 @@ public class SubmoduleOp { } } } - BatchUpdate.execute(orm.batchUpdates(superProjects), Listener.NONE, - orm.getSubmissionId(), false); - } catch (RestApiException | UpdateException | IOException | - NoSuchProjectException e) { + BatchUpdate.execute( + orm.batchUpdates(superProjects), Listener.NONE, orm.getSubmissionId(), false); + } catch (RestApiException | UpdateException | IOException | NoSuchProjectException e) { throw new SubmoduleException("Cannot update gitlinks", e); } } - /** - * Create a separate gitlink commit - */ + /** Create a separate gitlink commit */ public CodeReviewCommit composeGitlinksCommit(final Branch.NameKey subscriber) throws IOException, SubmoduleException { OpenRepo or; @@ -416,9 +400,7 @@ public class SubmoduleOp { return or.rw.parseCommit(id); } - /** - * Amend an existing commit with gitlink updates - */ + /** Amend an existing commit with gitlink updates */ public CodeReviewCommit composeGitlinksCommit( final Branch.NameKey subscriber, CodeReviewCommit currentCommit) throws IOException, SubmoduleException { @@ -448,8 +430,7 @@ public class SubmoduleOp { commit.setParentIds(currentCommit.getParents()); if (verboseSuperProject != VerboseSuperprojectUpdate.FALSE) { //TODO:czhen handle cherrypick footer - commit.setMessage(currentCommit.getFullMessage() - + "\n\n* submodules:\n" + msgbuf.toString()); + commit.setMessage(currentCommit.getFullMessage() + "\n\n* submodules:\n" + msgbuf.toString()); } else { commit.setMessage(currentCommit.getFullMessage()); } @@ -461,8 +442,8 @@ public class SubmoduleOp { return newCommit; } - private RevCommit updateSubmodule(DirCache dc, DirCacheEditor ed, - StringBuilder msgbuf, final SubmoduleSubscription s) + private RevCommit updateSubmodule( + DirCache dc, DirCacheEditor ed, StringBuilder msgbuf, final SubmoduleSubscription s) throws SubmoduleException, IOException { OpenRepo subOr; try { @@ -475,9 +456,13 @@ public class SubmoduleOp { RevCommit oldCommit = null; if (dce != null) { if (!dce.getFileMode().equals(FileMode.GITLINK)) { - String errMsg = "Requested to update gitlink " + s.getPath() + " in " - + s.getSubmodule().getParentKey().get() + " but entry " - + "doesn't have gitlink file mode."; + String errMsg = + "Requested to update gitlink " + + s.getPath() + + " in " + + s.getSubmodule().getParentKey().get() + + " but entry " + + "doesn't have gitlink file mode."; throw new SubmoduleException(errMsg); } oldCommit = subOr.rw.parseCommit(dce.getObjectId()); @@ -500,13 +485,14 @@ public class SubmoduleOp { // gitlink have already been updated for this submodule return null; } - ed.add(new PathEdit(s.getPath()) { - @Override - public void apply(DirCacheEntry ent) { - ent.setFileMode(FileMode.GITLINK); - ent.setObjectId(newCommit.getId()); - } - }); + ed.add( + new PathEdit(s.getPath()) { + @Override + public void apply(DirCacheEntry ent) { + ent.setFileMode(FileMode.GITLINK); + ent.setObjectId(newCommit.getId()); + } + }); if (verboseSuperProject != VerboseSuperprojectUpdate.FALSE) { createSubmoduleCommitMsg(msgbuf, s, subOr, newCommit, oldCommit); @@ -515,8 +501,12 @@ public class SubmoduleOp { return newCommit; } - private void createSubmoduleCommitMsg(StringBuilder msgbuf, - SubmoduleSubscription s, OpenRepo subOr, RevCommit newCommit, RevCommit oldCommit) + private void createSubmoduleCommitMsg( + StringBuilder msgbuf, + SubmoduleSubscription s, + OpenRepo subOr, + RevCommit newCommit, + RevCommit oldCommit) throws SubmoduleException { msgbuf.append("* Update " + s.getPath()); msgbuf.append(" from branch '" + s.getSubmodule().getShortName() + "'"); @@ -539,24 +529,24 @@ public class SubmoduleOp { } } } catch (IOException e) { - throw new SubmoduleException("Could not perform a revwalk to " - + "create superproject commit message", e); + throw new SubmoduleException( + "Could not perform a revwalk to " + "create superproject commit message", e); } } - private static DirCache readTree(RevWalk rw, ObjectId base) - throws IOException { + private static DirCache readTree(RevWalk rw, ObjectId base) throws IOException { final DirCache dc = DirCache.newInCore(); final DirCacheBuilder b = dc.builder(); - b.addTree(new byte[0], // no prefix path + b.addTree( + new byte[0], // no prefix path DirCacheEntry.STAGE_0, // standard stage - rw.getObjectReader(), rw.parseTree(base)); + rw.getObjectReader(), + rw.parseTree(base)); b.finish(); return dc; } - public ImmutableSet getProjectsInOrder() - throws SubmoduleException { + public ImmutableSet getProjectsInOrder() throws SubmoduleException { LinkedHashSet projects = new LinkedHashSet<>(); for (Project.NameKey project : branchesByProject.keySet()) { addAllSubmoduleProjects(project, new LinkedHashSet<>(), projects); @@ -568,14 +558,14 @@ public class SubmoduleOp { return ImmutableSet.copyOf(projects); } - private void addAllSubmoduleProjects(Project.NameKey project, + private void addAllSubmoduleProjects( + Project.NameKey project, LinkedHashSet current, LinkedHashSet projects) throws SubmoduleException { if (current.contains(project)) { throw new SubmoduleException( - "Project level circular subscriptions detected: " + - printCircularPath(current, project)); + "Project level circular subscriptions detected: " + printCircularPath(current, project)); } if (projects.contains(project)) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/TabFile.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/TabFile.java index d77c7e2f50..ea041f4f3b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/TabFile.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/TabFile.java @@ -14,8 +14,6 @@ package com.google.gerrit.server.git; -import org.slf4j.Logger; - import java.io.BufferedReader; import java.io.IOException; import java.io.StringReader; @@ -25,18 +23,20 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.slf4j.Logger; public class TabFile { public interface Parser { String parse(String str); } - public static Parser TRIM = new Parser() { - @Override - public String parse(String str) { - return str.trim(); - } - }; + public static Parser TRIM = + new Parser() { + @Override + public String parse(String str) { + return str.trim(); + } + }; protected static class Row { public String left; @@ -48,8 +48,9 @@ public class TabFile { } } - protected static List parse(String text, String filename, Parser left, - Parser right, ValidationError.Sink errors) throws IOException { + protected static List parse( + String text, String filename, Parser left, Parser right, ValidationError.Sink errors) + throws IOException { List rows = new ArrayList<>(); BufferedReader br = new BufferedReader(new StringReader(text)); String s; @@ -60,8 +61,7 @@ public class TabFile { int tab = s.indexOf('\t'); if (tab < 0) { - errors.error(new ValidationError(filename, lineNumber, - "missing tab delimiter")); + errors.error(new ValidationError(filename, lineNumber, "missing tab delimiter")); continue; } @@ -86,8 +86,7 @@ public class TabFile { return map; } - protected static String asText(String left, String right, - Map entries) { + protected static String asText(String left, String right, Map entries) { if (entries.isEmpty()) { return null; } @@ -148,7 +147,6 @@ public class TabFile { } public static ValidationError.Sink createLoggerSink(String file, Logger log) { - return ValidationError.createLoggerSink("Error parsing file " + file + ": ", - log); + return ValidationError.createLoggerSink("Error parsing file " + file + ": ", log); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/TagCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/TagCache.java index dec1768df9..08221613b7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/TagCache.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/TagCache.java @@ -21,13 +21,11 @@ import com.google.inject.Inject; import com.google.inject.Module; import com.google.inject.Singleton; import com.google.inject.name.Named; - -import org.eclipse.jgit.lib.ObjectId; - import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; +import org.eclipse.jgit.lib.ObjectId; @Singleton public class TagCache { @@ -53,20 +51,19 @@ public class TagCache { /** * Advise the cache that a reference fast-forwarded. - *

- * This operation is not necessary, the cache will automatically detect changes - * made to references and update itself on demand. However, this method may - * allow the cache to update more quickly and reuse the caller's computation of - * the fast-forward status of a branch. + * + *

This operation is not necessary, the cache will automatically detect changes made to + * references and update itself on demand. However, this method may allow the cache to update more + * quickly and reuse the caller's computation of the fast-forward status of a branch. * * @param name project the branch is contained in. * @param refName the branch name. - * @param oldValue the old value, before the fast-forward. The cache - * will only update itself if it is still using this old value. + * @param oldValue the old value, before the fast-forward. The cache will only update itself if it + * is still using this old value. * @param newValue the current value, after the fast-forward. */ - public void updateFastForward(Project.NameKey name, String refName, - ObjectId oldValue, ObjectId newValue) { + public void updateFastForward( + Project.NameKey name, String refName, ObjectId oldValue, ObjectId newValue) { // Be really paranoid and null check everything. This method should // never fail with an exception. Some of these references can be null // (e.g. not all projects are cached, or the cache is not current). @@ -111,8 +108,7 @@ public class TagCache { transient TagSetHolder holder; - private void readObject(ObjectInputStream in) throws IOException, - ClassNotFoundException { + private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { holder = new TagSetHolder(new Project.NameKey(in.readUTF())); if (in.readBoolean()) { TagSet tags = new TagSet(holder.getProjectName()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/TagMatcher.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/TagMatcher.java index e55092794e..6e46d76df5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/TagMatcher.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/TagMatcher.java @@ -15,15 +15,13 @@ package com.google.gerrit.server.git; import com.google.gerrit.server.git.TagSet.Tag; - -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.Ref; -import org.eclipse.jgit.lib.Repository; - import java.util.ArrayList; import java.util.BitSet; import java.util.Collection; import java.util.List; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.lib.Repository; class TagMatcher { final BitSet mask = new BitSet(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/TagSet.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/TagSet.java index 3c7666e1cf..f131bc9856 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/TagSet.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/TagSet.java @@ -19,7 +19,13 @@ import static org.eclipse.jgit.lib.ObjectIdSerialization.writeNotNull; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.reviewdb.client.Project; - +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.BitSet; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.lib.AnyObjectId; import org.eclipse.jgit.lib.Constants; @@ -34,14 +40,6 @@ import org.eclipse.jgit.revwalk.RevWalk; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.util.BitSet; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.atomic.AtomicReference; - class TagSet { private static final Logger log = LoggerFactory.getLogger(TagSet.class); @@ -59,8 +57,7 @@ class TagSet { return tags.get(id); } - boolean updateFastForward(String refName, ObjectId oldValue, - ObjectId newValue) { + boolean updateFastForward(String refName, ObjectId oldValue, ObjectId newValue) { CachedRef ref = refs.get(refName); if (ref != null) { // compareAndSet works on reference equality, but this operation @@ -191,8 +188,7 @@ class TagSet { } } - void readObject(ObjectInputStream in) throws IOException, - ClassNotFoundException { + void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { int refCnt = in.readInt(); for (int i = 0; i < refCnt; i++) { String name = in.readUTF(); @@ -331,8 +327,7 @@ class TagSet { } static boolean skip(Ref ref) { - return ref.isSymbolic() || ref.getObjectId() == null - || PatchSet.isChangeRef(ref.getName()); + return ref.isSymbolic() || ref.getObjectId() == null || PatchSet.isChangeRef(ref.getName()); } private static boolean isTag(Ref ref) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/TagSetHolder.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/TagSetHolder.java index ad650c325e..e1faa65daf 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/TagSetHolder.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/TagSetHolder.java @@ -17,12 +17,10 @@ package com.google.gerrit.server.git; import static java.util.stream.Collectors.toList; import com.google.gerrit.reviewdb.client.Project; - +import java.util.Collection; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; -import java.util.Collection; - class TagSetHolder { private final Object buildLock = new Object(); private final Project.NameKey projectName; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/TransferConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/TransferConfig.java index bc805c4191..4ac9071f45 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/TransferConfig.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/TransferConfig.java @@ -19,12 +19,10 @@ import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.project.ProjectState; import com.google.inject.Inject; import com.google.inject.Singleton; - +import java.util.concurrent.TimeUnit; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.storage.pack.PackConfig; -import java.util.concurrent.TimeUnit; - @Singleton public class TransferConfig { private final int timeout; @@ -34,8 +32,15 @@ public class TransferConfig { @Inject TransferConfig(@GerritServerConfig final Config cfg) { - timeout = (int) ConfigUtil.getTimeUnit(cfg, "transfer", null, "timeout", // - 0, TimeUnit.SECONDS); + timeout = + (int) + ConfigUtil.getTimeUnit( + cfg, + "transfer", + null, + "timeout", // + 0, + TimeUnit.SECONDS); maxObjectSizeLimit = cfg.getLong("receive", "maxObjectSizeLimit", 0); maxObjectSizeLimitFormatted = cfg.getString("receive", null, "maxObjectSizeLimit"); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/UploadPackMetricsHook.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/UploadPackMetricsHook.java index d4fcbcda3b..aa02fba99a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/UploadPackMetricsHook.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/UploadPackMetricsHook.java @@ -25,7 +25,6 @@ import com.google.gerrit.metrics.MetricMaker; import com.google.gerrit.metrics.Timer1; import com.google.inject.Inject; import com.google.inject.Singleton; - import org.eclipse.jgit.storage.pack.PackStatistics; import org.eclipse.jgit.transport.PostUploadHook; @@ -45,47 +44,51 @@ public class UploadPackMetricsHook implements PostUploadHook { @Inject UploadPackMetricsHook(MetricMaker metricMaker) { Field operation = Field.ofEnum(Operation.class, "operation"); - requestCount = metricMaker.newCounter( - "git/upload-pack/request_count", - new Description("Total number of git-upload-pack requests") - .setRate() - .setUnit("requests"), - operation); + requestCount = + metricMaker.newCounter( + "git/upload-pack/request_count", + new Description("Total number of git-upload-pack requests") + .setRate() + .setUnit("requests"), + operation); - counting = metricMaker.newTimer( - "git/upload-pack/phase_counting", - new Description("Time spent in the 'Counting...' phase") - .setCumulative() - .setUnit(Units.MILLISECONDS), - operation); + counting = + metricMaker.newTimer( + "git/upload-pack/phase_counting", + new Description("Time spent in the 'Counting...' phase") + .setCumulative() + .setUnit(Units.MILLISECONDS), + operation); - compressing = metricMaker.newTimer( - "git/upload-pack/phase_compressing", - new Description("Time spent in the 'Compressing...' phase") - .setCumulative() - .setUnit(Units.MILLISECONDS), - operation); + compressing = + metricMaker.newTimer( + "git/upload-pack/phase_compressing", + new Description("Time spent in the 'Compressing...' phase") + .setCumulative() + .setUnit(Units.MILLISECONDS), + operation); - writing = metricMaker.newTimer( - "git/upload-pack/phase_writing", - new Description("Time spent transferring bytes to client") - .setCumulative() - .setUnit(Units.MILLISECONDS), - operation); + writing = + metricMaker.newTimer( + "git/upload-pack/phase_writing", + new Description("Time spent transferring bytes to client") + .setCumulative() + .setUnit(Units.MILLISECONDS), + operation); - packBytes = metricMaker.newHistogram( - "git/upload-pack/pack_bytes", - new Description("Distribution of sizes of packs sent to clients") - .setCumulative() - .setUnit(Units.BYTES), - operation); + packBytes = + metricMaker.newHistogram( + "git/upload-pack/pack_bytes", + new Description("Distribution of sizes of packs sent to clients") + .setCumulative() + .setUnit(Units.BYTES), + operation); } @Override public void onPostUpload(PackStatistics stats) { Operation op = Operation.FETCH; - if (stats.getUninterestingObjects() == null - || stats.getUninterestingObjects().isEmpty()) { + if (stats.getUninterestingObjects() == null || stats.getUninterestingObjects().isEmpty()) { op = Operation.CLONE; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/UserConfigSections.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/UserConfigSections.java index bbd55f04bb..859e40d3c6 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/UserConfigSections.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/UserConfigSections.java @@ -31,6 +31,7 @@ public class UserConfigSections { /** The table column user preferences. */ public static final String CHANGE_TABLE = "changeTable"; + public static final String CHANGE_TABLE_COLUMN = "column"; /** The edit user preferences. */ @@ -39,6 +40,5 @@ public class UserConfigSections { /** The diff user preferences. */ public static final String DIFF = "diff"; - private UserConfigSections() { - } + private UserConfigSections() {} } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ValidationError.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ValidationError.java index e6a8ae46b8..41851417f0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ValidationError.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ValidationError.java @@ -47,10 +47,10 @@ public class ValidationError { public static Sink createLoggerSink(final String message, final Logger log) { return new ValidationError.Sink() { - @Override - public void error(ValidationError error) { - log.error(message + error.getMessage()); - } - }; + @Override + public void error(ValidationError error) { + log.error(message + error.getMessage()); + } + }; } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/VersionedMetaData.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/VersionedMetaData.java index 2d63fd6099..9d8d1ac4ee 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/VersionedMetaData.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/VersionedMetaData.java @@ -15,7 +15,12 @@ package com.google.gerrit.server.git; import com.google.common.base.MoreObjects; - +import java.io.BufferedReader; +import java.io.IOException; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; import org.eclipse.jgit.dircache.DirCache; import org.eclipse.jgit.dircache.DirCacheBuilder; import org.eclipse.jgit.dircache.DirCacheEditor; @@ -46,25 +51,16 @@ import org.eclipse.jgit.treewalk.TreeWalk; import org.eclipse.jgit.util.ChangeIdUtil; import org.eclipse.jgit.util.RawParseUtils; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.StringReader; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - /** * Support for metadata stored within a version controlled branch. - *

- * Implementors are responsible for supplying implementations of the onLoad and - * onSave methods to read from the repository, or format an update that can - * later be written back to the repository. + * + *

Implementors are responsible for supplying implementations of the onLoad and onSave methods to + * read from the repository, or format an update that can later be written back to the repository. */ public abstract class VersionedMetaData { /** - * Path information that does not hold references to any repository - * data structures, allowing the application to retain this object - * for long periods of time. + * Path information that does not hold references to any repository data structures, allowing the + * application to retain this object for long periods of time. */ public static class PathInfo { public final FileMode fileMode; @@ -96,8 +92,8 @@ public abstract class VersionedMetaData { * @throws IOException * @throws ConfigInvalidException */ - protected abstract boolean onSave(CommitBuilder commit) throws IOException, - ConfigInvalidException; + protected abstract boolean onSave(CommitBuilder commit) + throws IOException, ConfigInvalidException; /** @return revision of the metadata that was loaded. */ public ObjectId getRevision() { @@ -106,9 +102,9 @@ public abstract class VersionedMetaData { /** * Load the current version from the branch. - *

- * The repository is not held after the call completes, allowing the - * application to retain this object for long periods of time. + * + *

The repository is not held after the call completes, allowing the application to retain this + * object for long periods of time. * * @param db repository to access. * @throws IOException @@ -121,22 +117,20 @@ public abstract class VersionedMetaData { /** * Load a specific version from the repository. - *

- * This method is primarily useful for applying updates to a specific revision - * that was shown to an end-user in the user interface. If there are conflicts - * with another user's concurrent changes, these will be automatically - * detected at commit time. - *

- * The repository is not held after the call completes, allowing the - * application to retain this object for long periods of time. + * + *

This method is primarily useful for applying updates to a specific revision that was shown + * to an end-user in the user interface. If there are conflicts with another user's concurrent + * changes, these will be automatically detected at commit time. + * + *

The repository is not held after the call completes, allowing the application to retain this + * object for long periods of time. * * @param db repository to access. * @param id revision to load. * @throws IOException * @throws ConfigInvalidException */ - public void load(Repository db, ObjectId id) throws IOException, - ConfigInvalidException { + public void load(Repository db, ObjectId id) throws IOException, ConfigInvalidException { try (RevWalk walk = new RevWalk(db)) { load(walk, id); } @@ -144,24 +138,21 @@ public abstract class VersionedMetaData { /** * Load a specific version from an open walk. - *

- * This method is primarily useful for applying updates to a specific revision - * that was shown to an end-user in the user interface. If there are conflicts - * with another user's concurrent changes, these will be automatically - * detected at commit time. - *

- * The caller retains ownership of the walk and is responsible for closing - * it. However, this instance does not hold a reference to the walk or the - * repository after the call completes, allowing the application to retain - * this object for long periods of time. + * + *

This method is primarily useful for applying updates to a specific revision that was shown + * to an end-user in the user interface. If there are conflicts with another user's concurrent + * changes, these will be automatically detected at commit time. + * + *

The caller retains ownership of the walk and is responsible for closing it. However, this + * instance does not hold a reference to the walk or the repository after the call completes, + * allowing the application to retain this object for long periods of time. * * @param walk open walk to access to access. * @param id revision to load. * @throws IOException * @throws ConfigInvalidException */ - public void load(RevWalk walk, ObjectId id) throws IOException, - ConfigInvalidException { + public void load(RevWalk walk, ObjectId id) throws IOException, ConfigInvalidException { this.reader = walk.getObjectReader(); try { revision = id != null ? new RevWalk(reader).parseCommit(id) : null; @@ -171,13 +162,11 @@ public abstract class VersionedMetaData { } } - public void load(MetaDataUpdate update) throws IOException, - ConfigInvalidException { + public void load(MetaDataUpdate update) throws IOException, ConfigInvalidException { load(update.getRepository()); } - public void load(MetaDataUpdate update, ObjectId id) throws IOException, - ConfigInvalidException { + public void load(MetaDataUpdate update, ObjectId id) throws IOException, ConfigInvalidException { load(update.getRepository(), id); } @@ -186,9 +175,8 @@ public abstract class VersionedMetaData { * * @param update helper information to define the update that will occur. * @return the commit that was created - * @throws IOException if there is a storage problem and the update cannot be - * executed as requested or if it failed because of a concurrent - * update to the same reference + * @throws IOException if there is a storage problem and the update cannot be executed as + * requested or if it failed because of a concurrent update to the same reference */ public RevCommit commit(MetaDataUpdate update) throws IOException { BatchMetaDataUpdate batch = openUpdate(update); @@ -206,9 +194,8 @@ public abstract class VersionedMetaData { * @param update helper information to define the update that will occur. * @param refName name of the ref that should be created * @return the commit that was created - * @throws IOException if there is a storage problem and the update cannot be - * executed as requested or if it failed because of a concurrent - * update to the same reference + * @throws IOException if there is a storage problem and the update cannot be executed as + * requested or if it failed because of a concurrent update to the same reference */ public RevCommit commitToNewRef(MetaDataUpdate update, String refName) throws IOException { BatchMetaDataUpdate batch = openUpdate(update); @@ -222,25 +209,31 @@ public abstract class VersionedMetaData { public interface BatchMetaDataUpdate { void write(CommitBuilder commit) throws IOException; + void write(VersionedMetaData config, CommitBuilder commit) throws IOException; + RevCommit createRef(String refName) throws IOException; + void removeRef(String refName) throws IOException; + RevCommit commit() throws IOException; + RevCommit commitAt(ObjectId revision) throws IOException; + void close(); } /** * Open a batch of updates to the same metadata ref. - *

- * This allows making multiple commits to a single metadata ref, at the end of - * which is a single ref update. For batching together updates to multiple - * refs (each consisting of one or more commits against their respective - * refs), create the {@link MetaDataUpdate} with a {@link BatchRefUpdate}. - *

- * A ref update produced by this {@link BatchMetaDataUpdate} is only committed - * if there is no associated {@link BatchRefUpdate}. As a result, the - * configured ref updated event is not fired if there is an associated batch. + * + *

This allows making multiple commits to a single metadata ref, at the end of which is a + * single ref update. For batching together updates to multiple refs (each consisting of one or + * more commits against their respective refs), create the {@link MetaDataUpdate} with a {@link + * BatchRefUpdate}. + * + *

A ref update produced by this {@link BatchMetaDataUpdate} is only committed if there is no + * associated {@link BatchRefUpdate}. As a result, the configured ref updated event is not fired + * if there is an associated batch. * * @param update helper info about the update. * @throws IOException if the update failed. @@ -272,8 +265,9 @@ public abstract class VersionedMetaData { config.inserter = inserter; return config.onSave(commit); } catch (ConfigInvalidException e) { - throw new IOException("Cannot update " + getRefName() + " in " - + db.getDirectory() + ": " + e.getMessage(), e); + throw new IOException( + "Cannot update " + getRefName() + " in " + db.getDirectory() + ": " + e.getMessage(), + e); } finally { config.newTree = nt; config.reader = r; @@ -289,10 +283,11 @@ public abstract class VersionedMetaData { // Reuse tree from parent commit unless there are contents in newTree or // there is no tree for a parent commit. - ObjectId res = newTree.getEntryCount() != 0 || srcTree == null - ? newTree.writeTree(inserter) : srcTree.copy(); - if (res.equals(srcTree) && !update.allowEmpty() - && (commit.getTreeId() == null)) { + ObjectId res = + newTree.getEntryCount() != 0 || srcTree == null + ? newTree.writeTree(inserter) + : srcTree.copy(); + if (res.equals(srcTree) && !update.allowEmpty() && (commit.getTreeId() == null)) { // If there are no changes to the content, don't create the commit. return; } @@ -317,8 +312,11 @@ public abstract class VersionedMetaData { if (update.insertChangeId()) { ObjectId id = - ChangeIdUtil.computeChangeId(res, getRevision(), - commit.getAuthor(), commit.getCommitter(), + ChangeIdUtil.computeChangeId( + res, + getRevision(), + commit.getAuthor(), + commit.getCommitter(), commit.getMessage()); commit.setMessage(ChangeIdUtil.insertId(commit.getMessage(), id)); } @@ -348,8 +346,13 @@ public abstract class VersionedMetaData { update.fireGitRefUpdatedEvent(ru); return; case LOCK_FAILURE: - throw new LockFailureException("Cannot delete " + ru.getName() - + " in " + db.getDirectory() + ": " + ru.getResult()); + throw new LockFailureException( + "Cannot delete " + + ru.getName() + + " in " + + db.getDirectory() + + ": " + + ru.getResult()); case FAST_FORWARD: case IO_FAILURE: case NEW: @@ -359,8 +362,13 @@ public abstract class VersionedMetaData { case REJECTED_CURRENT_BRANCH: case RENAMED: default: - throw new IOException("Cannot delete " + ru.getName() + " in " - + db.getDirectory() + ": " + ru.getResult()); + throw new IOException( + "Cannot delete " + + ru.getName() + + " in " + + db.getDirectory() + + ": " + + ru.getResult()); } } @@ -374,8 +382,7 @@ public abstract class VersionedMetaData { if (Objects.equals(src, expected)) { return revision; } - return updateRef(MoreObjects.firstNonNull(expected, ObjectId.zeroId()), - src, getRefName()); + return updateRef(MoreObjects.firstNonNull(expected, ObjectId.zeroId()), src, getRefName()); } @Override @@ -394,12 +401,11 @@ public abstract class VersionedMetaData { } } - private RevCommit updateRef(AnyObjectId oldId, AnyObjectId newId, - String refName) throws IOException { + private RevCommit updateRef(AnyObjectId oldId, AnyObjectId newId, String refName) + throws IOException { BatchRefUpdate bru = update.getBatch(); if (bru != null) { - bru.addCommand(new ReceiveCommand( - oldId.toObjectId(), newId.toObjectId(), refName)); + bru.addCommand(new ReceiveCommand(oldId.toObjectId(), newId.toObjectId(), refName)); inserter.flush(); revision = rw.parseCommit(newId); return revision; @@ -413,8 +419,7 @@ public abstract class VersionedMetaData { if (message == null) { message = "meta data update"; } - try (BufferedReader reader = new BufferedReader( - new StringReader(message))) { + try (BufferedReader reader = new BufferedReader(new StringReader(message))) { // read the subject line and use it as reflog message ru.setRefLogMessage("commit: " + reader.readLine(), true); } @@ -427,8 +432,13 @@ public abstract class VersionedMetaData { update.fireGitRefUpdatedEvent(ru); return revision; case LOCK_FAILURE: - throw new LockFailureException("Cannot update " + ru.getName() - + " in " + db.getDirectory() + ": " + ru.getResult()); + throw new LockFailureException( + "Cannot update " + + ru.getName() + + " in " + + db.getDirectory() + + ": " + + ru.getResult()); case FORCED: case IO_FAILURE: case NOT_ATTEMPTED: @@ -437,15 +447,20 @@ public abstract class VersionedMetaData { case REJECTED_CURRENT_BRANCH: case RENAMED: default: - throw new IOException("Cannot update " + ru.getName() + " in " - + db.getDirectory() + ": " + ru.getResult()); + throw new IOException( + "Cannot update " + + ru.getName() + + " in " + + db.getDirectory() + + ": " + + ru.getResult()); } } }; } - protected DirCache readTree(RevTree tree) throws IOException, - MissingObjectException, IncorrectObjectTypeException { + protected DirCache readTree(RevTree tree) + throws IOException, MissingObjectException, IncorrectObjectTypeException { DirCache dc = DirCache.newInCore(); if (tree != null) { DirCacheBuilder b = dc.builder(); @@ -455,18 +470,18 @@ public abstract class VersionedMetaData { return dc; } - protected Config readConfig(String fileName) throws IOException, - ConfigInvalidException { + protected Config readConfig(String fileName) throws IOException, ConfigInvalidException { Config rc = new Config(); String text = readUTF8(fileName); if (!text.isEmpty()) { try { rc.fromText(text); } catch (ConfigInvalidException err) { - StringBuilder msg = new StringBuilder("Invalid config file ") - .append(fileName) - .append(" in commit ") - .append(revision.name()); + StringBuilder msg = + new StringBuilder("Invalid config file ") + .append(fileName) + .append(" in commit ") + .append(revision.name()); if (err.getCause() != null) { msg.append(": ").append(err.getCause()); } @@ -490,7 +505,6 @@ public abstract class VersionedMetaData { if (tw != null) { ObjectLoader obj = reader.open(tw.getObjectId(0), Constants.OBJ_BLOB); return obj.getCachedBytes(Integer.MAX_VALUE); - } return new byte[] {}; } @@ -502,7 +516,7 @@ public abstract class VersionedMetaData { TreeWalk tw = TreeWalk.forPath(reader, fileName, revision.getTree()); if (tw != null) { - return tw.getObjectId(0); + return tw.getObjectId(0); } return null; @@ -520,8 +534,8 @@ public abstract class VersionedMetaData { } } - protected static void set(Config rc, String section, String subsection, - String name, String value) { + protected static void set( + Config rc, String section, String subsection, String name, String value) { if (value != null) { rc.setString(section, subsection, name, value); } else { @@ -529,8 +543,8 @@ public abstract class VersionedMetaData { } } - protected static void set(Config rc, String section, String subsection, - String name, boolean value) { + protected static void set( + Config rc, String section, String subsection, String name, boolean value) { if (value) { rc.setBoolean(section, subsection, name, value); } else { @@ -538,8 +552,8 @@ public abstract class VersionedMetaData { } } - protected static > void set(Config rc, String section, - String subsection, String name, E value, E defaultValue) { + protected static > void set( + Config rc, String section, String subsection, String name, E value, E defaultValue) { if (value != defaultValue) { rc.setEnum(section, subsection, name, value); } else { @@ -559,13 +573,14 @@ public abstract class VersionedMetaData { DirCacheEditor editor = newTree.editor(); if (raw != null && 0 < raw.length) { final ObjectId blobId = inserter.insert(Constants.OBJ_BLOB, raw); - editor.add(new PathEdit(fileName) { - @Override - public void apply(DirCacheEntry ent) { - ent.setFileMode(FileMode.REGULAR_FILE); - ent.setObjectId(blobId); - } - }); + editor.add( + new PathEdit(fileName) { + @Override + public void apply(DirCacheEntry ent) { + ent.setFileMode(FileMode.REGULAR_FILE); + ent.setObjectId(blobId); + } + }); } else { editor.add(new DeletePath(fileName)); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/VisibleRefFilter.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/VisibleRefFilter.java index c339d70502..e55deda3db 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/VisibleRefFilter.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/VisibleRefFilter.java @@ -31,7 +31,14 @@ import com.google.gerrit.server.notedb.ChangeNotes; import com.google.gerrit.server.project.ProjectControl; import com.google.gerrit.server.query.change.ChangeData; import com.google.gwtorm.server.OrmException; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.RefDatabase; @@ -43,18 +50,8 @@ import org.eclipse.jgit.transport.ServiceMayNotContinueException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - public class VisibleRefFilter extends AbstractAdvertiseRefsHook { - private static final Logger log = - LoggerFactory.getLogger(VisibleRefFilter.class); + private static final Logger log = LoggerFactory.getLogger(VisibleRefFilter.class); private final TagCache tagCache; private final ChangeNotes.Factory changeNotesFactory; @@ -113,8 +110,7 @@ public class VisibleRefFilter extends AbstractAdvertiseRefsHook { String name = ref.getName(); Change.Id changeId; Account.Id accountId; - if (name.startsWith(REFS_CACHE_AUTOMERGE) - || (!showMetadata && isMetadata(name))) { + if (name.startsWith(REFS_CACHE_AUTOMERGE) || (!showMetadata && isMetadata(name))) { continue; } else if (RefNames.isRefsEdit(name)) { // Edits are visible only to the owning user, if change is visible. @@ -128,8 +124,8 @@ public class VisibleRefFilter extends AbstractAdvertiseRefsHook { } } else if ((accountId = Account.Id.fromRef(name)) != null) { // Account ref is visible only to corresponding account. - if (viewMetadata || (accountId.equals(userId) - && projectCtl.controlForRef(name).isVisible())) { + if (viewMetadata + || (accountId.equals(userId) && projectCtl.controlForRef(name).isVisible())) { result.put(name, ref); } } else if (isTag(ref)) { @@ -154,10 +150,13 @@ public class VisibleRefFilter extends AbstractAdvertiseRefsHook { // to identify what tags we can actually reach, and what we cannot. // if (!deferredTags.isEmpty() && (!result.isEmpty() || filterTagsSeparately)) { - TagMatcher tags = tagCache.get(projectName).matcher( - tagCache, - db, - filterTagsSeparately ? filter(db.getAllRefs()).values() : result.values()); + TagMatcher tags = + tagCache + .get(projectName) + .matcher( + tagCache, + db, + filterTagsSeparately ? filter(db.getAllRefs()).values() : result.values()); for (Ref tag : deferredTags) { if (tags.isReachable(tag)) { result.put(tag.getName(), tag); @@ -169,8 +168,7 @@ public class VisibleRefFilter extends AbstractAdvertiseRefsHook { } private Map fastHideRefsMetaConfig(Map refs) { - if (refs.containsKey(REFS_CONFIG) - && !projectCtl.controlForRef(REFS_CONFIG).isVisible()) { + if (refs.containsKey(REFS_CONFIG) && !projectCtl.controlForRef(REFS_CONFIG).isVisible()) { Map r = new HashMap<>(refs); r.remove(REFS_CONFIG); return r; @@ -191,8 +189,8 @@ public class VisibleRefFilter extends AbstractAdvertiseRefsHook { } @Override - protected Map getAdvertisedRefs(Repository repository, - RevWalk revWalk) throws ServiceMayNotContinueException { + protected Map getAdvertisedRefs(Repository repository, RevWalk revWalk) + throws ServiceMayNotContinueException { try { return filter(repository.getRefDatabase().getRefs(RefDatabase.ALL)); } catch (ServiceMayNotContinueException e) { @@ -233,17 +231,18 @@ public class VisibleRefFilter extends AbstractAdvertiseRefsHook { Project project = projectCtl.getProject(); try { Set visibleChanges = new HashSet<>(); - for (ChangeData cd : changeCache.getChangeData( - reviewDb, project.getNameKey())) { - if (projectCtl.controlForIndexedChange(cd.change()) - .isVisible(reviewDb, cd)) { + for (ChangeData cd : changeCache.getChangeData(reviewDb, project.getNameKey())) { + if (projectCtl.controlForIndexedChange(cd.change()).isVisible(reviewDb, cd)) { visibleChanges.add(cd.getId()); } } return visibleChanges; } catch (OrmException e) { - log.error("Cannot load changes for project " + project.getName() - + ", assuming no changes are visible", e); + log.error( + "Cannot load changes for project " + + project.getName() + + ", assuming no changes are visible", + e); return Collections.emptySet(); } } @@ -259,8 +258,8 @@ public class VisibleRefFilter extends AbstractAdvertiseRefsHook { } return visibleChanges; } catch (IOException | OrmException e) { - log.error("Cannot load changes for project " + project - + ", assuming no changes are visible", e); + log.error( + "Cannot load changes for project " + project + ", assuming no changes are visible", e); return Collections.emptySet(); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/WorkQueue.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/WorkQueue.java index 220df8c05a..99af21d35c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/WorkQueue.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/WorkQueue.java @@ -21,11 +21,6 @@ import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.util.IdGenerator; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.Config; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.lang.Thread.UncaughtExceptionHandler; import java.lang.reflect.Field; import java.util.ArrayList; @@ -46,6 +41,9 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; +import org.eclipse.jgit.lib.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** Delayed execution of tasks using a background thread pool. */ @Singleton @@ -59,8 +57,7 @@ public class WorkQueue { } @Override - public void start() { - } + public void start() {} @Override public void stop() { @@ -183,24 +180,27 @@ public class WorkQueue { private final String queueName; Executor(int corePoolSize, final String prefix) { - super(corePoolSize, new ThreadFactory() { - private final ThreadFactory parent = Executors.defaultThreadFactory(); - private final AtomicInteger tid = new AtomicInteger(1); + super( + corePoolSize, + new ThreadFactory() { + private final ThreadFactory parent = Executors.defaultThreadFactory(); + private final AtomicInteger tid = new AtomicInteger(1); - @Override - public Thread newThread(final Runnable task) { - final Thread t = parent.newThread(task); - t.setName(prefix + "-" + tid.getAndIncrement()); - t.setUncaughtExceptionHandler(LOG_UNCAUGHT_EXCEPTION); - return t; - } - }); + @Override + public Thread newThread(final Runnable task) { + final Thread t = parent.newThread(task); + t.setName(prefix + "-" + tid.getAndIncrement()); + t.setUncaughtExceptionHandler(LOG_UNCAUGHT_EXCEPTION); + return t; + } + }); - all = new ConcurrentHashMap<>( // - corePoolSize << 1, // table size - 0.75f, // load factor - corePoolSize + 4 // concurrency level - ); + all = + new ConcurrentHashMap<>( // + corePoolSize << 1, // table size + 0.75f, // load factor + corePoolSize + 4 // concurrency level + ); queueName = prefix; } @@ -212,7 +212,7 @@ public class WorkQueue { protected RunnableScheduledFuture decorateTask( final Runnable runnable, RunnableScheduledFuture r) { r = super.decorateTask(runnable, r); - for (;;) { + for (; ; ) { final int id = idGenerator.next(); Task task; @@ -253,9 +253,8 @@ public class WorkQueue { } /** - * Runnable needing to know it was canceled. - * Note that cancel is called only in case the task is not in - * progress already. + * Runnable needing to know it was canceled. Note that cancel is called only in case the task is + * not in progress already. */ public interface CancelableRunnable extends Runnable { /** Notifies the runnable it was canceled. */ @@ -263,15 +262,13 @@ public class WorkQueue { } /** - * Base interface handles the case when task was canceled before - * actual execution and in case it was started cancel method is - * not called yet the task itself will be destroyed anyway (it - * will result in resource opening errors). - * This interface gives a chance to implementing classes for + * Base interface handles the case when task was canceled before actual execution and in case it + * was started cancel method is not called yet the task itself will be destroyed anyway (it will + * result in resource opening errors). This interface gives a chance to implementing classes for * handling such scenario and act accordingly. */ public interface CanceledWhileRunning extends CancelableRunnable { - /** Notifies the runnable it was canceled during execution. **/ + /** Notifies the runnable it was canceled during execution. * */ void setCanceledWhileRunning(); } @@ -279,13 +276,14 @@ public class WorkQueue { public static class Task implements RunnableScheduledFuture { /** * Summarized status of a single task. - *

- * Tasks have the following state flow: + * + *

Tasks have the following state flow: + * *

    - *
  1. {@link #SLEEPING}: if scheduled with a non-zero delay.
  2. - *
  3. {@link #READY}: waiting for an available worker thread.
  4. - *
  5. {@link #RUNNING}: actively executing on a worker thread.
  6. - *
  7. {@link #DONE}: finished executing, if not periodic.
  8. + *
  9. {@link #SLEEPING}: if scheduled with a non-zero delay. + *
  10. {@link #READY}: waiting for an available worker thread. + *
  11. {@link #RUNNING}: actively executing on a worker thread. + *
  12. {@link #DONE}: finished executing, if not periodic. *
*/ public enum State { @@ -293,7 +291,12 @@ public class WorkQueue { // prefer to see tasks sorted in: done before running, // running before ready, ready before sleeping. // - DONE, CANCELLED, RUNNING, READY, SLEEPING, OTHER + DONE, + CANCELLED, + RUNNING, + READY, + SLEEPING, + OTHER } private final Runnable runnable; @@ -303,8 +306,7 @@ public class WorkQueue { private final AtomicBoolean running; private final Date startTime; - Task(Runnable runnable, RunnableScheduledFuture task, Executor executor, - int taskId) { + Task(Runnable runnable, RunnableScheduledFuture task, Executor executor, int taskId) { this.runnable = runnable; this.task = task; this.executor = executor; @@ -369,7 +371,6 @@ public class WorkQueue { executor.remove(this); executor.purge(); return true; - } return false; } @@ -385,8 +386,8 @@ public class WorkQueue { } @Override - public V get(long timeout, TimeUnit unit) throws InterruptedException, - ExecutionException, TimeoutException { + public V get(long timeout, TimeUnit unit) + throws InterruptedException, ExecutionException, TimeoutException { return task.get(timeout, unit); } @@ -430,10 +431,13 @@ public class WorkQueue { //This is a workaround to be able to print a proper name when the task //is wrapped into a TrustedListenableFutureTask. try { - if (runnable.getClass().isAssignableFrom(Class.forName( - "com.google.common.util.concurrent.TrustedListenableFutureTask"))) { - Class trustedFutureInterruptibleTask = Class.forName( - "com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutureInterruptibleTask"); + if (runnable + .getClass() + .isAssignableFrom( + Class.forName("com.google.common.util.concurrent.TrustedListenableFutureTask"))) { + Class trustedFutureInterruptibleTask = + Class.forName( + "com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutureInterruptibleTask"); for (Field field : runnable.getClass().getDeclaredFields()) { if (field.getType().isAssignableFrom(trustedFutureInterruptibleTask)) { field.setAccessible(true); @@ -449,25 +453,23 @@ public class WorkQueue { } } } - } catch (ClassNotFoundException | IllegalArgumentException - | IllegalAccessException e) { - log.debug("Cannot get a proper name for TrustedListenableFutureTask: {}", - e.getMessage()); + } catch (ClassNotFoundException | IllegalArgumentException | IllegalAccessException e) { + log.debug("Cannot get a proper name for TrustedListenableFutureTask: {}", e.getMessage()); } return runnable.toString(); } } /** - * Same as Task class, but with a reference to ProjectRunnable, used to - * retrieve the project name from the operation queued - **/ + * Same as Task class, but with a reference to ProjectRunnable, used to retrieve the project name + * from the operation queued + */ public static class ProjectTask extends Task implements ProjectRunnable { private final ProjectRunnable runnable; - ProjectTask(ProjectRunnable runnable, RunnableScheduledFuture task, - Executor executor, int taskId) { + ProjectTask( + ProjectRunnable runnable, RunnableScheduledFuture task, Executor executor, int taskId) { super(runnable, task, executor, taskId); this.runnable = runnable; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/CherryPick.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/CherryPick.java index d5760e6adf..30e842a7c5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/CherryPick.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/CherryPick.java @@ -30,16 +30,14 @@ import com.google.gerrit.server.git.MergeIdenticalTreeException; import com.google.gerrit.server.git.MergeTip; import com.google.gerrit.server.project.NoSuchChangeException; import com.google.gwtorm.server.OrmException; - -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.PersonIdent; -import org.eclipse.jgit.revwalk.RevCommit; -import org.eclipse.jgit.transport.ReceiveCommand; - import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.PersonIdent; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.transport.ReceiveCommand; public class CherryPick extends SubmitStrategy { @@ -48,8 +46,8 @@ public class CherryPick extends SubmitStrategy { } @Override - public List buildOps( - Collection toMerge) throws IntegrationException { + public List buildOps(Collection toMerge) + throws IntegrationException { List sorted = CodeReviewCommit.ORDER.sortedCopy(toMerge); List ops = new ArrayList<>(sorted.size()); boolean first = true; @@ -92,25 +90,30 @@ public class CherryPick extends SubmitStrategy { } @Override - protected void updateRepoImpl(RepoContext ctx) - throws IntegrationException, IOException { + protected void updateRepoImpl(RepoContext ctx) throws IntegrationException, IOException { // If there is only one parent, a cherry-pick can be done by taking the // delta relative to that one parent and redoing that on the current merge // tip. args.rw.parseBody(toMerge); - psId = ChangeUtil.nextPatchSetId( - args.repo, toMerge.change().currentPatchSetId()); + psId = ChangeUtil.nextPatchSetId(args.repo, toMerge.change().currentPatchSetId()); RevCommit mergeTip = args.mergeTip.getCurrentTip(); args.rw.parseBody(mergeTip); - String cherryPickCmtMsg = - args.mergeUtil.createCommitMessageOnSubmit(toMerge, mergeTip); + String cherryPickCmtMsg = args.mergeUtil.createCommitMessageOnSubmit(toMerge, mergeTip); - PersonIdent committer = args.caller.newCommitterIdent( - ctx.getWhen(), args.serverIdent.getTimeZone()); + PersonIdent committer = + args.caller.newCommitterIdent(ctx.getWhen(), args.serverIdent.getTimeZone()); try { - newCommit = args.mergeUtil.createCherryPickFromCommit( - args.repo, args.inserter, args.mergeTip.getCurrentTip(), toMerge, - committer, cherryPickCmtMsg, args.rw, 0, false); + newCommit = + args.mergeUtil.createCherryPickFromCommit( + args.repo, + args.inserter, + args.mergeTip.getCurrentTip(), + toMerge, + committer, + cherryPickCmtMsg, + args.rw, + 0, + false); } catch (MergeConflictException mce) { // Keep going in the case of a single merge failure; the goal is to // cherry-pick as many commits as possible. @@ -129,27 +132,32 @@ public class CherryPick extends SubmitStrategy { args.mergeTip.moveTipTo(newCommit, newCommit); args.commitStatus.put(newCommit); - ctx.addRefUpdate( - new ReceiveCommand(ObjectId.zeroId(), newCommit, psId.toRefName())); - patchSetInfo = - args.patchSetInfoFactory.get(ctx.getRevWalk(), newCommit, psId); + ctx.addRefUpdate(new ReceiveCommand(ObjectId.zeroId(), newCommit, psId.toRefName())); + patchSetInfo = args.patchSetInfoFactory.get(ctx.getRevWalk(), newCommit, psId); } @Override - public PatchSet updateChangeImpl(ChangeContext ctx) throws OrmException, - NoSuchChangeException, IOException { - if (newCommit == null - && toMerge.getStatusCode() == SKIPPED_IDENTICAL_TREE) { + public PatchSet updateChangeImpl(ChangeContext ctx) + throws OrmException, NoSuchChangeException, IOException { + if (newCommit == null && toMerge.getStatusCode() == SKIPPED_IDENTICAL_TREE) { return null; } - checkNotNull(newCommit, + checkNotNull( + newCommit, "no new commit produced by CherryPick of %s, expected to fail fast", toMerge.change().getId()); PatchSet prevPs = args.psUtil.current(ctx.getDb(), ctx.getNotes()); - PatchSet newPs = args.psUtil.insert(ctx.getDb(), ctx.getRevWalk(), - ctx.getUpdate(psId), psId, newCommit, false, - prevPs != null ? prevPs.getGroups() : ImmutableList. of(), - null, null); + PatchSet newPs = + args.psUtil.insert( + ctx.getDb(), + ctx.getRevWalk(), + ctx.getUpdate(psId), + psId, + newCommit, + false, + prevPs != null ? prevPs.getGroups() : ImmutableList.of(), + null, + null); ctx.getChange().setCurrentPatchSet(patchSetInfo); // Don't copy approvals, as this is already taken care of by @@ -166,8 +174,7 @@ public class CherryPick extends SubmitStrategy { } @Override - public void updateRepoImpl(RepoContext ctx) - throws IntegrationException, IOException { + public void updateRepoImpl(RepoContext ctx) throws IntegrationException, IOException { if (args.mergeUtil.hasMissingDependencies(args.mergeSorter, toMerge)) { // One or more dependencies were not met. The status was already marked // on the commit so we have nothing further to perform at this time. @@ -179,26 +186,32 @@ public class CherryPick extends SubmitStrategy { // different first parent. So instead behave as though MERGE_IF_NECESSARY // was configured. MergeTip mergeTip = args.mergeTip; - if (args.rw.isMergedInto(mergeTip.getCurrentTip(), toMerge) && - !args.submoduleOp.hasSubscription(args.destBranch)) { + if (args.rw.isMergedInto(mergeTip.getCurrentTip(), toMerge) + && !args.submoduleOp.hasSubscription(args.destBranch)) { mergeTip.moveTipTo(toMerge, toMerge); } else { PersonIdent myIdent = new PersonIdent(args.serverIdent, ctx.getWhen()); - CodeReviewCommit result = args.mergeUtil.mergeOneCommit(myIdent, - myIdent, args.repo, args.rw, args.inserter, args.destBranch, - mergeTip.getCurrentTip(), toMerge); + CodeReviewCommit result = + args.mergeUtil.mergeOneCommit( + myIdent, + myIdent, + args.repo, + args.rw, + args.inserter, + args.destBranch, + mergeTip.getCurrentTip(), + toMerge); result = amendGitlink(result); mergeTip.moveTipTo(result, toMerge); - args.mergeUtil.markCleanMerges(args.rw, args.canMergeFlag, - mergeTip.getCurrentTip(), args.alreadyAccepted); + args.mergeUtil.markCleanMerges( + args.rw, args.canMergeFlag, mergeTip.getCurrentTip(), args.alreadyAccepted); } } } - static boolean dryRun(SubmitDryRun.Arguments args, - CodeReviewCommit mergeTip, CodeReviewCommit toMerge) + static boolean dryRun( + SubmitDryRun.Arguments args, CodeReviewCommit mergeTip, CodeReviewCommit toMerge) throws IntegrationException { - return args.mergeUtil.canCherryPick(args.mergeSorter, args.repo, - mergeTip, args.rw, toMerge); + return args.mergeUtil.canCherryPick(args.mergeSorter, args.repo, mergeTip, args.rw, toMerge); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/CommitMergeStatus.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/CommitMergeStatus.java index bb9d359ff4..7fbf4cd04f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/CommitMergeStatus.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/CommitMergeStatus.java @@ -15,8 +15,8 @@ package com.google.gerrit.server.git.strategy; /** - * Status codes set on {@link com.google.gerrit.server.git.CodeReviewCommit}s by - * {@link SubmitStrategy} implementations. + * Status codes set on {@link com.google.gerrit.server.git.CodeReviewCommit}s by {@link + * SubmitStrategy} implementations. */ public enum CommitMergeStatus { CLEAN_MERGE("Change has been successfully merged"), @@ -27,9 +27,10 @@ public enum CommitMergeStatus { ALREADY_MERGED(""), - PATH_CONFLICT("Change could not be merged due to a path conflict.\n" - + "\n" - + "Please rebase the change locally and upload the rebased commit for review."), + PATH_CONFLICT( + "Change could not be merged due to a path conflict.\n" + + "\n" + + "Please rebase the change locally and upload the rebased commit for review."), REBASE_MERGE_CONFLICT( "Change could not be merged due to a conflict.\n" @@ -41,21 +42,25 @@ public enum CommitMergeStatus { MISSING_DEPENDENCY(""), - MANUAL_RECURSIVE_MERGE("The change requires a local merge to resolve.\n" - + "\n" - + "Please merge (or rebase) the change locally and upload the resolution for review."), + MANUAL_RECURSIVE_MERGE( + "The change requires a local merge to resolve.\n" + + "\n" + + "Please merge (or rebase) the change locally and upload the resolution for review."), - CANNOT_CHERRY_PICK_ROOT("Cannot cherry-pick an initial commit onto an existing branch.\n" - + "\n" - + "Please merge the change locally and upload the merge commit for review."), + CANNOT_CHERRY_PICK_ROOT( + "Cannot cherry-pick an initial commit onto an existing branch.\n" + + "\n" + + "Please merge the change locally and upload the merge commit for review."), - CANNOT_REBASE_ROOT("Cannot rebase an initial commit onto an existing branch.\n" - + "\n" - + "Please merge the change locally and upload the merge commit for review."), + CANNOT_REBASE_ROOT( + "Cannot rebase an initial commit onto an existing branch.\n" + + "\n" + + "Please merge the change locally and upload the merge commit for review."), - NOT_FAST_FORWARD("Project policy requires all submissions to be a fast-forward.\n" - + "\n" - + "Please rebase the change locally and upload again for review."); + NOT_FAST_FORWARD( + "Project policy requires all submissions to be a fast-forward.\n" + + "\n" + + "Please rebase the change locally and upload again for review."); private String message; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/FastForwardOnly.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/FastForwardOnly.java index 7c5702b432..1214b76961 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/FastForwardOnly.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/FastForwardOnly.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.git.strategy; import com.google.gerrit.server.git.BatchUpdate.RepoContext; import com.google.gerrit.server.git.CodeReviewCommit; import com.google.gerrit.server.git.IntegrationException; - import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -28,13 +27,13 @@ public class FastForwardOnly extends SubmitStrategy { } @Override - public List buildOps( - Collection toMerge) throws IntegrationException { - List sorted = args.mergeUtil.reduceToMinimalMerge( - args.mergeSorter, toMerge, args.incoming); + public List buildOps(Collection toMerge) + throws IntegrationException { + List sorted = + args.mergeUtil.reduceToMinimalMerge(args.mergeSorter, toMerge, args.incoming); List ops = new ArrayList<>(sorted.size()); - CodeReviewCommit newTipCommit = args.mergeUtil.getFirstFastForward( - args.mergeTip.getInitialTip(), args.rw, sorted); + CodeReviewCommit newTipCommit = + args.mergeUtil.getFirstFastForward(args.mergeTip.getInitialTip(), args.rw, sorted); if (!newTipCommit.equals(args.mergeTip.getInitialTip())) { ops.add(new FastForwardOp(args, newTipCommit)); } @@ -55,10 +54,9 @@ public class FastForwardOnly extends SubmitStrategy { } } - static boolean dryRun(SubmitDryRun.Arguments args, - CodeReviewCommit mergeTip, CodeReviewCommit toMerge) + static boolean dryRun( + SubmitDryRun.Arguments args, CodeReviewCommit mergeTip, CodeReviewCommit toMerge) throws IntegrationException { - return args.mergeUtil.canFastForward(args.mergeSorter, mergeTip, args.rw, - toMerge); + return args.mergeUtil.canFastForward(args.mergeSorter, mergeTip, args.rw, toMerge); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/ImplicitIntegrateOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/ImplicitIntegrateOp.java index 12f599366c..f252015b04 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/ImplicitIntegrateOp.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/ImplicitIntegrateOp.java @@ -17,11 +17,10 @@ package com.google.gerrit.server.git.strategy; import com.google.gerrit.server.git.CodeReviewCommit; /** - * Operation for a change that is implicitly integrated by integrating another - * commit. - *

- * Updates the change status and message based on {@link - * CodeReviewCommit#getStatusCode()}, but does not touch the repository. + * Operation for a change that is implicitly integrated by integrating another commit. + * + *

Updates the change status and message based on {@link CodeReviewCommit#getStatusCode()}, but + * does not touch the repository. */ class ImplicitIntegrateOp extends SubmitStrategyOp { ImplicitIntegrateOp(SubmitStrategy.Arguments args, CodeReviewCommit toMerge) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/MergeAlways.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/MergeAlways.java index 621e3b9a1f..ce045f849c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/MergeAlways.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/MergeAlways.java @@ -16,7 +16,6 @@ package com.google.gerrit.server.git.strategy; import com.google.gerrit.server.git.CodeReviewCommit; import com.google.gerrit.server.git.IntegrationException; - import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -27,10 +26,10 @@ public class MergeAlways extends SubmitStrategy { } @Override - public List buildOps( - Collection toMerge) throws IntegrationException { - List sorted = args.mergeUtil.reduceToMinimalMerge( - args.mergeSorter, toMerge, args.incoming); + public List buildOps(Collection toMerge) + throws IntegrationException { + List sorted = + args.mergeUtil.reduceToMinimalMerge(args.mergeSorter, toMerge, args.incoming); List ops = new ArrayList<>(sorted.size()); if (args.mergeTip.getInitialTip() == null && !sorted.isEmpty()) { // The branch is unborn. Take a fast-forward resolution to @@ -45,10 +44,9 @@ public class MergeAlways extends SubmitStrategy { return ops; } - static boolean dryRun(SubmitDryRun.Arguments args, - CodeReviewCommit mergeTip, CodeReviewCommit toMerge) + static boolean dryRun( + SubmitDryRun.Arguments args, CodeReviewCommit mergeTip, CodeReviewCommit toMerge) throws IntegrationException { - return args.mergeUtil.canMerge(args.mergeSorter, args.repo, mergeTip, - toMerge); + return args.mergeUtil.canMerge(args.mergeSorter, args.repo, mergeTip, toMerge); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/MergeIfNecessary.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/MergeIfNecessary.java index 5cc2a89498..e7db1a8b1d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/MergeIfNecessary.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/MergeIfNecessary.java @@ -16,7 +16,6 @@ package com.google.gerrit.server.git.strategy; import com.google.gerrit.server.git.CodeReviewCommit; import com.google.gerrit.server.git.IntegrationException; - import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -27,18 +26,17 @@ public class MergeIfNecessary extends SubmitStrategy { } @Override - public List buildOps( - Collection toMerge) throws IntegrationException { - List sorted = args.mergeUtil.reduceToMinimalMerge( - args.mergeSorter, toMerge, args.incoming); + public List buildOps(Collection toMerge) + throws IntegrationException { + List sorted = + args.mergeUtil.reduceToMinimalMerge(args.mergeSorter, toMerge, args.incoming); List ops = new ArrayList<>(sorted.size()); - if (args.mergeTip.getInitialTip() == null || !args.submoduleOp - .hasSubscription(args.destBranch)) { - CodeReviewCommit firstFastForward = args.mergeUtil.getFirstFastForward( - args.mergeTip.getInitialTip(), args.rw, sorted); - if (firstFastForward != null && - !firstFastForward.equals(args.mergeTip.getInitialTip())) { + if (args.mergeTip.getInitialTip() == null + || !args.submoduleOp.hasSubscription(args.destBranch)) { + CodeReviewCommit firstFastForward = + args.mergeUtil.getFirstFastForward(args.mergeTip.getInitialTip(), args.rw, sorted); + if (firstFastForward != null && !firstFastForward.equals(args.mergeTip.getInitialTip())) { ops.add(new FastForwardOp(args, firstFastForward)); } } @@ -51,12 +49,10 @@ public class MergeIfNecessary extends SubmitStrategy { return ops; } - static boolean dryRun(SubmitDryRun.Arguments args, - CodeReviewCommit mergeTip, CodeReviewCommit toMerge) + static boolean dryRun( + SubmitDryRun.Arguments args, CodeReviewCommit mergeTip, CodeReviewCommit toMerge) throws IntegrationException { - return args.mergeUtil.canFastForward( - args.mergeSorter, mergeTip, args.rw, toMerge) - || args.mergeUtil.canMerge( - args.mergeSorter, args.repo, mergeTip, toMerge); + return args.mergeUtil.canFastForward(args.mergeSorter, mergeTip, args.rw, toMerge) + || args.mergeUtil.canMerge(args.mergeSorter, args.repo, mergeTip, toMerge); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/MergeOneOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/MergeOneOp.java index b1590bf11a..e6d7d21b43 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/MergeOneOp.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/MergeOneOp.java @@ -17,10 +17,8 @@ package com.google.gerrit.server.git.strategy; import com.google.gerrit.server.git.BatchUpdate.RepoContext; import com.google.gerrit.server.git.CodeReviewCommit; import com.google.gerrit.server.git.IntegrationException; - -import org.eclipse.jgit.lib.PersonIdent; - import java.io.IOException; +import org.eclipse.jgit.lib.PersonIdent; class MergeOneOp extends SubmitStrategyOp { MergeOneOp(SubmitStrategy.Arguments args, CodeReviewCommit toMerge) { @@ -28,22 +26,29 @@ class MergeOneOp extends SubmitStrategyOp { } @Override - public void updateRepoImpl(RepoContext ctx) - throws IntegrationException, IOException { - PersonIdent caller = ctx.getIdentifiedUser().newCommitterIdent( - ctx.getWhen(), ctx.getTimeZone()); + public void updateRepoImpl(RepoContext ctx) throws IntegrationException, IOException { + PersonIdent caller = + ctx.getIdentifiedUser().newCommitterIdent(ctx.getWhen(), ctx.getTimeZone()); if (args.mergeTip.getCurrentTip() == null) { - throw new IllegalStateException("cannot merge commit " + toMerge.name() - + " onto a null tip; expected at least one fast-forward prior to" - + " this operation"); + throw new IllegalStateException( + "cannot merge commit " + + toMerge.name() + + " onto a null tip; expected at least one fast-forward prior to" + + " this operation"); } // TODO(dborowitz): args.rw is needed because it's a CodeReviewRevWalk. // When hoisting BatchUpdate into MergeOp, we will need to teach // BatchUpdate how to produce CodeReviewRevWalks. CodeReviewCommit merged = - args.mergeUtil.mergeOneCommit(caller, args.serverIdent, - ctx.getRepository(), args.rw, ctx.getInserter(), args.destBranch, - args.mergeTip.getCurrentTip(), toMerge); + args.mergeUtil.mergeOneCommit( + caller, + args.serverIdent, + ctx.getRepository(), + args.rw, + ctx.getInserter(), + args.destBranch, + args.mergeTip.getCurrentTip(), + toMerge); args.mergeTip.moveTipTo(amendGitlink(merged), toMerge); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/RebaseSubmitStrategy.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/RebaseSubmitStrategy.java index ee19958da9..931ad7152f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/RebaseSubmitStrategy.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/RebaseSubmitStrategy.java @@ -36,20 +36,16 @@ import com.google.gerrit.server.git.validators.CommitValidators; import com.google.gerrit.server.project.InvalidChangeOperationException; import com.google.gerrit.server.project.NoSuchChangeException; import com.google.gwtorm.server.OrmException; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.transport.ReceiveCommand; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -/** - * This strategy covers RebaseAlways and RebaseIfNecessary ones. - */ +/** This strategy covers RebaseAlways and RebaseIfNecessary ones. */ public class RebaseSubmitStrategy extends SubmitStrategy { private final boolean rebaseAlways; @@ -59,8 +55,8 @@ public class RebaseSubmitStrategy extends SubmitStrategy { } @Override - public List buildOps( - Collection toMerge) throws IntegrationException { + public List buildOps(Collection toMerge) + throws IntegrationException { List sorted = sort(toMerge); List ops = new ArrayList<>(sorted.size()); boolean first = true; @@ -71,8 +67,7 @@ public class RebaseSubmitStrategy extends SubmitStrategy { // MERGE_IF_NECESSARY semantics to avoid creating duplicate // commits. // - sorted = args.mergeUtil.reduceToMinimalMerge( - args.mergeSorter, sorted, args.incoming); + sorted = args.mergeUtil.reduceToMinimalMerge(args.mergeSorter, sorted, args.incoming); break; } } @@ -119,15 +114,14 @@ public class RebaseSubmitStrategy extends SubmitStrategy { @Override public void updateRepoImpl(RepoContext ctx) - throws IntegrationException, InvalidChangeOperationException, - RestApiException, IOException, OrmException { + throws IntegrationException, InvalidChangeOperationException, RestApiException, IOException, + OrmException { // TODO(dborowitz): args.rw is needed because it's a CodeReviewRevWalk. // When hoisting BatchUpdate into MergeOp, we will need to teach // BatchUpdate how to produce CodeReviewRevWalks. - if (args.mergeUtil - .canFastForward(args.mergeSorter, args.mergeTip.getCurrentTip(), - args.rw, toMerge)) { - if (!rebaseAlways){ + if (args.mergeUtil.canFastForward( + args.mergeSorter, args.mergeTip.getCurrentTip(), args.rw, toMerge)) { + if (!rebaseAlways) { args.mergeTip.moveTipTo(amendGitlink(toMerge), toMerge); toMerge.setStatusCode(CommitMergeStatus.CLEAN_MERGE); acceptMergeTip(args.mergeTip); @@ -135,48 +129,54 @@ public class RebaseSubmitStrategy extends SubmitStrategy { } // RebaseAlways means we modify commit message. args.rw.parseBody(toMerge); - newPatchSetId = ChangeUtil.nextPatchSetId( - args.repo, toMerge.change().currentPatchSetId()); + newPatchSetId = ChangeUtil.nextPatchSetId(args.repo, toMerge.change().currentPatchSetId()); RevCommit mergeTip = args.mergeTip.getCurrentTip(); args.rw.parseBody(mergeTip); - String cherryPickCmtMsg = - args.mergeUtil.createCommitMessageOnSubmit(toMerge, mergeTip); - PersonIdent committer = args.caller.newCommitterIdent(ctx.getWhen(), - args.serverIdent.getTimeZone()); + String cherryPickCmtMsg = args.mergeUtil.createCommitMessageOnSubmit(toMerge, mergeTip); + PersonIdent committer = + args.caller.newCommitterIdent(ctx.getWhen(), args.serverIdent.getTimeZone()); try { - newCommit = args.mergeUtil.createCherryPickFromCommit(args.repo, - args.inserter, args.mergeTip.getCurrentTip(), toMerge, committer, - cherryPickCmtMsg, args.rw, 0, true); + newCommit = + args.mergeUtil.createCherryPickFromCommit( + args.repo, + args.inserter, + args.mergeTip.getCurrentTip(), + toMerge, + committer, + cherryPickCmtMsg, + args.rw, + 0, + true); } catch (MergeConflictException mce) { // Unlike in Cherry-pick case, this should never happen. toMerge.setStatusCode(CommitMergeStatus.REBASE_MERGE_CONFLICT); - throw new IllegalStateException( - "MergeConflictException on message edit must not happen"); + throw new IllegalStateException("MergeConflictException on message edit must not happen"); } catch (MergeIdenticalTreeException mie) { // this should not happen toMerge.setStatusCode(SKIPPED_IDENTICAL_TREE); return; } - ctx.addRefUpdate(new ReceiveCommand(ObjectId.zeroId(), newCommit, - newPatchSetId.toRefName())); + ctx.addRefUpdate( + new ReceiveCommand(ObjectId.zeroId(), newCommit, newPatchSetId.toRefName())); } else { // Stale read of patch set is ok; see comments in RebaseChangeOp. - PatchSet origPs = args.psUtil.get(ctx.getDb(), - toMerge.getControl().getNotes(), toMerge.getPatchsetId()); - rebaseOp = args.rebaseFactory.create( - toMerge.getControl(), origPs, args.mergeTip.getCurrentTip().name()) - .setFireRevisionCreated(false) - // Bypass approval copier since SubmitStrategyOp copy all approvals - // later anyway. - .setCopyApprovals(false) - .setValidatePolicy(CommitValidators.Policy.NONE) - .setCheckAddPatchSetPermission(false) - // RebaseAlways should set always modify commit message like - // Cherry-Pick strategy. - .setDetailedCommitMessage(rebaseAlways) - // Do not post message after inserting new patchset because there - // will be one about change being merged already. - .setPostMessage(false); + PatchSet origPs = + args.psUtil.get(ctx.getDb(), toMerge.getControl().getNotes(), toMerge.getPatchsetId()); + rebaseOp = + args.rebaseFactory + .create(toMerge.getControl(), origPs, args.mergeTip.getCurrentTip().name()) + .setFireRevisionCreated(false) + // Bypass approval copier since SubmitStrategyOp copy all approvals + // later anyway. + .setCopyApprovals(false) + .setValidatePolicy(CommitValidators.Policy.NONE) + .setCheckAddPatchSetPermission(false) + // RebaseAlways should set always modify commit message like + // Cherry-Pick strategy. + .setDetailedCommitMessage(rebaseAlways) + // Do not post message after inserting new patchset because there + // will be one about change being merged already. + .setPostMessage(false); try { rebaseOp.updateRepo(ctx); } catch (MergeConflictException | NoSuchChangeException e) { @@ -198,8 +198,7 @@ public class RebaseSubmitStrategy extends SubmitStrategy { @Override public PatchSet updateChangeImpl(ChangeContext ctx) - throws NoSuchChangeException, ResourceConflictException, - OrmException, IOException { + throws NoSuchChangeException, ResourceConflictException, OrmException, IOException { if (newCommit == null) { checkState(!rebaseAlways, "RebaseAlways must never fast forward"); // otherwise, took the fast-forward option, nothing to do. @@ -213,13 +212,21 @@ public class RebaseSubmitStrategy extends SubmitStrategy { } else { // CherryPick PatchSet prevPs = args.psUtil.current(ctx.getDb(), ctx.getNotes()); - newPs = args.psUtil.insert(ctx.getDb(), ctx.getRevWalk(), - ctx.getUpdate(newPatchSetId), newPatchSetId, newCommit, false, - prevPs != null ? prevPs.getGroups() : ImmutableList. of(), - null, null); + newPs = + args.psUtil.insert( + ctx.getDb(), + ctx.getRevWalk(), + ctx.getUpdate(newPatchSetId), + newPatchSetId, + newCommit, + false, + prevPs != null ? prevPs.getGroups() : ImmutableList.of(), + null, + null); } - ctx.getChange().setCurrentPatchSet(args.patchSetInfoFactory - .get(ctx.getRevWalk(), newCommit, newPatchSetId)); + ctx.getChange() + .setCurrentPatchSet( + args.patchSetInfoFactory.get(ctx.getRevWalk(), newCommit, newPatchSetId)); newCommit.setControl(ctx.getControl()); return newPs; } @@ -238,8 +245,7 @@ public class RebaseSubmitStrategy extends SubmitStrategy { } @Override - public void updateRepoImpl(RepoContext ctx) - throws IntegrationException, IOException { + public void updateRepoImpl(RepoContext ctx) throws IntegrationException, IOException { // There are multiple parents, so this is a merge commit. We don't want // to rebase the merge as clients can't easily rebase their history with // that merge present and replaced by an equivalent merge with a different @@ -253,17 +259,24 @@ public class RebaseSubmitStrategy extends SubmitStrategy { // are important would be well advised to prohibit uploading patches with // merge commits. MergeTip mergeTip = args.mergeTip; - if (args.rw.isMergedInto(mergeTip.getCurrentTip(), toMerge) && - !args.submoduleOp.hasSubscription(args.destBranch)) { + if (args.rw.isMergedInto(mergeTip.getCurrentTip(), toMerge) + && !args.submoduleOp.hasSubscription(args.destBranch)) { mergeTip.moveTipTo(toMerge, toMerge); } else { - CodeReviewCommit newTip = args.mergeUtil.mergeOneCommit( - args.serverIdent, args.serverIdent, args.repo, args.rw, - args.inserter, args.destBranch, mergeTip.getCurrentTip(), toMerge); + CodeReviewCommit newTip = + args.mergeUtil.mergeOneCommit( + args.serverIdent, + args.serverIdent, + args.repo, + args.rw, + args.inserter, + args.destBranch, + mergeTip.getCurrentTip(), + toMerge); mergeTip.moveTipTo(amendGitlink(newTip), toMerge); } - args.mergeUtil.markCleanMerges(args.rw, args.canMergeFlag, - mergeTip.getCurrentTip(), args.alreadyAccepted); + args.mergeUtil.markCleanMerges( + args.rw, args.canMergeFlag, mergeTip.getCurrentTip(), args.alreadyAccepted); acceptMergeTip(mergeTip); } } @@ -276,20 +289,25 @@ public class RebaseSubmitStrategy extends SubmitStrategy { throws IntegrationException { try { return new RebaseSorter( - args.rw, args.mergeTip.getInitialTip(), args.alreadyAccepted, args.canMergeFlag, - args.internalChangeQuery, args.changeKindCache, args.repo).sort(toSort); + args.rw, + args.mergeTip.getInitialTip(), + args.alreadyAccepted, + args.canMergeFlag, + args.internalChangeQuery, + args.changeKindCache, + args.repo) + .sort(toSort); } catch (IOException e) { throw new IntegrationException("Commit sorting failed", e); } } - static boolean dryRun(SubmitDryRun.Arguments args, - CodeReviewCommit mergeTip, CodeReviewCommit toMerge) + static boolean dryRun( + SubmitDryRun.Arguments args, CodeReviewCommit mergeTip, CodeReviewCommit toMerge) throws IntegrationException { // Test for merge instead of cherry pick to avoid false negatives // on commit chains. return !args.mergeUtil.hasMissingDependencies(args.mergeSorter, toMerge) - && args.mergeUtil.canMerge(args.mergeSorter, args.repo, mergeTip, - toMerge); + && args.mergeUtil.canMerge(args.mergeSorter, args.repo, mergeTip, toMerge); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitDryRun.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitDryRun.java index a7dc367aa1..d375b6ec75 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitDryRun.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitDryRun.java @@ -26,7 +26,10 @@ import com.google.gerrit.server.project.NoSuchProjectException; import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.project.ProjectState; import com.google.inject.Inject; - +import java.io.IOException; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Ref; @@ -38,11 +41,6 @@ import org.eclipse.jgit.revwalk.RevWalk; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - /** Dry run of a submit strategy. */ public class SubmitDryRun { private static final Logger log = LoggerFactory.getLogger(SubmitDryRun.class); @@ -53,10 +51,7 @@ public class SubmitDryRun { final MergeUtil mergeUtil; final MergeSorter mergeSorter; - Arguments(Repository repo, - CodeReviewRevWalk rw, - MergeUtil mergeUtil, - MergeSorter mergeSorter) { + Arguments(Repository repo, CodeReviewRevWalk rw, MergeUtil mergeUtil, MergeSorter mergeSorter) { this.repo = repo; this.rw = rw; this.mergeUtil = mergeUtil; @@ -64,23 +59,20 @@ public class SubmitDryRun { } } - public static Iterable getAlreadyAccepted(Repository repo) - throws IOException { - return FluentIterable - .from(repo.getRefDatabase().getRefs(Constants.R_HEADS).values()) + public static Iterable getAlreadyAccepted(Repository repo) throws IOException { + return FluentIterable.from(repo.getRefDatabase().getRefs(Constants.R_HEADS).values()) .append(repo.getRefDatabase().getRefs(Constants.R_TAGS).values()) .transform(Ref::getObjectId); } - public static Set getAlreadyAccepted(Repository repo, RevWalk rw) - throws IOException { + public static Set getAlreadyAccepted(Repository repo, RevWalk rw) throws IOException { Set accepted = new HashSet<>(); addCommits(getAlreadyAccepted(repo), rw, accepted); return accepted; } - public static void addCommits(Iterable ids, RevWalk rw, - Collection out) throws IOException { + public static void addCommits(Iterable ids, RevWalk rw, Collection out) + throws IOException { for (ObjectId id : ids) { RevObject obj = rw.parseAny(id); if (obj instanceof RevCommit) { @@ -93,23 +85,30 @@ public class SubmitDryRun { private final MergeUtil.Factory mergeUtilFactory; @Inject - SubmitDryRun(ProjectCache projectCache, - MergeUtil.Factory mergeUtilFactory) { + SubmitDryRun(ProjectCache projectCache, MergeUtil.Factory mergeUtilFactory) { this.projectCache = projectCache; this.mergeUtilFactory = mergeUtilFactory; } - public boolean run(SubmitType submitType, Repository repo, - CodeReviewRevWalk rw, Branch.NameKey destBranch, ObjectId tip, - ObjectId toMerge, Set alreadyAccepted) + public boolean run( + SubmitType submitType, + Repository repo, + CodeReviewRevWalk rw, + Branch.NameKey destBranch, + ObjectId tip, + ObjectId toMerge, + Set alreadyAccepted) throws IntegrationException, NoSuchProjectException, IOException { CodeReviewCommit tipCommit = rw.parseCommit(tip); CodeReviewCommit toMergeCommit = rw.parseCommit(toMerge); RevFlag canMerge = rw.newFlag("CAN_MERGE"); toMergeCommit.add(canMerge); - Arguments args = new Arguments(repo, rw, - mergeUtilFactory.create(getProject(destBranch)), - new MergeSorter(rw, alreadyAccepted, canMerge)); + Arguments args = + new Arguments( + repo, + rw, + mergeUtilFactory.create(getProject(destBranch)), + new MergeSorter(rw, alreadyAccepted, canMerge)); switch (submitType) { case CHERRY_PICK: @@ -131,8 +130,7 @@ public class SubmitDryRun { } } - private ProjectState getProject(Branch.NameKey branch) - throws NoSuchProjectException { + private ProjectState getProject(Branch.NameKey branch) throws NoSuchProjectException { ProjectState p = projectCache.get(branch.getParentKey()); if (p == null) { throw new NoSuchProjectException(branch.getParentKey()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategy.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategy.java index 441897c6e5..4461642817 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategy.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategy.java @@ -57,24 +57,22 @@ import com.google.gerrit.server.util.RequestId; import com.google.inject.Module; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Set; import org.eclipse.jgit.lib.ObjectInserter; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevFlag; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Set; - /** * Base class that submit strategies must extend. - *

- * A submit strategy for a certain {@link SubmitType} defines how the submitted - * commits should be merged. + * + *

A submit strategy for a certain {@link SubmitType} defines how the submitted commits should be + * merged. */ public abstract class SubmitStrategy { public static Module module() { @@ -223,8 +221,11 @@ public abstract class SubmitStrategy { this.submoduleOp = submoduleOp; this.dryrun = dryrun; - this.project = checkNotNull(projectCache.get(destBranch.getParentKey()), - "project not found: %s", destBranch.getParentKey()); + this.project = + checkNotNull( + projectCache.get(destBranch.getParentKey()), + "project not found: %s", + destBranch.getParentKey()); this.mergeSorter = new MergeSorter(rw, alreadyAccepted, canMergeFlag); this.mergeUtil = mergeUtilFactory.create(project); this.onSubmitValidatorsFactory = onSubmitValidatorsFactory; @@ -239,17 +240,16 @@ public abstract class SubmitStrategy { /** * Add operations to a batch update that execute this submit strategy. - *

- * Guarantees exactly one op is added to the update for each change in the - * input set. + * + *

Guarantees exactly one op is added to the update for each change in the input set. * * @param bu batch update to add operations to. - * @param toMerge the set of submitted commits that should be merged using - * this submit strategy. Implementations are responsible for ordering of - * commits, and will not modify the input in place. - * @throws IntegrationException if an error occurred initializing the - * operations (as opposed to an error during execution, which will be - * reported only when the batch update executes the operations). + * @param toMerge the set of submitted commits that should be merged using this submit strategy. + * Implementations are responsible for ordering of commits, and will not modify the input in + * place. + * @throws IntegrationException if an error occurred initializing the operations (as opposed to an + * error during execution, which will be reported only when the batch update executes the + * operations). */ public final void addOps(BatchUpdate bu, Set toMerge) throws IntegrationException { @@ -261,8 +261,7 @@ public abstract class SubmitStrategy { } // First add ops for any implicitly merged changes. - List difference = - new ArrayList<>(Sets.difference(toMerge, added)); + List difference = new ArrayList<>(Sets.difference(toMerge, added)); Collections.reverse(difference); for (CodeReviewCommit c : difference) { bu.addOp(c.change().getId(), new ImplicitIntegrateOp(args, c)); @@ -274,6 +273,6 @@ public abstract class SubmitStrategy { } } - protected abstract List buildOps( - Collection toMerge) throws IntegrationException; + protected abstract List buildOps(Collection toMerge) + throws IntegrationException; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategyFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategyFactory.java index fc22cfc779..fc4817d1d2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategyFactory.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategyFactory.java @@ -31,7 +31,7 @@ import com.google.gerrit.server.git.SubmoduleOp; import com.google.gerrit.server.util.RequestId; import com.google.inject.Inject; import com.google.inject.Singleton; - +import java.util.Set; import org.eclipse.jgit.lib.ObjectInserter; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; @@ -39,13 +39,10 @@ import org.eclipse.jgit.revwalk.RevFlag; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Set; - /** Factory to create a {@link SubmitStrategy} for a {@link SubmitType}. */ @Singleton public class SubmitStrategyFactory { - private static final Logger log = LoggerFactory - .getLogger(SubmitStrategyFactory.class); + private static final Logger log = LoggerFactory.getLogger(SubmitStrategyFactory.class); private final SubmitStrategy.Arguments.Factory argsFactory; @@ -54,18 +51,44 @@ public class SubmitStrategyFactory { this.argsFactory = argsFactory; } - public SubmitStrategy create(SubmitType submitType, ReviewDb db, - Repository repo, CodeReviewRevWalk rw, ObjectInserter inserter, - RevFlag canMergeFlag, Set alreadyAccepted, - Set incoming, Branch.NameKey destBranch, - IdentifiedUser caller, MergeTip mergeTip, CommitStatus commitStatus, - RequestId submissionId, NotifyHandling notifyHandling, + public SubmitStrategy create( + SubmitType submitType, + ReviewDb db, + Repository repo, + CodeReviewRevWalk rw, + ObjectInserter inserter, + RevFlag canMergeFlag, + Set alreadyAccepted, + Set incoming, + Branch.NameKey destBranch, + IdentifiedUser caller, + MergeTip mergeTip, + CommitStatus commitStatus, + RequestId submissionId, + NotifyHandling notifyHandling, ListMultimap accountsToNotify, - SubmoduleOp submoduleOp, boolean dryrun) throws IntegrationException { - SubmitStrategy.Arguments args = argsFactory.create(submitType, destBranch, - commitStatus, rw, caller, mergeTip, inserter, repo, canMergeFlag, db, - alreadyAccepted, incoming, submissionId, notifyHandling, - accountsToNotify, submoduleOp, dryrun); + SubmoduleOp submoduleOp, + boolean dryrun) + throws IntegrationException { + SubmitStrategy.Arguments args = + argsFactory.create( + submitType, + destBranch, + commitStatus, + rw, + caller, + mergeTip, + inserter, + repo, + canMergeFlag, + db, + alreadyAccepted, + incoming, + submissionId, + notifyHandling, + accountsToNotify, + submoduleOp, + dryrun); switch (submitType) { case CHERRY_PICK: return new CherryPick(args); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategyListener.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategyListener.java index 68ee8c83c6..270e98e67a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategyListener.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategyListener.java @@ -24,21 +24,19 @@ import com.google.gerrit.server.git.BatchUpdate; import com.google.gerrit.server.git.CodeReviewCommit; import com.google.gerrit.server.git.IntegrationException; import com.google.gerrit.server.git.MergeOp.CommitStatus; - -import org.eclipse.jgit.revwalk.RevCommit; - import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Set; +import org.eclipse.jgit.revwalk.RevCommit; public class SubmitStrategyListener extends BatchUpdate.Listener { private final Collection strategies; private final CommitStatus commitStatus; private final boolean failAfterRefUpdates; - public SubmitStrategyListener(SubmitInput input, - Collection strategies, CommitStatus commitStatus) { + public SubmitStrategyListener( + SubmitInput input, Collection strategies, CommitStatus commitStatus) { this.strategies = strategies; this.commitStatus = commitStatus; if (input instanceof TestSubmitInput) { @@ -76,13 +74,16 @@ public class SubmitStrategyListener extends BatchUpdate.Listener { continue; } SubmitStrategy.Arguments args = strategy.args; - Set unmerged = args.mergeUtil.findUnmergedChanges( - args.commitStatus.getChangeIds(args.destBranch), args.rw, - args.canMergeFlag, args.mergeTip.getInitialTip(), - args.mergeTip.getCurrentTip(), alreadyMerged); + Set unmerged = + args.mergeUtil.findUnmergedChanges( + args.commitStatus.getChangeIds(args.destBranch), + args.rw, + args.canMergeFlag, + args.mergeTip.getInitialTip(), + args.mergeTip.getCurrentTip(), + alreadyMerged); for (Change.Id id : unmerged) { - commitStatus.problem(id, - "internal error: change not reachable from new branch tip"); + commitStatus.problem(id, "internal error: change not reachable from new branch tip"); } } commitStatus.maybeFailVerbose(); @@ -92,21 +93,21 @@ public class SubmitStrategyListener extends BatchUpdate.Listener { for (SubmitStrategy strategy : strategies) { SubmitStrategy.Arguments args = strategy.args; RevCommit initialTip = args.mergeTip.getInitialTip(); - args.mergeUtil.markCleanMerges(args.rw, args.canMergeFlag, - args.mergeTip.getCurrentTip(), initialTip == null ? - ImmutableSet.of() : ImmutableSet.of(initialTip)); + args.mergeUtil.markCleanMerges( + args.rw, + args.canMergeFlag, + args.mergeTip.getCurrentTip(), + initialTip == null ? ImmutableSet.of() : ImmutableSet.of(initialTip)); } } private List checkCommitStatus() throws ResourceConflictException { - List alreadyMerged = - new ArrayList<>(commitStatus.getChangeIds().size()); + List alreadyMerged = new ArrayList<>(commitStatus.getChangeIds().size()); for (Change.Id id : commitStatus.getChangeIds()) { CodeReviewCommit commit = commitStatus.get(id); CommitMergeStatus s = commit != null ? commit.getStatusCode() : null; if (s == null) { - commitStatus.problem(id, - "internal error: change not processed by merge strategy"); + commitStatus.problem(id, "internal error: change not processed by merge strategy"); continue; } switch (s) { @@ -129,8 +130,7 @@ public class SubmitStrategyListener extends BatchUpdate.Listener { case NOT_FAST_FORWARD: // TODO(dborowitz): Reformat these messages to be more appropriate for // short problem descriptions. - commitStatus.problem(id, - CharMatcher.is('\n').collapseFrom(s.getMessage(), ' ')); + commitStatus.problem(id, CharMatcher.is('\n').collapseFrom(s.getMessage(), ' ')); break; case MISSING_DEPENDENCY: diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategyOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategyOp.java index e9b9cbbb4d..d0be2c0da6 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategyOp.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategyOp.java @@ -51,7 +51,14 @@ import com.google.gerrit.server.git.SubmoduleException; import com.google.gerrit.server.notedb.ChangeUpdate; import com.google.gerrit.server.project.ProjectState; import com.google.gwtorm.server.OrmException; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.lib.ObjectId; @@ -61,18 +68,8 @@ import org.eclipse.jgit.transport.ReceiveCommand; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; - abstract class SubmitStrategyOp extends BatchUpdate.Op { - private static final Logger log = - LoggerFactory.getLogger(SubmitStrategyOp.class); + private static final Logger log = LoggerFactory.getLogger(SubmitStrategyOp.class); protected final SubmitStrategy.Arguments args; protected final CodeReviewCommit toMerge; @@ -84,8 +81,7 @@ abstract class SubmitStrategyOp extends BatchUpdate.Op { private Change updatedChange; private CodeReviewCommit alreadyMerged; - protected SubmitStrategyOp(SubmitStrategy.Arguments args, - CodeReviewCommit toMerge) { + protected SubmitStrategyOp(SubmitStrategy.Arguments args, CodeReviewCommit toMerge) { this.args = args; this.toMerge = toMerge; } @@ -108,8 +104,7 @@ abstract class SubmitStrategyOp extends BatchUpdate.Op { @Override public final void updateRepo(RepoContext ctx) throws Exception { - logDebug("{}#updateRepo for change {}", getClass().getSimpleName(), - toMerge.change().getId()); + logDebug("{}#updateRepo for change {}", getClass().getSimpleName(), toMerge.change().getId()); // Run the submit strategy implementation and record the merge tip state so // we can create the ref update. CodeReviewCommit tipBefore = args.mergeTip.getCurrentTip(); @@ -134,10 +129,8 @@ abstract class SubmitStrategyOp extends BatchUpdate.Op { // Needed by postUpdate, at which point mergeTip will have advanced further, // so it's easier to just snapshot the command. - command = new ReceiveCommand( - firstNonNull(tipBefore, ObjectId.zeroId()), - tipAfter, - getDest().get()); + command = + new ReceiveCommand(firstNonNull(tipBefore, ObjectId.zeroId()), tipAfter, getDest().get()); ctx.addRefUpdate(command); args.submoduleOp.addBranchTip(getDest(), tipAfter); } @@ -151,15 +144,18 @@ abstract class SubmitStrategyOp extends BatchUpdate.Op { ProjectConfig cfg = new ProjectConfig(getProject()); cfg.load(ctx.getRevWalk(), commit); } catch (Exception e) { - throw new IntegrationException("Submit would store invalid" - + " project configuration " + commit.name() + " for " - + getProject(), e); + throw new IntegrationException( + "Submit would store invalid" + + " project configuration " + + commit.name() + + " for " + + getProject(), + e); } } } - private CodeReviewCommit getAlreadyMergedCommit(RepoContext ctx) - throws IOException { + private CodeReviewCommit getAlreadyMergedCommit(RepoContext ctx) throws IOException { CodeReviewCommit tip = args.mergeTip.getInitialTip(); if (tip == null) { return null; @@ -167,8 +163,7 @@ abstract class SubmitStrategyOp extends BatchUpdate.Op { CodeReviewRevWalk rw = (CodeReviewRevWalk) ctx.getRevWalk(); Change.Id id = getId(); - Collection refs = ctx.getRepository().getRefDatabase() - .getRefs(id.toRefPrefix()).values(); + Collection refs = ctx.getRepository().getRefDatabase().getRefs(id.toRefPrefix()).values(); List commits = new ArrayList<>(refs.size()); for (Ref ref : refs) { PatchSet.Id psId = PatchSet.Id.fromRef(ref.getName()); @@ -183,8 +178,8 @@ abstract class SubmitStrategyOp extends BatchUpdate.Op { continue; // Bogus ref, can't be merged into tip so we don't care. } } - Collections.sort(commits, ReviewDbUtil.intKeyOrdering().reverse() - .onResultOf(c -> c.getPatchsetId())); + Collections.sort( + commits, ReviewDbUtil.intKeyOrdering().reverse().onResultOf(c -> c.getPatchsetId())); CodeReviewCommit result = MergeUtil.findAnyMergedInto(rw, commits, tip); if (result == null) { return null; @@ -214,8 +209,7 @@ abstract class SubmitStrategyOp extends BatchUpdate.Op { @Override public final boolean updateChange(ChangeContext ctx) throws Exception { - logDebug("{}#updateChange for change {}", getClass().getSimpleName(), - toMerge.change().getId()); + logDebug("{}#updateChange for change {}", getClass().getSimpleName(), toMerge.change().getId()); toMerge.setControl(ctx.getControl()); // Update change and notes from ctx. PatchSet.Id oldPsId = checkNotNull(toMerge.getPatchsetId()); PatchSet.Id newPsId; @@ -228,19 +222,28 @@ abstract class SubmitStrategyOp extends BatchUpdate.Op { PatchSet newPatchSet = updateChangeImpl(ctx); newPsId = checkNotNull(ctx.getChange().currentPatchSetId()); if (newPatchSet == null) { - checkState(oldPsId.equals(newPsId), + checkState( + oldPsId.equals(newPsId), "patch set advanced from %s to %s but updateChangeImpl did not" - + " return new patch set instance", oldPsId, newPsId); + + " return new patch set instance", + oldPsId, + newPsId); // Ok to use stale notes to get the old patch set, which didn't change // during the submit strategy. - mergedPatchSet = checkNotNull( - args.psUtil.get(ctx.getDb(), ctx.getNotes(), oldPsId), - "missing old patch set %s", oldPsId); + mergedPatchSet = + checkNotNull( + args.psUtil.get(ctx.getDb(), ctx.getNotes(), oldPsId), + "missing old patch set %s", + oldPsId); } else { PatchSet.Id n = newPatchSet.getId(); - checkState(!n.equals(oldPsId) && n.equals(newPsId), + checkState( + !n.equals(oldPsId) && n.equals(newPsId), "current patch was %s and is now %s, but updateChangeImpl returned" - + " new patch set instance at %s", oldPsId, newPsId, n); + + " new patch set instance at %s", + oldPsId, + newPsId, + n); mergedPatchSet = newPatchSet; } } @@ -250,19 +253,17 @@ abstract class SubmitStrategyOp extends BatchUpdate.Op { CodeReviewCommit commit = args.commitStatus.get(id); checkNotNull(commit, "missing commit for change " + id); CommitMergeStatus s = commit.getStatusCode(); - checkNotNull(s, - "status not set for change " + id - + " expected to previously fail fast"); - logDebug("Status of change {} ({}) on {}: {}", id, commit.name(), - c.getDest(), s); + checkNotNull(s, "status not set for change " + id + " expected to previously fail fast"); + logDebug("Status of change {} ({}) on {}: {}", id, commit.name(), c.getDest(), s); setApproval(ctx, args.caller); - mergeResultRev = alreadyMerged == null - ? args.mergeTip.getMergeResults().get(commit) - // Our fixup code is not smart enough to find a merge commit - // corresponding to the merge result. This results in a different - // ChangeMergedEvent in the fixup case, but we'll just live with that. - : alreadyMerged; + mergeResultRev = + alreadyMerged == null + ? args.mergeTip.getMergeResults().get(commit) + // Our fixup code is not smart enough to find a merge commit + // corresponding to the merge result. This results in a different + // ChangeMergedEvent in the fixup case, but we'll just live with that. + : alreadyMerged; try { setMerged(ctx, message(ctx, commit, s)); } catch (OrmException err) { @@ -282,9 +283,9 @@ abstract class SubmitStrategyOp extends BatchUpdate.Op { logDebug("Fixing up already-merged patch set {}", psId); PatchSet prevPs = args.psUtil.current(ctx.getDb(), ctx.getNotes()); ctx.getRevWalk().parseBody(alreadyMerged); - ctx.getChange().setCurrentPatchSet(psId, - alreadyMerged.getShortMessage(), - ctx.getChange().getOriginalSubject()); + ctx.getChange() + .setCurrentPatchSet( + psId, alreadyMerged.getShortMessage(), ctx.getChange().getOriginalSubject()); PatchSet existing = args.psUtil.get(ctx.getDb(), ctx.getNotes(), psId); if (existing != null) { logDebug("Patch set row exists, only updating change"); @@ -293,15 +294,21 @@ abstract class SubmitStrategyOp extends BatchUpdate.Op { // No patch set for the already merged commit, although we know it came form // a patch set ref. Fix up the database. Note that this uses the current // user as the uploader, which is as good a guess as any. - List groups = prevPs != null - ? prevPs.getGroups() - : GroupCollector.getDefaultGroups(alreadyMerged); - return args.psUtil.insert(ctx.getDb(), ctx.getRevWalk(), - ctx.getUpdate(psId), psId, alreadyMerged, false, groups, null, null); + List groups = + prevPs != null ? prevPs.getGroups() : GroupCollector.getDefaultGroups(alreadyMerged); + return args.psUtil.insert( + ctx.getDb(), + ctx.getRevWalk(), + ctx.getUpdate(psId), + psId, + alreadyMerged, + false, + groups, + null, + null); } - private void setApproval(ChangeContext ctx, IdentifiedUser user) - throws OrmException { + private void setApproval(ChangeContext ctx, IdentifiedUser user) throws OrmException { Change.Id id = ctx.getChange().getId(); List records = args.commitStatus.getSubmitRecords(id); PatchSet.Id oldPsId = toMerge.getPatchsetId(); @@ -326,13 +333,13 @@ abstract class SubmitStrategyOp extends BatchUpdate.Op { throws OrmException { PatchSet.Id psId = update.getPatchSetId(); Map byKey = new HashMap<>(); - for (PatchSetApproval psa : args.approvalsUtil.byPatchSet( - ctx.getDb(), ctx.getControl(), psId)) { + for (PatchSetApproval psa : + args.approvalsUtil.byPatchSet(ctx.getDb(), ctx.getControl(), psId)) { byKey.put(psa.getKey(), psa); } - submitter = ApprovalsUtil.newApproval( - psId, ctx.getUser(), LabelId.legacySubmit(), 1, ctx.getWhen()); + submitter = + ApprovalsUtil.newApproval(psId, ctx.getUser(), LabelId.legacySubmit(), 1, ctx.getWhen()); byKey.put(submitter.getKey(), submitter); // Flatten out existing approvals for this patch set based upon the current @@ -347,14 +354,15 @@ abstract class SubmitStrategyOp extends BatchUpdate.Op { return normalized; } - private void saveApprovals(LabelNormalizer.Result normalized, - ChangeContext ctx, ChangeUpdate update, boolean includeUnchanged) + private void saveApprovals( + LabelNormalizer.Result normalized, + ChangeContext ctx, + ChangeUpdate update, + boolean includeUnchanged) throws OrmException { PatchSet.Id psId = update.getPatchSetId(); - ctx.getDb().patchSetApprovals().upsert( - convertPatchSet(normalized.getNormalized(), psId)); - ctx.getDb().patchSetApprovals().upsert( - zero(convertPatchSet(normalized.deleted(), psId))); + ctx.getDb().patchSetApprovals().upsert(convertPatchSet(normalized.getNormalized(), psId)); + ctx.getDb().patchSetApprovals().upsert(zero(convertPatchSet(normalized.deleted(), psId))); for (PatchSetApproval psa : normalized.updated()) { update.putApprovalFor(psa.getAccountId(), psa.getLabel(), psa.getValue()); } @@ -367,14 +375,13 @@ abstract class SubmitStrategyOp extends BatchUpdate.Op { for (PatchSetApproval psa : normalized.unchanged()) { if (includeUnchanged || psa.isLegacySubmit()) { logDebug("Adding submit label " + psa); - update.putApprovalFor( - psa.getAccountId(), psa.getLabel(), psa.getValue()); + update.putApprovalFor(psa.getAccountId(), psa.getLabel(), psa.getValue()); } } } - private static Function - convertPatchSet(final PatchSet.Id psId) { + private static Function convertPatchSet( + final PatchSet.Id psId) { return psa -> { if (psa.getPatchSetId().equals(psId)) { return psa; @@ -388,8 +395,7 @@ abstract class SubmitStrategyOp extends BatchUpdate.Op { return Iterables.transform(approvals, convertPatchSet(psId)); } - private static Iterable zero( - Iterable approvals) { + private static Iterable zero(Iterable approvals) { return Iterables.transform( approvals, a -> { @@ -400,26 +406,23 @@ abstract class SubmitStrategyOp extends BatchUpdate.Op { } private String getByAccountName() { - checkNotNull(submitter, - "getByAccountName called before submitter populated"); - Account account = - args.accountCache.get(submitter.getAccountId()).getAccount(); + checkNotNull(submitter, "getByAccountName called before submitter populated"); + Account account = args.accountCache.get(submitter.getAccountId()).getAccount(); if (account != null && account.getFullName() != null) { return " by " + account.getFullName(); } return ""; } - private ChangeMessage message(ChangeContext ctx, CodeReviewCommit commit, - CommitMergeStatus s) throws OrmException { + private ChangeMessage message(ChangeContext ctx, CodeReviewCommit commit, CommitMergeStatus s) + throws OrmException { checkNotNull(s, "CommitMergeStatus may not be null"); String txt = s.getMessage(); if (s == CommitMergeStatus.CLEAN_MERGE) { return message(ctx, commit.getPatchsetId(), txt + getByAccountName()); - } else if (s == CommitMergeStatus.CLEAN_REBASE - || s == CommitMergeStatus.CLEAN_PICK) { - return message(ctx, commit.getPatchsetId(), - txt + " as " + commit.name() + getByAccountName()); + } else if (s == CommitMergeStatus.CLEAN_REBASE || s == CommitMergeStatus.CLEAN_PICK) { + return message( + ctx, commit.getPatchsetId(), txt + " as " + commit.name() + getByAccountName()); } else if (s == CommitMergeStatus.SKIPPED_IDENTICAL_TREE) { return message(ctx, commit.getPatchsetId(), txt); } else if (s == CommitMergeStatus.ALREADY_MERGED) { @@ -436,27 +439,28 @@ abstract class SubmitStrategyOp extends BatchUpdate.Op { case REBASE_ALWAYS: return message(ctx, commit, CommitMergeStatus.CLEAN_REBASE); default: - throw new IllegalStateException("unexpected submit type " - + args.submitType.toString() - + " for change " - + commit.change().getId()); + throw new IllegalStateException( + "unexpected submit type " + + args.submitType.toString() + + " for change " + + commit.change().getId()); } } else { - throw new IllegalStateException("unexpected status " + s - + " for change " + commit.change().getId() - + "; expected to previously fail fast"); + throw new IllegalStateException( + "unexpected status " + + s + + " for change " + + commit.change().getId() + + "; expected to previously fail fast"); } } - private ChangeMessage message(ChangeContext ctx, PatchSet.Id psId, - String body) { + private ChangeMessage message(ChangeContext ctx, PatchSet.Id psId, String body) { return ChangeMessagesUtil.newMessage( - psId, ctx.getUser(), ctx.getWhen(), body, - ChangeMessagesUtil.TAG_MERGED); + psId, ctx.getUser(), ctx.getWhen(), body, ChangeMessagesUtil.TAG_MERGED); } - private void setMerged(ChangeContext ctx, ChangeMessage msg) - throws OrmException { + private void setMerged(ChangeContext ctx, ChangeMessage msg) throws OrmException { Change c = ctx.getChange(); ReviewDb db = ctx.getDb(); logDebug("Setting change {} merged", c.getId()); @@ -477,10 +481,7 @@ abstract class SubmitStrategyOp extends BatchUpdate.Op { if (command != null) { args.tagCache.updateFastForward( - getProject(), - command.getRefName(), - command.getOldId(), - command.getNewId()); + getProject(), command.getRefName(), command.getOldId(), command.getNewId()); // TODO(dborowitz): Move to BatchUpdate? Would also allow us to run once // per project even if multiple changes to refs/meta/config are submitted. if (RefNames.REFS_CONFIG.equals(getDest().get())) { @@ -498,8 +499,12 @@ abstract class SubmitStrategyOp extends BatchUpdate.Op { // have failed fast in one of the other steps. try { args.mergedSenderFactory - .create(ctx.getProject(), getId(), submitter.getAccountId(), - args.notifyHandling, args.accountsToNotify) + .create( + ctx.getProject(), + getId(), + submitter.getAccountId(), + args.notifyHandling, + args.accountsToNotify) .sendAsync(); } catch (Exception e) { log.error("Cannot email merged notification for " + getId(), e); @@ -518,14 +523,12 @@ abstract class SubmitStrategyOp extends BatchUpdate.Op { * @see #updateRepo(RepoContext) * @param ctx */ - protected void updateRepoImpl(RepoContext ctx) throws Exception { - } + protected void updateRepoImpl(RepoContext ctx) throws Exception {} /** * @see #updateChange(ChangeContext) * @param ctx - * @return a new patch set if one was created by the submit strategy, or null - * if not. + * @return a new patch set if one was created by the submit strategy, or null if not. */ protected PatchSet updateChangeImpl(ChangeContext ctx) throws Exception { return null; @@ -535,15 +538,14 @@ abstract class SubmitStrategyOp extends BatchUpdate.Op { * @see #postUpdate(Context) * @param ctx */ - protected void postUpdateImpl(Context ctx) throws Exception { - } + protected void postUpdateImpl(Context ctx) throws Exception {} /** * Amend the commit with gitlink update + * * @param commit */ - protected CodeReviewCommit amendGitlink(CodeReviewCommit commit) - throws IntegrationException { + protected CodeReviewCommit amendGitlink(CodeReviewCommit commit) throws IntegrationException { if (!args.submoduleOp.hasSubscription(args.destBranch)) { return commit; } @@ -553,8 +555,7 @@ abstract class SubmitStrategyOp extends BatchUpdate.Op { return args.submoduleOp.composeGitlinksCommit(args.destBranch, commit); } catch (SubmoduleException | IOException e) { throw new IntegrationException( - "cannot update gitlink for the commit at branch: " - + args.destBranch); + "cannot update gitlink for the commit at branch: " + args.destBranch); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidationException.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidationException.java index 91c6a143d4..24ff37963c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidationException.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidationException.java @@ -15,7 +15,6 @@ package com.google.gerrit.server.git.validators; import com.google.gerrit.server.validators.ValidationException; - import java.util.Collections; import java.util.List; @@ -23,8 +22,7 @@ public class CommitValidationException extends ValidationException { private static final long serialVersionUID = 1L; private final List messages; - public CommitValidationException(String reason, - List messages) { + public CommitValidationException(String reason, List messages) { super(reason); this.messages = messages; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidationListener.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidationListener.java index 9d7b3e66af..d9fab05d11 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidationListener.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidationListener.java @@ -16,14 +16,13 @@ package com.google.gerrit.server.git.validators; import com.google.gerrit.extensions.annotations.ExtensionPoint; import com.google.gerrit.server.events.CommitReceivedEvent; - import java.util.List; /** * Listener to provide validation on received commits. * - * Invoked by Gerrit when a new commit is received, has passed basic Gerrit - * validation and can be then subject to extra validation checks. + *

Invoked by Gerrit when a new commit is received, has passed basic Gerrit validation and can be + * then subject to extra validation checks. */ @ExtensionPoint public interface CommitValidationListener { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidators.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidators.java index cb3809691c..1dd025f103 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidators.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidators.java @@ -42,9 +42,14 @@ import com.google.gerrit.server.ssh.SshInfo; import com.google.gerrit.server.util.MagicBranch; import com.google.inject.Inject; import com.google.inject.Singleton; - import com.jcraft.jsch.HostKey; - +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.regex.Pattern; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.PersonIdent; @@ -58,17 +63,8 @@ import org.eclipse.jgit.util.SystemReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.regex.Pattern; - public class CommitValidators { - private static final Logger log = LoggerFactory - .getLogger(CommitValidators.class); + private static final Logger log = LoggerFactory.getLogger(CommitValidators.class); public enum Policy { /** Use {@link Factory#forGerritCommits}. */ @@ -93,7 +89,8 @@ public class CommitValidators { private final String installCommitMsgHookCommand; @Inject - Factory(@GerritPersonIdent PersonIdent gerritIdent, + Factory( + @GerritPersonIdent PersonIdent gerritIdent, @CanonicalWebUrl @Nullable String canonicalWebUrl, @GerritServerConfig Config cfg, DynamicSet pluginValidators, @@ -102,12 +99,12 @@ public class CommitValidators { this.canonicalWebUrl = canonicalWebUrl; this.pluginValidators = pluginValidators; this.allUsers = allUsers; - this.installCommitMsgHookCommand = cfg != null - ? cfg.getString("gerrit", null, "installCommitMsgHookCommand") : null; + this.installCommitMsgHookCommand = + cfg != null ? cfg.getString("gerrit", null, "installCommitMsgHookCommand") : null; } - public CommitValidators create(Policy policy, RefControl refControl, - SshInfo sshInfo, Repository repo) throws IOException { + public CommitValidators create( + Policy policy, RefControl refControl, SshInfo sshInfo, Repository repo) throws IOException { switch (policy) { case RECEIVE_COMMITS: return forReceiveCommits(refControl, sshInfo, repo); @@ -122,37 +119,37 @@ public class CommitValidators { } } - private CommitValidators forReceiveCommits(RefControl refControl, - SshInfo sshInfo, Repository repo) throws IOException { + private CommitValidators forReceiveCommits( + RefControl refControl, SshInfo sshInfo, Repository repo) throws IOException { try (RevWalk rw = new RevWalk(repo)) { NoteMap rejectCommits = BanCommit.loadRejectCommitsMap(repo, rw); - return new CommitValidators(ImmutableList.of( - new UploadMergesPermissionValidator(refControl), - new AmendedGerritMergeCommitValidationListener( - refControl, gerritIdent), - new AuthorUploaderValidator(refControl, canonicalWebUrl), - new CommitterUploaderValidator(refControl, canonicalWebUrl), - new SignedOffByValidator(refControl), - new ChangeIdValidator(refControl, canonicalWebUrl, - installCommitMsgHookCommand, sshInfo), - new ConfigValidator(refControl, repo, allUsers), - new BannedCommitsValidator(rejectCommits), - new PluginCommitValidationListener(pluginValidators))); + return new CommitValidators( + ImmutableList.of( + new UploadMergesPermissionValidator(refControl), + new AmendedGerritMergeCommitValidationListener(refControl, gerritIdent), + new AuthorUploaderValidator(refControl, canonicalWebUrl), + new CommitterUploaderValidator(refControl, canonicalWebUrl), + new SignedOffByValidator(refControl), + new ChangeIdValidator( + refControl, canonicalWebUrl, installCommitMsgHookCommand, sshInfo), + new ConfigValidator(refControl, repo, allUsers), + new BannedCommitsValidator(rejectCommits), + new PluginCommitValidationListener(pluginValidators))); } } - private CommitValidators forGerritCommits(RefControl refControl, - SshInfo sshInfo, Repository repo) { - return new CommitValidators(ImmutableList.of( - new UploadMergesPermissionValidator(refControl), - new AmendedGerritMergeCommitValidationListener( - refControl, gerritIdent), - new AuthorUploaderValidator(refControl, canonicalWebUrl), - new SignedOffByValidator(refControl), - new ChangeIdValidator(refControl, canonicalWebUrl, - installCommitMsgHookCommand, sshInfo), - new ConfigValidator(refControl, repo, allUsers), - new PluginCommitValidationListener(pluginValidators))); + private CommitValidators forGerritCommits( + RefControl refControl, SshInfo sshInfo, Repository repo) { + return new CommitValidators( + ImmutableList.of( + new UploadMergesPermissionValidator(refControl), + new AmendedGerritMergeCommitValidationListener(refControl, gerritIdent), + new AuthorUploaderValidator(refControl, canonicalWebUrl), + new SignedOffByValidator(refControl), + new ChangeIdValidator( + refControl, canonicalWebUrl, installCommitMsgHookCommand, sshInfo), + new ConfigValidator(refControl, repo, allUsers), + new PluginCommitValidationListener(pluginValidators))); } private CommitValidators forMergedCommits(RefControl refControl) { @@ -169,10 +166,11 @@ public class CommitValidators { // discuss what to do about it. // - Plugin validators may do things like require certain commit message // formats, so we play it safe and exclude them. - return new CommitValidators(ImmutableList.of( - new UploadMergesPermissionValidator(refControl), - new AuthorUploaderValidator(refControl, canonicalWebUrl), - new CommitterUploaderValidator(refControl, canonicalWebUrl))); + return new CommitValidators( + ImmutableList.of( + new UploadMergesPermissionValidator(refControl), + new AuthorUploaderValidator(refControl, canonicalWebUrl), + new CommitterUploaderValidator(refControl, canonicalWebUrl))); } private CommitValidators none() { @@ -186,8 +184,8 @@ public class CommitValidators { this.validators = validators; } - public List validate( - CommitReceivedEvent receiveEvent) throws CommitValidationException { + public List validate(CommitReceivedEvent receiveEvent) + throws CommitValidationException { List messages = new ArrayList<>(); try { for (CommitValidationListener commitValidator : validators) { @@ -203,24 +201,19 @@ public class CommitValidators { public static class ChangeIdValidator implements CommitValidationListener { private static final int SHA1_LENGTH = 7; - private static final String CHANGE_ID_PREFIX = - FooterConstants.CHANGE_ID.getName() + ":"; + private static final String CHANGE_ID_PREFIX = FooterConstants.CHANGE_ID.getName() + ":"; private static final String MISSING_CHANGE_ID_MSG = - "[%s] missing " - + FooterConstants.CHANGE_ID.getName() - + " in commit message footer"; + "[%s] missing " + FooterConstants.CHANGE_ID.getName() + " in commit message footer"; private static final String MISSING_SUBJECT_MSG = "[%s] missing subject; " - + FooterConstants.CHANGE_ID.getName() - + " must be in commit message footer"; + + FooterConstants.CHANGE_ID.getName() + + " must be in commit message footer"; private static final String MULTIPLE_CHANGE_ID_MSG = - "[%s] multiple " - + FooterConstants.CHANGE_ID.getName() - + " lines in commit message footer"; + "[%s] multiple " + FooterConstants.CHANGE_ID.getName() + " lines in commit message footer"; private static final String INVALID_CHANGE_ID_MSG = "[%s] invalid " - + FooterConstants.CHANGE_ID.getName() + - " line format in commit message footer"; + + FooterConstants.CHANGE_ID.getName() + + " line format in commit message footer"; private static final Pattern CHANGE_ID = Pattern.compile(CHANGE_ID_PATTERN); private final ProjectControl projectControl; @@ -229,8 +222,11 @@ public class CommitValidators { private final SshInfo sshInfo; private final IdentifiedUser user; - public ChangeIdValidator(RefControl refControl, String canonicalWebUrl, - String installCommitMsgHookCommand, SshInfo sshInfo) { + public ChangeIdValidator( + RefControl refControl, + String canonicalWebUrl, + String installCommitMsgHookCommand, + SshInfo sshInfo) { this.projectControl = refControl.getProjectControl(); this.canonicalWebUrl = canonicalWebUrl; this.installCommitMsgHookCommand = installCommitMsgHookCommand; @@ -239,8 +235,8 @@ public class CommitValidators { } @Override - public List onCommitReceived( - CommitReceivedEvent receiveEvent) throws CommitValidationException { + public List onCommitReceived(CommitReceivedEvent receiveEvent) + throws CommitValidationException { if (!shouldValidateChangeId(receiveEvent)) { return Collections.emptyList(); } @@ -253,8 +249,9 @@ public class CommitValidators { if (projectControl.getProjectState().isRequireChangeID()) { String shortMsg = commit.getShortMessage(); if (shortMsg.startsWith(CHANGE_ID_PREFIX) - && CHANGE_ID.matcher(shortMsg.substring( - CHANGE_ID_PREFIX.length()).trim()).matches()) { + && CHANGE_ID + .matcher(shortMsg.substring(CHANGE_ID_PREFIX.length()).trim()) + .matches()) { String errMsg = String.format(MISSING_SUBJECT_MSG, sha1); throw new CommitValidationException(errMsg); } @@ -263,8 +260,7 @@ public class CommitValidators { throw new CommitValidationException(errMsg, messages); } } else if (idList.size() > 1) { - String errMsg = String.format( - MULTIPLE_CHANGE_ID_MSG, sha1); + String errMsg = String.format(MULTIPLE_CHANGE_ID_MSG, sha1); throw new CommitValidationException(errMsg, messages); } else { String v = idList.get(idList.size() - 1).trim(); @@ -272,8 +268,7 @@ public class CommitValidators { // Egit (I0000000000000000000000000000000000000000). if (!CHANGE_ID.matcher(v).matches() || v.matches("^I00*$")) { String errMsg = String.format(INVALID_CHANGE_ID_MSG, sha1); - messages.add( - getMissingChangeIdErrorMsg(errMsg, receiveEvent.commit)); + messages.add(getMissingChangeIdErrorMsg(errMsg, receiveEvent.commit)); throw new CommitValidationException(errMsg, messages); } } @@ -327,8 +322,8 @@ public class CommitValidators { if (hostKeys.isEmpty()) { String p = "${gitdir}/hooks/commit-msg"; return String.format( - " gitdir=$(git rev-parse --git-dir); curl -o %s %s/tools/hooks/commit-msg ; chmod +x %s", p, - getGerritUrl(canonicalWebUrl), p); + " gitdir=$(git rev-parse --git-dir); curl -o %s %s/tools/hooks/commit-msg ; chmod +x %s", + p, getGerritUrl(canonicalWebUrl), p); } // SSH keys exist, so the hook can be installed with scp. @@ -348,37 +343,34 @@ public class CommitValidators { sshPort = 22; } - return String.format(" gitdir=$(git rev-parse --git-dir); scp -p -P %d %s@%s:hooks/commit-msg ${gitdir}/hooks/", + return String.format( + " gitdir=$(git rev-parse --git-dir); scp -p -P %d %s@%s:hooks/commit-msg ${gitdir}/hooks/", sshPort, user.getUserName(), sshHost); } } - /** - * If this is the special project configuration branch, validate the config. - */ + /** If this is the special project configuration branch, validate the config. */ public static class ConfigValidator implements CommitValidationListener { private final RefControl refControl; private final Repository repo; private final AllUsersName allUsers; - public ConfigValidator(RefControl refControl, Repository repo, - AllUsersName allUsers) { + public ConfigValidator(RefControl refControl, Repository repo, AllUsersName allUsers) { this.refControl = refControl; this.repo = repo; this.allUsers = allUsers; } @Override - public List onCommitReceived( - CommitReceivedEvent receiveEvent) throws CommitValidationException { + public List onCommitReceived(CommitReceivedEvent receiveEvent) + throws CommitValidationException { IdentifiedUser currentUser = refControl.getUser().asIdentifiedUser(); if (REFS_CONFIG.equals(refControl.getRefName())) { List messages = new ArrayList<>(); try { - ProjectConfig cfg = - new ProjectConfig(receiveEvent.project.getNameKey()); + ProjectConfig cfg = new ProjectConfig(receiveEvent.project.getNameKey()); cfg.load(repo, receiveEvent.command.getNewId()); if (!cfg.getValidationErrors().isEmpty()) { addError("Invalid project configuration:", messages); @@ -388,17 +380,19 @@ public class CommitValidators { throw new ConfigInvalidException("invalid project configuration"); } } catch (ConfigInvalidException | IOException e) { - log.error("User " + currentUser.getUserName() - + " tried to push an invalid project configuration " - + receiveEvent.command.getNewId().name() + " for project " - + receiveEvent.project.getName(), e); - throw new CommitValidationException("invalid project configuration", - messages); + log.error( + "User " + + currentUser.getUserName() + + " tried to push an invalid project configuration " + + receiveEvent.command.getNewId().name() + + " for project " + + receiveEvent.project.getName(), + e); + throw new CommitValidationException("invalid project configuration", messages); } } - if (allUsers.equals( - refControl.getProjectControl().getProject().getNameKey()) + if (allUsers.equals(refControl.getProjectControl().getProject().getNameKey()) && RefNames.isRefsUsers(refControl.getRefName())) { List messages = new ArrayList<>(); Account.Id accountId = Account.Id.fromRef(refControl.getRefName()); @@ -414,12 +408,15 @@ public class CommitValidators { throw new ConfigInvalidException("invalid watch configuration"); } } catch (IOException | ConfigInvalidException e) { - log.error("User " + currentUser.getUserName() - + " tried to push an invalid watch configuration " - + receiveEvent.command.getNewId().name() + " for account " - + accountId.get(), e); - throw new CommitValidationException("invalid watch configuration", - messages); + log.error( + "User " + + currentUser.getUserName() + + " tried to push an invalid watch configuration " + + receiveEvent.command.getNewId().name() + + " for account " + + accountId.get(), + e); + throw new CommitValidationException("invalid watch configuration", messages); } } } @@ -429,8 +426,7 @@ public class CommitValidators { } /** Require permission to upload merges. */ - public static class UploadMergesPermissionValidator implements - CommitValidationListener { + public static class UploadMergesPermissionValidator implements CommitValidationListener { private final RefControl refControl; public UploadMergesPermissionValidator(RefControl refControl) { @@ -438,10 +434,9 @@ public class CommitValidators { } @Override - public List onCommitReceived( - CommitReceivedEvent receiveEvent) throws CommitValidationException { - if (receiveEvent.commit.getParentCount() > 1 - && !refControl.canUploadMerges()) { + public List onCommitReceived(CommitReceivedEvent receiveEvent) + throws CommitValidationException { + if (receiveEvent.commit.getParentCount() > 1 && !refControl.canUploadMerges()) { throw new CommitValidationException("you are not allowed to upload merges"); } return Collections.emptyList(); @@ -449,8 +444,7 @@ public class CommitValidators { } /** Execute commit validation plug-ins */ - public static class PluginCommitValidationListener implements - CommitValidationListener { + public static class PluginCommitValidationListener implements CommitValidationListener { private final DynamicSet commitValidationListeners; public PluginCommitValidationListener( @@ -459,8 +453,8 @@ public class CommitValidators { } @Override - public List onCommitReceived( - CommitReceivedEvent receiveEvent) throws CommitValidationException { + public List onCommitReceived(CommitReceivedEvent receiveEvent) + throws CommitValidationException { List messages = new ArrayList<>(); for (CommitValidationListener validator : commitValidationListeners) { @@ -483,8 +477,8 @@ public class CommitValidators { } @Override - public List onCommitReceived( - CommitReceivedEvent receiveEvent) throws CommitValidationException { + public List onCommitReceived(CommitReceivedEvent receiveEvent) + throws CommitValidationException { IdentifiedUser currentUser = refControl.getUser().asIdentifiedUser(); final PersonIdent committer = receiveEvent.commit.getCommitterIdent(); final PersonIdent author = receiveEvent.commit.getAuthorIdent(); @@ -504,8 +498,7 @@ public class CommitValidators { } } } - if (!sboAuthor && !sboCommitter && !sboMe - && !refControl.canForgeCommitter()) { + if (!sboAuthor && !sboCommitter && !sboMe && !refControl.canForgeCommitter()) { throw new CommitValidationException( "not Signed-off-by author/committer/uploader in commit message footer"); } @@ -515,8 +508,7 @@ public class CommitValidators { } /** Require that author matches the uploader. */ - public static class AuthorUploaderValidator implements - CommitValidationListener { + public static class AuthorUploaderValidator implements CommitValidationListener { private final RefControl refControl; private final String canonicalWebUrl; @@ -526,17 +518,17 @@ public class CommitValidators { } @Override - public List onCommitReceived( - CommitReceivedEvent receiveEvent) throws CommitValidationException { + public List onCommitReceived(CommitReceivedEvent receiveEvent) + throws CommitValidationException { IdentifiedUser currentUser = refControl.getUser().asIdentifiedUser(); final PersonIdent author = receiveEvent.commit.getAuthorIdent(); - if (!currentUser.hasEmailAddress(author.getEmailAddress()) - && !refControl.canForgeAuthor()) { + if (!currentUser.hasEmailAddress(author.getEmailAddress()) && !refControl.canForgeAuthor()) { List messages = new ArrayList<>(); - messages.add(getInvalidEmailError(receiveEvent.commit, "author", author, - currentUser, canonicalWebUrl)); + messages.add( + getInvalidEmailError( + receiveEvent.commit, "author", author, currentUser, canonicalWebUrl)); throw new CommitValidationException("invalid author", messages); } return Collections.emptyList(); @@ -544,27 +536,26 @@ public class CommitValidators { } /** Require that committer matches the uploader. */ - public static class CommitterUploaderValidator implements - CommitValidationListener { + public static class CommitterUploaderValidator implements CommitValidationListener { private final RefControl refControl; private final String canonicalWebUrl; - public CommitterUploaderValidator(RefControl refControl, - String canonicalWebUrl) { + public CommitterUploaderValidator(RefControl refControl, String canonicalWebUrl) { this.refControl = refControl; this.canonicalWebUrl = canonicalWebUrl; } @Override - public List onCommitReceived( - CommitReceivedEvent receiveEvent) throws CommitValidationException { + public List onCommitReceived(CommitReceivedEvent receiveEvent) + throws CommitValidationException { IdentifiedUser currentUser = refControl.getUser().asIdentifiedUser(); final PersonIdent committer = receiveEvent.commit.getCommitterIdent(); if (!currentUser.hasEmailAddress(committer.getEmailAddress()) && !refControl.canForgeCommitter()) { List messages = new ArrayList<>(); - messages.add(getInvalidEmailError(receiveEvent.commit, "committer", committer, - currentUser, canonicalWebUrl)); + messages.add( + getInvalidEmailError( + receiveEvent.commit, "committer", committer, currentUser, canonicalWebUrl)); throw new CommitValidationException("invalid committer", messages); } return Collections.emptyList(); @@ -572,12 +563,11 @@ public class CommitValidators { } /** - * Don't allow the user to amend a merge created by Gerrit Code Review. This - * seems to happen all too often, due to users not paying any attention to - * what they are doing. + * Don't allow the user to amend a merge created by Gerrit Code Review. This seems to happen all + * too often, due to users not paying any attention to what they are doing. */ - public static class AmendedGerritMergeCommitValidationListener implements - CommitValidationListener { + public static class AmendedGerritMergeCommitValidationListener + implements CommitValidationListener { private final PersonIdent gerritIdent; private final RefControl refControl; @@ -588,8 +578,8 @@ public class CommitValidators { } @Override - public List onCommitReceived( - CommitReceivedEvent receiveEvent) throws CommitValidationException { + public List onCommitReceived(CommitReceivedEvent receiveEvent) + throws CommitValidationException { final PersonIdent author = receiveEvent.commit.getAuthorIdent(); if (receiveEvent.commit.getParentCount() > 1 @@ -603,8 +593,7 @@ public class CommitValidators { } /** Reject banned commits. */ - public static class BannedCommitsValidator implements - CommitValidationListener { + public static class BannedCommitsValidator implements CommitValidationListener { private final NoteMap rejectCommits; public BannedCommitsValidator(NoteMap rejectCommits) { @@ -612,12 +601,12 @@ public class CommitValidators { } @Override - public List onCommitReceived( - CommitReceivedEvent receiveEvent) throws CommitValidationException { + public List onCommitReceived(CommitReceivedEvent receiveEvent) + throws CommitValidationException { try { if (rejectCommits.contains(receiveEvent.commit)) { - throw new CommitValidationException("contains banned commit " - + receiveEvent.commit.getName()); + throw new CommitValidationException( + "contains banned commit " + receiveEvent.commit.getName()); } return Collections.emptyList(); } catch (IOException e) { @@ -628,13 +617,20 @@ public class CommitValidators { } } - private static CommitValidationMessage getInvalidEmailError(RevCommit c, String type, - PersonIdent who, IdentifiedUser currentUser, String canonicalWebUrl) { + private static CommitValidationMessage getInvalidEmailError( + RevCommit c, + String type, + PersonIdent who, + IdentifiedUser currentUser, + String canonicalWebUrl) { StringBuilder sb = new StringBuilder(); sb.append("\n"); sb.append("ERROR: In commit ").append(c.name()).append("\n"); - sb.append("ERROR: ").append(type).append(" email address ") - .append(who.getEmailAddress()).append("\n"); + sb.append("ERROR: ") + .append(type) + .append(" email address ") + .append(who.getEmailAddress()) + .append("\n"); sb.append("ERROR: does not match your user account.\n"); sb.append("ERROR:\n"); if (currentUser.getEmailAddresses().isEmpty()) { @@ -648,8 +644,11 @@ public class CommitValidators { sb.append("ERROR:\n"); if (canonicalWebUrl != null) { sb.append("ERROR: To register an email address, please visit:\n"); - sb.append("ERROR: ").append(canonicalWebUrl).append("#") - .append(PageLinks.SETTINGS_CONTACT).append("\n"); + sb.append("ERROR: ") + .append(canonicalWebUrl) + .append("#") + .append(PageLinks.SETTINGS_CONTACT) + .append("\n"); } sb.append("\n"); return new CommitValidationMessage(sb.toString(), false); @@ -658,9 +657,9 @@ public class CommitValidators { /** * Get the Gerrit URL. * - * @return the canonical URL (with any trailing slash removed) if it is - * configured, otherwise fall back to "http://hostname" where hostname - * is the value returned by {@link #getGerritHost(String)}. + * @return the canonical URL (with any trailing slash removed) if it is configured, otherwise fall + * back to "http://hostname" where hostname is the value returned by {@link + * #getGerritHost(String)}. */ private static String getGerritUrl(String canonicalWebUrl) { if (canonicalWebUrl != null) { @@ -672,8 +671,8 @@ public class CommitValidators { /** * Get the Gerrit hostname. * - * @return the hostname from the canonical URL if it is configured, otherwise - * whatever the OS says the hostname is. + * @return the hostname from the canonical URL if it is configured, otherwise whatever the OS says + * the hostname is. */ private static String getGerritHost(String canonicalWebUrl) { String host; @@ -689,8 +688,7 @@ public class CommitValidators { return host; } - private static void addError(String error, - List messages) { + private static void addError(String error, List messages) { messages.add(new CommitValidationMessage(error, true)); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/MergeValidationException.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/MergeValidationException.java index 018ec1bc20..3624fe03a2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/MergeValidationException.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/MergeValidationException.java @@ -18,9 +18,9 @@ import com.google.gerrit.server.validators.ValidationException; /** * Exception that occurs during a validation step before merging changes. - *

- * Used by {@link MergeValidationListener}s provided by plugins. Messages should - * be considered human-readable. + * + *

Used by {@link MergeValidationListener}s provided by plugins. Messages should be considered + * human-readable. */ public class MergeValidationException extends ValidationException { private static final long serialVersionUID = 1L; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/MergeValidationListener.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/MergeValidationListener.java index d89d3b3abd..6edd04eeff 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/MergeValidationListener.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/MergeValidationListener.java @@ -20,13 +20,12 @@ import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.git.CodeReviewCommit; import com.google.gerrit.server.project.ProjectState; - import org.eclipse.jgit.lib.Repository; /** * Listener to provide validation of commits before merging. * - * Invoked by Gerrit before a commit is merged. + *

Invoked by Gerrit before a commit is merged. */ @ExtensionPoint public interface MergeValidationListener { @@ -41,7 +40,8 @@ public interface MergeValidationListener { * @param caller the user who initiated the merge request * @throws MergeValidationException if the commit fails to validate */ - void onPreMerge(Repository repo, + void onPreMerge( + Repository repo, CodeReviewCommit commit, ProjectState destProject, Branch.NameKey destBranch, diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/MergeValidators.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/MergeValidators.java index 17a92ab8d8..a84ab3167c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/MergeValidators.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/MergeValidators.java @@ -32,12 +32,10 @@ import com.google.gerrit.server.git.ProjectConfig; import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.project.ProjectState; import com.google.inject.Inject; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.Repository; - import java.io.IOException; import java.util.List; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.Repository; public class MergeValidators { private final DynamicSet mergeValidationListeners; @@ -48,50 +46,50 @@ public class MergeValidators { } @Inject - MergeValidators(DynamicSet mergeValidationListeners, + MergeValidators( + DynamicSet mergeValidationListeners, ProjectConfigValidator.Factory projectConfigValidatorFactory) { this.mergeValidationListeners = mergeValidationListeners; this.projectConfigValidatorFactory = projectConfigValidatorFactory; } - public void validatePreMerge(Repository repo, + public void validatePreMerge( + Repository repo, CodeReviewCommit commit, ProjectState destProject, Branch.NameKey destBranch, PatchSet.Id patchSetId, IdentifiedUser caller) throws MergeValidationException { - List validators = ImmutableList.of( - new PluginMergeValidationListener(mergeValidationListeners), - projectConfigValidatorFactory.create()); + List validators = + ImmutableList.of( + new PluginMergeValidationListener(mergeValidationListeners), + projectConfigValidatorFactory.create()); for (MergeValidationListener validator : validators) { - validator.onPreMerge(repo, commit, destProject, destBranch, patchSetId, - caller); + validator.onPreMerge(repo, commit, destProject, destBranch, patchSetId, caller); } } - public static class ProjectConfigValidator implements - MergeValidationListener { + public static class ProjectConfigValidator implements MergeValidationListener { private static final String INVALID_CONFIG = "Change contains an invalid project configuration."; private static final String PARENT_NOT_FOUND = - "Change contains an invalid project configuration:\n" - + "Parent project does not exist."; + "Change contains an invalid project configuration:\n" + "Parent project does not exist."; private static final String PLUGIN_VALUE_NOT_EDITABLE = "Change contains an invalid project configuration:\n" - + "One of the plugin configuration parameters is not editable."; + + "One of the plugin configuration parameters is not editable."; private static final String PLUGIN_VALUE_NOT_PERMITTED = "Change contains an invalid project configuration:\n" - + "One of the plugin configuration parameters has a value that is not" - + " permitted."; + + "One of the plugin configuration parameters has a value that is not" + + " permitted."; private static final String ROOT_NO_PARENT = "Change contains an invalid project configuration:\n" - + "The root project cannot have a parent."; + + "The root project cannot have a parent."; private static final String SET_BY_ADMIN = "Change contains a project configuration that changes the parent" - + " project.\n" - + "The change must be submitted by a Gerrit administrator."; + + " project.\n" + + "The change must be submitted by a Gerrit administrator."; private final AllProjectsName allProjectsName; private final ProjectCache projectCache; @@ -102,7 +100,8 @@ public class MergeValidators { } @Inject - public ProjectConfigValidator(AllProjectsName allProjectsName, + public ProjectConfigValidator( + AllProjectsName allProjectsName, ProjectCache projectCache, DynamicMap pluginConfigEntries) { this.allProjectsName = allProjectsName; @@ -111,7 +110,8 @@ public class MergeValidators { } @Override - public void onPreMerge(final Repository repo, + public void onPreMerge( + final Repository repo, final CodeReviewCommit commit, final ProjectState destProject, final Branch.NameKey destBranch, @@ -121,12 +121,10 @@ public class MergeValidators { if (RefNames.REFS_CONFIG.equals(destBranch.get())) { final Project.NameKey newParent; try { - ProjectConfig cfg = - new ProjectConfig(destProject.getProject().getNameKey()); + ProjectConfig cfg = new ProjectConfig(destProject.getProject().getNameKey()); cfg.load(repo, commit); newParent = cfg.getProject().getParent(allProjectsName); - final Project.NameKey oldParent = - destProject.getProject().getParent(allProjectsName); + final Project.NameKey oldParent = destProject.getProject().getParent(allProjectsName); if (oldParent == null) { // update of the 'All-Projects' project if (newParent != null) { @@ -149,17 +147,20 @@ public class MergeValidators { ProjectConfigEntry configEntry = e.getProvider().get(); String value = pluginCfg.getString(e.getExportName()); - String oldValue = destProject.getConfig() - .getPluginConfig(e.getPluginName()) - .getString(e.getExportName()); + String oldValue = + destProject + .getConfig() + .getPluginConfig(e.getPluginName()) + .getString(e.getExportName()); - if ((value == null ? oldValue != null : !value.equals(oldValue)) && - !configEntry.isEditable(destProject)) { + if ((value == null ? oldValue != null : !value.equals(oldValue)) + && !configEntry.isEditable(destProject)) { throw new MergeValidationException(PLUGIN_VALUE_NOT_EDITABLE); } if (ProjectConfigEntryType.LIST.equals(configEntry.getType()) - && value != null && !configEntry.getPermittedValues().contains(value)) { + && value != null + && !configEntry.getPermittedValues().contains(value)) { throw new MergeValidationException(PLUGIN_VALUE_NOT_PERMITTED); } } @@ -171,8 +172,7 @@ public class MergeValidators { } /** Execute merge validation plug-ins */ - public static class PluginMergeValidationListener implements - MergeValidationListener { + public static class PluginMergeValidationListener implements MergeValidationListener { private final DynamicSet mergeValidationListeners; public PluginMergeValidationListener( @@ -181,7 +181,8 @@ public class MergeValidators { } @Override - public void onPreMerge(Repository repo, + public void onPreMerge( + Repository repo, CodeReviewCommit commit, ProjectState destProject, Branch.NameKey destBranch, @@ -189,8 +190,7 @@ public class MergeValidators { IdentifiedUser caller) throws MergeValidationException { for (MergeValidationListener validator : mergeValidationListeners) { - validator.onPreMerge(repo, commit, destProject, destBranch, patchSetId, - caller); + validator.onPreMerge(repo, commit, destProject, destBranch, patchSetId, caller); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/OnSubmitValidationListener.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/OnSubmitValidationListener.java index c736320fb4..da3c123863 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/OnSubmitValidationListener.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/OnSubmitValidationListener.java @@ -17,23 +17,21 @@ import com.google.gerrit.extensions.annotations.ExtensionPoint; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.reviewdb.client.Project.NameKey; import com.google.gerrit.server.validators.ValidationException; - +import java.util.Map; import org.eclipse.jgit.lib.ObjectReader; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.transport.ReceiveCommand; -import java.util.Map; - /** * Listener to validate ref updates performed during submit operation. * - * As submit strategies may generate new commits (e.g. Cherry Pick), this - * listener allows validation of resulting new commit before destination branch - * is updated and new patchset ref is created. + *

As submit strategies may generate new commits (e.g. Cherry Pick), this listener allows + * validation of resulting new commit before destination branch is updated and new patchset ref is + * created. * - * If you only care about validating the change being submitted and not the - * resulting new commit, consider using {@link MergeValidationListener} instead. + *

If you only care about validating the change being submitted and not the resulting new commit, + * consider using {@link MergeValidationListener} instead. */ @ExtensionPoint public interface OnSubmitValidationListener { @@ -43,8 +41,11 @@ public interface OnSubmitValidationListener { private ObjectReader objectReader; private Map commands; - public Arguments(NameKey project, Repository repository, - ObjectReader objectReader, Map commands) { + public Arguments( + NameKey project, + Repository repository, + ObjectReader objectReader, + Map commands) { this.project = project; this.repository = repository; this.objectReader = objectReader; @@ -55,9 +56,7 @@ public interface OnSubmitValidationListener { return project; } - /** - * @return a read only repository - */ + /** @return a read only repository */ public Repository getRepository() { return repository; } @@ -67,19 +66,18 @@ public interface OnSubmitValidationListener { } /** - * @return a map from ref to op on it covering all ref ops to be performed - * on this repository as part of ongoing submit operation. + * @return a map from ref to op on it covering all ref ops to be performed on this repository as + * part of ongoing submit operation. */ - public Map getCommands(){ + public Map getCommands() { return commands; } } /** - * Called right before branch is updated with new commit or commits as a - * result of submit. + * Called right before branch is updated with new commit or commits as a result of submit. * - * If ValidationException is thrown, submitting is aborted. + *

If ValidationException is thrown, submitting is aborted. */ void preBranchUpdate(Arguments args) throws ValidationException; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/OnSubmitValidators.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/OnSubmitValidators.java index 568c5972ff..55935d121a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/OnSubmitValidators.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/OnSubmitValidators.java @@ -19,13 +19,11 @@ import com.google.gerrit.server.git.IntegrationException; import com.google.gerrit.server.git.validators.OnSubmitValidationListener.Arguments; import com.google.gerrit.server.validators.ValidationException; import com.google.inject.Inject; - +import java.util.Map; import org.eclipse.jgit.lib.ObjectReader; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.transport.ReceiveCommand; -import java.util.Map; - public class OnSubmitValidators { public interface Factory { OnSubmitValidators create(); @@ -38,13 +36,15 @@ public class OnSubmitValidators { this.listeners = listeners; } - public void validate(Project.NameKey project, Repository repo, - ObjectReader objectReader, Map commands) + public void validate( + Project.NameKey project, + Repository repo, + ObjectReader objectReader, + Map commands) throws IntegrationException { try { for (OnSubmitValidationListener listener : this.listeners) { - listener.preBranchUpdate( - new Arguments(project, repo, objectReader, commands)); + listener.preBranchUpdate(new Arguments(project, repo, objectReader, commands)); } } catch (ValidationException e) { throw new IntegrationException(e.getMessage()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/RefOperationValidationException.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/RefOperationValidationException.java index 5864833942..9eaf2d2629 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/RefOperationValidationException.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/RefOperationValidationException.java @@ -20,8 +20,7 @@ public class RefOperationValidationException extends ValidationException { private static final long serialVersionUID = 1L; private final Iterable messages; - public RefOperationValidationException(String reason, - Iterable messages) { + public RefOperationValidationException(String reason, Iterable messages) { super(reason); this.messages = messages; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/RefOperationValidationListener.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/RefOperationValidationListener.java index 5d04e2a3b8..b57b254c94 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/RefOperationValidationListener.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/RefOperationValidationListener.java @@ -16,13 +16,9 @@ package com.google.gerrit.server.git.validators; import com.google.gerrit.extensions.annotations.ExtensionPoint; import com.google.gerrit.server.events.RefReceivedEvent; import com.google.gerrit.server.validators.ValidationException; - import java.util.List; -/** - * Listener to provide validation on operation that is going to be performed on - * given ref - */ +/** Listener to provide validation on operation that is going to be performed on given ref */ @ExtensionPoint public interface RefOperationValidationListener { /** @@ -32,6 +28,5 @@ public interface RefOperationValidationListener { * @return empty list or informational messages on success * @throws ValidationException if the ref operation fails to validate */ - List onRefOperation(RefReceivedEvent refEvent) - throws ValidationException; + List onRefOperation(RefReceivedEvent refEvent) throws ValidationException; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/RefOperationValidators.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/RefOperationValidators.java index 769c7d27ac..3641076b09 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/RefOperationValidators.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/RefOperationValidators.java @@ -22,27 +22,24 @@ import com.google.gerrit.server.events.RefReceivedEvent; import com.google.gerrit.server.validators.ValidationException; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - +import java.util.ArrayList; +import java.util.List; import org.eclipse.jgit.lib.RefUpdate; import org.eclipse.jgit.transport.ReceiveCommand; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.ArrayList; -import java.util.List; - public class RefOperationValidators { private static final GetErrorMessages GET_ERRORS = new GetErrorMessages(); - private static final Logger LOG = LoggerFactory - .getLogger(RefOperationValidators.class); + private static final Logger LOG = LoggerFactory.getLogger(RefOperationValidators.class); public interface Factory { RefOperationValidators create(Project project, IdentifiedUser user, ReceiveCommand cmd); } public static ReceiveCommand getCommand(RefUpdate update, ReceiveCommand.Type type) { - return new ReceiveCommand(update.getOldObjectId(), update.getNewObjectId(), - update.getName(), type); + return new ReceiveCommand( + update.getOldObjectId(), update.getNewObjectId(), update.getName(), type); } private final RefReceivedEvent event; @@ -51,7 +48,8 @@ public class RefOperationValidators { @Inject RefOperationValidators( DynamicSet refOperationValidationListeners, - @Assisted Project project, @Assisted IdentifiedUser user, + @Assisted Project project, + @Assisted IdentifiedUser user, @Assisted ReceiveCommand cmd) { this.refOperationValidationListeners = refOperationValidationListeners; event = new RefReceivedEvent(); @@ -60,8 +58,7 @@ public class RefOperationValidators { event.user = user; } - public List validateForRefOperation() - throws RefOperationValidationException { + public List validateForRefOperation() throws RefOperationValidationException { List messages = new ArrayList<>(); boolean withException = false; @@ -81,12 +78,13 @@ public class RefOperationValidators { return messages; } - private void throwException(Iterable messages, - RefReceivedEvent event) throws RefOperationValidationException { + private void throwException(Iterable messages, RefReceivedEvent event) + throws RefOperationValidationException { Iterable errors = Iterables.filter(messages, GET_ERRORS); - String header = String.format( - "Ref \"%s\" %S in project %s validation failed", event.command.getRefName(), - event.command.getType(), event.project.getName()); + String header = + String.format( + "Ref \"%s\" %S in project %s validation failed", + event.command.getRefName(), event.command.getType(), event.project.getName()); LOG.error(header); throw new RefOperationValidationException(header, errors); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/UploadValidationListener.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/UploadValidationListener.java index e6923c145d..971f455b1c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/UploadValidationListener.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/UploadValidationListener.java @@ -17,21 +17,18 @@ package com.google.gerrit.server.git.validators; import com.google.gerrit.extensions.annotations.ExtensionPoint; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.validators.ValidationException; - +import java.util.Collection; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.transport.UploadPack; -import java.util.Collection; - /** * Listener to provide validation for upload operations. * - * Invoked by Gerrit before it begins to send a pack to the client. + *

Invoked by Gerrit before it begins to send a pack to the client. * - * Implementors can block the upload operation by throwing a - * ValidationException. The exception's message text will be reported to - * the end-user over the client's protocol connection. + *

Implementors can block the upload operation by throwing a ValidationException. The exception's + * message text will be reported to the end-user over the client's protocol connection. */ @ExtensionPoint public interface UploadValidationListener { @@ -42,17 +39,20 @@ public interface UploadValidationListener { * @param repository The repository * @param project The project * @param remoteHost Remote address/hostname of the user - * @param wants The list of wanted objects. These may be RevObject or - * RevCommit if the processor parsed them. Implementors should not rely - * on the values being parsed. - * @param haves The list of common objects. Empty on an initial clone request. - * These may be RevObject or RevCommit if the processor parsed them. - * Implementors should not rely on the values being parsed. - * @throws ValidationException to block the upload and send a message - * back to the end-user over the client's protocol connection. + * @param wants The list of wanted objects. These may be RevObject or RevCommit if the processor + * parsed them. Implementors should not rely on the values being parsed. + * @param haves The list of common objects. Empty on an initial clone request. These may be + * RevObject or RevCommit if the processor parsed them. Implementors should not rely on the + * values being parsed. + * @throws ValidationException to block the upload and send a message back to the end-user over + * the client's protocol connection. */ - void onPreUpload(Repository repository, Project project, - String remoteHost, UploadPack up, Collection wants, + void onPreUpload( + Repository repository, + Project project, + String remoteHost, + UploadPack up, + Collection wants, Collection haves) throws ValidationException; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/UploadValidators.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/UploadValidators.java index eb2e136924..52b76e8559 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/UploadValidators.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/UploadValidators.java @@ -19,15 +19,13 @@ import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.validators.ValidationException; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - +import java.util.Collection; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.transport.PreUploadHook; import org.eclipse.jgit.transport.ServiceMayNotContinueException; import org.eclipse.jgit.transport.UploadPack; -import java.util.Collection; - public class UploadValidators implements PreUploadHook { private final DynamicSet uploadValidationListeners; @@ -36,14 +34,14 @@ public class UploadValidators implements PreUploadHook { private final String remoteHost; public interface Factory { - UploadValidators create(Project project, Repository repository, - String remoteAddress); + UploadValidators create(Project project, Repository repository, String remoteAddress); } @Inject UploadValidators( DynamicSet uploadValidationListeners, - @Assisted Project project, @Assisted Repository repository, + @Assisted Project project, + @Assisted Repository repository, @Assisted String remoteHost) { this.uploadValidationListeners = uploadValidationListeners; this.project = project; @@ -52,8 +50,8 @@ public class UploadValidators implements PreUploadHook { } @Override - public void onSendPack(UploadPack up, Collection wants, - Collection haves) + public void onSendPack( + UploadPack up, Collection wants, Collection haves) throws ServiceMayNotContinueException { for (UploadValidationListener validator : uploadValidationListeners) { try { @@ -61,19 +59,20 @@ public class UploadValidators implements PreUploadHook { } catch (ValidationException e) { throw new UploadValidationException(e.getMessage()); } - } } @Override - public void onBeginNegotiateRound(UploadPack up, - Collection wants, int cntOffered) - throws ServiceMayNotContinueException { - } + public void onBeginNegotiateRound( + UploadPack up, Collection wants, int cntOffered) + throws ServiceMayNotContinueException {} @Override - public void onEndNegotiateRound(UploadPack up, - Collection wants, int cntCommon, int cntNotFound, - boolean ready) throws ServiceMayNotContinueException { - } + public void onEndNegotiateRound( + UploadPack up, + Collection wants, + int cntCommon, + int cntNotFound, + boolean ready) + throws ServiceMayNotContinueException {} } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/AddIncludedGroups.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/AddIncludedGroups.java index 84d1fada8f..040550ce43 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/AddIncludedGroups.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/AddIncludedGroups.java @@ -37,7 +37,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -46,8 +45,7 @@ import java.util.Map; @Singleton public class AddIncludedGroups implements RestModifyView { public static class Input { - @DefaultInput - String _oneGroup; + @DefaultInput String _oneGroup; public List groups; @@ -78,9 +76,12 @@ public class AddIncludedGroups implements RestModifyView { private final AuditService auditService; @Inject - public AddIncludedGroups(GroupsCollection groupsCollection, - GroupIncludeCache groupIncludeCache, Provider db, - GroupJson json, AuditService auditService) { + public AddIncludedGroups( + GroupsCollection groupsCollection, + GroupIncludeCache groupIncludeCache, + Provider db, + GroupJson json, + AuditService auditService) { this.groupsCollection = groupsCollection; this.groupIncludeCache = groupIncludeCache; this.db = db; @@ -90,8 +91,7 @@ public class AddIncludedGroups implements RestModifyView { @Override public List apply(GroupResource resource, Input input) - throws MethodNotAllowedException, AuthException, - UnprocessableEntityException, OrmException { + throws MethodNotAllowedException, AuthException, UnprocessableEntityException, OrmException { AccountGroup group = resource.toAccountGroup(); if (group == null) { throw new MethodNotAllowedException(); @@ -106,14 +106,11 @@ public class AddIncludedGroups implements RestModifyView { for (String includedGroup : input.groups) { GroupDescription.Basic d = groupsCollection.parse(includedGroup); if (!control.canAddGroup()) { - throw new AuthException(String.format("Cannot add group: %s", - d.getName())); + throw new AuthException(String.format("Cannot add group: %s", d.getName())); } if (!newIncludedGroups.containsKey(d.getGroupUUID())) { - AccountGroupById.Key agiKey = - new AccountGroupById.Key(group.getId(), - d.getGroupUUID()); + AccountGroupById.Key agiKey = new AccountGroupById.Key(group.getId(), d.getGroupUUID()); AccountGroupById agi = db.get().accountGroupById().get(agiKey); if (agi == null) { agi = new AccountGroupById(agiKey); @@ -136,8 +133,7 @@ public class AddIncludedGroups implements RestModifyView { } static class PutIncludedGroup implements RestModifyView { - static class Input { - } + static class Input {} private final AddIncludedGroups put; private final String id; @@ -149,8 +145,7 @@ public class AddIncludedGroups implements RestModifyView { @Override public GroupInfo apply(GroupResource resource, Input input) - throws AuthException, MethodNotAllowedException, - ResourceNotFoundException, OrmException { + throws AuthException, MethodNotAllowedException, ResourceNotFoundException, OrmException { AddIncludedGroups.Input in = new AddIncludedGroups.Input(); in.groups = ImmutableList.of(id); try { @@ -166,7 +161,8 @@ public class AddIncludedGroups implements RestModifyView { } @Singleton - static class UpdateIncludedGroup implements RestModifyView { + static class UpdateIncludedGroup + implements RestModifyView { private final Provider get; @Inject @@ -175,8 +171,8 @@ public class AddIncludedGroups implements RestModifyView { } @Override - public GroupInfo apply(IncludedGroupResource resource, - PutIncludedGroup.Input input) throws OrmException { + public GroupInfo apply(IncludedGroupResource resource, PutIncludedGroup.Input input) + throws OrmException { // Do nothing, the group is already included. return get.get().apply(resource); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/AddMembers.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/AddMembers.java index 55bb1e9c4b..5c1a292cde 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/AddMembers.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/AddMembers.java @@ -44,7 +44,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; import java.util.ArrayList; import java.util.Collection; @@ -57,10 +56,10 @@ import java.util.Set; @Singleton public class AddMembers implements RestModifyView { public static class Input { - @DefaultInput - String _oneMember; + @DefaultInput String _oneMember; List members; + public static Input fromMembers(List members) { Input in = new Input(); in.members = members; @@ -92,7 +91,8 @@ public class AddMembers implements RestModifyView { private final AuditService auditService; @Inject - AddMembers(Provider self, + AddMembers( + Provider self, AccountManager accountManager, AuthConfig authConfig, AccountsCollection accounts, @@ -114,8 +114,8 @@ public class AddMembers implements RestModifyView { @Override public List apply(GroupResource resource, Input input) - throws AuthException, MethodNotAllowedException, - UnprocessableEntityException, OrmException, IOException { + throws AuthException, MethodNotAllowedException, UnprocessableEntityException, OrmException, + IOException { AccountGroup internalGroup = resource.toAccountGroup(); if (internalGroup == null) { throw new MethodNotAllowedException(); @@ -128,8 +128,8 @@ public class AddMembers implements RestModifyView { for (String nameOrEmailOrId : input.members) { Account a = findAccount(nameOrEmailOrId); if (!a.isActive()) { - throw new UnprocessableEntityException(String.format( - "Account Inactive: %s", nameOrEmailOrId)); + throw new UnprocessableEntityException( + String.format("Account Inactive: %s", nameOrEmailOrId)); } if (!control.canAddMember()) { @@ -142,8 +142,8 @@ public class AddMembers implements RestModifyView { return toAccountInfoList(newMemberIds); } - Account findAccount(String nameOrEmailOrId) throws AuthException, - UnprocessableEntityException, OrmException, IOException { + Account findAccount(String nameOrEmailOrId) + throws AuthException, UnprocessableEntityException, OrmException, IOException { try { return accounts.parse(nameOrEmailOrId).getAccount(); } catch (UnprocessableEntityException e) { @@ -174,14 +174,12 @@ public class AddMembers implements RestModifyView { } } - public void addMembers(AccountGroup.Id groupId, - Collection newMemberIds) - throws OrmException, IOException { + public void addMembers(AccountGroup.Id groupId, Collection newMemberIds) + throws OrmException, IOException { Map newAccountGroupMembers = new HashMap<>(); for (Account.Id accId : newMemberIds) { if (!newAccountGroupMembers.containsKey(accId)) { - AccountGroupMember.Key key = - new AccountGroupMember.Key(accId, groupId); + AccountGroupMember.Key key = new AccountGroupMember.Key(accId, groupId); AccountGroupMember m = db.get().accountGroupMembers().get(key); if (m == null) { m = new AccountGroupMember(key); @@ -190,8 +188,8 @@ public class AddMembers implements RestModifyView { } } if (!newAccountGroupMembers.isEmpty()) { - auditService.dispatchAddAccountsToGroup(self.get().getAccountId(), - newAccountGroupMembers.values()); + auditService.dispatchAddAccountsToGroup( + self.get().getAccountId(), newAccountGroupMembers.values()); db.get().accountGroupMembers().insert(newAccountGroupMembers.values()); for (AccountGroupMember m : newAccountGroupMembers.values()) { accountCache.evict(m.getAccountId()); @@ -207,15 +205,13 @@ public class AddMembers implements RestModifyView { try { AuthRequest req = AuthRequest.forUser(user); req.setSkipAuthentication(true); - return accountCache.get(accountManager.authenticate(req).getAccountId()) - .getAccount(); + return accountCache.get(accountManager.authenticate(req).getAccountId()).getAccount(); } catch (AccountException e) { return null; } } - private List toAccountInfoList(Set accountIds) - throws OrmException { + private List toAccountInfoList(Set accountIds) throws OrmException { List result = new ArrayList<>(); AccountLoader loader = infoFactory.create(true); for (Account.Id accId : accountIds) { @@ -226,8 +222,7 @@ public class AddMembers implements RestModifyView { } static class PutMember implements RestModifyView { - static class Input { - } + static class Input {} private final AddMembers put; private final String id; @@ -239,8 +234,8 @@ public class AddMembers implements RestModifyView { @Override public AccountInfo apply(GroupResource resource, PutMember.Input input) - throws AuthException, MethodNotAllowedException, - ResourceNotFoundException, OrmException, IOException { + throws AuthException, MethodNotAllowedException, ResourceNotFoundException, OrmException, + IOException { AddMembers.Input in = new AddMembers.Input(); in._oneMember = id; try { @@ -265,8 +260,7 @@ public class AddMembers implements RestModifyView { } @Override - public AccountInfo apply(MemberResource resource, PutMember.Input input) - throws OrmException { + public AccountInfo apply(MemberResource resource, PutMember.Input input) throws OrmException { // Do nothing, the user is already a member. return get.apply(resource); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/CreateGroup.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/CreateGroup.java index 70fc7f6959..4d78a7df85 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/CreateGroup.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/CreateGroup.java @@ -48,16 +48,14 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; - -import org.eclipse.jgit.lib.Config; -import org.eclipse.jgit.lib.PersonIdent; - import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Locale; +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.lib.PersonIdent; @RequiresCapability(GlobalCapability.CREATE_GROUP) public class CreateGroup implements RestModifyView { @@ -116,7 +114,7 @@ public class CreateGroup implements RestModifyView @Override public GroupInfo apply(TopLevelResource resource, GroupInput input) throws AuthException, BadRequestException, UnprocessableEntityException, - ResourceConflictException, OrmException, IOException { + ResourceConflictException, OrmException, IOException { if (input == null) { input = new GroupInput(); } @@ -128,24 +126,24 @@ public class CreateGroup implements RestModifyView CreateGroupArgs args = new CreateGroupArgs(); args.setGroupName(name); args.groupDescription = Strings.emptyToNull(input.description); - args.visibleToAll = MoreObjects.firstNonNull(input.visibleToAll, - defaultVisibleToAll); + args.visibleToAll = MoreObjects.firstNonNull(input.visibleToAll, defaultVisibleToAll); args.ownerGroupId = ownerId; if (input.members != null && !input.members.isEmpty()) { List members = new ArrayList<>(); for (String nameOrEmailOrId : input.members) { Account a = addMembers.findAccount(nameOrEmailOrId); if (!a.isActive()) { - throw new UnprocessableEntityException(String.format( - "Account Inactive: %s", nameOrEmailOrId)); + throw new UnprocessableEntityException( + String.format("Account Inactive: %s", nameOrEmailOrId)); } members.add(a.getId()); } args.initialMembers = members; } else { - args.initialMembers = ownerId == null - ? Collections.singleton(self.get().getAccountId()) - : Collections. emptySet(); + args.initialMembers = + ownerId == null + ? Collections.singleton(self.get().getAccountId()) + : Collections.emptySet(); } for (GroupCreationValidationListener l : groupCreationValidationListeners) { @@ -159,8 +157,7 @@ public class CreateGroup implements RestModifyView return json.format(GroupDescriptions.forAccountGroup(createGroup(args))); } - private AccountGroup.Id owner(GroupInput input) - throws UnprocessableEntityException { + private AccountGroup.Id owner(GroupInput input) throws UnprocessableEntityException { if (input.ownerId != null) { GroupDescription.Basic d = groups.parseInternal(Url.decode(input.ownerId)); return GroupDescriptions.toAccountGroup(d).getId(); @@ -173,18 +170,16 @@ public class CreateGroup implements RestModifyView // Do not allow creating groups with the same name as system groups for (String name : systemGroupBackend.getNames()) { - if (name.toLowerCase(Locale.US).equals( - createGroupArgs.getGroupName().toLowerCase(Locale.US))) { - throw new ResourceConflictException("group '" + name - + "' already exists"); + if (name.toLowerCase(Locale.US) + .equals(createGroupArgs.getGroupName().toLowerCase(Locale.US))) { + throw new ResourceConflictException("group '" + name + "' already exists"); } } for (String name : systemGroupBackend.getReservedNames()) { - if (name.toLowerCase(Locale.US).equals( - createGroupArgs.getGroupName().toLowerCase(Locale.US))) { - throw new ResourceConflictException("group name '" + name - + "' is reserved"); + if (name.toLowerCase(Locale.US) + .equals(createGroupArgs.getGroupName().toLowerCase(Locale.US))) { + throw new ResourceConflictException("group name '" + name + "' is reserved"); } } @@ -192,10 +187,8 @@ public class CreateGroup implements RestModifyView AccountGroup.UUID uuid = GroupUUID.make( createGroupArgs.getGroupName(), - self.get().newCommitterIdent(serverIdent.getWhen(), - serverIdent.getTimeZone())); - AccountGroup group = - new AccountGroup(createGroupArgs.getGroup(), groupId, uuid); + self.get().newCommitterIdent(serverIdent.getWhen(), serverIdent.getTimeZone())); + AccountGroup group = new AccountGroup(createGroupArgs.getGroup(), groupId, uuid); group.setVisibleToAll(createGroupArgs.visibleToAll); if (createGroupArgs.ownerGroupId != null) { AccountGroup ownerGroup = groupCache.get(createGroupArgs.ownerGroupId); @@ -212,8 +205,8 @@ public class CreateGroup implements RestModifyView try { db.accountGroupNames().insert(Collections.singleton(gn)); } catch (OrmDuplicateKeyException e) { - throw new ResourceConflictException("group '" - + createGroupArgs.getGroupName() + "' already exists"); + throw new ResourceConflictException( + "group '" + createGroupArgs.getGroupName() + "' already exists"); } db.accountGroups().insert(Collections.singleton(group)); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/DbGroupMemberAuditListener.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/DbGroupMemberAuditListener.java index 23d2b59c50..f88460bfc0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/DbGroupMemberAuditListener.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/DbGroupMemberAuditListener.java @@ -30,17 +30,15 @@ import com.google.gerrit.server.account.UniversalGroupBackend; import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.SchemaFactory; import com.google.inject.Inject; - -import org.slf4j.Logger; - import java.text.MessageFormat; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import org.slf4j.Logger; class DbGroupMemberAuditListener implements GroupMemberAuditListener { - private static final Logger log = org.slf4j.LoggerFactory - .getLogger(DbGroupMemberAuditListener.class); + private static final Logger log = + org.slf4j.LoggerFactory.getLogger(DbGroupMemberAuditListener.class); private final SchemaFactory schema; private final AccountCache accountCache; @@ -48,8 +46,10 @@ class DbGroupMemberAuditListener implements GroupMemberAuditListener { private final UniversalGroupBackend groupBackend; @Inject - DbGroupMemberAuditListener(SchemaFactory schema, - AccountCache accountCache, GroupCache groupCache, + DbGroupMemberAuditListener( + SchemaFactory schema, + AccountCache accountCache, + GroupCache groupCache, UniversalGroupBackend groupBackend) { this.schema = schema; this.accountCache = accountCache; @@ -58,33 +58,29 @@ class DbGroupMemberAuditListener implements GroupMemberAuditListener { } @Override - public void onAddAccountsToGroup(Account.Id me, - Collection added) { + public void onAddAccountsToGroup(Account.Id me, Collection added) { List auditInserts = new ArrayList<>(); for (AccountGroupMember m : added) { - AccountGroupMemberAudit audit = - new AccountGroupMemberAudit(m, me, TimeUtil.nowTs()); + AccountGroupMemberAudit audit = new AccountGroupMemberAudit(m, me, TimeUtil.nowTs()); auditInserts.add(audit); } try (ReviewDb db = schema.open()) { db.accountGroupMembersAudit().insert(auditInserts); } catch (OrmException e) { logOrmExceptionForAccounts( - "Cannot log add accounts to group event performed by user", me, - added, e); + "Cannot log add accounts to group event performed by user", me, added, e); } } @Override - public void onDeleteAccountsFromGroup(Account.Id me, - Collection removed) { + public void onDeleteAccountsFromGroup(Account.Id me, Collection removed) { List auditInserts = new ArrayList<>(); List auditUpdates = new ArrayList<>(); try (ReviewDb db = schema.open()) { for (AccountGroupMember m : removed) { AccountGroupMemberAudit audit = null; - for (AccountGroupMemberAudit a : db.accountGroupMembersAudit() - .byGroupAccount(m.getAccountGroupId(), m.getAccountId())) { + for (AccountGroupMemberAudit a : + db.accountGroupMembersAudit().byGroupAccount(m.getAccountGroupId(), m.getAccountId())) { if (a.isActive()) { audit = a; break; @@ -104,38 +100,33 @@ class DbGroupMemberAuditListener implements GroupMemberAuditListener { db.accountGroupMembersAudit().insert(auditInserts); } catch (OrmException e) { logOrmExceptionForAccounts( - "Cannot log delete accounts from group event performed by user", me, - removed, e); + "Cannot log delete accounts from group event performed by user", me, removed, e); } } @Override - public void onAddGroupsToGroup(Account.Id me, - Collection added) { + public void onAddGroupsToGroup(Account.Id me, Collection added) { List includesAudit = new ArrayList<>(); for (AccountGroupById groupInclude : added) { - AccountGroupByIdAud audit = - new AccountGroupByIdAud(groupInclude, me, TimeUtil.nowTs()); + AccountGroupByIdAud audit = new AccountGroupByIdAud(groupInclude, me, TimeUtil.nowTs()); includesAudit.add(audit); } try (ReviewDb db = schema.open()) { db.accountGroupByIdAud().insert(includesAudit); } catch (OrmException e) { logOrmExceptionForGroups( - "Cannot log add groups to group event performed by user", me, added, - e); + "Cannot log add groups to group event performed by user", me, added, e); } } @Override - public void onDeleteGroupsFromGroup(Account.Id me, - Collection removed) { + public void onDeleteGroupsFromGroup(Account.Id me, Collection removed) { final List auditUpdates = new ArrayList<>(); try (ReviewDb db = schema.open()) { for (final AccountGroupById g : removed) { AccountGroupByIdAud audit = null; - for (AccountGroupByIdAud a : db.accountGroupByIdAud() - .byGroupInclude(g.getGroupId(), g.getIncludeUUID())) { + for (AccountGroupByIdAud a : + db.accountGroupByIdAud().byGroupInclude(g.getGroupId(), g.getIncludeUUID())) { if (a.isActive()) { audit = a; break; @@ -150,13 +141,12 @@ class DbGroupMemberAuditListener implements GroupMemberAuditListener { db.accountGroupByIdAud().update(auditUpdates); } catch (OrmException e) { logOrmExceptionForGroups( - "Cannot log delete groups from group event performed by user", me, - removed, e); + "Cannot log delete groups from group event performed by user", me, removed, e); } } - private void logOrmExceptionForAccounts(String header, Account.Id me, - Collection values, OrmException e) { + private void logOrmExceptionForAccounts( + String header, Account.Id me, Collection values, OrmException e) { List descriptions = new ArrayList<>(); for (AccountGroupMember m : values) { Account.Id accountId = m.getAccountId(); @@ -164,14 +154,15 @@ class DbGroupMemberAuditListener implements GroupMemberAuditListener { AccountGroup.Id groupId = m.getAccountGroupId(); String groupName = groupCache.get(groupId).getName(); - descriptions.add(MessageFormat.format("account {0}/{1}, group {2}/{3}", - accountId, userName, groupId, groupName)); + descriptions.add( + MessageFormat.format( + "account {0}/{1}, group {2}/{3}", accountId, userName, groupId, groupName)); } logOrmException(header, me, descriptions, e); } - private void logOrmExceptionForGroups(String header, Account.Id me, - Collection values, OrmException e) { + private void logOrmExceptionForGroups( + String header, Account.Id me, Collection values, OrmException e) { List descriptions = new ArrayList<>(); for (AccountGroupById m : values) { AccountGroup.UUID groupUuid = m.getIncludeUUID(); @@ -179,14 +170,15 @@ class DbGroupMemberAuditListener implements GroupMemberAuditListener { AccountGroup.Id targetGroupId = m.getGroupId(); String targetGroupName = groupCache.get(targetGroupId).getName(); - descriptions.add(MessageFormat.format("group {0}/{1}, group {2}/{3}", - groupUuid, groupName, targetGroupId, targetGroupName)); + descriptions.add( + MessageFormat.format( + "group {0}/{1}, group {2}/{3}", + groupUuid, groupName, targetGroupId, targetGroupName)); } logOrmException(header, me, descriptions, e); } - private void logOrmException(String header, Account.Id me, - Iterable values, OrmException e) { + private void logOrmException(String header, Account.Id me, Iterable values, OrmException e) { StringBuilder message = new StringBuilder(header); message.append(" "); message.append(me); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/DeleteIncludedGroups.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/DeleteIncludedGroups.java index 3985c80bb4..9f612bfbdc 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/DeleteIncludedGroups.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/DeleteIncludedGroups.java @@ -34,7 +34,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -49,9 +48,12 @@ public class DeleteIncludedGroups implements RestModifyView db, - Provider self, AuditService auditService) { + DeleteIncludedGroups( + GroupsCollection groupsCollection, + GroupIncludeCache groupIncludeCache, + Provider db, + Provider self, + AuditService auditService) { this.groupsCollection = groupsCollection; this.groupIncludeCache = groupIncludeCache; this.db = db; @@ -61,8 +63,7 @@ public class DeleteIncludedGroups implements RestModifyView apply(GroupResource resource, Input input) - throws AuthException, MethodNotAllowedException, - UnprocessableEntityException, OrmException { + throws AuthException, MethodNotAllowedException, UnprocessableEntityException, OrmException { AccountGroup internalGroup = resource.toAccountGroup(); if (internalGroup == null) { throw new MethodNotAllowedException(); @@ -70,14 +71,14 @@ public class DeleteIncludedGroups implements RestModifyView includedGroups = getIncludedGroups(internalGroup.getId()); + final Map includedGroups = + getIncludedGroups(internalGroup.getId()); final List toRemove = new ArrayList<>(); for (final String includedGroup : input.groups) { GroupDescription.Basic d = groupsCollection.parse(includedGroup); if (!control.canRemoveGroup()) { - throw new AuthException(String.format("Cannot delete group: %s", - d.getName())); + throw new AuthException(String.format("Cannot delete group: %s", d.getName())); } AccountGroupById g = includedGroups.remove(d.getGroupUUID()); @@ -98,8 +99,8 @@ public class DeleteIncludedGroups implements RestModifyView getIncludedGroups( - final AccountGroup.Id groupId) throws OrmException { + private Map getIncludedGroups(final AccountGroup.Id groupId) + throws OrmException { final Map groups = new HashMap<>(); for (AccountGroupById g : db.get().accountGroupById().byGroup(groupId)) { groups.put(g.getIncludeUUID(), g); @@ -113,10 +114,9 @@ public class DeleteIncludedGroups implements RestModifyView { - static class Input { - } + static class DeleteIncludedGroup + implements RestModifyView { + static class Input {} private final Provider delete; @@ -127,8 +127,8 @@ public class DeleteIncludedGroups implements RestModifyView apply(IncludedGroupResource resource, Input input) - throws AuthException, MethodNotAllowedException, - UnprocessableEntityException, OrmException { + throws AuthException, MethodNotAllowedException, UnprocessableEntityException, + OrmException { AddIncludedGroups.Input in = new AddIncludedGroups.Input(); in.groups = ImmutableList.of(resource.getMember().get()); return delete.get().apply(resource, in); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/DeleteMembers.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/DeleteMembers.java index 107f1bb124..e365ce3443 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/DeleteMembers.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/DeleteMembers.java @@ -33,7 +33,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; @@ -49,8 +48,10 @@ public class DeleteMembers implements RestModifyView { private final AuditService auditService; @Inject - DeleteMembers(AccountsCollection accounts, - AccountCache accountCache, Provider db, + DeleteMembers( + AccountsCollection accounts, + AccountCache accountCache, + Provider db, Provider self, AuditService auditService) { this.accounts = accounts; @@ -62,8 +63,8 @@ public class DeleteMembers implements RestModifyView { @Override public Response apply(GroupResource resource, Input input) - throws AuthException, MethodNotAllowedException, - UnprocessableEntityException, OrmException, IOException { + throws AuthException, MethodNotAllowedException, UnprocessableEntityException, OrmException, + IOException { AccountGroup internalGroup = resource.toAccountGroup(); if (internalGroup == null) { throw new MethodNotAllowedException(); @@ -101,11 +102,10 @@ public class DeleteMembers implements RestModifyView { auditService.dispatchDeleteAccountsFromGroup(me, toRemove); } - private Map getMembers( - final AccountGroup.Id groupId) throws OrmException { + private Map getMembers(final AccountGroup.Id groupId) + throws OrmException { final Map members = new HashMap<>(); - for (final AccountGroupMember m : db.get().accountGroupMembers() - .byGroup(groupId)) { + for (final AccountGroupMember m : db.get().accountGroupMembers().byGroup(groupId)) { members.put(m.getAccountId(), m); } return members; @@ -113,8 +113,7 @@ public class DeleteMembers implements RestModifyView { @Singleton static class DeleteMember implements RestModifyView { - static class Input { - } + static class Input {} private final Provider delete; @@ -125,8 +124,8 @@ public class DeleteMembers implements RestModifyView { @Override public Response apply(MemberResource resource, Input input) - throws AuthException, MethodNotAllowedException, - UnprocessableEntityException, OrmException, IOException { + throws AuthException, MethodNotAllowedException, UnprocessableEntityException, OrmException, + IOException { AddMembers.Input in = new AddMembers.Input(); in._oneMember = resource.getMember().getAccountId().toString(); return delete.get().apply(resource, in); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/GetAuditLog.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/GetAuditLog.java index f9ae69457d..e29b37f40e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/GetAuditLog.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/GetAuditLog.java @@ -35,7 +35,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -50,7 +49,8 @@ public class GetAuditLog implements RestReadView { private final GroupBackend groupBackend; @Inject - public GetAuditLog(Provider db, + public GetAuditLog( + Provider db, AccountLoader.Factory accountLoaderFactory, GroupCache groupCache, GroupJson groupJson, @@ -64,16 +64,14 @@ public class GetAuditLog implements RestReadView { @Override public List apply(GroupResource rsrc) - throws AuthException, ResourceNotFoundException, - MethodNotAllowedException, OrmException { + throws AuthException, ResourceNotFoundException, MethodNotAllowedException, OrmException { if (rsrc.toAccountGroup() == null) { throw new MethodNotAllowedException(); } else if (!rsrc.getControl().isOwner()) { throw new AuthException("Not group owner"); } - AccountGroup group = db.get().accountGroups().get( - rsrc.toAccountGroup().getId()); + AccountGroup group = db.get().accountGroups().get(rsrc.toAccountGroup().getId()); if (group == null) { throw new ResourceNotFoundException(); } @@ -83,17 +81,19 @@ public class GetAuditLog implements RestReadView { List auditEvents = new ArrayList<>(); for (AccountGroupMemberAudit auditEvent : - db.get().accountGroupMembersAudit().byGroup(group.getId()).toList()) { + db.get().accountGroupMembersAudit().byGroup(group.getId()).toList()) { AccountInfo member = accountLoader.get(auditEvent.getKey().getParentKey()); - auditEvents.add(GroupAuditEventInfo.createAddUserEvent( - accountLoader.get(auditEvent.getAddedBy()), - auditEvent.getKey().getAddedOn(), member)); + auditEvents.add( + GroupAuditEventInfo.createAddUserEvent( + accountLoader.get(auditEvent.getAddedBy()), + auditEvent.getKey().getAddedOn(), + member)); if (!auditEvent.isActive()) { - auditEvents.add(GroupAuditEventInfo.createRemoveUserEvent( - accountLoader.get(auditEvent.getRemovedBy()), - auditEvent.getRemovedOn(), member)); + auditEvents.add( + GroupAuditEventInfo.createRemoveUserEvent( + accountLoader.get(auditEvent.getRemovedBy()), auditEvent.getRemovedOn(), member)); } } @@ -105,33 +105,36 @@ public class GetAuditLog implements RestReadView { if (includedGroup != null) { member = groupJson.format(GroupDescriptions.forAccountGroup(includedGroup)); } else { - GroupDescription.Basic groupDescription = - groupBackend.get(includedGroupUUID); + GroupDescription.Basic groupDescription = groupBackend.get(includedGroupUUID); member = new GroupInfo(); member.id = Url.encode(includedGroupUUID.get()); member.name = groupDescription.getName(); } - auditEvents.add(GroupAuditEventInfo.createAddGroupEvent( - accountLoader.get(auditEvent.getAddedBy()), - auditEvent.getKey().getAddedOn(), member)); + auditEvents.add( + GroupAuditEventInfo.createAddGroupEvent( + accountLoader.get(auditEvent.getAddedBy()), + auditEvent.getKey().getAddedOn(), + member)); if (!auditEvent.isActive()) { - auditEvents.add(GroupAuditEventInfo.createRemoveGroupEvent( - accountLoader.get(auditEvent.getRemovedBy()), - auditEvent.getRemovedOn(), member)); + auditEvents.add( + GroupAuditEventInfo.createRemoveGroupEvent( + accountLoader.get(auditEvent.getRemovedBy()), auditEvent.getRemovedOn(), member)); } } accountLoader.fill(); // sort by date in reverse order so that the newest audit event comes first - Collections.sort(auditEvents, new Comparator() { - @Override - public int compare(GroupAuditEventInfo e1, GroupAuditEventInfo e2) { - return e2.date.compareTo(e1.date); - } - }); + Collections.sort( + auditEvents, + new Comparator() { + @Override + public int compare(GroupAuditEventInfo e1, GroupAuditEventInfo e2) { + return e2.date.compareTo(e1.date); + } + }); return auditEvents; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/GetDetail.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/GetDetail.java index 615c8629a2..47fe319699 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/GetDetail.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/GetDetail.java @@ -27,8 +27,7 @@ public class GetDetail implements RestReadView { @Inject GetDetail(GroupJson json) { - this.json = json.addOption(ListGroupsOption.MEMBERS) - .addOption(ListGroupsOption.INCLUDES); + this.json = json.addOption(ListGroupsOption.MEMBERS).addOption(ListGroupsOption.INCLUDES); } @Override diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/GetIncludedGroup.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/GetIncludedGroup.java index dbc2e0cf5f..4cf0cb2671 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/GetIncludedGroup.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/GetIncludedGroup.java @@ -21,7 +21,7 @@ import com.google.inject.Inject; import com.google.inject.Singleton; @Singleton -public class GetIncludedGroup implements RestReadView { +public class GetIncludedGroup implements RestReadView { private final GroupJson json; @Inject diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/GroupJson.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/GroupJson.java index 8f339de56d..43e70ff5f1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/GroupJson.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/GroupJson.java @@ -31,7 +31,6 @@ import com.google.gerrit.server.account.GroupControl; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - import java.util.Collection; import java.util.EnumSet; @@ -52,7 +51,8 @@ public class GroupJson { private EnumSet options; @Inject - GroupJson(GroupBackend groupBackend, + GroupJson( + GroupBackend groupBackend, GroupControl.Factory groupControlFactory, Provider listMembers, Provider listIncludes) { @@ -83,8 +83,7 @@ public class GroupJson { public GroupInfo format(GroupDescription.Basic group) throws OrmException { GroupInfo info = init(group); if (options.contains(MEMBERS) || options.contains(INCLUDES)) { - GroupResource rsrc = - new GroupResource(groupControlFactory.controlFor(group)); + GroupResource rsrc = new GroupResource(groupControlFactory.controlFor(group)); initMembersAndIncludes(rsrc, info); } return info; @@ -113,8 +112,7 @@ public class GroupJson { return info; } - private GroupInfo initMembersAndIncludes(GroupResource rsrc, GroupInfo info) - throws OrmException { + private GroupInfo initMembersAndIncludes(GroupResource rsrc, GroupInfo info) throws OrmException { if (rsrc.toAccountGroup() == null) { return info; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/GroupsCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/GroupsCollection.java index 72c29d0e5b..397bf08894 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/GroupsCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/GroupsCollection.java @@ -39,9 +39,10 @@ import com.google.gerrit.server.account.GroupControl; import com.google.inject.Inject; import com.google.inject.Provider; -public class GroupsCollection implements - RestCollection, - AcceptsCreate, NeedsParams { +public class GroupsCollection + implements RestCollection, + AcceptsCreate, + NeedsParams { private final DynamicMap> views; private final Provider list; private final Provider queryGroups; @@ -53,7 +54,8 @@ public class GroupsCollection implements private boolean hasQuery2; @Inject - GroupsCollection(DynamicMap> views, + GroupsCollection( + DynamicMap> views, Provider list, Provider queryGroups, CreateGroup.Factory createGroup, @@ -70,11 +72,9 @@ public class GroupsCollection implements } @Override - public void setParams(ListMultimap params) - throws BadRequestException { + public void setParams(ListMultimap params) throws BadRequestException { if (params.containsKey("query") && params.containsKey("query2")) { - throw new BadRequestException( - "\"query\" and \"query2\" options are mutually exclusive"); + throw new BadRequestException("\"query\" and \"query2\" options are mutually exclusive"); } // The --query2 option is defined in QueryGroups @@ -82,8 +82,7 @@ public class GroupsCollection implements } @Override - public RestView list() throws ResourceNotFoundException, - AuthException { + public RestView list() throws ResourceNotFoundException, AuthException { final CurrentUser user = self.get(); if (user instanceof AnonymousUser) { throw new AuthException("Authentication required"); @@ -122,49 +121,40 @@ public class GroupsCollection implements /** * Parses a group ID from a request body and returns the group. * - * @param id ID of the group, can be a group UUID, a group name or a legacy - * group ID + * @param id ID of the group, can be a group UUID, a group name or a legacy group ID * @return the group - * @throws UnprocessableEntityException thrown if the group ID cannot be - * resolved or if the group is not visible to the calling user + * @throws UnprocessableEntityException thrown if the group ID cannot be resolved or if the group + * is not visible to the calling user */ - public GroupDescription.Basic parse(String id) - throws UnprocessableEntityException { + public GroupDescription.Basic parse(String id) throws UnprocessableEntityException { GroupDescription.Basic group = parseId(id); if (group == null || !groupControlFactory.controlFor(group).isVisible()) { - throw new UnprocessableEntityException(String.format( - "Group Not Found: %s", id)); + throw new UnprocessableEntityException(String.format("Group Not Found: %s", id)); } return group; } /** - * Parses a group ID from a request body and returns the group if it is a - * Gerrit internal group. + * Parses a group ID from a request body and returns the group if it is a Gerrit internal group. * - * @param id ID of the group, can be a group UUID, a group name or a legacy - * group ID + * @param id ID of the group, can be a group UUID, a group name or a legacy group ID * @return the group - * @throws UnprocessableEntityException thrown if the group ID cannot be - * resolved, if the group is not visible to the calling user or if - * it's an external group + * @throws UnprocessableEntityException thrown if the group ID cannot be resolved, if the group is + * not visible to the calling user or if it's an external group */ - public GroupDescription.Basic parseInternal(String id) - throws UnprocessableEntityException { + public GroupDescription.Basic parseInternal(String id) throws UnprocessableEntityException { GroupDescription.Basic group = parse(id); if (GroupDescriptions.toAccountGroup(group) == null) { - throw new UnprocessableEntityException(String.format( - "External Group Not Allowed: %s", id)); + throw new UnprocessableEntityException(String.format("External Group Not Allowed: %s", id)); } return group; } /** - * Parses a group ID and returns the group without making any permission - * check whether the current user can see the group. + * Parses a group ID and returns the group without making any permission check whether the current + * user can see the group. * - * @param id ID of the group, can be a group UUID, a group name or a legacy - * group ID + * @param id ID of the group, can be a group UUID, a group name or a legacy group ID * @return the group, null if no group is found for the given group ID */ public GroupDescription.Basic parseId(String id) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/IncludedGroupResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/IncludedGroupResource.java index 7975f241e5..467de4c572 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/IncludedGroupResource.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/IncludedGroupResource.java @@ -25,8 +25,7 @@ public class IncludedGroupResource extends GroupResource { private final GroupDescription.Basic member; - public IncludedGroupResource(GroupResource group, - GroupDescription.Basic member) { + public IncludedGroupResource(GroupResource group, GroupDescription.Basic member) { super(group); this.member = member; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/IncludedGroupsCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/IncludedGroupsCollection.java index 8d0831d15b..865f8b527e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/IncludedGroupsCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/IncludedGroupsCollection.java @@ -34,9 +34,8 @@ import com.google.inject.Provider; import com.google.inject.Singleton; @Singleton -public class IncludedGroupsCollection implements - ChildCollection, - AcceptsCreate { +public class IncludedGroupsCollection + implements ChildCollection, AcceptsCreate { private final DynamicMap> views; private final ListIncludedGroups list; private final GroupsCollection groupsCollection; @@ -44,7 +43,8 @@ public class IncludedGroupsCollection implements private final AddIncludedGroups put; @Inject - IncludedGroupsCollection(DynamicMap> views, + IncludedGroupsCollection( + DynamicMap> views, ListIncludedGroups list, GroupsCollection groupsCollection, Provider dbProvider, @@ -63,8 +63,7 @@ public class IncludedGroupsCollection implements @Override public IncludedGroupResource parse(GroupResource resource, IdString id) - throws MethodNotAllowedException, AuthException, - ResourceNotFoundException, OrmException { + throws MethodNotAllowedException, AuthException, ResourceNotFoundException, OrmException { AccountGroup parent = resource.toAccountGroup(); if (parent == null) { throw new MethodNotAllowedException(); @@ -72,19 +71,18 @@ public class IncludedGroupsCollection implements GroupDescription.Basic member = groupsCollection.parse(TopLevelResource.INSTANCE, id).getGroup(); - if (isMember(parent, member) - && resource.getControl().canSeeGroup()) { + if (isMember(parent, member) && resource.getControl().canSeeGroup()) { return new IncludedGroupResource(resource, member); } throw new ResourceNotFoundException(id); } - private boolean isMember(AccountGroup parent, GroupDescription.Basic member) - throws OrmException { - return dbProvider.get().accountGroupById().get( - new AccountGroupById.Key( - parent.getId(), - member.getGroupUUID())) != null; + private boolean isMember(AccountGroup parent, GroupDescription.Basic member) throws OrmException { + return dbProvider + .get() + .accountGroupById() + .get(new AccountGroupById.Key(parent.getId(), member.getGroupUUID())) + != null; } @SuppressWarnings("unchecked") diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/Index.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/Index.java index 5a8978a2e0..b7b98b2027 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/Index.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/Index.java @@ -24,13 +24,11 @@ import com.google.gerrit.server.account.GroupCache; import com.google.gerrit.server.group.Index.Input; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.io.IOException; @Singleton public class Index implements RestModifyView { - public static class Input { - } + public static class Input {} private final GroupCache groupCache; @@ -48,8 +46,8 @@ public class Index implements RestModifyView { AccountGroup group = GroupDescriptions.toAccountGroup(rsrc.getGroup()); if (group == null) { - throw new UnprocessableEntityException(String - .format("External Group Not Allowed: %s", rsrc.getGroupUUID().get())); + throw new UnprocessableEntityException( + String.format("External Group Not Allowed: %s", rsrc.getGroupUUID().get())); } // evicting the group from the cache, reindexes the group diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/ListGroups.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/ListGroups.java index 80a639b9ae..9bf14e7126 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/ListGroups.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/ListGroups.java @@ -41,9 +41,6 @@ import com.google.gerrit.server.project.ProjectControl; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - -import org.kohsuke.args4j.Option; - import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -56,6 +53,7 @@ import java.util.Map; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; +import org.kohsuke.args4j.Option; /** List groups visible to the calling user. */ public class ListGroups implements RestReadView { @@ -72,8 +70,7 @@ public class ListGroups implements RestReadView { private final GroupJson json; private final GroupBackend groupBackend; - private EnumSet options = - EnumSet.noneOf(ListGroupsOption.class); + private EnumSet options = EnumSet.noneOf(ListGroupsOption.class); private boolean visibleToAll; private Account.Id user; private boolean owned; @@ -82,31 +79,42 @@ public class ListGroups implements RestReadView { private String matchSubstring; private String suggest; - @Option(name = "--project", aliases = {"-p"}, - usage = "projects for which the groups should be listed") + @Option( + name = "--project", + aliases = {"-p"}, + usage = "projects for which the groups should be listed" + ) public void addProject(ProjectControl project) { projects.add(project); } - @Option(name = "--visible-to-all", - usage = "to list only groups that are visible to all registered users") + @Option( + name = "--visible-to-all", + usage = "to list only groups that are visible to all registered users" + ) public void setVisibleToAll(boolean visibleToAll) { this.visibleToAll = visibleToAll; } - @Option(name = "--user", aliases = {"-u"}, - usage = "user for which the groups should be listed") + @Option( + name = "--user", + aliases = {"-u"}, + usage = "user for which the groups should be listed" + ) public void setUser(Account.Id user) { this.user = user; } - @Option(name = "--owned", usage = "to list only groups that are owned by the" - + " specified user or by the calling user if no user was specifed") + @Option( + name = "--owned", + usage = + "to list only groups that are owned by the" + + " specified user or by the calling user if no user was specifed" + ) public void setOwned(boolean owned) { this.owned = owned; } - /** * Add a group to inspect. * @@ -114,37 +122,59 @@ public class ListGroups implements RestReadView { * @deprecated use {@link #addGroup(AccountGroup.UUID)}. */ @Deprecated - @Option(name = "--query", aliases = {"-q"}, - usage = "group to inspect (deprecated: use --group/-g instead)") + @Option( + name = "--query", + aliases = {"-q"}, + usage = "group to inspect (deprecated: use --group/-g instead)" + ) void addGroup_Deprecated(AccountGroup.UUID uuid) { addGroup(uuid); } - @Option(name = "--group", aliases = {"-g"}, usage = "group to inspect") + @Option( + name = "--group", + aliases = {"-g"}, + usage = "group to inspect" + ) public void addGroup(AccountGroup.UUID uuid) { groupsToInspect.add(uuid); } - @Option(name = "--limit", aliases = {"-n"}, metaVar = "CNT", - usage = "maximum number of groups to list") + @Option( + name = "--limit", + aliases = {"-n"}, + metaVar = "CNT", + usage = "maximum number of groups to list" + ) public void setLimit(int limit) { this.limit = limit; } - @Option(name = "--start", aliases = {"-S"}, metaVar = "CNT", - usage = "number of groups to skip") + @Option( + name = "--start", + aliases = {"-S"}, + metaVar = "CNT", + usage = "number of groups to skip" + ) public void setStart(int start) { this.start = start; } - @Option(name = "--match", aliases = {"-m"}, metaVar = "MATCH", - usage = "match group substring") + @Option( + name = "--match", + aliases = {"-m"}, + metaVar = "MATCH", + usage = "match group substring" + ) public void setMatchSubstring(String matchSubstring) { this.matchSubstring = matchSubstring; } - @Option(name = "--suggest", aliases = {"-s"}, - usage = "to get a suggestion of groups") + @Option( + name = "--suggest", + aliases = {"-s"}, + usage = "to get a suggestion of groups" + ) public void setSuggest(String suggest) { this.suggest = suggest; } @@ -160,7 +190,8 @@ public class ListGroups implements RestReadView { } @Inject - protected ListGroups(final GroupCache groupCache, + protected ListGroups( + final GroupCache groupCache, final GroupControl.Factory groupControlFactory, final GroupControl.GenericFactory genericGroupControlFactory, final Provider identifiedUser, @@ -195,9 +226,7 @@ public class ListGroups implements RestReadView { throws OrmException, BadRequestException { SortedMap output = new TreeMap<>(); for (GroupInfo info : get()) { - output.put(MoreObjects.firstNonNull( - info.name, - "Group " + Url.decode(info.id)), info); + output.put(MoreObjects.firstNonNull(info.name, "Group " + Url.decode(info.id)), info); info.name = null; } return output; @@ -209,13 +238,11 @@ public class ListGroups implements RestReadView { } if (owned) { - return getGroupsOwnedBy( - user != null ? userFactory.create(user) : identifiedUser.get()); + return getGroupsOwnedBy(user != null ? userFactory.create(user) : identifiedUser.get()); } if (user != null) { - return accountGetGroups.apply( - new AccountResource(userFactory.create(user))); + return accountGetGroups.apply(new AccountResource(userFactory.create(user))); } return getAllGroups(); @@ -249,8 +276,7 @@ public class ListGroups implements RestReadView { if (limit > 0 && ++found > limit) { break; } - groupInfos.add(json.addOptions(options).format( - GroupDescriptions.forAccountGroup(group))); + groupInfos.add(json.addOptions(options).format(GroupDescriptions.forAccountGroup(group))); } return groupInfos; } @@ -261,10 +287,11 @@ public class ListGroups implements RestReadView { "You should only have no more than one --project and -n with --suggest"); } - List groupRefs = Lists.newArrayList(Iterables.limit( - groupBackend.suggest( - suggest, Iterables.getFirst(projects, null)), - limit <= 0 ? 10 : Math.min(limit, 10))); + List groupRefs = + Lists.newArrayList( + Iterables.limit( + groupBackend.suggest(suggest, Iterables.getFirst(projects, null)), + limit <= 0 ? 10 : Math.min(limit, 10))); List groupInfos = Lists.newArrayListWithCapacity(groupRefs.size()); for (final GroupReference ref : groupRefs) { @@ -304,16 +331,14 @@ public class ListGroups implements RestReadView { return false; } - private List getGroupsOwnedBy(IdentifiedUser user) - throws OrmException { + private List getGroupsOwnedBy(IdentifiedUser user) throws OrmException { List groups = new ArrayList<>(); int found = 0; int foundIndex = 0; for (AccountGroup g : filterGroups(groupCache.all())) { GroupControl ctl = groupControlFactory.controlFor(g); try { - if (genericGroupControlFactory.controlFor(user, g.getGroupUUID()) - .isOwner()) { + if (genericGroupControlFactory.controlFor(user, g.getGroupUUID()).isOwner()) { if (foundIndex++ < start) { continue; } @@ -331,11 +356,12 @@ public class ListGroups implements RestReadView { private List filterGroups(Collection groups) { List filteredGroups = new ArrayList<>(groups.size()); - boolean isAdmin = - identifiedUser.get().getCapabilities().canAdministrateServer(); + boolean isAdmin = identifiedUser.get().getCapabilities().canAdministrateServer(); for (AccountGroup group : groups) { if (!Strings.isNullOrEmpty(matchSubstring)) { - if (!group.getName().toLowerCase(Locale.US) + if (!group + .getName() + .toLowerCase(Locale.US) .contains(matchSubstring.toLowerCase(Locale.US))) { continue; } @@ -343,8 +369,7 @@ public class ListGroups implements RestReadView { if (visibleToAll && !group.isVisibleToAll()) { continue; } - if (!groupsToInspect.isEmpty() - && !groupsToInspect.contains(group.getGroupUUID())) { + if (!groupsToInspect.isEmpty() && !groupsToInspect.contains(group.getGroupUUID())) { continue; } if (!isAdmin) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/ListIncludedGroups.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/ListIncludedGroups.java index 803c498187..b4cac87211 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/ListIncludedGroups.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/ListIncludedGroups.java @@ -27,13 +27,11 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.slf4j.Logger; - import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; +import org.slf4j.Logger; @Singleton public class ListIncludedGroups implements RestReadView { @@ -44,47 +42,48 @@ public class ListIncludedGroups implements RestReadView { private final GroupJson json; @Inject - ListIncludedGroups(GroupControl.Factory controlFactory, - Provider dbProvider, GroupJson json) { + ListIncludedGroups( + GroupControl.Factory controlFactory, Provider dbProvider, GroupJson json) { this.controlFactory = controlFactory; this.dbProvider = dbProvider; this.json = json; } @Override - public List apply(GroupResource rsrc) - throws MethodNotAllowedException, OrmException { + public List apply(GroupResource rsrc) throws MethodNotAllowedException, OrmException { if (rsrc.toAccountGroup() == null) { throw new MethodNotAllowedException(); } boolean ownerOfParent = rsrc.getControl().isOwner(); List included = new ArrayList<>(); - for (AccountGroupById u : dbProvider.get() - .accountGroupById() - .byGroup(rsrc.toAccountGroup().getId())) { + for (AccountGroupById u : + dbProvider.get().accountGroupById().byGroup(rsrc.toAccountGroup().getId())) { try { GroupControl i = controlFactory.controlFor(u.getIncludeUUID()); if (ownerOfParent || i.isVisible()) { included.add(json.format(i.getGroup())); } } catch (NoSuchGroupException notFound) { - log.warn(String.format("Group %s no longer available, included into %s", - u.getIncludeUUID(), - rsrc.getGroup().getName())); + log.warn( + String.format( + "Group %s no longer available, included into %s", + u.getIncludeUUID(), rsrc.getGroup().getName())); continue; } } - Collections.sort(included, new Comparator() { - @Override - public int compare(GroupInfo a, GroupInfo b) { - int cmp = nullToEmpty(a.name).compareTo(nullToEmpty(b.name)); - if (cmp != 0) { - return cmp; - } - return nullToEmpty(a.id).compareTo(nullToEmpty(b.id)); - } - }); + Collections.sort( + included, + new Comparator() { + @Override + public int compare(GroupInfo a, GroupInfo b) { + int cmp = nullToEmpty(a.name).compareTo(nullToEmpty(b.name)); + if (cmp != 0) { + return cmp; + } + return nullToEmpty(a.id).compareTo(nullToEmpty(b.id)); + } + }); return included; } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/ListMembers.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/ListMembers.java index 98d18ca75a..8e2c925cf5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/ListMembers.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/ListMembers.java @@ -30,14 +30,12 @@ import com.google.gerrit.server.account.GroupDetailFactory; import com.google.gerrit.server.api.accounts.AccountInfoComparator; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - -import org.kohsuke.args4j.Option; - import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import org.kohsuke.args4j.Option; public class ListMembers implements RestReadView { private final GroupCache groupCache; @@ -48,7 +46,8 @@ public class ListMembers implements RestReadView { private boolean recursive; @Inject - protected ListMembers(GroupCache groupCache, + protected ListMembers( + GroupCache groupCache, GroupDetailFactory.Factory groupDetailFactory, AccountLoader.Factory accountLoaderFactory) { this.groupCache = groupCache; @@ -71,13 +70,11 @@ public class ListMembers implements RestReadView { return apply(resource.getGroupUUID()); } - public List apply(AccountGroup group) - throws OrmException { + public List apply(AccountGroup group) throws OrmException { return apply(group.getGroupUUID()); } - public List apply(AccountGroup.UUID groupId) - throws OrmException { + public List apply(AccountGroup.UUID groupId) throws OrmException { final Map members = getMembers(groupId, new HashSet()); final List memberInfos = Lists.newArrayList(members.values()); @@ -86,8 +83,8 @@ public class ListMembers implements RestReadView { } private Map getMembers( - final AccountGroup.UUID groupUUID, - final HashSet seenGroups) throws OrmException { + final AccountGroup.UUID groupUUID, final HashSet seenGroups) + throws OrmException { seenGroups.add(groupUUID); final Map members = new HashMap<>(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/MembersCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/MembersCollection.java index fc69a1f6c9..8f4d65e0f5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/MembersCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/MembersCollection.java @@ -34,9 +34,8 @@ import com.google.inject.Provider; import com.google.inject.Singleton; @Singleton -public class MembersCollection implements - ChildCollection, - AcceptsCreate { +public class MembersCollection + implements ChildCollection, AcceptsCreate { private final DynamicMap> views; private final Provider list; private final AccountsCollection accounts; @@ -44,7 +43,8 @@ public class MembersCollection implements private final AddMembers put; @Inject - MembersCollection(DynamicMap> views, + MembersCollection( + DynamicMap> views, Provider list, AccountsCollection accounts, Provider db, @@ -57,15 +57,13 @@ public class MembersCollection implements } @Override - public RestView list() throws ResourceNotFoundException, - AuthException { + public RestView list() throws ResourceNotFoundException, AuthException { return list.get(); } @Override public MemberResource parse(GroupResource parent, IdString id) - throws MethodNotAllowedException, AuthException, - ResourceNotFoundException, OrmException { + throws MethodNotAllowedException, AuthException, ResourceNotFoundException, OrmException { if (parent.toAccountGroup() == null) { throw new MethodNotAllowedException(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/Module.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/Module.java index f6d0453d6f..366cc4dc93 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/Module.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/Module.java @@ -69,8 +69,6 @@ public class Module extends RestApiModule { factory(CreateGroup.Factory.class); - DynamicSet.bind(binder(), GroupMemberAuditListener.class).to( - DbGroupMemberAuditListener.class); - + DynamicSet.bind(binder(), GroupMemberAuditListener.class).to(DbGroupMemberAuditListener.class); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/PutDescription.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/PutDescription.java index 102e17cc96..b04da91874 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/PutDescription.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/PutDescription.java @@ -29,15 +29,13 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; import java.util.Collections; @Singleton public class PutDescription implements RestModifyView { public static class Input { - @DefaultInput - public String description; + @DefaultInput public String description; } private final GroupCache groupCache; @@ -51,8 +49,8 @@ public class PutDescription implements RestModifyView { @Override public Response apply(GroupResource resource, Input input) - throws AuthException, MethodNotAllowedException, - ResourceNotFoundException, OrmException, IOException { + throws AuthException, MethodNotAllowedException, ResourceNotFoundException, OrmException, + IOException { if (input == null) { input = new Input(); // Delete would set description to null. } @@ -63,8 +61,7 @@ public class PutDescription implements RestModifyView { throw new AuthException("Not group owner"); } - AccountGroup group = db.get().accountGroups().get( - resource.toAccountGroup().getId()); + AccountGroup group = db.get().accountGroups().get(resource.toAccountGroup().getId()); if (group == null) { throw new ResourceNotFoundException(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/PutName.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/PutName.java index cf6adf4eb6..dbbf0e3855 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/PutName.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/PutName.java @@ -35,7 +35,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; import java.util.Collections; import java.util.Date; @@ -45,8 +44,7 @@ import java.util.concurrent.TimeUnit; @Singleton public class PutName implements RestModifyView { public static class Input { - @DefaultInput - public String name; + @DefaultInput public String name; } private final Provider db; @@ -56,7 +54,8 @@ public class PutName implements RestModifyView { private final Provider currentUser; @Inject - PutName(Provider db, + PutName( + Provider db, GroupCache groupCache, GroupDetailFactory.Factory groupDetailFactory, RenameGroupOp.Factory renameGroupOpFactory, @@ -71,8 +70,7 @@ public class PutName implements RestModifyView { @Override public String apply(GroupResource rsrc, Input input) throws MethodNotAllowedException, AuthException, BadRequestException, - ResourceConflictException, OrmException, NoSuchGroupException, - IOException { + ResourceConflictException, OrmException, NoSuchGroupException, IOException { if (rsrc.toAccountGroup() == null) { throw new MethodNotAllowedException(); } else if (!rsrc.getControl().isOwner()) { @@ -93,8 +91,7 @@ public class PutName implements RestModifyView { } private GroupDetail renameGroup(AccountGroup group, String newName) - throws ResourceConflictException, OrmException, - NoSuchGroupException, IOException { + throws ResourceConflictException, OrmException, NoSuchGroupException, IOException { AccountGroup.Id groupId = group.getId(); AccountGroup.NameKey old = group.getNameKey(); AccountGroup.NameKey key = new AccountGroup.NameKey(newName); @@ -113,8 +110,7 @@ public class PutName implements RestModifyView { // Otherwise, someone else has this identity. // - throw new ResourceConflictException("group with name " + newName - + "already exists"); + throw new ResourceConflictException("group with name " + newName + "already exists"); } throw e; } @@ -129,10 +125,13 @@ public class PutName implements RestModifyView { groupCache.evict(group); groupCache.evictAfterRename(old, key); - renameGroupOpFactory.create( - currentUser.get().newCommitterIdent(new Date(), TimeZone.getDefault()), - group.getGroupUUID(), - old.get(), newName).start(0, TimeUnit.MILLISECONDS); + renameGroupOpFactory + .create( + currentUser.get().newCommitterIdent(new Date(), TimeZone.getDefault()), + group.getGroupUUID(), + old.get(), + newName) + .start(0, TimeUnit.MILLISECONDS); return groupDetailFactory.create(groupId).call(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/PutOptions.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/PutOptions.java index 8af03c4026..701d16fa48 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/PutOptions.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/PutOptions.java @@ -27,13 +27,11 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; import java.util.Collections; @Singleton -public class PutOptions - implements RestModifyView { +public class PutOptions implements RestModifyView { private final GroupCache groupCache; private final Provider db; @@ -46,7 +44,7 @@ public class PutOptions @Override public GroupOptionsInfo apply(GroupResource resource, GroupOptionsInfo input) throws MethodNotAllowedException, AuthException, BadRequestException, - ResourceNotFoundException, OrmException, IOException { + ResourceNotFoundException, OrmException, IOException { if (resource.toAccountGroup() == null) { throw new MethodNotAllowedException(); } else if (!resource.getControl().isOwner()) { @@ -60,8 +58,7 @@ public class PutOptions input.visibleToAll = false; } - AccountGroup group = db.get().accountGroups().get( - resource.toAccountGroup().getId()); + AccountGroup group = db.get().accountGroups().get(resource.toAccountGroup().getId()); if (group == null) { throw new ResourceNotFoundException(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/PutOwner.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/PutOwner.java index 6654f5f5b9..0c82b9d3a5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/PutOwner.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/PutOwner.java @@ -32,15 +32,13 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; import java.util.Collections; @Singleton public class PutOwner implements RestModifyView { public static class Input { - @DefaultInput - public String owner; + @DefaultInput public String owner; } private final GroupsCollection groupsCollection; @@ -49,8 +47,11 @@ public class PutOwner implements RestModifyView { private final GroupJson json; @Inject - PutOwner(GroupsCollection groupsCollection, GroupCache groupCache, - Provider db, GroupJson json) { + PutOwner( + GroupsCollection groupsCollection, + GroupCache groupCache, + Provider db, + GroupJson json) { this.groupsCollection = groupsCollection; this.groupCache = groupCache; this.db = db; @@ -59,9 +60,8 @@ public class PutOwner implements RestModifyView { @Override public GroupInfo apply(GroupResource resource, Input input) - throws ResourceNotFoundException, MethodNotAllowedException, - AuthException, BadRequestException, UnprocessableEntityException, - OrmException, IOException { + throws ResourceNotFoundException, MethodNotAllowedException, AuthException, + BadRequestException, UnprocessableEntityException, OrmException, IOException { AccountGroup group = resource.toAccountGroup(); if (group == null) { throw new MethodNotAllowedException(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/QueryGroups.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/QueryGroups.java index bbbfd7caf6..abf464ee68 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/QueryGroups.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/QueryGroups.java @@ -32,12 +32,10 @@ import com.google.gerrit.server.query.group.GroupQueryBuilder; import com.google.gerrit.server.query.group.GroupQueryProcessor; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - -import org.kohsuke.args4j.Option; - import java.util.ArrayList; import java.util.EnumSet; import java.util.List; +import org.kohsuke.args4j.Option; public class QueryGroups implements RestReadView { private final GroupIndexCollection indexes; @@ -48,25 +46,36 @@ public class QueryGroups implements RestReadView { private String query; private int limit; private int start; - private EnumSet options = - EnumSet.noneOf(ListGroupsOption.class); + private EnumSet options = EnumSet.noneOf(ListGroupsOption.class); // TODO(ekempin): --query in ListGroups is marked as deprecated, once it is // removed we want to rename --query2 to --query here. /** --query (-q) is already used by {@link ListGroups} */ - @Option(name = "--query2", aliases = {"-q2"}, usage = "group query") + @Option( + name = "--query2", + aliases = {"-q2"}, + usage = "group query" + ) public void setQuery(String query) { this.query = query; } - @Option(name = "--limit", aliases = {"-n"}, metaVar = "CNT", - usage = "maximum number of groups to list") + @Option( + name = "--limit", + aliases = {"-n"}, + metaVar = "CNT", + usage = "maximum number of groups to list" + ) public void setLimit(int limit) { this.limit = limit; } - @Option(name = "--start", aliases = {"-S"}, metaVar = "CNT", - usage = "number of groups to skip") + @Option( + name = "--start", + aliases = {"-S"}, + metaVar = "CNT", + usage = "number of groups to skip" + ) public void setStart(int start) { this.start = start; } @@ -82,7 +91,8 @@ public class QueryGroups implements RestReadView { } @Inject - protected QueryGroups(GroupIndexCollection indexes, + protected QueryGroups( + GroupIndexCollection indexes, GroupQueryBuilder queryBuilder, GroupQueryProcessor queryProcessor, GroupJson json) { @@ -113,12 +123,10 @@ public class QueryGroups implements RestReadView { } try { - QueryResult result = - queryProcessor.query(queryBuilder.parse(query)); + QueryResult result = queryProcessor.query(queryBuilder.parse(query)); List groups = result.entities(); - ArrayList groupInfos = - Lists.newArrayListWithCapacity(groups.size()); + ArrayList groupInfos = Lists.newArrayListWithCapacity(groups.size()); json.addOptions(options); for (AccountGroup group : groups) { groupInfos.add(json.format(GroupDescriptions.forAccountGroup(group))); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/SystemGroupBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/SystemGroupBackend.java index 244fac0073..cbab0fc478 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/SystemGroupBackend.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/SystemGroupBackend.java @@ -35,9 +35,6 @@ import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.project.ProjectControl; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.Config; - import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -48,6 +45,7 @@ import java.util.Map; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; +import org.eclipse.jgit.lib.Config; @Singleton public class SystemGroupBackend extends AbstractGroupBackend { @@ -70,10 +68,7 @@ public class SystemGroupBackend extends AbstractGroupBackend { new AccountGroup.UUID(SYSTEM_GROUP_SCHEME + "Change-Owner"); private static final AccountGroup.UUID[] all = { - ANONYMOUS_USERS, - REGISTERED_USERS, - PROJECT_OWNERS, - CHANGE_OWNER, + ANONYMOUS_USERS, REGISTERED_USERS, PROJECT_OWNERS, CHANGE_OWNER, }; public static boolean isSystemGroup(AccountGroup.UUID uuid) { @@ -96,8 +91,7 @@ public class SystemGroupBackend extends AbstractGroupBackend { @VisibleForTesting public SystemGroupBackend(@GerritServerConfig Config cfg) { SortedMap n = new TreeMap<>(); - ImmutableMap.Builder u = - ImmutableMap.builder(); + ImmutableMap.Builder u = ImmutableMap.builder(); ImmutableSet.Builder reservedNamesBuilder = ImmutableSet.builder(); for (AccountGroup.UUID uuid : all) { @@ -105,8 +99,8 @@ public class SystemGroupBackend extends AbstractGroupBackend { String defaultName = uuid.get().substring(c + 1).replace('-', ' '); reservedNamesBuilder.add(defaultName); String configuredName = cfg.getString("groups", uuid.get(), "name"); - GroupReference ref = new GroupReference(uuid, - MoreObjects.firstNonNull(configuredName, defaultName)); + GroupReference ref = + new GroupReference(uuid, MoreObjects.firstNonNull(configuredName, defaultName)); n.put(ref.getName().toLowerCase(Locale.US), ref); u.put(ref.getUUID(), ref); } @@ -182,9 +176,7 @@ public class SystemGroupBackend extends AbstractGroupBackend { @Override public GroupMembership membershipsOf(IdentifiedUser user) { - return new ListGroupMembership(ImmutableSet.of( - ANONYMOUS_USERS, - REGISTERED_USERS)); + return new ListGroupMembership(ImmutableSet.of(ANONYMOUS_USERS, REGISTERED_USERS)); } public static class NameCheck implements StartupCheck { @@ -192,8 +184,7 @@ public class SystemGroupBackend extends AbstractGroupBackend { private final GroupCache groupCache; @Inject - NameCheck(@GerritServerConfig Config cfg, - GroupCache groupCache) { + NameCheck(@GerritServerConfig Config cfg, GroupCache groupCache) { this.cfg = cfg; this.groupCache = groupCache; } @@ -201,14 +192,12 @@ public class SystemGroupBackend extends AbstractGroupBackend { @Override public void check() throws StartupException { Map configuredNames = new HashMap<>(); - Map byLowerCaseConfiguredName = - new HashMap<>(); + Map byLowerCaseConfiguredName = new HashMap<>(); for (AccountGroup.UUID uuid : all) { String configuredName = cfg.getString("groups", uuid.get(), "name"); if (configuredName != null) { configuredNames.put(uuid, configuredName); - byLowerCaseConfiguredName.put(configuredName.toLowerCase(Locale.US), - uuid); + byLowerCaseConfiguredName.put(configuredName.toLowerCase(Locale.US), uuid); } } if (configuredNames.isEmpty()) { @@ -217,15 +206,18 @@ public class SystemGroupBackend extends AbstractGroupBackend { for (AccountGroup g : groupCache.all()) { String name = g.getName().toLowerCase(Locale.US); if (byLowerCaseConfiguredName.keySet().contains(name)) { - AccountGroup.UUID uuidSystemGroup = - byLowerCaseConfiguredName.get(name); - throw new StartupException(String.format( - "The configured name '%s' for system group '%s' is ambiguous" - + " with the name '%s' of existing group '%s'." - + " Please remove/change the value for groups.%s.name in" - + " gerrit.config.", - configuredNames.get(uuidSystemGroup), uuidSystemGroup.get(), - g.getName(), g.getGroupUUID().get(), uuidSystemGroup.get())); + AccountGroup.UUID uuidSystemGroup = byLowerCaseConfiguredName.get(name); + throw new StartupException( + String.format( + "The configured name '%s' for system group '%s' is ambiguous" + + " with the name '%s' of existing group '%s'." + + " Please remove/change the value for groups.%s.name in" + + " gerrit.config.", + configuredNames.get(uuidSystemGroup), + uuidSystemGroup.get(), + g.getName(), + g.getGroupUUID().get(), + uuidSystemGroup.get())); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/FieldDef.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/FieldDef.java index 92938cba9e..de654d5e4b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/FieldDef.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/FieldDef.java @@ -23,16 +23,14 @@ import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.config.TrackingFooters; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - import org.eclipse.jgit.lib.Config; /** * Definition of a field stored in the secondary index. * - * @param input type from which documents are created and search results are - * returned. - * @param type that should be extracted from the input object when converting - * to an index document. + * @param input type from which documents are created and search results are returned. + * @param type that should be extracted from the input object when converting to an index + * document. */ public abstract class FieldDef { /** Definition of a single (non-repeatable) field. */ @@ -48,12 +46,11 @@ public abstract class FieldDef { } /** Definition of a repeatable field. */ - public abstract static class Repeatable - extends FieldDef> { + public abstract static class Repeatable extends FieldDef> { protected Repeatable(String name, FieldType type, boolean stored) { super(name, type, stored); - Preconditions.checkArgument(type != FieldType.INTEGER_RANGE, - "Range queries against repeated fields are unsupported"); + Preconditions.checkArgument( + type != FieldType.INTEGER_RANGE, "Range queries against repeated fields are unsupported"); } @Override @@ -69,13 +66,10 @@ public abstract class FieldDef { public final AllUsersName allUsers; @Inject - FillArgs(TrackingFooters trackingFooters, - @GerritServerConfig Config cfg, - AllUsersName allUsers) { + FillArgs( + TrackingFooters trackingFooters, @GerritServerConfig Config cfg, AllUsersName allUsers) { this.trackingFooters = trackingFooters; - this.allowsDrafts = cfg == null - ? true - : cfg.getBoolean("change", "allowDrafts", true); + this.allowsDrafts = cfg == null ? true : cfg.getBoolean("change", "allowDrafts", true); this.allUsers = allUsers; } } @@ -101,10 +95,7 @@ public abstract class FieldDef { return name; } - /** - * @return type of the field; for repeatable fields, the inner type, not the - * iterable type. - */ + /** @return type of the field; for repeatable fields, the inner type, not the iterable type. */ public final FieldType getType() { return type; } @@ -118,10 +109,8 @@ public abstract class FieldDef { * Get the field contents from the input object. * * @param input input object. - * @param args arbitrary arguments needed to fill in indexable fields of the - * input object. + * @param args arbitrary arguments needed to fill in indexable fields of the input object. * @return the field value(s) to index. - * * @throws OrmException */ public abstract T get(I input, FillArgs args) throws OrmException; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/FieldType.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/FieldType.java index 89dc808ab9..820b62a884 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/FieldType.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/FieldType.java @@ -16,40 +16,31 @@ package com.google.gerrit.server.index; import java.sql.Timestamp; - /** Document field types supported by the secondary index system. */ public class FieldType { /** A single integer-valued field. */ - public static final FieldType INTEGER = - new FieldType<>("INTEGER"); + public static final FieldType INTEGER = new FieldType<>("INTEGER"); /** A single-integer-valued field matched using range queries. */ - public static final FieldType INTEGER_RANGE = - new FieldType<>("INTEGER_RANGE"); + public static final FieldType INTEGER_RANGE = new FieldType<>("INTEGER_RANGE"); /** A single integer-valued field. */ - public static final FieldType LONG = - new FieldType<>("LONG"); + public static final FieldType LONG = new FieldType<>("LONG"); /** A single date/time-valued field. */ - public static final FieldType TIMESTAMP = - new FieldType<>("TIMESTAMP"); + public static final FieldType TIMESTAMP = new FieldType<>("TIMESTAMP"); /** A string field searched using exact-match semantics. */ - public static final FieldType EXACT = - new FieldType<>("EXACT"); + public static final FieldType EXACT = new FieldType<>("EXACT"); /** A string field searched using prefix. */ - public static final FieldType PREFIX = - new FieldType<>("PREFIX"); + public static final FieldType PREFIX = new FieldType<>("PREFIX"); /** A string field searched using fuzzy-match semantics. */ - public static final FieldType FULL_TEXT = - new FieldType<>("FULL_TEXT"); + public static final FieldType FULL_TEXT = new FieldType<>("FULL_TEXT"); /** A field that is only stored as raw bytes and cannot be queried. */ - public static final FieldType STORED_ONLY = - new FieldType<>("STORED_ONLY"); + public static final FieldType STORED_ONLY = new FieldType<>("STORED_ONLY"); private final String name; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/GerritIndexStatus.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/GerritIndexStatus.java index 57631851cd..d835227057 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/GerritIndexStatus.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/GerritIndexStatus.java @@ -17,24 +17,21 @@ package com.google.gerrit.server.index; import com.google.common.primitives.Ints; import com.google.gerrit.server.config.SitePaths; import com.google.gerrit.server.index.change.ChangeSchemaDefinitions; - +import java.io.IOException; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.storage.file.FileBasedConfig; import org.eclipse.jgit.util.FS; -import java.io.IOException; - public class GerritIndexStatus { private static final String SECTION = "index"; private static final String KEY_READY = "ready"; private final FileBasedConfig cfg; - public GerritIndexStatus(SitePaths sitePaths) - throws ConfigInvalidException, IOException { - cfg = new FileBasedConfig( - sitePaths.index_dir.resolve("gerrit_index.config").toFile(), - FS.detect()); + public GerritIndexStatus(SitePaths sitePaths) throws ConfigInvalidException, IOException { + cfg = + new FileBasedConfig( + sitePaths.index_dir.resolve("gerrit_index.config").toFile(), FS.detect()); cfg.load(); convertLegacyConfig(); } @@ -44,8 +41,7 @@ public class GerritIndexStatus { } public boolean getReady(String indexName, int version) { - return cfg.getBoolean(SECTION, indexDirName(indexName, version), KEY_READY, - false); + return cfg.getBoolean(SECTION, indexDirName(indexName, version), KEY_READY, false); } public void save() throws IOException { @@ -62,8 +58,7 @@ public class GerritIndexStatus { if (ready != null) { dirty = false; cfg.unset(SECTION, subsection, KEY_READY); - cfg.setString(SECTION, indexDirName(ChangeSchemaDefinitions.NAME, v), - KEY_READY, ready); + cfg.setString(SECTION, indexDirName(ChangeSchemaDefinitions.NAME, v), KEY_READY, ready); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/Index.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/Index.java index 887715f393..3be201a538 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/Index.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/Index.java @@ -18,20 +18,18 @@ import com.google.gerrit.server.query.DataSource; import com.google.gerrit.server.query.Predicate; import com.google.gerrit.server.query.QueryParseException; import com.google.gwtorm.server.OrmException; - import java.io.IOException; import java.util.List; import java.util.Optional; /** * Secondary index implementation for arbitrary documents. - *

- * Documents are inserted into the index and are queried by converting special - * {@link com.google.gerrit.server.query.Predicate} instances into index-aware - * predicates that use the index search results as a source. - *

- * Implementations must be thread-safe and should batch inserts/updates where - * appropriate. + * + *

Documents are inserted into the index and are queried by converting special {@link + * com.google.gerrit.server.query.Predicate} instances into index-aware predicates that use the + * index search results as a source. + * + *

Implementations must be thread-safe and should batch inserts/updates where appropriate. */ public interface Index { /** @return the schema version used by this index. */ @@ -45,14 +43,12 @@ public interface Index { /** * Update a document in the index. - *

- * Semantically equivalent to deleting the document and reinserting it with - * new field values. A document that does not already exist is created. Results - * may not be immediately visible to searchers, but should be visible within a - * reasonable amount of time. + * + *

Semantically equivalent to deleting the document and reinserting it with new field values. A + * document that does not already exist is created. Results may not be immediately visible to + * searchers, but should be visible within a reasonable amount of time. * * @param obj document object - * * @throws IOException */ void replace(V obj) throws IOException; @@ -61,7 +57,6 @@ public interface Index { * Delete a document from the index by key. * * @param key document key - * * @throws IOException */ void delete(K key) throws IOException; @@ -74,34 +69,28 @@ public interface Index { void deleteAll() throws IOException; /** - * Convert the given operator predicate into a source searching the index and - * returning only the documents matching that predicate. - *

- * This method may be called multiple times for variations on the same - * predicate or multiple predicate subtrees in the course of processing a - * single query, so it should not have any side effects (e.g. starting a - * search in the background). + * Convert the given operator predicate into a source searching the index and returning only the + * documents matching that predicate. * - * @param p the predicate to match. Must be a tree containing only AND, OR, - * or NOT predicates as internal nodes, and {@link IndexPredicate}s as - * leaves. - * @param opts query options not implied by the predicate, such as start and - * limit. - * @return a source of documents matching the predicate, returned in a - * defined order depending on the type of documents. + *

This method may be called multiple times for variations on the same predicate or multiple + * predicate subtrees in the course of processing a single query, so it should not have any side + * effects (e.g. starting a search in the background). * - * @throws QueryParseException if the predicate could not be converted to an - * indexed data source. + * @param p the predicate to match. Must be a tree containing only AND, OR, or NOT predicates as + * internal nodes, and {@link IndexPredicate}s as leaves. + * @param opts query options not implied by the predicate, such as start and limit. + * @return a source of documents matching the predicate, returned in a defined order depending on + * the type of documents. + * @throws QueryParseException if the predicate could not be converted to an indexed data source. */ - DataSource getSource(Predicate p, QueryOptions opts) - throws QueryParseException; + DataSource getSource(Predicate p, QueryOptions opts) throws QueryParseException; /** * Get a single document from the index. * * @param key document key. - * @param opts query options. Options that do not make sense in the context of - * a single document, such as start, will be ignored. + * @param opts query options. Options that do not make sense in the context of a single document, + * such as start, will be ignored. * @return a single document if present. * @throws IOException */ @@ -121,8 +110,7 @@ public interface Index { case 1: return Optional.of(results.get(0)); default: - throw new IOException("Multiple results found in index for key " - + key + ": " + results); + throw new IOException("Multiple results found in index for key " + key + ": " + results); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexCollection.java index 61c4675c4b..a88785204f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexCollection.java @@ -16,15 +16,13 @@ package com.google.gerrit.server.index; import com.google.common.collect.Lists; import com.google.gerrit.extensions.events.LifecycleListener; - import java.util.Collection; import java.util.Collections; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.atomic.AtomicReference; /** Dynamic pointers to the index versions used for searching and writing. */ -public abstract class IndexCollection> - implements LifecycleListener { +public abstract class IndexCollection> implements LifecycleListener { private final CopyOnWriteArrayList writeIndexes; private final AtomicReference searchIndex; @@ -87,8 +85,7 @@ public abstract class IndexCollection> } @Override - public void start() { - } + public void start() {} @Override public void stop() { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexConfig.java index 12eb3479a5..a368190e47 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexConfig.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexConfig.java @@ -17,15 +17,13 @@ package com.google.gerrit.server.index; import static com.google.common.base.Preconditions.checkArgument; import com.google.auto.value.AutoValue; - import org.eclipse.jgit.lib.Config; /** * Implementation-specific configuration for secondary indexes. - *

- * Contains configuration that is tied to a specific index implementation but is - * otherwise global, i.e. not tied to a specific {@link Index} and schema - * version. + * + *

Contains configuration that is tied to a specific index implementation but is otherwise + * global, i.e. not tied to a specific {@link Index} and schema version. */ @AutoValue public abstract class IndexConfig { @@ -42,8 +40,7 @@ public abstract class IndexConfig { cfg.getInt("index", null, "maxTerms", 0)); } - public static IndexConfig create(int maxLimit, int maxPages, - int maxTerms) { + public static IndexConfig create(int maxLimit, int maxPages, int maxTerms) { return new AutoValue_IndexConfig( checkLimit(maxLimit, "maxLimit", Integer.MAX_VALUE), checkLimit(maxPages, "maxPages", Integer.MAX_VALUE), @@ -59,20 +56,19 @@ public abstract class IndexConfig { } /** - * @return maximum limit supported by the underlying index, or limited for - * performance reasons. + * @return maximum limit supported by the underlying index, or limited for performance reasons. */ public abstract int maxLimit(); /** - * @return maximum number of pages (limit / start) supported by the - * underlying index, or limited for performance reasons. + * @return maximum number of pages (limit / start) supported by the underlying index, or limited + * for performance reasons. */ public abstract int maxPages(); /** - * @return maximum number of total index query terms supported by the - * underlying index, or limited for performance reasons. + * @return maximum number of total index query terms supported by the underlying index, or limited + * for performance reasons. */ public abstract int maxTerms(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexDefinition.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexDefinition.java index 8787b2f8c7..340e35e789 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexDefinition.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexDefinition.java @@ -19,11 +19,11 @@ import com.google.inject.Provider; /** * Definition of an index over a Gerrit data type. - *

- * An index includes a set of schema definitions along with the - * specific implementations used to query the secondary index implementation in - * a running server. If you are just interested in the static definition of one - * or more schemas, see the implementations of {@link SchemaDefinitions}. + * + *

An index includes a set of schema definitions along with the specific implementations + * used to query the secondary index implementation in a running server. If you are just interested + * in the static definition of one or more schemas, see the implementations of {@link + * SchemaDefinitions}. */ public abstract class IndexDefinition> { public interface IndexFactory> { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexExecutor.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexExecutor.java index eb97fdc12a..f8145a40e2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexExecutor.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexExecutor.java @@ -19,13 +19,9 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.gerrit.server.git.QueueProvider.QueueType; import com.google.inject.BindingAnnotation; - import java.lang.annotation.Retention; -/** - * Marker on {@link ListeningExecutorService} used by secondary indexing - * threads. - */ +/** Marker on {@link ListeningExecutorService} used by secondary indexing threads. */ @Retention(RUNTIME) @BindingAnnotation public @interface IndexExecutor { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexModule.java index 73812c6a19..a8b423a1c1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexModule.java @@ -47,33 +47,31 @@ import com.google.inject.Key; import com.google.inject.Provides; import com.google.inject.ProvisionException; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.Config; - import java.util.Collection; import java.util.Set; +import org.eclipse.jgit.lib.Config; /** * Module for non-indexer-specific secondary index setup. - *

- * This module should not be used directly except by specific secondary indexer - * implementations (e.g. Lucene). + * + *

This module should not be used directly except by specific secondary indexer implementations + * (e.g. Lucene). */ public class IndexModule extends LifecycleModule { public enum IndexType { - LUCENE, ELASTICSEARCH + LUCENE, + ELASTICSEARCH } public static final ImmutableCollection> ALL_SCHEMA_DEFS = - ImmutableList.> of( + ImmutableList.>of( AccountSchemaDefinitions.INSTANCE, ChangeSchemaDefinitions.INSTANCE, GroupSchemaDefinitions.INSTANCE); /** Type of secondary index. */ public static IndexType getIndexType(Injector injector) { - Config cfg = injector.getInstance( - Key.get(Config.class, GerritServerConfig.class)); + Config cfg = injector.getInstance(Key.get(Config.class, GerritServerConfig.class)); return cfg.getEnum("index", null, "type", IndexType.LUCENE); } @@ -87,8 +85,8 @@ public class IndexModule extends LifecycleModule { this.batchExecutor = null; } - public IndexModule(ListeningExecutorService interactiveExecutor, - ListeningExecutorService batchExecutor) { + public IndexModule( + ListeningExecutorService interactiveExecutor, ListeningExecutorService batchExecutor) { this.threads = -1; this.interactiveExecutor = interactiveExecutor; this.batchExecutor = batchExecutor; @@ -114,32 +112,23 @@ public class IndexModule extends LifecycleModule { @Provides Collection> getIndexDefinitions( - AccountIndexDefinition accounts, - ChangeIndexDefinition changes, - GroupIndexDefinition groups) { + AccountIndexDefinition accounts, ChangeIndexDefinition changes, GroupIndexDefinition groups) { Collection> result = - ImmutableList.> of( - accounts, - groups, - changes); - Set expected = FluentIterable.from(ALL_SCHEMA_DEFS) - .transform(SchemaDefinitions::getName) - .toSet(); - Set actual = FluentIterable.from(result) - .transform(IndexDefinition::getName) - .toSet(); + ImmutableList.>of(accounts, groups, changes); + Set expected = + FluentIterable.from(ALL_SCHEMA_DEFS).transform(SchemaDefinitions::getName).toSet(); + Set actual = FluentIterable.from(result).transform(IndexDefinition::getName).toSet(); if (!expected.equals(actual)) { throw new ProvisionException( - "need index definitions for all schemas: " - + expected + " != " + actual); + "need index definitions for all schemas: " + expected + " != " + actual); } return result; } @Provides @Singleton - AccountIndexer getAccountIndexer(AccountIndexerImpl.Factory factory, - AccountIndexCollection indexes) { + AccountIndexer getAccountIndexer( + AccountIndexerImpl.Factory factory, AccountIndexCollection indexes) { return factory.create(indexes); } @@ -156,8 +145,7 @@ public class IndexModule extends LifecycleModule { @Provides @Singleton - GroupIndexer getGroupIndexer(GroupIndexerImpl.Factory factory, - GroupIndexCollection indexes) { + GroupIndexer getGroupIndexer(GroupIndexerImpl.Factory factory, GroupIndexCollection indexes) { return factory.create(indexes); } @@ -165,8 +153,7 @@ public class IndexModule extends LifecycleModule { @Singleton @IndexExecutor(INTERACTIVE) ListeningExecutorService getInteractiveIndexExecutor( - @GerritServerConfig Config config, - WorkQueue workQueue) { + @GerritServerConfig Config config, WorkQueue workQueue) { if (interactiveExecutor != null) { return interactiveExecutor; } @@ -177,16 +164,14 @@ public class IndexModule extends LifecycleModule { if (threads <= 0) { threads = Runtime.getRuntime().availableProcessors() / 2 + 1; } - return MoreExecutors.listeningDecorator( - workQueue.createQueue(threads, "Index-Interactive")); + return MoreExecutors.listeningDecorator(workQueue.createQueue(threads, "Index-Interactive")); } @Provides @Singleton @IndexExecutor(BATCH) ListeningExecutorService getBatchIndexExecutor( - @GerritServerConfig Config config, - WorkQueue workQueue) { + @GerritServerConfig Config config, WorkQueue workQueue) { if (batchExecutor != null) { return batchExecutor; } @@ -194,7 +179,6 @@ public class IndexModule extends LifecycleModule { if (threads <= 0) { threads = Runtime.getRuntime().availableProcessors(); } - return MoreExecutors.listeningDecorator( - workQueue.createQueue(threads, "Index-Batch")); + return MoreExecutors.listeningDecorator(workQueue.createQueue(threads, "Index-Batch")); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexRewriter.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexRewriter.java index 276c52b08f..5c1d838939 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexRewriter.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexRewriter.java @@ -19,6 +19,5 @@ import com.google.gerrit.server.query.QueryParseException; public interface IndexRewriter { - Predicate rewrite(Predicate in, QueryOptions opts) - throws QueryParseException; + Predicate rewrite(Predicate in, QueryOptions opts) throws QueryParseException; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexUtils.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexUtils.java index eceec59dc0..d01d1cecd0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexUtils.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexUtils.java @@ -24,19 +24,16 @@ import com.google.common.collect.Sets; import com.google.gerrit.server.config.SitePaths; import com.google.gerrit.server.index.account.AccountField; import com.google.gerrit.server.index.group.GroupField; - -import org.eclipse.jgit.errors.ConfigInvalidException; - import java.io.IOException; import java.util.Map; import java.util.Set; +import org.eclipse.jgit.errors.ConfigInvalidException; public final class IndexUtils { - public static final Map CUSTOM_CHAR_MAPPING = - ImmutableMap.of("_", " ", ".", " "); + public static final Map CUSTOM_CHAR_MAPPING = ImmutableMap.of("_", " ", ".", " "); - public static void setReady(SitePaths sitePaths, String name, int version, - boolean ready) throws IOException { + public static void setReady(SitePaths sitePaths, String name, int version, boolean ready) + throws IOException { try { GerritIndexStatus cfg = new GerritIndexStatus(sitePaths); cfg.setReady(name, version, ready); @@ -65,8 +62,7 @@ public final class IndexUtils { if (fs.contains(PROJECT.getName()) && fs.contains(LEGACY_ID.getName())) { return fs; } - return Sets.union(fs, - ImmutableSet.of(LEGACY_ID.getName(), PROJECT.getName())); + return Sets.union(fs, ImmutableSet.of(LEGACY_ID.getName(), PROJECT.getName())); } public static Set groupFields(QueryOptions opts) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexedQuery.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexedQuery.java index 65097b477a..b8f21f5df3 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexedQuery.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexedQuery.java @@ -22,31 +22,29 @@ import com.google.gerrit.server.query.Predicate; import com.google.gerrit.server.query.QueryParseException; import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.ResultSet; - import java.util.Collection; import java.util.List; /** - * Wrapper combining an {@link IndexPredicate} together with a - * {@link DataSource} that returns matching results from the index. - *

- * Appropriate to return as the rootmost predicate that can be processed using - * the secondary index; such predicates must also implement {@link DataSource} - * to be chosen by the query processor. + * Wrapper combining an {@link IndexPredicate} together with a {@link DataSource} that returns + * matching results from the index. + * + *

Appropriate to return as the rootmost predicate that can be processed using the secondary + * index; such predicates must also implement {@link DataSource} to be chosen by the query + * processor. * * @param The type of the IDs by which the entities are stored in the index. * @param The type of the entities that are stored in the index. */ -public class IndexedQuery extends Predicate - implements DataSource, Paginated { +public class IndexedQuery extends Predicate implements DataSource, Paginated { protected final Index index; private QueryOptions opts; private final Predicate pred; protected DataSource source; - public IndexedQuery(Index index, Predicate pred, - QueryOptions opts) throws QueryParseException { + public IndexedQuery(Index index, Predicate pred, QueryOptions opts) + throws QueryParseException { this.index = index; this.opts = opts; this.pred = pred; @@ -118,15 +116,11 @@ public class IndexedQuery extends Predicate return false; } IndexedQuery o = (IndexedQuery) other; - return pred.equals(o.pred) - && opts.equals(o.opts); + return pred.equals(o.pred) && opts.equals(o.opts); } @Override public String toString() { - return MoreObjects.toStringHelper("index") - .add("p", pred) - .add("opts", opts) - .toString(); + return MoreObjects.toStringHelper("index").add("p", pred).add("opts", opts).toString(); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/IntegerRangePredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/IntegerRangePredicate.java index e62a685222..5832694f62 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/IntegerRangePredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/IntegerRangePredicate.java @@ -22,8 +22,8 @@ import com.google.gwtorm.server.OrmException; public abstract class IntegerRangePredicate extends IndexPredicate { private final Range range; - protected IntegerRangePredicate(FieldDef type, - String value) throws QueryParseException { + protected IntegerRangePredicate(FieldDef type, String value) + throws QueryParseException { super(type, value); range = RangeUtil.getRange(value, Integer.MIN_VALUE, Integer.MAX_VALUE); if (range == null) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/OnlineReindexer.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/OnlineReindexer.java index 133d78b373..e40015ad01 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/OnlineReindexer.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/OnlineReindexer.java @@ -17,17 +17,14 @@ package com.google.gerrit.server.index; import static com.google.common.base.Preconditions.checkNotNull; import com.google.common.collect.Lists; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class OnlineReindexer> { - private static final Logger log = LoggerFactory - .getLogger(OnlineReindexer.class); + private static final Logger log = LoggerFactory.getLogger(OnlineReindexer.class); private final IndexCollection indexes; private final SiteIndexer batchIndexer; @@ -35,9 +32,7 @@ public class OnlineReindexer> { private I index; private final AtomicBoolean running = new AtomicBoolean(); - public OnlineReindexer( - IndexDefinition def, - int version) { + public OnlineReindexer(IndexDefinition def, int version) { this.indexes = def.getIndexCollection(); this.batchIndexer = def.getSiteIndexer(); this.version = version; @@ -45,18 +40,18 @@ public class OnlineReindexer> { public void start() { if (running.compareAndSet(false, true)) { - Thread t = new Thread() { - @Override - public void run() { - try { - reindex(); - } finally { - running.set(false); - } - } - }; - t.setName(String.format("Reindex v%d-v%d", - version(indexes.getSearchIndex()), version)); + Thread t = + new Thread() { + @Override + public void run() { + try { + reindex(); + } finally { + running.set(false); + } + } + }; + t.setName(String.format("Reindex v%d-v%d", version(indexes.getSearchIndex()), version)); t.start(); } } @@ -74,15 +69,21 @@ public class OnlineReindexer> { } private void reindex() { - index = checkNotNull(indexes.getWriteIndex(version), - "not an active write schema version: %s", version); - log.info("Starting online reindex from schema version {} to {}", - version(indexes.getSearchIndex()), version(index)); + index = + checkNotNull( + indexes.getWriteIndex(version), "not an active write schema version: %s", version); + log.info( + "Starting online reindex from schema version {} to {}", + version(indexes.getSearchIndex()), + version(index)); SiteIndexer.Result result = batchIndexer.indexAll(index); if (!result.success()) { - log.error("Online reindex of schema version {} failed. Successfully" - + " indexed {} changes, failed to index {} changes", - version(index), result.doneCount(), result.failedCount()); + log.error( + "Online reindex of schema version {} failed. Successfully" + + " indexed {} changes, failed to index {} changes", + version(index), + result.doneCount(), + result.failedCount()); return; } log.info("Reindex to version {} complete", version(index)); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/QueryOptions.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/QueryOptions.java index d0c20952ba..a26b0ace16 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/QueryOptions.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/QueryOptions.java @@ -19,17 +19,14 @@ import static com.google.common.base.Preconditions.checkArgument; import com.google.auto.value.AutoValue; import com.google.common.collect.ImmutableSet; import com.google.common.primitives.Ints; - import java.util.Set; @AutoValue public abstract class QueryOptions { - public static QueryOptions create(IndexConfig config, int start, int limit, - Set fields) { + public static QueryOptions create(IndexConfig config, int start, int limit, Set fields) { checkArgument(start >= 0, "start must be nonnegative: %s", start); checkArgument(limit > 0, "limit must be positive: %s", limit); - return new AutoValue_QueryOptions(config, start, limit, - ImmutableSet.copyOf(fields)); + return new AutoValue_QueryOptions(config, start, limit, ImmutableSet.copyOf(fields)); } public QueryOptions convertForBackend() { @@ -42,8 +39,11 @@ public abstract class QueryOptions { } public abstract IndexConfig config(); + public abstract int start(); + public abstract int limit(); + public abstract ImmutableSet fields(); public QueryOptions withLimit(int newLimit) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/Schema.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/Schema.java index faa6934249..5e06242b66 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/Schema.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/Schema.java @@ -24,15 +24,13 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.gerrit.server.index.FieldDef.FillArgs; import com.google.gwtorm.server.OrmException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Optional; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** Specific version of a secondary index schema. */ public class Schema { @@ -81,10 +79,8 @@ public class Schema { } } - private static FieldDef checkSame(FieldDef f1, - FieldDef f2) { - checkState(f1 == f2, "Mismatched %s fields: %s != %s", - f1.getName(), f1, f2); + private static FieldDef checkSame(FieldDef f1, FieldDef f2) { + checkState(f1 == f2, "Mismatched %s fields: %s != %s", f1.getName(), f1, f2); return f1; } @@ -117,10 +113,10 @@ public class Schema { /** * Get all fields in this schema. - *

- * This is primarily useful for iteration. Most callers should prefer one - * of the helper methods {@link #getField(FieldDef, FieldDef...)} or {@link - * #hasField(FieldDef)} to looking up fields by name + * + *

This is primarily useful for iteration. Most callers should prefer one of the helper methods + * {@link #getField(FieldDef, FieldDef...)} or {@link #hasField(FieldDef)} to looking up fields by + * name * * @return all fields in this schema indexed by name. */ @@ -128,10 +124,7 @@ public class Schema { return fields; } - /** - * @return all fields in this schema where {@link FieldDef#isStored()} is - * true. - */ + /** @return all fields in this schema where {@link FieldDef#isStored()} is true. */ public final ImmutableMap> getStoredFields() { return storedFields; } @@ -141,12 +134,11 @@ public class Schema { * * @param first the preferred field to look up. * @param rest additional fields to look up. - * @return the first field in the schema matching {@code first} or {@code - * rest}, in order, or absent if no field matches. + * @return the first field in the schema matching {@code first} or {@code rest}, in order, or + * absent if no field matches. */ @SafeVarargs - public final Optional> getField(FieldDef first, - FieldDef... rest) { + public final Optional> getField(FieldDef first, FieldDef... rest) { FieldDef field = fields.get(first.getName()); if (field != null) { return Optional.of(checkSame(field, first)); @@ -177,44 +169,41 @@ public class Schema { /** * Build all fields in the schema from an input object. - *

- * Null values are omitted, as are fields which cause errors, which are - * logged. + * + *

Null values are omitted, as are fields which cause errors, which are logged. * * @param obj input object. * @param fillArgs arguments for filling fields. * @return all non-null field values from the object. */ - public final Iterable> buildFields( - final T obj, final FillArgs fillArgs) { + public final Iterable> buildFields(final T obj, final FillArgs fillArgs) { return FluentIterable.from(fields.values()) - .transform(new Function, Values>() { - @Override - public Values apply(FieldDef f) { - Object v; - try { - v = f.get(obj, fillArgs); - } catch (OrmException e) { - log.error(String.format("error getting field %s of %s", - f.getName(), obj), e); - return null; - } - if (v == null) { - return null; - } else if (f.isRepeatable()) { - return new Values<>(f, (Iterable) v); - } else { - return new Values<>(f, Collections.singleton(v)); - } - } - }).filter(Predicates.notNull()); + .transform( + new Function, Values>() { + @Override + public Values apply(FieldDef f) { + Object v; + try { + v = f.get(obj, fillArgs); + } catch (OrmException e) { + log.error(String.format("error getting field %s of %s", f.getName(), obj), e); + return null; + } + if (v == null) { + return null; + } else if (f.isRepeatable()) { + return new Values<>(f, (Iterable) v); + } else { + return new Values<>(f, Collections.singleton(v)); + } + } + }) + .filter(Predicates.notNull()); } @Override public String toString() { - return MoreObjects.toStringHelper(this) - .addValue(fields.keySet()) - .toString(); + return MoreObjects.toStringHelper(this).addValue(fields.keySet()).toString(); } public void setVersion(int version) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/SchemaDefinitions.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/SchemaDefinitions.java index f9a799e253..2bcf03a01f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/SchemaDefinitions.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/SchemaDefinitions.java @@ -21,12 +21,11 @@ import com.google.common.collect.ImmutableSortedMap; /** * Definitions of the various schema versions over a given Gerrit data type. - *

- * A schema is a description of the fields that are indexed over the - * given data type. This class contains all the versions of a schema defined - * over its data type, exposed as a map of version number to schema definition. - * If you are interested in the classes responsible for backend-specific runtime - * implementations, see the implementations of {@link IndexDefinition}. + * + *

A schema is a description of the fields that are indexed over the given data type. + * This class contains all the versions of a schema defined over its data type, exposed as a map of + * version number to schema definition. If you are interested in the classes responsible for + * backend-specific runtime implementations, see the implementations of {@link IndexDefinition}. */ public abstract class SchemaDefinitions { private final String name; @@ -47,8 +46,7 @@ public abstract class SchemaDefinitions { public final Schema get(int version) { Schema schema = schemas.get(version); - checkArgument(schema != null, - "Unrecognized %s schema version: %s", name, version); + checkArgument(schema != null, "Unrecognized %s schema version: %s", name, version); return schema; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/SchemaUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/SchemaUtil.java index 28e43a7012..ea33190e6a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/SchemaUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/SchemaUtil.java @@ -22,9 +22,6 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSortedMap; import com.google.common.collect.Iterables; - -import org.eclipse.jgit.lib.PersonIdent; - import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.lang.reflect.ParameterizedType; @@ -35,6 +32,7 @@ import java.util.HashSet; import java.util.Locale; import java.util.Map; import java.util.Set; +import org.eclipse.jgit.lib.PersonIdent; public class SchemaUtil { public static ImmutableSortedMap> schemasFromClass( @@ -73,8 +71,7 @@ public class SchemaUtil { } @SafeVarargs - public static Schema schema(Schema schema, - FieldDef... moreFields) { + public static Schema schema(Schema schema, FieldDef... moreFields) { return new Schema<>( new ImmutableList.Builder>() .addAll(schema.getFields().values()) @@ -91,17 +88,14 @@ public class SchemaUtil { if (person == null) { return ImmutableSet.of(); } - return getNameParts( - person.getName(), - Collections.singleton(person.getEmailAddress())); + return getNameParts(person.getName(), Collections.singleton(person.getEmailAddress())); } public static Set getNameParts(String name) { return getNameParts(name, Collections.emptySet()); } - public static Set getNameParts(String name, - Iterable emails) { + public static Set getNameParts(String name, Iterable emails) { Splitter at = Splitter.on('@'); Splitter s = Splitter.on(CharMatcher.anyOf("@.- /_")).omitEmptyStrings(); HashSet parts = new HashSet<>(); @@ -120,6 +114,5 @@ public class SchemaUtil { return parts; } - private SchemaUtil() { - } + private SchemaUtil() {} } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/SingleVersionModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/SingleVersionModule.java index b86ec38312..2df0b40089 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/SingleVersionModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/SingleVersionModule.java @@ -24,12 +24,10 @@ import com.google.inject.Singleton; import com.google.inject.TypeLiteral; import com.google.inject.name.Named; import com.google.inject.name.Names; - -import org.eclipse.jgit.lib.Config; - import java.util.Collection; import java.util.Map; import java.util.Set; +import org.eclipse.jgit.lib.Config; @Singleton public class SingleVersionModule extends LifecycleModule { @@ -63,8 +61,7 @@ public class SingleVersionModule extends LifecycleModule { this.defs = defs; this.singleVersions = singleVersions; - disabled = ImmutableSet.copyOf( - cfg.getStringList("index", null, "testDisable")); + disabled = ImmutableSet.copyOf(cfg.getStringList("index", null, "testDisable")); } @Override @@ -74,8 +71,7 @@ public class SingleVersionModule extends LifecycleModule { } } - private > void start( - IndexDefinition def) { + private > void start(IndexDefinition def) { if (disabled.contains(def.getName())) { return; } @@ -86,8 +82,8 @@ public class SingleVersionModule extends LifecycleModule { } else { schema = def.getSchemas().get(v); if (schema == null) { - throw new ProvisionException(String.format( - "Unrecognized %s schema version: %s", def.getName(), v)); + throw new ProvisionException( + String.format("Unrecognized %s schema version: %s", def.getName(), v)); } } I index = def.getIndexFactory().create(schema); @@ -100,4 +96,4 @@ public class SingleVersionModule extends LifecycleModule { // Do nothing; indexes are closed by IndexCollection. } } -} \ No newline at end of file +} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/SiteIndexer.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/SiteIndexer.java index 8ee1cedb64..69e1cf115d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/SiteIndexer.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/SiteIndexer.java @@ -19,17 +19,15 @@ import static com.google.common.base.Preconditions.checkNotNull; import com.google.common.base.Stopwatch; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.MoreExecutors; - -import org.eclipse.jgit.lib.ProgressMonitor; -import org.eclipse.jgit.util.io.NullOutputStream; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.OutputStream; import java.io.PrintWriter; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; +import org.eclipse.jgit.lib.ProgressMonitor; +import org.eclipse.jgit.util.io.NullOutputStream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public abstract class SiteIndexer> { private static final Logger log = LoggerFactory.getLogger(SiteIndexer.class); @@ -66,8 +64,7 @@ public abstract class SiteIndexer> { protected int totalWork = -1; protected OutputStream progressOut = NullOutputStream.INSTANCE; - protected PrintWriter verboseWriter = - new PrintWriter(NullOutputStream.INSTANCE); + protected PrintWriter verboseWriter = new PrintWriter(NullOutputStream.INSTANCE); public void setTotalWork(int num) { totalWork = num; @@ -83,11 +80,10 @@ public abstract class SiteIndexer> { public abstract Result indexAll(I index); - protected final void addErrorListener(ListenableFuture future, - String desc, ProgressMonitor progress, AtomicBoolean ok) { + protected final void addErrorListener( + ListenableFuture future, String desc, ProgressMonitor progress, AtomicBoolean ok) { future.addListener( - new ErrorListener(future, desc, progress, ok), - MoreExecutors.directExecutor()); + new ErrorListener(future, desc, progress, ok), MoreExecutors.directExecutor()); } private static class ErrorListener implements Runnable { @@ -96,8 +92,8 @@ public abstract class SiteIndexer> { private final ProgressMonitor progress; private final AtomicBoolean ok; - private ErrorListener(ListenableFuture future, String desc, - ProgressMonitor progress, AtomicBoolean ok) { + private ErrorListener( + ListenableFuture future, String desc, ProgressMonitor progress, AtomicBoolean ok) { this.future = future; this.desc = desc; this.progress = progress; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/TimestampRangePredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/TimestampRangePredicate.java index 1e2e80b188..7e194b7e37 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/TimestampRangePredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/TimestampRangePredicate.java @@ -16,7 +16,6 @@ package com.google.gerrit.server.index; import com.google.gerrit.server.query.QueryParseException; import com.google.gwtjsonrpc.common.JavaSqlTimestampHelper; - import java.sql.Timestamp; import java.util.Date; @@ -31,11 +30,11 @@ public abstract class TimestampRangePredicate extends IndexPredicate { } } - protected TimestampRangePredicate(FieldDef def, - String name, String value) { + protected TimestampRangePredicate(FieldDef def, String name, String value) { super(def, name, value); } public abstract Date getMinTimestamp(); + public abstract Date getMaxTimestamp(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountField.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountField.java index de5428f48c..b9d78e0597 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountField.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountField.java @@ -23,7 +23,6 @@ import com.google.gerrit.server.account.AccountState; import com.google.gerrit.server.index.FieldDef; import com.google.gerrit.server.index.FieldType; import com.google.gerrit.server.index.SchemaUtil; - import java.sql.Timestamp; import java.util.Collections; import java.util.Locale; @@ -32,8 +31,7 @@ import java.util.Set; /** Secondary index schemas for accounts. */ public class AccountField { public static final FieldDef ID = - new FieldDef.Single( - "id", FieldType.INTEGER, true) { + new FieldDef.Single("id", FieldType.INTEGER, true) { @Override public Integer get(AccountState input, FillArgs args) { return input.getAccount().getId().get(); @@ -41,27 +39,23 @@ public class AccountField { }; public static final FieldDef> EXTERNAL_ID = - new FieldDef.Repeatable( - "external_id", FieldType.EXACT, false) { + new FieldDef.Repeatable("external_id", FieldType.EXACT, false) { @Override public Iterable get(AccountState input, FillArgs args) { - return Iterables.transform( - input.getExternalIds(), id -> id.getKey().get()); + return Iterables.transform(input.getExternalIds(), id -> id.getKey().get()); } }; /** Fuzzy prefix match on name and email parts. */ public static final FieldDef> NAME_PART = - new FieldDef.Repeatable( - "name", FieldType.PREFIX, false) { + new FieldDef.Repeatable("name", FieldType.PREFIX, false) { @Override public Iterable get(AccountState input, FillArgs args) { String fullName = input.getAccount().getFullName(); - Set parts = SchemaUtil.getNameParts( - fullName, - Iterables.transform( - input.getExternalIds(), - AccountExternalId::getEmailAddress)); + Set parts = + SchemaUtil.getNameParts( + fullName, + Iterables.transform(input.getExternalIds(), AccountExternalId::getEmailAddress)); // Additional values not currently added by getPersonParts. // TODO(dborowitz): Move to getPersonParts and remove this hack. @@ -73,8 +67,7 @@ public class AccountField { }; public static final FieldDef FULL_NAME = - new FieldDef.Single("full_name", FieldType.EXACT, - false) { + new FieldDef.Single("full_name", FieldType.EXACT, false) { @Override public String get(AccountState input, FillArgs args) { return input.getAccount().getFullName(); @@ -82,8 +75,7 @@ public class AccountField { }; public static final FieldDef ACTIVE = - new FieldDef.Single( - "inactive", FieldType.EXACT, false) { + new FieldDef.Single("inactive", FieldType.EXACT, false) { @Override public String get(AccountState input, FillArgs args) { return input.getAccount().isActive() ? "1" : "0"; @@ -91,23 +83,20 @@ public class AccountField { }; public static final FieldDef> EMAIL = - new FieldDef.Repeatable( - "email", FieldType.PREFIX, false) { + new FieldDef.Repeatable("email", FieldType.PREFIX, false) { @Override public Iterable get(AccountState input, FillArgs args) { return FluentIterable.from(input.getExternalIds()) - .transform(AccountExternalId::getEmailAddress) - .append( - Collections.singleton(input.getAccount().getPreferredEmail())) - .filter(Predicates.notNull()) - .transform(String::toLowerCase) - .toSet(); + .transform(AccountExternalId::getEmailAddress) + .append(Collections.singleton(input.getAccount().getPreferredEmail())) + .filter(Predicates.notNull()) + .transform(String::toLowerCase) + .toSet(); } }; public static final FieldDef REGISTERED = - new FieldDef.Single( - "registered", FieldType.TIMESTAMP, false) { + new FieldDef.Single("registered", FieldType.TIMESTAMP, false) { @Override public Timestamp get(AccountState input, FillArgs args) { return input.getAccount().getRegisteredOn(); @@ -115,8 +104,7 @@ public class AccountField { }; public static final FieldDef USERNAME = - new FieldDef.Single( - "username", FieldType.EXACT, false) { + new FieldDef.Single("username", FieldType.EXACT, false) { @Override public String get(AccountState input, FillArgs args) { return Strings.nullToEmpty(input.getUserName()).toLowerCase(); @@ -124,8 +112,7 @@ public class AccountField { }; public static final FieldDef> WATCHED_PROJECT = - new FieldDef.Repeatable( - "watchedproject", FieldType.EXACT, false) { + new FieldDef.Repeatable("watchedproject", FieldType.EXACT, false) { @Override public Iterable get(AccountState input, FillArgs args) { return FluentIterable.from(input.getProjectWatches().keySet()) @@ -134,6 +121,5 @@ public class AccountField { } }; - private AccountField() { - } + private AccountField() {} } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndex.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndex.java index 406982ab29..ffa94ec4be 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndex.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndex.java @@ -22,9 +22,8 @@ import com.google.gerrit.server.query.Predicate; import com.google.gerrit.server.query.account.AccountPredicates; public interface AccountIndex extends Index { - public interface Factory extends - IndexDefinition.IndexFactory { - } + public interface Factory + extends IndexDefinition.IndexFactory {} @Override default Predicate keyPredicate(Account.Id id) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexCollection.java index 6aa516c946..2eb8235c76 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexCollection.java @@ -22,10 +22,9 @@ import com.google.inject.Inject; import com.google.inject.Singleton; @Singleton -public class AccountIndexCollection extends - IndexCollection { +public class AccountIndexCollection + extends IndexCollection { @Inject @VisibleForTesting - public AccountIndexCollection() { - } + public AccountIndexCollection() {} } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexDefinition.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexDefinition.java index 31a9250728..72f23bec6f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexDefinition.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexDefinition.java @@ -29,7 +29,10 @@ public class AccountIndexDefinition AccountIndexCollection indexCollection, AccountIndex.Factory indexFactory, @Nullable AllAccountsIndexer allAccountsIndexer) { - super(AccountSchemaDefinitions.INSTANCE, indexCollection, indexFactory, + super( + AccountSchemaDefinitions.INSTANCE, + indexCollection, + indexFactory, Providers.of(allAccountsIndexer)); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexRewriter.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexRewriter.java index 65e9b093a6..4fd7833a79 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexRewriter.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexRewriter.java @@ -36,8 +36,8 @@ public class AccountIndexRewriter implements IndexRewriter { } @Override - public Predicate rewrite(Predicate in, - QueryOptions opts) throws QueryParseException { + public Predicate rewrite(Predicate in, QueryOptions opts) + throws QueryParseException { if (!AccountPredicates.hasActive(in)) { in = Predicate.and(in, AccountPredicates.isActive()); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexer.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexer.java index 320356375b..dd24714690 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexer.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexer.java @@ -15,7 +15,6 @@ package com.google.gerrit.server.index.account; import com.google.gerrit.reviewdb.client.Account; - import java.io.IOException; public interface AccountIndexer { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexerImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexerImpl.java index d3bfeb8281..027d4c3775 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexerImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexerImpl.java @@ -22,7 +22,6 @@ import com.google.gerrit.server.account.AccountState; import com.google.gerrit.server.index.Index; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - import java.io.IOException; import java.util.Collection; import java.util.Collections; @@ -30,6 +29,7 @@ import java.util.Collections; public class AccountIndexerImpl implements AccountIndexer { public interface Factory { AccountIndexerImpl create(AccountIndexCollection indexes); + AccountIndexerImpl create(@Nullable AccountIndex index); } @@ -38,16 +38,14 @@ public class AccountIndexerImpl implements AccountIndexer { private final AccountIndex index; @AssistedInject - AccountIndexerImpl(AccountCache byIdCache, - @Assisted AccountIndexCollection indexes) { + AccountIndexerImpl(AccountCache byIdCache, @Assisted AccountIndexCollection indexes) { this.byIdCache = byIdCache; this.indexes = indexes; this.index = null; } @AssistedInject - AccountIndexerImpl(AccountCache byIdCache, - @Assisted AccountIndex index) { + AccountIndexerImpl(AccountCache byIdCache, @Assisted AccountIndex index) { this.byIdCache = byIdCache; this.indexes = null; this.index = index; @@ -65,8 +63,6 @@ public class AccountIndexerImpl implements AccountIndexer { return indexes.getWriteIndexes(); } - return index != null - ? Collections.singleton(index) - : ImmutableSet. of(); + return index != null ? Collections.singleton(index) : ImmutableSet.of(); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountSchemaDefinitions.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountSchemaDefinitions.java index 05e49b9d52..011f1d1174 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountSchemaDefinitions.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountSchemaDefinitions.java @@ -22,27 +22,23 @@ import com.google.gerrit.server.index.SchemaDefinitions; public class AccountSchemaDefinitions extends SchemaDefinitions { @Deprecated - static final Schema V1 = schema( - AccountField.ID, - AccountField.ACTIVE, - AccountField.EMAIL, - AccountField.EXTERNAL_ID, - AccountField.NAME_PART, - AccountField.REGISTERED, - AccountField.USERNAME); + static final Schema V1 = + schema( + AccountField.ID, + AccountField.ACTIVE, + AccountField.EMAIL, + AccountField.EXTERNAL_ID, + AccountField.NAME_PART, + AccountField.REGISTERED, + AccountField.USERNAME); - @Deprecated - static final Schema V2 = - schema(V1, AccountField.WATCHED_PROJECT); + @Deprecated static final Schema V2 = schema(V1, AccountField.WATCHED_PROJECT); - @Deprecated - static final Schema V3 = - schema(V2, AccountField.FULL_NAME); + @Deprecated static final Schema V3 = schema(V2, AccountField.FULL_NAME); static final Schema V4 = schema(V3); - public static final AccountSchemaDefinitions INSTANCE = - new AccountSchemaDefinitions(); + public static final AccountSchemaDefinitions INSTANCE = new AccountSchemaDefinitions(); private AccountSchemaDefinitions() { super("accounts", AccountState.class); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AllAccountsIndexer.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AllAccountsIndexer.java index 14264afb75..1b84e8e5a7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AllAccountsIndexer.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AllAccountsIndexer.java @@ -30,12 +30,6 @@ import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.SchemaFactory; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.ProgressMonitor; -import org.eclipse.jgit.lib.TextProgressMonitor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; @@ -43,12 +37,14 @@ import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; +import org.eclipse.jgit.lib.ProgressMonitor; +import org.eclipse.jgit.lib.TextProgressMonitor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Singleton -public class AllAccountsIndexer - extends SiteIndexer { - private static final Logger log = - LoggerFactory.getLogger(AllAccountsIndexer.class); +public class AllAccountsIndexer extends SiteIndexer { + private static final Logger log = LoggerFactory.getLogger(AllAccountsIndexer.class); private final SchemaFactory schemaFactory; private final ListeningExecutorService executor; @@ -66,8 +62,7 @@ public class AllAccountsIndexer @Override public SiteIndexer.Result indexAll(final AccountIndex index) { - ProgressMonitor progress = - new TextProgressMonitor(new PrintWriter(progressOut)); + ProgressMonitor progress = new TextProgressMonitor(new PrintWriter(progressOut)); progress.start(2); Stopwatch sw = Stopwatch.createStarted(); List ids; @@ -80,8 +75,8 @@ public class AllAccountsIndexer return reindexAccounts(index, ids, progress); } - private SiteIndexer.Result reindexAccounts(final AccountIndex index, - List ids, ProgressMonitor progress) { + private SiteIndexer.Result reindexAccounts( + final AccountIndex index, List ids, ProgressMonitor progress) { progress.beginTask("Reindexing accounts", ids.size()); List> futures = new ArrayList<>(ids.size()); AtomicBoolean ok = new AtomicBoolean(true); @@ -90,22 +85,23 @@ public class AllAccountsIndexer Stopwatch sw = Stopwatch.createStarted(); for (final Account.Id id : ids) { final String desc = "account " + id; - ListenableFuture future = executor.submit( - new Callable() { - @Override - public Void call() throws Exception { - try { - accountCache.evict(id); - index.replace(accountCache.get(id)); - verboseWriter.println("Reindexed " + desc); - done.incrementAndGet(); - } catch (Exception e) { - failed.incrementAndGet(); - throw e; - } - return null; - } - }); + ListenableFuture future = + executor.submit( + new Callable() { + @Override + public Void call() throws Exception { + try { + accountCache.evict(id); + index.replace(accountCache.get(id)); + verboseWriter.println("Reindexed " + desc); + done.incrementAndGet(); + } catch (Exception e) { + failed.incrementAndGet(); + throw e; + } + return null; + } + }); addErrorListener(future, desc, progress, ok); futures.add(future); } @@ -121,8 +117,7 @@ public class AllAccountsIndexer return new SiteIndexer.Result(sw, ok.get(), done.get(), failed.get()); } - private List collectAccounts(ProgressMonitor progress) - throws OrmException { + private List collectAccounts(ProgressMonitor progress) throws OrmException { progress.beginTask("Collecting accounts", ProgressMonitor.UNKNOWN); List ids = new ArrayList<>(); try (ReviewDb db = schemaFactory.open()) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/IndexedAccountQuery.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/IndexedAccountQuery.java index 76103fc360..8c29266149 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/IndexedAccountQuery.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/IndexedAccountQuery.java @@ -26,9 +26,9 @@ import com.google.gerrit.server.query.QueryParseException; public class IndexedAccountQuery extends IndexedQuery implements DataSource { - public IndexedAccountQuery(Index index, - Predicate pred, QueryOptions opts) - throws QueryParseException { + public IndexedAccountQuery( + Index index, Predicate pred, QueryOptions opts) + throws QueryParseException { super(index, pred, opts.convertForBackend()); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/AllChangesIndexer.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/AllChangesIndexer.java index 080aa5b172..fd275b8272 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/AllChangesIndexer.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/AllChangesIndexer.java @@ -45,7 +45,20 @@ import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.query.change.ChangeData; import com.google.gwtorm.server.SchemaFactory; import com.google.inject.Inject; - +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.atomic.AtomicBoolean; import org.eclipse.jgit.diff.DiffEntry; import org.eclipse.jgit.diff.DiffFormatter; import org.eclipse.jgit.errors.RepositoryNotFoundException; @@ -66,25 +79,8 @@ import org.eclipse.jgit.util.io.DisabledOutputStream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.SortedSet; -import java.util.TreeSet; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.atomic.AtomicBoolean; - -public class AllChangesIndexer - extends SiteIndexer { - private static final Logger log = - LoggerFactory.getLogger(AllChangesIndexer.class); +public class AllChangesIndexer extends SiteIndexer { + private static final Logger log = LoggerFactory.getLogger(AllChangesIndexer.class); private final SchemaFactory schemaFactory; private final ChangeData.Factory changeDataFactory; @@ -97,7 +93,8 @@ public class AllChangesIndexer private final AutoMerger autoMerger; @Inject - AllChangesIndexer(SchemaFactory schemaFactory, + AllChangesIndexer( + SchemaFactory schemaFactory, ChangeData.Factory changeDataFactory, GitRepositoryManager repoManager, @IndexExecutor(BATCH) ListeningExecutorService executor, @@ -159,26 +156,31 @@ public class AllChangesIndexer return indexAll(index, projects); } - public SiteIndexer.Result indexAll(ChangeIndex index, - Iterable projects) { + public SiteIndexer.Result indexAll(ChangeIndex index, Iterable projects) { Stopwatch sw = Stopwatch.createStarted(); - final MultiProgressMonitor mpm = - new MultiProgressMonitor(progressOut, "Reindexing changes"); - final Task projTask = mpm.beginSubTask("projects", - (projects instanceof Collection) - ? ((Collection) projects).size() - : MultiProgressMonitor.UNKNOWN); - final Task doneTask = mpm.beginSubTask(null, - totalWork >= 0 ? totalWork : MultiProgressMonitor.UNKNOWN); + final MultiProgressMonitor mpm = new MultiProgressMonitor(progressOut, "Reindexing changes"); + final Task projTask = + mpm.beginSubTask( + "projects", + (projects instanceof Collection) + ? ((Collection) projects).size() + : MultiProgressMonitor.UNKNOWN); + final Task doneTask = + mpm.beginSubTask(null, totalWork >= 0 ? totalWork : MultiProgressMonitor.UNKNOWN); final Task failedTask = mpm.beginSubTask("failed", MultiProgressMonitor.UNKNOWN); final List> futures = new ArrayList<>(); final AtomicBoolean ok = new AtomicBoolean(true); for (final ProjectHolder project : projects) { - ListenableFuture future = executor.submit(reindexProject( - indexerFactory.create(executor, index), project.name, doneTask, - failedTask, verboseWriter)); + ListenableFuture future = + executor.submit( + reindexProject( + indexerFactory.create(executor, index), + project.name, + doneTask, + failedTask, + verboseWriter)); addErrorListener(future, "project " + project.name, projTask, ok); futures.add(future); } @@ -204,15 +206,19 @@ public class AllChangesIndexer int nTotal = nFailed + nDone; double pctFailed = ((double) nFailed) / nTotal * 100; if (pctFailed > 10) { - log.error("Failed {}/{} changes ({}%); not marking new index as ready", + log.error( + "Failed {}/{} changes ({}%); not marking new index as ready", nFailed, nTotal, Math.round(pctFailed)); ok.set(false); } return new Result(sw, ok.get(), nDone, nFailed); } - private Callable reindexProject(final ChangeIndexer indexer, - final Project.NameKey project, final Task done, final Task failed, + private Callable reindexProject( + final ChangeIndexer indexer, + final Project.NameKey project, + final Task done, + final Task failed, final PrintWriter verboseWriter) { return new Callable() { @Override @@ -235,14 +241,9 @@ public class AllChangesIndexer byId.put(r.getObjectId(), changeDataFactory.create(db, cn)); } } - new ProjectIndexer(indexer, - mergeStrategy, - autoMerger, - byId, - repo, - done, - failed, - verboseWriter).call(); + new ProjectIndexer( + indexer, mergeStrategy, autoMerger, byId, repo, done, failed, verboseWriter) + .call(); } catch (RepositoryNotFoundException rnfe) { log.error(rnfe.getMessage()); } @@ -266,7 +267,8 @@ public class AllChangesIndexer private final PrintWriter verboseWriter; private final Repository repo; - private ProjectIndexer(ChangeIndexer indexer, + private ProjectIndexer( + ChangeIndexer indexer, ThreeWayMergeStrategy mergeStrategy, AutoMerger autoMerger, ListMultimap changesByCommitId, @@ -315,8 +317,7 @@ public class AllChangesIndexer return null; } - private void getPathsAndIndex(RevWalk walk, ObjectInserter ins, ObjectId b) - throws Exception { + private void getPathsAndIndex(RevWalk walk, ObjectInserter ins, ObjectId b) throws Exception { List cds = Lists.newArrayList(byId.get(b)); try (DiffFormatter df = new DiffFormatter(DisabledOutputStream.INSTANCE)) { RevCommit bCommit = walk.parseCommit(b); @@ -324,11 +325,10 @@ public class AllChangesIndexer RevTree aTree = aFor(bCommit, walk, ins); df.setRepository(repo); if (!cds.isEmpty()) { - List paths = (aTree != null) - ? getPaths(df.scan(aTree, bTree)) - : Collections.emptyList(); + List paths = + (aTree != null) ? getPaths(df.scan(aTree, bTree)) : Collections.emptyList(); Iterator cdit = cds.iterator(); - for (ChangeData cd ; cdit.hasNext(); cdit.remove()) { + for (ChangeData cd; cdit.hasNext(); cdit.remove()) { cd = cdit.next(); try { cd.setCurrentFilePaths(paths); @@ -361,8 +361,7 @@ public class AllChangesIndexer return ImmutableList.copyOf(paths); } - private RevTree aFor(RevCommit b, RevWalk walk, ObjectInserter ins) - throws IOException { + private RevTree aFor(RevCommit b, RevWalk walk, ObjectInserter ins) throws IOException { switch (b.getParentCount()) { case 0: return walk.parseTree(emptyTree()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeField.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeField.java index c943043c76..4747e1a0a5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeField.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeField.java @@ -59,9 +59,6 @@ import com.google.gwtorm.protobuf.CodecFactory; import com.google.gwtorm.protobuf.ProtobufCodec; import com.google.gwtorm.server.OrmException; import com.google.protobuf.CodedOutputStream; - -import org.eclipse.jgit.revwalk.FooterLine; - import java.io.ByteArrayOutputStream; import java.io.IOException; import java.sql.Timestamp; @@ -71,18 +68,17 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import org.eclipse.jgit.revwalk.FooterLine; /** * Fields indexed on change documents. - *

- * Each field corresponds to both a field name supported by - * {@link ChangeQueryBuilder} for querying that field, and a method on - * {@link ChangeData} used for populating the corresponding document fields in - * the secondary index. - *

- * Field names are all lowercase alphanumeric plus underscore; index - * implementations may create unambiguous derived field names containing other - * characters. + * + *

Each field corresponds to both a field name supported by {@link ChangeQueryBuilder} for + * querying that field, and a method on {@link ChangeData} used for populating the corresponding + * document fields in the secondary index. + * + *

Field names are all lowercase alphanumeric plus underscore; index implementations may create + * unambiguous derived field names containing other characters. */ public class ChangeField { public static final int NO_ASSIGNEE = -1; @@ -91,8 +87,7 @@ public class ChangeField { /** Legacy change ID. */ public static final FieldDef LEGACY_ID = - new FieldDef.Single("legacy_id", - FieldType.INTEGER, true) { + new FieldDef.Single("legacy_id", FieldType.INTEGER, true) { @Override public Integer get(ChangeData input, FillArgs args) { return input.getId().get(); @@ -101,11 +96,10 @@ public class ChangeField { /** Newer style Change-Id key. */ public static final FieldDef ID = - new FieldDef.Single(ChangeQueryBuilder.FIELD_CHANGE_ID, - FieldType.PREFIX, false) { + new FieldDef.Single( + ChangeQueryBuilder.FIELD_CHANGE_ID, FieldType.PREFIX, false) { @Override - public String get(ChangeData input, FillArgs args) - throws OrmException { + public String get(ChangeData input, FillArgs args) throws OrmException { Change c = input.change(); if (c == null) { return null; @@ -116,11 +110,10 @@ public class ChangeField { /** Change status string, in the same format as {@code status:}. */ public static final FieldDef STATUS = - new FieldDef.Single(ChangeQueryBuilder.FIELD_STATUS, - FieldType.EXACT, false) { + new FieldDef.Single( + ChangeQueryBuilder.FIELD_STATUS, FieldType.EXACT, false) { @Override - public String get(ChangeData input, FillArgs args) - throws OrmException { + public String get(ChangeData input, FillArgs args) throws OrmException { Change c = input.change(); if (c == null) { return null; @@ -134,8 +127,7 @@ public class ChangeField { new FieldDef.Single( ChangeQueryBuilder.FIELD_PROJECT, FieldType.EXACT, true) { @Override - public String get(ChangeData input, FillArgs args) - throws OrmException { + public String get(ChangeData input, FillArgs args) throws OrmException { Change c = input.change(); if (c == null) { return null; @@ -149,8 +141,7 @@ public class ChangeField { new FieldDef.Single( ChangeQueryBuilder.FIELD_PROJECTS, FieldType.PREFIX, false) { @Override - public String get(ChangeData input, FillArgs args) - throws OrmException { + public String get(ChangeData input, FillArgs args) throws OrmException { Change c = input.change(); if (c == null) { return null; @@ -164,8 +155,7 @@ public class ChangeField { new FieldDef.Single( ChangeQueryBuilder.FIELD_REF, FieldType.EXACT, false) { @Override - public String get(ChangeData input, FillArgs args) - throws OrmException { + public String get(ChangeData input, FillArgs args) throws OrmException { Change c = input.change(); if (c == null) { return null; @@ -176,22 +166,18 @@ public class ChangeField { /** Topic, a short annotation on the branch. */ public static final FieldDef EXACT_TOPIC = - new FieldDef.Single( - "topic4", FieldType.EXACT, false) { + new FieldDef.Single("topic4", FieldType.EXACT, false) { @Override - public String get(ChangeData input, FillArgs args) - throws OrmException { + public String get(ChangeData input, FillArgs args) throws OrmException { return getTopic(input); } }; /** Topic, a short annotation on the branch. */ public static final FieldDef FUZZY_TOPIC = - new FieldDef.Single( - "topic5", FieldType.FULL_TEXT, false) { + new FieldDef.Single("topic5", FieldType.FULL_TEXT, false) { @Override - public String get(ChangeData input, FillArgs args) - throws OrmException { + public String get(ChangeData input, FillArgs args) throws OrmException { return getTopic(input); } }; @@ -201,8 +187,7 @@ public class ChangeField { new FieldDef.Single( ChangeQueryBuilder.FIELD_SUBMISSIONID, FieldType.EXACT, false) { @Override - public String get(ChangeData input, FillArgs args) - throws OrmException { + public String get(ChangeData input, FillArgs args) throws OrmException { Change c = input.change(); if (c == null) { return null; @@ -213,11 +198,9 @@ public class ChangeField { /** Last update time since January 1, 1970. */ public static final FieldDef UPDATED = - new FieldDef.Single( - "updated2", FieldType.TIMESTAMP, true) { + new FieldDef.Single("updated2", FieldType.TIMESTAMP, true) { @Override - public Timestamp get(ChangeData input, FillArgs args) - throws OrmException { + public Timestamp get(ChangeData input, FillArgs args) throws OrmException { Change c = input.change(); if (c == null) { return null; @@ -232,10 +215,8 @@ public class ChangeField { // Named for backwards compatibility. ChangeQueryBuilder.FIELD_FILE, FieldType.EXACT, false) { @Override - public Iterable get(ChangeData input, FillArgs args) - throws OrmException { - return firstNonNull(input.currentFilePaths(), - ImmutableList. of()); + public Iterable get(ChangeData input, FillArgs args) throws OrmException { + return firstNonNull(input.currentFilePaths(), ImmutableList.of()); } }; @@ -259,24 +240,17 @@ public class ChangeField { new FieldDef.Repeatable( ChangeQueryBuilder.FIELD_HASHTAG, FieldType.EXACT, false) { @Override - public Iterable get(ChangeData input, FillArgs args) - throws OrmException { - return input.hashtags().stream() - .map(String::toLowerCase) - .collect(toSet()); + public Iterable get(ChangeData input, FillArgs args) throws OrmException { + return input.hashtags().stream().map(String::toLowerCase).collect(toSet()); } }; /** Hashtags with original case. */ public static final FieldDef> HASHTAG_CASE_AWARE = - new FieldDef.Repeatable( - "_hashtag", FieldType.STORED_ONLY, true) { + new FieldDef.Repeatable("_hashtag", FieldType.STORED_ONLY, true) { @Override - public Iterable get(ChangeData input, FillArgs args) - throws OrmException { - return input.hashtags().stream() - .map(t -> t.getBytes(UTF_8)) - .collect(toSet()); + public Iterable get(ChangeData input, FillArgs args) throws OrmException { + return input.hashtags().stream().map(t -> t.getBytes(UTF_8)).collect(toSet()); } }; @@ -285,8 +259,7 @@ public class ChangeField { new FieldDef.Repeatable( ChangeQueryBuilder.FIELD_FILEPART, FieldType.EXACT, false) { @Override - public Iterable get(ChangeData input, FillArgs args) - throws OrmException { + public Iterable get(ChangeData input, FillArgs args) throws OrmException { return getFileParts(input); } }; @@ -296,8 +269,7 @@ public class ChangeField { new FieldDef.Single( ChangeQueryBuilder.FIELD_OWNER, FieldType.INTEGER, false) { @Override - public Integer get(ChangeData input, FillArgs args) - throws OrmException { + public Integer get(ChangeData input, FillArgs args) throws OrmException { Change c = input.change(); if (c == null) { return null; @@ -311,8 +283,7 @@ public class ChangeField { new FieldDef.Single( ChangeQueryBuilder.FIELD_ASSIGNEE, FieldType.INTEGER, false) { @Override - public Integer get(ChangeData input, FillArgs args) - throws OrmException { + public Integer get(ChangeData input, FillArgs args) throws OrmException { Account.Id id = input.change().getAssignee(); return id != null ? id.get() : NO_ASSIGNEE; } @@ -320,11 +291,9 @@ public class ChangeField { /** Reviewer(s) associated with the change. */ public static final FieldDef> REVIEWER = - new FieldDef.Repeatable( - "reviewer2", FieldType.EXACT, true) { + new FieldDef.Repeatable("reviewer2", FieldType.EXACT, true) { @Override - public Iterable get(ChangeData input, FillArgs args) - throws OrmException { + public Iterable get(ChangeData input, FillArgs args) throws OrmException { return getReviewerFieldValues(input.reviewers()); } }; @@ -332,8 +301,8 @@ public class ChangeField { @VisibleForTesting static List getReviewerFieldValues(ReviewerSet reviewers) { List r = new ArrayList<>(reviewers.asTable().size() * 2); - for (Table.Cell c - : reviewers.asTable().cellSet()) { + for (Table.Cell c : + reviewers.asTable().cellSet()) { String v = getReviewerFieldValue(c.getRowKey(), c.getColumnKey()); r.add(v); r.add(v + ',' + c.getValue().getTime()); @@ -341,8 +310,7 @@ public class ChangeField { return r; } - public static String getReviewerFieldValue(ReviewerStateInternal state, - Account.Id id) { + public static String getReviewerFieldValue(ReviewerStateInternal state, Account.Id id) { return state.toString() + ',' + id; } @@ -371,8 +339,7 @@ public class ChangeField { new FieldDef.Repeatable( ChangeQueryBuilder.FIELD_COMMIT, FieldType.PREFIX, false) { @Override - public Iterable get(ChangeData input, FillArgs args) - throws OrmException { + public Iterable get(ChangeData input, FillArgs args) throws OrmException { return getRevisions(input); } }; @@ -382,8 +349,7 @@ public class ChangeField { new FieldDef.Repeatable( ChangeQueryBuilder.FIELD_EXACTCOMMIT, FieldType.EXACT, false) { @Override - public Iterable get(ChangeData input, FillArgs args) - throws OrmException { + public Iterable get(ChangeData input, FillArgs args) throws OrmException { return getRevisions(input); } }; @@ -403,15 +369,13 @@ public class ChangeField { new FieldDef.Repeatable( ChangeQueryBuilder.FIELD_TR, FieldType.EXACT, false) { @Override - public Iterable get(ChangeData input, FillArgs args) - throws OrmException { + public Iterable get(ChangeData input, FillArgs args) throws OrmException { try { List footers = input.commitFooters(); if (footers == null) { return ImmutableSet.of(); } - return Sets.newHashSet( - args.trackingFooters.extract(footers).values()); + return Sets.newHashSet(args.trackingFooters.extract(footers).values()); } catch (IOException e) { throw new OrmException(e); } @@ -424,34 +388,29 @@ public class ChangeField { new FieldDef.Repeatable( ChangeQueryBuilder.FIELD_LABEL, FieldType.EXACT, false) { @Override - public Iterable get(ChangeData input, FillArgs args) - throws OrmException { + public Iterable get(ChangeData input, FillArgs args) throws OrmException { return getLabels(input, false); } }; /** List of labels on the current patch set including change owner votes. */ public static final FieldDef> LABEL2 = - new FieldDef.Repeatable( - "label2", FieldType.EXACT, false) { + new FieldDef.Repeatable("label2", FieldType.EXACT, false) { @Override - public Iterable get(ChangeData input, FillArgs args) - throws OrmException { + public Iterable get(ChangeData input, FillArgs args) throws OrmException { return getLabels(input, true); } }; - private static Iterable getLabels(ChangeData input, boolean owners) - throws OrmException { + private static Iterable getLabels(ChangeData input, boolean owners) throws OrmException { Set allApprovals = new HashSet<>(); Set distinctApprovals = new HashSet<>(); for (PatchSetApproval a : input.currentApprovals()) { if (a.getValue() != 0 && !a.isLegacySubmit()) { - allApprovals.add(formatLabel(a.getLabel(), a.getValue(), - a.getAccountId())); + allApprovals.add(formatLabel(a.getLabel(), a.getValue(), a.getAccountId())); if (owners && input.change().getOwner().equals(a.getAccountId())) { - allApprovals.add(formatLabel(a.getLabel(), a.getValue(), - ChangeQueryBuilder.OWNER_ACCOUNT_ID)); + allApprovals.add( + formatLabel(a.getLabel(), a.getValue(), ChangeQueryBuilder.OWNER_ACCOUNT_ID)); } distinctApprovals.add(formatLabel(a.getLabel(), a.getValue())); } @@ -477,44 +436,40 @@ public class ChangeField { } /** - * The exact email address, or any part of the author name or email address, - * in the current patch set. + * The exact email address, or any part of the author name or email address, in the current patch + * set. */ public static final FieldDef> AUTHOR = new FieldDef.Repeatable( ChangeQueryBuilder.FIELD_AUTHOR, FieldType.FULL_TEXT, false) { @Override - public Iterable get(ChangeData input, FillArgs args) - throws OrmException { + public Iterable get(ChangeData input, FillArgs args) throws OrmException { return getAuthorParts(input); } }; /** - * The exact email address, or any part of the committer name or email address, - * in the current patch set. + * The exact email address, or any part of the committer name or email address, in the current + * patch set. */ public static final FieldDef> COMMITTER = new FieldDef.Repeatable( ChangeQueryBuilder.FIELD_COMMITTER, FieldType.FULL_TEXT, false) { @Override - public Iterable get(ChangeData input, FillArgs args) - throws OrmException { + public Iterable get(ChangeData input, FillArgs args) throws OrmException { return getCommitterParts(input); } }; public static class ChangeProtoField extends FieldDef.Single { - public static final ProtobufCodec CODEC = - CodecFactory.encoder(Change.class); + public static final ProtobufCodec CODEC = CodecFactory.encoder(Change.class); private ChangeProtoField() { super("_change", FieldType.STORED_ONLY, true); } @Override - public byte[] get(ChangeData input, FieldDef.FillArgs args) - throws OrmException { + public byte[] get(ChangeData input, FieldDef.FillArgs args) throws OrmException { Change c = input.change(); if (c == null) { return null; @@ -526,8 +481,7 @@ public class ChangeField { /** Serialized change object, used for pre-populating results. */ public static final ChangeProtoField CHANGE = new ChangeProtoField(); - public static class PatchSetApprovalProtoField - extends FieldDef.Repeatable { + public static class PatchSetApprovalProtoField extends FieldDef.Repeatable { public static final ProtobufCodec CODEC = CodecFactory.encoder(PatchSetApproval.class); @@ -536,25 +490,22 @@ public class ChangeField { } @Override - public Iterable get(ChangeData input, FillArgs args) - throws OrmException { + public Iterable get(ChangeData input, FillArgs args) throws OrmException { return toProtos(CODEC, input.currentApprovals()); } } - /** - * Serialized approvals for the current patch set, used for pre-populating - * results. - */ - public static final PatchSetApprovalProtoField APPROVAL = - new PatchSetApprovalProtoField(); + /** Serialized approvals for the current patch set, used for pre-populating results. */ + public static final PatchSetApprovalProtoField APPROVAL = new PatchSetApprovalProtoField(); public static String formatLabel(String label, int value) { return formatLabel(label, value, null); } public static String formatLabel(String label, int value, Account.Id accountId) { - return label.toLowerCase() + (value >= 0 ? "+" : "") + value + return label.toLowerCase() + + (value >= 0 ? "+" : "") + + value + (accountId != null ? "," + formatAccount(accountId) : ""); } @@ -567,8 +518,8 @@ public class ChangeField { /** Commit message of the current patch set. */ public static final FieldDef COMMIT_MESSAGE = - new FieldDef.Single(ChangeQueryBuilder.FIELD_MESSAGE, - FieldType.FULL_TEXT, false) { + new FieldDef.Single( + ChangeQueryBuilder.FIELD_MESSAGE, FieldType.FULL_TEXT, false) { @Override public String get(ChangeData input, FillArgs args) throws OrmException { try { @@ -581,11 +532,10 @@ public class ChangeField { /** Summary or inline comment. */ public static final FieldDef> COMMENT = - new FieldDef.Repeatable(ChangeQueryBuilder.FIELD_COMMENT, - FieldType.FULL_TEXT, false) { + new FieldDef.Repeatable( + ChangeQueryBuilder.FIELD_COMMENT, FieldType.FULL_TEXT, false) { @Override - public Iterable get(ChangeData input, FillArgs args) - throws OrmException { + public Iterable get(ChangeData input, FillArgs args) throws OrmException { Set r = new HashSet<>(); for (Comment c : input.publishedComments()) { r.add(c.message); @@ -602,8 +552,7 @@ public class ChangeField { new FieldDef.Single( ChangeQueryBuilder.FIELD_MERGEABLE, FieldType.EXACT, true) { @Override - public String get(ChangeData input, FillArgs args) - throws OrmException { + public String get(ChangeData input, FillArgs args) throws OrmException { Boolean m = input.isMergeable(); if (m == null) { return null; @@ -617,11 +566,8 @@ public class ChangeField { new FieldDef.Single( ChangeQueryBuilder.FIELD_ADDED, FieldType.INTEGER_RANGE, true) { @Override - public Integer get(ChangeData input, FillArgs args) - throws OrmException { - return input.changedLines().isPresent() - ? input.changedLines().get().insertions - : null; + public Integer get(ChangeData input, FillArgs args) throws OrmException { + return input.changedLines().isPresent() ? input.changedLines().get().insertions : null; } }; @@ -630,11 +576,8 @@ public class ChangeField { new FieldDef.Single( ChangeQueryBuilder.FIELD_DELETED, FieldType.INTEGER_RANGE, true) { @Override - public Integer get(ChangeData input, FillArgs args) - throws OrmException { - return input.changedLines().isPresent() - ? input.changedLines().get().deletions - : null; + public Integer get(ChangeData input, FillArgs args) throws OrmException { + return input.changedLines().isPresent() ? input.changedLines().get().deletions : null; } }; @@ -643,11 +586,8 @@ public class ChangeField { new FieldDef.Single( ChangeQueryBuilder.FIELD_DELTA, FieldType.INTEGER_RANGE, false) { @Override - public Integer get(ChangeData input, FillArgs args) - throws OrmException { - return input.changedLines() - .map(c -> c.insertions + c.deletions) - .orElse(null); + public Integer get(ChangeData input, FillArgs args) throws OrmException { + return input.changedLines().map(c -> c.insertions + c.deletions).orElse(null); } }; @@ -656,8 +596,7 @@ public class ChangeField { new FieldDef.Repeatable( ChangeQueryBuilder.FIELD_COMMENTBY, FieldType.INTEGER, false) { @Override - public Iterable get(ChangeData input, FillArgs args) - throws OrmException { + public Iterable get(ChangeData input, FillArgs args) throws OrmException { Set r = new HashSet<>(); for (ChangeMessage m : input.messages()) { if (m.getAuthor() != null) { @@ -671,20 +610,16 @@ public class ChangeField { } }; - /** - * Star labels on this change in the format: <account-id>:<label> - */ + /** Star labels on this change in the format: <account-id>:<label> */ public static final FieldDef> STAR = new FieldDef.Repeatable( ChangeQueryBuilder.FIELD_STAR, FieldType.EXACT, true) { @Override - public Iterable get(ChangeData input, FillArgs args) - throws OrmException { + public Iterable get(ChangeData input, FillArgs args) throws OrmException { return Iterables.transform( input.stars().entries(), (Map.Entry e) -> { - return StarredChangesUtil.StarField.create( - e.getKey(), e.getValue()).toString(); + return StarredChangesUtil.StarField.create(e.getKey(), e.getValue()).toString(); }); } }; @@ -694,8 +629,7 @@ public class ChangeField { new FieldDef.Repeatable( ChangeQueryBuilder.FIELD_STARBY, FieldType.INTEGER, false) { @Override - public Iterable get(ChangeData input, FillArgs args) - throws OrmException { + public Iterable get(ChangeData input, FillArgs args) throws OrmException { return Iterables.transform(input.stars().keySet(), Account.Id::get); } }; @@ -705,8 +639,7 @@ public class ChangeField { new FieldDef.Repeatable( ChangeQueryBuilder.FIELD_GROUP, FieldType.EXACT, false) { @Override - public Iterable get(ChangeData input, FillArgs args) - throws OrmException { + public Iterable get(ChangeData input, FillArgs args) throws OrmException { Set r = Sets.newHashSetWithExpectedSize(1); for (PatchSet ps : input.patchSets()) { r.addAll(ps.getGroups()); @@ -715,18 +648,15 @@ public class ChangeField { } }; - public static class PatchSetProtoField - extends FieldDef.Repeatable { - public static final ProtobufCodec CODEC = - CodecFactory.encoder(PatchSet.class); + public static class PatchSetProtoField extends FieldDef.Repeatable { + public static final ProtobufCodec CODEC = CodecFactory.encoder(PatchSet.class); private PatchSetProtoField() { super("_patch_set", FieldType.STORED_ONLY, true); } @Override - public Iterable get(ChangeData input, FieldDef.FillArgs args) - throws OrmException { + public Iterable get(ChangeData input, FieldDef.FillArgs args) throws OrmException { return toProtos(CODEC, input.patchSets()); } } @@ -739,44 +669,36 @@ public class ChangeField { new FieldDef.Repeatable( ChangeQueryBuilder.FIELD_EDITBY, FieldType.INTEGER, false) { @Override - public Iterable get(ChangeData input, FillArgs args) - throws OrmException { - return input.editsByUser().stream() - .map(Account.Id::get) - .collect(toSet()); + public Iterable get(ChangeData input, FillArgs args) throws OrmException { + return input.editsByUser().stream().map(Account.Id::get).collect(toSet()); } }; - /** Users who have draft comments on this change. */ public static final FieldDef> DRAFTBY = new FieldDef.Repeatable( ChangeQueryBuilder.FIELD_DRAFTBY, FieldType.INTEGER, false) { @Override - public Iterable get(ChangeData input, FillArgs args) - throws OrmException { - return input.draftsByUser().stream() - .map(Account.Id::get) - .collect(toSet()); + public Iterable get(ChangeData input, FillArgs args) throws OrmException { + return input.draftsByUser().stream().map(Account.Id::get).collect(toSet()); } }; /** * Users the change was reviewed by since the last author update. - *

- * A change is considered reviewed by a user if the latest update by that user - * is newer than the latest update by the change author. Both top-level change - * messages and new patch sets are considered to be updates. - *

- * If the latest update is by the change owner, then the special value {@link - * #NOT_REVIEWED} is emitted. + * + *

A change is considered reviewed by a user if the latest update by that user is newer than + * the latest update by the change author. Both top-level change messages and new patch sets are + * considered to be updates. + * + *

If the latest update is by the change owner, then the special value {@link #NOT_REVIEWED} is + * emitted. */ public static final FieldDef> REVIEWEDBY = new FieldDef.Repeatable( ChangeQueryBuilder.FIELD_REVIEWEDBY, FieldType.INTEGER, true) { @Override - public Iterable get(ChangeData input, FillArgs args) - throws OrmException { + public Iterable get(ChangeData input, FillArgs args) throws OrmException { Set reviewedBy = input.reviewedBy(); if (reviewedBy.isEmpty()) { return ImmutableSet.of(NOT_REVIEWED); @@ -792,19 +714,16 @@ public class ChangeField { // Submit rule options in this class should never use fastEvalLabels. This // slows down indexing slightly but produces correct search results. public static final SubmitRuleOptions SUBMIT_RULE_OPTIONS_LENIENT = - SubmitRuleOptions.defaults() - .allowClosed(true) - .allowDraft(true) - .build(); + SubmitRuleOptions.defaults().allowClosed(true).allowDraft(true).build(); public static final SubmitRuleOptions SUBMIT_RULE_OPTIONS_STRICT = SubmitRuleOptions.defaults().build(); /** * JSON type for storing SubmitRecords. - *

- * Stored fields need to use a stable format over a long period; this type - * insulates the index from implementation changes in SubmitRecord itself. + * + *

Stored fields need to use a stable format over a long period; this type insulates the index + * from implementation changes in SubmitRecord itself. */ static class StoredSubmitRecord { static class StoredLabel { @@ -826,8 +745,7 @@ public class ChangeField { StoredLabel sl = new StoredLabel(); sl.label = label.label; sl.status = label.status; - sl.appliedBy = - label.appliedBy != null ? label.appliedBy.get() : null; + sl.appliedBy = label.appliedBy != null ? label.appliedBy.get() : null; this.labels.add(sl); } } @@ -843,9 +761,7 @@ public class ChangeField { SubmitRecord.Label srl = new SubmitRecord.Label(); srl.label = label.label; srl.status = label.status; - srl.appliedBy = label.appliedBy != null - ? new Account.Id(label.appliedBy) - : null; + srl.appliedBy = label.appliedBy != null ? new Account.Id(label.appliedBy) : null; rec.labels.add(srl); } } @@ -854,36 +770,30 @@ public class ChangeField { } public static final FieldDef> SUBMIT_RECORD = - new FieldDef.Repeatable( - "submit_record", FieldType.EXACT, false) { + new FieldDef.Repeatable("submit_record", FieldType.EXACT, false) { @Override - public Iterable get(ChangeData input, FillArgs args) - throws OrmException { + public Iterable get(ChangeData input, FillArgs args) throws OrmException { return formatSubmitRecordValues(input); } }; - public static final FieldDef> - STORED_SUBMIT_RECORD_STRICT = - new FieldDef.Repeatable( - "full_submit_record_strict", FieldType.STORED_ONLY, true) { - @Override - public Iterable get(ChangeData input, FillArgs args) - throws OrmException { - return storedSubmitRecords(input, SUBMIT_RULE_OPTIONS_STRICT); - } - }; + public static final FieldDef> STORED_SUBMIT_RECORD_STRICT = + new FieldDef.Repeatable( + "full_submit_record_strict", FieldType.STORED_ONLY, true) { + @Override + public Iterable get(ChangeData input, FillArgs args) throws OrmException { + return storedSubmitRecords(input, SUBMIT_RULE_OPTIONS_STRICT); + } + }; - public static final FieldDef> - STORED_SUBMIT_RECORD_LENIENT = - new FieldDef.Repeatable( - "full_submit_record_lenient", FieldType.STORED_ONLY, true) { - @Override - public Iterable get(ChangeData input, FillArgs args) - throws OrmException { - return storedSubmitRecords(input, SUBMIT_RULE_OPTIONS_LENIENT); - } - }; + public static final FieldDef> STORED_SUBMIT_RECORD_LENIENT = + new FieldDef.Repeatable( + "full_submit_record_lenient", FieldType.STORED_ONLY, true) { + @Override + public Iterable get(ChangeData input, FillArgs args) throws OrmException { + return storedSubmitRecords(input, SUBMIT_RULE_OPTIONS_LENIENT); + } + }; public static void parseSubmitRecords( Collection values, SubmitRuleOptions opts, ChangeData out) { @@ -898,39 +808,34 @@ public class ChangeField { // Cache the fastEvalLabels variant as well so it can be used by // ChangeJson. - out.setSubmitRecords( - opts.toBuilder().fastEvalLabels(true).build(), - records); + out.setSubmitRecords(opts.toBuilder().fastEvalLabels(true).build(), records); } @VisibleForTesting static List parseSubmitRecords(Collection values) { - return values.stream() + return values + .stream() .map(v -> GSON.fromJson(v, StoredSubmitRecord.class).toSubmitRecord()) .collect(toList()); } @VisibleForTesting static List storedSubmitRecords(List records) { - return Lists.transform( - records, r -> GSON.toJson(new StoredSubmitRecord(r)).getBytes(UTF_8)); + return Lists.transform(records, r -> GSON.toJson(new StoredSubmitRecord(r)).getBytes(UTF_8)); } - private static Iterable storedSubmitRecords( - ChangeData cd, SubmitRuleOptions opts) throws OrmException { + private static Iterable storedSubmitRecords(ChangeData cd, SubmitRuleOptions opts) + throws OrmException { return storedSubmitRecords(cd.submitRecords(opts)); } - public static List formatSubmitRecordValues(ChangeData cd) - throws OrmException { + public static List formatSubmitRecordValues(ChangeData cd) throws OrmException { return formatSubmitRecordValues( - cd.submitRecords(SUBMIT_RULE_OPTIONS_STRICT), - cd.change().getOwner()); + cd.submitRecords(SUBMIT_RULE_OPTIONS_STRICT), cd.change().getOwner()); } @VisibleForTesting - static List formatSubmitRecordValues(List records, - Account.Id changeOwner) { + static List formatSubmitRecordValues(List records, Account.Id changeOwner) { List result = new ArrayList<>(); for (SubmitRecord rec : records) { result.add(rec.status.name()); @@ -953,37 +858,35 @@ public class ChangeField { } /** - * All values of all refs that were used in the course of indexing this - * document. - *

- * Emitted as UTF-8 encoded strings of the form - * {@code project:ref/name:[hex sha]}. + * All values of all refs that were used in the course of indexing this document. + * + *

Emitted as UTF-8 encoded strings of the form {@code project:ref/name:[hex sha]}. */ public static final FieldDef> REF_STATE = - new FieldDef.Repeatable( - "ref_state", FieldType.STORED_ONLY, true) { + new FieldDef.Repeatable("ref_state", FieldType.STORED_ONLY, true) { @Override - public Iterable get(ChangeData input, FillArgs args) - throws OrmException { + public Iterable get(ChangeData input, FillArgs args) throws OrmException { List result = new ArrayList<>(); Project.NameKey project = input.change().getProject(); - input.editRefs().values().forEach( - r -> result.add(RefState.of(r).toByteArray(project))); - input.starRefs().values().forEach( - r -> result.add(RefState.of(r.ref()).toByteArray(args.allUsers))); + input.editRefs().values().forEach(r -> result.add(RefState.of(r).toByteArray(project))); + input + .starRefs() + .values() + .forEach(r -> result.add(RefState.of(r.ref()).toByteArray(args.allUsers))); if (PrimaryStorage.of(input.change()) == PrimaryStorage.NOTE_DB) { ChangeNotes notes = input.notes(); - result.add(RefState.create(notes.getRefName(), notes.getMetaId()) - .toByteArray(project)); + result.add(RefState.create(notes.getRefName(), notes.getMetaId()).toByteArray(project)); notes.getRobotComments(); // Force loading robot comments. RobotCommentNotes robotNotes = notes.getRobotCommentNotes(); result.add( RefState.create(robotNotes.getRefName(), robotNotes.getMetaId()) .toByteArray(project)); - input.draftRefs().values().forEach( - r -> result.add(RefState.of(r).toByteArray(args.allUsers))); + input + .draftRefs() + .values() + .forEach(r -> result.add(RefState.of(r).toByteArray(args.allUsers))); } return result; @@ -991,32 +894,29 @@ public class ChangeField { }; /** - * All ref wildcard patterns that were used in the course of indexing this - * document. - *

- * Emitted as UTF-8 encoded strings of the form {@code project:ref/name/*}. - * See {@link RefStatePattern} for the pattern format. + * All ref wildcard patterns that were used in the course of indexing this document. + * + *

Emitted as UTF-8 encoded strings of the form {@code project:ref/name/*}. See {@link + * RefStatePattern} for the pattern format. */ - public static final FieldDef> - REF_STATE_PATTERN = new FieldDef.Repeatable( + public static final FieldDef> REF_STATE_PATTERN = + new FieldDef.Repeatable( "ref_state_pattern", FieldType.STORED_ONLY, true) { @Override - public Iterable get(ChangeData input, FillArgs args) - throws OrmException { + public Iterable get(ChangeData input, FillArgs args) throws OrmException { Change.Id id = input.getId(); Project.NameKey project = input.change().getProject(); List result = new ArrayList<>(3); - result.add(RefStatePattern.create( - RefNames.REFS_USERS + "*/" + RefNames.EDIT_PREFIX + id + "/*") - .toByteArray(project)); result.add( - RefStatePattern.create( - RefNames.refsStarredChangesPrefix(id) + "*") - .toByteArray(args.allUsers)); + RefStatePattern.create(RefNames.REFS_USERS + "*/" + RefNames.EDIT_PREFIX + id + "/*") + .toByteArray(project)); + result.add( + RefStatePattern.create(RefNames.refsStarredChangesPrefix(id) + "*") + .toByteArray(args.allUsers)); if (PrimaryStorage.of(input.change()) == PrimaryStorage.NOTE_DB) { - result.add(RefStatePattern.create( - RefNames.refsDraftCommentsPrefix(id) + "*") - .toByteArray(args.allUsers)); + result.add( + RefStatePattern.create(RefNames.refsDraftCommentsPrefix(id) + "*") + .toByteArray(args.allUsers)); } return result; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndex.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndex.java index c56880f1a0..27b0c269c2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndex.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndex.java @@ -22,9 +22,8 @@ import com.google.gerrit.server.query.change.ChangeData; import com.google.gerrit.server.query.change.LegacyChangeIdPredicate; public interface ChangeIndex extends Index { - public interface Factory extends - IndexDefinition.IndexFactory { - } + public interface Factory + extends IndexDefinition.IndexFactory {} @Override default Predicate keyPredicate(Change.Id id) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexCollection.java index dc1c4a5e82..f8acb74540 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexCollection.java @@ -22,10 +22,8 @@ import com.google.inject.Inject; import com.google.inject.Singleton; @Singleton -public class ChangeIndexCollection extends - IndexCollection { +public class ChangeIndexCollection extends IndexCollection { @Inject @VisibleForTesting - public ChangeIndexCollection() { - } + public ChangeIndexCollection() {} } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexDefinition.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexDefinition.java index 2f1e4bb30a..4404298698 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexDefinition.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexDefinition.java @@ -21,15 +21,17 @@ import com.google.gerrit.server.query.change.ChangeData; import com.google.inject.Inject; import com.google.inject.util.Providers; -public class ChangeIndexDefinition - extends IndexDefinition { +public class ChangeIndexDefinition extends IndexDefinition { @Inject ChangeIndexDefinition( ChangeIndexCollection indexCollection, ChangeIndex.Factory indexFactory, @Nullable AllChangesIndexer allChangesIndexer) { - super(ChangeSchemaDefinitions.INSTANCE, indexCollection, indexFactory, + super( + ChangeSchemaDefinitions.INSTANCE, + indexCollection, + indexFactory, Providers.of(allChangesIndexer)); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexRewriter.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexRewriter.java index 3523e5ff28..a9e136269e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexRewriter.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexRewriter.java @@ -38,13 +38,11 @@ import com.google.gerrit.server.query.change.ChangeStatusPredicate; import com.google.gerrit.server.query.change.OrSource; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.util.MutableInteger; - import java.util.BitSet; import java.util.EnumSet; import java.util.List; import java.util.Set; +import org.eclipse.jgit.util.MutableInteger; /** Rewriter that pushes boolean logic into the secondary index. */ @Singleton @@ -73,9 +71,8 @@ public class ChangeIndexRewriter implements IndexRewriter { * Get the set of statuses that changes matching the given predicate may have. * * @param in predicate - * @return the maximal set of statuses that any changes matching the input - * predicates may have, based on examining boolean and - * {@link ChangeStatusPredicate}s. + * @return the maximal set of statuses that any changes matching the input predicates may have, + * based on examining boolean and {@link ChangeStatusPredicate}s. */ public static EnumSet getPossibleStatus(Predicate in) { EnumSet s = extractStatus(in); @@ -129,15 +126,14 @@ public class ChangeIndexRewriter implements IndexRewriter { private final IndexConfig config; @Inject - ChangeIndexRewriter(ChangeIndexCollection indexes, - IndexConfig config) { + ChangeIndexRewriter(ChangeIndexCollection indexes, IndexConfig config) { this.indexes = indexes; this.config = config; } @Override - public Predicate rewrite(Predicate in, - QueryOptions opts) throws QueryParseException { + public Predicate rewrite(Predicate in, QueryOptions opts) + throws QueryParseException { Predicate s = rewriteImpl(in, opts); if (!(s instanceof ChangeDataSource)) { in = Predicate.and(open(), in); @@ -149,8 +145,8 @@ public class ChangeIndexRewriter implements IndexRewriter { return s; } - private Predicate rewriteImpl(Predicate in, - QueryOptions opts) throws QueryParseException { + private Predicate rewriteImpl(Predicate in, QueryOptions opts) + throws QueryParseException { ChangeIndex index = indexes.getSearchIndex(); MutableInteger leafTerms = new MutableInteger(); @@ -171,16 +167,15 @@ public class ChangeIndexRewriter implements IndexRewriter { * @param index index whose schema determines which fields are indexed. * @param opts other query options. * @param leafTerms number of leaf index query terms encountered so far. - * @return {@code null} if no part of this subtree can be queried in the - * index directly. {@code in} if this subtree and all its children can be - * queried directly in the index. Otherwise, a predicate that is - * semantically equivalent, with some of its subtrees wrapped to query the + * @return {@code null} if no part of this subtree can be queried in the index directly. {@code + * in} if this subtree and all its children can be queried directly in the index. Otherwise, a + * predicate that is semantically equivalent, with some of its subtrees wrapped to query the * index directly. - * @throws QueryParseException if the underlying index implementation does not - * support this predicate. + * @throws QueryParseException if the underlying index implementation does not support this + * predicate. */ - private Predicate rewriteImpl(Predicate in, - ChangeIndex index, QueryOptions opts, MutableInteger leafTerms) + private Predicate rewriteImpl( + Predicate in, ChangeIndex index, QueryOptions opts, MutableInteger leafTerms) throws QueryParseException { if (isIndexPredicate(in, index)) { if (++leafTerms.value > config.maxTerms()) { @@ -226,8 +221,7 @@ public class ChangeIndexRewriter implements IndexRewriter { return partitionChildren(in, newChildren, isIndexed, index, opts); } - private boolean isIndexPredicate(Predicate in, - ChangeIndex index) { + private boolean isIndexPredicate(Predicate in, ChangeIndex index) { if (!(in instanceof IndexPredicate)) { return false; } @@ -240,21 +234,19 @@ public class ChangeIndexRewriter implements IndexRewriter { List> newChildren, BitSet isIndexed, ChangeIndex index, - QueryOptions opts) throws QueryParseException { + QueryOptions opts) + throws QueryParseException { if (isIndexed.cardinality() == 1) { int i = isIndexed.nextSetBit(0); - newChildren.add( - 0, new IndexedChangeQuery(index, newChildren.remove(i), opts)); + newChildren.add(0, new IndexedChangeQuery(index, newChildren.remove(i), opts)); return copy(in, newChildren); } // Group all indexed predicates into a wrapped subtree. - List> indexed = - Lists.newArrayListWithCapacity(isIndexed.cardinality()); + List> indexed = Lists.newArrayListWithCapacity(isIndexed.cardinality()); List> all = - Lists.newArrayListWithCapacity( - newChildren.size() - isIndexed.cardinality() + 1); + Lists.newArrayListWithCapacity(newChildren.size() - isIndexed.cardinality() + 1); for (int i = 0; i < newChildren.size(); i++) { Predicate c = newChildren.get(i); @@ -268,9 +260,7 @@ public class ChangeIndexRewriter implements IndexRewriter { return copy(in, all); } - private Predicate copy( - Predicate in, - List> all) { + private Predicate copy(Predicate in, List> all) { if (in instanceof AndPredicate) { return new AndChangeSource(all); } else if (in instanceof OrPredicate) { @@ -280,9 +270,7 @@ public class ChangeIndexRewriter implements IndexRewriter { } private static boolean isRewritePossible(Predicate p) { - return p.getChildCount() > 0 && ( - p instanceof AndPredicate - || p instanceof OrPredicate - || p instanceof NotPredicate); + return p.getChildCount() > 0 + && (p instanceof AndPredicate || p instanceof OrPredicate || p instanceof NotPredicate); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexer.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexer.java index f2567070d9..a2f2e563d2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexer.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexer.java @@ -45,11 +45,6 @@ import com.google.inject.ProvisionException; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; import com.google.inject.util.Providers; - -import org.eclipse.jgit.lib.Config; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.util.ArrayList; import java.util.Collection; @@ -58,21 +53,23 @@ import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.atomic.AtomicReference; +import org.eclipse.jgit.lib.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Helper for (re)indexing a change document. - *

- * Indexing is run in the background, as it may require substantial work to - * compute some of the fields and/or update the index. + * + *

Indexing is run in the background, as it may require substantial work to compute some of the + * fields and/or update the index. */ public class ChangeIndexer { - private static final Logger log = - LoggerFactory.getLogger(ChangeIndexer.class); + private static final Logger log = LoggerFactory.getLogger(ChangeIndexer.class); public interface Factory { ChangeIndexer create(ListeningExecutorService executor, ChangeIndex index); - ChangeIndexer create(ListeningExecutorService executor, - ChangeIndexCollection indexes); + + ChangeIndexer create(ListeningExecutorService executor, ChangeIndexCollection indexes); } public static CheckedFuture allAsList( @@ -86,18 +83,17 @@ public class ChangeIndexer { private static final Function MAPPER = new Function() { - @Override - public IOException apply(Exception in) { - if (in instanceof IOException) { - return (IOException) in; - } else if (in instanceof ExecutionException - && in.getCause() instanceof IOException) { - return (IOException) in.getCause(); - } else { - return new IOException(in); - } - } - }; + @Override + public IOException apply(Exception in) { + if (in instanceof IOException) { + return (IOException) in; + } else if (in instanceof ExecutionException && in.getCause() instanceof IOException) { + return (IOException) in.getCause(); + } else { + return new IOException(in); + } + } + }; private final ChangeIndexCollection indexes; private final ChangeIndex index; @@ -140,7 +136,8 @@ public class ChangeIndexer { } @AssistedInject - ChangeIndexer(SchemaFactory schemaFactory, + ChangeIndexer( + SchemaFactory schemaFactory, @GerritServerConfig Config cfg, NotesMigration notesMigration, ChangeNotes.Factory changeNotesFactory, @@ -175,8 +172,7 @@ public class ChangeIndexer { * @param id change to index. * @return future for the indexing task. */ - public CheckedFuture indexAsync(Project.NameKey project, - Change.Id id) { + public CheckedFuture indexAsync(Project.NameKey project, Change.Id id) { return submit(new IndexTask(project, id)); } @@ -186,8 +182,8 @@ public class ChangeIndexer { * @param ids changes to index. * @return future for completing indexing of all changes. */ - public CheckedFuture indexAsync(Project.NameKey project, - Collection ids) { + public CheckedFuture indexAsync( + Project.NameKey project, Collection ids) { List> futures = new ArrayList<>(ids.size()); for (Change.Id id : ids) { futures.add(indexAsync(project, id)); @@ -253,8 +249,7 @@ public class ChangeIndexer { * @param db review database. * @param change change to index. */ - public void index(ReviewDb db, Change change) - throws IOException, OrmException { + public void index(ReviewDb db, Change change) throws IOException, OrmException { index(newChangeData(db, change)); // See comment in #index(ChangeData). reindexAfterIndexUpdate(change.getProject(), change.getId()); @@ -296,17 +291,15 @@ public class ChangeIndexer { /** * Asynchronously check if a change is stale, and reindex if it is. - *

- * Always run on the batch executor, even if this indexer instance is - * configured to use a different executor. + * + *

Always run on the batch executor, even if this indexer instance is configured to use a + * different executor. * * @param project the project to which the change belongs. * @param id ID of the change to index. - * @return future for reindexing the change; returns true if the change was - * stale. + * @return future for reindexing the change; returns true if the change was stale. */ - public CheckedFuture reindexIfStale( - Project.NameKey project, Change.Id id) { + public CheckedFuture reindexIfStale(Project.NameKey project, Change.Id id) { return submit(new ReindexIfStaleTask(project, id), batchExecutor); } @@ -325,19 +318,16 @@ public class ChangeIndexer { } private Collection getWriteIndexes() { - return indexes != null - ? indexes.getWriteIndexes() - : Collections.singleton(index); + return indexes != null ? indexes.getWriteIndexes() : Collections.singleton(index); } private CheckedFuture submit(Callable task) { return submit(task, executor); } - private static CheckedFuture submit(Callable task, - ListeningExecutorService executor) { - return Futures.makeChecked( - Futures.nonCancellationPropagating(executor.submit(task)), MAPPER); + private static CheckedFuture submit( + Callable task, ListeningExecutorService executor) { + return Futures.makeChecked(Futures.nonCancellationPropagating(executor.submit(task)), MAPPER); } private abstract class AbstractIndexTask implements Callable { @@ -357,35 +347,34 @@ public class ChangeIndexer { @Override public final T call() throws Exception { try { - final AtomicReference> dbRef = - Atomics.newReference(); - RequestContext newCtx = new RequestContext() { - @Override - public Provider getReviewDbProvider() { - Provider db = dbRef.get(); - if (db == null) { - try { - db = Providers.of(schemaFactory.open()); - } catch (OrmException e) { - ProvisionException pe = - new ProvisionException("error opening ReviewDb"); - pe.initCause(e); - throw pe; + final AtomicReference> dbRef = Atomics.newReference(); + RequestContext newCtx = + new RequestContext() { + @Override + public Provider getReviewDbProvider() { + Provider db = dbRef.get(); + if (db == null) { + try { + db = Providers.of(schemaFactory.open()); + } catch (OrmException e) { + ProvisionException pe = new ProvisionException("error opening ReviewDb"); + pe.initCause(e); + throw pe; + } + dbRef.set(db); + } + return db; } - dbRef.set(db); - } - return db; - } - @Override - public CurrentUser getUser() { - throw new OutOfScopeException("No user during ChangeIndexer"); - } - }; + @Override + public CurrentUser getUser() { + throw new OutOfScopeException("No user during ChangeIndexer"); + } + }; RequestContext oldCtx = context.setContext(newCtx); try { return callImpl(newCtx.getReviewDbProvider()); - } finally { + } finally { context.setContext(oldCtx); Provider db = dbRef.get(); if (db != null) { @@ -463,24 +452,21 @@ public class ChangeIndexer { // increases contention on the meta ref from a background indexing thread // with little benefit. The next actual write to the entity may still incur a // less-contentious rebuild. - private ChangeData newChangeData(ReviewDb db, Change change) - throws OrmException { + private ChangeData newChangeData(ReviewDb db, Change change) throws OrmException { if (!notesMigration.readChanges()) { - ChangeNotes notes = changeNotesFactory.createWithAutoRebuildingDisabled( - change, null); + ChangeNotes notes = changeNotesFactory.createWithAutoRebuildingDisabled(change, null); return changeDataFactory.create(db, notes); } return changeDataFactory.create(db, change); } - private ChangeData newChangeData(ReviewDb db, Project.NameKey project, - Change.Id changeId) throws OrmException { + private ChangeData newChangeData(ReviewDb db, Project.NameKey project, Change.Id changeId) + throws OrmException { if (!notesMigration.readChanges()) { - ChangeNotes notes = changeNotesFactory.createWithAutoRebuildingDisabled( - db, project, changeId); + ChangeNotes notes = + changeNotesFactory.createWithAutoRebuildingDisabled(db, project, changeId); return changeDataFactory.create(db, notes); } return changeDataFactory.create(db, project, changeId); } - } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeSchemaDefinitions.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeSchemaDefinitions.java index b204d765a4..76a9bc9607 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeSchemaDefinitions.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeSchemaDefinitions.java @@ -22,75 +22,73 @@ import com.google.gerrit.server.query.change.ChangeData; public class ChangeSchemaDefinitions extends SchemaDefinitions { @Deprecated - static final Schema V32 = schema( - ChangeField.LEGACY_ID, - ChangeField.ID, - ChangeField.STATUS, - ChangeField.PROJECT, - ChangeField.PROJECTS, - ChangeField.REF, - ChangeField.EXACT_TOPIC, - ChangeField.FUZZY_TOPIC, - ChangeField.UPDATED, - ChangeField.FILE_PART, - ChangeField.PATH, - ChangeField.OWNER, - ChangeField.COMMIT, - ChangeField.TR, - ChangeField.LABEL, - ChangeField.COMMIT_MESSAGE, - ChangeField.COMMENT, - ChangeField.CHANGE, - ChangeField.APPROVAL, - ChangeField.MERGEABLE, - ChangeField.ADDED, - ChangeField.DELETED, - ChangeField.DELTA, - ChangeField.HASHTAG, - ChangeField.COMMENTBY, - ChangeField.PATCH_SET, - ChangeField.GROUP, - ChangeField.SUBMISSIONID, - ChangeField.EDITBY, - ChangeField.REVIEWEDBY, - ChangeField.EXACT_COMMIT, - ChangeField.AUTHOR, - ChangeField.COMMITTER, - ChangeField.DRAFTBY, - ChangeField.HASHTAG_CASE_AWARE, - ChangeField.STAR, - ChangeField.STARBY, - ChangeField.REVIEWER); + static final Schema V32 = + schema( + ChangeField.LEGACY_ID, + ChangeField.ID, + ChangeField.STATUS, + ChangeField.PROJECT, + ChangeField.PROJECTS, + ChangeField.REF, + ChangeField.EXACT_TOPIC, + ChangeField.FUZZY_TOPIC, + ChangeField.UPDATED, + ChangeField.FILE_PART, + ChangeField.PATH, + ChangeField.OWNER, + ChangeField.COMMIT, + ChangeField.TR, + ChangeField.LABEL, + ChangeField.COMMIT_MESSAGE, + ChangeField.COMMENT, + ChangeField.CHANGE, + ChangeField.APPROVAL, + ChangeField.MERGEABLE, + ChangeField.ADDED, + ChangeField.DELETED, + ChangeField.DELTA, + ChangeField.HASHTAG, + ChangeField.COMMENTBY, + ChangeField.PATCH_SET, + ChangeField.GROUP, + ChangeField.SUBMISSIONID, + ChangeField.EDITBY, + ChangeField.REVIEWEDBY, + ChangeField.EXACT_COMMIT, + ChangeField.AUTHOR, + ChangeField.COMMITTER, + ChangeField.DRAFTBY, + ChangeField.HASHTAG_CASE_AWARE, + ChangeField.STAR, + ChangeField.STARBY, + ChangeField.REVIEWER); + + @Deprecated static final Schema V33 = schema(V32, ChangeField.ASSIGNEE); @Deprecated - static final Schema V33 = - schema(V32, ChangeField.ASSIGNEE); - - @Deprecated - static final Schema V34 = new Schema.Builder() - .add(V33) - .remove(ChangeField.LABEL) - .add(ChangeField.LABEL2) - .build(); + static final Schema V34 = + new Schema.Builder() + .add(V33) + .remove(ChangeField.LABEL) + .add(ChangeField.LABEL2) + .build(); @Deprecated static final Schema V35 = - schema(V34, + schema( + V34, ChangeField.SUBMIT_RECORD, ChangeField.STORED_SUBMIT_RECORD_LENIENT, ChangeField.STORED_SUBMIT_RECORD_STRICT); @Deprecated static final Schema V36 = - schema(V35, - ChangeField.REF_STATE, - ChangeField.REF_STATE_PATTERN); + schema(V35, ChangeField.REF_STATE, ChangeField.REF_STATE_PATTERN); static final Schema V37 = schema(V36); public static final String NAME = "changes"; - public static final ChangeSchemaDefinitions INSTANCE = - new ChangeSchemaDefinitions(); + public static final ChangeSchemaDefinitions INSTANCE = new ChangeSchemaDefinitions(); private ChangeSchemaDefinitions() { super(NAME, ChangeData.class); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/DummyChangeIndex.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/DummyChangeIndex.java index ff681061f0..6cbc1cb075 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/DummyChangeIndex.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/DummyChangeIndex.java @@ -20,7 +20,6 @@ import com.google.gerrit.server.index.Schema; import com.google.gerrit.server.query.Predicate; import com.google.gerrit.server.query.change.ChangeData; import com.google.gerrit.server.query.change.ChangeDataSource; - import java.io.IOException; public class DummyChangeIndex implements ChangeIndex { @@ -30,20 +29,16 @@ public class DummyChangeIndex implements ChangeIndex { } @Override - public void close() { - } + public void close() {} @Override - public void replace(ChangeData cd) throws IOException { - } + public void replace(ChangeData cd) throws IOException {} @Override - public void delete(Change.Id id) throws IOException { - } + public void delete(Change.Id id) throws IOException {} @Override - public void deleteAll() throws IOException { - } + public void deleteAll() throws IOException {} @Override public ChangeDataSource getSource(Predicate p, QueryOptions opts) { @@ -51,8 +46,7 @@ public class DummyChangeIndex implements ChangeIndex { } @Override - public void markReady(boolean ready) throws IOException { - } + public void markReady(boolean ready) throws IOException {} public int getMaxLimit() { return Integer.MAX_VALUE; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/IndexedChangeQuery.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/IndexedChangeQuery.java index 3e0678dbbe..ff35750cd8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/IndexedChangeQuery.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/IndexedChangeQuery.java @@ -34,7 +34,6 @@ import com.google.gerrit.server.query.change.ChangeData; import com.google.gerrit.server.query.change.ChangeDataSource; import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.ResultSet; - import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -43,25 +42,23 @@ import java.util.Map; import java.util.Set; /** - * Wrapper combining an {@link IndexPredicate} together with a - * {@link ChangeDataSource} that returns matching results from the index. - *

- * Appropriate to return as the rootmost predicate that can be processed using - * the secondary index; such predicates must also implement - * {@link ChangeDataSource} to be chosen by the query processor. + * Wrapper combining an {@link IndexPredicate} together with a {@link ChangeDataSource} that returns + * matching results from the index. + * + *

Appropriate to return as the rootmost predicate that can be processed using the secondary + * index; such predicates must also implement {@link ChangeDataSource} to be chosen by the query + * processor. */ public class IndexedChangeQuery extends IndexedQuery implements ChangeDataSource, Matchable { public static QueryOptions oneResult() { - return createOptions(IndexConfig.createDefault(), 0, 1, - ImmutableSet. of()); + return createOptions(IndexConfig.createDefault(), 0, 1, ImmutableSet.of()); } - public static QueryOptions createOptions(IndexConfig config, int start, - int limit, Set fields) { + public static QueryOptions createOptions( + IndexConfig config, int start, int limit, Set fields) { // Always include project since it is needed to load the change from NoteDb. - if (!fields.contains(CHANGE.getName()) - && !fields.contains(PROJECT.getName())) { + if (!fields.contains(CHANGE.getName()) && !fields.contains(PROJECT.getName())) { fields = new HashSet<>(fields); fields.add(PROJECT.getName()); } @@ -71,14 +68,14 @@ public class IndexedChangeQuery extends IndexedQuery @VisibleForTesting static QueryOptions convertOptions(QueryOptions opts) { opts = opts.convertForBackend(); - return IndexedChangeQuery.createOptions(opts.config(), opts.start(), - opts.limit(), opts.fields()); + return IndexedChangeQuery.createOptions( + opts.config(), opts.start(), opts.limit(), opts.fields()); } private final Map> fromSource; - public IndexedChangeQuery(ChangeIndex index, Predicate pred, - QueryOptions opts) throws QueryParseException { + public IndexedChangeQuery(ChangeIndex index, Predicate pred, QueryOptions opts) + throws QueryParseException { super(index, pred, convertOptions(opts)); this.fromSource = new HashMap<>(); } @@ -92,11 +89,12 @@ public class IndexedChangeQuery extends IndexedQuery @Override public Iterator iterator() { return Iterables.transform( - rs, - cd -> { - fromSource.put(cd, currSource); - return cd; - }).iterator(); + rs, + cd -> { + fromSource.put(cd, currSource); + return cd; + }) + .iterator(); } @Override @@ -122,8 +120,10 @@ public class IndexedChangeQuery extends IndexedQuery } Predicate pred = getChild(0); - checkState(pred.isMatchable(), - "match invoked, but child predicate %s " + "doesn't implement %s", pred, + checkState( + pred.isMatchable(), + "match invoked, but child predicate %s " + "doesn't implement %s", + pred, Matchable.class.getName()); return pred.asMatchable().match(cd); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ReindexAfterUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ReindexAfterUpdate.java index 47d120a47c..24cc537450 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ReindexAfterUpdate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ReindexAfterUpdate.java @@ -36,17 +36,14 @@ import com.google.gerrit.server.util.RequestContext; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.util.List; import java.util.concurrent.Callable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class ReindexAfterUpdate implements GitReferenceUpdatedListener { - private static final Logger log = LoggerFactory - .getLogger(ReindexAfterUpdate.class); + private static final Logger log = LoggerFactory.getLogger(ReindexAfterUpdate.class); private final OneOffRequestContext requestContext; private final Provider queryProvider; @@ -127,14 +124,15 @@ public class ReindexAfterUpdate implements GitReferenceUpdatedListener { if (ref.equals(RefNames.REFS_CONFIG)) { return asChanges(queryProvider.get().byProjectOpen(project)); } - return asChanges(queryProvider.get().byBranchNew( - new Branch.NameKey(project, ref))); + return asChanges(queryProvider.get().byBranchNew(new Branch.NameKey(project, ref))); } @Override public String toString() { - return "Get changes to reindex caused by " + event.getRefName() - + " update of project " + event.getProjectName(); + return "Get changes to reindex caused by " + + event.getRefName() + + " update of project " + + event.getProjectName(); } } @@ -151,9 +149,10 @@ public class ReindexAfterUpdate implements GitReferenceUpdatedListener { // Reload change, as some time may have passed since GetChanges. ReviewDb db = ctx.getReviewDbProvider().get(); try { - Change c = notesFactory - .createChecked(db, new Project.NameKey(event.getProjectName()), id) - .getChange(); + Change c = + notesFactory + .createChecked(db, new Project.NameKey(event.getProjectName()), id) + .getChange(); indexerFactory.create(executor, indexes).index(db, c); } catch (NoSuchChangeException e) { indexerFactory.create(executor, indexes).delete(id); @@ -163,8 +162,7 @@ public class ReindexAfterUpdate implements GitReferenceUpdatedListener { @Override public String toString() { - return "Index change " + id.get() + " of project " - + event.getProjectName(); + return "Index change " + id.get() + " of project " + event.getProjectName(); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/StalenessChecker.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/StalenessChecker.java index 8194b6f4ae..872dfaf135 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/StalenessChecker.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/StalenessChecker.java @@ -40,7 +40,12 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.regex.Pattern; +import java.util.stream.StreamSupport; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Ref; @@ -48,22 +53,15 @@ import org.eclipse.jgit.lib.Repository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.List; -import java.util.Optional; -import java.util.Set; -import java.util.regex.Pattern; -import java.util.stream.StreamSupport; - @Singleton public class StalenessChecker { - private static final Logger log = - LoggerFactory.getLogger(StalenessChecker.class); + private static final Logger log = LoggerFactory.getLogger(StalenessChecker.class); - public static final ImmutableSet FIELDS = ImmutableSet.of( - ChangeField.CHANGE.getName(), - ChangeField.REF_STATE.getName(), - ChangeField.REF_STATE_PATTERN.getName()); + public static final ImmutableSet FIELDS = + ImmutableSet.of( + ChangeField.CHANGE.getName(), + ChangeField.REF_STATE.getName(), + ChangeField.REF_STATE_PATTERN.getName()); private final ChangeIndexCollection indexes; private final GitRepositoryManager repoManager; @@ -92,15 +90,19 @@ public class StalenessChecker { return false; // Index version not new enough for this check. } - Optional result = i.get( - id, IndexedChangeQuery.createOptions(indexConfig, 0, 1, FIELDS)); + Optional result = + i.get(id, IndexedChangeQuery.createOptions(indexConfig, 0, 1, FIELDS)); if (!result.isPresent()) { return true; // Not in index, but caller wants it to be. } ChangeData cd = result.get(); - return isStale(repoManager, id, cd.change(), + return isStale( + repoManager, + id, + cd.change(), ChangeNotes.readOneReviewDbChange(db.get(), id), - parseStates(cd), parsePatterns(cd)); + parseStates(cd), + parsePatterns(cd)); } public static boolean isStale( @@ -115,12 +117,12 @@ public class StalenessChecker { } @VisibleForTesting - static boolean refsAreStale(GitRepositoryManager repoManager, + static boolean refsAreStale( + GitRepositoryManager repoManager, Change.Id id, SetMultimap states, ListMultimap patterns) { - Set projects = - Sets.union(states.keySet(), patterns.keySet()); + Set projects = Sets.union(states.keySet(), patterns.keySet()); for (Project.NameKey p : projects) { if (refsAreStale(repoManager, id, p, states, patterns)) { @@ -132,14 +134,15 @@ public class StalenessChecker { } @VisibleForTesting - static boolean reviewDbChangeIsStale( - Change indexChange, @Nullable Change reviewDbChange) { + static boolean reviewDbChangeIsStale(Change indexChange, @Nullable Change reviewDbChange) { if (reviewDbChange == null) { return false; // Nothing the caller can do. } - checkArgument(indexChange.getId().equals(reviewDbChange.getId()), + checkArgument( + indexChange.getId().equals(reviewDbChange.getId()), "mismatched change ID: %s != %s", - indexChange.getId(), reviewDbChange.getId()); + indexChange.getId(), + reviewDbChange.getId()); if (PrimaryStorage.of(reviewDbChange) != PrimaryStorage.REVIEW_DB) { return false; // Not a ReviewDb change, don't check rowVersion. } @@ -150,8 +153,7 @@ public class StalenessChecker { return parseStates(cd.getRefStates()); } - public static SetMultimap parseStates( - Iterable states) { + public static SetMultimap parseStates(Iterable states) { RefState.check(states != null, null); SetMultimap result = MultimapBuilder.hashKeys().hashSetValues().build(); @@ -159,20 +161,13 @@ public class StalenessChecker { RefState.check(b != null, null); String s = new String(b, UTF_8); List parts = Splitter.on(':').splitToList(s); - RefState.check( - parts.size() == 3 - && !parts.get(0).isEmpty() - && !parts.get(1).isEmpty(), - s); - result.put( - new Project.NameKey(parts.get(0)), - RefState.create(parts.get(1), parts.get(2))); + RefState.check(parts.size() == 3 && !parts.get(0).isEmpty() && !parts.get(1).isEmpty(), s); + result.put(new Project.NameKey(parts.get(0)), RefState.create(parts.get(1), parts.get(2))); } return result; } - private ListMultimap parsePatterns( - ChangeData cd) { + private ListMultimap parsePatterns(ChangeData cd) { return parsePatterns(cd.getRefStatePatterns()); } @@ -186,15 +181,15 @@ public class StalenessChecker { String s = new String(b, UTF_8); List parts = Splitter.on(':').splitToList(s); RefStatePattern.check(parts.size() == 2, s); - result.put( - new Project.NameKey(parts.get(0)), - RefStatePattern.create(parts.get(1))); + result.put(new Project.NameKey(parts.get(0)), RefStatePattern.create(parts.get(1))); } return result; } - private static boolean refsAreStale(GitRepositoryManager repoManager, - Change.Id id, Project.NameKey project, + private static boolean refsAreStale( + GitRepositoryManager repoManager, + Change.Id id, + Project.NameKey project, SetMultimap allStates, ListMultimap allPatterns) { try (Repository repo = repoManager.openRepository(project)) { @@ -211,9 +206,7 @@ public class StalenessChecker { } return false; } catch (IOException e) { - log.warn( - String.format("error checking staleness of %s in %s", id, project), - e); + log.warn(String.format("error checking staleness of %s in %s", id, project), e); return true; } } @@ -221,18 +214,15 @@ public class StalenessChecker { @AutoValue public abstract static class RefState { static RefState create(String ref, String sha) { - return new AutoValue_StalenessChecker_RefState( - ref, ObjectId.fromString(sha)); + return new AutoValue_StalenessChecker_RefState(ref, ObjectId.fromString(sha)); } static RefState create(String ref, @Nullable ObjectId id) { - return new AutoValue_StalenessChecker_RefState( - ref, firstNonNull(id, ObjectId.zeroId())); + return new AutoValue_StalenessChecker_RefState(ref, firstNonNull(id, ObjectId.zeroId())); } static RefState of(Ref ref) { - return new AutoValue_StalenessChecker_RefState( - ref.getName(), ref.getObjectId()); + return new AutoValue_StalenessChecker_RefState(ref.getName(), ref.getObjectId()); } byte[] toByteArray(Project.NameKey project) { @@ -248,6 +238,7 @@ public class StalenessChecker { } abstract String ref(); + abstract ObjectId id(); private boolean match(Repository repo) throws IOException { @@ -259,10 +250,10 @@ public class StalenessChecker { /** * Pattern for matching refs. - *

- * Similar to '*' syntax for native Git refspecs, but slightly more powerful: - * the pattern may contain arbitrarily many asterisks. There must be at least - * one '*' and the first one must immediately follow a '/'. + * + *

Similar to '*' syntax for native Git refspecs, but slightly more powerful: the pattern may + * contain arbitrarily many asterisks. There must be at least one '*' and the first one must + * immediately follow a '/'. */ @AutoValue public abstract static class RefStatePattern { @@ -290,15 +281,16 @@ public class StalenessChecker { } abstract String pattern(); + abstract String prefix(); + abstract Pattern regex(); boolean match(String refName) { return regex().matcher(refName).find(); } - private boolean match(Repository repo, Set expected) - throws IOException { + private boolean match(Repository repo, Set expected) throws IOException { for (Ref r : repo.getRefDatabase().getRefs(prefix()).values()) { if (!match(r.getName())) { continue; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/AllGroupsIndexer.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/group/AllGroupsIndexer.java index 18b6cc301f..ec486b54a9 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/AllGroupsIndexer.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/group/AllGroupsIndexer.java @@ -29,12 +29,6 @@ import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.SchemaFactory; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.ProgressMonitor; -import org.eclipse.jgit.lib.TextProgressMonitor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; @@ -42,12 +36,14 @@ import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; +import org.eclipse.jgit.lib.ProgressMonitor; +import org.eclipse.jgit.lib.TextProgressMonitor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Singleton -public class AllGroupsIndexer - extends SiteIndexer { - private static final Logger log = - LoggerFactory.getLogger(AllGroupsIndexer.class); +public class AllGroupsIndexer extends SiteIndexer { + private static final Logger log = LoggerFactory.getLogger(AllGroupsIndexer.class); private final SchemaFactory schemaFactory; private final ListeningExecutorService executor; @@ -65,8 +61,7 @@ public class AllGroupsIndexer @Override public SiteIndexer.Result indexAll(GroupIndex index) { - ProgressMonitor progress = - new TextProgressMonitor(new PrintWriter(progressOut)); + ProgressMonitor progress = new TextProgressMonitor(new PrintWriter(progressOut)); progress.start(2); Stopwatch sw = Stopwatch.createStarted(); List uuids; @@ -79,8 +74,8 @@ public class AllGroupsIndexer return reindexGroups(index, uuids, progress); } - private SiteIndexer.Result reindexGroups(GroupIndex index, - List uuids, ProgressMonitor progress) { + private SiteIndexer.Result reindexGroups( + GroupIndex index, List uuids, ProgressMonitor progress) { progress.beginTask("Reindexing groups", uuids.size()); List> futures = new ArrayList<>(uuids.size()); AtomicBoolean ok = new AtomicBoolean(true); @@ -89,25 +84,26 @@ public class AllGroupsIndexer Stopwatch sw = Stopwatch.createStarted(); for (final AccountGroup.UUID uuid : uuids) { final String desc = "group " + uuid; - ListenableFuture future = executor.submit( - new Callable() { - @Override - public Void call() throws Exception { - try { - AccountGroup oldGroup = groupCache.get(uuid); - if (oldGroup != null) { - groupCache.evict(oldGroup); + ListenableFuture future = + executor.submit( + new Callable() { + @Override + public Void call() throws Exception { + try { + AccountGroup oldGroup = groupCache.get(uuid); + if (oldGroup != null) { + groupCache.evict(oldGroup); + } + index.replace(groupCache.get(uuid)); + verboseWriter.println("Reindexed " + desc); + done.incrementAndGet(); + } catch (Exception e) { + failed.incrementAndGet(); + throw e; + } + return null; } - index.replace(groupCache.get(uuid)); - verboseWriter.println("Reindexed " + desc); - done.incrementAndGet(); - } catch (Exception e) { - failed.incrementAndGet(); - throw e; - } - return null; - } - }); + }); addErrorListener(future, desc, progress, ok); futures.add(future); } @@ -123,8 +119,7 @@ public class AllGroupsIndexer return new SiteIndexer.Result(sw, ok.get(), done.get(), failed.get()); } - private List collectGroups(ProgressMonitor progress) - throws OrmException { + private List collectGroups(ProgressMonitor progress) throws OrmException { progress.beginTask("Collecting groups", ProgressMonitor.UNKNOWN); List uuids = new ArrayList<>(); try (ReviewDb db = schemaFactory.open()) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupField.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupField.java index 6c0ab86da9..cc07dfd5f4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupField.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupField.java @@ -24,8 +24,7 @@ import com.google.gwtorm.server.OrmException; public class GroupField { /** Legacy group ID. */ public static final FieldDef ID = - new FieldDef.Single( - "id", FieldType.INTEGER, false) { + new FieldDef.Single("id", FieldType.INTEGER, false) { @Override public Integer get(AccountGroup input, FillArgs args) { return input.getId().get(); @@ -34,8 +33,7 @@ public class GroupField { /** Group UUID. */ public static final FieldDef UUID = - new FieldDef.Single( - "uuid", FieldType.EXACT, true) { + new FieldDef.Single("uuid", FieldType.EXACT, true) { @Override public String get(AccountGroup input, FillArgs args) { return input.getGroupUUID().get(); @@ -44,8 +42,7 @@ public class GroupField { /** Group owner UUID. */ public static final FieldDef OWNER_UUID = - new FieldDef.Single( - "owner_uuid", FieldType.EXACT, false) { + new FieldDef.Single("owner_uuid", FieldType.EXACT, false) { @Override public String get(AccountGroup input, FillArgs args) { return input.getOwnerGroupUUID().get(); @@ -54,8 +51,7 @@ public class GroupField { /** Group name. */ public static final FieldDef NAME = - new FieldDef.Single( - "name", FieldType.EXACT, false) { + new FieldDef.Single("name", FieldType.EXACT, false) { @Override public String get(AccountGroup input, FillArgs args) { return input.getName(); @@ -64,8 +60,7 @@ public class GroupField { /** Prefix match on group name parts. */ public static final FieldDef> NAME_PART = - new FieldDef.Repeatable( - "name_part", FieldType.PREFIX, false) { + new FieldDef.Repeatable("name_part", FieldType.PREFIX, false) { @Override public Iterable get(AccountGroup input, FillArgs args) { return SchemaUtil.getNameParts(input.getName()); @@ -74,8 +69,7 @@ public class GroupField { /** Group description. */ public static final FieldDef DESCRIPTION = - new FieldDef.Single( - "description", FieldType.FULL_TEXT, false) { + new FieldDef.Single("description", FieldType.FULL_TEXT, false) { @Override public String get(AccountGroup input, FillArgs args) { return input.getDescription(); @@ -84,11 +78,9 @@ public class GroupField { /** Whether the group is visible to all users. */ public static final FieldDef IS_VISIBLE_TO_ALL = - new FieldDef.Single( - "is_visible_to_all", FieldType.EXACT, false) { + new FieldDef.Single("is_visible_to_all", FieldType.EXACT, false) { @Override - public String get(AccountGroup input, FillArgs args) - throws OrmException { + public String get(AccountGroup input, FillArgs args) throws OrmException { return input.isVisibleToAll() ? "1" : "0"; } }; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndex.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndex.java index 773da6754b..48480f8088 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndex.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndex.java @@ -21,9 +21,8 @@ import com.google.gerrit.server.query.Predicate; import com.google.gerrit.server.query.group.GroupPredicates; public interface GroupIndex extends Index { - public interface Factory extends - IndexDefinition.IndexFactory { - } + public interface Factory + extends IndexDefinition.IndexFactory {} @Override default Predicate keyPredicate(AccountGroup.UUID uuid) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexCollection.java index f8ca15dc95..2f0d8e0225 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexCollection.java @@ -25,6 +25,5 @@ public class GroupIndexCollection extends IndexCollection { @Inject @VisibleForTesting - public GroupIndexCollection() { - } + public GroupIndexCollection() {} } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexDefinition.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexDefinition.java index 0f89e73598..0dbea79b55 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexDefinition.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexDefinition.java @@ -24,10 +24,14 @@ public class GroupIndexDefinition extends IndexDefinition { @Inject - GroupIndexDefinition(GroupIndexCollection indexCollection, + GroupIndexDefinition( + GroupIndexCollection indexCollection, GroupIndex.Factory indexFactory, @Nullable AllGroupsIndexer allGroupsIndexer) { - super(GroupSchemaDefinitions.INSTANCE, indexCollection, indexFactory, + super( + GroupSchemaDefinitions.INSTANCE, + indexCollection, + indexFactory, Providers.of(allGroupsIndexer)); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexRewriter.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexRewriter.java index e64631eabe..82f55ed29d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexRewriter.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexRewriter.java @@ -34,8 +34,8 @@ public class GroupIndexRewriter implements IndexRewriter { } @Override - public Predicate rewrite(Predicate in, - QueryOptions opts) throws QueryParseException { + public Predicate rewrite(Predicate in, QueryOptions opts) + throws QueryParseException { GroupIndex index = indexes.getSearchIndex(); checkNotNull(index, "no active search index configured for groups"); return new IndexedGroupQuery(index, in, opts); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexer.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexer.java index 6606f8eda1..0925cf4148 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexer.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexer.java @@ -15,7 +15,6 @@ package com.google.gerrit.server.index.group; import com.google.gerrit.reviewdb.client.AccountGroup; - import java.io.IOException; public interface GroupIndexer { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexerImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexerImpl.java index dc2e81a23c..f740f58533 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexerImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexerImpl.java @@ -21,7 +21,6 @@ import com.google.gerrit.server.account.GroupCache; import com.google.gerrit.server.index.Index; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - import java.io.IOException; import java.util.Collection; import java.util.Collections; @@ -29,6 +28,7 @@ import java.util.Collections; public class GroupIndexerImpl implements GroupIndexer { public interface Factory { GroupIndexerImpl create(GroupIndexCollection indexes); + GroupIndexerImpl create(@Nullable GroupIndex index); } @@ -37,16 +37,14 @@ public class GroupIndexerImpl implements GroupIndexer { private final GroupIndex index; @AssistedInject - GroupIndexerImpl(GroupCache groupCache, - @Assisted GroupIndexCollection indexes) { + GroupIndexerImpl(GroupCache groupCache, @Assisted GroupIndexCollection indexes) { this.groupCache = groupCache; this.indexes = indexes; this.index = null; } @AssistedInject - GroupIndexerImpl(GroupCache groupCache, - @Assisted GroupIndex index) { + GroupIndexerImpl(GroupCache groupCache, @Assisted GroupIndex index) { this.groupCache = groupCache; this.indexes = null; this.index = index; @@ -64,8 +62,6 @@ public class GroupIndexerImpl implements GroupIndexer { return indexes.getWriteIndexes(); } - return index != null - ? Collections.singleton(index) - : ImmutableSet.of(); + return index != null ? Collections.singleton(index) : ImmutableSet.of(); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupSchemaDefinitions.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupSchemaDefinitions.java index 42062cd647..6ba46cb4ef 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupSchemaDefinitions.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupSchemaDefinitions.java @@ -22,19 +22,19 @@ import com.google.gerrit.server.index.SchemaDefinitions; public class GroupSchemaDefinitions extends SchemaDefinitions { @Deprecated - static final Schema V1 = schema( - GroupField.ID, - GroupField.UUID, - GroupField.OWNER_UUID, - GroupField.NAME, - GroupField.NAME_PART, - GroupField.DESCRIPTION, - GroupField.IS_VISIBLE_TO_ALL); + static final Schema V1 = + schema( + GroupField.ID, + GroupField.UUID, + GroupField.OWNER_UUID, + GroupField.NAME, + GroupField.NAME_PART, + GroupField.DESCRIPTION, + GroupField.IS_VISIBLE_TO_ALL); static final Schema V2 = schema(V1); - public static final GroupSchemaDefinitions INSTANCE = - new GroupSchemaDefinitions(); + public static final GroupSchemaDefinitions INSTANCE = new GroupSchemaDefinitions(); private GroupSchemaDefinitions() { super("groups", AccountGroup.class); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/IndexedGroupQuery.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/group/IndexedGroupQuery.java index 9ee9b783d1..1ea4478e98 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/IndexedGroupQuery.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/group/IndexedGroupQuery.java @@ -22,13 +22,12 @@ import com.google.gerrit.server.query.DataSource; import com.google.gerrit.server.query.Predicate; import com.google.gerrit.server.query.QueryParseException; -public class IndexedGroupQuery - extends IndexedQuery +public class IndexedGroupQuery extends IndexedQuery implements DataSource { - public IndexedGroupQuery(Index index, - Predicate pred, QueryOptions opts) - throws QueryParseException { + public IndexedGroupQuery( + Index index, Predicate pred, QueryOptions opts) + throws QueryParseException { super(index, pred, opts.convertForBackend()); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ioutil/BasicSerialization.java b/gerrit-server/src/main/java/com/google/gerrit/server/ioutil/BasicSerialization.java index 989b270910..5f778779fa 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/ioutil/BasicSerialization.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/ioutil/BasicSerialization.java @@ -32,13 +32,11 @@ package com.google.gerrit.server.ioutil; import static java.nio.charset.StandardCharsets.UTF_8; import com.google.gerrit.reviewdb.client.CodedEnum; - -import org.eclipse.jgit.util.IO; - import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import org.eclipse.jgit.util.IO; public class BasicSerialization { private static final byte[] NO_BYTES = {}; @@ -59,8 +57,7 @@ public class BasicSerialization { } /** Write a fixed-width 64 bit integer in network byte order (big-endian). */ - public static void writeFixInt64(final OutputStream output, final long val) - throws IOException { + public static void writeFixInt64(final OutputStream output, final long val) throws IOException { writeFixInt32(output, (int) (val >>> 32)); writeFixInt32(output, (int) (val & 0xFFFFFFFFL)); } @@ -75,8 +72,7 @@ public class BasicSerialization { } /** Write a fixed-width 32 bit integer in network byte order (big-endian). */ - public static void writeFixInt32(final OutputStream output, final int val) - throws IOException { + public static void writeFixInt32(final OutputStream output, final int val) throws IOException { output.write((val >>> 24) & 0xFF); output.write((val >>> 16) & 0xFF); output.write((val >>> 8) & 0xFF); @@ -98,8 +94,7 @@ public class BasicSerialization { } /** Write a varint; value is treated as an unsigned value. */ - public static void writeVarInt32(final OutputStream output, int value) - throws IOException { + public static void writeVarInt32(final OutputStream output, int value) throws IOException { while (true) { if ((value & ~0x7F) == 0) { output.write(value); @@ -122,14 +117,14 @@ public class BasicSerialization { } /** Write a byte array prefixed by its length in a varint. */ - public static void writeBytes(final OutputStream output, final byte[] data) - throws IOException { + public static void writeBytes(final OutputStream output, final byte[] data) throws IOException { writeBytes(output, data, 0, data.length); } /** Write a byte array prefixed by its length in a varint. */ - public static void writeBytes(final OutputStream output, final byte[] data, - final int offset, final int len) throws IOException { + public static void writeBytes( + final OutputStream output, final byte[] data, final int offset, final int len) + throws IOException { writeVarInt32(output, len); output.write(data, offset, len); } @@ -144,8 +139,7 @@ public class BasicSerialization { } /** Write a UTF-8 string, prefixed by its byte length in a varint. */ - public static void writeString(final OutputStream output, final String s) - throws IOException { + public static void writeString(final OutputStream output, final String s) throws IOException { if (s == null) { writeVarInt32(output, 0); } else { @@ -154,8 +148,8 @@ public class BasicSerialization { } /** Read an enum whose code is stored as a varint. */ - public static T readEnum(final InputStream input, - final T[] all) throws IOException { + public static T readEnum(final InputStream input, final T[] all) + throws IOException { final int val = readVarInt32(input); for (T t : all) { if (t.getCode() == val) { @@ -166,11 +160,10 @@ public class BasicSerialization { } /** Write an enum whose code is stored as a varint. */ - public static void writeEnum(final OutputStream output, - final T e) throws IOException { + public static void writeEnum(final OutputStream output, final T e) + throws IOException { writeVarInt32(output, e.getCode()); } - private BasicSerialization() { - } + private BasicSerialization() {} } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ioutil/ColumnFormatter.java b/gerrit-server/src/main/java/com/google/gerrit/server/ioutil/ColumnFormatter.java index a73f1cb90f..c96e8083aa 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/ioutil/ColumnFormatter.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/ioutil/ColumnFormatter.java @@ -15,14 +15,12 @@ package com.google.gerrit.server.ioutil; import com.google.gerrit.server.StringUtil; - import java.io.PrintWriter; /** - * Simple output formatter for column-oriented data, writing its output to - * a {@link java.io.PrintWriter} object. Handles escaping of the column - * data so that the resulting output is unambiguous and reasonably safe and - * machine parsable. + * Simple output formatter for column-oriented data, writing its output to a {@link + * java.io.PrintWriter} object. Handles escaping of the column data so that the resulting output is + * unambiguous and reasonably safe and machine parsable. */ public class ColumnFormatter { private char columnSeparator; @@ -31,11 +29,9 @@ public class ColumnFormatter { /** * @param out The writer to which output should be sent. - * @param columnSeparator A character that should serve as the separator - * token between columns of output. As only non-printable characters - * in the column text are ever escaped, the column separator must be - * a non-printable character if the output needs to be unambiguously - * parsed. + * @param columnSeparator A character that should serve as the separator token between columns of + * output. As only non-printable characters in the column text are ever escaped, the column + * separator must be a non-printable character if the output needs to be unambiguously parsed. */ public ColumnFormatter(final PrintWriter out, final char columnSeparator) { this.out = out; @@ -44,8 +40,8 @@ public class ColumnFormatter { } /** - * Adds a text string as a new column in the current line of output, - * taking care of escaping as necessary. + * Adds a text string as a new column in the current line of output, taking care of escaping as + * necessary. * * @param content the string to add. */ @@ -58,8 +54,7 @@ public class ColumnFormatter { } /** - * Finishes the output by flushing the current line and takes care of any - * other cleanup action. + * Finishes the output by flushing the current line and takes care of any other cleanup action. */ public void finish() { nextLine(); @@ -67,11 +62,10 @@ public class ColumnFormatter { } /** - * Flushes the current line of output and makes the formatter ready to - * start receiving new column data for a new line (or end-of-file). - * If the current line is empty nothing is done, i.e. consecutive calls - * to this method without intervening calls to {@link #addColumn} will - * be squashed. + * Flushes the current line of output and makes the formatter ready to start receiving new column + * data for a new line (or end-of-file). If the current line is empty nothing is done, i.e. + * consecutive calls to this method without intervening calls to {@link #addColumn} will be + * squashed. */ public void nextLine() { if (!firstColumn) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/Address.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/Address.java index 2088261d07..f3b08fbd06 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/Address.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/Address.java @@ -32,8 +32,7 @@ public class Address { if (name.endsWith("\"")) { nameEnd--; } - return new Address(name.length() > 0 ? - name.substring(nameStart, nameEnd): null, email); + return new Address(name.length() > 0 ? name.substring(nameStart, nameEnd) : null, email); } if (lt < 0 && gt < 0 && 0 < at && at < in.length() - 1) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailSettings.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailSettings.java index b719193ca9..6bdb07622a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailSettings.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailSettings.java @@ -18,10 +18,8 @@ import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.mail.receive.Protocol; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.Config; - import java.util.concurrent.TimeUnit; +import org.eclipse.jgit.lib.Config; @Singleton public class EmailSettings { @@ -52,10 +50,13 @@ public class EmailSettings { port = cfg.getInt(RECEIVE_EMAL, "port", 0); username = cfg.getString(RECEIVE_EMAL, null, "username"); password = cfg.getString(RECEIVE_EMAL, null, "password"); - encryption = - cfg.getEnum(RECEIVE_EMAL, null, "encryption", Encryption.NONE); - fetchInterval = cfg.getTimeUnit(RECEIVE_EMAL, null, "fetchInterval", - TimeUnit.MILLISECONDS.convert(60, TimeUnit.SECONDS), - TimeUnit.MILLISECONDS); + encryption = cfg.getEnum(RECEIVE_EMAL, null, "encryption", Encryption.NONE); + fetchInterval = + cfg.getTimeUnit( + RECEIVE_EMAL, + null, + "fetchInterval", + TimeUnit.MILLISECONDS.convert(60, TimeUnit.SECONDS), + TimeUnit.MILLISECONDS); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailTokenVerifier.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailTokenVerifier.java index 488711a744..5b5f33d522 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailTokenVerifier.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailTokenVerifier.java @@ -25,14 +25,14 @@ public interface EmailTokenVerifier { * * @param accountId the caller that wants to add an email to their account. * @param emailAddress the address to add. - * @return an unforgeable string to email to {@code emailAddress}. Presenting - * the string provides proof the user has the ability to read messages - * sent to that address. Must not be null. + * @return an unforgeable string to email to {@code emailAddress}. Presenting the string provides + * proof the user has the ability to read messages sent to that address. Must not be null. */ String encode(Account.Id accountId, String emailAddress); /** * Decode a token previously created. + * * @param tokenString the string created by encode. Never null. * @return a pair of account id and email address. * @throws InvalidTokenException the token is invalid, expired, malformed, etc. diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/Encryption.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/Encryption.java index a557532e42..99c3022b9b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/Encryption.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/Encryption.java @@ -15,5 +15,7 @@ package com.google.gerrit.server.mail; public enum Encryption { - NONE, SSL, TLS + NONE, + SSL, + TLS } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/MailFilter.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/MailFilter.java index 31c6641c38..d50064dfde 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/MailFilter.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/MailFilter.java @@ -19,8 +19,8 @@ import com.google.gerrit.server.mail.receive.MailMessage; /** * Listener to filter incoming email. - *

- * Invoked by Gerrit for each incoming email. + * + *

Invoked by Gerrit for each incoming email. */ @ExtensionPoint public interface MailFilter { @@ -28,8 +28,7 @@ public interface MailFilter { * Determine if Gerrit should discard or further process the message. * * @param message MailMessage parsed by Gerrit. - * @return {@code true}, if Gerrit should process the message, {@code false} - * otherwise. + * @return {@code true}, if Gerrit should process the message, {@code false} otherwise. */ boolean shouldProcessMessage(MailMessage message); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/MailUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/MailUtil.java index ca8d101968..b6d7fa8558 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/MailUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/MailUtil.java @@ -24,34 +24,34 @@ import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.server.ReviewerSet; import com.google.gerrit.server.account.AccountResolver; import com.google.gwtorm.server.OrmException; - -import org.eclipse.jgit.revwalk.FooterKey; -import org.eclipse.jgit.revwalk.FooterLine; - import java.time.format.DateTimeFormatter; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.regex.Pattern; +import org.eclipse.jgit.revwalk.FooterKey; +import org.eclipse.jgit.revwalk.FooterLine; public class MailUtil { public static DateTimeFormatter rfcDateformatter = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss ZZZ"); public static MailRecipients getRecipientsFromFooters( - ReviewDb db, AccountResolver accountResolver, boolean draftPatchSet, - List footerLines) throws OrmException { + ReviewDb db, + AccountResolver accountResolver, + boolean draftPatchSet, + List footerLines) + throws OrmException { MailRecipients recipients = new MailRecipients(); if (!draftPatchSet) { for (FooterLine footerLine : footerLines) { try { if (isReviewer(footerLine)) { - recipients.reviewers.add(toAccountId(db, accountResolver, footerLine - .getValue().trim())); + recipients.reviewers.add( + toAccountId(db, accountResolver, footerLine.getValue().trim())); } else if (footerLine.matches(FooterKey.CC)) { - recipients.cc.add(toAccountId(db, accountResolver, footerLine - .getValue().trim())); + recipients.cc.add(toAccountId(db, accountResolver, footerLine.getValue().trim())); } } catch (NoSuchAccountException e) { continue; @@ -61,21 +61,19 @@ public class MailUtil { return recipients; } - public static MailRecipients getRecipientsFromReviewers( - ReviewerSet reviewers) { + public static MailRecipients getRecipientsFromReviewers(ReviewerSet reviewers) { MailRecipients recipients = new MailRecipients(); recipients.reviewers.addAll(reviewers.byState(REVIEWER)); recipients.cc.addAll(reviewers.byState(CC)); return recipients; } - private static Account.Id toAccountId(ReviewDb db, - AccountResolver accountResolver, String nameOrEmail) + private static Account.Id toAccountId( + ReviewDb db, AccountResolver accountResolver, String nameOrEmail) throws OrmException, NoSuchAccountException { Account a = accountResolver.findByNameOrEmail(db, nameOrEmail); if (a == null) { - throw new NoSuchAccountException("\"" + nameOrEmail - + "\" is not registered"); + throw new NoSuchAccountException("\"" + nameOrEmail + "\" is not registered"); } return a.getId(); } @@ -96,8 +94,7 @@ public class MailUtil { this.cc = new HashSet<>(); } - public MailRecipients(final Set reviewers, - final Set cc) { + public MailRecipients(final Set reviewers, final Set cc) { this.reviewers = new HashSet<>(reviewers); this.cc = new HashSet<>(cc); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/SignedTokenEmailTokenVerifier.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/SignedTokenEmailTokenVerifier.java index 3dd98eabdd..aaf3243d07 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/SignedTokenEmailTokenVerifier.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/SignedTokenEmailTokenVerifier.java @@ -25,11 +25,9 @@ import com.google.gwtjsonrpc.server.XsrfException; import com.google.inject.AbstractModule; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.util.Base64; - import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.eclipse.jgit.util.Base64; /** Verifies the token sent by {@link RegisterNewEmailSender}. */ @Singleton diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/HtmlParser.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/HtmlParser.java index 6b81d35684..20e163e52e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/HtmlParser.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/HtmlParser.java @@ -18,14 +18,12 @@ import com.google.common.base.Strings; import com.google.common.collect.Iterators; import com.google.common.collect.PeekingIterator; import com.google.gerrit.reviewdb.client.Comment; - -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; - import java.util.ArrayList; import java.util.Collection; import java.util.List; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; /** HTMLParser provides parsing functionality for html email. */ public class HtmlParser { @@ -33,16 +31,14 @@ public class HtmlParser { * Parses comments from html email. * * @param email MailMessage as received from the email service. - * @param comments A specific set of comments as sent out in the original - * notification email. Comments are expected to be in the same - * order as they were sent out to in the email - * @param changeUrl Canonical change URL that points to the change on this - * Gerrit instance. - * Example: https://go-review.googlesource.com/#/c/91570 + * @param comments A specific set of comments as sent out in the original notification email. + * Comments are expected to be in the same order as they were sent out to in the email + * @param changeUrl Canonical change URL that points to the change on this Gerrit instance. + * Example: https://go-review.googlesource.com/#/c/91570 * @return List of MailComments parsed from the html part of the email. */ - public static List parse(MailMessage email, - Collection comments, String changeUrl) { + public static List parse( + MailMessage email, Collection comments, String changeUrl) { // TODO(hiesel) Add support for Gmail Mobile // TODO(hiesel) Add tests for other popular email clients @@ -53,17 +49,14 @@ public class HtmlParser { // Gerrit as these are generally more reliable then the text captions. List parsedComments = new ArrayList<>(); Document d = Jsoup.parse(email.htmlContent()); - PeekingIterator iter = - Iterators.peekingIterator(comments.iterator()); + PeekingIterator iter = Iterators.peekingIterator(comments.iterator()); String lastEncounteredFileName = null; Comment lastEncounteredComment = null; for (Element e : d.body().getAllElements()) { String elementName = e.tagName(); - boolean isInBlockQuote = e.parents().stream() - .filter(p -> p.tagName().equals("blockquote")) - .findAny() - .isPresent(); + boolean isInBlockQuote = + e.parents().stream().filter(p -> p.tagName().equals("blockquote")).findAny().isPresent(); if (elementName.equals("a")) { String href = e.attr("href"); @@ -74,8 +67,8 @@ public class HtmlParser { } Comment perspectiveComment = iter.peek(); if (href.equals(ParserUtil.filePath(changeUrl, perspectiveComment))) { - if (lastEncounteredFileName == null || !lastEncounteredFileName - .equals(perspectiveComment.key.filename)) { + if (lastEncounteredFileName == null + || !lastEncounteredFileName.equals(perspectiveComment.key.filename)) { // Not a file-level comment, but users could have typed a comment // right after this file annotation to create a new file-level // comment. If this file has a file-level comment, we have already @@ -88,34 +81,34 @@ public class HtmlParser { lastEncounteredComment = perspectiveComment; iter.next(); } - } else if (ParserUtil.isCommentUrl(href, changeUrl, - perspectiveComment)) { + } else if (ParserUtil.isCommentUrl(href, changeUrl, perspectiveComment)) { // This is a regular inline comment lastEncounteredComment = perspectiveComment; iter.next(); } - } else if (!isInBlockQuote && elementName.equals("div") && - !e.className().startsWith("gmail")) { + } else if (!isInBlockQuote + && elementName.equals("div") + && !e.className().startsWith("gmail")) { // This is a comment typed by the user String content = e.ownText().trim(); if (!Strings.isNullOrEmpty(content)) { - if (lastEncounteredComment == null && - lastEncounteredFileName == null) { + if (lastEncounteredComment == null && lastEncounteredFileName == null) { // Remove quotation line, email signature and // "Sent from my xyz device" content = ParserUtil.trimQuotationLine(content); // TODO(hiesel) Add more sanitizer if (!Strings.isNullOrEmpty(content)) { - parsedComments.add(new MailComment(content, null, null, - MailComment.CommentType.CHANGE_MESSAGE)); + parsedComments.add( + new MailComment(content, null, null, MailComment.CommentType.CHANGE_MESSAGE)); } } else if (lastEncounteredComment == null) { - parsedComments.add(new MailComment(content, lastEncounteredFileName, - null, MailComment.CommentType.FILE_COMMENT)); + parsedComments.add( + new MailComment( + content, lastEncounteredFileName, null, MailComment.CommentType.FILE_COMMENT)); } else { - parsedComments.add(new MailComment(content, null, - lastEncounteredComment, - MailComment.CommentType.INLINE_COMMENT)); + parsedComments.add( + new MailComment( + content, null, lastEncounteredComment, MailComment.CommentType.INLINE_COMMENT)); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/ImapMailReceiver.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/ImapMailReceiver.java index ce2a834dd3..3362897682 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/ImapMailReceiver.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/ImapMailReceiver.java @@ -19,32 +19,28 @@ import com.google.gerrit.server.mail.EmailSettings; import com.google.gerrit.server.mail.Encryption; import com.google.inject.Inject; import com.google.inject.Singleton; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import org.apache.commons.net.imap.IMAPClient; import org.apache.commons.net.imap.IMAPSClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - @Singleton public class ImapMailReceiver extends MailReceiver { - private static final Logger log = - LoggerFactory.getLogger(ImapMailReceiver.class); + private static final Logger log = LoggerFactory.getLogger(ImapMailReceiver.class); private static final String INBOX_FOLDER = "INBOX"; @Inject - ImapMailReceiver(EmailSettings mailSettings, - MailProcessor mailProcessor, - WorkQueue workQueue) { + ImapMailReceiver(EmailSettings mailSettings, MailProcessor mailProcessor, WorkQueue workQueue) { super(mailSettings, mailProcessor, workQueue); } /** - * handleEmails will open a connection to the mail server, remove emails - * where deletion is pending, read new email and close the connection. + * handleEmails will open a connection to the mail server, remove emails where deletion is + * pending, read new email and close the connection. + * * @param async Determines if processing messages should happen asynchronous. */ @Override @@ -68,7 +64,7 @@ public class ImapMailReceiver extends MailReceiver { return; } try { - if (!imap.select(INBOX_FOLDER)){ + if (!imap.select(INBOX_FOLDER)) { log.error("Could not select IMAP folder " + INBOX_FOLDER); return; } @@ -102,7 +98,7 @@ public class ImapMailReceiver extends MailReceiver { // checked, that the fetch returned true (OK), so we safely ignore // those two lines. StringBuilder b = new StringBuilder(2 * (rawMessage.length - 2)); - for(int j = 1; j < rawMessage.length - 1; j++) { + for (int j = 1; j < rawMessage.length - 1; j++) { if (j > 1) { b.append("\n"); } @@ -115,8 +111,7 @@ public class ImapMailReceiver extends MailReceiver { if (imap.store(i + ":" + i, "+FLAGS", "(\\Deleted)")) { pendingDeletion.remove(mailMessage.id()); } else { - log.error("Could not mark mail message as deleted: " + - mailMessage.id()); + log.error("Could not mark mail message as deleted: " + mailMessage.id()); } } else { mailMessages.add(mailMessage); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailComment.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailComment.java index 4144cfc8a8..8afbe81c17 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailComment.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailComment.java @@ -29,10 +29,9 @@ public class MailComment { String fileName; String message; - public MailComment() { } + public MailComment() {} - public MailComment(String message, String fileName, Comment inReplyTo, - CommentType type) { + public MailComment(String message, String fileName, Comment inReplyTo, CommentType type) { this.message = message; this.fileName = fileName; this.inReplyTo = inReplyTo; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailMessage.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailMessage.java index 27d305222f..dcac25c423 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailMessage.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailMessage.java @@ -18,18 +18,16 @@ import com.google.auto.value.AutoValue; import com.google.common.collect.ImmutableList; import com.google.gerrit.common.Nullable; import com.google.gerrit.server.mail.Address; - import org.joda.time.DateTime; /** - * MailMessage is a simplified representation of an RFC 2045-2047 mime email - * message used for representing received emails inside Gerrit. It is populated - * by the MailParser after MailReceiver has received a message. Transformations - * done by the parser include stitching mime parts together, transforming all - * content to UTF-16 and removing attachments. + * MailMessage is a simplified representation of an RFC 2045-2047 mime email message used for + * representing received emails inside Gerrit. It is populated by the MailParser after MailReceiver + * has received a message. Transformations done by the parser include stitching mime parts together, + * transforming all content to UTF-16 and removing attachments. * - * A valid MailMessage contains at least the following fields: id, from, to, - * subject and dateReceived. + *

A valid MailMessage contains at least the following fields: id, from, to, subject and + * dateReceived. */ @AutoValue public abstract class MailMessage { @@ -37,20 +35,26 @@ public abstract class MailMessage { public abstract String id(); // Envelop Information public abstract Address from(); + public abstract ImmutableList

to(); + public abstract ImmutableList
cc(); // Metadata public abstract DateTime dateReceived(); + public abstract ImmutableList additionalHeaders(); // Content public abstract String subject(); + @Nullable public abstract String textContent(); + @Nullable public abstract String htmlContent(); // Raw content as received over the wire @Nullable public abstract ImmutableList rawContent(); + @Nullable public abstract String rawContentUTF(); @@ -63,7 +67,9 @@ public abstract class MailMessage { @AutoValue.Builder public abstract static class Builder { public abstract Builder id(String val); + public abstract Builder from(Address val); + public abstract ImmutableList.Builder
toBuilder(); public Builder addTo(Address val) { @@ -79,6 +85,7 @@ public abstract class MailMessage { } public abstract Builder dateReceived(DateTime val); + public abstract ImmutableList.Builder additionalHeadersBuilder(); public Builder addAdditionalHeader(String val) { @@ -87,9 +94,13 @@ public abstract class MailMessage { } public abstract Builder subject(String val); + public abstract Builder textContent(String val); + public abstract Builder htmlContent(String val); + public abstract Builder rawContent(ImmutableList val); + public abstract Builder rawContentUTF(String val); public abstract MailMessage build(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailMetadata.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailMetadata.java index c353e54f31..f85291c10f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailMetadata.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailMetadata.java @@ -15,7 +15,6 @@ package com.google.gerrit.server.mail.receive; import com.google.common.base.MoreObjects; - import java.sql.Timestamp; /** MailMetadata represents metadata parsed from inbound email. */ @@ -26,10 +25,12 @@ public class MailMetadata { public Timestamp timestamp; public String messageType; // we expect comment here - public boolean hasRequiredFields() { - return changeId != null && patchSet != null && author != null && - timestamp != null && messageType != null; + return changeId != null + && patchSet != null + && author != null + && timestamp != null + && messageType != null; } @Override diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailProcessor.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailProcessor.java index eb084caa26..08bd0ba339 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailProcessor.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailProcessor.java @@ -46,21 +46,18 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Singleton public class MailProcessor { - private static final Logger log = - LoggerFactory.getLogger(MailProcessor.class.getName()); + private static final Logger log = LoggerFactory.getLogger(MailProcessor.class.getName()); private final AccountByEmailCache accountByEmailCache; private final BatchUpdate.Factory buf; @@ -75,7 +72,8 @@ public class MailProcessor { private final Provider canonicalUrl; @Inject - public MailProcessor(AccountByEmailCache accountByEmailCache, + public MailProcessor( + AccountByEmailCache accountByEmailCache, BatchUpdate.Factory buf, ChangeMessagesUtil changeMessagesUtil, CommentsUtil commentsUtil, @@ -101,57 +99,68 @@ public class MailProcessor { /** * Parse comments from MailMessage and persist them on the change. + * * @param message MailMessage to process. * @throws OrmException */ public void process(MailMessage message) throws OrmException { for (DynamicMap.Entry filter : mailFilters) { if (!filter.getProvider().get().shouldProcessMessage(message)) { - log.warn("Mail: Message " + message.id() + " filtered by plugin " + - filter.getPluginName() + " " + filter.getExportName() + - ". Will delete message."); + log.warn( + "Mail: Message " + + message.id() + + " filtered by plugin " + + filter.getPluginName() + + " " + + filter.getExportName() + + ". Will delete message."); return; } } MailMetadata metadata = MetadataParser.parse(message); if (!metadata.hasRequiredFields()) { - log.error("Mail: Message " + message.id() + - " is missing required metadata, have " + metadata + - ". Will delete message."); + log.error( + "Mail: Message " + + message.id() + + " is missing required metadata, have " + + metadata + + ". Will delete message."); return; } Set accounts = accountByEmailCache.get(metadata.author); if (accounts.size() != 1) { - log.error("Mail: Address " + metadata.author + - " could not be matched to a unique account. It was matched to " + - accounts + ". Will delete message."); + log.error( + "Mail: Address " + + metadata.author + + " could not be matched to a unique account. It was matched to " + + accounts + + ". Will delete message."); return; } Account.Id account = accounts.iterator().next(); if (!reviewDb.get().accounts().get(account).isActive()) { - log.warn("Mail: Account " + account + - " is inactive. Will delete message."); + log.warn("Mail: Account " + account + " is inactive. Will delete message."); return; } try (ManualRequestContext ctx = oneOffRequestContext.openAs(account)) { - ChangeData cd = queryProvider.get().setLimit(1) - .byKey(Change.Key.parse(metadata.changeId)).get(0); + ChangeData cd = + queryProvider.get().setLimit(1).byKey(Change.Key.parse(metadata.changeId)).get(0); if (existingMessageIds(cd).contains(message.id())) { - log.info("Mail: Message " + message.id() + - " was already processed. Will delete message."); + log.info("Mail: Message " + message.id() + " was already processed. Will delete message."); return; } // Get all comments; filter and sort them to get the original list of // comments from the outbound email. // TODO(hiesel) Also filter by original comment author. - Collection comments = cd.publishedComments().stream() - .filter(c -> (c.writtenOn.getTime() / 1000) == - (metadata.timestamp.getTime() / 1000)) - .sorted(CommentsUtil.COMMENT_ORDER) - .collect(Collectors.toList()); + Collection comments = + cd.publishedComments() + .stream() + .filter(c -> (c.writtenOn.getTime() / 1000) == (metadata.timestamp.getTime() / 1000)) + .sorted(CommentsUtil.COMMENT_ORDER) + .collect(Collectors.toList()); Project.NameKey project = cd.project(); String changeUrl = canonicalUrl.get() + "#/c/" + cd.getId().get(); @@ -163,15 +172,13 @@ public class MailProcessor { } if (parsedComments.isEmpty()) { - log.warn("Mail: Could not parse any comments from " + message.id() + - ". Will delete message."); + log.warn( + "Mail: Could not parse any comments from " + message.id() + ". Will delete message."); return; } - Op o = new Op(new PatchSet.Id(cd.getId(), metadata.patchSet), - parsedComments, message.id()); - BatchUpdate batchUpdate = buf.create(cd.db(), project, ctx.getUser(), - TimeUtil.nowTs()); + Op o = new Op(new PatchSet.Id(cd.getId(), metadata.patchSet), parsedComments, message.id()); + BatchUpdate batchUpdate = buf.create(cd.db(), project, ctx.getUser(), TimeUtil.nowTs()); batchUpdate.addOp(cd.getId(), o); try { batchUpdate.execute(); @@ -186,24 +193,22 @@ public class MailProcessor { private final List parsedComments; private final String tag; - private Op(PatchSet.Id psId, List parsedComments, - String messageId) { + private Op(PatchSet.Id psId, List parsedComments, String messageId) { this.psId = psId; this.parsedComments = parsedComments; this.tag = "mailMessageId=" + messageId; } @Override - public boolean updateChange(ChangeContext ctx) throws OrmException, - UnprocessableEntityException { + public boolean updateChange(ChangeContext ctx) + throws OrmException, UnprocessableEntityException { PatchSet ps = psUtil.get(ctx.getDb(), ctx.getNotes(), psId); if (ps == null) { throw new OrmException("patch set not found: " + psId); } String changeMsg = "Patch Set " + psId.get() + ":"; - if (parsedComments.get(0).type == - MailComment.CommentType.CHANGE_MESSAGE) { + if (parsedComments.get(0).type == MailComment.CommentType.CHANGE_MESSAGE) { if (parsedComments.size() > 1) { changeMsg += "\n" + numComments(parsedComments.size() - 1); } @@ -213,8 +218,7 @@ public class MailProcessor { } ChangeMessage msg = ChangeMessagesUtil.newMessage(ctx, changeMsg, tag); - changeMessagesUtil.addChangeMessage(ctx.getDb(), - ctx.getUpdate(psId), msg); + changeMessagesUtil.addChangeMessage(ctx.getDb(), ctx.getUpdate(psId), msg); List comments = new ArrayList<>(); for (MailComment c : parsedComments) { @@ -229,9 +233,11 @@ public class MailProcessor { Side side; if (c.inReplyTo != null) { fileName = c.inReplyTo.key.filename; - psForComment = psUtil.get(ctx.getDb(), ctx.getNotes(), - new PatchSet.Id(ctx.getChange().getId(), - c.inReplyTo.key.patchSetId)); + psForComment = + psUtil.get( + ctx.getDb(), + ctx.getNotes(), + new PatchSet.Id(ctx.getChange().getId(), c.inReplyTo.key.patchSetId)); side = Side.fromShort(c.inReplyTo.side); } else { fileName = c.fileName; @@ -239,9 +245,15 @@ public class MailProcessor { side = Side.REVISION; } - Comment comment = commentsUtil.newComment(ctx, fileName, - psForComment.getId(), (short) side.ordinal(), c.message, - false, null); + Comment comment = + commentsUtil.newComment( + ctx, + fileName, + psForComment.getId(), + (short) side.ordinal(), + c.message, + false, + null); comment.tag = tag; if (c.inReplyTo != null) { comment.parentUuid = c.inReplyTo.key.uuid; @@ -249,12 +261,13 @@ public class MailProcessor { comment.range = c.inReplyTo.range; comment.unresolved = c.inReplyTo.unresolved; } - CommentsUtil.setCommentRevId(comment, patchListCache, - ctx.getChange(), psForComment); + CommentsUtil.setCommentRevId(comment, patchListCache, ctx.getChange(), psForComment); comments.add(comment); } - commentsUtil.putComments(ctx.getDb(), - ctx.getUpdate(ctx.getChange().currentPatchSetId()), Status.PUBLISHED, + commentsUtil.putComments( + ctx.getDb(), + ctx.getUpdate(ctx.getChange().currentPatchSetId()), + Status.PUBLISHED, comments); return true; @@ -271,18 +284,24 @@ public class MailProcessor { private Set existingMessageIds(ChangeData cd) throws OrmException { Set existingMessageIds = new HashSet<>(); - cd.messages().stream().forEach(m -> { - String messageId = CommentsUtil.extractMessageId(m.getTag()); - if (messageId != null) { - existingMessageIds.add(messageId); - } - }); - cd.publishedComments().stream().forEach(c -> { - String messageId = CommentsUtil.extractMessageId(c.tag); - if (messageId != null) { - existingMessageIds.add(messageId); - } - }); + cd.messages() + .stream() + .forEach( + m -> { + String messageId = CommentsUtil.extractMessageId(m.getTag()); + if (messageId != null) { + existingMessageIds.add(messageId); + } + }); + cd.publishedComments() + .stream() + .forEach( + c -> { + String messageId = CommentsUtil.extractMessageId(c.tag); + if (messageId != null) { + existingMessageIds.add(messageId); + } + }); return existingMessageIds; } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailReceiver.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailReceiver.java index 24f4f48bf9..1cabe16da4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailReceiver.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailReceiver.java @@ -21,10 +21,6 @@ import com.google.gerrit.server.git.WorkQueue; import com.google.gerrit.server.mail.EmailSettings; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -32,11 +28,12 @@ import java.util.Set; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.Callable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** MailReceiver implements base functionality for receiving emails. */ public abstract class MailReceiver implements LifecycleListener { - private static final Logger log = - LoggerFactory.getLogger(MailReceiver.class.getName()); + private static final Logger log = LoggerFactory.getLogger(MailReceiver.class.getName()); protected EmailSettings mailSettings; protected Set pendingDeletion; @@ -71,8 +68,7 @@ public abstract class MailReceiver implements LifecycleListener { } } - MailReceiver(EmailSettings mailSettings, MailProcessor mailProcessor, - WorkQueue workQueue) { + MailReceiver(EmailSettings mailSettings, MailProcessor mailProcessor, WorkQueue workQueue) { this.mailSettings = mailSettings; this.mailProcessor = mailProcessor; this.workQueue = workQueue; @@ -86,12 +82,15 @@ public abstract class MailReceiver implements LifecycleListener { } else { timer.cancel(); } - timer.scheduleAtFixedRate(new TimerTask() { - @Override - public void run() { - MailReceiver.this.handleEmails(true); - } - }, 0L, mailSettings.fetchInterval); + timer.scheduleAtFixedRate( + new TimerTask() { + @Override + public void run() { + MailReceiver.this.handleEmails(true); + } + }, + 0L, + mailSettings.fetchInterval); } @Override @@ -102,9 +101,10 @@ public abstract class MailReceiver implements LifecycleListener { } /** - * requestDeletion will enqueue an email for deletion and delete it the - * next time we connect to the email server. This does not guarantee deletion - * as the Gerrit instance might fail before we connect to the email server. + * requestDeletion will enqueue an email for deletion and delete it the next time we connect to + * the email server. This does not guarantee deletion as the Gerrit instance might fail before we + * connect to the email server. + * * @param messageId */ public void requestDeletion(String messageId) { @@ -112,27 +112,27 @@ public abstract class MailReceiver implements LifecycleListener { } /** - * handleEmails will open a connection to the mail server, remove emails - * where deletion is pending, read new email and close the connection. + * handleEmails will open a connection to the mail server, remove emails where deletion is + * pending, read new email and close the connection. + * * @param async Determines if processing messages should happen asynchronous. */ @VisibleForTesting public abstract void handleEmails(boolean async); - protected void dispatchMailProcessor(List messages, - boolean async) { + protected void dispatchMailProcessor(List messages, boolean async) { for (MailMessage m : messages) { if (async) { - Callable task = () -> { - try { - mailProcessor.process(m); - requestDeletion(m.id()); - } catch (OrmException e) { - log.error("Mail: Can't process message " + m.id() + - " . Won't delete.", e); - } - return null; - }; + Callable task = + () -> { + try { + mailProcessor.process(m); + requestDeletion(m.id()); + } catch (OrmException e) { + log.error("Mail: Can't process message " + m.id() + " . Won't delete.", e); + } + return null; + }; workQueue.getDefaultQueue().submit(task); } else { // Synchronous processing is used only in tests. diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MetadataParser.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MetadataParser.java index 1a3b14d660..c812568c82 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MetadataParser.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MetadataParser.java @@ -21,7 +21,6 @@ import com.google.common.base.Strings; import com.google.common.primitives.Ints; import com.google.gerrit.server.mail.MailUtil; import com.google.gerrit.server.mail.MetadataName; - import java.sql.Timestamp; import java.time.Instant; @@ -35,23 +34,17 @@ public class MetadataParser { // Check email headers for X-Gerrit- for (String header : m.additionalHeaders()) { if (header.startsWith(toHeaderWithDelimiter(MetadataName.CHANGE_ID))) { - metadata.changeId = header - .substring(toHeaderWithDelimiter(MetadataName.CHANGE_ID).length()); - } else if (header.startsWith( - toHeaderWithDelimiter(MetadataName.PATCH_SET))) { - String ps = header.substring( - toHeaderWithDelimiter(MetadataName.PATCH_SET).length()); + metadata.changeId = + header.substring(toHeaderWithDelimiter(MetadataName.CHANGE_ID).length()); + } else if (header.startsWith(toHeaderWithDelimiter(MetadataName.PATCH_SET))) { + String ps = header.substring(toHeaderWithDelimiter(MetadataName.PATCH_SET).length()); metadata.patchSet = Ints.tryParse(ps); - } else if (header.startsWith( - toHeaderWithDelimiter(MetadataName.TIMESTAMP))) { - String ts = header.substring( - toHeaderWithDelimiter(MetadataName.TIMESTAMP).length()); - metadata.timestamp = Timestamp.from( - MailUtil.rfcDateformatter.parse(ts, Instant::from)); - } else if (header.startsWith( - toHeaderWithDelimiter(MetadataName.MESSAGE_TYPE))) { - metadata.messageType = header.substring( - toHeaderWithDelimiter(MetadataName.MESSAGE_TYPE).length()); + } else if (header.startsWith(toHeaderWithDelimiter(MetadataName.TIMESTAMP))) { + String ts = header.substring(toHeaderWithDelimiter(MetadataName.TIMESTAMP).length()); + metadata.timestamp = Timestamp.from(MailUtil.rfcDateformatter.parse(ts, Instant::from)); + } else if (header.startsWith(toHeaderWithDelimiter(MetadataName.MESSAGE_TYPE))) { + metadata.messageType = + header.substring(toHeaderWithDelimiter(MetadataName.MESSAGE_TYPE).length()); } } if (metadata.hasRequiredFields()) { @@ -83,22 +76,16 @@ public class MetadataParser { private static void extractFooters(String[] lines, MailMetadata metadata) { for (String line : lines) { if (metadata.changeId == null && line.contains(MetadataName.CHANGE_ID)) { - metadata.changeId = - extractFooter(toFooterWithDelimiter(MetadataName.CHANGE_ID), line); - } else if (metadata.patchSet == null && - line.contains(MetadataName.PATCH_SET)) { - metadata.patchSet = Ints.tryParse( - extractFooter(toFooterWithDelimiter(MetadataName.PATCH_SET), line)); - } else if (metadata.timestamp == null && - line.contains(MetadataName.TIMESTAMP)) { - String ts = - extractFooter(toFooterWithDelimiter(MetadataName.TIMESTAMP), line); - metadata.timestamp = Timestamp.from( - MailUtil.rfcDateformatter.parse(ts, Instant::from)); - } else if (metadata.messageType == null && - line.contains(MetadataName.MESSAGE_TYPE)) { - metadata.messageType = extractFooter( - toFooterWithDelimiter(MetadataName.MESSAGE_TYPE), line); + metadata.changeId = extractFooter(toFooterWithDelimiter(MetadataName.CHANGE_ID), line); + } else if (metadata.patchSet == null && line.contains(MetadataName.PATCH_SET)) { + metadata.patchSet = + Ints.tryParse(extractFooter(toFooterWithDelimiter(MetadataName.PATCH_SET), line)); + } else if (metadata.timestamp == null && line.contains(MetadataName.TIMESTAMP)) { + String ts = extractFooter(toFooterWithDelimiter(MetadataName.TIMESTAMP), line); + metadata.timestamp = Timestamp.from(MailUtil.rfcDateformatter.parse(ts, Instant::from)); + } else if (metadata.messageType == null && line.contains(MetadataName.MESSAGE_TYPE)) { + metadata.messageType = + extractFooter(toFooterWithDelimiter(MetadataName.MESSAGE_TYPE), line); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/ParserUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/ParserUtil.java index dbdea22529..72eb18af50 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/ParserUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/ParserUtil.java @@ -15,17 +15,18 @@ package com.google.gerrit.server.mail.receive; import com.google.gerrit.reviewdb.client.Comment; - import java.util.regex.Pattern; public class ParserUtil { - private static final Pattern SIMPLE_EMAIL_PATTERN = Pattern.compile( - "[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+" - + "(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})"); + private static final Pattern SIMPLE_EMAIL_PATTERN = + Pattern.compile( + "[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+" + + "(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})"); /** - * Trims the quotation line that email clients add - * Example: On Sun, Nov 20, 2016 at 10:33 PM, wrote: + * Trims the quotation line that email clients add Example: On Sun, Nov 20, 2016 at 10:33 PM, + * wrote: + * * @param comment Comment parsed from an email. * @return Trimmed comment. */ @@ -44,14 +45,14 @@ public class ParserUtil { if (c >= '0' && c <= '9') { numConsecutiveDigits++; } else if (numConsecutiveDigits > 0) { - maxConsecutiveDigits = Integer.max(maxConsecutiveDigits, - numConsecutiveDigits); + maxConsecutiveDigits = Integer.max(maxConsecutiveDigits, numConsecutiveDigits); numConsecutiveDigits = 0; numDigitGroups++; } } - if (numDigitGroups < 4 || maxConsecutiveDigits > 4 || - !SIMPLE_EMAIL_PATTERN.matcher(line).find()) { + if (numDigitGroups < 4 + || maxConsecutiveDigits > 4 + || !SIMPLE_EMAIL_PATTERN.matcher(line).find()) { b.append(line); } } @@ -59,15 +60,13 @@ public class ParserUtil { } /** Check if string is an inline comment url on a patch set or the base */ - public static boolean isCommentUrl(String str, String changeUrl, - Comment comment) { - return str.equals(filePath(changeUrl, comment) + "@" + comment.lineNbr) || - str.equals(filePath(changeUrl, comment) + "@a" + comment.lineNbr); + public static boolean isCommentUrl(String str, String changeUrl, Comment comment) { + return str.equals(filePath(changeUrl, comment) + "@" + comment.lineNbr) + || str.equals(filePath(changeUrl, comment) + "@a" + comment.lineNbr); } /** Generate the fully qualified filepath */ public static String filePath(String changeUrl, Comment comment) { - return changeUrl + "/" + comment.key.patchSetId + "/" + - comment.key.filename; + return changeUrl + "/" + comment.key.patchSetId + "/" + comment.key.filename; } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/Pop3MailReceiver.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/Pop3MailReceiver.java index d1498fd749..3bf452f211 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/Pop3MailReceiver.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/Pop3MailReceiver.java @@ -20,33 +20,29 @@ import com.google.gerrit.server.mail.EmailSettings; import com.google.gerrit.server.mail.Encryption; import com.google.inject.Inject; import com.google.inject.Singleton; - +import java.io.BufferedReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import org.apache.commons.net.pop3.POP3Client; import org.apache.commons.net.pop3.POP3MessageInfo; import org.apache.commons.net.pop3.POP3SClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.BufferedReader; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - @Singleton public class Pop3MailReceiver extends MailReceiver { - private static final Logger log = - LoggerFactory.getLogger(Pop3MailReceiver.class); + private static final Logger log = LoggerFactory.getLogger(Pop3MailReceiver.class); @Inject - Pop3MailReceiver(EmailSettings mailSettings, - MailProcessor mailProcessor, - WorkQueue workQueue) { + Pop3MailReceiver(EmailSettings mailSettings, MailProcessor mailProcessor, WorkQueue workQueue) { super(mailSettings, mailProcessor, workQueue); } /** - * handleEmails will open a connection to the mail server, remove emails - * where deletion is pending, read new email and close the connection. + * handleEmails will open a connection to the mail server, remove emails where deletion is + * pending, read new email and close the connection. + * * @param async Determines if processing messages should happen asynchronous. */ @Override @@ -69,8 +65,7 @@ public class Pop3MailReceiver extends MailReceiver { try { try { if (!pop3.login(mailSettings.username, mailSettings.password)) { - log.error("Could not login to POP3 email server." - + " Check username and password"); + log.error("Could not login to POP3 email server." + " Check username and password"); return; } try { @@ -87,12 +82,10 @@ public class Pop3MailReceiver extends MailReceiver { // Message was deleted continue; } - try (BufferedReader reader = - (BufferedReader) pop3.retrieveMessage(msginfo.number)) { + try (BufferedReader reader = (BufferedReader) pop3.retrieveMessage(msginfo.number)) { if (reader == null) { log.error( - "Could not retrieve POP3 message header for message {}", - msginfo.identifier); + "Could not retrieve POP3 message header for message {}", msginfo.identifier); return; } int[] message = fetchMessage(reader); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/Protocol.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/Protocol.java index e8311f14c5..cbd40ed029 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/Protocol.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/Protocol.java @@ -15,5 +15,7 @@ package com.google.gerrit.server.mail.receive; public enum Protocol { - NONE, POP3, IMAP + NONE, + POP3, + IMAP } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/RawMailParser.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/RawMailParser.java index 52dc3ce1f4..e2f05dc85d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/RawMailParser.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/RawMailParser.java @@ -22,7 +22,9 @@ import com.google.common.collect.ImmutableSet; import com.google.common.io.CharStreams; import com.google.common.primitives.Ints; import com.google.gerrit.server.mail.Address; - +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.dom.Entity; import org.apache.james.mime4j.dom.Message; @@ -33,21 +35,17 @@ import org.apache.james.mime4j.dom.address.Mailbox; import org.apache.james.mime4j.message.DefaultMessageBuilder; import org.joda.time.DateTime; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStreamReader; - /** - * RawMailParser parses raw email content received through POP3 or IMAP into - * an internal {@link MailMessage}. + * RawMailParser parses raw email content received through POP3 or IMAP into an internal {@link + * MailMessage}. */ public class RawMailParser { private static final ImmutableSet MAIN_HEADERS = - ImmutableSet.of("to", "from", "cc", "date", "message-id", - "subject", "content-type"); + ImmutableSet.of("to", "from", "cc", "date", "message-id", "subject", "content-type"); /** * Parses a MailMessage from a string. + * * @param raw String as received over the wire * @return Parsed MailMessage * @throws MailParsingException @@ -58,8 +56,7 @@ public class RawMailParser { Message mimeMessage; try { MessageBuilder builder = new DefaultMessageBuilder(); - mimeMessage = - builder.parseMessage(new ByteArrayInputStream(raw.getBytes(UTF_8))); + mimeMessage = builder.parseMessage(new ByteArrayInputStream(raw.getBytes(UTF_8))); } catch (IOException | MimeException e) { throw new MailParsingException("Can't parse email", e); } @@ -85,10 +82,12 @@ public class RawMailParser { } // Add additional headers - mimeMessage.getHeader().getFields().stream() + mimeMessage + .getHeader() + .getFields() + .stream() .filter(f -> !MAIN_HEADERS.contains(f.getName().toLowerCase())) - .forEach(f -> messageBuilder.addAdditionalHeader( - f.getName() + ": " + f.getBody())); + .forEach(f -> messageBuilder.addAdditionalHeader(f.getName() + ": " + f.getBody())); // Add text and html body parts StringBuilder textBuilder = new StringBuilder(); @@ -107,19 +106,18 @@ public class RawMailParser { // required attributes are missing, so that the caller doesn't fall over. return messageBuilder.build(); } catch (IllegalStateException e) { - throw new MailParsingException( - "Missing required attributes after email was parsed", e); + throw new MailParsingException("Missing required attributes after email was parsed", e); } } /** - * Parses a MailMessage from an array of characters. Note that the character - * array is int-typed. This method is only used by POP3, which specifies that - * all transferred characters are US-ASCII (RFC 6856). When reading the input - * in Java, io.Reader yields ints. These can be safely converted to chars - * as all US-ASCII characters fit in a char. If emails contain non-ASCII - * characters, such as UTF runes, these will be encoded in ASCII using either - * Base64 or quoted-printable encoding. + * Parses a MailMessage from an array of characters. Note that the character array is int-typed. + * This method is only used by POP3, which specifies that all transferred characters are US-ASCII + * (RFC 6856). When reading the input in Java, io.Reader yields ints. These can be safely + * converted to chars as all US-ASCII characters fit in a char. If emails contain non-ASCII + * characters, such as UTF runes, these will be encoded in ASCII using either Base64 or + * quoted-printable encoding. + * * @param chars Array as received over the wire * @return Parsed MailMessage * @throws MailParsingException @@ -136,20 +134,19 @@ public class RawMailParser { } /** - * Traverses a mime tree and parses out text and html parts. All other parts - * will be dropped. + * Traverses a mime tree and parses out text and html parts. All other parts will be dropped. + * * @param part MimePart to parse * @param textBuilder StringBuilder to append all plaintext parts * @param htmlBuilder StringBuilder to append all html parts * @throws IOException */ - private static void handleMimePart(Entity part, StringBuilder textBuilder, - StringBuilder htmlBuilder) throws IOException { - if (isPlainOrHtml(part.getMimeType()) && - !isAttachment(part.getDispositionType())) { + private static void handleMimePart( + Entity part, StringBuilder textBuilder, StringBuilder htmlBuilder) throws IOException { + if (isPlainOrHtml(part.getMimeType()) && !isAttachment(part.getDispositionType())) { TextBody tb = (TextBody) part.getBody(); - String result = CharStreams.toString(new InputStreamReader( - tb.getInputStream(), tb.getMimeCharset())); + String result = + CharStreams.toString(new InputStreamReader(tb.getInputStream(), tb.getMimeCharset())); if (part.getMimeType().equals("text/plain")) { textBuilder.append(result); } else if (part.getMimeType().equals("text/html")) { @@ -168,8 +165,7 @@ public class RawMailParser { } private static boolean isMixedOrAlternative(String mimeType) { - return mimeType.equals("multipart/alternative") || - mimeType.equals("multipart/mixed"); + return mimeType.equals("multipart/alternative") || mimeType.equals("multipart/mixed"); } private static boolean isAttachment(String dispositionType) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/TextParser.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/TextParser.java index 8b28df571b..a752e894ec 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/TextParser.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/TextParser.java @@ -17,23 +17,20 @@ package com.google.gerrit.server.mail.receive; import com.google.common.collect.Iterators; import com.google.common.collect.PeekingIterator; import com.google.gerrit.reviewdb.client.Comment; - import java.util.ArrayList; import java.util.Collection; import java.util.List; -/** TextParser provides parsing functionality for plaintext email. */ +/** TextParser provides parsing functionality for plaintext email. */ public class TextParser { /** * Parses comments from plaintext email. * * @param email MailMessage as received from the email service. - * @param comments Comments previously persisted on the change that caused the - * original notification email to be sent out. Ordering must - * be the same as in the outbound email - * @param changeUrl Canonical change url that points to the change on this - * Gerrit instance. - * Example: https://go-review.googlesource.com/#/c/91570 + * @param comments Comments previously persisted on the change that caused the original + * notification email to be sent out. Ordering must be the same as in the outbound email + * @param changeUrl Canonical change url that points to the change on this Gerrit instance. + * Example: https://go-review.googlesource.com/#/c/91570 * @return List of MailComments parsed from the plaintext part of the email. */ public static List parse( @@ -56,13 +53,11 @@ public class TextParser { // > A comment typed in the email directly String singleQuotePattern = "\n> "; String doubleQuotePattern = "\n>> "; - if (countOccurrences(body, doubleQuotePattern) > - countOccurrences(body, singleQuotePattern)) { + if (countOccurrences(body, doubleQuotePattern) > countOccurrences(body, singleQuotePattern)) { body = body.replace(doubleQuotePattern, singleQuotePattern); } - PeekingIterator iter = - Iterators.peekingIterator(comments.iterator()); + PeekingIterator iter = Iterators.peekingIterator(comments.iterator()); String[] lines = body.split("\n"); MailComment currentComment = null; @@ -83,9 +78,8 @@ public class TextParser { } Comment perspectiveComment = iter.peek(); if (line.equals(ParserUtil.filePath(changeUrl, perspectiveComment))) { - if (lastEncounteredFileName == null || - !lastEncounteredFileName - .equals(perspectiveComment.key.filename)) { + if (lastEncounteredFileName == null + || !lastEncounteredFileName.equals(perspectiveComment.key.filename)) { // This is the annotation of a file lastEncounteredFileName = perspectiveComment.key.filename; lastEncounteredComment = null; @@ -94,8 +88,7 @@ public class TextParser { lastEncounteredComment = perspectiveComment; iter.next(); } - } else if (ParserUtil.isCommentUrl(line, changeUrl, - perspectiveComment)) { + } else if (ParserUtil.isCommentUrl(line, changeUrl, perspectiveComment)) { lastEncounteredComment = perspectiveComment; iter.next(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/AbandonedSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/AbandonedSender.java index 8ddfe5cfa5..ca762c9c90 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/AbandonedSender.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/AbandonedSender.java @@ -24,16 +24,14 @@ import com.google.inject.assistedinject.Assisted; /** Send notice about a change being abandoned by its owner. */ public class AbandonedSender extends ReplyToChangeSender { - public interface Factory extends - ReplyToChangeSender.Factory { + public interface Factory extends ReplyToChangeSender.Factory { @Override AbandonedSender create(Project.NameKey project, Change.Id change); } @Inject - public AbandonedSender(EmailArguments ea, - @Assisted Project.NameKey project, - @Assisted Change.Id id) + public AbandonedSender( + EmailArguments ea, @Assisted Project.NameKey project, @Assisted Change.Id id) throws OrmException { super(ea, "abandon", ChangeEmail.newChangeData(ea, project, id)); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/AddKeySender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/AddKeySender.java index 47068eb9ba..0c0963975b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/AddKeySender.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/AddKeySender.java @@ -22,7 +22,6 @@ import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.mail.Address; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - import java.util.List; public class AddKeySender extends OutgoingEmail { @@ -38,7 +37,8 @@ public class AddKeySender extends OutgoingEmail { private final List gpgKeys; @AssistedInject - public AddKeySender(EmailArguments ea, + public AddKeySender( + EmailArguments ea, IdentifiedUser callingUser, @Assisted IdentifiedUser user, @Assisted AccountSshKey sshKey) { @@ -50,7 +50,8 @@ public class AddKeySender extends OutgoingEmail { } @AssistedInject - public AddKeySender(EmailArguments ea, + public AddKeySender( + EmailArguments ea, IdentifiedUser callingUser, @Assisted IdentifiedUser user, @Assisted List gpgKeys) { @@ -64,8 +65,7 @@ public class AddKeySender extends OutgoingEmail { @Override protected void init() throws EmailException { super.init(); - setHeader("Subject", - String.format("[Gerrit Code Review] New %s Keys Added", getKeyType())); + setHeader("Subject", String.format("[Gerrit Code Review] New %s Keys Added", getKeyType())); add(RecipientType.TO, new Address(getEmail())); } @@ -75,9 +75,8 @@ public class AddKeySender extends OutgoingEmail { * Don't send an email if no keys are added, or an admin is adding a key to * a user. */ - return (sshKey != null || gpgKeys.size() > 0) && - (user.equals(callingUser) || - !callingUser.getCapabilities().canAdministrateServer()); + return (sshKey != null || gpgKeys.size() > 0) + && (user.equals(callingUser) || !callingUser.getCapabilities().canAdministrateServer()); } @Override diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/AddReviewerSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/AddReviewerSender.java index 67577de1c4..cb70106094 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/AddReviewerSender.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/AddReviewerSender.java @@ -28,9 +28,8 @@ public class AddReviewerSender extends NewChangeSender { } @Inject - public AddReviewerSender(EmailArguments ea, - @Assisted Project.NameKey project, - @Assisted Change.Id id) + public AddReviewerSender( + EmailArguments ea, @Assisted Project.NameKey project, @Assisted Change.Id id) throws OrmException { super(ea, newChangeData(ea, project, id)); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/ChangeEmail.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/ChangeEmail.java index e867caf78e..769cb09945 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/ChangeEmail.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/ChangeEmail.java @@ -39,15 +39,6 @@ import com.google.gerrit.server.patch.PatchSetInfoNotAvailableException; import com.google.gerrit.server.project.ProjectState; import com.google.gerrit.server.query.change.ChangeData; import com.google.gwtorm.server.OrmException; - -import org.eclipse.jgit.diff.DiffFormatter; -import org.eclipse.jgit.internal.JGitText; -import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.util.RawParseUtils; -import org.eclipse.jgit.util.TemporaryBuffer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.sql.Timestamp; import java.text.MessageFormat; @@ -59,13 +50,20 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.TreeSet; +import org.eclipse.jgit.diff.DiffFormatter; +import org.eclipse.jgit.internal.JGitText; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.util.RawParseUtils; +import org.eclipse.jgit.util.TemporaryBuffer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** Sends an email to one or more interested parties. */ public abstract class ChangeEmail extends NotificationEmail { private static final Logger log = LoggerFactory.getLogger(ChangeEmail.class); - protected static ChangeData newChangeData(EmailArguments ea, - Project.NameKey project, Change.Id id) { + protected static ChangeData newChangeData( + EmailArguments ea, Project.NameKey project, Change.Id id) { return ea.changeDataFactory.create(ea.db.get(), project, id); } @@ -80,8 +78,7 @@ public abstract class ChangeEmail extends NotificationEmail { protected Set authors; protected boolean emailOnlyAuthors; - protected ChangeEmail(EmailArguments ea, String mc, ChangeData cd) - throws OrmException { + protected ChangeEmail(EmailArguments ea, String mc, ChangeData cd) throws OrmException { super(ea, mc, cd.change().getDest()); changeData = cd; change = cd.change(); @@ -93,7 +90,7 @@ public abstract class ChangeEmail extends NotificationEmail { super.setFrom(id); /** Is the from user in an email squelching group? */ - final IdentifiedUser user = args.identifiedUserFactory.create(id); + final IdentifiedUser user = args.identifiedUserFactory.create(id); emailOnlyAuthors = !user.getCapabilities().canEmailReviewers(); } @@ -135,8 +132,7 @@ public abstract class ChangeEmail extends NotificationEmail { * * @throws EmailException if an error occurred. */ - protected void formatFooter() throws EmailException { - } + protected void formatFooter() throws EmailException {} /** Setup the message headers and envelope (TO, CC, BCC). */ @Override @@ -159,8 +155,8 @@ public abstract class ChangeEmail extends NotificationEmail { setHeader("X-Gerrit-PatchSet", patchSet.getPatchSetId() + ""); if (patchSetInfo == null) { try { - patchSetInfo = args.patchSetInfoFactory.get( - args.db.get(), changeData.notes(), patchSet.getId()); + patchSetInfo = + args.patchSetInfoFactory.get(args.db.get(), changeData.notes(), patchSet.getId()); } catch (PatchSetInfoNotAvailableException | OrmException err) { patchSetInfo = null; } @@ -187,7 +183,8 @@ public abstract class ChangeEmail extends NotificationEmail { } private void setCommitIdHeader() { - if (patchSet != null && patchSet.getRevision() != null + if (patchSet != null + && patchSet.getRevision() != null && patchSet.getRevision().get() != null && patchSet.getRevision().get().length() > 0) { setHeader("X-Gerrit-Commit", patchSet.getRevision().get()); @@ -210,8 +207,7 @@ public abstract class ChangeEmail extends NotificationEmail { } public String getChangeMessageThreadId() throws EmailException { - return velocify(""); + return velocify(""); } /** Format the sender's "cover letter", {@link #getCoverLetter()}. */ @@ -254,16 +250,22 @@ public abstract class ChangeEmail extends NotificationEmail { if (Patch.isMagic(p.getNewName())) { continue; } - detail.append(p.getChangeType().getCode()) - .append(" ").append(p.getNewName()).append("\n"); + detail + .append(p.getChangeType().getCode()) + .append(" ") + .append(p.getNewName()) + .append("\n"); } - detail.append(MessageFormat.format("" // - + "{0,choice,0#0 files|1#1 file|1<{0} files} changed, " // - + "{1,choice,0#0 insertions|1#1 insertion|1<{1} insertions}(+), " // - + "{2,choice,0#0 deletions|1#1 deletion|1<{2} deletions}(-)" // - + "\n", patchList.getPatches().size() - 1, // - patchList.getInsertions(), // - patchList.getDeletions())); + detail.append( + MessageFormat.format( + "" // + + "{0,choice,0#0 files|1#1 file|1<{0} files} changed, " // + + "{1,choice,0#0 insertions|1#1 insertion|1<{1} insertions}(+), " // + + "{2,choice,0#0 deletions|1#1 deletion|1<{2} deletions}(-)" // + + "\n", + patchList.getPatches().size() - 1, // + patchList.getInsertions(), // + patchList.getDeletions())); detail.append("\n"); } return detail.toString(); @@ -291,7 +293,7 @@ public abstract class ChangeEmail extends NotificationEmail { final ProjectState r; r = args.projectCache.get(change.getProject()); - return r != null ? r.getOwners() : Collections. emptySet(); + return r != null ? r.getOwners() : Collections.emptySet(); } /** TO or CC all vested parties (change owner, patch set uploader, author). */ @@ -313,8 +315,7 @@ public abstract class ChangeEmail extends NotificationEmail { // ListMultimap stars = args.starredChangesUtil.byChangeFromIndex(change.getId()); - for (Map.Entry> e : - stars.asMap().entrySet()) { + for (Map.Entry> e : stars.asMap().entrySet()) { if (e.getValue().contains(StarredChangesUtil.DEFAULT_LABEL)) { super.add(RecipientType.BCC, e.getKey()); } @@ -339,15 +340,13 @@ public abstract class ChangeEmail extends NotificationEmail { return new Watchers(); } - ProjectWatch watch = new ProjectWatch( - args, branch.getParentKey(), projectState, changeData); + ProjectWatch watch = new ProjectWatch(args, branch.getParentKey(), projectState, changeData); return watch.getWatchers(type); } /** Any user who has published comments on this change. */ protected void ccAllApprovals() { - if (!NotifyHandling.ALL.equals(notify) - && !NotifyHandling.OWNER_REVIEWERS.equals(notify)) { + if (!NotifyHandling.ALL.equals(notify) && !NotifyHandling.OWNER_REVIEWERS.equals(notify)) { return; } @@ -362,14 +361,12 @@ public abstract class ChangeEmail extends NotificationEmail { /** Users who have non-zero approval codes on the change. */ protected void ccExistingReviewers() { - if (!NotifyHandling.ALL.equals(notify) - && !NotifyHandling.OWNER_REVIEWERS.equals(notify)) { + if (!NotifyHandling.ALL.equals(notify) && !NotifyHandling.OWNER_REVIEWERS.equals(notify)) { return; } try { - for (Account.Id id : changeData.reviewers() - .byState(ReviewerStateInternal.REVIEWER)) { + for (Account.Id id : changeData.reviewers().byState(ReviewerStateInternal.REVIEWER)) { add(RecipientType.CC, id); } } catch (OrmException err) { @@ -379,7 +376,7 @@ public abstract class ChangeEmail extends NotificationEmail { @Override protected void add(final RecipientType rt, final Account.Id to) { - if (! emailOnlyAuthors || authors.contains(to)) { + if (!emailOnlyAuthors || authors.contains(to)) { super.add(rt, to); } } @@ -387,8 +384,10 @@ public abstract class ChangeEmail extends NotificationEmail { @Override protected boolean isVisibleTo(final Account.Id to) throws OrmException { return projectState == null - || projectState.controlFor(args.identifiedUserFactory.create(to)) - .controlFor(args.db.get(), change).isVisible(args.db.get()); + || projectState + .controlFor(args.identifiedUserFactory.create(to)) + .controlFor(args.db.get(), change) + .isVisible(args.db.get()); } /** Find all users who are authors of any part of this change. */ @@ -471,8 +470,7 @@ public abstract class ChangeEmail extends NotificationEmail { footers.add("Gerrit-MessageType: " + messageClass); footers.add("Gerrit-Change-Id: " + change.getKey().get()); - footers.add("Gerrit-Change-Number: " + - Integer.toString(change.getChangeId())); + footers.add("Gerrit-Change-Number: " + Integer.toString(change.getChangeId())); footers.add("Gerrit-PatchSet: " + patchSet.getPatchSetId()); footers.add("Gerrit-Owner: " + getNameEmailFor(change.getOwner())); for (String reviewer : getEmailsByState(ReviewerStateInternal.REVIEWER)) { @@ -517,8 +515,7 @@ public abstract class ChangeEmail extends NotificationEmail { } int maxSize = args.settings.maximumDiffSize; - TemporaryBuffer.Heap buf = - new TemporaryBuffer.Heap(Math.min(HEAP_EST_SIZE, maxSize), maxSize); + TemporaryBuffer.Heap buf = new TemporaryBuffer.Heap(Math.min(HEAP_EST_SIZE, maxSize), maxSize); try (DiffFormatter fmt = new DiffFormatter(buf)) { try (Repository git = args.server.openRepository(change.getProject())) { try { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/CommentFormatter.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/CommentFormatter.java index 722fe1f758..74d1480b29 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/CommentFormatter.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/CommentFormatter.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.mail.send; import static com.google.common.base.Strings.isNullOrEmpty; import com.google.gerrit.common.Nullable; - import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -38,12 +37,11 @@ public class CommentFormatter { } /** - * Take a string of comment text that was written using the wiki-Like format - * and emit a list of blocks that can be rendered to block-level HTML. This - * method does not escape HTML. + * Take a string of comment text that was written using the wiki-Like format and emit a list of + * blocks that can be rendered to block-level HTML. This method does not escape HTML. * - * Adapted from the {@code wikify} method found in: - * com.google.gwtexpui.safehtml.client.SafeHtml + *

Adapted from the {@code wikify} method found in: + * com.google.gwtexpui.safehtml.client.SafeHtml * * @param source The raw, unescaped comment in the Gerrit wiki-like format. * @return List of block objects, each with unescaped comment content. @@ -69,30 +67,25 @@ public class CommentFormatter { } /** - * Take a block of comment text that contains a list and potentially - * paragraphs (but does not contain blank lines), generate appropriate block - * elements and append them to the output list. + * Take a block of comment text that contains a list and potentially paragraphs (but does not + * contain blank lines), generate appropriate block elements and append them to the output list. * - * In simple cases, this will generate a single list block. For example, on - * the following input. + *

In simple cases, this will generate a single list block. For example, on the following + * input. * - * * Item one. - * * Item two. - * * item three. + *

* Item one. * Item two. * item three. * - * However, if the list is adjacent to a paragraph, it will need to also - * generate that paragraph. Consider the following input. + *

However, if the list is adjacent to a paragraph, it will need to also generate that + * paragraph. Consider the following input. * - * A bit of text describing the context of the list: - * * List item one. - * * List item two. - * * Et cetera. + *

A bit of text describing the context of the list: * List item one. * List item two. * Et + * cetera. * - * In this case, {@code makeList} generates a paragraph block object - * containing the non-bullet-prefixed text, followed by a list block. + *

In this case, {@code makeList} generates a paragraph block object containing the + * non-bullet-prefixed text, followed by a list block. * - * Adapted from the {@code wikifyList} method found in: - * com.google.gwtexpui.safehtml.client.SafeHtml + *

Adapted from the {@code wikifyList} method found in: + * com.google.gwtexpui.safehtml.client.SafeHtml * * @param p The block containing the list (as well as potential paragraphs). * @param out The list of blocks to append to. @@ -179,12 +172,10 @@ public class CommentFormatter { } private static boolean isPreFormat(String p) { - return p.startsWith(" ") || p.startsWith("\t") - || p.contains("\n ") || p.contains("\n\t"); + return p.startsWith(" ") || p.startsWith("\t") || p.contains("\n ") || p.contains("\n\t"); } private static boolean isList(String p) { - return p.startsWith("- ") || p.startsWith("* ") - || p.contains("\n- ") || p.contains("\n* "); + return p.startsWith("- ") || p.startsWith("* ") || p.contains("\n- ") || p.contains("\n* "); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/CommentSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/CommentSender.java index acb98cf765..1ebda4bcc8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/CommentSender.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/CommentSender.java @@ -36,11 +36,6 @@ import com.google.gwtorm.client.KeyUtil; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - -import org.eclipse.jgit.lib.Repository; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.time.ZoneId; import java.time.ZonedDateTime; @@ -54,12 +49,13 @@ import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import org.eclipse.jgit.lib.Repository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -/** Send comments, after the author of them hit used Publish Comments in the UI. - */ +/** Send comments, after the author of them hit used Publish Comments in the UI. */ public class CommentSender extends ReplyToChangeSender { - private static final Logger log = LoggerFactory - .getLogger(CommentSender.class); + private static final Logger log = LoggerFactory.getLogger(CommentSender.class); public interface Factory { CommentSender create(Project.NameKey project, Change.Id id); @@ -71,9 +67,7 @@ public class CommentSender extends ReplyToChangeSender { public PatchFile fileData; public List comments = new ArrayList<>(); - /** - * @return a web link to the given patch set and file. - */ + /** @return a web link to the given patch set and file. */ public String getLink() { String url = getGerritUrl(); if (url == null) { @@ -81,16 +75,18 @@ public class CommentSender extends ReplyToChangeSender { } return new StringBuilder() - .append(url) - .append("#/c/").append(change.getId()) - .append('/').append(patchSetId) - .append('/').append(KeyUtil.encode(filename)) - .toString(); + .append(url) + .append("#/c/") + .append(change.getId()) + .append('/') + .append(patchSetId) + .append('/') + .append(KeyUtil.encode(filename)) + .toString(); } /** - * @return A title for the group, i.e. "Commit Message", "Merge List", or - * "File [[filename]]". + * @return A title for the group, i.e. "Commit Message", "Merge List", or "File [[filename]]". */ public String getTitle() { if (Patch.COMMIT_MSG.equals(filename)) { @@ -109,10 +105,12 @@ public class CommentSender extends ReplyToChangeSender { private final CommentsUtil commentsUtil; @Inject - public CommentSender(EmailArguments ea, + public CommentSender( + EmailArguments ea, CommentsUtil commentsUtil, @Assisted Project.NameKey project, - @Assisted Change.Id id) throws OrmException { + @Assisted Change.Id id) + throws OrmException { super(ea, "comment", newChangeData(ea, project, id)); this.commentsUtil = commentsUtil; } @@ -129,11 +127,11 @@ public class CommentSender extends ReplyToChangeSender { changeData.setCurrentFilePaths(Ordering.natural().sortedCopy(paths)); } - public void setPatchSetComment(String comment) { + public void setPatchSetComment(String comment) { this.patchSetComment = comment; } - public void setLabels(List labels) { + public void setLabels(List labels) { this.labels = labels; } @@ -170,28 +168,19 @@ public class CommentSender extends ReplyToChangeSender { } } - /** - * No longer used outside Velocity. Remove this method when VTL support is - * removed. - */ + /** No longer used outside Velocity. Remove this method when VTL support is removed. */ @Deprecated public boolean hasInlineComments() { return !inlineComments.isEmpty(); } - /** - * No longer used outside Velocity. Remove this method when VTL support is - * removed. - */ + /** No longer used outside Velocity. Remove this method when VTL support is removed. */ @Deprecated public String getInlineComments() { return getInlineComments(1); } - /** - * No longer used outside Velocity. Remove this method when VTL support is - * removed. - */ + /** No longer used outside Velocity. Remove this method when VTL support is removed. */ @Deprecated public String getInlineComments(int lines) { try (Repository repo = getRepository()) { @@ -212,11 +201,10 @@ public class CommentSender extends ReplyToChangeSender { } /** - * @return a list of FileCommentGroup objects representing the inline comments - * grouped by the file. + * @return a list of FileCommentGroup objects representing the inline comments grouped by the + * file. */ - private List getGroupedInlineComments( - Repository repo) { + private List getGroupedInlineComments(Repository repo) { List groups = new ArrayList<>(); // Get the patch list: PatchList patchList = null; @@ -242,14 +230,15 @@ public class CommentSender extends ReplyToChangeSender { groups.add(currentGroup); if (patchList != null) { try { - currentGroup.fileData = - new PatchFile(repo, patchList, c.key.filename); + currentGroup.fileData = new PatchFile(repo, patchList, c.key.filename); } catch (IOException e) { - log.warn(String.format( - "Cannot load %s from %s in %s", - c.key.filename, - patchList.getNewId().name(), - projectState.getProject().getName()), e); + log.warn( + String.format( + "Cannot load %s from %s in %s", + c.key.filename, + patchList.getNewId().name(), + projectState.getProject().getName()), + e); currentGroup.fileData = null; } } @@ -260,25 +249,21 @@ public class CommentSender extends ReplyToChangeSender { } } - Collections.sort(groups, - Comparator.comparing(g -> g.filename, FilenameComparator.INSTANCE)); + Collections.sort(groups, Comparator.comparing(g -> g.filename, FilenameComparator.INSTANCE)); return groups; } - /** - * No longer used except for Velocity. Remove this method when VTL support is - * removed. - */ + /** No longer used except for Velocity. Remove this method when VTL support is removed. */ @Deprecated - private void appendComment(StringBuilder out, int contextLines, - PatchFile currentFileData, Comment comment) { + private void appendComment( + StringBuilder out, int contextLines, PatchFile currentFileData, Comment comment) { if (comment instanceof RobotComment) { RobotComment robotComment = (RobotComment) comment; out.append("Robot Comment from ") - .append(robotComment.robotId) - .append(" (run ID ") - .append(robotComment.robotRunId) - .append("):\n"); + .append(robotComment.robotId) + .append(" (run ID ") + .append(robotComment.robotRunId) + .append("):\n"); } if (comment.range != null) { appendRangedComment(out, currentFileData, comment); @@ -287,20 +272,14 @@ public class CommentSender extends ReplyToChangeSender { } } - /** - * No longer used except for Velocity. Remove this method when VTL support is - * removed. - */ + /** No longer used except for Velocity. Remove this method when VTL support is removed. */ @Deprecated - private void appendRangedComment(StringBuilder out, PatchFile fileData, - Comment comment) { + private void appendRangedComment(StringBuilder out, PatchFile fileData, Comment comment) { String prefix = getCommentLinePrefix(comment); String emptyPrefix = Strings.padStart(": ", prefix.length(), ' '); boolean firstLine = true; for (String line : getLinesByRange(comment.range, fileData, comment.side)) { - out.append(firstLine ? prefix : emptyPrefix) - .append(line) - .append('\n'); + out.append(firstLine ? prefix : emptyPrefix).append(line).append('\n'); firstLine = false; } appendQuotedParent(out, comment); @@ -308,8 +287,7 @@ public class CommentSender extends ReplyToChangeSender { } private String getCommentLinePrefix(Comment comment) { - int lineNbr = comment.range == null ? - comment.lineNbr : comment.range.startLine; + int lineNbr = comment.range == null ? comment.lineNbr : comment.range.startLine; StringBuilder sb = new StringBuilder(); sb.append("PS").append(comment.key.patchSetId); if (lineNbr != 0) { @@ -320,19 +298,15 @@ public class CommentSender extends ReplyToChangeSender { } /** - * @return the lines of file content in fileData that are encompassed by range - * on the given side. + * @return the lines of file content in fileData that are encompassed by range on the given side. */ - private List getLinesByRange(Comment.Range range, - PatchFile fileData, short side) { + private List getLinesByRange(Comment.Range range, PatchFile fileData, short side) { List lines = new ArrayList<>(); for (int n = range.startLine; n <= range.endLine; n++) { String s = getLine(fileData, side, n); if (n == range.startLine && n == range.endLine) { - s = s.substring( - Math.min(range.startChar, s.length()), - Math.min(range.endChar, s.length())); + s = s.substring(Math.min(range.startChar, s.length()), Math.min(range.endChar, s.length())); } else if (n == range.startLine) { s = s.substring(Math.min(range.startChar, s.length())); } else if (n == range.endLine) { @@ -343,13 +317,10 @@ public class CommentSender extends ReplyToChangeSender { return lines; } - /** - * No longer used except for Velocity. Remove this method when VTL support is - * removed. - */ + /** No longer used except for Velocity. Remove this method when VTL support is removed. */ @Deprecated - private void appendLineComment(StringBuilder out, int contextLines, - PatchFile currentFileData, Comment comment) { + private void appendLineComment( + StringBuilder out, int contextLines, PatchFile currentFileData, Comment comment) { short side = comment.side; int lineNbr = comment.lineNbr; @@ -360,12 +331,10 @@ public class CommentSender extends ReplyToChangeSender { maxLines = currentFileData.getLineCount(side); } catch (IOException err) { // The file could not be read, leave the max as is. - log.warn(String.format("Failed to read file %s on side %d", - comment.key.filename, side), err); + log.warn(String.format("Failed to read file %s on side %d", comment.key.filename, side), err); } catch (NoSuchEntityException err) { // The file could not be read, leave the max as is. - log.warn(String.format("Side %d of file %s didn't exist", - side, comment.key.filename), err); + log.warn(String.format("Side %d of file %s didn't exist", side, comment.key.filename), err); } int startLine = Math.max(1, lineNbr - contextLines + 1); @@ -382,65 +351,51 @@ public class CommentSender extends ReplyToChangeSender { } } - /** - * No longer used except for Velocity. Remove this method when VTL support is - * removed. - */ + /** No longer used except for Velocity. Remove this method when VTL support is removed. */ @Deprecated - private void appendFileLine(StringBuilder cmts, PatchFile fileData, - short side, int line) { + private void appendFileLine(StringBuilder cmts, PatchFile fileData, short side, int line) { String lineStr = getLine(fileData, side, line); - cmts.append("Line ") - .append(line) - .append(": ") - .append(lineStr) - .append("\n"); + cmts.append("Line ").append(line).append(": ").append(lineStr).append("\n"); } - /** - * No longer used except for Velocity. Remove this method when VTL support is - * removed. - */ + /** No longer used except for Velocity. Remove this method when VTL support is removed. */ @Deprecated private void appendQuotedParent(StringBuilder out, Comment child) { Optional parent = getParent(child); if (parent.isPresent()) { - out.append("> ") - .append(getShortenedCommentMessage(parent.get())) - .append('\n'); + out.append("> ").append(getShortenedCommentMessage(parent.get())).append('\n'); } } /** * Get the parent comment of a given comment. + * * @param child the comment with a potential parent comment. - * @return an optional comment that will be present if the given comment has - * a parent, and is empty if it does not. + * @return an optional comment that will be present if the given comment has a parent, and is + * empty if it does not. */ private Optional getParent(Comment child) { if (child.parentUuid == null) { return Optional.empty(); } - Comment.Key key = new Comment.Key(child.parentUuid, child.key.filename, - child.key.patchSetId); + Comment.Key key = new Comment.Key(child.parentUuid, child.key.filename, child.key.patchSetId); try { return commentsUtil.get(args.db.get(), changeData.notes(), key); } catch (OrmException e) { - log.warn("Could not find the parent of this comment: " - + child.toString()); + log.warn("Could not find the parent of this comment: " + child.toString()); return Optional.empty(); } } /** * Retrieve the file lines referred to by a comment. - * @param comment The comment that refers to some file contents. The comment - * may be a line comment or a ranged comment. + * + * @param comment The comment that refers to some file contents. The comment may be a line comment + * or a ranged comment. * @param fileData The file on which the comment appears. - * @return file contents referred to by the comment. If the comment is a line - * comment, the result will be a list of one string. Otherwise it will be - * a list of one or more strings. + * @return file contents referred to by the comment. If the comment is a line comment, the result + * will be a list of one string. Otherwise it will be a list of one or more strings. */ private List getLinesOfComment(Comment comment, PatchFile fileData) { List lines = new ArrayList<>(); @@ -457,8 +412,8 @@ public class CommentSender extends ReplyToChangeSender { } /** - * @return a shortened version of the given comment's message. Will be - * shortened to 75 characters or the first line, whichever is shorter. + * @return a shortened version of the given comment's message. Will be shortened to 75 characters + * or the first line, whichever is shorter. */ private String getShortenedCommentMessage(Comment comment) { String msg = comment.message.trim(); @@ -473,15 +428,13 @@ public class CommentSender extends ReplyToChangeSender { } /** - * @return grouped inline comment data mapped to data structures that are - * suitable for passing into Soy. + * @return grouped inline comment data mapped to data structures that are suitable for passing + * into Soy. */ - private List> getCommentGroupsTemplateData( - Repository repo) { + private List> getCommentGroupsTemplateData(Repository repo) { List> commentGroups = new ArrayList<>(); - for ( - CommentSender.FileCommentGroup group : getGroupedInlineComments(repo)) { + for (CommentSender.FileCommentGroup group : getGroupedInlineComments(repo)) { Map groupData = new HashMap<>(); groupData.put("link", group.getLink()); groupData.put("title", group.getTitle()); @@ -492,15 +445,13 @@ public class CommentSender extends ReplyToChangeSender { Map commentData = new HashMap<>(); commentData.put("lines", getLinesOfComment(comment, group.fileData)); commentData.put("message", comment.message.trim()); - List blocks = - CommentFormatter.parse(comment.message); + List blocks = CommentFormatter.parse(comment.message); commentData.put("messageBlocks", commentBlocksToSoyData(blocks)); // Set the prefix. String prefix = getCommentLinePrefix(comment); commentData.put("linePrefix", prefix); - commentData.put("linePrefixEmpty", - Strings.padStart(": ", prefix.length(), ' ')); + commentData.put("linePrefixEmpty", Strings.padStart(": ", prefix.length(), ' ')); // Set line numbers. int startLine; @@ -537,8 +488,7 @@ public class CommentSender extends ReplyToChangeSender { // Set parent comment info. Optional parent = getParent(comment); if (parent.isPresent()) { - commentData.put("parentMessage", - getShortenedCommentMessage(parent.get())); + commentData.put("parentMessage", getShortenedCommentMessage(parent.get())); } } @@ -551,31 +501,32 @@ public class CommentSender extends ReplyToChangeSender { return commentGroups; } - private List> commentBlocksToSoyData( - List blocks) { - return blocks.stream() - .map(b -> { - Map map = new HashMap<>(); - switch (b.type) { - case PARAGRAPH: - map.put("type", "paragraph"); - map.put("text", b.text); - break; - case PRE_FORMATTED: - map.put("type", "pre"); - map.put("text", b.text); - break; - case QUOTE: - map.put("type", "quote"); - map.put("quotedBlocks", commentBlocksToSoyData(b.quotedBlocks)); - break; - case LIST: - map.put("type", "list"); - map.put("items", b.items); - break; - } - return map; - }) + private List> commentBlocksToSoyData(List blocks) { + return blocks + .stream() + .map( + b -> { + Map map = new HashMap<>(); + switch (b.type) { + case PARAGRAPH: + map.put("type", "paragraph"); + map.put("text", b.text); + break; + case PRE_FORMATTED: + map.put("type", "pre"); + map.put("text", b.text); + break; + case QUOTE: + map.put("type", "quote"); + map.put("quotedBlocks", commentBlocksToSoyData(b.quotedBlocks)); + break; + case LIST: + map.put("type", "list"); + map.put("items", b.items); + break; + } + return map; + }) .collect(Collectors.toList()); } @@ -606,13 +557,13 @@ public class CommentSender extends ReplyToChangeSender { hasComments = !files.isEmpty(); } - soyContext.put("patchSetCommentBlocks", - commentBlocksToSoyData(CommentFormatter.parse(patchSetComment))); + soyContext.put( + "patchSetCommentBlocks", commentBlocksToSoyData(CommentFormatter.parse(patchSetComment))); soyContext.put("labels", getLabelVoteSoyData(labels)); soyContext.put("commentCount", inlineComments.size()); soyContext.put("commentTimestamp", getCommentTimestamp()); - soyContext.put("coverLetterBlocks", - commentBlocksToSoyData(CommentFormatter.parse(getCoverLetter()))); + soyContext.put( + "coverLetterBlocks", commentBlocksToSoyData(CommentFormatter.parse(getCoverLetter()))); footers.add("Gerrit-Comment-Date: " + getCommentTimestamp()); footers.add("Gerrit-HasComments: " + (hasComments ? "Yes" : "No")); @@ -628,8 +579,7 @@ public class CommentSender extends ReplyToChangeSender { } catch (IndexOutOfBoundsException err) { // Default to the empty string if the given line number does not appear // in the file. - log.debug(String.format("Failed to get line number of file on side %d", - side), err); + log.debug(String.format("Failed to get line number of file on side %d", side), err); return ""; } catch (NoSuchEntityException err) { // Default to the empty string if the side cannot be found. diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/CreateChangeSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/CreateChangeSender.java index 51f8cef5f8..332320e96d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/CreateChangeSender.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/CreateChangeSender.java @@ -25,23 +25,20 @@ import com.google.gerrit.server.mail.send.ProjectWatch.Watchers; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** Notify interested parties of a brand new change. */ public class CreateChangeSender extends NewChangeSender { - private static final Logger log = - LoggerFactory.getLogger(CreateChangeSender.class); + private static final Logger log = LoggerFactory.getLogger(CreateChangeSender.class); public interface Factory { CreateChangeSender create(Project.NameKey project, Change.Id id); } @Inject - public CreateChangeSender(EmailArguments ea, - @Assisted Project.NameKey project, - @Assisted Change.Id id) + public CreateChangeSender( + EmailArguments ea, @Assisted Project.NameKey project, @Assisted Change.Id id) throws OrmException { super(ea, newChangeData(ea, project, id)); } @@ -54,10 +51,8 @@ public class CreateChangeSender extends NewChangeSender { try { // Try to mark interested owners with TO and CC or BCC line. Watchers matching = getWatchers(NotifyType.NEW_CHANGES); - for (Account.Id user : Iterables.concat( - matching.to.accounts, - matching.cc.accounts, - matching.bcc.accounts)) { + for (Account.Id user : + Iterables.concat(matching.to.accounts, matching.cc.accounts, matching.bcc.accounts)) { if (isOwnerOfProjectOrBranch(user)) { add(RecipientType.TO, user); } @@ -80,8 +75,9 @@ public class CreateChangeSender extends NewChangeSender { private boolean isOwnerOfProjectOrBranch(Account.Id user) { return projectState != null - && projectState.controlFor(args.identifiedUserFactory.create(user)) - .controlForRef(change.getDest()) - .isOwner(); + && projectState + .controlFor(args.identifiedUserFactory.create(user)) + .controlForRef(change.getDest()) + .isOwner(); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/DeleteReviewerSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/DeleteReviewerSender.java index dafa7864cd..f46eab6cb5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/DeleteReviewerSender.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/DeleteReviewerSender.java @@ -23,28 +23,24 @@ import com.google.gerrit.server.account.WatchConfig.NotifyType; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; -/** Let users know that a reviewer and possibly her review have - * been removed. */ +/** Let users know that a reviewer and possibly her review have been removed. */ public class DeleteReviewerSender extends ReplyToChangeSender { private final Set reviewers = new HashSet<>(); - public interface Factory extends - ReplyToChangeSender.Factory { + public interface Factory extends ReplyToChangeSender.Factory { @Override DeleteReviewerSender create(Project.NameKey project, Change.Id change); } @Inject - public DeleteReviewerSender(EmailArguments ea, - @Assisted Project.NameKey project, - @Assisted Change.Id id) + public DeleteReviewerSender( + EmailArguments ea, @Assisted Project.NameKey project, @Assisted Change.Id id) throws OrmException { super(ea, "deleteReviewer", newChangeData(ea, project, id)); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/DeleteVoteSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/DeleteVoteSender.java index a9e8cc440a..13ee4acb15 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/DeleteVoteSender.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/DeleteVoteSender.java @@ -24,16 +24,14 @@ import com.google.inject.assistedinject.Assisted; /** Send notice about a vote that was removed from a change. */ public class DeleteVoteSender extends ReplyToChangeSender { - public interface Factory extends - ReplyToChangeSender.Factory { + public interface Factory extends ReplyToChangeSender.Factory { @Override DeleteVoteSender create(Project.NameKey project, Change.Id change); } @Inject - protected DeleteVoteSender(EmailArguments ea, - @Assisted Project.NameKey project, - @Assisted Change.Id id) + protected DeleteVoteSender( + EmailArguments ea, @Assisted Project.NameKey project, @Assisted Change.Id id) throws OrmException { super(ea, "deleteVote", newChangeData(ea, project, id)); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/EmailArguments.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/EmailArguments.java index c870474596..9306c7a296 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/EmailArguments.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/EmailArguments.java @@ -45,12 +45,10 @@ import com.google.gerrit.server.validators.OutgoingEmailValidationListener; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.template.soy.tofu.SoyTofu; - +import java.util.List; import org.apache.velocity.runtime.RuntimeInstance; import org.eclipse.jgit.lib.PersonIdent; -import java.util.List; - public class EmailArguments { final GitRepositoryManager server; final ProjectCache projectCache; @@ -84,13 +82,17 @@ public class EmailArguments { final Provider accountQueryProvider; @Inject - EmailArguments(GitRepositoryManager server, ProjectCache projectCache, - GroupBackend groupBackend, GroupIncludeCache groupIncludes, + EmailArguments( + GitRepositoryManager server, + ProjectCache projectCache, + GroupBackend groupBackend, + GroupIncludeCache groupIncludes, AccountCache accountCache, PatchListCache patchListCache, ApprovalsUtil approvalsUtil, FromAddressGenerator fromAddressGenerator, - EmailSender emailSender, PatchSetInfoFactory patchSetInfoFactory, + EmailSender emailSender, + PatchSetInfoFactory patchSetInfoFactory, GenericFactory identifiedUserFactory, CapabilityControl.Factory capabilityControlFactory, ChangeNotes.Factory changeNotesFactory, diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/EmailHeader.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/EmailHeader.java index 43d365ca69..e2b589403d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/EmailHeader.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/EmailHeader.java @@ -18,7 +18,6 @@ import static java.nio.charset.StandardCharsets.UTF_8; import com.google.common.base.MoreObjects; import com.google.gerrit.server.mail.Address; - import java.io.IOException; import java.io.Writer; import java.text.SimpleDateFormat; @@ -66,8 +65,7 @@ public abstract class EmailHeader { @Override public boolean equals(Object o) { - return (o instanceof String) - && Objects.equals(value, ((String) o).value); + return (o instanceof String) && Objects.equals(value, ((String) o).value); } @Override @@ -96,9 +94,7 @@ public abstract class EmailHeader { case '_': return false; default: - if (('a' <= cp && cp <= 'z') - || ('A' <= cp && cp <= 'Z') - || ('0' <= cp && cp <= '9')) { + if (('a' <= cp && cp <= 'z') || ('A' <= cp && cp <= 'Z') || ('0' <= cp && cp <= '9')) { return false; } return true; @@ -116,7 +112,7 @@ public abstract class EmailHeader { } else if (needsQuotedPrintableWithinPhrase(cp)) { byte[] buf = new java.lang.String(Character.toChars(cp)).getBytes(UTF_8); - for (byte b: buf) { + for (byte b : buf) { r.append('='); r.append(Integer.toHexString((b >>> 4) & 0x0f).toUpperCase()); r.append(Integer.toHexString(b & 0x0f).toUpperCase()); @@ -162,8 +158,7 @@ public abstract class EmailHeader { @Override public boolean equals(Object o) { - return (o instanceof Date) - && Objects.equals(value, ((Date) o).value); + return (o instanceof Date) && Objects.equals(value, ((Date) o).value); } @Override @@ -175,8 +170,7 @@ public abstract class EmailHeader { public static class AddressList extends EmailHeader { private final List

list = new ArrayList<>(); - public AddressList() { - } + public AddressList() {} public AddressList(Address addr) { add(addr); @@ -191,7 +185,7 @@ public abstract class EmailHeader { } void remove(java.lang.String email) { - for (Iterator
i = list.iterator(); i.hasNext();) { + for (Iterator
i = list.iterator(); i.hasNext(); ) { if (i.next().getEmail().equals(email)) { i.remove(); } @@ -234,8 +228,7 @@ public abstract class EmailHeader { @Override public boolean equals(Object o) { - return (o instanceof AddressList) - && Objects.equals(list, ((AddressList) o).list); + return (o instanceof AddressList) && Objects.equals(list, ((AddressList) o).list); } @Override diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/EmailSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/EmailSender.java index 0bfb6f27d2..23fa1fe589 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/EmailSender.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/EmailSender.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.mail.send; import com.google.gerrit.common.Nullable; import com.google.gerrit.common.errors.EmailException; import com.google.gerrit.server.mail.Address; - import java.util.Collection; import java.util.Map; @@ -34,44 +33,44 @@ public interface EmailSender { boolean canEmail(String address); /** - * Sends an email message. Messages always contain a text body, but messages - * can optionally include an additional HTML body. If both body types are - * present, {@code send} should construct a {@code multipart/alternative} - * message with an appropriately-selected boundary. + * Sends an email message. Messages always contain a text body, but messages can optionally + * include an additional HTML body. If both body types are present, {@code send} should construct + * a {@code multipart/alternative} message with an appropriately-selected boundary. * * @param from who the message is from. - * @param rcpt one or more address where the message will be delivered to. - * This list overrides any To or CC headers in {@code headers}. + * @param rcpt one or more address where the message will be delivered to. This list overrides any + * To or CC headers in {@code headers}. * @param headers message headers. - * @param textBody text to appear in the {@code text/plain} body of the - * message. - * @param htmlBody optional HTML code to appear in the {@code text/html} body - * of the message. + * @param textBody text to appear in the {@code text/plain} body of the message. + * @param htmlBody optional HTML code to appear in the {@code text/html} body of the message. * @throws EmailException the message cannot be sent. */ - default void send(Address from, Collection
rcpt, - Map headers, String textBody, - @Nullable String htmlBody) throws EmailException { + default void send( + Address from, + Collection
rcpt, + Map headers, + String textBody, + @Nullable String htmlBody) + throws EmailException { send(from, rcpt, headers, textBody); } /** * Sends an email message with a text body only (i.e. not HTML or multipart). * - * Authors of new implementations of this interface should not use this method - * to send a message because this method does not accept the HTML body. - * Instead, authors should use the above signature of {@code send}. + *

Authors of new implementations of this interface should not use this method to send a + * message because this method does not accept the HTML body. Instead, authors should use the + * above signature of {@code send}. * - * This version of the method is preserved for support of legacy - * implementations. + *

This version of the method is preserved for support of legacy implementations. * * @param from who the message is from. - * @param rcpt one or more address where the message will be delivered to. - * This list overrides any To or CC headers in {@code headers}. + * @param rcpt one or more address where the message will be delivered to. This list overrides any + * To or CC headers in {@code headers}. * @param headers message headers. * @param body text to appear in the body of the message. * @throws EmailException the message cannot be sent. */ - void send(Address from, Collection

rcpt, - Map headers, String body) throws EmailException; + void send(Address from, Collection
rcpt, Map headers, String body) + throws EmailException; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/FromAddressGeneratorProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/FromAddressGeneratorProvider.java index 3326b38ff9..db526263c7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/FromAddressGeneratorProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/FromAddressGeneratorProvider.java @@ -27,23 +27,21 @@ import com.google.gerrit.server.mail.MailUtil; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.regex.Pattern; import org.apache.commons.codec.binary.Base64; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.PersonIdent; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.regex.Pattern; - /** Creates a {@link FromAddressGenerator} from the {@link GerritServerConfig} */ @Singleton -public class FromAddressGeneratorProvider implements - Provider { +public class FromAddressGeneratorProvider implements Provider { private final FromAddressGenerator generator; @Inject - FromAddressGeneratorProvider(@GerritServerConfig final Config cfg, + FromAddressGeneratorProvider( + @GerritServerConfig final Config cfg, @AnonymousCowardName final String anonymousCowardName, @GerritPersonIdent final PersonIdent myIdent, final AccountCache accountCache) { @@ -54,15 +52,13 @@ public class FromAddressGeneratorProvider implements if (from == null || "MIXED".equalsIgnoreCase(from)) { ParameterizedString name = new ParameterizedString("${user} (Code Review)"); generator = - new PatternGen(srvAddr, accountCache, anonymousCowardName, name, - srvAddr.getEmail()); + new PatternGen(srvAddr, accountCache, anonymousCowardName, name, srvAddr.getEmail()); } else if ("USER".equalsIgnoreCase(from)) { String[] domains = cfg.getStringList("sendemail", null, "allowedDomain"); Pattern domainPattern = MailUtil.glob(domains); - ParameterizedString namePattern = - new ParameterizedString("${user} (Code Review)"); - generator = new UserGen(accountCache, domainPattern, anonymousCowardName, - namePattern, srvAddr); + ParameterizedString namePattern = new ParameterizedString("${user} (Code Review)"); + generator = + new UserGen(accountCache, domainPattern, anonymousCowardName, namePattern, srvAddr); } else if ("SERVER".equalsIgnoreCase(from)) { generator = new ServerGen(srvAddr); } else { @@ -72,9 +68,7 @@ public class FromAddressGeneratorProvider implements if (name == null || name.getParameterNames().isEmpty()) { generator = new ServerGen(a); } else { - generator = - new PatternGen(srvAddr, accountCache, anonymousCowardName, name, - a.getEmail()); + generator = new PatternGen(srvAddr, accountCache, anonymousCowardName, name, a.getEmail()); } } } @@ -99,16 +93,18 @@ public class FromAddressGeneratorProvider implements * From address generator for USER mode * * @param accountCache get user account from id - * @param domainPattern allowed user domain pattern that Gerrit can send as - * the user + * @param domainPattern allowed user domain pattern that Gerrit can send as the user * @param anonymousCowardName name used when user's full name is missing - * @param nameRewriteTmpl name template used for rewriting the sender's name - * when Gerrit can not send as the user - * @param serverAddress serverAddress.name is used when fromId is null and - * serverAddress.email is used when Gerrit can not send as the user + * @param nameRewriteTmpl name template used for rewriting the sender's name when Gerrit can not + * send as the user + * @param serverAddress serverAddress.name is used when fromId is null and serverAddress.email + * is used when Gerrit can not send as the user */ - UserGen(AccountCache accountCache, Pattern domainPattern, - String anonymousCowardName, ParameterizedString nameRewriteTmpl, + UserGen( + AccountCache accountCache, + Pattern domainPattern, + String anonymousCowardName, + ParameterizedString nameRewriteTmpl, Address serverAddress) { this.accountCache = accountCache; this.domainPattern = domainPattern; @@ -142,13 +138,11 @@ public class FromAddressGeneratorProvider implements } String senderEmail; - ParameterizedString senderEmailPattern = - new ParameterizedString(serverAddress.getEmail()); + ParameterizedString senderEmailPattern = new ParameterizedString(serverAddress.getEmail()); if (senderEmailPattern.getParameterNames().isEmpty()) { senderEmail = senderEmailPattern.getRawPattern(); } else { - senderEmail = senderEmailPattern.replace("userHash", hashOf(senderName)) - .toString(); + senderEmail = senderEmailPattern.replace("userHash", hashOf(senderName)).toString(); } return new Address(senderName, senderEmail); } @@ -190,9 +184,12 @@ public class FromAddressGeneratorProvider implements private final String anonymousCowardName; private final ParameterizedString namePattern; - PatternGen(final Address serverAddress, final AccountCache accountCache, + PatternGen( + final Address serverAddress, + final AccountCache accountCache, final String anonymousCowardName, - final ParameterizedString namePattern, final String senderEmail) { + final ParameterizedString namePattern, + final String senderEmail) { this.senderEmailPattern = new ParameterizedString(senderEmail); this.serverAddress = serverAddress; this.accountCache = accountCache; @@ -225,9 +222,7 @@ public class FromAddressGeneratorProvider implements if (senderEmailPattern.getParameterNames().isEmpty()) { senderEmail = senderEmailPattern.getRawPattern(); } else { - senderEmail = senderEmailPattern - .replace("userHash", hashOf(senderName)) - .toString(); + senderEmail = senderEmailPattern.replace("userHash", hashOf(senderName)).toString(); } return new Address(senderName, senderEmail); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/MailSoyTofuProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/MailSoyTofuProvider.java index c3cc701fde..b26727509d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/MailSoyTofuProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/MailSoyTofuProvider.java @@ -24,7 +24,6 @@ import com.google.inject.Singleton; import com.google.template.soy.SoyFileSet; import com.google.template.soy.shared.SoyAstCache; import com.google.template.soy.tofu.SoyTofu; - import java.io.IOException; import java.io.Reader; import java.nio.charset.StandardCharsets; @@ -75,8 +74,7 @@ public class MailSoyTofuProvider implements Provider { private final SoyAstCache cache; @Inject - MailSoyTofuProvider(SitePaths site, - SoyAstCache cache) { + MailSoyTofuProvider(SitePaths site, SoyAstCache cache) { this.site = site; this.cache = cache; } @@ -91,8 +89,7 @@ public class MailSoyTofuProvider implements Provider { return builder.build().compileToTofu(); } - private void addTemplate(SoyFileSet.Builder builder, String name) - throws ProvisionException { + private void addTemplate(SoyFileSet.Builder builder, String name) throws ProvisionException { // Load as a file in the mail templates directory if present. Path tmpl = site.mail_dir.resolve(name); if (Files.isRegularFile(tmpl)) { @@ -102,8 +99,8 @@ public class MailSoyTofuProvider implements Provider { try (Reader r = Files.newBufferedReader(tmpl, StandardCharsets.UTF_8)) { content = CharStreams.toString(r); } catch (IOException err) { - throw new ProvisionException("Failed to read template file " + - tmpl.toAbsolutePath().toString(), err); + throw new ProvisionException( + "Failed to read template file " + tmpl.toAbsolutePath().toString(), err); } builder.add(content, tmpl.toAbsolutePath().toString()); return; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/MailTemplates.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/MailTemplates.java index b92567fdf9..71f5246781 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/MailTemplates.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/MailTemplates.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.mail.send; import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.google.inject.BindingAnnotation; - import java.lang.annotation.Retention; @Retention(RUNTIME) diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/MergedSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/MergedSender.java index 38a2d5b436..0460a70361 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/MergedSender.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/MergedSender.java @@ -38,9 +38,7 @@ public class MergedSender extends ReplyToChangeSender { private final LabelTypes labelTypes; @Inject - public MergedSender(EmailArguments ea, - @Assisted Project.NameKey project, - @Assisted Change.Id id) + public MergedSender(EmailArguments ea, @Assisted Project.NameKey project, @Assisted Change.Id id) throws OrmException { super(ea, "merged", newChangeData(ea, project, id)); labelTypes = changeData.changeControl().getLabelTypes(); @@ -69,8 +67,9 @@ public class MergedSender extends ReplyToChangeSender { try { Table pos = HashBasedTable.create(); Table neg = HashBasedTable.create(); - for (PatchSetApproval ca : args.approvalsUtil.byPatchSet( - args.db.get(), changeData.changeControl(), patchSet.getId())) { + for (PatchSetApproval ca : + args.approvalsUtil.byPatchSet( + args.db.get(), changeData.changeControl(), patchSet.getId())) { LabelType lt = labelTypes.byLabel(ca.getLabelId()); if (lt == null) { continue; @@ -89,8 +88,7 @@ public class MergedSender extends ReplyToChangeSender { return ""; } - private String format(String type, - Table approvals) { + private String format(String type, Table approvals) { StringBuilder txt = new StringBuilder(); if (approvals.isEmpty()) { return ""; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/NewChangeSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/NewChangeSender.java index b4d6d013b0..f1a9ad89d7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/NewChangeSender.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/NewChangeSender.java @@ -19,7 +19,6 @@ import com.google.gerrit.extensions.api.changes.RecipientType; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.server.query.change.ChangeData; import com.google.gwtorm.server.OrmException; - import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; @@ -31,8 +30,7 @@ public abstract class NewChangeSender extends ChangeEmail { private final Set reviewers = new HashSet<>(); private final Set extraCC = new HashSet<>(); - protected NewChangeSender(EmailArguments ea, ChangeData cd) - throws OrmException { + protected NewChangeSender(EmailArguments ea, ChangeData cd) throws OrmException { super(ea, "newchange", cd); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/NotificationEmail.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/NotificationEmail.java index 7d10a3f26e..b63694cf2e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/NotificationEmail.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/NotificationEmail.java @@ -23,24 +23,18 @@ import com.google.gerrit.server.account.WatchConfig.NotifyType; import com.google.gerrit.server.mail.Address; import com.google.gerrit.server.mail.send.ProjectWatch.Watchers; import com.google.gwtorm.server.OrmException; - +import java.util.HashMap; +import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.HashMap; -import java.util.Map; - -/** - * Common class for notifications that are related to a project and branch - */ +/** Common class for notifications that are related to a project and branch */ public abstract class NotificationEmail extends OutgoingEmail { - private static final Logger log = - LoggerFactory.getLogger(NotificationEmail.class); + private static final Logger log = LoggerFactory.getLogger(NotificationEmail.class); protected Branch.NameKey branch; - protected NotificationEmail(EmailArguments ea, - String mc, Branch.NameKey branch) { + protected NotificationEmail(EmailArguments ea, String mc, Branch.NameKey branch) { super(ea, mc); this.branch = branch; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/OutgoingEmail.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/OutgoingEmail.java index b8358c57c0..d0f9efe858 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/OutgoingEmail.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/OutgoingEmail.java @@ -34,17 +34,6 @@ import com.google.gerrit.server.validators.OutgoingEmailValidationListener; import com.google.gerrit.server.validators.ValidationException; import com.google.gwtorm.server.OrmException; import com.google.template.soy.data.SanitizedContent; - -import org.apache.commons.lang.StringUtils; -import org.apache.velocity.Template; -import org.apache.velocity.VelocityContext; -import org.apache.velocity.context.InternalContextAdapterImpl; -import org.apache.velocity.runtime.RuntimeInstance; -import org.apache.velocity.runtime.parser.node.SimpleNode; -import org.eclipse.jgit.util.SystemReader; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.StringReader; import java.io.StringWriter; import java.net.MalformedURLException; @@ -61,6 +50,15 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; +import org.apache.commons.lang.StringUtils; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.context.InternalContextAdapterImpl; +import org.apache.velocity.runtime.RuntimeInstance; +import org.apache.velocity.runtime.parser.node.SimpleNode; +import org.eclipse.jgit.util.SystemReader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** Sends an email to one or more interested parties. */ public abstract class OutgoingEmail { @@ -76,8 +74,7 @@ public abstract class OutgoingEmail { private Address smtpFromAddress; private StringBuilder textBody; private StringBuilder htmlBody; - private ListMultimap accountsToNotify = - ImmutableListMultimap.of(); + private ListMultimap accountsToNotify = ImmutableListMultimap.of(); protected VelocityContext velocityContext; protected Map soyContext; protected Map soyContextEmailData; @@ -100,8 +97,7 @@ public abstract class OutgoingEmail { this.notify = checkNotNull(notify); } - public void setAccountsToNotify( - ListMultimap accountsToNotify) { + public void setAccountsToNotify(ListMultimap accountsToNotify) { this.accountsToNotify = checkNotNull(accountsToNotify); } @@ -135,15 +131,13 @@ public abstract class OutgoingEmail { final Account fromUser = args.accountCache.get(fromId).getAccount(); GeneralPreferencesInfo senderPrefs = fromUser.getGeneralPreferencesInfo(); - if (senderPrefs != null - && senderPrefs.getEmailStrategy() == CC_ON_OWN_COMMENTS) { + if (senderPrefs != null && senderPrefs.getEmailStrategy() == CC_ON_OWN_COMMENTS) { // If we are impersonating a user, make sure they receive a CC of // this message so they can always review and audit what we sent // on their behalf to others. // add(RecipientType.CC, fromId); - } else if (!accountsToNotify.containsValue(fromId) - && rcptTo.remove(fromId)) { + } else if (!accountsToNotify.containsValue(fromId) && rcptTo.remove(fromId)) { // If they don't want a copy, but we queued one up anyway, // drop them from the recipient lists. // @@ -186,8 +180,7 @@ public abstract class OutgoingEmail { } } - args.emailSender.send(va.smtpFromAddress, va.smtpRcptTo, va.headers, - va.body, va.htmlBody); + args.emailSender.send(va.smtpFromAddress, va.smtpRcptTo, va.headers, va.body, va.htmlBody); } } @@ -241,8 +234,7 @@ public abstract class OutgoingEmail { final String email = account.getPreferredEmail(); StringBuilder f = new StringBuilder(); - if ((name != null && !name.isEmpty()) - || (email != null && !email.isEmpty())) { + if ((name != null && !name.isEmpty()) || (email != null && !email.isEmpty())) { f.append("From"); if (name != null && !name.isEmpty()) { f.append(" ").append(name); @@ -286,8 +278,7 @@ public abstract class OutgoingEmail { } /** Set a header in the outgoing message using a template. */ - protected void setVHeader(final String name, final String value) throws - EmailException { + protected void setVHeader(final String name, final String value) throws EmailException { setHeader(name, velocify(value)); } @@ -332,8 +323,8 @@ public abstract class OutgoingEmail { } /** - * Gets the human readable name and email for an account; - * if neither are available, returns the Anonymous Coward name. + * Gets the human readable name and email for an account; if neither are available, returns the + * Anonymous Coward name. * * @param accountId user to fetch. * @return name/email of account, or Anonymous Coward if unset. @@ -357,9 +348,8 @@ public abstract class OutgoingEmail { } /** - * Gets the human readable name and email for an account; - * if both are unavailable, returns the username. If no - * username is set, this function returns null. + * Gets the human readable name and email for an account; if both are unavailable, returns the + * username. If no username is set, this function returns null. * * @param accountId user to fetch. * @return name/email of account, username, or null if unset. @@ -397,7 +387,8 @@ public abstract class OutgoingEmail { } if ((accountsToNotify == null || accountsToNotify.isEmpty()) - && smtpRcptTo.size() == 1 && rcptTo.size() == 1 + && smtpRcptTo.size() == 1 + && rcptTo.size() == 1 && rcptTo.contains(fromId)) { // If the only recipient is also the sender, don't bother. // @@ -546,10 +537,8 @@ public abstract class OutgoingEmail { } /** - * Evaluate the named template according to the following priority: - * 1) Velocity file override, OR... - * 2) Soy file override, OR... - * 3) Soy resource. + * Evaluate the named template according to the following priority: 1) Velocity file override, + * OR... 2) Soy file override, OR... 3) Soy resource. */ protected String textTemplate(String name) throws EmailException { String velocityName = name + ".vm"; @@ -584,15 +573,14 @@ public abstract class OutgoingEmail { protected void removeUser(Account user) { String fromEmail = user.getPreferredEmail(); - for (Iterator
j = smtpRcptTo.iterator(); j.hasNext();) { + for (Iterator
j = smtpRcptTo.iterator(); j.hasNext(); ) { if (j.next().getEmail().equals(fromEmail)) { j.remove(); } } for (Map.Entry entry : headers.entrySet()) { // Don't remove fromEmail from the "From" header though! - if (entry.getValue() instanceof AddressList - && !entry.getKey().equals("From")) { + if (entry.getValue() instanceof AddressList && !entry.getKey().equals("From")) { ((AddressList) entry.getValue()).remove(fromEmail); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/OutgoingEmailValidator.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/OutgoingEmailValidator.java index 1e92c838a9..2d9db1dd8c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/OutgoingEmailValidator.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/OutgoingEmailValidator.java @@ -21,7 +21,7 @@ import org.apache.commons.validator.routines.EmailValidator; public class OutgoingEmailValidator { static { - DomainValidator.updateTLDOverride(GENERIC_PLUS, new String[]{"local"}); + DomainValidator.updateTLDOverride(GENERIC_PLUS, new String[] {"local"}); } public static boolean isValid(String addr) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/ProjectWatch.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/ProjectWatch.java index 2269b66f6e..3eb6f05f33 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/ProjectWatch.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/ProjectWatch.java @@ -37,15 +37,13 @@ import com.google.gerrit.server.query.change.ChangeData; import com.google.gerrit.server.query.change.ChangeQueryBuilder; import com.google.gerrit.server.query.change.SingleGroupUser; import com.google.gwtorm.server.OrmException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class ProjectWatch { private static final Logger log = LoggerFactory.getLogger(ProjectWatch.class); @@ -55,8 +53,11 @@ public class ProjectWatch { protected final Project.NameKey project; protected final ChangeData changeData; - public ProjectWatch(EmailArguments args, Project.NameKey project, - ProjectState projectState, ChangeData changeData) { + public ProjectWatch( + EmailArguments args, + Project.NameKey project, + ProjectState projectState, + ChangeData changeData) { this.args = args; this.project = project; this.projectState = projectState; @@ -68,23 +69,19 @@ public class ProjectWatch { Watchers matching = new Watchers(); Set projectWatchers = new HashSet<>(); - for (AccountState a : args.accountQueryProvider.get() - .byWatchedProject(project)) { + for (AccountState a : args.accountQueryProvider.get().byWatchedProject(project)) { Account.Id accountId = a.getAccount().getId(); - for (Map.Entry> e : - a.getProjectWatches().entrySet()) { + for (Map.Entry> e : a.getProjectWatches().entrySet()) { if (project.equals(e.getKey().project()) - && add(matching, accountId, e.getKey(), e.getValue(), type)) { + && add(matching, accountId, e.getKey(), e.getValue(), type)) { // We only want to prevent matching All-Projects if this filter hits projectWatchers.add(accountId); } } } - for (AccountState a : args.accountQueryProvider.get() - .byWatchedProject(args.allProjectsName)) { - for (Map.Entry> e : - a.getProjectWatches().entrySet()) { + for (AccountState a : args.accountQueryProvider.get().byWatchedProject(args.allProjectsName)) { + for (Map.Entry> e : a.getProjectWatches().entrySet()) { if (args.allProjectsName.equals(e.getKey().project())) { Account.Id accountId = a.getAccount().getId(); if (!projectWatchers.contains(accountId)) { @@ -100,9 +97,12 @@ public class ProjectWatch { try { add(matching, nc); } catch (QueryParseException e) { - log.warn("Project {} has invalid notify {} filter \"{}\": {}", - state.getProject().getName(), nc.getName(), - nc.getFilter(), e.getMessage()); + log.warn( + "Project {} has invalid notify {} filter \"{}\": {}", + state.getProject().getName(), + nc.getName(), + nc.getFilter(), + e.getMessage()); } } } @@ -116,6 +116,7 @@ public class ProjectWatch { protected final Set accounts = new HashSet<>(); protected final Set
emails = new HashSet<>(); } + protected final List to = new List(); protected final List cc = new List(); protected final List bcc = new List(); @@ -133,11 +134,9 @@ public class ProjectWatch { } } - private void add(Watchers matching, NotifyConfig nc) - throws OrmException, QueryParseException { + private void add(Watchers matching, NotifyConfig nc) throws OrmException, QueryParseException { for (GroupReference ref : nc.getGroups()) { - CurrentUser user = new SingleGroupUser(args.capabilityControlFactory, - ref.getUUID()); + CurrentUser user = new SingleGroupUser(args.capabilityControlFactory, ref.getUUID()); if (filterMatch(user, nc.getFilter())) { deliverToMembers(matching.list(nc.getHeader()), ref.getUUID()); } @@ -150,9 +149,8 @@ public class ProjectWatch { } } - private void deliverToMembers( - Watchers.List matching, - AccountGroup.UUID startUUID) throws OrmException { + private void deliverToMembers(Watchers.List matching, AccountGroup.UUID startUUID) + throws OrmException { ReviewDb db = args.db.get(); Set seen = new HashSet<>(); List q = new ArrayList<>(); @@ -186,8 +184,12 @@ public class ProjectWatch { } } - private boolean add(Watchers matching, Account.Id accountId, - ProjectWatchKey key, Set watchedTypes, NotifyType type) + private boolean add( + Watchers matching, + Account.Id accountId, + ProjectWatchKey key, + Set watchedTypes, + NotifyType type) throws OrmException { IdentifiedUser user = args.identifiedUserFactory.create(accountId); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/RegisterNewEmailSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/RegisterNewEmailSender.java index b665690937..c6670262f3 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/RegisterNewEmailSender.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/RegisterNewEmailSender.java @@ -35,7 +35,8 @@ public class RegisterNewEmailSender extends OutgoingEmail { private String emailToken; @Inject - public RegisterNewEmailSender(EmailArguments ea, + public RegisterNewEmailSender( + EmailArguments ea, EmailTokenVerifier etv, IdentifiedUser callingUser, @Assisted final String address) { @@ -63,8 +64,7 @@ public class RegisterNewEmailSender extends OutgoingEmail { public String getEmailRegistrationToken() { if (emailToken == null) { - emailToken = checkNotNull( - tokenVerifier.encode(user.getAccountId(), addr), "token"); + emailToken = checkNotNull(tokenVerifier.encode(user.getAccountId(), addr), "token"); } return emailToken; } @@ -76,8 +76,7 @@ public class RegisterNewEmailSender extends OutgoingEmail { @Override protected void setupSoyContext() { super.setupSoyContext(); - soyContextEmailData - .put("emailRegistrationToken", getEmailRegistrationToken()); + soyContextEmailData.put("emailRegistrationToken", getEmailRegistrationToken()); soyContextEmailData.put("userNameEmail", getUserNameEmail()); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/ReplacePatchSetSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/ReplacePatchSetSender.java index d5ba4a8256..1d670da6d1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/ReplacePatchSetSender.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/ReplacePatchSetSender.java @@ -23,7 +23,6 @@ import com.google.gerrit.server.account.WatchConfig.NotifyType; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; @@ -40,9 +39,8 @@ public class ReplacePatchSetSender extends ReplyToChangeSender { private final Set extraCC = new HashSet<>(); @Inject - public ReplacePatchSetSender(EmailArguments ea, - @Assisted Project.NameKey project, - @Assisted Change.Id id) + public ReplacePatchSetSender( + EmailArguments ea, @Assisted Project.NameKey project, @Assisted Change.Id id) throws OrmException { super(ea, "newpatchset", newChangeData(ea, project, id)); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/ReplyToChangeSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/ReplyToChangeSender.java index a6e2fa7329..61e9d1d1fa 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/ReplyToChangeSender.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/ReplyToChangeSender.java @@ -27,8 +27,7 @@ public abstract class ReplyToChangeSender extends ChangeEmail { T create(Project.NameKey project, Change.Id id); } - protected ReplyToChangeSender(EmailArguments ea, String mc, ChangeData cd) - throws OrmException { + protected ReplyToChangeSender(EmailArguments ea, String mc, ChangeData cd) throws OrmException { super(ea, mc, cd); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/RestoredSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/RestoredSender.java index fe3798404d..7456d06fd8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/RestoredSender.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/RestoredSender.java @@ -24,16 +24,14 @@ import com.google.inject.assistedinject.Assisted; /** Send notice about a change being restored by its owner. */ public class RestoredSender extends ReplyToChangeSender { - public interface Factory extends - ReplyToChangeSender.Factory { + public interface Factory extends ReplyToChangeSender.Factory { @Override RestoredSender create(Project.NameKey project, Change.Id id); } @Inject - public RestoredSender(EmailArguments ea, - @Assisted Project.NameKey project, - @Assisted Change.Id id) + public RestoredSender( + EmailArguments ea, @Assisted Project.NameKey project, @Assisted Change.Id id) throws OrmException { super(ea, "restore", ChangeEmail.newChangeData(ea, project, id)); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/RevertedSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/RevertedSender.java index bad72abb3d..e590d94762 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/RevertedSender.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/RevertedSender.java @@ -29,9 +29,8 @@ public class RevertedSender extends ReplyToChangeSender { } @Inject - public RevertedSender(EmailArguments ea, - @Assisted Project.NameKey project, - @Assisted Change.Id id) + public RevertedSender( + EmailArguments ea, @Assisted Project.NameKey project, @Assisted Change.Id id) throws OrmException { super(ea, "revert", ChangeEmail.newChangeData(ea, project, id)); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/SetAssigneeSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/SetAssigneeSender.java index 11d9a6e32d..9708b1b0b5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/SetAssigneeSender.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/SetAssigneeSender.java @@ -25,14 +25,14 @@ import com.google.inject.assistedinject.Assisted; public class SetAssigneeSender extends ChangeEmail { public interface Factory { - SetAssigneeSender create(Project.NameKey project, Change.Id id, - Account.Id assignee); + SetAssigneeSender create(Project.NameKey project, Change.Id id, Account.Id assignee); } private final Account.Id assignee; @Inject - public SetAssigneeSender(EmailArguments ea, + public SetAssigneeSender( + EmailArguments ea, @Assisted Project.NameKey project, @Assisted Change.Id id, @Assisted Account.Id assignee) diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/SmtpEmailSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/SmtpEmailSender.java index d5622bf160..841c995625 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/SmtpEmailSender.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/SmtpEmailSender.java @@ -29,12 +29,6 @@ import com.google.gerrit.server.mail.Encryption; import com.google.inject.AbstractModule; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.apache.commons.net.smtp.AuthSMTPClient; -import org.apache.commons.net.smtp.SMTPClient; -import org.apache.commons.net.smtp.SMTPReply; -import org.eclipse.jgit.lib.Config; - import java.io.BufferedWriter; import java.io.IOException; import java.io.Writer; @@ -48,6 +42,10 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeUnit; +import org.apache.commons.net.smtp.AuthSMTPClient; +import org.apache.commons.net.smtp.SMTPClient; +import org.apache.commons.net.smtp.SMTPReply; +import org.eclipse.jgit.lib.Config; /** Sends email via a nearby SMTP server. */ @Singleton @@ -79,17 +77,21 @@ public class SmtpEmailSender implements EmailSender { SmtpEmailSender(@GerritServerConfig final Config cfg) { enabled = cfg.getBoolean("sendemail", null, "enable", true); connectTimeout = - Ints.checkedCast(ConfigUtil.getTimeUnit(cfg, "sendemail", null, - "connectTimeout", DEFAULT_CONNECT_TIMEOUT, TimeUnit.MILLISECONDS)); - + Ints.checkedCast( + ConfigUtil.getTimeUnit( + cfg, + "sendemail", + null, + "connectTimeout", + DEFAULT_CONNECT_TIMEOUT, + TimeUnit.MILLISECONDS)); smtpHost = cfg.getString("sendemail", null, "smtpserver"); if (smtpHost == null) { smtpHost = "127.0.0.1"; } - smtpEncryption = - cfg.getEnum("sendemail", null, "smtpencryption", Encryption.NONE); + smtpEncryption = cfg.getEnum("sendemail", null, "smtpencryption", Encryption.NONE); sslVerify = cfg.getBoolean("sendemail", null, "sslverify", true); final int defaultPort; @@ -146,22 +148,28 @@ public class SmtpEmailSender implements EmailSender { } @Override - public void send(final Address from, Collection
rcpt, - final Map callerHeaders, String body) + public void send( + final Address from, + Collection
rcpt, + final Map callerHeaders, + String body) throws EmailException { send(from, rcpt, callerHeaders, body, null); } @Override - public void send(final Address from, Collection
rcpt, - final Map callerHeaders, String textBody, - @Nullable String htmlBody) throws EmailException { + public void send( + final Address from, + Collection
rcpt, + final Map callerHeaders, + String textBody, + @Nullable String htmlBody) + throws EmailException { if (!isEnabled()) { throw new EmailException("Sending email is disabled"); } - final Map hdrs = - new LinkedHashMap<>(callerHeaders); + final Map hdrs = new LinkedHashMap<>(callerHeaders); setMissingHeader(hdrs, "MIME-Version", "1.0"); setMissingHeader(hdrs, "Content-Transfer-Encoding", "8bit"); setMissingHeader(hdrs, "Content-Disposition", "inline"); @@ -170,10 +178,9 @@ public class SmtpEmailSender implements EmailSender { setMissingHeader(hdrs, "Importance", importance); } if (expiryDays > 0) { - Date expiry = new Date(TimeUtil.nowMs() + - expiryDays * 24 * 60 * 60 * 1000L ); - setMissingHeader(hdrs, "Expiry-Date", - new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z").format(expiry)); + Date expiry = new Date(TimeUtil.nowMs() + expiryDays * 24 * 60 * 60 * 1000L); + setMissingHeader( + hdrs, "Expiry-Date", new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z").format(expiry)); } String encodedBody; @@ -182,9 +189,10 @@ public class SmtpEmailSender implements EmailSender { encodedBody = textBody; } else { String boundary = generateMultipartBoundary(textBody, htmlBody); - setMissingHeader(hdrs, "Content-Type", "multipart/alternative; " - + "boundary=\"" + boundary + "\"; " - + "charset=UTF-8"); + setMissingHeader( + hdrs, + "Content-Type", + "multipart/alternative; " + "boundary=\"" + boundary + "\"; " + "charset=UTF-8"); encodedBody = buildMultipartBody(boundary, textBody, htmlBody); } @@ -193,8 +201,8 @@ public class SmtpEmailSender implements EmailSender { final SMTPClient client = open(); try { if (!client.setSender(from.getEmail())) { - throw new EmailException("Server " + smtpHost - + " rejected from address " + from.getEmail()); + throw new EmailException( + "Server " + smtpHost + " rejected from address " + from.getEmail()); } /* Do not prevent the email from being sent to "good" users simply @@ -207,9 +215,13 @@ public class SmtpEmailSender implements EmailSender { for (Address addr : rcpt) { if (!client.addRecipient(addr.getEmail())) { String error = client.getReplyString(); - rejected.append("Server ").append(smtpHost) - .append(" rejected recipient ").append(addr) - .append(": ").append(error); + rejected + .append("Server ") + .append(smtpHost) + .append(" rejected recipient ") + .append(addr) + .append(": ") + .append(error); } } @@ -219,8 +231,12 @@ public class SmtpEmailSender implements EmailSender { * information. That piece of the puzzle is vital if zero recipients * are accepted and the server consequently rejects the DATA command. */ - throw new EmailException(rejected + "Server " + smtpHost - + " rejected DATA command: " + client.getReplyString()); + throw new EmailException( + rejected + + "Server " + + smtpHost + + " rejected DATA command: " + + client.getReplyString()); } try (Writer w = new BufferedWriter(messageDataWriter)) { for (Map.Entry h : hdrs.entrySet()) { @@ -238,8 +254,8 @@ public class SmtpEmailSender implements EmailSender { } if (!client.completePendingCommand()) { - throw new EmailException("Server " + smtpHost - + " rejected message body: " + client.getReplyString()); + throw new EmailException( + "Server " + smtpHost + " rejected message body: " + client.getReplyString()); } client.logout(); @@ -254,8 +270,8 @@ public class SmtpEmailSender implements EmailSender { } } - public static String generateMultipartBoundary(String textBody, - String htmlBody) throws EmailException { + public static String generateMultipartBoundary(String textBody, String htmlBody) + throws EmailException { byte[] bytes = new byte[8]; ThreadLocalRandom rng = ThreadLocalRandom.current(); @@ -276,29 +292,36 @@ public class SmtpEmailSender implements EmailSender { throw new EmailException("Gave up generating unique MIME boundary"); } - protected String buildMultipartBody(String boundary, String textPart, - String htmlPart) { + protected String buildMultipartBody(String boundary, String textPart, String htmlPart) { return - // Output the text part: - "--" + boundary + "\r\n" + // Output the text part: + "--" + + boundary + + "\r\n" + "Content-Type: text/plain; charset=UTF-8\r\n" + "Content-Transfer-Encoding: 8bit\r\n" + "\r\n" - + textPart + "\r\n" + + textPart + + "\r\n" // Output the HTML part: - + "--" + boundary + "\r\n" + + "--" + + boundary + + "\r\n" + "Content-Type: text/html; charset=UTF-8\r\n" + "Content-Transfer-Encoding: 8bit\r\n" + "\r\n" - + htmlPart + "\r\n" + + htmlPart + + "\r\n" // Output the closing boundary. - + "--" + boundary + "--\r\n"; + + "--" + + boundary + + "--\r\n"; } - private void setMissingHeader(final Map hdrs, - final String name, final String value) { + private void setMissingHeader( + final Map hdrs, final String name, final String value) { if (!hdrs.containsKey(name) || hdrs.get(name).isEmpty()) { hdrs.put(name, new EmailHeader.String(value)); } @@ -318,12 +341,10 @@ public class SmtpEmailSender implements EmailSender { String replyString = client.getReplyString(); if (!SMTPReply.isPositiveCompletion(replyCode)) { throw new EmailException( - String.format("SMTP server rejected connection: %d: %s", - replyCode, replyString)); + String.format("SMTP server rejected connection: %d: %s", replyCode, replyString)); } if (!client.login()) { - throw new EmailException( - "SMTP server rejected HELO/EHLO greeting: " + replyString); + throw new EmailException("SMTP server rejected HELO/EHLO greeting: " + replyString); } if (smtpEncryption == Encryption.TLS) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/VelocityRuntimeProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/VelocityRuntimeProvider.java index 03d4f7a713..3e17778cd0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/VelocityRuntimeProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/VelocityRuntimeProvider.java @@ -19,7 +19,8 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.ProvisionException; import com.google.inject.Singleton; - +import java.nio.file.Files; +import java.util.Properties; import org.apache.velocity.runtime.RuntimeConstants; import org.apache.velocity.runtime.RuntimeInstance; import org.apache.velocity.runtime.RuntimeServices; @@ -27,9 +28,6 @@ import org.apache.velocity.runtime.log.LogChute; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.nio.file.Files; -import java.util.Properties; - /** Configures Velocity template engine for sending email. */ @Singleton public class VelocityRuntimeProvider implements Provider { @@ -47,16 +45,14 @@ public class VelocityRuntimeProvider implements Provider { Properties p = new Properties(); p.setProperty(RuntimeConstants.VM_PERM_INLINE_LOCAL, "true"); - p.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, - Slf4jLogChute.class.getName()); + p.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, Slf4jLogChute.class.getName()); p.setProperty(RuntimeConstants.RUNTIME_REFERENCES_STRICT, "true"); p.setProperty("runtime.log.logsystem.log4j.category", "velocity"); if (Files.isDirectory(site.mail_dir)) { p.setProperty(rl, "file, class"); p.setProperty("file." + rl + ".class", pkg + ".FileResourceLoader"); - p.setProperty("file." + rl + ".path", - site.mail_dir.toAbsolutePath().toString()); + p.setProperty("file." + rl + ".path", site.mail_dir.toAbsolutePath().toString()); p.setProperty("class." + rl + ".class", pkg + ".ClasspathResourceLoader"); } else { p.setProperty(rl, "class"); @@ -77,8 +73,7 @@ public class VelocityRuntimeProvider implements Provider { private static final Logger log = LoggerFactory.getLogger("velocity"); @Override - public void init(RuntimeServices rs) { - } + public void init(RuntimeServices rs) {} @Override public boolean isLevelEnabled(int level) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mime/DefaultFileExtensionRegistry.java b/gerrit-server/src/main/java/com/google/gerrit/server/mime/DefaultFileExtensionRegistry.java index 8c6bb3e72b..7f0661cf5e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mime/DefaultFileExtensionRegistry.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mime/DefaultFileExtensionRegistry.java @@ -15,15 +15,10 @@ package com.google.gerrit.server.mime; import com.google.common.collect.ImmutableMap; - import eu.medsea.mimeutil.MimeException; import eu.medsea.mimeutil.MimeType; import eu.medsea.mimeutil.MimeUtil; import eu.medsea.mimeutil.detector.MimeDetector; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -32,6 +27,8 @@ import java.util.Collection; import java.util.Collections; import java.util.Map; import java.util.Properties; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** Loads mime types from {@code mime-types.properties} at specificity of 2. */ public class DefaultFileExtensionRegistry extends MimeDetector { @@ -40,8 +37,8 @@ public class DefaultFileExtensionRegistry extends MimeDetector { static { Properties prop = new Properties(); - try (InputStream in = DefaultFileExtensionRegistry.class - .getResourceAsStream("mime-types.properties")) { + try (InputStream in = + DefaultFileExtensionRegistry.class.getResourceAsStream("mime-types.properties")) { prop.load(in); } catch (IOException e) { log.warn("Cannot load mime-types.properties", e); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mime/FileTypeRegistry.java b/gerrit-server/src/main/java/com/google/gerrit/server/mime/FileTypeRegistry.java index a231693313..e9e3c713c4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mime/FileTypeRegistry.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mime/FileTypeRegistry.java @@ -21,15 +21,14 @@ public interface FileTypeRegistry { /** * Get the most specific MIME type available for a file. * - * @param path name of the file. The base name (component after the last '/') - * may be used to help determine the MIME type, such as by examining - * the extension (portion after the last '.' if present). - * @param content the complete file content. If non-null the content may be - * used to guess the MIME type by examining the beginning for common - * file headers. - * @return the MIME type for this content. If the MIME type is not recognized - * or cannot be determined, {@link MimeUtil2#UNKNOWN_MIME_TYPE} which - * is an alias for {@code application/octet-stream}. + * @param path name of the file. The base name (component after the last '/') may be used to help + * determine the MIME type, such as by examining the extension (portion after the last '.' if + * present). + * @param content the complete file content. If non-null the content may be used to guess the MIME + * type by examining the beginning for common file headers. + * @return the MIME type for this content. If the MIME type is not recognized or cannot be + * determined, {@link MimeUtil2#UNKNOWN_MIME_TYPE} which is an alias for {@code + * application/octet-stream}. */ MimeType getMimeType(String path, byte[] content); @@ -37,11 +36,9 @@ public interface FileTypeRegistry { * Is this content type safe to transmit to a browser directly? * * @param type the MIME type of the file content. - * @return true if the Gerrit administrator wants to permit this content to be - * served as-is; false if the administrator does not trust this - * content type and wants it to be protected (typically by wrapping - * the data in a ZIP archive). + * @return true if the Gerrit administrator wants to permit this content to be served as-is; false + * if the administrator does not trust this content type and wants it to be protected + * (typically by wrapping the data in a ZIP archive). */ boolean isSafeInline(MimeType type); - } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mime/MimeUtil2Module.java b/gerrit-server/src/main/java/com/google/gerrit/server/mime/MimeUtil2Module.java index 61b01af8c3..387482aab8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mime/MimeUtil2Module.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mime/MimeUtil2Module.java @@ -18,15 +18,13 @@ import com.google.gerrit.server.util.HostPlatform; import com.google.inject.AbstractModule; import com.google.inject.Provides; import com.google.inject.Singleton; - import eu.medsea.mimeutil.MimeUtil2; import eu.medsea.mimeutil.detector.ExtensionMimeDetector; import eu.medsea.mimeutil.detector.MagicMimeMimeDetector; public class MimeUtil2Module extends AbstractModule { @Override - protected void configure() { - } + protected void configure() {} @Provides @Singleton diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mime/MimeUtilFileTypeRegistry.java b/gerrit-server/src/main/java/com/google/gerrit/server/mime/MimeUtilFileTypeRegistry.java index 2387200200..859363ca66 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mime/MimeUtilFileTypeRegistry.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mime/MimeUtilFileTypeRegistry.java @@ -17,15 +17,9 @@ package com.google.gerrit.server.mime; import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; import com.google.inject.Singleton; - import eu.medsea.mimeutil.MimeException; import eu.medsea.mimeutil.MimeType; import eu.medsea.mimeutil.MimeUtil2; - -import org.eclipse.jgit.lib.Config; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -33,13 +27,15 @@ import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Set; +import org.eclipse.jgit.lib.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Singleton public class MimeUtilFileTypeRegistry implements FileTypeRegistry { private static final String KEY_SAFE = "safe"; private static final String SECTION_MIMETYPE = "mimetype"; - private static final Logger log = - LoggerFactory.getLogger(MimeUtilFileTypeRegistry.class); + private static final Logger log = LoggerFactory.getLogger(MimeUtilFileTypeRegistry.class); private final Config cfg; private final MimeUtil2 mimeUtil; @@ -53,9 +49,8 @@ public class MimeUtilFileTypeRegistry implements FileTypeRegistry { /** * Get specificity of mime types with generic types forced to low values * - * "application/octet-stream" is forced to -1. - * "text/plain" is forced to 0. - * All other mime types return the specificity reported by mimeType itself. + *

"application/octet-stream" is forced to -1. "text/plain" is forced to 0. All other mime + * types return the specificity reported by mimeType itself. * * @param mimeType The mimeType to get the corrected specificity for. * @return The corrected specificity. @@ -103,12 +98,14 @@ public class MimeUtilFileTypeRegistry implements FileTypeRegistry { } final List types = new ArrayList<>(mimeTypes); - Collections.sort(types, new Comparator() { - @Override - public int compare(MimeType a, MimeType b) { - return getCorrectedMimeSpecificity(b) - getCorrectedMimeSpecificity(a); - } - }); + Collections.sort( + types, + new Comparator() { + @Override + public int compare(MimeType a, MimeType b) { + return getCorrectedMimeSpecificity(b) - getCorrectedMimeSpecificity(a); + } + }); return types.get(0); } @@ -135,7 +132,6 @@ public class MimeUtilFileTypeRegistry implements FileTypeRegistry { if (mimeTypes.isEmpty()) { return true; } - return mimeTypes.size() == 1 - && mimeTypes.contains(MimeUtil2.UNKNOWN_MIME_TYPE); + return mimeTypes.size() == 1 && mimeTypes.contains(MimeUtil2.UNKNOWN_MIME_TYPE); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeNotes.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeNotes.java index c58d3fe9f5..4cb570a422 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeNotes.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeNotes.java @@ -34,15 +34,13 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; -import java.io.IOException; - -/** View of contents at a single ref related to some change. **/ +/** View of contents at a single ref related to some change. * */ public abstract class AbstractChangeNotes { @VisibleForTesting @Singleton @@ -91,16 +89,18 @@ public abstract class AbstractChangeNotes { } else if (id != null) { id = id.copy(); } - return new AutoValue_AbstractChangeNotes_LoadHandle( - checkNotNull(walk), id); + return new AutoValue_AbstractChangeNotes_LoadHandle(checkNotNull(walk), id); } public static LoadHandle missing() { return new AutoValue_AbstractChangeNotes_LoadHandle(null, null); } - @Nullable public abstract ChangeNotesRevWalk walk(); - @Nullable public abstract ObjectId id(); + @Nullable + public abstract ChangeNotesRevWalk walk(); + + @Nullable + public abstract ObjectId id(); @Override public void close() { @@ -118,13 +118,12 @@ public abstract class AbstractChangeNotes { private ObjectId revision; private boolean loaded; - AbstractChangeNotes(Args args, Change.Id changeId, - @Nullable PrimaryStorage primaryStorage, boolean autoRebuild) { + AbstractChangeNotes( + Args args, Change.Id changeId, @Nullable PrimaryStorage primaryStorage, boolean autoRebuild) { this.args = checkNotNull(args); this.changeId = checkNotNull(changeId); this.primaryStorage = primaryStorage; - this.autoRebuild = primaryStorage == PrimaryStorage.REVIEW_DB - && autoRebuild; + this.autoRebuild = primaryStorage == PrimaryStorage.REVIEW_DB && autoRebuild; } public Change.Id getChangeId() { @@ -177,18 +176,15 @@ public abstract class AbstractChangeNotes { /** * Open a handle for reading this entity from a repository. - *

- * Implementations may override this method to provide auto-rebuilding - * behavior. + * + *

Implementations may override this method to provide auto-rebuilding behavior. * * @param repo open repository. * @return handle for reading the entity. - * * @throws NoSuchChangeException change does not exist. * @throws IOException a repo-level error occurred. */ - protected LoadHandle openHandle(Repository repo) - throws NoSuchChangeException, IOException { + protected LoadHandle openHandle(Repository repo) throws NoSuchChangeException, IOException { return openHandle(repo, readRef(repo)); } @@ -219,8 +215,8 @@ public abstract class AbstractChangeNotes { protected abstract void loadDefaults(); /** - * @return the NameKey for the project where the notes should be stored, - * which is not necessarily the same as the change's project. + * @return the NameKey for the project where the notes should be stored, which is not necessarily + * the same as the change's project. */ public abstract Project.NameKey getProjectName(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeUpdate.java index fa23b8085e..8df9bd6fd8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeUpdate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeUpdate.java @@ -28,7 +28,8 @@ import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.InternalUser; import com.google.gerrit.server.project.ChangeControl; import com.google.gwtorm.server.OrmException; - +import java.io.IOException; +import java.util.Date; import org.eclipse.jgit.lib.CommitBuilder; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectId; @@ -37,9 +38,6 @@ import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; -import java.io.IOException; -import java.util.Date; - /** A single delta related to a specific patch-set of a change. */ public abstract class AbstractChangeUpdate { protected final NotesMigration migration; @@ -72,10 +70,8 @@ public abstract class AbstractChangeUpdate { this.change = notes.getChange(); this.accountId = accountId(ctl.getUser()); Account.Id realAccountId = accountId(ctl.getUser().getRealUser()); - this.realAccountId = - realAccountId != null ? realAccountId : accountId; - this.authorIdent = - ident(noteUtil, serverIdent, anonymousCowardName, ctl.getUser(), when); + this.realAccountId = realAccountId != null ? realAccountId : accountId; + this.authorIdent = ident(noteUtil, serverIdent, anonymousCowardName, ctl.getUser(), when); this.when = when; } @@ -91,8 +87,7 @@ public abstract class AbstractChangeUpdate { PersonIdent authorIdent, Date when) { checkArgument( - (notes != null && change == null) - || (notes == null && change != null), + (notes != null && change == null) || (notes == null && change != null), "exactly one of notes or change required"); this.migration = migration; this.noteUtil = noteUtil; @@ -109,7 +104,8 @@ public abstract class AbstractChangeUpdate { private static void checkUserType(CurrentUser user) { checkArgument( (user instanceof IdentifiedUser) || (user instanceof InternalUser), - "user must be IdentifiedUser or InternalUser: %s", user); + "user must be IdentifiedUser or InternalUser: %s", + user); } private static Account.Id accountId(CurrentUser u) { @@ -117,13 +113,16 @@ public abstract class AbstractChangeUpdate { return (u instanceof IdentifiedUser) ? u.getAccountId() : null; } - private static PersonIdent ident(ChangeNoteUtil noteUtil, - PersonIdent serverIdent, String anonymousCowardName, CurrentUser u, + private static PersonIdent ident( + ChangeNoteUtil noteUtil, + PersonIdent serverIdent, + String anonymousCowardName, + CurrentUser u, Date when) { checkUserType(u); if (u instanceof IdentifiedUser) { - return noteUtil.newIdent(u.asIdentifiedUser().getAccount(), when, - serverIdent, anonymousCowardName); + return noteUtil.newIdent( + u.asIdentifiedUser().getAccount(), when, serverIdent, anonymousCowardName); } else if (u instanceof InternalUser) { return serverIdent; } @@ -157,9 +156,11 @@ public abstract class AbstractChangeUpdate { } public Account.Id getAccountId() { - checkState(accountId != null, + checkState( + accountId != null, "author identity for %s is not from an IdentifiedUser: %s", - getClass().getSimpleName(), authorIdent.toExternalString()); + getClass().getSimpleName(), + authorIdent.toExternalString()); return accountId; } @@ -175,8 +176,8 @@ public abstract class AbstractChangeUpdate { public abstract boolean isEmpty(); /** - * @return the NameKey for the project where the update will be stored, - * which is not necessarily the same as the change's project. + * @return the NameKey for the project where the update will be stored, which is not necessarily + * the same as the change's project. */ protected abstract Project.NameKey getProjectName(); @@ -188,9 +189,9 @@ public abstract class AbstractChangeUpdate { * @param rw walk for reading back any objects needed for the update. * @param ins inserter to write to; callers should not flush. * @param curr the current tip of the branch prior to this update. - * @return commit ID produced by inserting this update's commit, or null if - * this update is a no-op and should be skipped. The zero ID is a valid - * return value, and indicates the ref should be deleted. + * @return commit ID produced by inserting this update's commit, or null if this update is a no-op + * and should be skipped. The zero ID is a valid return value, and indicates the ref should be + * deleted. * @throws OrmException if a Gerrit-level error occurred. * @throws IOException if a lower-level error occurred. */ @@ -236,18 +237,17 @@ public abstract class AbstractChangeUpdate { * Create a commit containing the contents of this update. * * @param ins inserter to write to; callers should not flush. - * @return a new commit builder representing this commit, or null to indicate - * the meta ref should be deleted as a result of this update. The parent, - * author, and committer fields in the return value are always - * overwritten. The tree ID may be unset by this method, which indicates - * to the caller that it should be copied from the parent commit. To - * indicate that this update is a no-op (but this could not be determined - * by {@link #isEmpty()}), return the sentinel {@link #NO_OP_UPDATE}. + * @return a new commit builder representing this commit, or null to indicate the meta ref should + * be deleted as a result of this update. The parent, author, and committer fields in the + * return value are always overwritten. The tree ID may be unset by this method, which + * indicates to the caller that it should be copied from the parent commit. To indicate that + * this update is a no-op (but this could not be determined by {@link #isEmpty()}), return the + * sentinel {@link #NO_OP_UPDATE}. * @throws OrmException if a Gerrit-level error occurred. * @throws IOException if a lower-level error occurred. */ - protected abstract CommitBuilder applyImpl(RevWalk rw, ObjectInserter ins, - ObjectId curr) throws OrmException, IOException; + protected abstract CommitBuilder applyImpl(RevWalk rw, ObjectInserter ins, ObjectId curr) + throws OrmException, IOException; protected static final CommitBuilder NO_OP_UPDATE = new CommitBuilder(); @@ -267,13 +267,16 @@ public abstract class AbstractChangeUpdate { checkArgument(c.revId != null, "RevId required for comment: %s", c); checkArgument( c.author.getId().equals(getAccountId()), - "The author for the following comment does not match the author of" - + " this %s (%s): %s", - getClass().getSimpleName(), getAccountId(), c); + "The author for the following comment does not match the author of" + " this %s (%s): %s", + getClass().getSimpleName(), + getAccountId(), + c); checkArgument( c.getRealAuthor().getId().equals(realAccountId), "The real author for the following comment does not match the real" + " author of this %s (%s): %s", - getClass().getSimpleName(), realAccountId, c); + getClass().getSimpleName(), + realAccountId, + c); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeBundle.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeBundle.java index a107bda16e..eaa0335213 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeBundle.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeBundle.java @@ -55,7 +55,6 @@ import com.google.gerrit.server.ReviewerSet; import com.google.gerrit.server.notedb.rebuild.ChangeRebuilderImpl; import com.google.gwtorm.client.Column; import com.google.gwtorm.server.OrmException; - import java.lang.reflect.Field; import java.sql.Timestamp; import java.util.ArrayList; @@ -73,26 +72,31 @@ import java.util.TreeSet; /** * A bundle of all entities rooted at a single {@link Change} entity. - *

- * See the {@link Change} Javadoc for a depiction of this tree. Bundles may be - * compared using {@link #differencesFrom(ChangeBundle)}, which normalizes out - * the minor implementation differences between ReviewDb and NoteDb. + * + *

See the {@link Change} Javadoc for a depiction of this tree. Bundles may be compared using + * {@link #differencesFrom(ChangeBundle)}, which normalizes out the minor implementation differences + * between ReviewDb and NoteDb. */ public class ChangeBundle { public enum Source { - REVIEW_DB, NOTE_DB; + REVIEW_DB, + NOTE_DB; } - public static ChangeBundle fromNotes(CommentsUtil commentsUtil, - ChangeNotes notes) throws OrmException { + public static ChangeBundle fromNotes(CommentsUtil commentsUtil, ChangeNotes notes) + throws OrmException { return new ChangeBundle( notes.getChange(), notes.getChangeMessages(), notes.getPatchSets().values(), notes.getApprovals().values(), - Iterables.concat(CommentsUtil.toPatchLineComments(notes.getChangeId(), - PatchLineComment.Status.DRAFT, commentsUtil.draftByChange(null, notes)), - CommentsUtil.toPatchLineComments(notes.getChangeId(), + Iterables.concat( + CommentsUtil.toPatchLineComments( + notes.getChangeId(), + PatchLineComment.Status.DRAFT, + commentsUtil.draftByChange(null, notes)), + CommentsUtil.toPatchLineComments( + notes.getChangeId(), PatchLineComment.Status.PUBLISHED, commentsUtil.publishedByChange(null, notes))), notes.getReviewers(), @@ -101,16 +105,17 @@ public class ChangeBundle { private static Map changeMessageMap( Iterable in) { - Map out = new TreeMap<>( - new Comparator() { - @Override - public int compare(ChangeMessage.Key a, ChangeMessage.Key b) { - return ComparisonChain.start() - .compare(a.getParentKey().get(), b.getParentKey().get()) - .compare(a.get(), b.get()) - .result(); - } - }); + Map out = + new TreeMap<>( + new Comparator() { + @Override + public int compare(ChangeMessage.Key a, ChangeMessage.Key b) { + return ComparisonChain.start() + .compare(a.getParentKey().get(), b.getParentKey().get()) + .compare(a.get(), b.get()) + .result(); + } + }); for (ChangeMessage cm : in) { out.put(cm.getKey(), cm); } @@ -121,15 +126,13 @@ public class ChangeBundle { // this comparator sorts first on timestamp, then on every other field. private static final Ordering CHANGE_MESSAGE_ORDER = new Ordering() { - final Ordering> nullsFirst = - Ordering.natural().nullsFirst(); + final Ordering> nullsFirst = Ordering.natural().nullsFirst(); @Override public int compare(ChangeMessage a, ChangeMessage b) { return ComparisonChain.start() .compare(a.getWrittenOn(), b.getWrittenOn()) - .compare(a.getKey().getParentKey().get(), - b.getKey().getParentKey().get()) + .compare(a.getKey().getParentKey().get(), b.getKey().getParentKey().get()) .compare(psId(a), psId(b), nullsFirst) .compare(a.getAuthor(), b.getAuthor(), intKeyOrdering()) .compare(a.getMessage(), b.getMessage(), nullsFirst) @@ -141,57 +144,59 @@ public class ChangeBundle { } }; - private static ImmutableList changeMessageList( - Iterable in) { + private static ImmutableList changeMessageList(Iterable in) { return CHANGE_MESSAGE_ORDER.immutableSortedCopy(in); } private static TreeMap patchSetMap(Iterable in) { - TreeMap out = new TreeMap<>( - new Comparator() { - @Override - public int compare(PatchSet.Id a, PatchSet.Id b) { - return patchSetIdChain(a, b).result(); - } - }); + TreeMap out = + new TreeMap<>( + new Comparator() { + @Override + public int compare(PatchSet.Id a, PatchSet.Id b) { + return patchSetIdChain(a, b).result(); + } + }); for (PatchSet ps : in) { out.put(ps.getId(), ps); } return out; } - private static Map - patchSetApprovalMap(Iterable in) { - Map out = new TreeMap<>( - new Comparator() { - @Override - public int compare(PatchSetApproval.Key a, PatchSetApproval.Key b) { - return patchSetIdChain(a.getParentKey(), b.getParentKey()) - .compare(a.getAccountId().get(), b.getAccountId().get()) - .compare(a.getLabelId(), b.getLabelId()) - .result(); - } - }); + private static Map patchSetApprovalMap( + Iterable in) { + Map out = + new TreeMap<>( + new Comparator() { + @Override + public int compare(PatchSetApproval.Key a, PatchSetApproval.Key b) { + return patchSetIdChain(a.getParentKey(), b.getParentKey()) + .compare(a.getAccountId().get(), b.getAccountId().get()) + .compare(a.getLabelId(), b.getLabelId()) + .result(); + } + }); for (PatchSetApproval psa : in) { out.put(psa.getKey(), psa); } return out; } - private static Map - patchLineCommentMap(Iterable in) { - Map out = new TreeMap<>( - new Comparator() { - @Override - public int compare(PatchLineComment.Key a, PatchLineComment.Key b) { - Patch.Key pka = a.getParentKey(); - Patch.Key pkb = b.getParentKey(); - return patchSetIdChain(pka.getParentKey(), pkb.getParentKey()) - .compare(pka.get(), pkb.get()) - .compare(a.get(), b.get()) - .result(); - } - }); + private static Map patchLineCommentMap( + Iterable in) { + Map out = + new TreeMap<>( + new Comparator() { + @Override + public int compare(PatchLineComment.Key a, PatchLineComment.Key b) { + Patch.Key pka = a.getParentKey(); + Patch.Key pkb = b.getParentKey(); + return patchSetIdChain(pka.getParentKey(), pkb.getParentKey()) + .compare(pka.get(), pkb.get()) + .compare(a.get(), b.get()) + .result(); + } + }); for (PatchLineComment plc : in) { out.put(plc.getKey(), plc); } @@ -213,9 +218,12 @@ public class ChangeBundle { } } Set expectedIds = Sets.newTreeSet(Arrays.asList(expected)); - checkState(ids.equals(expectedIds), + checkState( + ids.equals(expectedIds), "Unexpected column set for %s: %s != %s", - clazz.getSimpleName(), ids, expectedIds); + clazz.getSimpleName(), + ids, + expectedIds); } static { @@ -223,8 +231,7 @@ public class ChangeBundle { // last time this file was updated. checkColumns(Change.Id.class, 1); - checkColumns(Change.class, - 1, 2, 3, 4, 5, 7, 8, 10, 12, 13, 14, 17, 18, 19, 101); + checkColumns(Change.class, 1, 2, 3, 4, 5, 7, 8, 10, 12, 13, 14, 17, 18, 19, 101); checkColumns(ChangeMessage.Key.class, 1, 2); checkColumns(ChangeMessage.class, 1, 2, 3, 4, 5, 6, 7); checkColumns(PatchSet.Id.class, 1, 2); @@ -238,10 +245,8 @@ public class ChangeBundle { private final Change change; private final ImmutableList changeMessages; private final ImmutableSortedMap patchSets; - private final ImmutableMap - patchSetApprovals; - private final ImmutableMap - patchLineComments; + private final ImmutableMap patchSetApprovals; + private final ImmutableMap patchLineComments; private final ReviewerSet reviewers; private final Source source; @@ -256,10 +261,8 @@ public class ChangeBundle { this.change = checkNotNull(change); this.changeMessages = changeMessageList(changeMessages); this.patchSets = ImmutableSortedMap.copyOfSorted(patchSetMap(patchSets)); - this.patchSetApprovals = - ImmutableMap.copyOf(patchSetApprovalMap(patchSetApprovals)); - this.patchLineComments = - ImmutableMap.copyOf(patchLineCommentMap(patchLineComments)); + this.patchSetApprovals = ImmutableMap.copyOf(patchSetApprovalMap(patchSetApprovals)); + this.patchLineComments = ImmutableMap.copyOf(patchLineCommentMap(patchLineComments)); this.reviewers = checkNotNull(reviewers); this.source = checkNotNull(source); @@ -273,8 +276,7 @@ public class ChangeBundle { checkArgument(k.getParentKey().getParentKey().equals(change.getId())); } for (PatchLineComment.Key k : this.patchLineComments.keySet()) { - checkArgument(k.getParentKey().getParentKey().getParentKey() - .equals(change.getId())); + checkArgument(k.getParentKey().getParentKey().getParentKey().equals(change.getId())); } } @@ -345,23 +347,16 @@ public class ChangeBundle { return firstNonNull(ts, change.getLastUpdatedOn()); } - private Map - filterPatchSetApprovals() { - return limitToValidPatchSets( - patchSetApprovals, PatchSetApproval.Key::getParentKey); + private Map filterPatchSetApprovals() { + return limitToValidPatchSets(patchSetApprovals, PatchSetApproval.Key::getParentKey); } - private Map - filterPatchLineComments() { - return limitToValidPatchSets( - patchLineComments, - k -> k.getParentKey().getParentKey()); + private Map filterPatchLineComments() { + return limitToValidPatchSets(patchLineComments, k -> k.getParentKey().getParentKey()); } - private Map limitToValidPatchSets(Map in, - Function func) { - return Maps.filterKeys( - in, Predicates.compose(validPatchSetPredicate(), func)); + private Map limitToValidPatchSets(Map in, Function func) { + return Maps.filterKeys(in, Predicates.compose(validPatchSetPredicate(), func)); } private Predicate validPatchSetPredicate() { @@ -370,7 +365,9 @@ public class ChangeBundle { private Collection filterChangeMessages() { final Predicate validPatchSet = validPatchSetPredicate(); - return Collections2.filter(changeMessages, m -> { + return Collections2.filter( + changeMessages, + m -> { PatchSet.Id psId = m.getPatchSetId(); if (psId == null) { return true; @@ -379,8 +376,7 @@ public class ChangeBundle { }); } - private static void diffChanges(List diffs, ChangeBundle bundleA, - ChangeBundle bundleB) { + private static void diffChanges(List diffs, ChangeBundle bundleA, ChangeBundle bundleB) { Change a = bundleA.change; Change b = bundleB.change; String desc = a.getId().equals(b.getId()) ? describe(a.getId()) : "Changes"; @@ -435,35 +431,33 @@ public class ChangeBundle { // // Use max timestamp of all ReviewDb entities when comparing with NoteDb. if (bundleA.source == REVIEW_DB && bundleB.source == NOTE_DB) { - excludeCreatedOn = !timestampsDiffer( - bundleA, bundleA.getFirstPatchSetTime(), bundleB, b.getCreatedOn()); + excludeCreatedOn = + !timestampsDiffer(bundleA, bundleA.getFirstPatchSetTime(), bundleB, b.getCreatedOn()); aSubj = cleanReviewDbSubject(aSubj); - excludeCurrentPatchSetId = - !bundleA.validPatchSetPredicate().apply(a.currentPatchSetId()); + excludeCurrentPatchSetId = !bundleA.validPatchSetPredicate().apply(a.currentPatchSetId()); excludeSubject = bSubj.startsWith(aSubj) || excludeCurrentPatchSetId; excludeOrigSubj = true; String aTopic = trimLeadingOrNull(a.getTopic()); - excludeTopic = Objects.equals(aTopic, b.getTopic()) - || "".equals(aTopic) && b.getTopic() == null; + excludeTopic = + Objects.equals(aTopic, b.getTopic()) || "".equals(aTopic) && b.getTopic() == null; aUpdated = bundleA.getLatestTimestamp(); } else if (bundleA.source == NOTE_DB && bundleB.source == REVIEW_DB) { - excludeCreatedOn = !timestampsDiffer( - bundleA, a.getCreatedOn(), bundleB, bundleB.getFirstPatchSetTime()); + excludeCreatedOn = + !timestampsDiffer(bundleA, a.getCreatedOn(), bundleB, bundleB.getFirstPatchSetTime()); bSubj = cleanReviewDbSubject(bSubj); - excludeCurrentPatchSetId = - !bundleB.validPatchSetPredicate().apply(b.currentPatchSetId()); + excludeCurrentPatchSetId = !bundleB.validPatchSetPredicate().apply(b.currentPatchSetId()); excludeSubject = aSubj.startsWith(bSubj) || excludeCurrentPatchSetId; excludeOrigSubj = true; String bTopic = trimLeadingOrNull(b.getTopic()); - excludeTopic = Objects.equals(bTopic, a.getTopic()) - || a.getTopic() == null && "".equals(bTopic); + excludeTopic = + Objects.equals(bTopic, a.getTopic()) || a.getTopic() == null && "".equals(bTopic); bUpdated = bundleB.getLatestTimestamp(); } String subjectField = "subject"; String updatedField = "lastUpdatedOn"; - List exclude = Lists.newArrayList( - subjectField, updatedField, "noteDbState", "rowVersion"); + List exclude = + Lists.newArrayList(subjectField, updatedField, "noteDbState", "rowVersion"); if (excludeCreatedOn) { exclude.add("createdOn"); } @@ -476,16 +470,14 @@ public class ChangeBundle { if (excludeTopic) { exclude.add("topic"); } - diffColumnsExcluding(diffs, Change.class, desc, bundleA, a, bundleB, b, - exclude); + diffColumnsExcluding(diffs, Change.class, desc, bundleA, a, bundleB, b, exclude); // Allow last updated timestamps to either be exactly equal (within slop), // or the NoteDb timestamp to be equal to the latest entity timestamp in the // whole ReviewDb bundle (within slop). - if (timestampsDiffer(bundleA, a.getLastUpdatedOn(), - bundleB, b.getLastUpdatedOn())) { - diffTimestamps(diffs, desc, bundleA, aUpdated, bundleB, bUpdated, - "effective last updated time"); + if (timestampsDiffer(bundleA, a.getLastUpdatedOn(), bundleB, b.getLastUpdatedOn())) { + diffTimestamps( + diffs, desc, bundleA, aUpdated, bundleB, bUpdated, "effective last updated time"); } if (!excludeSubject) { diffValues(diffs, desc, aSubj, bSubj, subjectField); @@ -514,22 +506,24 @@ public class ChangeBundle { /** * Set of fields that must always exactly match between ReviewDb and NoteDb. - *

- * Used to limit the worst-case quadratic search when pairing off matching - * messages below. + * + *

Used to limit the worst-case quadratic search when pairing off matching messages below. */ @AutoValue abstract static class ChangeMessageCandidate { static ChangeMessageCandidate create(ChangeMessage cm) { return new AutoValue_ChangeBundle_ChangeMessageCandidate( - cm.getAuthor(), - cm.getMessage(), - cm.getTag()); + cm.getAuthor(), cm.getMessage(), cm.getTag()); } - @Nullable abstract Account.Id author(); - @Nullable abstract String message(); - @Nullable abstract String tag(); + @Nullable + abstract Account.Id author(); + + @Nullable + abstract String message(); + + @Nullable + abstract String tag(); // Exclude: // - patch set, which may be null on ReviewDb side but not NoteDb @@ -537,14 +531,12 @@ public class ChangeBundle { // - writtenOn, which is fuzzy } - private static void diffChangeMessages(List diffs, - ChangeBundle bundleA, ChangeBundle bundleB) { + private static void diffChangeMessages( + List diffs, ChangeBundle bundleA, ChangeBundle bundleB) { if (bundleA.source == REVIEW_DB && bundleB.source == REVIEW_DB) { // Both came from ReviewDb: check all fields exactly. - Map as = - changeMessageMap(bundleA.filterChangeMessages()); - Map bs = - changeMessageMap(bundleB.filterChangeMessages()); + Map as = changeMessageMap(bundleA.filterChangeMessages()); + Map bs = changeMessageMap(bundleB.filterChangeMessages()); for (ChangeMessage.Key k : diffKeySets(diffs, as, bs)) { ChangeMessage a = as.get(k); @@ -562,17 +554,16 @@ public class ChangeBundle { // but easy to reason about. List as = new LinkedList<>(bundleA.filterChangeMessages()); - ListMultimap bs = - LinkedListMultimap.create(); + ListMultimap bs = LinkedListMultimap.create(); for (ChangeMessage b : bundleB.filterChangeMessages()) { bs.put(ChangeMessageCandidate.create(b), b); } Iterator ait = as.iterator(); - A: while (ait.hasNext()) { + A: + while (ait.hasNext()) { ChangeMessage a = ait.next(); - Iterator bit = - bs.get(ChangeMessageCandidate.create(a)).iterator(); + Iterator bit = bs.get(ChangeMessageCandidate.create(a)).iterator(); while (bit.hasNext()) { ChangeMessage b = bit.next(); if (changeMessagesMatch(bundleA, a, bundleB, b)) { @@ -586,8 +577,8 @@ public class ChangeBundle { if (as.isEmpty() && bs.isEmpty()) { return; } - StringBuilder sb = new StringBuilder("ChangeMessages differ for Change.Id ") - .append(id).append('\n'); + StringBuilder sb = + new StringBuilder("ChangeMessages differ for Change.Id ").append(id).append('\n'); if (!as.isEmpty()) { sb.append("Only in A:"); for (ChangeMessage cm : as) { @@ -607,8 +598,7 @@ public class ChangeBundle { } private static boolean changeMessagesMatch( - ChangeBundle bundleA, ChangeMessage a, - ChangeBundle bundleB, ChangeMessage b) { + ChangeBundle bundleA, ChangeMessage a, ChangeBundle bundleB, ChangeMessage b) { List tempDiffs = new ArrayList<>(); String temp = "temp"; @@ -622,12 +612,18 @@ public class ChangeBundle { boolean excludeWrittenOn = false; if (bundleA.source == REVIEW_DB && bundleB.source == NOTE_DB) { excludePatchSet = a.getPatchSetId() == null; - excludeWrittenOn = psa != null && psb != null - && ta.before(psa.getCreatedOn()) && tb.equals(psb.getCreatedOn()); + excludeWrittenOn = + psa != null + && psb != null + && ta.before(psa.getCreatedOn()) + && tb.equals(psb.getCreatedOn()); } else if (bundleA.source == NOTE_DB && bundleB.source == REVIEW_DB) { excludePatchSet = b.getPatchSetId() == null; - excludeWrittenOn = psa != null && psb != null - && tb.before(psb.getCreatedOn()) && ta.equals(psa.getCreatedOn()); + excludeWrittenOn = + psa != null + && psb != null + && tb.before(psb.getCreatedOn()) + && ta.equals(psa.getCreatedOn()); } List exclude = Lists.newArrayList("key"); @@ -638,13 +634,12 @@ public class ChangeBundle { exclude.add("writtenOn"); } - diffColumnsExcluding( - tempDiffs, ChangeMessage.class, temp, bundleA, a, bundleB, b, exclude); + diffColumnsExcluding(tempDiffs, ChangeMessage.class, temp, bundleA, a, bundleB, b, exclude); return tempDiffs.isEmpty(); } - private static void diffPatchSets(List diffs, ChangeBundle bundleA, - ChangeBundle bundleB) { + private static void diffPatchSets( + List diffs, ChangeBundle bundleA, ChangeBundle bundleB) { Map as = bundleA.patchSets; Map bs = bundleB.patchSets; for (PatchSet.Id id : diffKeySets(diffs, as, bs)) { @@ -652,8 +647,7 @@ public class ChangeBundle { PatchSet b = bs.get(id); String desc = describe(id); String pushCertField = "pushCertificate"; - diffColumnsExcluding(diffs, PatchSet.class, desc, bundleA, a, bundleB, b, - pushCertField); + diffColumnsExcluding(diffs, PatchSet.class, desc, bundleA, a, bundleB, b, pushCertField); diffValues(diffs, desc, trimPushCert(a), trimPushCert(b), pushCertField); } } @@ -665,12 +659,10 @@ public class ChangeBundle { return CharMatcher.is('\n').trimTrailingFrom(ps.getPushCertificate()); } - private static void diffPatchSetApprovals(List diffs, - ChangeBundle bundleA, ChangeBundle bundleB) { - Map as = - bundleA.filterPatchSetApprovals(); - Map bs = - bundleB.filterPatchSetApprovals(); + private static void diffPatchSetApprovals( + List diffs, ChangeBundle bundleA, ChangeBundle bundleB) { + Map as = bundleA.filterPatchSetApprovals(); + Map bs = bundleB.filterPatchSetApprovals(); for (PatchSetApproval.Key k : diffKeySets(diffs, as, bs)) { PatchSetApproval a = as.get(k); PatchSetApproval b = bs.get(k); @@ -692,33 +684,28 @@ public class ChangeBundle { if (bundleA.source == REVIEW_DB && bundleB.source == NOTE_DB) { excludeGranted = (ta.before(psa.getCreatedOn()) && tb.equals(psb.getCreatedOn())) - || ta.compareTo(tb) < 0; + || ta.compareTo(tb) < 0; } else if (bundleA.source == NOTE_DB && bundleB.source == REVIEW_DB) { excludeGranted = - tb.before(psb.getCreatedOn()) && ta.equals(psa.getCreatedOn()) - || tb.compareTo(ta) < 0; + tb.before(psb.getCreatedOn()) && ta.equals(psa.getCreatedOn()) || tb.compareTo(ta) < 0; } if (excludeGranted) { exclude.add("granted"); } - diffColumnsExcluding( - diffs, PatchSetApproval.class, desc, bundleA, a, bundleB, b, exclude); + diffColumnsExcluding(diffs, PatchSetApproval.class, desc, bundleA, a, bundleB, b, exclude); } } - private static void diffReviewers(List diffs, - ChangeBundle bundleA, ChangeBundle bundleB) { - diffSets( - diffs, bundleA.reviewers.all(), bundleB.reviewers.all(), "reviewer"); + private static void diffReviewers( + List diffs, ChangeBundle bundleA, ChangeBundle bundleB) { + diffSets(diffs, bundleA.reviewers.all(), bundleB.reviewers.all(), "reviewer"); } - private static void diffPatchLineComments(List diffs, - ChangeBundle bundleA, ChangeBundle bundleB) { - Map as = - bundleA.filterPatchLineComments(); - Map bs = - bundleB.filterPatchLineComments(); + private static void diffPatchLineComments( + List diffs, ChangeBundle bundleA, ChangeBundle bundleB) { + Map as = bundleA.filterPatchLineComments(); + Map bs = bundleB.filterPatchLineComments(); for (PatchLineComment.Key k : diffKeySets(diffs, as, bs)) { PatchLineComment a = as.get(k); PatchLineComment b = bs.get(k); @@ -727,18 +714,15 @@ public class ChangeBundle { } } - private static Set diffKeySets(List diffs, Map a, - Map b) { + private static Set diffKeySets(List diffs, Map a, Map b) { if (a.isEmpty() && b.isEmpty()) { return a.keySet(); } - String clazz = - keyClass((!a.isEmpty() ? a.keySet() : b.keySet()).iterator().next()); + String clazz = keyClass((!a.isEmpty() ? a.keySet() : b.keySet()).iterator().next()); return diffSets(diffs, a.keySet(), b.keySet(), clazz); } - private static Set diffSets(List diffs, Set as, - Set bs, String desc) { + private static Set diffSets(List diffs, Set as, Set bs, String desc) { if (as.isEmpty() && bs.isEmpty()) { return as; } @@ -748,26 +732,42 @@ public class ChangeBundle { if (aNotB.isEmpty() && bNotA.isEmpty()) { return as; } - diffs.add(desc + " sets differ: " + aNotB + " only in A; " - + bNotA + " only in B"); + diffs.add(desc + " sets differ: " + aNotB + " only in A; " + bNotA + " only in B"); return Sets.intersection(as, bs); } - private static void diffColumns(List diffs, Class clazz, - String desc, ChangeBundle bundleA, T a, ChangeBundle bundleB, T b) { + private static void diffColumns( + List diffs, + Class clazz, + String desc, + ChangeBundle bundleA, + T a, + ChangeBundle bundleB, + T b) { diffColumnsExcluding(diffs, clazz, desc, bundleA, a, bundleB, b); } - private static void diffColumnsExcluding(List diffs, - Class clazz, String desc, ChangeBundle bundleA, T a, - ChangeBundle bundleB, T b, String... exclude) { - diffColumnsExcluding(diffs, clazz, desc, bundleA, a, bundleB, b, - Arrays.asList(exclude)); + private static void diffColumnsExcluding( + List diffs, + Class clazz, + String desc, + ChangeBundle bundleA, + T a, + ChangeBundle bundleB, + T b, + String... exclude) { + diffColumnsExcluding(diffs, clazz, desc, bundleA, a, bundleB, b, Arrays.asList(exclude)); } - private static void diffColumnsExcluding(List diffs, - Class clazz, String desc, ChangeBundle bundleA, T a, - ChangeBundle bundleB, T b, Iterable exclude) { + private static void diffColumnsExcluding( + List diffs, + Class clazz, + String desc, + ChangeBundle bundleA, + T a, + ChangeBundle bundleB, + T b, + Iterable exclude) { Set toExclude = Sets.newLinkedHashSet(exclude); for (Field f : clazz.getDeclaredFields()) { Column col = f.getAnnotation(Column.class); @@ -787,13 +787,20 @@ public class ChangeBundle { throw new IllegalArgumentException(e); } } - checkArgument(toExclude.isEmpty(), + checkArgument( + toExclude.isEmpty(), "requested columns to exclude not present in %s: %s", - clazz.getSimpleName(), toExclude); + clazz.getSimpleName(), + toExclude); } - private static void diffTimestamps(List diffs, String desc, - ChangeBundle bundleA, Object a, ChangeBundle bundleB, Object b, + private static void diffTimestamps( + List diffs, + String desc, + ChangeBundle bundleA, + Object a, + ChangeBundle bundleB, + Object b, String field) { checkArgument(a.getClass() == b.getClass()); Class clazz = a.getClass(); @@ -806,50 +813,53 @@ public class ChangeBundle { f.setAccessible(true); ta = (Timestamp) f.get(a); tb = (Timestamp) f.get(b); - } catch (IllegalAccessException | NoSuchFieldException - | SecurityException e) { + } catch (IllegalAccessException | NoSuchFieldException | SecurityException e) { throw new IllegalArgumentException(e); } diffTimestamps(diffs, desc, bundleA, ta, bundleB, tb, field); } - private static void diffTimestamps(List diffs, String desc, - ChangeBundle bundleA, Timestamp ta, ChangeBundle bundleB, Timestamp tb, + private static void diffTimestamps( + List diffs, + String desc, + ChangeBundle bundleA, + Timestamp ta, + ChangeBundle bundleB, + Timestamp tb, String fieldDesc) { if (bundleA.source == bundleB.source || ta == null || tb == null) { diffValues(diffs, desc, ta, tb, fieldDesc); } else if (bundleA.source == NOTE_DB) { - diffTimestamps( - diffs, desc, - bundleA.getChange(), ta, - bundleB.getChange(), tb, - fieldDesc); + diffTimestamps(diffs, desc, bundleA.getChange(), ta, bundleB.getChange(), tb, fieldDesc); } else { - diffTimestamps( - diffs, desc, - bundleB.getChange(), tb, - bundleA.getChange(), ta, - fieldDesc); + diffTimestamps(diffs, desc, bundleB.getChange(), tb, bundleA.getChange(), ta, fieldDesc); } } - private static boolean timestampsDiffer(ChangeBundle bundleA, Timestamp ta, - ChangeBundle bundleB, Timestamp tb) { + private static boolean timestampsDiffer( + ChangeBundle bundleA, Timestamp ta, ChangeBundle bundleB, Timestamp tb) { List tempDiffs = new ArrayList<>(1); diffTimestamps(tempDiffs, "temp", bundleA, ta, bundleB, tb, "temp"); return !tempDiffs.isEmpty(); } - private static void diffTimestamps(List diffs, String desc, - Change changeFromNoteDb, Timestamp tsFromNoteDb, - Change changeFromReviewDb, Timestamp tsFromReviewDb, + private static void diffTimestamps( + List diffs, + String desc, + Change changeFromNoteDb, + Timestamp tsFromNoteDb, + Change changeFromReviewDb, + Timestamp tsFromReviewDb, String field) { // Because ChangeRebuilder may batch events together that are several // seconds apart, the timestamp in NoteDb may actually be several seconds // *earlier* than the timestamp in ReviewDb that it was converted from. - checkArgument(tsFromNoteDb.equals(roundToSecond(tsFromNoteDb)), + checkArgument( + tsFromNoteDb.equals(roundToSecond(tsFromNoteDb)), "%s from NoteDb has non-rounded %s timestamp: %s", - desc, field, tsFromNoteDb); + desc, + field, + tsFromNoteDb); if (tsFromReviewDb.before(changeFromReviewDb.getCreatedOn()) && tsFromNoteDb.equals(changeFromNoteDb.getCreatedOn())) { @@ -859,21 +869,26 @@ public class ChangeBundle { return; } - long delta = tsFromReviewDb.getTime() - tsFromNoteDb.getTime(); long max = ChangeRebuilderImpl.MAX_WINDOW_MS; if (delta < 0 || delta > max) { diffs.add( - field + " differs for " + desc + " in NoteDb vs. ReviewDb:" - + " {" + tsFromNoteDb + "} != {" + tsFromReviewDb + "}"); + field + + " differs for " + + desc + + " in NoteDb vs. ReviewDb:" + + " {" + + tsFromNoteDb + + "} != {" + + tsFromReviewDb + + "}"); } } - private static void diffValues(List diffs, String desc, Object va, - Object vb, String name) { + private static void diffValues( + List diffs, String desc, Object va, Object vb, String name) { if (!Objects.equals(va, vb)) { - diffs.add( - name + " differs for " + desc + ": {" + va + "} != {" + vb + "}"); + diffs.add(name + " differs for " + desc + ": {" + va + "} != {" + vb + "}"); } } @@ -884,8 +899,7 @@ public class ChangeBundle { private static String keyClass(Object obj) { Class clazz = obj.getClass(); String name = clazz.getSimpleName(); - checkArgument(name.endsWith("Key") || name.endsWith("Id"), - "not an Id/Key class: %s", name); + checkArgument(name.endsWith("Key") || name.endsWith("Id"), "not an Id/Key class: %s", name); if (name.equals("Key") || name.equals("Id")) { return clazz.getEnclosingClass().getSimpleName() + "." + name; } else if (name.startsWith("AutoValue_")) { @@ -896,11 +910,21 @@ public class ChangeBundle { @Override public String toString() { - return getClass().getSimpleName() + "{id=" + change.getId() - + ", ChangeMessage[" + changeMessages.size() + "]" - + ", PatchSet[" + patchSets.size() + "]" - + ", PatchSetApproval[" + patchSetApprovals.size() + "]" - + ", PatchLineComment[" + patchLineComments.size() + "]" + return getClass().getSimpleName() + + "{id=" + + change.getId() + + ", ChangeMessage[" + + changeMessages.size() + + "]" + + ", PatchSet[" + + patchSets.size() + + "]" + + ", PatchSetApproval[" + + patchSetApprovals.size() + + "]" + + ", PatchLineComment[" + + patchLineComments.size() + + "]" + "}"; } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeDraftUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeDraftUpdate.java index 57d5dce388..74ffb96ee4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeDraftUpdate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeDraftUpdate.java @@ -32,15 +32,6 @@ import com.google.gerrit.server.config.AnonymousCowardName; import com.google.gwtorm.server.OrmException; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.CommitBuilder; -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.ObjectInserter; -import org.eclipse.jgit.lib.PersonIdent; -import org.eclipse.jgit.notes.NoteMap; -import org.eclipse.jgit.revwalk.RevWalk; - import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -49,15 +40,21 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.CommitBuilder; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.ObjectInserter; +import org.eclipse.jgit.lib.PersonIdent; +import org.eclipse.jgit.notes.NoteMap; +import org.eclipse.jgit.revwalk.RevWalk; /** * A single delta to apply atomically to a change. - *

- * This delta contains only draft comments on a single patch set of a change by - * a single author. This delta will become a single commit in the All-Users - * repository. - *

- * This class is not thread safe. + * + *

This delta contains only draft comments on a single patch set of a change by a single author. + * This delta will become a single commit in the All-Users repository. + * + *

This class is not thread safe. */ public class ChangeDraftUpdate extends AbstractChangeUpdate { public interface Factory { @@ -79,6 +76,7 @@ public class ChangeDraftUpdate extends AbstractChangeUpdate { @AutoValue abstract static class Key { abstract String revId(); + abstract Comment.Key key(); } @@ -103,8 +101,17 @@ public class ChangeDraftUpdate extends AbstractChangeUpdate { @Assisted("real") Account.Id realAccountId, @Assisted PersonIdent authorIdent, @Assisted Date when) { - super(migration, noteUtil, serverIdent, anonymousCowardName, notes, null, - accountId, realAccountId, authorIdent, when); + super( + migration, + noteUtil, + serverIdent, + anonymousCowardName, + notes, + null, + accountId, + realAccountId, + authorIdent, + when); this.draftsProject = allUsers; } @@ -120,8 +127,17 @@ public class ChangeDraftUpdate extends AbstractChangeUpdate { @Assisted("real") Account.Id realAccountId, @Assisted PersonIdent authorIdent, @Assisted Date when) { - super(migration, noteUtil, serverIdent, anonymousCowardName, null, change, - accountId, realAccountId, authorIdent, when); + super( + migration, + noteUtil, + serverIdent, + anonymousCowardName, + null, + change, + accountId, + realAccountId, + authorIdent, + when); this.draftsProject = allUsers; } @@ -139,12 +155,11 @@ public class ChangeDraftUpdate extends AbstractChangeUpdate { delete.add(new AutoValue_ChangeDraftUpdate_Key(revId, key)); } - private CommitBuilder storeCommentsInNotes(RevWalk rw, ObjectInserter ins, - ObjectId curr, CommitBuilder cb) + private CommitBuilder storeCommentsInNotes( + RevWalk rw, ObjectInserter ins, ObjectId curr, CommitBuilder cb) throws ConfigInvalidException, OrmException, IOException { RevisionNoteMap rnm = getRevisionNoteMap(rw, curr); - Set updatedRevs = - Sets.newHashSetWithExpectedSize(rnm.revisionNotes.size()); + Set updatedRevs = Sets.newHashSetWithExpectedSize(rnm.revisionNotes.size()); RevisionNoteBuilder.Cache cache = new RevisionNoteBuilder.Cache(rnm); for (Comment c : put) { @@ -193,21 +208,18 @@ public class ChangeDraftUpdate extends AbstractChangeUpdate { return cb; } - private RevisionNoteMap getRevisionNoteMap(RevWalk rw, - ObjectId curr) throws ConfigInvalidException, OrmException, IOException { + private RevisionNoteMap getRevisionNoteMap(RevWalk rw, ObjectId curr) + throws ConfigInvalidException, OrmException, IOException { if (migration.readChanges()) { // If reading from changes is enabled, then the old DraftCommentNotes // already parsed the revision notes. We can reuse them as long as the ref // hasn't advanced. ChangeNotes changeNotes = getNotes(); if (changeNotes != null) { - DraftCommentNotes draftNotes = - changeNotes.load().getDraftCommentNotes(); + DraftCommentNotes draftNotes = changeNotes.load().getDraftCommentNotes(); if (draftNotes != null) { - ObjectId idFromNotes = - firstNonNull(draftNotes.getRevision(), ObjectId.zeroId()); - RevisionNoteMap rnm = - draftNotes.getRevisionNoteMap(); + ObjectId idFromNotes = firstNonNull(draftNotes.getRevision(), ObjectId.zeroId()); + RevisionNoteMap rnm = draftNotes.getRevisionNoteMap(); if (idFromNotes.equals(curr) && rnm != null) { return rnm; } @@ -223,15 +235,12 @@ public class ChangeDraftUpdate extends AbstractChangeUpdate { // Even though reading from changes might not be enabled, we need to // parse any existing revision notes so we can merge them. return RevisionNoteMap.parse( - noteUtil, getId(), - rw.getObjectReader(), - noteMap, - PatchLineComment.Status.DRAFT); + noteUtil, getId(), rw.getObjectReader(), noteMap, PatchLineComment.Status.DRAFT); } @Override - protected CommitBuilder applyImpl(RevWalk rw, ObjectInserter ins, - ObjectId curr) throws OrmException, IOException { + protected CommitBuilder applyImpl(RevWalk rw, ObjectInserter ins, ObjectId curr) + throws OrmException, IOException { CommitBuilder cb = new CommitBuilder(); cb.setMessage("Update draft comments"); try { @@ -253,7 +262,6 @@ public class ChangeDraftUpdate extends AbstractChangeUpdate { @Override public boolean isEmpty() { - return delete.isEmpty() - && put.isEmpty(); + return delete.isEmpty() && put.isEmpty(); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNoteUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNoteUtil.java index d47e4622ab..425575e715 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNoteUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNoteUtil.java @@ -37,18 +37,6 @@ import com.google.gerrit.server.config.GerritServerId; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.inject.Inject; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.Config; -import org.eclipse.jgit.lib.PersonIdent; -import org.eclipse.jgit.revwalk.FooterKey; -import org.eclipse.jgit.util.GitDateFormatter; -import org.eclipse.jgit.util.GitDateFormatter.Format; -import org.eclipse.jgit.util.GitDateParser; -import org.eclipse.jgit.util.MutableInteger; -import org.eclipse.jgit.util.QuotedString; -import org.eclipse.jgit.util.RawParseUtils; - import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; @@ -61,6 +49,16 @@ import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Set; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.lib.PersonIdent; +import org.eclipse.jgit.revwalk.FooterKey; +import org.eclipse.jgit.util.GitDateFormatter; +import org.eclipse.jgit.util.GitDateFormatter.Format; +import org.eclipse.jgit.util.GitDateParser; +import org.eclipse.jgit.util.MutableInteger; +import org.eclipse.jgit.util.QuotedString; +import org.eclipse.jgit.util.RawParseUtils; public class ChangeNoteUtil { public static final FooterKey FOOTER_ASSIGNEE = new FooterKey("Assignee"); @@ -77,10 +75,8 @@ public class ChangeNoteUtil { public static final FooterKey FOOTER_REAL_USER = new FooterKey("Real-user"); public static final FooterKey FOOTER_STATUS = new FooterKey("Status"); public static final FooterKey FOOTER_SUBJECT = new FooterKey("Subject"); - public static final FooterKey FOOTER_SUBMISSION_ID = - new FooterKey("Submission-id"); - public static final FooterKey FOOTER_SUBMITTED_WITH = - new FooterKey("Submitted-with"); + public static final FooterKey FOOTER_SUBMISSION_ID = new FooterKey("Submission-id"); + public static final FooterKey FOOTER_SUBMITTED_WITH = new FooterKey("Submitted-with"); public static final FooterKey FOOTER_TOPIC = new FooterKey("Topic"); public static final FooterKey FOOTER_TAG = new FooterKey("Tag"); @@ -113,7 +109,8 @@ public class ChangeNoteUtil { private final boolean writeJson; @Inject - public ChangeNoteUtil(AccountCache accountCache, + public ChangeNoteUtil( + AccountCache accountCache, @GerritPersonIdent PersonIdent serverIdent, @AnonymousCowardName String anonymousCowardName, @GerritServerId String serverId, @@ -126,12 +123,13 @@ public class ChangeNoteUtil { } @VisibleForTesting - public PersonIdent newIdent(Account author, Date when, - PersonIdent serverIdent, String anonymousCowardName) { + public PersonIdent newIdent( + Account author, Date when, PersonIdent serverIdent, String anonymousCowardName) { return new PersonIdent( author.getName(anonymousCowardName), author.getId().get() + "@" + serverId, - when, serverIdent.getTimeZone()); + when, + serverIdent.getTimeZone()); } public boolean getWriteJson() { @@ -159,8 +157,7 @@ public class ChangeNoteUtil { } } } - throw parseException(changeId, "invalid identity, expected @%s: %s", - serverId, email); + throw parseException(changeId, "invalid identity, expected @%s: %s", serverId, email); } private static boolean match(byte[] note, MutableInteger p, byte[] expected) { @@ -168,8 +165,8 @@ public class ChangeNoteUtil { return m == p.value + expected.length; } - public List parseNote(byte[] note, MutableInteger p, - Change.Id changeId) throws ConfigInvalidException { + public List parseNote(byte[] note, MutableInteger p, Change.Id changeId) + throws ConfigInvalidException { if (p.value >= note.length) { return ImmutableList.of(); } @@ -201,30 +198,32 @@ public class ChangeNoteUtil { parentNumber = parseParentNumber(note, p, changeId); } } else if (psId == null) { - throw parseException(changeId, "missing %s or %s header", - PATCH_SET, BASE_PATCH_SET); + throw parseException(changeId, "missing %s or %s header", PATCH_SET, BASE_PATCH_SET); } - Comment c = parseComment( - note, p, fileName, psId, revId, isForBase, parentNumber); + Comment c = parseComment(note, p, fileName, psId, revId, isForBase, parentNumber); fileName = c.key.filename; if (!seen.add(c.key)) { - throw parseException( - changeId, "multiple comments for %s in note", c.key); + throw parseException(changeId, "multiple comments for %s in note", c.key); } result.add(c); } return result; } - private Comment parseComment(byte[] note, MutableInteger curr, - String currentFileName, PatchSet.Id psId, RevId revId, boolean isForBase, - Integer parentNumber) throws ConfigInvalidException { + private Comment parseComment( + byte[] note, + MutableInteger curr, + String currentFileName, + PatchSet.Id psId, + RevId revId, + boolean isForBase, + Integer parentNumber) + throws ConfigInvalidException { Change.Id changeId = psId.getParentKey(); // Check if there is a new file. - boolean newFile = - (RawParseUtils.match(note, curr.value, FILE.getBytes(UTF_8))) != -1; + boolean newFile = (RawParseUtils.match(note, curr.value, FILE.getBytes(UTF_8))) != -1; if (newFile) { // If so, parse the new file name. currentFileName = parseFilename(note, curr, changeId); @@ -240,31 +239,27 @@ public class ChangeNoteUtil { Timestamp commentTime = parseTimestamp(note, curr, changeId); Account.Id aId = parseAuthor(note, curr, changeId, AUTHOR); boolean hasRealAuthor = - (RawParseUtils.match(note, curr.value, REAL_AUTHOR.getBytes(UTF_8))) - != -1; + (RawParseUtils.match(note, curr.value, REAL_AUTHOR.getBytes(UTF_8))) != -1; Account.Id raId = null; if (hasRealAuthor) { raId = parseAuthor(note, curr, changeId, REAL_AUTHOR); } - boolean hasParent = - (RawParseUtils.match(note, curr.value, PARENT.getBytes(UTF_8))) != -1; + boolean hasParent = (RawParseUtils.match(note, curr.value, PARENT.getBytes(UTF_8))) != -1; String parentUUID = null; boolean unresolved = false; if (hasParent) { parentUUID = parseStringField(note, curr, changeId, PARENT); } boolean hasUnresolved = - (RawParseUtils.match(note, curr.value, - UNRESOLVED.getBytes(UTF_8))) != -1; + (RawParseUtils.match(note, curr.value, UNRESOLVED.getBytes(UTF_8))) != -1; if (hasUnresolved) { unresolved = parseBooleanField(note, curr, changeId, UNRESOLVED); } String uuid = parseStringField(note, curr, changeId, UUID); - boolean hasTag = - (RawParseUtils.match(note, curr.value, TAG.getBytes(UTF_8))) != -1; + boolean hasTag = (RawParseUtils.match(note, curr.value, TAG.getBytes(UTF_8))) != -1; String tag = null; if (hasTag) { tag = parseStringField(note, curr, changeId, TAG); @@ -272,20 +267,18 @@ public class ChangeNoteUtil { int commentLength = parseCommentLength(note, curr, changeId); - String message = RawParseUtils.decode( - UTF_8, note, curr.value, curr.value + commentLength); + String message = RawParseUtils.decode(UTF_8, note, curr.value, curr.value + commentLength); checkResult(message, "message contents", changeId); - Comment c = new Comment( - new Comment.Key(uuid, currentFileName, psId.get()), - aId, - commentTime, - isForBase - ? (short) (parentNumber == null ? 0 : -parentNumber) - : (short) 1, - message, - serverId, - unresolved); + Comment c = + new Comment( + new Comment.Key(uuid, currentFileName, psId.get()), + aId, + commentTime, + isForBase ? (short) (parentNumber == null ? 0 : -parentNumber) : (short) 1, + message, + serverId, + unresolved); c.lineNbr = range.getEndLine(); c.parentUuid = parentUUID; c.tag = tag; @@ -303,8 +296,9 @@ public class ChangeNoteUtil { return c; } - private static String parseStringField(byte[] note, MutableInteger curr, - Change.Id changeId, String fieldName) throws ConfigInvalidException { + private static String parseStringField( + byte[] note, MutableInteger curr, Change.Id changeId, String fieldName) + throws ConfigInvalidException { int endOfLine = RawParseUtils.nextLF(note, curr.value); checkHeaderLineFormat(note, curr, fieldName, changeId); int startOfField = RawParseUtils.endOfFooterLineKey(note, curr.value) + 2; @@ -313,11 +307,10 @@ public class ChangeNoteUtil { } /** - * @return a comment range. If the comment range line in the note only has - * one number, we return a CommentRange with that one number as the end - * line and the other fields as -1. If the comment range line in the note - * contains a whole comment range, then we return a CommentRange with all - * fields set. If the line is not correctly formatted, return null. + * @return a comment range. If the comment range line in the note only has one number, we return a + * CommentRange with that one number as the end line and the other fields as -1. If the + * comment range line in the note contains a whole comment range, then we return a + * CommentRange with all fields set. If the line is not correctly formatted, return null. */ private static CommentRange parseCommentRange(byte[] note, MutableInteger ptr) { CommentRange range = new CommentRange(-1, -1, -1, -1); @@ -372,14 +365,13 @@ public class ChangeNoteUtil { return range; } - private static PatchSet.Id parsePsId(byte[] note, MutableInteger curr, - Change.Id changeId, String fieldName) throws ConfigInvalidException { + private static PatchSet.Id parsePsId( + byte[] note, MutableInteger curr, Change.Id changeId, String fieldName) + throws ConfigInvalidException { checkHeaderLineFormat(note, curr, fieldName, changeId); - int startOfPsId = - RawParseUtils.endOfFooterLineKey(note, curr.value) + 1; + int startOfPsId = RawParseUtils.endOfFooterLineKey(note, curr.value) + 1; MutableInteger i = new MutableInteger(); - int patchSetId = - RawParseUtils.parseBase10(note, startOfPsId, i); + int patchSetId = RawParseUtils.parseBase10(note, startOfPsId, i); int endOfLine = RawParseUtils.nextLF(note, curr.value); if (i.value != endOfLine - 1) { throw parseException(changeId, "could not parse %s", fieldName); @@ -389,8 +381,8 @@ public class ChangeNoteUtil { return new PatchSet.Id(changeId, patchSetId); } - private static Integer parseParentNumber(byte[] note, MutableInteger curr, - Change.Id changeId) throws ConfigInvalidException { + private static Integer parseParentNumber(byte[] note, MutableInteger curr, Change.Id changeId) + throws ConfigInvalidException { checkHeaderLineFormat(note, curr, PARENT_NUMBER, changeId); int start = RawParseUtils.endOfFooterLineKey(note, curr.value) + 1; @@ -403,14 +395,12 @@ public class ChangeNoteUtil { checkResult(parentNumber, "parent number", changeId); curr.value = endOfLine; return Integer.valueOf(parentNumber); - } - private static String parseFilename(byte[] note, MutableInteger curr, - Change.Id changeId) throws ConfigInvalidException { + private static String parseFilename(byte[] note, MutableInteger curr, Change.Id changeId) + throws ConfigInvalidException { checkHeaderLineFormat(note, curr, FILE, changeId); - int startOfFileName = - RawParseUtils.endOfFooterLineKey(note, curr.value) + 2; + int startOfFileName = RawParseUtils.endOfFooterLineKey(note, curr.value) + 2; int endOfLine = RawParseUtils.nextLF(note, curr.value); curr.value = endOfLine; curr.value = RawParseUtils.nextLF(note, curr.value); @@ -418,15 +408,13 @@ public class ChangeNoteUtil { RawParseUtils.decode(UTF_8, note, startOfFileName, endOfLine - 1)); } - private static Timestamp parseTimestamp(byte[] note, MutableInteger curr, - Change.Id changeId) throws ConfigInvalidException { + private static Timestamp parseTimestamp(byte[] note, MutableInteger curr, Change.Id changeId) + throws ConfigInvalidException { int endOfLine = RawParseUtils.nextLF(note, curr.value); Timestamp commentTime; - String dateString = - RawParseUtils.decode(UTF_8, note, curr.value, endOfLine - 1); + String dateString = RawParseUtils.decode(UTF_8, note, curr.value, endOfLine - 1); try { - commentTime = new Timestamp( - GitDateParser.parse(dateString, null, Locale.US).getTime()); + commentTime = new Timestamp(GitDateParser.parse(dateString, null, Locale.US).getTime()); } catch (ParseException e) { throw new ConfigInvalidException("could not parse comment timestamp", e); } @@ -434,27 +422,24 @@ public class ChangeNoteUtil { return checkResult(commentTime, "comment timestamp", changeId); } - private Account.Id parseAuthor(byte[] note, MutableInteger curr, - Change.Id changeId, String fieldName) throws ConfigInvalidException { + private Account.Id parseAuthor( + byte[] note, MutableInteger curr, Change.Id changeId, String fieldName) + throws ConfigInvalidException { checkHeaderLineFormat(note, curr, fieldName, changeId); - int startOfAccountId = - RawParseUtils.endOfFooterLineKey(note, curr.value) + 2; - PersonIdent ident = - RawParseUtils.parsePersonIdent(note, startOfAccountId); + int startOfAccountId = RawParseUtils.endOfFooterLineKey(note, curr.value) + 2; + PersonIdent ident = RawParseUtils.parsePersonIdent(note, startOfAccountId); Account.Id aId = parseIdent(ident, changeId); curr.value = RawParseUtils.nextLF(note, curr.value); return checkResult(aId, fieldName, changeId); } - private static int parseCommentLength(byte[] note, MutableInteger curr, - Change.Id changeId) throws ConfigInvalidException { + private static int parseCommentLength(byte[] note, MutableInteger curr, Change.Id changeId) + throws ConfigInvalidException { checkHeaderLineFormat(note, curr, LENGTH, changeId); - int startOfLength = - RawParseUtils.endOfFooterLineKey(note, curr.value) + 1; + int startOfLength = RawParseUtils.endOfFooterLineKey(note, curr.value) + 1; MutableInteger i = new MutableInteger(); i.value = startOfLength; - int commentLength = - RawParseUtils.parseBase10(note, startOfLength, i); + int commentLength = RawParseUtils.parseBase10(note, startOfLength, i); if (i.value == startOfLength) { throw parseException(changeId, "could not parse %s", LENGTH); } @@ -466,19 +451,20 @@ public class ChangeNoteUtil { return checkResult(commentLength, "comment length", changeId); } - private boolean parseBooleanField(byte[] note, MutableInteger curr, - Change.Id changeId, String fieldName) throws ConfigInvalidException { + private boolean parseBooleanField( + byte[] note, MutableInteger curr, Change.Id changeId, String fieldName) + throws ConfigInvalidException { String str = parseStringField(note, curr, changeId, fieldName); if ("true".equalsIgnoreCase(str)) { return true; } else if ("false".equalsIgnoreCase(str)) { return false; - } - throw parseException(changeId, "invalid boolean for %s: %s", fieldName, str); + } + throw parseException(changeId, "invalid boolean for %s: %s", fieldName, str); } - private static T checkResult(T o, String fieldName, - Change.Id changeId) throws ConfigInvalidException { + private static T checkResult(T o, String fieldName, Change.Id changeId) + throws ConfigInvalidException { if (o == null) { throw parseException(changeId, "could not parse %s", fieldName); } @@ -493,18 +479,17 @@ public class ChangeNoteUtil { return i; } - private void appendHeaderField(PrintWriter writer, - String field, String value) { + private void appendHeaderField(PrintWriter writer, String field, String value) { writer.print(field); writer.print(": "); writer.print(value); writer.print('\n'); } - private static void checkHeaderLineFormat(byte[] note, MutableInteger curr, - String fieldName, Change.Id changeId) throws ConfigInvalidException { - boolean correct = - RawParseUtils.match(note, curr.value, fieldName.getBytes(UTF_8)) != -1; + private static void checkHeaderLineFormat( + byte[] note, MutableInteger curr, String fieldName, Change.Id changeId) + throws ConfigInvalidException { + boolean correct = RawParseUtils.match(note, curr.value, fieldName.getBytes(UTF_8)) != -1; int p = curr.value + fieldName.length(); correct &= (p < note.length && note[p] == ':'); p++; @@ -515,18 +500,16 @@ public class ChangeNoteUtil { } /** - * Build a note that contains the metadata for and the contents of all of the - * comments in the given comments. + * Build a note that contains the metadata for and the contents of all of the comments in the + * given comments. * - * @param comments Comments to be written to the output stream, keyed by patch - * set ID; multiple patch sets are allowed since base revisions may be - * shared across patch sets. All of the comments must share the same - * RevId, and all the comments for a given patch set must have the same - * side. + * @param comments Comments to be written to the output stream, keyed by patch set ID; multiple + * patch sets are allowed since base revisions may be shared across patch sets. All of the + * comments must share the same RevId, and all the comments for a given patch set must have + * the same side. * @param out output stream to write to. */ - void buildNote(ListMultimap comments, - OutputStream out) { + void buildNote(ListMultimap comments, OutputStream out) { if (comments.isEmpty()) { return; } @@ -544,10 +527,7 @@ public class ChangeNoteUtil { Comment first = psComments.get(0); short side = first.side; - appendHeaderField(writer, side <= 0 - ? BASE_PATCH_SET - : PATCH_SET, - Integer.toString(psId)); + appendHeaderField(writer, side <= 0 ? BASE_PATCH_SET : PATCH_SET, Integer.toString(psId)); if (side < 0) { appendHeaderField(writer, PARENT_NUMBER, Integer.toString(-side)); } @@ -555,14 +535,20 @@ public class ChangeNoteUtil { String currentFilename = null; for (Comment c : psComments) { - checkArgument(revId.equals(c.revId), + checkArgument( + revId.equals(c.revId), "All comments being added must have all the same RevId. The " - + "comment below does not have the same RevId as the others " - + "(%s).\n%s", revId, c); - checkArgument(side == c.side, + + "comment below does not have the same RevId as the others " + + "(%s).\n%s", + revId, + c); + checkArgument( + side == c.side, "All comments being added must all have the same side. The " - + "comment below does not have the same side as the others " - + "(%s).\n%s", side, c); + + "comment below does not have the same side as the others " + + "(%s).\n%s", + side, + c); String commentFilename = QuotedString.GIT_PATH.quote(c.key.filename); if (!commentFilename.equals(currentFilename)) { @@ -617,18 +603,15 @@ public class ChangeNoteUtil { } byte[] messageBytes = c.message.getBytes(UTF_8); - appendHeaderField(writer, LENGTH, - Integer.toString(messageBytes.length)); + appendHeaderField(writer, LENGTH, Integer.toString(messageBytes.length)); writer.print(c.message); writer.print("\n\n"); } - private void appendIdent(PrintWriter writer, String header, Account.Id id, - Timestamp ts) { - PersonIdent ident = newIdent( - accountCache.get(id).getAccount(), - ts, serverIdent, anonymousCowardName); + private void appendIdent(PrintWriter writer, String header, Account.Id id, Timestamp ts) { + PersonIdent ident = + newIdent(accountCache.get(id).getAccount(), ts, serverIdent, anonymousCowardName); StringBuilder name = new StringBuilder(); PersonIdent.appendSanitized(name, ident.getName()); name.append(" <"); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java index ee9f4f796f..b15874ddb8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java @@ -62,14 +62,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.Ref; -import org.eclipse.jgit.lib.Repository; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.util.ArrayList; import java.util.Collection; @@ -79,6 +71,12 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.function.Predicate; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.lib.Repository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** View of a single {@link Change} based on the log of its notes branch. */ public class ChangeNotes extends AbstractChangeNotes { @@ -90,14 +88,12 @@ public class ChangeNotes extends AbstractChangeNotes { public static final Ordering MESSAGE_BY_TIME = Ordering.from(comparing(ChangeMessage::getWrittenOn)); - public static ConfigInvalidException parseException(Change.Id changeId, - String fmt, Object... args) { - return new ConfigInvalidException("Change " + changeId + ": " - + String.format(fmt, args)); + public static ConfigInvalidException parseException( + Change.Id changeId, String fmt, Object... args) { + return new ConfigInvalidException("Change " + changeId + ": " + String.format(fmt, args)); } - public static Change readOneReviewDbChange(ReviewDb db, Change.Id id) - throws OrmException { + public static Change readOneReviewDbChange(ReviewDb db, Change.Id id) throws OrmException { return ReviewDbUtil.unwrapDb(db).changes().get(id); } @@ -109,21 +105,19 @@ public class ChangeNotes extends AbstractChangeNotes { @VisibleForTesting @Inject - public Factory(Args args, - Provider queryProvider, - ProjectCache projectCache) { + public Factory( + Args args, Provider queryProvider, ProjectCache projectCache) { this.args = args; this.queryProvider = queryProvider; this.projectCache = projectCache; } - public ChangeNotes createChecked(ReviewDb db, Change c) - throws OrmException { + public ChangeNotes createChecked(ReviewDb db, Change c) throws OrmException { return createChecked(db, c.getProject(), c.getId()); } - public ChangeNotes createChecked(ReviewDb db, Project.NameKey project, - Change.Id changeId) throws OrmException { + public ChangeNotes createChecked(ReviewDb db, Project.NameKey project, Change.Id changeId) + throws OrmException { Change change = readOneReviewDbChange(db, changeId); if (change == null) { if (!args.migration.readChanges()) { @@ -145,25 +139,22 @@ public class ChangeNotes extends AbstractChangeNotes { throw new NoSuchChangeException(changeId); } if (changes.size() != 1) { - log.error( - String.format("Multiple changes found for %d", changeId.get())); + log.error(String.format("Multiple changes found for %d", changeId.get())); throw new NoSuchChangeException(changeId); } return changes.get(0).notes(); } - public static Change newNoteDbOnlyChange( - Project.NameKey project, Change.Id changeId) { - Change change = new Change( - null, changeId, null, - new Branch.NameKey(project, "INVALID_NOTE_DB_ONLY"), - null); + public static Change newNoteDbOnlyChange(Project.NameKey project, Change.Id changeId) { + Change change = + new Change( + null, changeId, null, new Branch.NameKey(project, "INVALID_NOTE_DB_ONLY"), null); change.setNoteDbState(NoteDbChangeState.NOTE_DB_PRIMARY_STATE); return change; } - private Change loadChangeFromDb(ReviewDb db, Project.NameKey project, - Change.Id changeId) throws OrmException { + private Change loadChangeFromDb(ReviewDb db, Project.NameKey project, Change.Id changeId) + throws OrmException { checkArgument(project != null, "project is required"); Change change = readOneReviewDbChange(db, changeId); @@ -173,10 +164,12 @@ public class ChangeNotes extends AbstractChangeNotes { change = newNoteDbOnlyChange(project, changeId); } else { checkNotNull(change, "change %s not found in ReviewDb", changeId); - checkArgument(change.getProject().equals(project), - "passed project %s when creating ChangeNotes for %s, but actual" - + " project is %s", - project, changeId, change.getProject()); + checkArgument( + change.getProject().equals(project), + "passed project %s when creating ChangeNotes for %s, but actual" + " project is %s", + project, + changeId, + change.getProject()); } // TODO: Throw NoSuchChangeException when the change is not found in the @@ -184,22 +177,20 @@ public class ChangeNotes extends AbstractChangeNotes { return change; } - public ChangeNotes create(ReviewDb db, Project.NameKey project, - Change.Id changeId) throws OrmException { - return new ChangeNotes(args, loadChangeFromDb(db, project, changeId)) + public ChangeNotes create(ReviewDb db, Project.NameKey project, Change.Id changeId) + throws OrmException { + return new ChangeNotes(args, loadChangeFromDb(db, project, changeId)).load(); + } + + public ChangeNotes createWithAutoRebuildingDisabled( + ReviewDb db, Project.NameKey project, Change.Id changeId) throws OrmException { + return new ChangeNotes(args, loadChangeFromDb(db, project, changeId), true, false, null) .load(); } - public ChangeNotes createWithAutoRebuildingDisabled(ReviewDb db, - Project.NameKey project, Change.Id changeId) throws OrmException { - return new ChangeNotes( - args, loadChangeFromDb(db, project, changeId), true, false, null).load(); - } - /** - * Create change notes for a change that was loaded from index. This method - * should only be used when database access is harmful and potentially stale - * data from the index is acceptable. + * Create change notes for a change that was loaded from index. This method should only be used + * when database access is harmful and potentially stale data from the index is acceptable. * * @param change change loaded from secondary index * @return change notes @@ -213,25 +204,24 @@ public class ChangeNotes extends AbstractChangeNotes { return new ChangeNotes(args, change, shouldExist, false, null).load(); } - public ChangeNotes createWithAutoRebuildingDisabled(Change change, - RefCache refs) throws OrmException { + public ChangeNotes createWithAutoRebuildingDisabled(Change change, RefCache refs) + throws OrmException { return new ChangeNotes(args, change, true, false, refs).load(); } // TODO(ekempin): Remove when database backend is deleted /** - * Instantiate ChangeNotes for a change that has been loaded by a batch read - * from the database. + * Instantiate ChangeNotes for a change that has been loaded by a batch read from the database. */ - private ChangeNotes createFromChangeOnlyWhenNoteDbDisabled(Change change) - throws OrmException { - checkState(!args.migration.readChanges(), "do not call" - + " createFromChangeWhenNoteDbDisabled when NoteDb is enabled"); + private ChangeNotes createFromChangeOnlyWhenNoteDbDisabled(Change change) throws OrmException { + checkState( + !args.migration.readChanges(), + "do not call" + " createFromChangeWhenNoteDbDisabled when NoteDb is enabled"); return new ChangeNotes(args, change).load(); } - public List create(ReviewDb db, - Collection changeIds) throws OrmException { + public List create(ReviewDb db, Collection changeIds) + throws OrmException { List notes = new ArrayList<>(); if (args.migration.enabled()) { for (Change.Id changeId : changeIds) { @@ -250,8 +240,11 @@ public class ChangeNotes extends AbstractChangeNotes { return notes; } - public List create(ReviewDb db, Project.NameKey project, - Collection changeIds, Predicate predicate) + public List create( + ReviewDb db, + Project.NameKey project, + Collection changeIds, + Predicate predicate) throws OrmException { List notes = new ArrayList<>(); if (args.migration.enabled()) { @@ -275,8 +268,8 @@ public class ChangeNotes extends AbstractChangeNotes { return notes; } - public ListMultimap create(ReviewDb db, - Predicate predicate) throws IOException, OrmException { + public ListMultimap create( + ReviewDb db, Predicate predicate) throws IOException, OrmException { ListMultimap m = MultimapBuilder.hashKeys().arrayListValues().build(); if (args.migration.readChanges()) { @@ -301,8 +294,8 @@ public class ChangeNotes extends AbstractChangeNotes { return ImmutableListMultimap.copyOf(m); } - public List scan(Repository repo, ReviewDb db, - Project.NameKey project) throws OrmException, IOException { + public List scan(Repository repo, ReviewDb db, Project.NameKey project) + throws OrmException, IOException { if (!args.migration.readChanges()) { return scanDb(repo, db); } @@ -324,8 +317,8 @@ public class ChangeNotes extends AbstractChangeNotes { return notes; } - private List scanNoteDb(Repository repo, ReviewDb db, - Project.NameKey project) throws OrmException, IOException { + private List scanNoteDb(Repository repo, ReviewDb db, Project.NameKey project) + throws OrmException, IOException { Set ids = scan(repo); List changeNotes = new ArrayList<>(ids.size()); PrimaryStorage defaultStorage = args.migration.changePrimaryStorage(); @@ -333,30 +326,28 @@ public class ChangeNotes extends AbstractChangeNotes { Change change = readOneReviewDbChange(db, id); if (change == null) { if (defaultStorage == PrimaryStorage.REVIEW_DB) { - log.warn("skipping change {} found in project {} " + - "but not in ReviewDb", - id, project); + log.warn( + "skipping change {} found in project {} " + "but not in ReviewDb", id, project); continue; } // TODO(dborowitz): See discussion in BatchUpdate#newChangeContext. change = newNoteDbOnlyChange(project, id); } else if (!change.getProject().equals(project)) { log.error( - "skipping change {} found in project {} " + - "because ReviewDb change has project {}", - id, project, change.getProject()); + "skipping change {} found in project {} " + "because ReviewDb change has project {}", + id, + project, + change.getProject()); continue; } log.debug("adding change {} found in project {}", id, project); changeNotes.add(new ChangeNotes(args, change).load()); - } return changeNotes; } public static Set scan(Repository repo) throws IOException { - Map refs = - repo.getRefDatabase().getRefs(RefNames.REFS_CHANGES); + Map refs = repo.getRefDatabase().getRefs(RefNames.REFS_CHANGES); Set ids = new HashSet<>(refs.size()); for (Ref r : refs.values()) { Change.Id id = Change.Id.fromRef(r.getName()); @@ -393,8 +384,8 @@ public class ChangeNotes extends AbstractChangeNotes { this(args, change, true, true, null); } - private ChangeNotes(Args args, Change change, boolean shouldExist, - boolean autoRebuild, @Nullable RefCache refs) { + private ChangeNotes( + Args args, Change change, boolean shouldExist, boolean autoRebuild, @Nullable RefCache refs) { super(args, change.getId(), PrimaryStorage.of(change), autoRebuild); this.change = new Change(change); this.shouldExist = shouldExist; @@ -441,32 +432,24 @@ public class ChangeNotes extends AbstractChangeNotes { return state.reviewerUpdates(); } - /** - * @return an ImmutableSet of Account.Ids of all users that have been assigned - * to this change. - */ + /** @return an ImmutableSet of Account.Ids of all users that have been assigned to this change. */ public ImmutableSet getPastAssignees() { return state.pastAssignees(); } - /** - * @return a ImmutableSet of all hashtags for this change sorted in - * alphabetical order. - */ + /** @return a ImmutableSet of all hashtags for this change sorted in alphabetical order. */ public ImmutableSet getHashtags() { return ImmutableSortedSet.copyOf(state.hashtags()); } - /** - * @return a list of all users who have ever been a reviewer on this change. - */ + /** @return a list of all users who have ever been a reviewer on this change. */ public ImmutableList getAllPastReviewers() { return state.allPastReviewers(); } /** - * @return submit records stored during the most recent submit; only for - * changes that were actually submitted. + * @return submit records stored during the most recent submit; only for changes that were + * actually submitted. */ public ImmutableList getSubmitRecords() { return state.submitRecords(); @@ -477,12 +460,8 @@ public class ChangeNotes extends AbstractChangeNotes { return state.allChangeMessages(); } - /** - * @return change messages by patch set, in chronological order, oldest - * first. - */ - public ImmutableListMultimap - getChangeMessagesByPatchSet() { + /** @return change messages by patch set, in chronological order, oldest first. */ + public ImmutableListMultimap getChangeMessagesByPatchSet() { return state.changeMessagesByPatchSet(); } @@ -502,8 +481,8 @@ public class ChangeNotes extends AbstractChangeNotes { return commentKeys; } - public ImmutableListMultimap getDraftComments( - Account.Id author) throws OrmException { + public ImmutableListMultimap getDraftComments(Account.Id author) + throws OrmException { return getDraftComments(author, null); } @@ -515,29 +494,23 @@ public class ChangeNotes extends AbstractChangeNotes { // during the publish operation failed. return ImmutableListMultimap.copyOf( Multimaps.filterEntries( - draftCommentNotes.getComments(), - e -> !getCommentKeys().contains(e.getValue().key))); + draftCommentNotes.getComments(), e -> !getCommentKeys().contains(e.getValue().key))); } - public ImmutableListMultimap getRobotComments() - throws OrmException { + public ImmutableListMultimap getRobotComments() throws OrmException { loadRobotComments(); return robotCommentNotes.getComments(); } /** - * If draft comments have already been loaded for this author, then they will - * not be reloaded. However, this method will load the comments if no draft - * comments have been loaded or if the caller would like the drafts for - * another author. + * If draft comments have already been loaded for this author, then they will not be reloaded. + * However, this method will load the comments if no draft comments have been loaded or if the + * caller would like the drafts for another author. */ - private void loadDraftComments(Account.Id author, @Nullable Ref ref) - throws OrmException { - if (draftCommentNotes == null - || !author.equals(draftCommentNotes.getAuthor()) - || ref != null) { - draftCommentNotes = new DraftCommentNotes( - args, change, author, autoRebuild, rebuildResult, ref); + private void loadDraftComments(Account.Id author, @Nullable Ref ref) throws OrmException { + if (draftCommentNotes == null || !author.equals(draftCommentNotes.getAuthor()) || ref != null) { + draftCommentNotes = + new DraftCommentNotes(args, change, author, autoRebuild, rebuildResult, ref); draftCommentNotes.load(); } } @@ -582,8 +555,7 @@ public class ChangeNotes extends AbstractChangeNotes { public PatchSet getCurrentPatchSet() { PatchSet.Id psId = change.currentPatchSetId(); - return checkNotNull(getPatchSets().get(psId), - "missing current patch set %s", psId.get()); + return checkNotNull(getPatchSets().get(psId), "missing current patch set %s", psId.get()); } @Override @@ -600,8 +572,8 @@ public class ChangeNotes extends AbstractChangeNotes { return; } - ChangeNotesCache.Value v = args.cache.get().get( - getProjectName(), getChangeId(), rev, handle.walk()); + ChangeNotesCache.Value v = + args.cache.get().get(getProjectName(), getChangeId(), rev, handle.walk()); state = v.state(); state.copyColumnsTo(change); revisionNoteMap = v.revisionNoteMap(); @@ -619,14 +591,11 @@ public class ChangeNotes extends AbstractChangeNotes { @Override protected ObjectId readRef(Repository repo) throws IOException { - return refs != null - ? refs.get(getRefName()).orElse(null) - : super.readRef(repo); + return refs != null ? refs.get(getRefName()).orElse(null) : super.readRef(repo); } @Override - protected LoadHandle openHandle(Repository repo) - throws NoSuchChangeException, IOException { + protected LoadHandle openHandle(Repository repo) throws NoSuchChangeException, IOException { if (autoRebuild) { NoteDbChangeState state = NoteDbChangeState.parse(change); ObjectId id = readRef(repo); @@ -645,8 +614,7 @@ public class ChangeNotes extends AbstractChangeNotes { return super.openHandle(repo); } - private LoadHandle rebuildAndOpen(Repository repo, ObjectId oldId) - throws IOException { + private LoadHandle rebuildAndOpen(Repository repo, ObjectId oldId) throws IOException { Timer1.Context timer = args.metrics.autoRebuildLatency.start(CHANGES); try { Change.Id cid = getChangeId(); @@ -672,27 +640,26 @@ public class ChangeNotes extends AbstractChangeNotes { // // Parse notes from the staged result so we can return something useful // to the caller instead of throwing. - log.debug("Rebuilding change {} failed: {}", - getChangeId(), e.getMessage()); + log.debug("Rebuilding change {} failed: {}", getChangeId(), e.getMessage()); args.metrics.autoRebuildFailureCount.increment(CHANGES); rebuildResult = checkNotNull(r); checkNotNull(r.newState()); checkNotNull(r.staged()); return LoadHandle.create( - ChangeNotesCommit.newStagedRevWalk( - repo, r.staged().changeObjects()), + ChangeNotesCommit.newStagedRevWalk(repo, r.staged().changeObjects()), r.newState().getChangeMetaId()); } } - return LoadHandle.create( - ChangeNotesCommit.newRevWalk(repo), r.newState().getChangeMetaId()); + return LoadHandle.create(ChangeNotesCommit.newRevWalk(repo), r.newState().getChangeMetaId()); } catch (NoSuchChangeException e) { return super.openHandle(repo, oldId); } catch (OrmException e) { throw new IOException(e); } finally { - log.debug("Rebuilt change {} in project {} in {} ms", - getChangeId(), getProjectName(), + log.debug( + "Rebuilt change {} in project {} in {} ms", + getChangeId(), + getProjectName(), TimeUnit.MILLISECONDS.convert(timer.stop(), TimeUnit.NANOSECONDS)); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesCache.java index 92ad17d17a..9626911d16 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesCache.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesCache.java @@ -28,32 +28,27 @@ import com.google.inject.Inject; import com.google.inject.Module; import com.google.inject.Singleton; import com.google.inject.name.Named; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.ObjectId; - import java.io.IOException; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.ObjectId; @Singleton public class ChangeNotesCache { - @VisibleForTesting - static final String CACHE_NAME = "change_notes"; + @VisibleForTesting static final String CACHE_NAME = "change_notes"; public static Module module() { return new CacheModule() { @Override protected void configure() { bind(ChangeNotesCache.class); - cache(CACHE_NAME, - Key.class, - ChangeNotesState.class) - .weigher(Weigher.class) - .maximumWeight(10 << 20); + cache(CACHE_NAME, Key.class, ChangeNotesState.class) + .weigher(Weigher.class) + .maximumWeight(10 << 20); } }; } @@ -61,12 +56,13 @@ public class ChangeNotesCache { @AutoValue public abstract static class Key { abstract Project.NameKey project(); + abstract Change.Id changeId(); + abstract ObjectId id(); } - public static class Weigher - implements com.google.common.cache.Weigher { + public static class Weigher implements com.google.common.cache.Weigher { // Single object overhead. private static final int O = 16; @@ -85,31 +81,48 @@ public class ChangeNotesCache { // estimated average element sizes rather than iterating over collections. // Numbers are largely hand-wavy based on // http://stackoverflow.com/questions/258120/what-is-the-memory-consumption-of-an-object-in-java - return - P + O + 20 // metaId + return P + + O + + 20 // metaId + K // changeId + str(40) // changeKey + T // createdOn + T // lastUpdatedOn - + P + K // owner - + P + str(state.columns().branch()) - + P + patchSetId() // currentPatchSetId - + P + str(state.columns().subject()) - + P + str(state.columns().topic()) - + P + str(state.columns().originalSubject()) - + P + str(state.columns().submissionId()) + + P + + K // owner + + P + + str(state.columns().branch()) + + P + + patchSetId() // currentPatchSetId + + P + + str(state.columns().subject()) + + P + + str(state.columns().topic()) + + P + + str(state.columns().originalSubject()) + + P + + str(state.columns().submissionId()) + ptr(state.columns().assignee(), K) // assignee + P // status - + P + set(state.pastAssignees(), K) - + P + set(state.hashtags(), str(10)) - + P + list(state.patchSets(), patchSet()) - + P + list(state.allPastReviewers(), approval()) - + P + list(state.reviewerUpdates(), 4 * O + K + K + P) - + P + list(state.submitRecords(), P + list(2, str(4) + P + K) + P) - + P + list(state.allChangeMessages(), changeMessage()) + + P + + set(state.pastAssignees(), K) + + P + + set(state.hashtags(), str(10)) + + P + + list(state.patchSets(), patchSet()) + + P + + list(state.allPastReviewers(), approval()) + + P + + list(state.reviewerUpdates(), 4 * O + K + K + P) + + P + + list(state.submitRecords(), P + list(2, str(4) + P + K) + P) + + P + + list(state.allChangeMessages(), changeMessage()) // Just key overhead for map, already counted messages in previous. - + P + map(state.changeMessagesByPatchSet().asMap(), patchSetId()) - + P + map(state.publishedComments().asMap(), comment()); + + P + + map(state.changeMessagesByPatchSet().asMap(), patchSetId()) + + P + + map(state.publishedComments().asMap(), comment()); } private static int ptr(Object o, int size) { @@ -165,10 +178,13 @@ public class ChangeNotesCache { private static int patchSet() { return O - + P + patchSetId() + + P + + patchSetId() + str(40) // revision - + P + K // uploader - + P + T // createdOn + + P + + K // uploader + + P + + T // createdOn + 1 // draft + str(40) // groups + P; // pushCertificate @@ -176,9 +192,16 @@ public class ChangeNotesCache { private static int approval() { return O - + P + patchSetId() + P + K + P + O + str(10) + + P + + patchSetId() + + P + + K + + P + + O + + str(10) + 2 // value - + P + T // granted + + P + + T // granted + P // tag + P; // realAccountId } @@ -186,11 +209,15 @@ public class ChangeNotesCache { private static int changeMessage() { int key = K + str(20); return O - + P + key - + P + K // author - + P + T // writtenON + + P + + key + + P + + K // author + + P + + T // writtenON + str(64) // message - + P + patchSetId() + + P + + patchSetId() + P + P; // realAuthor } @@ -199,18 +226,24 @@ public class ChangeNotesCache { int key = P + str(20) + P + str(32) + 4; int ident = O + 4; return O - + P + key + + P + + key + 4 // lineNbr - + P + ident // author - + P + ident //realAuthor - + P + T // writtenOn + + P + + ident // author + + P + + ident //realAuthor + + P + + T // writtenOn + 2 // side + str(32) // message + str(10) // parentUuid + (P + O + 4 + 4 + 4 + 4) / 2 // range on 50% of comments + P // tag - + P + str(40) // revId - + P + str(36); // serverId + + P + + str(40) // revId + + P + + str(36); // serverId } } @@ -220,13 +253,13 @@ public class ChangeNotesCache { /** * The {@link RevisionNoteMap} produced while parsing this change. - *

- * These instances are mutable and non-threadsafe, so it is only safe to - * return it to the caller that actually incurred the cache miss. It is only - * used as an optimization; {@link ChangeNotes} is capable of lazily loading - * it as necessary. + * + *

These instances are mutable and non-threadsafe, so it is only safe to return it to the + * caller that actually incurred the cache miss. It is only used as an optimization; {@link + * ChangeNotes} is capable of lazily loading it as necessary. */ - @Nullable abstract RevisionNoteMap revisionNoteMap(); + @Nullable + abstract RevisionNoteMap revisionNoteMap(); } private class Loader implements Callable { @@ -242,8 +275,8 @@ public class ChangeNotesCache { @Override public ChangeNotesState call() throws ConfigInvalidException, IOException { - ChangeNotesParser parser = new ChangeNotesParser( - key.changeId(), key.id(), rw, args.noteUtil, args.metrics); + ChangeNotesParser parser = + new ChangeNotesParser(key.changeId(), key.id(), rw, args.noteUtil, args.metrics); ChangeNotesState result = parser.parseAll(); // This assignment only happens if call() was actually called, which only // happens when Cache#get(K, Callable) incurs a cache miss. @@ -256,23 +289,21 @@ public class ChangeNotesCache { private final Args args; @Inject - ChangeNotesCache( - @Named(CACHE_NAME) Cache cache, - Args args) { + ChangeNotesCache(@Named(CACHE_NAME) Cache cache, Args args) { this.cache = cache; this.args = args; } - Value get(Project.NameKey project, Change.Id changeId, - ObjectId metaId, ChangeNotesRevWalk rw) throws IOException { + Value get(Project.NameKey project, Change.Id changeId, ObjectId metaId, ChangeNotesRevWalk rw) + throws IOException { try { - Key key = - new AutoValue_ChangeNotesCache_Key(project, changeId, metaId.copy()); + Key key = new AutoValue_ChangeNotesCache_Key(project, changeId, metaId.copy()); Loader loader = new Loader(key, rw); ChangeNotesState s = cache.get(key, loader); return new AutoValue_ChangeNotesCache_Value(s, loader.revisionNoteMap); } catch (ExecutionException e) { - throw new IOException(String.format( + throw new IOException( + String.format( "Error loading %s in %s at %s", RefNames.changeMetaRef(changeId), project, metaId.name()), e); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesCommit.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesCommit.java index 4dd272d520..78f6afc087 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesCommit.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesCommit.java @@ -20,7 +20,8 @@ import com.google.common.collect.ListMultimap; import com.google.common.collect.MultimapBuilder; import com.google.gerrit.server.git.InMemoryInserter; import com.google.gerrit.server.git.InsertedObject; - +import java.io.IOException; +import java.util.List; import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.lib.AnyObjectId; @@ -31,15 +32,14 @@ import org.eclipse.jgit.revwalk.FooterLine; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; -import java.io.IOException; -import java.util.List; - /** * Commit implementation with some optimizations for change notes parsing. + * *

+ * *

    - *
  • Caches the result of {@link #getFooterLines()}, which is - * otherwise very wasteful with allocations.
  • + *
  • Caches the result of {@link #getFooterLines()}, which is otherwise very wasteful with + * allocations. *
*/ public class ChangeNotesCommit extends RevCommit { @@ -47,8 +47,8 @@ public class ChangeNotesCommit extends RevCommit { return new ChangeNotesRevWalk(repo); } - public static ChangeNotesRevWalk newStagedRevWalk(Repository repo, - Iterable stagedObjs) { + public static ChangeNotesRevWalk newStagedRevWalk( + Repository repo, Iterable stagedObjs) { final InMemoryInserter ins = new InMemoryInserter(repo); for (InsertedObject obj : stagedObjs) { ins.insert(obj); @@ -77,21 +77,21 @@ public class ChangeNotesCommit extends RevCommit { } @Override - public ChangeNotesCommit next() throws MissingObjectException, - IncorrectObjectTypeException, IOException { + public ChangeNotesCommit next() + throws MissingObjectException, IncorrectObjectTypeException, IOException { return (ChangeNotesCommit) super.next(); } @Override - public void markStart(RevCommit c) throws MissingObjectException, - IncorrectObjectTypeException, IOException { + public void markStart(RevCommit c) + throws MissingObjectException, IncorrectObjectTypeException, IOException { checkArgument(c instanceof ChangeNotesCommit); super.markStart(c); } @Override - public void markUninteresting(RevCommit c) throws MissingObjectException, - IncorrectObjectTypeException, IOException { + public void markUninteresting(RevCommit c) + throws MissingObjectException, IncorrectObjectTypeException, IOException { checkArgument(c instanceof ChangeNotesCommit); super.markUninteresting(c); } @@ -103,8 +103,7 @@ public class ChangeNotesCommit extends RevCommit { @Override public ChangeNotesCommit parseCommit(AnyObjectId id) - throws MissingObjectException, IncorrectObjectTypeException, - IOException { + throws MissingObjectException, IncorrectObjectTypeException, IOException { return (ChangeNotesCommit) super.parseCommit(id); } } @@ -118,8 +117,7 @@ public class ChangeNotesCommit extends RevCommit { public List getFooterLineValues(FooterKey key) { if (footerLines == null) { List src = getFooterLines(); - footerLines = - MultimapBuilder.hashKeys(src.size()).arrayListValues(1).build(); + footerLines = MultimapBuilder.hashKeys(src.size()).arrayListValues(1).build(); for (FooterLine fl : src) { footerLines.put(fl.getKey().toLowerCase(), fl.getValue()); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesParser.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesParser.java index 07de73315d..3a817e4e01 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesParser.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesParser.java @@ -65,18 +65,6 @@ import com.google.gerrit.server.ReviewerSet; import com.google.gerrit.server.ReviewerStatusUpdate; import com.google.gerrit.server.notedb.ChangeNotesCommit.ChangeNotesRevWalk; import com.google.gerrit.server.util.LabelVote; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.errors.InvalidObjectIdException; -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.ObjectReader; -import org.eclipse.jgit.lib.PersonIdent; -import org.eclipse.jgit.notes.NoteMap; -import org.eclipse.jgit.revwalk.FooterKey; -import org.eclipse.jgit.util.RawParseUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.nio.charset.Charset; import java.sql.Timestamp; @@ -94,26 +82,34 @@ import java.util.Optional; import java.util.Set; import java.util.TreeSet; import java.util.function.Function; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.errors.InvalidObjectIdException; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.ObjectReader; +import org.eclipse.jgit.lib.PersonIdent; +import org.eclipse.jgit.notes.NoteMap; +import org.eclipse.jgit.revwalk.FooterKey; +import org.eclipse.jgit.util.RawParseUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; class ChangeNotesParser { - private static final Logger log = - LoggerFactory.getLogger(ChangeNotesParser.class); + private static final Logger log = LoggerFactory.getLogger(ChangeNotesParser.class); // Sentinel RevId indicating a mutable field on a patch set was parsed, but // the parser does not yet know its commit SHA-1. - private static final RevId PARTIAL_PATCH_SET = - new RevId("INVALID PARTIAL PATCH SET"); + private static final RevId PARTIAL_PATCH_SET = new RevId("INVALID PARTIAL PATCH SET"); @AutoValue abstract static class ApprovalKey { abstract PatchSet.Id psId(); + abstract Account.Id accountId(); + abstract String label(); - private static ApprovalKey create(PatchSet.Id psId, Account.Id accountId, - String label) { - return new AutoValue_ChangeNotesParser_ApprovalKey( - psId, accountId, label); + private static ApprovalKey create(PatchSet.Id psId, Account.Id accountId, String label) { + return new AutoValue_ChangeNotesParser_ApprovalKey(psId, accountId, label); } } @@ -138,8 +134,7 @@ class ChangeNotesParser { private final Map approvals; private final List bufferedApprovals; private final List allChangeMessages; - private final ListMultimap - changeMessagesByPatchSet; + private final ListMultimap changeMessagesByPatchSet; // Non-final private members filled in during the parsing process. private String branch; @@ -158,8 +153,12 @@ class ChangeNotesParser { private String tag; private RevisionNoteMap revisionNoteMap; - ChangeNotesParser(Change.Id changeId, ObjectId tip, ChangeNotesRevWalk walk, - ChangeNoteUtil noteUtil, NoteDbMetrics metrics) { + ChangeNotesParser( + Change.Id changeId, + ObjectId tip, + ChangeNotesRevWalk walk, + ChangeNoteUtil noteUtil, + NoteDbMetrics metrics) { this.id = changeId; this.tip = tip; this.walk = walk; @@ -180,8 +179,7 @@ class ChangeNotesParser { currentPatchSets = new ArrayList<>(); } - ChangeNotesState parseAll() - throws ConfigInvalidException, IOException { + ChangeNotesState parseAll() throws ConfigInvalidException, IOException { // Don't include initial parse in timer, as this might do more I/O to page // in the block containing most commits. Later reads are not guaranteed to // avoid I/O, but often should. @@ -224,7 +222,6 @@ class ChangeNotesParser { submissionId, assignee != null ? assignee.orElse(null) : null, status, - Sets.newLinkedHashSet(Lists.reverse(pastAssignees)), hashtags, patchSets, @@ -271,8 +268,7 @@ class ChangeNotesParser { List result = new ArrayList<>(); HashMap lastState = new HashMap<>(); for (ReviewerStatusUpdate u : Lists.reverse(reviewerUpdates)) { - if (!Objects.equals(ownerId, u.reviewer()) && - lastState.get(u.reviewer()) != u.state()) { + if (!Objects.equals(ownerId, u.reviewer()) && lastState.get(u.reviewer()) != u.state()) { result.add(u); lastState.put(u.reviewer(), u.state()); } @@ -285,16 +281,14 @@ class ChangeNotesParser { } private ListMultimap buildMessagesByPatchSet() { - for (Collection v : - changeMessagesByPatchSet.asMap().values()) { + for (Collection v : changeMessagesByPatchSet.asMap().values()) { Collections.reverse((List) v); } return changeMessagesByPatchSet; } private void parse(ChangeNotesCommit commit) throws ConfigInvalidException { - Timestamp ts = - new Timestamp(commit.getCommitterIdent().getWhen().getTime()); + Timestamp ts = new Timestamp(commit.getCommitterIdent().getWhen().getTime()); createdOn = ts; parseTag(commit); @@ -382,29 +376,25 @@ class ChangeNotesParser { parseDescription(psId, commit); } - private String parseSubmissionId(ChangeNotesCommit commit) - throws ConfigInvalidException { + private String parseSubmissionId(ChangeNotesCommit commit) throws ConfigInvalidException { return parseOneFooter(commit, FOOTER_SUBMISSION_ID); } - private String parseBranch(ChangeNotesCommit commit) - throws ConfigInvalidException { + private String parseBranch(ChangeNotesCommit commit) throws ConfigInvalidException { String branch = parseOneFooter(commit, FOOTER_BRANCH); return branch != null ? RefNames.fullName(branch) : null; } - private String parseChangeId(ChangeNotesCommit commit) - throws ConfigInvalidException { + private String parseChangeId(ChangeNotesCommit commit) throws ConfigInvalidException { return parseOneFooter(commit, FOOTER_CHANGE_ID); } - private String parseSubject(ChangeNotesCommit commit) - throws ConfigInvalidException { + private String parseSubject(ChangeNotesCommit commit) throws ConfigInvalidException { return parseOneFooter(commit, FOOTER_SUBJECT); } - private Account.Id parseRealAccountId(ChangeNotesCommit commit, - Account.Id effectiveAccountId) throws ConfigInvalidException { + private Account.Id parseRealAccountId(ChangeNotesCommit commit, Account.Id effectiveAccountId) + throws ConfigInvalidException { String realUser = parseOneFooter(commit, FOOTER_REAL_USER); if (realUser == null) { return effectiveAccountId; @@ -413,8 +403,7 @@ class ChangeNotesParser { return noteUtil.parseIdent(ident, id); } - private String parseTopic(ChangeNotesCommit commit) - throws ConfigInvalidException { + private String parseTopic(ChangeNotesCommit commit) throws ConfigInvalidException { return parseOneFooter(commit, FOOTER_TOPIC); } @@ -429,17 +418,16 @@ class ChangeNotesParser { return footerLines.get(0); } - private String parseExactlyOneFooter(ChangeNotesCommit commit, - FooterKey footerKey) throws ConfigInvalidException { + private String parseExactlyOneFooter(ChangeNotesCommit commit, FooterKey footerKey) + throws ConfigInvalidException { String line = parseOneFooter(commit, footerKey); if (line == null) { - throw expectedOneFooter(footerKey, Collections. emptyList()); + throw expectedOneFooter(footerKey, Collections.emptyList()); } return line; } - private ObjectId parseRevision(ChangeNotesCommit commit) - throws ConfigInvalidException { + private ObjectId parseRevision(ChangeNotesCommit commit) throws ConfigInvalidException { String sha = parseOneFooter(commit, FOOTER_COMMIT); if (sha == null) { return null; @@ -453,11 +441,10 @@ class ChangeNotesParser { } } - private void parsePatchSet(PatchSet.Id psId, ObjectId rev, - Account.Id accountId, Timestamp ts) throws ConfigInvalidException { + private void parsePatchSet(PatchSet.Id psId, ObjectId rev, Account.Id accountId, Timestamp ts) + throws ConfigInvalidException { if (accountId == null) { - throw parseException( - "patch set %s requires an identified user as uploader", psId.get()); + throw parseException("patch set %s requires an identified user as uploader", psId.get()); } PatchSet ps = patchSets.get(psId); if (ps == null) { @@ -518,8 +505,7 @@ class ChangeNotesParser { } } - private void parseHashtags(ChangeNotesCommit commit) - throws ConfigInvalidException { + private void parseHashtags(ChangeNotesCommit commit) throws ConfigInvalidException { // Commits are parsed in reverse order and only the last set of hashtags // should be used. if (hashtags != null) { @@ -537,8 +523,7 @@ class ChangeNotesParser { } } - private void parseAssignee(ChangeNotesCommit commit) - throws ConfigInvalidException { + private void parseAssignee(ChangeNotesCommit commit) throws ConfigInvalidException { if (pastAssignees == null) { pastAssignees = Lists.newArrayList(); } @@ -561,8 +546,7 @@ class ChangeNotesParser { } } - private void parseTag(ChangeNotesCommit commit) - throws ConfigInvalidException { + private void parseTag(ChangeNotesCommit commit) throws ConfigInvalidException { tag = null; List tagLines = commit.getFooterLineValues(FOOTER_TAG); if (tagLines.isEmpty()) { @@ -574,16 +558,15 @@ class ChangeNotesParser { } } - private Change.Status parseStatus(ChangeNotesCommit commit) - throws ConfigInvalidException { + private Change.Status parseStatus(ChangeNotesCommit commit) throws ConfigInvalidException { List statusLines = commit.getFooterLineValues(FOOTER_STATUS); if (statusLines.isEmpty()) { return null; } else if (statusLines.size() > 1) { throw expectedOneFooter(FOOTER_STATUS, statusLines); } - Change.Status status = Enums.getIfPresent( - Change.Status.class, statusLines.get(0).toUpperCase()).orNull(); + Change.Status status = + Enums.getIfPresent(Change.Status.class, statusLines.get(0).toUpperCase()).orNull(); if (status == null) { throw invalidFooter(FOOTER_STATUS, statusLines.get(0)); } @@ -599,8 +582,7 @@ class ChangeNotesParser { return status; } - private PatchSet.Id parsePatchSetId(ChangeNotesCommit commit) - throws ConfigInvalidException { + private PatchSet.Id parsePatchSetId(ChangeNotesCommit commit) throws ConfigInvalidException { String psIdLine = parseExactlyOneFooter(commit, FOOTER_PATCH_SET); int s = psIdLine.indexOf(' '); String psIdStr = s < 0 ? psIdLine : psIdLine.substring(0, s); @@ -611,8 +593,7 @@ class ChangeNotesParser { return new PatchSet.Id(id, psId); } - private PatchSetState parsePatchSetState(ChangeNotesCommit commit) - throws ConfigInvalidException { + private PatchSetState parsePatchSetState(ChangeNotesCommit commit) throws ConfigInvalidException { String psIdLine = parseExactlyOneFooter(commit, FOOTER_PATCH_SET); int s = psIdLine.indexOf(' '); if (s < 0) { @@ -620,9 +601,11 @@ class ChangeNotesParser { } String withParens = psIdLine.substring(s + 1); if (withParens.startsWith("(") && withParens.endsWith(")")) { - PatchSetState state = Enums.getIfPresent(PatchSetState.class, - withParens.substring(1, withParens.length() - 1).toUpperCase()) - .orNull(); + PatchSetState state = + Enums.getIfPresent( + PatchSetState.class, + withParens.substring(1, withParens.length() - 1).toUpperCase()) + .orNull(); if (state != null) { return state; } @@ -632,8 +615,7 @@ class ChangeNotesParser { private void parseDescription(PatchSet.Id psId, ChangeNotesCommit commit) throws ConfigInvalidException { - List descLines = - commit.getFooterLineValues(FOOTER_PATCH_SET_DESCRIPTION); + List descLines = commit.getFooterLineValues(FOOTER_PATCH_SET_DESCRIPTION); if (descLines.isEmpty()) { return; } else if (descLines.size() == 1) { @@ -652,9 +634,12 @@ class ChangeNotesParser { } } - private void parseChangeMessage(PatchSet.Id psId, - Account.Id accountId, Account.Id realAccountId, - ChangeNotesCommit commit, Timestamp ts) { + private void parseChangeMessage( + PatchSet.Id psId, + Account.Id accountId, + Account.Id realAccountId, + ChangeNotesCommit commit, + Timestamp ts) { byte[] raw = commit.getRawBuffer(); int size = raw.length; Charset enc = RawParseUtils.parseEncoding(raw); @@ -699,11 +684,11 @@ class ChangeNotesParser { return; } - String changeMsgString = RawParseUtils.decode(enc, raw, - changeMessageStart, changeMessageEnd + 1); - ChangeMessage changeMessage = new ChangeMessage( - new ChangeMessage.Key(psId.getParentKey(), commit.name()), - accountId, ts, psId); + String changeMsgString = + RawParseUtils.decode(enc, raw, changeMessageStart, changeMessageEnd + 1); + ChangeMessage changeMessage = + new ChangeMessage( + new ChangeMessage.Key(psId.getParentKey(), commit.name()), accountId, ts, psId); changeMessage.setMessage(changeMsgString); changeMessage.setTag(tag); changeMessage.setRealAuthor(realAccountId); @@ -711,13 +696,16 @@ class ChangeNotesParser { allChangeMessages.add(changeMessage); } - private void parseNotes() - throws IOException, ConfigInvalidException { + private void parseNotes() throws IOException, ConfigInvalidException { ObjectReader reader = walk.getObjectReader(); ChangeNotesCommit tipCommit = walk.parseCommit(tip); - revisionNoteMap = RevisionNoteMap.parse( - noteUtil, id, reader, NoteMap.read(reader, tipCommit), - PatchLineComment.Status.PUBLISHED); + revisionNoteMap = + RevisionNoteMap.parse( + noteUtil, + id, + reader, + NoteMap.read(reader, tipCommit), + PatchLineComment.Status.PUBLISHED); Map rns = revisionNoteMap.revisionNotes; for (Map.Entry e : rns.entrySet()) { @@ -734,12 +722,11 @@ class ChangeNotesParser { } } - private void parseApproval(PatchSet.Id psId, Account.Id accountId, - Account.Id realAccountId, Timestamp ts, String line) + private void parseApproval( + PatchSet.Id psId, Account.Id accountId, Account.Id realAccountId, Timestamp ts, String line) throws ConfigInvalidException { if (accountId == null) { - throw parseException( - "patch set %s requires an identified user as uploader", psId.get()); + throw parseException("patch set %s requires an identified user as uploader", psId.get()); } PatchSetApproval psa; if (line.startsWith("-")) { @@ -750,9 +737,8 @@ class ChangeNotesParser { bufferedApprovals.add(psa); } - private PatchSetApproval parseAddApproval(PatchSet.Id psId, - Account.Id committerId, Account.Id realAccountId, Timestamp ts, - String line) + private PatchSetApproval parseAddApproval( + PatchSet.Id psId, Account.Id committerId, Account.Id realAccountId, Timestamp ts, String line) throws ConfigInvalidException { // There are potentially 3 accounts involved here: // 1. The account from the commit, which is the effective IdentifiedUser @@ -783,34 +769,30 @@ class ChangeNotesParser { try { l = LabelVote.parseWithEquals(labelVoteStr); } catch (IllegalArgumentException e) { - ConfigInvalidException pe = - parseException("invalid %s: %s", FOOTER_LABEL, line); + ConfigInvalidException pe = parseException("invalid %s: %s", FOOTER_LABEL, line); pe.initCause(e); throw pe; } - PatchSetApproval psa = new PatchSetApproval( - new PatchSetApproval.Key( - psId, - effectiveAccountId, - new LabelId(l.label())), - l.value(), - ts); + PatchSetApproval psa = + new PatchSetApproval( + new PatchSetApproval.Key(psId, effectiveAccountId, new LabelId(l.label())), + l.value(), + ts); psa.setTag(tag); if (!Objects.equals(realAccountId, committerId)) { psa.setRealAccountId(realAccountId); } - ApprovalKey k = - ApprovalKey.create(psId, effectiveAccountId, l.label()); + ApprovalKey k = ApprovalKey.create(psId, effectiveAccountId, l.label()); if (!approvals.containsKey(k)) { approvals.put(k, psa); } return psa; } - private PatchSetApproval parseRemoveApproval(PatchSet.Id psId, - Account.Id committerId, Account.Id realAccountId, Timestamp ts, - String line) throws ConfigInvalidException { + private PatchSetApproval parseRemoveApproval( + PatchSet.Id psId, Account.Id committerId, Account.Id realAccountId, Timestamp ts, String line) + throws ConfigInvalidException { // See comments in parseAddApproval about the various users involved. Account.Id effectiveAccountId; String label; @@ -828,8 +810,7 @@ class ChangeNotesParser { try { LabelType.checkNameInternal(label); } catch (IllegalArgumentException e) { - ConfigInvalidException pe = - parseException("invalid %s: %s", FOOTER_LABEL, line); + ConfigInvalidException pe = parseException("invalid %s: %s", FOOTER_LABEL, line); pe.initCause(e); throw pe; } @@ -840,13 +821,9 @@ class ChangeNotesParser { // confusion and special-casing of NoteDb. // - More importantly, ApprovalCopier needs an actual approval in order to // block copying an earlier approval over a later delete. - PatchSetApproval remove = new PatchSetApproval( - new PatchSetApproval.Key( - psId, - effectiveAccountId, - new LabelId(label)), - (short) 0, - ts); + PatchSetApproval remove = + new PatchSetApproval( + new PatchSetApproval.Key(psId, effectiveAccountId, new LabelId(label)), (short) 0, ts); if (!Objects.equals(realAccountId, committerId)) { remove.setRealAccountId(realAccountId); } @@ -857,8 +834,7 @@ class ChangeNotesParser { return remove; } - private void parseSubmitRecords(List lines) - throws ConfigInvalidException { + private void parseSubmitRecords(List lines) throws ConfigInvalidException { SubmitRecord rec = null; for (String line : lines) { @@ -868,8 +844,7 @@ class ChangeNotesParser { submitRecords.add(rec); int s = line.indexOf(' '); String statusStr = s >= 0 ? line.substring(0, s) : line; - rec.status = - Enums.getIfPresent(SubmitRecord.Status.class, statusStr).orNull(); + rec.status = Enums.getIfPresent(SubmitRecord.Status.class, statusStr).orNull(); checkFooter(rec.status != null, FOOTER_SUBMITTED_WITH, line); if (s >= 0) { rec.errorMessage = line.substring(s); @@ -882,14 +857,13 @@ class ChangeNotesParser { } rec.labels.add(label); - label.status = Enums.getIfPresent( - SubmitRecord.Label.Status.class, line.substring(0, c)).orNull(); + label.status = + Enums.getIfPresent(SubmitRecord.Label.Status.class, line.substring(0, c)).orNull(); checkFooter(label.status != null, FOOTER_SUBMITTED_WITH, line); int c2 = line.indexOf(": ", c + 2); if (c2 >= 0) { label.label = line.substring(c + 2, c2); - PersonIdent ident = - RawParseUtils.parsePersonIdent(line.substring(c2 + 2)); + PersonIdent ident = RawParseUtils.parsePersonIdent(line.substring(c2 + 2)); checkFooter(ident != null, FOOTER_SUBMITTED_WITH, line); label.appliedBy = noteUtil.parseIdent(ident, id); } else { @@ -899,28 +873,25 @@ class ChangeNotesParser { } } - private Account.Id parseIdent(ChangeNotesCommit commit) - throws ConfigInvalidException { + private Account.Id parseIdent(ChangeNotesCommit commit) throws ConfigInvalidException { // Check if the author name/email is the same as the committer name/email, // i.e. was the server ident at the time this commit was made. PersonIdent a = commit.getAuthorIdent(); PersonIdent c = commit.getCommitterIdent(); - if (a.getName().equals(c.getName()) - && a.getEmailAddress().equals(c.getEmailAddress())) { + if (a.getName().equals(c.getName()) && a.getEmailAddress().equals(c.getEmailAddress())) { return null; } return noteUtil.parseIdent(commit.getAuthorIdent(), id); } - private void parseReviewer(Timestamp ts, ReviewerStateInternal state, - String line) throws ConfigInvalidException { + private void parseReviewer(Timestamp ts, ReviewerStateInternal state, String line) + throws ConfigInvalidException { PersonIdent ident = RawParseUtils.parsePersonIdent(line); if (ident == null) { throw invalidFooter(state.getFooterKey(), line); } Account.Id accountId = noteUtil.parseIdent(ident, id); - reviewerUpdates.add( - ReviewerStatusUpdate.create(ts, ownerId, accountId, state)); + reviewerUpdates.add(ReviewerStatusUpdate.create(ts, ownerId, accountId, state)); if (!reviewers.containsRow(accountId)) { reviewers.put(accountId, state, ts); } @@ -939,8 +910,7 @@ class ChangeNotesParser { private void updatePatchSetStates() { Set missing = new TreeSet<>(ReviewDbUtil.intKeyOrdering()); - for (Iterator it = patchSets.values().iterator(); - it.hasNext();) { + for (Iterator it = patchSets.values().iterator(); it.hasNext(); ) { PatchSet ps = it.next(); if (ps.getRevision().equals(PARTIAL_PATCH_SET)) { missing.add(ps.getId()); @@ -972,25 +942,24 @@ class ChangeNotesParser { // set was deleted. changeMessagesByPatchSet.keys().retainAll(patchSets.keySet()); - int pruned = pruneEntitiesForMissingPatchSets( - allChangeMessages, ChangeMessage::getPatchSetId, missing); - pruned += pruneEntitiesForMissingPatchSets( - comments.values(), c -> new PatchSet.Id(id, c.key.patchSetId), missing); - pruned += pruneEntitiesForMissingPatchSets( - approvals.values(), PatchSetApproval::getPatchSetId, missing); + int pruned = + pruneEntitiesForMissingPatchSets(allChangeMessages, ChangeMessage::getPatchSetId, missing); + pruned += + pruneEntitiesForMissingPatchSets( + comments.values(), c -> new PatchSet.Id(id, c.key.patchSetId), missing); + pruned += + pruneEntitiesForMissingPatchSets( + approvals.values(), PatchSetApproval::getPatchSetId, missing); if (!missing.isEmpty()) { - log.warn( - "ignoring {} additional entities due to missing patch sets: {}", - pruned, missing); + log.warn("ignoring {} additional entities due to missing patch sets: {}", pruned, missing); } } private int pruneEntitiesForMissingPatchSets( - Iterable ents, Function psIdFunc, - Set missing) { + Iterable ents, Function psIdFunc, Set missing) { int pruned = 0; - for (Iterator it = ents.iterator(); it.hasNext();) { + for (Iterator it = ents.iterator(); it.hasNext(); ) { PatchSet.Id psId = psIdFunc.apply(it.next()); if (!patchSets.containsKey(psId)) { pruned++; @@ -1015,19 +984,16 @@ class ChangeNotesParser { missing.add(FOOTER_SUBJECT); } if (!missing.isEmpty()) { - throw parseException("Missing footers: " - + missing.stream().map(FooterKey::getName).collect(joining(", "))); + throw parseException( + "Missing footers: " + missing.stream().map(FooterKey::getName).collect(joining(", "))); } } - private ConfigInvalidException expectedOneFooter(FooterKey footer, - List actual) { - return parseException("missing or multiple %s: %s", - footer.getName(), actual); + private ConfigInvalidException expectedOneFooter(FooterKey footer, List actual) { + return parseException("missing or multiple %s: %s", footer.getName(), actual); } - private ConfigInvalidException invalidFooter(FooterKey footer, - String actual) { + private ConfigInvalidException invalidFooter(FooterKey footer, String actual) { return parseException("invalid %s: %s", footer.getName(), actual); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesState.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesState.java index 6c15c7e667..62df01b811 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesState.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesState.java @@ -37,25 +37,21 @@ import com.google.gerrit.reviewdb.client.RevId; import com.google.gerrit.server.ReviewerSet; import com.google.gerrit.server.ReviewerStatusUpdate; import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage; - -import org.eclipse.jgit.lib.ObjectId; - import java.io.IOException; import java.sql.Timestamp; import java.util.List; import java.util.Map; import java.util.Set; +import org.eclipse.jgit.lib.ObjectId; /** * Immutable state associated with a change meta ref at a given commit. - *

- * One instance is the output of a single {@link ChangeNotesParser}, and - * contains types required to support public methods on {@link ChangeNotes}. It - * is intended to be cached in-process. - *

- * Note that {@link ChangeNotes} contains more than just a single {@code - * ChangeNoteState}, such as per-draft information, so that class is not cached - * directly. + * + *

One instance is the output of a single {@link ChangeNotesParser}, and contains types required + * to support public methods on {@link ChangeNotes}. It is intended to be cached in-process. + * + *

Note that {@link ChangeNotes} contains more than just a single {@code ChangeNoteState}, such + * as per-draft information, so that class is not cached directly. */ @AutoValue public abstract class ChangeNotesState { @@ -135,67 +131,90 @@ public abstract class ChangeNotesState { ImmutableListMultimap.copyOf(publishedComments)); } - /** * Subset of Change columns that can be represented in NoteDb. - *

- * Notable exceptions include rowVersion and noteDbState, which are only make - * sense when read from NoteDb, so they cannot be cached. - *

- * Fields are in listed column order. + * + *

Notable exceptions include rowVersion and noteDbState, which are only make sense when read + * from NoteDb, so they cannot be cached. + * + *

Fields are in listed column order. */ @AutoValue abstract static class ChangeColumns { abstract Change.Key changeKey(); + abstract Timestamp createdOn(); + abstract Timestamp lastUpdatedOn(); + abstract Account.Id owner(); // Project not included, as it's not stored anywhere in the meta ref. abstract String branch(); - @Nullable abstract PatchSet.Id currentPatchSetId(); + @Nullable + abstract PatchSet.Id currentPatchSetId(); + abstract String subject(); - @Nullable abstract String topic(); - @Nullable abstract String originalSubject(); - @Nullable abstract String submissionId(); - @Nullable abstract Account.Id assignee(); + + @Nullable + abstract String topic(); + + @Nullable + abstract String originalSubject(); + + @Nullable + abstract String submissionId(); + + @Nullable + abstract Account.Id assignee(); // TODO(dborowitz): Use a sensible default other than null - @Nullable abstract Change.Status status(); + @Nullable + abstract Change.Status status(); } // Only null if NoteDb is disabled. - @Nullable abstract ObjectId metaId(); + @Nullable + abstract ObjectId metaId(); abstract Change.Id changeId(); // Only null if NoteDb is disabled. - @Nullable abstract ChangeColumns columns(); + @Nullable + abstract ChangeColumns columns(); // Other related to this Change. abstract ImmutableSet pastAssignees(); + abstract ImmutableSet hashtags(); + abstract ImmutableList> patchSets(); + abstract ImmutableList> approvals(); abstract ReviewerSet reviewers(); + abstract ImmutableList allPastReviewers(); + abstract ImmutableList reviewerUpdates(); abstract ImmutableList submitRecords(); + abstract ImmutableList allChangeMessages(); - abstract ImmutableListMultimap - changeMessagesByPatchSet(); + + abstract ImmutableListMultimap changeMessagesByPatchSet(); + abstract ImmutableListMultimap publishedComments(); Change newChange(Project.NameKey project) { ChangeColumns c = checkNotNull(columns(), "columns are required"); - Change change = new Change( - c.changeKey(), - changeId(), - c.owner(), - new Branch.NameKey(project, c.branch()), - c.createdOn()); + Change change = + new Change( + c.changeKey(), + changeId(), + c.owner(), + new Branch.NameKey(project, c.branch()), + c.createdOn()); copyNonConstructorColumnsTo(change); change.setNoteDbState(NoteDbChangeState.NOTE_DB_PRIMARY_STATE); return change; @@ -203,7 +222,8 @@ public abstract class ChangeNotesState { void copyColumnsTo(Change change) throws IOException { ChangeColumns c = columns(); - checkState(c != null && metaId() != null, + checkState( + c != null && metaId() != null, "missing columns or metaId in ChangeNotesState; is NoteDb enabled? %s", this); checkMetaId(change); @@ -225,9 +245,12 @@ public abstract class ChangeNotesState { ObjectId idFromState = state.getRefState().get().changeMetaId(); if (!idFromState.equals(metaId())) { throw new IOException( - "cannot copy ChangeNotesState into Change " + changeId() - + "; this ChangeNotesState was created from " + metaId() - + ", but change requires state " + idFromState); + "cannot copy ChangeNotesState into Change " + + changeId() + + "; this ChangeNotesState was created from " + + metaId() + + ", but change requires state " + + idFromState); } } @@ -242,8 +265,7 @@ public abstract class ChangeNotesState { change.setAssignee(c.assignee()); if (!patchSets().isEmpty()) { - change.setCurrentPatchSet( - c.currentPatchSetId(), c.subject(), c.originalSubject()); + change.setCurrentPatchSet(c.currentPatchSetId(), c.subject(), c.originalSubject()); } else { // TODO(dborowitz): This should be an error, but for now it's required for // some tests to pass. diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeRevisionNote.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeRevisionNote.java index 2bd61a7371..153c9c3826 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeRevisionNote.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeRevisionNote.java @@ -20,34 +20,34 @@ import com.google.common.primitives.Bytes; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Comment; import com.google.gerrit.reviewdb.client.PatchLineComment; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.ObjectReader; -import org.eclipse.jgit.util.MutableInteger; -import org.eclipse.jgit.util.RawParseUtils; - import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.util.List; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.ObjectReader; +import org.eclipse.jgit.util.MutableInteger; +import org.eclipse.jgit.util.RawParseUtils; class ChangeRevisionNote extends RevisionNote { - private static final byte[] CERT_HEADER = - "certificate version ".getBytes(UTF_8); + private static final byte[] CERT_HEADER = "certificate version ".getBytes(UTF_8); // See org.eclipse.jgit.transport.PushCertificateParser.END_SIGNATURE - private static final byte[] END_SIGNATURE = - "-----END PGP SIGNATURE-----\n".getBytes(UTF_8); + private static final byte[] END_SIGNATURE = "-----END PGP SIGNATURE-----\n".getBytes(UTF_8); private final ChangeNoteUtil noteUtil; private final Change.Id changeId; private final PatchLineComment.Status status; private String pushCert; - ChangeRevisionNote(ChangeNoteUtil noteUtil, Change.Id changeId, - ObjectReader reader, ObjectId noteId, PatchLineComment.Status status) { + ChangeRevisionNote( + ChangeNoteUtil noteUtil, + Change.Id changeId, + ObjectReader reader, + ObjectId noteId, + PatchLineComment.Status status) { super(reader, noteId); this.noteUtil = noteUtil; this.changeId = changeId; @@ -60,8 +60,7 @@ class ChangeRevisionNote extends RevisionNote { } @Override - protected List parse(byte[] raw, int offset) - throws IOException, ConfigInvalidException { + protected List parse(byte[] raw, int offset) throws IOException, ConfigInvalidException { MutableInteger p = new MutableInteger(); p.value = offset; @@ -88,24 +87,22 @@ class ChangeRevisionNote extends RevisionNote { return raw[offset] == '{' || raw[offset] == '['; } - private RevisionNoteData parseJson(ChangeNoteUtil noteUtil, byte[] raw, - int offset) throws IOException { - try (InputStream is = new ByteArrayInputStream( - raw, offset, raw.length - offset); + private RevisionNoteData parseJson(ChangeNoteUtil noteUtil, byte[] raw, int offset) + throws IOException { + try (InputStream is = new ByteArrayInputStream(raw, offset, raw.length - offset); Reader r = new InputStreamReader(is, UTF_8)) { return noteUtil.getGson().fromJson(r, RevisionNoteData.class); } } - private static String parsePushCert(Change.Id changeId, byte[] bytes, - MutableInteger p) throws ConfigInvalidException { + private static String parsePushCert(Change.Id changeId, byte[] bytes, MutableInteger p) + throws ConfigInvalidException { if (RawParseUtils.match(bytes, p.value, CERT_HEADER) < 0) { return null; } int end = Bytes.indexOf(bytes, END_SIGNATURE); if (end < 0) { - throw ChangeNotes.parseException( - changeId, "invalid push certificate in note"); + throw ChangeNotes.parseException(changeId, "invalid push certificate in note"); } int start = p.value; p.value = end + END_SIGNATURE.length; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeUpdate.java index b78178f5f5..068f368974 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeUpdate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeUpdate.java @@ -65,17 +65,6 @@ import com.google.gwtorm.client.IntKey; import com.google.gwtorm.server.OrmException; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.CommitBuilder; -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.ObjectInserter; -import org.eclipse.jgit.lib.PersonIdent; -import org.eclipse.jgit.notes.NoteMap; -import org.eclipse.jgit.revwalk.FooterKey; -import org.eclipse.jgit.revwalk.RevCommit; -import org.eclipse.jgit.revwalk.RevWalk; - import java.io.IOException; import java.util.ArrayList; import java.util.Comparator; @@ -87,22 +76,31 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.CommitBuilder; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.ObjectInserter; +import org.eclipse.jgit.lib.PersonIdent; +import org.eclipse.jgit.notes.NoteMap; +import org.eclipse.jgit.revwalk.FooterKey; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.revwalk.RevWalk; /** * A delta to apply to a change. - *

- * This delta will become two unique commits: one in the AllUsers repo that will - * contain the draft comments on this change and one in the notes branch that - * will contain approvals, reviewers, change status, subject, submit records, - * the change message, and published comments. There are limitations on the set - * of modifications that can be handled in a single update. In particular, there - * is a single author and timestamp for each update. - *

- * This class is not thread-safe. + * + *

This delta will become two unique commits: one in the AllUsers repo that will contain the + * draft comments on this change and one in the notes branch that will contain approvals, reviewers, + * change status, subject, submit records, the change message, and published comments. There are + * limitations on the set of modifications that can be handled in a single update. In particular, + * there is a single author and timestamp for each update. + * + *

This class is not thread-safe. */ public class ChangeUpdate extends AbstractChangeUpdate { public interface Factory { ChangeUpdate create(ChangeControl ctl); + ChangeUpdate create(ChangeControl ctl, Date when); ChangeUpdate create( @@ -114,8 +112,7 @@ public class ChangeUpdate extends AbstractChangeUpdate { Comparator labelNameComparator); @VisibleForTesting - ChangeUpdate create(ChangeControl ctl, Date when, - Comparator labelNameComparator); + ChangeUpdate create(ChangeControl ctl, Date when, Comparator labelNameComparator); } private final AccountCache accountCache; @@ -162,9 +159,18 @@ public class ChangeUpdate extends AbstractChangeUpdate { ProjectCache projectCache, @Assisted ChangeControl ctl, ChangeNoteUtil noteUtil) { - this(serverIdent, anonymousCowardName, migration, accountCache, - updateManagerFactory, draftUpdateFactory, robotCommentUpdateFactory, - projectCache, ctl, serverIdent.getWhen(), noteUtil); + this( + serverIdent, + anonymousCowardName, + migration, + accountCache, + updateManagerFactory, + draftUpdateFactory, + robotCommentUpdateFactory, + projectCache, + ctl, + serverIdent.getWhen(), + noteUtil); } @AssistedInject @@ -180,9 +186,16 @@ public class ChangeUpdate extends AbstractChangeUpdate { @Assisted ChangeControl ctl, @Assisted Date when, ChangeNoteUtil noteUtil) { - this(serverIdent, anonymousCowardName, migration, accountCache, - updateManagerFactory, draftUpdateFactory, robotCommentUpdateFactory, - ctl, when, + this( + serverIdent, + anonymousCowardName, + migration, + accountCache, + updateManagerFactory, + draftUpdateFactory, + robotCommentUpdateFactory, + ctl, + when, projectCache.get(getProjectName(ctl)).getLabelTypes().nameComparator(), noteUtil); } @@ -209,8 +222,7 @@ public class ChangeUpdate extends AbstractChangeUpdate { @Assisted Date when, @Assisted Comparator labelNameComparator, ChangeNoteUtil noteUtil) { - super(migration, ctl, serverIdent, - anonymousCowardName, noteUtil, when); + super(migration, ctl, serverIdent, anonymousCowardName, noteUtil, when); this.accountCache = accountCache; this.draftUpdateFactory = draftUpdateFactory; this.robotCommentUpdateFactory = robotCommentUpdateFactory; @@ -234,8 +246,17 @@ public class ChangeUpdate extends AbstractChangeUpdate { @Assisted PersonIdent authorIdent, @Assisted Date when, @Assisted Comparator labelNameComparator) { - super(migration, noteUtil, serverIdent, anonymousCowardName, null, change, - accountId, realAccountId, authorIdent, when); + super( + migration, + noteUtil, + serverIdent, + anonymousCowardName, + null, + change, + accountId, + realAccountId, + authorIdent, + when); this.accountCache = accountCache; this.draftUpdateFactory = draftUpdateFactory; this.robotCommentUpdateFactory = robotCommentUpdateFactory; @@ -244,8 +265,7 @@ public class ChangeUpdate extends AbstractChangeUpdate { } public ObjectId commit() throws IOException, OrmException { - try (NoteDbUpdateManager updateManager = - updateManagerFactory.create(getProjectName())) { + try (NoteDbUpdateManager updateManager = updateManagerFactory.create(getProjectName())) { updateManager.add(this); updateManager.stageAndApplyDelta(getChange()); updateManager.execute(); @@ -255,9 +275,11 @@ public class ChangeUpdate extends AbstractChangeUpdate { public void setChangeId(String changeId) { String old = getChange().getKey().get(); - checkArgument(old.equals(changeId), + checkArgument( + old.equals(changeId), "The Change-Id was already set to %s, so we cannot set this Change-Id: %s", - old, changeId); + old, + changeId); this.changeId = changeId; } @@ -266,8 +288,7 @@ public class ChangeUpdate extends AbstractChangeUpdate { } public void setStatus(Change.Status status) { - checkArgument(status != Change.Status.MERGED, - "use merge(Iterable)"); + checkArgument(status != Change.Status.MERGED, "use merge(Iterable)"); this.status = status; } @@ -291,13 +312,11 @@ public class ChangeUpdate extends AbstractChangeUpdate { approvals.put(label, reviewer, Optional.empty()); } - public void merge(RequestId submissionId, - Iterable submitRecords) { + public void merge(RequestId submissionId, Iterable submitRecords) { this.status = Change.Status.MERGED; this.submissionId = submissionId.toStringForStorage(); this.submitRecords = ImmutableList.copyOf(submitRecords); - checkArgument(!this.submitRecords.isEmpty(), - "no submit records specified at submit time"); + checkArgument(!this.submitRecords.isEmpty(), "no submit records specified at submit time"); } @Deprecated // Only until we improve ChangeRebuilder to call merge(). @@ -361,11 +380,10 @@ public class ChangeUpdate extends AbstractChangeUpdate { if (draftUpdate == null) { ChangeNotes notes = getNotes(); if (notes != null) { - draftUpdate = draftUpdateFactory.create( - notes, accountId, realAccountId, authorIdent, when); + draftUpdate = draftUpdateFactory.create(notes, accountId, realAccountId, authorIdent, when); } else { - draftUpdate = draftUpdateFactory.create( - getChange(), accountId, realAccountId, authorIdent, when); + draftUpdate = + draftUpdateFactory.create(getChange(), accountId, realAccountId, authorIdent, when); } } return draftUpdate; @@ -376,11 +394,12 @@ public class ChangeUpdate extends AbstractChangeUpdate { if (robotCommentUpdate == null) { ChangeNotes notes = getNotes(); if (notes != null) { - robotCommentUpdate = robotCommentUpdateFactory.create( - notes, accountId, realAccountId, authorIdent, when); + robotCommentUpdate = + robotCommentUpdateFactory.create(notes, accountId, realAccountId, authorIdent, when); } else { - robotCommentUpdate = robotCommentUpdateFactory.create( - getChange(), accountId, realAccountId, authorIdent, when); + robotCommentUpdate = + robotCommentUpdateFactory.create( + getChange(), accountId, realAccountId, authorIdent, when); } } return robotCommentUpdate; @@ -394,8 +413,7 @@ public class ChangeUpdate extends AbstractChangeUpdate { setCommit(rw, id, null); } - public void setCommit(RevWalk rw, ObjectId id, String pushCert) - throws IOException { + public void setCommit(RevWalk rw, ObjectId id, String pushCert) throws IOException { RevCommit commit = rw.parseCommit(id); rw.parseBody(commit); this.commit = commit.name(); @@ -404,8 +422,8 @@ public class ChangeUpdate extends AbstractChangeUpdate { } /** - * Set the revision without depending on the commit being present in the - * repository; should only be used for converting old corrupt commits. + * Set the revision without depending on the commit being present in the repository; should only + * be used for converting old corrupt commits. */ public void setRevisionForMissingCommit(String id, String pushCert) { commit = id; @@ -452,8 +470,8 @@ public class ChangeUpdate extends AbstractChangeUpdate { } /** @return the tree id for the updated tree */ - private ObjectId storeRevisionNotes(RevWalk rw, ObjectInserter inserter, - ObjectId curr) throws ConfigInvalidException, OrmException, IOException { + private ObjectId storeRevisionNotes(RevWalk rw, ObjectInserter inserter, ObjectId curr) + throws ConfigInvalidException, OrmException, IOException { if (comments.isEmpty() && pushCert == null) { return null; } @@ -472,16 +490,16 @@ public class ChangeUpdate extends AbstractChangeUpdate { checkComments(rnm.revisionNotes, builders); for (Map.Entry e : builders.entrySet()) { - ObjectId data = inserter.insert( - OBJ_BLOB, e.getValue().build(noteUtil, noteUtil.getWriteJson())); + ObjectId data = + inserter.insert(OBJ_BLOB, e.getValue().build(noteUtil, noteUtil.getWriteJson())); rnm.noteMap.set(ObjectId.fromString(e.getKey().get()), data); } return rnm.noteMap.writeTree(inserter); } - private RevisionNoteMap getRevisionNoteMap(RevWalk rw, - ObjectId curr) throws ConfigInvalidException, OrmException, IOException { + private RevisionNoteMap getRevisionNoteMap(RevWalk rw, ObjectId curr) + throws ConfigInvalidException, OrmException, IOException { if (curr.equals(ObjectId.zeroId())) { return RevisionNoteMap.emptyMap(); } @@ -491,8 +509,7 @@ public class ChangeUpdate extends AbstractChangeUpdate { // hasn't advanced. ChangeNotes notes = getNotes(); if (notes != null && notes.revisionNoteMap != null) { - ObjectId idFromNotes = - firstNonNull(notes.load().getRevision(), ObjectId.zeroId()); + ObjectId idFromNotes = firstNonNull(notes.load().getRevision(), ObjectId.zeroId()); if (idFromNotes.equals(curr)) { return notes.revisionNoteMap; } @@ -502,15 +519,12 @@ public class ChangeUpdate extends AbstractChangeUpdate { // Even though reading from changes might not be enabled, we need to // parse any existing revision notes so we can merge them. return RevisionNoteMap.parse( - noteUtil, - getId(), - rw.getObjectReader(), - noteMap, - PatchLineComment.Status.PUBLISHED); + noteUtil, getId(), rw.getObjectReader(), noteMap, PatchLineComment.Status.PUBLISHED); } - private void checkComments(Map existingNotes, - Map toUpdate) throws OrmException { + private void checkComments( + Map existingNotes, Map toUpdate) + throws OrmException { // Prohibit various kinds of illegal operations on comments. Set existing = new HashSet<>(); for (ChangeRevisionNote rn : existingNotes.values()) { @@ -540,8 +554,7 @@ public class ChangeUpdate extends AbstractChangeUpdate { for (RevisionNoteBuilder b : toUpdate.values()) { for (Comment c : b.put.values()) { if (existing.contains(c.key)) { - throw new OrmException( - "Cannot update existing published comment: " + c); + throw new OrmException("Cannot update existing published comment: " + c); } } } @@ -553,8 +566,8 @@ public class ChangeUpdate extends AbstractChangeUpdate { } @Override - protected CommitBuilder applyImpl(RevWalk rw, ObjectInserter ins, - ObjectId curr) throws OrmException, IOException { + protected CommitBuilder applyImpl(RevWalk rw, ObjectInserter ins, ObjectId curr) + throws OrmException, IOException { CommitBuilder cb = new CommitBuilder(); int ps = psId != null ? psId.get() : getChange().currentPatchSetId().get(); @@ -632,14 +645,12 @@ public class ChangeUpdate extends AbstractChangeUpdate { addIdent(msg, e.getKey()).append('\n'); } - for (Table.Cell> c - : approvals.cellSet()) { + for (Table.Cell> c : approvals.cellSet()) { addFooter(msg, FOOTER_LABEL); if (!c.getValue().isPresent()) { msg.append('-').append(c.getRowKey()); } else { - msg.append(LabelVote.create( - c.getRowKey(), c.getValue().get()).formatWithEquals()); + msg.append(LabelVote.create(c.getRowKey(), c.getValue().get()).formatWithEquals()); } Account.Id id = c.getColumnKey(); if (!id.equals(getAccountId())) { @@ -654,8 +665,7 @@ public class ChangeUpdate extends AbstractChangeUpdate { if (submitRecords != null) { for (SubmitRecord rec : submitRecords) { - addFooter(msg, FOOTER_SUBMITTED_WITH) - .append(rec.status); + addFooter(msg, FOOTER_SUBMITTED_WITH).append(rec.status); if (rec.errorMessage != null) { msg.append(' ').append(sanitizeFooter(rec.errorMessage)); } @@ -664,7 +674,9 @@ public class ChangeUpdate extends AbstractChangeUpdate { if (rec.labels != null) { for (SubmitRecord.Label label : rec.labels) { addFooter(msg, FOOTER_SUBMITTED_WITH) - .append(label.status).append(": ").append(label.label); + .append(label.status) + .append(": ") + .append(label.label); if (label.appliedBy != null) { msg.append(": "); addIdent(msg, label.appliedBy); @@ -749,8 +761,7 @@ public class ChangeUpdate extends AbstractChangeUpdate { return sb.append(footer.getName()).append(": "); } - private static void addFooter(StringBuilder sb, FooterKey footer, - Object... values) { + private static void addFooter(StringBuilder sb, FooterKey footer, Object... values) { addFooter(sb, footer); for (Object value : values) { sb.append(value); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ConfigNotesMigration.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ConfigNotesMigration.java index 3d2d4fd7c2..0dc20ede58 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ConfigNotesMigration.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ConfigNotesMigration.java @@ -24,20 +24,17 @@ import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage; import com.google.inject.AbstractModule; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.Config; - import java.util.HashSet; import java.util.Set; +import org.eclipse.jgit.lib.Config; /** * Implement NoteDb migration stages using {@code gerrit.config}. - *

- * This class controls the state of the migration according to options in - * {@code gerrit.config}. In general, any changes to these options should only - * be made by adventurous administrators, who know what they're doing, on - * non-production data, for the purposes of testing the NoteDb implementation. - * Changing options quite likely requires re-running {@code RebuildNoteDb}. For + * + *

This class controls the state of the migration according to options in {@code gerrit.config}. + * In general, any changes to these options should only be made by adventurous administrators, who + * know what they're doing, on non-production data, for the purposes of testing the NoteDb + * implementation. Changing options quite likely requires re-running {@code RebuildNoteDb}. For * these reasons, the options remain undocumented. */ @Singleton @@ -62,17 +59,16 @@ public class ConfigNotesMigration extends NotesMigration { for (NoteDbTable t : NoteDbTable.values()) { keys.add(t.key().toLowerCase()); } - Set allowed = ImmutableSet.of( - PRIMARY_STORAGE.toLowerCase(), - READ.toLowerCase(), - WRITE.toLowerCase(), - SEQUENCE.toLowerCase()); + Set allowed = + ImmutableSet.of( + PRIMARY_STORAGE.toLowerCase(), + READ.toLowerCase(), + WRITE.toLowerCase(), + SEQUENCE.toLowerCase()); for (String t : cfg.getSubsections(NOTE_DB)) { - checkArgument(keys.contains(t.toLowerCase()), - "invalid NoteDb table: %s", t); + checkArgument(keys.contains(t.toLowerCase()), "invalid NoteDb table: %s", t); for (String key : cfg.getNames(NOTE_DB, t)) { - checkArgument(allowed.contains(key.toLowerCase()), - "invalid NoteDb key: %s.%s", t, key); + checkArgument(allowed.contains(key.toLowerCase()), "invalid NoteDb key: %s.%s", t, key); } } } @@ -107,8 +103,8 @@ public class ConfigNotesMigration extends NotesMigration { // NoteDb. This decision for the default may be reevaluated later. readChangeSequence = cfg.getBoolean(NOTE_DB, CHANGES.key(), SEQUENCE, false); - changePrimaryStorage = cfg.getEnum( - NOTE_DB, CHANGES.key(), PRIMARY_STORAGE, PrimaryStorage.REVIEW_DB); + changePrimaryStorage = + cfg.getEnum(NOTE_DB, CHANGES.key(), PRIMARY_STORAGE, PrimaryStorage.REVIEW_DB); writeAccounts = cfg.getBoolean(NOTE_DB, ACCOUNTS.key(), WRITE, false); readAccounts = cfg.getBoolean(NOTE_DB, ACCOUNTS.key(), READ, false); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/DraftCommentNotes.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/DraftCommentNotes.java index 0408ffa4e8..008f31fbbc 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/DraftCommentNotes.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/DraftCommentNotes.java @@ -40,7 +40,8 @@ import com.google.gerrit.server.project.NoSuchChangeException; import com.google.gwtorm.server.OrmException; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - +import java.io.IOException; +import java.util.concurrent.TimeUnit; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectReader; @@ -52,21 +53,14 @@ import org.eclipse.jgit.transport.ReceiveCommand; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.concurrent.TimeUnit; - -/** - * View of the draft comments for a single {@link Change} based on the log of - * its drafts branch. - */ +/** View of the draft comments for a single {@link Change} based on the log of its drafts branch. */ public class DraftCommentNotes extends AbstractChangeNotes { - private static final Logger log = - LoggerFactory.getLogger(DraftCommentNotes.class); + private static final Logger log = LoggerFactory.getLogger(DraftCommentNotes.class); public interface Factory { DraftCommentNotes create(Change change, Account.Id accountId); - DraftCommentNotes createWithAutoRebuildingDisabled( - Change.Id changeId, Account.Id accountId); + + DraftCommentNotes createWithAutoRebuildingDisabled(Change.Id changeId, Account.Id accountId); } private final Change change; @@ -78,18 +72,12 @@ public class DraftCommentNotes extends AbstractChangeNotes { private RevisionNoteMap revisionNoteMap; @AssistedInject - DraftCommentNotes( - Args args, - @Assisted Change change, - @Assisted Account.Id author) { + DraftCommentNotes(Args args, @Assisted Change change, @Assisted Account.Id author) { this(args, change, author, true, null, null); } @AssistedInject - DraftCommentNotes( - Args args, - @Assisted Change.Id changeId, - @Assisted Account.Id author) { + DraftCommentNotes(Args args, @Assisted Change.Id changeId, @Assisted Account.Id author) { // PrimaryStorage is unknown; this should only called by // PatchLineCommentsUtil#draftByAuthor, which can live with this. super(args, changeId, null, false); @@ -115,7 +103,9 @@ public class DraftCommentNotes extends AbstractChangeNotes { checkArgument( ref.getName().equals(getRefName()), "draft ref not for change %s and account %s: %s", - getChangeId(), author, ref.getName()); + getChangeId(), + author, + ref.getName()); } } @@ -154,8 +144,7 @@ public class DraftCommentNotes extends AbstractChangeNotes { } @Override - protected void onLoad(LoadHandle handle) - throws IOException, ConfigInvalidException { + protected void onLoad(LoadHandle handle) throws IOException, ConfigInvalidException { ObjectId rev = handle.id(); if (rev == null) { loadDefaults(); @@ -164,11 +153,14 @@ public class DraftCommentNotes extends AbstractChangeNotes { RevCommit tipCommit = handle.walk().parseCommit(rev); ObjectReader reader = handle.walk().getObjectReader(); - revisionNoteMap = RevisionNoteMap.parse( - args.noteUtil, getChangeId(), reader, NoteMap.read(reader, tipCommit), - PatchLineComment.Status.DRAFT); - ListMultimap cs = - MultimapBuilder.hashKeys().arrayListValues().build(); + revisionNoteMap = + RevisionNoteMap.parse( + args.noteUtil, + getChangeId(), + reader, + NoteMap.read(reader, tipCommit), + PatchLineComment.Status.DRAFT); + ListMultimap cs = MultimapBuilder.hashKeys().arrayListValues().build(); for (ChangeRevisionNote rn : revisionNoteMap.revisionNotes.values()) { for (Comment c : rn.getComments()) { cs.put(new RevId(c.revId), c); @@ -188,8 +180,7 @@ public class DraftCommentNotes extends AbstractChangeNotes { } @Override - protected LoadHandle openHandle(Repository repo) - throws NoSuchChangeException, IOException { + protected LoadHandle openHandle(Repository repo) throws NoSuchChangeException, IOException { if (rebuildResult != null) { StagedResult sr = checkNotNull(rebuildResult.staged()); return LoadHandle.create( @@ -207,8 +198,7 @@ public class DraftCommentNotes extends AbstractChangeNotes { return super.openHandle(repo); } - private static ObjectId findNewId( - Iterable cmds, String refName) { + private static ObjectId findNewId(Iterable cmds, String refName) { for (ReceiveCommand cmd : cmds) { if (cmd.getRefName().equals(refName)) { return cmd.getNewId(); @@ -217,8 +207,7 @@ public class DraftCommentNotes extends AbstractChangeNotes { return null; } - private LoadHandle rebuildAndOpen(Repository repo) - throws NoSuchChangeException, IOException { + private LoadHandle rebuildAndOpen(Repository repo) throws NoSuchChangeException, IOException { Timer1.Context timer = args.metrics.autoRebuildLatency.start(CHANGES); try { Change.Id cid = getChangeId(); @@ -235,14 +224,11 @@ public class DraftCommentNotes extends AbstractChangeNotes { repo.scanForRepoChanges(); } catch (OrmException | IOException e) { // See ChangeNotes#rebuildAndOpen. - log.debug("Rebuilding change {} via drafts failed: {}", - getChangeId(), e.getMessage()); + log.debug("Rebuilding change {} via drafts failed: {}", getChangeId(), e.getMessage()); args.metrics.autoRebuildFailureCount.increment(CHANGES); checkNotNull(r.staged()); return LoadHandle.create( - ChangeNotesCommit.newStagedRevWalk( - repo, r.staged().allUsersObjects()), - draftsId(r)); + ChangeNotesCommit.newStagedRevWalk(repo, r.staged().allUsersObjects()), draftsId(r)); } } return LoadHandle.create(ChangeNotesCommit.newRevWalk(repo), draftsId(r)); @@ -251,11 +237,10 @@ public class DraftCommentNotes extends AbstractChangeNotes { } catch (OrmException e) { throw new IOException(e); } finally { - log.debug("Rebuilt change {} in {} in {} ms via drafts", + log.debug( + "Rebuilt change {} in {} in {} ms via drafts", getChangeId(), - change != null - ? "project " + change.getProject() - : "unknown project", + change != null ? "project " + change.getProject() : "unknown project", TimeUnit.MILLISECONDS.convert(timer.stop(), TimeUnit.NANOSECONDS)); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/GwtormChangeBundleReader.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/GwtormChangeBundleReader.java index e401a523cb..ee28d2991d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/GwtormChangeBundleReader.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/GwtormChangeBundleReader.java @@ -22,22 +22,18 @@ import com.google.gerrit.server.notedb.ChangeBundle.Source; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.util.List; @Singleton public class GwtormChangeBundleReader implements ChangeBundleReader { @Inject - GwtormChangeBundleReader() { - } + GwtormChangeBundleReader() {} @Override - public ChangeBundle fromReviewDb(ReviewDb db, Change.Id id) - throws OrmException { + public ChangeBundle fromReviewDb(ReviewDb db, Change.Id id) throws OrmException { db.changes().beginTransaction(id); try { - List approvals = - db.patchSetApprovals().byChange(id).toList(); + List approvals = db.patchSetApprovals().byChange(id).toList(); return new ChangeBundle( db.changes().get(id), db.changeMessages().byChange(id), diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbChangeState.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbChangeState.java index d488fcb0b7..1350a1f460 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbChangeState.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbChangeState.java @@ -36,10 +36,6 @@ import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.server.ReviewDbUtil; import com.google.gerrit.server.git.RefCache; import com.google.gwtorm.server.OrmRuntimeException; - -import org.eclipse.jgit.lib.Config; -import org.eclipse.jgit.lib.ObjectId; - import java.io.IOException; import java.sql.Timestamp; import java.util.HashMap; @@ -48,21 +44,23 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.concurrent.TimeUnit; +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.lib.ObjectId; /** - * The state of all relevant NoteDb refs across all repos corresponding to a - * given Change entity. - *

- * Stored serialized in the {@code Change#noteDbState} field, and used to - * determine whether the state in NoteDb is out of date. - *

- * Serialized in one of the forms: + * The state of all relevant NoteDb refs across all repos corresponding to a given Change entity. + * + *

Stored serialized in the {@code Change#noteDbState} field, and used to determine whether the + * state in NoteDb is out of date. + * + *

Serialized in one of the forms: + * *

    - *
  • [meta-sha],[account1]=[drafts-sha],[account2]=[drafts-sha]... - *
  • R,[meta-sha],[account1]=[drafts-sha],[account2]=[drafts-sha]... - *
  • R=[read-only-until],[meta-sha],[account1]=[drafts-sha],[account2]=[drafts-sha]... - *
  • N - *
  • N=[read-only-until] + *
  • [meta-sha],[account1]=[drafts-sha],[account2]=[drafts-sha]... + *
  • R,[meta-sha],[account1]=[drafts-sha],[account2]=[drafts-sha]... + *
  • R=[read-only-until],[meta-sha],[account1]=[drafts-sha],[account2]=[drafts-sha]... + *
  • N + *
  • N=[read-only-until] *
* * in numeric account ID order, with hex SHA-1s for human readability. @@ -92,54 +90,50 @@ public class NoteDbChangeState { @AutoValue public abstract static class Delta { @VisibleForTesting - public static Delta create(Change.Id changeId, + public static Delta create( + Change.Id changeId, Optional newChangeMetaId, Map newDraftIds) { if (newDraftIds == null) { newDraftIds = ImmutableMap.of(); } return new AutoValue_NoteDbChangeState_Delta( - changeId, - newChangeMetaId, - ImmutableMap.copyOf(newDraftIds)); + changeId, newChangeMetaId, ImmutableMap.copyOf(newDraftIds)); } abstract Change.Id changeId(); + abstract Optional newChangeMetaId(); + abstract ImmutableMap newDraftIds(); } @AutoValue public abstract static class RefState { @VisibleForTesting - public static RefState create(ObjectId changeMetaId, - Map draftIds) { + public static RefState create(ObjectId changeMetaId, Map draftIds) { return new AutoValue_NoteDbChangeState_RefState( changeMetaId.copy(), - ImmutableMap.copyOf( - Maps.filterValues(draftIds, id -> !ObjectId.zeroId().equals(id)))); + ImmutableMap.copyOf(Maps.filterValues(draftIds, id -> !ObjectId.zeroId().equals(id)))); } - private static Optional parse(Change.Id changeId, - List parts) { - checkArgument(!parts.isEmpty(), - "missing state string for change %s", changeId); + private static Optional parse(Change.Id changeId, List parts) { + checkArgument(!parts.isEmpty(), "missing state string for change %s", changeId); ObjectId changeMetaId = ObjectId.fromString(parts.get(0)); - Map draftIds = - Maps.newHashMapWithExpectedSize(parts.size() - 1); + Map draftIds = Maps.newHashMapWithExpectedSize(parts.size() - 1); Splitter s = Splitter.on('='); for (int i = 1; i < parts.size(); i++) { String p = parts.get(i); List draftParts = s.splitToList(p); - checkArgument(draftParts.size() == 2, - "invalid draft state part for change %s: %s", changeId, p); - draftIds.put(Account.Id.parse(draftParts.get(0)), - ObjectId.fromString(draftParts.get(1))); + checkArgument( + draftParts.size() == 2, "invalid draft state part for change %s: %s", changeId, p); + draftIds.put(Account.Id.parse(draftParts.get(0)), ObjectId.fromString(draftParts.get(1))); } return Optional.of(create(changeMetaId, draftIds)); } abstract ObjectId changeMetaId(); + abstract ImmutableMap draftIds(); @Override @@ -149,12 +143,8 @@ public class NoteDbChangeState { StringBuilder appendTo(StringBuilder sb) { sb.append(changeMetaId().name()); - for (Account.Id id : ReviewDbUtil.intKeyOrdering() - .sortedCopy(draftIds().keySet())) { - sb.append(',') - .append(id.get()) - .append('=') - .append(draftIds().get(id).name()); + for (Account.Id id : ReviewDbUtil.intKeyOrdering().sortedCopy(draftIds().keySet())) { + sb.append(',').append(id.get()).append('=').append(draftIds().get(id).name()); } return sb; } @@ -177,8 +167,7 @@ public class NoteDbChangeState { // Only valid NOTE_DB state is "N". if (parts.size() == 1 && first.charAt(0) == NOTE_DB.code) { - return new NoteDbChangeState( - id, NOTE_DB, Optional.empty(), readOnlyUntil); + return new NoteDbChangeState(id, NOTE_DB, Optional.empty(), readOnlyUntil); } // Otherwise it must be REVIEW_DB, either "R," or just @@ -195,8 +184,8 @@ public class NoteDbChangeState { throw invalidState(id, str); } - private static Optional parseReadOnlyUntil(Change.Id id, - String fullStr, String first) { + private static Optional parseReadOnlyUntil( + Change.Id id, String fullStr, String first) { if (first.length() > 2 && first.charAt(1) == '=') { Long ts = Longs.tryParse(first.substring(2)); if (ts == null) { @@ -207,25 +196,20 @@ public class NoteDbChangeState { return Optional.empty(); } - private static IllegalArgumentException invalidState(Change.Id id, - String str) { - return new IllegalArgumentException( - "invalid state string for change " + id + ": " + str); + private static IllegalArgumentException invalidState(Change.Id id, String str) { + return new IllegalArgumentException("invalid state string for change " + id + ": " + str); } /** * Apply a delta to the state stored in a change entity. - *

- * This method does not check whether the old state was read-only; it is up to - * the caller to not violate read-only semantics when storing the change back - * in ReviewDb. * - * @param change change entity. The delta is applied against this entity's - * {@code noteDbState} and the new state is stored back in the entity as a - * side effect. + *

This method does not check whether the old state was read-only; it is up to the caller to + * not violate read-only semantics when storing the change back in ReviewDb. + * + * @param change change entity. The delta is applied against this entity's {@code noteDbState} and + * the new state is stored back in the entity as a side effect. * @param delta delta to apply. - * @return new state, equivalent to what is stored in {@code change} as a side - * effect. + * @return new state, equivalent to what is stored in {@code change} as a side effect. */ public static NoteDbChangeState applyDelta(Change change, Delta delta) { if (delta == null) { @@ -267,16 +251,15 @@ public class NoteDbChangeState { } } - NoteDbChangeState state = new NoteDbChangeState( - change.getId(), - oldState != null - ? oldState.getPrimaryStorage() - : REVIEW_DB, - Optional.of(RefState.create(changeMetaId, draftIds)), - // Copy old read-only deadline rather than advancing it; the caller is - // still responsible for finishing the rest of its work before the lease - // runs out. - oldState != null ? oldState.getReadOnlyUntil() : Optional.empty()); + NoteDbChangeState state = + new NoteDbChangeState( + change.getId(), + oldState != null ? oldState.getPrimaryStorage() : REVIEW_DB, + Optional.of(RefState.create(changeMetaId, draftIds)), + // Copy old read-only deadline rather than advancing it; the caller is + // still responsible for finishing the rest of its work before the lease + // runs out. + oldState != null ? oldState.getReadOnlyUntil() : Optional.empty()); change.setNoteDbState(state.toString()); return state; } @@ -287,8 +270,9 @@ public class NoteDbChangeState { // - can't be methods on NoteDbChangeState because state is nullable (though // we could also solve this by inventing an empty-but-non-null state) // Also we should clean up duplicated code between static/non-static methods. - public static boolean isChangeUpToDate(@Nullable NoteDbChangeState state, - RefCache changeRepoRefs, Change.Id changeId) throws IOException { + public static boolean isChangeUpToDate( + @Nullable NoteDbChangeState state, RefCache changeRepoRefs, Change.Id changeId) + throws IOException { if (PrimaryStorage.of(state) == NOTE_DB) { return true; // Primary storage is NoteDb, up to date by definition. } @@ -298,22 +282,23 @@ public class NoteDbChangeState { return state.isChangeUpToDate(changeRepoRefs); } - public static boolean areDraftsUpToDate(@Nullable NoteDbChangeState state, - RefCache draftsRepoRefs, Change.Id changeId, Account.Id accountId) + public static boolean areDraftsUpToDate( + @Nullable NoteDbChangeState state, + RefCache draftsRepoRefs, + Change.Id changeId, + Account.Id accountId) throws IOException { if (PrimaryStorage.of(state) == NOTE_DB) { return true; // Primary storage is NoteDb, up to date by definition. } if (state == null) { - return !draftsRepoRefs.get(refsDraftComments(changeId, accountId)) - .isPresent(); + return !draftsRepoRefs.get(refsDraftComments(changeId, accountId)).isPresent(); } return state.areDraftsUpToDate(draftsRepoRefs, accountId); } public static long getReadOnlySkew(Config cfg) { - return cfg.getTimeUnit( - "notedb", null, "maxTimestampSkew", 1000, TimeUnit.MILLISECONDS); + return cfg.getTimeUnit("notedb", null, "maxTimestampSkew", 1000, TimeUnit.MILLISECONDS); } private static Timestamp timeForReadOnlyCheck(long skewMs) { @@ -326,14 +311,15 @@ public class NoteDbChangeState { checkNotReadOnly(parse(change), skewMs); } - public static void checkNotReadOnly(@Nullable NoteDbChangeState state, - long skewMs) { + public static void checkNotReadOnly(@Nullable NoteDbChangeState state, long skewMs) { if (state == null) { return; // No state means ReviewDb primary non-read-only. } else if (state.isReadOnly(timeForReadOnlyCheck(skewMs))) { throw new OrmRuntimeException( - "change " + state.getChangeId() + " is read-only until " - + state.getReadOnlyUntil().get()); + "change " + + state.getChangeId() + + " is read-only until " + + state.getReadOnlyUntil().get()); } } @@ -357,17 +343,18 @@ public class NoteDbChangeState { checkArgument( refState.isPresent(), "expected RefState for change %s with primary storage %s", - changeId, primaryStorage); + changeId, + primaryStorage); break; case NOTE_DB: checkArgument( !refState.isPresent(), "expected no RefState for change %s with primary storage %s", - changeId, primaryStorage); + changeId, + primaryStorage); break; default: - throw new IllegalStateException( - "invalid PrimaryStorage: " + primaryStorage); + throw new IllegalStateException("invalid PrimaryStorage: " + primaryStorage); } } @@ -391,16 +378,14 @@ public class NoteDbChangeState { if (primaryStorage == NOTE_DB) { return true; // Primary storage is NoteDb, up to date by definition. } - Optional id = - draftsRepoRefs.get(refsDraftComments(changeId, accountId)); + Optional id = draftsRepoRefs.get(refsDraftComments(changeId, accountId)); if (!id.isPresent()) { return !getDraftIds().containsKey(accountId); } return id.get().equals(getDraftIds().get(accountId)); } - public boolean isUpToDate(RefCache changeRepoRefs, RefCache draftsRepoRefs) - throws IOException { + public boolean isUpToDate(RefCache changeRepoRefs, RefCache draftsRepoRefs) throws IOException { if (primaryStorage == NOTE_DB) { return true; // Primary storage is NoteDb, up to date by definition. } @@ -424,8 +409,7 @@ public class NoteDbChangeState { } public NoteDbChangeState withReadOnlyUntil(Timestamp ts) { - return new NoteDbChangeState( - changeId, primaryStorage, refState, Optional.of(ts)); + return new NoteDbChangeState(changeId, primaryStorage, refState, Optional.of(ts)); } public Change.Id getChangeId() { @@ -445,8 +429,7 @@ public class NoteDbChangeState { } private RefState refState() { - checkState(refState.isPresent(), - "state for %s has no RefState: %s", changeId, this); + checkState(refState.isPresent(), "state for %s has no RefState: %s", changeId, this); return refState.get(); } @@ -458,16 +441,14 @@ public class NoteDbChangeState { // Don't include enum field, just IDs (though parse would accept it). return refState().toString(); } - return primaryStorage.code + "=" + readOnlyUntil.get().getTime() - + "," + refState.get(); + return primaryStorage.code + "=" + readOnlyUntil.get().getTime() + "," + refState.get(); case NOTE_DB: if (!readOnlyUntil.isPresent()) { return NOTE_DB_PRIMARY_STATE; } return primaryStorage.code + "=" + readOnlyUntil.get().getTime(); default: - throw new IllegalArgumentException( - "Unsupported PrimaryStorage: " + primaryStorage); + throw new IllegalArgumentException("Unsupported PrimaryStorage: " + primaryStorage); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbMetrics.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbMetrics.java index 24e87de33e..be06d1197d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbMetrics.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbMetrics.java @@ -29,30 +29,25 @@ class NoteDbMetrics { final Timer1 updateLatency; /** - * The portion of {@link #updateLatency} due to preparing the sequence of - * updates. - *

- * May include some I/O (e.g. reading old refs), but excludes writes. + * The portion of {@link #updateLatency} due to preparing the sequence of updates. + * + *

May include some I/O (e.g. reading old refs), but excludes writes. */ final Timer1 stageUpdateLatency; - /** - * End-to-end latency for reading changes from NoteDb, including reading - * ref(s) and parsing. - */ + /** End-to-end latency for reading changes from NoteDb, including reading ref(s) and parsing. */ final Timer1 readLatency; /** - * The portion of {@link #readLatency} due to parsing commits, but excluding - * I/O (to a best effort). + * The portion of {@link #readLatency} due to parsing commits, but excluding I/O (to a best + * effort). */ final Timer1 parseLatency; /** * Latency due to auto-rebuilding entities when out of date. - *

- * Excludes latency from reading ref to check whether the entity is up to - * date. + * + *

Excludes latency from reading ref to check whether the entity is up to date. */ final Timer1 autoRebuildLatency; @@ -63,45 +58,50 @@ class NoteDbMetrics { NoteDbMetrics(MetricMaker metrics) { Field view = Field.ofEnum(NoteDbTable.class, "table"); - updateLatency = metrics.newTimer( - "notedb/update_latency", - new Description("NoteDb update latency by table") - .setCumulative() - .setUnit(Units.MILLISECONDS), - view); + updateLatency = + metrics.newTimer( + "notedb/update_latency", + new Description("NoteDb update latency by table") + .setCumulative() + .setUnit(Units.MILLISECONDS), + view); - stageUpdateLatency = metrics.newTimer( - "notedb/stage_update_latency", - new Description("Latency for staging updates to NoteDb by table") - .setCumulative() - .setUnit(Units.MICROSECONDS), - view); + stageUpdateLatency = + metrics.newTimer( + "notedb/stage_update_latency", + new Description("Latency for staging updates to NoteDb by table") + .setCumulative() + .setUnit(Units.MICROSECONDS), + view); - readLatency = metrics.newTimer( - "notedb/read_latency", - new Description("NoteDb read latency by table") - .setCumulative() - .setUnit(Units.MILLISECONDS), - view); + readLatency = + metrics.newTimer( + "notedb/read_latency", + new Description("NoteDb read latency by table") + .setCumulative() + .setUnit(Units.MILLISECONDS), + view); - parseLatency = metrics.newTimer( - "notedb/parse_latency", - new Description("NoteDb parse latency by table") - .setCumulative() - .setUnit(Units.MICROSECONDS), - view); + parseLatency = + metrics.newTimer( + "notedb/parse_latency", + new Description("NoteDb parse latency by table") + .setCumulative() + .setUnit(Units.MICROSECONDS), + view); - autoRebuildLatency = metrics.newTimer( - "notedb/auto_rebuild_latency", - new Description("NoteDb auto-rebuilding latency by table") - .setCumulative() - .setUnit(Units.MILLISECONDS), - view); + autoRebuildLatency = + metrics.newTimer( + "notedb/auto_rebuild_latency", + new Description("NoteDb auto-rebuilding latency by table") + .setCumulative() + .setUnit(Units.MILLISECONDS), + view); - autoRebuildFailureCount = metrics.newCounter( - "notedb/auto_rebuild_failure_count", - new Description("NoteDb auto-rebuilding attempts that failed by table") - .setCumulative(), - view); + autoRebuildFailureCount = + metrics.newCounter( + "notedb/auto_rebuild_failure_count", + new Description("NoteDb auto-rebuilding attempts that failed by table").setCumulative(), + view); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbModule.java index 79348841ad..0b01e148ec 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbModule.java @@ -25,7 +25,6 @@ import com.google.gerrit.server.notedb.rebuild.ChangeRebuilder; import com.google.gerrit.server.notedb.rebuild.ChangeRebuilderImpl; import com.google.inject.TypeLiteral; import com.google.inject.name.Names; - import org.eclipse.jgit.lib.Config; public class NoteDbModule extends FactoryModule { @@ -63,44 +62,43 @@ public class NoteDbModule extends FactoryModule { bind(ChangeRebuilder.class).to(ChangeRebuilderImpl.class); } } else { - bind(ChangeRebuilder.class).toInstance(new ChangeRebuilder(null) { - @Override - public Result rebuild(ReviewDb db, Change.Id changeId) { - return null; - } + bind(ChangeRebuilder.class) + .toInstance( + new ChangeRebuilder(null) { + @Override + public Result rebuild(ReviewDb db, Change.Id changeId) { + return null; + } - @Override - public Result rebuildEvenIfReadOnly(ReviewDb db, Id changeId) { - return null; - } + @Override + public Result rebuildEvenIfReadOnly(ReviewDb db, Id changeId) { + return null; + } - @Override - public Result rebuild(NoteDbUpdateManager manager, - ChangeBundle bundle) { - return null; - } + @Override + public Result rebuild(NoteDbUpdateManager manager, ChangeBundle bundle) { + return null; + } - @Override - public NoteDbUpdateManager stage(ReviewDb db, Change.Id changeId) { - return null; - } + @Override + public NoteDbUpdateManager stage(ReviewDb db, Change.Id changeId) { + return null; + } - @Override - public Result execute(ReviewDb db, Change.Id changeId, - NoteDbUpdateManager manager) { - return null; - } + @Override + public Result execute( + ReviewDb db, Change.Id changeId, NoteDbUpdateManager manager) { + return null; + } - @Override - public void buildUpdates(NoteDbUpdateManager manager, - ChangeBundle bundle) { - // Do nothing. - } - }); + @Override + public void buildUpdates(NoteDbUpdateManager manager, ChangeBundle bundle) { + // Do nothing. + } + }); bind(new TypeLiteral>() {}) .annotatedWith(Names.named(ChangeNotesCache.CACHE_NAME)) - .toInstance(CacheBuilder.newBuilder() - .build()); + .toInstance(CacheBuilder.newBuilder().build()); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbUpdateManager.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbUpdateManager.java index b5adea6f3e..cc738e56d1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbUpdateManager.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbUpdateManager.java @@ -45,7 +45,13 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - +import java.io.IOException; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Optional; +import java.util.Set; import org.eclipse.jgit.lib.BatchRefUpdate; import org.eclipse.jgit.lib.NullProgressMonitor; import org.eclipse.jgit.lib.ObjectId; @@ -57,22 +63,14 @@ import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.transport.ReceiveCommand; -import java.io.IOException; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Optional; -import java.util.Set; - /** * Object to manage a single sequence of updates to NoteDb. - *

- * Instances are one-time-use. Handles updating both the change repo and the - * All-Users repo for any affected changes, with proper ordering. - *

- * To see the state that would be applied prior to executing the full sequence - * of updates, use {@link #stage()}. + * + *

Instances are one-time-use. Handles updating both the change repo and the All-Users repo for + * any affected changes, with proper ordering. + * + *

To see the state that would be applied prior to executing the full sequence of updates, use + * {@link #stage()}. */ public class NoteDbUpdateManager implements AutoCloseable { public static final String CHANGES_READ_ONLY = "NoteDb changes are read-only"; @@ -83,9 +81,8 @@ public class NoteDbUpdateManager implements AutoCloseable { @AutoValue public abstract static class StagedResult { - private static StagedResult create(Change.Id id, - NoteDbChangeState.Delta delta, OpenRepo changeRepo, - OpenRepo allUsersRepo) { + private static StagedResult create( + Change.Id id, NoteDbChangeState.Delta delta, OpenRepo changeRepo, OpenRepo allUsersRepo) { ImmutableList changeCommands = ImmutableList.of(); ImmutableList changeObjects = ImmutableList.of(); if (changeRepo != null) { @@ -105,24 +102,30 @@ public class NoteDbUpdateManager implements AutoCloseable { } public abstract Change.Id id(); - @Nullable public abstract NoteDbChangeState.Delta delta(); + + @Nullable + public abstract NoteDbChangeState.Delta delta(); + public abstract ImmutableList changeCommands(); + public abstract ImmutableList changeObjects(); public abstract ImmutableList allUsersCommands(); + public abstract ImmutableList allUsersObjects(); } @AutoValue public abstract static class Result { - static Result create(NoteDbUpdateManager.StagedResult staged, - NoteDbChangeState newState) { + static Result create(NoteDbUpdateManager.StagedResult staged, NoteDbChangeState newState) { return new AutoValue_NoteDbUpdateManager_Result(newState, staged); } - @Nullable public abstract NoteDbChangeState newState(); + @Nullable + public abstract NoteDbChangeState newState(); - @Nullable abstract NoteDbUpdateManager.StagedResult staged(); + @Nullable + abstract NoteDbUpdateManager.StagedResult staged(); } public static class OpenRepo implements AutoCloseable { @@ -135,12 +138,18 @@ public class NoteDbUpdateManager implements AutoCloseable { private final boolean close; - private OpenRepo(Repository repo, RevWalk rw, @Nullable ObjectInserter ins, - ChainedReceiveCommands cmds, boolean close) { + private OpenRepo( + Repository repo, + RevWalk rw, + @Nullable ObjectInserter ins, + ChainedReceiveCommands cmds, + boolean close) { ObjectReader reader = rw.getObjectReader(); - checkArgument(ins == null || reader.getCreatedFromInserter() == ins, + checkArgument( + ins == null || reader.getCreatedFromInserter() == ins, "expected reader to be created from %s, but was %s", - ins, reader.getCreatedFromInserter()); + ins, + reader.getCreatedFromInserter()); this.repo = checkNotNull(repo); this.tempIns = new InMemoryInserter(rw.getObjectReader()); this.rw = new RevWalk(tempIns.newReader()); @@ -197,7 +206,8 @@ public class NoteDbUpdateManager implements AutoCloseable { private PersonIdent refLogIdent; @AssistedInject - NoteDbUpdateManager(@GerritPersonIdent Provider serverIdent, + NoteDbUpdateManager( + @GerritPersonIdent Provider serverIdent, GitRepositoryManager repoManager, NotesMigration migration, AllUsersName allUsersName, @@ -232,15 +242,15 @@ public class NoteDbUpdateManager implements AutoCloseable { } } - public NoteDbUpdateManager setChangeRepo(Repository repo, RevWalk rw, - @Nullable ObjectInserter ins, ChainedReceiveCommands cmds) { + public NoteDbUpdateManager setChangeRepo( + Repository repo, RevWalk rw, @Nullable ObjectInserter ins, ChainedReceiveCommands cmds) { checkState(changeRepo == null, "change repo already initialized"); changeRepo = new OpenRepo(repo, rw, ins, cmds, false); return this; } - public NoteDbUpdateManager setAllUsersRepo(Repository repo, RevWalk rw, - @Nullable ObjectInserter ins, ChainedReceiveCommands cmds) { + public NoteDbUpdateManager setAllUsersRepo( + Repository repo, RevWalk rw, @Nullable ObjectInserter ins, ChainedReceiveCommands cmds) { checkState(allUsersRepo == null, "All-Users repo already initialized"); allUsersRepo = new OpenRepo(repo, rw, ins, cmds, false); return this; @@ -286,8 +296,8 @@ public class NoteDbUpdateManager implements AutoCloseable { private OpenRepo openRepo(Project.NameKey p) throws IOException { Repository repo = repoManager.openRepository(p); ObjectInserter ins = repo.newObjectInserter(); - return new OpenRepo(repo, new RevWalk(ins.newReader()), ins, - new ChainedReceiveCommands(repo), true); + return new OpenRepo( + repo, new RevWalk(ins.newReader()), ins, new ChainedReceiveCommands(repo), true); } private boolean isEmpty() { @@ -302,16 +312,18 @@ public class NoteDbUpdateManager implements AutoCloseable { /** * Add an update to the list of updates to execute. - *

- * Updates should only be added to the manager after all mutations have been - * made, as this method may eagerly access the update. + * + *

Updates should only be added to the manager after all mutations have been made, as this + * method may eagerly access the update. * * @param update the update to add. */ public void add(ChangeUpdate update) { - checkArgument(update.getProjectName().equals(projectName), - "update for project %s cannot be added to manager for project %s", - update.getProjectName(), projectName); + checkArgument( + update.getProjectName().equals(projectName), + "update for project %s cannot be added to manager for project %s", + update.getProjectName(), + projectName); checkState(staged == null, "cannot add new update after staging"); changeUpdates.put(update.getRefName(), update); ChangeDraftUpdate du = update.getDraftUpdate(); @@ -337,13 +349,12 @@ public class NoteDbUpdateManager implements AutoCloseable { /** * Stage updates in the manager's internal list of commands. * - * @return map of the state that would get written to the applicable repo(s) - * for each affected change. + * @return map of the state that would get written to the applicable repo(s) for each affected + * change. * @throws OrmException if a database layer error occurs. * @throws IOException if a storage layer error occurs. */ - public Map stage() - throws OrmException, IOException { + public Map stage() throws OrmException, IOException { if (staged != null) { return staged; } @@ -372,20 +383,23 @@ public class NoteDbUpdateManager implements AutoCloseable { changeId, NoteDbChangeState.Delta.create( changeId, metaId, allDraftIds.rowMap().remove(changeId)), - changeRepo, allUsersRepo)); + changeRepo, + allUsersRepo)); } - for (Map.Entry> e - : allDraftIds.rowMap().entrySet()) { + for (Map.Entry> e : allDraftIds.rowMap().entrySet()) { // If a change remains in the table at this point, it means we are // updating its drafts but not the change itself. - StagedResult r = StagedResult.create( - e.getKey(), - NoteDbChangeState.Delta.create( - e.getKey(), Optional.empty(), e.getValue()), - changeRepo, allUsersRepo); - checkState(r.changeCommands().isEmpty(), - "should not have change commands when updating only drafts: %s", r); + StagedResult r = + StagedResult.create( + e.getKey(), + NoteDbChangeState.Delta.create(e.getKey(), Optional.empty(), e.getValue()), + changeRepo, + allUsersRepo); + checkState( + r.changeCommands().isEmpty(), + "should not have change commands when updating only drafts: %s", + r); staged.put(r.id(), r); } @@ -393,8 +407,7 @@ public class NoteDbUpdateManager implements AutoCloseable { } } - public Result stageAndApplyDelta(Change change) - throws OrmException, IOException { + public Result stageAndApplyDelta(Change change) throws OrmException, IOException { StagedResult sr = stage().get(change.getId()); NoteDbChangeState newState = NoteDbChangeState.applyDelta(change, sr != null ? sr.delta() : null); @@ -409,8 +422,7 @@ public class NoteDbUpdateManager implements AutoCloseable { for (ReceiveCommand cmd : allUsersRepo.getCommandsSnapshot()) { String r = cmd.getRefName(); if (r.startsWith(REFS_DRAFT_COMMENTS)) { - Change.Id changeId = - Change.Id.fromRefPart(r.substring(REFS_DRAFT_COMMENTS.length())); + Change.Id changeId = Change.Id.fromRefPart(r.substring(REFS_DRAFT_COMMENTS.length())); Account.Id accountId = Account.Id.fromRefSuffix(r); checkDraftRef(accountId != null && changeId != null, r); draftIds.put(changeId, accountId, cmd.getNewId()); @@ -459,8 +471,7 @@ public class NoteDbUpdateManager implements AutoCloseable { } or.flush(); BatchRefUpdate bru = or.repo.getRefDatabase().newBatchUpdate(); - bru.setRefLogMessage( - firstNonNull(refLogMessage, "Update NoteDb refs"), false); + bru.setRefLogMessage(firstNonNull(refLogMessage, "Update NoteDb refs"), false); bru.setRefLogIdent(refLogIdent != null ? refLogIdent : serverIdent.get()); or.cmds.addTo(bru); bru.setAllowNonFastForwards(true); @@ -497,17 +508,15 @@ public class NoteDbUpdateManager implements AutoCloseable { String metaRef = RefNames.changeMetaRef(id); Optional old = changeRepo.cmds.get(metaRef); if (old.isPresent()) { - changeRepo.cmds.add( - new ReceiveCommand(old.get(), ObjectId.zeroId(), metaRef)); + changeRepo.cmds.add(new ReceiveCommand(old.get(), ObjectId.zeroId(), metaRef)); } // Just scan repo for ref names, but get "old" values from cmds. - for (Ref r : allUsersRepo.repo.getRefDatabase().getRefs( - RefNames.refsDraftCommentsPrefix(id)).values()) { + for (Ref r : + allUsersRepo.repo.getRefDatabase().getRefs(RefNames.refsDraftCommentsPrefix(id)).values()) { old = allUsersRepo.cmds.get(r.getName()); if (old.isPresent()) { - allUsersRepo.cmds.add( - new ReceiveCommand(old.get(), ObjectId.zeroId(), r.getName())); + allUsersRepo.cmds.add(new ReceiveCommand(old.get(), ObjectId.zeroId(), r.getName())); } } } @@ -516,10 +525,10 @@ public class NoteDbUpdateManager implements AutoCloseable { private static final long serialVersionUID = 1L; private MismatchedStateException(Change.Id id, NoteDbChangeState expectedState) { - super(String.format( - "cannot apply NoteDb updates for change %s;" - + " change meta ref does not match %s", - id, expectedState.getChangeMetaId().name())); + super( + String.format( + "cannot apply NoteDb updates for change %s;" + " change meta ref does not match %s", + id, expectedState.getChangeMetaId().name())); } } @@ -565,27 +574,25 @@ public class NoteDbUpdateManager implements AutoCloseable { ChangeDraftUpdate u = us.iterator().next(); NoteDbChangeState expectedState = NoteDbChangeState.parse(u.getChange()); - if (expectedState == null - || expectedState.getPrimaryStorage() == PrimaryStorage.NOTE_DB) { + if (expectedState == null || expectedState.getPrimaryStorage() == PrimaryStorage.NOTE_DB) { continue; // See above. } Account.Id accountId = u.getAccountId(); - if (!expectedState.areDraftsUpToDate( - allUsersRepo.cmds.getRepoRefCache(), accountId)) { - ObjectId expectedDraftId = firstNonNull( - expectedState.getDraftIds().get(accountId), ObjectId.zeroId()); - throw new OrmConcurrencyException(String.format( - "cannot apply NoteDb updates for change %s;" - + " draft ref for account %s does not match %s", - u.getId(), accountId, expectedDraftId.name())); + if (!expectedState.areDraftsUpToDate(allUsersRepo.cmds.getRepoRefCache(), accountId)) { + ObjectId expectedDraftId = + firstNonNull(expectedState.getDraftIds().get(accountId), ObjectId.zeroId()); + throw new OrmConcurrencyException( + String.format( + "cannot apply NoteDb updates for change %s;" + + " draft ref for account %s does not match %s", + u.getId(), accountId, expectedDraftId.name())); } } } private static void addUpdates( - ListMultimap all, OpenRepo or) - throws OrmException, IOException { + ListMultimap all, OpenRepo or) throws OrmException, IOException { for (Map.Entry> e : all.asMap().entrySet()) { String refName = e.getKey(); Collection updates = e.getValue(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NotesMigration.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NotesMigration.java index 6afe87d1d5..773042df5a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NotesMigration.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NotesMigration.java @@ -18,58 +18,52 @@ import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage; /** * Holds the current state of the NoteDb migration. - *

- * The migration will proceed one root entity type at a time. A root - * entity is an entity stored in ReviewDb whose key's - * {@code getParentKey()} method returns null. For an example of the entity - * hierarchy rooted at Change, see the diagram in - * {@code com.google.gerrit.reviewdb.client.Change}. - *

- * During a transitional period, each root entity group from ReviewDb may be - * either written to or both written to and read from NoteDb. - *

- * This class controls the state of the migration according to options in - * {@code gerrit.config}. In general, any changes to these options should only - * be made by adventurous administrators, who know what they're doing, on - * non-production data, for the purposes of testing the NoteDb implementation. - * Changing options quite likely requires re-running {@code RebuildNoteDb}. For + * + *

The migration will proceed one root entity type at a time. A root entity is an entity + * stored in ReviewDb whose key's {@code getParentKey()} method returns null. For an example of the + * entity hierarchy rooted at Change, see the diagram in {@code + * com.google.gerrit.reviewdb.client.Change}. + * + *

During a transitional period, each root entity group from ReviewDb may be either written + * to or both written to and read from NoteDb. + * + *

This class controls the state of the migration according to options in {@code gerrit.config}. + * In general, any changes to these options should only be made by adventurous administrators, who + * know what they're doing, on non-production data, for the purposes of testing the NoteDb + * implementation. Changing options quite likely requires re-running {@code RebuildNoteDb}. For * these reasons, the options remain undocumented. */ public abstract class NotesMigration { /** * Read changes from NoteDb. - *

- * Change data is read from NoteDb refs, but ReviewDb is still the source of - * truth. If the loader determines NoteDb is out of date, the change data in - * NoteDb will be transparently rebuilt. This means that some code paths that - * look read-only may in fact attempt to write. - *

- * If true and {@code writeChanges() = false}, changes can still be read from - * NoteDb, but any attempts to write will generate an error. + * + *

Change data is read from NoteDb refs, but ReviewDb is still the source of truth. If the + * loader determines NoteDb is out of date, the change data in NoteDb will be transparently + * rebuilt. This means that some code paths that look read-only may in fact attempt to write. + * + *

If true and {@code writeChanges() = false}, changes can still be read from NoteDb, but any + * attempts to write will generate an error. */ public abstract boolean readChanges(); /** * Write changes to NoteDb. - *

- * Updates to change data are written to NoteDb refs, but ReviewDb is still - * the source of truth. Change data will not be written unless the NoteDb refs - * are already up to date, and the write path will attempt to rebuild the - * change if not. - *

- * If false, the behavior when attempting to write depends on - * {@code readChanges()}. If {@code readChanges() = false}, writes to NoteDb - * are simply ignored; if {@code true}, any attempts to write will generate an - * error. + * + *

Updates to change data are written to NoteDb refs, but ReviewDb is still the source of + * truth. Change data will not be written unless the NoteDb refs are already up to date, and the + * write path will attempt to rebuild the change if not. + * + *

If false, the behavior when attempting to write depends on {@code readChanges()}. If {@code + * readChanges() = false}, writes to NoteDb are simply ignored; if {@code true}, any attempts to + * write will generate an error. */ protected abstract boolean writeChanges(); /** * Read sequential change ID numbers from NoteDb. - *

- * If true, change IDs are read from {@code refs/sequences/changes} in - * All-Projects. If false, change IDs are read from ReviewDb's native - * sequences. + * + *

If true, change IDs are read from {@code refs/sequences/changes} in All-Projects. If false, + * change IDs are read from ReviewDb's native sequences. */ public abstract boolean readChangeSequence(); @@ -82,8 +76,8 @@ public abstract class NotesMigration { /** * Whether to fail when reading any data from NoteDb. - *

- * Used in conjunction with {@link #readChanges()} for tests. + * + *

Used in conjunction with {@link #readChanges()} for tests. */ public boolean failOnLoad() { return false; @@ -108,7 +102,6 @@ public abstract class NotesMigration { } public boolean enabled() { - return writeChanges() || readChanges() - || writeAccounts() || readAccounts(); + return writeChanges() || readChanges() || writeAccounts() || readAccounts(); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/PatchSetState.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/PatchSetState.java index 39cd6cc010..32be9c5a94 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/PatchSetState.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/PatchSetState.java @@ -15,7 +15,7 @@ package com.google.gerrit.server.notedb; public enum PatchSetState { - /** Published and visible to anyone who can see the change; the default.*/ + /** Published and visible to anyone who can see the change; the default. */ PUBLISHED, /** Draft patch set, only visible to certain users. */ @@ -23,9 +23,9 @@ public enum PatchSetState { /** * Deleted patch set. - *

- * Used internally as a tombstone; patch sets exposed by public NoteDb - * interfaces never have this state. + * + *

Used internally as a tombstone; patch sets exposed by public NoteDb interfaces never have + * this state. */ DELETED; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/PrimaryStorageMigrator.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/PrimaryStorageMigrator.java index 0a5c014206..10345c8d2c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/PrimaryStorageMigrator.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/PrimaryStorageMigrator.java @@ -19,6 +19,11 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.concurrent.TimeUnit.NANOSECONDS; import static java.util.concurrent.TimeUnit.SECONDS; +import com.github.rholder.retry.RetryException; +import com.github.rholder.retry.Retryer; +import com.github.rholder.retry.RetryerBuilder; +import com.github.rholder.retry.StopStrategies; +import com.github.rholder.retry.WaitStrategies; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Stopwatch; import com.google.gerrit.common.Nullable; @@ -39,30 +44,21 @@ import com.google.gwtorm.server.OrmRuntimeException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import com.github.rholder.retry.RetryException; -import com.github.rholder.retry.Retryer; -import com.github.rholder.retry.RetryerBuilder; -import com.github.rholder.retry.StopStrategies; -import com.github.rholder.retry.WaitStrategies; - +import java.io.IOException; +import java.sql.Timestamp; +import java.util.Objects; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.atomic.AtomicBoolean; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.Repository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.sql.Timestamp; -import java.util.Objects; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.atomic.AtomicBoolean; - /** Helper to migrate the {@link PrimaryStorage} of individual changes. */ @Singleton public class PrimaryStorageMigrator { - private static final Logger log = - LoggerFactory.getLogger(PrimaryStorageMigrator.class); + private static final Logger log = LoggerFactory.getLogger(PrimaryStorageMigrator.class); private final Provider db; private final GitRepositoryManager repoManager; @@ -74,7 +70,8 @@ public class PrimaryStorageMigrator { private final Retryer testEnsureRebuiltRetryer; @Inject - PrimaryStorageMigrator(@GerritServerConfig Config cfg, + PrimaryStorageMigrator( + @GerritServerConfig Config cfg, Provider db, GitRepositoryManager repoManager, AllUsersName allUsers, @@ -83,7 +80,8 @@ public class PrimaryStorageMigrator { } @VisibleForTesting - public PrimaryStorageMigrator(Config cfg, + public PrimaryStorageMigrator( + Config cfg, Provider db, GitRepositoryManager repoManager, AllUsersName allUsers, @@ -97,38 +95,37 @@ public class PrimaryStorageMigrator { skewMs = NoteDbChangeState.getReadOnlySkew(cfg); String s = "notedb"; - timeoutMs = cfg.getTimeUnit( - s, null, "primaryStorageMigrationTimeout", - MILLISECONDS.convert(60, SECONDS), MILLISECONDS); + timeoutMs = + cfg.getTimeUnit( + s, + null, + "primaryStorageMigrationTimeout", + MILLISECONDS.convert(60, SECONDS), + MILLISECONDS); } /** * Migrate a change's primary storage from ReviewDb to NoteDb. - *

- * This method will return only if the primary storage of the change is NoteDb - * afterwards. (It may return early if the primary storage was already - * NoteDb.) - *

- * If this method throws an exception, then the primary storage of the change - * is probably not NoteDb. (It is possible that the primary storage of the - * change is NoteDb in this case, but there was an error reading the state.) - * Moreover, after an exception, the change may be read-only until a lease - * expires. If the caller chooses to retry, they should wait until the - * read-only lease expires; this method will fail relatively quickly if called - * on a read-only change. - *

- * Note that if the change is read-only after this method throws an exception, - * that does not necessarily guarantee that the read-only lease was acquired - * during that particular method invocation; this call may have in fact failed - * because another thread acquired the lease first. + * + *

This method will return only if the primary storage of the change is NoteDb afterwards. (It + * may return early if the primary storage was already NoteDb.) + * + *

If this method throws an exception, then the primary storage of the change is probably not + * NoteDb. (It is possible that the primary storage of the change is NoteDb in this case, but + * there was an error reading the state.) Moreover, after an exception, the change may be + * read-only until a lease expires. If the caller chooses to retry, they should wait until the + * read-only lease expires; this method will fail relatively quickly if called on a read-only + * change. + * + *

Note that if the change is read-only after this method throws an exception, that does not + * necessarily guarantee that the read-only lease was acquired during that particular method + * invocation; this call may have in fact failed because another thread acquired the lease first. * * @param id change ID. - * * @throws OrmException if a ReviewDb-level error occurs. * @throws IOException if a repo-level error occurs. */ - public void migrateToNoteDbPrimary(Change.Id id) - throws OrmException, IOException { + public void migrateToNoteDbPrimary(Change.Id id) throws OrmException, IOException { // Since there are multiple non-atomic steps in this method, we need to // consider what happens when there is another writer concurrent with the // thread executing this method. @@ -200,10 +197,14 @@ public class PrimaryStorageMigrator { NoteDbChangeState rebuiltState; try { // MR,MN - rebuiltState = ensureRebuiltRetryer(sw).call( - () -> ensureRebuilt( - readOnlyChange.getProject(), id, - NoteDbChangeState.parse(readOnlyChange))); + rebuiltState = + ensureRebuiltRetryer(sw) + .call( + () -> + ensureRebuilt( + readOnlyChange.getProject(), + id, + NoteDbChangeState.parse(readOnlyChange))); } catch (RetryException | ExecutionException e) { throw new OrmException(e); } @@ -213,36 +214,39 @@ public class PrimaryStorageMigrator { // the primary storage to NoteDb. setPrimaryStorageNoteDb(id, rebuiltState); - log.info("Migrated change {} to NoteDb primary in {}ms", id, - sw.elapsed(MILLISECONDS)); + log.info("Migrated change {} to NoteDb primary in {}ms", id, sw.elapsed(MILLISECONDS)); } private Change setReadOnly(Change.Id id) throws OrmException { AtomicBoolean alreadyMigrated = new AtomicBoolean(false); - Change result = db().changes().atomicUpdate(id, new AtomicUpdate() { - @Override - public Change update(Change change) { - NoteDbChangeState state = NoteDbChangeState.parse(change); - if (state == null) { - // Could rebuild the change here, but that's more complexity, and this - // really shouldn't happen. - throw new OrmRuntimeException( - "change " + id + " has no note_db_state; rebuild it first"); - } - // If the change is already read-only, then the lease is held by another - // (likely failed) migrator thread. Fail early, as we can't take over - // the lease. - NoteDbChangeState.checkNotReadOnly(change, skewMs); - if (state.getPrimaryStorage() != PrimaryStorage.NOTE_DB) { - Timestamp now = TimeUtil.nowTs(); - Timestamp until = new Timestamp(now.getTime() + timeoutMs); - change.setNoteDbState(state.withReadOnlyUntil(until).toString()); - } else { - alreadyMigrated.set(true); - } - return change; - } - }); + Change result = + db().changes() + .atomicUpdate( + id, + new AtomicUpdate() { + @Override + public Change update(Change change) { + NoteDbChangeState state = NoteDbChangeState.parse(change); + if (state == null) { + // Could rebuild the change here, but that's more complexity, and this + // really shouldn't happen. + throw new OrmRuntimeException( + "change " + id + " has no note_db_state; rebuild it first"); + } + // If the change is already read-only, then the lease is held by another + // (likely failed) migrator thread. Fail early, as we can't take over + // the lease. + NoteDbChangeState.checkNotReadOnly(change, skewMs); + if (state.getPrimaryStorage() != PrimaryStorage.NOTE_DB) { + Timestamp now = TimeUtil.nowTs(); + Timestamp until = new Timestamp(now.getTime() + timeoutMs); + change.setNoteDbState(state.withReadOnlyUntil(until).toString()); + } else { + alreadyMigrated.set(true); + } + return change; + } + }); return alreadyMigrated.get() ? null : result; } @@ -252,67 +256,64 @@ public class PrimaryStorageMigrator { } // Retry the ensureRebuilt step with backoff until half the timeout has // expired, leaving the remaining half for the rest of the steps. - long remainingNanos = - (MILLISECONDS.toNanos(timeoutMs) / 2) - sw.elapsed(NANOSECONDS); + long remainingNanos = (MILLISECONDS.toNanos(timeoutMs) / 2) - sw.elapsed(NANOSECONDS); remainingNanos = Math.max(remainingNanos, 0); return RetryerBuilder.newBuilder() - .retryIfException( - e -> (e instanceof IOException) || (e instanceof OrmException)) + .retryIfException(e -> (e instanceof IOException) || (e instanceof OrmException)) .withWaitStrategy( WaitStrategies.join( WaitStrategies.exponentialWait(250, MILLISECONDS), WaitStrategies.randomWait(50, MILLISECONDS))) - .withStopStrategy( - StopStrategies.stopAfterDelay(remainingNanos, NANOSECONDS)) + .withStopStrategy(StopStrategies.stopAfterDelay(remainingNanos, NANOSECONDS)) .build(); } - private NoteDbChangeState ensureRebuilt(Project.NameKey project, Change.Id id, - NoteDbChangeState readOnlyState) + private NoteDbChangeState ensureRebuilt( + Project.NameKey project, Change.Id id, NoteDbChangeState readOnlyState) throws IOException, OrmException, RepositoryNotFoundException { try (Repository changeRepo = repoManager.openRepository(project); Repository allUsersRepo = repoManager.openRepository(allUsers)) { - if (!readOnlyState.isUpToDate( - new RepoRefCache(changeRepo), new RepoRefCache(allUsersRepo))) { - NoteDbUpdateManager.Result r = - rebuilder.rebuildEvenIfReadOnly(db(), id); + if (!readOnlyState.isUpToDate(new RepoRefCache(changeRepo), new RepoRefCache(allUsersRepo))) { + NoteDbUpdateManager.Result r = rebuilder.rebuildEvenIfReadOnly(db(), id); checkState( - r.newState().getReadOnlyUntil() - .equals(readOnlyState.getReadOnlyUntil()), + r.newState().getReadOnlyUntil().equals(readOnlyState.getReadOnlyUntil()), "state after rebuilding has different read-only lease: %s != %s", - r.newState(), readOnlyState); + r.newState(), + readOnlyState); readOnlyState = r.newState(); } } return readOnlyState; } - private void setPrimaryStorageNoteDb(Change.Id id, - NoteDbChangeState expectedState) throws OrmException { - db().changes().atomicUpdate(id, new AtomicUpdate() { - @Override - public Change update(Change change) { - NoteDbChangeState state = NoteDbChangeState.parse(change); - if (!Objects.equals(state, expectedState)) { - throw new OrmRuntimeException(badState(state, expectedState)); - } - Timestamp until = state.getReadOnlyUntil().get(); - if (TimeUtil.nowTs().after(until)) { - throw new OrmRuntimeException( - "read-only lease on change " + id + " expired at " + until); - } - change.setNoteDbState(NoteDbChangeState.NOTE_DB_PRIMARY_STATE); - return change; - } - }); + private void setPrimaryStorageNoteDb(Change.Id id, NoteDbChangeState expectedState) + throws OrmException { + db().changes() + .atomicUpdate( + id, + new AtomicUpdate() { + @Override + public Change update(Change change) { + NoteDbChangeState state = NoteDbChangeState.parse(change); + if (!Objects.equals(state, expectedState)) { + throw new OrmRuntimeException(badState(state, expectedState)); + } + Timestamp until = state.getReadOnlyUntil().get(); + if (TimeUtil.nowTs().after(until)) { + throw new OrmRuntimeException( + "read-only lease on change " + id + " expired at " + until); + } + change.setNoteDbState(NoteDbChangeState.NOTE_DB_PRIMARY_STATE); + return change; + } + }); } private ReviewDb db() { return ReviewDbUtil.unwrapDb(db.get()); } - private String badState(NoteDbChangeState actual, - NoteDbChangeState expected) { + private String badState(NoteDbChangeState actual, NoteDbChangeState expected) { return "state changed unexpectedly: " + actual + " != " + expected; } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RepoSequence.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RepoSequence.java index e4a6f7c641..0101cd7d0d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RepoSequence.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RepoSequence.java @@ -19,6 +19,11 @@ import static com.google.common.base.Preconditions.checkNotNull; import static java.nio.charset.StandardCharsets.UTF_8; import static org.eclipse.jgit.lib.Constants.OBJ_BLOB; +import com.github.rholder.retry.RetryException; +import com.github.rholder.retry.Retryer; +import com.github.rholder.retry.RetryerBuilder; +import com.github.rholder.retry.StopStrategies; +import com.github.rholder.retry.WaitStrategies; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.CharMatcher; import com.google.common.base.Predicates; @@ -31,13 +36,14 @@ import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.reviewdb.client.RefNames; import com.google.gerrit.server.git.GitRepositoryManager; import com.google.gwtorm.server.OrmException; - -import com.github.rholder.retry.RetryException; -import com.github.rholder.retry.Retryer; -import com.github.rholder.retry.RetryerBuilder; -import com.github.rholder.retry.StopStrategies; -import com.github.rholder.retry.WaitStrategies; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectInserter; @@ -47,25 +53,15 @@ import org.eclipse.jgit.lib.RefUpdate; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevWalk; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - /** * Class for managing an incrementing sequence backed by a git repository. - *

- * The current sequence number is stored as UTF-8 text in a blob pointed to - * by a ref in the {@code refs/sequences/*} namespace. Multiple processes can - * share the same sequence by incrementing the counter using normal git ref - * updates. To amortize the cost of these ref updates, processes can increment - * the counter by a larger number and hand out numbers from that range in memory - * until they run out. This means concurrent processes will hand out somewhat - * non-monotonic numbers. + * + *

The current sequence number is stored as UTF-8 text in a blob pointed to by a ref in the + * {@code refs/sequences/*} namespace. Multiple processes can share the same sequence by + * incrementing the counter using normal git ref updates. To amortize the cost of these ref updates, + * processes can increment the counter by a larger number and hand out numbers from that range in + * memory until they run out. This means concurrent processes will hand out somewhat non-monotonic + * numbers. */ public class RepoSequence { public interface Seed { @@ -74,17 +70,16 @@ public class RepoSequence { @VisibleForTesting static RetryerBuilder retryerBuilder() { - return RetryerBuilder. newBuilder() + return RetryerBuilder.newBuilder() .retryIfResult(Predicates.equalTo(RefUpdate.Result.LOCK_FAILURE)) .withWaitStrategy( WaitStrategies.join( - WaitStrategies.exponentialWait(5, TimeUnit.SECONDS), - WaitStrategies.randomWait(50, TimeUnit.MILLISECONDS))) + WaitStrategies.exponentialWait(5, TimeUnit.SECONDS), + WaitStrategies.randomWait(50, TimeUnit.MILLISECONDS))) .withStopStrategy(StopStrategies.stopAfterDelay(30, TimeUnit.SECONDS)); } - private static final Retryer RETRYER = - retryerBuilder().build(); + private static final Retryer RETRYER = retryerBuilder().build(); private final GitRepositoryManager repoManager; private final Project.NameKey projectName; @@ -100,8 +95,7 @@ public class RepoSequence { private int limit; private int counter; - @VisibleForTesting - int acquireCount; + @VisibleForTesting int acquireCount; public RepoSequence( GitRepositoryManager repoManager, @@ -109,8 +103,7 @@ public class RepoSequence { String name, Seed seed, int batchSize) { - this(repoManager, projectName, name, seed, batchSize, Runnables.doNothing(), - RETRYER); + this(repoManager, projectName, name, seed, batchSize, Runnables.doNothing(), RETRYER); } @VisibleForTesting @@ -248,19 +241,17 @@ public class RepoSequence { // may do it properly (certainly InMemoryRepository doesn't). throw new IncorrectObjectTypeException(id, OBJ_BLOB); } - String str = CharMatcher.whitespace().trimFrom( - new String(ol.getCachedBytes(), UTF_8)); + String str = CharMatcher.whitespace().trimFrom(new String(ol.getCachedBytes(), UTF_8)); Integer val = Ints.tryParse(str); if (val == null) { - throw new OrmException( - "invalid value in " + refName + " blob at " + id.name()); + throw new OrmException("invalid value in " + refName + " blob at " + id.name()); } return val; } } - private RefUpdate.Result store(Repository repo, RevWalk rw, - @Nullable ObjectId oldId, int val) throws IOException { + private RefUpdate.Result store(Repository repo, RevWalk rw, @Nullable ObjectId oldId, int val) + throws IOException { ObjectId newId; try (ObjectInserter ins = repo.newObjectInserter()) { newId = ins.insert(OBJ_BLOB, Integer.toString(val).getBytes(UTF_8)); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ReviewerStateInternal.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ReviewerStateInternal.java index be7f8d5b1d..f25064691e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ReviewerStateInternal.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ReviewerStateInternal.java @@ -15,10 +15,8 @@ package com.google.gerrit.server.notedb; import com.google.gerrit.extensions.client.ReviewerState; - -import org.eclipse.jgit.revwalk.FooterKey; - import java.util.Arrays; +import org.eclipse.jgit.revwalk.FooterKey; /** State of a reviewer on a change. */ public enum ReviewerStateInternal { @@ -40,9 +38,11 @@ public enum ReviewerStateInternal { ok &= s.name().equals(s.state.name()); } if (!ok) { - throw new IllegalStateException("Mismatched reviewer state mapping: " - + Arrays.asList(ReviewerStateInternal.values()) + " != " - + Arrays.asList(ReviewerState.values())); + throw new IllegalStateException( + "Mismatched reviewer state mapping: " + + Arrays.asList(ReviewerStateInternal.values()) + + " != " + + Arrays.asList(ReviewerState.values())); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNote.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNote.java index 46e6dc5b85..aec844294e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNote.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNote.java @@ -19,15 +19,13 @@ import static org.eclipse.jgit.lib.Constants.OBJ_BLOB; import com.google.common.collect.ImmutableList; import com.google.gerrit.reviewdb.client.Comment; - +import java.io.IOException; +import java.util.List; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectReader; import org.eclipse.jgit.util.MutableInteger; -import java.io.IOException; -import java.util.List; - abstract class RevisionNote { static final int MAX_NOTE_SZ = 25 << 20; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNoteBuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNoteBuilder.java index 46a0802066..b341ea8a41 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNoteBuilder.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNoteBuilder.java @@ -23,7 +23,6 @@ import com.google.common.collect.Maps; import com.google.common.collect.MultimapBuilder; import com.google.gerrit.reviewdb.client.Comment; import com.google.gerrit.reviewdb.client.RevId; - import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; @@ -37,12 +36,10 @@ import java.util.Set; class RevisionNoteBuilder { static class Cache { - private final RevisionNoteMap> revisionNoteMap; + private final RevisionNoteMap> revisionNoteMap; private final Map builders; - Cache(RevisionNoteMap> revisionNoteMap) { + Cache(RevisionNoteMap> revisionNoteMap) { this.revisionNoteMap = revisionNoteMap; this.builders = new HashMap<>(); } @@ -50,8 +47,7 @@ class RevisionNoteBuilder { RevisionNoteBuilder get(RevId revId) { RevisionNoteBuilder b = builders.get(revId); if (b == null) { - b = new RevisionNoteBuilder( - revisionNoteMap.revisionNotes.get(revId)); + b = new RevisionNoteBuilder(revisionNoteMap.revisionNotes.get(revId)); builders.put(revId, b); } return b; @@ -86,8 +82,7 @@ class RevisionNoteBuilder { delete = new HashSet<>(); } - public byte[] build(ChangeNoteUtil noteUtil, boolean writeJson) - throws IOException { + public byte[] build(ChangeNoteUtil noteUtil, boolean writeJson) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); if (writeJson) { buildNoteJson(noteUtil, out); @@ -98,8 +93,7 @@ class RevisionNoteBuilder { } void putComment(Comment comment) { - checkArgument(!delete.contains(comment.key), - "cannot both delete and put %s", comment.key); + checkArgument(!delete.contains(comment.key), "cannot both delete and put %s", comment.key); put.put(comment.key, comment); } @@ -113,8 +107,7 @@ class RevisionNoteBuilder { } private ListMultimap buildCommentMap() { - ListMultimap all = - MultimapBuilder.hashKeys().arrayListValues().build(); + ListMultimap all = MultimapBuilder.hashKeys().arrayListValues().build(); for (Comment c : baseComments) { if (!delete.contains(c.key) && !put.containsKey(c.key)) { @@ -129,8 +122,7 @@ class RevisionNoteBuilder { return all; } - private void buildNoteJson(ChangeNoteUtil noteUtil, OutputStream out) - throws IOException { + private void buildNoteJson(ChangeNoteUtil noteUtil, OutputStream out) throws IOException { ListMultimap comments = buildCommentMap(); if (comments.isEmpty() && pushCert == null) { return; @@ -145,8 +137,7 @@ class RevisionNoteBuilder { } } - private void buildNoteLegacy(ChangeNoteUtil noteUtil, OutputStream out) - throws IOException { + private void buildNoteLegacy(ChangeNoteUtil noteUtil, OutputStream out) throws IOException { if (pushCert != null) { byte[] certBytes = pushCert.getBytes(UTF_8); out.write(certBytes, 0, trimTrailingNewlines(certBytes)); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNoteData.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNoteData.java index e0ee9345fa..1e16b2221b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNoteData.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNoteData.java @@ -15,11 +15,11 @@ package com.google.gerrit.server.notedb; import com.google.gerrit.reviewdb.client.Comment; - import java.util.List; /** * Holds the raw data of a RevisionNote. + * *

It is intended for (de)serialization to JSON only. */ class RevisionNoteData { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNoteMap.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNoteMap.java index 8a9f7119ad..aa82d1ad0c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNoteMap.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNoteMap.java @@ -19,28 +19,29 @@ import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Comment; import com.google.gerrit.reviewdb.client.PatchLineComment; import com.google.gerrit.reviewdb.client.RevId; - +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.ObjectReader; import org.eclipse.jgit.notes.Note; import org.eclipse.jgit.notes.NoteMap; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - class RevisionNoteMap> { final NoteMap noteMap; final ImmutableMap revisionNotes; - static RevisionNoteMap parse(ChangeNoteUtil noteUtil, - Change.Id changeId, ObjectReader reader, NoteMap noteMap, + static RevisionNoteMap parse( + ChangeNoteUtil noteUtil, + Change.Id changeId, + ObjectReader reader, + NoteMap noteMap, PatchLineComment.Status status) - throws ConfigInvalidException, IOException { + throws ConfigInvalidException, IOException { Map result = new HashMap<>(); for (Note note : noteMap) { - ChangeRevisionNote rn = new ChangeRevisionNote( - noteUtil, changeId, reader, note.getData(), status); + ChangeRevisionNote rn = + new ChangeRevisionNote(noteUtil, changeId, reader, note.getData(), status); rn.parse(); result.put(new RevId(note.name()), rn); } @@ -49,25 +50,22 @@ class RevisionNoteMap> { static RevisionNoteMap parseRobotComments( ChangeNoteUtil noteUtil, ObjectReader reader, NoteMap noteMap) - throws ConfigInvalidException, IOException { + throws ConfigInvalidException, IOException { Map result = new HashMap<>(); for (Note note : noteMap) { - RobotCommentsRevisionNote rn = new RobotCommentsRevisionNote( - noteUtil, reader, note.getData()); + RobotCommentsRevisionNote rn = + new RobotCommentsRevisionNote(noteUtil, reader, note.getData()); rn.parse(); result.put(new RevId(note.name()), rn); } return new RevisionNoteMap<>(noteMap, ImmutableMap.copyOf(result)); } - static > RevisionNoteMap - emptyMap() { - return new RevisionNoteMap<>(NoteMap.newEmptyMap(), - ImmutableMap. of()); + static > RevisionNoteMap emptyMap() { + return new RevisionNoteMap<>(NoteMap.newEmptyMap(), ImmutableMap.of()); } - private RevisionNoteMap(NoteMap noteMap, - ImmutableMap revisionNotes) { + private RevisionNoteMap(NoteMap noteMap, ImmutableMap revisionNotes) { this.noteMap = noteMap; this.revisionNotes = revisionNotes; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RobotCommentNotes.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RobotCommentNotes.java index ae2edd6a2a..e6549f0980 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RobotCommentNotes.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RobotCommentNotes.java @@ -26,15 +26,13 @@ import com.google.gerrit.reviewdb.client.RobotComment; import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - +import java.io.IOException; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectReader; import org.eclipse.jgit.notes.NoteMap; import org.eclipse.jgit.revwalk.RevCommit; -import java.io.IOException; - public class RobotCommentNotes extends AbstractChangeNotes { public interface Factory { RobotCommentNotes create(Change change); @@ -47,9 +45,7 @@ public class RobotCommentNotes extends AbstractChangeNotes { private ObjectId metaId; @AssistedInject - RobotCommentNotes( - Args args, - @Assisted Change change) { + RobotCommentNotes(Args args, @Assisted Change change) { super(args, change.getId(), PrimaryStorage.of(change), false); this.change = change; } @@ -82,8 +78,7 @@ public class RobotCommentNotes extends AbstractChangeNotes { } @Override - protected void onLoad(LoadHandle handle) - throws IOException, ConfigInvalidException { + protected void onLoad(LoadHandle handle) throws IOException, ConfigInvalidException { metaId = handle.id(); if (metaId == null) { loadDefaults(); @@ -93,12 +88,10 @@ public class RobotCommentNotes extends AbstractChangeNotes { RevCommit tipCommit = handle.walk().parseCommit(metaId); ObjectReader reader = handle.walk().getObjectReader(); - revisionNoteMap = RevisionNoteMap.parseRobotComments(args.noteUtil, reader, - NoteMap.read(reader, tipCommit)); - ListMultimap cs = - MultimapBuilder.hashKeys().arrayListValues().build(); - for (RobotCommentsRevisionNote rn : - revisionNoteMap.revisionNotes.values()) { + revisionNoteMap = + RevisionNoteMap.parseRobotComments(args.noteUtil, reader, NoteMap.read(reader, tipCommit)); + ListMultimap cs = MultimapBuilder.hashKeys().arrayListValues().build(); + for (RobotCommentsRevisionNote rn : revisionNoteMap.revisionNotes.values()) { for (RobotComment c : rn.getComments()) { cs.put(new RevId(c.revId), c); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RobotCommentUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RobotCommentUpdate.java index 9744632b56..9ce4b54773 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RobotCommentUpdate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RobotCommentUpdate.java @@ -29,7 +29,13 @@ import com.google.gerrit.server.config.AnonymousCowardName; import com.google.gwtorm.server.OrmException; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Set; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.CommitBuilder; import org.eclipse.jgit.lib.ObjectId; @@ -38,21 +44,13 @@ import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.notes.NoteMap; import org.eclipse.jgit.revwalk.RevWalk; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Set; - /** * A single delta to apply atomically to a change. - *

- * This delta contains only robot comments on a single patch set of a change by - * a single author. This delta will become a single commit in the repository. - *

- * This class is not thread safe. + * + *

This delta contains only robot comments on a single patch set of a change by a single author. + * This delta will become a single commit in the repository. + * + *

This class is not thread safe. */ public class RobotCommentUpdate extends AbstractChangeUpdate { public interface Factory { @@ -84,8 +82,17 @@ public class RobotCommentUpdate extends AbstractChangeUpdate { @Assisted("real") Account.Id realAccountId, @Assisted PersonIdent authorIdent, @Assisted Date when) { - super(migration, noteUtil, serverIdent, anonymousCowardName, notes, null, - accountId, realAccountId, authorIdent, when); + super( + migration, + noteUtil, + serverIdent, + anonymousCowardName, + notes, + null, + accountId, + realAccountId, + authorIdent, + when); } @AssistedInject @@ -99,8 +106,17 @@ public class RobotCommentUpdate extends AbstractChangeUpdate { @Assisted("real") Account.Id realAccountId, @Assisted PersonIdent authorIdent, @Assisted Date when) { - super(migration, noteUtil, serverIdent, anonymousCowardName, null, change, - accountId, realAccountId, authorIdent, when); + super( + migration, + noteUtil, + serverIdent, + anonymousCowardName, + null, + change, + accountId, + realAccountId, + authorIdent, + when); } public void putComment(RobotComment c) { @@ -108,13 +124,11 @@ public class RobotCommentUpdate extends AbstractChangeUpdate { put.add(c); } - private CommitBuilder storeCommentsInNotes(RevWalk rw, ObjectInserter ins, - ObjectId curr, CommitBuilder cb) + private CommitBuilder storeCommentsInNotes( + RevWalk rw, ObjectInserter ins, ObjectId curr, CommitBuilder cb) throws ConfigInvalidException, OrmException, IOException { - RevisionNoteMap rnm = - getRevisionNoteMap(rw, curr); - Set updatedRevs = - Sets.newHashSetWithExpectedSize(rnm.revisionNotes.size()); + RevisionNoteMap rnm = getRevisionNoteMap(rw, curr); + Set updatedRevs = Sets.newHashSetWithExpectedSize(rnm.revisionNotes.size()); RevisionNoteBuilder.Cache cache = new RevisionNoteBuilder.Cache(rnm); for (RobotComment c : put) { @@ -158,9 +172,8 @@ public class RobotCommentUpdate extends AbstractChangeUpdate { return cb; } - private RevisionNoteMap getRevisionNoteMap( - RevWalk rw, ObjectId curr) - throws ConfigInvalidException, OrmException, IOException { + private RevisionNoteMap getRevisionNoteMap(RevWalk rw, ObjectId curr) + throws ConfigInvalidException, OrmException, IOException { if (curr.equals(ObjectId.zeroId())) { return RevisionNoteMap.emptyMap(); } @@ -170,13 +183,10 @@ public class RobotCommentUpdate extends AbstractChangeUpdate { // hasn't advanced. ChangeNotes changeNotes = getNotes(); if (changeNotes != null) { - RobotCommentNotes robotCommentNotes = - changeNotes.load().getRobotCommentNotes(); + RobotCommentNotes robotCommentNotes = changeNotes.load().getRobotCommentNotes(); if (robotCommentNotes != null) { - ObjectId idFromNotes = - firstNonNull(robotCommentNotes.getRevision(), ObjectId.zeroId()); - RevisionNoteMap rnm = - robotCommentNotes.getRevisionNoteMap(); + ObjectId idFromNotes = firstNonNull(robotCommentNotes.getRevision(), ObjectId.zeroId()); + RevisionNoteMap rnm = robotCommentNotes.getRevisionNoteMap(); if (idFromNotes.equals(curr) && rnm != null) { return rnm; } @@ -191,15 +201,12 @@ public class RobotCommentUpdate extends AbstractChangeUpdate { } // Even though reading from changes might not be enabled, we need to // parse any existing revision notes so we can merge them. - return RevisionNoteMap.parseRobotComments( - noteUtil, - rw.getObjectReader(), - noteMap); + return RevisionNoteMap.parseRobotComments(noteUtil, rw.getObjectReader(), noteMap); } @Override - protected CommitBuilder applyImpl(RevWalk rw, ObjectInserter ins, - ObjectId curr) throws OrmException, IOException { + protected CommitBuilder applyImpl(RevWalk rw, ObjectInserter ins, ObjectId curr) + throws OrmException, IOException { CommitBuilder cb = new CommitBuilder(); cb.setMessage("Update robot comments"); try { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RobotCommentsRevisionNote.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RobotCommentsRevisionNote.java index 0dca408728..aa229ab43a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RobotCommentsRevisionNote.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RobotCommentsRevisionNote.java @@ -17,34 +17,28 @@ package com.google.gerrit.server.notedb; import static java.nio.charset.StandardCharsets.UTF_8; import com.google.gerrit.reviewdb.client.RobotComment; - -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.ObjectReader; - import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.util.List; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.ObjectReader; public class RobotCommentsRevisionNote extends RevisionNote { private final ChangeNoteUtil noteUtil; - RobotCommentsRevisionNote(ChangeNoteUtil noteUtil, ObjectReader reader, - ObjectId noteId) { + RobotCommentsRevisionNote(ChangeNoteUtil noteUtil, ObjectReader reader, ObjectId noteId) { super(reader, noteId); this.noteUtil = noteUtil; } @Override - protected List parse(byte[] raw, int offset) - throws IOException { - try (InputStream is = new ByteArrayInputStream( - raw, offset, raw.length - offset); + protected List parse(byte[] raw, int offset) throws IOException { + try (InputStream is = new ByteArrayInputStream(raw, offset, raw.length - offset); Reader r = new InputStreamReader(is, UTF_8)) { - return noteUtil.getGson().fromJson(r, - RobotCommentsRevisionNoteData.class).comments; + return noteUtil.getGson().fromJson(r, RobotCommentsRevisionNoteData.class).comments; } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RobotCommentsRevisionNoteData.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RobotCommentsRevisionNoteData.java index ea3a149d54..116b30e624 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RobotCommentsRevisionNoteData.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RobotCommentsRevisionNoteData.java @@ -15,7 +15,6 @@ package com.google.gerrit.server.notedb; import com.google.gerrit.reviewdb.client.RobotComment; - import java.util.List; public class RobotCommentsRevisionNoteData { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/TestChangeRebuilderWrapper.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/TestChangeRebuilderWrapper.java index ffe0fcba71..4ee84dce8d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/TestChangeRebuilderWrapper.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/TestChangeRebuilderWrapper.java @@ -24,7 +24,6 @@ import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.SchemaFactory; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.io.IOException; import java.util.concurrent.atomic.AtomicBoolean; @@ -36,8 +35,7 @@ public class TestChangeRebuilderWrapper extends ChangeRebuilder { private final AtomicBoolean stealNextUpdate; @Inject - TestChangeRebuilderWrapper(SchemaFactory schemaFactory, - ChangeRebuilderImpl rebuilder) { + TestChangeRebuilderWrapper(SchemaFactory schemaFactory, ChangeRebuilderImpl rebuilder) { super(schemaFactory); this.delegate = rebuilder; this.failNextUpdate = new AtomicBoolean(); @@ -53,8 +51,7 @@ public class TestChangeRebuilderWrapper extends ChangeRebuilder { } @Override - public Result rebuild(ReviewDb db, Change.Id changeId) - throws IOException, OrmException { + public Result rebuild(ReviewDb db, Change.Id changeId) throws IOException, OrmException { return rebuild(db, changeId, true); } @@ -64,14 +61,15 @@ public class TestChangeRebuilderWrapper extends ChangeRebuilder { return rebuild(db, changeId, false); } - private Result rebuild(ReviewDb db, Change.Id changeId, - boolean checkReadOnly) throws IOException, OrmException { + private Result rebuild(ReviewDb db, Change.Id changeId, boolean checkReadOnly) + throws IOException, OrmException { if (failNextUpdate.getAndSet(false)) { throw new IOException("Update failed"); } - Result result = checkReadOnly - ? delegate.rebuild(db, changeId) - : delegate.rebuildEvenIfReadOnly(db, changeId); + Result result = + checkReadOnly + ? delegate.rebuild(db, changeId) + : delegate.rebuildEvenIfReadOnly(db, changeId); if (stealNextUpdate.getAndSet(false)) { throw new IOException("Update stolen"); } @@ -79,8 +77,8 @@ public class TestChangeRebuilderWrapper extends ChangeRebuilder { } @Override - public Result rebuild(NoteDbUpdateManager manager, - ChangeBundle bundle) throws IOException, OrmException { + public Result rebuild(NoteDbUpdateManager manager, ChangeBundle bundle) + throws IOException, OrmException { // stealNextUpdate doesn't really apply in this case because the IOException // would normally come from the manager.execute() method, which isn't called // here. @@ -95,8 +93,8 @@ public class TestChangeRebuilderWrapper extends ChangeRebuilder { } @Override - public Result execute(ReviewDb db, Change.Id changeId, - NoteDbUpdateManager manager) throws OrmException, IOException { + public Result execute(ReviewDb db, Change.Id changeId, NoteDbUpdateManager manager) + throws OrmException, IOException { if (failNextUpdate.getAndSet(false)) { throw new IOException("Update failed"); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ApprovalEvent.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ApprovalEvent.java index 4fed25dc35..b36928125a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ApprovalEvent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ApprovalEvent.java @@ -16,15 +16,19 @@ package com.google.gerrit.server.notedb.rebuild; import com.google.gerrit.reviewdb.client.PatchSetApproval; import com.google.gerrit.server.notedb.ChangeUpdate; - import java.sql.Timestamp; class ApprovalEvent extends Event { private PatchSetApproval psa; ApprovalEvent(PatchSetApproval psa, Timestamp changeCreatedOn) { - super(psa.getPatchSetId(), psa.getAccountId(), psa.getRealAccountId(), - psa.getGranted(), changeCreatedOn, psa.getTag()); + super( + psa.getPatchSetId(), + psa.getAccountId(), + psa.getRealAccountId(), + psa.getGranted(), + changeCreatedOn, + psa.getTag()); this.psa = psa; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeMessageEvent.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeMessageEvent.java index ed5cd8bb0a..84858b4e54 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeMessageEvent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeMessageEvent.java @@ -18,26 +18,27 @@ import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.ChangeMessage; import com.google.gerrit.server.notedb.ChangeUpdate; import com.google.gwtorm.server.OrmException; - import java.sql.Timestamp; import java.util.regex.Matcher; import java.util.regex.Pattern; class ChangeMessageEvent extends Event { - private static final Pattern TOPIC_SET_REGEXP = - Pattern.compile("^Topic set to (.+)$"); + private static final Pattern TOPIC_SET_REGEXP = Pattern.compile("^Topic set to (.+)$"); private static final Pattern TOPIC_CHANGED_REGEXP = Pattern.compile("^Topic changed from (.+) to (.+)$"); - private static final Pattern TOPIC_REMOVED_REGEXP = - Pattern.compile("^Topic (.+) removed$"); + private static final Pattern TOPIC_REMOVED_REGEXP = Pattern.compile("^Topic (.+) removed$"); private final ChangeMessage message; private final Change noteDbChange; - ChangeMessageEvent(ChangeMessage message, Change noteDbChange, - Timestamp changeCreatedOn) { - super(message.getPatchSetId(), message.getAuthor(), message.getRealAuthor(), - message.getWrittenOn(), changeCreatedOn, message.getTag()); + ChangeMessageEvent(ChangeMessage message, Change noteDbChange, Timestamp changeCreatedOn) { + super( + message.getPatchSetId(), + message.getAuthor(), + message.getRealAuthor(), + message.getWrittenOn(), + changeCreatedOn, + message.getTag()); this.message = message; this.noteDbChange = noteDbChange; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeRebuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeRebuilder.java index ea456da409..c8d9bb37b5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeRebuilder.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeRebuilder.java @@ -23,7 +23,6 @@ import com.google.gerrit.server.notedb.NoteDbUpdateManager; import com.google.gerrit.server.notedb.NoteDbUpdateManager.Result; import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.SchemaFactory; - import java.io.IOException; import java.util.concurrent.Callable; @@ -32,8 +31,7 @@ public abstract class ChangeRebuilder { private static final long serialVersionUID = 1L; NoPatchSetsException(Change.Id changeId) { - super("Change " + changeId - + " cannot be rebuilt because it has no patch sets"); + super("Change " + changeId + " cannot be rebuilt because it has no patch sets"); } } @@ -45,31 +43,31 @@ public abstract class ChangeRebuilder { public final ListenableFuture rebuildAsync( final Change.Id id, ListeningExecutorService executor) { - return executor.submit(new Callable() { - @Override - public Result call() throws Exception { - try (ReviewDb db = schemaFactory.open()) { - return rebuild(db, id); - } - } - }); + return executor.submit( + new Callable() { + @Override + public Result call() throws Exception { + try (ReviewDb db = schemaFactory.open()) { + return rebuild(db, id); + } + } + }); } - public abstract Result rebuild(ReviewDb db, Change.Id changeId) - throws IOException, OrmException; + public abstract Result rebuild(ReviewDb db, Change.Id changeId) throws IOException, OrmException; public abstract Result rebuildEvenIfReadOnly(ReviewDb db, Change.Id changeId) throws IOException, OrmException; - public abstract Result rebuild(NoteDbUpdateManager manager, - ChangeBundle bundle) throws IOException, OrmException; + public abstract Result rebuild(NoteDbUpdateManager manager, ChangeBundle bundle) + throws IOException, OrmException; - public abstract void buildUpdates(NoteDbUpdateManager manager, - ChangeBundle bundle) throws IOException, OrmException; + public abstract void buildUpdates(NoteDbUpdateManager manager, ChangeBundle bundle) + throws IOException, OrmException; public abstract NoteDbUpdateManager stage(ReviewDb db, Change.Id changeId) throws IOException, OrmException; - public abstract Result execute(ReviewDb db, Change.Id changeId, - NoteDbUpdateManager manager) throws OrmException, IOException; + public abstract Result execute(ReviewDb db, Change.Id changeId, NoteDbUpdateManager manager) + throws OrmException, IOException; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeRebuilderImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeRebuilderImpl.java index ffd11a73d3..326ceb3f6e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeRebuilderImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeRebuilderImpl.java @@ -72,16 +72,6 @@ import com.google.gwtorm.server.AtomicUpdate; import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.SchemaFactory; import com.google.inject.Inject; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.Config; -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.PersonIdent; -import org.eclipse.jgit.lib.Ref; -import org.eclipse.jgit.revwalk.RevCommit; -import org.eclipse.jgit.revwalk.RevWalk; -import org.eclipse.jgit.transport.ReceiveCommand; - import java.io.IOException; import java.sql.Timestamp; import java.util.ArrayList; @@ -92,22 +82,29 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.PersonIdent; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.revwalk.RevWalk; +import org.eclipse.jgit.transport.ReceiveCommand; public class ChangeRebuilderImpl extends ChangeRebuilder { /** - * The maximum amount of time between the ReviewDb timestamp of the first and - * last events batched together into a single NoteDb update. - *

- * Used to account for the fact that different records with their own - * timestamps (e.g. {@link PatchSetApproval} and {@link ChangeMessage}) - * historically didn't necessarily use the same timestamp, and tended to call - * {@code System.currentTimeMillis()} independently. + * The maximum amount of time between the ReviewDb timestamp of the first and last events batched + * together into a single NoteDb update. + * + *

Used to account for the fact that different records with their own timestamps (e.g. {@link + * PatchSetApproval} and {@link ChangeMessage}) historically didn't necessarily use the same + * timestamp, and tended to call {@code System.currentTimeMillis()} independently. */ public static final long MAX_WINDOW_MS = SECONDS.toMillis(3); /** - * The maximum amount of time between two consecutive events to consider them - * to be in the same batch. + * The maximum amount of time between two consecutive events to consider them to be in the same + * batch. */ static final long MAX_DELTA_MS = SECONDS.toMillis(1); @@ -126,7 +123,8 @@ public class ChangeRebuilderImpl extends ChangeRebuilder { private final long skewMs; @Inject - ChangeRebuilderImpl(@GerritServerConfig Config cfg, + ChangeRebuilderImpl( + @GerritServerConfig Config cfg, SchemaFactory schemaFactory, AccountCache accountCache, ChangeBundleReader bundleReader, @@ -157,8 +155,7 @@ public class ChangeRebuilderImpl extends ChangeRebuilder { } @Override - public Result rebuild(ReviewDb db, Change.Id changeId) - throws IOException, OrmException { + public Result rebuild(ReviewDb db, Change.Id changeId) throws IOException, OrmException { return rebuild(db, changeId, true); } @@ -177,17 +174,15 @@ public class ChangeRebuilderImpl extends ChangeRebuilder { if (change == null) { throw new NoSuchChangeException(changeId); } - try (NoteDbUpdateManager manager = - updateManagerFactory.create(change.getProject())) { + try (NoteDbUpdateManager manager = updateManagerFactory.create(change.getProject())) { buildUpdates(manager, bundleReader.fromReviewDb(db, changeId)); return execute(db, changeId, manager, checkReadOnly); } } @Override - public Result rebuild(NoteDbUpdateManager manager, - ChangeBundle bundle) throws NoSuchChangeException, IOException, - OrmException { + public Result rebuild(NoteDbUpdateManager manager, ChangeBundle bundle) + throws NoSuchChangeException, IOException, OrmException { Change change = new Change(bundle.getChange()); buildUpdates(manager, bundle); return manager.stageAndApplyDelta(change); @@ -197,30 +192,27 @@ public class ChangeRebuilderImpl extends ChangeRebuilder { public NoteDbUpdateManager stage(ReviewDb db, Change.Id changeId) throws IOException, OrmException { db = ReviewDbUtil.unwrapDb(db); - Change change = - checkNoteDbState(ChangeNotes.readOneReviewDbChange(db, changeId)); + Change change = checkNoteDbState(ChangeNotes.readOneReviewDbChange(db, changeId)); if (change == null) { throw new NoSuchChangeException(changeId); } - NoteDbUpdateManager manager = - updateManagerFactory.create(change.getProject()); + NoteDbUpdateManager manager = updateManagerFactory.create(change.getProject()); buildUpdates(manager, bundleReader.fromReviewDb(db, changeId)); manager.stage(); return manager; } @Override - public Result execute(ReviewDb db, Change.Id changeId, - NoteDbUpdateManager manager) throws OrmException, IOException { + public Result execute(ReviewDb db, Change.Id changeId, NoteDbUpdateManager manager) + throws OrmException, IOException { return execute(db, changeId, manager, true); } - public Result execute(ReviewDb db, Change.Id changeId, - NoteDbUpdateManager manager, boolean checkReadOnly) + public Result execute( + ReviewDb db, Change.Id changeId, NoteDbUpdateManager manager, boolean checkReadOnly) throws OrmException, IOException { db = ReviewDbUtil.unwrapDb(db); - Change change = - checkNoteDbState(ChangeNotes.readOneReviewDbChange(db, changeId)); + Change change = checkNoteDbState(ChangeNotes.readOneReviewDbChange(db, changeId)); if (change == null) { throw new NoSuchChangeException(changeId); } @@ -229,24 +221,27 @@ public class ChangeRebuilderImpl extends ChangeRebuilder { Result r = manager.stageAndApplyDelta(change); final String newNoteDbState = change.getNoteDbState(); try { - db.changes().atomicUpdate(changeId, new AtomicUpdate() { - @Override - public Change update(Change change) { - if (checkReadOnly) { - NoteDbChangeState.checkNotReadOnly(change, skewMs); - } - String currNoteDbState = change.getNoteDbState(); - if (Objects.equals(currNoteDbState, newNoteDbState)) { - // Another thread completed the same rebuild we were about to. - throw new AbortUpdateException(); - } else if (!Objects.equals(oldNoteDbState, currNoteDbState)) { - // Another thread updated the state to something else. - throw new ConflictingUpdateException(change, oldNoteDbState); - } - change.setNoteDbState(newNoteDbState); - return change; - } - }); + db.changes() + .atomicUpdate( + changeId, + new AtomicUpdate() { + @Override + public Change update(Change change) { + if (checkReadOnly) { + NoteDbChangeState.checkNotReadOnly(change, skewMs); + } + String currNoteDbState = change.getNoteDbState(); + if (Objects.equals(currNoteDbState, newNoteDbState)) { + // Another thread completed the same rebuild we were about to. + throw new AbortUpdateException(); + } else if (!Objects.equals(oldNoteDbState, currNoteDbState)) { + // Another thread updated the state to something else. + throw new ConflictingUpdateException(change, oldNoteDbState); + } + change.setNoteDbState(newNoteDbState); + return change; + } + }); } catch (ConflictingUpdateException e) { // Rethrow as an OrmException so the caller knows to use staged results. // Strictly speaking they are not completely up to date, but result we @@ -254,9 +249,10 @@ public class ChangeRebuilderImpl extends ChangeRebuilder { // the other thread. throw new OrmException(e.getMessage()); } catch (AbortUpdateException e) { - if (NoteDbChangeState.parse(changeId, newNoteDbState).isUpToDate( - manager.getChangeRepo().cmds.getRepoRefCache(), - manager.getAllUsersRepo().cmds.getRepoRefCache())) { + if (NoteDbChangeState.parse(changeId, newNoteDbState) + .isUpToDate( + manager.getChangeRepo().cmds.getRepoRefCache(), + manager.getAllUsersRepo().cmds.getRepoRefCache())) { // If the state in ReviewDb matches NoteDb at this point, it means // another thread successfully completed this rebuild. It's ok to not // execute the update in this case, since the object referenced in the @@ -280,8 +276,8 @@ public class ChangeRebuilderImpl extends ChangeRebuilder { // Can only rebuild a change if its primary storage is ReviewDb. NoteDbChangeState s = NoteDbChangeState.parse(c); if (s != null && s.getPrimaryStorage() != PrimaryStorage.REVIEW_DB) { - throw new OrmException(String.format( - "cannot rebuild change " + c.getId() + " with state " + s)); + throw new OrmException( + String.format("cannot rebuild change " + c.getId() + " with state " + s)); } return c; } @@ -289,8 +285,7 @@ public class ChangeRebuilderImpl extends ChangeRebuilder { @Override public void buildUpdates(NoteDbUpdateManager manager, ChangeBundle bundle) throws IOException, OrmException { - manager.setCheckExpectedState(false) - .setRefLogMessage("Rebuilding change"); + manager.setCheckExpectedState(false).setRefLogMessage("Rebuilding change"); Change change = new Change(bundle.getChange()); if (bundle.getPatchSets().isEmpty()) { throw new NoPatchSetsException(change.getId()); @@ -313,18 +308,15 @@ public class ChangeRebuilderImpl extends ChangeRebuilder { Maps.newHashMapWithExpectedSize(bundle.getPatchSets().size()); for (PatchSet ps : bundle.getPatchSets()) { - PatchSetEvent pse = - new PatchSetEvent(change, ps, manager.getChangeRepo().rw); + PatchSetEvent pse = new PatchSetEvent(change, ps, manager.getChangeRepo().rw); patchSetEvents.put(ps.getId(), pse); events.add(pse); for (Comment c : getComments(bundle, serverId, Status.PUBLISHED, ps)) { - CommentEvent e = - new CommentEvent(c, change, ps, patchListCache); + CommentEvent e = new CommentEvent(c, change, ps, patchListCache); events.add(e.addDep(pse)); } for (Comment c : getComments(bundle, serverId, Status.DRAFT, ps)) { - DraftCommentEvent e = - new DraftCommentEvent(c, change, ps, patchListCache); + DraftCommentEvent e = new DraftCommentEvent(c, change, ps, patchListCache); draftCommentEvents.put(c.author.getId(), e); } } @@ -356,8 +348,7 @@ public class ChangeRebuilderImpl extends ChangeRebuilder { events.addAll(msgEvents); } - sortAndFillEvents( - change, noteDbChange, bundle.getPatchSets(), events, minPsNum); + sortAndFillEvents(change, noteDbChange, bundle.getPatchSets(), events, minPsNum); EventList el = new EventList<>(); for (Event e : events) { @@ -371,8 +362,7 @@ public class ChangeRebuilderImpl extends ChangeRebuilder { EventList plcel = new EventList<>(); for (Account.Id author : draftCommentEvents.keys()) { - for (DraftCommentEvent e : - Ordering.natural().sortedCopy(draftCommentEvents.get(author))) { + for (DraftCommentEvent e : Ordering.natural().sortedCopy(draftCommentEvents.get(author))) { if (!plcel.canAdd(e)) { flushEventsToDraftUpdate(manager, plcel, change); checkState(plcel.canAdd(e)); @@ -383,12 +373,10 @@ public class ChangeRebuilderImpl extends ChangeRebuilder { } } - private List parseChangeMessage(ChangeMessage msg, Change change, - Change noteDbChange) { + private List parseChangeMessage(ChangeMessage msg, Change change, Change noteDbChange) { List events = new ArrayList<>(2); events.add(new ChangeMessageEvent(msg, noteDbChange, change.getCreatedOn())); - Optional sce = - StatusChangeEvent.parseFromMessage(msg, change, noteDbChange); + Optional sce = StatusChangeEvent.parseFromMessage(msg, change, noteDbChange); if (sce.isPresent()) { events.add(sce.get()); } @@ -406,18 +394,23 @@ public class ChangeRebuilderImpl extends ChangeRebuilder { return minPsNum; } - private static List getComments(ChangeBundle bundle, String serverId, - PatchLineComment.Status status, PatchSet ps) { - return bundle.getPatchLineComments().stream() - .filter(c -> c.getPatchSetId().equals(ps.getId()) - && c.getStatus() == status) - .map(plc -> plc.asComment(serverId)).sorted(CommentsUtil.COMMENT_ORDER) + private static List getComments( + ChangeBundle bundle, String serverId, PatchLineComment.Status status, PatchSet ps) { + return bundle + .getPatchLineComments() + .stream() + .filter(c -> c.getPatchSetId().equals(ps.getId()) && c.getStatus() == status) + .map(plc -> plc.asComment(serverId)) + .sorted(CommentsUtil.COMMENT_ORDER) .collect(toList()); } - private void sortAndFillEvents(Change change, Change noteDbChange, + private void sortAndFillEvents( + Change change, + Change noteDbChange, ImmutableCollection patchSets, - List events, Integer minPsNum) { + List events, + Integer minPsNum) { Event finalUpdates = new FinalUpdatesEvent(change, noteDbChange, patchSets); events.add(finalUpdates); setPostSubmitDeps(events); @@ -426,8 +419,7 @@ public class ChangeRebuilderImpl extends ChangeRebuilder { // Ensure the first event in the list creates the change, setting the author // and any required footers. Event first = events.get(0); - if (first instanceof PatchSetEvent - && change.getOwner().equals(first.user)) { + if (first instanceof PatchSetEvent && change.getOwner().equals(first.user)) { ((PatchSetEvent) first).createChange = true; } else { events.add(0, new CreateChangeEvent(change, minPsNum)); @@ -470,37 +462,35 @@ public class ChangeRebuilderImpl extends ChangeRebuilder { } private void setPostSubmitDeps(List events) { - Optional submitEvent = Lists.reverse(events).stream() - .filter(Event::isSubmit) - .findFirst(); + Optional submitEvent = + Lists.reverse(events).stream().filter(Event::isSubmit).findFirst(); if (submitEvent.isPresent()) { - events.stream() - .filter(Event::isPostSubmitApproval) - .forEach(e -> e.addDep(submitEvent.get())); + events.stream().filter(Event::isPostSubmitApproval).forEach(e -> e.addDep(submitEvent.get())); } } - private void flushEventsToUpdate(NoteDbUpdateManager manager, - EventList events, Change change) throws OrmException, IOException { + private void flushEventsToUpdate( + NoteDbUpdateManager manager, EventList events, Change change) + throws OrmException, IOException { if (events.isEmpty()) { return; } Comparator labelNameComparator; if (projectCache != null) { - labelNameComparator = projectCache.get(change.getProject()) - .getLabelTypes().nameComparator(); + labelNameComparator = projectCache.get(change.getProject()).getLabelTypes().nameComparator(); } else { // No project cache available, bail and use natural ordering; there's no // semantic difference anyway difference. labelNameComparator = Ordering.natural(); } - ChangeUpdate update = updateFactory.create( - change, - events.getAccountId(), - events.getRealAccountId(), - newAuthorIdent(events), - events.getWhen(), - labelNameComparator); + ChangeUpdate update = + updateFactory.create( + change, + events.getAccountId(), + events.getRealAccountId(), + newAuthorIdent(events), + events.getWhen(), + labelNameComparator); update.setAllowWriteToNewRef(true); update.setPatchSetId(events.getPatchSetId()); update.setTag(events.getTag()); @@ -511,18 +501,19 @@ public class ChangeRebuilderImpl extends ChangeRebuilder { events.clear(); } - private void flushEventsToDraftUpdate(NoteDbUpdateManager manager, - EventList events, Change change) + private void flushEventsToDraftUpdate( + NoteDbUpdateManager manager, EventList events, Change change) throws OrmException { if (events.isEmpty()) { return; } - ChangeDraftUpdate update = draftUpdateFactory.create( - change, - events.getAccountId(), - events.getRealAccountId(), - newAuthorIdent(events), - events.getWhen()); + ChangeDraftUpdate update = + draftUpdateFactory.create( + change, + events.getAccountId(), + events.getRealAccountId(), + newAuthorIdent(events), + events.getWhen()); update.setPatchSetId(events.getPatchSetId()); for (DraftCommentEvent e : events) { e.applyDraft(update); @@ -537,12 +528,11 @@ public class ChangeRebuilderImpl extends ChangeRebuilder { return new PersonIdent(serverIdent, events.getWhen()); } return changeNoteUtil.newIdent( - accountCache.get(id).getAccount(), events.getWhen(), serverIdent, - anonymousCowardName); + accountCache.get(id).getAccount(), events.getWhen(), serverIdent, anonymousCowardName); } - private List getHashtagsEvents(Change change, - NoteDbUpdateManager manager) throws IOException { + private List getHashtagsEvents(Change change, NoteDbUpdateManager manager) + throws IOException { String refName = changeMetaRef(change.getId()); Optional old = manager.getChangeRepo().getObjectId(refName); if (!old.isPresent()) { @@ -556,8 +546,7 @@ public class ChangeRebuilderImpl extends ChangeRebuilder { for (RevCommit commit : rw) { Account.Id authorId; try { - authorId = - changeNoteUtil.parseIdent(commit.getAuthorIdent(), change.getId()); + authorId = changeNoteUtil.parseIdent(commit.getAuthorIdent(), change.getId()); } catch (ConfigInvalidException e) { continue; // Corrupt data, no valid hashtags in this commit. } @@ -567,10 +556,8 @@ public class ChangeRebuilderImpl extends ChangeRebuilder { continue; } - Timestamp commitTime = - new Timestamp(commit.getCommitterIdent().getWhen().getTime()); - events.add(new HashtagsEvent(psId, authorId, commitTime, hashtags, - change.getCreatedOn())); + Timestamp commitTime = new Timestamp(commit.getCommitterIdent().getWhen().getTime()); + events.add(new HashtagsEvent(psId, authorId, commitTime, hashtags, change.getCreatedOn())); } return events; } @@ -599,8 +586,7 @@ public class ChangeRebuilderImpl extends ChangeRebuilder { return new PatchSet.Id(change.getId(), psId); } - private void deleteChangeMetaRef(Change change, ChainedReceiveCommands cmds) - throws IOException { + private void deleteChangeMetaRef(Change change, ChainedReceiveCommands cmds) throws IOException { String refName = changeMetaRef(change.getId()); Optional old = cmds.get(refName); if (old.isPresent()) { @@ -608,12 +594,14 @@ public class ChangeRebuilderImpl extends ChangeRebuilder { } } - private void deleteDraftRefs(Change change, OpenRepo allUsersRepo) - throws IOException { - for (Ref r : allUsersRepo.repo.getRefDatabase() - .getRefs(RefNames.refsDraftCommentsPrefix(change.getId())).values()) { - allUsersRepo.cmds.add( - new ReceiveCommand(r.getObjectId(), ObjectId.zeroId(), r.getName())); + private void deleteDraftRefs(Change change, OpenRepo allUsersRepo) throws IOException { + for (Ref r : + allUsersRepo + .repo + .getRefDatabase() + .getRefs(RefNames.refsDraftCommentsPrefix(change.getId())) + .values()) { + allUsersRepo.cmds.add(new ReceiveCommand(r.getObjectId(), ObjectId.zeroId(), r.getName())); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/CommentEvent.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/CommentEvent.java index 8f461a2f4c..1be5598df4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/CommentEvent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/CommentEvent.java @@ -31,10 +31,14 @@ class CommentEvent extends Event { private final PatchSet ps; private final PatchListCache cache; - CommentEvent(Comment c, Change change, PatchSet ps, - PatchListCache cache) { - super(CommentsUtil.getCommentPsId(change.getId(), c), c.author.getId(), - c.getRealAuthor().getId(), c.writtenOn, change.getCreatedOn(), c.tag); + CommentEvent(Comment c, Change change, PatchSet ps, PatchListCache cache) { + super( + CommentsUtil.getCommentPsId(change.getId(), c), + c.author.getId(), + c.getRealAuthor().getId(), + c.writtenOn, + change.getCreatedOn(), + c.tag); this.c = c; this.change = change; this.ps = ps; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ConflictingUpdateException.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ConflictingUpdateException.java index 2098727730..c6ffffc81f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ConflictingUpdateException.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ConflictingUpdateException.java @@ -21,8 +21,9 @@ class ConflictingUpdateException extends OrmRuntimeException { private static final long serialVersionUID = 1L; ConflictingUpdateException(Change change, String expectedNoteDbState) { - super(String.format( - "Expected change %s to have noteDbState %s but was %s", - change.getId(), expectedNoteDbState, change.getNoteDbState())); + super( + String.format( + "Expected change %s to have noteDbState %s but was %s", + change.getId(), expectedNoteDbState, change.getNoteDbState())); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/CreateChangeEvent.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/CreateChangeEvent.java index b0209118fc..d01071ba02 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/CreateChangeEvent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/CreateChangeEvent.java @@ -18,7 +18,6 @@ import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.server.notedb.ChangeUpdate; import com.google.gwtorm.server.OrmException; - import java.io.IOException; class CreateChangeEvent extends Event { @@ -37,8 +36,13 @@ class CreateChangeEvent extends Event { } CreateChangeEvent(Change change, Integer minPsNum) { - super(psId(change, minPsNum), change.getOwner(), change.getOwner(), - change.getCreatedOn(), change.getCreatedOn(), null); + super( + psId(change, minPsNum), + change.getOwner(), + change.getOwner(), + change.getCreatedOn(), + change.getCreatedOn(), + null); this.change = change; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/DraftCommentEvent.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/DraftCommentEvent.java index 2938480c4f..3cb3eb58a8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/DraftCommentEvent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/DraftCommentEvent.java @@ -31,10 +31,14 @@ class DraftCommentEvent extends Event { private final PatchSet ps; private final PatchListCache cache; - DraftCommentEvent(Comment c, Change change, PatchSet ps, - PatchListCache cache) { - super(CommentsUtil.getCommentPsId(change.getId(), c), c.author.getId(), - c.getRealAuthor().getId(), c.writtenOn, change.getCreatedOn(), c.tag); + DraftCommentEvent(Comment c, Change change, PatchSet ps, PatchListCache cache) { + super( + CommentsUtil.getCommentPsId(change.getId(), c), + c.author.getId(), + c.getRealAuthor().getId(), + c.writtenOn, + change.getCreatedOn(), + c.tag); this.c = c; this.change = change; this.ps = ps; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/Event.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/Event.java index 147a4671c7..10adbab79c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/Event.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/Event.java @@ -25,7 +25,6 @@ import com.google.gerrit.reviewdb.server.ReviewDbUtil; import com.google.gerrit.server.notedb.AbstractChangeUpdate; import com.google.gerrit.server.notedb.ChangeUpdate; import com.google.gwtorm.server.OrmException; - import java.io.IOException; import java.sql.Timestamp; import java.util.ArrayList; @@ -41,10 +40,7 @@ abstract class Event implements Comparable { final String tag; final boolean predatesChange; - /** - * Dependencies of this event; other events that must happen before this - * one. - */ + /** Dependencies of this event; other events that must happen before this one. */ final List deps; Timestamp when; @@ -68,15 +64,21 @@ abstract class Event implements Comparable { } protected void checkUpdate(AbstractChangeUpdate update) { - checkState(Objects.equals(update.getPatchSetId(), psId), + checkState( + Objects.equals(update.getPatchSetId(), psId), "cannot apply event for %s to update for %s", - update.getPatchSetId(), psId); - checkState(when.getTime() - update.getWhen().getTime() <= MAX_WINDOW_MS, + update.getPatchSetId(), + psId); + checkState( + when.getTime() - update.getWhen().getTime() <= MAX_WINDOW_MS, "event at %s outside update window starting at %s", - when, update.getWhen()); - checkState(Objects.equals(update.getNullableAccountId(), user), + when, + update.getWhen()); + checkState( + Objects.equals(update.getNullableAccountId(), user), "cannot apply event by %s to update by %s", - user, update.getNullableAccountId()); + user, + update.getNullableAccountId()); } Event addDep(Event e) { @@ -85,8 +87,8 @@ abstract class Event implements Comparable { } /** - * @return whether this event type must be unique per {@link ChangeUpdate}, - * i.e. there may be at most one of this type. + * @return whether this event type must be unique per {@link ChangeUpdate}, i.e. there may be at + * most one of this type. */ abstract boolean uniquePerUpdate(); @@ -117,11 +119,9 @@ abstract class Event implements Comparable { .compare(this.when, other.when) .compareTrueFirst(isPatchSet(), isPatchSet()) .compareTrueFirst(this.predatesChange, other.predatesChange) - .compare(this.user, other.user, - ReviewDbUtil.intKeyOrdering()) + .compare(this.user, other.user, ReviewDbUtil.intKeyOrdering()) .compare(this.realUser, other.realUser, ReviewDbUtil.intKeyOrdering()) - .compare(this.psId, other.psId, - ReviewDbUtil.intKeyOrdering().nullsLast()) + .compare(this.psId, other.psId, ReviewDbUtil.intKeyOrdering().nullsLast()) .result(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/EventList.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/EventList.java index 59ff49efd7..f0faef1e74 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/EventList.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/EventList.java @@ -20,7 +20,6 @@ import static com.google.common.base.Preconditions.checkState; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.PatchSet; - import java.sql.Timestamp; import java.util.ArrayList; import java.util.Iterator; @@ -74,9 +73,9 @@ class EventList implements Iterable { long t = e.when.getTime(); long tFirst = getFirstTime(); long tLast = getLastTime(); - checkArgument(t >= tLast, - "event %s is before previous event in list %s", e, last); - if (t - tLast > ChangeRebuilderImpl.MAX_DELTA_MS || t - tFirst > ChangeRebuilderImpl.MAX_WINDOW_MS) { + checkArgument(t >= tLast, "event %s is before previous event in list %s", e, last); + if (t - tLast > ChangeRebuilderImpl.MAX_DELTA_MS + || t - tFirst > ChangeRebuilderImpl.MAX_WINDOW_MS) { return false; // Too much time elapsed. } @@ -102,8 +101,8 @@ class EventList implements Iterable { PatchSet.Id getPatchSetId() { PatchSet.Id id = checkNotNull(get(0).psId); for (int i = 1; i < size(); i++) { - checkState(get(i).psId.equals(id), - "mismatched patch sets in EventList: %s != %s", id, get(i).psId); + checkState( + get(i).psId.equals(id), "mismatched patch sets in EventList: %s != %s", id, get(i).psId); } return id; } @@ -111,8 +110,11 @@ class EventList implements Iterable { Account.Id getAccountId() { Account.Id id = get(0).user; for (int i = 1; i < size(); i++) { - checkState(Objects.equals(id, get(i).user), - "mismatched users in EventList: %s != %s", id, get(i).user); + checkState( + Objects.equals(id, get(i).user), + "mismatched users in EventList: %s != %s", + id, + get(i).user); } return id; } @@ -120,8 +122,11 @@ class EventList implements Iterable { Account.Id getRealAccountId() { Account.Id id = get(0).realUser; for (int i = 1; i < size(); i++) { - checkState(Objects.equals(id, get(i).realUser), - "mismatched real users in EventList: %s != %s", id, get(i).realUser); + checkState( + Objects.equals(id, get(i).realUser), + "mismatched real users in EventList: %s != %s", + id, + get(i).realUser); } return id; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/EventSorter.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/EventSorter.java index d0847cd060..077a02787d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/EventSorter.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/EventSorter.java @@ -20,7 +20,6 @@ import static com.google.common.base.Preconditions.checkState; import com.google.common.collect.ListMultimap; import com.google.common.collect.MultimapBuilder; import com.google.common.collect.SetMultimap; - import java.util.Collections; import java.util.LinkedHashSet; import java.util.List; @@ -28,18 +27,18 @@ import java.util.PriorityQueue; /** * Helper to sort a list of events. - *

- * Events are sorted in two passes: + * + *

Events are sorted in two passes: + * *

    - *
  1. Sort by natural order (timestamp, patch set, author, etc.)
  2. - *
  3. Postpone any events with dependencies to occur only after all of their - * dependencies, where this violates natural order.
  4. + *
  5. Sort by natural order (timestamp, patch set, author, etc.) + *
  6. Postpone any events with dependencies to occur only after all of their dependencies, where + * this violates natural order. *
* - * {@link #sort()} modifies the event list in place (similar to {@link - * Collections#sort(List)}), but does not modify any event. In particular, - * events might end up out of order with respect to timestamp; callers are - * responsible for adjusting timestamps later if they prefer monotonicity. + * {@link #sort()} modifies the event list in place (similar to {@link Collections#sort(List)}), but + * does not modify any event. In particular, events might end up out of order with respect to + * timestamp; callers are responsible for adjusting timestamps later if they prefer monotonicity. */ class EventSorter { private final List out; @@ -80,8 +79,8 @@ class EventSorter { while (!todo.isEmpty()) { process(todo.remove(), todo); } - checkState(sorted.size() == size, - "event sort expected %s elements, got %s", size, sorted.size()); + checkState( + sorted.size() == size, "event sort expected %s elements, got %s", size, sorted.size()); // Modify out in-place a la Collections#sort. out.clear(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/FinalUpdatesEvent.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/FinalUpdatesEvent.java index a9b51a494a..474a7e02e0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/FinalUpdatesEvent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/FinalUpdatesEvent.java @@ -21,7 +21,6 @@ import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.server.notedb.ChangeUpdate; import com.google.gwtorm.server.OrmException; - import java.util.Objects; class FinalUpdatesEvent extends Event { @@ -29,10 +28,14 @@ class FinalUpdatesEvent extends Event { private final Change noteDbChange; private final ImmutableCollection patchSets; - FinalUpdatesEvent(Change change, Change noteDbChange, - ImmutableCollection patchSets) { - super(change.currentPatchSetId(), change.getOwner(), change.getOwner(), - change.getLastUpdatedOn(), change.getCreatedOn(), null); + FinalUpdatesEvent(Change change, Change noteDbChange, ImmutableCollection patchSets) { + super( + change.currentPatchSetId(), + change.getOwner(), + change.getOwner(), + change.getLastUpdatedOn(), + change.getCreatedOn(), + null); this.change = change; this.noteDbChange = noteDbChange; this.patchSets = patchSets; @@ -53,8 +56,7 @@ class FinalUpdatesEvent extends Event { // TODO(dborowitz): Stamp approximate approvals at this time. update.fixStatus(change.getStatus()); } - if (change.getSubmissionId() != null - && noteDbChange.getSubmissionId() == null) { + if (change.getSubmissionId() != null && noteDbChange.getSubmissionId() == null) { update.setSubmissionId(change.getSubmissionId()); } if (!Objects.equals(change.getAssignee(), noteDbChange.getAssignee())) { @@ -70,8 +72,7 @@ class FinalUpdatesEvent extends Event { } private boolean highestNumberedPatchSetIsCurrent() { - PatchSet.Id max = - patchSets.stream().map(PatchSet::getId).max(intKeyOrdering()).get(); + PatchSet.Id max = patchSets.stream().map(PatchSet::getId).max(intKeyOrdering()).get(); return max.equals(change.currentPatchSetId()); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/HashtagsEvent.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/HashtagsEvent.java index f5bea3e6e0..028abfed22 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/HashtagsEvent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/HashtagsEvent.java @@ -18,16 +18,24 @@ import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.server.notedb.ChangeUpdate; import com.google.gwtorm.server.OrmException; - import java.sql.Timestamp; import java.util.Set; class HashtagsEvent extends Event { private final Set hashtags; - HashtagsEvent(PatchSet.Id psId, Account.Id who, Timestamp when, - Set hashtags, Timestamp changeCreatdOn) { - super(psId, who, who, when, changeCreatdOn, + HashtagsEvent( + PatchSet.Id psId, + Account.Id who, + Timestamp when, + Set hashtags, + Timestamp changeCreatdOn) { + super( + psId, + who, + who, + when, + changeCreatdOn, // Somewhat confusingly, hashtags do not use the setTag method on // AbstractChangeUpdate, so pass null as the tag. null); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/PatchSetEvent.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/PatchSetEvent.java index eeeec55f45..e0ad6401cd 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/PatchSetEvent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/PatchSetEvent.java @@ -19,15 +19,13 @@ import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.server.notedb.ChangeUpdate; import com.google.gerrit.server.notedb.PatchSetState; import com.google.gwtorm.server.OrmException; - +import java.io.IOException; +import java.util.List; import org.eclipse.jgit.errors.InvalidObjectIdException; import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.revwalk.RevWalk; -import java.io.IOException; -import java.util.List; - class PatchSetEvent extends Event { private final Change change; private final PatchSet ps; @@ -35,8 +33,13 @@ class PatchSetEvent extends Event { boolean createChange; PatchSetEvent(Change change, PatchSet ps, RevWalk rw) { - super(ps.getId(), ps.getUploader(), ps.getUploader(), ps.getCreatedOn(), - change.getCreatedOn(), null); + super( + ps.getId(), + ps.getUploader(), + ps.getUploader(), + ps.getCreatedOn(), + change.getCreatedOn(), + null); this.change = change; this.ps = ps; this.rw = rw; @@ -67,8 +70,7 @@ class PatchSetEvent extends Event { } } - private void setRevision(ChangeUpdate update, PatchSet ps) - throws IOException { + private void setRevision(ChangeUpdate update, PatchSet ps) throws IOException { String rev = ps.getRevision().get(); String cert = ps.getPushCertificate(); ObjectId id; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ReviewerEvent.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ReviewerEvent.java index c82f1084ef..1d8fbfbcc5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ReviewerEvent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ReviewerEvent.java @@ -19,7 +19,6 @@ import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.server.notedb.ChangeUpdate; import com.google.gerrit.server.notedb.ReviewerStateInternal; import com.google.gwtorm.server.OrmException; - import java.io.IOException; import java.sql.Timestamp; @@ -40,7 +39,8 @@ class ReviewerEvent extends Event { // diffs when run against real data. reviewer.getColumnKey(), reviewer.getValue(), - changeCreatedOn, null); + changeCreatedOn, + null); this.reviewer = reviewer; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/StatusChangeEvent.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/StatusChangeEvent.java index 5bc05d0772..025b6c8cbd 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/StatusChangeEvent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/StatusChangeEvent.java @@ -21,7 +21,6 @@ import com.google.gerrit.reviewdb.client.ChangeMessage; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.server.notedb.ChangeUpdate; import com.google.gwtorm.server.OrmException; - import java.sql.Timestamp; import java.util.Map; import java.util.Optional; @@ -31,21 +30,20 @@ class StatusChangeEvent extends Event { private static final ImmutableMap PATTERNS = ImmutableMap.of( Change.Status.ABANDONED, Pattern.compile("^Abandoned(\n.*)*$"), - Change.Status.MERGED, Pattern.compile( - "^Change has been successfully" - + " (merged|cherry-picked|rebased|pushed).*$"), + Change.Status.MERGED, + Pattern.compile( + "^Change has been successfully" + " (merged|cherry-picked|rebased|pushed).*$"), Change.Status.NEW, Pattern.compile("^Restored(\n.*)*$")); - static Optional parseFromMessage(ChangeMessage message, - Change change, Change noteDbChange) { + static Optional parseFromMessage( + ChangeMessage message, Change change, Change noteDbChange) { String msg = message.getMessage(); if (msg == null) { return Optional.empty(); } for (Map.Entry e : PATTERNS.entrySet()) { if (e.getValue().matcher(msg).matches()) { - return Optional.of(new StatusChangeEvent( - message, change, noteDbChange, e.getKey())); + return Optional.of(new StatusChangeEvent(message, change, noteDbChange, e.getKey())); } } return Optional.empty(); @@ -55,16 +53,26 @@ class StatusChangeEvent extends Event { private final Change change; private final Change noteDbChange; - private StatusChangeEvent(ChangeMessage message, Change change, - Change noteDbChange, Change.Status status) { - this(message.getPatchSetId(), message.getAuthor(), - message.getWrittenOn(), change, noteDbChange, message.getTag(), + private StatusChangeEvent( + ChangeMessage message, Change change, Change noteDbChange, Change.Status status) { + this( + message.getPatchSetId(), + message.getAuthor(), + message.getWrittenOn(), + change, + noteDbChange, + message.getTag(), status); } - private StatusChangeEvent(PatchSet.Id psId, Account.Id author, - Timestamp when, Change change, Change noteDbChange, - String tag, Change.Status status) { + private StatusChangeEvent( + PatchSet.Id psId, + Account.Id author, + Timestamp when, + Change change, + Change noteDbChange, + String tag, + Change.Status status) { super(psId, author, author, when, change.getCreatedOn(), tag); this.change = change; this.noteDbChange = noteDbChange; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/AutoMerger.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/AutoMerger.java index aa8879aab1..74a313219a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/AutoMerger.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/AutoMerger.java @@ -23,7 +23,10 @@ import com.google.gerrit.server.GerritPersonIdent; import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.git.InMemoryInserter; import com.google.inject.Inject; - +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; import org.eclipse.jgit.diff.Sequence; import org.eclipse.jgit.dircache.DirCache; import org.eclipse.jgit.dircache.DirCacheBuilder; @@ -49,11 +52,6 @@ import org.eclipse.jgit.util.TemporaryBuffer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.io.InputStream; -import java.util.HashMap; -import java.util.Map; - public class AutoMerger { private static final Logger log = LoggerFactory.getLogger(AutoMerger.class); @@ -65,9 +63,7 @@ public class AutoMerger { private final boolean save; @Inject - AutoMerger( - @GerritServerConfig Config cfg, - @GerritPersonIdent PersonIdent gerritIdent) { + AutoMerger(@GerritServerConfig Config cfg, @GerritPersonIdent PersonIdent gerritIdent) { save = cacheAutomerge(cfg); this.gerritIdent = gerritIdent; } @@ -75,11 +71,15 @@ public class AutoMerger { /** * Perform an auto-merge of the parents of the given merge commit. * - * @return auto-merge commit or {@code null} if an auto-merge commit - * couldn't be created. Headers of the returned RevCommit are parsed. + * @return auto-merge commit or {@code null} if an auto-merge commit couldn't be created. Headers + * of the returned RevCommit are parsed. */ - public RevCommit merge(Repository repo, RevWalk rw, final ObjectInserter ins, - RevCommit merge, ThreeWayMergeStrategy mergeStrategy) + public RevCommit merge( + Repository repo, + RevWalk rw, + final ObjectInserter ins, + RevCommit merge, + ThreeWayMergeStrategy mergeStrategy) throws IOException { checkArgument(rw.getObjectReader().getCreatedFromInserter() == ins); InMemoryInserter tmpIns = null; @@ -135,20 +135,22 @@ public class AutoMerger { String oursMsg = ours.getShortMessage(); String theirsMsg = theirs.getShortMessage(); - String oursName = String.format("HEAD (%s %s)", - ours.abbreviate(6).name(), - oursMsg.substring(0, Math.min(oursMsg.length(), 60))); - String theirsName = String.format("BRANCH (%s %s)", - theirs.abbreviate(6).name(), - theirsMsg.substring(0, Math.min(theirsMsg.length(), 60))); + String oursName = + String.format( + "HEAD (%s %s)", + ours.abbreviate(6).name(), oursMsg.substring(0, Math.min(oursMsg.length(), 60))); + String theirsName = + String.format( + "BRANCH (%s %s)", + theirs.abbreviate(6).name(), + theirsMsg.substring(0, Math.min(theirsMsg.length(), 60))); MergeFormatter fmt = new MergeFormatter(); Map> r = m.getMergeResults(); Map resolved = new HashMap<>(); for (Map.Entry> entry : r.entrySet()) { MergeResult p = entry.getValue(); - try (TemporaryBuffer buf = - new TemporaryBuffer.LocalFile(null, 10 * 1024 * 1024)) { + try (TemporaryBuffer buf = new TemporaryBuffer.LocalFile(null, 10 * 1024 * 1024)) { fmt.formatMerge(buf, p, "BASE", oursName, theirsName, UTF_8.name()); buf.close(); @@ -160,7 +162,7 @@ public class AutoMerger { DirCacheBuilder builder = dc.builder(); int cnt = dc.getEntryCount(); - for (int i = 0; i < cnt;) { + for (int i = 0; i < cnt; ) { DirCacheEntry entry = dc.getEntry(i); if (entry.getStage() == 0) { builder.add(entry); @@ -214,14 +216,14 @@ public class AutoMerger { ObjectInserter ins, String refName, ObjectId tree, - RevCommit merge) throws IOException { + RevCommit merge) + throws IOException { rw.parseHeaders(merge); // For maximum stability, choose a single ident using the committer time of // the input commit, using the server name and timezone. - PersonIdent ident = new PersonIdent( - gerritIdent, - merge.getCommitterIdent().getWhen(), - gerritIdent.getTimeZone()); + PersonIdent ident = + new PersonIdent( + gerritIdent, merge.getCommitterIdent().getWhen(), gerritIdent.getTimeZone()); CommitBuilder cb = new CommitBuilder(); cb.setAuthor(ident); cb.setCommitter(ident); @@ -264,11 +266,9 @@ public class AutoMerger { } @Override - public void flush() { - } + public void flush() {} @Override - public void close() { - } + public void close() {} } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffExecutor.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffExecutor.java index 564ca58453..072c2dab89 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffExecutor.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffExecutor.java @@ -17,15 +17,12 @@ package com.google.gerrit.server.patch; import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.google.inject.BindingAnnotation; - import java.lang.annotation.Retention; import java.util.concurrent.ExecutorService; /** - * Marker on {@link ExecutorService} used by - * {@link IntraLineLoader} and {@link PatchListLoader}. + * Marker on {@link ExecutorService} used by {@link IntraLineLoader} and {@link PatchListLoader}. */ @Retention(RUNTIME) @BindingAnnotation -public @interface DiffExecutor { -} +public @interface DiffExecutor {} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffExecutorModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffExecutorModule.java index 9eaea3a62f..5359479b48 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffExecutorModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffExecutorModule.java @@ -18,7 +18,6 @@ import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.google.inject.AbstractModule; import com.google.inject.Provides; import com.google.inject.Singleton; - import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -26,14 +25,13 @@ import java.util.concurrent.Executors; public class DiffExecutorModule extends AbstractModule { @Override - protected void configure() { - } + protected void configure() {} @Provides @Singleton @DiffExecutor public ExecutorService createDiffExecutor() { - return Executors.newCachedThreadPool(new ThreadFactoryBuilder() - .setNameFormat("Diff-%d").setDaemon(true).build()); + return Executors.newCachedThreadPool( + new ThreadFactoryBuilder().setNameFormat("Diff-%d").setDaemon(true).build()); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffSummaryKey.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffSummaryKey.java index 4c708c4467..bfa7ec3de1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffSummaryKey.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffSummaryKey.java @@ -20,14 +20,12 @@ import static org.eclipse.jgit.lib.ObjectIdSerialization.writeCanBeNull; import static org.eclipse.jgit.lib.ObjectIdSerialization.writeNotNull; import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace; - -import org.eclipse.jgit.lib.ObjectId; - import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.Objects; +import org.eclipse.jgit.lib.ObjectId; public class DiffSummaryKey implements Serializable { public static final long serialVersionUID = 1L; @@ -42,12 +40,11 @@ public class DiffSummaryKey implements Serializable { private transient Whitespace whitespace; public static DiffSummaryKey fromPatchListKey(PatchListKey plk) { - return new DiffSummaryKey(plk.getOldId(), plk.getParentNum(), - plk.getNewId(), plk.getWhitespace()); + return new DiffSummaryKey( + plk.getOldId(), plk.getParentNum(), plk.getNewId(), plk.getWhitespace()); } - private DiffSummaryKey(ObjectId oldId, Integer parentNum, ObjectId newId, - Whitespace whitespace) { + private DiffSummaryKey(ObjectId oldId, Integer parentNum, ObjectId newId, Whitespace whitespace) { this.oldId = oldId; this.parentNum = parentNum; this.newId = newId; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffSummaryLoader.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffSummaryLoader.java index 43e2392571..8aa76cb18d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffSummaryLoader.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffSummaryLoader.java @@ -18,14 +18,12 @@ import com.google.gerrit.reviewdb.client.Patch; import com.google.gerrit.reviewdb.client.Project; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.Callable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class DiffSummaryLoader implements Callable { static final Logger log = LoggerFactory.getLogger(DiffSummaryLoader.class); @@ -39,9 +37,7 @@ public class DiffSummaryLoader implements Callable { private final Project.NameKey project; @AssistedInject - DiffSummaryLoader(PatchListCache plc, - @Assisted DiffSummaryKey k, - @Assisted Project.NameKey p) { + DiffSummaryLoader(PatchListCache plc, @Assisted DiffSummaryKey k, @Assisted Project.NameKey p) { patchListCache = plc; key = k; project = p; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffSummaryWeigher.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffSummaryWeigher.java index 548f999827..26277928bd 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffSummaryWeigher.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffSummaryWeigher.java @@ -17,17 +17,26 @@ package com.google.gerrit.server.patch; import com.google.common.cache.Weigher; /** Computes memory usage for {@link DiffSummary} in bytes of memory used. */ -public class DiffSummaryWeigher implements - Weigher { +public class DiffSummaryWeigher implements Weigher { @Override public int weigh(DiffSummaryKey key, DiffSummary value) { - int size = 16 + 4 * 8 + 2 * 36 // Size of DiffSummaryKey, 64 bit JVM - + 16 + 8 // Size of DiffSummary - + 16 + 8; // String[] + int size = + 16 + + 4 * 8 + + 2 * 36 // Size of DiffSummaryKey, 64 bit JVM + + 16 + + 8 // Size of DiffSummary + + 16 + + 8; // String[] for (String p : value.getPaths()) { - size += 16 + 8 + 4 * 4 // String - + 16 + 8 + p.length() * 2; // char[] + size += + 16 + + 8 + + 4 * 4 // String + + 16 + + 8 + + p.length() * 2; // char[] } return size; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineDiff.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineDiff.java index 60b97c7e14..e51b4abf47 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineDiff.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineDiff.java @@ -20,10 +20,6 @@ import static com.google.gerrit.server.ioutil.BasicSerialization.writeEnum; import static com.google.gerrit.server.ioutil.BasicSerialization.writeVarInt32; import com.google.gerrit.reviewdb.client.CodedEnum; - -import org.eclipse.jgit.diff.Edit; -import org.eclipse.jgit.diff.ReplaceEdit; - import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; @@ -33,12 +29,17 @@ import java.io.Serializable; import java.util.Arrays; import java.util.Collections; import java.util.List; +import org.eclipse.jgit.diff.Edit; +import org.eclipse.jgit.diff.ReplaceEdit; public class IntraLineDiff implements Serializable { static final long serialVersionUID = IntraLineDiffKey.serialVersionUID; public enum Status implements CodedEnum { - EDIT_LIST('e'), DISABLED('D'), TIMEOUT('T'), ERROR('E'); + EDIT_LIST('e'), + DISABLED('D'), + TIMEOUT('T'), + ERROR('E'); private final char code; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineDiffArgs.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineDiffArgs.java index 4a61e2d83a..46ee56ac8a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineDiffArgs.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineDiffArgs.java @@ -16,24 +16,31 @@ package com.google.gerrit.server.patch; import com.google.auto.value.AutoValue; import com.google.gerrit.reviewdb.client.Project; - +import java.util.List; import org.eclipse.jgit.diff.Edit; import org.eclipse.jgit.lib.ObjectId; -import java.util.List; - @AutoValue public abstract class IntraLineDiffArgs { - public static IntraLineDiffArgs create(Text aText, Text bText, List edits, - Project.NameKey project, ObjectId commit, String path) { - return new AutoValue_IntraLineDiffArgs(aText, bText, edits, - project, commit, path); + public static IntraLineDiffArgs create( + Text aText, + Text bText, + List edits, + Project.NameKey project, + ObjectId commit, + String path) { + return new AutoValue_IntraLineDiffArgs(aText, bText, edits, project, commit, path); } public abstract Text aText(); + public abstract Text bText(); + public abstract List edits(); + public abstract Project.NameKey project(); + public abstract ObjectId commit(); + public abstract String path(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineDiffKey.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineDiffKey.java index cdde12ac41..ed58408c5e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineDiffKey.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineDiffKey.java @@ -16,17 +16,14 @@ package com.google.gerrit.server.patch; import com.google.auto.value.AutoValue; import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace; - -import org.eclipse.jgit.lib.ObjectId; - import java.io.Serializable; +import org.eclipse.jgit.lib.ObjectId; @AutoValue public abstract class IntraLineDiffKey implements Serializable { public static final long serialVersionUID = 5L; - public static IntraLineDiffKey create(ObjectId aId, ObjectId bId, - Whitespace whitespace) { + public static IntraLineDiffKey create(ObjectId aId, ObjectId bId, Whitespace whitespace) { return new AutoValue_IntraLineDiffKey(aId, bId, whitespace); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineLoader.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineLoader.java index ae37c018c7..a571c463c7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineLoader.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineLoader.java @@ -20,14 +20,6 @@ import com.google.gerrit.server.config.ConfigUtil; import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - -import org.eclipse.jgit.diff.Edit; -import org.eclipse.jgit.diff.MyersDiff; -import org.eclipse.jgit.diff.ReplaceEdit; -import org.eclipse.jgit.lib.Config; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; @@ -36,6 +28,12 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.regex.Pattern; +import org.eclipse.jgit.diff.Edit; +import org.eclipse.jgit.diff.MyersDiff; +import org.eclipse.jgit.diff.ReplaceEdit; +import org.eclipse.jgit.lib.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; class IntraLineLoader implements Callable { static final Logger log = LoggerFactory.getLogger(IntraLineLoader.class); @@ -44,11 +42,10 @@ class IntraLineLoader implements Callable { IntraLineLoader create(IntraLineDiffKey key, IntraLineDiffArgs args); } - private static final Pattern BLANK_LINE_RE = Pattern - .compile("^[ \\t]*(|[{}]|/\\*\\*?|\\*)[ \\t]*$"); + private static final Pattern BLANK_LINE_RE = + Pattern.compile("^[ \\t]*(|[{}]|/\\*\\*?|\\*)[ \\t]*$"); - private static final Pattern CONTROL_BLOCK_START_RE = Pattern - .compile("[{:][ \\t]*$"); + private static final Pattern CONTROL_BLOCK_START_RE = Pattern.compile("[{:][ \\t]*$"); private final ExecutorService diffExecutor; private final long timeoutMillis; @@ -56,14 +53,19 @@ class IntraLineLoader implements Callable { private final IntraLineDiffArgs args; @AssistedInject - IntraLineLoader(@DiffExecutor ExecutorService diffExecutor, + IntraLineLoader( + @DiffExecutor ExecutorService diffExecutor, @GerritServerConfig Config cfg, @Assisted IntraLineDiffKey key, @Assisted IntraLineDiffArgs args) { this.diffExecutor = diffExecutor; timeoutMillis = - ConfigUtil.getTimeUnit(cfg, "cache", PatchListCacheImpl.INTRA_NAME, - "timeout", TimeUnit.MILLISECONDS.convert(5, TimeUnit.SECONDS), + ConfigUtil.getTimeUnit( + cfg, + "cache", + PatchListCacheImpl.INTRA_NAME, + "timeout", + TimeUnit.MILLISECONDS.convert(5, TimeUnit.SECONDS), TimeUnit.MILLISECONDS); this.key = key; this.args = args; @@ -71,23 +73,30 @@ class IntraLineLoader implements Callable { @Override public IntraLineDiff call() throws Exception { - Future result = diffExecutor.submit( - new Callable() { - @Override - public IntraLineDiff call() throws Exception { - return IntraLineLoader.compute(args.aText(), args.bText(), - args.edits()); - } - }); + Future result = + diffExecutor.submit( + new Callable() { + @Override + public IntraLineDiff call() throws Exception { + return IntraLineLoader.compute(args.aText(), args.bText(), args.edits()); + } + }); try { return result.get(timeoutMillis, TimeUnit.MILLISECONDS); } catch (InterruptedException | TimeoutException e) { - log.warn(timeoutMillis + " ms timeout reached for IntraLineDiff" - + " in project " + args.project() - + " on commit " + args.commit().name() - + " for path " + args.path() - + " comparing " + key.getBlobA().name() - + ".." + key.getBlobB().name()); + log.warn( + timeoutMillis + + " ms timeout reached for IntraLineDiff" + + " in project " + + args.project() + + " on commit " + + args.commit().name() + + " for path " + + args.path() + + " comparing " + + key.getBlobA().name() + + ".." + + key.getBlobB().name()); result.cancel(true); return new IntraLineDiff(IntraLineDiff.Status.TIMEOUT); } catch (ExecutionException e) { @@ -98,8 +107,7 @@ class IntraLineLoader implements Callable { } } - static IntraLineDiff compute(Text aText, Text bText, List edits) - throws Exception { + static IntraLineDiff compute(Text aText, Text bText, List edits) throws Exception { combineLineEdits(edits, aText, bText); for (int i = 0; i < edits.size(); i++) { @@ -116,12 +124,11 @@ class IntraLineLoader implements Callable { // just a few characters apart we tend to get better results // by joining them together and taking the whole span. // - for (int j = 0; j < wordEdits.size() - 1;) { + for (int j = 0; j < wordEdits.size() - 1; ) { Edit c = wordEdits.get(j); Edit n = wordEdits.get(j + 1); - if (n.getBeginA() - c.getEndA() <= 5 - || n.getBeginB() - c.getEndB() <= 5) { + if (n.getBeginA() - c.getEndA() <= 5 || n.getBeginB() - c.getEndB() <= 5) { int ab = c.getBeginA(); int ae = n.getEndA(); @@ -188,7 +195,9 @@ class IntraLineLoader implements Callable { // text might be identical. Slide down that edit and use the tail // rather than the leading bit. // - while (0 < ab && ab < ae && a.charAt(ab - 1) != '\n' + while (0 < ab + && ab < ae + && a.charAt(ab - 1) != '\n' && cmp.equals(a, ab - 1, a, ae - 1)) { ab--; ae--; @@ -203,7 +212,9 @@ class IntraLineLoader implements Callable { } } - while (0 < bb && bb < be && b.charAt(bb - 1) != '\n' + while (0 < bb + && bb < be + && b.charAt(bb - 1) != '\n' && cmp.equals(b, bb - 1, b, be - 1)) { bb--; be--; @@ -223,13 +234,15 @@ class IntraLineLoader implements Callable { // if (ab < ae // && (ab == 0 || a.charAt(ab - 1) == '\n') // - && ae < a.size() && a.charAt(ae - 1) != '\n' + && ae < a.size() + && a.charAt(ae - 1) != '\n' && a.charAt(ae) == '\n') { ae++; } if (bb < be // && (bb == 0 || b.charAt(bb - 1) == '\n') // - && be < b.size() && b.charAt(be - 1) != '\n' + && be < b.size() + && b.charAt(be - 1) != '\n' && b.charAt(be) == '\n') { be++; } @@ -245,7 +258,7 @@ class IntraLineLoader implements Callable { } private static void combineLineEdits(List edits, Text a, Text b) { - for (int j = 0; j < edits.size() - 1;) { + for (int j = 0; j < edits.size() - 1; ) { Edit c = edits.get(j); Edit n = edits.get(j + 1); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineWeigher.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineWeigher.java index 7088fe847e..7bd37afc0b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineWeigher.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineWeigher.java @@ -17,12 +17,18 @@ package com.google.gerrit.server.patch; import com.google.common.cache.Weigher; /** Approximates memory usage for IntralineDiff in bytes of memory used. */ -public class IntraLineWeigher implements - Weigher { +public class IntraLineWeigher implements Weigher { @Override public int weigh(IntraLineDiffKey key, IntraLineDiff value) { - return 16 + 8 * 8 + 2 * 36 // Size of IntraLineDiffKey, 64 bit JVM - + 16 + 2 * 8 + 16 + 8 + 4 + 20 // Size of IntraLineDiff, 64 bit JVM + return 16 + + 8 * 8 + + 2 * 36 // Size of IntraLineDiffKey, 64 bit JVM + + 16 + + 2 * 8 + + 16 + + 8 + + 4 + + 20 // Size of IntraLineDiff, 64 bit JVM + (8 + 16 + 4 * 4) * value.getEdits().size(); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/MergeListBuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/MergeListBuilder.java index 8f54e48ffa..433fcad388 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/MergeListBuilder.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/MergeListBuilder.java @@ -15,17 +15,15 @@ package com.google.gerrit.server.patch; import com.google.common.collect.ImmutableList; - -import org.eclipse.jgit.revwalk.RevCommit; -import org.eclipse.jgit.revwalk.RevWalk; - import java.io.IOException; import java.util.ArrayList; import java.util.List; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.revwalk.RevWalk; public class MergeListBuilder { - public static List build(RevWalk rw, RevCommit merge, - int uninterestingParent) throws IOException { + public static List build(RevWalk rw, RevCommit merge, int uninterestingParent) + throws IOException { rw.reset(); rw.parseBody(merge); if (merge.getParentCount() < 2) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchFile.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchFile.java index d2a6d2b473..b4c2fbe23f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchFile.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchFile.java @@ -18,7 +18,7 @@ import static java.nio.charset.StandardCharsets.UTF_8; import com.google.gerrit.common.errors.NoSuchEntityException; import com.google.gerrit.reviewdb.client.Patch; - +import java.io.IOException; import org.eclipse.jgit.errors.CorruptObjectException; import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.errors.MissingObjectException; @@ -32,8 +32,6 @@ import org.eclipse.jgit.revwalk.RevTree; import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.treewalk.TreeWalk; -import java.io.IOException; - /** State supporting processing of a single {@link Patch} instance. */ public class PatchFile { private final Repository repo; @@ -59,9 +57,7 @@ public class PatchFile { } else { // For the initial commit, we have an empty tree on Side A RevObject object = rw.parseAny(patchList.getOldId()); - a = object instanceof RevCommit - ? Text.forCommit(reader, object) - : Text.EMPTY; + a = object instanceof RevCommit ? Text.forCommit(reader, object) : Text.EMPTY; } b = Text.forCommit(reader, bCommit); @@ -70,9 +66,10 @@ public class PatchFile { } else if (Patch.MERGE_LIST.equals(fileName)) { // For the initial commit, we have an empty tree on Side A RevObject object = rw.parseAny(patchList.getOldId()); - a = object instanceof RevCommit - ? Text.forMergeList(patchList.getComparisonType(), reader, object) - : Text.EMPTY; + a = + object instanceof RevCommit + ? Text.forMergeList(patchList.getComparisonType(), reader, object) + : Text.EMPTY; b = Text.forMergeList(patchList.getComparisonType(), reader, bCommit); aTree = null; @@ -99,8 +96,7 @@ public class PatchFile { * @throws IOException the patch or complete file content cannot be read. * @throws NoSuchEntityException */ - public String getLine(final int file, final int line) - throws IOException, NoSuchEntityException { + public String getLine(final int file, final int line) throws IOException, NoSuchEntityException { switch (file) { case 0: if (a == null) { @@ -127,8 +123,7 @@ public class PatchFile { * @throws IOException the patch or complete file content cannot be read. * @throws NoSuchEntityException the file is not exist. */ - public int getLineCount(final int file) - throws IOException, NoSuchEntityException { + public int getLineCount(final int file) throws IOException, NoSuchEntityException { switch (file) { case 0: if (a == null) { @@ -148,8 +143,8 @@ public class PatchFile { } private Text load(final ObjectId tree, final String path) - throws MissingObjectException, IncorrectObjectTypeException, - CorruptObjectException, IOException { + throws MissingObjectException, IncorrectObjectTypeException, CorruptObjectException, + IOException { if (path == null) { return Text.EMPTY; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchList.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchList.java index 2cfd0074d8..d9a5f4f244 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchList.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchList.java @@ -14,7 +14,6 @@ package com.google.gerrit.server.patch; - import static com.google.gerrit.server.ioutil.BasicSerialization.readBytes; import static com.google.gerrit.server.ioutil.BasicSerialization.readVarInt32; import static com.google.gerrit.server.ioutil.BasicSerialization.writeBytes; @@ -27,10 +26,6 @@ import static org.eclipse.jgit.lib.ObjectIdSerialization.writeNotNull; import com.google.gerrit.common.Nullable; import com.google.gerrit.reviewdb.client.Patch; import com.google.gerrit.reviewdb.client.PatchSet; - -import org.eclipse.jgit.lib.AnyObjectId; -import org.eclipse.jgit.lib.ObjectId; - import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -44,6 +39,8 @@ import java.util.Comparator; import java.util.List; import java.util.zip.DeflaterOutputStream; import java.util.zip.InflaterInputStream; +import org.eclipse.jgit.lib.AnyObjectId; +import org.eclipse.jgit.lib.ObjectId; public class PatchList implements Serializable { private static final long serialVersionUID = PatchListKey.serialVersionUID; @@ -55,8 +52,7 @@ public class PatchList implements Serializable { } }; - @Nullable - private transient ObjectId oldId; + @Nullable private transient ObjectId oldId; private transient ObjectId newId; private transient boolean isMerge; private transient ComparisonType comparisonType; @@ -64,8 +60,11 @@ public class PatchList implements Serializable { private transient int deletions; private transient PatchListEntry[] patches; - public PatchList(@Nullable AnyObjectId oldId, AnyObjectId newId, - boolean isMerge, ComparisonType comparisonType, + public PatchList( + @Nullable AnyObjectId oldId, + AnyObjectId newId, + boolean isMerge, + ComparisonType comparisonType, PatchListEntry[] patches) { this.oldId = oldId != null ? oldId.copy() : null; this.newId = newId.copy(); @@ -117,17 +116,18 @@ public class PatchList implements Serializable { /** * Get a sorted, modifiable list of all files in this list. - *

- * The returned list items do not populate: + * + *

The returned list items do not populate: + * *

    - *
  • {@link Patch#getCommentCount()} - *
  • {@link Patch#getDraftCount()} - *
  • {@link Patch#isReviewedByCurrentUser()} + *
  • {@link Patch#getCommentCount()} + *
  • {@link Patch#getDraftCount()} + *
  • {@link Patch#isReviewedByCurrentUser()} *
* - * @param setId the patch set identity these patches belong to. This really - * should not need to be specified, but is a current legacy artifact of - * how the cache is keyed versus how the database is keyed. + * @param setId the patch set identity these patches belong to. This really should not need to be + * specified, but is a current legacy artifact of how the cache is keyed versus how the + * database is keyed. */ public List toPatchList(final PatchSet.Id setId) { final ArrayList r = new ArrayList<>(patches.length); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListCache.java index 848b78ff0b..fd8baad309 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListCache.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListCache.java @@ -17,22 +17,18 @@ package com.google.gerrit.server.patch; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.reviewdb.client.Project; - import org.eclipse.jgit.lib.ObjectId; /** Provides a cached list of {@link PatchListEntry}. */ public interface PatchListCache { - PatchList get(PatchListKey key, Project.NameKey project) - throws PatchListNotAvailableException; + PatchList get(PatchListKey key, Project.NameKey project) throws PatchListNotAvailableException; - PatchList get(Change change, PatchSet patchSet) - throws PatchListNotAvailableException; + PatchList get(Change change, PatchSet patchSet) throws PatchListNotAvailableException; ObjectId getOldId(Change change, PatchSet patchSet, Integer parentNum) throws PatchListNotAvailableException; - IntraLineDiff getIntraLineDiff(IntraLineDiffKey key, - IntraLineDiffArgs args); + IntraLineDiff getIntraLineDiff(IntraLineDiffKey key, IntraLineDiffArgs args); DiffSummary getDiffSummary(Change change, PatchSet patchSet) throws PatchListNotAvailableException; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListCacheImpl.java index f1490f6fc1..25f0dda24b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListCacheImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListCacheImpl.java @@ -29,13 +29,11 @@ import com.google.inject.Inject; import com.google.inject.Module; import com.google.inject.Singleton; import com.google.inject.name.Named; - +import java.util.concurrent.ExecutionException; import org.eclipse.jgit.errors.LargeObjectException; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.ObjectId; -import java.util.concurrent.ExecutionException; - /** Provides a cached list of {@link PatchListEntry}. */ @Singleton public class PatchListCacheImpl implements PatchListCache { @@ -94,8 +92,8 @@ public class PatchListCacheImpl implements PatchListCache { this.diffSummaryLoaderFactory = diffSummaryLoaderFactory; this.computeIntraline = - cfg.getBoolean("cache", INTRA_NAME, "enabled", - cfg.getBoolean("cache", "diff", "intraline", true)); + cfg.getBoolean( + "cache", INTRA_NAME, "enabled", cfg.getBoolean("cache", "diff", "intraline", true)); } @Override @@ -103,9 +101,7 @@ public class PatchListCacheImpl implements PatchListCache { throws PatchListNotAvailableException { try { PatchList pl = fileCache.get(key, fileLoaderFactory.create(key, project)); - diffSummaryCache.put( - DiffSummaryKey.fromPatchListKey(key), - toDiffSummary(pl)); + diffSummaryCache.put(DiffSummaryKey.fromPatchListKey(key), toDiffSummary(pl)); return pl; } catch (ExecutionException e) { PatchListLoader.log.warn("Error computing " + key, e); @@ -120,8 +116,7 @@ public class PatchListCacheImpl implements PatchListCache { } @Override - public PatchList get(Change change, PatchSet patchSet) - throws PatchListNotAvailableException { + public PatchList get(Change change, PatchSet patchSet) throws PatchListNotAvailableException { return get(change, patchSet, null); } @@ -135,8 +130,7 @@ public class PatchListCacheImpl implements PatchListCache { throws PatchListNotAvailableException { Project.NameKey project = change.getProject(); if (patchSet.getRevision() == null) { - throw new PatchListNotAvailableException( - "revision is null for " + patchSet.getId()); + throw new PatchListNotAvailableException("revision is null for " + patchSet.getId()); } ObjectId b = ObjectId.fromString(patchSet.getRevision().get()); Whitespace ws = Whitespace.IGNORE_NONE; @@ -147,8 +141,7 @@ public class PatchListCacheImpl implements PatchListCache { } @Override - public IntraLineDiff getIntraLineDiff(IntraLineDiffKey key, - IntraLineDiffArgs args) { + public IntraLineDiff getIntraLineDiff(IntraLineDiffKey key, IntraLineDiffArgs args) { if (computeIntraline) { try { return intraCache.get(key, intraLoaderFactory.create(key, args)); @@ -167,16 +160,13 @@ public class PatchListCacheImpl implements PatchListCache { ObjectId b = ObjectId.fromString(patchSet.getRevision().get()); Whitespace ws = Whitespace.IGNORE_NONE; return getDiffSummary( - DiffSummaryKey.fromPatchListKey( - PatchListKey.againstDefaultBase(b, ws)), - project); + DiffSummaryKey.fromPatchListKey(PatchListKey.againstDefaultBase(b, ws)), project); } - private DiffSummary getDiffSummary(DiffSummaryKey key, - Project.NameKey project) throws PatchListNotAvailableException { + private DiffSummary getDiffSummary(DiffSummaryKey key, Project.NameKey project) + throws PatchListNotAvailableException { try { - return diffSummaryCache.get(key, - diffSummaryLoaderFactory.create(key, project)); + return diffSummaryCache.get(key, diffSummaryLoaderFactory.create(key, project)); } catch (ExecutionException e) { PatchListLoader.log.warn("Error computing " + key, e); throw new PatchListNotAvailableException(e); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListEntry.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListEntry.java index 3266f01754..a8a8b79b40 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListEntry.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListEntry.java @@ -29,14 +29,6 @@ import com.google.gerrit.reviewdb.client.Patch; import com.google.gerrit.reviewdb.client.Patch.ChangeType; import com.google.gerrit.reviewdb.client.Patch.PatchType; import com.google.gerrit.reviewdb.client.PatchSet; - -import org.eclipse.jgit.diff.Edit; -import org.eclipse.jgit.lib.Constants; -import org.eclipse.jgit.patch.CombinedFileHeader; -import org.eclipse.jgit.patch.FileHeader; -import org.eclipse.jgit.util.IntList; -import org.eclipse.jgit.util.RawParseUtils; - import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -44,13 +36,28 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; +import org.eclipse.jgit.diff.Edit; +import org.eclipse.jgit.lib.Constants; +import org.eclipse.jgit.patch.CombinedFileHeader; +import org.eclipse.jgit.patch.FileHeader; +import org.eclipse.jgit.util.IntList; +import org.eclipse.jgit.util.RawParseUtils; public class PatchListEntry { private static final byte[] EMPTY_HEADER = {}; static PatchListEntry empty(final String fileName) { - return new PatchListEntry(ChangeType.MODIFIED, PatchType.UNIFIED, null, - fileName, EMPTY_HEADER, Collections. emptyList(), 0, 0, 0, 0); + return new PatchListEntry( + ChangeType.MODIFIED, + PatchType.UNIFIED, + null, + fileName, + EMPTY_HEADER, + Collections.emptyList(), + 0, + 0, + 0, + 0); } private final ChangeType changeType; @@ -66,8 +73,7 @@ public class PatchListEntry { // Note: When adding new fields, the serialVersionUID in PatchListKey must be // incremented so that entries from the cache are automatically invalidated. - PatchListEntry(FileHeader hdr, List editList, long size, - long sizeDelta) { + PatchListEntry(FileHeader hdr, List editList, long size, long sizeDelta) { changeType = toChangeType(hdr); patchType = toPatchType(hdr); @@ -114,9 +120,17 @@ public class PatchListEntry { this.sizeDelta = sizeDelta; } - private PatchListEntry(ChangeType changeType, PatchType patchType, - String oldName, String newName, byte[] header, List edits, - int insertions, int deletions, long size, long sizeDelta) { + private PatchListEntry( + ChangeType changeType, + PatchType patchType, + String oldName, + String newName, + byte[] header, + List edits, + int insertions, + int deletions, + long size, + long sizeDelta) { this.changeType = changeType; this.patchType = patchType; this.oldName = oldName; @@ -246,8 +260,8 @@ public class PatchListEntry { editArray[i] = new Edit(beginA, endA, beginB, endB); } - return new PatchListEntry(changeType, patchType, oldName, newName, hdr, - toList(editArray), ins, del, size, sizeDelta); + return new PatchListEntry( + changeType, patchType, oldName, newName, hdr, toList(editArray), ins, del, size, sizeDelta); } private static List toList(Edit[] l) { @@ -288,8 +302,7 @@ public class PatchListEntry { case COPY: return Patch.ChangeType.COPIED; default: - throw new IllegalArgumentException("Unsupported type " - + hdr.getChangeType()); + throw new IllegalArgumentException("Unsupported type " + hdr.getChangeType()); } } @@ -305,8 +318,7 @@ public class PatchListEntry { pt = Patch.PatchType.BINARY; break; default: - throw new IllegalArgumentException("Unsupported type " - + hdr.getPatchType()); + throw new IllegalArgumentException("Unsupported type " + hdr.getPatchType()); } if (pt != PatchType.BINARY) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListKey.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListKey.java index 6bb32a243a..37a636da15 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListKey.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListKey.java @@ -24,56 +24,53 @@ import com.google.common.collect.BiMap; import com.google.common.collect.ImmutableBiMap; import com.google.gerrit.common.Nullable; import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace; - -import org.eclipse.jgit.lib.AnyObjectId; -import org.eclipse.jgit.lib.ObjectId; - import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.Objects; +import org.eclipse.jgit.lib.AnyObjectId; +import org.eclipse.jgit.lib.ObjectId; public class PatchListKey implements Serializable { public static final long serialVersionUID = 24L; - public static final BiMap WHITESPACE_TYPES = ImmutableBiMap.of( - Whitespace.IGNORE_NONE, 'N', - Whitespace.IGNORE_TRAILING, 'E', - Whitespace.IGNORE_LEADING_AND_TRAILING, 'S', - Whitespace.IGNORE_ALL, 'A'); + public static final BiMap WHITESPACE_TYPES = + ImmutableBiMap.of( + Whitespace.IGNORE_NONE, 'N', + Whitespace.IGNORE_TRAILING, 'E', + Whitespace.IGNORE_LEADING_AND_TRAILING, 'S', + Whitespace.IGNORE_ALL, 'A'); static { checkState(WHITESPACE_TYPES.size() == Whitespace.values().length); } - public static PatchListKey againstDefaultBase(AnyObjectId newId, - Whitespace ws) { + public static PatchListKey againstDefaultBase(AnyObjectId newId, Whitespace ws) { return new PatchListKey(null, newId, ws); } - public static PatchListKey againstParentNum(int parentNum, AnyObjectId newId, - Whitespace ws) { + public static PatchListKey againstParentNum(int parentNum, AnyObjectId newId, Whitespace ws) { return new PatchListKey(parentNum, newId, ws); } /** * Old patch-set ID - *

- * When null, it represents the Base of the newId for a non-merge commit. - *

- * When newId is a merge commit, null value of the oldId represents either - * the auto-merge commit of the newId or a parent commit of the newId. - * These two cases are distinguished by the parentNum. + * + *

When null, it represents the Base of the newId for a non-merge commit. + * + *

When newId is a merge commit, null value of the oldId represents either the auto-merge + * commit of the newId or a parent commit of the newId. These two cases are distinguished by the + * parentNum. */ private transient ObjectId oldId; /** * 1-based parent number when newId is a merge commit - *

- * For the auto-merge case this field is null. - *

- * Used only when oldId is null and newId is a merge commit + * + *

For the auto-merge case this field is null. + * + *

Used only when oldId is null and newId is a merge commit */ private transient Integer parentNum; @@ -93,8 +90,7 @@ public class PatchListKey implements Serializable { } /** For use only by DiffSummaryKey. */ - PatchListKey(ObjectId oldId, Integer parentNum, ObjectId newId, - Whitespace whitespace) { + PatchListKey(ObjectId oldId, Integer parentNum, ObjectId newId, Whitespace whitespace) { this.oldId = oldId; this.parentNum = parentNum; this.newId = newId; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListLoader.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListLoader.java index e1829bcdb6..124fe8e290 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListLoader.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListLoader.java @@ -31,7 +31,18 @@ import com.google.gerrit.server.git.InMemoryInserter; import com.google.gerrit.server.git.MergeUtil; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.stream.Stream; import org.eclipse.jgit.diff.DiffEntry; import org.eclipse.jgit.diff.DiffFormatter; import org.eclipse.jgit.diff.Edit; @@ -58,19 +69,6 @@ import org.eclipse.jgit.util.io.DisabledOutputStream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Set; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; -import java.util.stream.Stream; - public class PatchListLoader implements Callable { static final Logger log = LoggerFactory.getLogger(PatchListLoader.class); @@ -89,7 +87,8 @@ public class PatchListLoader implements Callable { private final boolean save; @AssistedInject - PatchListLoader(GitRepositoryManager mgr, + PatchListLoader( + GitRepositoryManager mgr, PatchListCache plc, @GerritServerConfig Config cfg, @DiffExecutor ExecutorService de, @@ -104,15 +103,18 @@ public class PatchListLoader implements Callable { key = k; project = p; timeoutMillis = - ConfigUtil.getTimeUnit(cfg, "cache", PatchListCacheImpl.FILE_NAME, - "timeout", TimeUnit.MILLISECONDS.convert(5, TimeUnit.SECONDS), + ConfigUtil.getTimeUnit( + cfg, + "cache", + PatchListCacheImpl.FILE_NAME, + "timeout", + TimeUnit.MILLISECONDS.convert(5, TimeUnit.SECONDS), TimeUnit.MILLISECONDS); save = AutoMerger.cacheAutomerge(cfg); } @Override - public PatchList call() throws IOException, - PatchListNotAvailableException { + public PatchList call() throws IOException, PatchListNotAvailableException { try (Repository repo = repoManager.openRepository(project); ObjectInserter ins = newInserter(repo); ObjectReader reader = ins.newReader(); @@ -139,13 +141,11 @@ public class PatchListLoader implements Callable { } private ObjectInserter newInserter(Repository repo) { - return save - ? repo.newObjectInserter() - : new InMemoryInserter(repo); + return save ? repo.newObjectInserter() : new InMemoryInserter(repo); } - public PatchList readPatchList(Repository repo, RevWalk rw, - ObjectInserter ins) throws IOException, PatchListNotAvailableException { + public PatchList readPatchList(Repository repo, RevWalk rw, ObjectInserter ins) + throws IOException, PatchListNotAvailableException { ObjectReader reader = rw.getObjectReader(); checkArgument(reader.getCreatedFromInserter() == ins); RawTextComparator cmp = comparatorFor(key.getWhitespace()); @@ -180,42 +180,43 @@ public class PatchListLoader implements Callable { Set paths = null; if (key.getOldId() != null && b.getParentCount() == 1) { - PatchListKey newKey = PatchListKey.againstDefaultBase( - key.getNewId(), key.getWhitespace()); - PatchListKey oldKey = PatchListKey.againstDefaultBase( - key.getOldId(), key.getWhitespace()); - paths = Stream.concat( - patchListCache.get(newKey, project).getPatches().stream(), - patchListCache.get(oldKey, project).getPatches().stream()) - .map(PatchListEntry::getNewName) - .collect(toSet()); + PatchListKey newKey = PatchListKey.againstDefaultBase(key.getNewId(), key.getWhitespace()); + PatchListKey oldKey = PatchListKey.againstDefaultBase(key.getOldId(), key.getWhitespace()); + paths = + Stream.concat( + patchListCache.get(newKey, project).getPatches().stream(), + patchListCache.get(oldKey, project).getPatches().stream()) + .map(PatchListEntry::getNewName) + .collect(toSet()); } int cnt = diffEntries.size(); List entries = new ArrayList<>(); - entries.add(newCommitMessage(cmp, reader, - comparisonType.isAgainstParentOrAutoMerge() ? null : aCommit, b)); + entries.add( + newCommitMessage( + cmp, reader, comparisonType.isAgainstParentOrAutoMerge() ? null : aCommit, b)); boolean isMerge = b.getParentCount() > 1; if (isMerge) { - entries.add(newMergeList(cmp, reader, - comparisonType.isAgainstParentOrAutoMerge() ? null : aCommit, b, - comparisonType)); + entries.add( + newMergeList( + cmp, + reader, + comparisonType.isAgainstParentOrAutoMerge() ? null : aCommit, + b, + comparisonType)); } for (int i = 0; i < cnt; i++) { DiffEntry e = diffEntries.get(i); - if (paths == null || paths.contains(e.getNewPath()) - || paths.contains(e.getOldPath())) { + if (paths == null || paths.contains(e.getNewPath()) || paths.contains(e.getOldPath())) { FileHeader fh = toFileHeader(key, df, e); - long oldSize = - getFileSize(reader, e.getOldMode(), e.getOldPath(), aTree); - long newSize = - getFileSize(reader, e.getNewMode(), e.getNewPath(), bTree); + long oldSize = getFileSize(reader, e.getOldMode(), e.getOldPath(), aTree); + long newSize = getFileSize(reader, e.getNewMode(), e.getNewPath(), bTree); entries.add(newEntry(aTree, fh, newSize, newSize - oldSize)); } } - return new PatchList(a, b, isMerge, comparisonType, - entries.toArray(new PatchListEntry[entries.size()])); + return new PatchList( + a, b, isMerge, comparisonType, entries.toArray(new PatchListEntry[entries.size()])); } } @@ -233,15 +234,13 @@ public class PatchListLoader implements Callable { return ComparisonType.againstOtherPatchSet(); } - private static long getFileSize(ObjectReader reader, - FileMode mode, String path, RevTree t) throws IOException { + private static long getFileSize(ObjectReader reader, FileMode mode, String path, RevTree t) + throws IOException { if (!isBlob(mode)) { return 0; } try (TreeWalk tw = TreeWalk.forPath(reader, path, t)) { - return tw != null - ? reader.open(tw.getObjectId(0), OBJ_BLOB).getSize() - : 0; + return tw != null ? reader.open(tw.getObjectId(0), OBJ_BLOB).getSize() : 0; } } @@ -250,28 +249,37 @@ public class PatchListLoader implements Callable { return t == FileMode.TYPE_FILE || t == FileMode.TYPE_SYMLINK; } - private FileHeader toFileHeader(PatchListKey key, - final DiffFormatter diffFormatter, final DiffEntry diffEntry) + private FileHeader toFileHeader( + PatchListKey key, final DiffFormatter diffFormatter, final DiffEntry diffEntry) throws IOException { - Future result = diffExecutor.submit(new Callable() { - @Override - public FileHeader call() throws IOException { - synchronized (diffEntry) { - return diffFormatter.toFileHeader(diffEntry); - } - } - }); + Future result = + diffExecutor.submit( + new Callable() { + @Override + public FileHeader call() throws IOException { + synchronized (diffEntry) { + return diffFormatter.toFileHeader(diffEntry); + } + } + }); try { return result.get(timeoutMillis, TimeUnit.MILLISECONDS); } catch (InterruptedException | TimeoutException e) { - log.warn(timeoutMillis + " ms timeout reached for Diff loader" - + " in project " + project - + " on commit " + key.getNewId().name() - + " on path " + diffEntry.getNewPath() - + " comparing " + diffEntry.getOldId().name() - + ".." + diffEntry.getNewId().name()); + log.warn( + timeoutMillis + + " ms timeout reached for Diff loader" + + " in project " + + project + + " on commit " + + key.getNewId().name() + + " on path " + + diffEntry.getNewPath() + + " comparing " + + diffEntry.getOldId().name() + + ".." + + diffEntry.getNewId().name()); result.cancel(true); synchronized (diffEntry) { return toFileHeaderWithoutMyersDiff(diffFormatter, diffEntry); @@ -284,37 +292,36 @@ public class PatchListLoader implements Callable { } } - private FileHeader toFileHeaderWithoutMyersDiff(DiffFormatter diffFormatter, - DiffEntry diffEntry) throws IOException { + private FileHeader toFileHeaderWithoutMyersDiff(DiffFormatter diffFormatter, DiffEntry diffEntry) + throws IOException { HistogramDiff histogramDiff = new HistogramDiff(); histogramDiff.setFallbackAlgorithm(null); diffFormatter.setDiffAlgorithm(histogramDiff); return diffFormatter.toFileHeader(diffEntry); } - private PatchListEntry newCommitMessage(RawTextComparator cmp, - ObjectReader reader, RevCommit aCommit, RevCommit bCommit) - throws IOException { - Text aText = aCommit != null - ? Text.forCommit(reader, aCommit) - : Text.EMPTY; + private PatchListEntry newCommitMessage( + RawTextComparator cmp, ObjectReader reader, RevCommit aCommit, RevCommit bCommit) + throws IOException { + Text aText = aCommit != null ? Text.forCommit(reader, aCommit) : Text.EMPTY; Text bText = Text.forCommit(reader, bCommit); return createPatchListEntry(cmp, aCommit, aText, bText, Patch.COMMIT_MSG); } - private PatchListEntry newMergeList(RawTextComparator cmp, - ObjectReader reader, RevCommit aCommit, RevCommit bCommit, - ComparisonType comparisonType) throws IOException { - Text aText = aCommit != null - ? Text.forMergeList(comparisonType, reader, aCommit) - : Text.EMPTY; - Text bText = - Text.forMergeList(comparisonType, reader, bCommit); + private PatchListEntry newMergeList( + RawTextComparator cmp, + ObjectReader reader, + RevCommit aCommit, + RevCommit bCommit, + ComparisonType comparisonType) + throws IOException { + Text aText = aCommit != null ? Text.forMergeList(comparisonType, reader, aCommit) : Text.EMPTY; + Text bText = Text.forMergeList(comparisonType, reader, bCommit); return createPatchListEntry(cmp, aCommit, aText, bText, Patch.MERGE_LIST); } - private static PatchListEntry createPatchListEntry(RawTextComparator cmp, - RevCommit aCommit, Text aText, Text bText, String fileName) { + private static PatchListEntry createPatchListEntry( + RawTextComparator cmp, RevCommit aCommit, Text aText, Text bText, String fileName) { byte[] rawHdr = getRawHeader(aCommit != null, fileName); byte[] aContent = aText.getContent(); byte[] bContent = bText.getContent(); @@ -347,25 +354,22 @@ public class PatchListLoader implements Callable { return hdr.toString().getBytes(UTF_8); } - private PatchListEntry newEntry(RevTree aTree, FileHeader fileHeader, - long size, long sizeDelta) { + private PatchListEntry newEntry(RevTree aTree, FileHeader fileHeader, long size, long sizeDelta) { if (aTree == null // want combined diff || fileHeader.getPatchType() != PatchType.UNIFIED || fileHeader.getHunks().isEmpty()) { - return new PatchListEntry(fileHeader, Collections. emptyList(), - size, sizeDelta); + return new PatchListEntry(fileHeader, Collections.emptyList(), size, sizeDelta); } List edits = fileHeader.toEditList(); if (edits.isEmpty()) { - return new PatchListEntry(fileHeader, Collections. emptyList(), - size, sizeDelta); + return new PatchListEntry(fileHeader, Collections.emptyList(), size, sizeDelta); } return new PatchListEntry(fileHeader, edits, size, sizeDelta); } - private RevObject aFor(PatchListKey key, - Repository repo, RevWalk rw, ObjectInserter ins, RevCommit b) + private RevObject aFor( + PatchListKey key, Repository repo, RevWalk rw, ObjectInserter ins, RevCommit b) throws IOException { if (key.getOldId() != null) { return rw.parseAny(key.getOldId()); @@ -374,11 +378,12 @@ public class PatchListLoader implements Callable { switch (b.getParentCount()) { case 0: return rw.parseAny(emptyTree(ins)); - case 1: { - RevCommit r = b.getParent(0); - rw.parseBody(r); - return r; - } + case 1: + { + RevCommit r = b.getParent(0); + rw.parseBody(r); + return r; + } case 2: if (key.getParentNum() != null) { RevCommit r = b.getParent(key.getParentNum() - 1); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListWeigher.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListWeigher.java index 2362986344..f40eac6518 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListWeigher.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListWeigher.java @@ -20,8 +20,14 @@ import com.google.common.cache.Weigher; public class PatchListWeigher implements Weigher { @Override public int weigh(PatchListKey key, PatchList value) { - int size = 16 + 4 * 8 + 2 * 36 // Size of PatchListKey, 64 bit JVM - + 16 + 3 * 8 + 3 * 4 + 20; // Size of PatchList, 64 bit JVM + int size = + 16 + + 4 * 8 + + 2 * 36 // Size of PatchListKey, 64 bit JVM + + 16 + + 3 * 8 + + 3 * 4 + + 20; // Size of PatchList, 64 bit JVM for (PatchListEntry e : value.getPatches()) { size += e.weigh(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptBuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptBuilder.java index 246d7a5472..db495b8ef9 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptBuilder.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptBuilder.java @@ -27,10 +27,13 @@ import com.google.gerrit.reviewdb.client.Patch; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.mime.FileTypeRegistry; import com.google.inject.Inject; - import eu.medsea.mimeutil.MimeType; import eu.medsea.mimeutil.MimeUtil2; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; import org.eclipse.jgit.diff.Edit; import org.eclipse.jgit.errors.CorruptObjectException; import org.eclipse.jgit.errors.IncorrectObjectTypeException; @@ -44,22 +47,17 @@ import org.eclipse.jgit.revwalk.RevTree; import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.treewalk.TreeWalk; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - class PatchScriptBuilder { static final int MAX_CONTEXT = 5000000; static final int BIG_FILE = 9000; - private static final Comparator EDIT_SORT = new Comparator() { - @Override - public int compare(final Edit o1, final Edit o2) { - return o1.getBeginA() - o2.getBeginA(); - } - }; + private static final Comparator EDIT_SORT = + new Comparator() { + @Override + public int compare(final Edit o1, final Edit o2) { + return o1.getBeginA() - o2.getBeginA(); + } + }; private Repository db; private Project.NameKey projectKey; @@ -79,8 +77,7 @@ class PatchScriptBuilder { private int context; @Inject - PatchScriptBuilder(FileTypeRegistry ftr, - PatchListCache plc) { + PatchScriptBuilder(FileTypeRegistry ftr, PatchListCache plc) { a = new Side(); b = new Side(); registry = ftr; @@ -113,8 +110,8 @@ class PatchScriptBuilder { bId = b; } - PatchScript toPatchScript(final PatchListEntry content, - final CommentDetail comments, final List history) + PatchScript toPatchScript( + final PatchListEntry content, final CommentDetail comments, final List history) throws IOException { reader = db.newObjectReader(); try { @@ -124,8 +121,8 @@ class PatchScriptBuilder { } } - private PatchScript build(final PatchListEntry content, - final CommentDetail comments, final List history) + private PatchScript build( + final PatchListEntry content, final CommentDetail comments, final List history) throws IOException { boolean intralineDifferenceIsPossible = true; boolean intralineFailure = false; @@ -144,11 +141,8 @@ class PatchScriptBuilder { } else if (diffPrefs.intralineDifference) { IntraLineDiff d = patchListCache.getIntraLineDiff( - IntraLineDiffKey.create( - a.id, b.id, - diffPrefs.ignoreWhitespace), - IntraLineDiffArgs.create( - a.src, b.src, edits, projectKey, bId, b.path)); + IntraLineDiffKey.create(a.id, b.id, diffPrefs.ignoreWhitespace), + IntraLineDiffArgs.create(a.src, b.src, edits, projectKey, bId, b.path)); if (d != null) { switch (d.getStatus()) { case EDIT_LIST: @@ -180,8 +174,7 @@ class PatchScriptBuilder { } boolean hugeFile = false; - if (a.src == b.src && a.size() <= context - && content.getEdits().isEmpty()) { + if (a.src == b.src && a.size() <= context && content.getEdits().isEmpty()) { // Odd special case; the files are identical (100% rename or copy) // and the user has asked for context that is larger than the file. // Send them the entire file, with an empty edit after the last line. @@ -198,7 +191,6 @@ class PatchScriptBuilder { // the browser client. // hugeFile = true; - } // In order to expand the skipped common lines or syntax highlight the @@ -210,12 +202,28 @@ class PatchScriptBuilder { packContent(diffPrefs.ignoreWhitespace != Whitespace.IGNORE_NONE); } - return new PatchScript(change.getKey(), content.getChangeType(), - content.getOldName(), content.getNewName(), a.fileMode, b.fileMode, - content.getHeaderLines(), diffPrefs, a.dst, b.dst, edits, - a.displayMethod, b.displayMethod, a.mimeType.toString(), - b.mimeType.toString(), comments, history, hugeFile, - intralineDifferenceIsPossible, intralineFailure, intralineTimeout, + return new PatchScript( + change.getKey(), + content.getChangeType(), + content.getOldName(), + content.getNewName(), + a.fileMode, + b.fileMode, + content.getHeaderLines(), + diffPrefs, + a.dst, + b.dst, + edits, + a.displayMethod, + b.displayMethod, + a.mimeType.toString(), + b.mimeType.toString(), + comments, + history, + hugeFile, + intralineDifferenceIsPossible, + intralineFailure, + intralineTimeout, content.getPatchType() == Patch.PatchType.BINARY, aId == null ? null : aId.getName(), bId == null ? null : bId.getName()); @@ -480,9 +488,10 @@ class PatchScriptBuilder { id = tw != null ? tw.getObjectId(0) : ObjectId.zeroId(); mode = tw != null ? tw.getFileMode(0) : FileMode.MISSING; - reuse = other != null - && other.id.equals(id) - && (other.mode == mode || isBothFile(other.mode, mode)); + reuse = + other != null + && other.id.equals(id) + && (other.mode == mode || isBothFile(other.mode, mode)); if (reuse) { srcContent = other.srcContent; @@ -505,8 +514,7 @@ class PatchScriptBuilder { } else if (srcContent.length > 0 && FileMode.SYMLINK != mode) { mimeType = registry.getMimeType(path, srcContent); - if ("image".equals(mimeType.getMediaType()) - && registry.isSafeInline(mimeType)) { + if ("image".equals(mimeType.getMediaType()) && registry.isSafeInline(mimeType)) { displayMethod = DisplayMethod.IMG; } } @@ -540,8 +548,9 @@ class PatchScriptBuilder { } } - private TreeWalk find(final ObjectId within) throws MissingObjectException, - IncorrectObjectTypeException, CorruptObjectException, IOException { + private TreeWalk find(final ObjectId within) + throws MissingObjectException, IncorrectObjectTypeException, CorruptObjectException, + IOException { if (path == null || within == null) { return null; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptFactory.java index 44b396621c..82c6150a64 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptFactory.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptFactory.java @@ -45,13 +45,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - -import org.eclipse.jgit.errors.RepositoryNotFoundException; -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.Repository; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; @@ -59,7 +52,11 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.concurrent.Callable; - +import org.eclipse.jgit.errors.RepositoryNotFoundException; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Repository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class PatchScriptFactory implements Callable { public interface Factory { @@ -78,8 +75,7 @@ public class PatchScriptFactory implements Callable { DiffPreferencesInfo diffPrefs); } - private static final Logger log = - LoggerFactory.getLogger(PatchScriptFactory.class); + private static final Logger log = LoggerFactory.getLogger(PatchScriptFactory.class); private final GitRepositoryManager repoManager; private final PatchSetUtil psUtil; @@ -89,8 +85,7 @@ public class PatchScriptFactory implements Callable { private final CommentsUtil commentsUtil; private final String fileName; - @Nullable - private final PatchSet.Id psa; + @Nullable private final PatchSet.Id psa; private final int parentNum; private final PatchSet.Id psb; private final DiffPreferencesInfo diffPrefs; @@ -110,7 +105,8 @@ public class PatchScriptFactory implements Callable { private CommentDetail comments; @AssistedInject - PatchScriptFactory(GitRepositoryManager grm, + PatchScriptFactory( + GitRepositoryManager grm, PatchSetUtil psUtil, Provider builderFactory, PatchListCache patchListCache, @@ -141,7 +137,8 @@ public class PatchScriptFactory implements Callable { } @AssistedInject - PatchScriptFactory(GitRepositoryManager grm, + PatchScriptFactory( + GitRepositoryManager grm, PatchSetUtil psUtil, Provider builderFactory, PatchListCache patchListCache, @@ -181,8 +178,9 @@ public class PatchScriptFactory implements Callable { } @Override - public PatchScript call() throws OrmException, LargeObjectException, - AuthException, InvalidChangeOperationException, IOException { + public PatchScript call() + throws OrmException, LargeObjectException, AuthException, InvalidChangeOperationException, + IOException { if (parentNum < 0) { validatePatchSetId(psa); } @@ -191,14 +189,12 @@ public class PatchScriptFactory implements Callable { change = control.getChange(); project = change.getProject(); - PatchSet psEntityA = psa != null - ? psUtil.get(db, control.getNotes(), psa) : null; - PatchSet psEntityB = psb.get() == 0 - ? new PatchSet(psb) - : psUtil.get(db, control.getNotes(), psb); + PatchSet psEntityA = psa != null ? psUtil.get(db, control.getNotes(), psa) : null; + PatchSet psEntityB = + psb.get() == 0 ? new PatchSet(psb) : psUtil.get(db, control.getNotes(), psb); - if ((psEntityA != null && !control.isPatchVisible(psEntityA, db)) || - (psEntityB != null && !control.isPatchVisible(psEntityB, db))) { + if ((psEntityA != null && !control.isPatchVisible(psEntityA, db)) + || (psEntityB != null && !control.isPatchVisible(psEntityB, db))) { throw new NoSuchChangeException(changeId); } @@ -213,7 +209,8 @@ public class PatchScriptFactory implements Callable { final PatchScriptBuilder b = newBuilder(list, git); final PatchListEntry content = list.get(fileName); - loadCommentsAndHistory(control.getNotes(), + loadCommentsAndHistory( + control.getNotes(), content.getChangeType(), content.getOldName(), content.getNewName()); @@ -243,8 +240,7 @@ public class PatchScriptFactory implements Callable { return PatchListKey.againstParentNum(parentNum + 1, bId, whitespace); } - private PatchList listFor(final PatchListKey key) - throws PatchListNotAvailableException { + private PatchList listFor(final PatchListKey key) throws PatchListNotAvailableException { return patchListCache.get(key, project); } @@ -257,8 +253,9 @@ public class PatchScriptFactory implements Callable { return b; } - private ObjectId toObjectId(PatchSet ps) throws NoSuchChangeException, - AuthException, NoSuchChangeException, IOException, OrmException { + private ObjectId toObjectId(PatchSet ps) + throws NoSuchChangeException, AuthException, NoSuchChangeException, IOException, + OrmException { if (ps.getId().get() == 0) { return getEditRev(); } @@ -274,8 +271,8 @@ public class PatchScriptFactory implements Callable { } } - private ObjectId getEditRev() throws AuthException, - NoSuchChangeException, IOException, OrmException { + private ObjectId getEditRev() + throws AuthException, NoSuchChangeException, IOException, OrmException { edit = editReader.byChange(change); if (edit.isPresent()) { return edit.get().getRef().getObjectId(); @@ -283,8 +280,7 @@ public class PatchScriptFactory implements Callable { throw new NoSuchChangeException(change.getId()); } - private void validatePatchSetId(final PatchSet.Id psId) - throws NoSuchChangeException { + private void validatePatchSetId(final PatchSet.Id psId) throws NoSuchChangeException { if (psId == null) { // OK, means use base; } else if (changeId.equals(psId.getParentKey())) { // OK, same change; } else { @@ -292,8 +288,9 @@ public class PatchScriptFactory implements Callable { } } - private void loadCommentsAndHistory(ChangeNotes notes, ChangeType changeType, - String oldName, String newName) throws OrmException { + private void loadCommentsAndHistory( + ChangeNotes notes, ChangeType changeType, String oldName, String newName) + throws OrmException { Map byKey = new HashMap<>(); if (loadHistory) { @@ -330,8 +327,7 @@ public class PatchScriptFactory implements Callable { byKey.put(p.getKey(), p); } if (edit != null && edit.isPresent()) { - Patch p = new Patch(new Patch.Key( - new PatchSet.Id(psb.getParentKey(), 0), fileName)); + Patch p = new Patch(new Patch.Key(new PatchSet.Id(psb.getParentKey(), 0), fileName)); history.add(p); byKey.put(p.getKey(), p); } @@ -389,8 +385,7 @@ public class PatchScriptFactory implements Callable { } } - private void loadPublished(Map byKey, String file) - throws OrmException { + private void loadPublished(Map byKey, String file) throws OrmException { ChangeNotes notes = control.getNotes(); for (Comment c : commentsUtil.publishedByChangeFile(db, notes, changeId, file)) { comments.include(change.getId(), c); @@ -403,10 +398,9 @@ public class PatchScriptFactory implements Callable { } } - private void loadDrafts(Map byKey, Account.Id me, - String file) throws OrmException { - for (Comment c : - commentsUtil.draftByChangeFileAuthor(db, control.getNotes(), file, me)) { + private void loadDrafts(Map byKey, Account.Id me, String file) + throws OrmException { + for (Comment c : commentsUtil.draftByChangeFileAuthor(db, control.getNotes(), file, me)) { comments.include(change.getId(), c); PatchSet.Id psId = new PatchSet.Id(change.getId(), c.key.patchSetId); Patch.Key pKey = new Patch.Key(psId, c.key.filename); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchSetInfoFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchSetInfoFactory.java index 85afafcc8a..3fc6ba675c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchSetInfoFactory.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchSetInfoFactory.java @@ -28,7 +28,11 @@ import com.google.gerrit.server.notedb.ChangeNotes; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Singleton; - +import java.io.IOException; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.PersonIdent; @@ -36,16 +40,7 @@ import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; -import java.io.IOException; -import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; - - -/** - * Factory class creating PatchSetInfo from meta-data found in Git repository. - */ +/** Factory class creating PatchSetInfo from meta-data found in Git repository. */ @Singleton public class PatchSetInfoFactory { private final GitRepositoryManager repoManager; @@ -54,16 +49,13 @@ public class PatchSetInfoFactory { @Inject public PatchSetInfoFactory( - GitRepositoryManager repoManager, - PatchSetUtil psUtil, - AccountByEmailCache byEmailCache) { + GitRepositoryManager repoManager, PatchSetUtil psUtil, AccountByEmailCache byEmailCache) { this.repoManager = repoManager; this.psUtil = psUtil; this.byEmailCache = byEmailCache; } - public PatchSetInfo get(RevWalk rw, RevCommit src, PatchSet.Id psi) - throws IOException { + public PatchSetInfo get(RevWalk rw, RevCommit src, PatchSet.Id psi) throws IOException { rw.parseBody(src); PatchSetInfo info = new PatchSetInfo(psi); info.setSubject(src.getShortMessage()); @@ -88,8 +80,7 @@ public class PatchSetInfoFactory { throws PatchSetInfoNotAvailableException { try (Repository repo = repoManager.openRepository(project); RevWalk rw = new RevWalk(repo)) { - final RevCommit src = - rw.parseCommit(ObjectId.fromString(patchSet.getRevision().get())); + final RevCommit src = rw.parseCommit(ObjectId.fromString(patchSet.getRevision().get())); PatchSetInfo info = get(rw, src, patchSet.getId()); info.setParents(toParentInfos(src.getParents(), rw)); return info; @@ -117,8 +108,8 @@ public class PatchSetInfoFactory { return u; } - private List toParentInfos(final RevCommit[] parents, - final RevWalk walk) throws IOException, MissingObjectException { + private List toParentInfos(final RevCommit[] parents, final RevWalk walk) + throws IOException, MissingObjectException { List pInfos = new ArrayList<>(parents.length); for (RevCommit parent : parents) { walk.parseBody(parent); @@ -128,5 +119,4 @@ public class PatchSetInfoFactory { } return pInfos; } - } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchSetInfoNotAvailableException.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchSetInfoNotAvailableException.java index 9763d3cc37..0a91b32f2d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchSetInfoNotAvailableException.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchSetInfoNotAvailableException.java @@ -20,5 +20,4 @@ public final class PatchSetInfoNotAvailableException extends Exception { public PatchSetInfoNotAvailableException(Exception cause) { super(cause); } - } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/Text.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/Text.java index a84dd9237b..f0015916b5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/Text.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/Text.java @@ -17,6 +17,11 @@ package com.google.gerrit.server.patch; import static java.nio.charset.StandardCharsets.ISO_8859_1; import static java.nio.charset.StandardCharsets.UTF_8; +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.charset.IllegalCharsetNameException; +import java.nio.charset.UnsupportedCharsetException; +import java.text.SimpleDateFormat; import org.eclipse.jgit.diff.RawText; import org.eclipse.jgit.errors.LargeObjectException; import org.eclipse.jgit.errors.MissingObjectException; @@ -32,12 +37,6 @@ import org.mozilla.universalchardet.UniversalDetector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.nio.charset.Charset; -import java.nio.charset.IllegalCharsetNameException; -import java.nio.charset.UnsupportedCharsetException; -import java.text.SimpleDateFormat; - public class Text extends RawText { private static final Logger log = LoggerFactory.getLogger(Text.class); private static final int bigFileThreshold = PackConfig.DEFAULT_BIG_FILE_THRESHOLD; @@ -58,16 +57,17 @@ public class Text extends RawText { switch (c.getParentCount()) { case 0: break; - case 1: { - RevCommit p = c.getParent(0); - rw.parseBody(p); - b.append("Parent: "); - b.append(reader.abbreviate(p, 8).name()); - b.append(" ("); - b.append(p.getShortMessage()); - b.append(")\n"); - break; - } + case 1: + { + RevCommit p = c.getParent(0); + rw.parseBody(p); + b.append("Parent: "); + b.append(reader.abbreviate(p, 8).name()); + b.append(" ("); + b.append(p.getShortMessage()); + b.append(")\n"); + break; + } default: for (int i = 0; i < c.getParentCount(); i++) { RevCommit p = c.getParent(i); @@ -87,25 +87,24 @@ public class Text extends RawText { } } - public static Text forMergeList(ComparisonType comparisonType, - ObjectReader reader, AnyObjectId commitId) throws IOException { + public static Text forMergeList( + ComparisonType comparisonType, ObjectReader reader, AnyObjectId commitId) throws IOException { try (RevWalk rw = new RevWalk(reader)) { RevCommit c = rw.parseCommit(commitId); StringBuilder b = new StringBuilder(); switch (c.getParentCount()) { case 0: break; - case 1: { - break; - } + case 1: + { + break; + } default: - int uniterestingParent = comparisonType.isAgainstParent() - ? comparisonType.getParentNum() - : 1; + int uniterestingParent = + comparisonType.isAgainstParent() ? comparisonType.getParentNum() : 1; b.append("Merge List:\n\n"); - for (RevCommit commit : MergeListBuilder.build(rw, c, - uniterestingParent)) { + for (RevCommit commit : MergeListBuilder.build(rw, c, uniterestingParent)) { b.append("* "); b.append(reader.abbreviate(commit, 8).name()); b.append(" "); @@ -117,8 +116,7 @@ public class Text extends RawText { } } - private static void appendPersonIdent(StringBuilder b, String field, - PersonIdent person) { + private static void appendPersonIdent(StringBuilder b, String field, PersonIdent person) { if (person != null) { b.append(field).append(": "); if (person.getName() != null) { @@ -174,8 +172,7 @@ public class Text extends RawText { super(r); } - public Text(ObjectLoader ldr) throws MissingObjectException, - LargeObjectException, IOException { + public Text(ObjectLoader ldr) throws MissingObjectException, LargeObjectException, IOException { this(asByteArray(ldr)); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/AbstractPreloadedPluginScanner.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/AbstractPreloadedPluginScanner.java index ee8f963cf0..a578eccd4b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/AbstractPreloadedPluginScanner.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/AbstractPreloadedPluginScanner.java @@ -20,7 +20,6 @@ import com.google.common.collect.ImmutableMap; import com.google.gerrit.extensions.annotations.Export; import com.google.gerrit.server.plugins.Plugin.ApiType; import com.google.inject.Module; - import java.io.ByteArrayInputStream; import java.io.IOException; import java.lang.annotation.Annotation; @@ -33,18 +32,16 @@ import java.util.jar.Manifest; /** * Base plugin scanner for a set of pre-loaded classes. * - * Utility base class for simplifying the development of Server plugin scanner - * based on a set of externally pre-loaded classes. + *

Utility base class for simplifying the development of Server plugin scanner based on a set of + * externally pre-loaded classes. * - * Extending this class you can implement very easily a PluginContentScanner - * from a set of pre-loaded Java Classes and an API Type. - * The convention used by this class is: - * - there is at most one Guice module per Gerrit module type (SysModule, HttpModule, SshModule) - * - plugin is set to be restartable in Gerrit Plugin MANIFEST - * - only Export and Listen annotated classes can be self-discovered + *

Extending this class you can implement very easily a PluginContentScanner from a set of + * pre-loaded Java Classes and an API Type. The convention used by this class is: - there is at most + * one Guice module per Gerrit module type (SysModule, HttpModule, SshModule) - plugin is set to be + * restartable in Gerrit Plugin MANIFEST - only Export and Listen annotated classes can be + * self-discovered */ -public abstract class AbstractPreloadedPluginScanner implements - PluginContentScanner { +public abstract class AbstractPreloadedPluginScanner implements PluginContentScanner { protected final String pluginName; protected final String pluginVersion; protected final Set> preloadedClasses; @@ -54,8 +51,11 @@ public abstract class AbstractPreloadedPluginScanner implements private Class httpModuleClass; private Class sysModuleClass; - public AbstractPreloadedPluginScanner(String pluginName, String pluginVersion, - Set> preloadedClasses, Plugin.ApiType apiType) { + public AbstractPreloadedPluginScanner( + String pluginName, + String pluginVersion, + Set> preloadedClasses, + Plugin.ApiType apiType) { this.pluginName = pluginName; this.pluginVersion = pluginVersion; this.preloadedClasses = preloadedClasses; @@ -66,15 +66,21 @@ public abstract class AbstractPreloadedPluginScanner implements public Manifest getManifest() throws IOException { scanGuiceModules(preloadedClasses); StringBuilder manifestString = - new StringBuilder("PluginName: " + pluginName + "\n" - + "Implementation-Version: " + pluginVersion + "\n" - + "Gerrit-ReloadMode: restart\n" - + "Gerrit-ApiType: " + apiType + "\n"); + new StringBuilder( + "PluginName: " + + pluginName + + "\n" + + "Implementation-Version: " + + pluginVersion + + "\n" + + "Gerrit-ReloadMode: restart\n" + + "Gerrit-ApiType: " + + apiType + + "\n"); appendIfNotNull(manifestString, "Gerrit-SshModule: ", sshModuleClass); appendIfNotNull(manifestString, "Gerrit-HttpModule: ", httpModuleClass); appendIfNotNull(manifestString, "Gerrit-Module: ", sysModuleClass); - return new Manifest(new ByteArrayInputStream(manifestString.toString() - .getBytes())); + return new Manifest(new ByteArrayInputStream(manifestString.toString().getBytes())); } @Override @@ -89,18 +95,16 @@ public abstract class AbstractPreloadedPluginScanner implements result.put(annotation, classMetaDataSet); for (Class clazz : preloadedClasses) { - if (!Modifier.isAbstract(clazz.getModifiers()) - && clazz.getAnnotation(annotation) != null) { - classMetaDataSet.add(new ExtensionMetaData(clazz.getName(), - getExportAnnotationValue(clazz, annotation))); + if (!Modifier.isAbstract(clazz.getModifiers()) && clazz.getAnnotation(annotation) != null) { + classMetaDataSet.add( + new ExtensionMetaData(clazz.getName(), getExportAnnotationValue(clazz, annotation))); } } } return result.build(); } - private void appendIfNotNull(StringBuilder string, String header, - Class guiceModuleClass) { + private void appendIfNotNull(StringBuilder string, String header, Class guiceModuleClass) { if (guiceModuleClass != null) { string.append(header); string.append(guiceModuleClass.getName()); @@ -111,10 +115,8 @@ public abstract class AbstractPreloadedPluginScanner implements private void scanGuiceModules(Set> classes) throws IOException { try { Class sysModuleBaseClass = Module.class; - Class httpModuleBaseClass = - Class.forName("com.google.inject.servlet.ServletModule"); - Class sshModuleBaseClass = - Class.forName("com.google.gerrit.sshd.CommandModule"); + Class httpModuleBaseClass = Class.forName("com.google.inject.servlet.ServletModule"); + Class sshModuleBaseClass = Class.forName("com.google.gerrit.sshd.CommandModule"); sshModuleClass = null; httpModuleClass = null; sysModuleClass = null; @@ -125,33 +127,33 @@ public abstract class AbstractPreloadedPluginScanner implements } if (sshModuleBaseClass.isAssignableFrom(clazz)) { - sshModuleClass = - getUniqueGuiceModule(sshModuleBaseClass, sshModuleClass, clazz); + sshModuleClass = getUniqueGuiceModule(sshModuleBaseClass, sshModuleClass, clazz); } else if (httpModuleBaseClass.isAssignableFrom(clazz)) { - httpModuleClass = - getUniqueGuiceModule(httpModuleBaseClass, httpModuleClass, clazz); + httpModuleClass = getUniqueGuiceModule(httpModuleBaseClass, httpModuleClass, clazz); } else if (sysModuleBaseClass.isAssignableFrom(clazz)) { - sysModuleClass = - getUniqueGuiceModule(sysModuleBaseClass, sysModuleClass, clazz); + sysModuleClass = getUniqueGuiceModule(sysModuleBaseClass, sysModuleClass, clazz); } } } catch (ClassNotFoundException e) { - throw new IOException( - "Cannot find base Gerrit classes for Guice Plugin Modules", e); + throw new IOException("Cannot find base Gerrit classes for Guice Plugin Modules", e); } } - private Class getUniqueGuiceModule(Class guiceModuleBaseClass, - Class existingGuiceModuleName, Class newGuiceModuleClass) { - checkState(existingGuiceModuleName == null, - "Multiple %s implementations: %s, %s", guiceModuleBaseClass, - existingGuiceModuleName, newGuiceModuleClass); + private Class getUniqueGuiceModule( + Class guiceModuleBaseClass, + Class existingGuiceModuleName, + Class newGuiceModuleClass) { + checkState( + existingGuiceModuleName == null, + "Multiple %s implementations: %s, %s", + guiceModuleBaseClass, + existingGuiceModuleName, + newGuiceModuleClass); return newGuiceModuleClass; } - private String getExportAnnotationValue(Class scriptClass, - Class annotation) { - return annotation == Export.class ? scriptClass.getAnnotation(Export.class) - .value() : ""; + private String getExportAnnotationValue( + Class scriptClass, Class annotation) { + return annotation == Export.class ? scriptClass.getAnnotation(Export.class).value() : ""; } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/AutoRegisterModules.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/AutoRegisterModules.java index 5d7e1390a8..304d202461 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/AutoRegisterModules.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/AutoRegisterModules.java @@ -31,10 +31,6 @@ import com.google.inject.AbstractModule; import com.google.inject.Module; import com.google.inject.Scopes; import com.google.inject.TypeLiteral; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.lang.annotation.Annotation; import java.lang.reflect.ParameterizedType; @@ -42,6 +38,8 @@ import java.util.Arrays; import java.util.HashSet; import java.util.Map; import java.util.Set; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; class AutoRegisterModules { private static final Logger log = LoggerFactory.getLogger(AutoRegisterModules.class); @@ -61,7 +59,8 @@ class AutoRegisterModules { Module sshModule; Module httpModule; - AutoRegisterModules(String pluginName, + AutoRegisterModules( + String pluginName, PluginGuiceEnvironment env, PluginContentScanner scanner, ClassLoader classLoader) { @@ -69,12 +68,8 @@ class AutoRegisterModules { this.env = env; this.scanner = scanner; this.classLoader = classLoader; - this.sshGen = env.hasSshModule() - ? env.newSshModuleGenerator() - : new ModuleGenerator.NOP(); - this.httpGen = env.hasHttpModule() - ? env.newHttpModuleGenerator() - : new ModuleGenerator.NOP(); + this.sshGen = env.hasSshModule() ? env.newSshModuleGenerator() : new ModuleGenerator.NOP(); + this.httpGen = env.hasHttpModule() ? env.newHttpModuleGenerator() : new ModuleGenerator.NOP(); } AutoRegisterModules discover() throws InvalidPluginException { @@ -113,8 +108,7 @@ class AutoRegisterModules { bind(type).annotatedWith(n).to(impl); } if (initJs != null) { - DynamicSet.bind(binder(), WebUiPlugin.class) - .toInstance(new JavaScriptPlugin(initJs)); + DynamicSet.bind(binder(), WebUiPlugin.class).toInstance(new JavaScriptPlugin(initJs)); } } }; @@ -140,9 +134,12 @@ class AutoRegisterModules { initJs = STATIC_INIT_JS; } } catch (IOException e) { - log.warn(String.format("Cannot access %s from plugin %s: " - + "JavaScript auto-discovered plugin will not be registered", - STATIC_INIT_JS, pluginName), e); + log.warn( + String.format( + "Cannot access %s from plugin %s: " + + "JavaScript auto-discovered plugin will not be registered", + STATIC_INIT_JS, pluginName), + e); } } @@ -151,16 +148,17 @@ class AutoRegisterModules { try { clazz = Class.forName(def.className, false, classLoader); } catch (ClassNotFoundException err) { - throw new InvalidPluginException(String.format( - "Cannot load %s with @Export(\"%s\")", - def.className, def.annotationValue), err); + throw new InvalidPluginException( + String.format("Cannot load %s with @Export(\"%s\")", def.className, def.annotationValue), + err); } Export export = clazz.getAnnotation(Export.class); if (export == null) { - PluginLoader.log.warn(String.format( - "In plugin %s asm incorrectly parsed %s with @Export(\"%s\")", - pluginName, clazz.getName(), def.annotationValue)); + PluginLoader.log.warn( + String.format( + "In plugin %s asm incorrectly parsed %s with @Export(\"%s\")", + pluginName, clazz.getName(), def.annotationValue)); return; } @@ -174,9 +172,9 @@ class AutoRegisterModules { listen(clazz, clazz); if (cnt == sysListen.size()) { // If no bindings were recorded, the extension isn't recognized. - throw new InvalidPluginException(String.format( - "Class %s with @Export(\"%s\") not supported", - clazz.getName(), export.value())); + throw new InvalidPluginException( + String.format( + "Class %s with @Export(\"%s\") not supported", clazz.getName(), export.value())); } } } @@ -186,23 +184,21 @@ class AutoRegisterModules { try { clazz = Class.forName(def.className, false, classLoader); } catch (ClassNotFoundException err) { - throw new InvalidPluginException(String.format( - "Cannot load %s with @Listen", - def.className), err); + throw new InvalidPluginException( + String.format("Cannot load %s with @Listen", def.className), err); } Listen listen = clazz.getAnnotation(Listen.class); if (listen != null) { listen(clazz, clazz); } else { - PluginLoader.log.warn(String.format( - "In plugin %s asm incorrectly parsed %s with @Listen", - pluginName, clazz.getName())); + PluginLoader.log.warn( + String.format( + "In plugin %s asm incorrectly parsed %s with @Listen", pluginName, clazz.getName())); } } - private void listen(java.lang.reflect.Type type, Class clazz) - throws InvalidPluginException { + private void listen(java.lang.reflect.Type type, Class clazz) throws InvalidPluginException { while (type != null) { Class rawType; if (type instanceof ParameterizedType) { @@ -227,18 +223,20 @@ class AutoRegisterModules { sshGen.listen(tl, clazz); } else if (env.hasDynamicMap(tl)) { if (clazz.getAnnotation(Export.class) == null) { - throw new InvalidPluginException(String.format( - "Class %s requires @Export(\"name\") annotation for %s", - clazz.getName(), rawType.getName())); + throw new InvalidPluginException( + String.format( + "Class %s requires @Export(\"name\") annotation for %s", + clazz.getName(), rawType.getName())); } sysSingletons.add(clazz); sysListen.put(tl, clazz); httpGen.listen(tl, clazz); sshGen.listen(tl, clazz); } else { - throw new InvalidPluginException(String.format( - "Cannot register %s, server does not accept %s", - clazz.getName(), rawType.getName())); + throw new InvalidPluginException( + String.format( + "Cannot register %s, server does not accept %s", + clazz.getName(), rawType.getName())); } return; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/AutoRegisterUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/AutoRegisterUtil.java index 3256d7f787..d592d170da 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/AutoRegisterUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/AutoRegisterUtil.java @@ -16,7 +16,6 @@ package com.google.gerrit.server.plugins; import com.google.gerrit.extensions.annotations.Export; import com.google.inject.internal.UniqueAnnotations; - import java.lang.annotation.Annotation; public final class AutoRegisterUtil { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/CleanupHandle.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/CleanupHandle.java index 98278124e4..3329ab3eb5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/CleanupHandle.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/CleanupHandle.java @@ -38,8 +38,11 @@ class CleanupHandle { Files.deleteIfExists(tmp); PluginLoader.log.info("Cleaned plugin " + tmp.getFileName()); } catch (IOException e) { - PluginLoader.log.warn("Cannot delete " + tmp.toAbsolutePath() - + ", retrying to delete it on termination of the virtual machine", e); + PluginLoader.log.warn( + "Cannot delete " + + tmp.toAbsolutePath() + + ", retrying to delete it on termination of the virtual machine", + e); tmp.toFile().deleteOnExit(); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/CopyConfigModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/CopyConfigModule.java index 1d4233a345..9f937e6807 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/CopyConfigModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/CopyConfigModule.java @@ -29,25 +29,21 @@ import com.google.inject.AbstractModule; import com.google.inject.Inject; import com.google.inject.Provides; import com.google.inject.Singleton; - +import java.nio.file.Path; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.PersonIdent; -import java.nio.file.Path; - /** * Copies critical objects from the {@code dbInjector} into a plugin. - *

- * Most explicit bindings are copied automatically from the cfgInjector and - * sysInjector to be made available to a plugin's private world. This module is - * necessary to get things bound in the dbInjector that are not otherwise easily - * available, but that a plugin author might expect to exist. + * + *

Most explicit bindings are copied automatically from the cfgInjector and sysInjector to be + * made available to a plugin's private world. This module is necessary to get things bound in the + * dbInjector that are not otherwise easily available, but that a plugin author might expect to + * exist. */ @Singleton class CopyConfigModule extends AbstractModule { - @Inject - @SitePath - private Path sitePath; + @Inject @SitePath private Path sitePath; @Provides @SitePath @@ -55,25 +51,21 @@ class CopyConfigModule extends AbstractModule { return sitePath; } - @Inject - private SitePaths sitePaths; + @Inject private SitePaths sitePaths; @Provides SitePaths getSitePaths() { return sitePaths; } - @Inject - private TrackingFooters trackingFooters; + @Inject private TrackingFooters trackingFooters; @Provides TrackingFooters getTrackingFooters() { return trackingFooters; } - @Inject - @GerritServerConfig - private Config gerritServerConfig; + @Inject @GerritServerConfig private Config gerritServerConfig; @Provides @GerritServerConfig @@ -81,25 +73,21 @@ class CopyConfigModule extends AbstractModule { return gerritServerConfig; } - @Inject - private SchemaFactory schemaFactory; + @Inject private SchemaFactory schemaFactory; @Provides SchemaFactory getSchemaFactory() { return schemaFactory; } - @Inject - private GitRepositoryManager gitRepositoryManager; + @Inject private GitRepositoryManager gitRepositoryManager; @Provides GitRepositoryManager getGitRepositoryManager() { return gitRepositoryManager; } - @Inject - @AnonymousCowardName - private String anonymousCowardName; + @Inject @AnonymousCowardName private String anonymousCowardName; @Provides @AnonymousCowardName @@ -107,8 +95,7 @@ class CopyConfigModule extends AbstractModule { return anonymousCowardName; } - @Inject - private GerritPersonIdentProvider serverIdentProvider; + @Inject private GerritPersonIdentProvider serverIdentProvider; @Provides @GerritPersonIdent @@ -116,8 +103,7 @@ class CopyConfigModule extends AbstractModule { return serverIdentProvider.get(); } - @Inject - private SecureStore secureStore; + @Inject private SecureStore secureStore; @Provides SecureStore getSecureStore() { @@ -125,10 +111,8 @@ class CopyConfigModule extends AbstractModule { } @Inject - CopyConfigModule() { - } + CopyConfigModule() {} @Override - protected void configure() { - } + protected void configure() {} } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/DisablePlugin.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/DisablePlugin.java index d92dce0a16..b63c6c0190 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/DisablePlugin.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/DisablePlugin.java @@ -27,8 +27,7 @@ import com.google.inject.Singleton; @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER) @Singleton class DisablePlugin implements RestModifyView { - static class Input { - } + static class Input {} private final PluginLoader loader; @@ -38,11 +37,9 @@ class DisablePlugin implements RestModifyView { } @Override - public PluginInfo apply(PluginResource resource, Input input) - throws MethodNotAllowedException { + public PluginInfo apply(PluginResource resource, Input input) throws MethodNotAllowedException { if (!loader.isRemoteAdminEnabled()) { - throw new MethodNotAllowedException( - "remote plugin administration is disabled"); + throw new MethodNotAllowedException("remote plugin administration is disabled"); } String name = resource.getName(); loader.disablePlugins(ImmutableSet.of(name)); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/EnablePlugin.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/EnablePlugin.java index b6f8260e20..c3e52cb92f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/EnablePlugin.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/EnablePlugin.java @@ -24,15 +24,13 @@ import com.google.gerrit.server.plugins.EnablePlugin.Input; import com.google.gerrit.server.plugins.ListPlugins.PluginInfo; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.io.PrintWriter; import java.io.StringWriter; @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER) @Singleton class EnablePlugin implements RestModifyView { - static class Input { - } + static class Input {} private final PluginLoader loader; @@ -45,8 +43,7 @@ class EnablePlugin implements RestModifyView { public PluginInfo apply(PluginResource resource, Input input) throws ResourceConflictException, MethodNotAllowedException { if (!loader.isRemoteAdminEnabled()) { - throw new MethodNotAllowedException( - "remote plugin administration is disabled"); + throw new MethodNotAllowedException("remote plugin administration is disabled"); } String name = resource.getName(); try { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/InstallPlugin.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/InstallPlugin.java index 2f780bf476..38820082b3 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/InstallPlugin.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/InstallPlugin.java @@ -26,7 +26,6 @@ import com.google.gerrit.extensions.restapi.TopLevelResource; import com.google.gerrit.server.plugins.InstallPlugin.Input; import com.google.gerrit.server.plugins.ListPlugins.PluginInfo; import com.google.inject.Inject; - import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; @@ -37,8 +36,7 @@ import java.util.zip.ZipException; @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER) class InstallPlugin implements RestModifyView { static class Input { - @DefaultInput - String url; + @DefaultInput String url; RawInput raw; } @@ -61,11 +59,8 @@ class InstallPlugin implements RestModifyView { try { try (InputStream in = openStream(input)) { String pluginName = loader.installPluginFromStream(name, in); - ListPlugins.PluginInfo info = - new ListPlugins.PluginInfo(loader.get(pluginName)); - return created - ? Response.created(info) - : Response.ok(info); + ListPlugins.PluginInfo info = new ListPlugins.PluginInfo(loader.get(pluginName)); + return created ? Response.created(info) : Response.ok(info); } } catch (PluginInstallException e) { StringWriter buf = new StringWriter(); @@ -83,8 +78,7 @@ class InstallPlugin implements RestModifyView { } } - private InputStream openStream(Input input) - throws IOException, BadRequestException { + private InputStream openStream(Input input) throws IOException, BadRequestException { if (input.raw != null) { return input.raw.getInputStream(); } @@ -108,7 +102,7 @@ class InstallPlugin implements RestModifyView { public Response apply(PluginResource resource, Input input) throws BadRequestException, MethodNotAllowedException, IOException { return new InstallPlugin(loader, resource.getName(), false) - .apply(TopLevelResource.INSTANCE, input); + .apply(TopLevelResource.INSTANCE, input); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarPluginProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarPluginProvider.java index fa913b28ac..06a1a683ae 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarPluginProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarPluginProvider.java @@ -21,11 +21,6 @@ import com.google.gerrit.server.config.PluginConfig; import com.google.gerrit.server.config.PluginConfigFactory; import com.google.gerrit.server.config.SitePaths; import com.google.inject.Inject; - -import org.eclipse.jgit.internal.storage.file.FileSnapshot; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; @@ -40,6 +35,9 @@ import java.util.Date; import java.util.List; import java.util.jar.JarFile; import java.util.jar.Manifest; +import org.eclipse.jgit.internal.storage.file.FileSnapshot; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class JarPluginProvider implements ServerPluginProvider { static final String PLUGIN_TMP_PREFIX = "plugin_"; @@ -50,8 +48,7 @@ public class JarPluginProvider implements ServerPluginProvider { private final PluginConfigFactory configFactory; @Inject - JarPluginProvider(SitePaths sitePaths, - PluginConfigFactory configFactory) { + JarPluginProvider(SitePaths sitePaths, PluginConfigFactory configFactory) { this.tmpDir = sitePaths.tmp_dir; this.configFactory = configFactory; } @@ -59,31 +56,28 @@ public class JarPluginProvider implements ServerPluginProvider { @Override public boolean handles(Path srcPath) { String fileName = srcPath.getFileName().toString(); - return fileName.endsWith(JAR_EXTENSION) - || fileName.endsWith(JAR_EXTENSION + ".disabled"); + return fileName.endsWith(JAR_EXTENSION) || fileName.endsWith(JAR_EXTENSION + ".disabled"); } @Override public String getPluginName(Path srcPath) { try { - return MoreObjects.firstNonNull(getJarPluginName(srcPath), - PluginLoader.nameOf(srcPath)); + return MoreObjects.firstNonNull(getJarPluginName(srcPath), PluginLoader.nameOf(srcPath)); } catch (IOException e) { - throw new IllegalArgumentException("Invalid plugin file " + srcPath - + ": cannot get plugin name", e); + throw new IllegalArgumentException( + "Invalid plugin file " + srcPath + ": cannot get plugin name", e); } } public static String getJarPluginName(Path srcPath) throws IOException { try (JarFile jarFile = new JarFile(srcPath.toFile())) { - return jarFile.getManifest().getMainAttributes() - .getValue("Gerrit-PluginName"); + return jarFile.getManifest().getMainAttributes().getValue("Gerrit-PluginName"); } } @Override - public ServerPlugin get(Path srcPath, FileSnapshot snapshot, - PluginDescription description) throws InvalidPluginException { + public ServerPlugin get(Path srcPath, FileSnapshot snapshot, PluginDescription description) + throws InvalidPluginException { try { String name = getPluginName(srcPath); String extension = getExtension(srcPath); @@ -115,16 +109,16 @@ public class JarPluginProvider implements ServerPluginProvider { return PLUGIN_TMP_PREFIX + name + "_" + fmt.format(new Date()) + "_"; } - public static Path storeInTemp(String pluginName, InputStream in, - SitePaths sitePaths) throws IOException { + public static Path storeInTemp(String pluginName, InputStream in, SitePaths sitePaths) + throws IOException { if (!Files.exists(sitePaths.tmp_dir)) { Files.createDirectories(sitePaths.tmp_dir); } return asTemp(in, tempNameFor(pluginName), ".jar", sitePaths.tmp_dir); } - private ServerPlugin loadJarPlugin(String name, Path srcJar, - FileSnapshot snapshot, Path tmp, PluginDescription description) + private ServerPlugin loadJarPlugin( + String name, Path srcJar, FileSnapshot snapshot, Path tmp, PluginDescription description) throws IOException, InvalidPluginException, MalformedURLException { JarFile jarFile = new JarFile(tmp.toFile()); boolean keep = false; @@ -144,16 +138,22 @@ public class JarPluginProvider implements ServerPluginProvider { urls.add(tmp.toUri().toURL()); ClassLoader pluginLoader = - new URLClassLoader(urls.toArray(new URL[urls.size()]), - PluginLoader.parentFor(type)); + new URLClassLoader(urls.toArray(new URL[urls.size()]), PluginLoader.parentFor(type)); JarScanner jarScanner = createJarScanner(tmp); PluginConfig pluginConfig = configFactory.getFromGerritConfig(name); - ServerPlugin plugin = new ServerPlugin(name, description.canonicalUrl, - description.user, srcJar, snapshot, jarScanner, - description.dataDir, pluginLoader, - pluginConfig.getString("metricsPrefix", null)); + ServerPlugin plugin = + new ServerPlugin( + name, + description.canonicalUrl, + description.user, + srcJar, + snapshot, + jarScanner, + description.dataDir, + pluginLoader, + pluginConfig.getString("metricsPrefix", null)); plugin.setCleanupHandle(new CleanupHandle(tmp, jarFile)); keep = true; return plugin; @@ -164,8 +164,7 @@ public class JarPluginProvider implements ServerPluginProvider { } } - private JarScanner createJarScanner(Path srcJar) - throws InvalidPluginException { + private JarScanner createJarScanner(Path srcJar) throws InvalidPluginException { try { return new JarScanner(srcJar); } catch (IOException e) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarScanner.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarScanner.java index 81e74339f0..8d8a13900b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarScanner.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarScanner.java @@ -23,17 +23,6 @@ import com.google.common.collect.ListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.MultimapBuilder; - -import org.eclipse.jgit.util.IO; -import org.objectweb.asm.AnnotationVisitor; -import org.objectweb.asm.Attribute; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.FieldVisitor; -import org.objectweb.asm.MethodVisitor; -import org.objectweb.asm.Opcodes; -import org.objectweb.asm.Type; - import java.io.IOException; import java.io.InputStream; import java.lang.annotation.Annotation; @@ -52,10 +41,19 @@ import java.util.jar.Attributes; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.jar.Manifest; +import org.eclipse.jgit.util.IO; +import org.objectweb.asm.AnnotationVisitor; +import org.objectweb.asm.Attribute; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.FieldVisitor; +import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.Type; public class JarScanner implements PluginContentScanner, AutoCloseable { - private static final int SKIP_ALL = ClassReader.SKIP_CODE - | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES; + private static final int SKIP_ALL = + ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES; private final JarFile jarFile; public JarScanner(Path src) throws IOException { @@ -69,8 +67,7 @@ public class JarScanner implements PluginContentScanner, AutoCloseable { Set descriptors = new HashSet<>(); ListMultimap rawMap = MultimapBuilder.hashKeys().arrayListValues().build(); - Map, String> classObjToClassDescr = - new HashMap<>(); + Map, String> classObjToClassDescr = new HashMap<>(); for (Class annotation : annotations) { String descriptor = Type.getType(annotation).getDescriptor(); @@ -91,19 +88,22 @@ public class JarScanner implements PluginContentScanner, AutoCloseable { } catch (IOException err) { throw new InvalidPluginException("Cannot auto-register", err); } catch (RuntimeException err) { - PluginLoader.log.warn(String.format( - "Plugin %s has invalid class file %s inside of %s", pluginName, - entry.getName(), jarFile.getName()), err); + PluginLoader.log.warn( + String.format( + "Plugin %s has invalid class file %s inside of %s", + pluginName, entry.getName(), jarFile.getName()), + err); continue; } if (!Strings.isNullOrEmpty(def.annotationName)) { if (def.isConcrete()) { - rawMap.put(def.annotationName, def); + rawMap.put(def.annotationName, def); } else { - PluginLoader.log.warn(String.format( - "Plugin %s tries to @%s(\"%s\") abstract class %s", pluginName, - def.annotationName, def.annotationValue, def.className)); + PluginLoader.log.warn( + String.format( + "Plugin %s tries to @%s(\"%s\") abstract class %s", + pluginName, def.annotationName, def.annotationValue, def.className)); } } } @@ -114,14 +114,11 @@ public class JarScanner implements PluginContentScanner, AutoCloseable { for (Class annotoation : annotations) { String descr = classObjToClassDescr.get(annotoation); Collection discoverdData = rawMap.get(descr); - Collection values = - firstNonNull(discoverdData, Collections. emptySet()); + Collection values = firstNonNull(discoverdData, Collections.emptySet()); result.put( annotoation, - transform( - values, - cd -> new ExtensionMetaData(cd.className, cd.annotationValue))); + transform(values, cd -> new ExtensionMetaData(cd.className, cd.annotationValue))); } return result.build(); @@ -151,8 +148,9 @@ public class JarScanner implements PluginContentScanner, AutoCloseable { try { new ClassReader(read(jarFile, entry)).accept(def, SKIP_ALL); } catch (RuntimeException err) { - PluginLoader.log.warn(String.format("Jar %s has invalid class file %s", - jarFile.getName(), entry.getName()), err); + PluginLoader.log.warn( + String.format("Jar %s has invalid class file %s", jarFile.getName(), entry.getName()), + err); continue; } @@ -180,8 +178,7 @@ public class JarScanner implements PluginContentScanner, AutoCloseable { return false; } - private static byte[] read(JarFile jarFile, JarEntry entry) - throws IOException { + private static byte[] read(JarFile jarFile, JarEntry entry) throws IOException { byte[] data = new byte[(int) entry.getSize()]; try (InputStream in = jarFile.getInputStream(entry)) { IO.readFully(in, data, 0, data.length); @@ -204,13 +201,17 @@ public class JarScanner implements PluginContentScanner, AutoCloseable { } boolean isConcrete() { - return (access & Opcodes.ACC_ABSTRACT) == 0 - && (access & Opcodes.ACC_INTERFACE) == 0; + return (access & Opcodes.ACC_ABSTRACT) == 0 && (access & Opcodes.ACC_INTERFACE) == 0; } @Override - public void visit(int version, int access, String name, String signature, - String superName, String[] interfaces) { + public void visit( + int version, + int access, + String name, + String signature, + String superName, + String[] interfaces) { this.className = Type.getObjectType(name).getClassName(); this.access = access; this.superName = superName; @@ -221,8 +222,7 @@ public class JarScanner implements PluginContentScanner, AutoCloseable { if (!visible) { return null; } - Optional found = - exports.stream().filter(x -> x.equals(desc)).findAny(); + Optional found = exports.stream().filter(x -> x.equals(desc)).findAny(); if (found.isPresent()) { annotationName = desc; return new AbstractAnnotationVisitor() { @@ -236,40 +236,33 @@ public class JarScanner implements PluginContentScanner, AutoCloseable { } @Override - public void visitSource(String arg0, String arg1) { - } + public void visitSource(String arg0, String arg1) {} @Override - public void visitOuterClass(String arg0, String arg1, String arg2) { - } + public void visitOuterClass(String arg0, String arg1, String arg2) {} @Override - public MethodVisitor visitMethod(int arg0, String arg1, String arg2, - String arg3, String[] arg4) { + public MethodVisitor visitMethod( + int arg0, String arg1, String arg2, String arg3, String[] arg4) { return null; } @Override - public void visitInnerClass(String arg0, String arg1, String arg2, int arg3) { - } + public void visitInnerClass(String arg0, String arg1, String arg2, int arg3) {} @Override - public FieldVisitor visitField(int arg0, String arg1, String arg2, - String arg3, Object arg4) { + public FieldVisitor visitField(int arg0, String arg1, String arg2, String arg3, Object arg4) { return null; } @Override - public void visitEnd() { - } + public void visitEnd() {} @Override - public void visitAttribute(Attribute arg0) { - } + public void visitAttribute(Attribute arg0) {} } - private abstract static class AbstractAnnotationVisitor extends - AnnotationVisitor { + private abstract static class AbstractAnnotationVisitor extends AnnotationVisitor { AbstractAnnotationVisitor() { super(Opcodes.ASM5); } @@ -285,17 +278,14 @@ public class JarScanner implements PluginContentScanner, AutoCloseable { } @Override - public void visitEnum(String arg0, String arg1, String arg2) { - } + public void visitEnum(String arg0, String arg1, String arg2) {} @Override - public void visitEnd() { - } + public void visitEnd() {} } @Override - public Optional getEntry(String resourcePath) - throws IOException { + public Optional getEntry(String resourcePath) throws IOException { JarEntry jarEntry = jarFile.getJarEntry(resourcePath); if (jarEntry == null || jarEntry.getSize() == 0) { return Optional.empty(); @@ -306,23 +296,22 @@ public class JarScanner implements PluginContentScanner, AutoCloseable { @Override public Enumeration entries() { - return Collections.enumeration(Lists.transform( - Collections.list(jarFile.entries()), - jarEntry -> { - try { - return resourceOf(jarEntry); - } catch (IOException e) { - throw new IllegalArgumentException("Cannot convert jar entry " - + jarEntry + " to a resource", e); - } - })); + return Collections.enumeration( + Lists.transform( + Collections.list(jarFile.entries()), + jarEntry -> { + try { + return resourceOf(jarEntry); + } catch (IOException e) { + throw new IllegalArgumentException( + "Cannot convert jar entry " + jarEntry + " to a resource", e); + } + })); } @Override - public InputStream getInputStream(PluginEntry entry) - throws IOException { - return jarFile.getInputStream(jarFile - .getEntry(entry.getName())); + public InputStream getInputStream(PluginEntry entry) throws IOException { + return jarFile.getInputStream(jarFile.getEntry(entry.getName())); } @Override @@ -331,17 +320,20 @@ public class JarScanner implements PluginContentScanner, AutoCloseable { } private PluginEntry resourceOf(JarEntry jarEntry) throws IOException { - return new PluginEntry(jarEntry.getName(), jarEntry.getTime(), - Optional.of(jarEntry.getSize()), attributesOf(jarEntry)); + return new PluginEntry( + jarEntry.getName(), + jarEntry.getTime(), + Optional.of(jarEntry.getSize()), + attributesOf(jarEntry)); } - private Map attributesOf(JarEntry jarEntry) - throws IOException { + private Map attributesOf(JarEntry jarEntry) throws IOException { Attributes attributes = jarEntry.getAttributes(); if (attributes == null) { return Collections.emptyMap(); } - return Maps.transformEntries(attributes, + return Maps.transformEntries( + attributes, new Maps.EntryTransformer() { @Override public String transformEntry(Object key, Object value) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JsPlugin.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JsPlugin.java index 544cc5b7ee..625bf9e147 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JsPlugin.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JsPlugin.java @@ -24,16 +24,13 @@ import com.google.gerrit.server.PluginUser; import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Injector; - -import org.eclipse.jgit.internal.storage.file.FileSnapshot; - import java.nio.file.Path; +import org.eclipse.jgit.internal.storage.file.FileSnapshot; class JsPlugin extends Plugin { private Injector sysInjector; - JsPlugin(String name, Path srcFile, PluginUser pluginUser, - FileSnapshot snapshot) { + JsPlugin(String name, Path srcFile, PluginUser pluginUser, FileSnapshot snapshot) { super(name, srcFile, pluginUser, snapshot, ApiType.JS); } @@ -52,8 +49,7 @@ class JsPlugin extends Plugin { public void start(PluginGuiceEnvironment env) throws Exception { manager = new LifecycleManager(); String fileName = getSrcFile().getFileName().toString(); - sysInjector = - Guice.createInjector(new StandaloneJsPluginModule(getName(), fileName)); + sysInjector = Guice.createInjector(new StandaloneJsPluginModule(getName(), fileName)); manager.start(); } @@ -99,8 +95,7 @@ class JsPlugin extends Plugin { @Override protected void configure() { bind(String.class).annotatedWith(PluginName.class).toInstance(pluginName); - DynamicSet.bind(binder(), WebUiPlugin.class).toInstance( - new JavaScriptPlugin(fileName)); + DynamicSet.bind(binder(), WebUiPlugin.class).toInstance(new JavaScriptPlugin(fileName)); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ListPlugins.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ListPlugins.java index b9871ab655..ef0b15a13c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ListPlugins.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ListPlugins.java @@ -25,15 +25,13 @@ import com.google.gerrit.server.OutputFormat; import com.google.gson.JsonElement; import com.google.gson.reflect.TypeToken; import com.google.inject.Inject; - -import org.kohsuke.args4j.Option; - import java.io.PrintWriter; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.TreeMap; +import org.kohsuke.args4j.Option; /** List the installed plugins. */ @RequiresCapability(GlobalCapability.VIEW_PLUGINS) @@ -44,7 +42,11 @@ public class ListPlugins implements RestReadView { @Option(name = "--format", usage = "(deprecated) output format") private OutputFormat format = OutputFormat.TEXT; - @Option(name = "--all", aliases = {"-a"}, usage = "List all plugins, including disabled plugins") + @Option( + name = "--all", + aliases = {"-a"}, + usage = "List all plugins, including disabled plugins" + ) private boolean all; @Inject @@ -70,16 +72,19 @@ public class ListPlugins implements RestReadView { public JsonElement display(PrintWriter stdout) { Map output = new TreeMap<>(); List plugins = Lists.newArrayList(pluginLoader.getPlugins(all)); - Collections.sort(plugins, new Comparator() { - @Override - public int compare(Plugin a, Plugin b) { - return a.getName().compareTo(b.getName()); - } - }); + Collections.sort( + plugins, + new Comparator() { + @Override + public int compare(Plugin a, Plugin b) { + return a.getName().compareTo(b.getName()); + } + }); if (!format.isJson()) { stdout.format("%-30s %-10s %-8s %s\n", "Name", "Version", "Status", "File"); - stdout.print("-------------------------------------------------------------------------------\n"); + stdout.print( + "-------------------------------------------------------------------------------\n"); } for (Plugin p : plugins) { @@ -87,7 +92,9 @@ public class ListPlugins implements RestReadView { if (format.isJson()) { output.put(p.getName(), info); } else { - stdout.format("%-30s %-10s %-8s %s\n", p.getName(), + stdout.format( + "%-30s %-10s %-8s %s\n", + p.getName(), Strings.nullToEmpty(info.version), p.isDisabled() ? "DISABLED" : "ENABLED", p.getSrcFile().getFileName()); @@ -95,12 +102,13 @@ public class ListPlugins implements RestReadView { } if (stdout == null) { - return OutputFormat.JSON.newGson().toJsonTree( - output, - new TypeToken>() {}.getType()); + return OutputFormat.JSON + .newGson() + .toJsonTree(output, new TypeToken>() {}.getType()); } else if (format.isJson()) { - format.newGson().toJson(output, - new TypeToken>() {}.getType(), stdout); + format + .newGson() + .toJson(output, new TypeToken>() {}.getType(), stdout); stdout.print('\n'); } stdout.flush(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/MultipleProvidersForPluginException.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/MultipleProvidersForPluginException.java index e89eb7d1b4..1453854e65 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/MultipleProvidersForPluginException.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/MultipleProvidersForPluginException.java @@ -22,15 +22,15 @@ import java.util.stream.StreamSupport; class MultipleProvidersForPluginException extends IllegalArgumentException { private static final long serialVersionUID = 1L; - MultipleProvidersForPluginException(Path pluginSrcPath, - Iterable providersHandlers) { - super(pluginSrcPath.toAbsolutePath() - + " is claimed to be handled by more than one plugin provider: " - + providersListToString(providersHandlers)); + MultipleProvidersForPluginException( + Path pluginSrcPath, Iterable providersHandlers) { + super( + pluginSrcPath.toAbsolutePath() + + " is claimed to be handled by more than one plugin provider: " + + providersListToString(providersHandlers)); } - private static String providersListToString( - Iterable providersHandlers) { + private static String providersListToString(Iterable providersHandlers) { return StreamSupport.stream(providersHandlers.spliterator(), false) .map(ServerPluginProvider::getProviderPluginName) .collect(joining(", ")); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/Plugin.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/Plugin.java index 63a254a483..57597054ed 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/Plugin.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/Plugin.java @@ -21,19 +21,19 @@ import com.google.gerrit.extensions.registration.ReloadableRegistrationHandle; import com.google.gerrit.lifecycle.LifecycleManager; import com.google.gerrit.server.PluginUser; import com.google.inject.Injector; - -import org.eclipse.jgit.internal.storage.file.FileSnapshot; - import java.nio.file.Path; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.jar.Attributes; import java.util.jar.Manifest; +import org.eclipse.jgit.internal.storage.file.FileSnapshot; public abstract class Plugin { public enum ApiType { - EXTENSION, PLUGIN, JS + EXTENSION, + PLUGIN, + JS } /** Unique key that changes whenever a plugin reloads. */ @@ -54,8 +54,7 @@ public abstract class Plugin { static ApiType getApiType(Manifest manifest) throws InvalidPluginException { Attributes main = manifest.getMainAttributes(); String v = main.getValue("Gerrit-ApiType"); - if (Strings.isNullOrEmpty(v) - || ApiType.EXTENSION.name().equalsIgnoreCase(v)) { + if (Strings.isNullOrEmpty(v) || ApiType.EXTENSION.name().equalsIgnoreCase(v)) { return ApiType.EXTENSION; } else if (ApiType.PLUGIN.name().equalsIgnoreCase(v)) { return ApiType.PLUGIN; @@ -79,19 +78,15 @@ public abstract class Plugin { private List> reloadableHandles; - public Plugin(String name, - Path srcPath, - PluginUser pluginUser, - FileSnapshot snapshot, - ApiType apiType) { + public Plugin( + String name, Path srcPath, PluginUser pluginUser, FileSnapshot snapshot, ApiType apiType) { this.name = name; this.srcFile = srcPath; this.apiType = apiType; this.snapshot = snapshot; this.pluginUser = pluginUser; this.cacheKey = new Plugin.CacheKey(name); - this.disabled = srcPath != null - && srcPath.getFileName().toString().endsWith(".disabled"); + this.disabled = srcPath != null && srcPath.getFileName().toString().endsWith(".disabled"); } public CleanupHandle getCleanupHandle() { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginCleanerTask.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginCleanerTask.java index 6c4c4513b2..2916721d85 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginCleanerTask.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginCleanerTask.java @@ -18,7 +18,6 @@ import com.google.gerrit.common.TimeUtil; import com.google.gerrit.server.git.WorkQueue; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; @@ -55,10 +54,10 @@ class PluginCleanerTask implements Runnable { if (0 < left) { long waiting = TimeUtil.nowMs() - start; - PluginLoader.log.warn(String.format( - "%d plugins still waiting to be reclaimed after %d minutes", - pending, - TimeUnit.MILLISECONDS.toMinutes(waiting))); + PluginLoader.log.warn( + String.format( + "%d plugins still waiting to be reclaimed after %d minutes", + pending, TimeUnit.MILLISECONDS.toMinutes(waiting))); attempts = Math.min(attempts + 1, 15); ensureScheduled(); } else { @@ -87,15 +86,9 @@ class PluginCleanerTask implements Runnable { private void ensureScheduled() { if (self == null && 0 < pending) { if (attempts == 1) { - self = workQueue.getDefaultQueue().schedule( - this, - 30, - TimeUnit.SECONDS); + self = workQueue.getDefaultQueue().schedule(this, 30, TimeUnit.SECONDS); } else { - self = workQueue.getDefaultQueue().schedule( - this, - attempts + 1, - TimeUnit.MINUTES); + self = workQueue.getDefaultQueue().schedule(this, attempts + 1, TimeUnit.MINUTES); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginContentScanner.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginContentScanner.java index c3336382b7..b19d6de7cc 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginContentScanner.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginContentScanner.java @@ -27,49 +27,46 @@ import java.util.jar.Manifest; /** * Scans the plugin returning classes and resources. * - * Gerrit uses the scanner to automatically discover the classes - * and resources exported by the plugin for auto discovery - * of exported SSH commands, Servlets and listeners. + *

Gerrit uses the scanner to automatically discover the classes and resources exported by the + * plugin for auto discovery of exported SSH commands, Servlets and listeners. */ public interface PluginContentScanner { - /** - * Scanner without resources. - */ - PluginContentScanner EMPTY = new PluginContentScanner() { - @Override - public Manifest getManifest() throws IOException { - return new Manifest(); - } + /** Scanner without resources. */ + PluginContentScanner EMPTY = + new PluginContentScanner() { + @Override + public Manifest getManifest() throws IOException { + return new Manifest(); + } - @Override - public Map, Iterable> scan( - String pluginName, Iterable> annotations) - throws InvalidPluginException { - return Collections.emptyMap(); - } + @Override + public Map, Iterable> scan( + String pluginName, Iterable> annotations) + throws InvalidPluginException { + return Collections.emptyMap(); + } - @Override - public Optional getEntry(String resourcePath) { - return Optional.empty(); - } + @Override + public Optional getEntry(String resourcePath) { + return Optional.empty(); + } - @Override - public InputStream getInputStream(PluginEntry entry) throws IOException { - throw new NoSuchFileException("Empty plugin"); - } + @Override + public InputStream getInputStream(PluginEntry entry) throws IOException { + throw new NoSuchFileException("Empty plugin"); + } - @Override - public Enumeration entries() { - return Collections.emptyEnumeration(); - } - }; + @Override + public Enumeration entries() { + return Collections.emptyEnumeration(); + } + }; /** * Plugin class extension meta-data * - * Class name and annotation value of the class - * provided by a plugin to extend an existing + *

Class name and annotation value of the class provided by a plugin to extend an existing * extension point in Gerrit. */ class ExtensionMetaData { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginEntry.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginEntry.java index c6077f4763..f7b1e82af3 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginEntry.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginEntry.java @@ -22,9 +22,8 @@ import java.util.Optional; /** * Plugin static resource entry * - * Bean representing a static resource inside a plugin. - * All static resources are available at {@code /static} - * and served by the HttpPluginServlet. + *

Bean representing a static resource inside a plugin. All static resources are available at + * {@code /static} and served by the HttpPluginServlet. */ public class PluginEntry { public static final String ATTR_CHARACTER_ENCODING = "Character-Encoding"; @@ -45,8 +44,7 @@ public class PluginEntry { private final Optional size; private final Map attrs; - public PluginEntry(String name, long time, Optional size, - Map attrs) { + public PluginEntry(String name, long time, Optional size, Map attrs) { this.name = name; this.time = time; this.size = size; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginGuiceEnvironment.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginGuiceEnvironment.java index 6dc6deaf5e..740e8d3e5b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginGuiceEnvironment.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginGuiceEnvironment.java @@ -49,7 +49,6 @@ import com.google.inject.Provider; import com.google.inject.Singleton; import com.google.inject.TypeLiteral; import com.google.inject.internal.UniqueAnnotations; - import java.lang.annotation.Annotation; import java.lang.reflect.ParameterizedType; import java.util.Collections; @@ -61,16 +60,15 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; - import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Tracks Guice bindings that should be exposed to loaded plugins. - *

- * This is an internal implementation detail of how the main server is able to - * export its explicit Guice bindings to tightly coupled plugins, giving them - * access to singletons and request scoped resources just like any core code. + * + *

This is an internal implementation detail of how the main server is able to export its + * explicit Guice bindings to tightly coupled plugins, giving them access to singletons and request + * scoped resources just like any core code. */ @Singleton public class PluginGuiceEnvironment { @@ -165,15 +163,16 @@ public class PluginGuiceEnvironment { final Module db = copy(dbInjector); final Module cm = copy(cfgInjector); final Module sm = copy(sysInjector); - sysModule = new AbstractModule() { - @Override - protected void configure() { - install(copyConfigModule); - install(db); - install(cm); - install(sm); - } - }; + sysModule = + new AbstractModule() { + @Override + protected void configure() { + install(copyConfigModule); + install(db); + install(cm); + install(sm); + } + }; } public void setSshInjector(Injector injector) { @@ -271,29 +270,25 @@ public class PluginGuiceEnvironment { } } - private void attachItem(Map, DynamicItem> items, - @Nullable Injector src, - Plugin plugin) { - for (RegistrationHandle h : PrivateInternals_DynamicTypes - .attachItems(src, items, plugin.getName())) { + private void attachItem( + Map, DynamicItem> items, @Nullable Injector src, Plugin plugin) { + for (RegistrationHandle h : + PrivateInternals_DynamicTypes.attachItems(src, items, plugin.getName())) { plugin.add(h); } } - private void attachSet(Map, DynamicSet> sets, - @Nullable Injector src, - Plugin plugin) { - for (RegistrationHandle h : PrivateInternals_DynamicTypes - .attachSets(src, sets)) { + private void attachSet( + Map, DynamicSet> sets, @Nullable Injector src, Plugin plugin) { + for (RegistrationHandle h : PrivateInternals_DynamicTypes.attachSets(src, sets)) { plugin.add(h); } } - private void attachMap(Map, DynamicMap> maps, - @Nullable Injector src, - Plugin plugin) { - for (RegistrationHandle h : PrivateInternals_DynamicTypes - .attachMaps(src, plugin.getName(), maps)) { + private void attachMap( + Map, DynamicMap> maps, @Nullable Injector src, Plugin plugin) { + for (RegistrationHandle h : + PrivateInternals_DynamicTypes.attachMaps(src, plugin.getName(), maps)) { plugin.add(h); } } @@ -302,8 +297,7 @@ public class PluginGuiceEnvironment { // Index all old registrations by the raw type. These may be replaced // during the reattach calls below. Any that are not replaced will be // removed when the old plugin does its stop routine. - ListMultimap, ReloadableRegistrationHandle> old = - LinkedListMultimap.create(); + ListMultimap, ReloadableRegistrationHandle> old = LinkedListMultimap.create(); for (ReloadableRegistrationHandle h : oldPlugin.getReloadableHandles()) { old.put(h.getKey().getTypeLiteral(), h); } @@ -370,18 +364,14 @@ public class PluginGuiceEnvironment { replace(newPlugin, h, b); oldHandles.remove(type, h); } else { - newPlugin.add(map.put( - newPlugin.getName(), - b.getKey(), - b.getProvider())); + newPlugin.add(map.put(newPlugin.getName(), b.getKey(), b.getProvider())); } } } } /** Type used to declare unique annotations. Guice hides this, so extract it. */ - private static final Class UNIQUE_ANNOTATION = - UniqueAnnotations.create().annotationType(); + private static final Class UNIQUE_ANNOTATION = UniqueAnnotations.create().annotationType(); private void reattachSet( ListMultimap, ReloadableRegistrationHandle> oldHandles, @@ -439,7 +429,7 @@ public class PluginGuiceEnvironment { } else if (oi.hasNext()) { @SuppressWarnings("unchecked") ReloadableRegistrationHandle h2 = - (ReloadableRegistrationHandle) oi.next(); + (ReloadableRegistrationHandle) oi.next(); oi.remove(); replace(newPlugin, h2, b); } else { @@ -465,28 +455,25 @@ public class PluginGuiceEnvironment { @SuppressWarnings("unchecked") DynamicItem item = (DynamicItem) e.getValue(); - Iterator> oi = - oldHandles.get(type).iterator(); + Iterator> oi = oldHandles.get(type).iterator(); for (Binding binding : bindings(src, type)) { @SuppressWarnings("unchecked") Binding b = (Binding) binding; if (oi.hasNext()) { @SuppressWarnings("unchecked") - ReloadableRegistrationHandle h = - (ReloadableRegistrationHandle) oi.next(); + ReloadableRegistrationHandle h = (ReloadableRegistrationHandle) oi.next(); oi.remove(); replace(newPlugin, h, b); } else { - newPlugin.add(item.set(b.getKey(), b.getProvider(), - newPlugin.getName())); + newPlugin.add(item.set(b.getKey(), b.getProvider(), newPlugin.getName())); } } } } - private static void replace(Plugin newPlugin, - ReloadableRegistrationHandle h, Binding b) { + private static void replace( + Plugin newPlugin, ReloadableRegistrationHandle h, Binding b) { RegistrationHandle n = h.replace(b.getKey(), b.getProvider()); if (n != null) { newPlugin.add(n); @@ -517,8 +504,7 @@ public class PluginGuiceEnvironment { if (type.getRawType() == DynamicItem.class) { ParameterizedType t = (ParameterizedType) type.getType(); dynamicItemTypes.add(TypeLiteral.get(t.getActualTypeArguments()[0])); - } else if (type.getRawType() == DynamicSet.class - || type.getRawType() == DynamicMap.class) { + } else if (type.getRawType() == DynamicSet.class || type.getRawType() == DynamicMap.class) { ParameterizedType t = (ParameterizedType) type.getType(); dynamicTypes.add(TypeLiteral.get(t.getActualTypeArguments()[0])); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginLoader.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginLoader.java index 5826c585c3..918357984c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginLoader.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginLoader.java @@ -42,12 +42,6 @@ import com.google.gerrit.server.plugins.ServerPluginProvider.PluginDescription; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.eclipse.jgit.internal.storage.file.FileSnapshot; -import org.eclipse.jgit.lib.Config; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -70,14 +64,17 @@ import java.util.Set; import java.util.TreeSet; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.TimeUnit; +import org.eclipse.jgit.internal.storage.file.FileSnapshot; +import org.eclipse.jgit.lib.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Singleton public class PluginLoader implements LifecycleListener { static final Logger log = LoggerFactory.getLogger(PluginLoader.class); public String getPluginName(Path srcPath) { - return MoreObjects.firstNonNull(getGerritPluginName(srcPath), - nameOf(srcPath)); + return MoreObjects.firstNonNull(getGerritPluginName(srcPath), nameOf(srcPath)); } private final Path pluginsDir; @@ -98,7 +95,8 @@ public class PluginLoader implements LifecycleListener { private final UniversalServerPluginProvider serverPluginFactory; @Inject - public PluginLoader(SitePaths sitePaths, + public PluginLoader( + SitePaths sitePaths, PluginGuiceEnvironment pe, ServerInformationImpl sii, PluginUser.Factory puf, @@ -122,12 +120,16 @@ public class PluginLoader implements LifecycleListener { persistentCacheFactory = cacheFactory; serverPluginFactory = pluginFactory; - remoteAdmin = - cfg.getBoolean("plugins", null, "allowRemoteAdmin", false); + remoteAdmin = cfg.getBoolean("plugins", null, "allowRemoteAdmin", false); - long checkFrequency = ConfigUtil.getTimeUnit(cfg, - "plugins", null, "checkFrequency", - TimeUnit.MINUTES.toMillis(1), TimeUnit.MILLISECONDS); + long checkFrequency = + ConfigUtil.getTimeUnit( + cfg, + "plugins", + null, + "checkFrequency", + TimeUnit.MINUTES.toMillis(1), + TimeUnit.MILLISECONDS); if (checkFrequency > 0) { scanner = new PluginScannerThread(this, checkFrequency); } else { @@ -135,26 +137,24 @@ public class PluginLoader implements LifecycleListener { } } - public static List listPlugins(Path pluginsDir, final String suffix) - throws IOException { + public static List listPlugins(Path pluginsDir, final String suffix) throws IOException { if (pluginsDir == null || !Files.exists(pluginsDir)) { return ImmutableList.of(); } - DirectoryStream.Filter filter = new DirectoryStream.Filter() { - @Override - public boolean accept(Path entry) throws IOException { - String n = entry.getFileName().toString(); - boolean accept = !n.startsWith(".last_") - && !n.startsWith(".next_") - && Files.isRegularFile(entry); - if (!Strings.isNullOrEmpty(suffix)) { - accept &= n.endsWith(suffix); - } - return accept; - } - }; - try (DirectoryStream files = Files.newDirectoryStream( - pluginsDir, filter)) { + DirectoryStream.Filter filter = + new DirectoryStream.Filter() { + @Override + public boolean accept(Path entry) throws IOException { + String n = entry.getFileName().toString(); + boolean accept = + !n.startsWith(".last_") && !n.startsWith(".next_") && Files.isRegularFile(entry); + if (!Strings.isNullOrEmpty(suffix)) { + accept &= n.endsWith(suffix); + } + return accept; + } + }; + try (DirectoryStream files = Files.newDirectoryStream(pluginsDir, filter)) { return Ordering.natural().sortedCopy(files); } } @@ -190,12 +190,12 @@ public class PluginLoader implements LifecycleListener { String fileName = originalName; Path tmp = asTemp(in, ".next_" + fileName + "_", ".tmp", pluginsDir); - String name = MoreObjects.firstNonNull(getGerritPluginName(tmp), - nameOf(fileName)); + String name = MoreObjects.firstNonNull(getGerritPluginName(tmp), nameOf(fileName)); if (!originalName.equals(name)) { - log.warn(String.format("Plugin provides its own name: <%s>," - + " use it instead of the input name: <%s>", - name, originalName)); + log.warn( + String.format( + "Plugin provides its own name: <%s>," + " use it instead of the input name: <%s>", + name, originalName)); } String fileExtension = getExtension(fileName); @@ -228,8 +228,7 @@ public class PluginLoader implements LifecycleListener { return name; } - static Path asTemp(InputStream in, String prefix, String suffix, Path dir) - throws IOException { + static Path asTemp(InputStream in, String prefix, String suffix, Path dir) throws IOException { Path tmp = Files.createTempFile(dir, prefix, suffix); boolean keep = false; try (OutputStream out = Files.newOutputStream(tmp)) { @@ -246,8 +245,7 @@ public class PluginLoader implements LifecycleListener { private synchronized void unloadPlugin(Plugin plugin) { persistentCacheFactory.onStop(plugin); String name = plugin.getName(); - log.info(String.format("Unloading plugin %s, version %s", - name, plugin.getVersion())); + log.info(String.format("Unloading plugin %s, version %s", name, plugin.getVersion())); plugin.stop(env); env.onStopPlugin(plugin); running.remove(name); @@ -257,8 +255,8 @@ public class PluginLoader implements LifecycleListener { public void disablePlugins(Set names) { if (!isRemoteAdminEnabled()) { - log.warn("Remote plugin administration is disabled," - + " ignoring disablePlugins(" + names + ")"); + log.warn( + "Remote plugin administration is disabled," + " ignoring disablePlugins(" + names + ")"); return; } @@ -270,8 +268,8 @@ public class PluginLoader implements LifecycleListener { } log.info(String.format("Disabling plugin %s", active.getName())); - Path off = active.getSrcFile().resolveSibling( - active.getSrcFile().getFileName() + ".disabled"); + Path off = + active.getSrcFile().resolveSibling(active.getSrcFile().getFileName() + ".disabled"); try { Files.move(active.getSrcFile(), off); } catch (IOException e) { @@ -289,9 +287,7 @@ public class PluginLoader implements LifecycleListener { disabled.put(name, offPlugin); } catch (Throwable e) { // This shouldn't happen, as the plugin was loaded earlier. - log.warn(String.format( - "Cannot load disabled plugin %s", active.getName()), - e.getCause()); + log.warn(String.format("Cannot load disabled plugin %s", active.getName()), e.getCause()); } } cleanInBackground(); @@ -300,8 +296,8 @@ public class PluginLoader implements LifecycleListener { public void enablePlugins(Set names) throws PluginInstallException { if (!isRemoteAdminEnabled()) { - log.warn("Remote plugin administration is disabled," - + " ignoring enablePlugins(" + names + ")"); + log.warn( + "Remote plugin administration is disabled," + " ignoring enablePlugins(" + names + ")"); return; } @@ -362,8 +358,7 @@ public class PluginLoader implements LifecycleListener { } } - public void reload(List names) - throws InvalidPluginException, PluginInstallException { + public void reload(List names) throws InvalidPluginException, PluginInstallException { synchronized (this) { List reload = Lists.newArrayListWithCapacity(names.size()); List bad = Lists.newArrayListWithExpectedSize(4); @@ -376,9 +371,8 @@ public class PluginLoader implements LifecycleListener { } } if (!bad.isEmpty()) { - throw new InvalidPluginException(String.format( - "Plugin(s) \"%s\" not running", - Joiner.on("\", \"").join(bad))); + throw new InvalidPluginException( + String.format("Plugin(s) \"%s\" not running", Joiner.on("\", \"").join(bad))); } for (Plugin active : reload) { @@ -386,8 +380,9 @@ public class PluginLoader implements LifecycleListener { try { log.info(String.format("Reloading plugin %s", name)); Plugin newPlugin = runPlugin(name, active.getSrcFile(), active); - log.info(String.format("Reloaded plugin %s, version %s", - newPlugin.getName(), newPlugin.getVersion())); + log.info( + String.format( + "Reloaded plugin %s, version %s", newPlugin.getName(), newPlugin.getVersion())); } catch (PluginInstallException e) { log.warn(String.format("Cannot reload plugin %s", name), e.getCause()); throw e; @@ -433,9 +428,12 @@ public class PluginLoader implements LifecycleListener { try { Plugin loadedPlugin = runPlugin(name, path, active); if (!loadedPlugin.isDisabled()) { - log.info(String.format("%s plugin %s, version %s", - active == null ? "Loaded" : "Reloaded", - loadedPlugin.getName(), loadedPlugin.getVersion())); + log.info( + String.format( + "%s plugin %s, version %s", + active == null ? "Loaded" : "Reloaded", + loadedPlugin.getName(), + loadedPlugin.getVersion())); } } catch (PluginInstallException e) { log.warn(String.format("Cannot load plugin %s", name), e.getCause()); @@ -445,34 +443,32 @@ public class PluginLoader implements LifecycleListener { cleanInBackground(); } - private void addAllEntries(Map from, - TreeSet> to) { + private void addAllEntries(Map from, TreeSet> to) { Iterator> it = from.entrySet().iterator(); while (it.hasNext()) { - Entry entry = it.next(); - to.add(new AbstractMap.SimpleImmutableEntry<>( - entry.getKey(), entry.getValue())); + Entry entry = it.next(); + to.add(new AbstractMap.SimpleImmutableEntry<>(entry.getKey(), entry.getValue())); } } - private TreeSet> jarsFirstSortedPluginsSet( - Map activePlugins) { + private TreeSet> jarsFirstSortedPluginsSet(Map activePlugins) { TreeSet> sortedPlugins = - Sets.newTreeSet(new Comparator>() { - @Override - public int compare(Entry e1, Entry e2) { - Path n1 = e1.getValue().getFileName(); - Path n2 = e2.getValue().getFileName(); - return ComparisonChain.start() - .compareTrueFirst(isJar(n1), isJar(n2)) - .compare(n1, n2) - .result(); - } + Sets.newTreeSet( + new Comparator>() { + @Override + public int compare(Entry e1, Entry e2) { + Path n1 = e1.getValue().getFileName(); + Path n2 = e2.getValue().getFileName(); + return ComparisonChain.start() + .compareTrueFirst(isJar(n1), isJar(n2)) + .compare(n1, n2) + .result(); + } - private boolean isJar(Path n1) { - return n1.toString().endsWith(".jar"); - } - }); + private boolean isJar(Path n1) { + return n1.toString().endsWith(".jar"); + } + }); addAllEntries(activePlugins, sortedPlugins); return sortedPlugins; @@ -497,9 +493,7 @@ public class PluginLoader implements LifecycleListener { * safer then to reassign it. */ name = newPlugin.getName(); - boolean reload = oldPlugin != null - && oldPlugin.canReload() - && newPlugin.canReload(); + boolean reload = oldPlugin != null && oldPlugin.canReload() && newPlugin.canReload(); if (!reload && oldPlugin != null) { unloadPlugin(oldPlugin); } @@ -599,8 +593,8 @@ public class PluginLoader implements LifecycleListener { } else if (serverPluginFactory.handles(srcPlugin)) { return loadServerPlugin(srcPlugin, snapshot); } else { - throw new InvalidPluginException(String.format( - "Unsupported plugin type: %s", srcPlugin.getFileName())); + throw new InvalidPluginException( + String.format("Unsupported plugin type: %s", srcPlugin.getFileName())); } } @@ -609,9 +603,9 @@ public class PluginLoader implements LifecycleListener { } private String getPluginCanonicalWebUrl(String name) { - String url = String.format("%s/plugins/%s/", - CharMatcher.is('/').trimTrailingFrom(urlProvider.get()), - name); + String url = + String.format( + "%s/plugins/%s/", CharMatcher.is('/').trimTrailingFrom(urlProvider.get()), name); return url; } @@ -619,16 +613,19 @@ public class PluginLoader implements LifecycleListener { return new JsPlugin(name, srcJar, pluginUserFactory.create(name), snapshot); } - private ServerPlugin loadServerPlugin(Path scriptFile, - FileSnapshot snapshot) throws InvalidPluginException { + private ServerPlugin loadServerPlugin(Path scriptFile, FileSnapshot snapshot) + throws InvalidPluginException { String name = serverPluginFactory.getPluginName(scriptFile); - return serverPluginFactory.get(scriptFile, snapshot, new PluginDescription( - pluginUserFactory.create(name), getPluginCanonicalWebUrl(name), - getPluginDataDir(name))); + return serverPluginFactory.get( + scriptFile, + snapshot, + new PluginDescription( + pluginUserFactory.create(name), + getPluginCanonicalWebUrl(name), + getPluginDataDir(name))); } - static ClassLoader parentFor(Plugin.ApiType type) - throws InvalidPluginException { + static ClassLoader parentFor(Plugin.ApiType type) throws InvalidPluginException { switch (type) { case EXTENSION: return PluginName.class.getClassLoader(); @@ -643,10 +640,8 @@ public class PluginLoader implements LifecycleListener { // Only one active plugin per plugin name can exist for each plugin name. // Filter out disabled plugins and transform the multimap to a map - private static Map filterDisabled( - SetMultimap pluginPaths) { - Map activePlugins = Maps.newHashMapWithExpectedSize( - pluginPaths.keys().size()); + private static Map filterDisabled(SetMultimap pluginPaths) { + Map activePlugins = Maps.newHashMapWithExpectedSize(pluginPaths.keys().size()); for (String name : pluginPaths.keys()) { for (Path pluginPath : pluginPaths.asMap().get(name)) { if (!pluginPath.getFileName().toString().endsWith(".disabled")) { @@ -689,10 +684,12 @@ public class PluginLoader implements LifecycleListener { Collection elementsToRemove = new ArrayList<>(); Collection elementsToAdd = new ArrayList<>(); for (Path loser : Iterables.skip(enabled, 1)) { - log.warn(String.format("Plugin <%s> was disabled, because" - + " another plugin <%s>" - + " with the same name <%s> already exists", - loser, winner, plugin)); + log.warn( + String.format( + "Plugin <%s> was disabled, because" + + " another plugin <%s>" + + " with the same name <%s> already exists", + loser, winner, plugin)); Path disabledPlugin = Paths.get(loser + ".disabled"); elementsToAdd.add(disabledPlugin); elementsToRemove.add(loser); @@ -717,11 +714,8 @@ public class PluginLoader implements LifecycleListener { } } - private static Iterable filterDisabledPlugins( - Collection paths) { - return Iterables.filter( - paths, - p -> !p.getFileName().toString().endsWith(".disabled")); + private static Iterable filterDisabledPlugins(Collection paths) { + return Iterables.filter(paths, p -> !p.getFileName().toString().endsWith(".disabled")); } public String getGerritPluginName(Path srcPath) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginMetricMaker.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginMetricMaker.java index 23b1eee83c..b1a01d369f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginMetricMaker.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginMetricMaker.java @@ -34,7 +34,6 @@ import com.google.gerrit.metrics.Timer0; import com.google.gerrit.metrics.Timer1; import com.google.gerrit.metrics.Timer2; import com.google.gerrit.metrics.Timer3; - import java.util.Collections; import java.util.HashSet; import java.util.Iterator; @@ -59,9 +58,7 @@ public class PluginMetricMaker extends MetricMaker implements LifecycleListener } @Override - public Counter1 newCounter( - String name, Description desc, - Field field1) { + public Counter1 newCounter(String name, Description desc, Field field1) { Counter1 m = root.newCounter(prefix + name, desc, field1); cleanup.add(m); return m; @@ -69,8 +66,7 @@ public class PluginMetricMaker extends MetricMaker implements LifecycleListener @Override public Counter2 newCounter( - String name, Description desc, - Field field1, Field field2) { + String name, Description desc, Field field1, Field field2) { Counter2 m = root.newCounter(prefix + name, desc, field1, field2); cleanup.add(m); return m; @@ -78,10 +74,8 @@ public class PluginMetricMaker extends MetricMaker implements LifecycleListener @Override public Counter3 newCounter( - String name, Description desc, - Field field1, Field field2, Field field3) { - Counter3 m = - root.newCounter(prefix + name, desc, field1, field2, field3); + String name, Description desc, Field field1, Field field2, Field field3) { + Counter3 m = root.newCounter(prefix + name, desc, field1, field2, field3); cleanup.add(m); return m; } @@ -94,9 +88,7 @@ public class PluginMetricMaker extends MetricMaker implements LifecycleListener } @Override - public Timer1 newTimer( - String name, Description desc, - Field field1) { + public Timer1 newTimer(String name, Description desc, Field field1) { Timer1 m = root.newTimer(prefix + name, desc, field1); cleanup.add(m); return m; @@ -104,8 +96,7 @@ public class PluginMetricMaker extends MetricMaker implements LifecycleListener @Override public Timer2 newTimer( - String name, Description desc, - Field field1, Field field2) { + String name, Description desc, Field field1, Field field2) { Timer2 m = root.newTimer(prefix + name, desc, field1, field2); cleanup.add(m); return m; @@ -113,10 +104,8 @@ public class PluginMetricMaker extends MetricMaker implements LifecycleListener @Override public Timer3 newTimer( - String name, Description desc, - Field field1, Field field2, Field field3) { - Timer3 m = - root.newTimer(prefix + name, desc, field1, field2, field3); + String name, Description desc, Field field1, Field field2, Field field3) { + Timer3 m = root.newTimer(prefix + name, desc, field1, field2, field3); cleanup.add(m); return m; } @@ -129,9 +118,7 @@ public class PluginMetricMaker extends MetricMaker implements LifecycleListener } @Override - public Histogram1 newHistogram( - String name, Description desc, - Field field1) { + public Histogram1 newHistogram(String name, Description desc, Field field1) { Histogram1 m = root.newHistogram(prefix + name, desc, field1); cleanup.add(m); return m; @@ -139,8 +126,7 @@ public class PluginMetricMaker extends MetricMaker implements LifecycleListener @Override public Histogram2 newHistogram( - String name, Description desc, - Field field1, Field field2) { + String name, Description desc, Field field1, Field field2) { Histogram2 m = root.newHistogram(prefix + name, desc, field1, field2); cleanup.add(m); return m; @@ -148,10 +134,8 @@ public class PluginMetricMaker extends MetricMaker implements LifecycleListener @Override public Histogram3 newHistogram( - String name, Description desc, - Field field1, Field field2, Field field3) { - Histogram3 m = - root.newHistogram(prefix + name, desc, field1, field2, field3); + String name, Description desc, Field field1, Field field2, Field field3) { + Histogram3 m = root.newHistogram(prefix + name, desc, field1, field2, field3); cleanup.add(m); return m; } @@ -165,17 +149,15 @@ public class PluginMetricMaker extends MetricMaker implements LifecycleListener } @Override - public CallbackMetric1 newCallbackMetric(String name, - Class valueClass, Description desc, Field field1) { - CallbackMetric1 m = - root.newCallbackMetric(prefix + name, valueClass, desc, field1); + public CallbackMetric1 newCallbackMetric( + String name, Class valueClass, Description desc, Field field1) { + CallbackMetric1 m = root.newCallbackMetric(prefix + name, valueClass, desc, field1); cleanup.add(m); return m; } @Override - public RegistrationHandle newTrigger(Set> metrics, - Runnable trigger) { + public RegistrationHandle newTrigger(Set> metrics, Runnable trigger) { final RegistrationHandle handle = root.newTrigger(metrics, trigger); cleanup.add(handle); return new RegistrationHandle() { @@ -188,8 +170,7 @@ public class PluginMetricMaker extends MetricMaker implements LifecycleListener } @Override - public void start() { - } + public void start() {} @Override public void stop() { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginModule.java index 32722dae49..db184709cc 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginModule.java @@ -31,8 +31,7 @@ public class PluginModule extends LifecycleModule { listener().to(PluginLoader.class); DynamicSet.setOf(binder(), ServerPluginProvider.class); - DynamicSet.bind(binder(), ServerPluginProvider.class).to( - JarPluginProvider.class); + DynamicSet.bind(binder(), ServerPluginProvider.class).to(JarPluginProvider.class); bind(UniversalServerPluginProvider.class); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginScannerThread.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginScannerThread.java index e6c3dbd651..705e3c0c75 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginScannerThread.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginScannerThread.java @@ -31,7 +31,7 @@ class PluginScannerThread extends Thread { @Override public void run() { - for (;;) { + for (; ; ) { try { if (done.await(checkFrequencyMillis, TimeUnit.MILLISECONDS)) { return; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginsCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginsCollection.java index a4834ba9f5..b8a9a9e0a4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginsCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginsCollection.java @@ -27,17 +27,16 @@ import com.google.inject.Provider; import com.google.inject.Singleton; @Singleton -public class PluginsCollection implements - RestCollection, - AcceptsCreate { +public class PluginsCollection + implements RestCollection, AcceptsCreate { private final DynamicMap> views; private final PluginLoader loader; private final Provider list; @Inject - PluginsCollection(DynamicMap> views, - PluginLoader loader, Provider list) { + PluginsCollection( + DynamicMap> views, PluginLoader loader, Provider list) { this.views = views; this.loader = loader; this.list = list; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ReloadPlugin.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ReloadPlugin.java index e9c5aa2c7b..13a1179fef 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ReloadPlugin.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ReloadPlugin.java @@ -23,15 +23,13 @@ import com.google.gerrit.server.plugins.ListPlugins.PluginInfo; import com.google.gerrit.server.plugins.ReloadPlugin.Input; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.io.PrintWriter; import java.io.StringWriter; @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER) @Singleton class ReloadPlugin implements RestModifyView { - static class Input { - } + static class Input {} private final PluginLoader loader; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPlugin.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPlugin.java index 7175685e34..36b0631edf 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPlugin.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPlugin.java @@ -25,15 +25,13 @@ import com.google.gerrit.server.util.RequestContext; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.Module; - -import org.eclipse.jgit.internal.storage.file.FileSnapshot; - import java.io.IOException; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; import java.util.jar.Attributes; import java.util.jar.Manifest; +import org.eclipse.jgit.internal.storage.file.FileSnapshot; public class ServerPlugin extends Plugin { private final Manifest manifest; @@ -52,7 +50,8 @@ public class ServerPlugin extends Plugin { private LifecycleManager serverManager; private List> reloadableHandles; - public ServerPlugin(String name, + public ServerPlugin( + String name, String pluginCanonicalWebUrl, PluginUser pluginUser, Path srcJar, @@ -60,11 +59,14 @@ public class ServerPlugin extends Plugin { PluginContentScanner scanner, Path dataDir, ClassLoader classLoader, - String metricsPrefix) throws InvalidPluginException { - super(name, srcJar, pluginUser, snapshot, - scanner == null - ? ApiType.PLUGIN - : Plugin.getApiType(getPluginManifest(scanner))); + String metricsPrefix) + throws InvalidPluginException { + super( + name, + srcJar, + pluginUser, + snapshot, + scanner == null ? ApiType.PLUGIN : Plugin.getApiType(getPluginManifest(scanner))); this.pluginCanonicalWebUrl = pluginCanonicalWebUrl; this.scanner = scanner; this.dataDir = dataDir; @@ -76,28 +78,39 @@ public class ServerPlugin extends Plugin { } } - public ServerPlugin(String name, + public ServerPlugin( + String name, String pluginCanonicalWebUrl, PluginUser pluginUser, Path srcJar, FileSnapshot snapshot, PluginContentScanner scanner, Path dataDir, - ClassLoader classLoader) throws InvalidPluginException { - this(name, pluginCanonicalWebUrl, pluginUser, srcJar, snapshot, scanner, - dataDir, classLoader, null); + ClassLoader classLoader) + throws InvalidPluginException { + this( + name, + pluginCanonicalWebUrl, + pluginUser, + srcJar, + snapshot, + scanner, + dataDir, + classLoader, + null); } - private void loadGuiceModules(Manifest manifest, ClassLoader classLoader) throws InvalidPluginException { + private void loadGuiceModules(Manifest manifest, ClassLoader classLoader) + throws InvalidPluginException { Attributes main = manifest.getMainAttributes(); String sysName = main.getValue("Gerrit-Module"); String sshName = main.getValue("Gerrit-SshModule"); String httpName = main.getValue("Gerrit-HttpModule"); if (!Strings.isNullOrEmpty(sshName) && getApiType() != Plugin.ApiType.PLUGIN) { - throw new InvalidPluginException(String.format( - "Using Gerrit-SshModule requires Gerrit-ApiType: %s", - Plugin.ApiType.PLUGIN)); + throw new InvalidPluginException( + String.format( + "Using Gerrit-SshModule requires Gerrit-ApiType: %s", Plugin.ApiType.PLUGIN)); } try { @@ -116,12 +129,10 @@ public class ServerPlugin extends Plugin { return null; } - Class clazz = - Class.forName(name, false, pluginLoader); + Class clazz = Class.forName(name, false, pluginLoader); if (!Module.class.isAssignableFrom(clazz)) { - throw new ClassCastException(String.format( - "Class %s does not implement %s", - name, Module.class.getName())); + throw new ClassCastException( + String.format("Class %s does not implement %s", name, Module.class.getName())); } return (Class) clazz; } @@ -141,7 +152,7 @@ public class ServerPlugin extends Plugin { private static Manifest getPluginManifest(PluginContentScanner scanner) throws InvalidPluginException { try { - return scanner.getManifest(); + return scanner.getManifest(); } catch (IOException e) { throw new InvalidPluginException("Cannot get plugin manifest", e); } @@ -163,9 +174,9 @@ public class ServerPlugin extends Plugin { } else if ("restart".equalsIgnoreCase(v)) { return false; } else { - PluginLoader.log.warn(String.format( - "Plugin %s has invalid Gerrit-ReloadMode %s; assuming restart", - getName(), v)); + PluginLoader.log.warn( + String.format( + "Plugin %s has invalid Gerrit-ReloadMode %s; assuming restart", getName(), v)); return false; } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPluginInfoModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPluginInfoModule.java index ff89cef4dd..639b2787f3 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPluginInfoModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPluginInfoModule.java @@ -24,7 +24,6 @@ import com.google.gerrit.server.PluginUser; import com.google.inject.AbstractModule; import com.google.inject.Provides; import com.google.inject.ProvisionException; - import java.io.File; import java.io.IOException; import java.nio.file.Files; @@ -46,24 +45,24 @@ class ServerPluginInfoModule extends AbstractModule { @Override protected void configure() { bind(PluginUser.class).toInstance(plugin.getPluginUser()); + bind(String.class).annotatedWith(PluginName.class).toInstance(plugin.getName()); bind(String.class) - .annotatedWith(PluginName.class) - .toInstance(plugin.getName()); - bind(String.class) - .annotatedWith(PluginCanonicalWebUrl.class) - .toInstance(plugin.getPluginCanonicalWebUrl()); + .annotatedWith(PluginCanonicalWebUrl.class) + .toInstance(plugin.getPluginCanonicalWebUrl()); - install(new LifecycleModule() { - @Override - public void configure() { - PluginMetricMaker metrics = new PluginMetricMaker( - serverMetrics, - MoreObjects.firstNonNull(plugin.getMetricsPrefix(), - String.format("plugins/%s/", plugin.getName()))); - bind(MetricMaker.class).toInstance(metrics); - listener().toInstance(metrics); - } - }); + install( + new LifecycleModule() { + @Override + public void configure() { + PluginMetricMaker metrics = + new PluginMetricMaker( + serverMetrics, + MoreObjects.firstNonNull( + plugin.getMetricsPrefix(), String.format("plugins/%s/", plugin.getName()))); + bind(MetricMaker.class).toInstance(metrics); + listener().toInstance(metrics); + } + }); } @Provides @@ -75,9 +74,10 @@ class ServerPluginInfoModule extends AbstractModule { try { Files.createDirectories(dataDir); } catch (IOException e) { - throw new ProvisionException(String.format( - "Cannot create %s for plugin %s", - dataDir.toAbsolutePath(), plugin.getName()), e); + throw new ProvisionException( + String.format( + "Cannot create %s for plugin %s", dataDir.toAbsolutePath(), plugin.getName()), + e); } ready = true; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPluginProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPluginProvider.java index 068d73c003..632f838fb5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPluginProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPluginProvider.java @@ -16,27 +16,22 @@ package com.google.gerrit.server.plugins; import com.google.gerrit.extensions.annotations.ExtensionPoint; import com.google.gerrit.server.PluginUser; - -import org.eclipse.jgit.internal.storage.file.FileSnapshot; - import java.nio.file.Path; +import org.eclipse.jgit.internal.storage.file.FileSnapshot; /** * Provider of one Server plugin from one external file * - * Allows to load one plugin from one external file or - * one directory by declaring the ability to handle it. + *

Allows to load one plugin from one external file or one directory by declaring the ability to + * handle it. * - * In order to load multiple files into a single plugin, - * group them into a directory tree and then load the directory - * root as a single plugin. + *

In order to load multiple files into a single plugin, group them into a directory tree and + * then load the directory root as a single plugin. */ @ExtensionPoint public interface ServerPluginProvider { - /** - * Descriptor of the Plugin that ServerPluginProvider has to load. - */ + /** Descriptor of the Plugin that ServerPluginProvider has to load. */ class PluginDescription { public final PluginUser user; public final String canonicalUrl; @@ -67,10 +62,9 @@ public interface ServerPluginProvider { /** * Returns the plugin name of an external file or directory * - * Should be called only if {@link #handles(Path) handles(srcFile)} - * returns true and thus srcFile is a supported plugin format. - * An IllegalArgumentException is thrown otherwise as srcFile - * is not a valid file format for extracting its plugin name. + *

Should be called only if {@link #handles(Path) handles(srcFile)} returns true and thus + * srcFile is a supported plugin format. An IllegalArgumentException is thrown otherwise as + * srcFile is not a valid file format for extracting its plugin name. * * @param srcPath external file or directory * @return plugin name @@ -80,26 +74,24 @@ public interface ServerPluginProvider { /** * Loads an external file or directory into a Server plugin. * - * Should be called only if {@link #handles(Path) handles(srcFile)} - * returns true and thus srcFile is a supported plugin format. - * An IllegalArgumentException is thrown otherwise as srcFile - * is not a valid file format for extracting its plugin name. + *

Should be called only if {@link #handles(Path) handles(srcFile)} returns true and thus + * srcFile is a supported plugin format. An IllegalArgumentException is thrown otherwise as + * srcFile is not a valid file format for extracting its plugin name. * * @param srcPath external file or directory * @param snapshot snapshot of the external file * @param pluginDescriptor descriptor of the ServerPlugin to load - * @throws InvalidPluginException if plugin is supposed to be handled - * but cannot be loaded for any other reason + * @throws InvalidPluginException if plugin is supposed to be handled but cannot be loaded for any + * other reason */ - ServerPlugin get(Path srcPath, FileSnapshot snapshot, - PluginDescription pluginDescriptor) throws InvalidPluginException; + ServerPlugin get(Path srcPath, FileSnapshot snapshot, PluginDescription pluginDescriptor) + throws InvalidPluginException; /** * Returns the plugin name of this provider. * - * Allows to identify which plugin provided the current ServerPluginProvider - * by returning the plugin name. Helpful for troubleshooting plugin loading - * problems. + *

Allows to identify which plugin provided the current ServerPluginProvider by returning the + * plugin name. Helpful for troubleshooting plugin loading problems. * * @return plugin name of this provider */ diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/TestServerPlugin.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/TestServerPlugin.java index 98cd3d2a5e..6897b9a647 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/TestServerPlugin.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/TestServerPlugin.java @@ -22,9 +22,14 @@ public class TestServerPlugin extends ServerPlugin { private String httpName; private String sshName; - public TestServerPlugin(String name, String pluginCanonicalWebUrl, - PluginUser user, ClassLoader classloader, String sysName, - String httpName, String sshName) + public TestServerPlugin( + String name, + String pluginCanonicalWebUrl, + PluginUser user, + ClassLoader classloader, + String sysName, + String httpName, + String sshName) throws InvalidPluginException { super(name, pluginCanonicalWebUrl, user, null, null, null, null, classloader); this.classLoader = classloader; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/UniversalServerPluginProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/UniversalServerPluginProvider.java index afdc5b3071..91441d8a24 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/UniversalServerPluginProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/UniversalServerPluginProvider.java @@ -17,14 +17,12 @@ package com.google.gerrit.server.plugins; import com.google.gerrit.extensions.registration.DynamicSet; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.internal.storage.file.FileSnapshot; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.nio.file.Path; import java.util.ArrayList; import java.util.List; +import org.eclipse.jgit.internal.storage.file.FileSnapshot; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Singleton class UniversalServerPluginProvider implements ServerPluginProvider { @@ -38,8 +36,8 @@ class UniversalServerPluginProvider implements ServerPluginProvider { } @Override - public ServerPlugin get(Path srcPath, FileSnapshot snapshot, - PluginDescription pluginDescription) throws InvalidPluginException { + public ServerPlugin get(Path srcPath, FileSnapshot snapshot, PluginDescription pluginDescription) + throws InvalidPluginException { return providerOf(srcPath).get(srcPath, snapshot, pluginDescription); } @@ -67,8 +65,7 @@ class UniversalServerPluginProvider implements ServerPluginProvider { } private ServerPluginProvider providerOf(Path srcPath) { - List providers = - providersForHandlingPlugin(srcPath); + List providers = providersForHandlingPlugin(srcPath); switch (providers.size()) { case 1: return providers.get(0); @@ -81,13 +78,15 @@ class UniversalServerPluginProvider implements ServerPluginProvider { } } - private List providersForHandlingPlugin( - final Path srcPath) { + private List providersForHandlingPlugin(final Path srcPath) { List providers = new ArrayList<>(); for (ServerPluginProvider serverPluginProvider : serverPluginProviders) { boolean handles = serverPluginProvider.handles(srcPath); - log.debug("File {} handled by {} ? => {}", srcPath, - serverPluginProvider.getProviderPluginName(), handles); + log.debug( + "File {} handled by {} ? => {}", + srcPath, + serverPluginProvider.getProviderPluginName(), + handles); if (handles) { providers.add(serverPluginProvider); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/AccessControlModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/AccessControlModule.java index 8e85fd0a6f..5c0d8d75e7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/AccessControlModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/AccessControlModule.java @@ -27,16 +27,15 @@ import com.google.gerrit.server.config.GitReceivePackGroupsProvider; import com.google.gerrit.server.config.GitUploadPackGroups; import com.google.gerrit.server.config.GitUploadPackGroupsProvider; import com.google.inject.TypeLiteral; - import java.util.Set; public class AccessControlModule extends FactoryModule { @Override protected void configure() { bind(new TypeLiteral>() {}) - .annotatedWith(AdministrateServerGroups.class) - .toProvider(AdministrateServerGroupsProvider.class) - .in(SINGLETON); + .annotatedWith(AdministrateServerGroups.class) + .toProvider(AdministrateServerGroupsProvider.class) + .in(SINGLETON); bind(new TypeLiteral>() {}) .annotatedWith(GitUploadPackGroups.class) diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/BanCommit.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/BanCommit.java index ce97a837df..41e8fbc6d3 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/BanCommit.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/BanCommit.java @@ -24,13 +24,11 @@ import com.google.gerrit.server.git.BanCommitResult; import com.google.gerrit.server.project.BanCommit.Input; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException; -import org.eclipse.jgit.lib.ObjectId; - import java.io.IOException; import java.util.ArrayList; import java.util.List; +import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException; +import org.eclipse.jgit.lib.ObjectId; @Singleton public class BanCommit implements RestModifyView { @@ -58,8 +56,7 @@ public class BanCommit implements RestModifyView { @Override public BanResultInfo apply(ProjectResource rsrc, Input input) - throws UnprocessableEntityException, AuthException, - ResourceConflictException, IOException { + throws UnprocessableEntityException, AuthException, ResourceConflictException, IOException { BanResultInfo r = new BanResultInfo(); if (input != null && input.commits != null && !input.commits.isEmpty()) { List commitsToBan = new ArrayList<>(input.commits.size()); @@ -72,8 +69,7 @@ public class BanCommit implements RestModifyView { } try { - BanCommitResult result = - banCommit.ban(rsrc.getControl(), commitsToBan, input.reason); + BanCommitResult result = banCommit.ban(rsrc.getControl(), commitsToBan, input.reason); r.newlyBanned = transformCommits(result.getNewlyBannedCommits()); r.alreadyBanned = transformCommits(result.getAlreadyBannedCommits()); r.ignored = transformCommits(result.getIgnoredObjectIds()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/BranchesCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/BranchesCollection.java index 41d4920851..6867dce06e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/BranchesCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/BranchesCollection.java @@ -26,23 +26,22 @@ import com.google.gerrit.reviewdb.client.RefNames; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.Constants; - import java.io.IOException; import java.util.List; +import org.eclipse.jgit.lib.Constants; @Singleton -public class BranchesCollection implements - ChildCollection, - AcceptsCreate { +public class BranchesCollection + implements ChildCollection, AcceptsCreate { private final DynamicMap> views; private final Provider list; private final CreateBranch.Factory createBranchFactory; @Inject - BranchesCollection(DynamicMap> views, - Provider list, CreateBranch.Factory createBranchFactory) { + BranchesCollection( + DynamicMap> views, + Provider list, + CreateBranch.Factory createBranchFactory) { this.views = views; this.list = list; this.createBranchFactory = createBranchFactory; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java index 68debb908f..aa28843ff4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java @@ -36,12 +36,10 @@ import com.google.gerrit.server.query.change.ChangeData; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.io.IOException; import java.util.Collection; import java.util.List; - /** Access control management for a user accessing a single change. */ public class ChangeControl { @Singleton @@ -50,24 +48,22 @@ public class ChangeControl { private final ChangeNotes.Factory notesFactory; @Inject - GenericFactory( - ProjectControl.GenericFactory p, - ChangeNotes.Factory n) { + GenericFactory(ProjectControl.GenericFactory p, ChangeNotes.Factory n) { projectControl = p; notesFactory = n; } - public ChangeControl controlFor(ReviewDb db, Project.NameKey project, - Change.Id changeId, CurrentUser user) throws OrmException { + public ChangeControl controlFor( + ReviewDb db, Project.NameKey project, Change.Id changeId, CurrentUser user) + throws OrmException { return controlFor(notesFactory.create(db, project, changeId), user); } - public ChangeControl controlFor(ReviewDb db, Change change, - CurrentUser user) throws OrmException { + public ChangeControl controlFor(ReviewDb db, Change change, CurrentUser user) + throws OrmException { final Project.NameKey projectKey = change.getProject(); try { - return projectControl.controlFor(projectKey, user) - .controlFor(db, change); + return projectControl.controlFor(projectKey, user).controlFor(db, change); } catch (NoSuchProjectException e) { throw new NoSuchChangeException(change.getId(), e); } catch (IOException e) { @@ -79,20 +75,19 @@ public class ChangeControl { public ChangeControl controlFor(ChangeNotes notes, CurrentUser user) throws NoSuchChangeException { try { - return projectControl.controlFor(notes.getProjectName(), user) - .controlFor(notes); + return projectControl.controlFor(notes.getProjectName(), user).controlFor(notes); } catch (NoSuchProjectException | IOException e) { throw new NoSuchChangeException(notes.getChangeId(), e); } } - public ChangeControl validateFor(ReviewDb db, Change.Id changeId, - CurrentUser user) throws OrmException { + public ChangeControl validateFor(ReviewDb db, Change.Id changeId, CurrentUser user) + throws OrmException { return validateFor(db, notesFactory.createChecked(changeId), user); } - public ChangeControl validateFor(ReviewDb db, ChangeNotes notes, - CurrentUser user) throws OrmException { + public ChangeControl validateFor(ReviewDb db, ChangeNotes notes, CurrentUser user) + throws OrmException { ChangeControl c = controlFor(notes, user); if (!c.isVisible(db)) { throw new NoSuchChangeException(c.getId()); @@ -109,7 +104,8 @@ public class ChangeControl { private final PatchSetUtil patchSetUtil; @Inject - Factory(ChangeData.Factory changeDataFactory, + Factory( + ChangeData.Factory changeDataFactory, ChangeNotes.Factory notesFactory, ApprovalsUtil approvalsUtil, PatchSetUtil patchSetUtil) { @@ -119,16 +115,15 @@ public class ChangeControl { this.patchSetUtil = patchSetUtil; } - ChangeControl create(RefControl refControl, ReviewDb db, Project.NameKey - project, Change.Id changeId) throws OrmException { - return create(refControl, - notesFactory.create(db, project, changeId)); + ChangeControl create( + RefControl refControl, ReviewDb db, Project.NameKey project, Change.Id changeId) + throws OrmException { + return create(refControl, notesFactory.create(db, project, changeId)); } /** - * Create a change control for a change that was loaded from index. This - * method should only be used when database access is harmful and potentially - * stale data from the index is acceptable. + * Create a change control for a change that was loaded from index. This method should only be + * used when database access is harmful and potentially stale data from the index is acceptable. * * @param refControl ref control * @param change change loaded from secondary index @@ -139,8 +134,7 @@ public class ChangeControl { } ChangeControl create(RefControl refControl, ChangeNotes notes) { - return new ChangeControl(changeDataFactory, approvalsUtil, refControl, - notes, patchSetUtil); + return new ChangeControl(changeDataFactory, approvalsUtil, refControl, notes, patchSetUtil); } } @@ -167,8 +161,8 @@ public class ChangeControl { if (getUser().equals(who)) { return this; } - return new ChangeControl(changeDataFactory, approvalsUtil, - getRefControl().forUser(who), notes, patchSetUtil); + return new ChangeControl( + changeDataFactory, approvalsUtil, getRefControl().forUser(who), notes, patchSetUtil); } public RefControl getRefControl() { @@ -205,10 +199,8 @@ public class ChangeControl { } /** Can this user see this change? */ - public boolean isVisible(ReviewDb db, @Nullable ChangeData cd) - throws OrmException { - if (getChange().getStatus() == Change.Status.DRAFT - && !isDraftVisible(db, cd)) { + public boolean isVisible(ReviewDb db, @Nullable ChangeData cd) throws OrmException { + if (getChange().getStatus() == Change.Status.DRAFT && !isDraftVisible(db, cd)) { return false; } return isRefVisible(); @@ -228,10 +220,9 @@ public class ChangeControl { } /** Can this user see the given patchset? */ - public boolean isPatchVisible(PatchSet ps, ChangeData cd) - throws OrmException { - checkArgument(cd.getId().equals(ps.getId().getParentKey()), - "%s not for change %s", ps, cd.getId()); + public boolean isPatchVisible(PatchSet ps, ChangeData cd) throws OrmException { + checkArgument( + cd.getId().equals(ps.getId().getParentKey()), "%s not for change %s", ps, cd.getId()); if (ps.isDraft() && !isDraftVisible(cd.db(), cd)) { return false; } @@ -241,28 +232,26 @@ public class ChangeControl { /** Can this user abandon this change? */ public boolean canAbandon(ReviewDb db) throws OrmException { return (isOwner() // owner (aka creator) of the change can abandon - || getRefControl().isOwner() // branch owner can abandon - || getProjectControl().isOwner() // project owner can abandon - || getUser().getCapabilities().canAdministrateServer() // site administers are god - || getRefControl().canAbandon() // user can abandon a specific ref - ) && !isPatchSetLocked(db); + || getRefControl().isOwner() // branch owner can abandon + || getProjectControl().isOwner() // project owner can abandon + || getUser().getCapabilities().canAdministrateServer() // site administers are god + || getRefControl().canAbandon() // user can abandon a specific ref + ) + && !isPatchSetLocked(db); } - /** Can this user change the destination branch of this change - to the new ref? */ + /** Can this user change the destination branch of this change to the new ref? */ public boolean canMoveTo(String ref, ReviewDb db) throws OrmException { return getProjectControl().controlForRef(ref).canUpload() && canAbandon(db); } /** Can this user publish this draft change or any draft patch set of this change? */ public boolean canPublish(final ReviewDb db) throws OrmException { - return (isOwner() || getRefControl().canPublishDrafts()) - && isVisible(db); + return (isOwner() || getRefControl().canPublishDrafts()) && isVisible(db); } /** Can this user delete this change or any patch set of this change? */ - public boolean canDelete(ReviewDb db, Change.Status status) - throws OrmException { + public boolean canDelete(ReviewDb db, Change.Status status) throws OrmException { if (!isVisible(db)) { return false; } @@ -281,8 +270,8 @@ public class ChangeControl { /** Can this user rebase this change? */ public boolean canRebase(ReviewDb db) throws OrmException { - return (isOwner() || getRefControl().canSubmit(isOwner()) - || getRefControl().canRebase()) && !isPatchSetLocked(db); + return (isOwner() || getRefControl().canSubmit(isOwner()) || getRefControl().canRebase()) + && !isPatchSetLocked(db); } /** Can this user restore this change? */ @@ -303,8 +292,7 @@ public class ChangeControl { r.add(l); } else { for (String refPattern : refs) { - if (RefConfigSection.isValid(refPattern) - && match(destBranch, refPattern)) { + if (RefConfigSection.isValid(refPattern) && match(destBranch, refPattern)) { r.add(l); break; } @@ -344,10 +332,11 @@ public class ChangeControl { return false; } - for (PatchSetApproval ap : approvalsUtil.byPatchSet(db, this, - getChange().currentPatchSetId())) { + for (PatchSetApproval ap : + approvalsUtil.byPatchSet(db, this, getChange().currentPatchSetId())) { LabelType type = getLabelTypes().byLabel(ap.getLabel()); - if (type != null && ap.getValue() == 1 + if (type != null + && ap.getValue() == 1 && type.getFunctionName().equalsIgnoreCase("PatchSetLock")) { return true; } @@ -380,8 +369,7 @@ public class ChangeControl { } /** Is this user a reviewer for the change? */ - public boolean isReviewer(ReviewDb db, @Nullable ChangeData cd) - throws OrmException { + public boolean isReviewer(ReviewDb db, @Nullable ChangeData cd) throws OrmException { if (getUser().isIdentifiedUser()) { Collection results = changeData(db, cd).reviewers().all(); return results.contains(getUser().getAccountId()); @@ -462,10 +450,10 @@ public class ChangeControl { /** Can this user edit the hashtag name? */ public boolean canEditHashtags() { return isOwner() // owner (aka creator) of the change can edit hashtags - || getRefControl().isOwner() // branch owner can edit hashtags - || getProjectControl().isOwner() // project owner can edit hashtags - || getUser().getCapabilities().canAdministrateServer() // site administers are god - || getRefControl().canEditHashtags(); // user can edit hashtag on a specific ref + || getRefControl().isOwner() // branch owner can edit hashtags + || getProjectControl().isOwner() // project owner can edit hashtags + || getUser().getCapabilities().canAdministrateServer() // site administers are god + || getRefControl().canEditHashtags(); // user can edit hashtag on a specific ref } public boolean canSubmit() { @@ -477,17 +465,17 @@ public class ChangeControl { } private boolean match(String destBranch, String refPattern) { - return RefPatternMatcher.getMatcher(refPattern).match(destBranch, - getUser()); + return RefPatternMatcher.getMatcher(refPattern).match(destBranch, getUser()); } private ChangeData changeData(ReviewDb db, @Nullable ChangeData cd) { return cd != null ? cd : changeDataFactory.create(db, this); } - public boolean isDraftVisible(ReviewDb db, ChangeData cd) - throws OrmException { - return isOwner() || isReviewer(db, cd) || getRefControl().canViewDrafts() + public boolean isDraftVisible(ReviewDb db, ChangeData cd) throws OrmException { + return isOwner() + || isReviewer(db, cd) + || getRefControl().canViewDrafts() || getUser().isInternalUser(); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/CheckMergeability.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/CheckMergeability.java index 37d5295d73..b704fc876e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/CheckMergeability.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/CheckMergeability.java @@ -26,7 +26,7 @@ import com.google.gerrit.server.git.InMemoryInserter; import com.google.gerrit.server.git.MergeUtil; import com.google.inject.Inject; import com.google.inject.Provider; - +import java.io.IOException; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.ObjectInserter; import org.eclipse.jgit.lib.Ref; @@ -37,11 +37,7 @@ import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; import org.kohsuke.args4j.Option; -import java.io.IOException; - -/** - * Check the mergeability at current branch for a git object references expression. - */ +/** Check the mergeability at current branch for a git object references expression. */ public class CheckMergeability implements RestReadView { private String source; @@ -49,18 +45,24 @@ public class CheckMergeability implements RestReadView { private SubmitType submitType; private final Provider db; - @Option(name = "--source", metaVar = "COMMIT", - usage = "the source reference to merge, which could be any git object " - + "references expression, refer to " - + "org.eclipse.jgit.lib.Repository#resolve(String)", - required = true) + @Option( + name = "--source", + metaVar = "COMMIT", + usage = + "the source reference to merge, which could be any git object " + + "references expression, refer to " + + "org.eclipse.jgit.lib.Repository#resolve(String)", + required = true + ) public void setSource(String source) { this.source = source; } - @Option(name = "--strategy", metaVar = "STRATEGY", - usage = "name of the merge strategy, refer to " - + "org.eclipse.jgit.merge.MergeStrategy") + @Option( + name = "--strategy", + metaVar = "STRATEGY", + usage = "name of the merge strategy, refer to " + "org.eclipse.jgit.merge.MergeStrategy" + ) public void setStrategy(String strategy) { this.strategy = strategy; } @@ -68,31 +70,28 @@ public class CheckMergeability implements RestReadView { private final GitRepositoryManager gitManager; @Inject - CheckMergeability(GitRepositoryManager gitManager, - @GerritServerConfig Config cfg, - Provider db) { + CheckMergeability( + GitRepositoryManager gitManager, @GerritServerConfig Config cfg, Provider db) { this.gitManager = gitManager; this.strategy = MergeUtil.getMergeStrategy(cfg).getName(); - this.submitType = cfg.getEnum("project", null, "submitType", - SubmitType.MERGE_IF_NECESSARY); + this.submitType = cfg.getEnum("project", null, "submitType", SubmitType.MERGE_IF_NECESSARY); this.db = db; } @Override public MergeableInfo apply(BranchResource resource) throws IOException, BadRequestException, ResourceNotFoundException { - if (!(submitType.equals(SubmitType.MERGE_ALWAYS) || - submitType.equals(SubmitType.MERGE_IF_NECESSARY))) { - throw new BadRequestException( - "Submit type: " + submitType + " is not supported"); + if (!(submitType.equals(SubmitType.MERGE_ALWAYS) + || submitType.equals(SubmitType.MERGE_IF_NECESSARY))) { + throw new BadRequestException("Submit type: " + submitType + " is not supported"); } MergeableInfo result = new MergeableInfo(); result.submitType = submitType; result.strategy = strategy; try (Repository git = gitManager.openRepository(resource.getNameKey()); - RevWalk rw = new RevWalk(git); - ObjectInserter inserter = new InMemoryInserter(git)) { + RevWalk rw = new RevWalk(git); + ObjectInserter inserter = new InMemoryInserter(git)) { Merger m = MergeUtil.newMerger(git, inserter, strategy); Ref destRef = git.getRefDatabase().exactRef(resource.getRef()); @@ -104,8 +103,7 @@ public class CheckMergeability implements RestReadView { RevCommit sourceCommit = MergeUtil.resolveCommit(git, rw, source); if (!resource.getControl().canReadCommit(db.get(), git, sourceCommit)) { - throw new BadRequestException( - "do not have read permission for: " + source); + throw new BadRequestException("do not have read permission for: " + source); } if (rw.isMergedInto(sourceCommit, targetCommit)) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChildProjectResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ChildProjectResource.java index 4257825c98..f0d127d7a6 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChildProjectResource.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ChildProjectResource.java @@ -40,9 +40,7 @@ public class ChildProjectResource implements RestResource { } public boolean isDirectChild() { - ProjectState firstParent = - Iterables.getFirst(child.getProjectState().parents(), null); - return firstParent != null - && parent.getNameKey().equals(firstParent.getProject().getNameKey()); + ProjectState firstParent = Iterables.getFirst(child.getProjectState().parents(), null); + return firstParent != null && parent.getNameKey().equals(firstParent.getProject().getNameKey()); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChildProjectsCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ChildProjectsCollection.java index faba87adc0..7aa5f680fb 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChildProjectsCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ChildProjectsCollection.java @@ -24,18 +24,18 @@ import com.google.gerrit.extensions.restapi.TopLevelResource; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; @Singleton -public class ChildProjectsCollection implements - ChildCollection { +public class ChildProjectsCollection + implements ChildCollection { private final Provider list; private final ProjectsCollection projectsCollection; private final DynamicMap> views; @Inject - ChildProjectsCollection(Provider list, + ChildProjectsCollection( + Provider list, ProjectsCollection projectsCollection, DynamicMap> views) { this.list = list; @@ -44,16 +44,14 @@ public class ChildProjectsCollection implements } @Override - public ListChildProjects list() throws ResourceNotFoundException, - AuthException { + public ListChildProjects list() throws ResourceNotFoundException, AuthException { return list.get(); } @Override public ChildProjectResource parse(ProjectResource parent, IdString id) throws ResourceNotFoundException, IOException { - ProjectResource p = - projectsCollection.parse(TopLevelResource.INSTANCE, id); + ProjectResource p = projectsCollection.parse(TopLevelResource.INSTANCE, id); for (ProjectState pp : p.getControl().getProjectState().parents()) { if (parent.getNameKey().equals(pp.getProject().getNameKey())) { return new ChildProjectResource(parent, p.getControl()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/CommentLinkInfoImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/CommentLinkInfoImpl.java index ef5af206e8..35de96343e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/CommentLinkInfoImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/CommentLinkInfoImpl.java @@ -43,16 +43,15 @@ public class CommentLinkInfoImpl extends CommentLinkInfo { } } - public CommentLinkInfoImpl(String name, String match, String link, String html, - Boolean enabled) { + public CommentLinkInfoImpl(String name, String match, String link, String html, Boolean enabled) { checkArgument(name != null, "invalid commentlink.name"); - checkArgument(!Strings.isNullOrEmpty(match), - "invalid commentlink.%s.match", name); + checkArgument(!Strings.isNullOrEmpty(match), "invalid commentlink.%s.match", name); link = Strings.emptyToNull(link); html = Strings.emptyToNull(html); checkArgument( (link != null && html == null) || (link == null && html != null), - "commentlink.%s must have either link or html", name); + "commentlink.%s must have either link or html", + name); this.name = name; this.match = match; this.link = link; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/CommentLinkProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/CommentLinkProvider.java index f151b59d2f..0d2452c599 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/CommentLinkProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/CommentLinkProvider.java @@ -21,17 +21,14 @@ import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.git.ProjectConfig; import com.google.inject.Inject; import com.google.inject.Provider; - +import java.util.List; +import java.util.Set; import org.eclipse.jgit.lib.Config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.List; -import java.util.Set; - public class CommentLinkProvider implements Provider> { - private static final Logger log = - LoggerFactory.getLogger(CommentLinkProvider.class); + private static final Logger log = LoggerFactory.getLogger(CommentLinkProvider.class); private final Config cfg; @@ -43,8 +40,7 @@ public class CommentLinkProvider implements Provider> { @Override public List get() { Set subsections = cfg.getSubsections(ProjectConfig.COMMENTLINK); - List cls = - Lists.newArrayListWithCapacity(subsections.size()); + List cls = Lists.newArrayListWithCapacity(subsections.size()); for (String name : subsections) { try { CommentLinkInfoImpl cl = ProjectConfig.buildCommentLink(cfg, name, true); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/CommitIncludedIn.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/CommitIncludedIn.java index 297f138136..8d9127b00f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/CommitIncludedIn.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/CommitIncludedIn.java @@ -22,10 +22,8 @@ import com.google.gerrit.server.change.IncludedIn; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.revwalk.RevCommit; - import java.io.IOException; +import org.eclipse.jgit.revwalk.RevCommit; @Singleton class CommitIncludedIn implements RestReadView { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/CommitResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/CommitResource.java index 36186a436d..8065e0f1f8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/CommitResource.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/CommitResource.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.project; import com.google.gerrit.extensions.restapi.RestResource; import com.google.gerrit.extensions.restapi.RestView; import com.google.inject.TypeLiteral; - import org.eclipse.jgit.revwalk.RevCommit; public class CommitResource implements RestResource { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/CommitsCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/CommitsCollection.java index 3deb7d6be2..d481c014c4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/CommitsCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/CommitsCollection.java @@ -24,7 +24,7 @@ import com.google.gerrit.server.git.GitRepositoryManager; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.lib.ObjectId; @@ -32,17 +32,15 @@ import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; -import java.io.IOException; - @Singleton -public class CommitsCollection implements - ChildCollection { +public class CommitsCollection implements ChildCollection { private final DynamicMap> views; private final GitRepositoryManager repoManager; private final Provider db; @Inject - public CommitsCollection(DynamicMap> views, + public CommitsCollection( + DynamicMap> views, GitRepositoryManager repoManager, Provider db) { this.views = views; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ConfigInfoImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ConfigInfoImpl.java index a7ba2179fb..2f02728fbc 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ConfigInfoImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ConfigInfoImpl.java @@ -32,14 +32,14 @@ import com.google.gerrit.server.config.ProjectConfigEntry; import com.google.gerrit.server.extensions.webui.UiActions; import com.google.gerrit.server.git.TransferConfig; import com.google.inject.util.Providers; - import java.util.Arrays; import java.util.LinkedHashMap; import java.util.Map; import java.util.TreeMap; public class ConfigInfoImpl extends ConfigInfo { - public ConfigInfoImpl(boolean serverEnableSignedPush, + public ConfigInfoImpl( + boolean serverEnableSignedPush, ProjectControl control, TransferConfig config, DynamicMap pluginConfigEntries, @@ -50,13 +50,11 @@ public class ConfigInfoImpl extends ConfigInfo { Project p = control.getProject(); this.description = Strings.emptyToNull(p.getDescription()); - InheritedBooleanInfo useContributorAgreements = - new InheritedBooleanInfo(); + InheritedBooleanInfo useContributorAgreements = new InheritedBooleanInfo(); InheritedBooleanInfo useSignedOffBy = new InheritedBooleanInfo(); InheritedBooleanInfo useContentMerge = new InheritedBooleanInfo(); InheritedBooleanInfo requireChangeId = new InheritedBooleanInfo(); - InheritedBooleanInfo createNewChangeForAllNotInTarget = - new InheritedBooleanInfo(); + InheritedBooleanInfo createNewChangeForAllNotInTarget = new InheritedBooleanInfo(); InheritedBooleanInfo enableSignedPush = new InheritedBooleanInfo(); InheritedBooleanInfo requireSignedPush = new InheritedBooleanInfo(); InheritedBooleanInfo rejectImplicitMerges = new InheritedBooleanInfo(); @@ -65,25 +63,20 @@ public class ConfigInfoImpl extends ConfigInfo { useSignedOffBy.value = projectState.isUseSignedOffBy(); useContentMerge.value = projectState.isUseContentMerge(); requireChangeId.value = projectState.isRequireChangeID(); - createNewChangeForAllNotInTarget.value = - projectState.isCreateNewChangeForAllNotInTarget(); + createNewChangeForAllNotInTarget.value = projectState.isCreateNewChangeForAllNotInTarget(); - useContributorAgreements.configuredValue = - p.getUseContributorAgreements(); + useContributorAgreements.configuredValue = p.getUseContributorAgreements(); useSignedOffBy.configuredValue = p.getUseSignedOffBy(); useContentMerge.configuredValue = p.getUseContentMerge(); requireChangeId.configuredValue = p.getRequireChangeID(); - createNewChangeForAllNotInTarget.configuredValue = - p.getCreateNewChangeForAllNotInTarget(); + createNewChangeForAllNotInTarget.configuredValue = p.getCreateNewChangeForAllNotInTarget(); enableSignedPush.configuredValue = p.getEnableSignedPush(); requireSignedPush.configuredValue = p.getRequireSignedPush(); rejectImplicitMerges.configuredValue = p.getRejectImplicitMerges(); - ProjectState parentState = Iterables.getFirst(projectState - .parents(), null); + ProjectState parentState = Iterables.getFirst(projectState.parents(), null); if (parentState != null) { - useContributorAgreements.inheritedValue = - parentState.isUseContributorAgreements(); + useContributorAgreements.inheritedValue = parentState.isUseContributorAgreements(); useSignedOffBy.inheritedValue = parentState.isUseSignedOffBy(); useContentMerge.inheritedValue = parentState.isUseContentMerge(); requireChangeId.inheritedValue = parentState.isRequireChangeID(); @@ -107,16 +100,18 @@ public class ConfigInfoImpl extends ConfigInfo { MaxObjectSizeLimitInfo maxObjectSizeLimit = new MaxObjectSizeLimitInfo(); maxObjectSizeLimit.value = - config.getEffectiveMaxObjectSizeLimit(projectState) == config - .getMaxObjectSizeLimit() ? config - .getFormattedMaxObjectSizeLimit() : p.getMaxObjectSizeLimit(); + config.getEffectiveMaxObjectSizeLimit(projectState) == config.getMaxObjectSizeLimit() + ? config.getFormattedMaxObjectSizeLimit() + : p.getMaxObjectSizeLimit(); maxObjectSizeLimit.configuredValue = p.getMaxObjectSizeLimit(); - maxObjectSizeLimit.inheritedValue = - config.getFormattedMaxObjectSizeLimit(); + maxObjectSizeLimit.inheritedValue = config.getFormattedMaxObjectSizeLimit(); this.maxObjectSizeLimit = maxObjectSizeLimit; this.submitType = p.getSubmitType(); - this.state = p.getState() != com.google.gerrit.extensions.client.ProjectState.ACTIVE ? p.getState() : null; + this.state = + p.getState() != com.google.gerrit.extensions.client.ProjectState.ACTIVE + ? p.getState() + : null; this.commentlinks = new LinkedHashMap<>(); for (CommentLinkInfo cl : projectState.getCommentLinks()) { @@ -124,26 +119,25 @@ public class ConfigInfoImpl extends ConfigInfo { } pluginConfig = - getPluginConfig(control.getProjectState(), pluginConfigEntries, - cfgFactory, allProjects); + getPluginConfig(control.getProjectState(), pluginConfigEntries, cfgFactory, allProjects); actions = new TreeMap<>(); - for (UiAction.Description d : UiActions.from( - views, new ProjectResource(control), - Providers.of(control.getUser()))) { + for (UiAction.Description d : + UiActions.from(views, new ProjectResource(control), Providers.of(control.getUser()))) { actions.put(d.getId(), new ActionInfo(d)); } this.theme = projectState.getTheme(); } private Map> getPluginConfig( - ProjectState project, DynamicMap pluginConfigEntries, - PluginConfigFactory cfgFactory, AllProjectsName allProjects) { + ProjectState project, + DynamicMap pluginConfigEntries, + PluginConfigFactory cfgFactory, + AllProjectsName allProjects) { TreeMap> pluginConfig = new TreeMap<>(); for (Entry e : pluginConfigEntries) { ProjectConfigEntry configEntry = e.getProvider().get(); - PluginConfig cfg = - cfgFactory.getFromProjectConfig(project, e.getPluginName()); + PluginConfig cfg = cfgFactory.getFromProjectConfig(project, e.getPluginName()); String configuredValue = cfg.getString(e.getExportName()); ConfigParameterInfo p = new ConfigParameterInfo(); p.displayName = configEntry.getDisplayName(); @@ -152,25 +146,25 @@ public class ConfigInfoImpl extends ConfigInfo { p.type = configEntry.getType(); p.permittedValues = configEntry.getPermittedValues(); p.editable = configEntry.isEditable(project) ? true : null; - if (configEntry.isInheritable() - && !allProjects.equals(project.getProject().getNameKey())) { + if (configEntry.isInheritable() && !allProjects.equals(project.getProject().getNameKey())) { PluginConfig cfgWithInheritance = - cfgFactory.getFromProjectConfigWithInheritance(project, - e.getPluginName()); + cfgFactory.getFromProjectConfigWithInheritance(project, e.getPluginName()); p.inheritable = true; - p.value = configEntry.onRead(project, - cfgWithInheritance.getString(e.getExportName(), - configEntry.getDefaultValue())); + p.value = + configEntry.onRead( + project, + cfgWithInheritance.getString(e.getExportName(), configEntry.getDefaultValue())); p.configuredValue = configuredValue; p.inheritedValue = getInheritedValue(project, cfgFactory, e); } else { if (configEntry.getType() == ProjectConfigEntryType.ARRAY) { - p.values = configEntry.onRead(project, - Arrays.asList(cfg.getStringList(e.getExportName()))); + p.values = + configEntry.onRead(project, Arrays.asList(cfg.getStringList(e.getExportName()))); } else { - p.value = configEntry.onRead(project, configuredValue != null - ? configuredValue - : configEntry.getDefaultValue()); + p.value = + configEntry.onRead( + project, + configuredValue != null ? configuredValue : configEntry.getDefaultValue()); } } Map pc = pluginConfig.get(e.getPluginName()); @@ -183,18 +177,16 @@ public class ConfigInfoImpl extends ConfigInfo { return !pluginConfig.isEmpty() ? pluginConfig : null; } - private String getInheritedValue(ProjectState project, - PluginConfigFactory cfgFactory, Entry e) { + private String getInheritedValue( + ProjectState project, PluginConfigFactory cfgFactory, Entry e) { ProjectConfigEntry configEntry = e.getProvider().get(); ProjectState parent = Iterables.getFirst(project.parents(), null); String inheritedValue = configEntry.getDefaultValue(); if (parent != null) { PluginConfig parentCfgWithInheritance = - cfgFactory.getFromProjectConfigWithInheritance(parent, - e.getPluginName()); + cfgFactory.getFromProjectConfigWithInheritance(parent, e.getPluginName()); inheritedValue = - parentCfgWithInheritance.getString(e.getExportName(), - configEntry.getDefaultValue()); + parentCfgWithInheritance.getString(e.getExportName(), configEntry.getDefaultValue()); } return inheritedValue; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateBranch.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateBranch.java index c7b29228c4..5919ba1871 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateBranch.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateBranch.java @@ -30,7 +30,7 @@ import com.google.gerrit.server.util.MagicBranch; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; - +import java.io.IOException; import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectId; @@ -42,8 +42,6 @@ import org.eclipse.jgit.transport.ReceiveCommand; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; - public class CreateBranch implements RestModifyView { private static final Logger log = LoggerFactory.getLogger(CreateBranch.class); @@ -59,7 +57,8 @@ public class CreateBranch implements RestModifyView identifiedUser, + CreateBranch( + Provider identifiedUser, GitRepositoryManager repoManager, Provider db, GitReferenceUpdated referenceUpdated, @@ -69,15 +68,13 @@ public class CreateBranch implements RestModifyView { public interface Factory { CreateProject create(String name); } - private static final Logger log = LoggerFactory - .getLogger(CreateProject.class); + private static final Logger log = LoggerFactory.getLogger(CreateProject.class); private final Provider projectsCollection; private final Provider groupsCollection; @@ -109,8 +106,10 @@ public class CreateProject implements RestModifyView projectsCollection, - Provider groupsCollection, ProjectJson json, + CreateProject( + Provider projectsCollection, + Provider groupsCollection, + ProjectJson json, DynamicSet projectCreationValidationListeners, ProjectControl.GenericFactory projectControlFactory, GitRepositoryManager repoManager, @@ -147,10 +146,9 @@ public class CreateProject implements RestModifyView apply(TopLevelResource resource, - ProjectInput input) throws BadRequestException, - UnprocessableEntityException, ResourceConflictException, - ResourceNotFoundException, IOException, ConfigInvalidException { + public Response apply(TopLevelResource resource, ProjectInput input) + throws BadRequestException, UnprocessableEntityException, ResourceConflictException, + ResourceNotFoundException, IOException, ConfigInvalidException { if (input == null) { input = new ProjectInput(); } @@ -161,44 +159,36 @@ public class CreateProject implements RestModifyView(projectOwnerGroups.create(args.getProject()).get()); + args.ownerIds = new ArrayList<>(projectOwnerGroups.create(args.getProject()).get()); } else { - args.ownerIds = - Lists.newArrayListWithCapacity(input.owners.size()); + args.ownerIds = Lists.newArrayListWithCapacity(input.owners.size()); for (String owner : input.owners) { args.ownerIds.add(groupsCollection.get().parse(owner).getGroupUUID()); } } args.contributorAgreements = - MoreObjects.firstNonNull(input.useContributorAgreements, - InheritableBoolean.INHERIT); - args.signedOffBy = - MoreObjects.firstNonNull(input.useSignedOffBy, - InheritableBoolean.INHERIT); + MoreObjects.firstNonNull(input.useContributorAgreements, InheritableBoolean.INHERIT); + args.signedOffBy = MoreObjects.firstNonNull(input.useSignedOffBy, InheritableBoolean.INHERIT); args.contentMerge = input.submitType == SubmitType.FAST_FORWARD_ONLY - ? InheritableBoolean.FALSE : MoreObjects.firstNonNull( - input.useContentMerge, - InheritableBoolean.INHERIT); + ? InheritableBoolean.FALSE + : MoreObjects.firstNonNull(input.useContentMerge, InheritableBoolean.INHERIT); args.newChangeForAllNotInTarget = - MoreObjects.firstNonNull(input.createNewChangeForAllNotInTarget, - InheritableBoolean.INHERIT); + MoreObjects.firstNonNull( + input.createNewChangeForAllNotInTarget, InheritableBoolean.INHERIT); args.changeIdRequired = MoreObjects.firstNonNull(input.requireChangeId, InheritableBoolean.INHERIT); try { - args.maxObjectSizeLimit = - ProjectConfig.validMaxObjectSizeLimit(input.maxObjectSizeLimit); + args.maxObjectSizeLimit = ProjectConfig.validMaxObjectSizeLimit(input.maxObjectSizeLimit); } catch (ConfigInvalidException e) { throw new BadRequestException(e.getMessage()); } @@ -215,8 +205,8 @@ public class CreateProject implements RestModifyView normalizeBranchNames(List branches) - throws BadRequestException { + private List normalizeBranchNames(List branches) throws BadRequestException { if (branches == null || branches.isEmpty()) { return Collections.singletonList(Constants.R_HEADS + Constants.MASTER); } @@ -326,8 +311,7 @@ public class CreateProject implements RestModifyView refs) throws IOException { + private void createEmptyCommits(Repository repo, Project.NameKey project, List refs) + throws IOException { try (ObjectInserter oi = repo.newObjectInserter()) { CommitBuilder cb = new CommitBuilder(); cb.setTreeId(oi.insert(Constants.OBJ_TREE, new byte[] {})); @@ -354,8 +338,8 @@ public class CreateProject implements RestModifyView { private static final Logger log = LoggerFactory.getLogger(CreateTag.class); @@ -65,7 +63,8 @@ public class CreateTag implements RestModifyView { private String ref; @Inject - CreateTag(Provider identifiedUser, + CreateTag( + Provider identifiedUser, GitRepositoryManager repoManager, TagCache tagCache, GitReferenceUpdated referenceUpdated, @@ -94,45 +93,45 @@ public class CreateTag implements RestModifyView { RefControl refControl = resource.getControl().controlForRef(ref); try (Repository repo = repoManager.openRepository(resource.getNameKey())) { - ObjectId revid = RefUtil.parseBaseRevision( - repo, resource.getNameKey(), input.revision); + ObjectId revid = RefUtil.parseBaseRevision(repo, resource.getNameKey(), input.revision); RevWalk rw = RefUtil.verifyConnected(repo, revid); RevObject object = rw.parseAny(revid); rw.reset(); boolean isAnnotated = Strings.emptyToNull(input.message) != null; - boolean isSigned = isAnnotated - && input.message.contains("-----BEGIN PGP SIGNATURE-----\n"); + boolean isSigned = isAnnotated && input.message.contains("-----BEGIN PGP SIGNATURE-----\n"); if (isSigned) { - throw new MethodNotAllowedException( - "Cannot create signed tag \"" + ref + "\""); + throw new MethodNotAllowedException("Cannot create signed tag \"" + ref + "\""); } else if (isAnnotated && !refControl.canPerform(Permission.CREATE_TAG)) { throw new AuthException("Cannot create annotated tag \"" + ref + "\""); } else if (!refControl.canPerform(Permission.CREATE)) { throw new AuthException("Cannot create tag \"" + ref + "\""); } if (repo.getRefDatabase().exactRef(ref) != null) { - throw new ResourceConflictException( - "tag \"" + ref + "\" already exists"); + throw new ResourceConflictException("tag \"" + ref + "\" already exists"); } try (Git git = new Git(repo)) { - TagCommand tag = git.tag() - .setObjectId(object) - .setName(ref.substring(R_TAGS.length())) - .setAnnotated(isAnnotated) - .setSigned(isSigned); + TagCommand tag = + git.tag() + .setObjectId(object) + .setName(ref.substring(R_TAGS.length())) + .setAnnotated(isAnnotated) + .setSigned(isSigned); if (isAnnotated) { tag.setMessage(input.message) - .setTagger(identifiedUser.get() - .newCommitterIdent(TimeUtil.nowTs(), TimeZone.getDefault())); + .setTagger( + identifiedUser.get().newCommitterIdent(TimeUtil.nowTs(), TimeZone.getDefault())); } Ref result = tag.call(); - tagCache.updateFastForward(resource.getNameKey(), ref, - ObjectId.zeroId(), result.getObjectId()); - referenceUpdated.fire(resource.getNameKey(), ref, - ObjectId.zeroId(), result.getObjectId(), + tagCache.updateFastForward( + resource.getNameKey(), ref, ObjectId.zeroId(), result.getObjectId()); + referenceUpdated.fire( + resource.getNameKey(), + ref, + ObjectId.zeroId(), + result.getObjectId(), identifiedUser.get().getAccount()); try (RevWalk w = new RevWalk(repo)) { return ListTags.createTagInfo(result, w); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/DashboardResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/DashboardResource.java index 099350d439..a3fd09ee28 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/DashboardResource.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/DashboardResource.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.project; import com.google.gerrit.extensions.restapi.RestResource; import com.google.gerrit.extensions.restapi.RestView; import com.google.inject.TypeLiteral; - import org.eclipse.jgit.lib.Config; public class DashboardResource implements RestResource { @@ -34,7 +33,8 @@ public class DashboardResource implements RestResource { private final Config config; private final boolean projectDefault; - public DashboardResource(ProjectControl control, + public DashboardResource( + ProjectControl control, String refName, String pathName, Config config, diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/DashboardsCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/DashboardsCollection.java index a20c51ed12..44d3b5cd43 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/DashboardsCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/DashboardsCollection.java @@ -38,7 +38,9 @@ import com.google.gson.annotations.SerializedName; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import org.eclipse.jgit.errors.AmbiguousObjectException; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.IncorrectObjectTypeException; @@ -48,21 +50,17 @@ import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - @Singleton -class DashboardsCollection implements - ChildCollection, - AcceptsCreate { +class DashboardsCollection + implements ChildCollection, AcceptsCreate { private final GitRepositoryManager gitManager; private final DynamicMap> views; private final Provider list; private final Provider createDefault; @Inject - DashboardsCollection(GitRepositoryManager gitManager, + DashboardsCollection( + GitRepositoryManager gitManager, DynamicMap> views, Provider list, Provider createDefault) { @@ -79,8 +77,8 @@ class DashboardsCollection implements @SuppressWarnings("unchecked") @Override - public RestModifyView create(ProjectResource parent, - IdString id) throws RestApiException { + public RestModifyView create(ProjectResource parent, IdString id) + throws RestApiException { if (id.toString().equals("default")) { return createDefault.get(); } @@ -95,8 +93,7 @@ class DashboardsCollection implements return DashboardResource.projectDefault(myCtl); } - List parts = Lists.newArrayList( - Splitter.on(':').limit(2).split(id.get())); + List parts = Lists.newArrayList(Splitter.on(':').limit(2).split(id.get())); if (parts.size() != 2) { throw new ResourceNotFoundException(id); } @@ -107,8 +104,7 @@ class DashboardsCollection implements for (ProjectState ps : myCtl.getProjectState().tree()) { try { return parse(ps.controlFor(user), ref, path, myCtl); - } catch (AmbiguousObjectException | ConfigInvalidException - | IncorrectObjectTypeException e) { + } catch (AmbiguousObjectException | ConfigInvalidException | IncorrectObjectTypeException e) { throw new ResourceNotFoundException(id); } catch (ResourceNotFoundException e) { continue; @@ -117,16 +113,14 @@ class DashboardsCollection implements throw new ResourceNotFoundException(id); } - private DashboardResource parse(ProjectControl ctl, String ref, String path, - ProjectControl myCtl) + private DashboardResource parse(ProjectControl ctl, String ref, String path, ProjectControl myCtl) throws ResourceNotFoundException, IOException, AmbiguousObjectException, IncorrectObjectTypeException, ConfigInvalidException { String id = ref + ":" + path; if (!ref.startsWith(REFS_DASHBOARDS)) { ref = REFS_DASHBOARDS + ref; } - if (!Repository.isValidRefName(ref) - || !ctl.controlForRef(ref).canRead()) { + if (!Repository.isValidRefName(ref) || !ctl.controlForRef(ref).canRead()) { throw new ResourceNotFoundException(id); } @@ -147,8 +141,13 @@ class DashboardsCollection implements return views; } - static DashboardInfo parse(Project definingProject, String refName, - String path, Config config, String project, boolean setDefault) { + static DashboardInfo parse( + Project definingProject, + String refName, + String path, + Config config, + String project, + boolean setDefault) { DashboardInfo info = new DashboardInfo(refName, path); info.project = project; info.definingProject = definingProject.getName(); @@ -184,9 +183,9 @@ class DashboardsCollection implements } private static String defaultOf(Project proj) { - final String defaultId = MoreObjects.firstNonNull( - proj.getLocalDefaultDashboard(), - Strings.nullToEmpty(proj.getDefaultDashboard())); + final String defaultId = + MoreObjects.firstNonNull( + proj.getLocalDefaultDashboard(), Strings.nullToEmpty(proj.getDefaultDashboard())); if (defaultId.startsWith(REFS_DASHBOARDS)) { return defaultId.substring(REFS_DASHBOARDS.length()); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranch.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranch.java index e9741efb29..4601bfe5e3 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranch.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranch.java @@ -25,20 +25,17 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; @Singleton public class DeleteBranch implements RestModifyView { - public static class Input { - } + public static class Input {} private final Provider queryProvider; private final DeleteRef.Factory deleteRefFactory; @Inject - DeleteBranch(Provider queryProvider, - DeleteRef.Factory deleteRefFactory) { + DeleteBranch(Provider queryProvider, DeleteRef.Factory deleteRefFactory) { this.queryProvider = queryProvider; this.deleteRefFactory = deleteRefFactory; } @@ -50,10 +47,8 @@ public class DeleteBranch implements RestModifyView { throw new AuthException("Cannot delete branch"); } - if (!queryProvider.get().setLimit(1) - .byBranchOpen(rsrc.getBranchKey()).isEmpty()) { - throw new ResourceConflictException("branch " + rsrc.getBranchKey() - + " has open changes"); + if (!queryProvider.get().setLimit(1).byBranchOpen(rsrc.getBranchKey()).isEmpty()) { + throw new ResourceConflictException("branch " + rsrc.getBranchKey() + " has open changes"); } deleteRefFactory.create(rsrc).ref(rsrc.getRef()).delete(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranches.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranches.java index 07e50323e1..f5e55b1bd7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranches.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranches.java @@ -22,12 +22,10 @@ import com.google.gerrit.extensions.restapi.RestModifyView; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.io.IOException; @Singleton -public class DeleteBranches - implements RestModifyView { +public class DeleteBranches implements RestModifyView { private final DeleteRef.Factory deleteRefFactory; @Inject diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteDashboard.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteDashboard.java index 7702b7dae6..a9dd253283 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteDashboard.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteDashboard.java @@ -25,7 +25,6 @@ import com.google.gerrit.server.project.DashboardsCollection.DashboardInfo; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; @Singleton @@ -40,7 +39,7 @@ class DeleteDashboard implements RestModifyView apply(DashboardResource resource, SetDashboard.Input input) throws AuthException, BadRequestException, ResourceConflictException, - ResourceNotFoundException, MethodNotAllowedException, IOException { + ResourceNotFoundException, MethodNotAllowedException, IOException { if (resource.isProjectDefault()) { SetDashboard.Input in = new SetDashboard.Input(); in.commitMessage = input != null ? input.commitMessage : null; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteRef.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteRef.java index adff11bbcd..943bdc40c8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteRef.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteRef.java @@ -28,7 +28,10 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; import org.eclipse.jgit.errors.LockFailedException; import org.eclipse.jgit.lib.BatchRefUpdate; import org.eclipse.jgit.lib.NullProgressMonitor; @@ -42,11 +45,6 @@ import org.eclipse.jgit.transport.ReceiveCommand.Result; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - public class DeleteRef { private static final Logger log = LoggerFactory.getLogger(DeleteRef.class); @@ -67,7 +65,8 @@ public class DeleteRef { } @AssistedInject - DeleteRef(Provider identifiedUser, + DeleteRef( + Provider identifiedUser, GitRepositoryManager repoManager, GitReferenceUpdated referenceUpdated, RefValidationHelper.Factory refDeletionValidatorFactory, @@ -97,8 +96,7 @@ public class DeleteRef { return this; } - public void delete() - throws OrmException, IOException, ResourceConflictException { + public void delete() throws OrmException, IOException, ResourceConflictException { if (!refsToDelete.isEmpty()) { try (Repository r = repoManager.openRepository(resource.getNameKey())) { if (refsToDelete.size() == 1) { @@ -110,8 +108,7 @@ public class DeleteRef { } } - private void deleteSingleRef(Repository r) - throws IOException, ResourceConflictException { + private void deleteSingleRef(Repository r) throws IOException, ResourceConflictException { String ref = refsToDelete.get(0); if (prefix != null && !ref.startsWith(prefix)) { ref = prefix + ref; @@ -119,10 +116,9 @@ public class DeleteRef { RefUpdate.Result result; RefUpdate u = r.updateRef(ref); u.setForceUpdate(true); - refDeletionValidator.validateRefOperation( - ref, identifiedUser.get(), u); + refDeletionValidator.validateRefOperation(ref, identifiedUser.get(), u); int remainingLockFailureCalls = MAX_LOCK_FAILURE_CALLS; - for (;;) { + for (; ; ) { try { result = u.delete(); } catch (LockFailedException e) { @@ -131,8 +127,7 @@ public class DeleteRef { log.error("Cannot delete " + ref, e); throw e; } - if (result == RefUpdate.Result.LOCK_FAILURE - && --remainingLockFailureCalls > 0) { + if (result == RefUpdate.Result.LOCK_FAILURE && --remainingLockFailureCalls > 0) { try { Thread.sleep(SLEEP_ON_LOCK_FAILURE_MS); } catch (InterruptedException ie) { @@ -148,7 +143,10 @@ public class DeleteRef { case NO_CHANGE: case FAST_FORWARD: case FORCED: - referenceUpdated.fire(resource.getNameKey(), u, ReceiveCommand.Type.DELETE, + referenceUpdated.fire( + resource.getNameKey(), + u, + ReceiveCommand.Type.DELETE, identifiedUser.get().getAccount()); break; @@ -170,12 +168,13 @@ public class DeleteRef { private void deleteMultipleRefs(Repository r) throws OrmException, IOException, ResourceConflictException { BatchRefUpdate batchUpdate = r.getRefDatabase().newBatchUpdate(); - List refs = prefix == null - ? refsToDelete - : refsToDelete.stream().map( - ref -> ref.startsWith(prefix) - ? ref - : prefix + ref).collect(Collectors.toList()); + List refs = + prefix == null + ? refsToDelete + : refsToDelete + .stream() + .map(ref -> ref.startsWith(prefix) ? ref : prefix + ref) + .collect(Collectors.toList()); for (String ref : refs) { batchUpdate.addCommand(createDeleteCommand(resource, r, ref)); } @@ -195,28 +194,27 @@ public class DeleteRef { } } - private ReceiveCommand createDeleteCommand(ProjectResource project, - Repository r, String refName) - throws OrmException, IOException, ResourceConflictException { + private ReceiveCommand createDeleteCommand(ProjectResource project, Repository r, String refName) + throws OrmException, IOException, ResourceConflictException { Ref ref = r.getRefDatabase().getRef(refName); ReceiveCommand command; if (ref == null) { command = new ReceiveCommand(ObjectId.zeroId(), ObjectId.zeroId(), refName); - command.setResult(Result.REJECTED_OTHER_REASON, + command.setResult( + Result.REJECTED_OTHER_REASON, "it doesn't exist or you do not have permission to delete it"); return command; } - command = new ReceiveCommand( - ref.getObjectId(), ObjectId.zeroId(), ref.getName()); + command = new ReceiveCommand(ref.getObjectId(), ObjectId.zeroId(), ref.getName()); if (!project.getControl().controlForRef(refName).canDelete()) { - command.setResult(Result.REJECTED_OTHER_REASON, + command.setResult( + Result.REJECTED_OTHER_REASON, "it doesn't exist or you do not have permission to delete it"); } if (!refName.startsWith(R_TAGS)) { - Branch.NameKey branchKey = - new Branch.NameKey(project.getNameKey(), ref.getName()); + Branch.NameKey branchKey = new Branch.NameKey(project.getNameKey(), ref.getName()); if (!queryProvider.get().setLimit(1).byBranchOpen(branchKey).isEmpty()) { command.setResult(Result.REJECTED_OTHER_REASON, "it has open changes"); } @@ -224,18 +222,15 @@ public class DeleteRef { RefUpdate u = r.updateRef(refName); u.setForceUpdate(true); - refDeletionValidator.validateRefOperation( - project.getName(), identifiedUser.get(), u); + refDeletionValidator.validateRefOperation(project.getName(), identifiedUser.get(), u); return command; } - private void appendAndLogErrorMessage(StringBuilder errorMessages, - ReceiveCommand cmd) { + private void appendAndLogErrorMessage(StringBuilder errorMessages, ReceiveCommand cmd) { String msg = null; switch (cmd.getResult()) { case REJECTED_CURRENT_BRANCH: - msg = format("Cannot delete %s: it is the current branch", - cmd.getRefName()); + msg = format("Cannot delete %s: it is the current branch", cmd.getRefName()); break; case REJECTED_OTHER_REASON: msg = format("Cannot delete %s: %s", cmd.getRefName(), cmd.getMessage()); @@ -257,7 +252,6 @@ public class DeleteRef { } private void postDeletion(ProjectResource project, ReceiveCommand cmd) { - referenceUpdated.fire(project.getNameKey(), cmd, - identifiedUser.get().getAccount()); + referenceUpdated.fire(project.getNameKey(), cmd, identifiedUser.get().getAccount()); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteTag.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteTag.java index bcc433b027..f26d40fec0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteTag.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteTag.java @@ -21,15 +21,13 @@ import com.google.gerrit.extensions.restapi.RestModifyView; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.io.IOException; @Singleton public class DeleteTag implements RestModifyView { private final DeleteRef.Factory deleteRefFactory; - public static class Input { - } + public static class Input {} @Inject DeleteTag(DeleteRef.Factory deleteRefFactory) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteTags.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteTags.java index 813012b5c9..75cf03f9ad 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteTags.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteTags.java @@ -24,12 +24,10 @@ import com.google.gerrit.extensions.restapi.RestModifyView; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.io.IOException; @Singleton -public class DeleteTags - implements RestModifyView { +public class DeleteTags implements RestModifyView { private final DeleteRef.Factory deleteRefFactory; @Inject diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/FileResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/FileResource.java index 82ea1551c9..43b849ff14 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/FileResource.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/FileResource.java @@ -20,24 +20,21 @@ import com.google.gerrit.extensions.restapi.RestResource; import com.google.gerrit.extensions.restapi.RestView; import com.google.gerrit.server.git.GitRepositoryManager; import com.google.inject.TypeLiteral; - +import java.io.IOException; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevTree; import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.treewalk.TreeWalk; -import java.io.IOException; - public class FileResource implements RestResource { public static final TypeLiteral> FILE_KIND = new TypeLiteral>() {}; - public static FileResource create(GitRepositoryManager repoManager, - ProjectControl project, ObjectId rev, String path) - throws ResourceNotFoundException, IOException { - try (Repository repo = - repoManager.openRepository(project.getProject().getNameKey()); + public static FileResource create( + GitRepositoryManager repoManager, ProjectControl project, ObjectId rev, String path) + throws ResourceNotFoundException, IOException { + try (Repository repo = repoManager.openRepository(project.getProject().getNameKey()); RevWalk rw = new RevWalk(repo)) { RevTree tree = rw.parseTree(rev); if (TreeWalk.forPath(repo, path, tree) != null) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/FilesCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/FilesCollection.java index dcb8747886..8d462a14fa 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/FilesCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/FilesCollection.java @@ -22,20 +22,16 @@ import com.google.gerrit.extensions.restapi.RestView; import com.google.gerrit.server.git.GitRepositoryManager; import com.google.inject.Inject; import com.google.inject.Singleton; - +import java.io.IOException; import org.eclipse.jgit.lib.ObjectId; -import java.io.IOException; - @Singleton -public class FilesCollection implements - ChildCollection { +public class FilesCollection implements ChildCollection { private final DynamicMap> views; private final GitRepositoryManager repoManager; @Inject - FilesCollection(DynamicMap> views, - GitRepositoryManager repoManager) { + FilesCollection(DynamicMap> views, GitRepositoryManager repoManager) { this.views = views; this.repoManager = repoManager; } @@ -48,8 +44,8 @@ public class FilesCollection implements @Override public FileResource parse(BranchResource parent, IdString id) throws ResourceNotFoundException, IOException { - return FileResource.create(repoManager, parent.getControl(), - ObjectId.fromString(parent.getRevision()), id.get()); + return FileResource.create( + repoManager, parent.getControl(), ObjectId.fromString(parent.getRevision()), id.get()); } @Override diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/FilesInCommitCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/FilesInCommitCollection.java index 0f44a48b03..807ac53953 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/FilesInCommitCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/FilesInCommitCollection.java @@ -23,18 +23,16 @@ import com.google.gerrit.reviewdb.client.Patch; import com.google.gerrit.server.git.GitRepositoryManager; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.io.IOException; @Singleton -public class FilesInCommitCollection implements - ChildCollection { +public class FilesInCommitCollection implements ChildCollection { private final DynamicMap> views; private final GitRepositoryManager repoManager; @Inject - FilesInCommitCollection(DynamicMap> views, - GitRepositoryManager repoManager) { + FilesInCommitCollection( + DynamicMap> views, GitRepositoryManager repoManager) { this.views = views; this.repoManager = repoManager; } @@ -48,11 +46,9 @@ public class FilesInCommitCollection implements public FileResource parse(CommitResource parent, IdString id) throws ResourceNotFoundException, IOException { if (Patch.isMagic(id.get())) { - return new FileResource(parent.getProject(), parent.getCommit(), - id.get()); + return new FileResource(parent.getProject(), parent.getCommit(), id.get()); } - return FileResource.create(repoManager, parent.getProject(), - parent.getCommit(), id.get()); + return FileResource.create(repoManager, parent.getProject(), parent.getCommit(), id.get()); } @Override diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GarbageCollect.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GarbageCollect.java index 3b501290c9..654ce698f7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GarbageCollect.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/GarbageCollect.java @@ -34,7 +34,6 @@ import com.google.gerrit.server.util.IdGenerator; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; @@ -43,8 +42,8 @@ import java.util.Collections; @RequiresCapability(GlobalCapability.RUN_GC) @Singleton -public class GarbageCollect implements RestModifyView, - UiAction { +public class GarbageCollect + implements RestModifyView, UiAction { public static class Input { public boolean showProgress; public boolean aggressive; @@ -57,8 +56,10 @@ public class GarbageCollect implements RestModifyView, private final Provider canonicalUrl; @Inject - GarbageCollect(GitRepositoryManager repoManager, - GarbageCollection.Factory garbageCollectionFactory, WorkQueue workQueue, + GarbageCollect( + GitRepositoryManager repoManager, + GarbageCollection.Factory garbageCollectionFactory, + WorkQueue workQueue, @CanonicalWebUrl Provider canonicalUrl) { this.workQueue = workQueue; this.canonicalUrl = canonicalUrl; @@ -76,42 +77,43 @@ public class GarbageCollect implements RestModifyView, } private Response.Accepted applyAsync(final Project.NameKey project, final Input input) { - Runnable job = new Runnable() { - @Override - public void run() { - runGC(project, input, null); - } + Runnable job = + new Runnable() { + @Override + public void run() { + runGC(project, input, null); + } - @Override - public String toString() { - return "Run " + (input.aggressive ? "aggressive " : "") - + "garbage collection on project " + project.get(); - } - }; + @Override + public String toString() { + return "Run " + + (input.aggressive ? "aggressive " : "") + + "garbage collection on project " + + project.get(); + } + }; @SuppressWarnings("unchecked") - WorkQueue.Task task = - (WorkQueue.Task) workQueue.getDefaultQueue().submit(job); + WorkQueue.Task task = (WorkQueue.Task) workQueue.getDefaultQueue().submit(job); - String location = canonicalUrl.get() + "a/config/server/tasks/" - + IdGenerator.format(task.getTaskId()); + String location = + canonicalUrl.get() + "a/config/server/tasks/" + IdGenerator.format(task.getTaskId()); return Response.accepted(location); } @SuppressWarnings("resource") - private BinaryResult applySync(final Project.NameKey project, - final Input input) { + private BinaryResult applySync(final Project.NameKey project, final Input input) { return new BinaryResult() { @Override public void writeTo(OutputStream out) throws IOException { - PrintWriter writer = new PrintWriter( - new OutputStreamWriter(out, UTF_8)) { - @Override - public void println() { - write('\n'); - } - }; + PrintWriter writer = + new PrintWriter(new OutputStreamWriter(out, UTF_8)) { + @Override + public void println() { + write('\n'); + } + }; try { PrintWriter progressWriter = input.showProgress ? writer : null; GarbageCollectionResult result = runGC(project, input, progressWriter); @@ -123,16 +125,24 @@ public class GarbageCollect implements RestModifyView, msg = "Error: project \"" + e.getProjectName() + "\" not found."; break; case GC_ALREADY_SCHEDULED: - msg = "Error: garbage collection for project \"" - + e.getProjectName() + "\" was already scheduled."; + msg = + "Error: garbage collection for project \"" + + e.getProjectName() + + "\" was already scheduled."; break; case GC_FAILED: - msg = "Error: garbage collection for project \"" + e.getProjectName() - + "\" failed."; + msg = + "Error: garbage collection for project \"" + + e.getProjectName() + + "\" failed."; break; default: - msg = "Error: garbage collection for project \"" + e.getProjectName() - + "\" failed: " + e.getType() + "."; + msg = + "Error: garbage collection for project \"" + + e.getProjectName() + + "\" failed: " + + e.getType() + + "."; } } } @@ -141,16 +151,13 @@ public class GarbageCollect implements RestModifyView, writer.flush(); } } - }.setContentType("text/plain") - .setCharacterEncoding(UTF_8) - .disableGzip(); + }.setContentType("text/plain").setCharacterEncoding(UTF_8).disableGzip(); } - GarbageCollectionResult runGC(Project.NameKey project, - Input input, PrintWriter progressWriter) { - return garbageCollectionFactory.create().run( - Collections.singletonList(project), input.aggressive, - progressWriter); + GarbageCollectionResult runGC(Project.NameKey project, Input input, PrintWriter progressWriter) { + return garbageCollectionFactory + .create() + .run(Collections.singletonList(project), input.aggressive, progressWriter); } @Override diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetAccess.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetAccess.java index 8effe443f9..6d95868056 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetAccess.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetAccess.java @@ -41,24 +41,26 @@ import com.google.gerrit.server.git.ProjectConfig; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.errors.RepositoryNotFoundException; - import java.io.IOException; import java.util.HashMap; import java.util.HashSet; import java.util.Map; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.errors.RepositoryNotFoundException; @Singleton public class GetAccess implements RestReadView { - public static final BiMap ACTION_TYPE = ImmutableBiMap.of( - PermissionRule.Action.ALLOW, PermissionRuleInfo.Action.ALLOW, - PermissionRule.Action.BATCH, PermissionRuleInfo.Action.BATCH, - PermissionRule.Action.BLOCK, PermissionRuleInfo.Action.BLOCK, - PermissionRule.Action.DENY, PermissionRuleInfo.Action.DENY, + public static final BiMap ACTION_TYPE = + ImmutableBiMap.of( + PermissionRule.Action.ALLOW, + PermissionRuleInfo.Action.ALLOW, + PermissionRule.Action.BATCH, + PermissionRuleInfo.Action.BATCH, + PermissionRule.Action.BLOCK, + PermissionRuleInfo.Action.BLOCK, + PermissionRule.Action.DENY, + PermissionRuleInfo.Action.DENY, PermissionRule.Action.INTERACTIVE, PermissionRuleInfo.Action.INTERACTIVE); @@ -72,7 +74,8 @@ public class GetAccess implements RestReadView { private final GroupBackend groupBackend; @Inject - public GetAccess(Provider self, + public GetAccess( + Provider self, GroupControl.Factory groupControlFactory, AllProjectsName allProjectsName, ProjectCache projectCache, @@ -93,8 +96,7 @@ public class GetAccess implements RestReadView { public ProjectAccessInfo apply(Project.NameKey nameKey) throws ResourceNotFoundException, ResourceConflictException, IOException { try { - return this.apply(new ProjectResource( - projectControlFactory.controlFor(nameKey, self.get()))); + return this.apply(new ProjectResource(projectControlFactory.controlFor(nameKey, self.get()))); } catch (NoSuchProjectException e) { throw new ResourceNotFoundException(nameKey.get()); } @@ -121,8 +123,7 @@ public class GetAccess implements RestReadView { projectCache.evict(config.getProject()); pc = open(projectName); } else if (config.getRevision() != null - && !config.getRevision().equals( - pc.getProjectState().getConfig().getRevision())) { + && !config.getRevision().equals(pc.getProjectState().getConfig().getRevision())) { projectCache.evict(config.getProject()); pc = open(projectName); } @@ -175,8 +176,7 @@ public class GetAccess implements RestReadView { Boolean canSeeGroup = visibleGroups.get(group); if (canSeeGroup == null) { try { - canSeeGroup = groupControlFactory.controlFor(group) - .isVisible(); + canSeeGroup = groupControlFactory.controlFor(group).isVisible(); } catch (NoSuchGroupException e) { canSeeGroup = Boolean.FALSE; } @@ -210,8 +210,7 @@ public class GetAccess implements RestReadView { info.revision = config.getRevision().name(); } - ProjectState parent = - Iterables.getFirst(pc.getProjectState().parents(), null); + ProjectState parent = Iterables.getFirst(pc.getProjectState().parents(), null); if (parent != null) { info.inheritsFrom = projectJson.format(parent.getProject()); } @@ -223,8 +222,8 @@ public class GetAccess implements RestReadView { } info.isOwner = toBoolean(pc.isOwner()); - info.canUpload = toBoolean(pc.isOwner() - || (metaConfigControl.isVisible() && metaConfigControl.canUpload())); + info.canUpload = + toBoolean(pc.isOwner() || (metaConfigControl.isVisible() && metaConfigControl.canUpload())); info.canAdd = toBoolean(pc.canAddRefs()); info.configVisible = pc.isOwner() || metaConfigControl.isVisible(); @@ -235,12 +234,11 @@ public class GetAccess implements RestReadView { AccessSectionInfo accessSectionInfo = new AccessSectionInfo(); accessSectionInfo.permissions = new HashMap<>(); for (Permission p : section.getPermissions()) { - PermissionInfo pInfo = new PermissionInfo(p.getLabel(), - p.getExclusiveGroup() ? true : null); + PermissionInfo pInfo = new PermissionInfo(p.getLabel(), p.getExclusiveGroup() ? true : null); pInfo.rules = new HashMap<>(); for (PermissionRule r : p.getRules()) { - PermissionRuleInfo info = new PermissionRuleInfo( - ACTION_TYPE.get(r.getAction()), r.getForce()); + PermissionRuleInfo info = + new PermissionRuleInfo(ACTION_TYPE.get(r.getAction()), r.getForce()); if (r.hasRange()) { info.max = r.getMax(); info.min = r.getMin(); @@ -258,8 +256,8 @@ public class GetAccess implements RestReadView { private ProjectControl open(Project.NameKey projectName) throws ResourceNotFoundException, IOException { try { - return projectControlFactory.validateFor(projectName, - ProjectControl.OWNER | ProjectControl.VISIBLE, self.get()); + return projectControlFactory.validateFor( + projectName, ProjectControl.OWNER | ProjectControl.VISIBLE, self.get()); } catch (NoSuchProjectException e) { throw new ResourceNotFoundException(projectName.get()); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetChildProject.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetChildProject.java index 7737d8ce31..53e1baa178 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetChildProject.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetChildProject.java @@ -18,7 +18,6 @@ import com.google.gerrit.extensions.common.ProjectInfo; import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.extensions.restapi.RestReadView; import com.google.inject.Inject; - import org.kohsuke.args4j.Option; public class GetChildProject implements RestReadView { @@ -36,8 +35,7 @@ public class GetChildProject implements RestReadView { } @Override - public ProjectInfo apply(ChildProjectResource rsrc) - throws ResourceNotFoundException { + public ProjectInfo apply(ChildProjectResource rsrc) throws ResourceNotFoundException { if (recursive || rsrc.isDirectChild()) { return json.format(rsrc.getChild().getProject()); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetCommit.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetCommit.java index 63cee1f7dc..bd4492e03d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetCommit.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetCommit.java @@ -18,10 +18,8 @@ import com.google.gerrit.extensions.common.CommitInfo; import com.google.gerrit.extensions.restapi.RestReadView; import com.google.gerrit.server.CommonConverters; import com.google.inject.Singleton; - -import org.eclipse.jgit.revwalk.RevCommit; - import java.util.ArrayList; +import org.eclipse.jgit.revwalk.RevCommit; @Singleton public class GetCommit implements RestReadView { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetConfig.java index c999119504..8192e29a9a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetConfig.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetConfig.java @@ -36,7 +36,8 @@ public class GetConfig implements RestReadView { private final DynamicMap> views; @Inject - public GetConfig(@EnableSignedPush boolean serverEnableSignedPush, + public GetConfig( + @EnableSignedPush boolean serverEnableSignedPush, TransferConfig config, DynamicMap pluginConfigEntries, PluginConfigFactory cfgFactory, @@ -52,7 +53,13 @@ public class GetConfig implements RestReadView { @Override public ConfigInfo apply(ProjectResource resource) { - return new ConfigInfoImpl(serverEnableSignedPush, resource.getControl(), - config, pluginConfigEntries, cfgFactory, allProjects, views); + return new ConfigInfoImpl( + serverEnableSignedPush, + resource.getControl(), + config, + pluginConfigEntries, + cfgFactory, + allProjects, + views); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetContent.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetContent.java index 23e9e30f21..10da990fe5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetContent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetContent.java @@ -20,7 +20,6 @@ import com.google.gerrit.extensions.restapi.RestReadView; import com.google.gerrit.server.change.FileContentUtil; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.io.IOException; @Singleton @@ -33,11 +32,8 @@ public class GetContent implements RestReadView { } @Override - public BinaryResult apply(FileResource rsrc) - throws ResourceNotFoundException, IOException { + public BinaryResult apply(FileResource rsrc) throws ResourceNotFoundException, IOException { return fileContentUtil.getContent( - rsrc.getProject().getProjectState(), - rsrc.getRev(), - rsrc.getPath()); + rsrc.getProject().getProjectState(), rsrc.getRev(), rsrc.getPath()); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetDashboard.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetDashboard.java index 09555b72c3..154965827d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetDashboard.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetDashboard.java @@ -26,12 +26,10 @@ import com.google.gerrit.extensions.restapi.RestReadView; import com.google.gerrit.extensions.restapi.Url; import com.google.gerrit.server.project.DashboardsCollection.DashboardInfo; import com.google.inject.Inject; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.kohsuke.args4j.Option; - import java.io.IOException; import java.util.List; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.kohsuke.args4j.Option; class GetDashboard implements RestReadView { private final DashboardsCollection dashboards; @@ -102,8 +100,6 @@ class GetDashboard implements RestReadView { List p = Lists.newArrayList(Splitter.on(':').limit(2).split(id)); String ref = Url.encode(p.get(0)); String path = Url.encode(p.get(1)); - return dashboards.parse( - new ProjectResource(ctl), - IdString.fromUrl(ref + ':' + path)); + return dashboards.parse(new ProjectResource(ctl), IdString.fromUrl(ref + ':' + path)); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetHead.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetHead.java index 12ca2eb71a..03db4f6f3a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetHead.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetHead.java @@ -22,7 +22,7 @@ import com.google.gerrit.server.git.GitRepositoryManager; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.errors.RepositoryNotFoundException; @@ -32,23 +32,20 @@ import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; -import java.io.IOException; - @Singleton public class GetHead implements RestReadView { private GitRepositoryManager repoManager; private Provider db; @Inject - GetHead(GitRepositoryManager repoManager, - Provider db) { + GetHead(GitRepositoryManager repoManager, Provider db) { this.repoManager = repoManager; this.db = db; } @Override - public String apply(ProjectResource rsrc) throws AuthException, - ResourceNotFoundException, IOException { + public String apply(ProjectResource rsrc) + throws AuthException, ResourceNotFoundException, IOException { try (Repository repo = repoManager.openRepository(rsrc.getNameKey())) { Ref head = repo.getRefDatabase().exactRef(Constants.HEAD); if (head == null) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetReflog.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetReflog.java index 8718a9b1f0..5d0afea29e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetReflog.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetReflog.java @@ -23,39 +23,51 @@ import com.google.gerrit.server.CommonConverters; import com.google.gerrit.server.args4j.TimestampHandler; import com.google.gerrit.server.git.GitRepositoryManager; import com.google.inject.Inject; - +import java.io.IOException; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.List; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.ReflogEntry; import org.eclipse.jgit.lib.ReflogReader; import org.eclipse.jgit.lib.Repository; import org.kohsuke.args4j.Option; -import java.io.IOException; -import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.List; - public class GetReflog implements RestReadView { private final GitRepositoryManager repoManager; - @Option(name = "--limit", aliases = {"-n"}, metaVar = "CNT", - usage = "maximum number of reflog entries to list") + @Option( + name = "--limit", + aliases = {"-n"}, + metaVar = "CNT", + usage = "maximum number of reflog entries to list" + ) public GetReflog setLimit(int limit) { this.limit = limit; return this; } - @Option(name = "--from", metaVar = "TIMESTAMP", - usage = "timestamp from which the reflog entries should be listed (UTC, format: " - + TimestampHandler.TIMESTAMP_FORMAT + ")") + @Option( + name = "--from", + metaVar = "TIMESTAMP", + usage = + "timestamp from which the reflog entries should be listed (UTC, format: " + + TimestampHandler.TIMESTAMP_FORMAT + + ")" + ) public GetReflog setFrom(Timestamp from) { this.from = from; return this; } - @Option(name = "--to", metaVar = "TIMESTAMP", - usage = "timestamp until which the reflog entries should be listed (UTC, format: " - + TimestampHandler.TIMESTAMP_FORMAT + ")") + @Option( + name = "--to", + metaVar = "TIMESTAMP", + usage = + "timestamp until which the reflog entries should be listed (UTC, format: " + + TimestampHandler.TIMESTAMP_FORMAT + + ")" + ) public GetReflog setTo(Timestamp to) { this.to = to; return this; @@ -71,8 +83,8 @@ public class GetReflog implements RestReadView { } @Override - public List apply(BranchResource rsrc) throws AuthException, - ResourceNotFoundException, RepositoryNotFoundException, IOException { + public List apply(BranchResource rsrc) + throws AuthException, ResourceNotFoundException, RepositoryNotFoundException, IOException { if (!rsrc.getControl().isOwner()) { throw new AuthException("not project owner"); } @@ -84,16 +96,12 @@ public class GetReflog implements RestReadView { } List entries; if (from == null && to == null) { - entries = - limit > 0 ? r.getReverseEntries(limit) : r.getReverseEntries(); + entries = limit > 0 ? r.getReverseEntries(limit) : r.getReverseEntries(); } else { - entries = limit > 0 - ? new ArrayList<>(limit) - : new ArrayList<>(); + entries = limit > 0 ? new ArrayList<>(limit) : new ArrayList<>(); for (ReflogEntry e : r.getReverseEntries()) { Timestamp timestamp = new Timestamp(e.getWho().getWhen().getTime()); - if ((from == null || from.before(timestamp)) && - (to == null || to.after(timestamp))) { + if ((from == null || from.before(timestamp)) && (to == null || to.after(timestamp))) { entries.add(e); } if (limit > 0 && entries.size() >= limit) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetStatistics.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetStatistics.java index 723ee6352c..36d558c3eb 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetStatistics.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetStatistics.java @@ -22,15 +22,13 @@ import com.google.gerrit.extensions.restapi.RestReadView; import com.google.gerrit.server.git.GitRepositoryManager; import com.google.inject.Inject; import com.google.inject.Singleton; - +import java.io.IOException; import org.eclipse.jgit.api.GarbageCollectCommand; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.api.errors.JGitInternalException; import org.eclipse.jgit.lib.Repository; -import java.io.IOException; - @RequiresCapability(GlobalCapability.RUN_GC) @Singleton public class GetStatistics implements RestReadView { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/InvalidChangeOperationException.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/InvalidChangeOperationException.java index e5c6ba5c9d..c09baa0f60 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/InvalidChangeOperationException.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/InvalidChangeOperationException.java @@ -14,7 +14,6 @@ package com.google.gerrit.server.project; - /** Indicates the change operation is not currently valid. */ public class InvalidChangeOperationException extends Exception { private static final long serialVersionUID = 1L; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListBranches.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListBranches.java index 2da0e0116a..a5b64585dc 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListBranches.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListBranches.java @@ -31,13 +31,6 @@ import com.google.gerrit.server.extensions.webui.UiActions; import com.google.gerrit.server.git.GitRepositoryManager; import com.google.inject.Inject; import com.google.inject.util.Providers; - -import org.eclipse.jgit.errors.RepositoryNotFoundException; -import org.eclipse.jgit.lib.Constants; -import org.eclipse.jgit.lib.Ref; -import org.eclipse.jgit.lib.Repository; -import org.kohsuke.args4j.Option; - import java.io.IOException; import java.util.ArrayList; import java.util.Collection; @@ -46,28 +39,53 @@ import java.util.Comparator; import java.util.List; import java.util.Set; import java.util.TreeMap; +import org.eclipse.jgit.errors.RepositoryNotFoundException; +import org.eclipse.jgit.lib.Constants; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.lib.Repository; +import org.kohsuke.args4j.Option; public class ListBranches implements RestReadView { private final GitRepositoryManager repoManager; private final DynamicMap> branchViews; private final WebLinks webLinks; - @Option(name = "--limit", aliases = {"-n"}, metaVar = "CNT", usage = "maximum number of branches to list") + @Option( + name = "--limit", + aliases = {"-n"}, + metaVar = "CNT", + usage = "maximum number of branches to list" + ) public void setLimit(int limit) { this.limit = limit; } - @Option(name = "--start", aliases = {"-s"}, metaVar = "CNT", usage = "number of branches to skip") + @Option( + name = "--start", + aliases = {"-s"}, + metaVar = "CNT", + usage = "number of branches to skip" + ) public void setStart(int start) { this.start = start; } - @Option(name = "--match", aliases = {"-m"}, metaVar = "MATCH", usage = "match branches substring") + @Option( + name = "--match", + aliases = {"-m"}, + metaVar = "MATCH", + usage = "match branches substring" + ) public void setMatchSubstring(String matchSubstring) { this.matchSubstring = matchSubstring; } - @Option(name = "--regex", aliases = {"-r"}, metaVar = "REGEX", usage = "match branches regex") + @Option( + name = "--regex", + aliases = {"-r"}, + metaVar = "REGEX", + usage = "match branches regex" + ) public void setMatchRegex(String matchRegex) { this.matchRegex = matchRegex; } @@ -78,7 +96,8 @@ public class ListBranches implements RestReadView { private String matchRegex; @Inject - public ListBranches(GitRepositoryManager repoManager, + public ListBranches( + GitRepositoryManager repoManager, DynamicMap> branchViews, WebLinks webLinks) { this.repoManager = repoManager; @@ -101,14 +120,13 @@ public class ListBranches implements RestReadView { throws IOException, ResourceNotFoundException { List refs; try (Repository db = repoManager.openRepository(rsrc.getNameKey())) { - Collection heads = - db.getRefDatabase().getRefs(Constants.R_HEADS).values(); + Collection heads = db.getRefDatabase().getRefs(Constants.R_HEADS).values(); refs = new ArrayList<>(heads.size() + 3); refs.addAll(heads); - refs.addAll(db.getRefDatabase().exactRef( - Constants.HEAD, - RefNames.REFS_CONFIG, - RefNames.REFS_USERS_DEFAULT).values()); + refs.addAll( + db.getRefDatabase() + .exactRef(Constants.HEAD, RefNames.REFS_CONFIG, RefNames.REFS_USERS_DEFAULT) + .values()); } catch (RepositoryNotFoundException noGitRepository) { throw new ResourceNotFoundException(); } @@ -174,17 +192,16 @@ public class ListBranches implements RestReadView { } } - private BranchInfo createBranchInfo(Ref ref, RefControl refControl, - Set targets) { + private BranchInfo createBranchInfo(Ref ref, RefControl refControl, Set targets) { BranchInfo info = new BranchInfo(); info.ref = ref.getName(); info.revision = ref.getObjectId() != null ? ref.getObjectId().name() : null; - info.canDelete = !targets.contains(ref.getName()) && refControl.canDelete() - ? true : null; - for (UiAction.Description d : UiActions.from( - branchViews, - new BranchResource(refControl.getProjectControl(), info), - Providers.of(refControl.getUser()))) { + info.canDelete = !targets.contains(ref.getName()) && refControl.canDelete() ? true : null; + for (UiAction.Description d : + UiActions.from( + branchViews, + new BranchResource(refControl.getProjectControl(), info), + Providers.of(refControl.getUser()))) { if (info.actions == null) { info.actions = new TreeMap<>(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListChildProjects.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListChildProjects.java index 0c2f9fc6c7..c14ade653b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListChildProjects.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListChildProjects.java @@ -20,14 +20,12 @@ import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.CurrentUser; import com.google.gerrit.server.config.AllProjectsName; import com.google.inject.Inject; - -import org.kohsuke.args4j.Option; - import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.kohsuke.args4j.Option; public class ListChildProjects implements RestReadView { @@ -40,9 +38,11 @@ public class ListChildProjects implements RestReadView { private final ProjectNode.Factory projectNodeFactory; @Inject - ListChildProjects(ProjectCache projectCache, + ListChildProjects( + ProjectCache projectCache, AllProjectsName allProjectsName, - ProjectJson json, ProjectNode.Factory projectNodeFactory) { + ProjectJson json, + ProjectNode.Factory projectNodeFactory) { this.projectCache = projectCache; this.allProjects = allProjectsName; this.json = json; @@ -56,8 +56,7 @@ public class ListChildProjects implements RestReadView { @Override public List apply(ProjectResource rsrc) { if (recursive) { - return getChildProjectsRecursively(rsrc.getNameKey(), - rsrc.getControl().getUser()); + return getChildProjectsRecursively(rsrc.getNameKey(), rsrc.getControl().getUser()); } return getDirectChildProjects(rsrc.getNameKey()); } @@ -77,8 +76,7 @@ public class ListChildProjects implements RestReadView { return childProjects; } - private List getChildProjectsRecursively(Project.NameKey parent, - CurrentUser user) { + private List getChildProjectsRecursively(Project.NameKey parent, CurrentUser user) { Map projects = new HashMap<>(); for (Project.NameKey name : projectCache.all()) { ProjectState p = projectCache.get(name); @@ -86,8 +84,7 @@ public class ListChildProjects implements RestReadView { // If we can't get it from the cache, pretend it's not present. continue; } - projects.put(name, projectNodeFactory.create(p.getProject(), - p.controlFor(user).isVisible())); + projects.put(name, projectNodeFactory.create(p.getProject(), p.controlFor(user).isVisible())); } for (ProjectNode key : projects.values()) { ProjectNode node = projects.get(key.getParentName()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListDashboards.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListDashboards.java index 2546ac6c9c..dd69e0ef9d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListDashboards.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListDashboards.java @@ -22,7 +22,9 @@ import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.git.GitRepositoryManager; import com.google.gerrit.server.project.DashboardsCollection.DashboardInfo; import com.google.inject.Inject; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.BlobBasedConfig; @@ -35,10 +37,6 @@ import org.kohsuke.args4j.Option; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - class ListDashboards implements RestReadView { private static final Logger log = LoggerFactory.getLogger(ListDashboards.class); @@ -53,8 +51,7 @@ class ListDashboards implements RestReadView { } @Override - public List apply(ProjectResource resource) - throws ResourceNotFoundException, IOException { + public List apply(ProjectResource resource) throws ResourceNotFoundException, IOException { ProjectControl ctl = resource.getControl(); String project = ctl.getProject().getName(); if (!inherited) { @@ -80,16 +77,15 @@ class ListDashboards implements RestReadView { return all; } - private List scan(ProjectControl ctl, String project, - boolean setDefault) throws ResourceNotFoundException, IOException { + private List scan(ProjectControl ctl, String project, boolean setDefault) + throws ResourceNotFoundException, IOException { Project.NameKey projectName = ctl.getProject().getNameKey(); try (Repository git = gitManager.openRepository(projectName); RevWalk rw = new RevWalk(git)) { List all = new ArrayList<>(); for (Ref ref : git.getRefDatabase().getRefs(REFS_DASHBOARDS).values()) { if (ctl.controlForRef(ref.getName()).canRead()) { - all.addAll(scanDashboards(ctl.getProject(), git, rw, ref, - project, setDefault)); + all.addAll(scanDashboards(ctl.getProject(), git, rw, ref, project, setDefault)); } } return all; @@ -98,8 +94,13 @@ class ListDashboards implements RestReadView { } } - private List scanDashboards(Project definingProject, - Repository git, RevWalk rw, Ref ref, String project, boolean setDefault) + private List scanDashboards( + Project definingProject, + Repository git, + RevWalk rw, + Ref ref, + String project, + boolean setDefault) throws IOException { List list = new ArrayList<>(); try (TreeWalk tw = new TreeWalk(rw.getObjectReader())) { @@ -108,18 +109,19 @@ class ListDashboards implements RestReadView { while (tw.next()) { if (tw.getFileMode(0) == FileMode.REGULAR_FILE) { try { - list.add(DashboardsCollection.parse( - definingProject, - ref.getName().substring(REFS_DASHBOARDS.length()), - tw.getPathString(), - new BlobBasedConfig(null, git, tw.getObjectId(0)), - project, - setDefault)); + list.add( + DashboardsCollection.parse( + definingProject, + ref.getName().substring(REFS_DASHBOARDS.length()), + tw.getPathString(), + new BlobBasedConfig(null, git, tw.getObjectId(0)), + project, + setDefault)); } catch (ConfigInvalidException e) { - log.warn(String.format( - "Cannot parse dashboard %s:%s:%s: %s", - definingProject.getName(), ref.getName(), tw.getPathString(), - e.getMessage())); + log.warn( + String.format( + "Cannot parse dashboard %s:%s:%s: %s", + definingProject.getName(), ref.getName(), tw.getPathString(), e.getMessage())); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListProjects.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListProjects.java index 92189dd0b4..a84fefd758 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListProjects.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListProjects.java @@ -42,15 +42,6 @@ import com.google.gerrit.server.util.RegexListSearcher; import com.google.gerrit.server.util.TreeFormatter; import com.google.gson.reflect.TypeToken; import com.google.inject.Inject; - -import org.eclipse.jgit.errors.RepositoryNotFoundException; -import org.eclipse.jgit.lib.Constants; -import org.eclipse.jgit.lib.Ref; -import org.eclipse.jgit.lib.Repository; -import org.kohsuke.args4j.Option; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.BufferedWriter; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -70,6 +61,13 @@ import java.util.SortedMap; import java.util.SortedSet; import java.util.TreeMap; import java.util.TreeSet; +import org.eclipse.jgit.errors.RepositoryNotFoundException; +import org.eclipse.jgit.lib.Constants; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.lib.Repository; +import org.kohsuke.args4j.Option; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** List projects visible to the calling user. */ public class ListProjects implements RestReadView { @@ -93,8 +91,8 @@ public class ListProjects implements RestReadView { boolean matches(Repository git) throws IOException { Ref head = git.getRefDatabase().exactRef(Constants.HEAD); return head != null - && head.isSymbolic() - && RefNames.REFS_CONFIG.equals(head.getLeaf().getName()); + && head.isSymbolic() + && RefNames.REFS_CONFIG.equals(head.getLeaf().getName()); } }, ALL { @@ -119,15 +117,22 @@ public class ListProjects implements RestReadView { @Option(name = "--format", usage = "(deprecated) output format") private OutputFormat format = OutputFormat.TEXT; - @Option(name = "--show-branch", aliases = {"-b"}, - usage = "displays the sha of each project in the specified branch") + @Option( + name = "--show-branch", + aliases = {"-b"}, + usage = "displays the sha of each project in the specified branch" + ) public void addShowBranch(String branch) { showBranch.add(branch); } - @Option(name = "--tree", aliases = {"-t"}, usage = - "displays project inheritance in a tree-like format\n" - + "this option does not work together with the show-branch option") + @Option( + name = "--tree", + aliases = {"-t"}, + usage = + "displays project inheritance in a tree-like format\n" + + "this option does not work together with the show-branch option" + ) public void setShowTree(boolean showTree) { this.showTree = showTree; } @@ -137,7 +142,11 @@ public class ListProjects implements RestReadView { this.type = type; } - @Option(name = "--description", aliases = {"-d"}, usage = "include description of project in list") + @Option( + name = "--description", + aliases = {"-d"}, + usage = "include description of project in list" + ) public void setShowDescription(boolean showDescription) { this.showDescription = showDescription; } @@ -147,22 +156,42 @@ public class ListProjects implements RestReadView { this.all = all; } - @Option(name = "--limit", aliases = {"-n"}, metaVar = "CNT", usage = "maximum number of projects to list") + @Option( + name = "--limit", + aliases = {"-n"}, + metaVar = "CNT", + usage = "maximum number of projects to list" + ) public void setLimit(int limit) { this.limit = limit; } - @Option(name = "--start", aliases = {"-S"}, metaVar = "CNT", usage = "number of projects to skip") + @Option( + name = "--start", + aliases = {"-S"}, + metaVar = "CNT", + usage = "number of projects to skip" + ) public void setStart(int start) { this.start = start; } - @Option(name = "--prefix", aliases = {"-p"}, metaVar = "PREFIX", usage = "match project prefix") + @Option( + name = "--prefix", + aliases = {"-p"}, + metaVar = "PREFIX", + usage = "match project prefix" + ) public void setMatchPrefix(String matchPrefix) { this.matchPrefix = matchPrefix; } - @Option(name = "--match", aliases = {"-m"}, metaVar = "MATCH", usage = "match project substring") + @Option( + name = "--match", + aliases = {"-m"}, + metaVar = "MATCH", + usage = "match project substring" + ) public void setMatchSubstring(String matchSubstring) { this.matchSubstring = matchSubstring; } @@ -172,8 +201,11 @@ public class ListProjects implements RestReadView { this.matchRegex = matchRegex; } - @Option(name = "--has-acl-for", metaVar = "GROUP", usage = - "displays only projects on which access rights for this group are directly assigned") + @Option( + name = "--has-acl-for", + metaVar = "GROUP", + usage = "displays only projects on which access rights for this group are directly assigned" + ) public void setGroupUuid(AccountGroup.UUID groupUuid) { this.groupUuid = groupUuid; } @@ -191,7 +223,8 @@ public class ListProjects implements RestReadView { private AccountGroup.UUID groupUuid; @Inject - protected ListProjects(CurrentUser currentUser, + protected ListProjects( + CurrentUser currentUser, ProjectCache projectCache, GroupsCollection groupsCollection, GroupControl.Factory groupControlFactory, @@ -249,8 +282,8 @@ public class ListProjects implements RestReadView { throws BadRequestException { PrintWriter stdout = null; if (displayOutputStream != null) { - stdout = new PrintWriter(new BufferedWriter( - new OutputStreamWriter(displayOutputStream, UTF_8))); + stdout = + new PrintWriter(new BufferedWriter(new OutputStreamWriter(displayOutputStream, UTF_8))); } int foundIndex = 0; @@ -278,8 +311,8 @@ public class ListProjects implements RestReadView { } catch (NoSuchGroupException ex) { break; } - if (!pctl.getLocalGroups().contains( - GroupReference.forGroup(groupsCollection.parseId(groupUuid.get())))) { + if (!pctl.getLocalGroups() + .contains(GroupReference.forGroup(groupsCollection.parseId(groupUuid.get())))) { continue; } } @@ -293,8 +326,7 @@ public class ListProjects implements RestReadView { ProjectControl parentCtrl = parentState.controlFor(currentUser); if (parentCtrl.isVisible() || parentCtrl.isOwner()) { info.name = parentState.getProject().getName(); - info.description = Strings.emptyToNull( - parentState.getProject().getDescription()); + info.description = Strings.emptyToNull(parentState.getProject().getDescription()); info.state = parentState.getProject().getState(); } else { rejected.add(parentState.getProject().getName()); @@ -307,8 +339,7 @@ public class ListProjects implements RestReadView { } else { final boolean isVisible = pctl.isVisible() || (all && pctl.isOwner()); if (showTree && !format.isJson()) { - treeMap.put(projectName, - projectNodeFactory.create(pctl.getProject(), isVisible)); + treeMap.put(projectName, projectNodeFactory.create(pctl.getProject(), isVisible)); continue; } @@ -377,8 +408,7 @@ public class ListProjects implements RestReadView { log.warn("Unexpected error reading " + projectName, err); continue; } - List links = - webLinks.getProjectLinks(projectName.get()); + List links = webLinks.getProjectLinks(projectName.get()); info.webLinks = links.isEmpty() ? null : links; } @@ -422,8 +452,9 @@ public class ListProjects implements RestReadView { if (stdout == null) { return output; } else if (format.isJson()) { - format.newGson().toJson( - output, new TypeToken>() {}.getType(), stdout); + format + .newGson() + .toJson(output, new TypeToken>() {}.getType(), stdout); stdout.print('\n'); } else if (showTree && treeMap.size() > 0) { printProjectTree(stdout, treeMap); @@ -442,19 +473,20 @@ public class ListProjects implements RestReadView { return projectCache.byName(matchPrefix); } else if (matchSubstring != null) { checkMatchOptions(matchPrefix == null && matchRegex == null); - return Iterables.filter(projectCache.all(), - p -> p.get().toLowerCase(Locale.US) - .contains(matchSubstring.toLowerCase(Locale.US))); + return Iterables.filter( + projectCache.all(), + p -> p.get().toLowerCase(Locale.US).contains(matchSubstring.toLowerCase(Locale.US))); } else if (matchRegex != null) { checkMatchOptions(matchPrefix == null && matchSubstring == null); RegexListSearcher searcher; try { - searcher = new RegexListSearcher(matchRegex) { - @Override - public String apply(Project.NameKey in) { - return in.get(); - } - }; + searcher = + new RegexListSearcher(matchRegex) { + @Override + public String apply(Project.NameKey in) { + return in.get(); + } + }; } catch (IllegalArgumentException e) { throw new BadRequestException(e.getMessage()); } @@ -464,15 +496,14 @@ public class ListProjects implements RestReadView { } } - private static void checkMatchOptions(boolean cond) - throws BadRequestException { + private static void checkMatchOptions(boolean cond) throws BadRequestException { if (!cond) { throw new BadRequestException("specify exactly one of p/m/r"); } } - private void printProjectTree(final PrintWriter stdout, - final TreeMap treeMap) { + private void printProjectTree( + final PrintWriter stdout, final TreeMap treeMap) { final SortedSet sortedNodes = new TreeSet<>(); // Builds the inheritance tree using a list. @@ -496,16 +527,15 @@ public class ListProjects implements RestReadView { stdout.flush(); } - private List getBranchRefs(Project.NameKey projectName, - ProjectControl projectControl) { + private List getBranchRefs(Project.NameKey projectName, ProjectControl projectControl) { Ref[] result = new Ref[showBranch.size()]; try (Repository git = repoManager.openRepository(projectName)) { for (int i = 0; i < showBranch.size(); i++) { Ref ref = git.findRef(showBranch.get(i)); if (ref != null - && ref.getObjectId() != null - && (projectControl.controlForRef(ref.getLeaf().getName()).isVisible()) - || (all && projectControl.isOwner())) { + && ref.getObjectId() != null + && (projectControl.controlForRef(ref.getLeaf().getName()).isVisible()) + || (all && projectControl.isOwner())) { result[i] = ref; } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListTags.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListTags.java index 6088c54800..9312e495b3 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListTags.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListTags.java @@ -31,7 +31,12 @@ import com.google.gerrit.server.git.VisibleRefFilter; import com.google.gerrit.server.notedb.ChangeNotes; import com.google.inject.Inject; import com.google.inject.Provider; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Map; import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.Constants; @@ -43,13 +48,6 @@ import org.eclipse.jgit.revwalk.RevTag; import org.eclipse.jgit.revwalk.RevWalk; import org.kohsuke.args4j.Option; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.Map; - public class ListTags implements RestReadView { private final GitRepositoryManager repoManager; private final Provider dbProvider; @@ -57,22 +55,42 @@ public class ListTags implements RestReadView { private final ChangeNotes.Factory changeNotesFactory; @Nullable private final SearchingChangeCacheImpl changeCache; - @Option(name = "--limit", aliases = {"-n"}, metaVar = "CNT", usage = "maximum number of tags to list") + @Option( + name = "--limit", + aliases = {"-n"}, + metaVar = "CNT", + usage = "maximum number of tags to list" + ) public void setLimit(int limit) { this.limit = limit; } - @Option(name = "--start", aliases = {"-s"}, metaVar = "CNT", usage = "number of tags to skip") + @Option( + name = "--start", + aliases = {"-s"}, + metaVar = "CNT", + usage = "number of tags to skip" + ) public void setStart(int start) { this.start = start; } - @Option(name = "--match", aliases = {"-m"}, metaVar = "MATCH", usage = "match tags substring") + @Option( + name = "--match", + aliases = {"-m"}, + metaVar = "MATCH", + usage = "match tags substring" + ) public void setMatchSubstring(String matchSubstring) { this.matchSubstring = matchSubstring; } - @Option(name = "--regex", aliases = {"-r"}, metaVar = "REGEX", usage = "match tags regex") + @Option( + name = "--regex", + aliases = {"-r"}, + metaVar = "REGEX", + usage = "match tags regex" + ) public void setMatchRegex(String matchRegex) { this.matchRegex = matchRegex; } @@ -83,7 +101,8 @@ public class ListTags implements RestReadView { private String matchRegex; @Inject - public ListTags(GitRepositoryManager repoManager, + public ListTags( + GitRepositoryManager repoManager, Provider dbProvider, TagCache tagCache, ChangeNotes.Factory changeNotesFactory, @@ -96,25 +115,27 @@ public class ListTags implements RestReadView { } @Override - public List apply(ProjectResource resource) throws IOException, - ResourceNotFoundException, BadRequestException { + public List apply(ProjectResource resource) + throws IOException, ResourceNotFoundException, BadRequestException { List tags = new ArrayList<>(); try (Repository repo = getRepository(resource.getNameKey()); RevWalk rw = new RevWalk(repo)) { - Map all = visibleTags(resource.getControl(), repo, - repo.getRefDatabase().getRefs(Constants.R_TAGS)); + Map all = + visibleTags(resource.getControl(), repo, repo.getRefDatabase().getRefs(Constants.R_TAGS)); for (Ref ref : all.values()) { tags.add(createTagInfo(ref, rw)); } } - Collections.sort(tags, new Comparator() { - @Override - public int compare(TagInfo a, TagInfo b) { - return a.ref.compareTo(b.ref); - } - }); + Collections.sort( + tags, + new Comparator() { + @Override + public int compare(TagInfo a, TagInfo b) { + return a.ref.compareTo(b.ref); + } + }); return new RefFilter(Constants.R_TAGS) .start(start) @@ -133,8 +154,9 @@ public class ListTags implements RestReadView { tagName = Constants.R_TAGS + tagName; } Ref ref = repo.getRefDatabase().exactRef(tagName); - if (ref != null && !visibleTags(resource.getControl(), repo, - ImmutableMap.of(ref.getName(), ref)).isEmpty()) { + if (ref != null + && !visibleTags(resource.getControl(), repo, ImmutableMap.of(ref.getName(), ref)) + .isEmpty()) { return createTagInfo(ref, rw); } } @@ -146,20 +168,17 @@ public class ListTags implements RestReadView { RevObject object = rw.parseAny(ref.getObjectId()); if (object instanceof RevTag) { // Annotated or signed tag - RevTag tag = (RevTag)object; + RevTag tag = (RevTag) object; PersonIdent tagger = tag.getTaggerIdent(); return new TagInfo( ref.getName(), tag.getName(), tag.getObject().getName(), tag.getFullMessage().trim(), - tagger != null ? - CommonConverters.toGitPerson(tag.getTaggerIdent()) : null); + tagger != null ? CommonConverters.toGitPerson(tag.getTaggerIdent()) : null); } // Lightweight tag - return new TagInfo( - ref.getName(), - ref.getObjectId().getName()); + return new TagInfo(ref.getName(), ref.getObjectId().getName()); } private Repository getRepository(Project.NameKey project) @@ -171,9 +190,10 @@ public class ListTags implements RestReadView { } } - private Map visibleTags(ProjectControl control, Repository repo, - Map tags) { - return new VisibleRefFilter(tagCache, changeNotesFactory, changeCache, repo, - control, dbProvider.get(), false).filter(tags, true); + private Map visibleTags( + ProjectControl control, Repository repo, Map tags) { + return new VisibleRefFilter( + tagCache, changeNotesFactory, changeCache, repo, control, dbProvider.get(), false) + .filter(tags, true); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/PerRequestProjectControlCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/PerRequestProjectControlCache.java index f46a88118e..0f71ac8a37 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/PerRequestProjectControlCache.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/PerRequestProjectControlCache.java @@ -18,7 +18,6 @@ import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.CurrentUser; import com.google.inject.Inject; import com.google.inject.servlet.RequestScoped; - import java.util.HashMap; import java.util.Map; @@ -30,8 +29,7 @@ public class PerRequestProjectControlCache { private final Map controls; @Inject - PerRequestProjectControlCache(ProjectCache projectCache, - CurrentUser userProvider) { + PerRequestProjectControlCache(ProjectCache projectCache, CurrentUser userProvider) { this.projectCache = projectCache; this.user = userProvider; this.controls = new HashMap<>(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/PermissionCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/PermissionCollection.java index bb1b20ec7e..4bf3e47b7e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/PermissionCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/PermissionCollection.java @@ -31,7 +31,6 @@ import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.CurrentUser; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -43,11 +42,10 @@ import java.util.Set; /** * Effective permissions applied to a reference in a project. - *

- * A collection may be user specific if a matching {@link AccessSection} uses - * "${username}" in its name. The permissions granted in that section may only - * be granted to the username that appears in the reference name, and also only - * if the user is a member of the relevant group. + * + *

A collection may be user specific if a matching {@link AccessSection} uses "${username}" in + * its name. The permissions granted in that section may only be granted to the username that + * appears in the reference name, and also only if the user is a member of the relevant group. */ public class PermissionCollection { @Singleton @@ -62,19 +60,16 @@ public class PermissionCollection { /** * Get all permissions that apply to a reference. * - * @param matcherList collection of sections that should be considered, in - * priority order (project specific definitions must appear before - * inherited ones). + * @param matcherList collection of sections that should be considered, in priority order + * (project specific definitions must appear before inherited ones). * @param ref reference being accessed. - * @param user if the reference is a per-user reference, e.g. access - * sections using the parameter variable "${username}" will have - * each username inserted into them to see if they apply to the - * reference named by {@code ref}. - * @return map of permissions that apply to this reference, keyed by - * permission name. + * @param user if the reference is a per-user reference, e.g. access sections using the + * parameter variable "${username}" will have each username inserted into them to see if + * they apply to the reference named by {@code ref}. + * @return map of permissions that apply to this reference, keyed by permission name. */ - PermissionCollection filter(Iterable matcherList, - String ref, CurrentUser user) { + PermissionCollection filter( + Iterable matcherList, String ref, CurrentUser user) { if (isRE(ref)) { ref = RefPattern.shortestExample(ref); } else if (ref.endsWith("/*")) { @@ -130,8 +125,7 @@ public class PermissionCollection { SeenRule s = SeenRule.create(section, permission, rule); boolean addRule; if (rule.isBlock()) { - addRule = !exclusivePermissionsByProject.containsEntry(project, - permission.getName()); + addRule = !exclusivePermissionsByProject.containsEntry(project, permission.getName()); } else { addRule = seen.add(s) && !rule.isDeny() && !exclusivePermissionExists; } @@ -161,8 +155,7 @@ public class PermissionCollection { } } - return new PermissionCollection(permissions, overridden, ruleProps, - perUser); + return new PermissionCollection(permissions, overridden, ruleProps, perUser); } } @@ -171,7 +164,8 @@ public class PermissionCollection { private final Map ruleProps; private final boolean perUser; - private PermissionCollection(Map> rules, + private PermissionCollection( + Map> rules, Map> overridden, Map ruleProps, boolean perUser) { @@ -182,8 +176,8 @@ public class PermissionCollection { } /** - * @return true if a "${username}" pattern might need to be expanded to build - * this collection, making the results user specific. + * @return true if a "${username}" pattern might need to be expanded to build this collection, + * making the results user specific. */ public boolean isUserSpecific() { return perUser; @@ -193,18 +187,16 @@ public class PermissionCollection { * Obtain all permission rules for a given type of permission. * * @param permissionName type of permission. - * @return all rules that apply to this reference, for any group. Never null; - * the empty list is returned when there are no rules for the requested - * permission name. + * @return all rules that apply to this reference, for any group. Never null; the empty list is + * returned when there are no rules for the requested permission name. */ public List getPermission(String permissionName) { List r = rules.get(permissionName); - return r != null ? r : Collections. emptyList(); + return r != null ? r : Collections.emptyList(); } List getOverridden(String permissionName) { - return firstNonNull( - overridden.get(permissionName), Collections. emptyList()); + return firstNonNull(overridden.get(permissionName), Collections.emptyList()); } ProjectRef getRuleProps(PermissionRule rule) { @@ -214,12 +206,11 @@ public class PermissionCollection { /** * Obtain all declared permission rules that match the reference. * - * @return all rules. The collection will iterate a permission if it was - * declared in the project configuration, either directly or - * inherited. If the project owner did not use a known permission (for - * example {@link Permission#FORGE_SERVER}, then it will not be - * represented in the result even if {@link #getPermission(String)} - * returns an empty list for the same permission. + * @return all rules. The collection will iterate a permission if it was declared in the project + * configuration, either directly or inherited. If the project owner did not use a known + * permission (for example {@link Permission#FORGE_SERVER}, then it will not be represented in + * the result even if {@link #getPermission(String)} returns an empty list for the same + * permission. */ public Iterable>> getDeclaredPermissions() { return rules.entrySet(); @@ -229,14 +220,16 @@ public class PermissionCollection { @AutoValue abstract static class SeenRule { public abstract String refPattern(); - public abstract String permissionName(); - @Nullable public abstract AccountGroup.UUID group(); - static SeenRule create(AccessSection section, Permission permission, - @Nullable PermissionRule rule) { - AccountGroup.UUID group = rule != null && rule.getGroup() != null - ? rule.getGroup().getUUID() - : null; + public abstract String permissionName(); + + @Nullable + public abstract AccountGroup.UUID group(); + + static SeenRule create( + AccessSection section, Permission permission, @Nullable PermissionRule rule) { + AccountGroup.UUID group = + rule != null && rule.getGroup() != null ? rule.getGroup().getUUID() : null; return new AutoValue_PermissionCollection_SeenRule( section.getName(), permission.getName(), group); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCache.java index 67bdc88c57..65c7315fc8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCache.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCache.java @@ -16,7 +16,6 @@ package com.google.gerrit.server.project; import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gerrit.reviewdb.client.Project; - import java.io.IOException; import java.util.Set; @@ -44,8 +43,7 @@ public interface ProjectCache { * @throws IOException when there was an error. * @return the cached data; null if no such project exists. */ - ProjectState checkedGet(Project.NameKey projectName) - throws IOException; + ProjectState checkedGet(Project.NameKey projectName) throws IOException; /** Invalidate the cached information about the given project. */ void evict(Project p); @@ -54,8 +52,8 @@ public interface ProjectCache { void evict(Project.NameKey p); /** - * Remove information about the given project from the cache. It will no - * longer be returned from {@link #all()}. + * Remove information about the given project from the cache. It will no longer be returned from + * {@link #all()}. */ void remove(Project p); @@ -63,9 +61,8 @@ public interface ProjectCache { Iterable all(); /** - * @return estimated set of relevant groups extracted from hot project access - * rules. If the cache is cold or too small for the entire project set - * of the server, this set may be incomplete. + * @return estimated set of relevant groups extracted from hot project access rules. If the cache + * is cold or too small for the entire project set of the server, this set may be incomplete. */ Set guessRelevantGroupUUIDs(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheClock.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheClock.java index c96ebdf1ff..00e82c497e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheClock.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheClock.java @@ -19,12 +19,10 @@ import com.google.gerrit.server.config.ConfigUtil; import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.Config; - import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import org.eclipse.jgit.lib.Config; /** Ticks periodically to force refresh events for {@link ProjectCacheImpl}. */ @Singleton @@ -44,21 +42,26 @@ public class ProjectCacheClock { } else if (10 < checkFrequencyMillis) { // Start with generation 1 (to avoid magic 0 below). generation = 1; - ScheduledExecutorService executor = Executors.newScheduledThreadPool( - 1, - new ThreadFactoryBuilder() - .setNameFormat("ProjectCacheClock-%d") - .setDaemon(true) - .setPriority(Thread.MIN_PRIORITY) - .build()); - executor.scheduleAtFixedRate(new Runnable() { - @Override - public void run() { - // This is not exactly thread-safe, but is OK for our use. - // The only thread that writes the volatile is this task. - generation = generation + 1; - } - }, checkFrequencyMillis, checkFrequencyMillis, TimeUnit.MILLISECONDS); + ScheduledExecutorService executor = + Executors.newScheduledThreadPool( + 1, + new ThreadFactoryBuilder() + .setNameFormat("ProjectCacheClock-%d") + .setDaemon(true) + .setPriority(Thread.MIN_PRIORITY) + .build()); + executor.scheduleAtFixedRate( + new Runnable() { + @Override + public void run() { + // This is not exactly thread-safe, but is OK for our use. + // The only thread that writes the volatile is this task. + generation = generation + 1; + } + }, + checkFrequencyMillis, + checkFrequencyMillis, + TimeUnit.MILLISECONDS); } else { // Magic generation 0 triggers ProjectState to always // check on each needsRefresh() request we make to it. @@ -72,13 +75,12 @@ public class ProjectCacheClock { private static long checkFrequency(Config serverConfig) { String freq = serverConfig.getString("cache", "projects", "checkFrequency"); - if (freq != null - && ("disabled".equalsIgnoreCase(freq) || "off".equalsIgnoreCase(freq))) { + if (freq != null && ("disabled".equalsIgnoreCase(freq) || "off".equalsIgnoreCase(freq))) { return Long.MAX_VALUE; } return TimeUnit.MILLISECONDS.convert( - ConfigUtil.getTimeUnit(serverConfig, - "cache", "projects", "checkFrequency", - 5, TimeUnit.MINUTES), TimeUnit.MINUTES); + ConfigUtil.getTimeUnit( + serverConfig, "cache", "projects", "checkFrequency", 5, TimeUnit.MINUTES), + TimeUnit.MINUTES); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheImpl.java index c2d7b7df13..3ca7bd83eb 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheImpl.java @@ -34,12 +34,6 @@ import com.google.inject.Singleton; import com.google.inject.TypeLiteral; import com.google.inject.internal.UniqueAnnotations; import com.google.inject.name.Named; - -import org.eclipse.jgit.errors.RepositoryNotFoundException; -import org.eclipse.jgit.lib.Repository; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.util.Collections; import java.util.Iterator; @@ -50,12 +44,15 @@ import java.util.SortedSet; import java.util.concurrent.ExecutionException; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; +import org.eclipse.jgit.errors.RepositoryNotFoundException; +import org.eclipse.jgit.lib.Repository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** Cache of project information, including access rights. */ @Singleton public class ProjectCacheImpl implements ProjectCache { - private static final Logger log = LoggerFactory - .getLogger(ProjectCacheImpl.class); + private static final Logger log = LoggerFactory.getLogger(ProjectCacheImpl.class); private static final String CACHE_NAME = "projects"; private static final String CACHE_LIST = "project_list"; @@ -64,20 +61,17 @@ public class ProjectCacheImpl implements ProjectCache { return new CacheModule() { @Override protected void configure() { - cache(CACHE_NAME, String.class, ProjectState.class) - .loader(Loader.class); + cache(CACHE_NAME, String.class, ProjectState.class).loader(Loader.class); - cache(CACHE_LIST, - ListKey.class, - new TypeLiteral>() {}) - .maximumWeight(1) - .loader(Lister.class); + cache(CACHE_LIST, ListKey.class, new TypeLiteral>() {}) + .maximumWeight(1) + .loader(Lister.class); bind(ProjectCacheImpl.class); bind(ProjectCache.class).to(ProjectCacheImpl.class); bind(LifecycleListener.class) - .annotatedWith(UniqueAnnotations.create()) - .to(ProjectCacheWarmer.class); + .annotatedWith(UniqueAnnotations.create()) + .to(ProjectCacheWarmer.class); } }; } @@ -127,7 +121,7 @@ public class ProjectCacheImpl implements ProjectCache { @Override public ProjectState get(final Project.NameKey projectName) { - try { + try { return checkedGet(projectName); } catch (IOException e) { return null; @@ -135,8 +129,7 @@ public class ProjectCacheImpl implements ProjectCache { } @Override - public ProjectState checkedGet(Project.NameKey projectName) - throws IOException { + public ProjectState checkedGet(Project.NameKey projectName) throws IOException { if (projectName == null) { return null; } @@ -213,7 +206,9 @@ public class ProjectCacheImpl implements ProjectCache { @Override public Set guessRelevantGroupUUIDs() { - return all().stream().map(n -> byName.getIfPresent(n.get())) + return all() + .stream() + .map(n -> byName.getIfPresent(n.get())) .filter(Objects::nonNull) .flatMap(p -> p.getConfig().getAllGroupUUIDs().stream()) // getAllGroupUUIDs shouldn't really return null UUIDs, but harden @@ -252,7 +247,7 @@ public class ProjectCacheImpl implements ProjectCache { next = r; return true; } - itr = Collections. emptyList().iterator(); + itr = Collections.emptyList().iterator(); return false; } @@ -306,8 +301,7 @@ public class ProjectCacheImpl implements ProjectCache { static class ListKey { static final ListKey ALL = new ListKey(); - private ListKey() { - } + private ListKey() {} } static class Lister extends CacheLoader> { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheWarmer.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheWarmer.java index 729aa9d75d..5e0ba288cc 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheWarmer.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheWarmer.java @@ -20,21 +20,18 @@ import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.Config; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import org.eclipse.jgit.lib.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Singleton public class ProjectCacheWarmer implements LifecycleListener { - private static final Logger log = - LoggerFactory.getLogger(ProjectCacheWarmer.class); + private static final Logger log = LoggerFactory.getLogger(ProjectCacheWarmer.class); private final Config config; private final ProjectCache cache; @@ -50,36 +47,37 @@ public class ProjectCacheWarmer implements LifecycleListener { int cpus = Runtime.getRuntime().availableProcessors(); if (config.getBoolean("cache", "projects", "loadOnStartup", false)) { final ThreadPoolExecutor pool = - new ScheduledThreadPoolExecutor(config.getInt("cache", "projects", - "loadThreads", cpus), new ThreadFactoryBuilder().setNameFormat( - "ProjectCacheLoader-%d").build()); + new ScheduledThreadPoolExecutor( + config.getInt("cache", "projects", "loadThreads", cpus), + new ThreadFactoryBuilder().setNameFormat("ProjectCacheLoader-%d").build()); ExecutorService scheduler = Executors.newFixedThreadPool(1); log.info("Loading project cache"); - scheduler.execute(new Runnable() { - @Override - public void run() { - for (final Project.NameKey name : cache.all()) { - pool.execute(new Runnable() { - @Override - public void run() { - cache.get(name); + scheduler.execute( + new Runnable() { + @Override + public void run() { + for (final Project.NameKey name : cache.all()) { + pool.execute( + new Runnable() { + @Override + public void run() { + cache.get(name); + } + }); } - }); - } - pool.shutdown(); - try { - pool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS); - log.info("Finished loading project cache"); - } catch (InterruptedException e) { - log.warn("Interrupted while waiting for project cache to load"); - } - } - }); + pool.shutdown(); + try { + pool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS); + log.info("Finished loading project cache"); + } catch (InterruptedException e) { + log.warn("Interrupted while waiting for project cache to load"); + } + } + }); } } @Override - public void stop() { - } + public void stop() {} } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java index ca016307a3..d312951c4c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java @@ -48,14 +48,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; - -import org.eclipse.jgit.lib.Ref; -import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.revwalk.RevCommit; -import org.eclipse.jgit.revwalk.RevWalk; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.util.ArrayList; import java.util.Collection; @@ -65,6 +57,12 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.revwalk.RevWalk; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** Access control management for a user accessing a project's data. */ public class ProjectControl { @@ -90,8 +88,8 @@ public class ProjectControl { return p.controlFor(user); } - public ProjectControl validateFor(Project.NameKey nameKey, int need, - CurrentUser user) throws NoSuchProjectException, IOException { + public ProjectControl validateFor(Project.NameKey nameKey, int need, CurrentUser user) + throws NoSuchProjectException, IOException { final ProjectControl c = controlFor(nameKey, user); if ((need & VISIBLE) == VISIBLE && c.isVisible()) { return c; @@ -111,23 +109,20 @@ public class ProjectControl { userCache = uc; } - public ProjectControl controlFor(final Project.NameKey nameKey) - throws NoSuchProjectException { + public ProjectControl controlFor(final Project.NameKey nameKey) throws NoSuchProjectException { return userCache.get().get(nameKey); } - public ProjectControl validateFor(final Project.NameKey nameKey) - throws NoSuchProjectException { + public ProjectControl validateFor(final Project.NameKey nameKey) throws NoSuchProjectException { return validateFor(nameKey, VISIBLE); } - public ProjectControl ownerFor(final Project.NameKey nameKey) - throws NoSuchProjectException { + public ProjectControl ownerFor(final Project.NameKey nameKey) throws NoSuchProjectException { return validateFor(nameKey, OWNER); } - public ProjectControl validateFor(final Project.NameKey nameKey, - final int need) throws NoSuchProjectException { + public ProjectControl validateFor(final Project.NameKey nameKey, final int need) + throws NoSuchProjectException { final ProjectControl c = controlFor(nameKey); if ((need & VISIBLE) == VISIBLE && c.isVisible()) { return c; @@ -164,7 +159,8 @@ public class ProjectControl { private Boolean declaredOwner; @Inject - ProjectControl(@GitUploadPackGroups Set uploadGroups, + ProjectControl( + @GitUploadPackGroups Set uploadGroups, @GitReceivePackGroups Set receiveGroups, ProjectCache pc, PermissionCollection.Factory permissionFilter, @@ -197,28 +193,24 @@ public class ProjectControl { return r; } - public ChangeControl controlFor(ReviewDb db, Change change) - throws OrmException { - return changeControlFactory.create(controlForRef(change.getDest()), db, - change.getProject(), change.getId()); + public ChangeControl controlFor(ReviewDb db, Change change) throws OrmException { + return changeControlFactory.create( + controlForRef(change.getDest()), db, change.getProject(), change.getId()); } /** - * Create a change control for a change that was loaded from index. This - * method should only be used when database access is harmful and potentially - * stale data from the index is acceptable. + * Create a change control for a change that was loaded from index. This method should only be + * used when database access is harmful and potentially stale data from the index is acceptable. * * @param change change loaded from secondary index * @return change control */ public ChangeControl controlForIndexedChange(Change change) { - return changeControlFactory - .createForIndexedChange(controlForRef(change.getDest()), change); + return changeControlFactory.createForIndexedChange(controlForRef(change.getDest()), change); } public ChangeControl controlFor(ChangeNotes notes) { - return changeControlFactory - .create(controlForRef(notes.getChange().getDest()), notes); + return changeControlFactory.create(controlForRef(notes.getChange().getDest()), notes); } public RefControl controlForRef(Branch.NameKey ref) { @@ -231,8 +223,7 @@ public class ProjectControl { } RefControl ctl = refControls.get(refName); if (ctl == null) { - PermissionCollection relevant = - permissionFilter.filter(access(), refName, user); + PermissionCollection relevant = permissionFilter.filter(access(), refName, user); ctl = new RefControl(this, refName, relevant); refControls.put(refName, ctl); } @@ -260,30 +251,26 @@ public class ProjectControl { /** Returns whether the project is hidden. */ public boolean isHidden() { - return getProject().getState().equals( - com.google.gerrit.extensions.client.ProjectState.HIDDEN); + return getProject().getState().equals(com.google.gerrit.extensions.client.ProjectState.HIDDEN); } /** - * Returns whether the project is readable to the current user. Note - * that the project could still be hidden. + * Returns whether the project is readable to the current user. Note that the project could still + * be hidden. */ public boolean isReadable() { - return (user.isInternalUser() - || canPerformOnAnyRef(Permission.READ)); + return (user.isInternalUser() || canPerformOnAnyRef(Permission.READ)); } /** - * Returns whether the project is accessible to the current user, i.e. - * readable and not hidden. + * Returns whether the project is accessible to the current user, i.e. readable and not hidden. */ public boolean isVisible() { return isReadable() && !isHidden(); } public boolean canAddRefs() { - return (canPerformOnAnyRef(Permission.CREATE) - || isOwnerAnyRef()); + return (canPerformOnAnyRef(Permission.CREATE) || isOwnerAnyRef()); } public boolean canUpload() { @@ -291,8 +278,7 @@ public class ProjectControl { AccessSection section = matcher.section; if (section.getName().startsWith("refs/for/")) { Permission permission = section.getPermission(Permission.PUSH); - if (permission != null - && controlForRef(section.getName()).canPerform(Permission.PUSH)) { + if (permission != null && controlForRef(section.getName()).canPerform(Permission.PUSH)) { return true; } } @@ -302,18 +288,16 @@ public class ProjectControl { /** Can this user see all the refs in this projects? */ public boolean allRefsAreVisible() { - return allRefsAreVisible(Collections. emptySet()); + return allRefsAreVisible(Collections.emptySet()); } public boolean allRefsAreVisible(Set ignore) { - return user.isInternalUser() - || canPerformOnAllRefs(Permission.READ, ignore); + return user.isInternalUser() || canPerformOnAllRefs(Permission.READ, ignore); } /** Is this user a project owner? Ownership does not imply {@link #isVisible()} */ public boolean isOwner() { - return (isDeclaredOwner() - && !controlForRef("refs/*").isBlocked(Permission.OWNER)) + return (isDeclaredOwner() && !controlForRef("refs/*").isBlocked(Permission.OWNER)) || user.getCapabilities().canAdministrateServer(); } @@ -327,14 +311,12 @@ public class ProjectControl { /** Does this user have ownership on at least one reference name? */ public boolean isOwnerAnyRef() { - return canPerformOnAnyRef(Permission.OWNER) - || user.getCapabilities().canAdministrateServer(); + return canPerformOnAnyRef(Permission.OWNER) || user.getCapabilities().canAdministrateServer(); } /** @return true if the user can upload to at least one reference */ public Capable canPushToAtLeastOneRef() { - if (!canPerformOnAnyRef(Permission.PUSH) && - !canPerformOnAnyRef(Permission.CREATE_TAG)) { + if (!canPerformOnAnyRef(Permission.PUSH) && !canPerformOnAnyRef(Permission.CREATE_TAG)) { String pName = state.getProject().getName(); return new Capable("Upload denied for project '" + pName + "'"); } @@ -352,8 +334,7 @@ public class ProjectControl { return getGroups(localAccess()); } - private static Set getGroups( - final List sectionMatcherList) { + private static Set getGroups(final List sectionMatcherList) { final Set all = new HashSet<>(); for (final SectionMatcher matcher : sectionMatcherList) { final AccessSection section = matcher.section; @@ -367,7 +348,7 @@ public class ProjectControl { } private Capable verifyActiveContributorAgreement() { - if (! (user.isIdentifiedUser())) { + if (!(user.isIdentifiedUser())) { return new Capable("Must be logged in to verify Contributor Agreement"); } final IdentifiedUser iUser = user.asIdentifiedUser(); @@ -378,7 +359,8 @@ public class ProjectControl { groupIds = okGroupIds; for (PermissionRule rule : ca.getAccepted()) { - if ((rule.getAction() == Action.ALLOW) && (rule.getGroup() != null) + if ((rule.getAction() == Action.ALLOW) + && (rule.getGroup() != null) && (rule.getGroup().getUUID() != null)) { groupIds.add(new AccountGroup.UUID(rule.getGroup().getUUID().get())); } @@ -522,45 +504,44 @@ public class ProjectControl { public boolean canReadCommit(ReviewDb db, Repository repo, RevCommit commit) { // Look for changes associated with the commit. try { - List changes = queryProvider.get() - .byProjectCommit(getProject().getNameKey(), commit); + List changes = + queryProvider.get().byProjectCommit(getProject().getNameKey(), commit); for (ChangeData change : changes) { if (controlFor(db, change.change()).isVisible(db)) { return true; } } } catch (OrmException e) { - log.error("Cannot look up change for commit " + commit.name() + " in " - + getProject().getName(), e); + log.error( + "Cannot look up change for commit " + commit.name() + " in " + getProject().getName(), e); } // Scan all visible refs. return canReadCommitFromVisibleRef(db, repo, commit); } - private boolean canReadCommitFromVisibleRef(ReviewDb db, Repository repo, - RevCommit commit) { + private boolean canReadCommitFromVisibleRef(ReviewDb db, Repository repo, RevCommit commit) { try (RevWalk rw = new RevWalk(repo)) { - return isMergedIntoVisibleRef(repo, db, rw, commit, - repo.getAllRefs().values()); + return isMergedIntoVisibleRef(repo, db, rw, commit, repo.getAllRefs().values()); } catch (IOException e) { - String msg = String.format( - "Cannot verify permissions to commit object %s in repository %s", - commit.name(), getProject().getNameKey()); + String msg = + String.format( + "Cannot verify permissions to commit object %s in repository %s", + commit.name(), getProject().getNameKey()); log.error(msg, e); return false; } } - boolean isMergedIntoVisibleRef(Repository repo, ReviewDb db, RevWalk rw, - RevCommit commit, Collection unfilteredRefs) throws IOException { - VisibleRefFilter filter = new VisibleRefFilter( - tagCache, changeNotesFactory, changeCache, repo, this, db, true); + boolean isMergedIntoVisibleRef( + Repository repo, ReviewDb db, RevWalk rw, RevCommit commit, Collection unfilteredRefs) + throws IOException { + VisibleRefFilter filter = + new VisibleRefFilter(tagCache, changeNotesFactory, changeCache, repo, this, db, true); Map m = Maps.newHashMapWithExpectedSize(unfilteredRefs.size()); for (Ref r : unfilteredRefs) { m.put(r.getName(), r); } Map refs = filter.filter(m, true); - return !refs.isEmpty() - && IncludedInResolver.includedInOne(repo, rw, commit, refs.values()); + return !refs.isEmpty() && IncludedInResolver.includedInOne(repo, rw, commit, refs.values()); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectHierarchyIterator.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectHierarchyIterator.java index 0724ce951f..9d9e5bbb35 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectHierarchyIterator.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectHierarchyIterator.java @@ -19,19 +19,17 @@ import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.config.AllProjectsName; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; import java.util.Set; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Iterates from a project up through its parents to All-Projects. - *

- * If a cycle is detected the cycle is broken and All-Projects is visited. + * + *

If a cycle is detected the cycle is broken and All-Projects is visited. */ class ProjectHierarchyIterator implements Iterator { private static final Logger log = LoggerFactory.getLogger(ProjectHierarchyIterator.class); @@ -41,9 +39,7 @@ class ProjectHierarchyIterator implements Iterator { private final Set seen; private ProjectState next; - ProjectHierarchyIterator(ProjectCache c, - AllProjectsName all, - ProjectState firstResult) { + ProjectHierarchyIterator(ProjectCache c, AllProjectsName all, ProjectState firstResult) { cache = c; allProjectsName = all; @@ -95,8 +91,8 @@ class ProjectHierarchyIterator implements Iterator { } int idx = order.lastIndexOf(parentName.get()); order.add(parentName.get()); - log.warn("Cycle detected in projects: " - + Joiner.on(" -> ").join(order.subList(idx, order.size()))); + log.warn( + "Cycle detected in projects: " + Joiner.on(" -> ").join(order.subList(idx, order.size()))); return false; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectJson.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectJson.java index 767e36a3e6..b4b9c497fd 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectJson.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectJson.java @@ -23,7 +23,6 @@ import com.google.gerrit.server.WebLinks; import com.google.gerrit.server.config.AllProjectsName; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.util.List; @Singleton @@ -33,8 +32,7 @@ public class ProjectJson { private final WebLinks webLinks; @Inject - ProjectJson(AllProjectsName allProjectsName, - WebLinks webLinks) { + ProjectJson(AllProjectsName allProjectsName, WebLinks webLinks) { this.allProjects = allProjectsName; this.webLinks = webLinks; } @@ -51,8 +49,7 @@ public class ProjectJson { info.description = Strings.emptyToNull(p.getDescription()); info.state = p.getState(); info.id = Url.encode(info.name); - List links = - webLinks.getProjectLinks(p.getName()); + List links = webLinks.getProjectLinks(p.getName()); info.webLinks = links.isEmpty() ? null : links; return info; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectNode.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectNode.java index 9eafc4bc73..403efd2ab2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectNode.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectNode.java @@ -19,7 +19,6 @@ import com.google.gerrit.server.config.AllProjectsName; import com.google.gerrit.server.util.TreeFormatter.TreeNode; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - import java.util.SortedSet; import java.util.TreeSet; @@ -36,8 +35,10 @@ public class ProjectNode implements TreeNode, Comparable { private final SortedSet children = new TreeSet<>(); @Inject - protected ProjectNode(final AllProjectsName allProjectsName, - @Assisted final Project project, @Assisted final boolean isVisible) { + protected ProjectNode( + final AllProjectsName allProjectsName, + @Assisted final Project project, + @Assisted final boolean isVisible) { this.allProjectsName = allProjectsName; this.project = project; this.isVisible = isVisible; @@ -46,8 +47,7 @@ public class ProjectNode implements TreeNode, Comparable { /** * Returns the project parent name. * - * @return Project parent name, {@code null} for the 'All-Projects' root - * project + * @return Project parent name, {@code null} for the 'All-Projects' root project */ public Project.NameKey getParentName() { return project.getParent(allProjectsName); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectRef.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectRef.java index 8d3185d010..be5fda0e4d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectRef.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectRef.java @@ -20,6 +20,7 @@ import com.google.gerrit.reviewdb.client.Project; @AutoValue abstract class ProjectRef { public abstract Project.NameKey project(); + public abstract String ref(); static ProjectRef create(Project.NameKey project, String ref) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java index f4ef129734..8b8745e19f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java @@ -48,16 +48,8 @@ import com.google.gerrit.server.git.ProjectConfig; import com.google.gerrit.server.git.ProjectLevelConfig; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - import com.googlecode.prolog_cafe.exceptions.CompileException; import com.googlecode.prolog_cafe.lang.PrologMachineCopy; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.Ref; -import org.eclipse.jgit.lib.Repository; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.io.Reader; import java.nio.file.Files; @@ -73,11 +65,15 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Function; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.lib.Repository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** Cached information on a project. */ public class ProjectState { - private static final Logger log = - LoggerFactory.getLogger(ProjectState.class); + private static final Logger log = LoggerFactory.getLogger(ProjectState.class); public interface Factory { ProjectState create(ProjectConfig config); @@ -138,9 +134,10 @@ public class ProjectState { this.commentLinks = commentLinks; this.config = config; this.configs = new HashMap<>(); - this.capabilities = isAllProjects - ? capabilityFactory.create(config.getAccessSection(AccessSection.GLOBAL_CAPABILITIES)) - : null; + this.capabilities = + isAllProjects + ? capabilityFactory.create(config.getAccessSection(AccessSection.GLOBAL_CAPABILITIES)) + : null; if (isAllProjects && !Permission.canBeOnAllProjects(AccessSection.ALL, Permission.OWNER)) { localOwners = Collections.emptySet(); @@ -190,9 +187,8 @@ public class ProjectState { } /** - * @return cached computation of all global capabilities. This should only be - * invoked on the state from {@link ProjectCache#getAllProjects()}. - * Null on any other project. + * @return cached computation of all global capabilities. This should only be invoked on the state + * from {@link ProjectCache#getAllProjects()}. Null on any other project. */ public CapabilityCollection getCapabilityCollection() { return capabilities; @@ -202,24 +198,21 @@ public class ProjectState { public PrologEnvironment newPrologEnvironment() throws CompileException { PrologMachineCopy pmc = rulesMachine; if (pmc == null) { - pmc = rulesCache.loadMachine( - getProject().getNameKey(), - config.getRulesId()); + pmc = rulesCache.loadMachine(getProject().getNameKey(), config.getRulesId()); rulesMachine = pmc; } return envFactory.create(pmc); } /** - * Like {@link #newPrologEnvironment()} but instead of reading the rules.pl - * read the provided input stream. + * Like {@link #newPrologEnvironment()} but instead of reading the rules.pl read the provided + * input stream. * * @param name a name of the input stream. Could be any name. * @param in stream to read prolog rules from * @throws CompileException */ - public PrologEnvironment newPrologEnvironment(String name, Reader in) - throws CompileException { + public PrologEnvironment newPrologEnvironment(String name, Reader in) throws CompileException { PrologMachineCopy pmc = rulesCache.loadMachine(name, in); return envFactory.create(pmc); } @@ -260,8 +253,7 @@ public class ProjectState { sm = new ArrayList<>(fromConfig.size()); for (AccessSection section : fromConfig) { if (isAllProjects) { - List copy = - Lists.newArrayListWithCapacity(section.getPermissions().size()); + List copy = Lists.newArrayListWithCapacity(section.getPermissions().size()); for (Permission p : section.getPermissions()) { if (Permission.canBeOnAllProjects(section.getName(), p.getName())) { copy.add(p); @@ -271,8 +263,7 @@ public class ProjectState { section.setPermissions(copy); } - SectionMatcher matcher = SectionMatcher.wrap(getProject().getNameKey(), - section); + SectionMatcher matcher = SectionMatcher.wrap(getProject().getNameKey(), section); if (matcher != null) { sm.add(matcher); } @@ -283,9 +274,8 @@ public class ProjectState { } /** - * Obtain all local and inherited sections. This collection is looked up - * dynamically and is not cached. Callers should try to cache this result - * per-request as much as possible. + * Obtain all local and inherited sections. This collection is looked up dynamically and is not + * cached. Callers should try to cache this result per-request as much as possible. */ List getAllSections() { if (isAllProjects) { @@ -300,10 +290,9 @@ public class ProjectState { } /** - * @return all {@link AccountGroup}'s to which the owner privilege for - * 'refs/*' is assigned for this project (the local owners), if there - * are no local owners the local owners of the nearest parent project - * that has local owners are returned + * @return all {@link AccountGroup}'s to which the owner privilege for 'refs/*' is assigned for + * this project (the local owners), if there are no local owners the local owners of the + * nearest parent project that has local owners are returned */ public Set getOwners() { for (ProjectState p : tree()) { @@ -315,11 +304,10 @@ public class ProjectState { } /** - * @return all {@link AccountGroup}'s that are allowed to administrate the - * complete project. This includes all groups to which the owner - * privilege for 'refs/*' is assigned for this project (the local - * owners) and all groups to which the owner privilege for 'refs/*' is - * assigned for one of the parent projects (the inherited owners). + * @return all {@link AccountGroup}'s that are allowed to administrate the complete project. This + * includes all groups to which the owner privilege for 'refs/*' is assigned for this project + * (the local owners) and all groups to which the owner privilege for 'refs/*' is assigned for + * one of the parent projects (the inherited owners). */ public Set getAllOwners() { Set result = new HashSet<>(); @@ -336,24 +324,21 @@ public class ProjectState { } /** - * @return an iterable that walks through this project and then the parents of - * this project. Starts from this project and progresses up the - * hierarchy to All-Projects. + * @return an iterable that walks through this project and then the parents of this project. + * Starts from this project and progresses up the hierarchy to All-Projects. */ public Iterable tree() { return new Iterable() { @Override public Iterator iterator() { - return new ProjectHierarchyIterator( - projectCache, allProjectsName, - ProjectState.this); + return new ProjectHierarchyIterator(projectCache, allProjectsName, ProjectState.this); } }; } /** - * @return an iterable that walks in-order from All-Projects through the - * project hierarchy to this project. + * @return an iterable that walks in-order from All-Projects through the project hierarchy to this + * project. */ public Iterable treeInOrder() { List projects = Lists.newArrayList(tree()); @@ -362,9 +347,8 @@ public class ProjectState { } /** - * @return an iterable that walks through the parents of this project. Starts - * from the immediate parent of this project and progresses up the - * hierarchy to All-Projects. + * @return an iterable that walks through the parents of this project. Starts from the immediate + * parent of this project and progresses up the hierarchy to All-Projects. */ public FluentIterable parents() { return FluentIterable.from(tree()).skip(1); @@ -462,8 +446,7 @@ public class ProjectState { return null; } - public Collection getSubscribeSections( - Branch.NameKey branch) { + public Collection getSubscribeSections(Branch.NameKey branch) { Collection ret = new ArrayList<>(); for (ProjectState s : tree()) { ret.addAll(s.getConfig().getSubscribeSections(branch)); @@ -499,7 +482,8 @@ public class ProjectState { return ThemeInfo.INHERIT; } try { - return new ThemeInfo(readFile(dir.resolve(SitePaths.CSS_FILENAME)), + return new ThemeInfo( + readFile(dir.resolve(SitePaths.CSS_FILENAME)), readFile(dir.resolve(SitePaths.HEADER_FILENAME)), readFile(dir.resolve(SitePaths.FOOTER_FILENAME))); } catch (IOException e) { @@ -512,8 +496,7 @@ public class ProjectState { return Files.exists(p) ? new String(Files.readAllBytes(p), UTF_8) : null; } - private boolean getInheritableBoolean( - Function func) { + private boolean getInheritableBoolean(Function func) { for (ProjectState s : tree()) { switch (func.apply(s.getProject())) { case TRUE: diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectsCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectsCollection.java index 51603fcb25..dcb3404b67 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectsCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectsCollection.java @@ -28,15 +28,12 @@ import com.google.gerrit.server.OutputFormat; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; import org.eclipse.jgit.lib.Constants; -import java.io.IOException; - @Singleton -public class ProjectsCollection implements - RestCollection, - AcceptsCreate { +public class ProjectsCollection + implements RestCollection, AcceptsCreate { private final DynamicMap> views; private final Provider list; private final ProjectControl.GenericFactory controlFactory; @@ -44,10 +41,12 @@ public class ProjectsCollection implements private final CreateProject.Factory createProjectFactory; @Inject - ProjectsCollection(DynamicMap> views, + ProjectsCollection( + DynamicMap> views, Provider list, ProjectControl.GenericFactory controlFactory, - CreateProject.Factory factory, Provider user) { + CreateProject.Factory factory, + Provider user) { this.views = views; this.list = list; this.controlFactory = controlFactory; @@ -75,12 +74,11 @@ public class ProjectsCollection implements * * @param id ID of the project, can be a project name * @return the project - * @throws UnprocessableEntityException thrown if the project ID cannot be - * resolved or if the project is not visible to the calling user + * @throws UnprocessableEntityException thrown if the project ID cannot be resolved or if the + * project is not visible to the calling user * @throws IOException thrown when there is an error. */ - public ProjectResource parse(String id) - throws UnprocessableEntityException, IOException { + public ProjectResource parse(String id) throws UnprocessableEntityException, IOException { return parse(id, true); } @@ -88,34 +86,28 @@ public class ProjectsCollection implements * Parses a project ID from a request body and returns the project. * * @param id ID of the project, can be a project name - * @param checkVisibility Whether to check or not that project is visible to - * the calling user + * @param checkVisibility Whether to check or not that project is visible to the calling user * @return the project - * @throws UnprocessableEntityException thrown if the project ID cannot be - * resolved or if the project is not visible to the calling user and - * checkVisibility is true. + * @throws UnprocessableEntityException thrown if the project ID cannot be resolved or if the + * project is not visible to the calling user and checkVisibility is true. * @throws IOException thrown when there is an error. */ public ProjectResource parse(String id, boolean checkVisibility) throws UnprocessableEntityException, IOException { ProjectResource rsrc = _parse(id, checkVisibility); if (rsrc == null) { - throw new UnprocessableEntityException(String.format( - "Project Not Found: %s", id)); + throw new UnprocessableEntityException(String.format("Project Not Found: %s", id)); } return rsrc; } - private ProjectResource _parse(String id, boolean checkVisibility) - throws IOException { + private ProjectResource _parse(String id, boolean checkVisibility) throws IOException { if (id.endsWith(Constants.DOT_GIT_EXT)) { id = id.substring(0, id.length() - Constants.DOT_GIT_EXT.length()); } ProjectControl ctl; try { - ctl = controlFactory.controlFor( - new Project.NameKey(id), - user.get()); + ctl = controlFactory.controlFor(new Project.NameKey(id), user.get()); } catch (NoSuchProjectException e) { return null; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/PutBranch.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/PutBranch.java index 52bbdf3c24..9e0db6e3f4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/PutBranch.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/PutBranch.java @@ -24,9 +24,8 @@ import com.google.inject.Singleton; public class PutBranch implements RestModifyView { @Override - public BranchInfo apply(BranchResource rsrc, BranchInput input) - throws ResourceConflictException { - throw new ResourceConflictException("Branch \"" + rsrc.getBranchInfo().ref - + "\" already exists"); + public BranchInfo apply(BranchResource rsrc, BranchInput input) throws ResourceConflictException { + throw new ResourceConflictException( + "Branch \"" + rsrc.getBranchInfo().ref + "\" already exists"); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/PutConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/PutConfig.java index bf4cbbf9de..c5ded54eb7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/PutConfig.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/PutConfig.java @@ -40,17 +40,15 @@ import com.google.gerrit.server.git.TransferConfig; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.errors.RepositoryNotFoundException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.errors.RepositoryNotFoundException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Singleton public class PutConfig implements RestModifyView { @@ -68,7 +66,8 @@ public class PutConfig implements RestModifyView { private final Provider user; @Inject - PutConfig(@EnableSignedPush boolean serverEnableSignedPush, + PutConfig( + @EnableSignedPush boolean serverEnableSignedPush, Provider metaDataUpdateFactory, ProjectCache projectCache, ProjectState.Factory projectStateFactory, @@ -92,8 +91,7 @@ public class PutConfig implements RestModifyView { @Override public ConfigInfo apply(ProjectResource rsrc, ConfigInput input) - throws ResourceNotFoundException, BadRequestException, - ResourceConflictException { + throws ResourceNotFoundException, BadRequestException, ResourceConflictException { if (!rsrc.getControl().isOwner()) { throw new ResourceNotFoundException(rsrc.getName()); } @@ -101,8 +99,7 @@ public class PutConfig implements RestModifyView { } public ConfigInfo apply(ProjectControl ctrl, ConfigInput input) - throws ResourceNotFoundException, BadRequestException, - ResourceConflictException { + throws ResourceNotFoundException, BadRequestException, ResourceConflictException { Project.NameKey projectName = ctrl.getProject().getNameKey(); if (input == null) { throw new BadRequestException("config is required"); @@ -158,8 +155,7 @@ public class PutConfig implements RestModifyView { } if (input.pluginConfigValues != null) { - setPluginConfigValues(ctrl.getProjectState(), - projectConfig, input.pluginConfigValues); + setPluginConfigValues(ctrl.getProjectState(), projectConfig, input.pluginConfigValues); } md.setMessage("Modified project settings\n"); @@ -169,18 +165,22 @@ public class PutConfig implements RestModifyView { md.getRepository().setGitwebDescription(p.getDescription()); } catch (IOException e) { if (e.getCause() instanceof ConfigInvalidException) { - throw new ResourceConflictException("Cannot update " + projectName - + ": " + e.getCause().getMessage()); + throw new ResourceConflictException( + "Cannot update " + projectName + ": " + e.getCause().getMessage()); } - log.warn(String.format("Failed to update config of project %s.", - projectName), e); + log.warn(String.format("Failed to update config of project %s.", projectName), e); throw new ResourceConflictException("Cannot update " + projectName); } ProjectState state = projectStateFactory.create(projectConfig); - return new ConfigInfoImpl(serverEnableSignedPush, - state.controlFor(user.get()), config, pluginConfigEntries, - cfgFactory, allProjects, views); + return new ConfigInfoImpl( + serverEnableSignedPush, + state.controlFor(user.get()), + config, + pluginConfigEntries, + cfgFactory, + allProjects, + views); } catch (RepositoryNotFoundException notFound) { throw new ResourceNotFoundException(projectName.get()); } catch (ConfigInvalidException err) { @@ -190,19 +190,21 @@ public class PutConfig implements RestModifyView { } } - private void setPluginConfigValues(ProjectState projectState, - ProjectConfig projectConfig, Map> pluginConfigValues) + private void setPluginConfigValues( + ProjectState projectState, + ProjectConfig projectConfig, + Map> pluginConfigValues) throws BadRequestException { for (Entry> e : pluginConfigValues.entrySet()) { String pluginName = e.getKey(); PluginConfig cfg = projectConfig.getPluginConfig(pluginName); for (Entry v : e.getValue().entrySet()) { - ProjectConfigEntry projectConfigEntry = - pluginConfigEntries.get(pluginName, v.getKey()); + ProjectConfigEntry projectConfigEntry = pluginConfigEntries.get(pluginName, v.getKey()); if (projectConfigEntry != null) { if (!isValidParameterName(v.getKey())) { - log.warn(String.format( - "Parameter name '%s' must match '^[a-zA-Z0-9]+[a-zA-Z0-9-]*$'", v.getKey())); + log.warn( + String.format( + "Parameter name '%s' must match '^[a-zA-Z0-9]+[a-zA-Z0-9-]*$'", v.getKey())); continue; } String oldValue = cfg.getString(v.getKey()); @@ -214,8 +216,8 @@ public class PutConfig implements RestModifyView { } if (Strings.emptyToNull(value) != null) { if (!value.equals(oldValue)) { - validateProjectConfigEntryIsEditable(projectConfigEntry, - projectState, v.getKey(), pluginName); + validateProjectConfigEntryIsEditable( + projectConfigEntry, projectState, v.getKey(), pluginName); v.setValue(projectConfigEntry.preUpdate(v.getValue())); value = v.getValue().value; try { @@ -234,9 +236,13 @@ public class PutConfig implements RestModifyView { break; case LIST: if (!projectConfigEntry.getPermittedValues().contains(value)) { - throw new BadRequestException(String.format( - "The value '%s' is not permitted for parameter '%s' of plugin '" - + pluginName + "'", value, v.getKey())); + throw new BadRequestException( + String.format( + "The value '%s' is not permitted for parameter '%s' of plugin '" + + pluginName + + "'", + value, + v.getKey())); } //$FALL-THROUGH$ case STRING: @@ -246,45 +252,51 @@ public class PutConfig implements RestModifyView { cfg.setStringList(v.getKey(), v.getValue().values); break; default: - log.warn(String.format( - "The type '%s' of parameter '%s' is not supported.", - projectConfigEntry.getType().name(), v.getKey())); + log.warn( + String.format( + "The type '%s' of parameter '%s' is not supported.", + projectConfigEntry.getType().name(), v.getKey())); } } catch (NumberFormatException ex) { - throw new BadRequestException(String.format( - "The value '%s' of config parameter '%s' of plugin '%s' is invalid: %s", - v.getValue(), v.getKey(), pluginName, ex.getMessage())); + throw new BadRequestException( + String.format( + "The value '%s' of config parameter '%s' of plugin '%s' is invalid: %s", + v.getValue(), v.getKey(), pluginName, ex.getMessage())); } } } else { if (oldValue != null) { - validateProjectConfigEntryIsEditable(projectConfigEntry, - projectState, v.getKey(), pluginName); + validateProjectConfigEntryIsEditable( + projectConfigEntry, projectState, v.getKey(), pluginName); cfg.unset(v.getKey()); } } } else { - throw new BadRequestException(String.format( - "The config parameter '%s' of plugin '%s' does not exist.", - v.getKey(), pluginName)); + throw new BadRequestException( + String.format( + "The config parameter '%s' of plugin '%s' does not exist.", + v.getKey(), pluginName)); } } } } private static void validateProjectConfigEntryIsEditable( - ProjectConfigEntry projectConfigEntry, ProjectState projectState, - String parameterName, String pluginName) throws BadRequestException { + ProjectConfigEntry projectConfigEntry, + ProjectState projectState, + String parameterName, + String pluginName) + throws BadRequestException { if (!projectConfigEntry.isEditable(projectState)) { - throw new BadRequestException(String.format( - "Not allowed to set parameter '%s' of plugin '%s' on project '%s'.", - parameterName, pluginName, projectState.getProject().getName())); + throw new BadRequestException( + String.format( + "Not allowed to set parameter '%s' of plugin '%s' on project '%s'.", + parameterName, pluginName, projectState.getProject().getName())); } } private static boolean isValidParameterName(String name) { - return CharMatcher.javaLetterOrDigit() - .or(CharMatcher.is('-')) - .matchesAllOf(name) && !name.startsWith("-"); + return CharMatcher.javaLetterOrDigit().or(CharMatcher.is('-')).matchesAllOf(name) + && !name.startsWith("-"); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/PutDescription.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/PutDescription.java index 99f0b83df5..78230bd995 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/PutDescription.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/PutDescription.java @@ -28,28 +28,24 @@ import com.google.gerrit.server.git.MetaDataUpdate; import com.google.gerrit.server.git.ProjectConfig; import com.google.inject.Inject; import com.google.inject.Singleton; - +import java.io.IOException; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.RepositoryNotFoundException; -import java.io.IOException; - @Singleton public class PutDescription implements RestModifyView { private final ProjectCache cache; private final MetaDataUpdate.Server updateFactory; @Inject - PutDescription(ProjectCache cache, - MetaDataUpdate.Server updateFactory) { + PutDescription(ProjectCache cache, MetaDataUpdate.Server updateFactory) { this.cache = cache; this.updateFactory = updateFactory; } @Override - public Response apply(ProjectResource resource, - DescriptionInput input) throws AuthException, - ResourceConflictException, ResourceNotFoundException, IOException { + public Response apply(ProjectResource resource, DescriptionInput input) + throws AuthException, ResourceConflictException, ResourceNotFoundException, IOException { if (input == null) { input = new DescriptionInput(); // Delete would set description to null. } @@ -65,9 +61,9 @@ public class PutDescription implements RestModifyView @Override public Response apply(ProjectResource resource, ProjectInput input) throws ResourceConflictException { - throw new ResourceConflictException("Project \"" + resource.getName() - + "\" already exists"); + throw new ResourceConflictException("Project \"" + resource.getName() + "\" already exists"); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/PutTag.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/PutTag.java index 1be4b0e0d7..b8a8f6dcce 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/PutTag.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/PutTag.java @@ -22,9 +22,7 @@ import com.google.gerrit.extensions.restapi.RestModifyView; public class PutTag implements RestModifyView { @Override - public TagInfo apply(TagResource resource, TagInput input) - throws ResourceConflictException { - throw new ResourceConflictException("Tag \"" + resource.getTagInfo().ref - + "\" already exists"); + public TagInfo apply(TagResource resource, TagInput input) throws ResourceConflictException { + throw new ResourceConflictException("Tag \"" + resource.getTagInfo().ref + "\" already exists"); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/RefControl.java index 3314309103..8fabeafa0c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefControl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/RefControl.java @@ -22,7 +22,14 @@ import com.google.gerrit.reviewdb.client.RefNames; import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.server.CurrentUser; import com.google.gerrit.server.group.SystemGroupBackend; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.Ref; @@ -34,16 +41,6 @@ import org.eclipse.jgit.revwalk.RevWalk; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - - /** Manages access control for Git references (aka branches, tags). */ public class RefControl { private static final Logger log = LoggerFactory.getLogger(RefControl.class); @@ -62,8 +59,7 @@ public class RefControl { private Boolean canForgeCommitter; private Boolean isVisible; - RefControl(ProjectControl projectControl, String ref, - PermissionCollection relevant) { + RefControl(ProjectControl projectControl, String ref, PermissionCollection relevant) { this.projectControl = projectControl; this.refName = ref; this.relevant = relevant; @@ -106,16 +102,12 @@ public class RefControl { /** Can this user see this reference exists? */ public boolean isVisible() { if (isVisible == null) { - isVisible = - (getUser().isInternalUser() || canPerform(Permission.READ)) - && canRead(); + isVisible = (getUser().isInternalUser() || canPerform(Permission.READ)) && canRead(); } return isVisible; } - /** - * True if this reference is visible by all REGISTERED_USERS - */ + /** True if this reference is visible by all REGISTERED_USERS */ public boolean isVisibleByRegisteredUsers() { List access = relevant.getPermission(Permission.READ); List overridden = relevant.getOverridden(Permission.READ); @@ -138,36 +130,34 @@ public class RefControl { } /** - * Determines whether the user can upload a change to the ref controlled by - * this object. + * Determines whether the user can upload a change to the ref controlled by this object. * - * @return {@code true} if the user specified can upload a change to the Git - * ref + * @return {@code true} if the user specified can upload a change to the Git ref */ public boolean canUpload() { - return projectControl.controlForRef("refs/for/" + getRefName()) - .canPerform(Permission.PUSH) + return projectControl.controlForRef("refs/for/" + getRefName()).canPerform(Permission.PUSH) && canWrite(); } /** @return true if this user can add a new patch set to this ref */ public boolean canAddPatchSet() { - return projectControl.controlForRef("refs/for/" + getRefName()) - .canPerform(Permission.ADD_PATCH_SET) + return projectControl + .controlForRef("refs/for/" + getRefName()) + .canPerform(Permission.ADD_PATCH_SET) && canWrite(); } /** @return true if this user can submit merge patch sets to this ref */ public boolean canUploadMerges() { - return projectControl.controlForRef("refs/for/" + getRefName()) - .canPerform(Permission.PUSH_MERGE) + return projectControl + .controlForRef("refs/for/" + getRefName()) + .canPerform(Permission.PUSH_MERGE) && canWrite(); } /** @return true if this user can rebase changes on this ref */ public boolean canRebase() { - return canPerform(Permission.REBASE) - && canWrite(); + return canPerform(Permission.REBASE) && canWrite(); } /** @return true if this user can submit patch sets to this ref */ @@ -180,8 +170,7 @@ public class RefControl { // granting of powers beyond submitting to the configuration. return projectControl.isOwner(); } - return canPerform(Permission.SUBMIT, isChangeOwner) - && canWrite(); + return canPerform(Permission.SUBMIT, isChangeOwner) && canWrite(); } /** @return true if this user was granted submitAs to this ref */ @@ -191,8 +180,7 @@ public class RefControl { /** @return true if the user can update the reference as a fast-forward. */ public boolean canUpdate() { - if (RefNames.REFS_CONFIG.equals(refName) - && !projectControl.isOwner()) { + if (RefNames.REFS_CONFIG.equals(refName) && !projectControl.isOwner()) { // Pushing requires being at least project owner, in addition to push. // Pushing configuration changes modifies the access control // rules. Allowing this to be done by a non-project-owner opens @@ -202,13 +190,12 @@ public class RefControl { // On the AllProjects project the owner access right cannot be assigned, // this why for the AllProjects project we allow administrators to push // configuration changes if they have push without being project owner. - if (!(projectControl.getProjectState().isAllProjects() && - getUser().getCapabilities().canAdministrateServer())) { + if (!(projectControl.getProjectState().isAllProjects() + && getUser().getCapabilities().canAdministrateServer())) { return false; } } - return canPerform(Permission.PUSH) - && canWrite(); + return canPerform(Permission.PUSH) && canWrite(); } /** @return true if the user can rewind (force push) the reference. */ @@ -237,18 +224,15 @@ public class RefControl { } public boolean canWrite() { - return getProjectControl().getProject().getState().equals( - ProjectState.ACTIVE); + return getProjectControl().getProject().getState().equals(ProjectState.ACTIVE); } public boolean canRead() { - return getProjectControl().getProject().getState().equals( - ProjectState.READ_ONLY) || canWrite(); + return getProjectControl().getProject().getState().equals(ProjectState.READ_ONLY) || canWrite(); } private boolean canPushWithForce() { - if (!canWrite() || (RefNames.REFS_CONFIG.equals(refName) - && !projectControl.isOwner())) { + if (!canWrite() || (RefNames.REFS_CONFIG.equals(refName) && !projectControl.isOwner())) { // Pushing requires being at least project owner, in addition to push. // Pushing configuration changes modifies the access control // rules. Allowing this to be done by a non-project-owner opens @@ -325,8 +309,7 @@ public class RefControl { } } - private boolean canCreateCommit(ReviewDb db, Repository repo, - RevCommit commit) { + private boolean canCreateCommit(ReviewDb db, Repository repo, RevCommit commit) { if (canUpdate()) { // If the user has push permissions, they can create the ref regardless // of whether they are pushing any new objects along with the create. @@ -341,26 +324,23 @@ public class RefControl { return false; } - private boolean isMergedIntoBranchOrTag(ReviewDb db, Repository repo, - RevCommit commit) { + private boolean isMergedIntoBranchOrTag(ReviewDb db, Repository repo, RevCommit commit) { try (RevWalk rw = new RevWalk(repo)) { - List refs = new ArrayList<>( - repo.getRefDatabase().getRefs(Constants.R_HEADS).values()); + List refs = new ArrayList<>(repo.getRefDatabase().getRefs(Constants.R_HEADS).values()); refs.addAll(repo.getRefDatabase().getRefs(Constants.R_TAGS).values()); - return projectControl.isMergedIntoVisibleRef( - repo, db, rw, commit, refs); + return projectControl.isMergedIntoVisibleRef(repo, db, rw, commit, refs); } catch (IOException e) { - String msg = String.format( - "Cannot verify permissions to commit object %s in repository %s", - commit.name(), projectControl.getProject().getNameKey()); + String msg = + String.format( + "Cannot verify permissions to commit object %s in repository %s", + commit.name(), projectControl.getProject().getNameKey()); log.error(msg, e); } return false; } /** - * Determines whether the user can delete the Git ref controlled by this - * object. + * Determines whether the user can delete the Git ref controlled by this object. * * @return {@code true} if the user specified can delete a Git ref. */ @@ -509,21 +489,23 @@ public class RefControl { int getAllowMin() { return allowMin; } + int getAllowMax() { return allowMax; } + int getBlockMin() { // ALLOW wins over BLOCK on the same project return Math.min(blockMin, allowMin - 1); } + int getBlockMax() { // ALLOW wins over BLOCK on the same project return Math.max(blockMax, allowMax + 1); } } - private PermissionRange toRange(String permissionName, - List ruleList) { + private PermissionRange toRange(String permissionName, List ruleList) { Map ranges = new HashMap<>(); for (PermissionRule rule : ruleList) { ProjectRef p = relevant.getRuleProps(rule); @@ -565,8 +547,7 @@ public class RefControl { return !doCanPerform(permissionName, false, true); } - private boolean doCanPerform(String permissionName, boolean isChangeOwner, - boolean blockOnly) { + private boolean doCanPerform(String permissionName, boolean isChangeOwner, boolean blockOnly) { List access = access(permissionName, isChangeOwner); List overridden = relevant.getOverridden(permissionName); Set allows = new HashSet<>(); @@ -635,8 +616,7 @@ public class RefControl { } /** Rules for the given permission, or the empty list. */ - private List access(String permissionName, - boolean isChangeOwner) { + private List access(String permissionName, boolean isChangeOwner) { List rules = effective.get(permissionName); if (rules != null) { return rules; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefFilter.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/RefFilter.java index 63fb5955e2..a789a7b80b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefFilter.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/RefFilter.java @@ -19,10 +19,8 @@ import com.google.common.base.Strings; import com.google.common.collect.FluentIterable; import com.google.gerrit.extensions.api.projects.RefInfo; import com.google.gerrit.extensions.restapi.BadRequestException; - import dk.brics.automaton.RegExp; import dk.brics.automaton.RunAutomaton; - import java.util.List; import java.util.Locale; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefPattern.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/RefPattern.java index 8c850fb572..72face2fb6 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefPattern.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/RefPattern.java @@ -21,28 +21,26 @@ import com.google.common.cache.LoadingCache; import com.google.gerrit.common.data.AccessSection; import com.google.gerrit.common.data.RefConfigSection; import com.google.gerrit.common.errors.InvalidNameException; - import dk.brics.automaton.RegExp; - -import org.eclipse.jgit.lib.Repository; - import java.util.concurrent.ExecutionException; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; +import org.eclipse.jgit.lib.Repository; public class RefPattern { public static final String USERID_SHARDED = "shardeduserid"; public static final String USERNAME = "username"; - private static final LoadingCache exampleCache = CacheBuilder - .newBuilder() - .maximumSize(4000) - .build(new CacheLoader() { - @Override - public String load(String refPattern) { - return example(refPattern); - } - }); + private static final LoadingCache exampleCache = + CacheBuilder.newBuilder() + .maximumSize(4000) + .build( + new CacheLoader() { + @Override + public String load(String refPattern) { + return example(refPattern); + } + }); public static String shortestExample(String refPattern) { if (isRE(refPattern)) { @@ -65,8 +63,7 @@ public class RefPattern { // Repository.isValidRefName() if not combined with star [*]. // To get around this, we substitute the \0 with an arbitrary // accepted character. - return toRegExp(refPattern).toAutomaton().getShortestExample(true) - .replace('\0', '-'); + return toRegExp(refPattern).toAutomaton().getShortestExample(true).replace('\0', '-'); } public static boolean isRE(String refPattern) { @@ -80,8 +77,7 @@ public class RefPattern { return new RegExp(refPattern, RegExp.NONE); } - public static void validate(String refPattern) - throws InvalidNameException { + public static void validate(String refPattern) throws InvalidNameException { if (refPattern.startsWith(RefConfigSection.REGEX_PREFIX)) { if (!Repository.isValidRefName(shortestExample(refPattern))) { throw new InvalidNameException(refPattern); @@ -99,8 +95,7 @@ public class RefPattern { validateRegExp(refPattern); } - public static void validateRegExp(String refPattern) - throws InvalidNameException { + public static void validateRegExp(String refPattern) throws InvalidNameException { try { refPattern = refPattern.replace("${" + USERID_SHARDED + "}", ""); refPattern = refPattern.replace("${" + USERNAME + "}", ""); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefPatternMatcher.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/RefPatternMatcher.java index fe87b6b149..63da731cf1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefPatternMatcher.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/RefPatternMatcher.java @@ -23,9 +23,7 @@ import com.google.gerrit.common.data.ParameterizedString; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.RefNames; import com.google.gerrit.server.CurrentUser; - import dk.brics.automaton.Automaton; - import java.util.HashMap; import java.util.Map; import java.util.Set; @@ -99,11 +97,11 @@ public abstract class RefPatternMatcher { // allows the pattern prefix to be clipped, saving time on // evaluation. String replacement = ":PLACEHOLDER:"; - Map params = ImmutableMap.of( - RefPattern.USERID_SHARDED, replacement, - RefPattern.USERNAME, replacement); - Automaton am = - RefPattern.toRegExp(template.replace(params)).toAutomaton(); + Map params = + ImmutableMap.of( + RefPattern.USERID_SHARDED, replacement, + RefPattern.USERNAME, replacement); + Automaton am = RefPattern.toRegExp(template.replace(params)).toAutomaton(); String rePrefix = am.getCommonPrefix(); prefix = rePrefix.substring(0, rePrefix.indexOf(replacement)); } else { @@ -125,9 +123,7 @@ public abstract class RefPatternMatcher { u = username; } - Account.Id accountId = user.isIdentifiedUser() - ? user.getAccountId() - : null; + Account.Id accountId = user.isIdentifiedUser() ? user.getAccountId() : null; RefPatternMatcher next = getMatcher(expand(template, u, accountId)); if (next != null && next.match(expand(ref, u, accountId), user)) { return true; @@ -163,8 +159,8 @@ public abstract class RefPatternMatcher { return parameterizedRef; } - private String expand(ParameterizedString parameterizedRef, String userName, - Account.Id accountId) { + private String expand( + ParameterizedString parameterizedRef, String userName, Account.Id accountId) { Map params = new HashMap<>(); params.put(RefPattern.USERNAME, userName); if (accountId != null) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/RefResource.java index 9300d438de..124439f9ba 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefResource.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/RefResource.java @@ -20,13 +20,9 @@ public abstract class RefResource extends ProjectResource { super(control); } - /** - * @return the ref's name - */ + /** @return the ref's name */ public abstract String getRef(); - /** - * @return the ref's revision - */ + /** @return the ref's revision */ public abstract String getRevision(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/RefUtil.java index 680bba13a8..8a7e5f1b09 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/RefUtil.java @@ -21,7 +21,8 @@ import com.google.common.collect.Iterables; import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.reviewdb.client.RefNames; - +import java.io.IOException; +import java.util.Collections; import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.errors.RevisionSyntaxException; @@ -35,14 +36,11 @@ import org.eclipse.jgit.revwalk.RevWalk; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.Collections; - public class RefUtil { private static final Logger log = LoggerFactory.getLogger(RefUtil.class); - public static ObjectId parseBaseRevision(Repository repo, - Project.NameKey projectName, String baseRevision) + public static ObjectId parseBaseRevision( + Repository repo, Project.NameKey projectName, String baseRevision) throws InvalidRevisionException { try { ObjectId revid = repo.resolve(baseRevision); @@ -51,8 +49,8 @@ public class RefUtil { } return revid; } catch (IOException err) { - log.error("Cannot resolve \"" + baseRevision + "\" in project \"" - + projectName.get() + "\"", err); + log.error( + "Cannot resolve \"" + baseRevision + "\" in project \"" + projectName.get() + "\"", err); throw new InvalidRevisionException(); } catch (RevisionSyntaxException err) { log.error("Invalid revision syntax \"" + baseRevision + "\"", err); @@ -70,9 +68,9 @@ public class RefUtil { throw new InvalidRevisionException(); } RefDatabase refDb = repo.getRefDatabase(); - Iterable refs = Iterables.concat( - refDb.getRefs(Constants.R_HEADS).values(), - refDb.getRefs(Constants.R_TAGS).values()); + Iterable refs = + Iterables.concat( + refDb.getRefs(Constants.R_HEADS).values(), refDb.getRefs(Constants.R_TAGS).values()); Ref rc = refDb.exactRef(RefNames.REFS_CONFIG); if (rc != null) { refs = Iterables.concat(refs, Collections.singleton(rc)); @@ -89,8 +87,9 @@ public class RefUtil { } catch (IncorrectObjectTypeException | MissingObjectException err) { throw new InvalidRevisionException(); } catch (IOException err) { - log.error("Repository \"" + repo.getDirectory() - + "\" may be corrupt; suggest running git fsck", err); + log.error( + "Repository \"" + repo.getDirectory() + "\" may be corrupt; suggest running git fsck", + err); throw new InvalidRevisionException(); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefValidationHelper.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/RefValidationHelper.java index 6e2fd5dcd8..0a5980ca97 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefValidationHelper.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/RefValidationHelper.java @@ -21,7 +21,6 @@ import com.google.gerrit.server.git.validators.RefOperationValidators; import com.google.gerrit.server.validators.ValidationException; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - import org.eclipse.jgit.lib.RefUpdate; import org.eclipse.jgit.transport.ReceiveCommand.Type; @@ -34,14 +33,14 @@ public class RefValidationHelper { private final Type operationType; @Inject - RefValidationHelper(RefOperationValidators.Factory refValidatorsFactory, - @Assisted Type operationType) { + RefValidationHelper( + RefOperationValidators.Factory refValidatorsFactory, @Assisted Type operationType) { this.refValidatorsFactory = refValidatorsFactory; this.operationType = operationType; } - public void validateRefOperation(String projectName, IdentifiedUser user, - RefUpdate update) throws ResourceConflictException { + public void validateRefOperation(String projectName, IdentifiedUser user, RefUpdate update) + throws ResourceConflictException { RefOperationValidators refValidators = refValidatorsFactory.create( new Project(new Project.NameKey(projectName)), diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/RepositoryStatistics.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/RepositoryStatistics.java index de045b73b0..3cb4bac980 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/RepositoryStatistics.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/RepositoryStatistics.java @@ -15,7 +15,6 @@ package com.google.gerrit.server.project; import com.google.common.base.CaseFormat; - import java.util.Map.Entry; import java.util.Properties; import java.util.TreeMap; @@ -25,8 +24,9 @@ class RepositoryStatistics extends TreeMap { RepositoryStatistics(Properties p) { for (Entry e : p.entrySet()) { - put(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, - e.getKey().toString()), e.getValue()); + put( + CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, e.getKey().toString()), + e.getValue()); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SectionMatcher.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SectionMatcher.java index 478357a048..65b17bb5b3 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SectionMatcher.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/SectionMatcher.java @@ -20,9 +20,9 @@ import com.google.gerrit.server.CurrentUser; /** * Matches an AccessSection against a reference name. - *

- * These matchers are "compiled" versions of the AccessSection name, supporting - * faster selection of which sections are relevant to any given input reference. + * + *

These matchers are "compiled" versions of the AccessSection name, supporting faster selection + * of which sections are relevant to any given input reference. */ class SectionMatcher extends RefPatternMatcher { static SectionMatcher wrap(Project.NameKey project, AccessSection section) { @@ -37,8 +37,7 @@ class SectionMatcher extends RefPatternMatcher { final AccessSection section; final RefPatternMatcher matcher; - SectionMatcher(Project.NameKey project, AccessSection section, - RefPatternMatcher matcher) { + SectionMatcher(Project.NameKey project, AccessSection section, RefPatternMatcher matcher) { this.project = project; this.section = section; this.matcher = matcher; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SectionSortCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SectionSortCache.java index 7b6b5c8630..a02941e2cc 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SectionSortCache.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/SectionSortCache.java @@ -24,20 +24,17 @@ import com.google.inject.Inject; import com.google.inject.Module; import com.google.inject.Singleton; import com.google.inject.name.Named; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.ArrayList; import java.util.Collections; import java.util.IdentityHashMap; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** Caches the order AccessSections should be sorted for evaluation. */ @Singleton public class SectionSortCache { - private static final Logger log = - LoggerFactory.getLogger(SectionSortCache.class); + private static final Logger log = LoggerFactory.getLogger(SectionSortCache.class); private static final String CACHE_NAME = "permission_sort"; @@ -108,8 +105,8 @@ public class SectionSortCache { return sections.toArray(new AccessSection[sections.size()]); } - private static boolean isIdentityTransform(List sections, - IdentityHashMap srcMap) { + private static boolean isIdentityTransform( + List sections, IdentityHashMap srcMap) { for (int i = 0; i < sections.size(); i++) { if (i != srcMap.get(sections.get(i))) { return false; @@ -121,7 +118,9 @@ public class SectionSortCache { @AutoValue abstract static class EntryKey { public abstract String ref(); + public abstract List patterns(); + public abstract int cachedHashCode(); static EntryKey create(String refName, List sections) { @@ -132,8 +131,7 @@ public class SectionSortCache { patterns.add(n); hc = hc * 31 + n.hashCode(); } - return new AutoValue_SectionSortCache_EntryKey( - refName, ImmutableList.copyOf(patterns), hc); + return new AutoValue_SectionSortCache_EntryKey(refName, ImmutableList.copyOf(patterns), hc); } @Override @@ -145,9 +143,9 @@ public class SectionSortCache { static final class EntryVal { /** * Maps the input index to the output index. - *

- * For {@code x == order[y]} the expression means move the item at - * source position {@code x} to the output position {@code y}. + * + *

For {@code x == order[y]} the expression means move the item at source position {@code x} + * to the output position {@code y}. */ final int[] order; @@ -155,6 +153,4 @@ public class SectionSortCache { this.order = order; } } - - } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetAccess.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetAccess.java index 33e24acf1b..b36a09d0cd 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetAccess.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetAccess.java @@ -44,18 +44,15 @@ import com.google.gerrit.server.group.GroupsCollection; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.eclipse.jgit.errors.ConfigInvalidException; - import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; +import org.eclipse.jgit.errors.ConfigInvalidException; @Singleton -public class SetAccess implements - RestModifyView { +public class SetAccess implements RestModifyView { protected final GroupBackend groupBackend; private final GroupsCollection groupsCollection; private final Provider metaDataUpdateFactory; @@ -66,7 +63,8 @@ public class SetAccess implements private final Provider identifiedUser; @Inject - private SetAccess(GroupBackend groupBackend, + private SetAccess( + GroupBackend groupBackend, Provider metaDataUpdateFactory, AllProjectsName allProjects, Provider setParent, @@ -85,11 +83,9 @@ public class SetAccess implements } @Override - public ProjectAccessInfo apply(ProjectResource rsrc, - ProjectAccessInput input) - throws ResourceNotFoundException, ResourceConflictException, - IOException, AuthException, BadRequestException, - UnprocessableEntityException{ + public ProjectAccessInfo apply(ProjectResource rsrc, ProjectAccessInput input) + throws ResourceNotFoundException, ResourceConflictException, IOException, AuthException, + BadRequestException, UnprocessableEntityException { List removals = getAccessSections(input.remove); List additions = getAccessSections(input.add); MetaDataUpdate.User metaDataUpdateUser = metaDataUpdateFactory.get(); @@ -97,29 +93,27 @@ public class SetAccess implements ProjectControl projectControl = rsrc.getControl(); ProjectConfig config; - Project.NameKey newParentProjectName = input.parent == null ? - null : new Project.NameKey(input.parent); + Project.NameKey newParentProjectName = + input.parent == null ? null : new Project.NameKey(input.parent); try (MetaDataUpdate md = metaDataUpdateUser.create(rsrc.getNameKey())) { config = ProjectConfig.read(md); // Perform removal checks for (AccessSection section : removals) { - boolean isGlobalCapabilities = - AccessSection.GLOBAL_CAPABILITIES.equals(section.getName()); + boolean isGlobalCapabilities = AccessSection.GLOBAL_CAPABILITIES.equals(section.getName()); if (isGlobalCapabilities) { checkGlobalCapabilityPermissions(config.getName()); } else if (!projectControl.controlForRef(section.getName()).isOwner()) { - throw new AuthException("You are not allowed to edit permissions" - + "for ref: " + section.getName()); + throw new AuthException( + "You are not allowed to edit permissions" + "for ref: " + section.getName()); } } // Perform addition checks for (AccessSection section : additions) { String name = section.getName(); - boolean isGlobalCapabilities = - AccessSection.GLOBAL_CAPABILITIES.equals(name); + boolean isGlobalCapabilities = AccessSection.GLOBAL_CAPABILITIES.equals(name); if (isGlobalCapabilities) { checkGlobalCapabilityPermissions(config.getName()); @@ -128,18 +122,16 @@ public class SetAccess implements throw new BadRequestException("invalid section name"); } if (!projectControl.controlForRef(name).isOwner()) { - throw new AuthException("You are not allowed to edit permissions" - + "for ref: " + name); + throw new AuthException("You are not allowed to edit permissions" + "for ref: " + name); } RefPattern.validate(name); } // Check all permissions for soundness for (Permission p : section.getPermissions()) { - if (isGlobalCapabilities - && !GlobalCapability.isCapability(p.getName())) { - throw new BadRequestException("Cannot add non-global capability " - + p.getName() + " to global capabilities"); + if (isGlobalCapabilities && !GlobalCapability.isCapability(p.getName())) { + throw new BadRequestException( + "Cannot add non-global capability " + p.getName() + " to global capabilities"); } } } @@ -164,16 +156,14 @@ public class SetAccess implements // Apply additions for (AccessSection section : additions) { - AccessSection currentAccessSection = - config.getAccessSection(section.getName()); + AccessSection currentAccessSection = config.getAccessSection(section.getName()); if (currentAccessSection == null) { // Add AccessSection config.replace(section); } else { for (Permission p : section.getPermissions()) { - Permission currentPermission = - currentAccessSection.getPermission(p.getName()); + Permission currentPermission = currentAccessSection.getPermission(p.getName()); if (currentPermission == null) { // Add Permission currentAccessSection.addPermission(p); @@ -187,14 +177,16 @@ public class SetAccess implements } } - if (newParentProjectName != null && - !config.getProject().getNameKey().equals(allProjects) && - !config.getProject().getParent(allProjects) - .equals(newParentProjectName)) { + if (newParentProjectName != null + && !config.getProject().getNameKey().equals(allProjects) + && !config.getProject().getParent(allProjects).equals(newParentProjectName)) { try { - setParent.get().validateParentUpdate(projectControl, - MoreObjects.firstNonNull(newParentProjectName, allProjects).get(), - true); + setParent + .get() + .validateParentUpdate( + projectControl, + MoreObjects.firstNonNull(newParentProjectName, allProjects).get(), + true); } catch (UnprocessableEntityException e) { throw new ResourceConflictException(e.getMessage(), e); } @@ -221,25 +213,22 @@ public class SetAccess implements return getAccess.apply(rsrc.getNameKey()); } - private List getAccessSections( - Map sectionInfos) + private List getAccessSections(Map sectionInfos) throws UnprocessableEntityException { if (sectionInfos == null) { return Collections.emptyList(); } List sections = new ArrayList<>(sectionInfos.size()); - for (Map.Entry entry : - sectionInfos.entrySet()) { + for (Map.Entry entry : sectionInfos.entrySet()) { AccessSection accessSection = new AccessSection(entry.getKey()); if (entry.getValue().permissions == null) { continue; } - for (Map.Entry permissionEntry : entry - .getValue().permissions - .entrySet()) { + for (Map.Entry permissionEntry : + entry.getValue().permissions.entrySet()) { Permission p = new Permission(permissionEntry.getKey()); if (permissionEntry.getValue().exclusive != null) { p.setExclusiveGroup(permissionEntry.getValue().exclusive); @@ -252,14 +241,12 @@ public class SetAccess implements permissionEntry.getValue().rules.entrySet()) { PermissionRuleInfo pri = permissionRuleInfoEntry.getValue(); - GroupDescription.Basic group = groupsCollection - .parseId(permissionRuleInfoEntry.getKey()); + GroupDescription.Basic group = groupsCollection.parseId(permissionRuleInfoEntry.getKey()); if (group == null) { throw new UnprocessableEntityException( - permissionRuleInfoEntry.getKey() + " is not a valid group ID"); + permissionRuleInfoEntry.getKey() + " is not a valid group ID"); } - PermissionRule r = new PermissionRule( - GroupReference.forGroup(group)); + PermissionRule r = new PermissionRule(GroupReference.forGroup(group)); if (pri != null) { if (pri.max != null) { r.setMax(pri.max); @@ -282,16 +269,16 @@ public class SetAccess implements } private void checkGlobalCapabilityPermissions(Project.NameKey projectName) - throws BadRequestException, AuthException { + throws BadRequestException, AuthException { if (!allProjects.equals(projectName)) { - throw new BadRequestException("Cannot edit global capabilities " - + "for projects other than " + allProjects.get()); + throw new BadRequestException( + "Cannot edit global capabilities " + "for projects other than " + allProjects.get()); } if (!identifiedUser.get().getCapabilities().canAdministrateServer()) { - throw new AuthException("Editing global capabilities " - + "requires " + GlobalCapability.ADMINISTRATE_SERVER); + throw new AuthException( + "Editing global capabilities " + "requires " + GlobalCapability.ADMINISTRATE_SERVER); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetDashboard.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetDashboard.java index 594763eb0f..332ea768e0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetDashboard.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetDashboard.java @@ -27,14 +27,12 @@ import com.google.gerrit.server.project.SetDashboard.Input; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; @Singleton class SetDashboard implements RestModifyView { static class Input { - @DefaultInput - String id; + @DefaultInput String id; String commitMessage; } @@ -48,7 +46,7 @@ class SetDashboard implements RestModifyView { @Override public Response apply(DashboardResource resource, Input input) throws AuthException, BadRequestException, ResourceConflictException, - MethodNotAllowedException, ResourceNotFoundException, IOException { + MethodNotAllowedException, ResourceNotFoundException, IOException { if (resource.isProjectDefault()) { return defaultSetter.get().apply(resource, input); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetDefaultDashboard.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetDefaultDashboard.java index 641c3a75ba..be9329651b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetDefaultDashboard.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetDefaultDashboard.java @@ -30,13 +30,11 @@ import com.google.gerrit.server.project.DashboardsCollection.DashboardInfo; import com.google.gerrit.server.project.SetDashboard.Input; import com.google.inject.Inject; import com.google.inject.Provider; - +import java.io.IOException; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.kohsuke.args4j.Option; -import java.io.IOException; - class SetDefaultDashboard implements RestModifyView { private final ProjectCache cache; private final MetaDataUpdate.Server updateFactory; @@ -47,7 +45,8 @@ class SetDefaultDashboard implements RestModifyView { private boolean inherited; @Inject - SetDefaultDashboard(ProjectCache cache, + SetDefaultDashboard( + ProjectCache cache, MetaDataUpdate.Server updateFactory, DashboardsCollection dashboards, Provider get) { @@ -60,7 +59,7 @@ class SetDefaultDashboard implements RestModifyView { @Override public Response apply(DashboardResource resource, Input input) throws AuthException, BadRequestException, ResourceConflictException, - ResourceNotFoundException, IOException { + ResourceNotFoundException, IOException { if (input == null) { input = new Input(); // Delete would set input to null. } @@ -74,9 +73,7 @@ class SetDefaultDashboard implements RestModifyView { DashboardResource target = null; if (input.id != null) { try { - target = dashboards.parse( - new ProjectResource(ctl), - IdString.fromUrl(input.id)); + target = dashboards.parse(new ProjectResource(ctl), IdString.fromUrl(input.id)); } catch (ResourceNotFoundException e) { throw new BadRequestException("dashboard " + input.id + " not found"); } catch (ConfigInvalidException e) { @@ -93,11 +90,12 @@ class SetDefaultDashboard implements RestModifyView { project.setLocalDefaultDashboard(input.id); } - String msg = MoreObjects.firstNonNull( - Strings.emptyToNull(input.commitMessage), - input.id == null - ? "Removed default dashboard.\n" - : String.format("Changed default dashboard to %s.\n", input.id)); + String msg = + MoreObjects.firstNonNull( + Strings.emptyToNull(input.commitMessage), + input.id == null + ? "Removed default dashboard.\n" + : String.format("Changed default dashboard to %s.\n", input.id)); if (!msg.endsWith("\n")) { msg += "\n"; } @@ -115,13 +113,12 @@ class SetDefaultDashboard implements RestModifyView { } catch (RepositoryNotFoundException notFound) { throw new ResourceNotFoundException(ctl.getProject().getName()); } catch (ConfigInvalidException e) { - throw new ResourceConflictException(String.format( - "invalid project.config: %s", e.getMessage())); + throw new ResourceConflictException( + String.format("invalid project.config: %s", e.getMessage())); } } - static class CreateDefault implements - RestModifyView { + static class CreateDefault implements RestModifyView { private final Provider setDefault; @Option(name = "--inherited", usage = "set dashboard inherited by children") @@ -135,11 +132,10 @@ class SetDefaultDashboard implements RestModifyView { @Override public Response apply(ProjectResource resource, Input input) throws AuthException, BadRequestException, ResourceConflictException, - ResourceNotFoundException, IOException { + ResourceNotFoundException, IOException { SetDefaultDashboard set = setDefault.get(); set.inherited = inherited; - return set.apply( - DashboardResource.projectDefault(resource.getControl()), input); + return set.apply(DashboardResource.projectDefault(resource.getControl()), input); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetHead.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetHead.java index 442447fcc5..6c45bc350f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetHead.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetHead.java @@ -32,7 +32,8 @@ import com.google.gerrit.server.project.SetHead.Input; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.io.IOException; +import java.util.Map; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.Ref; @@ -41,16 +42,12 @@ import org.eclipse.jgit.lib.Repository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.Map; - @Singleton public class SetHead implements RestModifyView { private static final Logger log = LoggerFactory.getLogger(SetHead.class); public static class Input { - @DefaultInput - public String ref; + @DefaultInput public String ref; } private final GitRepositoryManager repoManager; @@ -58,7 +55,8 @@ public class SetHead implements RestModifyView { private final DynamicSet headUpdatedListeners; @Inject - SetHead(GitRepositoryManager repoManager, + SetHead( + GitRepositoryManager repoManager, Provider identifiedUser, DynamicSet headUpdatedListeners) { this.repoManager = repoManager; @@ -67,9 +65,9 @@ public class SetHead implements RestModifyView { } @Override - public String apply(final ProjectResource rsrc, Input input) throws AuthException, - ResourceNotFoundException, BadRequestException, - UnprocessableEntityException, IOException { + public String apply(final ProjectResource rsrc, Input input) + throws AuthException, ResourceNotFoundException, BadRequestException, + UnprocessableEntityException, IOException { if (!rsrc.getControl().isOwner()) { throw new AuthException("restricted to project owner"); } @@ -79,11 +77,9 @@ public class SetHead implements RestModifyView { String ref = RefNames.fullName(input.ref); try (Repository repo = repoManager.openRepository(rsrc.getNameKey())) { - Map cur = - repo.getRefDatabase().exactRef(Constants.HEAD, ref); + Map cur = repo.getRefDatabase().exactRef(Constants.HEAD, ref); if (!cur.containsKey(ref)) { - throw new UnprocessableEntityException(String.format( - "Ref Not Found: %s", ref)); + throw new UnprocessableEntityException(String.format("Ref Not Found: %s", ref)); } final String oldHead = cur.get(Constants.HEAD).getTarget().getName(); @@ -130,8 +126,7 @@ public class SetHead implements RestModifyView { } } - static class Event extends AbstractNoNotifyEvent - implements HeadUpdatedListener.Event { + static class Event extends AbstractNoNotifyEvent implements HeadUpdatedListener.Event { private final Project.NameKey nameKey; private final String oldHead; private final String newHead; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetParent.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetParent.java index cc215d2a7b..f8d649b3c3 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetParent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetParent.java @@ -33,17 +33,14 @@ import com.google.gerrit.server.git.ProjectConfig; import com.google.gerrit.server.project.SetParent.Input; import com.google.inject.Inject; import com.google.inject.Singleton; - +import java.io.IOException; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.RepositoryNotFoundException; -import java.io.IOException; - @Singleton public class SetParent implements RestModifyView { public static class Input { - @DefaultInput - public String parent; + @DefaultInput public String parent; public String commitMessage; } @@ -52,27 +49,25 @@ public class SetParent implements RestModifyView { private final AllProjectsName allProjects; @Inject - SetParent(ProjectCache cache, - MetaDataUpdate.Server updateFactory, - AllProjectsName allProjects) { + SetParent(ProjectCache cache, MetaDataUpdate.Server updateFactory, AllProjectsName allProjects) { this.cache = cache; this.updateFactory = updateFactory; this.allProjects = allProjects; } @Override - public String apply(ProjectResource rsrc, Input input) throws AuthException, - ResourceConflictException, ResourceNotFoundException, - UnprocessableEntityException, IOException { + public String apply(ProjectResource rsrc, Input input) + throws AuthException, ResourceConflictException, ResourceNotFoundException, + UnprocessableEntityException, IOException { return apply(rsrc, input, true); } public String apply(ProjectResource rsrc, Input input, boolean checkIfAdmin) - throws AuthException, ResourceConflictException, - ResourceNotFoundException, UnprocessableEntityException, IOException { + throws AuthException, ResourceConflictException, ResourceNotFoundException, + UnprocessableEntityException, IOException { ProjectControl ctl = rsrc.getControl(); - String parentName = MoreObjects.firstNonNull( - Strings.emptyToNull(input.parent), allProjects.get()); + String parentName = + MoreObjects.firstNonNull(Strings.emptyToNull(input.parent), allProjects.get()); validateParentUpdate(ctl, parentName, checkIfAdmin); try (MetaDataUpdate md = updateFactory.create(rsrc.getNameKey())) { ProjectConfig config = ProjectConfig.read(md); @@ -81,8 +76,7 @@ public class SetParent implements RestModifyView { String msg = Strings.emptyToNull(input.commitMessage); if (msg == null) { - msg = String.format( - "Changed parent to %s.\n", parentName); + msg = String.format("Changed parent to %s.\n", parentName); } else if (!msg.endsWith("\n")) { msg += "\n"; } @@ -97,39 +91,40 @@ public class SetParent implements RestModifyView { } catch (RepositoryNotFoundException notFound) { throw new ResourceNotFoundException(rsrc.getName()); } catch (ConfigInvalidException e) { - throw new ResourceConflictException(String.format( - "invalid project.config: %s", e.getMessage())); + throw new ResourceConflictException( + String.format("invalid project.config: %s", e.getMessage())); } } - public void validateParentUpdate(final ProjectControl ctl, String newParent, - boolean checkIfAdmin) throws AuthException, ResourceConflictException, - UnprocessableEntityException { + public void validateParentUpdate(final ProjectControl ctl, String newParent, boolean checkIfAdmin) + throws AuthException, ResourceConflictException, UnprocessableEntityException { IdentifiedUser user = ctl.getUser().asIdentifiedUser(); if (checkIfAdmin && !user.getCapabilities().canAdministrateServer()) { throw new AuthException("not administrator"); } if (ctl.getProject().getNameKey().equals(allProjects)) { - throw new ResourceConflictException("cannot set parent of " - + allProjects.get()); + throw new ResourceConflictException("cannot set parent of " + allProjects.get()); } newParent = Strings.emptyToNull(newParent); if (newParent != null) { ProjectState parent = cache.get(new Project.NameKey(newParent)); if (parent == null) { - throw new UnprocessableEntityException("parent project " + newParent - + " not found"); + throw new UnprocessableEntityException("parent project " + newParent + " not found"); } - if (Iterables.tryFind(parent.tree(), p -> { - return p.getProject().getNameKey() - .equals(ctl.getProject().getNameKey()); - }).isPresent()) { - throw new ResourceConflictException("cycle exists between " - + ctl.getProject().getName() + " and " - + parent.getProject().getName()); + if (Iterables.tryFind( + parent.tree(), + p -> { + return p.getProject().getNameKey().equals(ctl.getProject().getNameKey()); + }) + .isPresent()) { + throw new ResourceConflictException( + "cycle exists between " + + ctl.getProject().getName() + + " and " + + parent.getProject().getName()); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SubmitRuleEvaluator.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SubmitRuleEvaluator.java index 48cd7ee8da..e6ad352d9f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SubmitRuleEvaluator.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/SubmitRuleEvaluator.java @@ -29,7 +29,6 @@ import com.google.gerrit.rules.StoredValues; import com.google.gerrit.server.CurrentUser; import com.google.gerrit.server.query.change.ChangeData; import com.google.gwtorm.server.OrmException; - import com.googlecode.prolog_cafe.exceptions.CompileException; import com.googlecode.prolog_cafe.exceptions.ReductionLimitException; import com.googlecode.prolog_cafe.lang.IntegerTerm; @@ -39,26 +38,21 @@ import com.googlecode.prolog_cafe.lang.StructureTerm; import com.googlecode.prolog_cafe.lang.SymbolTerm; import com.googlecode.prolog_cafe.lang.Term; import com.googlecode.prolog_cafe.lang.VariableTerm; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.StringReader; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** - * Evaluates a submit-like Prolog rule found in the rules.pl file of the current - * project and filters the results through rules found in the parent projects, - * all the way up to All-Projects. + * Evaluates a submit-like Prolog rule found in the rules.pl file of the current project and filters + * the results through rules found in the parent projects, all the way up to All-Projects. */ public class SubmitRuleEvaluator { - private static final Logger log = LoggerFactory - .getLogger(SubmitRuleEvaluator.class); + private static final Logger log = LoggerFactory.getLogger(SubmitRuleEvaluator.class); - private static final String DEFAULT_MSG = - "Error evaluating project rules, check server log"; + private static final String DEFAULT_MSG = "Error evaluating project rules, check server log"; public static List defaultRuleError() { return createRuleError(DEFAULT_MSG); @@ -76,15 +70,14 @@ public class SubmitRuleEvaluator { } /** - * Exception thrown when the label term of a submit record - * unexpectedly didn't contain a user term. + * Exception thrown when the label term of a submit record unexpectedly didn't contain a user + * term. */ private static class UserTermExpected extends Exception { private static final long serialVersionUID = 1L; UserTermExpected(SubmitRecord.Label label) { - super(String.format("A label with the status %s must contain a user.", - label.toString())); + super(String.format("A label with the status %s must contain a user.", label.toString())); } } @@ -105,10 +98,10 @@ public class SubmitRuleEvaluator { } /** - * @return immutable snapshot of options configured so far. If neither {@link - * #getSubmitRule()} nor {@link #getSubmitType()} have been called yet, - * state within this instance is still mutable, so may change before - * evaluation. The instance's options are frozen at evaluation time. + * @return immutable snapshot of options configured so far. If neither {@link #getSubmitRule()} + * nor {@link #getSubmitType()} have been called yet, state within this instance is still + * mutable, so may change before evaluation. The instance's options are frozen at evaluation + * time. */ public SubmitRuleOptions getOptions() { if (opts != null) { @@ -128,22 +121,23 @@ public class SubmitRuleEvaluator { } /** - * @param ps patch set of the change to evaluate. If not set, the current - * patch set will be loaded from {@link #evaluate()} or {@link - * #getSubmitType}. + * @param ps patch set of the change to evaluate. If not set, the current patch set will be loaded + * from {@link #evaluate()} or {@link #getSubmitType}. * @return this */ public SubmitRuleEvaluator setPatchSet(PatchSet ps) { - checkArgument(ps.getId().getParentKey().equals(cd.getId()), - "Patch set %s does not match change %s", ps.getId(), cd.getId()); + checkArgument( + ps.getId().getParentKey().equals(cd.getId()), + "Patch set %s does not match change %s", + ps.getId(), + cd.getId()); patchSet = ps; return this; } /** - * @param fast if true assume reviewers are permitted to use label values - * currently stored on the change. Fast mode bypasses some reviewer - * permission checks. + * @param fast if true assume reviewers are permitted to use label values currently stored on the + * change. Fast mode bypasses some reviewer permission checks. * @return this */ public SubmitRuleEvaluator setFastEvalLabels(boolean fast) { @@ -193,8 +187,8 @@ public class SubmitRuleEvaluator { } /** - * @param log whether to log error messages in addition to returning error - * records. If true, error record messages will be less descriptive. + * @param log whether to log error messages in addition to returning error records. If true, error + * record messages will be less descriptive. */ public SubmitRuleEvaluator setLogErrors(boolean log) { logErrors = log; @@ -209,8 +203,8 @@ public class SubmitRuleEvaluator { /** * Evaluate the submit rules. * - * @return List of {@link SubmitRecord} objects returned from the evaluated - * rules, including any errors. + * @return List of {@link SubmitRecord} objects returned from the evaluated rules, including any + * errors. */ public List evaluate() { initOptions(); @@ -224,8 +218,8 @@ public class SubmitRuleEvaluator { try { initPatchSet(); } catch (OrmException e) { - return ruleError("Error looking up patch set " - + control.getChange().currentPatchSetId(), e); + return ruleError( + "Error looking up patch set " + control.getChange().currentPatchSetId(), e); } if (c.getStatus() == Change.Status.DRAFT || patchSet.isDraft()) { return cannotSubmitDraft(); @@ -234,9 +228,13 @@ public class SubmitRuleEvaluator { List results; try { - results = evaluateImpl("locate_submit_rule", "can_submit", - "locate_submit_filter", "filter_submit_results", - control.getUser()); + results = + evaluateImpl( + "locate_submit_rule", + "can_submit", + "locate_submit_filter", + "filter_submit_results", + control.getUser()); } catch (RuleEvalException e) { return ruleError(e.getMessage(), e); } @@ -246,9 +244,10 @@ public class SubmitRuleEvaluator { // at least one result informing the caller of the labels that are // required for this change to be submittable. Each label will indicate // whether or not that is actually possible given the permissions. - return ruleError(String.format("Submit rule '%s' for change %s of %s has " - + "no solution.", getSubmitRuleName(), cd.getId(), - getProjectName())); + return ruleError( + String.format( + "Submit rule '%s' for change %s of %s has " + "no solution.", + getSubmitRuleName(), cd.getId(), getProjectName())); } return resultsToSubmitRecord(getSubmitRule(), results); @@ -264,9 +263,8 @@ public class SubmitRuleEvaluator { } return createRuleError("Cannot submit draft changes"); } catch (OrmException err) { - PatchSet.Id psId = patchSet != null - ? patchSet.getId() - : control.getChange().currentPatchSetId(); + PatchSet.Id psId = + patchSet != null ? patchSet.getId() : control.getChange().currentPatchSetId(); String msg = "Cannot check visibility of patch set " + psId; log.error(msg, err); return createRuleError(msg); @@ -276,13 +274,12 @@ public class SubmitRuleEvaluator { /** * Convert the results from Prolog Cafe's format to Gerrit's common format. * - * can_submit/1 terminates when an ok(P) record is found. Therefore walk - * the results backwards, using only that ok(P) record if it exists. This - * skips partial results that occur early in the output. Later after the loop - * the out collection is reversed to restore it to the original ordering. + *

can_submit/1 terminates when an ok(P) record is found. Therefore walk the results backwards, + * using only that ok(P) record if it exists. This skips partial results that occur early in the + * output. Later after the loop the out collection is reversed to restore it to the original + * ordering. */ - private List resultsToSubmitRecord( - Term submitRule, List results) { + private List resultsToSubmitRecord(Term submitRule, List results) { List out = new ArrayList<>(results.size()); for (int resultIdx = results.size() - 1; 0 <= resultIdx; resultIdx--) { Term submitRecord = results.get(resultIdx); @@ -363,9 +360,14 @@ public class SubmitRuleEvaluator { } private List invalidResult(Term rule, Term record, String reason) { - return ruleError(String.format("Submit rule %s for change %s of %s output " - + "invalid result: %s%s", rule, cd.getId(), getProjectName(), record, - (reason == null ? "" : ". Reason: " + reason))); + return ruleError( + String.format( + "Submit rule %s for change %s of %s output " + "invalid result: %s%s", + rule, + cd.getId(), + getProjectName(), + record, + (reason == null ? "" : ". Reason: " + reason))); } private List invalidResult(Term rule, Term record) { @@ -398,19 +400,16 @@ public class SubmitRuleEvaluator { try { initPatchSet(); } catch (OrmException e) { - return typeError("Error looking up patch set " - + control.getChange().currentPatchSetId(), e); + return typeError("Error looking up patch set " + control.getChange().currentPatchSetId(), e); } try { if (control.getChange().getStatus() == Change.Status.DRAFT && !control.isDraftVisible(cd.db(), cd)) { - return SubmitTypeRecord.error( - "Patch set " + patchSet.getId() + " not found"); + return SubmitTypeRecord.error("Patch set " + patchSet.getId() + " not found"); } if (patchSet.isDraft() && !control.isDraftVisible(cd.db(), cd)) { - return SubmitTypeRecord.error( - "Patch set " + patchSet.getId() + " not found"); + return SubmitTypeRecord.error("Patch set " + patchSet.getId() + " not found"); } } catch (OrmException err) { String msg = "Cannot read patch set " + patchSet.getId(); @@ -420,37 +419,57 @@ public class SubmitRuleEvaluator { List results; try { - results = evaluateImpl("locate_submit_type", "get_submit_type", - "locate_submit_type_filter", "filter_submit_type_results", - // Do not include current user in submit type evaluation. This is used - // for mergeability checks, which are stored persistently and so must - // have a consistent view of the submit type. - null); + results = + evaluateImpl( + "locate_submit_type", + "get_submit_type", + "locate_submit_type_filter", + "filter_submit_type_results", + // Do not include current user in submit type evaluation. This is used + // for mergeability checks, which are stored persistently and so must + // have a consistent view of the submit type. + null); } catch (RuleEvalException e) { return typeError(e.getMessage(), e); } if (results.isEmpty()) { // Should never occur for a well written rule - return typeError("Submit rule '" + getSubmitRuleName() + "' for change " - + cd.getId() + " of " + getProjectName() + " has no solution."); + return typeError( + "Submit rule '" + + getSubmitRuleName() + + "' for change " + + cd.getId() + + " of " + + getProjectName() + + " has no solution."); } Term typeTerm = results.get(0); if (!(typeTerm instanceof SymbolTerm)) { - return typeError("Submit rule '" + getSubmitRuleName() + "' for change " - + cd.getId() + " of " + getProjectName() - + " did not return a symbol."); + return typeError( + "Submit rule '" + + getSubmitRuleName() + + "' for change " + + cd.getId() + + " of " + + getProjectName() + + " did not return a symbol."); } String typeName = ((SymbolTerm) typeTerm).name(); try { - return SubmitTypeRecord.OK( - SubmitType.valueOf(typeName.toUpperCase())); + return SubmitTypeRecord.OK(SubmitType.valueOf(typeName.toUpperCase())); } catch (IllegalArgumentException e) { - return typeError("Submit type rule " + getSubmitRule() + " for change " - + cd.getId() + " of " + getProjectName() + " output invalid result: " - + typeName); + return typeError( + "Submit type rule " + + getSubmitRule() + + " for change " + + cd.getId() + + " of " + + getProjectName() + + " output invalid result: " + + typeName); } } @@ -475,7 +494,8 @@ public class SubmitRuleEvaluator { String userRuleWrapperName, String filterRuleLocatorName, String filterRuleWrapperName, - CurrentUser user) throws RuleEvalException { + CurrentUser user) + throws RuleEvalException { PrologEnvironment env = getPrologEnvironment(user); try { Term sr = env.once("gerrit", userRuleLocatorName, new VariableTerm()); @@ -485,31 +505,31 @@ public class SubmitRuleEvaluator { List results = new ArrayList<>(); try { - for (Term[] template : env.all("gerrit", userRuleWrapperName, sr, - new VariableTerm())) { + for (Term[] template : env.all("gerrit", userRuleWrapperName, sr, new VariableTerm())) { results.add(template[1]); } } catch (ReductionLimitException err) { - throw new RuleEvalException(String.format( - "%s on change %d of %s", - err.getMessage(), cd.getId().get(), getProjectName())); + throw new RuleEvalException( + String.format( + "%s on change %d of %s", err.getMessage(), cd.getId().get(), getProjectName())); } catch (RuntimeException err) { - throw new RuleEvalException(String.format( - "Exception calling %s on change %d of %s", - sr, cd.getId().get(), getProjectName()), err); + throw new RuleEvalException( + String.format( + "Exception calling %s on change %d of %s", sr, cd.getId().get(), getProjectName()), + err); } finally { reductionsConsumed = env.getReductions(); } Term resultsTerm = toListTerm(results); if (!opts.skipFilters()) { - resultsTerm = runSubmitFilters( - resultsTerm, env, filterRuleLocatorName, filterRuleWrapperName); + resultsTerm = + runSubmitFilters(resultsTerm, env, filterRuleLocatorName, filterRuleWrapperName); } List r; if (resultsTerm instanceof ListTerm) { r = new ArrayList<>(); - for (Term t = resultsTerm; t instanceof ListTerm;) { + for (Term t = resultsTerm; t instanceof ListTerm; ) { ListTerm l = (ListTerm) t; r.add(l.car().dereference()); t = l.cdr().dereference(); @@ -524,23 +544,19 @@ public class SubmitRuleEvaluator { } } - private PrologEnvironment getPrologEnvironment(CurrentUser user) - throws RuleEvalException { + private PrologEnvironment getPrologEnvironment(CurrentUser user) throws RuleEvalException { ProjectState projectState = control.getProjectControl().getProjectState(); PrologEnvironment env; try { if (opts.rule() == null) { env = projectState.newPrologEnvironment(); } else { - env = projectState.newPrologEnvironment( - "stdin", new StringReader(opts.rule())); + env = projectState.newPrologEnvironment("stdin", new StringReader(opts.rule())); } } catch (CompileException err) { String msg; if (opts.rule() == null && control.getProjectControl().isOwner()) { - msg = String.format( - "Cannot load rules.pl for %s: %s", - getProjectName(), err.getMessage()); + msg = String.format("Cannot load rules.pl for %s: %s", getProjectName(), err.getMessage()); } else if (opts.rule() != null) { msg = err.getMessage(); } else { @@ -557,8 +573,11 @@ public class SubmitRuleEvaluator { return env; } - private Term runSubmitFilters(Term results, PrologEnvironment env, - String filterRuleLocatorName, String filterRuleWrapperName) + private Term runSubmitFilters( + Term results, + PrologEnvironment env, + String filterRuleLocatorName, + String filterRuleWrapperName) throws RuleEvalException { ProjectState projectState = control.getProjectControl().getProjectState(); PrologEnvironment childEnv = env; @@ -567,30 +586,32 @@ public class SubmitRuleEvaluator { try { parentEnv = parentState.newPrologEnvironment(); } catch (CompileException err) { - throw new RuleEvalException("Cannot consult rules.pl for " - + parentState.getProject().getName(), err); + throw new RuleEvalException( + "Cannot consult rules.pl for " + parentState.getProject().getName(), err); } parentEnv.copyStoredValues(childEnv); - Term filterRule = - parentEnv.once("gerrit", filterRuleLocatorName, new VariableTerm()); + Term filterRule = parentEnv.once("gerrit", filterRuleLocatorName, new VariableTerm()); try { if (opts.fastEvalLabels()) { env.once("gerrit", "assume_range_from_label"); } Term[] template = - parentEnv.once("gerrit", filterRuleWrapperName, filterRule, - results, new VariableTerm()); + parentEnv.once( + "gerrit", filterRuleWrapperName, filterRule, results, new VariableTerm()); results = template[2]; } catch (ReductionLimitException err) { - throw new RuleEvalException(String.format( - "%s on change %d of %s", - err.getMessage(), cd.getId().get(), parentState.getProject().getName())); + throw new RuleEvalException( + String.format( + "%s on change %d of %s", + err.getMessage(), cd.getId().get(), parentState.getProject().getName())); } catch (RuntimeException err) { - throw new RuleEvalException(String.format( - "Exception calling %s on change %d of %s", - filterRule, cd.getId().get(), parentState.getProject().getName()), err); + throw new RuleEvalException( + String.format( + "Exception calling %s on change %d of %s", + filterRule, cd.getId().get(), parentState.getProject().getName()), + err); } finally { reductionsConsumed += env.getReductions(); } @@ -607,8 +628,7 @@ public class SubmitRuleEvaluator { return list; } - private void appliedBy(SubmitRecord.Label label, Term status) - throws UserTermExpected { + private void appliedBy(SubmitRecord.Label label, Term status) throws UserTermExpected { if (status instanceof StructureTerm && status.arity() == 1) { Term who = status.arg(0); if (isUser(who)) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SubmitRuleOptions.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SubmitRuleOptions.java index 97155ac2c2..6d6aaad907 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SubmitRuleOptions.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/SubmitRuleOptions.java @@ -19,10 +19,9 @@ import com.google.gerrit.common.Nullable; /** * Stable identifier for options passed to a particular submit rule evaluator. - *

- * Used to test whether it is ok to reuse a cached list of submit records. Does - * not include a change or patch set ID; callers are responsible for checking - * those on their own. + * + *

Used to test whether it is ok to reuse a cached list of submit records. Does not include a + * change or patch set ID; callers are responsible for checking those on their own. */ @AutoValue public abstract class SubmitRuleOptions { @@ -40,17 +39,26 @@ public abstract class SubmitRuleOptions { } public abstract boolean fastEvalLabels(); + public abstract boolean allowDraft(); + public abstract boolean allowClosed(); + public abstract boolean skipFilters(); - @Nullable public abstract String rule(); + + @Nullable + public abstract String rule(); @AutoValue.Builder public abstract static class Builder { public abstract SubmitRuleOptions.Builder fastEvalLabels(boolean fastEvalLabels); + public abstract SubmitRuleOptions.Builder allowDraft(boolean allowDraft); + public abstract SubmitRuleOptions.Builder allowClosed(boolean allowClosed); + public abstract SubmitRuleOptions.Builder skipFilters(boolean skipFilters); + public abstract SubmitRuleOptions.Builder rule(@Nullable String rule); public abstract SubmitRuleOptions build(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SuggestParentCandidates.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SuggestParentCandidates.java index a6717d5dd9..9d3005c6e2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SuggestParentCandidates.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/SuggestParentCandidates.java @@ -18,7 +18,6 @@ import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.config.AllProjectsName; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.util.ArrayList; import java.util.Comparator; import java.util.List; @@ -32,8 +31,10 @@ public class SuggestParentCandidates { private final AllProjectsName allProject; @Inject - SuggestParentCandidates(final ProjectControl.Factory projectControlFactory, - final ProjectCache projectCache, final AllProjectsName allProject) { + SuggestParentCandidates( + final ProjectControl.Factory projectControlFactory, + final ProjectCache projectCache, + final AllProjectsName allProject) { this.projectControlFactory = projectControlFactory; this.projectCache = projectCache; this.allProject = allProject; @@ -49,12 +50,14 @@ public class SuggestParentCandidates { } public List getProjects() throws NoSuchProjectException { - Set projects = new TreeSet<>(new Comparator() { - @Override - public int compare(Project o1, Project o2) { - return o1.getName().compareTo(o2.getName()); - } - }); + Set projects = + new TreeSet<>( + new Comparator() { + @Override + public int compare(Project o1, Project o2) { + return o1.getName().compareTo(o2.getName()); + } + }); for (Project.NameKey p : projectCache.all()) { try { final ProjectControl control = projectControlFactory.controlFor(p); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/TagsCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/TagsCollection.java index b324fe0dac..82afce4fe9 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/TagsCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/TagsCollection.java @@ -23,21 +23,20 @@ import com.google.gerrit.extensions.restapi.RestView; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.io.IOException; @Singleton -public class TagsCollection implements - ChildCollection, - AcceptsCreate { +public class TagsCollection + implements ChildCollection, AcceptsCreate { private final DynamicMap> views; private final Provider list; private final CreateTag.Factory createTagFactory; @Inject - public TagsCollection(DynamicMap> views, - Provider list, - CreateTag.Factory createTagFactory) { + public TagsCollection( + DynamicMap> views, + Provider list, + CreateTag.Factory createTagFactory) { this.views = views; this.list = list; this.createTagFactory = createTagFactory; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/AndPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/AndPredicate.java index 899e7891df..7e033559ea 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/AndPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/AndPredicate.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.query; import static com.google.common.base.Preconditions.checkState; import com.google.gwtorm.server.OrmException; - import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -85,8 +84,11 @@ public class AndPredicate extends Predicate implements Matchable { @Override public boolean match(final T object) throws OrmException { for (Predicate c : children) { - checkState(c.isMatchable(), "match invoked, but child predicate %s " - + "doesn't implement %s", c, Matchable.class.getName()); + checkState( + c.isMatchable(), + "match invoked, but child predicate %s " + "doesn't implement %s", + c, + Matchable.class.getName()); if (!c.asMatchable().match(object)) { return false; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/AndSource.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/AndSource.java index 4acd2ba452..dcd8a664e5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/AndSource.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/AndSource.java @@ -24,7 +24,6 @@ import com.google.gwtorm.server.ListResultSet; import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.OrmRuntimeException; import com.google.gwtorm.server.ResultSet; - import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -43,18 +42,18 @@ public class AndSource extends AndPredicate this(that, null, 0); } - public AndSource(Predicate that, - IsVisibleToPredicate isVisibleToPredicate) { + public AndSource(Predicate that, IsVisibleToPredicate isVisibleToPredicate) { this(that, isVisibleToPredicate, 0); } - public AndSource(Predicate that, - IsVisibleToPredicate isVisibleToPredicate, int start) { + public AndSource(Predicate that, IsVisibleToPredicate isVisibleToPredicate, int start) { this(ImmutableList.of(that), isVisibleToPredicate, start); } - public AndSource(Collection> that, - IsVisibleToPredicate isVisibleToPredicate, int start) { + public AndSource( + Collection> that, + IsVisibleToPredicate isVisibleToPredicate, + int start) { super(that); checkArgument(start >= 0, "negative start: %s", start); this.isVisibleToPredicate = isVisibleToPredicate; @@ -186,9 +185,7 @@ public class AndSource extends AndPredicate cmp = a.estimateCost() - b.estimateCost(); } - if (cmp == 0 - && a instanceof DataSource - && b instanceof DataSource) { + if (cmp == 0 && a instanceof DataSource && b instanceof DataSource) { DataSource as = (DataSource) a; DataSource bs = (DataSource) b; cmp = as.getCardinality() - bs.getCardinality(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/IntPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/IntPredicate.java index d336bb5d5a..6627687dcd 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/IntPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/IntPredicate.java @@ -44,8 +44,7 @@ public abstract class IntPredicate extends OperatorPredicate { } if (getClass() == other.getClass()) { final IntPredicate p = (IntPredicate) other; - return getOperator().equals(p.getOperator()) - && intValue() == p.intValue(); + return getOperator().equals(p.getOperator()) && intValue() == p.intValue(); } return false; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/InternalQuery.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/InternalQuery.java index e98211eb7d..87772d2dfd 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/InternalQuery.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/InternalQuery.java @@ -21,17 +21,15 @@ import com.google.gerrit.server.index.IndexCollection; import com.google.gerrit.server.index.IndexConfig; import com.google.gerrit.server.index.Schema; import com.google.gwtorm.server.OrmException; - import java.util.List; import java.util.Set; /** * Execute a single query over a secondary index, for use by Gerrit internals. - *

- * By default, visibility of returned entities is not enforced (unlike in {@link - * QueryProcessor}). The methods in this class are not typically used by - * user-facing paths, but rather by internal callers that need to process all - * matching results. + * + *

By default, visibility of returned entities is not enforced (unlike in {@link + * QueryProcessor}). The methods in this class are not typically used by user-facing paths, but + * rather by internal callers that need to process all matching results. */ public class InternalQuery { private final QueryProcessor queryProcessor; @@ -39,9 +37,10 @@ public class InternalQuery { protected final IndexConfig indexConfig; - protected InternalQuery(QueryProcessor queryProcessor, + protected InternalQuery( + QueryProcessor queryProcessor, IndexCollection> indexes, - IndexConfig indexConfig) { + IndexConfig indexConfig) { this.queryProcessor = queryProcessor.enforceVisibility(false); this.indexes = indexes; this.indexConfig = indexConfig; @@ -63,7 +62,7 @@ public class InternalQuery { } public InternalQuery noFields() { - queryProcessor.setRequestedFields(ImmutableSet. of()); + queryProcessor.setRequestedFields(ImmutableSet.of()); return this; } @@ -77,18 +76,17 @@ public class InternalQuery { /** * Run multiple queries in parallel. - *

- * If a limit was specified using {@link #setLimit(int)}, that limit is - * applied to each query independently. + * + *

If a limit was specified using {@link #setLimit(int)}, that limit is applied to each query + * independently. * * @param queries list of queries. - * @return results of the queries, one list of results per input query, in the - * same order as the input. + * @return results of the queries, one list of results per input query, in the same order as the + * input. */ public List> query(List> queries) throws OrmException { try { - return Lists.transform( - queryProcessor.query(queries), QueryResult::entities); + return Lists.transform(queryProcessor.query(queries), QueryResult::entities); } catch (QueryParseException e) { throw new OrmException(e); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/IsVisibleToPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/IsVisibleToPredicate.java index 87de6bd1df..9295eb97df 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/IsVisibleToPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/IsVisibleToPredicate.java @@ -17,8 +17,7 @@ package com.google.gerrit.server.query; import com.google.gerrit.server.CurrentUser; import com.google.gerrit.server.query.change.SingleGroupUser; -public abstract class IsVisibleToPredicate extends OperatorPredicate - implements Matchable { +public abstract class IsVisibleToPredicate extends OperatorPredicate implements Matchable { public IsVisibleToPredicate(String name, String value) { super(name, value); } @@ -28,8 +27,7 @@ public abstract class IsVisibleToPredicate extends OperatorPredicate return user.getAccountId().toString(); } if (user instanceof SingleGroupUser) { - return "group:" + user.getEffectiveGroups() - .getKnownGroups().iterator().next().toString(); + return "group:" + user.getEffectiveGroups().getKnownGroups().iterator().next().toString(); } return user.toString(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/NotPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/NotPredicate.java index 8ffba72f9b..530dfb9398 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/NotPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/NotPredicate.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.query; import static com.google.common.base.Preconditions.checkState; import com.google.gwtorm.server.OrmException; - import java.util.Collection; import java.util.Collections; import java.util.List; @@ -66,8 +65,11 @@ public class NotPredicate extends Predicate implements Matchable { @Override public boolean match(final T object) throws OrmException { - checkState(that.isMatchable(), "match invoked, but child predicate %s " - + "doesn't implement %s", that, Matchable.class.getName()); + checkState( + that.isMatchable(), + "match invoked, but child predicate %s " + "doesn't implement %s", + that, + Matchable.class.getName()); return !that.asMatchable().match(object); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/OperatorPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/OperatorPredicate.java index 2cb70afd19..96a30ee650 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/OperatorPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/OperatorPredicate.java @@ -16,7 +16,6 @@ package com.google.gerrit.server.query; import java.util.Collection; - /** Predicate to filter a field by matching value. */ public abstract class OperatorPredicate extends Predicate { private final String name; @@ -55,8 +54,7 @@ public abstract class OperatorPredicate extends Predicate { } if (getClass() == other.getClass()) { final OperatorPredicate p = (OperatorPredicate) other; - return getOperator().equals(p.getOperator()) - && getValue().equals(p.getValue()); + return getOperator().equals(p.getOperator()) && getValue().equals(p.getValue()); } return false; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/OrPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/OrPredicate.java index ad15286e31..1dd46f90a4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/OrPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/OrPredicate.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.query; import static com.google.common.base.Preconditions.checkState; import com.google.gwtorm.server.OrmException; - import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -85,8 +84,11 @@ public class OrPredicate extends Predicate implements Matchable { @Override public boolean match(final T object) throws OrmException { for (final Predicate c : children) { - checkState(c.isMatchable(), "match invoked, but child predicate %s " - + "doesn't implement %s", c, Matchable.class.getName()); + checkState( + c.isMatchable(), + "match invoked, but child predicate %s " + "doesn't implement %s", + c, + Matchable.class.getName()); if (c.asMatchable().match(object)) { return true; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/Predicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/Predicate.java index 3a38da6ddd..aabc066421 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/Predicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/Predicate.java @@ -17,29 +17,25 @@ package com.google.gerrit.server.query; import static com.google.common.base.Preconditions.checkState; import com.google.common.collect.Iterables; - import java.util.Collection; import java.util.Collections; import java.util.List; /** * An abstract predicate tree for any form of query. - *

- * Implementations should be immutable, such that the meaning of a predicate - * never changes once constructed. They should ensure their immutable promise by - * defensively copying any structures which might be modified externally, but - * was passed into the object's constructor. - *

- * However, implementations may retain non-thread-safe caches internally, - * to speed up evaluation operations within the context of one thread's - * evaluation of the predicate. As a result, callers should assume predicates - * are not thread-safe, but that two predicate graphs produce the same results - * given the same inputs if they are {@link #equals(Object)}. - *

- * Predicates should support deep inspection whenever possible, so that generic - * algorithms can be written to operate against them. Predicates which contain - * other predicates should override {@link #getChildren()} to return the list of - * children nested within the predicate. + * + *

Implementations should be immutable, such that the meaning of a predicate never changes once + * constructed. They should ensure their immutable promise by defensively copying any structures + * which might be modified externally, but was passed into the object's constructor. + * + *

However, implementations may retain non-thread-safe caches internally, to speed up + * evaluation operations within the context of one thread's evaluation of the predicate. As a + * result, callers should assume predicates are not thread-safe, but that two predicate graphs + * produce the same results given the same inputs if they are {@link #equals(Object)}. + * + *

Predicates should support deep inspection whenever possible, so that generic algorithms can be + * written to operate against them. Predicates which contain other predicates should override {@link + * #getChildren()} to return the list of children nested within the predicate. * * @param type of object the predicate can evaluate in memory. */ @@ -60,8 +56,7 @@ public abstract class Predicate { } /** Combine the passed predicates into a single AND node. */ - public static Predicate and( - final Collection> that) { + public static Predicate and(final Collection> that) { if (that.size() == 1) { return Iterables.getOnlyElement(that); } @@ -78,8 +73,7 @@ public abstract class Predicate { } /** Combine the passed predicates into a single OR node. */ - public static Predicate or( - final Collection> that) { + public static Predicate or(final Collection> that) { if (that.size() == 1) { return Iterables.getOnlyElement(that); } @@ -141,8 +135,7 @@ public abstract class Predicate { private static class Any extends Predicate implements Matchable { private static final Any INSTANCE = new Any<>(); - private Any() { - } + private Any() {} @Override public Predicate copy(Collection> children) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/QueryBuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/QueryBuilder.java index 644ed63e5a..1009ce67aa 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/QueryBuilder.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/QueryBuilder.java @@ -25,8 +25,6 @@ import static com.google.gerrit.server.query.QueryParser.NOT; import static com.google.gerrit.server.query.QueryParser.OR; import static com.google.gerrit.server.query.QueryParser.SINGLE_WORD; -import org.antlr.runtime.tree.Tree; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -38,14 +36,14 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.antlr.runtime.tree.Tree; /** * Base class to support writing parsers for query languages. - *

- * Subclasses may document their supported query operators by declaring public - * methods that perform the query conversion into a {@link Predicate}. For - * example, to support "is:starred", "is:unread", and nothing else, a subclass - * may write: + * + *

Subclasses may document their supported query operators by declaring public methods that + * perform the query conversion into a {@link Predicate}. For example, to support "is:starred", + * "is:unread", and nothing else, a subclass may write: * *

  * @Operator
@@ -59,16 +57,15 @@ import java.util.Map;
  *   throw new IllegalArgumentException();
  * }
  * 
- *

- * The available operator methods are discovered at runtime via reflection. - * Method names (after being converted to lowercase), correspond to operators in - * the query language, method string values correspond to the operator argument. - * Methods must be declared {@code public}, returning {@link Predicate}, - * accepting one {@link String}, and annotated with the {@link Operator} + * + *

The available operator methods are discovered at runtime via reflection. Method names (after + * being converted to lowercase), correspond to operators in the query language, method string + * values correspond to the operator argument. Methods must be declared {@code public}, returning + * {@link Predicate}, accepting one {@link String}, and annotated with the {@link Operator} * annotation. - *

- * Subclasses may also declare a handler for values which appear without - * operator by overriding {@link #defaultField(String)}. + * + *

Subclasses may also declare a handler for values which appear without operator by overriding + * {@link #defaultField(String)}. * * @param type of object the predicates can evaluate in memory. */ @@ -81,14 +78,13 @@ public abstract class QueryBuilder { /** * Defines the operators known by a QueryBuilder. * - * This class is thread-safe and may be reused or cached. + *

This class is thread-safe and may be reused or cached. * * @param type of object the predicates can evaluate in memory. * @param type of the query builder subclass. */ public static class Definition> { - private final Map> opFactories = - new HashMap<>(); + private final Map> opFactories = new HashMap<>(); public Definition(Class clazz) { // Guess at the supported operators by scanning methods. @@ -142,12 +138,12 @@ public abstract class QueryBuilder { * @param p the predicate to find. * @param clazz type of the predicate instance. * @param name name of the operator. - * @return the first instance of a predicate having the given type, as found - * by a depth-first search. + * @return the first instance of a predicate having the given type, as found by a depth-first + * search. */ @SuppressWarnings("unchecked") - public static > P find(Predicate p, - Class

clazz, String name) { + public static > P find( + Predicate p, Class

clazz, String name) { if (p instanceof OperatorPredicate && ((OperatorPredicate) p).getOperator().equals(name) && clazz.isAssignableFrom(p.getClass())) { @@ -180,10 +176,9 @@ public abstract class QueryBuilder { * * @param query the query string. * @return predicate representing the user query. - * @throws QueryParseException the query string is invalid and cannot be - * parsed by this parser. This may be due to a syntax error, may be - * due to an operator not being supported, or due to an invalid value - * being passed to a recognized operator. + * @throws QueryParseException the query string is invalid and cannot be parsed by this parser. + * This may be due to a syntax error, may be due to an operator not being supported, or due to + * an invalid value being passed to a recognized operator. */ public Predicate parse(final String query) throws QueryParseException { return toPredicate(QueryParser.parse(query)); @@ -193,16 +188,12 @@ public abstract class QueryBuilder { * Parse multiple user-supplied query strings into a list of predicates. * * @param queries the query strings. - * @return predicates representing the user query, in the same order as the - * input. - * @throws QueryParseException one of the query strings is invalid and cannot - * be parsed by this parser. This may be due to a syntax error, may be - * due to an operator not being supported, or due to an invalid value - * being passed to a recognized operator. - * + * @return predicates representing the user query, in the same order as the input. + * @throws QueryParseException one of the query strings is invalid and cannot be parsed by this + * parser. This may be due to a syntax error, may be due to an operator not being supported, + * or due to an invalid value being passed to a recognized operator. */ - public List> parse(final List queries) - throws QueryParseException { + public List> parse(final List queries) throws QueryParseException { List> predicates = new ArrayList<>(queries.size()); for (String query : queries) { predicates.add(parse(query)); @@ -210,8 +201,8 @@ public abstract class QueryBuilder { return predicates; } - private Predicate toPredicate(final Tree r) throws QueryParseException, - IllegalArgumentException { + private Predicate toPredicate(final Tree r) + throws QueryParseException, IllegalArgumentException { switch (r.getType()) { case AND: return and(children(r)); @@ -231,24 +222,24 @@ public abstract class QueryBuilder { } } - private Predicate operator(final String name, final Tree val) - throws QueryParseException { + private Predicate operator(final String name, final Tree val) throws QueryParseException { switch (val.getType()) { - // Expand multiple values, "foo:(a b c)", as though they were written - // out with the longer form, "foo:a foo:b foo:c". - // + // Expand multiple values, "foo:(a b c)", as though they were written + // out with the longer form, "foo:a foo:b foo:c". + // case AND: - case OR: { - List> p = new ArrayList<>(val.getChildCount()); - for (int i = 0; i < val.getChildCount(); i++) { - final Tree c = val.getChild(i); - if (c.getType() != DEFAULT_FIELD) { - throw error("Nested operator not expected: " + c); + case OR: + { + List> p = new ArrayList<>(val.getChildCount()); + for (int i = 0; i < val.getChildCount(); i++) { + final Tree c = val.getChild(i); + if (c.getType() != DEFAULT_FIELD) { + throw error("Nested operator not expected: " + c); + } + p.add(operator(name, onlyChildOf(c))); } - p.add(operator(name, onlyChildOf(c))); + return val.getType() == AND ? and(p) : or(p); } - return val.getType() == AND ? and(p) : or(p); - } case SINGLE_WORD: case EXACT_PHRASE: @@ -263,8 +254,7 @@ public abstract class QueryBuilder { } @SuppressWarnings("unchecked") - private Predicate operator(final String name, final String value) - throws QueryParseException { + private Predicate operator(final String name, final String value) throws QueryParseException { @SuppressWarnings("rawtypes") OperatorFactory f = opFactories.get(name); if (f == null) { @@ -289,23 +279,22 @@ public abstract class QueryBuilder { /** * Handle a value present outside of an operator. - *

- * This default implementation always throws an "Unsupported query: " message - * containing the input text. Subclasses may override this method to perform - * do-what-i-mean guesses based on the input string. + * + *

This default implementation always throws an "Unsupported query: " message containing the + * input text. Subclasses may override this method to perform do-what-i-mean guesses based on the + * input string. * * @param value the value supplied by itself in the query. * @return predicate representing this value. * @throws QueryParseException the parser does not recognize this value. */ - protected Predicate defaultField(final String value) - throws QueryParseException { + protected Predicate defaultField(final String value) throws QueryParseException { throw error("Unsupported query:" + value); } @SuppressWarnings("unchecked") - private Predicate[] children(final Tree r) throws QueryParseException, - IllegalArgumentException { + private Predicate[] children(final Tree r) + throws QueryParseException, IllegalArgumentException { final Predicate[] p = new Predicate[r.getChildCount()]; for (int i = 0; i < p.length; i++) { p[i] = toPredicate(r.getChild(i)); @@ -331,8 +320,7 @@ public abstract class QueryBuilder { /** Denotes a method which is a query operator. */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) - protected @interface Operator { - } + protected @interface Operator {} private static class ReflectionFactory> implements OperatorFactory { @@ -346,8 +334,7 @@ public abstract class QueryBuilder { @SuppressWarnings("unchecked") @Override - public Predicate create(Q builder, String value) - throws QueryParseException { + public Predicate create(Q builder, String value) throws QueryParseException { try { return (Predicate) method.invoke(builder, value); } catch (RuntimeException | IllegalAccessException e) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/QueryProcessor.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/QueryProcessor.java index a0f66db5e2..b5ea361751 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/QueryProcessor.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/QueryProcessor.java @@ -36,7 +36,6 @@ import com.google.gwtorm.server.ResultSet; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -50,11 +49,14 @@ public abstract class QueryProcessor { @Inject Metrics(MetricMaker metricMaker) { Field index = Field.ofString("index", "index name"); - executionTime = metricMaker.newTimer("query/query_latency", - new Description("Successful query latency," - + " accumulated over the life of the process").setCumulative() + executionTime = + metricMaker.newTimer( + "query/query_latency", + new Description( + "Successful query latency," + " accumulated over the life of the process") + .setCumulative() .setUnit(Description.Units.MILLISECONDS), - index); + index); } } @@ -117,8 +119,7 @@ public abstract class QueryProcessor { * @param query the query. * @return results of the query. */ - public QueryResult query(Predicate query) - throws OrmException, QueryParseException { + public QueryResult query(Predicate query) throws OrmException, QueryParseException { return query(ImmutableList.of(query)).get(0); } @@ -126,8 +127,8 @@ public abstract class QueryProcessor { * Perform multiple queries in parallel. * * @param queries list of queries. - * @return results of the queries, one QueryResult per input query, in the - * same order as the input. + * @return results of the queries, one QueryResult per input query, in the same order as the + * input. */ public List> query(List> queries) throws OrmException, QueryParseException { @@ -143,8 +144,7 @@ public abstract class QueryProcessor { } } - private List> query(List queryStrings, - List> queries) + private List> query(List queryStrings, List> queries) throws OrmException, QueryParseException { long startNanos = System.nanoTime(); @@ -170,8 +170,7 @@ public abstract class QueryProcessor { // Always bump limit by 1, even if this results in exceeding the permitted // max for this user. The only way to see if there are more entities is to // ask for one more result from the query. - QueryOptions opts = - createOptions(indexConfig, start, limit + 1, getRequestedFields()); + QueryOptions opts = createOptions(indexConfig, start, limit + 1, getRequestedFields()); Predicate pred = rewriter.rewrite(q, opts); if (enforceVisibility) { pred = enforceVisibility(pred); @@ -191,27 +190,28 @@ public abstract class QueryProcessor { List> out = new ArrayList<>(cnt); for (int i = 0; i < cnt; i++) { - out.add(QueryResult.create( - queryStrings != null ? queryStrings.get(i) : null, - predicates.get(i), - limits.get(i), - matches.get(i).toList())); + out.add( + QueryResult.create( + queryStrings != null ? queryStrings.get(i) : null, + predicates.get(i), + limits.get(i), + matches.get(i).toList())); } // only measure successful queries - metrics.executionTime.record(schemaDef.getName(), - System.nanoTime() - startNanos, TimeUnit.NANOSECONDS); + metrics.executionTime.record( + schemaDef.getName(), System.nanoTime() - startNanos, TimeUnit.NANOSECONDS); return out; } - protected QueryOptions createOptions(IndexConfig indexConfig, int start, - int limit, Set requestedFields) { + protected QueryOptions createOptions( + IndexConfig indexConfig, int start, int limit, Set requestedFields) { return QueryOptions.create(indexConfig, start, limit, requestedFields); } /** - * Invoked after the query was rewritten. Subclasses must overwrite this - * method to filter out results that are not visible to the calling user. + * Invoked after the query was rewritten. Subclasses must overwrite this method to filter out + * results that are not visible to the calling user. * * @param pred the query * @return the modified query @@ -223,9 +223,7 @@ public abstract class QueryProcessor { return requestedFields; } Index index = indexes.getSearchIndex(); - return index != null - ? index.getSchema().getStoredFields().keySet() - : ImmutableSet. of(); + return index != null ? index.getSchema().getStoredFields().keySet() : ImmutableSet.of(); } public boolean isDisabled() { @@ -234,9 +232,7 @@ public abstract class QueryProcessor { private int getPermittedLimit() { if (enforceVisibility) { - return userProvider.get().getCapabilities() - .getRange(GlobalCapability.QUERY_LIMIT) - .getMax(); + return userProvider.get().getCapabilities().getRange(GlobalCapability.QUERY_LIMIT).getMax(); } return Integer.MAX_VALUE; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/QueryResult.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/QueryResult.java index b35bde362e..f86eb70766 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/QueryResult.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/QueryResult.java @@ -16,14 +16,13 @@ package com.google.gerrit.server.query; import com.google.auto.value.AutoValue; import com.google.gerrit.common.Nullable; - import java.util.List; /** Results of a query over entities. */ @AutoValue public abstract class QueryResult { - static QueryResult create(@Nullable String query, - Predicate predicate, int limit, List entites) { + static QueryResult create( + @Nullable String query, Predicate predicate, int limit, List entites) { boolean more; if (entites.size() > limit) { more = true; @@ -34,25 +33,19 @@ public abstract class QueryResult { return new AutoValue_QueryResult<>(query, predicate, entites, more); } - /** - * @return the original query string, or null if the query was created - * programmatically. - */ - @Nullable public abstract String query(); + /** @return the original query string, or null if the query was created programmatically. */ + @Nullable + public abstract String query(); - /** - * @return the predicate after all rewriting and other modification by the - * query subsystem. - */ + /** @return the predicate after all rewriting and other modification by the query subsystem. */ public abstract Predicate predicate(); /** @return the query results. */ public abstract List entities(); /** - * @return whether the query could be retried with - * {@link QueryProcessor#setStart(int)} to produce more results. Never - * true if {@link #entities()} is empty. + * @return whether the query could be retried with {@link QueryProcessor#setStart(int)} to produce + * more results. Never true if {@link #entities()} is empty. */ public abstract boolean more(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountIsVisibleToPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountIsVisibleToPredicate.java index 0d6f5cedc7..0a74647d0f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountIsVisibleToPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountIsVisibleToPredicate.java @@ -19,13 +19,11 @@ import com.google.gerrit.server.account.AccountState; import com.google.gerrit.server.query.IsVisibleToPredicate; import com.google.gwtorm.server.OrmException; -public class AccountIsVisibleToPredicate - extends IsVisibleToPredicate { +public class AccountIsVisibleToPredicate extends IsVisibleToPredicate { private final AccountControl accountControl; AccountIsVisibleToPredicate(AccountControl accountControl) { - super(AccountQueryBuilder.FIELD_VISIBLETO, - describe(accountControl.getUser())); + super(AccountQueryBuilder.FIELD_VISIBLETO, describe(accountControl.getUser())); this.accountControl = accountControl; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountPredicates.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountPredicates.java index 9a9ec5d1e4..796539bb24 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountPredicates.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountPredicates.java @@ -24,13 +24,11 @@ import com.google.gerrit.server.index.IndexPredicate; import com.google.gerrit.server.index.account.AccountField; import com.google.gerrit.server.query.Predicate; import com.google.gerrit.server.query.QueryBuilder; - import java.util.List; public class AccountPredicates { public static boolean hasActive(Predicate p) { - return QueryBuilder.find(p, AccountPredicate.class, - AccountField.ACTIVE.getName()) != null; + return QueryBuilder.find(p, AccountPredicate.class, AccountField.ACTIVE.getName()) != null; } static Predicate defaultPredicate(String query) { @@ -48,18 +46,18 @@ public class AccountPredicates { } public static Predicate id(Account.Id accountId) { - return new AccountPredicate(AccountField.ID, - AccountQueryBuilder.FIELD_ACCOUNT, accountId.toString()); + return new AccountPredicate( + AccountField.ID, AccountQueryBuilder.FIELD_ACCOUNT, accountId.toString()); } static Predicate email(String email) { - return new AccountPredicate(AccountField.EMAIL, - AccountQueryBuilder.FIELD_EMAIL, email.toLowerCase()); + return new AccountPredicate( + AccountField.EMAIL, AccountQueryBuilder.FIELD_EMAIL, email.toLowerCase()); } static Predicate equalsName(String name) { - return new AccountPredicate(AccountField.NAME_PART, - AccountQueryBuilder.FIELD_NAME, name.toLowerCase()); + return new AccountPredicate( + AccountField.NAME_PART, AccountQueryBuilder.FIELD_NAME, name.toLowerCase()); } static Predicate externalId(String externalId) { @@ -79,8 +77,8 @@ public class AccountPredicates { } static Predicate username(String username) { - return new AccountPredicate(AccountField.USERNAME, - AccountQueryBuilder.FIELD_USERNAME, username.toLowerCase()); + return new AccountPredicate( + AccountField.USERNAME, AccountQueryBuilder.FIELD_USERNAME, username.toLowerCase()); } static Predicate watchedProject(Project.NameKey project) { @@ -97,6 +95,5 @@ public class AccountPredicates { } } - private AccountPredicates() { - } + private AccountPredicates() {} } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountQueryBuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountQueryBuilder.java index 1c945e3a9d..5ae6a67c13 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountQueryBuilder.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountQueryBuilder.java @@ -30,9 +30,7 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.ProvisionException; -/** - * Parses a query string meant to be applied to account objects. - */ +/** Parses a query string meant to be applied to account objects. */ public class AccountQueryBuilder extends QueryBuilder { public static final String FIELD_ACCOUNT = "account"; public static final String FIELD_EMAIL = "email"; @@ -98,8 +96,7 @@ public class AccountQueryBuilder extends QueryBuilder { } @Operator - public Predicate limit(String query) - throws QueryParseException { + public Predicate limit(String query) throws QueryParseException { Integer limit = Ints.tryParse(query); if (limit == null) { throw error("Invalid limit: " + query); @@ -120,14 +117,12 @@ public class AccountQueryBuilder extends QueryBuilder { public Predicate defaultQuery(String query) { return Predicate.and( Lists.transform( - Splitter.on(' ').omitEmptyStrings().splitToList(query), - this::defaultField)); + Splitter.on(' ').omitEmptyStrings().splitToList(query), this::defaultField)); } @Override protected Predicate defaultField(String query) { - Predicate defaultPredicate = - AccountPredicates.defaultPredicate(query); + Predicate defaultPredicate = AccountPredicates.defaultPredicate(query); if ("self".equalsIgnoreCase(query)) { try { return Predicate.or(defaultPredicate, AccountPredicates.id(self())); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountQueryProcessor.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountQueryProcessor.java index 48d0897487..d984e6dd1a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountQueryProcessor.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountQueryProcessor.java @@ -42,21 +42,27 @@ public class AccountQueryProcessor extends QueryProcessor { } @Inject - protected AccountQueryProcessor(Provider userProvider, + protected AccountQueryProcessor( + Provider userProvider, Metrics metrics, IndexConfig indexConfig, AccountIndexCollection indexes, AccountIndexRewriter rewriter, AccountControl.Factory accountControlFactory) { - super(userProvider, metrics, AccountSchemaDefinitions.INSTANCE, indexConfig, - indexes, rewriter, FIELD_LIMIT); + super( + userProvider, + metrics, + AccountSchemaDefinitions.INSTANCE, + indexConfig, + indexes, + rewriter, + FIELD_LIMIT); this.accountControlFactory = accountControlFactory; } @Override - protected Predicate enforceVisibility( - Predicate pred) { - return new AndSource<>(pred, - new AccountIsVisibleToPredicate(accountControlFactory.get()), start); + protected Predicate enforceVisibility(Predicate pred) { + return new AndSource<>( + pred, new AccountIsVisibleToPredicate(accountControlFactory.get()), start); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/account/InternalAccountQuery.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/account/InternalAccountQuery.java index 7bc3144bfe..1c336d4571 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/account/InternalAccountQuery.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/account/InternalAccountQuery.java @@ -23,19 +23,17 @@ import com.google.gerrit.server.index.account.AccountIndexCollection; import com.google.gerrit.server.query.InternalQuery; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - +import java.util.List; +import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.List; -import java.util.Set; - public class InternalAccountQuery extends InternalQuery { - private static final Logger log = - LoggerFactory.getLogger(InternalAccountQuery.class); + private static final Logger log = LoggerFactory.getLogger(InternalAccountQuery.class); @Inject - InternalAccountQuery(AccountQueryProcessor queryProcessor, + InternalAccountQuery( + AccountQueryProcessor queryProcessor, AccountIndexCollection indexes, IndexConfig indexConfig) { super(queryProcessor, indexes, indexConfig); @@ -65,13 +63,11 @@ public class InternalAccountQuery extends InternalQuery { return this; } - public List byDefault(String query) - throws OrmException { + public List byDefault(String query) throws OrmException { return query(AccountPredicates.defaultPredicate(query)); } - public List byExternalId(String externalId) - throws OrmException { + public List byExternalId(String externalId) throws OrmException { return query(AccountPredicates.externalId(externalId)); } @@ -81,23 +77,19 @@ public class InternalAccountQuery extends InternalQuery { return accountStates.get(0); } else if (accountStates.size() > 0) { StringBuilder msg = new StringBuilder(); - msg.append("Ambiguous external ID ") - .append(externalId) - .append("for accounts: "); - Joiner.on(", ").appendTo(msg, - Lists.transform(accountStates, AccountState.ACCOUNT_ID_FUNCTION)); + msg.append("Ambiguous external ID ").append(externalId).append("for accounts: "); + Joiner.on(", ") + .appendTo(msg, Lists.transform(accountStates, AccountState.ACCOUNT_ID_FUNCTION)); log.warn(msg.toString()); } return null; } - public List byFullName(String fullName) - throws OrmException { + public List byFullName(String fullName) throws OrmException { return query(AccountPredicates.fullName(fullName)); } - public List byWatchedProject(Project.NameKey project) - throws OrmException { + public List byWatchedProject(Project.NameKey project) throws OrmException { return query(AccountPredicates.watchedProject(project)); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AfterPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AfterPredicate.java index 477bf16293..7d51217203 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AfterPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AfterPredicate.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.query.change; import com.google.gerrit.server.index.change.ChangeField; import com.google.gerrit.server.query.QueryParseException; import com.google.gwtorm.server.OrmException; - import java.util.Date; public class AfterPredicate extends TimestampRangeChangePredicate { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AgePredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AgePredicate.java index fd6cbee292..0cd76bb2c7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AgePredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AgePredicate.java @@ -22,7 +22,6 @@ import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.server.config.ConfigUtil; import com.google.gerrit.server.index.change.ChangeField; import com.google.gwtorm.server.OrmException; - import java.sql.Timestamp; public class AgePredicate extends TimestampRangeChangePredicate { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AndChangeSource.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AndChangeSource.java index bd7daede9d..b0fcfd1796 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AndChangeSource.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AndChangeSource.java @@ -19,31 +19,31 @@ import com.google.gerrit.server.query.IsVisibleToPredicate; import com.google.gerrit.server.query.Predicate; import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.OrmRuntimeException; - import java.util.Collection; import java.util.List; -public class AndChangeSource extends AndSource - implements ChangeDataSource { +public class AndChangeSource extends AndSource implements ChangeDataSource { public AndChangeSource(Collection> that) { super(that); } - public AndChangeSource(Predicate that, - IsVisibleToPredicate isVisibleToPredicate, int start) { + public AndChangeSource( + Predicate that, + IsVisibleToPredicate isVisibleToPredicate, + int start) { super(that, isVisibleToPredicate, start); } @Override public boolean hasChange() { - return source != null && source instanceof ChangeDataSource + return source != null + && source instanceof ChangeDataSource && ((ChangeDataSource) source).hasChange(); } @Override - protected List transformBuffer(List buffer) - throws OrmRuntimeException { + protected List transformBuffer(List buffer) throws OrmRuntimeException { if (!hasChange()) { try { ChangeData.ensureChangeLoaded(buffer); @@ -57,8 +57,7 @@ public class AndChangeSource extends AndSource @Override public int compare(Predicate a, Predicate b) { int cmp = super.compare(a, b); - if (cmp == 0 && a instanceof ChangeDataSource - && b instanceof ChangeDataSource) { + if (cmp == 0 && a instanceof ChangeDataSource && b instanceof ChangeDataSource) { ChangeDataSource as = (ChangeDataSource) a; ChangeDataSource bs = (ChangeDataSource) b; cmp = (as.hasChange() ? 0 : 1) - (bs.hasChange() ? 0 : 1); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AuthorPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AuthorPredicate.java index ebaaab9fbd..6a760db413 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AuthorPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AuthorPredicate.java @@ -27,8 +27,7 @@ public class AuthorPredicate extends ChangeIndexPredicate { @Override public boolean match(ChangeData object) throws OrmException { - return ChangeField.getAuthorParts(object).contains( - getValue().toLowerCase()); + return ChangeField.getAuthorParts(object).contains(getValue().toLowerCase()); } @Override diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/BeforePredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/BeforePredicate.java index f36a163126..9e443c9eb3 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/BeforePredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/BeforePredicate.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.query.change; import com.google.gerrit.server.index.change.ChangeField; import com.google.gerrit.server.query.QueryParseException; import com.google.gwtorm.server.OrmException; - import java.util.Date; public class BeforePredicate extends TimestampRangeChangePredicate { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java index 98f6cb5df3..3fc719b645 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java @@ -69,18 +69,6 @@ import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.ResultSet; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; - -import org.eclipse.jgit.errors.IncorrectObjectTypeException; -import org.eclipse.jgit.errors.MissingObjectException; -import org.eclipse.jgit.errors.RepositoryNotFoundException; -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.PersonIdent; -import org.eclipse.jgit.lib.Ref; -import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.revwalk.FooterLine; -import org.eclipse.jgit.revwalk.RevCommit; -import org.eclipse.jgit.revwalk.RevWalk; - import java.io.IOException; import java.sql.Timestamp; import java.util.ArrayList; @@ -94,12 +82,21 @@ import java.util.Optional; import java.util.Set; import java.util.function.Predicate; import java.util.stream.Collectors; +import org.eclipse.jgit.errors.IncorrectObjectTypeException; +import org.eclipse.jgit.errors.MissingObjectException; +import org.eclipse.jgit.errors.RepositoryNotFoundException; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.PersonIdent; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.FooterLine; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.revwalk.RevWalk; public class ChangeData { private static final int BATCH_SIZE = 50; - public static List asChanges(List changeDatas) - throws OrmException { + public static List asChanges(List changeDatas) throws OrmException { List result = new ArrayList<>(changeDatas.size()); for (ChangeData cd : changeDatas) { result.add(cd.change()); @@ -108,12 +105,10 @@ public class ChangeData { } public static Map asMap(List changes) { - return changes.stream().collect( - Collectors.toMap(ChangeData::getId, cd -> cd)); + return changes.stream().collect(Collectors.toMap(ChangeData::getId, cd -> cd)); } - public static void ensureChangeLoaded(Iterable changes) - throws OrmException { + public static void ensureChangeLoaded(Iterable changes) throws OrmException { ChangeData first = Iterables.getFirst(changes, null); if (first == null) { return; @@ -133,14 +128,12 @@ public class ChangeData { if (missing.isEmpty()) { return; } - for (ChangeNotes notes : first.notesFactory.create( - first.db, missing.keySet())) { + for (ChangeNotes notes : first.notesFactory.create(first.db, missing.keySet())) { missing.get(notes.getChangeId()).change = notes.getChange(); } } - public static void ensureAllPatchSetsLoaded(Iterable changes) - throws OrmException { + public static void ensureAllPatchSetsLoaded(Iterable changes) throws OrmException { ChangeData first = Iterables.getFirst(changes, null); if (first == null) { return; @@ -170,8 +163,7 @@ public class ChangeData { } } - public static void ensureCurrentPatchSetLoaded(Iterable changes) - throws OrmException { + public static void ensureCurrentPatchSetLoaded(Iterable changes) throws OrmException { ChangeData first = Iterables.getFirst(changes, null); if (first == null) { return; @@ -228,8 +220,7 @@ public class ChangeData { } } - public static void ensureMessagesLoaded(Iterable changes) - throws OrmException { + public static void ensureMessagesLoaded(Iterable changes) throws OrmException { ChangeData first = Iterables.getFirst(changes, null); if (first == null) { return; @@ -260,8 +251,8 @@ public class ChangeData { } } - public static void ensureReviewedByLoadedForOpenChanges( - Iterable changes) throws OrmException { + public static void ensureReviewedByLoadedForOpenChanges(Iterable changes) + throws OrmException { List pending = new ArrayList<>(); for (ChangeData cd : changes) { if (cd.reviewedBy == null && cd.change().getStatus().isOpen()) { @@ -280,8 +271,11 @@ public class ChangeData { public interface Factory { ChangeData create(ReviewDb db, Project.NameKey project, Change.Id id); + ChangeData create(ReviewDb db, Change c); + ChangeData create(ReviewDb db, ChangeNotes cn); + ChangeData create(ReviewDb db, ChangeControl c); // TODO(dborowitz): Remove when deleting index schemas <27. @@ -290,17 +284,19 @@ public class ChangeData { /** * Create an instance for testing only. - *

- * Attempting to lazy load data will fail with NPEs. Callers may consider - * manually setting fields that can be set. + * + *

Attempting to lazy load data will fail with NPEs. Callers may consider manually setting + * fields that can be set. * * @param id change ID * @return instance for testing. */ - public static ChangeData createForTest(Project.NameKey project, Change.Id id, - int currentPatchSetId) { - ChangeData cd = new ChangeData(null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, project, id); + public static ChangeData createForTest( + Project.NameKey project, Change.Id id, int currentPatchSetId) { + ChangeData cd = + new ChangeData( + null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, project, id); cd.currentPatchSet = new PatchSet(new PatchSet.Id(id, currentPatchSetId)); return cd; } @@ -322,8 +318,8 @@ public class ChangeData { private final MergeabilityCache mergeabilityCache; private final StarredChangesUtil starredChangesUtil; private final Change.Id legacyId; - private final Map> - submitRecords = Maps.newLinkedHashMapWithExpectedSize(1); + private final Map> submitRecords = + Maps.newLinkedHashMapWithExpectedSize(1); private Project.NameKey project; private Change change; @@ -348,8 +344,7 @@ public class ChangeData { private Map editsByUser; private Set reviewedBy; private Map draftsByUser; - @Deprecated - private Set starredByUser; + @Deprecated private Set starredByUser; private ImmutableListMultimap stars; private ImmutableMap starRefs; private ReviewerSet reviewers; @@ -533,7 +528,8 @@ public class ChangeData { @Nullable StarredChangesUtil starredChangesUtil, @Assisted ReviewDb db, @Assisted Change.Id id) { - checkState(!notesMigration.readChanges(), + checkState( + !notesMigration.readChanges(), "do not call createOnlyWhenNoteDbDisabled when NoteDb is enabled"); this.db = db; this.repoManager = repoManager; @@ -655,8 +651,7 @@ public class ChangeData { if (ps == null) { return Optional.empty(); } - return getPatchList(c, ps).map( - p -> new ChangedLines(p.getInsertions(), p.getDeletions())); + return getPatchList(c, ps).map(p -> new ChangedLines(p.getInsertions(), p.getDeletions())); } public Optional changedLines() throws OrmException { @@ -683,8 +678,9 @@ public class ChangeData { public Project.NameKey project() throws OrmException { if (project == null) { - checkState(!notesMigration.readChanges(), "should not have created " - + " ChangeData without a project when NoteDb is enabled"); + checkState( + !notesMigration.readChanges(), + "should not have created " + " ChangeData without a project when NoteDb is enabled"); project = change().getProject(); } return project; @@ -702,8 +698,7 @@ public class ChangeData { if (changeControl == null) { Change c = change(); try { - changeControl = changeControlFactory.controlFor( - db, c, userFactory.create(c.getOwner())); + changeControl = changeControlFactory.controlFor(db, c, userFactory.create(c.getOwner())); } catch (NoSuchChangeException e) { throw new OrmException(e); } @@ -717,15 +712,13 @@ public class ChangeData { if (sameUser(user, oldUser)) { return changeControl; } - throw new IllegalStateException( - "user already specified: " + changeControl.getUser()); + throw new IllegalStateException("user already specified: " + changeControl.getUser()); } try { if (change != null) { changeControl = changeControlFactory.controlFor(db, change, user); } else { - changeControl = - changeControlFactory.controlFor(db, project(), legacyId, user); + changeControl = changeControlFactory.controlFor(db, project(), legacyId, user); } } catch (NoSuchChangeException e) { throw new OrmException(e); @@ -799,8 +792,7 @@ public class ChangeData { return currentPatchSet; } - public List currentApprovals() - throws OrmException { + public List currentApprovals() throws OrmException { if (currentApprovals == null) { if (!lazyLoad) { return Collections.emptyList(); @@ -810,8 +802,9 @@ public class ChangeData { currentApprovals = Collections.emptyList(); } else { try { - currentApprovals = ImmutableList.copyOf(approvalsUtil.byPatchSet( - db, changeControl(), c.currentPatchSetId())); + currentApprovals = + ImmutableList.copyOf( + approvalsUtil.byPatchSet(db, changeControl(), c.currentPatchSetId())); } catch (OrmException e) { if (e.getCause() instanceof NoSuchChangeException) { currentApprovals = Collections.emptyList(); @@ -864,9 +857,9 @@ public class ChangeData { return committer; } - private boolean loadCommitData() throws OrmException, - RepositoryNotFoundException, IOException, MissingObjectException, - IncorrectObjectTypeException { + private boolean loadCommitData() + throws OrmException, RepositoryNotFoundException, IOException, MissingObjectException, + IncorrectObjectTypeException { PatchSet ps = currentPatchSet(); if (ps == null) { return false; @@ -899,13 +892,14 @@ public class ChangeData { * @throws OrmException an error occurred reading the database. */ public Collection visiblePatchSets() throws OrmException { - Predicate predicate = ps -> { - try { - return changeControl().isPatchVisible(ps, db); - } catch (OrmException e) { - return false; - } - }; + Predicate predicate = + ps -> { + try { + return changeControl().isPatchVisible(ps, db); + } catch (OrmException e) { + return false; + } + }; return patchSets().stream().filter(predicate).collect(toList()); } @@ -931,12 +925,11 @@ public class ChangeData { } /** - * @return all patch set approvals for the change, keyed by ID, ordered by - * timestamp within each patch set. + * @return all patch set approvals for the change, keyed by ID, ordered by timestamp within each + * patch set. * @throws OrmException an error occurred reading the database. */ - public ListMultimap approvals() - throws OrmException { + public ListMultimap approvals() throws OrmException { if (allApprovals == null) { if (!lazyLoad) { return ImmutableListMultimap.of(); @@ -950,11 +943,8 @@ public class ChangeData { * @return The submit ('SUBM') approval label * @throws OrmException an error occurred reading the database. */ - public Optional getSubmitApproval() - throws OrmException { - return currentApprovals().stream() - .filter(PatchSetApproval::isLegacySubmit) - .findFirst(); + public Optional getSubmitApproval() throws OrmException { + return currentApprovals().stream().filter(PatchSetApproval::isLegacySubmit).findFirst(); } public ReviewerSet reviewers() throws OrmException { @@ -993,8 +983,7 @@ public class ChangeData { return reviewerUpdates; } - public Collection publishedComments() - throws OrmException { + public Collection publishedComments() throws OrmException { if (publishedComments == null) { if (!lazyLoad) { return Collections.emptyList(); @@ -1004,8 +993,7 @@ public class ChangeData { return publishedComments; } - public List messages() - throws OrmException { + public List messages() throws OrmException { if (messages == null) { if (!lazyLoad) { return Collections.emptyList(); @@ -1015,29 +1003,24 @@ public class ChangeData { return messages; } - public List submitRecords( - SubmitRuleOptions options) throws OrmException { + public List submitRecords(SubmitRuleOptions options) throws OrmException { List records = submitRecords.get(options); if (records == null) { if (!lazyLoad) { return Collections.emptyList(); } - records = new SubmitRuleEvaluator(this) - .setOptions(options) - .evaluate(); + records = new SubmitRuleEvaluator(this).setOptions(options).evaluate(); submitRecords.put(options, records); } return records; } @Nullable - public List getSubmitRecords( - SubmitRuleOptions options) { + public List getSubmitRecords(SubmitRuleOptions options) { return submitRecords.get(options); } - public void setSubmitRecords(SubmitRuleOptions options, - List records) { + public void setSubmitRecords(SubmitRuleOptions options, List records) { submitRecords.put(options, records); } @@ -1084,12 +1067,16 @@ public class ChangeData { // No need to log, as SubmitRuleEvaluator already did it for us. return false; } - String mergeStrategy = mergeUtilFactory - .create(projectCache.get(project())) - .mergeStrategyName(); - mergeable = mergeabilityCache.get( - ObjectId.fromString(ps.getRevision().get()), - ref, str.type, mergeStrategy, c.getDest(), repo); + String mergeStrategy = + mergeUtilFactory.create(projectCache.get(project())).mergeStrategyName(); + mergeable = + mergeabilityCache.get( + ObjectId.fromString(ps.getRevision().get()), + ref, + str.type, + mergeStrategy, + c.getDest(), + repo); } catch (IOException e) { throw new OrmException(e); } @@ -1114,8 +1101,8 @@ public class ChangeData { editsByUser = new HashMap<>(); Change.Id id = checkNotNull(change.getId()); try (Repository repo = repoManager.openRepository(project())) { - for (Map.Entry e - : repo.getRefDatabase().getRefs(RefNames.REFS_USERS).entrySet()) { + for (Map.Entry e : + repo.getRefDatabase().getRefs(RefNames.REFS_USERS).entrySet()) { if (id.equals(Change.Id.fromEditRefPart(e.getKey()))) { editsByUser.put(Account.Id.fromRefPart(e.getKey()), e.getValue()); } @@ -1217,8 +1204,8 @@ public class ChangeData { if (!lazyLoad) { return Collections.emptySet(); } - starredByUser = checkNotNull(starredChangesUtil).byChange( - legacyId, StarredChangesUtil.DEFAULT_LABEL); + starredByUser = + checkNotNull(starredChangesUtil).byChange(legacyId, StarredChangesUtil.DEFAULT_LABEL); } return starredByUser; } @@ -1233,8 +1220,7 @@ public class ChangeData { if (!lazyLoad) { return ImmutableListMultimap.of(); } - ImmutableListMultimap.Builder b = - ImmutableListMultimap.builder(); + ImmutableListMultimap.Builder b = ImmutableListMultimap.builder(); for (Map.Entry e : starRefs().entrySet()) { b.putAll(e.getKey(), e.getValue().labels()); } @@ -1260,11 +1246,11 @@ public class ChangeData { @AutoValue abstract static class ReviewedByEvent { private static ReviewedByEvent create(ChangeMessage msg) { - return new AutoValue_ChangeData_ReviewedByEvent( - msg.getAuthor(), msg.getWrittenOn()); + return new AutoValue_ChangeData_ReviewedByEvent(msg.getAuthor(), msg.getWrittenOn()); } public abstract Account.Id author(); + public abstract Timestamp ts(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeIndexPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeIndexPredicate.java index 80951fdea6..0604f8bb03 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeIndexPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeIndexPredicate.java @@ -24,8 +24,7 @@ public abstract class ChangeIndexPredicate extends IndexPredicate super(def, value); } - protected ChangeIndexPredicate(FieldDef def, String name, - String value) { + protected ChangeIndexPredicate(FieldDef def, String name, String value) { super(def, name, value); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeIsVisibleToPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeIsVisibleToPredicate.java index 88499ecd40..8db62a7e1b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeIsVisibleToPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeIsVisibleToPredicate.java @@ -30,9 +30,11 @@ class ChangeIsVisibleToPredicate extends IsVisibleToPredicate { private final ChangeControl.GenericFactory changeControl; private final CurrentUser user; - ChangeIsVisibleToPredicate(Provider db, + ChangeIsVisibleToPredicate( + Provider db, ChangeNotes.Factory notesFactory, - ChangeControl.GenericFactory changeControlFactory, CurrentUser user) { + ChangeControl.GenericFactory changeControlFactory, + CurrentUser user) { super(ChangeQueryBuilder.FIELD_VISIBLETO, describe(user)); this.db = db; this.notesFactory = notesFactory; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeOperatorPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeOperatorPredicate.java index 6bec5989f0..242592e55d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeOperatorPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeOperatorPredicate.java @@ -17,8 +17,8 @@ package com.google.gerrit.server.query.change; import com.google.gerrit.server.query.Matchable; import com.google.gerrit.server.query.OperatorPredicate; -public abstract class ChangeOperatorPredicate extends - OperatorPredicate implements Matchable { +public abstract class ChangeOperatorPredicate extends OperatorPredicate + implements Matchable { protected ChangeOperatorPredicate(String name, String value) { super(name, value); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java index 73951c41e5..2af5cd8fcf 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java @@ -74,12 +74,6 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.ProvisionException; import com.google.inject.util.Providers; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.errors.RepositoryNotFoundException; -import org.eclipse.jgit.lib.Config; -import org.eclipse.jgit.lib.Repository; - import java.io.IOException; import java.util.Collection; import java.util.Collections; @@ -89,40 +83,35 @@ import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.regex.Pattern; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.errors.RepositoryNotFoundException; +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.lib.Repository; -/** - * Parses a query string meant to be applied to change objects. - */ +/** Parses a query string meant to be applied to change objects. */ public class ChangeQueryBuilder extends QueryBuilder { - public interface ChangeOperatorFactory - extends OperatorFactory { - } + public interface ChangeOperatorFactory extends OperatorFactory {} /** - * Converts a operand (operator value) passed to an operator into a - * {@link Predicate}. + * Converts a operand (operator value) passed to an operator into a {@link Predicate}. * - * Register a ChangeOperandFactory in a config Module like this (note, for - * an example we are using the has predicate, when other predicate plugin - * operands are created they can be registered in a similar manner): - * - * bind(ChangeHasOperandFactory.class) - * .annotatedWith(Exports.named("your has operand")) - * .to(YourClass.class); + *

Register a ChangeOperandFactory in a config Module like this (note, for an example we are + * using the has predicate, when other predicate plugin operands are created they can be + * registered in a similar manner): * + *

bind(ChangeHasOperandFactory.class) .annotatedWith(Exports.named("your has operand")) + * .to(YourClass.class); */ private interface ChangeOperandFactory { - Predicate create(ChangeQueryBuilder builder) - throws QueryParseException; + Predicate create(ChangeQueryBuilder builder) throws QueryParseException; } - public interface ChangeHasOperandFactory extends ChangeOperandFactory { - } + public interface ChangeHasOperandFactory extends ChangeOperandFactory {} private static final Pattern PAT_LEGACY_ID = Pattern.compile("^[1-9][0-9]*$"); private static final Pattern PAT_CHANGE_ID = Pattern.compile(CHANGE_ID_PATTERN); - private static final Pattern DEF_CHANGE = Pattern.compile( - "^(?:[1-9][0-9]*|(?:[^~]+~[^~]+~)?[iI][0-9a-f]{4,}.*)$"); + private static final Pattern DEF_CHANGE = + Pattern.compile("^(?:[1-9][0-9]*|(?:[^~]+~[^~]+~)?[iI][0-9a-f]{4,}.*)$"); // NOTE: As new search operations are added, please keep the // SearchSuggestOracle up to date. @@ -217,7 +206,8 @@ public class ChangeQueryBuilder extends QueryBuilder { @Inject @VisibleForTesting - public Arguments(Provider db, + public Arguments( + Provider db, Provider queryProvider, ChangeIndexRewriter rewriter, DynamicMap opFactories, @@ -247,13 +237,36 @@ public class ChangeQueryBuilder extends QueryBuilder { StarredChangesUtil starredChangesUtil, AccountCache accountCache, @GerritServerConfig Config cfg) { - this(db, queryProvider, rewriter, opFactories, hasOperands, userFactory, - self, capabilityControlFactory, changeControlGenericFactory, notesFactory, - changeDataFactory, fillArgs, commentsUtil, accountResolver, groupBackend, - allProjectsName, allUsersName, patchListCache, repoManager, projectCache, - listChildProjects, submitDryRun, conflictsCache, trackingFooters, - indexes != null ? indexes.getSearchIndex() : null, indexConfig, listMembers, - starredChangesUtil, accountCache, + this( + db, + queryProvider, + rewriter, + opFactories, + hasOperands, + userFactory, + self, + capabilityControlFactory, + changeControlGenericFactory, + notesFactory, + changeDataFactory, + fillArgs, + commentsUtil, + accountResolver, + groupBackend, + allProjectsName, + allUsersName, + patchListCache, + repoManager, + projectCache, + listChildProjects, + submitDryRun, + conflictsCache, + trackingFooters, + indexes != null ? indexes.getSearchIndex() : null, + indexConfig, + listMembers, + starredChangesUtil, + accountCache, cfg == null ? true : cfg.getBoolean("change", "allowDrafts", true)); } @@ -288,47 +301,70 @@ public class ChangeQueryBuilder extends QueryBuilder { StarredChangesUtil starredChangesUtil, AccountCache accountCache, boolean allowsDrafts) { - this.db = db; - this.queryProvider = queryProvider; - this.rewriter = rewriter; - this.opFactories = opFactories; - this.userFactory = userFactory; - this.self = self; - this.capabilityControlFactory = capabilityControlFactory; - this.notesFactory = notesFactory; - this.changeControlGenericFactory = changeControlGenericFactory; - this.changeDataFactory = changeDataFactory; - this.fillArgs = fillArgs; - this.commentsUtil = commentsUtil; - this.accountResolver = accountResolver; - this.groupBackend = groupBackend; - this.allProjectsName = allProjectsName; - this.allUsersName = allUsersName; - this.patchListCache = patchListCache; - this.repoManager = repoManager; - this.projectCache = projectCache; - this.listChildProjects = listChildProjects; - this.submitDryRun = submitDryRun; - this.conflictsCache = conflictsCache; - this.trackingFooters = trackingFooters; - this.index = index; - this.indexConfig = indexConfig; - this.listMembers = listMembers; - this.starredChangesUtil = starredChangesUtil; - this.accountCache = accountCache; - this.allowsDrafts = allowsDrafts; - this.hasOperands = hasOperands; + this.db = db; + this.queryProvider = queryProvider; + this.rewriter = rewriter; + this.opFactories = opFactories; + this.userFactory = userFactory; + this.self = self; + this.capabilityControlFactory = capabilityControlFactory; + this.notesFactory = notesFactory; + this.changeControlGenericFactory = changeControlGenericFactory; + this.changeDataFactory = changeDataFactory; + this.fillArgs = fillArgs; + this.commentsUtil = commentsUtil; + this.accountResolver = accountResolver; + this.groupBackend = groupBackend; + this.allProjectsName = allProjectsName; + this.allUsersName = allUsersName; + this.patchListCache = patchListCache; + this.repoManager = repoManager; + this.projectCache = projectCache; + this.listChildProjects = listChildProjects; + this.submitDryRun = submitDryRun; + this.conflictsCache = conflictsCache; + this.trackingFooters = trackingFooters; + this.index = index; + this.indexConfig = indexConfig; + this.listMembers = listMembers; + this.starredChangesUtil = starredChangesUtil; + this.accountCache = accountCache; + this.allowsDrafts = allowsDrafts; + this.hasOperands = hasOperands; } Arguments asUser(CurrentUser otherUser) { - return new Arguments(db, queryProvider, rewriter, opFactories, - hasOperands, userFactory, Providers.of(otherUser), - capabilityControlFactory, changeControlGenericFactory, notesFactory, - changeDataFactory, fillArgs, commentsUtil, accountResolver, - groupBackend, allProjectsName, allUsersName, patchListCache, - repoManager, projectCache, listChildProjects, submitDryRun, - conflictsCache, trackingFooters, index, indexConfig, listMembers, - starredChangesUtil, accountCache, allowsDrafts); + return new Arguments( + db, + queryProvider, + rewriter, + opFactories, + hasOperands, + userFactory, + Providers.of(otherUser), + capabilityControlFactory, + changeControlGenericFactory, + notesFactory, + changeDataFactory, + fillArgs, + commentsUtil, + accountResolver, + groupBackend, + allProjectsName, + allUsersName, + patchListCache, + repoManager, + projectCache, + listChildProjects, + submitDryRun, + conflictsCache, + trackingFooters, + index, + indexConfig, + listMembers, + starredChangesUtil, + accountCache, + allowsDrafts); } Arguments asUser(Account.Id otherId) { @@ -379,8 +415,7 @@ public class ChangeQueryBuilder extends QueryBuilder { @VisibleForTesting protected ChangeQueryBuilder( - Definition> def, - Arguments args) { + Definition> def, Arguments args) { super(def); this.args = args; } @@ -449,8 +484,7 @@ public class ChangeQueryBuilder extends QueryBuilder { } @Operator - public Predicate status(String statusName) - throws QueryParseException { + public Predicate status(String statusName) throws QueryParseException { if ("reviewed".equalsIgnoreCase(statusName)) { return IsReviewedPredicate.create(); } @@ -548,8 +582,7 @@ public class ChangeQueryBuilder extends QueryBuilder { } @Operator - public Predicate conflicts(String value) throws OrmException, - QueryParseException { + public Predicate conflicts(String value) throws OrmException, QueryParseException { return new ConflictsPredicate(args, value, parseChange(value)); } @@ -573,8 +606,7 @@ public class ChangeQueryBuilder extends QueryBuilder { @Operator public Predicate parentproject(String name) { - return new ParentProjectPredicate(args.projectCache, args.listChildProjects, - args.self, name); + return new ParentProjectPredicate(args.projectCache, args.listChildProjects, args.self, name); } @Operator @@ -636,8 +668,7 @@ public class ChangeQueryBuilder extends QueryBuilder { } @Operator - public Predicate label(String name) throws QueryParseException, - OrmException { + public Predicate label(String name) throws QueryParseException, OrmException { Set accounts = null; AccountGroup.UUID group = null; @@ -651,7 +682,7 @@ public class ChangeQueryBuilder extends QueryBuilder { // label:Code-Review+2,owner // label:Code-Review+2,user=owner String[] splitReviewer = name.split(",", 2); - name = splitReviewer[0]; // remove all but the vote piece, e.g.'CodeReview=1' + name = splitReviewer[0]; // remove all but the vote piece, e.g.'CodeReview=1' if (splitReviewer.length == 2) { // process the user/group piece @@ -667,15 +698,13 @@ public class ChangeQueryBuilder extends QueryBuilder { } else if (pair.getKey().equalsIgnoreCase(ARG_ID_GROUP)) { group = parseGroup(pair.getValue()).getUUID(); } else { - throw new QueryParseException( - "Invalid argument identifier '" + pair.getKey() + "'"); + throw new QueryParseException("Invalid argument identifier '" + pair.getKey() + "'"); } } for (String value : lblArgs.positional) { - if (accounts != null || group != null) { - throw new QueryParseException("more than one user/group specified (" + - value + ")"); + if (accounts != null || group != null) { + throw new QueryParseException("more than one user/group specified (" + value + ")"); } try { if (value.equals(ARG_ID_OWNER)) { @@ -698,7 +727,11 @@ public class ChangeQueryBuilder extends QueryBuilder { // expand a group predicate into multiple user predicates if (group != null) { Set allMembers = - args.listMembers.get().setRecursive(true).apply(group).stream() + args.listMembers + .get() + .setRecursive(true) + .apply(group) + .stream() .map(a -> new Account.Id(a._accountId)) .collect(toSet()); int maxLimit = args.indexConfig.maxLimit(); @@ -716,13 +749,12 @@ public class ChangeQueryBuilder extends QueryBuilder { if (args.getSchema().hasField(ChangeField.SUBMIT_RECORD) && eq > 0) { String statusName = name.substring(eq + 1).toUpperCase(); if (!isInt(statusName)) { - SubmitRecord.Label.Status status = Enums.getIfPresent( - SubmitRecord.Label.Status.class, statusName).orNull(); + SubmitRecord.Label.Status status = + Enums.getIfPresent(SubmitRecord.Label.Status.class, statusName).orNull(); if (status == null) { throw error("Invalid label status " + statusName + " in " + name); } - return SubmitRecordPredicate.create( - name.substring(0, eq), status, accounts); + return SubmitRecordPredicate.create(name.substring(0, eq), status, accounts); } } @@ -750,8 +782,7 @@ public class ChangeQueryBuilder extends QueryBuilder { } @Operator - public Predicate starredby(String who) - throws QueryParseException, OrmException { + public Predicate starredby(String who) throws QueryParseException, OrmException { return starredby(parseAccount(who)); } @@ -768,8 +799,7 @@ public class ChangeQueryBuilder extends QueryBuilder { } @Operator - public Predicate watchedby(String who) - throws QueryParseException, OrmException { + public Predicate watchedby(String who) throws QueryParseException, OrmException { Set m = parseAccount(who); List p = Lists.newArrayListWithCapacity(m.size()); @@ -793,8 +823,7 @@ public class ChangeQueryBuilder extends QueryBuilder { } @Operator - public Predicate draftby(String who) throws QueryParseException, - OrmException { + public Predicate draftby(String who) throws QueryParseException, OrmException { Set m = parseAccount(who); List> p = Lists.newArrayListWithCapacity(m.size()); for (Account.Id id : m) { @@ -808,8 +837,7 @@ public class ChangeQueryBuilder extends QueryBuilder { } @Operator - public Predicate visibleto(String who) - throws QueryParseException, OrmException { + public Predicate visibleto(String who) throws QueryParseException, OrmException { if ("self".equals(who)) { return is_visible(); } @@ -837,8 +865,8 @@ public class ChangeQueryBuilder extends QueryBuilder { } public Predicate visibleto(CurrentUser user) { - return new ChangeIsVisibleToPredicate(args.db, args.notesFactory, - args.changeControlGenericFactory, user); + return new ChangeIsVisibleToPredicate( + args.db, args.notesFactory, args.changeControlGenericFactory, user); } public Predicate is_visible() throws QueryParseException { @@ -846,14 +874,12 @@ public class ChangeQueryBuilder extends QueryBuilder { } @Operator - public Predicate o(String who) - throws QueryParseException, OrmException { + public Predicate o(String who) throws QueryParseException, OrmException { return owner(who); } @Operator - public Predicate owner(String who) throws QueryParseException, - OrmException { + public Predicate owner(String who) throws QueryParseException, OrmException { return owner(parseAccount(who)); } @@ -866,8 +892,7 @@ public class ChangeQueryBuilder extends QueryBuilder { } @Operator - public Predicate assignee(String who) throws QueryParseException, - OrmException { + public Predicate assignee(String who) throws QueryParseException, OrmException { return assignee(parseAccount(who)); } @@ -880,8 +905,7 @@ public class ChangeQueryBuilder extends QueryBuilder { } @Operator - public Predicate ownerin(String group) - throws QueryParseException { + public Predicate ownerin(String group) throws QueryParseException { GroupReference g = GroupBackends.findBestSuggestion(args.groupBackend, group); if (g == null) { throw error("Group " + group + " not found"); @@ -890,14 +914,12 @@ public class ChangeQueryBuilder extends QueryBuilder { } @Operator - public Predicate r(String who) - throws QueryParseException, OrmException { + public Predicate r(String who) throws QueryParseException, OrmException { return reviewer(who); } @Operator - public Predicate reviewer(String who) - throws QueryParseException, OrmException { + public Predicate reviewer(String who) throws QueryParseException, OrmException { Set m = parseAccount(who); List> p = Lists.newArrayListWithCapacity(m.size()); for (Account.Id id : m) { @@ -907,8 +929,7 @@ public class ChangeQueryBuilder extends QueryBuilder { } @Operator - public Predicate reviewerin(String group) - throws QueryParseException { + public Predicate reviewerin(String group) throws QueryParseException { GroupReference g = GroupBackends.findBestSuggestion(args.groupBackend, group); if (g == null) { throw error("Group " + group + " not found"); @@ -936,32 +957,27 @@ public class ChangeQueryBuilder extends QueryBuilder { } @Operator - public Predicate added(String value) - throws QueryParseException { + public Predicate added(String value) throws QueryParseException { return new AddedPredicate(value); } @Operator - public Predicate deleted(String value) - throws QueryParseException { + public Predicate deleted(String value) throws QueryParseException { return new DeletedPredicate(value); } @Operator - public Predicate size(String value) - throws QueryParseException { + public Predicate size(String value) throws QueryParseException { return delta(value); } @Operator - public Predicate delta(String value) - throws QueryParseException { + public Predicate delta(String value) throws QueryParseException { return new DeltaPredicate(value); } @Operator - public Predicate commentby(String who) - throws QueryParseException, OrmException { + public Predicate commentby(String who) throws QueryParseException, OrmException { return commentby(parseAccount(who)); } @@ -974,8 +990,7 @@ public class ChangeQueryBuilder extends QueryBuilder { } @Operator - public Predicate from(String who) - throws QueryParseException, OrmException { + public Predicate from(String who) throws QueryParseException, OrmException { Set ownerIds = parseAccount(who); return Predicate.or(owner(ownerIds), commentby(ownerIds)); } @@ -990,8 +1005,8 @@ public class ChangeQueryBuilder extends QueryBuilder { return parse(query); } } catch (RepositoryNotFoundException e) { - throw new QueryParseException("Unknown named query (no " + - args.allUsersName + " repo): " + name, e); + throw new QueryParseException( + "Unknown named query (no " + args.allUsersName + " repo): " + name, e); } catch (IOException | ConfigInvalidException e) { throw new QueryParseException("Error parsing named query: " + name, e); } @@ -999,26 +1014,22 @@ public class ChangeQueryBuilder extends QueryBuilder { } @Operator - public Predicate reviewedby(String who) - throws QueryParseException, OrmException { + public Predicate reviewedby(String who) throws QueryParseException, OrmException { return IsReviewedPredicate.create(parseAccount(who)); } @Operator - public Predicate destination(String name) - throws QueryParseException { + public Predicate destination(String name) throws QueryParseException { try (Repository git = args.repoManager.openRepository(args.allUsersName)) { - VersionedAccountDestinations d = - VersionedAccountDestinations.forUser(self()); + VersionedAccountDestinations d = VersionedAccountDestinations.forUser(self()); d.load(git); - Set destinations = - d.getDestinationList().getDestinations(name); + Set destinations = d.getDestinationList().getDestinations(name); if (destinations != null) { return new DestinationPredicate(destinations, name); } } catch (RepositoryNotFoundException e) { - throw new QueryParseException("Unknown named destination (no " + - args.allUsersName + " repo): " + name, e); + throw new QueryParseException( + "Unknown named destination (no " + args.allUsersName + " repo): " + name, e); } catch (IOException | ConfigInvalidException e) { throw new QueryParseException("Error parsing named destination: " + name, e); } @@ -1036,10 +1047,9 @@ public class ChangeQueryBuilder extends QueryBuilder { } @Operator - public Predicate submittable(String str) - throws QueryParseException { - SubmitRecord.Status status = Enums.getIfPresent( - SubmitRecord.Status.class, str.toUpperCase()).orNull(); + public Predicate submittable(String str) throws QueryParseException { + SubmitRecord.Status status = + Enums.getIfPresent(SubmitRecord.Status.class, str.toUpperCase()).orNull(); if (status == null) { throw error("invalid value for submittable:" + str); } @@ -1092,8 +1102,7 @@ public class ChangeQueryBuilder extends QueryBuilder { return Predicate.or(predicates); } - private Set parseAccount(String who) - throws QueryParseException, OrmException { + private Set parseAccount(String who) throws QueryParseException, OrmException { if ("self".equals(who)) { return Collections.singleton(self()); } @@ -1105,22 +1114,18 @@ public class ChangeQueryBuilder extends QueryBuilder { } private GroupReference parseGroup(String group) throws QueryParseException { - GroupReference g = GroupBackends.findBestSuggestion(args.groupBackend, - group); + GroupReference g = GroupBackends.findBestSuggestion(args.groupBackend, group); if (g == null) { throw error("Group " + group + " not found"); } return g; } - private List parseChange(String value) throws OrmException, - QueryParseException { + private List parseChange(String value) throws OrmException, QueryParseException { if (PAT_LEGACY_ID.matcher(value).matches()) { - return asChanges( - args.queryProvider.get().byLegacyChangeId(Change.Id.parse(value))); + return asChanges(args.queryProvider.get().byLegacyChangeId(Change.Id.parse(value))); } else if (PAT_CHANGE_ID.matcher(value).matches()) { - List changes = - asChanges(args.queryProvider.get().byKeyPrefix(parseChangeId(value))); + List changes = asChanges(args.queryProvider.get().byKeyPrefix(parseChangeId(value))); if (changes.isEmpty()) { throw error("Change " + value + " not found"); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryProcessor.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryProcessor.java index 0ff5ac71f6..91a37d574f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryProcessor.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryProcessor.java @@ -32,7 +32,6 @@ import com.google.gerrit.server.query.Predicate; import com.google.gerrit.server.query.QueryProcessor; import com.google.inject.Inject; import com.google.inject.Provider; - import java.util.Set; public class ChangeQueryProcessor extends QueryProcessor { @@ -48,7 +47,8 @@ public class ChangeQueryProcessor extends QueryProcessor { } @Inject - ChangeQueryProcessor(Provider userProvider, + ChangeQueryProcessor( + Provider userProvider, Metrics metrics, IndexConfig indexConfig, ChangeIndexCollection indexes, @@ -56,8 +56,14 @@ public class ChangeQueryProcessor extends QueryProcessor { Provider db, ChangeControl.GenericFactory changeControlFactory, ChangeNotes.Factory notesFactory) { - super(userProvider, metrics, ChangeSchemaDefinitions.INSTANCE, indexConfig, indexes, - rewriter, FIELD_LIMIT); + super( + userProvider, + metrics, + ChangeSchemaDefinitions.INSTANCE, + indexConfig, + indexes, + rewriter, + FIELD_LIMIT); this.db = db; this.changeControlFactory = changeControlFactory; this.notesFactory = notesFactory; @@ -70,16 +76,16 @@ public class ChangeQueryProcessor extends QueryProcessor { } @Override - protected QueryOptions createOptions(IndexConfig indexConfig, int start, - int limit, Set requestedFields) { - return IndexedChangeQuery.createOptions(indexConfig, start, limit, - requestedFields); + protected QueryOptions createOptions( + IndexConfig indexConfig, int start, int limit, Set requestedFields) { + return IndexedChangeQuery.createOptions(indexConfig, start, limit, requestedFields); } @Override - protected Predicate enforceVisibility( - Predicate pred) { - return new AndChangeSource(pred, new ChangeIsVisibleToPredicate(db, - notesFactory, changeControlFactory, userProvider.get()), start); + protected Predicate enforceVisibility(Predicate pred) { + return new AndChangeSource( + pred, + new ChangeIsVisibleToPredicate(db, notesFactory, changeControlFactory, userProvider.get()), + start); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeRegexPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeRegexPredicate.java index 747d72da2f..f42198521e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeRegexPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeRegexPredicate.java @@ -24,8 +24,7 @@ public abstract class ChangeRegexPredicate extends RegexPredicate super(def, value); } - protected ChangeRegexPredicate(FieldDef def, String name, - String value) { + protected ChangeRegexPredicate(FieldDef def, String name, String value) { super(def, name, value); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeStatusPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeStatusPredicate.java index 1ae8591362..9c16777773 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeStatusPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeStatusPredicate.java @@ -20,7 +20,6 @@ import com.google.gerrit.server.index.change.ChangeField; import com.google.gerrit.server.query.Predicate; import com.google.gerrit.server.query.QueryParseException; import com.google.gwtorm.server.OrmException; - import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -29,12 +28,12 @@ import java.util.TreeMap; /** * Predicate for a {@link Status}. - *

- * The actual name of this operator can differ, it usually comes as {@code - * status:} but may also be {@code is:} to help do-what-i-meanery for end-users - * searching for changes. Either operator name has the same meaning. - *

- * Status names are looked up by prefix case-insensitively. + * + *

The actual name of this operator can differ, it usually comes as {@code status:} but may also + * be {@code is:} to help do-what-i-meanery for end-users searching for changes. Either operator + * name has the same meaning. + * + *

Status names are looked up by prefix case-insensitively. */ public final class ChangeStatusPredicate extends ChangeIndexPredicate { private static final TreeMap> PREDICATES; @@ -64,15 +63,12 @@ public final class ChangeStatusPredicate extends ChangeIndexPredicate { return status.name().toLowerCase(); } - public static Predicate parse(String value) - throws QueryParseException { + public static Predicate parse(String value) throws QueryParseException { String lower = value.toLowerCase(); - NavigableMap> head = - PREDICATES.tailMap(lower, true); + NavigableMap> head = PREDICATES.tailMap(lower, true); if (!head.isEmpty()) { // Assume no statuses share a common prefix so we can only walk one entry. - Map.Entry> e = - head.entrySet().iterator().next(); + Map.Entry> e = head.entrySet().iterator().next(); if (e.getKey().startsWith(lower)) { return e.getValue(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/CommentByPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/CommentByPredicate.java index 1cb6333bcf..668c6f21f4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/CommentByPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/CommentByPredicate.java @@ -19,7 +19,6 @@ import com.google.gerrit.reviewdb.client.ChangeMessage; import com.google.gerrit.reviewdb.client.Comment; import com.google.gerrit.server.index.change.ChangeField; import com.google.gwtorm.server.OrmException; - import java.util.Objects; class CommentByPredicate extends ChangeIndexPredicate { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/CommentPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/CommentPredicate.java index b351740b33..4779a163d4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/CommentPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/CommentPredicate.java @@ -32,10 +32,8 @@ class CommentPredicate extends ChangeIndexPredicate { @Override public boolean match(ChangeData object) throws OrmException { try { - Predicate p = Predicate.and( - new LegacyChangeIdPredicate(object.getId()), this); - for (ChangeData cData - : index.getSource(p, IndexedChangeQuery.oneResult()).read()) { + Predicate p = Predicate.and(new LegacyChangeIdPredicate(object.getId()), this); + for (ChangeData cData : index.getSource(p, IndexedChangeQuery.oneResult()).read()) { if (cData.getId().equals(object.getId())) { return true; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/CommitPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/CommitPredicate.java index aa3dde3d0d..1188d5dea5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/CommitPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/CommitPredicate.java @@ -48,8 +48,7 @@ class CommitPredicate extends ChangeIndexPredicate { private boolean equals(PatchSet p, String id) { boolean exact = getField() == EXACT_COMMIT; String rev = p.getRevision() != null ? p.getRevision().get() : null; - return (exact && id.equals(rev)) - || (!exact && rev != null && rev.startsWith(id)); + return (exact && id.equals(rev)) || (!exact && rev != null && rev.startsWith(id)); } @Override diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/CommitterPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/CommitterPredicate.java index 06f537939d..8e13e202f0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/CommitterPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/CommitterPredicate.java @@ -27,8 +27,7 @@ public class CommitterPredicate extends ChangeIndexPredicate { @Override public boolean match(ChangeData object) throws OrmException { - return ChangeField.getCommitterParts(object).contains( - getValue().toLowerCase()); + return ChangeField.getCommitterParts(object).contains(getValue().toLowerCase()); } @Override diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictKey.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictKey.java index 3b3d9860fe..0101ffefde 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictKey.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictKey.java @@ -15,11 +15,9 @@ package com.google.gerrit.server.query.change; import com.google.gerrit.extensions.client.SubmitType; - -import org.eclipse.jgit.lib.ObjectId; - import java.io.Serializable; import java.util.Objects; +import org.eclipse.jgit.lib.ObjectId; public class ConflictKey implements Serializable { private static final long serialVersionUID = 2L; @@ -29,10 +27,9 @@ public class ConflictKey implements Serializable { private final SubmitType submitType; private final boolean contentMerge; - public ConflictKey(ObjectId commit, ObjectId otherCommit, - SubmitType submitType, boolean contentMerge) { - if (SubmitType.FAST_FORWARD_ONLY.equals(submitType) - || commit.compareTo(otherCommit) < 0) { + public ConflictKey( + ObjectId commit, ObjectId otherCommit, SubmitType submitType, boolean contentMerge) { + if (SubmitType.FAST_FORWARD_ONLY.equals(submitType) || commit.compareTo(otherCommit) < 0) { this.commit = commit; this.otherCommit = otherCommit; } else { @@ -64,7 +61,7 @@ public class ConflictKey implements Serializable { if (!(o instanceof ConflictKey)) { return false; } - ConflictKey other = (ConflictKey)o; + ConflictKey other = (ConflictKey) o; return commit.equals(other.commit) && otherCommit.equals(other.otherCommit) && submitType.equals(other.submitType) diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsCacheImpl.java index 8cca00d694..11856770f4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsCacheImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsCacheImpl.java @@ -29,8 +29,7 @@ public class ConflictsCacheImpl implements ConflictsCache { return new CacheModule() { @Override protected void configure() { - persist(NAME, ConflictKey.class, Boolean.class) - .maximumWeight(37400); + persist(NAME, ConflictKey.class, Boolean.class).maximumWeight(37400); bind(ConflictsCache.class).to(ConflictsCacheImpl.class); } }; @@ -39,8 +38,7 @@ public class ConflictsCacheImpl implements ConflictsCache { private final Cache conflictsCache; @Inject - public ConflictsCacheImpl( - @Named(NAME) Cache conflictsCache) { + public ConflictsCacheImpl(@Named(NAME) Cache conflictsCache) { this.conflictsCache = conflictsCache; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsPredicate.java index 26dbe2363d..9b11e8b5ca 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsPredicate.java @@ -31,7 +31,11 @@ import com.google.gerrit.server.query.QueryParseException; import com.google.gerrit.server.query.change.ChangeQueryBuilder.Arguments; import com.google.gwtorm.server.OrmException; import com.google.inject.Provider; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; @@ -41,16 +45,9 @@ import org.eclipse.jgit.revwalk.filter.RevFilter; import org.eclipse.jgit.treewalk.TreeWalk; import org.eclipse.jgit.treewalk.filter.TreeFilter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - class ConflictsPredicate extends OrPredicate { // UI code may depend on this string, so use caution when changing. - private static final String TOO_MANY_FILES = - "too many files to find conflicts"; + private static final String TOO_MANY_FILES = "too many files to find conflicts"; private final String value; @@ -60,17 +57,16 @@ class ConflictsPredicate extends OrPredicate { this.value = value; } - private static List> predicates(final Arguments args, - String value, List changes) + private static List> predicates( + final Arguments args, String value, List changes) throws QueryParseException, OrmException { int indexTerms = 0; - List> changePredicates = - Lists.newArrayListWithCapacity(changes.size()); + List> changePredicates = Lists.newArrayListWithCapacity(changes.size()); final Provider db = args.db; for (final Change c : changes) { - final ChangeDataCache changeDataCache = new ChangeDataCache( - c, db, args.changeDataFactory, args.projectCache); + final ChangeDataCache changeDataCache = + new ChangeDataCache(c, db, args.changeDataFactory, args.projectCache); List files = listFiles(c, args, changeDataCache); indexTerms += 3 + files.size(); if (indexTerms > args.indexConfig.maxTerms()) { @@ -82,94 +78,90 @@ class ConflictsPredicate extends OrPredicate { throw new QueryParseException(TOO_MANY_FILES); } - List> filePredicates = - Lists.newArrayListWithCapacity(files.size()); + List> filePredicates = Lists.newArrayListWithCapacity(files.size()); for (String file : files) { - filePredicates.add( - new EqualsPathPredicate(ChangeQueryBuilder.FIELD_PATH, file)); + filePredicates.add(new EqualsPathPredicate(ChangeQueryBuilder.FIELD_PATH, file)); } - List> predicatesForOneChange = - Lists.newArrayListWithCapacity(5); + List> predicatesForOneChange = Lists.newArrayListWithCapacity(5); + predicatesForOneChange.add(not(new LegacyChangeIdPredicate(c.getId()))); + predicatesForOneChange.add(new ProjectPredicate(c.getProject().get())); + predicatesForOneChange.add(new RefPredicate(c.getDest().get())); + + predicatesForOneChange.add(or(or(filePredicates), new IsMergePredicate(args, value))); + predicatesForOneChange.add( - not(new LegacyChangeIdPredicate(c.getId()))); - predicatesForOneChange.add( - new ProjectPredicate(c.getProject().get())); - predicatesForOneChange.add( - new RefPredicate(c.getDest().get())); + new ChangeOperatorPredicate(ChangeQueryBuilder.FIELD_CONFLICTS, value) { - predicatesForOneChange.add(or(or(filePredicates), - new IsMergePredicate(args, value))); - - predicatesForOneChange.add(new ChangeOperatorPredicate( - ChangeQueryBuilder.FIELD_CONFLICTS, value) { - - @Override - public boolean match(ChangeData object) throws OrmException { - Change otherChange = object.change(); - if (otherChange == null) { - return false; - } - if (!otherChange.getDest().equals(c.getDest())) { - return false; - } - SubmitTypeRecord str = object.submitTypeRecord(); - if (!str.isOk()) { - return false; - } - ObjectId other = ObjectId.fromString( - object.currentPatchSet().getRevision().get()); - ConflictKey conflictsKey = - new ConflictKey(changeDataCache.getTestAgainst(), other, str.type, - changeDataCache.getProjectState().isUseContentMerge()); - Boolean conflicts = args.conflictsCache.getIfPresent(conflictsKey); - if (conflicts != null) { - return conflicts; - } - try (Repository repo = - args.repoManager.openRepository(otherChange.getProject()); - CodeReviewRevWalk rw = CodeReviewCommit.newRevWalk(repo)) { - conflicts = !args.submitDryRun.run( - str.type, repo, rw, otherChange.getDest(), - changeDataCache.getTestAgainst(), other, - getAlreadyAccepted(repo, rw)); - args.conflictsCache.put(conflictsKey, conflicts); - return conflicts; - } catch (IntegrationException | NoSuchProjectException - | IOException e) { - throw new IllegalStateException(e); - } - } - - @Override - public int getCost() { - return 5; - } - - private Set getAlreadyAccepted(Repository repo, RevWalk rw) - throws IntegrationException { - try { - Set accepted = new HashSet<>(); - SubmitDryRun.addCommits( - changeDataCache.getAlreadyAccepted(repo), rw, accepted); - ObjectId tip = changeDataCache.getTestAgainst(); - if (tip != null) { - accepted.add(rw.parseCommit(tip)); + @Override + public boolean match(ChangeData object) throws OrmException { + Change otherChange = object.change(); + if (otherChange == null) { + return false; + } + if (!otherChange.getDest().equals(c.getDest())) { + return false; + } + SubmitTypeRecord str = object.submitTypeRecord(); + if (!str.isOk()) { + return false; + } + ObjectId other = ObjectId.fromString(object.currentPatchSet().getRevision().get()); + ConflictKey conflictsKey = + new ConflictKey( + changeDataCache.getTestAgainst(), + other, + str.type, + changeDataCache.getProjectState().isUseContentMerge()); + Boolean conflicts = args.conflictsCache.getIfPresent(conflictsKey); + if (conflicts != null) { + return conflicts; + } + try (Repository repo = args.repoManager.openRepository(otherChange.getProject()); + CodeReviewRevWalk rw = CodeReviewCommit.newRevWalk(repo)) { + conflicts = + !args.submitDryRun.run( + str.type, + repo, + rw, + otherChange.getDest(), + changeDataCache.getTestAgainst(), + other, + getAlreadyAccepted(repo, rw)); + args.conflictsCache.put(conflictsKey, conflicts); + return conflicts; + } catch (IntegrationException | NoSuchProjectException | IOException e) { + throw new IllegalStateException(e); + } } - return accepted; - } catch (OrmException | IOException e) { - throw new IntegrationException( - "Failed to determine already accepted commits.", e); - } - } - }); + + @Override + public int getCost() { + return 5; + } + + private Set getAlreadyAccepted(Repository repo, RevWalk rw) + throws IntegrationException { + try { + Set accepted = new HashSet<>(); + SubmitDryRun.addCommits(changeDataCache.getAlreadyAccepted(repo), rw, accepted); + ObjectId tip = changeDataCache.getTestAgainst(); + if (tip != null) { + accepted.add(rw.parseCommit(tip)); + } + return accepted; + } catch (OrmException | IOException e) { + throw new IntegrationException("Failed to determine already accepted commits.", e); + } + } + }); changePredicates.add(and(predicatesForOneChange)); } return changePredicates; } - private static List listFiles(Change c, Arguments args, - ChangeDataCache changeDataCache) throws OrmException { + private static List listFiles(Change c, Arguments args, ChangeDataCache changeDataCache) + throws OrmException { try (Repository repo = args.repoManager.openRepository(c.getProject()); RevWalk rw = new RevWalk(repo)) { RevCommit ps = rw.parseCommit(changeDataCache.getTestAgainst()); @@ -218,20 +210,22 @@ class ConflictsPredicate extends OrPredicate { private ProjectState projectState; private Iterable alreadyAccepted; - ChangeDataCache(Change change, Provider db, - ChangeData.Factory changeDataFactory, ProjectCache projectCache) { + ChangeDataCache( + Change change, + Provider db, + ChangeData.Factory changeDataFactory, + ProjectCache projectCache) { this.change = change; this.db = db; this.changeDataFactory = changeDataFactory; this.projectCache = projectCache; } - ObjectId getTestAgainst() - throws OrmException { + ObjectId getTestAgainst() throws OrmException { if (testAgainst == null) { - testAgainst = ObjectId.fromString( - changeDataFactory.create(db.get(), change) - .currentPatchSet().getRevision().get()); + testAgainst = + ObjectId.fromString( + changeDataFactory.create(db.get(), change).currentPatchSet().getRevision().get()); } return testAgainst; } @@ -240,8 +234,7 @@ class ConflictsPredicate extends OrPredicate { if (projectState == null) { projectState = projectCache.get(change.getProject()); if (projectState == null) { - throw new IllegalStateException( - new NoSuchProjectException(change.getProject())); + throw new IllegalStateException(new NoSuchProjectException(change.getProject())); } } return projectState; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/DestinationPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/DestinationPredicate.java index 7e573dc944..809e7a1b4c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/DestinationPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/DestinationPredicate.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.query.change; import com.google.gerrit.reviewdb.client.Branch; import com.google.gerrit.reviewdb.client.Change; import com.google.gwtorm.server.OrmException; - import java.util.Set; class DestinationPredicate extends ChangeOperatorPredicate { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/EqualsFilePredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/EqualsFilePredicate.java index 6877761c50..fb6c56b2f9 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/EqualsFilePredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/EqualsFilePredicate.java @@ -21,8 +21,7 @@ import com.google.gwtorm.server.OrmException; class EqualsFilePredicate extends ChangeIndexPredicate { static Predicate create(Arguments args, String value) { - Predicate eqPath = - new EqualsPathPredicate(ChangeQueryBuilder.FIELD_FILE, value); + Predicate eqPath = new EqualsPathPredicate(ChangeQueryBuilder.FIELD_FILE, value); if (!args.getSchema().hasField(ChangeField.FILE_PART)) { return eqPath; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/EqualsLabelPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/EqualsLabelPredicate.java index 0adf78fd0f..1189e87e21 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/EqualsLabelPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/EqualsLabelPredicate.java @@ -41,8 +41,7 @@ class EqualsLabelPredicate extends ChangeIndexPredicate { private final Account.Id account; private final AccountGroup.UUID group; - EqualsLabelPredicate(LabelPredicate.Args args, String label, int expVal, - Account.Id account) { + EqualsLabelPredicate(LabelPredicate.Args args, String label, int expVal, Account.Id account) { super(args.field, ChangeField.formatLabel(label, expVal, account)); this.ccFactory = args.ccFactory; this.projectCache = args.projectCache; @@ -105,16 +104,15 @@ class EqualsLabelPredicate extends ChangeIndexPredicate { return null; } - private boolean match(Change change, int value, Account.Id approver, - LabelType type) throws OrmException { + private boolean match(Change change, int value, Account.Id approver, LabelType type) + throws OrmException { int psVal = value; if (psVal == expVal) { // Double check the value is still permitted for the user. // IdentifiedUser reviewer = userFactory.create(approver); try { - ChangeControl cc = - ccFactory.controlFor(dbProvider.get(), change, reviewer); + ChangeControl cc = ccFactory.controlFor(dbProvider.get(), change, reviewer); if (!cc.isVisible(dbProvider.get())) { // The user can't see the change anymore. // diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/EqualsPathPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/EqualsPathPredicate.java index 5edd06ccd2..9d841f394e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/EqualsPathPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/EqualsPathPredicate.java @@ -16,7 +16,6 @@ package com.google.gerrit.server.query.change; import com.google.gerrit.server.index.change.ChangeField; import com.google.gwtorm.server.OrmException; - import java.util.Collections; import java.util.List; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/GroupPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/GroupPredicate.java index 9e9bc8d227..54e1c977a6 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/GroupPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/GroupPredicate.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.query.change; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.server.index.change.ChangeField; import com.google.gwtorm.server.OrmException; - import java.util.List; class GroupPredicate extends ChangeIndexPredicate { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/HashtagPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/HashtagPredicate.java index 185a5390ea..4fd4156c9c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/HashtagPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/HashtagPredicate.java @@ -38,4 +38,3 @@ class HashtagPredicate extends ChangeIndexPredicate { return 1; } } - diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/IntegerRangeChangePredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/IntegerRangeChangePredicate.java index a272fbb0af..d4f562057d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/IntegerRangeChangePredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/IntegerRangeChangePredicate.java @@ -19,11 +19,11 @@ import com.google.gerrit.server.index.IntegerRangePredicate; import com.google.gerrit.server.query.Matchable; import com.google.gerrit.server.query.QueryParseException; -public abstract class IntegerRangeChangePredicate - extends IntegerRangePredicate implements Matchable { +public abstract class IntegerRangeChangePredicate extends IntegerRangePredicate + implements Matchable { - protected IntegerRangeChangePredicate(FieldDef type, - String value) throws QueryParseException { + protected IntegerRangeChangePredicate(FieldDef type, String value) + throws QueryParseException { super(type, value); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/InternalChangeQuery.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/InternalChangeQuery.java index 0bd180053f..fa2f5fe418 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/InternalChangeQuery.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/InternalChangeQuery.java @@ -36,17 +36,15 @@ import com.google.gerrit.server.query.InternalQuery; import com.google.gerrit.server.query.Predicate; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.Ref; -import org.eclipse.jgit.lib.Repository; - import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Set; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.lib.Repository; public class InternalChangeQuery extends InternalQuery { private static Predicate ref(Branch.NameKey branch) { @@ -73,7 +71,8 @@ public class InternalChangeQuery extends InternalQuery { private final ChangeNotes.Factory notesFactory; @Inject - InternalChangeQuery(ChangeQueryProcessor queryProcessor, + InternalChangeQuery( + ChangeQueryProcessor queryProcessor, ChangeIndexCollection indexes, IndexConfig indexConfig, ChangeData.Factory changeDataFactory, @@ -119,8 +118,7 @@ public class InternalChangeQuery extends InternalQuery { return query(new LegacyChangeIdPredicate(id)); } - public List byLegacyChangeIds(Collection ids) - throws OrmException { + public List byLegacyChangeIds(Collection ids) throws OrmException { List> preds = new ArrayList<>(ids.size()); for (Change.Id id : ids) { preds.add(new LegacyChangeIdPredicate(id)); @@ -128,46 +126,41 @@ public class InternalChangeQuery extends InternalQuery { return query(or(preds)); } - public List byBranchKey(Branch.NameKey branch, Change.Key key) - throws OrmException { - return query(and( - ref(branch), - project(branch.getParentKey()), - change(key))); + public List byBranchKey(Branch.NameKey branch, Change.Key key) throws OrmException { + return query(and(ref(branch), project(branch.getParentKey()), change(key))); } - public List byProject(Project.NameKey project) - throws OrmException { + public List byProject(Project.NameKey project) throws OrmException { return query(project(project)); } - public List byBranchOpen(Branch.NameKey branch) - throws OrmException { - return query(and( - ref(branch), - project(branch.getParentKey()), - open())); + public List byBranchOpen(Branch.NameKey branch) throws OrmException { + return query(and(ref(branch), project(branch.getParentKey()), open())); } - public List byBranchNew(Branch.NameKey branch) - throws OrmException { - return query(and( - ref(branch), - project(branch.getParentKey()), - status(Change.Status.NEW))); + public List byBranchNew(Branch.NameKey branch) throws OrmException { + return query(and(ref(branch), project(branch.getParentKey()), status(Change.Status.NEW))); } - public Iterable byCommitsOnBranchNotMerged(Repository repo, - ReviewDb db, Branch.NameKey branch, Collection hashes) + public Iterable byCommitsOnBranchNotMerged( + Repository repo, ReviewDb db, Branch.NameKey branch, Collection hashes) throws OrmException, IOException { - return byCommitsOnBranchNotMerged(repo, db, branch, hashes, + return byCommitsOnBranchNotMerged( + repo, + db, + branch, + hashes, // Account for all commit predicates plus ref, project, status. indexConfig.maxTerms() - 3); } @VisibleForTesting - Iterable byCommitsOnBranchNotMerged(Repository repo, ReviewDb db, - Branch.NameKey branch, Collection hashes, int indexLimit) + Iterable byCommitsOnBranchNotMerged( + Repository repo, + ReviewDb db, + Branch.NameKey branch, + Collection hashes, + int indexLimit) throws OrmException, IOException { if (hashes.size() > indexLimit) { return byCommitsOnBranchNotMergedFromDatabase(repo, db, branch, hashes); @@ -176,12 +169,11 @@ public class InternalChangeQuery extends InternalQuery { } private Iterable byCommitsOnBranchNotMergedFromDatabase( - Repository repo, final ReviewDb db, final Branch.NameKey branch, - Collection hashes) throws OrmException, IOException { + Repository repo, final ReviewDb db, final Branch.NameKey branch, Collection hashes) + throws OrmException, IOException { Set changeIds = Sets.newHashSetWithExpectedSize(hashes.size()); String lastPrefix = null; - for (Ref ref : - repo.getRefDatabase().getRefs(RefNames.REFS_CHANGES).values()) { + for (Ref ref : repo.getRefDatabase().getRefs(RefNames.REFS_CHANGES).values()) { String r = ref.getName(); if ((lastPrefix != null && r.startsWith(lastPrefix)) || !hashes.contains(ref.getObjectId().name())) { @@ -196,23 +188,26 @@ public class InternalChangeQuery extends InternalQuery { } } - List notes = notesFactory.create( - db, branch.getParentKey(), changeIds, - cn -> { - Change c = cn.getChange(); - return c.getDest().equals(branch) - && c.getStatus() != Change.Status.MERGED; - }); + List notes = + notesFactory.create( + db, + branch.getParentKey(), + changeIds, + cn -> { + Change c = cn.getChange(); + return c.getDest().equals(branch) && c.getStatus() != Change.Status.MERGED; + }); return Lists.transform(notes, n -> changeDataFactory.create(db, n)); } private Iterable byCommitsOnBranchNotMergedFromIndex( Branch.NameKey branch, Collection hashes) throws OrmException { - return query(and( - ref(branch), - project(branch.getParentKey()), - not(status(Change.Status.MERGED)), - or(commits(hashes)))); + return query( + and( + ref(branch), + project(branch.getParentKey()), + not(status(Change.Status.MERGED)), + or(commits(hashes)))); } private static List> commits(Collection hashes) { @@ -223,13 +218,11 @@ public class InternalChangeQuery extends InternalQuery { return commits; } - public List byProjectOpen(Project.NameKey project) - throws OrmException { + public List byProjectOpen(Project.NameKey project) throws OrmException { return query(and(project(project), open())); } - public List byTopicOpen(String topic) - throws OrmException { + public List byTopicOpen(String topic) throws OrmException { return query(and(new ExactTopicPredicate(topic), open())); } @@ -241,33 +234,29 @@ public class InternalChangeQuery extends InternalQuery { return query(commit(hash)); } - public List byProjectCommit(Project.NameKey project, - ObjectId id) throws OrmException { + public List byProjectCommit(Project.NameKey project, ObjectId id) + throws OrmException { return byProjectCommit(project, id.name()); } - public List byProjectCommit(Project.NameKey project, - String hash) throws OrmException { + public List byProjectCommit(Project.NameKey project, String hash) + throws OrmException { return query(and(project(project), commit(hash))); } - public List byProjectCommits(Project.NameKey project, - List hashes) throws OrmException { + public List byProjectCommits(Project.NameKey project, List hashes) + throws OrmException { int n = indexConfig.maxTerms() - 1; checkArgument(hashes.size() <= n, "cannot exceed %s commits", n); return query(and(project(project), or(commits(hashes)))); } - public List byBranchCommit(String project, String branch, - String hash) throws OrmException { - return query(and( - new ProjectPredicate(project), - new RefPredicate(branch), - commit(hash))); + public List byBranchCommit(String project, String branch, String hash) + throws OrmException { + return query(and(new ProjectPredicate(project), new RefPredicate(branch), commit(hash))); } - public List byBranchCommit(Branch.NameKey branch, String hash) - throws OrmException { + public List byBranchCommit(Branch.NameKey branch, String hash) throws OrmException { return byBranchCommit(branch.getParentKey().get(), branch.get(), hash); } @@ -278,8 +267,8 @@ public class InternalChangeQuery extends InternalQuery { return query(new SubmissionIdPredicate(cs)); } - public List byProjectGroups(Project.NameKey project, - Collection groups) throws OrmException { + public List byProjectGroups(Project.NameKey project, Collection groups) + throws OrmException { List groupPredicates = new ArrayList<>(groups.size()); for (String g : groups) { groupPredicates.add(new GroupPredicate(g)); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/IsMergePredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/IsMergePredicate.java index 376ad847ae..820c605b05 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/IsMergePredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/IsMergePredicate.java @@ -17,14 +17,12 @@ package com.google.gerrit.server.query.change; import com.google.gerrit.server.git.CodeReviewCommit; import com.google.gerrit.server.query.change.ChangeQueryBuilder.Arguments; import com.google.gwtorm.server.OrmException; - +import java.io.IOException; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; -import java.io.IOException; - public class IsMergePredicate extends ChangeOperatorPredicate { private final Arguments args; @@ -35,10 +33,8 @@ public class IsMergePredicate extends ChangeOperatorPredicate { @Override public boolean match(ChangeData cd) throws OrmException { - ObjectId id = ObjectId.fromString( - cd.currentPatchSet().getRevision().get()); - try (Repository repo = - args.repoManager.openRepository(cd.change().getProject()); + ObjectId id = ObjectId.fromString(cd.currentPatchSet().getRevision().get()); + try (Repository repo = args.repoManager.openRepository(cd.change().getProject()); RevWalk rw = CodeReviewCommit.newRevWalk(repo)) { RevCommit commit = rw.parseCommit(id); return commit.getParentCount() > 1; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/IsReviewedPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/IsReviewedPredicate.java index 24fcd6b655..3295f1c549 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/IsReviewedPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/IsReviewedPredicate.java @@ -20,15 +20,13 @@ import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.server.index.change.ChangeField; import com.google.gerrit.server.query.Predicate; import com.google.gwtorm.server.OrmException; - import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Set; class IsReviewedPredicate extends ChangeIndexPredicate { - private static final Account.Id NOT_REVIEWED = - new Account.Id(ChangeField.NOT_REVIEWED); + private static final Account.Id NOT_REVIEWED = new Account.Id(ChangeField.NOT_REVIEWED); static Predicate create() { return Predicate.not(new IsReviewedPredicate(NOT_REVIEWED)); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/IsWatchedByPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/IsWatchedByPredicate.java index 0b7a2f0472..dda834b98f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/IsWatchedByPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/IsWatchedByPredicate.java @@ -21,7 +21,6 @@ import com.google.gerrit.server.query.AndPredicate; import com.google.gerrit.server.query.Predicate; import com.google.gerrit.server.query.QueryBuilder; import com.google.gerrit.server.query.QueryParseException; - import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -37,15 +36,14 @@ class IsWatchedByPredicate extends AndPredicate { private final CurrentUser user; - IsWatchedByPredicate(ChangeQueryBuilder.Arguments args, - boolean checkIsVisible) throws QueryParseException { + IsWatchedByPredicate(ChangeQueryBuilder.Arguments args, boolean checkIsVisible) + throws QueryParseException { super(filters(args, checkIsVisible)); this.user = args.getUser(); } private static List> filters( - ChangeQueryBuilder.Arguments args, - boolean checkIsVisible) throws QueryParseException { + ChangeQueryBuilder.Arguments args, boolean checkIsVisible) throws QueryParseException { List> r = new ArrayList<>(); ChangeQueryBuilder builder = new ChangeQueryBuilder(args); for (ProjectWatchKey w : getWatches(args)) { @@ -58,7 +56,7 @@ class IsWatchedByPredicate extends AndPredicate { // will never match and return null. Yes this test // prevents you from having a filter that matches what // another user is filtering on. :-) - continue; + continue; } } catch (QueryParseException e) { continue; @@ -91,14 +89,13 @@ class IsWatchedByPredicate extends AndPredicate { } } - private static Collection getWatches( - ChangeQueryBuilder.Arguments args) throws QueryParseException { + private static Collection getWatches(ChangeQueryBuilder.Arguments args) + throws QueryParseException { CurrentUser user = args.getUser(); if (user.isIdentifiedUser()) { - return args.accountCache.get(args.getUser().getAccountId()) - .getProjectWatches().keySet(); + return args.accountCache.get(args.getUser().getAccountId()).getProjectWatches().keySet(); } - return Collections. emptySet(); + return Collections.emptySet(); } private static List> none() { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/LabelPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/LabelPredicate.java index 9bed4b524c..2fbaa1e848 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/LabelPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/LabelPredicate.java @@ -29,7 +29,6 @@ import com.google.gerrit.server.util.LabelVote; import com.google.gerrit.server.util.RangeUtil; import com.google.gerrit.server.util.RangeUtil.Range; import com.google.inject.Provider; - import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -82,12 +81,22 @@ public class LabelPredicate extends OrPredicate { private final String value; @SuppressWarnings("deprecation") - LabelPredicate(ChangeQueryBuilder.Arguments a, String value, - Set accounts, AccountGroup.UUID group) { - super(predicates(new Args( - a.getSchema().getField(ChangeField.LABEL2, ChangeField.LABEL).get(), - a.projectCache, a.changeControlGenericFactory, a.userFactory, a.db, - value, accounts, group))); + LabelPredicate( + ChangeQueryBuilder.Arguments a, + String value, + Set accounts, + AccountGroup.UUID group) { + super( + predicates( + new Args( + a.getSchema().getField(ChangeField.LABEL2, ChangeField.LABEL).get(), + a.projectCache, + a.changeControlGenericFactory, + a.userFactory, + a.db, + value, + accounts, + group))); this.value = value; } @@ -116,27 +125,22 @@ public class LabelPredicate extends OrPredicate { range = new Range(v, 1, 1); } } else { - range = RangeUtil.getRange( - parsed.label, - parsed.test, - parsed.expVal, - -MAX_LABEL_VALUE, - MAX_LABEL_VALUE); + range = + RangeUtil.getRange( + parsed.label, parsed.test, parsed.expVal, -MAX_LABEL_VALUE, MAX_LABEL_VALUE); } String prefix = range.prefix; int min = range.min; int max = range.max; - List> r = - Lists.newArrayListWithCapacity(max - min + 1); + List> r = Lists.newArrayListWithCapacity(max - min + 1); for (int i = min; i <= max; i++) { r.add(onePredicate(args, prefix, i)); } return r; } - private static Predicate onePredicate(Args args, String label, - int expVal) { + private static Predicate onePredicate(Args args, String label, int expVal) { if (expVal != 0) { return equalsLabelPredicate(args, label, expVal); } @@ -144,8 +148,7 @@ public class LabelPredicate extends OrPredicate { } private static Predicate noLabelQuery(Args args, String label) { - List> r = - Lists.newArrayListWithCapacity(2 * MAX_LABEL_VALUE); + List> r = Lists.newArrayListWithCapacity(2 * MAX_LABEL_VALUE); for (int i = 1; i <= MAX_LABEL_VALUE; i++) { r.add(equalsLabelPredicate(args, label, i)); r.add(equalsLabelPredicate(args, label, -i)); @@ -153,8 +156,7 @@ public class LabelPredicate extends OrPredicate { return not(or(r)); } - private static Predicate equalsLabelPredicate(Args args, - String label, int expVal) { + private static Predicate equalsLabelPredicate(Args args, String label, int expVal) { if (args.accounts == null || args.accounts.isEmpty()) { return new EqualsLabelPredicate(args, label, expVal, null); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/MessagePredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/MessagePredicate.java index 722a8ad984..9e525c267c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/MessagePredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/MessagePredicate.java @@ -21,10 +21,7 @@ import com.google.gerrit.server.query.Predicate; import com.google.gerrit.server.query.QueryParseException; import com.google.gwtorm.server.OrmException; -/** - * Predicate to match changes that contains specified text in commit messages - * body. - */ +/** Predicate to match changes that contains specified text in commit messages body. */ class MessagePredicate extends ChangeIndexPredicate { private final ChangeIndex index; @@ -36,10 +33,8 @@ class MessagePredicate extends ChangeIndexPredicate { @Override public boolean match(ChangeData object) throws OrmException { try { - Predicate p = Predicate.and( - new LegacyChangeIdPredicate(object.getId()), this); - for (ChangeData cData - : index.getSource(p, IndexedChangeQuery.oneResult()).read()) { + Predicate p = Predicate.and(new LegacyChangeIdPredicate(object.getId()), this); + for (ChangeData cData : index.getSource(p, IndexedChangeQuery.oneResult()).read()) { if (cData.getId().equals(object.getId())) { return true; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OrSource.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OrSource.java index 28aef5e6bc..90c2fb324f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OrSource.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OrSource.java @@ -20,7 +20,6 @@ import com.google.gerrit.server.query.Predicate; import com.google.gwtorm.server.ListResultSet; import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.ResultSet; - import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; @@ -57,8 +56,7 @@ public class OrSource extends OrPredicate implements ChangeDataSourc @Override public boolean hasChange() { for (Predicate p : getChildren()) { - if (!(p instanceof ChangeDataSource) - || !((ChangeDataSource) p).hasChange()) { + if (!(p instanceof ChangeDataSource) || !((ChangeDataSource) p).hasChange()) { return false; } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OutputStreamQuery.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OutputStreamQuery.java index 5e08ee3596..cd98087838 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OutputStreamQuery.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OutputStreamQuery.java @@ -36,15 +36,6 @@ import com.google.gerrit.server.query.QueryResult; import com.google.gson.Gson; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - -import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.revwalk.RevWalk; -import org.eclipse.jgit.util.io.DisabledOutputStream; -import org.joda.time.format.DateTimeFormat; -import org.joda.time.format.DateTimeFormatter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStream; @@ -57,20 +48,23 @@ import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevWalk; +import org.eclipse.jgit.util.io.DisabledOutputStream; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -/** - * Change query implementation that outputs to a stream in the style of an SSH - * command. - */ +/** Change query implementation that outputs to a stream in the style of an SSH command. */ public class OutputStreamQuery { - private static final Logger log = - LoggerFactory.getLogger(OutputStreamQuery.class); + private static final Logger log = LoggerFactory.getLogger(OutputStreamQuery.class); - private static final DateTimeFormatter dtf = - DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss zzz"); + private static final DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss zzz"); public enum OutputFormat { - TEXT, JSON + TEXT, + JSON } private final ReviewDb db; @@ -179,9 +173,10 @@ public class OutputStreamQuery { } public void query(String queryString) throws IOException { - out = new PrintWriter( // - new BufferedWriter( // - new OutputStreamWriter(outputStream, UTF_8))); + out = + new PrintWriter( // + new BufferedWriter( // + new OutputStreamWriter(outputStream, UTF_8))); try { if (queryProcessor.isDisabled()) { ErrorMessage m = new ErrorMessage(); @@ -196,8 +191,7 @@ public class OutputStreamQuery { Map repos = new HashMap<>(); Map revWalks = new HashMap<>(); - QueryResult results = - queryProcessor.query(queryBuilder.parse(queryString)); + QueryResult results = queryProcessor.query(queryBuilder.parse(queryString)); try { for (ChangeData d : results.entities()) { show(buildChangeAttribute(d, repos, revWalks)); @@ -208,8 +202,7 @@ public class OutputStreamQuery { stats.rowCount = results.entities().size(); stats.moreChanges = results.more(); - stats.runTimeMilliseconds = - TimeUtil.nowMs() - stats.runTimeMilliseconds; + stats.runTimeMilliseconds = TimeUtil.nowMs() - stats.runTimeMilliseconds; show(stats); } catch (OrmException err) { log.error("Cannot execute query: " + queryString, err); @@ -232,9 +225,8 @@ public class OutputStreamQuery { } } - private ChangeAttribute buildChangeAttribute(ChangeData d, - Map repos, - Map revWalks) + private ChangeAttribute buildChangeAttribute( + ChangeData d, Map repos, Map revWalks) throws OrmException, IOException { ChangeControl cc = d.changeControl().forUser(user); @@ -243,8 +235,7 @@ public class OutputStreamQuery { eventFactory.extend(c, d.change()); if (!trackingFooters.isEmpty()) { - eventFactory.addTrackingIds(c, - trackingFooters.extract(d.commitFooters())); + eventFactory.addTrackingIds(c, trackingFooters.extract(d.commitFooters())); } if (includeAllReviewers) { @@ -252,10 +243,8 @@ public class OutputStreamQuery { } if (includeSubmitRecords) { - eventFactory.addSubmitRecords(c, new SubmitRuleEvaluator(d) - .setAllowClosed(true) - .setAllowDraft(true) - .evaluate()); + eventFactory.addSubmitRecords( + c, new SubmitRuleEvaluator(d).setAllowClosed(true).setAllowDraft(true).evaluate()); } if (includeCommitMessage) { @@ -276,26 +265,28 @@ public class OutputStreamQuery { } if (includePatchSets) { - eventFactory.addPatchSets(db, rw, c, d.visiblePatchSets(), + eventFactory.addPatchSets( + db, + rw, + c, + d.visiblePatchSets(), includeApprovals ? d.approvals().asMap() : null, - includeFiles, d.change(), labelTypes); + includeFiles, + d.change(), + labelTypes); } if (includeCurrentPatchSet) { PatchSet current = d.currentPatchSet(); if (current != null && cc.isPatchVisible(current, d.db())) { - c.currentPatchSet = - eventFactory.asPatchSetAttribute(db, rw, d.change(), current); - eventFactory.addApprovals(c.currentPatchSet, - d.currentApprovals(), labelTypes); + c.currentPatchSet = eventFactory.asPatchSetAttribute(db, rw, d.change(), current); + eventFactory.addApprovals(c.currentPatchSet, d.currentApprovals(), labelTypes); if (includeFiles) { - eventFactory.addPatchSetFileNames(c.currentPatchSet, - d.change(), d.currentPatchSet()); + eventFactory.addPatchSetFileNames(c.currentPatchSet, d.change(), d.currentPatchSet()); } if (includeComments) { - eventFactory.addPatchSetComments(c.currentPatchSet, - d.publishedComments()); + eventFactory.addPatchSetComments(c.currentPatchSet, d.publishedComments()); } } } @@ -303,9 +294,15 @@ public class OutputStreamQuery { if (includeComments) { eventFactory.addComments(c, d.messages()); if (includePatchSets) { - eventFactory.addPatchSets(db, rw, c, d.visiblePatchSets(), + eventFactory.addPatchSets( + db, + rw, + c, + d.visiblePatchSets(), includeApprovals ? d.approvals().asMap() : null, - includeFiles, d.change(), labelTypes); + includeFiles, + d.change(), + labelTypes); for (PatchSetAttribute attribute : c.patchSets) { eventFactory.addPatchSetComments(attribute, d.publishedComments()); } @@ -319,8 +316,7 @@ public class OutputStreamQuery { return c; } - private static void closeAll(Iterable revWalks, - Iterable repos) { + private static void closeAll(Iterable revWalks, Iterable repos) { if (repos != null) { for (Repository repo : repos) { repo.close(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OwnerinPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OwnerinPredicate.java index 72327ba82a..f3239afc81 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OwnerinPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OwnerinPredicate.java @@ -23,8 +23,7 @@ class OwnerinPredicate extends ChangeOperatorPredicate { private final IdentifiedUser.GenericFactory userFactory; private final AccountGroup.UUID uuid; - OwnerinPredicate(IdentifiedUser.GenericFactory userFactory, - AccountGroup.UUID uuid) { + OwnerinPredicate(IdentifiedUser.GenericFactory userFactory, AccountGroup.UUID uuid) { super(ChangeQueryBuilder.FIELD_OWNERIN, uuid.toString()); this.userFactory = userFactory; this.uuid = uuid; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ParentProjectPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ParentProjectPredicate.java index 0cd697867d..d3a3f20f99 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ParentProjectPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ParentProjectPredicate.java @@ -24,7 +24,6 @@ import com.google.gerrit.server.project.ProjectState; import com.google.gerrit.server.query.OrPredicate; import com.google.gerrit.server.query.Predicate; import com.google.inject.Provider; - import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -32,8 +31,10 @@ import java.util.List; class ParentProjectPredicate extends OrPredicate { private final String value; - ParentProjectPredicate(ProjectCache projectCache, - Provider listChildProjects, Provider self, + ParentProjectPredicate( + ProjectCache projectCache, + Provider listChildProjects, + Provider self, String value) { super(predicates(projectCache, listChildProjects, self, value)); this.value = value; @@ -42,7 +43,8 @@ class ParentProjectPredicate extends OrPredicate { private static List> predicates( ProjectCache projectCache, Provider listChildProjects, - Provider self, String value) { + Provider self, + String value) { ProjectState projectState = projectCache.get(new Project.NameKey(value)); if (projectState == null) { return Collections.emptyList(); @@ -52,8 +54,7 @@ class ParentProjectPredicate extends OrPredicate { r.add(new ProjectPredicate(projectState.getProject().getName())); ListChildProjects children = listChildProjects.get(); children.setRecursive(true); - for (ProjectInfo p : children.apply(new ProjectResource( - projectState.controlFor(self.get())))) { + for (ProjectInfo p : children.apply(new ProjectResource(projectState.controlFor(self.get())))) { r.add(new ProjectPredicate(p.name)); } return r; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/PredicateArgs.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/PredicateArgs.java index 2fd0177604..1fbc1aad06 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/PredicateArgs.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/PredicateArgs.java @@ -15,7 +15,6 @@ package com.google.gerrit.server.query.change; import com.google.gerrit.server.query.QueryParseException; - import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -23,12 +22,11 @@ import java.util.Map; /** * This class is used to extract comma separated values in a predicate. - *

- * If tags for the values are present (e.g. "branch=jb_2.3,vote=approved") then - * the args are placed in a map that maps tag to value (e.g., "branch" to "jb_2.3"). - * If no tag is present (e.g. "jb_2.3,approved") then the args are placed into a - * positional list. Args may be mixed so some may appear in the map and others - * in the positional list (e.g. "vote=approved,jb_2.3). + * + *

If tags for the values are present (e.g. "branch=jb_2.3,vote=approved") then the args are + * placed in a map that maps tag to value (e.g., "branch" to "jb_2.3"). If no tag is present (e.g. + * "jb_2.3,approved") then the args are placed into a positional list. Args may be mixed so some may + * appear in the map and others in the positional list (e.g. "vote=approved,jb_2.3). */ public class PredicateArgs { public List positional; @@ -36,9 +34,9 @@ public class PredicateArgs { /** * Parses query arguments into {@link #keyValue} and/or {@link #positional}.. - *

- * Labels for these arguments should be kept in ChangeQueryBuilder - * as {@code ARG_ID_[argument name]}. + * + *

Labels for these arguments should be kept in ChangeQueryBuilder as {@code ARG_ID_[argument + * name]}. * * @param args arguments to be parsed * @throws QueryParseException diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryChanges.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryChanges.java index 62ca0e0e74..7eccf4502a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryChanges.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryChanges.java @@ -31,15 +31,13 @@ import com.google.gerrit.server.query.QueryParseException; import com.google.gerrit.server.query.QueryResult; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - -import org.kohsuke.args4j.Option; - import java.util.ArrayList; import java.util.Collections; import java.util.EnumSet; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.kohsuke.args4j.Option; public class QueryChanges implements RestReadView { private final ChangeJson.Factory json; @@ -47,10 +45,20 @@ public class QueryChanges implements RestReadView { private final ChangeQueryProcessor imp; private EnumSet options; - @Option(name = "--query", aliases = {"-q"}, metaVar = "QUERY", usage = "Query string") + @Option( + name = "--query", + aliases = {"-q"}, + metaVar = "QUERY", + usage = "Query string" + ) private List queries; - @Option(name = "--limit", aliases = {"-n"}, metaVar = "CNT", usage = "Maximum number of results to return") + @Option( + name = "--limit", + aliases = {"-n"}, + metaVar = "CNT", + usage = "Maximum number of results to return" + ) public void setLimit(int limit) { imp.setLimit(limit); } @@ -65,15 +73,18 @@ public class QueryChanges implements RestReadView { options.addAll(ListChangesOption.fromBits(Integer.parseInt(hex, 16))); } - @Option(name = "--start", aliases = {"-S"}, metaVar = "CNT", usage = "Number of changes to skip") + @Option( + name = "--start", + aliases = {"-S"}, + metaVar = "CNT", + usage = "Number of changes to skip" + ) public void setStart(int start) { imp.setStart(start); } @Inject - QueryChanges(ChangeJson.Factory json, - ChangeQueryBuilder qb, - ChangeQueryProcessor qp) { + QueryChanges(ChangeJson.Factory json, ChangeQueryBuilder qb, ChangeQueryProcessor qp) { this.json = json; this.qb = qb; this.imp = qp; @@ -100,8 +111,8 @@ public class QueryChanges implements RestReadView { out = query(); } catch (QueryParseException e) { // This is a hack to detect an operator that requires authentication. - Pattern p = Pattern.compile( - "^Error in operator (.*:self|is:watched|is:owner|is:reviewer|has:.*)$"); + Pattern p = + Pattern.compile("^Error in operator (.*:self|is:watched|is:owner|is:reviewer|has:.*)$"); Matcher m = p.matcher(e.getMessage()); if (m.matches()) { String op = m.group(1); @@ -112,8 +123,7 @@ public class QueryChanges implements RestReadView { return out.size() == 1 ? out.get(0) : out; } - private List> query() - throws OrmException, QueryParseException { + private List> query() throws OrmException, QueryParseException { if (imp.isDisabled()) { throw new QueryParseException("query disabled"); } @@ -129,12 +139,11 @@ public class QueryChanges implements RestReadView { List> results = imp.query(qb.parse(queries)); boolean requireLazyLoad = containsAnyOf(options, ImmutableSet.of(DETAILED_LABELS, LABELS)) - && !qb.getArgs().getSchema() - .hasField(ChangeField.STORED_SUBMIT_RECORD_LENIENT); - List> res = json.create(options) - .lazyLoad(requireLazyLoad - || containsAnyOf(options, ChangeJson.REQUIRE_LAZY_LOAD)) - .formatQueryResults(results); + && !qb.getArgs().getSchema().hasField(ChangeField.STORED_SUBMIT_RECORD_LENIENT); + List> res = + json.create(options) + .lazyLoad(requireLazyLoad || containsAnyOf(options, ChangeJson.REQUIRE_LAZY_LOAD)) + .formatQueryResults(results); for (int n = 0; n < cnt; n++) { List info = res.get(n); if (results.get(n).more()) { @@ -145,8 +154,7 @@ public class QueryChanges implements RestReadView { } private static boolean containsAnyOf( - EnumSet set, - ImmutableSet toFind) { + EnumSet set, ImmutableSet toFind) { return !Sets.intersection(toFind, set).isEmpty(); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexPathPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexPathPredicate.java index 67efd69d5c..5b9774ce99 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexPathPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexPathPredicate.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.query.change; import com.google.gerrit.server.index.change.ChangeField; import com.google.gerrit.server.util.RegexListSearcher; import com.google.gwtorm.server.OrmException; - import java.util.List; class RegexPathPredicate extends ChangeRegexPredicate { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexProjectPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexProjectPredicate.java index 007566ee3a..1284e8874c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexProjectPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexProjectPredicate.java @@ -18,7 +18,6 @@ import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.index.change.ChangeField; import com.google.gwtorm.server.OrmException; - import dk.brics.automaton.RegExp; import dk.brics.automaton.RunAutomaton; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexRefPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexRefPredicate.java index c6d15770fa..671d4cc710 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexRefPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexRefPredicate.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.query.change; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.server.index.change.ChangeField; import com.google.gwtorm.server.OrmException; - import dk.brics.automaton.RegExp; import dk.brics.automaton.RunAutomaton; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexTopicPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexTopicPredicate.java index 2d6567094b..9df78a02b5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexTopicPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexTopicPredicate.java @@ -18,7 +18,6 @@ import static com.google.gerrit.server.index.change.ChangeField.FUZZY_TOPIC; import com.google.gerrit.reviewdb.client.Change; import com.google.gwtorm.server.OrmException; - import dk.brics.automaton.RegExp; import dk.brics.automaton.RunAutomaton; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ReviewerPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ReviewerPredicate.java index 53834a9f10..4a11d28105 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ReviewerPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ReviewerPredicate.java @@ -21,7 +21,6 @@ import com.google.gerrit.server.notedb.ReviewerStateInternal; import com.google.gerrit.server.query.Predicate; import com.google.gerrit.server.query.change.ChangeQueryBuilder.Arguments; import com.google.gwtorm.server.OrmException; - import java.util.ArrayList; import java.util.List; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ReviewerinPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ReviewerinPredicate.java index 34c10e3180..63e7859824 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ReviewerinPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ReviewerinPredicate.java @@ -23,8 +23,7 @@ class ReviewerinPredicate extends ChangeOperatorPredicate { private final IdentifiedUser.GenericFactory userFactory; private final AccountGroup.UUID uuid; - ReviewerinPredicate(IdentifiedUser.GenericFactory userFactory, - AccountGroup.UUID uuid) { + ReviewerinPredicate(IdentifiedUser.GenericFactory userFactory, AccountGroup.UUID uuid) { super(ChangeQueryBuilder.FIELD_REVIEWERIN, uuid.toString()); this.userFactory = userFactory; this.uuid = uuid; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/SingleGroupUser.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/SingleGroupUser.java index 33b338c25d..2661b8b6f2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/SingleGroupUser.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/SingleGroupUser.java @@ -19,20 +19,19 @@ import com.google.gerrit.server.CurrentUser; import com.google.gerrit.server.account.CapabilityControl; import com.google.gerrit.server.account.GroupMembership; import com.google.gerrit.server.account.ListGroupMembership; - import java.util.Collections; import java.util.Set; public final class SingleGroupUser extends CurrentUser { private final GroupMembership groups; - public SingleGroupUser(CapabilityControl.Factory capabilityControlFactory, - AccountGroup.UUID groupId) { + public SingleGroupUser( + CapabilityControl.Factory capabilityControlFactory, AccountGroup.UUID groupId) { this(capabilityControlFactory, Collections.singleton(groupId)); } - public SingleGroupUser(CapabilityControl.Factory capabilityControlFactory, - Set groups) { + public SingleGroupUser( + CapabilityControl.Factory capabilityControlFactory, Set groups) { super(capabilityControlFactory); this.groups = new ListGroupMembership(groups); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/StarPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/StarPredicate.java index a31254f4a6..98965bf604 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/StarPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/StarPredicate.java @@ -24,8 +24,7 @@ public class StarPredicate extends ChangeIndexPredicate { private final String label; StarPredicate(Account.Id accountId, String label) { - super(ChangeField.STAR, - StarredChangesUtil.StarField.create(accountId, label).toString()); + super(ChangeField.STAR, StarredChangesUtil.StarField.create(accountId, label).toString()); this.accountId = accountId; this.label = label; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/SubmitRecordPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/SubmitRecordPredicate.java index ec3c56feee..5b01ea2a05 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/SubmitRecordPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/SubmitRecordPredicate.java @@ -21,20 +21,19 @@ import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.server.index.change.ChangeField; import com.google.gerrit.server.query.Predicate; import com.google.gwtorm.server.OrmException; - import java.util.Set; class SubmitRecordPredicate extends ChangeIndexPredicate { - static Predicate create(String label, - SubmitRecord.Label.Status status, Set accounts) { + static Predicate create( + String label, SubmitRecord.Label.Status status, Set accounts) { String lowerLabel = label.toLowerCase(); if (accounts == null || accounts.isEmpty()) { return new SubmitRecordPredicate(status.name() + ',' + lowerLabel); } return Predicate.or( - accounts.stream() - .map(a -> new SubmitRecordPredicate( - status.name() + ',' + lowerLabel + ',' + a.get())) + accounts + .stream() + .map(a -> new SubmitRecordPredicate(status.name() + ',' + lowerLabel + ',' + a.get())) .collect(toList())); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/SubmittablePredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/SubmittablePredicate.java index 8782cfdeef..0812c6a39b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/SubmittablePredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/SubmittablePredicate.java @@ -28,7 +28,8 @@ class SubmittablePredicate extends ChangeIndexPredicate { @Override public boolean match(ChangeData cd) throws OrmException { - return cd.submitRecords(ChangeField.SUBMIT_RULE_OPTIONS_STRICT).stream() + return cd.submitRecords(ChangeField.SUBMIT_RULE_OPTIONS_STRICT) + .stream() .anyMatch(r -> r.status == status); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/TimestampRangeChangePredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/TimestampRangeChangePredicate.java index 9242d9d136..f0ac127969 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/TimestampRangeChangePredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/TimestampRangeChangePredicate.java @@ -17,13 +17,12 @@ package com.google.gerrit.server.query.change; import com.google.gerrit.server.index.FieldDef; import com.google.gerrit.server.index.TimestampRangePredicate; import com.google.gerrit.server.query.Matchable; - import java.sql.Timestamp; -public abstract class TimestampRangeChangePredicate extends - TimestampRangePredicate implements Matchable { - protected TimestampRangeChangePredicate(FieldDef def, - String name, String value) { +public abstract class TimestampRangeChangePredicate extends TimestampRangePredicate + implements Matchable { + protected TimestampRangeChangePredicate( + FieldDef def, String name, String value) { super(def, name, value); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/TrackingIdPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/TrackingIdPredicate.java index e9be4cde99..afaea5c9ab 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/TrackingIdPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/TrackingIdPredicate.java @@ -18,14 +18,12 @@ import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.server.config.TrackingFooters; import com.google.gerrit.server.index.change.ChangeField; import com.google.gwtorm.server.OrmException; - +import java.io.IOException; +import java.util.List; import org.eclipse.jgit.revwalk.FooterLine; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.List; - class TrackingIdPredicate extends ChangeIndexPredicate { private static final Logger log = LoggerFactory.getLogger(TrackingIdPredicate.class); @@ -42,8 +40,8 @@ class TrackingIdPredicate extends ChangeIndexPredicate { if (c != null) { try { List footers = object.commitFooters(); - return footers != null && trackingFooters.extract( - object.commitFooters()).values().contains(getValue()); + return footers != null + && trackingFooters.extract(object.commitFooters()).values().contains(getValue()); } catch (IOException e) { log.warn("Cannot extract footers from " + c.getChangeId(), e); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/group/GroupIsVisibleToPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/group/GroupIsVisibleToPredicate.java index 939ece62be..8f7294568d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/group/GroupIsVisibleToPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/group/GroupIsVisibleToPredicate.java @@ -22,13 +22,11 @@ import com.google.gerrit.server.query.IsVisibleToPredicate; import com.google.gerrit.server.query.account.AccountQueryBuilder; import com.google.gwtorm.server.OrmException; -public class GroupIsVisibleToPredicate - extends IsVisibleToPredicate { +public class GroupIsVisibleToPredicate extends IsVisibleToPredicate { private final GroupControl.GenericFactory groupControlFactory; private final CurrentUser user; - GroupIsVisibleToPredicate(GroupControl.GenericFactory groupControlFactory, - CurrentUser user) { + GroupIsVisibleToPredicate(GroupControl.GenericFactory groupControlFactory, CurrentUser user) { super(AccountQueryBuilder.FIELD_VISIBLETO, describe(user)); this.groupControlFactory = groupControlFactory; this.user = user; @@ -37,8 +35,7 @@ public class GroupIsVisibleToPredicate @Override public boolean match(AccountGroup group) throws OrmException { try { - return groupControlFactory.controlFor(user, group.getGroupUUID()) - .isVisible(); + return groupControlFactory.controlFor(user, group.getGroupUUID()).isVisible(); } catch (NoSuchGroupException e) { // Ignored return false; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/group/GroupPredicates.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/group/GroupPredicates.java index 16f7e42b5b..d0751a9274 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/group/GroupPredicates.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/group/GroupPredicates.java @@ -21,7 +21,6 @@ import com.google.gerrit.server.index.FieldDef; import com.google.gerrit.server.index.IndexPredicate; import com.google.gerrit.server.index.group.GroupField; import com.google.gerrit.server.query.Predicate; - import java.util.List; import java.util.Locale; @@ -40,28 +39,26 @@ public class GroupPredicates { } public static Predicate uuid(AccountGroup.UUID uuid) { - return new GroupPredicate(GroupField.UUID, - GroupQueryBuilder.FIELD_UUID, uuid.get()); + return new GroupPredicate(GroupField.UUID, GroupQueryBuilder.FIELD_UUID, uuid.get()); } public static Predicate description(String description) { - return new GroupPredicate(GroupField.DESCRIPTION, - GroupQueryBuilder.FIELD_DESCRIPTION, description); + return new GroupPredicate( + GroupField.DESCRIPTION, GroupQueryBuilder.FIELD_DESCRIPTION, description); } public static Predicate inname(String name) { - return new GroupPredicate(GroupField.NAME_PART, - GroupQueryBuilder.FIELD_INNAME, name.toLowerCase(Locale.US)); + return new GroupPredicate( + GroupField.NAME_PART, GroupQueryBuilder.FIELD_INNAME, name.toLowerCase(Locale.US)); } public static Predicate name(String name) { - return new GroupPredicate(GroupField.NAME, - GroupQueryBuilder.FIELD_NAME, name.toLowerCase(Locale.US)); + return new GroupPredicate( + GroupField.NAME, GroupQueryBuilder.FIELD_NAME, name.toLowerCase(Locale.US)); } public static Predicate owner(String owner) { - return new GroupPredicate(GroupField.OWNER_UUID, - GroupQueryBuilder.FIELD_OWNER, owner); + return new GroupPredicate(GroupField.OWNER_UUID, GroupQueryBuilder.FIELD_OWNER, owner); } public static Predicate isVisibleToAll() { @@ -78,6 +75,5 @@ public class GroupPredicates { } } - private GroupPredicates() { - } + private GroupPredicates() {} } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/group/GroupQueryBuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/group/GroupQueryBuilder.java index 9105b99ff3..f9093e1eb8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/group/GroupQueryBuilder.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/group/GroupQueryBuilder.java @@ -23,9 +23,7 @@ import com.google.gerrit.server.query.QueryBuilder; import com.google.gerrit.server.query.QueryParseException; import com.google.inject.Inject; -/** - * Parses a query string meant to be applied to group objects. - */ +/** Parses a query string meant to be applied to group objects. */ public class GroupQueryBuilder extends QueryBuilder { public static final String FIELD_UUID = "uuid"; public static final String FIELD_DESCRIPTION = "description"; @@ -48,8 +46,7 @@ public class GroupQueryBuilder extends QueryBuilder { } @Operator - public Predicate description(String description) - throws QueryParseException { + public Predicate description(String description) throws QueryParseException { if (Strings.isNullOrEmpty(description)) { throw error("description operator requires a value"); } @@ -89,13 +86,11 @@ public class GroupQueryBuilder extends QueryBuilder { } @Operator - public Predicate limit(String query) - throws QueryParseException { + public Predicate limit(String query) throws QueryParseException { Integer limit = Ints.tryParse(query); if (limit == null) { throw error("Invalid limit: " + query); } return new LimitPredicate<>(FIELD_LIMIT, limit); } - } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/group/GroupQueryProcessor.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/group/GroupQueryProcessor.java index f7a94b495c..1cfab202b9 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/group/GroupQueryProcessor.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/group/GroupQueryProcessor.java @@ -42,22 +42,27 @@ public class GroupQueryProcessor extends QueryProcessor { } @Inject - protected GroupQueryProcessor(Provider userProvider, + protected GroupQueryProcessor( + Provider userProvider, Metrics metrics, IndexConfig indexConfig, GroupIndexCollection indexes, GroupIndexRewriter rewriter, GroupControl.GenericFactory groupControlFactory) { - super(userProvider, metrics, GroupSchemaDefinitions.INSTANCE, indexConfig, - indexes, rewriter, FIELD_LIMIT); + super( + userProvider, + metrics, + GroupSchemaDefinitions.INSTANCE, + indexConfig, + indexes, + rewriter, + FIELD_LIMIT); this.groupControlFactory = groupControlFactory; } @Override - protected Predicate enforceVisibility( - Predicate pred) { - return new AndSource<>(pred, - new GroupIsVisibleToPredicate(groupControlFactory, userProvider.get()), - start); + protected Predicate enforceVisibility(Predicate pred) { + return new AndSource<>( + pred, new GroupIsVisibleToPredicate(groupControlFactory, userProvider.get()), start); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/AclUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/AclUtil.java index 2f49f9eabc..97b4e51dd9 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/AclUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/AclUtil.java @@ -22,18 +22,26 @@ import com.google.gerrit.common.data.PermissionRule; import com.google.gerrit.server.git.ProjectConfig; public class AclUtil { - public static void grant(ProjectConfig config, AccessSection section, - String permission, GroupReference... groupList) { + public static void grant( + ProjectConfig config, AccessSection section, String permission, GroupReference... groupList) { grant(config, section, permission, false, groupList); } - public static void grant(ProjectConfig config, AccessSection section, - String permission, boolean force, GroupReference... groupList) { + public static void grant( + ProjectConfig config, + AccessSection section, + String permission, + boolean force, + GroupReference... groupList) { grant(config, section, permission, force, null, groupList); } - public static void grant(ProjectConfig config, AccessSection section, - String permission, boolean force, Boolean exclusive, + public static void grant( + ProjectConfig config, + AccessSection section, + String permission, + boolean force, + Boolean exclusive, GroupReference... groupList) { Permission p = section.getPermission(permission, true); if (exclusive != null) { @@ -48,9 +56,13 @@ public class AclUtil { } } - public static void grant(ProjectConfig config, - AccessSection section, LabelType type, - int min, int max, GroupReference... groupList) { + public static void grant( + ProjectConfig config, + AccessSection section, + LabelType type, + int min, + int max, + GroupReference... groupList) { String name = Permission.LABEL + type.getName(); Permission p = section.getPermission(name, true); for (GroupReference group : groupList) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/AllProjectsCreator.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/AllProjectsCreator.java index a5c7d75da1..3f1d32c297 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/AllProjectsCreator.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/AllProjectsCreator.java @@ -43,7 +43,7 @@ import com.google.gerrit.server.git.MetaDataUpdate; import com.google.gerrit.server.git.ProjectConfig; import com.google.gerrit.server.group.SystemGroupBackend; import com.google.inject.Inject; - +import java.io.IOException; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.Constants; @@ -51,8 +51,6 @@ import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.RefUpdate; import org.eclipse.jgit.lib.Repository; -import java.io.IOException; - /** Creates the {@code All-Projects} repository and initial ACLs. */ public class AllProjectsCreator { private final GitRepositoryManager mgr; @@ -113,17 +111,15 @@ public class AllProjectsCreator { } } - private void initAllProjects(Repository git) - throws IOException, ConfigInvalidException { - try (MetaDataUpdate md = new MetaDataUpdate( - GitReferenceUpdated.DISABLED, - allProjectsName, - git)) { + private void initAllProjects(Repository git) throws IOException, ConfigInvalidException { + try (MetaDataUpdate md = + new MetaDataUpdate(GitReferenceUpdated.DISABLED, allProjectsName, git)) { md.getCommitBuilder().setAuthor(serverUser); md.getCommitBuilder().setCommitter(serverUser); - md.setMessage(MoreObjects.firstNonNull( - Strings.emptyToNull(message), - "Initialized Gerrit Code Review " + Version.getVersion())); + md.setMessage( + MoreObjects.firstNonNull( + Strings.emptyToNull(message), + "Initialized Gerrit Code Review " + Version.getVersion())); ProjectConfig config = ProjectConfig.read(md); Project p = config.getProject(); @@ -185,12 +181,15 @@ public class AllProjectsCreator { } public static LabelType initCodeReviewLabel(ProjectConfig c) { - LabelType type = new LabelType("Code-Review", ImmutableList.of( - new LabelValue((short) 2, "Looks good to me, approved"), - new LabelValue((short) 1, "Looks good to me, but someone else must approve"), - new LabelValue((short) 0, "No score"), - new LabelValue((short) -1, "I would prefer this is not merged as is"), - new LabelValue((short) -2, "This shall not be merged"))); + LabelType type = + new LabelType( + "Code-Review", + ImmutableList.of( + new LabelValue((short) 2, "Looks good to me, approved"), + new LabelValue((short) 1, "Looks good to me, but someone else must approve"), + new LabelValue((short) 0, "No score"), + new LabelValue((short) -1, "I would prefer this is not merged as is"), + new LabelValue((short) -2, "This shall not be merged"))); type.setCopyMinScore(true); type.setCopyAllScoresOnTrivialRebase(true); c.getLabelSections().put(type.getName(), type); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/AllUsersCreator.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/AllUsersCreator.java index 626d25854a..b524ecc941 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/AllUsersCreator.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/AllUsersCreator.java @@ -33,14 +33,12 @@ import com.google.gerrit.server.git.ProjectConfig; import com.google.gerrit.server.group.SystemGroupBackend; import com.google.gerrit.server.project.RefPattern; import com.google.inject.Inject; - +import java.io.IOException; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.Repository; -import java.io.IOException; - /** Creates the {@code All-Users} repository. */ public class AllUsersCreator { private final GitRepositoryManager mgr; @@ -80,12 +78,8 @@ public class AllUsersCreator { } } - private void initAllUsers(Repository git) - throws IOException, ConfigInvalidException { - try (MetaDataUpdate md = new MetaDataUpdate( - GitReferenceUpdated.DISABLED, - allUsersName, - git)) { + private void initAllUsers(Repository git) throws IOException, ConfigInvalidException { + try (MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, git)) { md.getCommitBuilder().setAuthor(serverUser); md.getCommitBuilder().setCommitter(serverUser); md.setMessage("Initialized Gerrit Code Review " + Version.getVersion()); @@ -94,8 +88,9 @@ public class AllUsersCreator { Project project = config.getProject(); project.setDescription("Individual user settings and preferences."); - AccessSection users = config.getAccessSection( - RefNames.REFS_USERS + "${" + RefPattern.USERID_SHARDED + "}", true); + AccessSection users = + config.getAccessSection( + RefNames.REFS_USERS + "${" + RefPattern.USERID_SHARDED + "}", true); LabelType cr = AllProjectsCreator.initCodeReviewLabel(config); grant(config, users, Permission.READ, false, true, registered); grant(config, users, Permission.PUSH, false, true, registered); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/BaseDataSourceType.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/BaseDataSourceType.java index bf87ee0670..4b3a5700d2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/BaseDataSourceType.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/BaseDataSourceType.java @@ -15,7 +15,6 @@ package com.google.gerrit.server.schema; import com.google.gerrit.reviewdb.server.ReviewDb; - import java.io.IOException; import java.io.InputStream; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/DB2.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/DB2.java index 4f0b63fcd6..9b8b73672f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/DB2.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/DB2.java @@ -20,7 +20,6 @@ import static com.google.gerrit.server.schema.JdbcUtil.port; import com.google.gerrit.server.config.ConfigSection; import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; - import org.eclipse.jgit.lib.Config; public class DB2 extends BaseDataSourceType { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceProvider.java index 69f4ba5d9c..170a5fac91 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceProvider.java @@ -33,21 +33,17 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.ProvisionException; import com.google.inject.Singleton; - -import org.apache.commons.dbcp.BasicDataSource; -import org.eclipse.jgit.lib.Config; - import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.sql.SQLException; import java.util.Properties; - import javax.sql.DataSource; +import org.apache.commons.dbcp.BasicDataSource; +import org.eclipse.jgit.lib.Config; /** Provides access to the DataSource. */ @Singleton -public class DataSourceProvider implements Provider, - LifecycleListener { +public class DataSourceProvider implements Provider, LifecycleListener { private final Config cfg; private final MetricMaker metrics; private final Context ctx; @@ -56,7 +52,8 @@ public class DataSourceProvider implements Provider, private DataSource ds; @Inject - protected DataSourceProvider(@GerritServerConfig Config cfg, + protected DataSourceProvider( + @GerritServerConfig Config cfg, MetricMaker metrics, ThreadSettingsConfig threadSettingsConfig, Context ctx, @@ -77,8 +74,7 @@ public class DataSourceProvider implements Provider, } @Override - public void start() { - } + public void start() {} @Override public synchronized void stop() { @@ -92,11 +88,11 @@ public class DataSourceProvider implements Provider, } public enum Context { - SINGLE_USER, MULTI_USER + SINGLE_USER, + MULTI_USER } - private DataSource open(final Config cfg, final Context context, - final DataSourceType dst) { + private DataSource open(final Config cfg, final Context context, final DataSourceType dst) { ConfigSection dbs = new ConfigSection(cfg, "database"); String driver = dbs.optional("driver"); if (Strings.isNullOrEmpty(driver)) { @@ -132,16 +128,20 @@ public class DataSourceProvider implements Provider, int poolLimit = threadSettingsConfig.getDatabasePoolLimit(); ds.setMaxActive(poolLimit); ds.setMinIdle(cfg.getInt("database", "poolminidle", 4)); - ds.setMaxIdle( - cfg.getInt("database", "poolmaxidle", Math.min(poolLimit, 16))); - ds.setMaxWait(ConfigUtil.getTimeUnit(cfg, "database", null, - "poolmaxwait", MILLISECONDS.convert(30, SECONDS), MILLISECONDS)); + ds.setMaxIdle(cfg.getInt("database", "poolmaxidle", Math.min(poolLimit, 16))); + ds.setMaxWait( + ConfigUtil.getTimeUnit( + cfg, + "database", + null, + "poolmaxwait", + MILLISECONDS.convert(30, SECONDS), + MILLISECONDS)); ds.setInitialSize(ds.getMinIdle()); ds.setValidationQuery(dst.getValidationQuery()); ds.setValidationQueryTimeout(5); exportPoolMetrics(ds); return intercept(interceptor, ds); - } // Don't use the connection pool. // @@ -162,22 +162,23 @@ public class DataSourceProvider implements Provider, } private void exportPoolMetrics(final BasicDataSource pool) { - final CallbackMetric1 cnt = metrics.newCallbackMetric( - "sql/connection_pool/connections", - Integer.class, - new Description("SQL database connections") - .setGauge() - .setUnit("connections"), - Field.ofBoolean("active")); - metrics.newTrigger(cnt, new Runnable() { - @Override - public void run() { - synchronized (pool) { - cnt.set(true, pool.getNumActive()); - cnt.set(false, pool.getNumIdle()); - } - } - }); + final CallbackMetric1 cnt = + metrics.newCallbackMetric( + "sql/connection_pool/connections", + Integer.class, + new Description("SQL database connections").setGauge().setUnit("connections"), + Field.ofBoolean("active")); + metrics.newTrigger( + cnt, + new Runnable() { + @Override + public void run() { + synchronized (pool) { + cnt.set(true, pool.getNumActive()); + cnt.set(false, pool.getNumIdle()); + } + } + }); } private DataSource intercept(String interceptor, DataSource ds) { @@ -186,12 +187,15 @@ public class DataSourceProvider implements Provider, } try { Constructor c = Class.forName(interceptor).getConstructor(); - DataSourceInterceptor datasourceInterceptor = - (DataSourceInterceptor) c.newInstance(); + DataSourceInterceptor datasourceInterceptor = (DataSourceInterceptor) c.newInstance(); return datasourceInterceptor.intercept("reviewDb", ds); - } catch (ClassNotFoundException | SecurityException | NoSuchMethodException - | IllegalArgumentException | InstantiationException - | IllegalAccessException | InvocationTargetException e) { + } catch (ClassNotFoundException + | SecurityException + | NoSuchMethodException + | IllegalArgumentException + | InstantiationException + | IllegalAccessException + | InvocationTargetException e) { throw new ProvisionException("Cannot intercept datasource", e); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceType.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceType.java index ee8ce8139d..cbdcf0f65a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceType.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceType.java @@ -16,7 +16,6 @@ package com.google.gerrit.server.schema; import java.io.IOException; - /** Abstraction of a supported database platform */ public interface DataSourceType { @@ -29,8 +28,8 @@ public interface DataSourceType { boolean usePool(); /** - * Return a ScriptRunner that runs the index script. Must not return - * {@code null}, but may return a ScriptRunner that does nothing. + * Return a ScriptRunner that runs the index script. Must not return {@code null}, but may return + * a ScriptRunner that does nothing. * * @throws IOException */ diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/DatabaseModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/DatabaseModule.java index a2046b5c89..38a7751a55 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/DatabaseModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/DatabaseModule.java @@ -31,13 +31,10 @@ public class DatabaseModule extends FactoryModule { protected void configure() { TypeLiteral> schemaFactory = new TypeLiteral>() {}; - TypeLiteral> database = - new TypeLiteral>() {}; + TypeLiteral> database = new TypeLiteral>() {}; bind(schemaFactory).to(NotesMigrationSchemaFactory.class); - bind(Key.get(schemaFactory, ReviewDbFactory.class)) - .to(database) - .in(SINGLETON); + bind(Key.get(schemaFactory, ReviewDbFactory.class)).to(database).in(SINGLETON); bind(database).toProvider(ReviewDbDatabaseProvider.class); bind(ChangeBundleReader.class).to(GwtormChangeBundleReader.class); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Derby.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Derby.java index f98e83b57b..9fb761d3c0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Derby.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Derby.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.schema; import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.config.SitePaths; import com.google.inject.Inject; - import org.eclipse.jgit.lib.Config; class Derby extends BaseDataSourceType { @@ -26,8 +25,7 @@ class Derby extends BaseDataSourceType { private final SitePaths site; @Inject - Derby(@GerritServerConfig Config cfg, - SitePaths site) { + Derby(@GerritServerConfig Config cfg, SitePaths site) { super("org.apache.derby.jdbc.EmbeddedDriver"); this.cfg = cfg; this.site = site; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/H2.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/H2.java index 7d64437e85..3cffdb1402 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/H2.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/H2.java @@ -17,10 +17,8 @@ package com.google.gerrit.server.schema; import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.config.SitePaths; import com.google.inject.Inject; - -import org.eclipse.jgit.lib.Config; - import java.nio.file.Path; +import org.eclipse.jgit.lib.Config; class H2 extends BaseDataSourceType { @@ -44,10 +42,7 @@ class H2 extends BaseDataSourceType { } public static String createUrl(Path path) { - return new StringBuilder() - .append("jdbc:h2:") - .append(path.toUri().toString()) - .toString(); + return new StringBuilder().append("jdbc:h2:").append(path.toUri().toString()).toString(); } public static String appendUrlOptions(Config cfg, String url) { @@ -58,8 +53,7 @@ class H2 extends BaseDataSourceType { if (h2CacheSize >= 0) { // H2 CACHE_SIZE is always given in KB - urlBuilder.append(";CACHE_SIZE=") - .append(h2CacheSize / 1024); + urlBuilder.append(";CACHE_SIZE=").append(h2CacheSize / 1024); } if (h2AutoServer) { urlBuilder.append(";AUTO_SERVER=TRUE"); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/H2AccountPatchReviewStore.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/H2AccountPatchReviewStore.java index b952d63f6e..abe221c333 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/H2AccountPatchReviewStore.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/H2AccountPatchReviewStore.java @@ -28,11 +28,6 @@ import com.google.gwtorm.server.OrmDuplicateKeyException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.Config; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; @@ -42,18 +37,18 @@ import java.sql.Statement; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import org.eclipse.jgit.lib.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Singleton -public class H2AccountPatchReviewStore - implements AccountPatchReviewStore, LifecycleListener { - private static final Logger log = - LoggerFactory.getLogger(H2AccountPatchReviewStore.class); +public class H2AccountPatchReviewStore implements AccountPatchReviewStore, LifecycleListener { + private static final Logger log = LoggerFactory.getLogger(H2AccountPatchReviewStore.class); public static class Module extends LifecycleModule { @Override protected void configure() { - DynamicItem.bind(binder(), AccountPatchReviewStore.class) - .to(H2AccountPatchReviewStore.class); + DynamicItem.bind(binder(), AccountPatchReviewStore.class).to(H2AccountPatchReviewStore.class); listener().to(H2AccountPatchReviewStore.class); } } @@ -63,8 +58,7 @@ public class H2AccountPatchReviewStore @Override protected void configure() { H2AccountPatchReviewStore inMemoryStore = new H2AccountPatchReviewStore(); - DynamicItem.bind(binder(), AccountPatchReviewStore.class) - .toInstance(inMemoryStore); + DynamicItem.bind(binder(), AccountPatchReviewStore.class).toInstance(inMemoryStore); listener().toInstance(inMemoryStore); } } @@ -72,8 +66,7 @@ public class H2AccountPatchReviewStore private final String url; @Inject - H2AccountPatchReviewStore(@GerritServerConfig Config cfg, - SitePaths sitePaths) { + H2AccountPatchReviewStore(@GerritServerConfig Config cfg, SitePaths sitePaths) { this.url = H2.appendUrlOptions(cfg, getUrl(sitePaths)); } @@ -82,8 +75,8 @@ public class H2AccountPatchReviewStore } /** - * Creates an in-memory H2 database to store the reviewed flags. - * This should be used for tests only. + * Creates an in-memory H2 database to store the reviewed flags. This should be used for tests + * only. */ @VisibleForTesting private H2AccountPatchReviewStore() { @@ -105,14 +98,15 @@ public class H2AccountPatchReviewStore public static void createTableIfNotExists(String url) throws OrmException { try (Connection con = DriverManager.getConnection(url); Statement stmt = con.createStatement()) { - stmt.executeUpdate("CREATE TABLE IF NOT EXISTS ACCOUNT_PATCH_REVIEWS (" - + "ACCOUNT_ID INTEGER DEFAULT 0 NOT NULL, " - + "CHANGE_ID INTEGER DEFAULT 0 NOT NULL, " - + "PATCH_SET_ID INTEGER DEFAULT 0 NOT NULL, " - + "FILE_NAME VARCHAR(255) DEFAULT '' NOT NULL, " - + "CONSTRAINT PRIMARY_KEY_ACCOUNT_PATCH_REVIEWS " - + "PRIMARY KEY (ACCOUNT_ID, CHANGE_ID, PATCH_SET_ID, FILE_NAME)" - + ")"); + stmt.executeUpdate( + "CREATE TABLE IF NOT EXISTS ACCOUNT_PATCH_REVIEWS (" + + "ACCOUNT_ID INTEGER DEFAULT 0 NOT NULL, " + + "CHANGE_ID INTEGER DEFAULT 0 NOT NULL, " + + "PATCH_SET_ID INTEGER DEFAULT 0 NOT NULL, " + + "FILE_NAME VARCHAR(255) DEFAULT '' NOT NULL, " + + "CONSTRAINT PRIMARY_KEY_ACCOUNT_PATCH_REVIEWS " + + "PRIMARY KEY (ACCOUNT_ID, CHANGE_ID, PATCH_SET_ID, FILE_NAME)" + + ")"); } catch (SQLException e) { throw convertError("create", e); } @@ -128,17 +122,17 @@ public class H2AccountPatchReviewStore } @Override - public void stop() { - } + public void stop() {} @Override - public boolean markReviewed(PatchSet.Id psId, Account.Id accountId, - String path) throws OrmException { + public boolean markReviewed(PatchSet.Id psId, Account.Id accountId, String path) + throws OrmException { try (Connection con = DriverManager.getConnection(url); PreparedStatement stmt = - con.prepareStatement("INSERT INTO ACCOUNT_PATCH_REVIEWS " - + "(ACCOUNT_ID, CHANGE_ID, PATCH_SET_ID, FILE_NAME) VALUES " - + "(?, ?, ?, ?)")) { + con.prepareStatement( + "INSERT INTO ACCOUNT_PATCH_REVIEWS " + + "(ACCOUNT_ID, CHANGE_ID, PATCH_SET_ID, FILE_NAME) VALUES " + + "(?, ?, ?, ?)")) { stmt.setInt(1, accountId.get()); stmt.setInt(2, psId.getParentKey().get()); stmt.setInt(3, psId.get()); @@ -155,17 +149,18 @@ public class H2AccountPatchReviewStore } @Override - public void markReviewed(PatchSet.Id psId, Account.Id accountId, - Collection paths) throws OrmException { + public void markReviewed(PatchSet.Id psId, Account.Id accountId, Collection paths) + throws OrmException { if (paths == null || paths.isEmpty()) { return; } try (Connection con = DriverManager.getConnection(url); PreparedStatement stmt = - con.prepareStatement("INSERT INTO ACCOUNT_PATCH_REVIEWS " - + "(ACCOUNT_ID, CHANGE_ID, PATCH_SET_ID, FILE_NAME) VALUES " - + "(?, ?, ?, ?)")) { + con.prepareStatement( + "INSERT INTO ACCOUNT_PATCH_REVIEWS " + + "(ACCOUNT_ID, CHANGE_ID, PATCH_SET_ID, FILE_NAME) VALUES " + + "(?, ?, ?, ?)")) { for (String path : paths) { stmt.setInt(1, accountId.get()); stmt.setInt(2, psId.getParentKey().get()); @@ -188,9 +183,10 @@ public class H2AccountPatchReviewStore throws OrmException { try (Connection con = DriverManager.getConnection(url); PreparedStatement stmt = - con.prepareStatement("DELETE FROM ACCOUNT_PATCH_REVIEWS " - + "WHERE ACCOUNT_ID = ? AND CHANGE_ID + ? AND " - + "PATCH_SET_ID = ? AND FILE_NAME = ?")) { + con.prepareStatement( + "DELETE FROM ACCOUNT_PATCH_REVIEWS " + + "WHERE ACCOUNT_ID = ? AND CHANGE_ID + ? AND " + + "PATCH_SET_ID = ? AND FILE_NAME = ?")) { stmt.setInt(1, accountId.get()); stmt.setInt(2, psId.getParentKey().get()); stmt.setInt(3, psId.get()); @@ -205,8 +201,9 @@ public class H2AccountPatchReviewStore public void clearReviewed(PatchSet.Id psId) throws OrmException { try (Connection con = DriverManager.getConnection(url); PreparedStatement stmt = - con.prepareStatement("DELETE FROM ACCOUNT_PATCH_REVIEWS " - + "WHERE CHANGE_ID + ? AND PATCH_SET_ID = ?")) { + con.prepareStatement( + "DELETE FROM ACCOUNT_PATCH_REVIEWS " + + "WHERE CHANGE_ID + ? AND PATCH_SET_ID = ?")) { stmt.setInt(1, psId.getParentKey().get()); stmt.setInt(2, psId.get()); stmt.executeUpdate(); @@ -220,8 +217,9 @@ public class H2AccountPatchReviewStore throws OrmException { try (Connection con = DriverManager.getConnection(url); PreparedStatement stmt = - con.prepareStatement("SELECT FILE_NAME FROM ACCOUNT_PATCH_REVIEWS " - + "WHERE ACCOUNT_ID = ? AND CHANGE_ID = ? AND PATCH_SET_ID = ?")) { + con.prepareStatement( + "SELECT FILE_NAME FROM ACCOUNT_PATCH_REVIEWS " + + "WHERE ACCOUNT_ID = ? AND CHANGE_ID = ? AND PATCH_SET_ID = ?")) { stmt.setInt(1, accountId.get()); stmt.setInt(2, psId.getParentKey().get()); stmt.setInt(3, psId.get()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/HANA.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/HANA.java index 44f1f0cf4e..26c94e07b0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/HANA.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/HANA.java @@ -20,10 +20,8 @@ import static com.google.gerrit.server.schema.JdbcUtil.port; import com.google.gerrit.server.config.ConfigSection; import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; - -import org.eclipse.jgit.lib.Config; - import java.io.IOException; +import org.eclipse.jgit.lib.Config; class HANA extends BaseDataSourceType { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/JDBC.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/JDBC.java index 7cdf93ec9b..a1df850779 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/JDBC.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/JDBC.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.schema; import com.google.gerrit.server.config.ConfigUtil; import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; - import org.eclipse.jgit.lib.Config; class JDBC extends BaseDataSourceType { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/MaxDb.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/MaxDb.java index 9a097464f5..ca5a60d2af 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/MaxDb.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/MaxDb.java @@ -19,10 +19,8 @@ import static com.google.gerrit.server.schema.JdbcUtil.hostname; import com.google.gerrit.server.config.ConfigSection; import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; - -import org.eclipse.jgit.lib.Config; - import java.io.IOException; +import org.eclipse.jgit.lib.Config; class MaxDb extends BaseDataSourceType { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/MySql.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/MySql.java index 0b345e83ae..fc8e176c26 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/MySql.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/MySql.java @@ -20,7 +20,6 @@ import static com.google.gerrit.server.schema.JdbcUtil.port; import com.google.gerrit.server.config.ConfigSection; import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; - import org.eclipse.jgit.lib.Config; class MySql extends BaseDataSourceType { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/NotesMigrationSchemaFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/NotesMigrationSchemaFactory.java index f38ddfa622..2e4065a16e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/NotesMigrationSchemaFactory.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/NotesMigrationSchemaFactory.java @@ -29,8 +29,7 @@ public class NotesMigrationSchemaFactory implements SchemaFactory { @Inject NotesMigrationSchemaFactory( - @ReviewDbFactory SchemaFactory delegate, - NotesMigration migration) { + @ReviewDbFactory SchemaFactory delegate, NotesMigration migration) { this.delegate = delegate; this.migration = migration; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Oracle.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Oracle.java index e7d3390874..e86f78867c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Oracle.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Oracle.java @@ -20,7 +20,6 @@ import static com.google.gerrit.server.schema.JdbcUtil.port; import com.google.gerrit.server.config.ConfigSection; import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; - import org.eclipse.jgit.lib.Config; public class Oracle extends BaseDataSourceType { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/PostgreSQL.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/PostgreSQL.java index 3e3509ee34..23e7625fbf 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/PostgreSQL.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/PostgreSQL.java @@ -20,10 +20,8 @@ import static com.google.gerrit.server.schema.JdbcUtil.port; import com.google.gerrit.server.config.ConfigSection; import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; - -import org.eclipse.jgit.lib.Config; - import java.io.IOException; +import org.eclipse.jgit.lib.Config; class PostgreSQL extends BaseDataSourceType { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/ProjectConfigSchemaUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/ProjectConfigSchemaUpdate.java index 504767c1a6..67d11a8e50 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/ProjectConfigSchemaUpdate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/ProjectConfigSchemaUpdate.java @@ -23,16 +23,14 @@ import com.google.gerrit.server.git.MetaDataUpdate; import com.google.gerrit.server.git.ProjectConfig; import com.google.gerrit.server.git.VersionedMetaData; import com.google.gwtorm.server.OrmException; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.CommitBuilder; -import org.eclipse.jgit.lib.Config; -import org.eclipse.jgit.lib.PersonIdent; - import java.io.IOException; import java.util.Arrays; import java.util.List; import java.util.Set; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.CommitBuilder; +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.lib.PersonIdent; public class ProjectConfigSchemaUpdate extends VersionedMetaData { @@ -67,7 +65,8 @@ public class ProjectConfigSchemaUpdate extends VersionedMetaData { if (names.contains(name)) { List values = Arrays.stream(config.getStringList(ACCESS, subsection, name)) - .map(r -> { + .map( + r -> { PermissionRule rule = PermissionRule.fromString(r, false); if (rule.getForce()) { rule.setForce(false); @@ -82,14 +81,12 @@ public class ProjectConfigSchemaUpdate extends VersionedMetaData { } @Override - protected boolean onSave(CommitBuilder commit) - throws IOException, ConfigInvalidException { + protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException { saveConfig(ProjectConfig.PROJECT_CONFIG, config); return true; } - public void save(PersonIdent personIdent, String commitMessage) - throws OrmException { + public void save(PersonIdent personIdent, String commitMessage) throws OrmException { if (!updated) { return; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/ReviewDbDatabaseProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/ReviewDbDatabaseProvider.java index 9ceaf1cecc..0fbaeca63b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/ReviewDbDatabaseProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/ReviewDbDatabaseProvider.java @@ -21,7 +21,6 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.ProvisionException; import com.google.inject.name.Named; - import javax.sql.DataSource; /** Provides the {@code Database} database handle. */ diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/ReviewDbFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/ReviewDbFactory.java index 3a63360b3e..86f5d06eea 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/ReviewDbFactory.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/ReviewDbFactory.java @@ -17,19 +17,15 @@ package com.google.gerrit.server.schema; import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.google.inject.BindingAnnotation; - import java.lang.annotation.Retention; /** - * Marker on {@link com.google.gwtorm.server.SchemaFactory} implementation - * that talks to the underlying traditional {@link - * com.google.gerrit.reviewdb.server.ReviewDb} database. - *

- * During the migration to NoteDb, the actual {@code ReviewDb} will be a wrapper - * with certain tables enabled/disabled; this marker goes on the low-level - * implementation that has all tables. + * Marker on {@link com.google.gwtorm.server.SchemaFactory} implementation that talks to the + * underlying traditional {@link com.google.gerrit.reviewdb.server.ReviewDb} database. + * + *

During the migration to NoteDb, the actual {@code ReviewDb} will be a wrapper with certain + * tables enabled/disabled; this marker goes on the low-level implementation that has all tables. */ @Retention(RUNTIME) @BindingAnnotation -public @interface ReviewDbFactory { -} +public @interface ReviewDbFactory {} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaCreator.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaCreator.java index 7caea42b9f..62d0f42b40 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaCreator.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaCreator.java @@ -30,19 +30,15 @@ import com.google.gwtorm.jdbc.JdbcExecutor; import com.google.gwtorm.jdbc.JdbcSchema; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.PersonIdent; - import java.io.IOException; import java.nio.file.Path; import java.util.Collections; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.PersonIdent; /** Creates the current database schema and populates initial code rows. */ public class SchemaCreator { - @SitePath - private final - Path site_path; + @SitePath private final Path site_path; private final AllProjectsCreator allProjectsCreator; private final AllUsersCreator allUsersCreator; @@ -54,7 +50,8 @@ public class SchemaCreator { private AccountGroup batch; @Inject - public SchemaCreator(SitePaths site, + public SchemaCreator( + SitePaths site, AllProjectsCreator ap, AllUsersCreator auc, @GerritPersonIdent PersonIdent au, @@ -63,7 +60,8 @@ public class SchemaCreator { this(site.site_path, ap, auc, au, dst, ic); } - public SchemaCreator(@SitePath Path site, + public SchemaCreator( + @SitePath Path site, AllProjectsCreator ap, AllUsersCreator auc, @GerritPersonIdent PersonIdent au, @@ -77,8 +75,7 @@ public class SchemaCreator { indexCollection = ic; } - public void create(final ReviewDb db) throws OrmException, IOException, - ConfigInvalidException { + public void create(final ReviewDb db) throws OrmException, IOException, ConfigInvalidException { final JdbcSchema jdbc = (JdbcSchema) db; try (JdbcExecutor e = new JdbcExecutor(jdbc)) { jdbc.updateSchema(e); @@ -91,30 +88,25 @@ public class SchemaCreator { createDefaultGroups(db); initSystemConfig(db); allProjectsCreator - .setAdministrators(GroupReference.forGroup(admin)) - .setBatchUsers(GroupReference.forGroup(batch)) - .create(); - allUsersCreator - .setAdministrators(GroupReference.forGroup(admin)) - .create(); + .setAdministrators(GroupReference.forGroup(admin)) + .setBatchUsers(GroupReference.forGroup(batch)) + .create(); + allUsersCreator.setAdministrators(GroupReference.forGroup(admin)).create(); dataSourceType.getIndexScript().run(db); } - private void createDefaultGroups(ReviewDb db) - throws OrmException, IOException { + private void createDefaultGroups(ReviewDb db) throws OrmException, IOException { admin = newGroup(db, "Administrators", null); admin.setDescription("Gerrit Site Administrators"); db.accountGroups().insert(Collections.singleton(admin)); - db.accountGroupNames() - .insert(Collections.singleton(new AccountGroupName(admin))); + db.accountGroupNames().insert(Collections.singleton(new AccountGroupName(admin))); index(admin); batch = newGroup(db, "Non-Interactive Users", null); batch.setDescription("Users who perform batch actions on Gerrit"); batch.setOwnerGroupUUID(admin.getGroupUUID()); db.accountGroups().insert(Collections.singleton(batch)); - db.accountGroupNames() - .insert(Collections.singleton(new AccountGroupName(batch))); + db.accountGroupNames().insert(Collections.singleton(new AccountGroupName(batch))); index(batch); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaModule.java index f23dabf3b5..9ce19fe03f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaModule.java @@ -27,29 +27,27 @@ import com.google.gerrit.server.config.AnonymousCowardName; import com.google.gerrit.server.config.AnonymousCowardNameProvider; import com.google.gerrit.server.config.GerritServerId; import com.google.gerrit.server.config.GerritServerIdProvider; - import org.eclipse.jgit.lib.PersonIdent; /** Validate the schema and connect to Git. */ public class SchemaModule extends FactoryModule { @Override protected void configure() { - bind(PersonIdent.class).annotatedWith(GerritPersonIdent.class) - .toProvider(GerritPersonIdentProvider.class); + bind(PersonIdent.class) + .annotatedWith(GerritPersonIdent.class) + .toProvider(GerritPersonIdentProvider.class); - bind(AllProjectsName.class) - .toProvider(AllProjectsNameProvider.class) - .in(SINGLETON); + bind(AllProjectsName.class).toProvider(AllProjectsNameProvider.class).in(SINGLETON); - bind(AllUsersName.class) - .toProvider(AllUsersNameProvider.class) - .in(SINGLETON); + bind(AllUsersName.class).toProvider(AllUsersNameProvider.class).in(SINGLETON); - bind(String.class).annotatedWith(AnonymousCowardName.class).toProvider( - AnonymousCowardNameProvider.class); + bind(String.class) + .annotatedWith(AnonymousCowardName.class) + .toProvider(AnonymousCowardNameProvider.class); - bind(String.class).annotatedWith(GerritServerId.class) - .toProvider(GerritServerIdProvider.class) - .in(SINGLETON); + bind(String.class) + .annotatedWith(GerritServerId.class) + .toProvider(GerritServerIdProvider.class) + .in(SINGLETON); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaUpdater.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaUpdater.java index fe14c52ca4..374b233bb0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaUpdater.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaUpdater.java @@ -35,13 +35,11 @@ import com.google.inject.Injector; import com.google.inject.Key; import com.google.inject.Provider; import com.google.inject.Stage; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.PersonIdent; - import java.io.IOException; import java.sql.SQLException; import java.util.Collections; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.PersonIdent; /** Creates or updates the current database schema. */ public class SchemaUpdater { @@ -51,10 +49,8 @@ public class SchemaUpdater { private final Provider updater; @Inject - SchemaUpdater(SchemaFactory schema, - SitePaths site, - SchemaCreator creator, - Injector parent) { + SchemaUpdater( + SchemaFactory schema, SitePaths site, SchemaCreator creator, Injector parent) { this.schema = schema; this.site = site; this.creator = creator; @@ -65,34 +61,38 @@ public class SchemaUpdater { // Use DEVELOPMENT mode to allow lazy initialization of the // graph. This avoids touching ancient schema versions that // are behind this installation's current version. - return Guice.createInjector(Stage.DEVELOPMENT, new AbstractModule() { - @Override - protected void configure() { - bind(SchemaVersion.class).to(SchemaVersion.C); + return Guice.createInjector( + Stage.DEVELOPMENT, + new AbstractModule() { + @Override + protected void configure() { + bind(SchemaVersion.class).to(SchemaVersion.C); - for (Key k : new Key[]{ - Key.get(PersonIdent.class, GerritPersonIdent.class), - Key.get(String.class, AnonymousCowardName.class), - }) { - rebind(parent, k); - } + for (Key k : + new Key[] { + Key.get(PersonIdent.class, GerritPersonIdent.class), + Key.get(String.class, AnonymousCowardName.class), + }) { + rebind(parent, k); + } - for (Class c : new Class[] { - AllProjectsName.class, - AllUsersCreator.class, - AllUsersName.class, - GitRepositoryManager.class, - SitePaths.class, - SystemGroupBackend.class, - }) { - rebind(parent, Key.get(c)); - } - } + for (Class c : + new Class[] { + AllProjectsName.class, + AllUsersCreator.class, + AllUsersName.class, + GitRepositoryManager.class, + SitePaths.class, + SystemGroupBackend.class, + }) { + rebind(parent, Key.get(c)); + } + } - private void rebind(Injector parent, Key c) { - bind(c).toProvider(parent.getProvider(c)); - } - }); + private void rebind(Injector parent, Key c) { + bind(c).toProvider(parent.getProvider(c)); + } + }); } public void update(final UpdateUI ui) throws OrmException { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersion.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersion.java index 2c81c56edf..e2d16d83c2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersion.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersion.java @@ -24,7 +24,6 @@ import com.google.gwtorm.jdbc.JdbcSchema; import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.StatementExecutor; import com.google.inject.Provider; - import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; @@ -74,8 +73,12 @@ public abstract class SchemaVersion { if (curr.versionNbr == versionNbr) { // Nothing to do, we are at the correct schema. } else if (curr.versionNbr > versionNbr) { - throw new OrmException("Cannot downgrade database schema from version " - + curr.versionNbr + " to " + versionNbr + "."); + throw new OrmException( + "Cannot downgrade database schema from version " + + curr.versionNbr + + " to " + + versionNbr + + "."); } else { upgradeFrom(ui, curr, db); } @@ -90,17 +93,18 @@ public abstract class SchemaVersion { JdbcSchema s = (JdbcSchema) db; final List pruneList = new ArrayList<>(); - s.pruneSchema(new StatementExecutor() { - @Override - public void execute(String sql) { - pruneList.add(sql); - } + s.pruneSchema( + new StatementExecutor() { + @Override + public void execute(String sql) { + pruneList.add(sql); + } - @Override - public void close() { - // Do nothing. - } - }); + @Override + public void close() { + // Do nothing. + } + }); try (JdbcExecutor e = new JdbcExecutor(s)) { if (!pruneList.isEmpty()) { @@ -118,8 +122,8 @@ public abstract class SchemaVersion { return r; } - private void updateSchema(List pending, UpdateUI ui, - ReviewDb db) throws OrmException, SQLException { + private void updateSchema(List pending, UpdateUI ui, ReviewDb db) + throws OrmException, SQLException { for (SchemaVersion v : pending) { ui.message(String.format("Upgrading schema to %d ...", v.getVersionNbr())); v.preUpdateSchema(db); @@ -138,45 +142,39 @@ public abstract class SchemaVersion { * @throws OrmException if a Gerrit-specific exception occurred. * @throws SQLException if an underlying SQL exception occurred. */ - protected void preUpdateSchema(ReviewDb db) throws OrmException, SQLException { - } + protected void preUpdateSchema(ReviewDb db) throws OrmException, SQLException {} - private void migrateData(List pending, UpdateUI ui, - CurrentSchemaVersion curr, ReviewDb db) throws OrmException, SQLException { + private void migrateData( + List pending, UpdateUI ui, CurrentSchemaVersion curr, ReviewDb db) + throws OrmException, SQLException { for (SchemaVersion v : pending) { Stopwatch sw = Stopwatch.createStarted(); - ui.message(String.format( - "Migrating data to schema %d ...", - v.getVersionNbr())); + ui.message(String.format("Migrating data to schema %d ...", v.getVersionNbr())); v.migrateData(db, ui); v.finish(curr, db); - ui.message(String.format("\t> Done (%.3f s)", - sw.elapsed(TimeUnit.MILLISECONDS) / 1000d)); + ui.message(String.format("\t> Done (%.3f s)", sw.elapsed(TimeUnit.MILLISECONDS) / 1000d)); } } /** - * Invoked between updateSchema (adds new columns/tables) and pruneSchema - * (removes deleted columns/tables). + * Invoked between updateSchema (adds new columns/tables) and pruneSchema (removes deleted + * columns/tables). * * @param db open database handle. * @param ui interface for interacting with the user. * @throws OrmException if a Gerrit-specific exception occurred. * @throws SQLException if an underlying SQL exception occurred. */ - protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException { - } + protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {} /** Mark the current schema version. */ - protected void finish(CurrentSchemaVersion curr, ReviewDb db) - throws OrmException { + protected void finish(CurrentSchemaVersion curr, ReviewDb db) throws OrmException { curr.versionNbr = versionNbr; db.schemaVersion().update(Collections.singleton(curr)); } /** Rename an existing table. */ - protected static void renameTable(ReviewDb db, String from, String to) - throws OrmException { + protected static void renameTable(ReviewDb db, String from, String to) throws OrmException { JdbcSchema s = (JdbcSchema) db; try (JdbcExecutor e = new JdbcExecutor(s)) { s.renameTable(e, from, to); @@ -205,8 +203,7 @@ public abstract class SchemaVersion { } /** Open a new prepared statement. */ - protected static PreparedStatement prepareStatement(ReviewDb db, String sql) - throws SQLException { + protected static PreparedStatement prepareStatement(ReviewDb db, String sql) throws SQLException { return ((JdbcSchema) db).getConnection().prepareStatement(sql); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersionCheck.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersionCheck.java index 245e94deac..2f3d09f12b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersionCheck.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersionCheck.java @@ -27,7 +27,7 @@ import com.google.inject.ProvisionException; /** Validates the current schema version. */ public class SchemaVersionCheck implements LifecycleListener { - public static Module module () { + public static Module module() { return new LifecycleModule() { @Override protected void configure() { @@ -40,8 +40,7 @@ public class SchemaVersionCheck implements LifecycleListener { private final SitePaths site; @Inject - public SchemaVersionCheck(SchemaFactory schemaFactory, - SitePaths site) { + public SchemaVersionCheck(SchemaFactory schemaFactory, SitePaths site) { this.schema = schemaFactory; this.site = site; } @@ -53,21 +52,30 @@ public class SchemaVersionCheck implements LifecycleListener { final int expectedVer = SchemaVersion.getBinaryVersion(); if (currentVer == null) { - throw new ProvisionException("Schema not yet initialized." - + " Run init to initialize the schema:\n" - + "$ java -jar gerrit.war init -d " - + site.site_path.toAbsolutePath()); + throw new ProvisionException( + "Schema not yet initialized." + + " Run init to initialize the schema:\n" + + "$ java -jar gerrit.war init -d " + + site.site_path.toAbsolutePath()); } if (currentVer.versionNbr < expectedVer) { - throw new ProvisionException("Unsupported schema version " - + currentVer.versionNbr + "; expected schema version " + expectedVer - + ". Run init to upgrade:\n" - + "$ java -jar " + site.gerrit_war.toAbsolutePath() + " init -d " - + site.site_path.toAbsolutePath()); + throw new ProvisionException( + "Unsupported schema version " + + currentVer.versionNbr + + "; expected schema version " + + expectedVer + + ". Run init to upgrade:\n" + + "$ java -jar " + + site.gerrit_war.toAbsolutePath() + + " init -d " + + site.site_path.toAbsolutePath()); } else if (currentVer.versionNbr > expectedVer) { - throw new ProvisionException("Unsupported schema version " - + currentVer.versionNbr + "; expected schema version " + expectedVer - + ". Downgrade is not supported."); + throw new ProvisionException( + "Unsupported schema version " + + currentVer.versionNbr + + "; expected schema version " + + expectedVer + + ". Downgrade is not supported."); } } catch (OrmException e) { throw new ProvisionException("Cannot read schema_version", e); @@ -75,8 +83,7 @@ public class SchemaVersionCheck implements LifecycleListener { } @Override - public void stop() { - } + public void stop() {} private CurrentSchemaVersion getSchemaVersion(final ReviewDb db) { try { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_101.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_101.java index 4ef0d96864..ccbb2dee1f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_101.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_101.java @@ -27,7 +27,6 @@ import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.StatementExecutor; import com.google.inject.Inject; import com.google.inject.Provider; - import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.ResultSet; @@ -55,8 +54,7 @@ public class Schema_101 extends SchemaVersion { } @Override - protected void migrateData(ReviewDb db, UpdateUI ui) - throws OrmException, SQLException { + protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException { conn = ((JdbcSchema) db).getConnection(); dialect = ((JdbcSchema) db).getDialect(); Map corrections = findPKUpdates(); @@ -78,8 +76,7 @@ public class Schema_101 extends SchemaVersion { } } - private Map findPKUpdates() - throws OrmException, SQLException { + private Map findPKUpdates() throws OrmException, SQLException { Map corrections = new TreeMap<>(); DatabaseMetaData meta = conn.getMetaData(); JavaSchemaModel jsm = new JavaSchemaModel(ReviewDb.class); @@ -104,8 +101,7 @@ public class Schema_101 extends SchemaVersion { return pk; } - private PrimaryKey dbTablePK(DatabaseMetaData meta, String tableName) - throws SQLException { + private PrimaryKey dbTablePK(DatabaseMetaData meta, String tableName) throws SQLException { if (meta.storesUpperCaseIdentifiers()) { tableName = tableName.toUpperCase(); } else if (meta.storesLowerCaseIdentifiers()) { @@ -130,21 +126,19 @@ public class Schema_101 extends SchemaVersion { } } - private void recreatePK(StatementExecutor executor, String tableName, - PrimaryKey pk, UpdateUI ui) throws OrmException { + private void recreatePK(StatementExecutor executor, String tableName, PrimaryKey pk, UpdateUI ui) + throws OrmException { if (pk.oldNameInDb == null) { - ui.message(String.format( - "warning: primary key for table %s didn't exist ... ", tableName)); + ui.message(String.format("warning: primary key for table %s didn't exist ... ", tableName)); } else { if (dialect instanceof DialectPostgreSQL) { // postgresql doesn't support the ALTER TABLE foo DROP PRIMARY KEY form - executor.execute("ALTER TABLE " + tableName + " DROP CONSTRAINT " - + pk.oldNameInDb); + executor.execute("ALTER TABLE " + tableName + " DROP CONSTRAINT " + pk.oldNameInDb); } else { executor.execute("ALTER TABLE " + tableName + " DROP PRIMARY KEY"); } } - executor.execute("ALTER TABLE " + tableName - + " ADD PRIMARY KEY(" + Joiner.on(",").join(pk.cols) + ")"); + executor.execute( + "ALTER TABLE " + tableName + " ADD PRIMARY KEY(" + Joiner.on(",").join(pk.cols) + ")"); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_102.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_102.java index bcb3e1aa1d..1c1aa55256 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_102.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_102.java @@ -22,7 +22,6 @@ import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.StatementExecutor; import com.google.inject.Inject; import com.google.inject.Provider; - import java.sql.SQLException; import java.util.Set; import java.util.regex.Pattern; @@ -34,8 +33,7 @@ public class Schema_102 extends SchemaVersion { } @Override - protected void migrateData(ReviewDb db, UpdateUI ui) - throws OrmException, SQLException { + protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException { JdbcSchema schema = (JdbcSchema) db; SqlDialect dialect = schema.getDialect(); try (StatementExecutor e = newExecutor(db)) { @@ -43,11 +41,9 @@ public class Schema_102 extends SchemaVersion { // See "Delete SQL index support" commit for more details: // d4ae3a16d5e1464574bd04f429a63eb9c02b3b43 Pattern pattern = - Pattern.compile("^changes_(allOpen|allClosed|byBranchClosed)$", - Pattern.CASE_INSENSITIVE); + Pattern.compile("^changes_(allOpen|allClosed|byBranchClosed)$", Pattern.CASE_INSENSITIVE); String table = "changes"; - Set listIndexes = dialect.listIndexes( - schema.getConnection(), table); + Set listIndexes = dialect.listIndexes(schema.getConnection(), table); for (String index : listIndexes) { if (pattern.matcher(index).matches()) { dialect.dropIndex(e, table, index); @@ -56,12 +52,18 @@ public class Schema_102 extends SchemaVersion { dialect.dropIndex(e, table, "changes_byProjectOpen"); if (dialect instanceof DialectPostgreSQL) { - e.execute("CREATE INDEX changes_byProjectOpen" - + " ON " + table + " (dest_project_name, last_updated_on)" - + " WHERE open = 'Y'"); + e.execute( + "CREATE INDEX changes_byProjectOpen" + + " ON " + + table + + " (dest_project_name, last_updated_on)" + + " WHERE open = 'Y'"); } else { - e.execute("CREATE INDEX changes_byProjectOpen" - + " ON " + table + " (open, dest_project_name, last_updated_on)"); + e.execute( + "CREATE INDEX changes_byProjectOpen" + + " ON " + + table + + " (open, dest_project_name, last_updated_on)"); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_105.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_105.java index 74f0cf5a25..78ecdbdf04 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_105.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_105.java @@ -23,7 +23,6 @@ import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.StatementExecutor; import com.google.inject.Inject; import com.google.inject.Provider; - import java.sql.SQLException; import java.util.HashMap; import java.util.Map; @@ -38,8 +37,7 @@ public class Schema_105 extends SchemaVersion { } @Override - protected void migrateData(ReviewDb db, UpdateUI ui) - throws SQLException, OrmException { + protected void migrateData(ReviewDb db, UpdateUI ui) throws SQLException, OrmException { JdbcSchema schema = (JdbcSchema) db; SqlDialect dialect = schema.getDialect(); @@ -65,25 +63,24 @@ public class Schema_105 extends SchemaVersion { } } - private Set listChangesIndexes(JdbcSchema schema) - throws SQLException { + private Set listChangesIndexes(JdbcSchema schema) throws SQLException { // List of all changes indexes ever created or dropped, found with the // following command: // find g* -name \*.sql | xargs git log -i -p -S' index changes_' | grep -io ' index changes_\w*' | cut -d' ' -f3 | tr A-Z a-z | sort -u // Used rather than listIndexes as we're not sure whether it might include // primary key indexes. - Set allChanges = ImmutableSet.of( - "changes_allclosed", - "changes_allopen", - "changes_bybranchclosed", - "changes_byownerclosed", - "changes_byowneropen", - "changes_byproject", - "changes_byprojectopen", - "changes_key", - "changes_submitted"); + Set allChanges = + ImmutableSet.of( + "changes_allclosed", + "changes_allopen", + "changes_bybranchclosed", + "changes_byownerclosed", + "changes_byowneropen", + "changes_byproject", + "changes_byprojectopen", + "changes_key", + "changes_submitted"); return Sets.intersection( - schema.getDialect().listIndexes(schema.getConnection(), TABLE), - allChanges); + schema.getDialect().listIndexes(schema.getConnection(), TABLE), allChanges); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_106.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_106.java index 838706ef94..294c96d4a9 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_106.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_106.java @@ -25,11 +25,6 @@ import com.google.gerrit.server.git.LocalDiskRepositoryManager; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - -import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.PersonIdent; -import org.eclipse.jgit.lib.Repository; - import java.io.File; import java.io.IOException; import java.io.PrintWriter; @@ -41,6 +36,9 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.PersonIdent; +import org.eclipse.jgit.lib.Repository; public class Schema_106 extends SchemaVersion { // we can use multiple threads per CPU as we can expect that threads will be @@ -50,7 +48,8 @@ public class Schema_106 extends SchemaVersion { private final PersonIdent serverUser; @Inject - Schema_106(Provider prior, + Schema_106( + Provider prior, GitRepositoryManager repoManager, @GerritPersonIdent PersonIdent serverUser) { super(prior); @@ -68,8 +67,7 @@ public class Schema_106 extends SchemaVersion { SortedSet repoList = repoManager.list(); ui.message("done"); - ui.message(String.format("creating reflog files for %s branches ...", - RefNames.REFS_CONFIG)); + ui.message(String.format("creating reflog files for %s branches ...", RefNames.REFS_CONFIG)); ExecutorService executorPool = createExecutor(ui, repoList.size()); List> futures = new ArrayList<>(); @@ -90,9 +88,10 @@ public class Schema_106 extends SchemaVersion { } ui.message("done"); } catch (InterruptedException ex) { - String msg = String.format( + String msg = + String.format( "Migration step 106 was interrupted. " - + "Reflog created in %d of %d repositories only.", + + "Reflog created in %d of %d repositories only.", countDone(futures), repoList.size()); ui.message(msg); } @@ -126,21 +125,18 @@ public class Schema_106 extends SchemaVersion { @Override public Void call() throws IOException { try (Repository repo = repoManager.openRepository(project)) { - File metaConfigLog = - new File(repo.getDirectory(), "logs/" + RefNames.REFS_CONFIG); + File metaConfigLog = new File(repo.getDirectory(), "logs/" + RefNames.REFS_CONFIG); if (metaConfigLog.exists()) { return null; } - if (!metaConfigLog.getParentFile().mkdirs() - || !metaConfigLog.createNewFile()) { + if (!metaConfigLog.getParentFile().mkdirs() || !metaConfigLog.createNewFile()) { throw new IOException(); } ObjectId metaConfigId = repo.resolve(RefNames.REFS_CONFIG); if (metaConfigId != null) { - try (PrintWriter writer = - new PrintWriter(metaConfigLog, UTF_8.name())) { + try (PrintWriter writer = new PrintWriter(metaConfigLog, UTF_8.name())) { writer.print(ObjectId.zeroId().name()); writer.print(" "); writer.print(metaConfigId.name()); @@ -153,10 +149,10 @@ public class Schema_106 extends SchemaVersion { } return null; } catch (IOException e) { - throw new IOException(String.format( - "ERROR: Failed to create reflog file for the" - + " %s branch in repository %s", RefNames.REFS_CONFIG, - project.get())); + throw new IOException( + String.format( + "ERROR: Failed to create reflog file for the" + " %s branch in repository %s", + RefNames.REFS_CONFIG, project.get())); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_107.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_107.java index c2c2305bf0..dd8868f816 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_107.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_107.java @@ -18,7 +18,6 @@ import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gwtorm.jdbc.JdbcSchema; import com.google.inject.Inject; import com.google.inject.Provider; - import java.sql.SQLException; import java.sql.Statement; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_108.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_108.java index d568cbad06..dc88f8de64 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_108.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_108.java @@ -33,7 +33,11 @@ import com.google.gerrit.server.project.NoSuchChangeException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - +import java.io.IOException; +import java.util.Collection; +import java.util.Map; +import java.util.Set; +import java.util.SortedSet; import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectId; @@ -45,18 +49,11 @@ import org.eclipse.jgit.revwalk.RevObject; import org.eclipse.jgit.revwalk.RevSort; import org.eclipse.jgit.revwalk.RevWalk; -import java.io.IOException; -import java.util.Collection; -import java.util.Map; -import java.util.Set; -import java.util.SortedSet; - public class Schema_108 extends SchemaVersion { private final GitRepositoryManager repoManager; @Inject - Schema_108(Provider prior, - GitRepositoryManager repoManager) { + Schema_108(Provider prior, GitRepositoryManager repoManager) { super(prior); this.repoManager = repoManager; } @@ -64,14 +61,12 @@ public class Schema_108 extends SchemaVersion { @Override protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException { ui.message("Listing all changes ..."); - SetMultimap openByProject = - getOpenChangesByProject(db, ui); + SetMultimap openByProject = getOpenChangesByProject(db, ui); ui.message("done"); ui.message("Updating groups for open changes ..."); int i = 0; - for (Map.Entry> e - : openByProject.asMap().entrySet()) { + for (Map.Entry> e : openByProject.asMap().entrySet()) { try (Repository repo = repoManager.openRepository(e.getKey()); RevWalk rw = new RevWalk(repo)) { updateProjectGroups(db, repo, rw, (Set) e.getValue(), ui); @@ -85,8 +80,9 @@ public class Schema_108 extends SchemaVersion { ui.message("done"); } - private void updateProjectGroups(ReviewDb db, Repository repo, RevWalk rw, - Set changes, UpdateUI ui) throws OrmException, IOException { + private void updateProjectGroups( + ReviewDb db, Repository repo, RevWalk rw, Set changes, UpdateUI ui) + throws OrmException, IOException { // Match sorting in ReceiveCommits. rw.reset(); rw.sort(RevSort.TOPO); @@ -121,8 +117,7 @@ public class Schema_108 extends SchemaVersion { } } - GroupCollector collector = - GroupCollector.createForSchemaUpgradeOnly(changeRefsBySha, db); + GroupCollector collector = GroupCollector.createForSchemaUpgradeOnly(changeRefsBySha, db); RevCommit c; while ((c = rw.next()) != null) { collector.visit(c); @@ -131,12 +126,12 @@ public class Schema_108 extends SchemaVersion { updateGroups(db, collector, patchSetsBySha); } - private static void updateGroups(ReviewDb db, GroupCollector collector, - ListMultimap patchSetsBySha) throws OrmException { + private static void updateGroups( + ReviewDb db, GroupCollector collector, ListMultimap patchSetsBySha) + throws OrmException { Map patchSets = db.patchSets().toMap(db.patchSets().get(patchSetsBySha.values())); - for (Map.Entry> e - : collector.getGroups().asMap().entrySet()) { + for (Map.Entry> e : collector.getGroups().asMap().entrySet()) { for (PatchSet.Id psId : patchSetsBySha.get(e.getKey())) { PatchSet ps = patchSets.get(psId); if (ps != null) { @@ -148,8 +143,8 @@ public class Schema_108 extends SchemaVersion { db.patchSets().update(patchSets.values()); } - private SetMultimap getOpenChangesByProject( - ReviewDb db, UpdateUI ui) throws OrmException { + private SetMultimap getOpenChangesByProject(ReviewDb db, UpdateUI ui) + throws OrmException { SortedSet projects = repoManager.list(); SortedSet nonExistentProjects = Sets.newTreeSet(); SetMultimap openByProject = @@ -174,8 +169,9 @@ public class Schema_108 extends SchemaVersion { if (!nonExistentProjects.isEmpty()) { ui.message("Detected open changes referring to the following non-existent projects:"); ui.message(Joiner.on(", ").join(nonExistentProjects)); - ui.message("It is highly recommended to remove\n" - + "the obsolete open changes, comments and patch-sets from your DB.\n"); + ui.message( + "It is highly recommended to remove\n" + + "the obsolete open changes, comments and patch-sets from your DB.\n"); } return openByProject; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_115.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_115.java index 26cd3e16cc..3c6a50e840 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_115.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_115.java @@ -35,14 +35,6 @@ import com.google.gwtorm.jdbc.JdbcSchema; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.BatchRefUpdate; -import org.eclipse.jgit.lib.NullProgressMonitor; -import org.eclipse.jgit.lib.PersonIdent; -import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.revwalk.RevWalk; - import java.io.IOException; import java.sql.ResultSet; import java.sql.ResultSetMetaData; @@ -52,6 +44,12 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.BatchRefUpdate; +import org.eclipse.jgit.lib.NullProgressMonitor; +import org.eclipse.jgit.lib.PersonIdent; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevWalk; public class Schema_115 extends SchemaVersion { private final GitRepositoryManager mgr; @@ -59,7 +57,8 @@ public class Schema_115 extends SchemaVersion { private final PersonIdent serverUser; @Inject - Schema_115(Provider prior, + Schema_115( + Provider prior, GitRepositoryManager mgr, AllUsersName allUsersName, @GerritPersonIdent PersonIdent serverUser) { @@ -70,80 +69,78 @@ public class Schema_115 extends SchemaVersion { } @Override - protected void migrateData(ReviewDb db, UpdateUI ui) - throws OrmException, SQLException { + protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException { Map imports = new HashMap<>(); try (Statement stmt = ((JdbcSchema) db).getConnection().createStatement(); - ResultSet rs = stmt.executeQuery( - "SELECT * FROM account_diff_preferences")) { - Set availableColumns = getColumns(rs); - while (rs.next()) { - Account.Id accountId = new Account.Id(rs.getInt("id")); - DiffPreferencesInfo prefs = new DiffPreferencesInfo(); - if (availableColumns.contains("context")) { - prefs.context = (int)rs.getShort("context"); - } - if (availableColumns.contains("expand_all_comments")) { - prefs.expandAllComments = toBoolean(rs.getString("expand_all_comments")); - } - if (availableColumns.contains("hide_line_numbers")) { - prefs.hideLineNumbers = toBoolean(rs.getString("hide_line_numbers")); - } - if (availableColumns.contains("hide_top_menu")) { - prefs.hideTopMenu = toBoolean(rs.getString("hide_top_menu")); - } - if (availableColumns.contains("ignore_whitespace")) { - // Enum with char as value - prefs.ignoreWhitespace = toWhitespace(rs.getString("ignore_whitespace")); - } - if (availableColumns.contains("intraline_difference")) { - prefs.intralineDifference = toBoolean(rs.getString("intraline_difference")); - } - if (availableColumns.contains("line_length")) { - prefs.lineLength = rs.getInt("line_length"); - } - if (availableColumns.contains("manual_review")) { - prefs.manualReview = toBoolean(rs.getString("manual_review")); - } - if (availableColumns.contains("render_entire_file")) { - prefs.renderEntireFile = toBoolean(rs.getString("render_entire_file")); - } - if (availableColumns.contains("retain_header")) { - prefs.retainHeader = toBoolean(rs.getString("retain_header")); - } - if (availableColumns.contains("show_line_endings")) { - prefs.showLineEndings = toBoolean(rs.getString("show_line_endings")); - } - if (availableColumns.contains("show_tabs")) { - prefs.showTabs = toBoolean(rs.getString("show_tabs")); - } - if (availableColumns.contains("show_whitespace_errors")) { - prefs.showWhitespaceErrors = toBoolean(rs.getString("show_whitespace_errors")); - } - if (availableColumns.contains("skip_deleted")) { - prefs.skipDeleted = toBoolean(rs.getString("skip_deleted")); - } - if (availableColumns.contains("skip_uncommented")) { - prefs.skipUncommented = toBoolean(rs.getString("skip_uncommented")); - } - if (availableColumns.contains("syntax_highlighting")) { - prefs.syntaxHighlighting = toBoolean(rs.getString("syntax_highlighting")); - } - if (availableColumns.contains("tab_size")) { - prefs.tabSize = rs.getInt("tab_size"); - } - if (availableColumns.contains("theme")) { - // Enum with name as values; can be null - prefs.theme = toTheme(rs.getString("theme")); - } - if (availableColumns.contains("hide_empty_pane")) { - prefs.hideEmptyPane = toBoolean(rs.getString("hide_empty_pane")); - } - if (availableColumns.contains("auto_hide_diff_table_header")) { - prefs.autoHideDiffTableHeader = toBoolean(rs.getString("auto_hide_diff_table_header")); - } - imports.put(accountId, prefs); + ResultSet rs = stmt.executeQuery("SELECT * FROM account_diff_preferences")) { + Set availableColumns = getColumns(rs); + while (rs.next()) { + Account.Id accountId = new Account.Id(rs.getInt("id")); + DiffPreferencesInfo prefs = new DiffPreferencesInfo(); + if (availableColumns.contains("context")) { + prefs.context = (int) rs.getShort("context"); } + if (availableColumns.contains("expand_all_comments")) { + prefs.expandAllComments = toBoolean(rs.getString("expand_all_comments")); + } + if (availableColumns.contains("hide_line_numbers")) { + prefs.hideLineNumbers = toBoolean(rs.getString("hide_line_numbers")); + } + if (availableColumns.contains("hide_top_menu")) { + prefs.hideTopMenu = toBoolean(rs.getString("hide_top_menu")); + } + if (availableColumns.contains("ignore_whitespace")) { + // Enum with char as value + prefs.ignoreWhitespace = toWhitespace(rs.getString("ignore_whitespace")); + } + if (availableColumns.contains("intraline_difference")) { + prefs.intralineDifference = toBoolean(rs.getString("intraline_difference")); + } + if (availableColumns.contains("line_length")) { + prefs.lineLength = rs.getInt("line_length"); + } + if (availableColumns.contains("manual_review")) { + prefs.manualReview = toBoolean(rs.getString("manual_review")); + } + if (availableColumns.contains("render_entire_file")) { + prefs.renderEntireFile = toBoolean(rs.getString("render_entire_file")); + } + if (availableColumns.contains("retain_header")) { + prefs.retainHeader = toBoolean(rs.getString("retain_header")); + } + if (availableColumns.contains("show_line_endings")) { + prefs.showLineEndings = toBoolean(rs.getString("show_line_endings")); + } + if (availableColumns.contains("show_tabs")) { + prefs.showTabs = toBoolean(rs.getString("show_tabs")); + } + if (availableColumns.contains("show_whitespace_errors")) { + prefs.showWhitespaceErrors = toBoolean(rs.getString("show_whitespace_errors")); + } + if (availableColumns.contains("skip_deleted")) { + prefs.skipDeleted = toBoolean(rs.getString("skip_deleted")); + } + if (availableColumns.contains("skip_uncommented")) { + prefs.skipUncommented = toBoolean(rs.getString("skip_uncommented")); + } + if (availableColumns.contains("syntax_highlighting")) { + prefs.syntaxHighlighting = toBoolean(rs.getString("syntax_highlighting")); + } + if (availableColumns.contains("tab_size")) { + prefs.tabSize = rs.getInt("tab_size"); + } + if (availableColumns.contains("theme")) { + // Enum with name as values; can be null + prefs.theme = toTheme(rs.getString("theme")); + } + if (availableColumns.contains("hide_empty_pane")) { + prefs.hideEmptyPane = toBoolean(rs.getString("hide_empty_pane")); + } + if (availableColumns.contains("auto_hide_diff_table_header")) { + prefs.autoHideDiffTableHeader = toBoolean(rs.getString("auto_hide_diff_table_header")); + } + imports.put(accountId, prefs); + } } if (imports.isEmpty()) { @@ -154,15 +151,18 @@ public class Schema_115 extends SchemaVersion { RevWalk rw = new RevWalk(git)) { BatchRefUpdate bru = git.getRefDatabase().newBatchUpdate(); for (Map.Entry e : imports.entrySet()) { - try (MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, - allUsersName, git, bru)) { + try (MetaDataUpdate md = + new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, git, bru)) { md.getCommitBuilder().setAuthor(serverUser); md.getCommitBuilder().setCommitter(serverUser); - VersionedAccountPreferences p = - VersionedAccountPreferences.forUser(e.getKey()); + VersionedAccountPreferences p = VersionedAccountPreferences.forUser(e.getKey()); p.load(md); - storeSection(p.getConfig(), UserConfigSections.DIFF, null, - e.getValue(), DiffPreferencesInfo.defaults()); + storeSection( + p.getConfig(), + UserConfigSections.DIFF, + null, + e.getValue(), + DiffPreferencesInfo.defaults()); p.commit(md); } } @@ -197,8 +197,7 @@ public class Schema_115 extends SchemaVersion { } Whitespace r = PatchListKey.WHITESPACE_TYPES.inverse().get(v.charAt(0)); if (r == null) { - throw new IllegalArgumentException("Cannot find Whitespace type for: " - + v); + throw new IllegalArgumentException("Cannot find Whitespace type for: " + v); } return r; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_117.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_117.java index 6176aeb754..35e6c8aaf8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_117.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_117.java @@ -19,7 +19,6 @@ import com.google.gwtorm.jdbc.JdbcSchema; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; @@ -32,21 +31,18 @@ public class Schema_117 extends SchemaVersion { } @Override - protected void preUpdateSchema(ReviewDb db) - throws OrmException, SQLException { + protected void preUpdateSchema(ReviewDb db) throws OrmException, SQLException { JdbcSchema schema = (JdbcSchema) db; Connection connection = schema.getConnection(); String tableName = "patch_sets"; String oldColumnName = "push_certficate"; String newColumnName = "push_certificate"; - Set columns = - schema.getDialect().listColumns(connection, tableName); + Set columns = schema.getDialect().listColumns(connection, tableName); if (columns.contains(oldColumnName)) { renameColumn(db, tableName, oldColumnName, newColumnName); } try (Statement stmt = schema.getConnection().createStatement()) { - stmt.execute( - "ALTER TABLE " + tableName + " MODIFY " + newColumnName + " clob"); + stmt.execute("ALTER TABLE " + tableName + " MODIFY " + newColumnName + " clob"); } catch (SQLException e) { // Ignore. Type may have already been modified manually. } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_119.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_119.java index cd42e75fb2..0081baac79 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_119.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_119.java @@ -44,14 +44,6 @@ import com.google.gwtorm.jdbc.JdbcSchema; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.BatchRefUpdate; -import org.eclipse.jgit.lib.NullProgressMonitor; -import org.eclipse.jgit.lib.PersonIdent; -import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.revwalk.RevWalk; - import java.io.IOException; import java.sql.Connection; import java.sql.ResultSet; @@ -60,10 +52,16 @@ import java.sql.Statement; import java.util.HashMap; import java.util.Map; import java.util.Set; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.BatchRefUpdate; +import org.eclipse.jgit.lib.NullProgressMonitor; +import org.eclipse.jgit.lib.PersonIdent; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevWalk; public class Schema_119 extends SchemaVersion { private static final Map LEGACY_DISPLAYNAME_MAP = - ImmutableMap. of( + ImmutableMap.of( "ANON_GIT", ANON_GIT, "ANON_HTTP", ANON_HTTP, "HTTP", HTTP, @@ -75,7 +73,8 @@ public class Schema_119 extends SchemaVersion { private final PersonIdent serverUser; @Inject - Schema_119(Provider prior, + Schema_119( + Provider prior, GitRepositoryManager mgr, AllUsersName allUsersName, @GerritPersonIdent PersonIdent serverUser) { @@ -86,60 +85,56 @@ public class Schema_119 extends SchemaVersion { } @Override - protected void migrateData(ReviewDb db, UpdateUI ui) - throws OrmException, SQLException { + protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException { JdbcSchema schema = (JdbcSchema) db; Connection connection = schema.getConnection(); String tableName = "accounts"; String emailStrategy = "email_strategy"; - Set columns = - schema.getDialect().listColumns(connection, tableName); + Set columns = schema.getDialect().listColumns(connection, tableName); Map imports = new HashMap<>(); try (Statement stmt = ((JdbcSchema) db).getConnection().createStatement(); - ResultSet rs = stmt.executeQuery( - "select " - + "account_id, " - + "maximum_page_size, " - + "show_site_header, " - + "use_flash_clipboard, " - + "download_url, " - + "download_command, " - + (columns.contains(emailStrategy) - ? emailStrategy + ", " - : "copy_self_on_email, ") - + "date_format, " - + "time_format, " - + "relative_date_in_change_table, " - + "diff_view, " - + "size_bar_in_change_table, " - + "legacycid_in_change_table, " - + "review_category_strategy, " - + "mute_common_path_prefixes " - + "from " + tableName)) { - while (rs.next()) { - GeneralPreferencesInfo p = - new GeneralPreferencesInfo(); - Account.Id accountId = new Account.Id(rs.getInt(1)); - p.changesPerPage = (int)rs.getShort(2); - p.showSiteHeader = toBoolean(rs.getString(3)); - p.useFlashClipboard = toBoolean(rs.getString(4)); - p.downloadScheme = convertToModernNames(rs.getString(5)); - p.downloadCommand = toDownloadCommand(rs.getString(6)); - p.emailStrategy = toEmailStrategy(rs.getString(7), - columns.contains(emailStrategy)); - p.dateFormat = toDateFormat(rs.getString(8)); - p.timeFormat = toTimeFormat(rs.getString(9)); - p.relativeDateInChangeTable = toBoolean(rs.getString(10)); - p.diffView = toDiffView(rs.getString(11)); - p.sizeBarInChangeTable = toBoolean(rs.getString(12)); - p.legacycidInChangeTable = toBoolean(rs.getString(13)); - p.reviewCategoryStrategy = - toReviewCategoryStrategy(rs.getString(14)); - p.muteCommonPathPrefixes = toBoolean(rs.getString(15)); - p.defaultBaseForMerges = - GeneralPreferencesInfo.defaults().defaultBaseForMerges; - imports.put(accountId, p); - } + ResultSet rs = + stmt.executeQuery( + "select " + + "account_id, " + + "maximum_page_size, " + + "show_site_header, " + + "use_flash_clipboard, " + + "download_url, " + + "download_command, " + + (columns.contains(emailStrategy) + ? emailStrategy + ", " + : "copy_self_on_email, ") + + "date_format, " + + "time_format, " + + "relative_date_in_change_table, " + + "diff_view, " + + "size_bar_in_change_table, " + + "legacycid_in_change_table, " + + "review_category_strategy, " + + "mute_common_path_prefixes " + + "from " + + tableName)) { + while (rs.next()) { + GeneralPreferencesInfo p = new GeneralPreferencesInfo(); + Account.Id accountId = new Account.Id(rs.getInt(1)); + p.changesPerPage = (int) rs.getShort(2); + p.showSiteHeader = toBoolean(rs.getString(3)); + p.useFlashClipboard = toBoolean(rs.getString(4)); + p.downloadScheme = convertToModernNames(rs.getString(5)); + p.downloadCommand = toDownloadCommand(rs.getString(6)); + p.emailStrategy = toEmailStrategy(rs.getString(7), columns.contains(emailStrategy)); + p.dateFormat = toDateFormat(rs.getString(8)); + p.timeFormat = toTimeFormat(rs.getString(9)); + p.relativeDateInChangeTable = toBoolean(rs.getString(10)); + p.diffView = toDiffView(rs.getString(11)); + p.sizeBarInChangeTable = toBoolean(rs.getString(12)); + p.legacycidInChangeTable = toBoolean(rs.getString(13)); + p.reviewCategoryStrategy = toReviewCategoryStrategy(rs.getString(14)); + p.muteCommonPathPrefixes = toBoolean(rs.getString(15)); + p.defaultBaseForMerges = GeneralPreferencesInfo.defaults().defaultBaseForMerges; + imports.put(accountId, p); + } } if (imports.isEmpty()) { @@ -149,17 +144,19 @@ public class Schema_119 extends SchemaVersion { try (Repository git = mgr.openRepository(allUsersName); RevWalk rw = new RevWalk(git)) { BatchRefUpdate bru = git.getRefDatabase().newBatchUpdate(); - for (Map.Entry e - : imports.entrySet()) { - try (MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, - allUsersName, git, bru)) { + for (Map.Entry e : imports.entrySet()) { + try (MetaDataUpdate md = + new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, git, bru)) { md.getCommitBuilder().setAuthor(serverUser); md.getCommitBuilder().setCommitter(serverUser); - VersionedAccountPreferences p = - VersionedAccountPreferences.forUser(e.getKey()); + VersionedAccountPreferences p = VersionedAccountPreferences.forUser(e.getKey()); p.load(md); - storeSection(p.getConfig(), UserConfigSections.GENERAL, null, - e.getValue(), GeneralPreferencesInfo.defaults()); + storeSection( + p.getConfig(), + UserConfigSections.GENERAL, + null, + e.getValue(), + GeneralPreferencesInfo.defaults()); p.commit(md); } } @@ -204,8 +201,8 @@ public class Schema_119 extends SchemaVersion { return DiffView.valueOf(v); } - private static EmailStrategy toEmailStrategy(String v, - boolean emailStrategyColumnExists) throws OrmException { + private static EmailStrategy toEmailStrategy(String v, boolean emailStrategyColumnExists) + throws OrmException { if (v == null) { return EmailStrategy.ENABLED; } @@ -219,8 +216,7 @@ public class Schema_119 extends SchemaVersion { // EMAIL_STRATEGY='CC_ON_OWN_COMMENTS' WHERE (COPY_SELF_ON_EMAIL='Y') return EmailStrategy.CC_ON_OWN_COMMENTS; } else { - throw new OrmException( - "invalid value in accounts.copy_self_on_email: " + v); + throw new OrmException("invalid value in accounts.copy_self_on_email: " + v); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_120.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_120.java index fc1b0cddee..072fc627b7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_120.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_120.java @@ -27,7 +27,10 @@ import com.google.gwtorm.jdbc.JdbcSchema; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - +import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.BatchRefUpdate; import org.eclipse.jgit.lib.NullProgressMonitor; @@ -36,18 +39,14 @@ import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.transport.RefSpec; -import java.io.IOException; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; - public class Schema_120 extends SchemaVersion { private final GitRepositoryManager mgr; private final PersonIdent serverUser; @Inject - Schema_120(Provider prior, + Schema_120( + Provider prior, GitRepositoryManager mgr, @GerritPersonIdent PersonIdent serverUser) { super(prior); @@ -55,13 +54,13 @@ public class Schema_120 extends SchemaVersion { this.serverUser = serverUser; } - private void allowSubmoduleSubscription(Branch.NameKey subbranch, - Branch.NameKey superBranch) throws OrmException { + private void allowSubmoduleSubscription(Branch.NameKey subbranch, Branch.NameKey superBranch) + throws OrmException { try (Repository git = mgr.openRepository(subbranch.getParentKey()); RevWalk rw = new RevWalk(git)) { BatchRefUpdate bru = git.getRefDatabase().newBatchUpdate(); - try (MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, - subbranch.getParentKey(), git, bru)) { + try (MetaDataUpdate md = + new MetaDataUpdate(GitReferenceUpdated.DISABLED, subbranch.getParentKey(), git, bru)) { md.getCommitBuilder().setAuthor(serverUser); md.getCommitBuilder().setCommitter(serverUser); md.setMessage("Added superproject subscription during upgrade"); @@ -94,25 +93,24 @@ public class Schema_120 extends SchemaVersion { } @Override - protected void migrateData(ReviewDb db, UpdateUI ui) - throws OrmException, SQLException { + protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException { ui.message("Generating Superproject subscriptions table to submodule ACLs"); try (Statement stmt = ((JdbcSchema) db).getConnection().createStatement(); - ResultSet rs = stmt.executeQuery("SELECT " - + "super_project_project_name, " - + "super_project_branch_name, " - + "submodule_project_name, " - + "submodule_branch_name " - + "FROM submodule_subscriptions")) { + ResultSet rs = + stmt.executeQuery( + "SELECT " + + "super_project_project_name, " + + "super_project_branch_name, " + + "submodule_project_name, " + + "submodule_branch_name " + + "FROM submodule_subscriptions")) { while (rs.next()) { Project.NameKey superproject = new Project.NameKey(rs.getString(1)); - Branch.NameKey superbranch = new Branch.NameKey(superproject, - rs.getString(2)); + Branch.NameKey superbranch = new Branch.NameKey(superproject, rs.getString(2)); Project.NameKey submodule = new Project.NameKey(rs.getString(3)); - Branch.NameKey subbranch = new Branch.NameKey(submodule, - rs.getString(4)); + Branch.NameKey subbranch = new Branch.NameKey(submodule, rs.getString(4)); allowSubmoduleSubscription(subbranch, superbranch); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_123.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_123.java index 95c0257935..5a0c61d53f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_123.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_123.java @@ -27,7 +27,11 @@ import com.google.gwtorm.jdbc.JdbcSchema; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - +import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.Map; import org.eclipse.jgit.lib.BatchRefUpdate; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; @@ -35,36 +39,25 @@ import org.eclipse.jgit.lib.TextProgressMonitor; import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.transport.ReceiveCommand; -import java.io.IOException; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.Map; - public class Schema_123 extends SchemaVersion { private final GitRepositoryManager repoManager; private final AllUsersName allUsersName; @Inject - Schema_123(Provider prior, - GitRepositoryManager repoManager, - AllUsersName allUsersName) { + Schema_123( + Provider prior, GitRepositoryManager repoManager, AllUsersName allUsersName) { super(prior); this.repoManager = repoManager; this.allUsersName = allUsersName; } @Override - protected void migrateData(ReviewDb db, UpdateUI ui) - throws OrmException, SQLException { + protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException { ListMultimap imports = MultimapBuilder.hashKeys().arrayListValues().build(); try (Statement stmt = ((JdbcSchema) db).getConnection().createStatement(); - ResultSet rs = stmt.executeQuery( - "SELECT " - + "account_id, " - + "change_id " - + "FROM starred_changes")) { + ResultSet rs = + stmt.executeQuery("SELECT " + "account_id, " + "change_id " + "FROM starred_changes")) { while (rs.next()) { Account.Id accountId = new Account.Id(rs.getInt(1)); Change.Id changeId = new Change.Id(rs.getInt(2)); @@ -79,11 +72,11 @@ public class Schema_123 extends SchemaVersion { try (Repository git = repoManager.openRepository(allUsersName); RevWalk rw = new RevWalk(git)) { BatchRefUpdate bru = git.getRefDatabase().newBatchUpdate(); - ObjectId id = StarredChangesUtil.writeLabels(git, - StarredChangesUtil.DEFAULT_LABELS); + ObjectId id = StarredChangesUtil.writeLabels(git, StarredChangesUtil.DEFAULT_LABELS); for (Map.Entry e : imports.entries()) { - bru.addCommand(new ReceiveCommand(ObjectId.zeroId(), id, - RefNames.refsStarredChanges(e.getValue(), e.getKey()))); + bru.addCommand( + new ReceiveCommand( + ObjectId.zeroId(), id, RefNames.refsStarredChanges(e.getValue(), e.getKey()))); } bru.execute(rw, new TextProgressMonitor()); } catch (IOException ex) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_124.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_124.java index 3dd44cdddf..7842b65e03 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_124.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_124.java @@ -34,14 +34,6 @@ import com.google.gwtorm.jdbc.JdbcSchema; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.BatchRefUpdate; -import org.eclipse.jgit.lib.NullProgressMonitor; -import org.eclipse.jgit.lib.PersonIdent; -import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.revwalk.RevWalk; - import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; @@ -51,6 +43,12 @@ import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.BatchRefUpdate; +import org.eclipse.jgit.lib.NullProgressMonitor; +import org.eclipse.jgit.lib.PersonIdent; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevWalk; public class Schema_124 extends SchemaVersion { private final GitRepositoryManager repoManager; @@ -58,7 +56,8 @@ public class Schema_124 extends SchemaVersion { private final PersonIdent serverUser; @Inject - Schema_124(Provider prior, + Schema_124( + Provider prior, GitRepositoryManager repoManager, AllUsersName allUsersName, @GerritPersonIdent PersonIdent serverUser) { @@ -69,24 +68,23 @@ public class Schema_124 extends SchemaVersion { } @Override - protected void migrateData(ReviewDb db, UpdateUI ui) - throws OrmException, SQLException { + protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException { ListMultimap imports = MultimapBuilder.hashKeys().arrayListValues().build(); try (Statement stmt = ((JdbcSchema) db).getConnection().createStatement(); - ResultSet rs = stmt.executeQuery( - "SELECT " - + "account_id, " - + "seq, " - + "ssh_public_key, " - + "valid " - + "FROM account_ssh_keys")) { + ResultSet rs = + stmt.executeQuery( + "SELECT " + + "account_id, " + + "seq, " + + "ssh_public_key, " + + "valid " + + "FROM account_ssh_keys")) { while (rs.next()) { Account.Id accountId = new Account.Id(rs.getInt(1)); int seq = rs.getInt(2); String sshPublicKey = rs.getString(3); - AccountSshKey key = new AccountSshKey( - new AccountSshKey.Id(accountId, seq), sshPublicKey); + AccountSshKey key = new AccountSshKey(new AccountSshKey.Id(accountId, seq), sshPublicKey); boolean valid = toBoolean(rs.getString(4)); if (!valid) { key.setInvalid(); @@ -103,15 +101,14 @@ public class Schema_124 extends SchemaVersion { RevWalk rw = new RevWalk(git)) { BatchRefUpdate bru = git.getRefDatabase().newBatchUpdate(); - for (Map.Entry> e : imports.asMap() - .entrySet()) { - try (MetaDataUpdate md = new MetaDataUpdate( - GitReferenceUpdated.DISABLED, allUsersName, git, bru)) { + for (Map.Entry> e : imports.asMap().entrySet()) { + try (MetaDataUpdate md = + new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, git, bru)) { md.getCommitBuilder().setAuthor(serverUser); md.getCommitBuilder().setCommitter(serverUser); - VersionedAuthorizedKeys authorizedKeys = new VersionedAuthorizedKeys( - new SimpleSshKeyCreator(), e.getKey()); + VersionedAuthorizedKeys authorizedKeys = + new VersionedAuthorizedKeys(new SimpleSshKeyCreator(), e.getKey()); authorizedKeys.load(md); authorizedKeys.setKeys(fixInvalidSequenceNumbers(e.getValue())); authorizedKeys.commit(md); @@ -124,16 +121,16 @@ public class Schema_124 extends SchemaVersion { } } - private Collection fixInvalidSequenceNumbers( - Collection keys) { + private Collection fixInvalidSequenceNumbers(Collection keys) { Ordering o = Ordering.from(comparing(k -> k.getKey().get())); List fixedKeys = new ArrayList<>(keys); AccountSshKey minKey = o.min(keys); while (minKey.getKey().get() <= 0) { - AccountSshKey fixedKey = new AccountSshKey( - new AccountSshKey.Id(minKey.getKey().getParentKey(), - Math.max(o.max(keys).getKey().get() + 1, 1)), - minKey.getSshPublicKey()); + AccountSshKey fixedKey = + new AccountSshKey( + new AccountSshKey.Id( + minKey.getKey().getParentKey(), Math.max(o.max(keys).getKey().get() + 1, 1)), + minKey.getSshPublicKey()); Collections.replaceAll(fixedKeys, minKey, fixedKey); minKey = o.min(fixedKeys); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_125.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_125.java index 5adfef2103..947c11578c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_125.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_125.java @@ -36,24 +36,22 @@ import com.google.gerrit.server.project.RefPattern; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.PersonIdent; -import org.eclipse.jgit.lib.Repository; - import java.io.IOException; import java.util.Collection; import java.util.HashMap; import java.util.Map; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.PersonIdent; +import org.eclipse.jgit.lib.Repository; public class Schema_125 extends SchemaVersion { private static final String COMMIT_MSG = - "Assign default permissions on user branches\n" + - "\n" + - "By default each user should be able to read and update the own user\n" + - "branch. Also the user should be able to approve and submit changes for\n" + - "the own user branch. Assign default permissions for this and remove the\n" + - "old exclusive read protection from the user branches.\n"; + "Assign default permissions on user branches\n" + + "\n" + + "By default each user should be able to read and update the own user\n" + + "branch. Also the user should be able to approve and submit changes for\n" + + "the own user branch. Assign default permissions for this and remove the\n" + + "old exclusive read protection from the user branches.\n"; private final GitRepositoryManager repoManager; private final AllUsersName allUsersName; @@ -62,7 +60,8 @@ public class Schema_125 extends SchemaVersion { private final PersonIdent serverUser; @Inject - Schema_125(Provider prior, + Schema_125( + Provider prior, GitRepositoryManager repoManager, AllUsersName allUsersName, AllProjectsName allProjectsName, @@ -79,24 +78,23 @@ public class Schema_125 extends SchemaVersion { @Override protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException { try (Repository git = repoManager.openRepository(allUsersName); - MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, - allUsersName, git)) { + MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, git)) { ProjectConfig config = ProjectConfig.read(md); - config.getAccessSection(RefNames.REFS_USERS + "*", true) + config + .getAccessSection(RefNames.REFS_USERS + "*", true) .remove(new Permission(Permission.READ)); GroupReference registered = systemGroupBackend.getGroup(REGISTERED_USERS); - AccessSection users = config.getAccessSection( - RefNames.REFS_USERS + "${" + RefPattern.USERID_SHARDED + "}", true); + AccessSection users = + config.getAccessSection( + RefNames.REFS_USERS + "${" + RefPattern.USERID_SHARDED + "}", true); grant(config, users, Permission.READ, true, registered); grant(config, users, Permission.PUSH, true, registered); grant(config, users, Permission.SUBMIT, true, registered); for (LabelType lt : getLabelTypes(config)) { - if ("Code-Review".equals(lt.getName()) - || "Verified".equals(lt.getName())) { - grant(config, users, lt, lt.getMin().getValue(), - lt.getMax().getValue(), registered); + if ("Code-Review".equals(lt.getName()) || "Verified".equals(lt.getName())) { + grant(config, users, lt, lt.getMin().getValue(), lt.getMax().getValue(), registered); } } @@ -111,13 +109,11 @@ public class Schema_125 extends SchemaVersion { private Collection getLabelTypes(ProjectConfig config) throws IOException, ConfigInvalidException { - Map labelTypes = - new HashMap<>(config.getLabelSections()); + Map labelTypes = new HashMap<>(config.getLabelSections()); Project.NameKey parent = config.getProject().getParent(allProjectsName); while (parent != null) { try (Repository git = repoManager.openRepository(parent); - MetaDataUpdate md = - new MetaDataUpdate(GitReferenceUpdated.DISABLED, parent, git)) { + MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, parent, git)) { ProjectConfig parentConfig = ProjectConfig.read(md); for (LabelType lt : parentConfig.getLabelSections().values()) { if (!labelTypes.containsKey(lt.getName())) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_126.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_126.java index b26ce416e2..2053c1a7fc 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_126.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_126.java @@ -33,16 +33,13 @@ import com.google.gerrit.server.project.RefPattern; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - +import java.io.IOException; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.Repository; -import java.io.IOException; - public class Schema_126 extends SchemaVersion { - private static final String COMMIT_MSG = - "Fix default permissions on user branches"; + private static final String COMMIT_MSG = "Fix default permissions on user branches"; private final GitRepositoryManager repoManager; private final AllUsersName allUsersName; @@ -50,7 +47,8 @@ public class Schema_126 extends SchemaVersion { private final PersonIdent serverUser; @Inject - Schema_126(Provider prior, + Schema_126( + Provider prior, GitRepositoryManager repoManager, AllUsersName allUsersName, SystemGroupBackend systemGroupBackend, @@ -65,12 +63,10 @@ public class Schema_126 extends SchemaVersion { @Override protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException { try (Repository git = repoManager.openRepository(allUsersName); - MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, - allUsersName, git)) { + MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, git)) { ProjectConfig config = ProjectConfig.read(md); - String refsUsersShardedId = - RefNames.REFS_USERS + "${" + RefPattern.USERID_SHARDED + "}"; + String refsUsersShardedId = RefNames.REFS_USERS + "${" + RefPattern.USERID_SHARDED + "}"; config.remove(config.getAccessSection(refsUsersShardedId)); GroupReference registered = systemGroupBackend.getGroup(REGISTERED_USERS); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_127.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_127.java index 783cce6603..75cdef7a3e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_127.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_127.java @@ -19,7 +19,6 @@ import com.google.gerrit.server.config.SitePaths; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; @@ -45,13 +44,14 @@ public class Schema_127 extends SchemaVersion { H2AccountPatchReviewStore.createTableIfNotExists(url); try (Connection con = DriverManager.getConnection(url); PreparedStatement stmt = - con.prepareStatement("INSERT INTO account_patch_reviews " - + "(account_id, change_id, patch_set_id, file_name) VALUES " - + "(?, ?, ?, ?)")) { + con.prepareStatement( + "INSERT INTO account_patch_reviews " + + "(account_id, change_id, patch_set_id, file_name) VALUES " + + "(?, ?, ?, ?)")) { int batchCount = 0; try (Statement s = newStatement(db); - ResultSet rs = s.executeQuery("SELECT * from account_patch_reviews")) { + ResultSet rs = s.executeQuery("SELECT * from account_patch_reviews")) { while (rs.next()) { stmt.setInt(1, rs.getInt("account_id")); stmt.setInt(2, rs.getInt("change_id")); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_128.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_128.java index d45d92cf60..781f281119 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_128.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_128.java @@ -31,16 +31,13 @@ import com.google.gerrit.server.group.SystemGroupBackend; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - +import java.io.IOException; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.Repository; -import java.io.IOException; - public class Schema_128 extends SchemaVersion { - private static final String COMMIT_MSG = - "Add addPatchSet permission to all projects"; + private static final String COMMIT_MSG = "Add addPatchSet permission to all projects"; private final GitRepositoryManager repoManager; private final AllProjectsName allProjectsName; @@ -48,7 +45,8 @@ public class Schema_128 extends SchemaVersion { private final PersonIdent serverUser; @Inject - Schema_128(Provider prior, + Schema_128( + Provider prior, GitRepositoryManager repoManager, AllProjectsName allProjectsName, SystemGroupBackend systemGroupBackend, @@ -63,14 +61,13 @@ public class Schema_128 extends SchemaVersion { @Override protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException { try (Repository git = repoManager.openRepository(allProjectsName); - MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, - allProjectsName, git)) { + MetaDataUpdate md = + new MetaDataUpdate(GitReferenceUpdated.DISABLED, allProjectsName, git)) { ProjectConfig config = ProjectConfig.read(md); GroupReference registered = systemGroupBackend.getGroup(REGISTERED_USERS); AccessSection refsFor = config.getAccessSection("refs/for/*", true); - grant(config, refsFor, Permission.ADD_PATCH_SET, - false, false, registered); + grant(config, refsFor, Permission.ADD_PATCH_SET, false, false, registered); md.getCommitBuilder().setAuthor(serverUser); md.getCommitBuilder().setCommitter(serverUser); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_129.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_129.java index de02ec73a6..73ce3c3e48 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_129.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_129.java @@ -19,7 +19,6 @@ import com.google.gwtorm.jdbc.JdbcSchema; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - import java.sql.SQLException; import java.sql.Statement; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_130.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_130.java index 5dcd981dd0..5971c7b457 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_130.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_130.java @@ -23,28 +23,27 @@ import com.google.gerrit.server.git.MetaDataUpdate; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.PersonIdent; -import org.eclipse.jgit.lib.Repository; - import java.io.IOException; import java.util.SortedSet; import java.util.TreeSet; import java.util.stream.Collectors; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.PersonIdent; +import org.eclipse.jgit.lib.Repository; public class Schema_130 extends SchemaVersion { private static final String COMMIT_MSG = "Remove force option from 'Push Annotated Tag' permission\n" - + "\n" - + "The force option on 'Push Annotated Tag' had no effect and is no longer\n" - + "supported."; + + "\n" + + "The force option on 'Push Annotated Tag' had no effect and is no longer\n" + + "supported."; private final GitRepositoryManager repoManager; private final PersonIdent serverUser; @Inject - Schema_130(Provider prior, + Schema_130( + Provider prior, GitRepositoryManager repoManager, @GerritPersonIdent PersonIdent serverUser) { super(prior); @@ -59,8 +58,7 @@ public class Schema_130 extends SchemaVersion { ui.message("\tMigrating " + repoList.size() + " repositories ..."); for (Project.NameKey projectName : repoList) { try (Repository git = repoManager.openRepository(projectName); - MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, - projectName, git)) { + MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, projectName, git)) { ProjectConfigSchemaUpdate cfg = ProjectConfigSchemaUpdate.read(md); cfg.removeForceFromPermission("pushTag"); if (cfg.isUpdated()) { @@ -71,10 +69,7 @@ public class Schema_130 extends SchemaVersion { throw new OrmException("Cannot migrate project " + projectName, ex); } } - ui.message("\tMigration completed: " + repoUpgraded.size() - + " repositories updated:"); - ui.message("\t" - + repoUpgraded.stream().map(n -> n.get()) - .collect(Collectors.joining(" "))); + ui.message("\tMigration completed: " + repoUpgraded.size() + " repositories updated:"); + ui.message("\t" + repoUpgraded.stream().map(n -> n.get()).collect(Collectors.joining(" "))); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_131.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_131.java index 4e581c8abc..725e813209 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_131.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_131.java @@ -24,15 +24,13 @@ import com.google.gerrit.server.git.ProjectConfig; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.PersonIdent; -import org.eclipse.jgit.lib.Repository; - import java.io.IOException; import java.util.SortedSet; import java.util.TreeSet; import java.util.stream.Collectors; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.PersonIdent; +import org.eclipse.jgit.lib.Repository; public class Schema_131 extends SchemaVersion { private static final String COMMIT_MSG = @@ -42,7 +40,8 @@ public class Schema_131 extends SchemaVersion { private final PersonIdent serverUser; @Inject - Schema_131(Provider prior, + Schema_131( + Provider prior, GitRepositoryManager repoManager, @GerritPersonIdent PersonIdent serverUser) { super(prior); @@ -57,8 +56,7 @@ public class Schema_131 extends SchemaVersion { ui.message("\tMigrating " + repoList.size() + " repositories ..."); for (Project.NameKey projectName : repoList) { try (Repository git = repoManager.openRepository(projectName); - MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, - projectName, git)) { + MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, projectName, git)) { ProjectConfig config = ProjectConfig.read(md); if (config.hasLegacyPermissions()) { md.getCommitBuilder().setAuthor(serverUser); @@ -71,10 +69,7 @@ public class Schema_131 extends SchemaVersion { throw new OrmException("Cannot migrate project " + projectName, ex); } } - ui.message("\tMigration completed: " + repoUpgraded.size() - + " repositories updated:"); - ui.message("\t" - + repoUpgraded.stream().map(n -> n.get()) - .collect(Collectors.joining(" "))); + ui.message("\tMigration completed: " + repoUpgraded.size() + " repositories updated:"); + ui.message("\t" + repoUpgraded.stream().map(n -> n.get()).collect(Collectors.joining(" "))); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_135.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_135.java index 08b2366025..8e4d2e4398 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_135.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_135.java @@ -34,14 +34,12 @@ import com.google.gerrit.server.group.SystemGroupBackend; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.PersonIdent; -import org.eclipse.jgit.lib.Repository; - import java.io.IOException; import java.util.Set; import java.util.stream.Stream; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.PersonIdent; +import org.eclipse.jgit.lib.Repository; public class Schema_135 extends SchemaVersion { private static final String COMMIT_MSG = @@ -53,7 +51,8 @@ public class Schema_135 extends SchemaVersion { private final PersonIdent serverUser; @Inject - Schema_135(Provider prior, + Schema_135( + Provider prior, GitRepositoryManager repoManager, AllProjectsName allProjectsName, SystemGroupBackend systemGroupBackend, @@ -68,13 +67,12 @@ public class Schema_135 extends SchemaVersion { @Override protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException { try (Repository git = repoManager.openRepository(allProjectsName); - MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, - allProjectsName, git)) { + MetaDataUpdate md = + new MetaDataUpdate(GitReferenceUpdated.DISABLED, allProjectsName, git)) { ProjectConfig config = ProjectConfig.read(md); AccessSection meta = config.getAccessSection(RefNames.REFS_CONFIG, true); - Permission createRefsMetaConfigPermission = - meta.getPermission(Permission.CREATE, true); + Permission createRefsMetaConfigPermission = meta.getPermission(Permission.CREATE, true); Set groups = Stream.concat( @@ -89,8 +87,7 @@ public class Schema_135 extends SchemaVersion { .collect(toSet()); for (GroupReference group : groups) { - createRefsMetaConfigPermission - .add(new PermissionRule(config.resolve(group))); + createRefsMetaConfigPermission.add(new PermissionRule(config.resolve(group))); } md.getCommitBuilder().setAuthor(serverUser); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_139.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_139.java index 614320bacc..be919a1943 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_139.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_139.java @@ -34,14 +34,6 @@ import com.google.gwtorm.server.OrmDuplicateKeyException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.lib.BatchRefUpdate; -import org.eclipse.jgit.lib.NullProgressMonitor; -import org.eclipse.jgit.lib.PersonIdent; -import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.revwalk.RevWalk; - import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; @@ -51,137 +43,157 @@ import java.util.EnumSet; import java.util.HashMap; import java.util.Map; import java.util.Set; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.BatchRefUpdate; +import org.eclipse.jgit.lib.NullProgressMonitor; +import org.eclipse.jgit.lib.PersonIdent; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevWalk; public class Schema_139 extends SchemaVersion { - private static final String MSG = "Migrate project watches to git"; + private static final String MSG = "Migrate project watches to git"; - private final GitRepositoryManager repoManager; - private final AllUsersName allUsersName; - private final PersonIdent serverUser; + private final GitRepositoryManager repoManager; + private final AllUsersName allUsersName; + private final PersonIdent serverUser; - @Inject - Schema_139(Provider prior, - GitRepositoryManager repoManager, - AllUsersName allUsersName, - @GerritPersonIdent PersonIdent serverUser) { - super(prior); - this.repoManager = repoManager; - this.allUsersName = allUsersName; - this.serverUser = serverUser; - } + @Inject + Schema_139( + Provider prior, + GitRepositoryManager repoManager, + AllUsersName allUsersName, + @GerritPersonIdent PersonIdent serverUser) { + super(prior); + this.repoManager = repoManager; + this.allUsersName = allUsersName; + this.serverUser = serverUser; + } - @Override - protected void migrateData(ReviewDb db, UpdateUI ui) - throws OrmException, SQLException { - ListMultimap imports = - MultimapBuilder.hashKeys().arrayListValues().build(); - try (Statement stmt = ((JdbcSchema) db).getConnection().createStatement(); - ResultSet rs = stmt.executeQuery( - "SELECT " - + "account_id, " - + "project_name, " - + "filter, " - + "notify_abandoned_changes, " - + "notify_all_comments, " - + "notify_new_changes, " - + "notify_new_patch_sets, " - + "notify_submitted_changes " - + "FROM account_project_watches")) { - while (rs.next()) { - Account.Id accountId = new Account.Id(rs.getInt(1)); - ProjectWatch.Builder b = ProjectWatch.builder() - .project(new Project.NameKey(rs.getString(2))) - .filter(rs.getString(3)) - .notifyAbandonedChanges(rs.getBoolean(4)) - .notifyAllComments(rs.getBoolean(5)) - .notifyNewChanges(rs.getBoolean(6)) - .notifyNewPatchSets(rs.getBoolean(7)) - .notifySubmittedChanges(rs.getBoolean(8)); - imports.put(accountId, b.build()); - } - } + @Override + protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException { + ListMultimap imports = + MultimapBuilder.hashKeys().arrayListValues().build(); + try (Statement stmt = ((JdbcSchema) db).getConnection().createStatement(); + ResultSet rs = + stmt.executeQuery( + "SELECT " + + "account_id, " + + "project_name, " + + "filter, " + + "notify_abandoned_changes, " + + "notify_all_comments, " + + "notify_new_changes, " + + "notify_new_patch_sets, " + + "notify_submitted_changes " + + "FROM account_project_watches")) { + while (rs.next()) { + Account.Id accountId = new Account.Id(rs.getInt(1)); + ProjectWatch.Builder b = + ProjectWatch.builder() + .project(new Project.NameKey(rs.getString(2))) + .filter(rs.getString(3)) + .notifyAbandonedChanges(rs.getBoolean(4)) + .notifyAllComments(rs.getBoolean(5)) + .notifyNewChanges(rs.getBoolean(6)) + .notifyNewPatchSets(rs.getBoolean(7)) + .notifySubmittedChanges(rs.getBoolean(8)); + imports.put(accountId, b.build()); + } + } - if (imports.isEmpty()) { - return; - } + if (imports.isEmpty()) { + return; + } - try (Repository git = repoManager.openRepository(allUsersName); - RevWalk rw = new RevWalk(git)) { - BatchRefUpdate bru = git.getRefDatabase().newBatchUpdate(); - bru.setRefLogIdent(serverUser); - bru.setRefLogMessage(MSG, false); + try (Repository git = repoManager.openRepository(allUsersName); + RevWalk rw = new RevWalk(git)) { + BatchRefUpdate bru = git.getRefDatabase().newBatchUpdate(); + bru.setRefLogIdent(serverUser); + bru.setRefLogMessage(MSG, false); - for (Map.Entry> e : imports.asMap() - .entrySet()) { - Map> projectWatches = new HashMap<>(); - for (ProjectWatch projectWatch : e.getValue()) { - ProjectWatchKey key = ProjectWatchKey.create(projectWatch.project(), - projectWatch.filter()); - if (projectWatches.containsKey(key)) { - throw new OrmDuplicateKeyException( - "Duplicate key for watched project: " + key.toString()); - } - Set notifyValues = EnumSet.noneOf(NotifyType.class); - if (projectWatch.notifyAbandonedChanges()) { - notifyValues.add(NotifyType.ABANDONED_CHANGES); - } - if (projectWatch.notifyAllComments()) { - notifyValues.add(NotifyType.ALL_COMMENTS); - } - if (projectWatch.notifyNewChanges()) { - notifyValues.add(NotifyType.NEW_CHANGES); - } - if (projectWatch.notifyNewPatchSets()) { - notifyValues.add(NotifyType.NEW_PATCHSETS); - } - if (projectWatch.notifySubmittedChanges()) { - notifyValues.add(NotifyType.SUBMITTED_CHANGES); - } - projectWatches.put(key, notifyValues); - } + for (Map.Entry> e : imports.asMap().entrySet()) { + Map> projectWatches = new HashMap<>(); + for (ProjectWatch projectWatch : e.getValue()) { + ProjectWatchKey key = + ProjectWatchKey.create(projectWatch.project(), projectWatch.filter()); + if (projectWatches.containsKey(key)) { + throw new OrmDuplicateKeyException( + "Duplicate key for watched project: " + key.toString()); + } + Set notifyValues = EnumSet.noneOf(NotifyType.class); + if (projectWatch.notifyAbandonedChanges()) { + notifyValues.add(NotifyType.ABANDONED_CHANGES); + } + if (projectWatch.notifyAllComments()) { + notifyValues.add(NotifyType.ALL_COMMENTS); + } + if (projectWatch.notifyNewChanges()) { + notifyValues.add(NotifyType.NEW_CHANGES); + } + if (projectWatch.notifyNewPatchSets()) { + notifyValues.add(NotifyType.NEW_PATCHSETS); + } + if (projectWatch.notifySubmittedChanges()) { + notifyValues.add(NotifyType.SUBMITTED_CHANGES); + } + projectWatches.put(key, notifyValues); + } - try (MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, - allUsersName, git, bru)) { - md.getCommitBuilder().setAuthor(serverUser); - md.getCommitBuilder().setCommitter(serverUser); - md.setMessage(MSG); + try (MetaDataUpdate md = + new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, git, bru)) { + md.getCommitBuilder().setAuthor(serverUser); + md.getCommitBuilder().setCommitter(serverUser); + md.setMessage(MSG); - WatchConfig watchConfig = new WatchConfig(e.getKey()); - watchConfig.load(md); - watchConfig.setProjectWatches(projectWatches); - watchConfig.commit(md); - } - } - bru.execute(rw, NullProgressMonitor.INSTANCE); - } catch (IOException | ConfigInvalidException ex) { - throw new OrmException(ex); - } - } + WatchConfig watchConfig = new WatchConfig(e.getKey()); + watchConfig.load(md); + watchConfig.setProjectWatches(projectWatches); + watchConfig.commit(md); + } + } + bru.execute(rw, NullProgressMonitor.INSTANCE); + } catch (IOException | ConfigInvalidException ex) { + throw new OrmException(ex); + } + } - @AutoValue - abstract static class ProjectWatch { - abstract Project.NameKey project(); - abstract @Nullable String filter(); - abstract boolean notifyAbandonedChanges(); - abstract boolean notifyAllComments(); - abstract boolean notifyNewChanges(); - abstract boolean notifyNewPatchSets(); - abstract boolean notifySubmittedChanges(); + @AutoValue + abstract static class ProjectWatch { + abstract Project.NameKey project(); - static Builder builder() { - return new AutoValue_Schema_139_ProjectWatch.Builder(); - } + abstract @Nullable String filter(); - @AutoValue.Builder - abstract static class Builder { - abstract Builder project(Project.NameKey project); - abstract Builder filter(@Nullable String filter); - abstract Builder notifyAbandonedChanges(boolean notifyAbandonedChanges); - abstract Builder notifyAllComments(boolean notifyAllComments); - abstract Builder notifyNewChanges(boolean notifyNewChanges); - abstract Builder notifyNewPatchSets(boolean notifyNewPatchSets); - abstract Builder notifySubmittedChanges(boolean notifySubmittedChanges); - abstract ProjectWatch build(); - } - } + abstract boolean notifyAbandonedChanges(); + + abstract boolean notifyAllComments(); + + abstract boolean notifyNewChanges(); + + abstract boolean notifyNewPatchSets(); + + abstract boolean notifySubmittedChanges(); + + static Builder builder() { + return new AutoValue_Schema_139_ProjectWatch.Builder(); + } + + @AutoValue.Builder + abstract static class Builder { + abstract Builder project(Project.NameKey project); + + abstract Builder filter(@Nullable String filter); + + abstract Builder notifyAbandonedChanges(boolean notifyAbandonedChanges); + + abstract Builder notifyAllComments(boolean notifyAllComments); + + abstract Builder notifyNewChanges(boolean notifyNewChanges); + + abstract Builder notifyNewPatchSets(boolean notifyNewPatchSets); + + abstract Builder notifySubmittedChanges(boolean notifySubmittedChanges); + + abstract ProjectWatch build(); + } + } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_83.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_83.java index f703a35d30..decbfb1175 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_83.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_83.java @@ -22,11 +22,12 @@ public class Schema_83 extends SchemaVersion { @Inject Schema_83() { - super(new Provider() { - @Override - public SchemaVersion get() { - throw new ProvisionException("Upgrade first to 2.8 or 2.9"); - } - }); + super( + new Provider() { + @Override + public SchemaVersion get() { + throw new ProvisionException("Upgrade first to 2.8 or 2.9"); + } + }); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_87.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_87.java index 8f4028dbe7..8ab949e9ff 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_87.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_87.java @@ -20,7 +20,6 @@ import com.google.gerrit.server.group.SystemGroupBackend; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; @@ -35,24 +34,20 @@ public class Schema_87 extends SchemaVersion { } @Override - protected void migrateData(ReviewDb db, UpdateUI ui) - throws OrmException, SQLException { + protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException { for (AccountGroup.Id id : scanSystemGroups(db)) { AccountGroup group = db.accountGroups().get(id); - if (group != null - && SystemGroupBackend.isSystemGroup(group.getGroupUUID())) { + if (group != null && SystemGroupBackend.isSystemGroup(group.getGroupUUID())) { db.accountGroups().delete(Collections.singleton(group)); - db.accountGroupNames().deleteKeys( - Collections.singleton(group.getNameKey())); + db.accountGroupNames().deleteKeys(Collections.singleton(group.getNameKey())); } } } - private Set scanSystemGroups(ReviewDb db) - throws SQLException { + private Set scanSystemGroups(ReviewDb db) throws SQLException { try (Statement stmt = newStatement(db); - ResultSet rs = stmt.executeQuery( - "SELECT group_id FROM account_groups WHERE group_type = 'SYSTEM'")) { + ResultSet rs = + stmt.executeQuery("SELECT group_id FROM account_groups WHERE group_type = 'SYSTEM'")) { Set ids = new HashSet<>(); while (rs.next()) { ids.add(new AccountGroup.Id(rs.getInt(1))); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_89.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_89.java index a818e0dce9..de84993214 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_89.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_89.java @@ -21,7 +21,6 @@ import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.StatementExecutor; import com.google.inject.Inject; import com.google.inject.Provider; - import java.sql.SQLException; public class Schema_89 extends SchemaVersion { @@ -31,14 +30,11 @@ public class Schema_89 extends SchemaVersion { } @Override - protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, - SQLException { + protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException { SqlDialect dialect = ((JdbcSchema) db).getDialect(); try (StatementExecutor e = newExecutor(db)) { - dialect.dropIndex(e, "patch_set_approvals", - "patch_set_approvals_openByUser"); - dialect.dropIndex(e, "patch_set_approvals", - "patch_set_approvals_closedByU"); + dialect.dropIndex(e, "patch_set_approvals", "patch_set_approvals_openByUser"); + dialect.dropIndex(e, "patch_set_approvals", "patch_set_approvals_closedByU"); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_90.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_90.java index 8f1fc5d4f8..d8f02ae147 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_90.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_90.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.schema; import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.inject.Inject; import com.google.inject.Provider; - import java.sql.SQLException; import java.sql.Statement; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_94.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_94.java index 02f78ca716..5a875623e0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_94.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_94.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.schema; import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.inject.Inject; import com.google.inject.Provider; - import java.sql.SQLException; import java.sql.Statement; @@ -30,8 +29,7 @@ public class Schema_94 extends SchemaVersion { @Override protected void migrateData(ReviewDb db, UpdateUI ui) throws SQLException { try (Statement stmt = newStatement(db)) { - stmt.execute("CREATE INDEX patch_sets_byRevision" - + " ON patch_sets (revision)"); + stmt.execute("CREATE INDEX patch_sets_byRevision" + " ON patch_sets (revision)"); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_95.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_95.java index 1c839f7281..0ce0294dac 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_95.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_95.java @@ -18,11 +18,9 @@ import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - -import org.eclipse.jgit.errors.ConfigInvalidException; - import java.io.IOException; import java.sql.SQLException; +import org.eclipse.jgit.errors.ConfigInvalidException; public class Schema_95 extends SchemaVersion { private final AllUsersCreator allUsersCreator; @@ -34,8 +32,7 @@ public class Schema_95 extends SchemaVersion { } @Override - protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, - SQLException { + protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException { try { allUsersCreator.create(); } catch (IOException | ConfigInvalidException e) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_98.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_98.java index 752dcd8dcc..4206dce31c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_98.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_98.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.schema; import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.inject.Inject; import com.google.inject.Provider; - import java.sql.SQLException; import java.sql.Statement; @@ -29,12 +28,12 @@ public class Schema_98 extends SchemaVersion { @Override protected void migrateData(ReviewDb db, UpdateUI ui) throws SQLException { - ui.message("Migrate user preference showUserInReview to " - + "reviewCategoryStrategy"); + ui.message("Migrate user preference showUserInReview to " + "reviewCategoryStrategy"); try (Statement stmt = newStatement(db)) { - stmt.executeUpdate("UPDATE accounts SET " - + "REVIEW_CATEGORY_STRATEGY='NAME' " - + "WHERE (SHOW_USER_IN_REVIEW='Y')"); + stmt.executeUpdate( + "UPDATE accounts SET " + + "REVIEW_CATEGORY_STRATEGY='NAME' " + + "WHERE (SHOW_USER_IN_REVIEW='Y')"); } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/ScriptRunner.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/ScriptRunner.java index 684a72e32c..adee5fc9cc 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/ScriptRunner.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/ScriptRunner.java @@ -21,7 +21,6 @@ import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gwtorm.jdbc.JdbcSchema; import com.google.gwtorm.schema.sql.SqlDialect; import com.google.gwtorm.server.OrmException; - import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -37,11 +36,11 @@ class ScriptRunner { private final String name; private final List commands; - static final ScriptRunner NOOP = new ScriptRunner(null, null) { - @Override - void run(final ReviewDb db) { - } - }; + static final ScriptRunner NOOP = + new ScriptRunner(null, null) { + @Override + void run(final ReviewDb db) {} + }; ScriptRunner(final String scriptName, final InputStream script) { this.name = scriptName; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/UpdateUI.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/UpdateUI.java index eff55754fa..b43aaa6559 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/UpdateUI.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/UpdateUI.java @@ -16,7 +16,6 @@ package com.google.gerrit.server.schema; import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.StatementExecutor; - import java.util.List; public interface UpdateUI { @@ -26,6 +25,5 @@ public interface UpdateUI { boolean isBatch(); - void pruneSchema(StatementExecutor e, List pruneList) - throws OrmException; + void pruneSchema(StatementExecutor e, List pruneList) throws OrmException; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/securestore/DefaultSecureStore.java b/gerrit-server/src/main/java/com/google/gerrit/server/securestore/DefaultSecureStore.java index c8190a6656..677e9ff5b8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/securestore/DefaultSecureStore.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/securestore/DefaultSecureStore.java @@ -18,19 +18,17 @@ import com.google.gerrit.common.FileUtil; import com.google.gerrit.server.config.SitePaths; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.internal.storage.file.LockFile; -import org.eclipse.jgit.lib.Constants; -import org.eclipse.jgit.storage.file.FileBasedConfig; -import org.eclipse.jgit.util.FS; - import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.internal.storage.file.LockFile; +import org.eclipse.jgit.lib.Constants; +import org.eclipse.jgit.storage.file.FileBasedConfig; +import org.eclipse.jgit.util.FS; @Singleton public class DefaultSecureStore extends SecureStore { @@ -56,8 +54,8 @@ public class DefaultSecureStore extends SecureStore { } @Override - public synchronized String[] getListForPlugin(String pluginName, String section, - String subsection, String name) { + public synchronized String[] getListForPlugin( + String pluginName, String section, String subsection, String name) { FileBasedConfig cfg = null; if (pluginSec.containsKey(pluginName)) { cfg = pluginSec.get(pluginName); @@ -78,8 +76,7 @@ public class DefaultSecureStore extends SecureStore { } @Override - public void setList(String section, String subsection, String name, - List values) { + public void setList(String section, String subsection, String name, List values) { if (values != null) { sec.setStringList(section, subsection, name, values); } else { @@ -127,8 +124,7 @@ public class DefaultSecureStore extends SecureStore { throw new IOException("Cannot lock " + path); } try { - FileUtil.chmod(0600, new File(path.getParentFile(), path.getName() - + ".lock")); + FileUtil.chmod(0600, new File(path.getParentFile(), path.getName() + ".lock")); lf.write(out); if (!lf.commit()) { throw new IOException("Cannot commit write to " + path); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStore.java b/gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStore.java index 122e26b5d2..5c87391586 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStore.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStore.java @@ -15,29 +15,25 @@ package com.google.gerrit.server.securestore; import com.google.common.collect.Lists; - import java.util.List; /** * Abstract class for providing new SecureStore implementation for Gerrit. * - * SecureStore is responsible for storing sensitive data like passwords in a - * secure manner. + *

SecureStore is responsible for storing sensitive data like passwords in a secure manner. * - * It is implementator's responsibility to encrypt and store values. + *

It is implementator's responsibility to encrypt and store values. * - * To deploy new SecureStore one needs to provide a jar file with explicitly one - * class that extends {@code SecureStore} and put it in Gerrit server. Then run: + *

To deploy new SecureStore one needs to provide a jar file with explicitly one class that + * extends {@code SecureStore} and put it in Gerrit server. Then run: * - * `java -jar gerrit.war SwitchSecureStore -d $gerrit_site --new-secure-store-lib - * $path_to_new_secure_store.jar` + *

`java -jar gerrit.war SwitchSecureStore -d $gerrit_site --new-secure-store-lib + * $path_to_new_secure_store.jar` * - * on stopped Gerrit instance. + *

on stopped Gerrit instance. */ public abstract class SecureStore { - /** - * Describes {@link SecureStore} entry - */ + /** Describes {@link SecureStore} entry */ public static class EntryKey { public final String name; public final String section; @@ -58,8 +54,8 @@ public abstract class SecureStore { } /** - * Extract decrypted value of stored property from SecureStore or {@code null} - * when property was not found. + * Extract decrypted value of stored property from SecureStore or {@code null} when property was + * not found. * * @param section * @param subsection @@ -75,8 +71,8 @@ public abstract class SecureStore { } /** - * Extract decrypted value of stored plugin config property from SecureStore - * or {@code null} when property was not found. + * Extract decrypted value of stored plugin config property from SecureStore or {@code null} when + * property was not found. * * @param pluginName * @param section @@ -84,8 +80,8 @@ public abstract class SecureStore { * @param name * @return decrypted String value or {@code null} if not found */ - public final String getForPlugin(String pluginName, String section, - String subsection, String name) { + public final String getForPlugin( + String pluginName, String section, String subsection, String name) { String[] values = getListForPlugin(pluginName, section, subsection, name); if (values != null && values.length > 0) { return values[0]; @@ -94,8 +90,8 @@ public abstract class SecureStore { } /** - * Extract list of plugin config values from SecureStore and decrypt every - * value in that list, or {@code null} when property was not found. + * Extract list of plugin config values from SecureStore and decrypt every value in that list, or + * {@code null} when property was not found. * * @param pluginName * @param section @@ -103,12 +99,12 @@ public abstract class SecureStore { * @param name * @return decrypted list of string values or {@code null} */ - public abstract String[] getListForPlugin(String pluginName, String section, - String subsection, String name); + public abstract String[] getListForPlugin( + String pluginName, String section, String subsection, String name); /** - * Extract list of values from SecureStore and decrypt every value in that - * list or {@code null} when property was not found. + * Extract list of values from SecureStore and decrypt every value in that list or {@code null} + * when property was not found. * * @param section * @param subsection @@ -120,7 +116,7 @@ public abstract class SecureStore { /** * Store single value in SecureStore. * - * This method is responsible for encrypting value and storing it. + *

This method is responsible for encrypting value and storing it. * * @param section * @param subsection @@ -134,7 +130,7 @@ public abstract class SecureStore { /** * Store list of values in SecureStore. * - * This method is responsible for encrypting all values in the list and storing them. + *

This method is responsible for encrypting all values in the list and storing them. * * @param section * @param subsection @@ -144,8 +140,7 @@ public abstract class SecureStore { public abstract void setList(String section, String subsection, String name, List values); /** - * Remove value for given {@code section}, {@code subsection} and {@code name} - * from SecureStore. + * Remove value for given {@code section}, {@code subsection} and {@code name} from SecureStore. * * @param section * @param subsection @@ -153,8 +148,6 @@ public abstract class SecureStore { */ public abstract void unset(String section, String subsection, String name); - /** - * @return list of stored entries. - */ + /** @return list of stored entries. */ public abstract Iterable list(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStoreClassName.java b/gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStoreClassName.java index 07635bd4ae..0247fc112a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStoreClassName.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStoreClassName.java @@ -3,10 +3,8 @@ package com.google.gerrit.server.securestore; import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.google.inject.BindingAnnotation; - import java.lang.annotation.Retention; @Retention(RUNTIME) @BindingAnnotation -public @interface SecureStoreClassName { -} +public @interface SecureStoreClassName {} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStoreProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStoreProvider.java index 99127d8865..88c2072f70 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStoreProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStoreProvider.java @@ -22,16 +22,13 @@ import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.nio.file.Path; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.nio.file.Path; - @Singleton public class SecureStoreProvider implements Provider { - private static final Logger log = LoggerFactory - .getLogger(SecureStoreProvider.class); + private static final Logger log = LoggerFactory.getLogger(SecureStoreProvider.class); private final Path libdir; private final Injector injector; @@ -39,9 +36,7 @@ public class SecureStoreProvider implements Provider { @Inject protected SecureStoreProvider( - Injector injector, - SitePaths sitePaths, - @Nullable @SecureStoreClassName String className) { + Injector injector, SitePaths sitePaths, @Nullable @SecureStoreClassName String className) { this.injector = injector; this.libdir = sitePaths.lib_dir; this.className = className; @@ -62,8 +57,7 @@ public class SecureStoreProvider implements Provider { try { return (Class) Class.forName(className); } catch (ClassNotFoundException e) { - String msg = - String.format("Cannot load secure store class: %s", className); + String msg = String.format("Cannot load secure store class: %s", className); log.error(msg, e); throw new RuntimeException(msg, e); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ssh/NoSshInfo.java b/gerrit-server/src/main/java/com/google/gerrit/server/ssh/NoSshInfo.java index 6ceec2d446..91a949bf1c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/ssh/NoSshInfo.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/ssh/NoSshInfo.java @@ -15,7 +15,6 @@ package com.google.gerrit.server.ssh; import com.jcraft.jsch.HostKey; - import java.util.Collections; import java.util.List; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ssh/NoSshKeyCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/ssh/NoSshKeyCache.java index f3250d95c0..798ce38071 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/ssh/NoSshKeyCache.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/ssh/NoSshKeyCache.java @@ -34,12 +34,10 @@ public class NoSshKeyCache implements SshKeyCache, SshKeyCreator { } @Override - public void evict(String username) { - } + public void evict(String username) {} @Override - public AccountSshKey create(AccountSshKey.Id id, String encoded) - throws InvalidSshKeyException { + public AccountSshKey create(AccountSshKey.Id id, String encoded) throws InvalidSshKeyException { throw new InvalidSshKeyException(); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ssh/NoSshModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/ssh/NoSshModule.java index 8781d46a3d..abbbdaea6b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/ssh/NoSshModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/ssh/NoSshModule.java @@ -16,9 +16,7 @@ package com.google.gerrit.server.ssh; import com.google.inject.AbstractModule; -/** - * Disables the SSH support by stubbing out relevant objects. - */ +/** Disables the SSH support by stubbing out relevant objects. */ public class NoSshModule extends AbstractModule { @Override protected void configure() { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshAddressesModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshAddressesModule.java index f768c5ebc7..70a6fce99d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshAddressesModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshAddressesModule.java @@ -20,27 +20,23 @@ import com.google.gerrit.server.util.SocketUtil; import com.google.inject.AbstractModule; import com.google.inject.Provides; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.Config; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import org.eclipse.jgit.lib.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class SshAddressesModule extends AbstractModule { - private static final Logger log = - LoggerFactory.getLogger(SshAddressesModule.class); + private static final Logger log = LoggerFactory.getLogger(SshAddressesModule.class); public static final int DEFAULT_PORT = 29418; public static final int IANA_SSH_PORT = 22; @Override - protected void configure() { - } + protected void configure() {} @Provides @Singleton @@ -76,8 +72,8 @@ public class SshAddressesModule extends AbstractModule { @Provides @Singleton @SshAdvertisedAddresses - List getAdvertisedAddresses(@GerritServerConfig Config cfg, - @SshListenAddresses List listen) { + List getAdvertisedAddresses( + @GerritServerConfig Config cfg, @SshListenAddresses List listen) { String[] want = cfg.getStringList("sshd", null, "advertisedaddress"); if (want.length > 0) { return Arrays.asList(want); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshAdvertisedAddresses.java b/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshAdvertisedAddresses.java index 4a6eb29448..c047fccc1b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshAdvertisedAddresses.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshAdvertisedAddresses.java @@ -17,14 +17,11 @@ package com.google.gerrit.server.ssh; import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.google.inject.BindingAnnotation; - import java.lang.annotation.Retention; /** - * Marker on the list of {@link java.net.SocketAddress}es configured to be - * advertised by the server. + * Marker on the list of {@link java.net.SocketAddress}es configured to be advertised by the server. */ @Retention(RUNTIME) @BindingAnnotation -public @interface SshAdvertisedAddresses { -} +public @interface SshAdvertisedAddresses {} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshInfo.java b/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshInfo.java index 0081cb4431..430846d72e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshInfo.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshInfo.java @@ -15,7 +15,6 @@ package com.google.gerrit.server.ssh; import com.jcraft.jsch.HostKey; - import java.util.List; public interface SshInfo { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshKeyCreator.java b/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshKeyCreator.java index fd0c69cbd0..a371490a58 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshKeyCreator.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshKeyCreator.java @@ -18,6 +18,5 @@ import com.google.gerrit.common.errors.InvalidSshKeyException; import com.google.gerrit.reviewdb.client.AccountSshKey; public interface SshKeyCreator { - AccountSshKey create(AccountSshKey.Id id, String encoded) - throws InvalidSshKeyException; + AccountSshKey create(AccountSshKey.Id id, String encoded) throws InvalidSshKeyException; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshListenAddresses.java b/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshListenAddresses.java index a4e238d504..68893f3f9b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshListenAddresses.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshListenAddresses.java @@ -17,14 +17,12 @@ package com.google.gerrit.server.ssh; import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.google.inject.BindingAnnotation; - import java.lang.annotation.Retention; /** - * Marker on the list of {@link java.net.SocketAddress}es on which the SSH - * daemon is configured to listen. + * Marker on the list of {@link java.net.SocketAddress}es on which the SSH daemon is configured to + * listen. */ @Retention(RUNTIME) @BindingAnnotation -public @interface SshListenAddresses { -} +public @interface SshListenAddresses {} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/tools/ToolsCatalog.java b/gerrit-server/src/main/java/com/google/gerrit/server/tools/ToolsCatalog.java index 9e48aadcaa..b616791af5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/tools/ToolsCatalog.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/tools/ToolsCatalog.java @@ -21,12 +21,6 @@ import com.google.gerrit.common.Nullable; import com.google.gerrit.common.Version; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.eclipse.jgit.lib.Constants; -import org.eclipse.jgit.util.RawParseUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -38,12 +32,16 @@ import java.util.Collections; import java.util.List; import java.util.SortedMap; import java.util.TreeMap; +import org.eclipse.jgit.lib.Constants; +import org.eclipse.jgit.util.RawParseUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Listing of all client side tools stored on this server. - *

- * Clients may download these tools through our file server, as they are - * packaged with our own software releases. + * + *

Clients may download these tools through our file server, as they are packaged with our own + * software releases. */ @Singleton public class ToolsCatalog { @@ -79,8 +77,7 @@ public class ToolsCatalog { private static SortedMap readToc() throws IOException { SortedMap toc = new TreeMap<>(); final BufferedReader br = - new BufferedReader(new InputStreamReader(new ByteArrayInputStream( - read("TOC")), UTF_8)); + new BufferedReader(new InputStreamReader(new ByteArrayInputStream(read("TOC")), UTF_8)); String line; while ((line = br.readLine()) != null) { if (line.length() > 0 && !line.startsWith("#")) { @@ -144,7 +141,8 @@ public class ToolsCatalog { /** A file served out of the tools root directory. */ public static class Entry { public enum Type { - DIR, FILE + DIR, + FILE } private final Type type; @@ -209,8 +207,7 @@ public class ToolsCatalog { final String version = Version.getVersion(); final int lf = RawParseUtils.nextLF(data, 0); if (version != null && lf < data.length) { - byte[] versionHeader = - Constants.encode("# From Gerrit Code Review " + version + "\n"); + byte[] versionHeader = Constants.encode("# From Gerrit Code Review " + version + "\n"); ByteArrayOutputStream buf = new ByteArrayOutputStream(); buf.write(data, 0, lf); @@ -224,7 +221,8 @@ public class ToolsCatalog { } private boolean isScript(byte[] data) { - return data != null && data.length > 3 // + return data != null + && data.length > 3 // && data[0] == '#' // && data[1] == '!' // && data[2] == '/'; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/FallbackRequestContext.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/FallbackRequestContext.java index 55c2992be0..de1555f985 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/util/FallbackRequestContext.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/FallbackRequestContext.java @@ -23,8 +23,8 @@ import com.google.inject.ProvisionException; import com.google.inject.Singleton; /** - * The default RequestContext to use when not in a request scope e.g. - * ThreadLocalRequestContext is not set. + * The default RequestContext to use when not in a request scope e.g. ThreadLocalRequestContext is + * not set. */ @Singleton public class FallbackRequestContext implements RequestContext { @@ -46,8 +46,7 @@ public class FallbackRequestContext implements RequestContext { return new Provider() { @Override public ReviewDb get() { - throw new ProvisionException( - "Automatic ReviewDb only available in request scope"); + throw new ProvisionException("Automatic ReviewDb only available in request scope"); } }; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/GuiceRequestScopePropagator.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/GuiceRequestScopePropagator.java index 1568228bc3..6dd5543e7c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/util/GuiceRequestScopePropagator.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/GuiceRequestScopePropagator.java @@ -24,7 +24,6 @@ import com.google.inject.Provider; import com.google.inject.servlet.ServletScopes; import com.google.inject.util.Providers; import com.google.inject.util.Types; - import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.net.SocketAddress; @@ -49,9 +48,7 @@ public class GuiceRequestScopePropagator extends RequestScopePropagator { this.peer = remotePeerProvider.get(); } - /** - * @see RequestScopePropagator#wrap(Callable) - */ + /** @see RequestScopePropagator#wrap(Callable) */ // ServletScopes#continueRequest is deprecated, but it's not obvious their // recommended replacement is an appropriate drop-in solution; see // https://gerrit-review.googlesource.com/83971 @@ -63,12 +60,10 @@ public class GuiceRequestScopePropagator extends RequestScopePropagator { // Request scopes appear to use specific keys in their map, instead of only // providers. Add bindings for both the key to the instance directly and the // provider to the instance to be safe. - seedMap.put(Key.get(typeOfProvider(String.class), CanonicalWebUrl.class), - Providers.of(url)); + seedMap.put(Key.get(typeOfProvider(String.class), CanonicalWebUrl.class), Providers.of(url)); seedMap.put(Key.get(String.class, CanonicalWebUrl.class), url); - seedMap.put(Key.get(typeOfProvider(SocketAddress.class), RemotePeer.class), - Providers.of(peer)); + seedMap.put(Key.get(typeOfProvider(SocketAddress.class), RemotePeer.class), Providers.of(peer)); seedMap.put(Key.get(SocketAddress.class, RemotePeer.class), peer); return ServletScopes.continueRequest(callable, seedMap); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/HostPlatform.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/HostPlatform.java index 074df0c127..066bd4b2bb 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/util/HostPlatform.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/HostPlatform.java @@ -32,16 +32,15 @@ public final class HostPlatform { private static boolean compute(String platform) { final String osDotName = - AccessController.doPrivileged(new PrivilegedAction() { - @Override - public String run() { - return System.getProperty("os.name"); - } - }); - return osDotName != null - && osDotName.toLowerCase().contains(platform); + AccessController.doPrivileged( + new PrivilegedAction() { + @Override + public String run() { + return System.getProperty("os.name"); + } + }); + return osDotName != null && osDotName.toLowerCase().contains(platform); } - private HostPlatform() { - } + private HostPlatform() {} } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/IdGenerator.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/IdGenerator.java index 78eb6572c3..e4d2890089 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/util/IdGenerator.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/IdGenerator.java @@ -16,7 +16,6 @@ package com.google.gerrit.server.util; import com.google.inject.Inject; import com.google.inject.Singleton; - import java.util.Random; import java.util.concurrent.atomic.AtomicInteger; @@ -71,23 +70,30 @@ public class IdGenerator { } private static short hi16(final int in) { - return (short) ( // - ((in >>> 24 & 0xff)) | // - ((in >>> 16 & 0xff) << 8) // - ); + return (short) + ( // + ((in >>> 24 & 0xff)) + | // + ((in >>> 16 & 0xff) << 8) // + ); } private static short lo16(final int in) { - return (short) ( // - ((in >>> 8 & 0xff)) | // - ((in & 0xff) << 8) // - ); + return (short) + ( // + ((in >>> 8 & 0xff)) + | // + ((in & 0xff) << 8) // + ); } private static int result(final short v0, final short v1) { - return ((v0 & 0xff) << 24) | // - (((v0 >>> 8) & 0xff) << 16) | // - ((v1 & 0xff) << 8) | // + return ((v0 & 0xff) << 24) + | // + (((v0 >>> 8) & 0xff) << 16) + | // + ((v1 & 0xff) << 8) + | // ((v1 >>> 8) & 0xff); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/LabelVote.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/LabelVote.java index 030383a318..538d7d1ce1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/util/LabelVote.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/LabelVote.java @@ -46,20 +46,17 @@ public abstract class LabelVote { if (sign == 0) { return create(text, (short) 1); } - return create(text.substring(0, i), - (short)(sign * Short.parseShort(text.substring(i + 1)))); + return create(text.substring(0, i), (short) (sign * Short.parseShort(text.substring(i + 1)))); } public static LabelVote parseWithEquals(String text) { checkArgument(!Strings.isNullOrEmpty(text), "Empty label vote"); int e = text.lastIndexOf('='); checkArgument(e >= 0, "Label vote missing '=': %s", text); - return create(text.substring(0, e), - Short.parseShort(text.substring(e + 1), text.length())); + return create(text.substring(0, e), Short.parseShort(text.substring(e + 1), text.length())); } - public static StringBuilder appendTo(StringBuilder sb, String label, - short value) { + public static StringBuilder appendTo(StringBuilder sb, String label, short value) { if (value == (short) 0) { return sb.append('-').append(label); } else if (value < 0) { @@ -77,12 +74,12 @@ public abstract class LabelVote { } public abstract String label(); + public abstract short value(); public String format() { // Max short string length is "-32768".length() == 6. - return appendTo(new StringBuilder(label().length() + 6), label(), value()) - .toString(); + return appendTo(new StringBuilder(label().length() + 6), label(), value()).toString(); } public String formatWithEquals() { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/MagicBranch.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/MagicBranch.java index 6e1952b8d4..75e14cb777 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/util/MagicBranch.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/MagicBranch.java @@ -16,18 +16,15 @@ package com.google.gerrit.server.util; import com.google.gerrit.common.data.Capable; import com.google.gerrit.reviewdb.client.Project; - +import java.io.IOException; +import java.util.Map; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.Map; - public final class MagicBranch { - private static final Logger log = - LoggerFactory.getLogger(MagicBranch.class); + private static final Logger log = LoggerFactory.getLogger(MagicBranch.class); public static final String NEW_CHANGE = "refs/for/"; public static final String NEW_DRAFT_CHANGE = "refs/drafts/"; @@ -66,15 +63,14 @@ public final class MagicBranch { } /** - * Checks if a (magic branch)/branch_name reference exists in the - * destination repository and only returns Capable.OK if it does not match any. + * Checks if a (magic branch)/branch_name reference exists in the destination repository and only + * returns Capable.OK if it does not match any. * - * These block the client from being able to even send us a pack file, as it - * is very unlikely the user passed the --force flag and the new commit is - * probably not going to fast-forward the branch. + *

These block the client from being able to even send us a pack file, as it is very unlikely + * the user passed the --force flag and the new commit is probably not going to fast-forward the + * branch. */ - public static Capable checkMagicBranchRefs(Repository repo, - Project project) { + public static Capable checkMagicBranchRefs(Repository repo, Project project) { Capable result = checkMagicBranchRef(NEW_CHANGE, repo, project); if (result != Capable.OK) { return result; @@ -91,8 +87,7 @@ public final class MagicBranch { return Capable.OK; } - private static Capable checkMagicBranchRef(String branchName, Repository repo, - Project project) { + private static Capable checkMagicBranchRef(String branchName, Repository repo, Project project) { Map blockingFors; try { blockingFors = repo.getRefDatabase().getRefs(branchName); @@ -103,15 +98,16 @@ public final class MagicBranch { } if (!blockingFors.isEmpty()) { String projName = project.getName(); - log.error("Repository '" + projName - + "' needs the following refs removed to receive changes: " - + blockingFors.keySet()); + log.error( + "Repository '" + + projName + + "' needs the following refs removed to receive changes: " + + blockingFors.keySet()); return new Capable("One or more " + branchName + " names blocks change upload"); } return Capable.OK; } - private MagicBranch() { - } + private MagicBranch() {} } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/ManualRequestContext.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/ManualRequestContext.java index 3115fd11ee..620a2bc950 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/util/ManualRequestContext.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/ManualRequestContext.java @@ -21,24 +21,26 @@ import com.google.gwtorm.server.SchemaFactory; import com.google.inject.Provider; import com.google.inject.util.Providers; -/** - * Closeable version of a {@link RequestContext} with manually-specified - * providers. - */ +/** Closeable version of a {@link RequestContext} with manually-specified providers. */ public class ManualRequestContext implements RequestContext, AutoCloseable { private final Provider userProvider; private final Provider db; private final ThreadLocalRequestContext requestContext; private final RequestContext old; - public ManualRequestContext(CurrentUser user, SchemaFactory schemaFactory, - ThreadLocalRequestContext requestContext) throws OrmException { + public ManualRequestContext( + CurrentUser user, + SchemaFactory schemaFactory, + ThreadLocalRequestContext requestContext) + throws OrmException { this(Providers.of(user), schemaFactory, requestContext); } - public ManualRequestContext(Provider userProvider, + public ManualRequestContext( + Provider userProvider, SchemaFactory schemaFactory, - ThreadLocalRequestContext requestContext) throws OrmException { + ThreadLocalRequestContext requestContext) + throws OrmException { this.userProvider = userProvider; this.db = Providers.of(schemaFactory.open()); this.requestContext = requestContext; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/MostSpecificComparator.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/MostSpecificComparator.java index 159763c2b7..4019851b64 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/util/MostSpecificComparator.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/MostSpecificComparator.java @@ -16,36 +16,31 @@ package com.google.gerrit.server.util; import com.google.gerrit.common.data.RefConfigSection; import com.google.gerrit.server.project.RefPattern; - -import org.apache.commons.lang.StringUtils; - import java.util.Comparator; +import org.apache.commons.lang.StringUtils; /** * Order the Ref Pattern by the most specific. This sort is done by: + * *

    - *
  • 1 - The minor value of Levenshtein string distance between the branch - * name and the regex string shortest example. A shorter distance is a more - * specific match. - *
  • 2 - Finites first, infinities after. - *
  • 3 - Number of transitions. More transitions is more specific. - *
  • 4 - Length of the expression text. + *
  • 1 - The minor value of Levenshtein string distance between the branch name and the regex + * string shortest example. A shorter distance is a more specific match. + *
  • 2 - Finites first, infinities after. + *
  • 3 - Number of transitions. More transitions is more specific. + *
  • 4 - Length of the expression text. *
* - * Levenshtein distance is a measure of the similarity between two strings. - * The distance is the number of deletions, insertions, or substitutions - * required to transform one string into another. + * Levenshtein distance is a measure of the similarity between two strings. The distance is the + * number of deletions, insertions, or substitutions required to transform one string into another. * - * For example, if given refs/heads/m* and refs/heads/*, the distances are 5 - * and 6. It means that refs/heads/m* is more specific because it's closer to - * refs/heads/master than refs/heads/*. + *

For example, if given refs/heads/m* and refs/heads/*, the distances are 5 and 6. It means that + * refs/heads/m* is more specific because it's closer to refs/heads/master than refs/heads/*. * - * Another example could be refs/heads/* and refs/heads/[a-zA-Z]*, the - * distances are both 6. Both are infinite, but refs/heads/[a-zA-Z]* has more - * transitions, which after all turns it more specific. + *

Another example could be refs/heads/* and refs/heads/[a-zA-Z]*, the distances are both 6. Both + * are infinite, but refs/heads/[a-zA-Z]* has more transitions, which after all turns it more + * specific. */ -public final class MostSpecificComparator implements - Comparator { +public final class MostSpecificComparator implements Comparator { private final String refName; public MostSpecificComparator(String refName) { @@ -111,8 +106,7 @@ public final class MostSpecificComparator implements private int transitions(String pattern) { if (RefPattern.isRE(pattern)) { - return RefPattern.toRegExp(pattern).toAutomaton() - .getNumberOfTransitions(); + return RefPattern.toRegExp(pattern).toAutomaton().getNumberOfTransitions(); } else if (pattern.endsWith("/*")) { return pattern.length(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/OneOffRequestContext.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/OneOffRequestContext.java index f4719aac25..28be66968d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/util/OneOffRequestContext.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/OneOffRequestContext.java @@ -25,12 +25,12 @@ import com.google.inject.Singleton; /** * Helper to create one-off request contexts. - *

- * Each call to {@link #open()} opens a new {@link ReviewDb}, so this class - * should only be used in a bounded try/finally block. - *

- * The user in the request context is {@link InternalUser} or the - * {@link IdentifiedUser} associated to the userId passed as parameter. + * + *

Each call to {@link #open()} opens a new {@link ReviewDb}, so this class should only be used + * in a bounded try/finally block. + * + *

The user in the request context is {@link InternalUser} or the {@link IdentifiedUser} + * associated to the userId passed as parameter. */ @Singleton public class OneOffRequestContext { @@ -40,7 +40,8 @@ public class OneOffRequestContext { private final IdentifiedUser.GenericFactory identifiedUserFactory; @Inject - OneOffRequestContext(InternalUser.Factory userFactory, + OneOffRequestContext( + InternalUser.Factory userFactory, SchemaFactory schemaFactory, ThreadLocalRequestContext requestContext, IdentifiedUser.GenericFactory identifiedUserFactory) { @@ -51,12 +52,11 @@ public class OneOffRequestContext { } public ManualRequestContext open() throws OrmException { - return new ManualRequestContext(userFactory.create(), - schemaFactory, requestContext); + return new ManualRequestContext(userFactory.create(), schemaFactory, requestContext); } public ManualRequestContext openAs(Account.Id userId) throws OrmException { - return new ManualRequestContext(identifiedUserFactory.create(userId), - schemaFactory, requestContext); + return new ManualRequestContext( + identifiedUserFactory.create(userId), schemaFactory, requestContext); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/PluginLogFile.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/PluginLogFile.java index 17f65351cb..0d7a95a28c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/util/PluginLogFile.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/PluginLogFile.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.util; import com.google.gerrit.extensions.events.LifecycleListener; import com.google.gerrit.extensions.systemstatus.ServerInformation; import com.google.inject.Inject; - import org.apache.log4j.AsyncAppender; import org.apache.log4j.Layout; import org.apache.log4j.LogManager; @@ -31,10 +30,8 @@ public abstract class PluginLogFile implements LifecycleListener { private final Layout layout; @Inject - public PluginLogFile(SystemLog systemLog, - ServerInformation serverInfo, - String logName, - Layout layout) { + public PluginLogFile( + SystemLog systemLog, ServerInformation serverInfo, String logName, Layout layout) { this.systemLog = systemLog; this.serverInfo = serverInfo; this.logName = logName; @@ -43,8 +40,7 @@ public abstract class PluginLogFile implements LifecycleListener { @Override public void start() { - AsyncAppender asyncAppender = - systemLog.createAsyncAppender(logName, layout); + AsyncAppender asyncAppender = systemLog.createAsyncAppender(logName, layout); Logger logger = LogManager.getLogger(logName); logger.removeAppender(logName); logger.addAppender(asyncAppender); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/PluginRequestContext.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/PluginRequestContext.java index 943e518fec..3f3f647449 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/util/PluginRequestContext.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/PluginRequestContext.java @@ -38,8 +38,7 @@ public class PluginRequestContext implements RequestContext { return new Provider() { @Override public ReviewDb get() { - throw new ProvisionException( - "Automatic ReviewDb only available in request scope"); + throw new ProvisionException("Automatic ReviewDb only available in request scope"); } }; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/RangeUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/RangeUtil.java index 92873d37da..f7f2cffb5b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/util/RangeUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/RangeUtil.java @@ -16,13 +16,11 @@ package com.google.gerrit.server.util; import com.google.common.primitives.Ints; import com.google.gerrit.common.Nullable; - import java.util.regex.Matcher; import java.util.regex.Pattern; public final class RangeUtil { - private static final Pattern RANGE_PATTERN = - Pattern.compile("(>|>=|=|<|<=|)([+-]?\\d+)$"); + private static final Pattern RANGE_PATTERN = Pattern.compile("(>|>=|=|<|<=|)([+-]?\\d+)$"); private RangeUtil() {} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/RegexListSearcher.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/RegexListSearcher.java index bbc97df26f..91cb709da4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/util/RegexListSearcher.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/RegexListSearcher.java @@ -21,11 +21,9 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.primitives.Chars; - import dk.brics.automaton.Automaton; import dk.brics.automaton.RegExp; import dk.brics.automaton.RunAutomaton; - import java.util.Collections; import java.util.List; @@ -88,12 +86,10 @@ public abstract class RegexListSearcher implements Function { } if (prefixOnly) { - return begin < end ? list.subList(begin, end) : ImmutableList. of(); + return begin < end ? list.subList(begin, end) : ImmutableList.of(); } - return Iterables.filter( - list.subList(begin, end), - x -> pattern.run(apply(x))); + return Iterables.filter(list.subList(begin, end), x -> pattern.run(apply(x))); } public boolean hasMatch(List list) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/RequestContext.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/RequestContext.java index 506a1c3da2..37fd7bc122 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/util/RequestContext.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/RequestContext.java @@ -19,10 +19,11 @@ import com.google.gerrit.server.CurrentUser; import com.google.inject.Provider; /** - * The RequestContext is an interface exposing the fields that are needed - * by the GerritGlobalModule scope. + * The RequestContext is an interface exposing the fields that are needed by the GerritGlobalModule + * scope. */ public interface RequestContext { CurrentUser getUser(); + Provider getReviewDbProvider(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/RequestId.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/RequestId.java index 4f43c2ad7c..dc7dd3d539 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/util/RequestId.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/RequestId.java @@ -19,13 +19,13 @@ import com.google.common.hash.Hashing; import com.google.gerrit.common.TimeUtil; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Project; - import java.net.InetAddress; import java.net.UnknownHostException; /** Unique identifier for an end-user request, used in logs and similar. */ public class RequestId { private static final String MACHINE_ID; + static { String id; try { @@ -48,10 +48,15 @@ public class RequestId { private RequestId(String resourceId) { Hasher h = Hashing.sha1().newHasher(); - h.putLong(Thread.currentThread().getId()) - .putUnencodedChars(MACHINE_ID); - str = "[" + resourceId + "-" + TimeUtil.nowTs().getTime() + - "-" + h.hash().toString().substring(0, 8) + "]"; + h.putLong(Thread.currentThread().getId()).putUnencodedChars(MACHINE_ID); + str = + "[" + + resourceId + + "-" + + TimeUtil.nowTs().getTime() + + "-" + + h.hash().toString().substring(0, 8) + + "]"; } @Override diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/RequestScopePropagator.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/RequestScopePropagator.java index f3b44e0025..4d66809e7f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/util/RequestScopePropagator.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/RequestScopePropagator.java @@ -27,21 +27,18 @@ import com.google.inject.Key; import com.google.inject.Provider; import com.google.inject.Scope; import com.google.inject.servlet.ServletScopes; - import java.util.concurrent.Callable; import java.util.concurrent.Executors; /** * Base class for propagating request-scoped data between threads. - *

- * Request scopes are typically linked to a {@link ThreadLocal}, which is only - * available to the current thread. In order to allow background work involving - * RequestScoped data, the ThreadLocal data must be copied from the request thread to - * the new background thread. - *

- * Every type of RequestScope must provide an implementation of - * RequestScopePropagator. See {@link #wrap(Callable)} for details on the - * implementation, usage, and restrictions. + * + *

Request scopes are typically linked to a {@link ThreadLocal}, which is only available to the + * current thread. In order to allow background work involving RequestScoped data, the ThreadLocal + * data must be copied from the request thread to the new background thread. + * + *

Every type of RequestScope must provide an implementation of RequestScopePropagator. See + * {@link #wrap(Callable)} for details on the implementation, usage, and restrictions. * * @see ThreadLocalRequestScopePropagator */ @@ -51,7 +48,8 @@ public abstract class RequestScopePropagator { private final ThreadLocalRequestContext local; private final Provider dbProviderProvider; - protected RequestScopePropagator(Scope scope, + protected RequestScopePropagator( + Scope scope, ThreadLocalRequestContext local, Provider dbProviderProvider) { this.scope = scope; @@ -60,26 +58,24 @@ public abstract class RequestScopePropagator { } /** - * Ensures that the current request state is available when the passed in - * Callable is invoked. + * Ensures that the current request state is available when the passed in Callable is invoked. + * + *

If needed wraps the passed in Callable in a new {@link Callable} that propagates the current + * request state when the returned Callable is invoked. The method must be called in a request + * scope and the returned Callable may only be invoked in a thread that is not already in a + * request scope or is in the same request scope. The returned Callable will inherit toString() + * from the passed in Callable. A {@link com.google.gerrit.server.git.WorkQueue.Executor} does not + * accept a Callable, so there is no ProjectCallable implementation. Implementations of this + * method must be consistent with Guice's {@link ServletScopes#continueRequest(Callable, + * java.util.Map)}. + * + *

There are some limitations: * - * If needed wraps the passed in Callable in a new {@link Callable} that - * propagates the current request state when the returned Callable is invoked. - * The method must be called in a request scope and the returned Callable may - * only be invoked in a thread that is not already in a request scope or is in - * the same request scope. The returned Callable will inherit toString() from - * the passed in Callable. A - * {@link com.google.gerrit.server.git.WorkQueue.Executor} does not accept a - * Callable, so there is no ProjectCallable implementation. Implementations of - * this method must be consistent with Guice's - * {@link ServletScopes#continueRequest(Callable, java.util.Map)}. - *

- * There are some limitations: *

    - *
  • Derived objects (i.e. anything marked created in a request scope) will - * not be transported.
  • - *
  • State changes to the request scoped context after this method is called - * will not be seen in the continued thread.
  • + *
  • Derived objects (i.e. anything marked created in a request scope) will not be + * transported. + *
  • State changes to the request scoped context after this method is called will not be seen + * in the continued thread. *
* * @param callable the Callable to wrap. @@ -88,8 +84,7 @@ public abstract class RequestScopePropagator { @SuppressWarnings("javadoc") // See GuiceRequestScopePropagator#wrapImpl public final Callable wrap(final Callable callable) { final RequestContext callerContext = checkNotNull(local.getContext()); - final Callable wrapped = - wrapImpl(context(callerContext, cleanup(callable))); + final Callable wrapped = wrapImpl(context(callerContext, cleanup(callable))); return new Callable() { @Override public T call() throws Exception { @@ -107,15 +102,14 @@ public abstract class RequestScopePropagator { } /** - * Wraps runnable in a new {@link Runnable} that propagates the current - * request state when the runnable is invoked. The method must be called in a - * request scope and the returned Runnable may only be invoked in a thread - * that is not already in a request scope. The returned Runnable will inherit - * toString() from the passed in Runnable. Furthermore, if the passed runnable - * is of type {@link ProjectRunnable}, the returned runnable will be of the - * same type with the methods delegated. + * Wraps runnable in a new {@link Runnable} that propagates the current request state when the + * runnable is invoked. The method must be called in a request scope and the returned Runnable may + * only be invoked in a thread that is not already in a request scope. The returned Runnable will + * inherit toString() from the passed in Runnable. Furthermore, if the passed runnable is of type + * {@link ProjectRunnable}, the returned runnable will be of the same type with the methods + * delegated. * - * See {@link #wrap(Callable)} for details on implementation and usage. + *

See {@link #wrap(Callable)} for details on implementation and usage. * * @param runnable the Runnable to wrap. * @return a new Runnable which will execute in the current request scope. @@ -175,27 +169,26 @@ public abstract class RequestScopePropagator { }; } - /** - * @see #wrap(Callable) - */ + /** @see #wrap(Callable) */ protected abstract Callable wrapImpl(Callable callable); - protected Callable context(final RequestContext context, - final Callable callable) { + protected Callable context(final RequestContext context, final Callable callable) { return new Callable() { @Override public T call() throws Exception { - RequestContext old = local.setContext(new RequestContext() { - @Override - public CurrentUser getUser() { - return context.getUser(); - } + RequestContext old = + local.setContext( + new RequestContext() { + @Override + public CurrentUser getUser() { + return context.getUser(); + } - @Override - public Provider getReviewDbProvider() { - return dbProviderProvider.get(); - } - }); + @Override + public Provider getReviewDbProvider() { + return dbProviderProvider.get(); + } + }); try { return callable.call(); } finally { @@ -209,14 +202,17 @@ public abstract class RequestScopePropagator { return new Callable() { @Override public T call() throws Exception { - RequestCleanup cleanup = scope.scope( - Key.get(RequestCleanup.class), - new Provider() { - @Override - public RequestCleanup get() { - return new RequestCleanup(); - } - }).get(); + RequestCleanup cleanup = + scope + .scope( + Key.get(RequestCleanup.class), + new Provider() { + @Override + public RequestCleanup get() { + return new RequestCleanup(); + } + }) + .get(); try { return callable.call(); } finally { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/ServerRequestContext.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/ServerRequestContext.java index ede3365910..af903c4c5b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/util/ServerRequestContext.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/ServerRequestContext.java @@ -40,8 +40,7 @@ public class ServerRequestContext implements RequestContext { return new Provider() { @Override public ReviewDb get() { - throw new ProvisionException( - "Automatic ReviewDb only available in request scope"); + throw new ProvisionException("Automatic ReviewDb only available in request scope"); } }; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/SocketUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/SocketUtil.java index 4991c585b7..5b22f7398a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/util/SocketUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/SocketUtil.java @@ -23,8 +23,7 @@ import java.net.UnknownHostException; public final class SocketUtil { /** True if this InetAddress is a raw IPv6 in dotted quad notation. */ public static boolean isIPv6(final InetAddress ip) { - return ip instanceof Inet6Address - && ip.getHostName().equals(ip.getHostAddress()); + return ip instanceof Inet6Address && ip.getHostName().equals(ip.getHostAddress()); } /** Get the name or IP address, or {@code *} if this address is a wildcard IP. */ @@ -110,12 +109,10 @@ public final class SocketUtil { } /** Parse and resolve an address string, looking up the IP address. */ - public static InetSocketAddress resolve(final String desc, - final int defaultPort) { + public static InetSocketAddress resolve(final String desc, final int defaultPort) { final InetSocketAddress addr = parse(desc, defaultPort); if (addr.getAddress() != null && addr.getAddress().isAnyLocalAddress()) { return addr; - } try { final InetAddress host = InetAddress.getByName(addr.getHostName()); @@ -125,6 +122,5 @@ public final class SocketUtil { } } - private SocketUtil() { - } + private SocketUtil() {} } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/SubmoduleSectionParser.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/SubmoduleSectionParser.java index 6b5c991a34..61c863b4d4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/util/SubmoduleSectionParser.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/SubmoduleSectionParser.java @@ -17,19 +17,17 @@ package com.google.gerrit.server.util; import com.google.gerrit.reviewdb.client.Branch; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.reviewdb.client.SubmoduleSubscription; - -import org.eclipse.jgit.lib.Config; -import org.eclipse.jgit.lib.Constants; - import java.net.URI; import java.net.URISyntaxException; import java.util.HashSet; import java.util.Set; +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.lib.Constants; /** * It parses from a configuration file submodule sections. - *

- * Example of submodule sections: + * + *

Example of submodule sections: * *

  * [submodule "project-a"]
@@ -49,9 +47,8 @@ public class SubmoduleSectionParser {
   private final String canonicalWebUrl;
   private final Branch.NameKey superProjectBranch;
 
-  public SubmoduleSectionParser(Config bbc,
-      String canonicalWebUrl,
-      Branch.NameKey superProjectBranch) {
+  public SubmoduleSectionParser(
+      Config bbc, String canonicalWebUrl, Branch.NameKey superProjectBranch) {
     this.bbc = bbc;
     this.canonicalWebUrl = canonicalWebUrl;
     this.superProjectBranch = superProjectBranch;
@@ -74,8 +71,12 @@ public class SubmoduleSectionParser {
     String branch = bbc.getString("submodule", id, "branch");
 
     try {
-      if (url != null && url.length() > 0 && path != null && path.length() > 0
-          && branch != null && branch.length() > 0) {
+      if (url != null
+          && url.length() > 0
+          && path != null
+          && path.length() > 0
+          && branch != null
+          && branch.length() > 0) {
         // All required fields filled.
         String project;
 
@@ -107,8 +108,7 @@ public class SubmoduleSectionParser {
           URI thisServerURI = new URI(canonicalWebUrl);
           String thisHost = thisServerURI.getHost();
           String targetHost = targetServerURI.getHost();
-          if (thisHost == null || targetHost == null ||
-              !targetHost.equalsIgnoreCase(thisHost)) {
+          if (thisHost == null || targetHost == null || !targetHost.equalsIgnoreCase(thisHost)) {
             return null;
           }
           String p1 = targetServerURI.getPath();
@@ -128,14 +128,14 @@ public class SubmoduleSectionParser {
         }
 
         if (project.endsWith(Constants.DOT_GIT_EXT)) {
-          project = project.substring(0, //
-              project.length() - Constants.DOT_GIT_EXT.length());
+          project =
+              project.substring(
+                  0, //
+                  project.length() - Constants.DOT_GIT_EXT.length());
         }
         Project.NameKey projectKey = new Project.NameKey(project);
         return new SubmoduleSubscription(
-            superProjectBranch,
-            new Branch.NameKey(projectKey, branch),
-            path);
+            superProjectBranch, new Branch.NameKey(projectKey, branch), path);
       }
     } catch (URISyntaxException e) {
       // Error in url syntax (in fact it is uri syntax)
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/SystemLog.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/SystemLog.java
index c857c40133..65fbfd6ad9 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/util/SystemLog.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/SystemLog.java
@@ -22,7 +22,8 @@ import com.google.gerrit.server.config.GerritServerConfig;
 import com.google.gerrit.server.config.SitePaths;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
-
+import java.io.IOException;
+import java.nio.file.Path;
 import org.apache.log4j.Appender;
 import org.apache.log4j.AsyncAppender;
 import org.apache.log4j.DailyRollingFileAppender;
@@ -35,13 +36,9 @@ import org.apache.log4j.spi.LoggingEvent;
 import org.eclipse.jgit.lib.Config;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
-import java.nio.file.Path;
-
 @Singleton
 public class SystemLog {
-  private static final org.slf4j.Logger log =
-      LoggerFactory.getLogger(SystemLog.class);
+  private static final org.slf4j.Logger log = LoggerFactory.getLogger(SystemLog.class);
 
   public static final String LOG4J_CONFIGURATION = "log4j.configuration";
 
@@ -86,8 +83,8 @@ public class SystemLog {
       if (appender != null) {
         async.addAppender(appender);
       } else {
-        log.warn("No appender with the name: " + name + " was found. " + name
-            + " logging is disabled");
+        log.warn(
+            "No appender with the name: " + name + " was found. " + name + " logging is disabled");
       }
     }
     async.activateOptions();
@@ -104,8 +101,7 @@ public class SystemLog {
 
   private static final class DieErrorHandler implements ErrorHandler {
     @Override
-    public void error(String message, Exception e, int errorCode,
-        LoggingEvent event) {
+    public void error(String message, Exception e, int errorCode, LoggingEvent event) {
       error(e != null ? e.getMessage() : message);
     }
 
@@ -120,19 +116,15 @@ public class SystemLog {
     }
 
     @Override
-    public void activateOptions() {
-    }
+    public void activateOptions() {}
 
     @Override
-    public void setAppender(Appender appender) {
-    }
+    public void setAppender(Appender appender) {}
 
     @Override
-    public void setBackupAppender(Appender appender) {
-    }
+    public void setBackupAppender(Appender appender) {}
 
     @Override
-    public void setLogger(Logger logger) {
-    }
+    public void setLogger(Logger logger) {}
   }
 }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/ThreadLocalRequestContext.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/ThreadLocalRequestContext.java
index 3e405a9fb9..e065c6bd8e 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/util/ThreadLocalRequestContext.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/ThreadLocalRequestContext.java
@@ -29,9 +29,9 @@ import com.google.inject.name.Named;
 import com.google.inject.name.Names;
 
 /**
- * ThreadLocalRequestContext manages the current RequestContext using a
- * ThreadLocal. When the context is set, the fields exposed by the context
- * are considered in scope. Otherwise, the FallbackRequestContext is used.
+ * ThreadLocalRequestContext manages the current RequestContext using a ThreadLocal. When the
+ * context is set, the fields exposed by the context are considered in scope. Otherwise, the
+ * FallbackRequestContext is used.
  */
 public class ThreadLocalRequestContext {
   private static final String FALLBACK = "FALLBACK";
@@ -41,13 +41,13 @@ public class ThreadLocalRequestContext {
       @Override
       protected void configure() {
         bind(ThreadLocalRequestContext.class);
-        bind(RequestContext.class).annotatedWith(Names.named(FALLBACK))
+        bind(RequestContext.class)
+            .annotatedWith(Names.named(FALLBACK))
             .to(FallbackRequestContext.class);
       }
 
       @Provides
-      RequestContext provideRequestContext(
-          @Named(FALLBACK) RequestContext fallback) {
+      RequestContext provideRequestContext(@Named(FALLBACK) RequestContext fallback) {
         return MoreObjects.firstNonNull(local.get(), fallback);
       }
 
@@ -61,8 +61,7 @@ public class ThreadLocalRequestContext {
         if (user.isIdentifiedUser()) {
           return user.asIdentifiedUser();
         }
-        throw new ProvisionException(NotSignedInException.MESSAGE,
-            new NotSignedInException());
+        throw new ProvisionException(NotSignedInException.MESSAGE, new NotSignedInException());
       }
 
       @Provides
@@ -75,8 +74,7 @@ public class ThreadLocalRequestContext {
   private static final ThreadLocal local = new ThreadLocal<>();
 
   @Inject
-  ThreadLocalRequestContext() {
-  }
+  ThreadLocalRequestContext() {}
 
   public RequestContext setContext(@Nullable RequestContext ctx) {
     RequestContext old = getContext();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/ThreadLocalRequestScopePropagator.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/ThreadLocalRequestScopePropagator.java
index a31c7c7801..4b27208d0c 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/util/ThreadLocalRequestScopePropagator.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/ThreadLocalRequestScopePropagator.java
@@ -18,21 +18,20 @@ import com.google.gerrit.server.config.RequestScopedReviewDbProvider;
 import com.google.inject.OutOfScopeException;
 import com.google.inject.Provider;
 import com.google.inject.Scope;
-
 import java.util.concurrent.Callable;
 
 /**
- * {@link RequestScopePropagator} implementation for request scopes based on
- * a {@link ThreadLocal} context.
+ * {@link RequestScopePropagator} implementation for request scopes based on a {@link ThreadLocal}
+ * context.
  *
  * @param  "context" type stored in the {@link ThreadLocal}.
  */
-public abstract class ThreadLocalRequestScopePropagator
-    extends RequestScopePropagator {
+public abstract class ThreadLocalRequestScopePropagator extends RequestScopePropagator {
 
   private final ThreadLocal threadLocal;
 
-  protected ThreadLocalRequestScopePropagator(Scope scope,
+  protected ThreadLocalRequestScopePropagator(
+      Scope scope,
       ThreadLocal threadLocal,
       ThreadLocalRequestContext local,
       Provider dbProviderProvider) {
@@ -40,9 +39,7 @@ public abstract class ThreadLocalRequestScopePropagator
     this.threadLocal = threadLocal;
   }
 
-  /**
-   * @see RequestScopePropagator#wrap(Callable)
-   */
+  /** @see RequestScopePropagator#wrap(Callable) */
   @Override
   protected final  Callable wrapImpl(final Callable callable) {
     final C ctx = continuingContext(requireContext());
@@ -73,15 +70,13 @@ public abstract class ThreadLocalRequestScopePropagator
   }
 
   /**
-   * Returns a new context object based on the passed in context that has no
-   * request scoped objects initialized.
-   * 

- * Note that some code paths expect request-scoped objects like - * {@code CurrentUser} to be constructible starting from just the context - * object returned by this method. For example, in the SSH scope, the context - * includes the {@code SshSession}, which is used by - * {@code SshCurrentUserProvider} to construct a new {@code CurrentUser} in - * the new thread. + * Returns a new context object based on the passed in context that has no request scoped objects + * initialized. + * + *

Note that some code paths expect request-scoped objects like {@code CurrentUser} to be + * constructible starting from just the context object returned by this method. For example, in + * the SSH scope, the context includes the {@code SshSession}, which is used by {@code + * SshCurrentUserProvider} to construct a new {@code CurrentUser} in the new thread. * * @param ctx the context to continue. * @return a new context. diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/TreeFormatter.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/TreeFormatter.java index 883f972ea2..8d511f302e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/util/TreeFormatter.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/TreeFormatter.java @@ -21,7 +21,9 @@ public class TreeFormatter { public interface TreeNode { String getDisplayName(); + boolean isVisible(); + SortedSet getChildren(); } @@ -62,8 +64,7 @@ public class TreeFormatter { printTree(rootNode, 0, true); } - private void printTree(final TreeNode node, final int level, - final boolean isLast) { + private void printTree(final TreeNode node, final int level, final boolean isLast) { printNode(node, level, isLast); final SortedSet childNodes = node.getChildren(); int i = 0; @@ -80,8 +81,7 @@ public class TreeFormatter { } } - private void printNode(final TreeNode node, final int level, - final boolean isLast) { + private void printNode(final TreeNode node, final int level, final boolean isLast) { printIndention(level); stdout.print(isLast ? LAST_NODE_PREFIX : NODE_PREFIX); if (node.isVisible()) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/validators/AssigneeValidationListener.java b/gerrit-server/src/main/java/com/google/gerrit/server/validators/AssigneeValidationListener.java index 5d1191cecb..a97ce0b88f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/validators/AssigneeValidationListener.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/validators/AssigneeValidationListener.java @@ -18,9 +18,7 @@ import com.google.gerrit.extensions.annotations.ExtensionPoint; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.Change; -/** - * Listener to provide validation of assignees. - */ +/** Listener to provide validation of assignees. */ @ExtensionPoint public interface AssigneeValidationListener { /** diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/validators/GroupCreationValidationListener.java b/gerrit-server/src/main/java/com/google/gerrit/server/validators/GroupCreationValidationListener.java index 03bdf37742..98a09f3f63 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/validators/GroupCreationValidationListener.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/validators/GroupCreationValidationListener.java @@ -17,19 +17,16 @@ package com.google.gerrit.server.validators; import com.google.gerrit.extensions.annotations.ExtensionPoint; import com.google.gerrit.server.account.CreateGroupArgs; -/** - * Listener to provide validation on group creation. - */ +/** Listener to provide validation on group creation. */ @ExtensionPoint public interface GroupCreationValidationListener { /** * Group creation validation. * - * Invoked by Gerrit just before a new group is going to be created. + *

Invoked by Gerrit just before a new group is going to be created. * * @param args arguments for the group creation * @throws ValidationException if validation fails */ - void validateNewGroup(CreateGroupArgs args) - throws ValidationException; + void validateNewGroup(CreateGroupArgs args) throws ValidationException; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/validators/HashtagValidationListener.java b/gerrit-server/src/main/java/com/google/gerrit/server/validators/HashtagValidationListener.java index 1baab7c481..fbf8e76db0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/validators/HashtagValidationListener.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/validators/HashtagValidationListener.java @@ -16,12 +16,9 @@ package com.google.gerrit.server.validators; import com.google.gerrit.extensions.annotations.ExtensionPoint; import com.google.gerrit.reviewdb.client.Change; - import java.util.Set; -/** - * Listener to provide validation of hashtag changes. - */ +/** Listener to provide validation of hashtag changes. */ @ExtensionPoint public interface HashtagValidationListener { /** @@ -32,6 +29,6 @@ public interface HashtagValidationListener { * @param toRemove the hashtags to be removed * @throws ValidationException if validation fails */ - void validateHashtags(Change change, Set toAdd, - Set toRemove) throws ValidationException; + void validateHashtags(Change change, Set toAdd, Set toRemove) + throws ValidationException; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/validators/OutgoingEmailValidationListener.java b/gerrit-server/src/main/java/com/google/gerrit/server/validators/OutgoingEmailValidationListener.java index 667ef0db26..9f152a518d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/validators/OutgoingEmailValidationListener.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/validators/OutgoingEmailValidationListener.java @@ -18,18 +18,13 @@ import com.google.gerrit.common.Nullable; import com.google.gerrit.extensions.annotations.ExtensionPoint; import com.google.gerrit.server.mail.Address; import com.google.gerrit.server.mail.send.EmailHeader; - import java.util.Map; import java.util.Set; -/** - * Listener to provide validation on outgoing email notification. - */ +/** Listener to provide validation on outgoing email notification. */ @ExtensionPoint public interface OutgoingEmailValidationListener { - /** - * Arguments supplied to validateOutgoingEmail. - */ + /** Arguments supplied to validateOutgoingEmail. */ class Args { // in arguments public String messageClass; @@ -45,18 +40,14 @@ public interface OutgoingEmailValidationListener { /** * Outgoing e-mail validation. * - * Invoked by Gerrit just before an e-mail is sent, after all e-mail templates - * have been applied. + *

Invoked by Gerrit just before an e-mail is sent, after all e-mail templates have been + * applied. * - * Plugins may modify the following fields in args: - * - smtpFromAddress - * - smtpRcptTo - * - body - * - headers + *

Plugins may modify the following fields in args: - smtpFromAddress - smtpRcptTo - body - + * headers * * @param args E-mail properties. Some are mutable. * @throws ValidationException if validation fails. */ - void validateOutgoingEmail(OutgoingEmailValidationListener.Args args) - throws ValidationException; + void validateOutgoingEmail(OutgoingEmailValidationListener.Args args) throws ValidationException; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/validators/ProjectCreationValidationListener.java b/gerrit-server/src/main/java/com/google/gerrit/server/validators/ProjectCreationValidationListener.java index 60123287c1..adb13a768a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/validators/ProjectCreationValidationListener.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/validators/ProjectCreationValidationListener.java @@ -17,19 +17,16 @@ package com.google.gerrit.server.validators; import com.google.gerrit.extensions.annotations.ExtensionPoint; import com.google.gerrit.server.project.CreateProjectArgs; -/** - * Listener to provide validation on project creation. - */ +/** Listener to provide validation on project creation. */ @ExtensionPoint public interface ProjectCreationValidationListener { /** * Project creation validation. * - * Invoked by Gerrit just before a new project is going to be created. + *

Invoked by Gerrit just before a new project is going to be created. * * @param args arguments for the project creation * @throws ValidationException if validation fails */ - void validateNewProject(CreateProjectArgs args) - throws ValidationException; + void validateNewProject(CreateProjectArgs args) throws ValidationException; } diff --git a/gerrit-server/src/main/java/gerrit/AbstractCommitUserIdentityPredicate.java b/gerrit-server/src/main/java/gerrit/AbstractCommitUserIdentityPredicate.java index a91beadf80..c2aaa76062 100644 --- a/gerrit-server/src/main/java/gerrit/AbstractCommitUserIdentityPredicate.java +++ b/gerrit-server/src/main/java/gerrit/AbstractCommitUserIdentityPredicate.java @@ -16,7 +16,6 @@ package gerrit; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.UserIdentity; - import com.googlecode.prolog_cafe.exceptions.PrologException; import com.googlecode.prolog_cafe.lang.IntegerTerm; import com.googlecode.prolog_cafe.lang.Operation; diff --git a/gerrit-server/src/main/java/gerrit/PRED__load_commit_labels_1.java b/gerrit-server/src/main/java/gerrit/PRED__load_commit_labels_1.java index b9b6c5a4c3..8b5a33d576 100644 --- a/gerrit-server/src/main/java/gerrit/PRED__load_commit_labels_1.java +++ b/gerrit-server/src/main/java/gerrit/PRED__load_commit_labels_1.java @@ -8,7 +8,6 @@ import com.google.gerrit.reviewdb.client.PatchSetApproval; import com.google.gerrit.rules.StoredValues; import com.google.gerrit.server.query.change.ChangeData; import com.google.gwtorm.server.OrmException; - import com.googlecode.prolog_cafe.exceptions.JavaException; import com.googlecode.prolog_cafe.exceptions.PrologException; import com.googlecode.prolog_cafe.lang.IntegerTerm; @@ -39,8 +38,7 @@ class PRED__load_commit_labels_1 extends Predicate.P1 { Term listHead = Prolog.Nil; try { ChangeData cd = StoredValues.CHANGE_DATA.get(engine); - LabelTypes types = - StoredValues.CHANGE_CONTROL.get(engine).getLabelTypes(); + LabelTypes types = StoredValues.CHANGE_CONTROL.get(engine).getLabelTypes(); for (PatchSetApproval a : cd.currentApprovals()) { LabelType t = types.byLabel(a.getLabelId()); @@ -48,18 +46,14 @@ class PRED__load_commit_labels_1 extends Predicate.P1 { continue; } - StructureTerm labelTerm = new StructureTerm( - sym_label, - SymbolTerm.intern(t.getName()), - new IntegerTerm(a.getValue())); + StructureTerm labelTerm = + new StructureTerm( + sym_label, SymbolTerm.intern(t.getName()), new IntegerTerm(a.getValue())); - StructureTerm userTerm = new StructureTerm( - sym_user, - new IntegerTerm(a.getAccountId().get())); + StructureTerm userTerm = + new StructureTerm(sym_user, new IntegerTerm(a.getAccountId().get())); - listHead = new ListTerm( - new StructureTerm(sym_commit_label, labelTerm, userTerm), - listHead); + listHead = new ListTerm(new StructureTerm(sym_commit_label, labelTerm, userTerm), listHead); } } catch (OrmException err) { throw new JavaException(this, 1, err); diff --git a/gerrit-server/src/main/java/gerrit/PRED__user_label_range_4.java b/gerrit-server/src/main/java/gerrit/PRED__user_label_range_4.java index 8efc2f15bf..d06664ecc9 100644 --- a/gerrit-server/src/main/java/gerrit/PRED__user_label_range_4.java +++ b/gerrit-server/src/main/java/gerrit/PRED__user_label_range_4.java @@ -19,7 +19,6 @@ import com.google.gerrit.common.data.PermissionRange; import com.google.gerrit.rules.StoredValues; import com.google.gerrit.server.CurrentUser; import com.google.gerrit.server.project.ChangeControl; - import com.googlecode.prolog_cafe.exceptions.IllegalTypeException; import com.googlecode.prolog_cafe.exceptions.PInstantiationException; import com.googlecode.prolog_cafe.exceptions.PrologException; diff --git a/gerrit-server/src/main/java/gerrit/PRED_change_branch_1.java b/gerrit-server/src/main/java/gerrit/PRED_change_branch_1.java index ee5bdc9638..f050c7ff52 100644 --- a/gerrit-server/src/main/java/gerrit/PRED_change_branch_1.java +++ b/gerrit-server/src/main/java/gerrit/PRED_change_branch_1.java @@ -16,7 +16,6 @@ package gerrit; import com.google.gerrit.reviewdb.client.Branch; import com.google.gerrit.rules.StoredValues; - import com.googlecode.prolog_cafe.exceptions.PrologException; import com.googlecode.prolog_cafe.lang.Operation; import com.googlecode.prolog_cafe.lang.Predicate; diff --git a/gerrit-server/src/main/java/gerrit/PRED_change_owner_1.java b/gerrit-server/src/main/java/gerrit/PRED_change_owner_1.java index b56b036a3a..b9dac68f90 100644 --- a/gerrit-server/src/main/java/gerrit/PRED_change_owner_1.java +++ b/gerrit-server/src/main/java/gerrit/PRED_change_owner_1.java @@ -16,7 +16,6 @@ package gerrit; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.rules.StoredValues; - import com.googlecode.prolog_cafe.exceptions.PrologException; import com.googlecode.prolog_cafe.lang.IntegerTerm; import com.googlecode.prolog_cafe.lang.Operation; diff --git a/gerrit-server/src/main/java/gerrit/PRED_change_project_1.java b/gerrit-server/src/main/java/gerrit/PRED_change_project_1.java index e131605ebf..568ef2b03f 100644 --- a/gerrit-server/src/main/java/gerrit/PRED_change_project_1.java +++ b/gerrit-server/src/main/java/gerrit/PRED_change_project_1.java @@ -16,7 +16,6 @@ package gerrit; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.rules.StoredValues; - import com.googlecode.prolog_cafe.exceptions.PrologException; import com.googlecode.prolog_cafe.lang.Operation; import com.googlecode.prolog_cafe.lang.Predicate; diff --git a/gerrit-server/src/main/java/gerrit/PRED_change_topic_1.java b/gerrit-server/src/main/java/gerrit/PRED_change_topic_1.java index d1a91d913b..534d0975b8 100644 --- a/gerrit-server/src/main/java/gerrit/PRED_change_topic_1.java +++ b/gerrit-server/src/main/java/gerrit/PRED_change_topic_1.java @@ -16,7 +16,6 @@ package gerrit; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.rules.StoredValues; - import com.googlecode.prolog_cafe.exceptions.PrologException; import com.googlecode.prolog_cafe.lang.Operation; import com.googlecode.prolog_cafe.lang.Predicate; diff --git a/gerrit-server/src/main/java/gerrit/PRED_commit_author_3.java b/gerrit-server/src/main/java/gerrit/PRED_commit_author_3.java index 9ef68f5a63..51d0913b8e 100644 --- a/gerrit-server/src/main/java/gerrit/PRED_commit_author_3.java +++ b/gerrit-server/src/main/java/gerrit/PRED_commit_author_3.java @@ -17,7 +17,6 @@ package gerrit; import com.google.gerrit.reviewdb.client.PatchSetInfo; import com.google.gerrit.reviewdb.client.UserIdentity; import com.google.gerrit.rules.StoredValues; - import com.googlecode.prolog_cafe.exceptions.PrologException; import com.googlecode.prolog_cafe.lang.Operation; import com.googlecode.prolog_cafe.lang.Prolog; diff --git a/gerrit-server/src/main/java/gerrit/PRED_commit_committer_3.java b/gerrit-server/src/main/java/gerrit/PRED_commit_committer_3.java index d73ed9b95f..7fa9ff43d3 100644 --- a/gerrit-server/src/main/java/gerrit/PRED_commit_committer_3.java +++ b/gerrit-server/src/main/java/gerrit/PRED_commit_committer_3.java @@ -17,7 +17,6 @@ package gerrit; import com.google.gerrit.reviewdb.client.PatchSetInfo; import com.google.gerrit.reviewdb.client.UserIdentity; import com.google.gerrit.rules.StoredValues; - import com.googlecode.prolog_cafe.exceptions.PrologException; import com.googlecode.prolog_cafe.lang.Operation; import com.googlecode.prolog_cafe.lang.Prolog; diff --git a/gerrit-server/src/main/java/gerrit/PRED_commit_delta_4.java b/gerrit-server/src/main/java/gerrit/PRED_commit_delta_4.java index 8fcb98c72b..97e5219404 100644 --- a/gerrit-server/src/main/java/gerrit/PRED_commit_delta_4.java +++ b/gerrit-server/src/main/java/gerrit/PRED_commit_delta_4.java @@ -18,7 +18,6 @@ import com.google.gerrit.reviewdb.client.Patch; import com.google.gerrit.rules.StoredValues; import com.google.gerrit.server.patch.PatchList; import com.google.gerrit.server.patch.PatchListEntry; - import com.googlecode.prolog_cafe.exceptions.IllegalTypeException; import com.googlecode.prolog_cafe.exceptions.PInstantiationException; import com.googlecode.prolog_cafe.exceptions.PrologException; @@ -29,15 +28,13 @@ import com.googlecode.prolog_cafe.lang.Prolog; import com.googlecode.prolog_cafe.lang.SymbolTerm; import com.googlecode.prolog_cafe.lang.Term; import com.googlecode.prolog_cafe.lang.VariableTerm; - import java.util.Iterator; import java.util.regex.Pattern; /** - * Given a regular expression, checks it against the file list in the most - * recent patchset of a change. For all files that match the regex, returns the - * (new) path of the file, the change type, and the old path of the file if - * applicable (if the file was copied or renamed). + * Given a regular expression, checks it against the file list in the most recent patchset of a + * change. For all files that match the regex, returns the (new) path of the file, the change type, + * and the old path of the file if applicable (if the file was copied or renamed). * *

  *   'commit_delta'(+Regex, -ChangeType, -NewPath, -OldPath)
@@ -96,10 +93,9 @@ public class PRED_commit_delta_4 extends Predicate.P4 {
       Term a4 = engine.r4;
       Term a5 = engine.r5;
 
-      Pattern regex = (Pattern)((JavaObjectTerm)a1).object();
+      Pattern regex = (Pattern) ((JavaObjectTerm) a1).object();
       @SuppressWarnings("unchecked")
-      Iterator iter =
-        (Iterator)((JavaObjectTerm)a5).object();
+      Iterator iter = (Iterator) ((JavaObjectTerm) a5).object();
       while (iter.hasNext()) {
         PatchListEntry patch = iter.next();
         String newName = patch.getNewName();
@@ -110,8 +106,7 @@ public class PRED_commit_delta_4 extends Predicate.P4 {
           continue;
         }
 
-        if (regex.matcher(newName).find() ||
-            (oldName != null && regex.matcher(oldName).find())) {
+        if (regex.matcher(newName).find() || (oldName != null && regex.matcher(oldName).find())) {
           SymbolTerm changeSym = getTypeSymbol(changeType);
           SymbolTerm newSym = SymbolTerm.create(newName);
           SymbolTerm oldSym = Prolog.Nil;
@@ -148,8 +143,7 @@ public class PRED_commit_delta_4 extends Predicate.P4 {
       Term a5 = engine.r5;
 
       @SuppressWarnings("unchecked")
-      Iterator iter =
-        (Iterator)((JavaObjectTerm)a5).object();
+      Iterator iter = (Iterator) ((JavaObjectTerm) a5).object();
       if (!iter.hasNext()) {
         return engine.fail();
       }
diff --git a/gerrit-server/src/main/java/gerrit/PRED_commit_edits_2.java b/gerrit-server/src/main/java/gerrit/PRED_commit_edits_2.java
index c97a9649f3..95be5cb4dc 100644
--- a/gerrit-server/src/main/java/gerrit/PRED_commit_edits_2.java
+++ b/gerrit-server/src/main/java/gerrit/PRED_commit_edits_2.java
@@ -18,7 +18,6 @@ import com.google.gerrit.rules.StoredValues;
 import com.google.gerrit.server.patch.PatchList;
 import com.google.gerrit.server.patch.PatchListEntry;
 import com.google.gerrit.server.patch.Text;
-
 import com.googlecode.prolog_cafe.exceptions.IllegalTypeException;
 import com.googlecode.prolog_cafe.exceptions.JavaException;
 import com.googlecode.prolog_cafe.exceptions.PInstantiationException;
@@ -29,7 +28,9 @@ import com.googlecode.prolog_cafe.lang.Prolog;
 import com.googlecode.prolog_cafe.lang.SymbolTerm;
 import com.googlecode.prolog_cafe.lang.Term;
 import com.googlecode.prolog_cafe.lang.VariableTerm;
-
+import java.io.IOException;
+import java.util.List;
+import java.util.regex.Pattern;
 import org.eclipse.jgit.diff.Edit;
 import org.eclipse.jgit.errors.CorruptObjectException;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
@@ -43,13 +44,8 @@ import org.eclipse.jgit.revwalk.RevTree;
 import org.eclipse.jgit.revwalk.RevWalk;
 import org.eclipse.jgit.treewalk.TreeWalk;
 
-import java.io.IOException;
-import java.util.List;
-import java.util.regex.Pattern;
-
 /**
- * Returns true if any of the files that match FileNameRegex have edited lines
- * that match EditRegex
+ * Returns true if any of the files that match FileNameRegex have edited lines that match EditRegex
  *
  * 
  *   'commit_edits'(+FileNameRegex, +EditRegex)
@@ -98,8 +94,8 @@ public class PRED_commit_edits_2 extends Predicate.P2 {
           continue;
         }
 
-        if (fileRegex.matcher(newName).find() ||
-            (oldName != null && fileRegex.matcher(oldName).find())) {
+        if (fileRegex.matcher(newName).find()
+            || (oldName != null && fileRegex.matcher(oldName).find())) {
           List edits = entry.getEdits();
 
           if (edits.isEmpty()) {
@@ -146,8 +142,8 @@ public class PRED_commit_edits_2 extends Predicate.P2 {
   }
 
   private Text load(final ObjectId tree, final String path, final ObjectReader reader)
-      throws MissingObjectException, IncorrectObjectTypeException,
-      CorruptObjectException, IOException {
+      throws MissingObjectException, IncorrectObjectTypeException, CorruptObjectException,
+          IOException {
     if (path == null) {
       return Text.EMPTY;
     }
diff --git a/gerrit-server/src/main/java/gerrit/PRED_commit_message_1.java b/gerrit-server/src/main/java/gerrit/PRED_commit_message_1.java
index 6fc1c2f4de..16a5b13265 100644
--- a/gerrit-server/src/main/java/gerrit/PRED_commit_message_1.java
+++ b/gerrit-server/src/main/java/gerrit/PRED_commit_message_1.java
@@ -16,7 +16,6 @@ package gerrit;
 
 import com.google.gerrit.reviewdb.client.PatchSetInfo;
 import com.google.gerrit.rules.StoredValues;
-
 import com.googlecode.prolog_cafe.exceptions.PrologException;
 import com.googlecode.prolog_cafe.lang.Operation;
 import com.googlecode.prolog_cafe.lang.Predicate;
diff --git a/gerrit-server/src/main/java/gerrit/PRED_commit_stats_3.java b/gerrit-server/src/main/java/gerrit/PRED_commit_stats_3.java
index a85586813d..6ed82e5061 100644
--- a/gerrit-server/src/main/java/gerrit/PRED_commit_stats_3.java
+++ b/gerrit-server/src/main/java/gerrit/PRED_commit_stats_3.java
@@ -18,14 +18,12 @@ import com.google.gerrit.reviewdb.client.Patch;
 import com.google.gerrit.rules.StoredValues;
 import com.google.gerrit.server.patch.PatchList;
 import com.google.gerrit.server.patch.PatchListEntry;
-
 import com.googlecode.prolog_cafe.exceptions.PrologException;
 import com.googlecode.prolog_cafe.lang.IntegerTerm;
 import com.googlecode.prolog_cafe.lang.Operation;
 import com.googlecode.prolog_cafe.lang.Predicate;
 import com.googlecode.prolog_cafe.lang.Prolog;
 import com.googlecode.prolog_cafe.lang.Term;
-
 import java.util.List;
 
 /**
@@ -54,15 +52,13 @@ public class PRED_commit_stats_3 extends Predicate.P3 {
     PatchList pl = StoredValues.PATCH_LIST.get(engine);
     // Account for magic files
     if (!a1.unify(
-        new IntegerTerm(
-            pl.getPatches().size() - countMagicFiles(pl.getPatches())),
-        engine.trail)) {
+        new IntegerTerm(pl.getPatches().size() - countMagicFiles(pl.getPatches())), engine.trail)) {
       return engine.fail();
     }
-    if (!a2.unify(new IntegerTerm(pl.getInsertions()),engine.trail)) {
+    if (!a2.unify(new IntegerTerm(pl.getInsertions()), engine.trail)) {
       return engine.fail();
     }
-    if (!a3.unify(new IntegerTerm(pl.getDeletions()),engine.trail)) {
+    if (!a3.unify(new IntegerTerm(pl.getDeletions()), engine.trail)) {
       return engine.fail();
     }
     return cont;
diff --git a/gerrit-server/src/main/java/gerrit/PRED_current_user_1.java b/gerrit-server/src/main/java/gerrit/PRED_current_user_1.java
index a3e1a96d30..6dc1e5270c 100644
--- a/gerrit-server/src/main/java/gerrit/PRED_current_user_1.java
+++ b/gerrit-server/src/main/java/gerrit/PRED_current_user_1.java
@@ -19,7 +19,6 @@ import com.google.gerrit.rules.StoredValues;
 import com.google.gerrit.server.AnonymousUser;
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.PeerDaemonUser;
-
 import com.googlecode.prolog_cafe.exceptions.EvaluationException;
 import com.googlecode.prolog_cafe.exceptions.PrologException;
 import com.googlecode.prolog_cafe.lang.IntegerTerm;
@@ -47,8 +46,7 @@ public class PRED_current_user_1 extends Predicate.P1 {
 
     CurrentUser curUser = StoredValues.CURRENT_USER.getOrNull(engine);
     if (curUser == null) {
-      throw new EvaluationException(
-          "Current user not available in this rule type");
+      throw new EvaluationException("Current user not available in this rule type");
     }
     Term resultTerm;
 
diff --git a/gerrit-server/src/main/java/gerrit/PRED_current_user_2.java b/gerrit-server/src/main/java/gerrit/PRED_current_user_2.java
index 87c71381cc..7da1ce8d63 100644
--- a/gerrit-server/src/main/java/gerrit/PRED_current_user_2.java
+++ b/gerrit-server/src/main/java/gerrit/PRED_current_user_2.java
@@ -21,7 +21,6 @@ import com.google.gerrit.rules.PrologEnvironment;
 import com.google.gerrit.rules.StoredValues;
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.IdentifiedUser;
-
 import com.googlecode.prolog_cafe.exceptions.IllegalTypeException;
 import com.googlecode.prolog_cafe.exceptions.PInstantiationException;
 import com.googlecode.prolog_cafe.exceptions.PrologException;
@@ -34,14 +33,13 @@ import com.googlecode.prolog_cafe.lang.StructureTerm;
 import com.googlecode.prolog_cafe.lang.SymbolTerm;
 import com.googlecode.prolog_cafe.lang.Term;
 import com.googlecode.prolog_cafe.lang.VariableTerm;
-
 import java.util.Map;
 
 /**
  * Loads a CurrentUser object for a user identity.
- * 

- * Values are cached in the hash {@code current_user}, avoiding recreation - * during a single evaluation. + * + *

Values are cached in the hash {@code current_user}, avoiding recreation during a single + * evaluation. * *

  *   current_user(user(+AccountId), -CurrentUser).
diff --git a/gerrit-server/src/main/java/gerrit/PRED_get_legacy_label_types_1.java b/gerrit-server/src/main/java/gerrit/PRED_get_legacy_label_types_1.java
index f93e424347..ea3fb174fd 100644
--- a/gerrit-server/src/main/java/gerrit/PRED_get_legacy_label_types_1.java
+++ b/gerrit-server/src/main/java/gerrit/PRED_get_legacy_label_types_1.java
@@ -17,7 +17,6 @@ package gerrit;
 import com.google.gerrit.common.data.LabelType;
 import com.google.gerrit.common.data.LabelValue;
 import com.google.gerrit.rules.StoredValues;
-
 import com.googlecode.prolog_cafe.exceptions.PrologException;
 import com.googlecode.prolog_cafe.lang.IntegerTerm;
 import com.googlecode.prolog_cafe.lang.ListTerm;
@@ -27,18 +26,17 @@ import com.googlecode.prolog_cafe.lang.Prolog;
 import com.googlecode.prolog_cafe.lang.StructureTerm;
 import com.googlecode.prolog_cafe.lang.SymbolTerm;
 import com.googlecode.prolog_cafe.lang.Term;
-
 import java.util.List;
 
 /**
  * Obtain a list of label types from the server configuration.
- * 

- * Unifies to a Prolog list of: {@code label_type(Label, Fun, Min, Max)} - * where: + * + *

Unifies to a Prolog list of: {@code label_type(Label, Fun, Min, Max)} where: + * *

    - *
  • {@code Label} - the newer style label name
  • - *
  • {@code Fun} - legacy function name
  • - *
  • {@code Min, Max} - the smallest and largest configured values.
  • + *
  • {@code Label} - the newer style label name + *
  • {@code Fun} - legacy function name + *
  • {@code Min, Max} - the smallest and largest configured values. *
*/ class PRED_get_legacy_label_types_1 extends Predicate.P1 { @@ -53,8 +51,7 @@ class PRED_get_legacy_label_types_1 extends Predicate.P1 { public Operation exec(Prolog engine) throws PrologException { engine.setB0(); Term a1 = arg1.dereference(); - List list = - StoredValues.CHANGE_CONTROL.get(engine).getLabelTypes().getLabelTypes(); + List list = StoredValues.CHANGE_CONTROL.get(engine).getLabelTypes().getLabelTypes(); Term head = Prolog.Nil; for (int idx = list.size() - 1; 0 <= idx; idx--) { head = new ListTerm(export(list.get(idx)), head); @@ -66,13 +63,13 @@ class PRED_get_legacy_label_types_1 extends Predicate.P1 { return cont; } - static final SymbolTerm symLabelType = SymbolTerm.intern( - "label_type", 4); + static final SymbolTerm symLabelType = SymbolTerm.intern("label_type", 4); static Term export(LabelType type) { LabelValue min = type.getMin(); LabelValue max = type.getMax(); - return new StructureTerm(symLabelType, + return new StructureTerm( + symLabelType, SymbolTerm.intern(type.getName()), SymbolTerm.intern(type.getFunctionName()), min != null ? new IntegerTerm(min.getValue()) : NONE, diff --git a/gerrit-server/src/main/java/gerrit/PRED_project_default_submit_type_1.java b/gerrit-server/src/main/java/gerrit/PRED_project_default_submit_type_1.java index b1a8a74e7a..cedad9e251 100644 --- a/gerrit-server/src/main/java/gerrit/PRED_project_default_submit_type_1.java +++ b/gerrit-server/src/main/java/gerrit/PRED_project_default_submit_type_1.java @@ -17,7 +17,6 @@ package gerrit; import com.google.gerrit.extensions.client.SubmitType; import com.google.gerrit.rules.StoredValues; import com.google.gerrit.server.project.ChangeControl; - import com.googlecode.prolog_cafe.exceptions.PrologException; import com.googlecode.prolog_cafe.lang.Operation; import com.googlecode.prolog_cafe.lang.Predicate; diff --git a/gerrit-server/src/main/java/gerrit/PRED_uploader_1.java b/gerrit-server/src/main/java/gerrit/PRED_uploader_1.java index 06977b3c2d..77d31d9f4d 100644 --- a/gerrit-server/src/main/java/gerrit/PRED_uploader_1.java +++ b/gerrit-server/src/main/java/gerrit/PRED_uploader_1.java @@ -17,7 +17,6 @@ package gerrit; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.rules.StoredValues; - import com.googlecode.prolog_cafe.exceptions.PrologException; import com.googlecode.prolog_cafe.lang.IntegerTerm; import com.googlecode.prolog_cafe.lang.Operation; @@ -26,13 +25,11 @@ import com.googlecode.prolog_cafe.lang.Prolog; import com.googlecode.prolog_cafe.lang.StructureTerm; import com.googlecode.prolog_cafe.lang.SymbolTerm; import com.googlecode.prolog_cafe.lang.Term; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class PRED_uploader_1 extends Predicate.P1 { - private static final Logger log = - LoggerFactory.getLogger(PRED_uploader_1.class); + private static final Logger log = LoggerFactory.getLogger(PRED_uploader_1.class); private static final SymbolTerm user = SymbolTerm.intern("user", 1); @@ -48,15 +45,15 @@ public class PRED_uploader_1 extends Predicate.P1 { PatchSet patchSet = StoredValues.getPatchSet(engine); if (patchSet == null) { - log.error("Failed to load current patch set of change " - + StoredValues.getChange(engine).getChangeId()); + log.error( + "Failed to load current patch set of change " + + StoredValues.getChange(engine).getChangeId()); return engine.fail(); } Account.Id uploaderId = patchSet.getUploader(); - if (!a1.unify(new StructureTerm(user, new IntegerTerm(uploaderId.get())), - engine.trail)) { + if (!a1.unify(new StructureTerm(user, new IntegerTerm(uploaderId.get())), engine.trail)) { return engine.fail(); } return cont; diff --git a/gerrit-server/src/test/java/com/google/gerrit/metrics/proc/ProcMetricModuleTest.java b/gerrit-server/src/test/java/com/google/gerrit/metrics/proc/ProcMetricModuleTest.java index 70ad1375d1..9974bc690e 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/metrics/proc/ProcMetricModuleTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/metrics/proc/ProcMetricModuleTest.java @@ -16,6 +16,10 @@ package com.google.gerrit.metrics.proc; import static com.google.common.truth.Truth.assertThat; +import com.codahale.metrics.Counter; +import com.codahale.metrics.Gauge; +import com.codahale.metrics.Metric; +import com.codahale.metrics.MetricRegistry; import com.google.gerrit.common.Version; import com.google.gerrit.lifecycle.LifecycleManager; import com.google.gerrit.metrics.CallbackMetric0; @@ -29,29 +33,19 @@ import com.google.gerrit.metrics.dropwizard.DropWizardMetricMaker; import com.google.inject.Guice; import com.google.inject.Inject; import com.google.inject.Injector; - -import com.codahale.metrics.Counter; -import com.codahale.metrics.Gauge; -import com.codahale.metrics.Metric; -import com.codahale.metrics.MetricRegistry; - +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; - public class ProcMetricModuleTest { - @Rule - public ExpectedException exception = ExpectedException.none(); + @Rule public ExpectedException exception = ExpectedException.none(); - @Inject - MetricMaker metrics; + @Inject MetricMaker metrics; - @Inject - MetricRegistry registry; + @Inject MetricRegistry registry; @Test public void constantBuildLabel() { @@ -62,8 +56,8 @@ public class ProcMetricModuleTest { @Test public void procUptime() { Gauge birth = gauge("proc/birth_timestamp"); - assertThat(birth.getValue()).isAtMost( - TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis())); + assertThat(birth.getValue()) + .isAtMost(TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis())); Gauge uptime = gauge("proc/uptime"); assertThat(uptime.getValue()).isAtLeast(1L); @@ -71,10 +65,8 @@ public class ProcMetricModuleTest { @Test public void counter0() { - Counter0 cntr = metrics.newCounter( - "test/count", - new Description("simple test") - .setCumulative()); + Counter0 cntr = + metrics.newCounter("test/count", new Description("simple test").setCumulative()); Counter raw = get("test/count", Counter.class); assertThat(raw.getCount()).isEqualTo(0); @@ -88,11 +80,9 @@ public class ProcMetricModuleTest { @Test public void counter1() { - Counter1 cntr = metrics.newCounter( - "test/count", - new Description("simple test") - .setCumulative(), - Field.ofString("action")); + Counter1 cntr = + metrics.newCounter( + "test/count", new Description("simple test").setCumulative(), Field.ofString("action")); Counter total = get("test/count_total", Counter.class); assertThat(total.getCount()).isEqualTo(0); @@ -111,12 +101,13 @@ public class ProcMetricModuleTest { @Test public void counterPrefixFields() { - Counter1 cntr = metrics.newCounter( - "test/count", - new Description("simple test") - .setCumulative() - .setFieldOrdering(FieldOrdering.PREFIX_FIELDS_BASENAME), - Field.ofString("action")); + Counter1 cntr = + metrics.newCounter( + "test/count", + new Description("simple test") + .setCumulative() + .setFieldOrdering(FieldOrdering.PREFIX_FIELDS_BASENAME), + Field.ofString("action")); Counter total = get("test/count_total", Counter.class); assertThat(total.getCount()).isEqualTo(0); @@ -135,20 +126,20 @@ public class ProcMetricModuleTest { @Test public void callbackMetric0() { - final CallbackMetric0 cntr = metrics.newCallbackMetric( - "test/count", - Long.class, - new Description("simple test") - .setCumulative()); + final CallbackMetric0 cntr = + metrics.newCallbackMetric( + "test/count", Long.class, new Description("simple test").setCumulative()); final AtomicInteger invocations = new AtomicInteger(0); - metrics.newTrigger(cntr, new Runnable() { - @Override - public void run() { - invocations.getAndIncrement(); - cntr.set(42L); - } - }); + metrics.newTrigger( + cntr, + new Runnable() { + @Override + public void run() { + invocations.getAndIncrement(); + cntr.set(42L); + } + }); // Triggers run immediately with DropWizard binding. assertThat(invocations.get()).isEqualTo(1); @@ -189,8 +180,7 @@ public class ProcMetricModuleTest { @Before public void setup() { - Injector injector = - Guice.createInjector(new DropWizardMetricMaker.ApiModule()); + Injector injector = Guice.createInjector(new DropWizardMetricMaker.ApiModule()); LifecycleManager mgr = new LifecycleManager(); mgr.add(injector); diff --git a/gerrit-server/src/test/java/com/google/gerrit/rules/GerritCommonTest.java b/gerrit-server/src/test/java/com/google/gerrit/rules/GerritCommonTest.java index 279ad61550..28f10d9593 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/rules/GerritCommonTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/rules/GerritCommonTest.java @@ -20,49 +20,41 @@ import com.google.gerrit.common.data.LabelTypes; import com.google.gerrit.server.project.ChangeControl; import com.google.gerrit.server.project.Util; import com.google.inject.AbstractModule; - import com.googlecode.prolog_cafe.exceptions.CompileException; import com.googlecode.prolog_cafe.exceptions.ReductionLimitException; import com.googlecode.prolog_cafe.lang.JavaObjectTerm; import com.googlecode.prolog_cafe.lang.Prolog; import com.googlecode.prolog_cafe.lang.StructureTerm; import com.googlecode.prolog_cafe.lang.SymbolTerm; - +import java.io.PushbackReader; +import java.io.StringReader; +import java.util.Arrays; import org.easymock.EasyMock; import org.eclipse.jgit.lib.Config; import org.junit.Before; import org.junit.Test; -import java.io.PushbackReader; -import java.io.StringReader; -import java.util.Arrays; - public class GerritCommonTest extends PrologTestCase { @Before public void setUp() throws Exception { - load("gerrit", "gerrit_common_test.pl", new AbstractModule() { - @Override - protected void configure() { - Config cfg = new Config(); - cfg.setInt("rules", null, "reductionLimit", 1300); - cfg.setInt("rules", null, "compileReductionLimit", (int) 1e6); - bind(PrologEnvironment.Args.class).toInstance( - new PrologEnvironment.Args( - null, - null, - null, - null, - null, - null, - cfg)); - } - }); + load( + "gerrit", + "gerrit_common_test.pl", + new AbstractModule() { + @Override + protected void configure() { + Config cfg = new Config(); + cfg.setInt("rules", null, "reductionLimit", 1300); + cfg.setInt("rules", null, "compileReductionLimit", (int) 1e6); + bind(PrologEnvironment.Args.class) + .toInstance(new PrologEnvironment.Args(null, null, null, null, null, null, cfg)); + } + }); } @Override protected void setUpEnvironment(PrologEnvironment env) { - LabelTypes labelTypes = - new LabelTypes(Arrays.asList(Util.codeReview(), Util.verified())); + LabelTypes labelTypes = new LabelTypes(Arrays.asList(Util.codeReview(), Util.verified())); ChangeControl ctl = EasyMock.createMock(ChangeControl.class); expect(ctl.getLabelTypes()).andStubReturn(labelTypes); EasyMock.replay(ctl); @@ -79,20 +71,20 @@ public class GerritCommonTest extends PrologTestCase { PrologEnvironment env = envFactory.create(machine); setUpEnvironment(env); - String script = "loopy :- b(5).\n" - + "b(N) :- N > 0, !, S = N - 1, b(S).\n" - + "b(_) :- true.\n"; + String script = "loopy :- b(5).\n" + "b(N) :- N > 0, !, S = N - 1, b(S).\n" + "b(_) :- true.\n"; SymbolTerm nameTerm = SymbolTerm.create("testReductionLimit"); - JavaObjectTerm inTerm = new JavaObjectTerm( - new PushbackReader(new StringReader(script), Prolog.PUSHBACK_SIZE)); + JavaObjectTerm inTerm = + new JavaObjectTerm(new PushbackReader(new StringReader(script), Prolog.PUSHBACK_SIZE)); if (!env.execute(Prolog.BUILTIN, "consult_stream", nameTerm, inTerm)) { throw new CompileException("Cannot consult " + nameTerm); } exception.expect(ReductionLimitException.class); exception.expectMessage("exceeded reduction limit of 1300"); - env.once(Prolog.BUILTIN, "call", new StructureTerm(":", - SymbolTerm.create("user"), SymbolTerm.create("loopy"))); + env.once( + Prolog.BUILTIN, + "call", + new StructureTerm(":", SymbolTerm.create("user"), SymbolTerm.create("loopy"))); } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/rules/PrologTestCase.java b/gerrit-server/src/test/java/com/google/gerrit/rules/PrologTestCase.java index dc8004a76f..6f6d189715 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/rules/PrologTestCase.java +++ b/gerrit-server/src/test/java/com/google/gerrit/rules/PrologTestCase.java @@ -22,7 +22,6 @@ import com.google.gerrit.common.TimeUtil; import com.google.gerrit.testutil.GerritBaseTests; import com.google.inject.Guice; import com.google.inject.Module; - import com.googlecode.prolog_cafe.exceptions.CompileException; import com.googlecode.prolog_cafe.lang.BufferingPrologControl; import com.googlecode.prolog_cafe.lang.JavaObjectTerm; @@ -33,7 +32,6 @@ import com.googlecode.prolog_cafe.lang.StructureTerm; import com.googlecode.prolog_cafe.lang.SymbolTerm; import com.googlecode.prolog_cafe.lang.Term; import com.googlecode.prolog_cafe.lang.VariableTerm; - import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.IOException; @@ -44,7 +42,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; - /** Base class for any tests written in Prolog. */ public abstract class PrologTestCase extends GerritBaseTests { private static final SymbolTerm test_1 = SymbolTerm.intern("test", 1); @@ -62,8 +59,7 @@ public abstract class PrologTestCase extends GerritBaseTests { moduleList.add(new PrologModule.EnvironmentModule()); moduleList.addAll(Arrays.asList(modules)); - envFactory = Guice.createInjector(moduleList) - .getInstance(PrologEnvironment.Factory.class); + envFactory = Guice.createInjector(moduleList).getInstance(PrologEnvironment.Factory.class); PrologEnvironment env = envFactory.create(newMachine()); consult(env, getClass(), prologResource); @@ -71,9 +67,9 @@ public abstract class PrologTestCase extends GerritBaseTests { hasSetup = has(env, "setup"); hasTeardown = has(env, "teardown"); - StructureTerm head = new StructureTerm(":", - SymbolTerm.intern(pkg), - new StructureTerm(test_1, new VariableTerm())); + StructureTerm head = + new StructureTerm( + ":", SymbolTerm.intern(pkg), new StructureTerm(test_1, new VariableTerm())); tests = new ArrayList<>(); for (Term[] pair : env.all(Prolog.BUILTIN, "clause", head, new VariableTerm())) { @@ -88,8 +84,7 @@ public abstract class PrologTestCase extends GerritBaseTests { * * @param env Prolog environment. */ - protected void setUpEnvironment(PrologEnvironment env) { - } + protected void setUpEnvironment(PrologEnvironment env) {} private PrologMachineCopy newMachine() { BufferingPrologControl ctl = new BufferingPrologControl(); @@ -98,17 +93,17 @@ public abstract class PrologTestCase extends GerritBaseTests { return PrologMachineCopy.save(ctl); } - protected void consult(BufferingPrologControl env, - Class clazz, - String prologResource) throws CompileException, IOException { + protected void consult(BufferingPrologControl env, Class clazz, String prologResource) + throws CompileException, IOException { try (InputStream in = clazz.getResourceAsStream(prologResource)) { if (in == null) { throw new FileNotFoundException(prologResource); } SymbolTerm pathTerm = SymbolTerm.create(prologResource); JavaObjectTerm inTerm = - new JavaObjectTerm(new PushbackReader(new BufferedReader( - new InputStreamReader(in, UTF_8)), Prolog.PUSHBACK_SIZE)); + new JavaObjectTerm( + new PushbackReader( + new BufferedReader(new InputStreamReader(in, UTF_8)), Prolog.PUSHBACK_SIZE)); if (!env.execute(Prolog.BUILTIN, "consult_stream", pathTerm, inTerm)) { throw new CompileException("Cannot consult " + prologResource); } @@ -161,13 +156,14 @@ public abstract class PrologTestCase extends GerritBaseTests { } if (all.size() != 1) { - errors++; + errors++; } } long end = TimeUtil.nowMs(); System.out.println("-------------------------------"); - System.out.format("Prolog tests: %d, Failures: %d, Time elapsed %.3f sec", + System.out.format( + "Prolog tests: %d, Failures: %d, Time elapsed %.3f sec", tests.size(), errors, (end - start) / 1000.0); System.out.println(); @@ -177,9 +173,9 @@ public abstract class PrologTestCase extends GerritBaseTests { private void call(BufferingPrologControl env, String name) { StructureTerm head = SymbolTerm.create(pkg, name, 0); assert_() - .withFailureMessage("Cannot invoke " + pkg + ":" + name) - .that(env.execute(Prolog.BUILTIN, "call", head)) - .isTrue(); + .withFailureMessage("Cannot invoke " + pkg + ":" + name) + .that(env.execute(Prolog.BUILTIN, "call", head)) + .isTrue(); } private Term removePackage(Term test) { diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/ChangeUtilTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/ChangeUtilTest.java index 92d3a1ceaf..5f73d2cdf0 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/ChangeUtilTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/ChangeUtilTest.java @@ -16,9 +16,8 @@ package com.google.gerrit.server; import static com.google.common.truth.Truth.assertThat; -import org.junit.Test; - import java.util.regex.Pattern; +import org.junit.Test; public class ChangeUtilTest { @Test diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/IdentifiedUserTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/IdentifiedUserTest.java index c746c634fb..468968800a 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/IdentifiedUserTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/IdentifiedUserTest.java @@ -37,25 +37,21 @@ import com.google.inject.Guice; import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.util.Providers; - +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; import org.eclipse.jgit.lib.Config; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - @RunWith(ConfigSuite.class) public class IdentifiedUserTest { - @ConfigSuite.Parameter - public Config config; + @ConfigSuite.Parameter public Config config; private IdentifiedUser identifiedUser; - @Inject - private IdentifiedUser.GenericFactory identifiedUserFactory; + @Inject private IdentifiedUser.GenericFactory identifiedUserFactory; private static final String[] TEST_CASES = { "", @@ -66,37 +62,42 @@ public class IdentifiedUserTest { @Before public void setUp() throws Exception { final FakeAccountCache accountCache = new FakeAccountCache(); - final Realm mockRealm = new FakeRealm() { - HashSet emails = new HashSet<>(Arrays.asList(TEST_CASES)); + final Realm mockRealm = + new FakeRealm() { + HashSet emails = new HashSet<>(Arrays.asList(TEST_CASES)); - @Override - public boolean hasEmailAddress(IdentifiedUser who, String email) { - return emails.contains(email); - } + @Override + public boolean hasEmailAddress(IdentifiedUser who, String email) { + return emails.contains(email); + } - @Override - public Set getEmailAddresses(IdentifiedUser who) { - return emails; - } - }; + @Override + public Set getEmailAddresses(IdentifiedUser who) { + return emails; + } + }; - AbstractModule mod = new AbstractModule() { - @Override - protected void configure() { - bind(Boolean.class).annotatedWith(DisableReverseDnsLookup.class) - .toInstance(Boolean.FALSE); - bind(Config.class).annotatedWith(GerritServerConfig.class).toInstance(config); - bind(String.class).annotatedWith(AnonymousCowardName.class) - .toProvider(AnonymousCowardNameProvider.class); - bind(String.class).annotatedWith(CanonicalWebUrl.class) - .toInstance("http://localhost:8080/"); - bind(AccountCache.class).toInstance(accountCache); - bind(GroupBackend.class).to(SystemGroupBackend.class).in(SINGLETON); - bind(CapabilityControl.Factory.class) - .toProvider(Providers.of(null)); - bind(Realm.class).toInstance(mockRealm); - } - }; + AbstractModule mod = + new AbstractModule() { + @Override + protected void configure() { + bind(Boolean.class) + .annotatedWith(DisableReverseDnsLookup.class) + .toInstance(Boolean.FALSE); + bind(Config.class).annotatedWith(GerritServerConfig.class).toInstance(config); + bind(String.class) + .annotatedWith(AnonymousCowardName.class) + .toProvider(AnonymousCowardNameProvider.class); + bind(String.class) + .annotatedWith(CanonicalWebUrl.class) + .toInstance("http://localhost:8080/"); + bind(AccountCache.class).toInstance(accountCache); + bind(GroupBackend.class).to(SystemGroupBackend.class).in(SINGLETON); + bind(CapabilityControl.Factory.class) + .toProvider(Providers.of(null)); + bind(Realm.class).toInstance(mockRealm); + } + }; Injector injector = Guice.createInjector(mod); injector.injectMembers(this); @@ -122,7 +123,6 @@ public class IdentifiedUserTest { assertThat(identifiedUser.hasEmailAddress(TEST_CASES[2])).isTrue(); assertThat(identifiedUser.hasEmailAddress(TEST_CASES[2].toLowerCase())).isTrue(); - assertThat(identifiedUser.hasEmailAddress("non-exist@email.com")).isFalse(); /* assert again to test cached email address by IdentifiedUser.invalidEmails */ assertThat(identifiedUser.hasEmailAddress("non-exist@email.com")).isFalse(); diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/StringUtilTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/StringUtilTest.java index ed42c4017e..acf25779be 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/StringUtilTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/StringUtilTest.java @@ -19,39 +19,31 @@ import static org.junit.Assert.assertEquals; import org.junit.Test; public class StringUtilTest { - /** - * Test the boundary condition that the first character of a string - * should be escaped. - */ + /** Test the boundary condition that the first character of a string should be escaped. */ @Test public void escapeFirstChar() { assertEquals(StringUtil.escapeString("\tLeading tab"), "\\tLeading tab"); } - /** - * Test the boundary condition that the last character of a string - * should be escaped. - */ + /** Test the boundary condition that the last character of a string should be escaped. */ @Test public void escapeLastChar() { assertEquals(StringUtil.escapeString("Trailing tab\t"), "Trailing tab\\t"); } - /** - * Test that various forms of input strings are escaped (or left as-is) - * in the expected way. - */ + /** Test that various forms of input strings are escaped (or left as-is) in the expected way. */ @Test public void escapeString() { - final String[] testPairs = - { "", "", - "plain string", "plain string", - "string with \"quotes\"", "string with \"quotes\"", - "string with 'quotes'", "string with 'quotes'", - "string with 'quotes'", "string with 'quotes'", - "C:\\Program Files\\MyProgram", "C:\\\\Program Files\\\\MyProgram", - "string\nwith\nnewlines", "string\\nwith\\nnewlines", - "string\twith\ttabs", "string\\twith\\ttabs", }; + final String[] testPairs = { + "", "", + "plain string", "plain string", + "string with \"quotes\"", "string with \"quotes\"", + "string with 'quotes'", "string with 'quotes'", + "string with 'quotes'", "string with 'quotes'", + "C:\\Program Files\\MyProgram", "C:\\\\Program Files\\\\MyProgram", + "string\nwith\nnewlines", "string\\nwith\\nnewlines", + "string\twith\ttabs", "string\\twith\\ttabs", + }; for (int i = 0; i < testPairs.length; i += 2) { assertEquals(StringUtil.escapeString(testPairs[i]), testPairs[i + 1]); } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/account/AuthorizedKeysTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/account/AuthorizedKeysTest.java index 585dd0490f..4b43197f50 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/account/AuthorizedKeysTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/account/AuthorizedKeysTest.java @@ -18,39 +18,37 @@ import static com.google.common.truth.Truth.assertThat; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.AccountSshKey; - -import org.junit.Test; - import java.util.ArrayList; import java.util.List; import java.util.Optional; +import org.junit.Test; public class AuthorizedKeysTest { private static final String KEY1 = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCgug5VyMXQGnem2H1KVC4/HcRcD4zzBqS" - + "uJBRWVonSSoz3RoAZ7bWXCVVGwchtXwUURD689wFYdiPecOrWOUgeeyRq754YWRhU+W28" - + "vf8IZixgjCmiBhaL2gt3wff6pP+NXJpTSA4aeWE5DfNK5tZlxlSxqkKOS8JRSUeNQov5T" - + "w== john.doe@example.com"; + + "uJBRWVonSSoz3RoAZ7bWXCVVGwchtXwUURD689wFYdiPecOrWOUgeeyRq754YWRhU+W28" + + "vf8IZixgjCmiBhaL2gt3wff6pP+NXJpTSA4aeWE5DfNK5tZlxlSxqkKOS8JRSUeNQov5T" + + "w== john.doe@example.com"; private static final String KEY2 = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDm5yP7FmEoqzQRDyskX+9+N0q9GrvZeh5" - + "RG52EUpE4ms/Ujm3ewV1LoGzc/lYKJAIbdcZQNJ9+06EfWZaIRA3oOwAPe1eCnX+aLr8E" - + "6Tw2gDMQOGc5e9HfyXpC2pDvzauoZNYqLALOG3y/1xjo7IH8GYRS2B7zO/Mf9DdCcCKSf" - + "w== john.doe@example.com"; + + "RG52EUpE4ms/Ujm3ewV1LoGzc/lYKJAIbdcZQNJ9+06EfWZaIRA3oOwAPe1eCnX+aLr8E" + + "6Tw2gDMQOGc5e9HfyXpC2pDvzauoZNYqLALOG3y/1xjo7IH8GYRS2B7zO/Mf9DdCcCKSf" + + "w== john.doe@example.com"; private static final String KEY3 = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCaS7RHEcZ/zjl9hkWkqnm29RNr2OQ/TZ5" - + "jk2qBVMH3BgzPsTsEs+7ag9tfD8OCj+vOcwm626mQBZoR2e3niHa/9gnHBHFtOrGfzKbp" - + "RjTWtiOZbB9HF+rqMVD+Dawo/oicX/dDg7VAgOFSPothe6RMhbgWf84UcK5aQd5eP5y+t" - + "Q== john.doe@example.com"; + + "jk2qBVMH3BgzPsTsEs+7ag9tfD8OCj+vOcwm626mQBZoR2e3niHa/9gnHBHFtOrGfzKbp" + + "RjTWtiOZbB9HF+rqMVD+Dawo/oicX/dDg7VAgOFSPothe6RMhbgWf84UcK5aQd5eP5y+t" + + "Q== john.doe@example.com"; private static final String KEY4 = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDIJzW9BaAeO+upFletwwEBnGS15lJmS5i" - + "08/NiFef0jXtNNKcLtnd13bq8jOi5VA2is0bwof1c8YbwcvUkdFa8RL5aXoyZBpfYZsWs" - + "/YBLZGiHy5rjooMZQMnH37A50cBPnXr0AQz0WRBxLDBDyOZho+O/DfYAKv4rzPSQ3yw4+" - + "w== john.doe@example.com"; + + "08/NiFef0jXtNNKcLtnd13bq8jOi5VA2is0bwof1c8YbwcvUkdFa8RL5aXoyZBpfYZsWs" + + "/YBLZGiHy5rjooMZQMnH37A50cBPnXr0AQz0WRBxLDBDyOZho+O/DfYAKv4rzPSQ3yw4+" + + "w== john.doe@example.com"; private static final String KEY5 = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCgBRKGhiXvY6D9sM+Vbth5Kate57YF7kD" - + "rqIyUiYIMJK93/AXc8qR/J/p3OIFQAxvLz1qozAur3j5HaiwvxVU19IiSA0vafdhaDLRi" - + "zRuEL5e/QOu9yGq9xkWApCmg6edpWAHG+Bx4AldU78MiZvzoB7gMMdxc9RmZ1gYj/DjxV" - + "w== john.doe@example.com"; + + "rqIyUiYIMJK93/AXc8qR/J/p3OIFQAxvLz1qozAur3j5HaiwvxVU19IiSA0vafdhaDLRi" + + "zRuEL5e/QOu9yGq9xkWApCmg6edpWAHG+Bx4AldU78MiZvzoB7gMMdxc9RmZ1gYj/DjxV" + + "w== john.doe@example.com"; @Test public void test() throws Exception { @@ -105,26 +103,25 @@ public class AuthorizedKeysTest { authorizedKeys.append(toWindowsLineEndings(addKey(keys, KEY5))); assertParse(authorizedKeys, keys); - } private static String toWindowsLineEndings(String s) { return s.replaceAll("\n", "\r\n"); } - private static void assertSerialization(List> keys, - StringBuilder expected) { + private static void assertSerialization( + List> keys, StringBuilder expected) { assertThat(AuthorizedKeys.serialize(keys)).isEqualTo(expected.toString()); } - private static void assertParse(StringBuilder authorizedKeys, - List> expectedKeys) { + private static void assertParse( + StringBuilder authorizedKeys, List> expectedKeys) { Account.Id accountId = new Account.Id(1); List> parsedKeys = AuthorizedKeys.parse(accountId, authorizedKeys.toString()); assertThat(parsedKeys).containsExactlyElementsIn(expectedKeys); int seq = 1; - for(Optional sshKey : parsedKeys) { + for (Optional sshKey : parsedKeys) { if (sshKey.isPresent()) { assertThat(sshKey.get().getAccount()).isEqualTo(accountId); assertThat(sshKey.get().getKey().get()).isEqualTo(seq); @@ -139,8 +136,7 @@ public class AuthorizedKeysTest { * @return the expected line for this key in the authorized_keys file */ private static String addKey(List> keys, String pub) { - AccountSshKey.Id keyId = - new AccountSshKey.Id(new Account.Id(1), keys.size() + 1); + AccountSshKey.Id keyId = new AccountSshKey.Id(new Account.Id(1), keys.size() + 1); AccountSshKey key = new AccountSshKey(keyId, pub); keys.add(Optional.of(key)); return key.getSshPublicKey() + "\n"; @@ -151,15 +147,12 @@ public class AuthorizedKeysTest { * * @return the expected line for this key in the authorized_keys file */ - private static String addInvalidKey(List> keys, - String pub) { - AccountSshKey.Id keyId = - new AccountSshKey.Id(new Account.Id(1), keys.size() + 1); + private static String addInvalidKey(List> keys, String pub) { + AccountSshKey.Id keyId = new AccountSshKey.Id(new Account.Id(1), keys.size() + 1); AccountSshKey key = new AccountSshKey(keyId, pub); key.setInvalid(); keys.add(Optional.of(key)); - return AuthorizedKeys.INVALID_KEY_COMMENT_PREFIX - + key.getSshPublicKey() + "\n"; + return AuthorizedKeys.INVALID_KEY_COMMENT_PREFIX + key.getSshPublicKey() + "\n"; } /** diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/account/UniversalGroupBackendTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/account/UniversalGroupBackendTest.java index 660edc9700..5444c5b087 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/account/UniversalGroupBackendTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/account/UniversalGroupBackendTest.java @@ -36,17 +36,14 @@ import com.google.gerrit.reviewdb.client.AccountGroup.UUID; import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.group.SystemGroupBackend; import com.google.gerrit.testutil.GerritBaseTests; - +import java.util.Set; import org.easymock.IAnswer; import org.eclipse.jgit.lib.Config; import org.junit.Before; import org.junit.Test; -import java.util.Set; - public class UniversalGroupBackendTest extends GerritBaseTests { - private static final AccountGroup.UUID OTHER_UUID = - new AccountGroup.UUID("other"); + private static final AccountGroup.UUID OTHER_UUID = new AccountGroup.UUID("other"); private UniversalGroupBackend backend; private IdentifiedUser user; @@ -71,10 +68,8 @@ public class UniversalGroupBackendTest extends GerritBaseTests { @Test public void get() { - assertEquals("Registered Users", - backend.get(REGISTERED_USERS).getName()); - assertEquals("Project Owners", - backend.get(PROJECT_OWNERS).getName()); + assertEquals("Registered Users", backend.get(REGISTERED_USERS).getName()); + assertEquals("Project Owners", backend.get(PROJECT_OWNERS).getName()); assertNull(backend.get(OTHER_UUID)); } @@ -113,25 +108,25 @@ public class UniversalGroupBackendTest extends GerritBaseTests { expect(backend.handles(handled)).andStubReturn(true); expect(backend.handles(not(eq(handled)))).andStubReturn(false); expect(backend.membershipsOf(anyObject(IdentifiedUser.class))) - .andStubAnswer(new IAnswer() { - @Override - public GroupMembership answer() throws Throwable { - Object[] args = getCurrentArguments(); - GroupMembership membership = createMock(GroupMembership.class); - expect(membership.contains(eq(handled))).andStubReturn(args[0] == member); - expect(membership.contains(not(eq(notHandled)))).andStubReturn(false); - replay(membership); - return membership; - } - }); + .andStubAnswer( + new IAnswer() { + @Override + public GroupMembership answer() throws Throwable { + Object[] args = getCurrentArguments(); + GroupMembership membership = createMock(GroupMembership.class); + expect(membership.contains(eq(handled))).andStubReturn(args[0] == member); + expect(membership.contains(not(eq(notHandled)))).andStubReturn(false); + replay(membership); + return membership; + } + }); replay(member, notMember, backend); backends = new DynamicSet<>(); backends.add(backend); backend = new UniversalGroupBackend(backends); - GroupMembership checker = - backend.membershipsOf(member); + GroupMembership checker = backend.membershipsOf(member); assertFalse(checker.contains(REGISTERED_USERS)); assertFalse(checker.contains(OTHER_UUID)); assertTrue(checker.contains(handled)); @@ -140,5 +135,4 @@ public class UniversalGroupBackendTest extends GerritBaseTests { assertFalse(checker.contains(handled)); assertFalse(checker.contains(notHandled)); } - } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/account/WatchConfigTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/account/WatchConfigTest.java index c40ca8339f..cf61de21aa 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/account/WatchConfigTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/account/WatchConfigTest.java @@ -22,17 +22,15 @@ import com.google.gerrit.server.account.WatchConfig.NotifyType; import com.google.gerrit.server.account.WatchConfig.NotifyValue; import com.google.gerrit.server.account.WatchConfig.ProjectWatchKey; import com.google.gerrit.server.git.ValidationError; - -import org.eclipse.jgit.lib.Config; -import org.junit.Before; -import org.junit.Test; - import java.util.ArrayList; import java.util.EnumSet; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import org.eclipse.jgit.lib.Config; +import org.junit.Before; +import org.junit.Test; public class WatchConfigTest implements ValidationError.Sink { private List validationErrors = new ArrayList<>(); @@ -45,14 +43,15 @@ public class WatchConfigTest implements ValidationError.Sink { @Test public void parseWatchConfig() throws Exception { Config cfg = new Config(); - cfg.fromText("[project \"myProject\"]\n" - + " notify = * [ALL_COMMENTS, NEW_PATCHSETS]\n" - + " notify = branch:master [NEW_CHANGES]\n" - + " notify = branch:master [NEW_PATCHSETS]\n" - + " notify = branch:foo []\n" - + "[project \"otherProject\"]\n" - + " notify = [NEW_PATCHSETS]\n" - + " notify = * [NEW_PATCHSETS, ALL_COMMENTS]\n"); + cfg.fromText( + "[project \"myProject\"]\n" + + " notify = * [ALL_COMMENTS, NEW_PATCHSETS]\n" + + " notify = branch:master [NEW_CHANGES]\n" + + " notify = branch:master [NEW_PATCHSETS]\n" + + " notify = branch:foo []\n" + + "[project \"otherProject\"]\n" + + " notify = [NEW_PATCHSETS]\n" + + " notify = * [NEW_PATCHSETS, ALL_COMMENTS]\n"); Map> projectWatches = WatchConfig.parse(new Account.Id(1000000), cfg, this); @@ -60,18 +59,19 @@ public class WatchConfigTest implements ValidationError.Sink { Project.NameKey myProject = new Project.NameKey("myProject"); Project.NameKey otherProject = new Project.NameKey("otherProject"); - Map> expectedProjectWatches = - new HashMap<>(); - expectedProjectWatches.put(ProjectWatchKey.create(myProject, null), + Map> expectedProjectWatches = new HashMap<>(); + expectedProjectWatches.put( + ProjectWatchKey.create(myProject, null), EnumSet.of(NotifyType.ALL_COMMENTS, NotifyType.NEW_PATCHSETS)); expectedProjectWatches.put( ProjectWatchKey.create(myProject, "branch:master"), EnumSet.of(NotifyType.NEW_CHANGES, NotifyType.NEW_PATCHSETS)); - expectedProjectWatches.put(ProjectWatchKey.create(myProject, "branch:foo"), - EnumSet.noneOf(NotifyType.class)); - expectedProjectWatches.put(ProjectWatchKey.create(otherProject, null), - EnumSet.of(NotifyType.NEW_PATCHSETS)); - expectedProjectWatches.put(ProjectWatchKey.create(otherProject, null), + expectedProjectWatches.put( + ProjectWatchKey.create(myProject, "branch:foo"), EnumSet.noneOf(NotifyType.class)); + expectedProjectWatches.put( + ProjectWatchKey.create(otherProject, null), EnumSet.of(NotifyType.NEW_PATCHSETS)); + expectedProjectWatches.put( + ProjectWatchKey.create(otherProject, null), EnumSet.of(NotifyType.ALL_COMMENTS, NotifyType.NEW_PATCHSETS)); assertThat(projectWatches).containsExactlyEntriesIn(expectedProjectWatches); } @@ -79,35 +79,40 @@ public class WatchConfigTest implements ValidationError.Sink { @Test public void parseInvalidWatchConfig() throws Exception { Config cfg = new Config(); - cfg.fromText("[project \"myProject\"]\n" - + " notify = * [ALL_COMMENTS, NEW_PATCHSETS]\n" - + " notify = branch:master [INVALID, NEW_CHANGES]\n" - + "[project \"otherProject\"]\n" - + " notify = [NEW_PATCHSETS]\n"); + cfg.fromText( + "[project \"myProject\"]\n" + + " notify = * [ALL_COMMENTS, NEW_PATCHSETS]\n" + + " notify = branch:master [INVALID, NEW_CHANGES]\n" + + "[project \"otherProject\"]\n" + + " notify = [NEW_PATCHSETS]\n"); WatchConfig.parse(new Account.Id(1000000), cfg, this); assertThat(validationErrors).hasSize(1); - assertThat(validationErrors.get(0).getMessage()).isEqualTo( - "watch.config: Invalid notify type INVALID in project watch of" - + " account 1000000 for project myProject: branch:master" - + " [INVALID, NEW_CHANGES]"); + assertThat(validationErrors.get(0).getMessage()) + .isEqualTo( + "watch.config: Invalid notify type INVALID in project watch of" + + " account 1000000 for project myProject: branch:master" + + " [INVALID, NEW_CHANGES]"); } @Test public void parseNotifyValue() throws Exception { assertParseNotifyValue("* []", null, EnumSet.noneOf(NotifyType.class)); - assertParseNotifyValue("* [ALL_COMMENTS]", null, - EnumSet.of(NotifyType.ALL_COMMENTS)); + assertParseNotifyValue("* [ALL_COMMENTS]", null, EnumSet.of(NotifyType.ALL_COMMENTS)); assertParseNotifyValue("[]", null, EnumSet.noneOf(NotifyType.class)); - assertParseNotifyValue("[ALL_COMMENTS, NEW_PATCHSETS]", null, + assertParseNotifyValue( + "[ALL_COMMENTS, NEW_PATCHSETS]", + null, EnumSet.of(NotifyType.ALL_COMMENTS, NotifyType.NEW_PATCHSETS)); - assertParseNotifyValue("branch:master []", "branch:master", + assertParseNotifyValue("branch:master []", "branch:master", EnumSet.noneOf(NotifyType.class)); + assertParseNotifyValue( + "branch:master || branch:stable []", + "branch:master || branch:stable", EnumSet.noneOf(NotifyType.class)); - assertParseNotifyValue("branch:master || branch:stable []", - "branch:master || branch:stable", EnumSet.noneOf(NotifyType.class)); - assertParseNotifyValue("branch:master [ALL_COMMENTS]", "branch:master", - EnumSet.of(NotifyType.ALL_COMMENTS)); - assertParseNotifyValue("branch:master [ALL_COMMENTS, NEW_PATCHSETS]", + assertParseNotifyValue( + "branch:master [ALL_COMMENTS]", "branch:master", EnumSet.of(NotifyType.ALL_COMMENTS)); + assertParseNotifyValue( + "branch:master [ALL_COMMENTS, NEW_PATCHSETS]", "branch:master", EnumSet.of(NotifyType.ALL_COMMENTS, NotifyType.NEW_PATCHSETS)); assertParseNotifyValue("* [ALL]", null, EnumSet.of(NotifyType.ALL)); @@ -129,31 +134,34 @@ public class WatchConfigTest implements ValidationError.Sink { public void toNotifyValue() throws Exception { assertToNotifyValue(null, EnumSet.noneOf(NotifyType.class), "* []"); assertToNotifyValue("*", EnumSet.noneOf(NotifyType.class), "* []"); - assertToNotifyValue(null, EnumSet.of(NotifyType.ALL_COMMENTS), - "* [ALL_COMMENTS]"); - assertToNotifyValue("branch:master", EnumSet.noneOf(NotifyType.class), - "branch:master []"); - assertToNotifyValue("branch:master", + assertToNotifyValue(null, EnumSet.of(NotifyType.ALL_COMMENTS), "* [ALL_COMMENTS]"); + assertToNotifyValue("branch:master", EnumSet.noneOf(NotifyType.class), "branch:master []"); + assertToNotifyValue( + "branch:master", EnumSet.of(NotifyType.ALL_COMMENTS, NotifyType.NEW_PATCHSETS), "branch:master [ALL_COMMENTS, NEW_PATCHSETS]"); - assertToNotifyValue("branch:master", - EnumSet.of(NotifyType.ABANDONED_CHANGES, NotifyType.ALL_COMMENTS, - NotifyType.NEW_CHANGES, NotifyType.NEW_PATCHSETS, + assertToNotifyValue( + "branch:master", + EnumSet.of( + NotifyType.ABANDONED_CHANGES, + NotifyType.ALL_COMMENTS, + NotifyType.NEW_CHANGES, + NotifyType.NEW_PATCHSETS, NotifyType.SUBMITTED_CHANGES), "branch:master [ABANDONED_CHANGES, ALL_COMMENTS, NEW_CHANGES," - + " NEW_PATCHSETS, SUBMITTED_CHANGES]"); + + " NEW_PATCHSETS, SUBMITTED_CHANGES]"); assertToNotifyValue("*", EnumSet.of(NotifyType.ALL), "* [ALL]"); } - private void assertParseNotifyValue(String notifyValue, - String expectedFilter, Set expectedNotifyTypes) { + private void assertParseNotifyValue( + String notifyValue, String expectedFilter, Set expectedNotifyTypes) { NotifyValue nv = parseNotifyValue(notifyValue); assertThat(nv.filter()).isEqualTo(expectedFilter); assertThat(nv.notifyTypes()).containsExactlyElementsIn(expectedNotifyTypes); } - private static void assertToNotifyValue(String filter, - Set notifyTypes, String expectedNotifyValue) { + private static void assertToNotifyValue( + String filter, Set notifyTypes, String expectedNotifyValue) { NotifyValue nv = NotifyValue.create(filter, notifyTypes); assertThat(nv.toString()).isEqualTo(expectedNotifyValue); } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/change/HashtagsTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/change/HashtagsTest.java index 50a6c1175f..96bac3c3ad 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/change/HashtagsTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/change/HashtagsTest.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.change; import static com.google.common.truth.Truth.assertThat; import com.google.common.collect.Sets; - import org.junit.Test; public class HashtagsTest { @@ -41,59 +40,56 @@ public class HashtagsTest { public void singleHashtag() throws Exception { String commitMessage = "#Subject\n\nLine 1\n\nLine 2"; assertThat(HashtagsUtil.extractTags(commitMessage)) - .containsExactlyElementsIn(Sets.newHashSet("Subject")); + .containsExactlyElementsIn(Sets.newHashSet("Subject")); } @Test public void singleHashtagNumeric() throws Exception { String commitMessage = "Subject\n\n#123\n\nLine 2"; assertThat(HashtagsUtil.extractTags(commitMessage)) - .containsExactlyElementsIn(Sets.newHashSet("123")); + .containsExactlyElementsIn(Sets.newHashSet("123")); } @Test public void multipleHashtags() throws Exception { String commitMessage = "#Subject\n\n#Hashtag\n\nLine 2"; assertThat(HashtagsUtil.extractTags(commitMessage)) - .containsExactlyElementsIn(Sets.newHashSet("Subject", "Hashtag")); + .containsExactlyElementsIn(Sets.newHashSet("Subject", "Hashtag")); } @Test public void repeatedHashtag() throws Exception { String commitMessage = "#Subject\n\n#Hashtag1\n\n#Hashtag2\n\n#Hashtag1"; assertThat(HashtagsUtil.extractTags(commitMessage)) - .containsExactlyElementsIn( - Sets.newHashSet("Subject", "Hashtag1", "Hashtag2")); + .containsExactlyElementsIn(Sets.newHashSet("Subject", "Hashtag1", "Hashtag2")); } @Test public void multipleHashtagsNoSpaces() throws Exception { String commitMessage = "Subject\n\n#Hashtag1#Hashtag2"; assertThat(HashtagsUtil.extractTags(commitMessage)) - .containsExactlyElementsIn(Sets.newHashSet("Hashtag1")); + .containsExactlyElementsIn(Sets.newHashSet("Hashtag1")); } @Test public void hyphenatedHashtag() throws Exception { String commitMessage = "Subject\n\n#Hyphenated-Hashtag"; assertThat(HashtagsUtil.extractTags(commitMessage)) - .containsExactlyElementsIn(Sets.newHashSet("Hyphenated-Hashtag")); + .containsExactlyElementsIn(Sets.newHashSet("Hyphenated-Hashtag")); } @Test public void underscoredHashtag() throws Exception { String commitMessage = "Subject\n\n#Underscored_Hashtag"; assertThat(HashtagsUtil.extractTags(commitMessage)) - .containsExactlyElementsIn(Sets.newHashSet("Underscored_Hashtag")); + .containsExactlyElementsIn(Sets.newHashSet("Underscored_Hashtag")); } @Test public void hashtagsWithAccentedCharacters() throws Exception { - String commitMessage = "Jag #måste #öva på min #Svenska!\n\n" - + "Jag behöver en #läkare."; + String commitMessage = "Jag #måste #öva på min #Svenska!\n\n" + "Jag behöver en #läkare."; assertThat(HashtagsUtil.extractTags(commitMessage)) - .containsExactlyElementsIn( - Sets.newHashSet("måste", "öva", "Svenska", "läkare")); + .containsExactlyElementsIn(Sets.newHashSet("måste", "öva", "Svenska", "läkare")); } @Test diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/change/IncludedInResolverTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/change/IncludedInResolverTest.java index 3e19366621..e91c3b411a 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/change/IncludedInResolverTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/change/IncludedInResolverTest.java @@ -14,6 +14,10 @@ package com.google.gerrit.server.change; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.MergeCommand.FastForwardMode; import org.eclipse.jgit.junit.RepositoryTestCase; @@ -27,11 +31,6 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - public class IncludedInResolverTest extends RepositoryTestCase { // Branch names @@ -68,21 +67,21 @@ public class IncludedInResolverTest extends RepositoryTestCase { /*- The following graph will be created. - o tag 2.5, 2.5_annotated, 2.5_annotated_twice - |\ - | o tag 2.0.1 - | o tag 2.0 - o | tag 1.3 - |/ - o c3 + o tag 2.5, 2.5_annotated, 2.5_annotated_twice + |\ + | o tag 2.0.1 + | o tag 2.0 + o | tag 1.3 + |/ + o c3 - | o tag 1.0.1 - |/ - o tag 1.0 - o c2 - o c1 + | o tag 1.0.1 + |/ + o tag 1.0 + o c2 + o c1 - */ + */ // TODO(dborowitz): Use try/finally when this doesn't double-close the repo. @SuppressWarnings("resource") @@ -96,8 +95,7 @@ public class IncludedInResolverTest extends RepositoryTestCase { RevCommit c3 = git.commit().setMessage("c3").call(); // Version 1.01 createAndCheckoutBranch(commit_v1_0, BRANCH_1_0); - RevCommit commit_v1_0_1 = - git.commit().setMessage("verREFS_HEADS_RELsion 1.0.1").call(); + RevCommit commit_v1_0_1 = git.commit().setMessage("verREFS_HEADS_RELsion 1.0.1").call(); git.tag().setName(TAG_1_0_1).setObjectId(commit_v1_0_1).call(); // Version 1.3 createAndCheckoutBranch(c3, BRANCH_1_3); @@ -112,18 +110,21 @@ public class IncludedInResolverTest extends RepositoryTestCase { // Version 2.5 createAndCheckoutBranch(commit_v1_3, BRANCH_2_5); - git.merge().include(commit_v2_0_1).setCommit(false) - .setFastForward(FastForwardMode.NO_FF).call(); - commit_v2_5 = git.commit().setMessage("version 2.5").call(); - git.tag().setName(TAG_2_5).setObjectId(commit_v2_5).setAnnotated(false) + git.merge() + .include(commit_v2_0_1) + .setCommit(false) + .setFastForward(FastForwardMode.NO_FF) .call(); + commit_v2_5 = git.commit().setMessage("version 2.5").call(); + git.tag().setName(TAG_2_5).setObjectId(commit_v2_5).setAnnotated(false).call(); Ref ref_tag_2_5_annotated = - git.tag().setName(TAG_2_5_ANNOTATED).setObjectId(commit_v2_5) - .setAnnotated(true).call(); - RevTag tag_2_5_annotated = - revWalk.parseTag(ref_tag_2_5_annotated.getObjectId()); - git.tag().setName(TAG_2_5_ANNOTATED_TWICE).setObjectId(tag_2_5_annotated) - .setAnnotated(true).call(); + git.tag().setName(TAG_2_5_ANNOTATED).setObjectId(commit_v2_5).setAnnotated(true).call(); + RevTag tag_2_5_annotated = revWalk.parseTag(ref_tag_2_5_annotated.getObjectId()); + git.tag() + .setName(TAG_2_5_ANNOTATED_TWICE) + .setObjectId(tag_2_5_annotated) + .setAnnotated(true) + .call(); } @Override @@ -198,8 +199,7 @@ public class IncludedInResolverTest extends RepositoryTestCase { Assert.assertEquals(list1, list2); } - private void createAndCheckoutBranch(ObjectId objectId, String branchName) - throws IOException { + private void createAndCheckoutBranch(ObjectId objectId, String branchName) throws IOException { String fullBranchName = "refs/heads/" + branchName; super.createBranch(objectId, fullBranchName); super.checkoutBranch(fullBranchName); diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/change/WalkSorterTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/change/WalkSorterTest.java index 7f6bb5e05e..37e4d3fb37 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/change/WalkSorterTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/change/WalkSorterTest.java @@ -30,7 +30,8 @@ import com.google.gerrit.testutil.GerritBaseTests; import com.google.gerrit.testutil.InMemoryRepositoryManager; import com.google.gerrit.testutil.InMemoryRepositoryManager.Repo; import com.google.gerrit.testutil.TestChanges; - +import java.util.ArrayList; +import java.util.List; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.revwalk.RevCommit; @@ -38,9 +39,6 @@ import org.eclipse.jgit.revwalk.RevWalk; import org.junit.Before; import org.junit.Test; -import java.util.ArrayList; -import java.util.List; - public class WalkSorterTest extends GerritBaseTests { private Account.Id userId; private InMemoryRepositoryManager repoManager; @@ -65,10 +63,11 @@ public class WalkSorterTest extends GerritBaseTests { List changes = ImmutableList.of(cd1, cd2, cd3); WalkSorter sorter = new WalkSorter(repoManager); - assertSorted(sorter, changes, ImmutableList.of( - patchSetData(cd3, c3_1), - patchSetData(cd2, c2_1), - patchSetData(cd1, c1_1))); + assertSorted( + sorter, + changes, + ImmutableList.of( + patchSetData(cd3, c3_1), patchSetData(cd2, c2_1), patchSetData(cd1, c1_1))); // Add new patch sets whose commits are in reverse order, so output is in // reverse order. @@ -80,10 +79,11 @@ public class WalkSorterTest extends GerritBaseTests { addPatchSet(cd2, c2_2); addPatchSet(cd3, c3_2); - assertSorted(sorter, changes, ImmutableList.of( - patchSetData(cd1, c1_2), - patchSetData(cd2, c2_2), - patchSetData(cd3, c3_2))); + assertSorted( + sorter, + changes, + ImmutableList.of( + patchSetData(cd1, c1_2), patchSetData(cd2, c2_2), patchSetData(cd3, c3_2))); } @Test @@ -99,9 +99,8 @@ public class WalkSorterTest extends GerritBaseTests { List changes = ImmutableList.of(cd1, cd3); WalkSorter sorter = new WalkSorter(repoManager); - assertSorted(sorter, changes, ImmutableList.of( - patchSetData(cd3, c3_1), - patchSetData(cd1, c1_1))); + assertSorted( + sorter, changes, ImmutableList.of(patchSetData(cd3, c3_1), patchSetData(cd1, c1_1))); } @Test @@ -115,12 +114,9 @@ public class WalkSorterTest extends GerritBaseTests { RevWalk rw = p.getRevWalk(); rw.parseCommit(c1); - assertThat(rw.parseCommit(c2).getCommitTime()) - .isEqualTo(c1.getCommitTime()); - assertThat(rw.parseCommit(c3).getCommitTime()) - .isEqualTo(c1.getCommitTime()); - assertThat(rw.parseCommit(c4).getCommitTime()) - .isEqualTo(c1.getCommitTime()); + assertThat(rw.parseCommit(c2).getCommitTime()).isEqualTo(c1.getCommitTime()); + assertThat(rw.parseCommit(c3).getCommitTime()).isEqualTo(c1.getCommitTime()); + assertThat(rw.parseCommit(c4).getCommitTime()).isEqualTo(c1.getCommitTime()); ChangeData cd1 = newChange(p, c1); ChangeData cd2 = newChange(p, c2); @@ -130,11 +126,14 @@ public class WalkSorterTest extends GerritBaseTests { List changes = ImmutableList.of(cd1, cd2, cd3, cd4); WalkSorter sorter = new WalkSorter(repoManager); - assertSorted(sorter, changes, ImmutableList.of( - patchSetData(cd4, c4), - patchSetData(cd3, c3), - patchSetData(cd2, c2), - patchSetData(cd1, c1))); + assertSorted( + sorter, + changes, + ImmutableList.of( + patchSetData(cd4, c4), + patchSetData(cd3, c3), + patchSetData(cd2, c2), + patchSetData(cd1, c1))); } @Test @@ -148,12 +147,9 @@ public class WalkSorterTest extends GerritBaseTests { RevWalk rw = p.getRevWalk(); rw.parseCommit(c1); - assertThat(rw.parseCommit(c2).getCommitTime()) - .isLessThan(c1.getCommitTime()); - assertThat(rw.parseCommit(c3).getCommitTime()) - .isLessThan(c2.getCommitTime()); - assertThat(rw.parseCommit(c4).getCommitTime()) - .isLessThan(c3.getCommitTime()); + assertThat(rw.parseCommit(c2).getCommitTime()).isLessThan(c1.getCommitTime()); + assertThat(rw.parseCommit(c3).getCommitTime()).isLessThan(c2.getCommitTime()); + assertThat(rw.parseCommit(c4).getCommitTime()).isLessThan(c3.getCommitTime()); ChangeData cd1 = newChange(p, c1); ChangeData cd2 = newChange(p, c2); @@ -163,11 +159,14 @@ public class WalkSorterTest extends GerritBaseTests { List changes = ImmutableList.of(cd1, cd2, cd3, cd4); WalkSorter sorter = new WalkSorter(repoManager); - assertSorted(sorter, changes, ImmutableList.of( - patchSetData(cd4, c4), - patchSetData(cd3, c3), - patchSetData(cd2, c2), - patchSetData(cd1, c1))); + assertSorted( + sorter, + changes, + ImmutableList.of( + patchSetData(cd4, c4), + patchSetData(cd3, c3), + patchSetData(cd2, c2), + patchSetData(cd1, c1))); } @Test @@ -181,12 +180,9 @@ public class WalkSorterTest extends GerritBaseTests { RevWalk rw = p.getRevWalk(); rw.parseCommit(c1); - assertThat(rw.parseCommit(c2).getCommitTime()) - .isLessThan(c1.getCommitTime()); - assertThat(rw.parseCommit(c3).getCommitTime()) - .isLessThan(c2.getCommitTime()); - assertThat(rw.parseCommit(c4).getCommitTime()) - .isLessThan(c3.getCommitTime()); + assertThat(rw.parseCommit(c2).getCommitTime()).isLessThan(c1.getCommitTime()); + assertThat(rw.parseCommit(c3).getCommitTime()).isLessThan(c2.getCommitTime()); + assertThat(rw.parseCommit(c4).getCommitTime()).isLessThan(c3.getCommitTime()); ChangeData cd1 = newChange(p, c1); ChangeData cd2 = newChange(p, c2); @@ -194,10 +190,8 @@ public class WalkSorterTest extends GerritBaseTests { List changes = ImmutableList.of(cd1, cd2, cd4); WalkSorter sorter = new WalkSorter(repoManager); - List expected = ImmutableList.of( - patchSetData(cd4, c4), - patchSetData(cd2, c2), - patchSetData(cd1, c1)); + List expected = + ImmutableList.of(patchSetData(cd4, c4), patchSetData(cd2, c2), patchSetData(cd1, c1)); for (List list : permutations(changes)) { // Not inOrder(); since child of c2 is missing, partial topo sort isn't @@ -216,12 +210,9 @@ public class WalkSorterTest extends GerritBaseTests { RevWalk rw = p.getRevWalk(); rw.parseCommit(c1); - assertThat(rw.parseCommit(c2).getCommitTime()) - .isEqualTo(c1.getCommitTime()); - assertThat(rw.parseCommit(c3).getCommitTime()) - .isEqualTo(c1.getCommitTime()); - assertThat(rw.parseCommit(c4).getCommitTime()) - .isEqualTo(c1.getCommitTime()); + assertThat(rw.parseCommit(c2).getCommitTime()).isEqualTo(c1.getCommitTime()); + assertThat(rw.parseCommit(c3).getCommitTime()).isEqualTo(c1.getCommitTime()); + assertThat(rw.parseCommit(c4).getCommitTime()).isEqualTo(c1.getCommitTime()); ChangeData cd1 = newChange(p, c1); ChangeData cd2 = newChange(p, c2); @@ -231,11 +222,14 @@ public class WalkSorterTest extends GerritBaseTests { List changes = ImmutableList.of(cd1, cd2, cd3, cd4); WalkSorter sorter = new WalkSorter(repoManager); - assertSorted(sorter, changes, ImmutableList.of( - patchSetData(cd4, c4), - patchSetData(cd3, c3), - patchSetData(cd2, c2), - patchSetData(cd1, c1))); + assertSorted( + sorter, + changes, + ImmutableList.of( + patchSetData(cd4, c4), + patchSetData(cd3, c3), + patchSetData(cd2, c2), + patchSetData(cd1, c1))); } @Test @@ -281,17 +275,14 @@ public class WalkSorterTest extends GerritBaseTests { List changes = ImmutableList.of(cd1, cd2); WalkSorter sorter = new WalkSorter(repoManager); - assertSorted(sorter, changes, ImmutableList.of( - patchSetData(cd1, c1_2), - patchSetData(cd2, c2_2))); + assertSorted( + sorter, changes, ImmutableList.of(patchSetData(cd1, c1_2), patchSetData(cd2, c2_2))); // If we restrict to PS1 of each change, the sorter uses that commit. - sorter.includePatchSets(ImmutableSet.of( - new PatchSet.Id(cd1.getId(), 1), - new PatchSet.Id(cd2.getId(), 1))); - assertSorted(sorter, changes, ImmutableList.of( - patchSetData(cd2, 1, c2_1), - patchSetData(cd1, 1, c1_1))); + sorter.includePatchSets( + ImmutableSet.of(new PatchSet.Id(cd1.getId(), 1), new PatchSet.Id(cd2.getId(), 1))); + assertSorted( + sorter, changes, ImmutableList.of(patchSetData(cd2, 1, c2_1), patchSetData(cd1, 1, c1_1))); } @Test @@ -305,8 +296,9 @@ public class WalkSorterTest extends GerritBaseTests { ChangeData cd2 = newChange(pb, c2); List changes = ImmutableList.of(cd1, cd2); - WalkSorter sorter = new WalkSorter(repoManager) - .includePatchSets(ImmutableSet.of(cd1.currentPatchSet().getId())); + WalkSorter sorter = + new WalkSorter(repoManager) + .includePatchSets(ImmutableSet.of(cd1.currentPatchSet().getId())); assertSorted(sorter, changes, ImmutableList.of(patchSetData(cd1, c1))); } @@ -318,19 +310,13 @@ public class WalkSorterTest extends GerritBaseTests { ChangeData cd = newChange(p, c); List changes = ImmutableList.of(cd); - RevCommit actual = new WalkSorter(repoManager) - .setRetainBody(true) - .sort(changes) - .iterator().next() - .commit(); + RevCommit actual = + new WalkSorter(repoManager).setRetainBody(true).sort(changes).iterator().next().commit(); assertThat(actual.getRawBuffer()).isNotNull(); assertThat(actual.getShortMessage()).isEqualTo("message"); - actual = new WalkSorter(repoManager) - .setRetainBody(false) - .sort(changes) - .iterator().next() - .commit(); + actual = + new WalkSorter(repoManager).setRetainBody(false).sort(changes).iterator().next().commit(); assertThat(actual.getRawBuffer()).isNull(); } @@ -346,8 +332,7 @@ public class WalkSorterTest extends GerritBaseTests { assertSorted(sorter, changes, ImmutableList.of(patchSetData(cd, c))); } - private ChangeData newChange(TestRepository tr, ObjectId id) - throws Exception { + private ChangeData newChange(TestRepository tr, ObjectId id) throws Exception { Project.NameKey project = tr.getRepository().getDescription().getProject(); Change c = TestChanges.newChange(project, userId); ChangeData cd = ChangeData.createForTest(project, c.getId(), 1); @@ -367,28 +352,23 @@ public class WalkSorterTest extends GerritBaseTests { return ps; } - private TestRepository newRepo(String name) - throws Exception { - return new TestRepository<>( - repoManager.createRepository(new Project.NameKey(name))); + private TestRepository newRepo(String name) throws Exception { + return new TestRepository<>(repoManager.createRepository(new Project.NameKey(name))); } - private static PatchSetData patchSetData(ChangeData cd, RevCommit commit) - throws Exception { + private static PatchSetData patchSetData(ChangeData cd, RevCommit commit) throws Exception { return PatchSetData.create(cd, cd.currentPatchSet(), commit); } - private static PatchSetData patchSetData(ChangeData cd, int psId, - RevCommit commit) throws Exception { - return PatchSetData.create( - cd, cd.patchSet(new PatchSet.Id(cd.getId(), psId)), commit); + private static PatchSetData patchSetData(ChangeData cd, int psId, RevCommit commit) + throws Exception { + return PatchSetData.create(cd, cd.patchSet(new PatchSet.Id(cd.getId(), psId)), commit); } - private static void assertSorted(WalkSorter sorter, List changes, - List expected) throws Exception { + private static void assertSorted( + WalkSorter sorter, List changes, List expected) throws Exception { for (List list : permutations(changes)) { - assertThat(sorter.sort(list)) - .containsExactlyElementsIn(expected).inOrder(); + assertThat(sorter.sort(list)).containsExactlyElementsIn(expected).inOrder(); } } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/config/ConfigUtilTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/config/ConfigUtilTest.java index 8f7e5b23c4..fc0b1dcde3 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/config/ConfigUtilTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/config/ConfigUtilTest.java @@ -23,13 +23,11 @@ import static java.util.concurrent.TimeUnit.SECONDS; import static org.junit.Assert.assertEquals; import com.google.gerrit.extensions.client.Theme; - -import org.eclipse.jgit.lib.Config; -import org.junit.Test; - import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; +import org.eclipse.jgit.lib.Config; +import org.junit.Test; public class ConfigUtilTest { private static final String SECT = "foo"; @@ -54,6 +52,7 @@ public class ConfigUtilTest { public Theme td; public List list; public Map map; + static SectionInfo defaults() { SectionInfo i = new SectionInfo(); i.i = 1; diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/config/ListCapabilitiesTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/config/ListCapabilitiesTest.java index bd9f463c2c..6fe48dcc0f 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/config/ListCapabilitiesTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/config/ListCapabilitiesTest.java @@ -26,39 +26,38 @@ import com.google.gerrit.server.config.ListCapabilities.CapabilityInfo; import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Injector; - +import java.util.Map; import org.junit.Before; import org.junit.Test; -import java.util.Map; - public class ListCapabilitiesTest { private Injector injector; @Before public void setUp() throws Exception { - AbstractModule mod = new AbstractModule() { - @Override - protected void configure() { - DynamicMap.mapOf(binder(), CapabilityDefinition.class); - bind(CapabilityDefinition.class) - .annotatedWith(Exports.named("printHello")) - .toInstance(new CapabilityDefinition() { - @Override - public String getDescription() { - return "Print Hello"; - } - }); - } - }; + AbstractModule mod = + new AbstractModule() { + @Override + protected void configure() { + DynamicMap.mapOf(binder(), CapabilityDefinition.class); + bind(CapabilityDefinition.class) + .annotatedWith(Exports.named("printHello")) + .toInstance( + new CapabilityDefinition() { + @Override + public String getDescription() { + return "Print Hello"; + } + }); + } + }; injector = Guice.createInjector(mod); } @Test public void list() throws Exception { Map m = - injector.getInstance(ListCapabilities.class) - .apply(new ConfigResource()); + injector.getInstance(ListCapabilities.class).apply(new ConfigResource()); for (String id : GlobalCapability.getAllNames()) { assertTrue("contains " + id, m.containsKey(id)); assertEquals(id, m.get(id).id); diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/config/RepositoryConfigTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/config/RepositoryConfigTest.java index 88eec7e42e..804e2f2f2e 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/config/RepositoryConfigTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/config/RepositoryConfigTest.java @@ -19,14 +19,12 @@ import static com.google.common.truth.Truth.assertThat; import com.google.common.collect.ImmutableList; import com.google.gerrit.extensions.client.SubmitType; import com.google.gerrit.reviewdb.client.Project.NameKey; - -import org.eclipse.jgit.lib.Config; -import org.junit.Before; -import org.junit.Test; - import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; +import org.eclipse.jgit.lib.Config; +import org.junit.Before; +import org.junit.Test; public class RepositoryConfigTest { @@ -75,28 +73,26 @@ public class RepositoryConfigTest { @Test public void defaultSubmitTypeForStartWithFilter() { - configureDefaultSubmitType("somePath/somePath/*", - SubmitType.REBASE_IF_NECESSARY); + configureDefaultSubmitType("somePath/somePath/*", SubmitType.REBASE_IF_NECESSARY); configureDefaultSubmitType("somePath/*", SubmitType.CHERRY_PICK); configureDefaultSubmitType("*", SubmitType.MERGE_ALWAYS); assertThat(repoCfg.getDefaultSubmitType(new NameKey("someProject"))) .isEqualTo(SubmitType.MERGE_ALWAYS); - assertThat( - repoCfg.getDefaultSubmitType(new NameKey("somePath/someProject"))) + assertThat(repoCfg.getDefaultSubmitType(new NameKey("somePath/someProject"))) .isEqualTo(SubmitType.CHERRY_PICK); - assertThat( - repoCfg.getDefaultSubmitType(new NameKey( - "somePath/somePath/someProject"))).isEqualTo( - SubmitType.REBASE_IF_NECESSARY); + assertThat(repoCfg.getDefaultSubmitType(new NameKey("somePath/somePath/someProject"))) + .isEqualTo(SubmitType.REBASE_IF_NECESSARY); } - private void configureDefaultSubmitType(String projectFilter, - SubmitType submitType) { - cfg.setString(RepositoryConfig.SECTION_NAME, projectFilter, - RepositoryConfig.DEFAULT_SUBMIT_TYPE_NAME, submitType.toString()); + private void configureDefaultSubmitType(String projectFilter, SubmitType submitType) { + cfg.setString( + RepositoryConfig.SECTION_NAME, + projectFilter, + RepositoryConfig.DEFAULT_SUBMIT_TYPE_NAME, + submitType.toString()); } @Test @@ -116,8 +112,7 @@ public class RepositoryConfigTest { public void ownerGroupsForSpecificFilter() { ImmutableList ownerGroups = ImmutableList.of("group1", "group2"); configureOwnerGroups("someProject", ownerGroups); - assertThat(repoCfg.getOwnerGroups(new NameKey("someOtherProject"))) - .isEmpty(); + assertThat(repoCfg.getOwnerGroups(new NameKey("someOtherProject"))).isEmpty(); assertThat(repoCfg.getOwnerGroups(new NameKey("someProject"))) .containsExactlyElementsIn(ownerGroups); } @@ -138,38 +133,36 @@ public class RepositoryConfigTest { assertThat(repoCfg.getOwnerGroups(new NameKey("somePath/someProject"))) .containsExactlyElementsIn(ownerGroups2); - assertThat( - repoCfg.getOwnerGroups(new NameKey("somePath/somePath/someProject"))) + assertThat(repoCfg.getOwnerGroups(new NameKey("somePath/somePath/someProject"))) .containsExactlyElementsIn(ownerGroups3); } - private void configureOwnerGroups(String projectFilter, - List ownerGroups) { - cfg.setStringList(RepositoryConfig.SECTION_NAME, projectFilter, - RepositoryConfig.OWNER_GROUP_NAME, ownerGroups); + private void configureOwnerGroups(String projectFilter, List ownerGroups) { + cfg.setStringList( + RepositoryConfig.SECTION_NAME, + projectFilter, + RepositoryConfig.OWNER_GROUP_NAME, + ownerGroups); } @Test public void basePathWhenNotConfigured() { - assertThat((Object)repoCfg.getBasePath(new NameKey("someProject"))).isNull(); + assertThat((Object) repoCfg.getBasePath(new NameKey("someProject"))).isNull(); } @Test public void basePathForStarFilter() { String basePath = "/someAbsolutePath/someDirectory"; configureBasePath("*", basePath); - assertThat(repoCfg.getBasePath(new NameKey("someProject")).toString()) - .isEqualTo(basePath); + assertThat(repoCfg.getBasePath(new NameKey("someProject")).toString()).isEqualTo(basePath); } @Test public void basePathForSpecificFilter() { String basePath = "/someAbsolutePath/someDirectory"; configureBasePath("someProject", basePath); - assertThat((Object) repoCfg.getBasePath(new NameKey("someOtherProject"))) - .isNull(); - assertThat(repoCfg.getBasePath(new NameKey("someProject")).toString()) - .isEqualTo(basePath); + assertThat((Object) repoCfg.getBasePath(new NameKey("someOtherProject"))).isNull(); + assertThat(repoCfg.getBasePath(new NameKey("someProject")).toString()).isEqualTo(basePath); } @Test @@ -184,23 +177,19 @@ public class RepositoryConfigTest { configureBasePath("project/*", basePath3); configureBasePath("*", basePath4); - assertThat(repoCfg.getBasePath(new NameKey("project1")).toString()) - .isEqualTo(basePath1); - assertThat(repoCfg.getBasePath(new NameKey("project/project/someProject")) - .toString()).isEqualTo(basePath2); - assertThat( - repoCfg.getBasePath(new NameKey("project/someProject")).toString()) - .isEqualTo(basePath3); - assertThat(repoCfg.getBasePath(new NameKey("someProject")).toString()) - .isEqualTo(basePath4); + assertThat(repoCfg.getBasePath(new NameKey("project1")).toString()).isEqualTo(basePath1); + assertThat(repoCfg.getBasePath(new NameKey("project/project/someProject")).toString()) + .isEqualTo(basePath2); + assertThat(repoCfg.getBasePath(new NameKey("project/someProject")).toString()) + .isEqualTo(basePath3); + assertThat(repoCfg.getBasePath(new NameKey("someProject")).toString()).isEqualTo(basePath4); } @Test public void allBasePath() { - ImmutableList allBasePaths = ImmutableList.of( - Paths.get("/someBasePath1"), - Paths.get("/someBasePath2"), - Paths.get("/someBasePath2")); + ImmutableList allBasePaths = + ImmutableList.of( + Paths.get("/someBasePath1"), Paths.get("/someBasePath2"), Paths.get("/someBasePath2")); configureBasePath("*", allBasePaths.get(0).toString()); configureBasePath("project/*", allBasePaths.get(1).toString()); @@ -210,7 +199,7 @@ public class RepositoryConfigTest { } private void configureBasePath(String projectFilter, String basePath) { - cfg.setString(RepositoryConfig.SECTION_NAME, projectFilter, - RepositoryConfig.BASE_PATH_NAME, basePath); + cfg.setString( + RepositoryConfig.SECTION_NAME, projectFilter, RepositoryConfig.BASE_PATH_NAME, basePath); } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/config/ScheduleConfigTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/config/ScheduleConfigTest.java index e93de504c7..e6f36b9676 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/config/ScheduleConfigTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/config/ScheduleConfigTest.java @@ -20,12 +20,11 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.concurrent.TimeUnit.MINUTES; import static org.junit.Assert.assertEquals; +import java.util.concurrent.TimeUnit; import org.eclipse.jgit.lib.Config; import org.joda.time.DateTime; import org.junit.Test; -import java.util.concurrent.TimeUnit; - public class ScheduleConfigTest { // Friday June 13, 2014 10:00 UTC @@ -43,8 +42,7 @@ public class ScheduleConfigTest { assertEquals(ms(19, HOURS) + ms(30, MINUTES), initialDelay("05:30", "1d")); assertEquals(ms(1, HOURS), initialDelay("11:00", "1w")); - assertEquals(ms(7, DAYS) - ms(4, HOURS) - ms(30, MINUTES), - initialDelay("05:30", "1w")); + assertEquals(ms(7, DAYS) - ms(4, HOURS) - ms(30, MINUTES), initialDelay("05:30", "1w")); assertEquals(ms(3, DAYS) + ms(1, HOURS), initialDelay("Mon 11:00", "1w")); assertEquals(ms(1, HOURS), initialDelay("Fri 11:00", "1w")); @@ -71,9 +69,8 @@ public class ScheduleConfigTest { } private static long initialDelay(String startTime, String interval) { - return new ScheduleConfig( - config(startTime, interval), - "section", "subsection", NOW).getInitialDelay(); + return new ScheduleConfig(config(startTime, interval), "section", "subsection", NOW) + .getInitialDelay(); } private static Config config(String startTime, String interval) { diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/config/SitePathsTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/config/SitePathsTest.java index 29a7ddee73..d0f0766bfd 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/config/SitePathsTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/config/SitePathsTest.java @@ -22,14 +22,12 @@ import static org.junit.Assert.assertTrue; import com.google.gerrit.server.util.HostPlatform; import com.google.gerrit.testutil.GerritBaseTests; - -import org.junit.Test; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.NotDirectoryException; import java.nio.file.Path; import java.nio.file.Paths; +import org.junit.Test; public class SitePathsTest extends GerritBaseTests { @Test @@ -93,8 +91,7 @@ public class SitePathsTest extends GerritBaseTests { assertNull(site.resolve("")); assertNotNull(site.resolve("a")); - assertEquals(root.resolve("a").toAbsolutePath().normalize(), - site.resolve("a")); + assertEquals(root.resolve("a").toAbsolutePath().normalize(), site.resolve("a")); final String pfx = HostPlatform.isWin32() ? "C:/" : "/"; assertNotNull(site.resolve(pfx + "a")); diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/edit/ChangeEditTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/edit/ChangeEditTest.java index 8c963bd759..6509c4b0c0 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/edit/ChangeEditTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/edit/ChangeEditTest.java @@ -20,7 +20,6 @@ import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.reviewdb.client.RefNames; - import org.junit.Test; public class ChangeEditTest { diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/events/EventDeserializerTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/events/EventDeserializerTest.java index b6e73ff6b7..355f775197 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/events/EventDeserializerTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/events/EventDeserializerTest.java @@ -22,7 +22,6 @@ import com.google.gerrit.server.data.AccountAttribute; import com.google.gerrit.server.data.RefUpdateAttribute; import com.google.gson.Gson; import com.google.gson.GsonBuilder; - import org.junit.Test; public class EventDeserializerTest { @@ -39,32 +38,32 @@ public class EventDeserializerTest { accountAttribute.email = "some.user@domain.com"; refUpdatedEvent.submitter = createSupplier(accountAttribute); - Gson gsonSerializer = new GsonBuilder() - .registerTypeAdapter(Supplier.class, new SupplierSerializer()).create(); + Gson gsonSerializer = + new GsonBuilder().registerTypeAdapter(Supplier.class, new SupplierSerializer()).create(); String serializedEvent = gsonSerializer.toJson(refUpdatedEvent); - Gson gsonDeserializer = new GsonBuilder() - .registerTypeAdapter(Event.class, new EventDeserializer()) - .registerTypeAdapter(Supplier.class, new SupplierDeserializer()) - .create(); + Gson gsonDeserializer = + new GsonBuilder() + .registerTypeAdapter(Event.class, new EventDeserializer()) + .registerTypeAdapter(Supplier.class, new SupplierDeserializer()) + .create(); - RefUpdatedEvent e = (RefUpdatedEvent) gsonDeserializer - .fromJson(serializedEvent, Event.class); + RefUpdatedEvent e = (RefUpdatedEvent) gsonDeserializer.fromJson(serializedEvent, Event.class); assertThat(e).isNotNull(); assertThat(e.refUpdate).isInstanceOf(Supplier.class); - assertThat(e.refUpdate.get().refName) - .isEqualTo(refUpdatedAttribute.refName); + assertThat(e.refUpdate.get().refName).isEqualTo(refUpdatedAttribute.refName); assertThat(e.submitter).isInstanceOf(Supplier.class); assertThat(e.submitter.get().email).isEqualTo(accountAttribute.email); } private Supplier createSupplier(final T value) { - return Suppliers.memoize(new Supplier() { - @Override - public T get() { - return value; - } - }); + return Suppliers.memoize( + new Supplier() { + @Override + public T get() { + return value; + } + }); } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/events/EventTypesTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/events/EventTypesTest.java index de13fd8966..c822d6c68c 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/events/EventTypesTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/events/EventTypesTest.java @@ -21,6 +21,7 @@ import org.junit.Test; public class EventTypesTest { public static class TestEvent extends Event { private static final String TYPE = "test-event"; + public TestEvent() { super(TYPE); } @@ -28,6 +29,7 @@ public class EventTypesTest { public static class AnotherTestEvent extends Event { private static final String TYPE = "another-test-event"; + public AnotherTestEvent() { super("another-test-event"); } @@ -38,8 +40,7 @@ public class EventTypesTest { EventTypes.register(TestEvent.TYPE, TestEvent.class); EventTypes.register(AnotherTestEvent.TYPE, AnotherTestEvent.class); assertThat(EventTypes.getClass(TestEvent.TYPE)).isEqualTo(TestEvent.class); - assertThat(EventTypes.getClass(AnotherTestEvent.TYPE)) - .isEqualTo(AnotherTestEvent.class); + assertThat(EventTypes.getClass(AnotherTestEvent.TYPE)).isEqualTo(AnotherTestEvent.class); } @Test diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/git/BatchUpdateTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/git/BatchUpdateTest.java index 87bfa001b1..e3f8530e64 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/git/BatchUpdateTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/git/BatchUpdateTest.java @@ -24,7 +24,6 @@ import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Provider; import com.google.inject.util.Providers; - import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.revwalk.RevCommit; @@ -34,26 +33,19 @@ import org.junit.Before; import org.junit.Test; public class BatchUpdateTest { - @Inject - private AccountManager accountManager; + @Inject private AccountManager accountManager; - @Inject - private IdentifiedUser.GenericFactory userFactory; + @Inject private IdentifiedUser.GenericFactory userFactory; - @Inject - private InMemoryDatabase schemaFactory; + @Inject private InMemoryDatabase schemaFactory; - @Inject - private InMemoryRepositoryManager repoManager; + @Inject private InMemoryRepositoryManager repoManager; - @Inject - private SchemaCreator schemaCreator; + @Inject private SchemaCreator schemaCreator; - @Inject - private ThreadLocalRequestContext requestContext; + @Inject private ThreadLocalRequestContext requestContext; - @Inject - private BatchUpdate.Factory batchUpdateFactory; + @Inject private BatchUpdate.Factory batchUpdateFactory; private LifecycleManager lifecycle; private ReviewDb db; @@ -71,8 +63,7 @@ public class BatchUpdateTest { db = schemaFactory.open(); schemaCreator.create(db); - Account.Id userId = accountManager.authenticate(AuthRequest.forUser("user")) - .getAccountId(); + Account.Id userId = accountManager.authenticate(AuthRequest.forUser("user")).getAccountId(); user = userFactory.create(userId); project = new Project.NameKey("test"); @@ -80,17 +71,18 @@ public class BatchUpdateTest { InMemoryRepository inMemoryRepo = repoManager.createRepository(project); repo = new TestRepository<>(inMemoryRepo); - requestContext.setContext(new RequestContext() { - @Override - public CurrentUser getUser() { - return user; - } + requestContext.setContext( + new RequestContext() { + @Override + public CurrentUser getUser() { + return user; + } - @Override - public Provider getReviewDbProvider() { - return Providers.of(db); - } - }); + @Override + public Provider getReviewDbProvider() { + return Providers.of(db); + } + }); } @After @@ -111,24 +103,22 @@ public class BatchUpdateTest { @Test public void addRefUpdateFromFastForwardCommit() throws Exception { final RevCommit masterCommit = repo.branch("master").commit().create(); - final RevCommit branchCommit = - repo.branch("branch").commit().parent(masterCommit).create(); + final RevCommit branchCommit = repo.branch("branch").commit().parent(masterCommit).create(); - try (BatchUpdate bu = batchUpdateFactory - .create(db, project, user, TimeUtil.nowTs())) { - bu.addRepoOnlyOp(new RepoOnlyOp() { - @Override - public void updateRepo(RepoContext ctx) throws Exception { - ctx.addRefUpdate( - new ReceiveCommand(masterCommit.getId(), branchCommit.getId(), - "refs/heads/master")); - } - }); + try (BatchUpdate bu = batchUpdateFactory.create(db, project, user, TimeUtil.nowTs())) { + bu.addRepoOnlyOp( + new RepoOnlyOp() { + @Override + public void updateRepo(RepoContext ctx) throws Exception { + ctx.addRefUpdate( + new ReceiveCommand( + masterCommit.getId(), branchCommit.getId(), "refs/heads/master")); + } + }); bu.execute(); } assertEquals( - repo.getRepository().exactRef("refs/heads/master").getObjectId(), - branchCommit.getId()); + repo.getRepository().exactRef("refs/heads/master").getObjectId(), branchCommit.getId()); } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/git/DestinationListTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/git/DestinationListTest.java index fb046fdb00..e067632620 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/git/DestinationListTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/git/DestinationListTest.java @@ -20,14 +20,11 @@ import static org.easymock.EasyMock.replay; import com.google.gerrit.reviewdb.client.Branch; import com.google.gerrit.reviewdb.client.Project; - -import junit.framework.TestCase; - -import org.junit.Test; - import java.io.IOException; import java.util.HashSet; import java.util.Set; +import junit.framework.TestCase; +import org.junit.Test; public class DestinationListTest extends TestCase { public static final String R_FOO = "refs/heads/foo"; @@ -62,6 +59,7 @@ public class DestinationListTest extends TestCase { public static final Branch.NameKey B_COMPLEX = dest(P_COMPLEX, R_FOO); public static final Set D_SIMPLE = new HashSet<>(); + static { D_SIMPLE.clear(); D_SIMPLE.add(B_FOO); diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/git/GroupCollectorTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/git/GroupCollectorTest.java index ff9b81bcb4..e5e8e261e5 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/git/GroupCollectorTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/git/GroupCollectorTest.java @@ -21,7 +21,6 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.SortedSetMultimap; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.PatchSet; - import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription; import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository; import org.eclipse.jgit.junit.TestRepository; @@ -37,8 +36,7 @@ public class GroupCollectorTest { @Before public void setUp() throws Exception { - tr = new TestRepository<>( - new InMemoryRepository(new DfsRepositoryDescription("repo"))); + tr = new TestRepository<>(new InMemoryRepository(new DfsRepositoryDescription("repo"))); } @Test @@ -46,58 +44,48 @@ public class GroupCollectorTest { RevCommit branchTip = tr.commit().create(); RevCommit a = tr.commit().parent(branchTip).create(); - SortedSetMultimap groups = collectGroups( - newWalk(a, branchTip), - patchSets(), - groups()); + SortedSetMultimap groups = + collectGroups(newWalk(a, branchTip), patchSets(), groups()); assertThat(groups).containsEntry(a, a.name()); } @Test - public void commitWhoseParentIsNewPatchSetGetsParentsGroup() - throws Exception { + public void commitWhoseParentIsNewPatchSetGetsParentsGroup() throws Exception { RevCommit branchTip = tr.commit().create(); RevCommit a = tr.commit().parent(branchTip).create(); RevCommit b = tr.commit().parent(a).create(); - SortedSetMultimap groups = collectGroups( - newWalk(b, branchTip), - patchSets(), - groups()); + SortedSetMultimap groups = + collectGroups(newWalk(b, branchTip), patchSets(), groups()); assertThat(groups).containsEntry(a, a.name()); assertThat(groups).containsEntry(b, a.name()); } @Test - public void commitWhoseParentIsExistingPatchSetGetsParentsGroup() - throws Exception { + public void commitWhoseParentIsExistingPatchSetGetsParentsGroup() throws Exception { RevCommit branchTip = tr.commit().create(); RevCommit a = tr.commit().parent(branchTip).create(); RevCommit b = tr.commit().parent(a).create(); String group = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"; - SortedSetMultimap groups = collectGroups( - newWalk(b, branchTip), - patchSets().put(a, psId(1, 1)), - groups().put(psId(1, 1), group)); + SortedSetMultimap groups = + collectGroups( + newWalk(b, branchTip), patchSets().put(a, psId(1, 1)), groups().put(psId(1, 1), group)); assertThat(groups).containsEntry(a, group); assertThat(groups).containsEntry(b, group); } @Test - public void commitWhoseParentIsExistingPatchSetWithNoGroup() - throws Exception { + public void commitWhoseParentIsExistingPatchSetWithNoGroup() throws Exception { RevCommit branchTip = tr.commit().create(); RevCommit a = tr.commit().parent(branchTip).create(); RevCommit b = tr.commit().parent(a).create(); - SortedSetMultimap groups = collectGroups( - newWalk(b, branchTip), - patchSets().put(a, psId(1, 1)), - groups()); + SortedSetMultimap groups = + collectGroups(newWalk(b, branchTip), patchSets().put(a, psId(1, 1)), groups()); assertThat(groups).containsEntry(a, a.name()); assertThat(groups).containsEntry(b, a.name()); @@ -110,10 +98,8 @@ public class GroupCollectorTest { RevCommit b = tr.commit().parent(branchTip).create(); RevCommit m = tr.commit().parent(a).parent(b).create(); - SortedSetMultimap groups = collectGroups( - newWalk(m, branchTip), - patchSets(), - groups()); + SortedSetMultimap groups = + collectGroups(newWalk(m, branchTip), patchSets(), groups()); assertThat(groups).containsEntry(a, a.name()); assertThat(groups).containsEntry(b, a.name()); @@ -128,10 +114,9 @@ public class GroupCollectorTest { RevCommit m = tr.commit().parent(a).parent(b).create(); String group = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"; - SortedSetMultimap groups = collectGroups( - newWalk(m, branchTip), - patchSets().put(b, psId(1, 1)), - groups().put(psId(1, 1), group)); + SortedSetMultimap groups = + collectGroups( + newWalk(m, branchTip), patchSets().put(b, psId(1, 1)), groups().put(psId(1, 1), group)); // Merge commit and other parent get the existing group. assertThat(groups).containsEntry(a, group); @@ -140,8 +125,7 @@ public class GroupCollectorTest { } @Test - public void mergeCommitWhereBothParentsHaveDifferentGroups() - throws Exception { + public void mergeCommitWhereBothParentsHaveDifferentGroups() throws Exception { RevCommit branchTip = tr.commit().create(); RevCommit a = tr.commit().parent(branchTip).create(); RevCommit b = tr.commit().parent(branchTip).create(); @@ -149,20 +133,16 @@ public class GroupCollectorTest { String group1 = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"; String group2 = "1234567812345678123456781234567812345678"; - SortedSetMultimap groups = collectGroups( - newWalk(m, branchTip), - patchSets() - .put(a, psId(1, 1)) - .put(b, psId(2, 1)), - groups() - .put(psId(1, 1), group1) - .put(psId(2, 1), group2)); + SortedSetMultimap groups = + collectGroups( + newWalk(m, branchTip), + patchSets().put(a, psId(1, 1)).put(b, psId(2, 1)), + groups().put(psId(1, 1), group1).put(psId(2, 1), group2)); assertThat(groups).containsEntry(a, group1); assertThat(groups).containsEntry(b, group2); // Merge commit gets joined group of parents. - assertThat(groups.asMap()) - .containsEntry(m, ImmutableSet.of(group1, group2)); + assertThat(groups.asMap()).containsEntry(m, ImmutableSet.of(group1, group2)); } @Test @@ -175,60 +155,48 @@ public class GroupCollectorTest { String group1 = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"; String group2a = "1234567812345678123456781234567812345678"; String group2b = "ef123456ef123456ef123456ef123456ef123456"; - SortedSetMultimap groups = collectGroups( - newWalk(m, branchTip), - patchSets() - .put(a, psId(1, 1)) - .put(b, psId(2, 1)), - groups() - .put(psId(1, 1), group1) - .put(psId(2, 1), group2a) - .put(psId(2, 1), group2b)); + SortedSetMultimap groups = + collectGroups( + newWalk(m, branchTip), + patchSets().put(a, psId(1, 1)).put(b, psId(2, 1)), + groups().put(psId(1, 1), group1).put(psId(2, 1), group2a).put(psId(2, 1), group2b)); assertThat(groups).containsEntry(a, group1); - assertThat(groups.asMap()) - .containsEntry(b, ImmutableSet.of(group2a, group2b)); + assertThat(groups.asMap()).containsEntry(b, ImmutableSet.of(group2a, group2b)); // Joined parent groups are split and resorted. - assertThat(groups.asMap()) - .containsEntry(m, ImmutableSet.of(group1, group2a, group2b)); + assertThat(groups.asMap()).containsEntry(m, ImmutableSet.of(group1, group2a, group2b)); } @Test - public void mergeCommitWithOneUninterestingParentAndOtherParentIsExisting() - throws Exception { + public void mergeCommitWithOneUninterestingParentAndOtherParentIsExisting() throws Exception { RevCommit branchTip = tr.commit().create(); RevCommit a = tr.commit().parent(branchTip).create(); RevCommit m = tr.commit().parent(branchTip).parent(a).create(); String group = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"; - SortedSetMultimap groups = collectGroups( - newWalk(m, branchTip), - patchSets().put(a, psId(1, 1)), - groups().put(psId(1, 1), group)); + SortedSetMultimap groups = + collectGroups( + newWalk(m, branchTip), patchSets().put(a, psId(1, 1)), groups().put(psId(1, 1), group)); assertThat(groups).containsEntry(a, group); assertThat(groups).containsEntry(m, group); } @Test - public void mergeCommitWithOneUninterestingParentAndOtherParentIsNew() - throws Exception { + public void mergeCommitWithOneUninterestingParentAndOtherParentIsNew() throws Exception { RevCommit branchTip = tr.commit().create(); RevCommit a = tr.commit().parent(branchTip).create(); RevCommit m = tr.commit().parent(branchTip).parent(a).create(); - SortedSetMultimap groups = collectGroups( - newWalk(m, branchTip), - patchSets(), - groups()); + SortedSetMultimap groups = + collectGroups(newWalk(m, branchTip), patchSets(), groups()); assertThat(groups).containsEntry(a, a.name()); assertThat(groups).containsEntry(m, a.name()); } @Test - public void multipleMergeCommitsInHistoryAllResolveToSameGroup() - throws Exception { + public void multipleMergeCommitsInHistoryAllResolveToSameGroup() throws Exception { RevCommit branchTip = tr.commit().create(); RevCommit a = tr.commit().parent(branchTip).create(); RevCommit b = tr.commit().parent(branchTip).create(); @@ -236,10 +204,8 @@ public class GroupCollectorTest { RevCommit m1 = tr.commit().parent(b).parent(c).create(); RevCommit m2 = tr.commit().parent(a).parent(m1).create(); - SortedSetMultimap groups = collectGroups( - newWalk(m2, branchTip), - patchSets(), - groups()); + SortedSetMultimap groups = + collectGroups(newWalk(m2, branchTip), patchSets(), groups()); assertThat(groups).containsEntry(a, a.name()); assertThat(groups).containsEntry(b, a.name()); @@ -249,8 +215,7 @@ public class GroupCollectorTest { } @Test - public void mergeCommitWithDuplicatedParentGetsParentsGroup() - throws Exception { + public void mergeCommitWithDuplicatedParentGetsParentsGroup() throws Exception { RevCommit branchTip = tr.commit().create(); RevCommit a = tr.commit().parent(branchTip).create(); RevCommit m = tr.commit().parent(a).parent(a).create(); @@ -258,18 +223,15 @@ public class GroupCollectorTest { assertThat(m.getParentCount()).isEqualTo(2); assertThat(m.getParent(0)).isEqualTo(m.getParent(1)); - SortedSetMultimap groups = collectGroups( - newWalk(m, branchTip), - patchSets(), - groups()); + SortedSetMultimap groups = + collectGroups(newWalk(m, branchTip), patchSets(), groups()); assertThat(groups).containsEntry(a, a.name()); assertThat(groups).containsEntry(m, a.name()); } @Test - public void mergeCommitWithOneNewParentAndTwoExistingPatchSets() - throws Exception { + public void mergeCommitWithOneNewParentAndTwoExistingPatchSets() throws Exception { RevCommit branchTip = tr.commit().create(); RevCommit a = tr.commit().parent(branchTip).create(); RevCommit b = tr.commit().parent(branchTip).create(); @@ -278,20 +240,16 @@ public class GroupCollectorTest { String group1 = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"; String group2 = "1234567812345678123456781234567812345678"; - SortedSetMultimap groups = collectGroups( - newWalk(m, branchTip), - patchSets() - .put(a, psId(1, 1)) - .put(b, psId(2, 1)), - groups() - .put(psId(1, 1), group1) - .put(psId(2, 1), group2)); + SortedSetMultimap groups = + collectGroups( + newWalk(m, branchTip), + patchSets().put(a, psId(1, 1)).put(b, psId(2, 1)), + groups().put(psId(1, 1), group1).put(psId(2, 1), group2)); assertThat(groups).containsEntry(a, group1); assertThat(groups).containsEntry(b, group2); assertThat(groups).containsEntry(c, group2); - assertThat(groups.asMap()) - .containsEntry(m, ImmutableSet.of(group1, group2)); + assertThat(groups.asMap()).containsEntry(m, ImmutableSet.of(group1, group2)); } @Test @@ -306,15 +264,16 @@ public class GroupCollectorTest { rw.markStart(rw.parseCommit(d)); // Schema upgrade case: all commits are existing patch sets, but none have // groups assigned yet. - SortedSetMultimap groups = collectGroups( - rw, - patchSets() - .put(branchTip, psId(1, 1)) - .put(a, psId(2, 1)) - .put(b, psId(3, 1)) - .put(c, psId(4, 1)) - .put(d, psId(5, 1)), - groups()); + SortedSetMultimap groups = + collectGroups( + rw, + patchSets() + .put(branchTip, psId(1, 1)) + .put(a, psId(2, 1)) + .put(b, psId(3, 1)) + .put(c, psId(4, 1)) + .put(d, psId(5, 1)), + groups()); assertThat(groups).containsEntry(a, a.name()); assertThat(groups).containsEntry(b, a.name()); @@ -343,8 +302,7 @@ public class GroupCollectorTest { ImmutableListMultimap.Builder patchSetsBySha, ImmutableListMultimap.Builder groupLookup) throws Exception { - GroupCollector gc = - new GroupCollector(patchSetsBySha.build(), groupLookup.build()); + GroupCollector gc = new GroupCollector(patchSetsBySha.build(), groupLookup.build()); RevCommit c; while ((c = rw.next()) != null) { gc.visit(c); @@ -354,8 +312,7 @@ public class GroupCollectorTest { // Helper methods for constructing various map arguments, to avoid lots of // type specifications. - private static ImmutableListMultimap.Builder - patchSets() { + private static ImmutableListMultimap.Builder patchSets() { return ImmutableListMultimap.builder(); } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/git/GroupListTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/git/GroupListTest.java index 6cdf6c94b2..30f0ed576a 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/git/GroupListTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/git/GroupListTest.java @@ -28,19 +28,18 @@ import static org.junit.Assert.assertTrue; import com.google.gerrit.common.data.GroupReference; import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gerrit.reviewdb.client.Project; - -import org.junit.Before; -import org.junit.Test; - import java.io.IOException; import java.util.Collection; import java.util.Collections; import java.util.Set; +import org.junit.Before; +import org.junit.Test; public class GroupListTest { private static final Project.NameKey PROJECT = new Project.NameKey("project"); private static final String TEXT = - "# UUID \tGroup Name\n" + "#\n" + "# UUID \tGroup Name\n" + + "#\n" + "d96b998f8a66ff433af50befb975d0e2bb6e0999\tNon-Interactive Users\n" + "ebe31c01aec2c9ac3b3c03e87a47450829ff4310\tAdministrators\n"; @@ -55,8 +54,7 @@ public class GroupListTest { @Test public void byUUID() throws Exception { - AccountGroup.UUID uuid = - new AccountGroup.UUID("d96b998f8a66ff433af50befb975d0e2bb6e0999"); + AccountGroup.UUID uuid = new AccountGroup.UUID("d96b998f8a66ff433af50befb975d0e2bb6e0999"); GroupReference groupReference = groupList.byUUID(uuid); @@ -81,8 +79,7 @@ public class GroupListTest { Collection result = groupList.references(); assertEquals(2, result.size()); - AccountGroup.UUID uuid = - new AccountGroup.UUID("ebe31c01aec2c9ac3b3c03e87a47450829ff4310"); + AccountGroup.UUID uuid = new AccountGroup.UUID("ebe31c01aec2c9ac3b3c03e87a47450829ff4310"); GroupReference expected = new GroupReference(uuid, "Administrators"); assertTrue(result.contains(expected)); @@ -93,8 +90,7 @@ public class GroupListTest { Set result = groupList.uuids(); assertEquals(2, result.size()); - AccountGroup.UUID expected = - new AccountGroup.UUID("ebe31c01aec2c9ac3b3c03e87a47450829ff4310"); + AccountGroup.UUID expected = new AccountGroup.UUID("ebe31c01aec2c9ac3b3c03e87a47450829ff4310"); assertTrue(result.contains(expected)); } @@ -110,13 +106,11 @@ public class GroupListTest { @Test public void retainAll() throws Exception { - AccountGroup.UUID uuid = - new AccountGroup.UUID("d96b998f8a66ff433af50befb975d0e2bb6e0999"); + AccountGroup.UUID uuid = new AccountGroup.UUID("d96b998f8a66ff433af50befb975d0e2bb6e0999"); groupList.retainUUIDs(Collections.singleton(uuid)); assertNotNull(groupList.byUUID(uuid)); - assertNull(groupList.byUUID(new AccountGroup.UUID( - "ebe31c01aec2c9ac3b3c03e87a47450829ff4310"))); + assertNull(groupList.byUUID(new AccountGroup.UUID("ebe31c01aec2c9ac3b3c03e87a47450829ff4310"))); } @Test diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/git/LabelNormalizerTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/git/LabelNormalizerTest.java index aa23e50f02..eabccf701f 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/git/LabelNormalizerTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/git/LabelNormalizerTest.java @@ -51,14 +51,12 @@ import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Provider; import com.google.inject.util.Providers; - +import java.util.List; import org.eclipse.jgit.lib.Repository; import org.junit.After; import org.junit.Before; import org.junit.Test; -import java.util.List; - /** Unit tests for {@link LabelNormalizer}. */ public class LabelNormalizerTest { @Inject private AccountManager accountManager; @@ -88,21 +86,21 @@ public class LabelNormalizerTest { db = schemaFactory.open(); schemaCreator.create(db); - userId = accountManager.authenticate(AuthRequest.forUser("user")) - .getAccountId(); + userId = accountManager.authenticate(AuthRequest.forUser("user")).getAccountId(); user = userFactory.create(userId); - requestContext.setContext(new RequestContext() { - @Override - public CurrentUser getUser() { - return user; - } + requestContext.setContext( + new RequestContext() { + @Override + public CurrentUser getUser() { + return user; + } - @Override - public Provider getReviewDbProvider() { - return Providers.of(db); - } - }); + @Override + public Provider getReviewDbProvider() { + return Providers.of(db); + } + }); configureProject(); setUpChange(); @@ -115,20 +113,20 @@ public class LabelNormalizerTest { sec.removePermission(forLabel(label)); } } - LabelType lt = category("Verified", - value(1, "Verified"), - value(0, "No score"), - value(-1, "Fails")); + LabelType lt = + category("Verified", value(1, "Verified"), value(0, "No score"), value(-1, "Fails")); pc.getLabelSections().put(lt.getName(), lt); save(pc); } private void setUpChange() throws Exception { - change = new Change( - new Change.Key("Iabcd1234abcd1234abcd1234abcd1234abcd1234"), - new Change.Id(1), userId, - new Branch.NameKey(allProjects, "refs/heads/master"), - TimeUtil.nowTs()); + change = + new Change( + new Change.Key("Iabcd1234abcd1234abcd1234abcd1234abcd1234"), + new Change.Id(1), + userId, + new Branch.NameKey(allProjects, "refs/heads/master"), + TimeUtil.nowTs()); PatchSetInfo ps = new PatchSetInfo(new PatchSet.Id(change.getId(), 1)); ps.setSubject("Test change"); change.setCurrentPatchSet(ps); @@ -156,11 +154,8 @@ public class LabelNormalizerTest { PatchSetApproval cr = psa(userId, "Code-Review", 2); PatchSetApproval v = psa(userId, "Verified", 1); - assertEquals(Result.create( - list(v), - list(copy(cr, 1)), - list()), - norm.normalize(change, list(cr, v))); + assertEquals( + Result.create(list(v), list(copy(cr, 1)), list()), norm.normalize(change, list(cr, v))); } @Test @@ -172,10 +167,8 @@ public class LabelNormalizerTest { PatchSetApproval cr = psa(userId, "Code-Review", 5); PatchSetApproval v = psa(userId, "Verified", 5); - assertEquals(Result.create( - list(), - list(copy(cr, 2), copy(v, 1)), - list()), + assertEquals( + Result.create(list(), list(copy(cr, 2), copy(v, 1)), list()), norm.normalize(change, list(cr, v))); } @@ -183,11 +176,7 @@ public class LabelNormalizerTest { public void emptyPermissionRangeOmitsResult() throws Exception { PatchSetApproval cr = psa(userId, "Code-Review", 1); PatchSetApproval v = psa(userId, "Verified", 1); - assertEquals(Result.create( - list(), - list(), - list(cr, v)), - norm.normalize(change, list(cr, v))); + assertEquals(Result.create(list(), list(), list(cr, v)), norm.normalize(change, list(cr, v))); } @Test @@ -198,11 +187,7 @@ public class LabelNormalizerTest { PatchSetApproval cr = psa(userId, "Code-Review", 0); PatchSetApproval v = psa(userId, "Verified", 0); - assertEquals(Result.create( - list(cr), - list(), - list(v)), - norm.normalize(change, list(cr, v))); + assertEquals(Result.create(list(cr), list(), list(v)), norm.normalize(change, list(cr, v))); } private ProjectConfig loadAllProjects() throws Exception { @@ -214,8 +199,7 @@ public class LabelNormalizerTest { } private void save(ProjectConfig pc) throws Exception { - try (MetaDataUpdate md = - metaDataUpdateFactory.create(pc.getProject().getNameKey(), user)) { + try (MetaDataUpdate md = metaDataUpdateFactory.create(pc.getProject().getNameKey(), user)) { pc.commit(md); projectCache.evict(pc.getProject().getNameKey()); } @@ -223,19 +207,18 @@ public class LabelNormalizerTest { private PatchSetApproval psa(Account.Id accountId, String label, int value) { return new PatchSetApproval( - new PatchSetApproval.Key( - change.currentPatchSetId(), accountId, new LabelId(label)), - (short) value, TimeUtil.nowTs()); + new PatchSetApproval.Key(change.currentPatchSetId(), accountId, new LabelId(label)), + (short) value, + TimeUtil.nowTs()); } private PatchSetApproval copy(PatchSetApproval src, int newValue) { - PatchSetApproval result = - new PatchSetApproval(src.getKey().getParentKey(), src); + PatchSetApproval result = new PatchSetApproval(src.getKey().getParentKey(), src); result.setValue((short) newValue); return result; } private static List list(PatchSetApproval... psas) { - return ImmutableList. copyOf(psas); + return ImmutableList.copyOf(psas); } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/git/LocalDiskRepositoryManagerTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/git/LocalDiskRepositoryManagerTest.java index e30e3fc416..286f694f3e 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/git/LocalDiskRepositoryManagerTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/git/LocalDiskRepositoryManagerTest.java @@ -23,7 +23,9 @@ import com.google.gerrit.server.util.HostPlatform; import com.google.gerrit.testutil.TempFileUtil; import com.google.gwtorm.client.KeyUtil; import com.google.gwtorm.server.StandardKeyEncoder; - +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import org.easymock.EasyMockSupport; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.Config; @@ -35,10 +37,6 @@ import org.eclipse.jgit.util.FS; import org.junit.Before; import org.junit.Test; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; - public class LocalDiskRepositoryManagerTest extends EasyMockSupport { static { @@ -116,8 +114,7 @@ public class LocalDiskRepositoryManagerTest extends EasyMockSupport { } @Test(expected = RepositoryNotFoundException.class) - public void testProjectCreationWithPathSegmentEndingByDotGit() - throws Exception { + public void testProjectCreationWithPathSegmentEndingByDotGit() throws Exception { repoManager.createRepository(new Project.NameKey("a/b.git/projectA")); } @@ -175,8 +172,7 @@ public class LocalDiskRepositoryManagerTest extends EasyMockSupport { @Test(expected = IllegalStateException.class) public void testProjectRecreationAfterRestart() throws Exception { repoManager.createRepository(new Project.NameKey("a")); - LocalDiskRepositoryManager newRepoManager = - new LocalDiskRepositoryManager(site, cfg); + LocalDiskRepositoryManager newRepoManager = new LocalDiskRepositoryManager(site, cfg); newRepoManager.createRepository(new Project.NameKey("a")); } @@ -212,13 +208,11 @@ public class LocalDiskRepositoryManagerTest extends EasyMockSupport { Project.NameKey name = new Project.NameKey("a"); repoManager.createRepository(name); - LocalDiskRepositoryManager newRepoManager = - new LocalDiskRepositoryManager(site, cfg); + LocalDiskRepositoryManager newRepoManager = new LocalDiskRepositoryManager(site, cfg); newRepoManager.createRepository(new Project.NameKey("A")); } - private void createSymLink(Project.NameKey project, String link) - throws IOException { + private void createSymLink(Project.NameKey project, String link) throws IOException { Path base = repoManager.getBasePath(project); Path projectDir = base.resolve(project.get() + ".git"); Path symlink = base.resolve(link); @@ -244,12 +238,10 @@ public class LocalDiskRepositoryManagerTest extends EasyMockSupport { repoManager.getBasePath(null).resolve(".git").toFile().mkdir(); // create an invalid repo name createRepository(repoManager.getBasePath(null), "project?A"); - assertThat(repoManager.list()) - .containsExactly(projectA, projectB, projectC); + assertThat(repoManager.list()).containsExactly(projectA, projectB, projectC); } - private void createRepository(Path directory, String projectName) - throws IOException { + private void createRepository(Path directory, String projectName) throws IOException { String n = projectName + Constants.DOT_GIT_EXT; FileKey loc = FileKey.exact(directory.resolve(n).toFile(), FS.DETECTED); try (Repository db = RepositoryCache.open(loc, false)) { diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/git/MultiBaseLocalDiskRepositoryManagerTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/git/MultiBaseLocalDiskRepositoryManagerTest.java index accf778543..74515ae8f2 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/git/MultiBaseLocalDiskRepositoryManagerTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/git/MultiBaseLocalDiskRepositoryManagerTest.java @@ -25,7 +25,12 @@ import com.google.gerrit.server.config.RepositoryConfig; import com.google.gerrit.server.config.SitePaths; import com.google.gerrit.testutil.GerritBaseTests; import com.google.gerrit.testutil.TempFileUtil; - +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.SortedSet; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.Constants; @@ -37,13 +42,6 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; -import java.io.IOException; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.SortedSet; - public class MultiBaseLocalDiskRepositoryManagerTest extends GerritBaseTests { private Config cfg; private SitePaths site; @@ -59,8 +57,7 @@ public class MultiBaseLocalDiskRepositoryManagerTest extends GerritBaseTests { configMock = createNiceMock(RepositoryConfig.class); expect(configMock.getAllBasePaths()).andReturn(new ArrayList()).anyTimes(); replay(configMock); - repoManager = - new MultiBaseLocalDiskRepositoryManager(site, cfg, configMock); + repoManager = new MultiBaseLocalDiskRepositoryManager(site, cfg, configMock); } @After @@ -70,25 +67,22 @@ public class MultiBaseLocalDiskRepositoryManagerTest extends GerritBaseTests { @Test public void defaultRepositoryLocation() - throws RepositoryCaseMismatchException, RepositoryNotFoundException, - IOException { + throws RepositoryCaseMismatchException, RepositoryNotFoundException, IOException { Project.NameKey someProjectKey = new Project.NameKey("someProject"); Repository repo = repoManager.createRepository(someProjectKey); assertThat(repo.getDirectory()).isNotNull(); assertThat(repo.getDirectory().exists()).isTrue(); - assertThat(repo.getDirectory().getParent()).isEqualTo( - repoManager.getBasePath(someProjectKey).toAbsolutePath().toString()); + assertThat(repo.getDirectory().getParent()) + .isEqualTo(repoManager.getBasePath(someProjectKey).toAbsolutePath().toString()); repo = repoManager.openRepository(someProjectKey); assertThat(repo.getDirectory()).isNotNull(); assertThat(repo.getDirectory().exists()).isTrue(); - assertThat(repo.getDirectory().getParent()).isEqualTo( - repoManager.getBasePath(someProjectKey).toAbsolutePath().toString()); + assertThat(repo.getDirectory().getParent()) + .isEqualTo(repoManager.getBasePath(someProjectKey).toAbsolutePath().toString()); - assertThat( - repoManager.getBasePath(someProjectKey).toAbsolutePath().toString()) - .isEqualTo( - repoManager.getBasePath(someProjectKey).toAbsolutePath().toString()); + assertThat(repoManager.getBasePath(someProjectKey).toAbsolutePath().toString()) + .isEqualTo(repoManager.getBasePath(someProjectKey).toAbsolutePath().toString()); SortedSet repoList = repoManager.list(); assertThat(repoList.size()).isEqualTo(1); @@ -101,27 +95,22 @@ public class MultiBaseLocalDiskRepositoryManagerTest extends GerritBaseTests { Path alternateBasePath = TempFileUtil.createTempDirectory().toPath(); Project.NameKey someProjectKey = new Project.NameKey("someProject"); reset(configMock); - expect(configMock.getBasePath(someProjectKey)).andReturn(alternateBasePath) - .anyTimes(); - expect(configMock.getAllBasePaths()) - .andReturn(Arrays.asList(alternateBasePath)).anyTimes(); + expect(configMock.getBasePath(someProjectKey)).andReturn(alternateBasePath).anyTimes(); + expect(configMock.getAllBasePaths()).andReturn(Arrays.asList(alternateBasePath)).anyTimes(); replay(configMock); Repository repo = repoManager.createRepository(someProjectKey); assertThat(repo.getDirectory()).isNotNull(); assertThat(repo.getDirectory().exists()).isTrue(); - assertThat(repo.getDirectory().getParent()) - .isEqualTo(alternateBasePath.toString()); + assertThat(repo.getDirectory().getParent()).isEqualTo(alternateBasePath.toString()); repo = repoManager.openRepository(someProjectKey); assertThat(repo.getDirectory()).isNotNull(); assertThat(repo.getDirectory().exists()).isTrue(); - assertThat(repo.getDirectory().getParent()) - .isEqualTo(alternateBasePath.toString()); + assertThat(repo.getDirectory().getParent()).isEqualTo(alternateBasePath.toString()); - assertThat( - repoManager.getBasePath(someProjectKey).toAbsolutePath().toString()) - .isEqualTo(alternateBasePath.toString()); + assertThat(repoManager.getBasePath(someProjectKey).toAbsolutePath().toString()) + .isEqualTo(alternateBasePath.toString()); SortedSet repoList = repoManager.list(); assertThat(repoList.size()).isEqualTo(1); @@ -133,28 +122,22 @@ public class MultiBaseLocalDiskRepositoryManagerTest extends GerritBaseTests { public void listReturnRepoFromProperLocation() throws IOException { Project.NameKey basePathProject = new Project.NameKey("basePathProject"); Project.NameKey altPathProject = new Project.NameKey("altPathProject"); - Project.NameKey misplacedProject1 = - new Project.NameKey("misplacedProject1"); - Project.NameKey misplacedProject2 = - new Project.NameKey("misplacedProject2"); + Project.NameKey misplacedProject1 = new Project.NameKey("misplacedProject1"); + Project.NameKey misplacedProject2 = new Project.NameKey("misplacedProject2"); Path alternateBasePath = TempFileUtil.createTempDirectory().toPath(); reset(configMock); - expect(configMock.getBasePath(altPathProject)).andReturn(alternateBasePath) - .anyTimes(); - expect(configMock.getBasePath(misplacedProject2)) - .andReturn(alternateBasePath).anyTimes(); - expect(configMock.getAllBasePaths()) - .andReturn(Arrays.asList(alternateBasePath)).anyTimes(); + expect(configMock.getBasePath(altPathProject)).andReturn(alternateBasePath).anyTimes(); + expect(configMock.getBasePath(misplacedProject2)).andReturn(alternateBasePath).anyTimes(); + expect(configMock.getAllBasePaths()).andReturn(Arrays.asList(alternateBasePath)).anyTimes(); replay(configMock); repoManager.createRepository(basePathProject); repoManager.createRepository(altPathProject); // create the misplaced ones without the repomanager otherwise they would // end up at the proper place. - createRepository(repoManager.getBasePath(basePathProject), - misplacedProject2); + createRepository(repoManager.getBasePath(basePathProject), misplacedProject2); createRepository(alternateBasePath, misplacedProject1); SortedSet repoList = repoManager.list(); @@ -163,8 +146,7 @@ public class MultiBaseLocalDiskRepositoryManagerTest extends GerritBaseTests { .isEqualTo(new Project.NameKey[] {altPathProject, basePathProject}); } - private void createRepository(Path directory, Project.NameKey projectName) - throws IOException { + private void createRepository(Path directory, Project.NameKey projectName) throws IOException { String n = projectName.get() + Constants.DOT_GIT_EXT; FileKey loc = FileKey.exact(directory.resolve(n).toFile(), FS.DETECTED); try (Repository db = RepositoryCache.open(loc, false)) { @@ -175,10 +157,8 @@ public class MultiBaseLocalDiskRepositoryManagerTest extends GerritBaseTests { @Test(expected = IllegalStateException.class) public void testRelativeAlternateLocation() { configMock = createNiceMock(RepositoryConfig.class); - expect(configMock.getAllBasePaths()) - .andReturn(Arrays.asList(Paths.get("repos"))).anyTimes(); + expect(configMock.getAllBasePaths()).andReturn(Arrays.asList(Paths.get("repos"))).anyTimes(); replay(configMock); - repoManager = - new MultiBaseLocalDiskRepositoryManager(site, cfg, configMock); + repoManager = new MultiBaseLocalDiskRepositoryManager(site, cfg, configMock); } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/git/ProjectConfigTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/git/ProjectConfigTest.java index 94220f6b1a..d4577c5251 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/git/ProjectConfigTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/git/ProjectConfigTest.java @@ -28,7 +28,9 @@ import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.reviewdb.client.RefNames; import com.google.gerrit.server.extensions.events.GitReferenceUpdated; - +import java.io.IOException; +import java.util.Collections; +import java.util.Map; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.errors.MissingObjectException; @@ -44,27 +46,30 @@ import org.eclipse.jgit.util.RawParseUtils; import org.junit.Before; import org.junit.Test; -import java.io.IOException; -import java.util.Collections; -import java.util.Map; - public class ProjectConfigTest extends LocalDiskRepositoryTestCase { private static final String LABEL_SCORES_CONFIG = - " copyMinScore = " + !LabelType.DEF_COPY_MIN_SCORE + "\n" // - + " copyMaxScore = " + !LabelType.DEF_COPY_MAX_SCORE + "\n" // - + " copyAllScoresOnMergeFirstParentUpdate = " - + !LabelType.DEF_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE + "\n" // - + " copyAllScoresOnTrivialRebase = " - + !LabelType.DEF_COPY_ALL_SCORES_ON_TRIVIAL_REBASE + "\n" // - + " copyAllScoresIfNoCodeChange = " - + !LabelType.DEF_COPY_ALL_SCORES_IF_NO_CODE_CHANGE + "\n" // - + " copyAllScoresIfNoChange = " - + !LabelType.DEF_COPY_ALL_SCORES_IF_NO_CHANGE + "\n"; + " copyMinScore = " + + !LabelType.DEF_COPY_MIN_SCORE + + "\n" // + + " copyMaxScore = " + + !LabelType.DEF_COPY_MAX_SCORE + + "\n" // + + " copyAllScoresOnMergeFirstParentUpdate = " + + !LabelType.DEF_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE + + "\n" // + + " copyAllScoresOnTrivialRebase = " + + !LabelType.DEF_COPY_ALL_SCORES_ON_TRIVIAL_REBASE + + "\n" // + + " copyAllScoresIfNoCodeChange = " + + !LabelType.DEF_COPY_ALL_SCORES_IF_NO_CODE_CHANGE + + "\n" // + + " copyAllScoresIfNoChange = " + + !LabelType.DEF_COPY_ALL_SCORES_IF_NO_CHANGE + + "\n"; - private final GroupReference developers = new GroupReference( - new AccountGroup.UUID("X"), "Developers"); - private final GroupReference staff = new GroupReference( - new AccountGroup.UUID("Y"), "Staff"); + private final GroupReference developers = + new GroupReference(new AccountGroup.UUID("X"), "Developers"); + private final GroupReference staff = new GroupReference(new AccountGroup.UUID("Y"), "Staff"); private Repository db; private TestRepository util; @@ -79,24 +84,29 @@ public class ProjectConfigTest extends LocalDiskRepositoryTestCase { @Test public void readConfig() throws Exception { - RevCommit rev = util.commit(util.tree( // - util.file("groups", util.blob(group(developers))), // - util.file("project.config", util.blob(""// - + "[access \"refs/heads/*\"]\n" // - + " exclusiveGroupPermissions = read submit create\n" // - + " submit = group Developers\n" // - + " push = group Developers\n" // - + " read = group Developers\n" // - + "[accounts]\n" // - + " sameGroupVisibility = deny group Developers\n" // - + " sameGroupVisibility = block group Staff\n" // - + "[contributor-agreement \"Individual\"]\n" // - + " description = A simple description\n" // - + " accepted = group Developers\n" // - + " accepted = group Staff\n" // - + " autoVerify = group Developers\n" // - + " agreementUrl = http://www.example.com/agree\n")) // - )); + RevCommit rev = + util.commit( + util.tree( // + util.file("groups", util.blob(group(developers))), // + util.file( + "project.config", + util.blob( + "" // + + "[access \"refs/heads/*\"]\n" // + + " exclusiveGroupPermissions = read submit create\n" // + + " submit = group Developers\n" // + + " push = group Developers\n" // + + " read = group Developers\n" // + + "[accounts]\n" // + + " sameGroupVisibility = deny group Developers\n" // + + " sameGroupVisibility = block group Staff\n" // + + "[contributor-agreement \"Individual\"]\n" // + + " description = A simple description\n" // + + " accepted = group Developers\n" // + + " accepted = group Staff\n" // + + " autoVerify = group Developers\n" // + + " agreementUrl = http://www.example.com/agree\n")) // + )); ProjectConfig cfg = read(rev); assertThat(cfg.getAccountsSection().getSameGroupVisibility()).hasSize(2); @@ -126,66 +136,85 @@ public class ProjectConfigTest extends LocalDiskRepositoryTestCase { @Test public void readConfigLabelDefaultValue() throws Exception { - RevCommit rev = util.commit(util.tree( // - util.file("groups", util.blob(group(developers))), // - util.file("project.config", util.blob(""// - + "[label \"CustomLabel\"]\n" // - + " value = -1 Negative\n" // - + " value = 0 No Score\n" // - + " value = 1 Positive\n")) // - )); + RevCommit rev = + util.commit( + util.tree( // + util.file("groups", util.blob(group(developers))), // + util.file( + "project.config", + util.blob( + "" // + + "[label \"CustomLabel\"]\n" // + + " value = -1 Negative\n" // + + " value = 0 No Score\n" // + + " value = 1 Positive\n")) // + )); ProjectConfig cfg = read(rev); Map labels = cfg.getLabelSections(); Short dv = labels.entrySet().iterator().next().getValue().getDefaultValue(); - assertThat((int)dv).isEqualTo(0); + assertThat((int) dv).isEqualTo(0); } @Test public void readConfigLabelDefaultValueInRange() throws Exception { - RevCommit rev = util.commit(util.tree( // - util.file("groups", util.blob(group(developers))), // - util.file("project.config", util.blob(""// - + "[label \"CustomLabel\"]\n" // - + " value = -1 Negative\n" // - + " value = 0 No Score\n" // - + " value = 1 Positive\n" // - + " defaultValue = -1\n")) // - )); + RevCommit rev = + util.commit( + util.tree( // + util.file("groups", util.blob(group(developers))), // + util.file( + "project.config", + util.blob( + "" // + + "[label \"CustomLabel\"]\n" // + + " value = -1 Negative\n" // + + " value = 0 No Score\n" // + + " value = 1 Positive\n" // + + " defaultValue = -1\n")) // + )); ProjectConfig cfg = read(rev); Map labels = cfg.getLabelSections(); Short dv = labels.entrySet().iterator().next().getValue().getDefaultValue(); - assertThat((int)dv).isEqualTo(-1); + assertThat((int) dv).isEqualTo(-1); } @Test public void readConfigLabelDefaultValueNotInRange() throws Exception { - RevCommit rev = util.commit(util.tree( // - util.file("groups", util.blob(group(developers))), // - util.file("project.config", util.blob(""// - + "[label \"CustomLabel\"]\n" // - + " value = -1 Negative\n" // - + " value = 0 No Score\n" // - + " value = 1 Positive\n" // - + " defaultValue = -2\n")) // - )); + RevCommit rev = + util.commit( + util.tree( // + util.file("groups", util.blob(group(developers))), // + util.file( + "project.config", + util.blob( + "" // + + "[label \"CustomLabel\"]\n" // + + " value = -1 Negative\n" // + + " value = 0 No Score\n" // + + " value = 1 Positive\n" // + + " defaultValue = -2\n")) // + )); ProjectConfig cfg = read(rev); assertThat(cfg.getValidationErrors()).hasSize(1); assertThat(Iterables.getOnlyElement(cfg.getValidationErrors()).getMessage()) - .isEqualTo("project.config: Invalid defaultValue \"-2\" " - + "for label \"CustomLabel\""); + .isEqualTo("project.config: Invalid defaultValue \"-2\" " + "for label \"CustomLabel\""); } @Test public void readConfigLabelScores() throws Exception { - RevCommit rev = util.commit(util.tree( // - util.file("groups", util.blob(group(developers))), // - util.file("project.config", util.blob(""// - + "[label \"CustomLabel\"]\n" // - + LABEL_SCORES_CONFIG)) // - )); + RevCommit rev = + util.commit( + util.tree( // + util.file("groups", util.blob(group(developers))), // + util.file( + "project.config", + util.blob( + "" // + + "[label \"CustomLabel\"]\n" // + + LABEL_SCORES_CONFIG)) // + )); ProjectConfig cfg = read(rev); Map labels = cfg.getLabelSections(); @@ -193,42 +222,47 @@ public class ProjectConfigTest extends LocalDiskRepositoryTestCase { assertThat(type.isCopyMinScore()).isNotEqualTo(LabelType.DEF_COPY_MIN_SCORE); assertThat(type.isCopyMaxScore()).isNotEqualTo(LabelType.DEF_COPY_MAX_SCORE); assertThat(type.isCopyAllScoresOnMergeFirstParentUpdate()) - .isNotEqualTo(LabelType.DEF_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE); + .isNotEqualTo(LabelType.DEF_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE); assertThat(type.isCopyAllScoresOnTrivialRebase()) - .isNotEqualTo(LabelType.DEF_COPY_ALL_SCORES_ON_TRIVIAL_REBASE); + .isNotEqualTo(LabelType.DEF_COPY_ALL_SCORES_ON_TRIVIAL_REBASE); assertThat(type.isCopyAllScoresIfNoCodeChange()) - .isNotEqualTo(LabelType.DEF_COPY_ALL_SCORES_IF_NO_CODE_CHANGE); + .isNotEqualTo(LabelType.DEF_COPY_ALL_SCORES_IF_NO_CODE_CHANGE); assertThat(type.isCopyAllScoresIfNoChange()) - .isNotEqualTo(LabelType.DEF_COPY_ALL_SCORES_IF_NO_CHANGE); + .isNotEqualTo(LabelType.DEF_COPY_ALL_SCORES_IF_NO_CHANGE); } @Test public void editConfig() throws Exception { - RevCommit rev = util.commit(util.tree( // - util.file("groups", util.blob(group(developers))), // - util.file("project.config", util.blob(""// - + "[access \"refs/heads/*\"]\n" // - + " exclusiveGroupPermissions = read submit\n" // - + " submit = group Developers\n" // - + " upload = group Developers\n" // - + " read = group Developers\n" // - + "[accounts]\n" // - + " sameGroupVisibility = deny group Developers\n" // - + " sameGroupVisibility = block group Staff\n" // - + "[contributor-agreement \"Individual\"]\n" // - + " description = A simple description\n" // - + " accepted = group Developers\n" // - + " autoVerify = group Developers\n" // - + " agreementUrl = http://www.example.com/agree\n" // - + "[label \"CustomLabel\"]\n" // - + LABEL_SCORES_CONFIG)) // - )); + RevCommit rev = + util.commit( + util.tree( // + util.file("groups", util.blob(group(developers))), // + util.file( + "project.config", + util.blob( + "" // + + "[access \"refs/heads/*\"]\n" // + + " exclusiveGroupPermissions = read submit\n" // + + " submit = group Developers\n" // + + " upload = group Developers\n" // + + " read = group Developers\n" // + + "[accounts]\n" // + + " sameGroupVisibility = deny group Developers\n" // + + " sameGroupVisibility = block group Staff\n" // + + "[contributor-agreement \"Individual\"]\n" // + + " description = A simple description\n" // + + " accepted = group Developers\n" // + + " autoVerify = group Developers\n" // + + " agreementUrl = http://www.example.com/agree\n" // + + "[label \"CustomLabel\"]\n" // + + LABEL_SCORES_CONFIG)) // + )); update(rev); ProjectConfig cfg = read(rev); AccessSection section = cfg.getAccessSection("refs/heads/*"); - cfg.getAccountsSection().setSameGroupVisibility( - Collections.singletonList(new PermissionRule(cfg.resolve(staff)))); + cfg.getAccountsSection() + .setSameGroupVisibility(Collections.singletonList(new PermissionRule(cfg.resolve(staff)))); Permission submit = section.getPermission(Permission.SUBMIT); submit.add(new PermissionRule(cfg.resolve(staff))); ContributorAgreement ca = cfg.getContributorAgreement("Individual"); @@ -236,36 +270,43 @@ public class ProjectConfigTest extends LocalDiskRepositoryTestCase { ca.setAutoVerify(null); ca.setDescription("A new description"); rev = commit(cfg); - assertThat(text(rev, "project.config")).isEqualTo(""// - + "[access \"refs/heads/*\"]\n" // - + " exclusiveGroupPermissions = read submit\n" // - + " submit = group Developers\n" // - + "\tsubmit = group Staff\n" // - + " upload = group Developers\n" // - + " read = group Developers\n"// - + "[accounts]\n" // - + " sameGroupVisibility = group Staff\n" // - + "[contributor-agreement \"Individual\"]\n" // - + " description = A new description\n" // - + " accepted = group Staff\n" // - + " agreementUrl = http://www.example.com/agree\n" - + "[label \"CustomLabel\"]\n" // - + LABEL_SCORES_CONFIG - + "\tfunction = MaxWithBlock\n" // label gets this function when it is created - + "\tdefaultValue = 0\n"); // label gets this value when it is created + assertThat(text(rev, "project.config")) + .isEqualTo( + "" // + + "[access \"refs/heads/*\"]\n" // + + " exclusiveGroupPermissions = read submit\n" // + + " submit = group Developers\n" // + + "\tsubmit = group Staff\n" // + + " upload = group Developers\n" // + + " read = group Developers\n" // + + "[accounts]\n" // + + " sameGroupVisibility = group Staff\n" // + + "[contributor-agreement \"Individual\"]\n" // + + " description = A new description\n" // + + " accepted = group Staff\n" // + + " agreementUrl = http://www.example.com/agree\n" + + "[label \"CustomLabel\"]\n" // + + LABEL_SCORES_CONFIG + + "\tfunction = MaxWithBlock\n" // label gets this function when it is created + + "\tdefaultValue = 0\n"); // label gets this value when it is created } @Test public void editConfigMissingGroupTableEntry() throws Exception { - RevCommit rev = util.commit(util.tree( // - util.file("groups", util.blob(group(developers))), // - util.file("project.config", util.blob(""// - + "[access \"refs/heads/*\"]\n" // - + " exclusiveGroupPermissions = read submit\n" // - + " submit = group People Who Can Submit\n" // - + " upload = group Developers\n" // - + " read = group Developers\n")) // - )); + RevCommit rev = + util.commit( + util.tree( // + util.file("groups", util.blob(group(developers))), // + util.file( + "project.config", + util.blob( + "" // + + "[access \"refs/heads/*\"]\n" // + + " exclusiveGroupPermissions = read submit\n" // + + " submit = group People Who Can Submit\n" // + + " upload = group Developers\n" // + + " read = group Developers\n")) // + )); update(rev); ProjectConfig cfg = read(rev); @@ -273,28 +314,27 @@ public class ProjectConfigTest extends LocalDiskRepositoryTestCase { Permission submit = section.getPermission(Permission.SUBMIT); submit.add(new PermissionRule(cfg.resolve(staff))); rev = commit(cfg); - assertThat(text(rev, "project.config")).isEqualTo(""// - + "[access \"refs/heads/*\"]\n" // - + " exclusiveGroupPermissions = read submit\n" // - + " submit = group People Who Can Submit\n" // - + "\tsubmit = group Staff\n" // - + " upload = group Developers\n" // - + " read = group Developers\n"); + assertThat(text(rev, "project.config")) + .isEqualTo( + "" // + + "[access \"refs/heads/*\"]\n" // + + " exclusiveGroupPermissions = read submit\n" // + + " submit = group People Who Can Submit\n" // + + "\tsubmit = group Staff\n" // + + " upload = group Developers\n" // + + " read = group Developers\n"); } - private ProjectConfig read(RevCommit rev) throws IOException, - ConfigInvalidException { + private ProjectConfig read(RevCommit rev) throws IOException, ConfigInvalidException { ProjectConfig cfg = new ProjectConfig(new Project.NameKey("test")); cfg.load(db, rev); return cfg; } - private RevCommit commit(ProjectConfig cfg) throws IOException, - MissingObjectException, IncorrectObjectTypeException { - try (MetaDataUpdate md = new MetaDataUpdate( - GitReferenceUpdated.DISABLED, - cfg.getProject().getNameKey(), - db)) { + private RevCommit commit(ProjectConfig cfg) + throws IOException, MissingObjectException, IncorrectObjectTypeException { + try (MetaDataUpdate md = + new MetaDataUpdate(GitReferenceUpdated.DISABLED, cfg.getProject().getNameKey(), db)) { util.tick(5); util.setAuthorAndCommitter(md.getCommitBuilder()); md.setMessage("Edit\n"); @@ -311,9 +351,9 @@ public class ProjectConfigTest extends LocalDiskRepositoryTestCase { u.setNewObjectId(rev); Result result = u.forceUpdate(); assert_() - .withFailureMessage("Cannot update ref for test: " + result) - .that(result) - .isAnyOf(Result.FAST_FORWARD, Result.FORCED, Result.NEW, Result.NO_CHANGE); + .withFailureMessage("Cannot update ref for test: " + result) + .that(result) + .isAnyOf(Result.FAST_FORWARD, Result.FORCED, Result.NEW, Result.NO_CHANGE); } private String text(RevCommit rev, String path) throws Exception { diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/git/QueryListTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/git/QueryListTest.java index d022d3ee10..8d0f909bde 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/git/QueryListTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/git/QueryListTest.java @@ -18,11 +18,9 @@ import static com.google.common.truth.Truth.assertThat; import static org.easymock.EasyMock.createNiceMock; import static org.easymock.EasyMock.replay; -import junit.framework.TestCase; - -import org.junit.Test; - import java.io.IOException; +import junit.framework.TestCase; +import org.junit.Test; public class QueryListTest extends TestCase { public static final String Q_P = "project:foo"; diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/index/SchemaUtilTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/index/SchemaUtilTest.java index e6447dab5b..1dc6a46967 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/index/SchemaUtilTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/index/SchemaUtilTest.java @@ -20,12 +20,10 @@ import static com.google.gerrit.server.index.SchemaUtil.getPersonParts; import static com.google.gerrit.server.index.SchemaUtil.schema; import com.google.gerrit.testutil.GerritBaseTests; - +import java.util.Map; import org.eclipse.jgit.lib.PersonIdent; import org.junit.Test; -import java.util.Map; - public class SchemaUtilTest extends GerritBaseTests { static class TestSchemas { static final Schema V1 = schema(); @@ -40,8 +38,7 @@ public class SchemaUtilTest extends GerritBaseTests { @Test public void schemasFromClassBuildsMap() { - Map> all = - SchemaUtil.schemasFromClass(TestSchemas.class, String.class); + Map> all = SchemaUtil.schemasFromClass(TestSchemas.class, String.class); assertThat(all.keySet()).containsExactly(1, 2, 4); assertThat(all.get(1)).isEqualTo(TestSchemas.V1); assertThat(all.get(2)).isEqualTo(TestSchemas.V2); @@ -56,18 +53,22 @@ public class SchemaUtilTest extends GerritBaseTests { // PersonIdent allows empty email, which should be extracted as the empty // string. However, it converts empty names to null internally. assertThat(getPersonParts(new PersonIdent("", ""))).containsExactly(""); - assertThat(getPersonParts(new PersonIdent("foo bar", ""))) - .containsExactly("foo", "bar", ""); + assertThat(getPersonParts(new PersonIdent("foo bar", ""))).containsExactly("foo", "bar", ""); assertThat(getPersonParts(new PersonIdent("", "foo@example.com"))) + .containsExactly("foo@example.com", "foo", "example.com", "example", "com"); + assertThat(getPersonParts(new PersonIdent("foO J. bAr", "bA-z@exAmple.cOm"))) .containsExactly( - "foo@example.com", "foo", "example.com", "example", "com"); - assertThat( - getPersonParts(new PersonIdent("foO J. bAr", "bA-z@exAmple.cOm"))) - .containsExactly( - "foo", "j", "bar", - "ba-z@example.com", "ba-z", "ba", "z", - "example.com", "example", "com"); + "foo", + "j", + "bar", + "ba-z@example.com", + "ba-z", + "ba", + "z", + "example.com", + "example", + "com"); } @Test diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/index/change/ChangeFieldTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/index/change/ChangeFieldTest.java index 693abfba88..3a4db30eeb 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/index/change/ChangeFieldTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/index/change/ChangeFieldTest.java @@ -28,14 +28,12 @@ import com.google.gerrit.server.ReviewerSet; import com.google.gerrit.server.notedb.ReviewerStateInternal; import com.google.gerrit.testutil.GerritBaseTests; import com.google.gerrit.testutil.TestTimeUtil; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - import java.sql.Timestamp; import java.util.List; import java.util.concurrent.TimeUnit; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; public class ChangeFieldTest extends GerritBaseTests { @Before @@ -50,8 +48,7 @@ public class ChangeFieldTest extends GerritBaseTests { @Test public void reviewerFieldValues() { - Table t = - HashBasedTable.create(); + Table t = HashBasedTable.create(); Timestamp t1 = TimeUtil.nowTs(); t.put(ReviewerStateInternal.REVIEWER, new Account.Id(1), t1); Timestamp t2 = TimeUtil.nowTs(); @@ -59,14 +56,11 @@ public class ChangeFieldTest extends GerritBaseTests { ReviewerSet reviewers = ReviewerSet.fromTable(t); List values = ChangeField.getReviewerFieldValues(reviewers); - assertThat(values).containsExactly( - "REVIEWER,1", - "REVIEWER,1," + t1.getTime(), - "CC,2", - "CC,2," + t2.getTime()); + assertThat(values) + .containsExactly( + "REVIEWER,1", "REVIEWER,1," + t1.getTime(), "CC,2", "CC,2," + t2.getTime()); - assertThat(ChangeField.parseReviewerFieldValues(values)) - .isEqualTo(reviewers); + assertThat(ChangeField.parseReviewerFieldValues(values)).isEqualTo(reviewers); } @Test @@ -79,12 +73,7 @@ public class ChangeFieldTest extends GerritBaseTests { label(SubmitRecord.Label.Status.MAY, "Label-1", null), label(SubmitRecord.Label.Status.OK, "Label-2", 1))), new Account.Id(1))) - .containsExactly( - "OK", - "MAY,label-1", - "OK,label-2", - "OK,label-2,0", - "OK,label-2,1"); + .containsExactly("OK", "MAY,label-1", "OK,label-2", "OK,label-2,0", "OK,label-2,1"); } @Test @@ -97,8 +86,7 @@ public class ChangeFieldTest extends GerritBaseTests { label(SubmitRecord.Label.Status.OK, "Label-2", 1))); } - private static SubmitRecord record(SubmitRecord.Status status, - SubmitRecord.Label... labels) { + private static SubmitRecord record(SubmitRecord.Status status, SubmitRecord.Label... labels) { SubmitRecord r = new SubmitRecord(); r.status = status; if (labels.length > 0) { @@ -107,8 +95,8 @@ public class ChangeFieldTest extends GerritBaseTests { return r; } - private static SubmitRecord.Label label(SubmitRecord.Label.Status status, - String label, Integer appliedBy) { + private static SubmitRecord.Label label( + SubmitRecord.Label.Status status, String label, Integer appliedBy) { SubmitRecord.Label l = new SubmitRecord.Label(); l.status = status; l.label = label; @@ -120,9 +108,11 @@ public class ChangeFieldTest extends GerritBaseTests { private static void assertStoredRecordRoundTrip(SubmitRecord... records) { List recordList = ImmutableList.copyOf(records); - List stored = ChangeField.storedSubmitRecords(recordList).stream() - .map(s -> new String(s, UTF_8)) - .collect(toList()); + List stored = + ChangeField.storedSubmitRecords(recordList) + .stream() + .map(s -> new String(s, UTF_8)) + .collect(toList()); assertThat(ChangeField.parseSubmitRecords(stored)) .named("JSON %s" + stored) .isEqualTo(recordList); diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/index/change/ChangeIndexRewriterTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/index/change/ChangeIndexRewriterTest.java index acf6b145f5..1724c51d7c 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/index/change/ChangeIndexRewriterTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/index/change/ChangeIndexRewriterTest.java @@ -38,13 +38,11 @@ import com.google.gerrit.server.query.change.ChangeQueryBuilder; import com.google.gerrit.server.query.change.ChangeStatusPredicate; import com.google.gerrit.server.query.change.OrSource; import com.google.gerrit.testutil.GerritBaseTests; - -import org.junit.Before; -import org.junit.Test; - import java.util.Arrays; import java.util.EnumSet; import java.util.Set; +import org.junit.Before; +import org.junit.Test; public class ChangeIndexRewriterTest extends GerritBaseTests { private static final IndexConfig CONFIG = IndexConfig.createDefault(); @@ -60,8 +58,7 @@ public class ChangeIndexRewriterTest extends GerritBaseTests { indexes = new ChangeIndexCollection(); indexes.setSearchIndex(index); queryBuilder = new FakeQueryBuilder(indexes); - rewrite = new ChangeIndexRewriter(indexes, - IndexConfig.create(0, 0, 3)); + rewrite = new ChangeIndexRewriter(indexes, IndexConfig.create(0, 0, 3)); } @Test @@ -101,19 +98,13 @@ public class ChangeIndexRewriterTest extends GerritBaseTests { Predicate in = parse("foo:a file:b"); Predicate out = rewrite(in); assertThat(AndChangeSource.class).isSameAs(out.getClass()); - assertThat(out.getChildren()) - .containsExactly( - query(in.getChild(1)), - in.getChild(0)) - .inOrder(); + assertThat(out.getChildren()).containsExactly(query(in.getChild(1)), in.getChild(0)).inOrder(); } @Test public void threeLevelTreeWithAllIndexPredicates() throws Exception { - Predicate in = - parse("-status:abandoned (file:a OR file:b)"); - assertThat(rewrite.rewrite(in, options(0, DEFAULT_MAX_QUERY_LIMIT))) - .isEqualTo(query(in)); + Predicate in = parse("-status:abandoned (file:a OR file:b)"); + assertThat(rewrite.rewrite(in, options(0, DEFAULT_MAX_QUERY_LIMIT))).isEqualTo(query(in)); } @Test @@ -121,24 +112,16 @@ public class ChangeIndexRewriterTest extends GerritBaseTests { Predicate in = parse("-foo:a (file:b OR file:c)"); Predicate out = rewrite(in); assertThat(out.getClass()).isSameAs(AndChangeSource.class); - assertThat(out.getChildren()) - .containsExactly( - query(in.getChild(1)), - in.getChild(0)) - .inOrder(); + assertThat(out.getChildren()).containsExactly(query(in.getChild(1)), in.getChild(0)).inOrder(); } @Test public void multipleIndexPredicates() throws Exception { - Predicate in = - parse("file:a OR foo:b OR file:c OR foo:d"); + Predicate in = parse("file:a OR foo:b OR file:c OR foo:d"); Predicate out = rewrite(in); assertThat(out.getClass()).isSameAs(OrSource.class); assertThat(out.getChildren()) - .containsExactly( - query(or(in.getChild(0), in.getChild(2))), - in.getChild(1), - in.getChild(3)) + .containsExactly(query(or(in.getChild(0), in.getChild(2))), in.getChild(1), in.getChild(3)) .inOrder(); } @@ -148,49 +131,37 @@ public class ChangeIndexRewriterTest extends GerritBaseTests { Predicate out = rewrite(in); assertThat(AndChangeSource.class).isSameAs(out.getClass()); assertThat(out.getChildren()) - .containsExactly( - query(and(in.getChild(0), in.getChild(2))), - in.getChild(1)) + .containsExactly(query(and(in.getChild(0), in.getChild(2))), in.getChild(1)) .inOrder(); } @Test public void duplicateCompoundNonIndexOnlyPredicates() throws Exception { - Predicate in = - parse("(status:new OR status:draft) bar:p file:a"); + Predicate in = parse("(status:new OR status:draft) bar:p file:a"); Predicate out = rewrite(in); assertThat(out.getClass()).isEqualTo(AndChangeSource.class); assertThat(out.getChildren()) - .containsExactly( - query(and(in.getChild(0), in.getChild(2))), - in.getChild(1)) + .containsExactly(query(and(in.getChild(0), in.getChild(2))), in.getChild(1)) .inOrder(); } @Test public void duplicateCompoundIndexOnlyPredicates() throws Exception { - Predicate in = - parse("(status:new OR file:a) bar:p file:b"); + Predicate in = parse("(status:new OR file:a) bar:p file:b"); Predicate out = rewrite(in); assertThat(out.getClass()).isEqualTo(AndChangeSource.class); assertThat(out.getChildren()) - .containsExactly( - query(and(in.getChild(0), in.getChild(2))), - in.getChild(1)) + .containsExactly(query(and(in.getChild(0), in.getChild(2))), in.getChild(1)) .inOrder(); } @Test - public void optionsArgumentOverridesAllLimitPredicates() - throws Exception { + public void optionsArgumentOverridesAllLimitPredicates() throws Exception { Predicate in = parse("limit:1 file:a limit:3"); Predicate out = rewrite(in, options(0, 5)); assertThat(out.getClass()).isEqualTo(AndChangeSource.class); assertThat(out.getChildren()) - .containsExactly( - query(in.getChild(1), 5), - parse("limit:5"), - parse("limit:5")) + .containsExactly(query(in.getChild(1), 5), parse("limit:5"), parse("limit:5")) .inOrder(); } @@ -200,28 +171,23 @@ public class ChangeIndexRewriterTest extends GerritBaseTests { Predicate f = parse("file:a"); Predicate l = parse("limit:" + n); Predicate in = andSource(f, l); - assertThat(rewrite.rewrite(in, options(0, n))) - .isEqualTo(andSource(query(f, 3), l)); - assertThat(rewrite.rewrite(in, options(1, n))) - .isEqualTo(andSource(query(f, 4), l)); - assertThat(rewrite.rewrite(in, options(2, n))) - .isEqualTo(andSource(query(f, 5), l)); + assertThat(rewrite.rewrite(in, options(0, n))).isEqualTo(andSource(query(f, 3), l)); + assertThat(rewrite.rewrite(in, options(1, n))).isEqualTo(andSource(query(f, 4), l)); + assertThat(rewrite.rewrite(in, options(2, n))).isEqualTo(andSource(query(f, 5), l)); } @Test public void getPossibleStatus() throws Exception { assertThat(status("file:a")).isEqualTo(EnumSet.allOf(Change.Status.class)); assertThat(status("is:new")).containsExactly(NEW); - assertThat(status("-is:new")) - .containsExactly(DRAFT, MERGED, ABANDONED); + assertThat(status("-is:new")).containsExactly(DRAFT, MERGED, ABANDONED); assertThat(status("is:new OR is:merged")).containsExactly(NEW, MERGED); assertThat(status("is:new is:merged")).isEmpty(); assertThat(status("(is:new is:draft) (is:merged)")).isEmpty(); assertThat(status("(is:new is:draft) (is:merged)")).isEmpty(); - assertThat(status("(is:new is:draft) OR (is:merged)")) - .containsExactly(MERGED); + assertThat(status("(is:new is:draft) OR (is:merged)")).containsExactly(MERGED); } @Test @@ -232,11 +198,7 @@ public class ChangeIndexRewriterTest extends GerritBaseTests { indexes.setSearchIndex(new FakeChangeIndex(FakeChangeIndex.V1)); Predicate out = rewrite(in); assertThat(out).isInstanceOf(AndPredicate.class); - assertThat(out.getChildren()) - .containsExactly( - query(in.getChild(0)), - in.getChild(1)) - .inOrder(); + assertThat(out.getChildren()).containsExactly(query(in.getChild(0)), in.getChild(1)).inOrder(); } @Test @@ -275,29 +237,25 @@ public class ChangeIndexRewriterTest extends GerritBaseTests { return new AndChangeSource(Arrays.asList(preds)); } - private Predicate rewrite(Predicate in) - throws QueryParseException { + private Predicate rewrite(Predicate in) throws QueryParseException { return rewrite.rewrite(in, options(0, DEFAULT_MAX_QUERY_LIMIT)); } - private Predicate rewrite(Predicate in, - QueryOptions opts) throws QueryParseException { + private Predicate rewrite(Predicate in, QueryOptions opts) + throws QueryParseException { return rewrite.rewrite(in, opts); } - private IndexedChangeQuery query(Predicate p) - throws QueryParseException { + private IndexedChangeQuery query(Predicate p) throws QueryParseException { return query(p, DEFAULT_MAX_QUERY_LIMIT); } - private IndexedChangeQuery query(Predicate p, int limit) - throws QueryParseException { + private IndexedChangeQuery query(Predicate p, int limit) throws QueryParseException { return new IndexedChangeQuery(index, p, options(0, limit)); } private static QueryOptions options(int start, int limit) { - return IndexedChangeQuery.createOptions(CONFIG, start, limit, - ImmutableSet. of()); + return IndexedChangeQuery.createOptions(CONFIG, start, limit, ImmutableSet.of()); } private Set status(String query) throws QueryParseException { diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/index/change/FakeChangeIndex.java b/gerrit-server/src/test/java/com/google/gerrit/server/index/change/FakeChangeIndex.java index 43039f89cd..8189c81224 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/index/change/FakeChangeIndex.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/index/change/FakeChangeIndex.java @@ -25,20 +25,15 @@ import com.google.gerrit.server.query.change.ChangeData; import com.google.gerrit.server.query.change.ChangeDataSource; import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.ResultSet; - import org.junit.Ignore; @Ignore public class FakeChangeIndex implements ChangeIndex { - static Schema V1 = new Schema<>(1, - ImmutableList.> of( - ChangeField.STATUS)); + static Schema V1 = + new Schema<>(1, ImmutableList.>of(ChangeField.STATUS)); - static Schema V2 = new Schema<>(2, - ImmutableList.of( - ChangeField.STATUS, - ChangeField.PATH, - ChangeField.UPDATED)); + static Schema V2 = + new Schema<>(2, ImmutableList.of(ChangeField.STATUS, ChangeField.PATH, ChangeField.UPDATED)); private static class Source implements ChangeDataSource { private final Predicate p; @@ -101,8 +96,7 @@ public class FakeChangeIndex implements ChangeIndex { } @Override - public void close() { - } + public void close() {} @Override public void markReady(boolean ready) { diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/index/change/FakeQueryBuilder.java b/gerrit-server/src/test/java/com/google/gerrit/server/index/change/FakeQueryBuilder.java index e59067a0cd..3652ec7d27 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/index/change/FakeQueryBuilder.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/index/change/FakeQueryBuilder.java @@ -18,19 +18,17 @@ import com.google.gerrit.server.query.OperatorPredicate; import com.google.gerrit.server.query.Predicate; import com.google.gerrit.server.query.change.ChangeData; import com.google.gerrit.server.query.change.ChangeQueryBuilder; - import org.junit.Ignore; @Ignore public class FakeQueryBuilder extends ChangeQueryBuilder { FakeQueryBuilder(ChangeIndexCollection indexes) { super( - new FakeQueryBuilder.Definition<>( - FakeQueryBuilder.class), - new ChangeQueryBuilder.Arguments(null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, indexes, null, null, null, null, null, null, - null, null)); + new FakeQueryBuilder.Definition<>(FakeQueryBuilder.class), + new ChangeQueryBuilder.Arguments( + null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, indexes, null, null, null, null, null, null, + null, null)); } @Operator diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/index/change/StalenessCheckerTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/index/change/StalenessCheckerTest.java index adfd1feaee..4eef62966e 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/index/change/StalenessCheckerTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/index/change/StalenessCheckerTest.java @@ -35,15 +35,13 @@ import com.google.gerrit.testutil.GerritBaseTests; import com.google.gerrit.testutil.InMemoryRepositoryManager; import com.google.gwtorm.protobuf.CodecFactory; import com.google.gwtorm.protobuf.ProtobufCodec; - +import java.util.stream.Stream; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; import org.junit.Before; import org.junit.Test; -import java.util.stream.Stream; - public class StalenessCheckerTest extends GerritBaseTests { private static final String SHA1 = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"; private static final String SHA2 = "badc0feebadc0feebadc0feebadc0feebadc0fee"; @@ -53,8 +51,7 @@ public class StalenessCheckerTest extends GerritBaseTests { private static final Change.Id C = new Change.Id(1234); - private static final ProtobufCodec CHANGE_CODEC = - CodecFactory.encoder(Change.class); + private static final ProtobufCodec CHANGE_CODEC = CodecFactory.encoder(Change.class); private GitRepositoryManager repoManager; private Repository r1; @@ -105,15 +102,11 @@ public class StalenessCheckerTest extends GerritBaseTests { public void refStateToByteArray() { assertThat( new String( - RefState.create("refs/heads/foo", ObjectId.fromString(SHA1)) - .toByteArray(P1), + RefState.create("refs/heads/foo", ObjectId.fromString(SHA1)).toByteArray(P1), UTF_8)) .isEqualTo(P1 + ":refs/heads/foo:" + SHA1); assertThat( - new String( - RefState.create("refs/heads/foo", (ObjectId) null) - .toByteArray(P1), - UTF_8)) + new String(RefState.create("refs/heads/foo", (ObjectId) null).toByteArray(P1), UTF_8)) .isEqualTo(P1 + ":refs/heads/foo:" + ObjectId.zeroId().name()); } @@ -146,8 +139,7 @@ public class StalenessCheckerTest extends GerritBaseTests { p = r.get(P2).get(0); assertThat(p.pattern()).isEqualTo("refs/heads/foo/*/bar"); assertThat(p.prefix()).isEqualTo("refs/heads/foo/"); - assertThat(p.regex().pattern()) - .isEqualTo("^\\Qrefs/heads/foo/\\E.*\\Q/bar\\E$"); + assertThat(p.regex().pattern()).isEqualTo("^\\Qrefs/heads/foo/\\E.*\\Q/bar\\E$"); assertThat(p.match("refs/heads/foo//bar")).isTrue(); assertThat(p.match("refs/heads/foo/x/bar")).isTrue(); assertThat(p.match("refs/heads/foo/x/y/bar")).isTrue(); @@ -156,8 +148,7 @@ public class StalenessCheckerTest extends GerritBaseTests { p = r.get(P2).get(1); assertThat(p.pattern()).isEqualTo("refs/heads/foo/*-baz/*/quux"); assertThat(p.prefix()).isEqualTo("refs/heads/foo/"); - assertThat(p.regex().pattern()) - .isEqualTo("^\\Qrefs/heads/foo/\\E.*\\Q-baz/\\E.*\\Q/quux\\E$"); + assertThat(p.regex().pattern()).isEqualTo("^\\Qrefs/heads/foo/\\E.*\\Q-baz/\\E.*\\Q/quux\\E$"); assertThat(p.match("refs/heads/foo/-baz//quux")).isTrue(); assertThat(p.match("refs/heads/foo/x-baz/x/quux")).isTrue(); assertThat(p.match("refs/heads/foo/x/y-baz/x/y/quux")).isTrue(); @@ -166,8 +157,7 @@ public class StalenessCheckerTest extends GerritBaseTests { @Test public void refStatePatternToByteArray() { - assertThat( - new String(RefStatePattern.create("refs/*").toByteArray(P1), UTF_8)) + assertThat(new String(RefStatePattern.create("refs/*").toByteArray(P1), UTF_8)) .isEqualTo(P1 + ":refs/*"); } @@ -190,7 +180,8 @@ public class StalenessCheckerTest extends GerritBaseTests { // Not stale. assertThat( refsAreStale( - repoManager, C, + repoManager, + C, ImmutableSetMultimap.of( P1, RefState.create(ref1, id1.name()), P2, RefState.create(ref2, id2.name())), @@ -200,7 +191,8 @@ public class StalenessCheckerTest extends GerritBaseTests { // Wrong ref value. assertThat( refsAreStale( - repoManager, C, + repoManager, + C, ImmutableSetMultimap.of( P1, RefState.create(ref1, SHA1), P2, RefState.create(ref2, id2.name())), @@ -210,7 +202,8 @@ public class StalenessCheckerTest extends GerritBaseTests { // Swapped repos. assertThat( refsAreStale( - repoManager, C, + repoManager, + C, ImmutableSetMultimap.of( P1, RefState.create(ref1, id2.name()), P2, RefState.create(ref2, id1.name())), @@ -223,7 +216,8 @@ public class StalenessCheckerTest extends GerritBaseTests { tr1.update(ref3, id3); assertThat( refsAreStale( - repoManager, C, + repoManager, + C, ImmutableSetMultimap.of( P1, RefState.create(ref1, id1.name()), P1, RefState.create(ref3, id3.name())), @@ -233,16 +227,17 @@ public class StalenessCheckerTest extends GerritBaseTests { // Ignore ref not mentioned. assertThat( refsAreStale( - repoManager, C, - ImmutableSetMultimap.of( - P1, RefState.create(ref1, id1.name())), + repoManager, + C, + ImmutableSetMultimap.of(P1, RefState.create(ref1, id1.name())), ImmutableListMultimap.of())) .isFalse(); // One ref wrong. assertThat( refsAreStale( - repoManager, C, + repoManager, + C, ImmutableSetMultimap.of( P1, RefState.create(ref1, id1.name()), P1, RefState.create(ref3, SHA1)), @@ -258,11 +253,10 @@ public class StalenessCheckerTest extends GerritBaseTests { // ref1 is only ref matching pattern. assertThat( refsAreStale( - repoManager, C, - ImmutableSetMultimap.of( - P1, RefState.create(ref1, id1.name())), - ImmutableListMultimap.of( - P1, RefStatePattern.create("refs/heads/*")))) + repoManager, + C, + ImmutableSetMultimap.of(P1, RefState.create(ref1, id1.name())), + ImmutableListMultimap.of(P1, RefStatePattern.create("refs/heads/*")))) .isFalse(); // Now ref2 matches pattern, so stale unless ref2 is present in state map. @@ -270,20 +264,19 @@ public class StalenessCheckerTest extends GerritBaseTests { ObjectId id2 = tr1.update(ref2, tr1.commit().message("commit 2")); assertThat( refsAreStale( - repoManager, C, - ImmutableSetMultimap.of( - P1, RefState.create(ref1, id1.name())), - ImmutableListMultimap.of( - P1, RefStatePattern.create("refs/heads/*")))) + repoManager, + C, + ImmutableSetMultimap.of(P1, RefState.create(ref1, id1.name())), + ImmutableListMultimap.of(P1, RefStatePattern.create("refs/heads/*")))) .isTrue(); assertThat( refsAreStale( - repoManager, C, + repoManager, + C, ImmutableSetMultimap.of( P1, RefState.create(ref1, id1.name()), P1, RefState.create(ref2, id2.name())), - ImmutableListMultimap.of( - P1, RefStatePattern.create("refs/heads/*")))) + ImmutableListMultimap.of(P1, RefStatePattern.create("refs/heads/*")))) .isFalse(); } @@ -296,11 +289,10 @@ public class StalenessCheckerTest extends GerritBaseTests { // ref1 is only ref matching pattern. assertThat( refsAreStale( - repoManager, C, - ImmutableSetMultimap.of( - P1, RefState.create(ref1, id1.name())), - ImmutableListMultimap.of( - P1, RefStatePattern.create("refs/*/foo")))) + repoManager, + C, + ImmutableSetMultimap.of(P1, RefState.create(ref1, id1.name())), + ImmutableListMultimap.of(P1, RefStatePattern.create("refs/*/foo")))) .isFalse(); // Now ref2 matches pattern, so stale unless ref2 is present in state map. @@ -308,20 +300,19 @@ public class StalenessCheckerTest extends GerritBaseTests { ObjectId id3 = tr1.update(ref3, tr1.commit().message("commit 3")); assertThat( refsAreStale( - repoManager, C, - ImmutableSetMultimap.of( - P1, RefState.create(ref1, id1.name())), - ImmutableListMultimap.of( - P1, RefStatePattern.create("refs/*/foo")))) + repoManager, + C, + ImmutableSetMultimap.of(P1, RefState.create(ref1, id1.name())), + ImmutableListMultimap.of(P1, RefStatePattern.create("refs/*/foo")))) .isTrue(); assertThat( refsAreStale( - repoManager, C, + repoManager, + C, ImmutableSetMultimap.of( P1, RefState.create(ref1, id1.name()), P1, RefState.create(ref3, id3.name())), - ImmutableListMultimap.of( - P1, RefStatePattern.create("refs/*/foo")))) + ImmutableListMultimap.of(P1, RefStatePattern.create("refs/*/foo")))) .isFalse(); } @@ -330,30 +321,22 @@ public class StalenessCheckerTest extends GerritBaseTests { Change indexChange = newChange(P1, new Account.Id(1)); indexChange.setNoteDbState(SHA1); - assertThat(StalenessChecker.reviewDbChangeIsStale(indexChange, null)) - .isFalse(); + assertThat(StalenessChecker.reviewDbChangeIsStale(indexChange, null)).isFalse(); Change noteDbPrimary = clone(indexChange); noteDbPrimary.setNoteDbState(NoteDbChangeState.NOTE_DB_PRIMARY_STATE); - assertThat( - StalenessChecker.reviewDbChangeIsStale(indexChange, noteDbPrimary)) - .isFalse(); + assertThat(StalenessChecker.reviewDbChangeIsStale(indexChange, noteDbPrimary)).isFalse(); - assertThat( - StalenessChecker.reviewDbChangeIsStale( - indexChange, clone(indexChange))) - .isFalse(); + assertThat(StalenessChecker.reviewDbChangeIsStale(indexChange, clone(indexChange))).isFalse(); // Can't easily change row version to check true case. } private static Iterable byteArrays(String... strs) { - return Stream.of(strs).map(s -> s != null ? s.getBytes(UTF_8) : null) - .collect(toList()); + return Stream.of(strs).map(s -> s != null ? s.getBytes(UTF_8) : null).collect(toList()); } private static Change clone(Change change) { return CHANGE_CODEC.decode(CHANGE_CODEC.encodeToByteArray(change)); } - } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/ioutil/BasicSerializationTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/ioutil/BasicSerializationTest.java index f6bdeac5ca..800413b442 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/ioutil/BasicSerializationTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/ioutil/BasicSerializationTest.java @@ -23,12 +23,11 @@ import static com.google.gerrit.server.ioutil.BasicSerialization.writeVarInt32; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; -import org.junit.Test; - import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; +import org.junit.Test; public class BasicSerializationTest { @Test @@ -60,20 +59,17 @@ public class BasicSerializationTest { assertEquals(0L, readFixInt64(r(b(0, 0, 0, 0, 0, 0, 0, 0)))); assertEquals(3L, readFixInt64(r(b(0, 0, 0, 0, 0, 0, 0, 3)))); - assertEquals(0xdeadbeefL, readFixInt64(r(b(0, 0, 0, 0, 0xde, 0xad, 0xbe, - 0xef)))); + assertEquals(0xdeadbeefL, readFixInt64(r(b(0, 0, 0, 0, 0xde, 0xad, 0xbe, 0xef)))); - assertEquals(0x0310adefL, readFixInt64(r(b(0, 0, 0, 0, 0x03, 0x10, 0xad, - 0xef)))); + assertEquals(0x0310adefL, readFixInt64(r(b(0, 0, 0, 0, 0x03, 0x10, 0xad, 0xef)))); - assertEquals(0xc0ffee78deadbeefL, readFixInt64(r(b(0xc0, 0xff, 0xee, 0x78, - 0xde, 0xad, 0xbe, 0xef)))); + assertEquals( + 0xc0ffee78deadbeefL, readFixInt64(r(b(0xc0, 0xff, 0xee, 0x78, 0xde, 0xad, 0xbe, 0xef)))); - assertEquals(0x00000000ffffffffL, readFixInt64(r(b(0, 0, 0, 0, 0xff, 0xff, - 0xff, 0xff)))); + assertEquals(0x00000000ffffffffL, readFixInt64(r(b(0, 0, 0, 0, 0xff, 0xff, 0xff, 0xff)))); - assertEquals(0xffffffffffffffffL, readFixInt64(r(b(0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff)))); + assertEquals( + 0xffffffffffffffffL, readFixInt64(r(b(0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff)))); } @Test @@ -109,8 +105,7 @@ public class BasicSerializationTest { public void testReadString() throws IOException { assertNull(readString(r(b(0)))); assertEquals("a", readString(r(b(1, 'a')))); - assertEquals("coffee4", - readString(r(b(7, 'c', 'o', 'f', 'f', 'e', 'e', '4')))); + assertEquals("coffee4", readString(r(b(7, 'c', 'o', 'f', 'f', 'e', 'e', '4')))); } @Test @@ -134,8 +129,7 @@ public class BasicSerializationTest { assertOutput(b(7, 'c', 'o', 'f', 'f', 'e', 'e', '4'), out); } - private static void assertOutput(final byte[] expect, - final ByteArrayOutputStream out) { + private static void assertOutput(final byte[] expect, final ByteArrayOutputStream out) { final byte[] buf = out.toByteArray(); for (int i = 0; i < expect.length; i++) { assertEquals(expect[i], buf[i]); @@ -155,7 +149,9 @@ public class BasicSerializationTest { } private static byte[] b(int a, int b, int c, int d, int e, int f, int g, int h) { - return new byte[] {(byte) a, (byte) b, (byte) c, (byte) d, // - (byte) e, (byte) f, (byte) g, (byte) h,}; + return new byte[] { + (byte) a, (byte) b, (byte) c, (byte) d, // + (byte) e, (byte) f, (byte) g, (byte) h, + }; } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/ioutil/ColumnFormatterTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/ioutil/ColumnFormatterTest.java index 51abe2b950..fe642ba945 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/ioutil/ColumnFormatterTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/ioutil/ColumnFormatterTest.java @@ -14,16 +14,15 @@ package com.google.gerrit.server.ioutil; +import java.io.PrintWriter; +import java.io.StringWriter; import org.junit.Assert; import org.junit.Test; -import java.io.PrintWriter; -import java.io.StringWriter; - public class ColumnFormatterTest { /** - * Holds an in-memory {@link java.io.PrintWriter} object and allows - * comparisons of its contents to a supplied string via an assert statement. + * Holds an in-memory {@link java.io.PrintWriter} object and allows comparisons of its contents to + * a supplied string via an assert statement. */ static class PrintWriterComparator { private PrintWriter printWriter; @@ -44,14 +43,11 @@ public class ColumnFormatterTest { } } - /** - * Test that only lines with at least one column of text emit output. - */ + /** Test that only lines with at least one column of text emit output. */ @Test public void emptyLine() { final PrintWriterComparator comparator = new PrintWriterComparator(); - final ColumnFormatter formatter = - new ColumnFormatter(comparator.getPrintWriter(), '\t'); + final ColumnFormatter formatter = new ColumnFormatter(comparator.getPrintWriter(), '\t'); formatter.addColumn("foo"); formatter.addColumn("bar"); formatter.nextLine(); @@ -63,14 +59,11 @@ public class ColumnFormatterTest { comparator.assertEquals("foo\tbar\nfoo\tbar\n"); } - /** - * Test that there is no output if no columns are ever added. - */ + /** Test that there is no output if no columns are ever added. */ @Test public void emptyOutput() { final PrintWriterComparator comparator = new PrintWriterComparator(); - final ColumnFormatter formatter = - new ColumnFormatter(comparator.getPrintWriter(), '\t'); + final ColumnFormatter formatter = new ColumnFormatter(comparator.getPrintWriter(), '\t'); formatter.nextLine(); formatter.nextLine(); formatter.finish(); @@ -78,44 +71,40 @@ public class ColumnFormatterTest { } /** - * Test that there is no output (nor any exceptions) if we finalize - * the output immediately after the creation of the {@link ColumnFormatter}. + * Test that there is no output (nor any exceptions) if we finalize the output immediately after + * the creation of the {@link ColumnFormatter}. */ @Test public void noNextLine() { final PrintWriterComparator comparator = new PrintWriterComparator(); - final ColumnFormatter formatter = - new ColumnFormatter(comparator.getPrintWriter(), '\t'); + final ColumnFormatter formatter = new ColumnFormatter(comparator.getPrintWriter(), '\t'); formatter.finish(); comparator.assertEquals(""); } /** - * Test that the text in added columns is escaped while the column separator - * (which of course shouldn't be escaped) is left alone. + * Test that the text in added columns is escaped while the column separator (which of course + * shouldn't be escaped) is left alone. */ @Test public void escapingTakesPlace() { final PrintWriterComparator comparator = new PrintWriterComparator(); - final ColumnFormatter formatter = - new ColumnFormatter(comparator.getPrintWriter(), '\t'); + final ColumnFormatter formatter = new ColumnFormatter(comparator.getPrintWriter(), '\t'); formatter.addColumn("foo"); - formatter.addColumn( - "\tan indented multi-line\ntext"); + formatter.addColumn("\tan indented multi-line\ntext"); formatter.nextLine(); formatter.finish(); comparator.assertEquals("foo\t\\tan indented multi-line\\ntext\n"); } /** - * Test that we get the correct output with multi-line input where the number - * of columns in each line varies. + * Test that we get the correct output with multi-line input where the number of columns in each + * line varies. */ @Test public void multiLineDifferentColumnCount() { final PrintWriterComparator comparator = new PrintWriterComparator(); - final ColumnFormatter formatter = - new ColumnFormatter(comparator.getPrintWriter(), '\t'); + final ColumnFormatter formatter = new ColumnFormatter(comparator.getPrintWriter(), '\t'); formatter.addColumn("foo"); formatter.addColumn("bar"); formatter.addColumn("baz"); @@ -127,14 +116,11 @@ public class ColumnFormatterTest { comparator.assertEquals("foo\tbar\tbaz\nfoo\tbar\n"); } - /** - * Test that we get the correct output with a single column of input. - */ + /** Test that we get the correct output with a single column of input. */ @Test public void oneColumn() { final PrintWriterComparator comparator = new PrintWriterComparator(); - final ColumnFormatter formatter = - new ColumnFormatter(comparator.getPrintWriter(), '\t'); + final ColumnFormatter formatter = new ColumnFormatter(comparator.getPrintWriter(), '\t'); formatter.addColumn("foo"); formatter.nextLine(); formatter.finish(); diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/AddressTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/AddressTest.java index 6d33f50204..2909df7fa3 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/AddressTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/mail/AddressTest.java @@ -18,7 +18,6 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.fail; import com.google.gerrit.testutil.GerritBaseTests; - import org.junit.Test; public class AddressTest extends GerritBaseTests { @@ -133,14 +132,13 @@ public class AddressTest extends GerritBaseTests { @Test public void toHeaderString_NameEmail6() { - assertThat(format("A \u20ac B", "a@a")) - .isEqualTo("=?UTF-8?Q?A_=E2=82=AC_B?= "); + assertThat(format("A \u20ac B", "a@a")).isEqualTo("=?UTF-8?Q?A_=E2=82=AC_B?= "); } @Test public void toHeaderString_NameEmail7() { assertThat(format("A \u20ac B (Code Review)", "a@a")) - .isEqualTo("=?UTF-8?Q?A_=E2=82=AC_B_=28Code_Review=29?= "); + .isEqualTo("=?UTF-8?Q?A_=E2=82=AC_B_=28Code_Review=29?= "); } @Test diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/ValidatorTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/ValidatorTest.java index 4d7bf084e9..0620b24d50 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/ValidatorTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/mail/ValidatorTest.java @@ -18,12 +18,10 @@ import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assert_; import com.google.gerrit.server.mail.send.OutgoingEmailValidator; - -import org.junit.Test; - import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; +import org.junit.Test; public class ValidatorTest { private static final String UNSUPPORTED_PREFIX = "#! "; @@ -35,8 +33,7 @@ public class ValidatorTest { @Test public void validateTopLevelDomains() throws Exception { - try (InputStream in = - this.getClass().getResourceAsStream("tlds-alpha-by-domain.txt")) { + try (InputStream in = this.getClass().getResourceAsStream("tlds-alpha-by-domain.txt")) { if (in == null) { throw new Exception("TLD list not found"); } @@ -48,18 +45,17 @@ public class ValidatorTest { continue; } if (tld.startsWith(UNSUPPORTED_PREFIX)) { - String test = "test@example." - + tld.toLowerCase().substring(UNSUPPORTED_PREFIX.length()); + String test = "test@example." + tld.toLowerCase().substring(UNSUPPORTED_PREFIX.length()); assert_() - .withFailureMessage("expected invalid TLD \"" + test + "\"") - .that(OutgoingEmailValidator.isValid(test)) - .isFalse(); + .withFailureMessage("expected invalid TLD \"" + test + "\"") + .that(OutgoingEmailValidator.isValid(test)) + .isFalse(); } else { String test = "test@example." + tld.toLowerCase(); assert_() - .withFailureMessage("failed to validate TLD \"" + test + "\"") - .that(OutgoingEmailValidator.isValid(test)) - .isTrue(); + .withFailureMessage("failed to validate TLD \"" + test + "\"") + .that(OutgoingEmailValidator.isValid(test)) + .isTrue(); } } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/AbstractParserTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/AbstractParserTest.java index dc1c054043..3efae43149 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/AbstractParserTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/AbstractParserTest.java @@ -19,47 +19,48 @@ import static com.google.common.truth.Truth.assertThat; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.Comment; import com.google.gerrit.server.mail.Address; - -import org.joda.time.DateTime; -import org.junit.Ignore; - import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; +import org.joda.time.DateTime; +import org.junit.Ignore; @Ignore public class AbstractParserTest { - protected static final String changeURL = - "https://gerrit-review.googlesource.com/#/changes/123"; + protected static final String changeURL = "https://gerrit-review.googlesource.com/#/changes/123"; - protected static void assertChangeMessage(String message, - MailComment comment) { + protected static void assertChangeMessage(String message, MailComment comment) { assertThat(comment.fileName).isNull(); assertThat(comment.message).isEqualTo(message); assertThat(comment.inReplyTo).isNull(); assertThat(comment.type).isEqualTo(MailComment.CommentType.CHANGE_MESSAGE); } - protected static void assertInlineComment(String message, MailComment comment, - Comment inReplyTo) { + protected static void assertInlineComment( + String message, MailComment comment, Comment inReplyTo) { assertThat(comment.fileName).isNull(); assertThat(comment.message).isEqualTo(message); assertThat(comment.inReplyTo).isEqualTo(inReplyTo); assertThat(comment.type).isEqualTo(MailComment.CommentType.INLINE_COMMENT); } - protected static void assertFileComment(String message, MailComment comment, - String file) { + protected static void assertFileComment(String message, MailComment comment, String file) { assertThat(comment.fileName).isEqualTo(file); assertThat(comment.message).isEqualTo(message); assertThat(comment.inReplyTo).isNull(); assertThat(comment.type).isEqualTo(MailComment.CommentType.FILE_COMMENT); } - protected static Comment newComment(String uuid, String file, - String message, int line) { - Comment c = new Comment(new Comment.Key(uuid, file, 1), - new Account.Id(0), new Timestamp(0L), (short) 0, message, "", false); + protected static Comment newComment(String uuid, String file, String message, int line) { + Comment c = + new Comment( + new Comment.Key(uuid, file, 1), + new Account.Id(0), + new Timestamp(0L), + (short) 0, + message, + "", + false); c.lineNbr = line; return c; } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/GenericHtmlParserTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/GenericHtmlParserTest.java index 7eadf012c6..faf7451a30 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/GenericHtmlParserTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/GenericHtmlParserTest.java @@ -17,71 +17,96 @@ package com.google.gerrit.server.mail.receive; /** Test parser for a generic Html email client response */ public class GenericHtmlParserTest extends HtmlParserTest { @Override - protected String newHtmlBody(String changeMessage, String c1, - String c2, String c3, String f1, String f2, String fc1) { - String email = "" + - "
" + (changeMessage != null ? changeMessage : "") + - "

" + - "On Fri, Nov 18, 2016 at 11:15 AM, foobar (Gerrit) noreply@gerrit.com" + - "<noreply@gerrit.com> wrote:
" + - "
foobar posted comments on this change.

" + - "

View Change

Patch Set 2: CR-1\n" + - "\n" + - "(3 comments)
" + - "" + - "
  • " + // File #2: test.txt - "" + - "File gerrit-server/readme.txt:

    " + - commentBlock(f2) + - "
  • " + - "" + - "Patch Set #2, Line 31:

    " + - "
    Some inline comment from Gerrit
    " + - "

    Some text from original comment

    " + - "
  • " + - commentBlock(c3) + - "" + // Inline comment #2 - "" + - "" + // Footer - "

    To view, visit this change. " + - "To unsubscribe, visit settings." + - "

    Gerrit-MessageType: comment
    " + - "Footer omitted

    " + - "
    " + - "

    Gerrit-HasComments: Yes


    "; + protected String newHtmlBody( + String changeMessage, String c1, String c2, String c3, String f1, String f2, String fc1) { + String email = + "" + + "
    " + + (changeMessage != null ? changeMessage : "") + + "

    " + + "On Fri, Nov 18, 2016 at 11:15 AM, foobar (Gerrit) noreply@gerrit.com" + + "<noreply@gerrit.com> wrote:
    " + + "
    foobar posted comments on this change.

    " + + "

    View Change

    Patch Set 2: CR-1\n" + + "\n" + + "(3 comments)
    " + + "" + + "
  • " + + // File #2: test.txt + "" + + "File gerrit-server/readme.txt:

    " + + commentBlock(f2) + + "
  • " + + "" + + "Patch Set #2, Line 31:

    " + + "
    Some inline comment from Gerrit
    " + + "

    Some text from original comment

    " + + "
  • " + + commentBlock(c3) + + "" + + // Inline comment #2 + "" + + "" + + // Footer + "

    To view, visit this change. " + + "To unsubscribe, visit settings." + + "

    Gerrit-MessageType: comment
    " + + "Footer omitted

    " + + "
    " + + "

    Gerrit-HasComments: Yes


    "; return email; } @@ -89,7 +114,8 @@ public class GenericHtmlParserTest extends HtmlParserTest { if (comment == null) { return ""; } - return "
    " + comment + - "
      • "; + return "
    " + + comment + + "
      • "; } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/GmailHtmlParserTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/GmailHtmlParserTest.java index 7000e46237..d253af56ac 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/GmailHtmlParserTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/GmailHtmlParserTest.java @@ -16,71 +16,96 @@ package com.google.gerrit.server.mail.receive; public class GmailHtmlParserTest extends HtmlParserTest { @Override - protected String newHtmlBody(String changeMessage, String c1, - String c2, String c3, String f1, String f2, String fc1) { - String email = "" + - "
        " + (changeMessage != null ? changeMessage : "") + - "

        " + - "On Fri, Nov 18, 2016 at 11:15 AM, foobar (Gerrit) noreply@gerrit.com" + - "<noreply@gerrit.com> wrote:
        " + - "
        foobar posted comments on this change.

        " + - "

        View Change

        Patch Set 2: CR-1\n" + - "\n" + - "(3 comments)
        " + - "" + - "
      • " + // File #2: test.txt - "" + - "File gerrit-server/readme.txt:

        " + - commentBlock(f2) + - "
      • " + - "" + - "Patch Set #2, Line 31:

        " + - "
        Some inline comment from Gerrit
        " + - "

        Some text from original comment

        " + - "
      • " + - commentBlock(c3) + - "" + // Inline comment #2 - "
    " + - "" + // Footer - "

    To view, visit this change. " + - "To unsubscribe, visit settings." + - "

    Gerrit-MessageType: comment
    " + - "Footer omitted

    " + - "
    " + - "

    Gerrit-HasComments: Yes


    "; + protected String newHtmlBody( + String changeMessage, String c1, String c2, String c3, String f1, String f2, String fc1) { + String email = + "" + + "
    " + + (changeMessage != null ? changeMessage : "") + + "

    " + + "On Fri, Nov 18, 2016 at 11:15 AM, foobar (Gerrit) noreply@gerrit.com" + + "<noreply@gerrit.com> wrote:
    " + + "
    foobar posted comments on this change.

    " + + "

    View Change

    Patch Set 2: CR-1\n" + + "\n" + + "(3 comments)
    " + + "" + + "
  • " + + // File #2: test.txt + "" + + "File gerrit-server/readme.txt:

    " + + commentBlock(f2) + + "
  • " + + "" + + "Patch Set #2, Line 31:

    " + + "
    Some inline comment from Gerrit
    " + + "

    Some text from original comment

    " + + "
  • " + + commentBlock(c3) + + "" + + // Inline comment #2 + "" + + "" + + // Footer + "

    To view, visit this change. " + + "To unsubscribe, visit settings." + + "

    Gerrit-MessageType: comment
    " + + "Footer omitted

    " + + "
    " + + "

    Gerrit-HasComments: Yes


    "; return email; } @@ -88,7 +113,8 @@ public class GmailHtmlParserTest extends HtmlParserTest { if (comment == null) { return ""; } - return "
    " + comment + - "
      • "; + return "
    " + + comment + + "
      • "; } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/HtmlParserTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/HtmlParserTest.java index 198e827397..7d729bc6e6 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/HtmlParserTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/HtmlParserTest.java @@ -17,23 +17,19 @@ package com.google.gerrit.server.mail.receive; import static com.google.common.truth.Truth.assertThat; import com.google.gerrit.reviewdb.client.Comment; - +import java.util.List; import org.junit.Ignore; import org.junit.Test; -import java.util.List; - @Ignore public abstract class HtmlParserTest extends AbstractParserTest { @Test public void simpleChangeMessage() { MailMessage.Builder b = newMailMessageBuilder(); - b.htmlContent(newHtmlBody("Looks good to me", null, null, - null, null, null, null)); + b.htmlContent(newHtmlBody("Looks good to me", null, null, null, null, null, null)); List comments = defaultComments(); - List parsedComments = - HtmlParser.parse(b.build(), comments, ""); + List parsedComments = HtmlParser.parse(b.build(), comments, ""); assertThat(parsedComments).hasSize(1); assertChangeMessage("Looks good to me", parsedComments.get(0)); @@ -42,39 +38,45 @@ public abstract class HtmlParserTest extends AbstractParserTest { @Test public void simpleInlineComments() { MailMessage.Builder b = newMailMessageBuilder(); - b.htmlContent(newHtmlBody("Looks good to me", - "I have a comment on this.", null, "Also have a comment here.", - null, null, null)); + b.htmlContent( + newHtmlBody( + "Looks good to me", + "I have a comment on this.", + null, + "Also have a comment here.", + null, + null, + null)); List comments = defaultComments(); - List parsedComments = - HtmlParser.parse(b.build(), comments, changeURL); + List parsedComments = HtmlParser.parse(b.build(), comments, changeURL); assertThat(parsedComments).hasSize(3); assertChangeMessage("Looks good to me", parsedComments.get(0)); - assertInlineComment("I have a comment on this.", parsedComments.get(1), - comments.get(1)); - assertInlineComment("Also have a comment here.", parsedComments.get(2), - comments.get(3)); + assertInlineComment("I have a comment on this.", parsedComments.get(1), comments.get(1)); + assertInlineComment("Also have a comment here.", parsedComments.get(2), comments.get(3)); } @Test public void simpleFileComment() { MailMessage.Builder b = newMailMessageBuilder(); - b.htmlContent(newHtmlBody("Looks good to me", - null, null, "Also have a comment here.", - "This is a nice file", null, null)); + b.htmlContent( + newHtmlBody( + "Looks good to me", + null, + null, + "Also have a comment here.", + "This is a nice file", + null, + null)); List comments = defaultComments(); - List parsedComments = - HtmlParser.parse(b.build(), comments, changeURL); + List parsedComments = HtmlParser.parse(b.build(), comments, changeURL); assertThat(parsedComments).hasSize(3); assertChangeMessage("Looks good to me", parsedComments.get(0)); - assertFileComment("This is a nice file", parsedComments.get(1), - comments.get(1).key.filename); - assertInlineComment("Also have a comment here.", parsedComments.get(2), - comments.get(3)); + assertFileComment("This is a nice file", parsedComments.get(1), comments.get(1).key.filename); + assertInlineComment("Also have a comment here.", parsedComments.get(2), comments.get(3)); } @Test @@ -83,8 +85,7 @@ public abstract class HtmlParserTest extends AbstractParserTest { b.htmlContent(newHtmlBody(null, null, null, null, null, null, null)); List comments = defaultComments(); - List parsedComments = - HtmlParser.parse(b.build(), comments, changeURL); + List parsedComments = HtmlParser.parse(b.build(), comments, changeURL); assertThat(parsedComments).isEmpty(); } @@ -92,18 +93,16 @@ public abstract class HtmlParserTest extends AbstractParserTest { @Test public void noChangeMessage() { MailMessage.Builder b = newMailMessageBuilder(); - b.htmlContent(newHtmlBody(null, null, null, - "Also have a comment here.", "This is a nice file", null, null)); + b.htmlContent( + newHtmlBody( + null, null, null, "Also have a comment here.", "This is a nice file", null, null)); List comments = defaultComments(); - List parsedComments = - HtmlParser.parse(b.build(), comments, changeURL); + List parsedComments = HtmlParser.parse(b.build(), comments, changeURL); assertThat(parsedComments).hasSize(2); - assertFileComment("This is a nice file", parsedComments.get(0), - comments.get(1).key.filename); - assertInlineComment("Also have a comment here.", parsedComments.get(1), - comments.get(3)); + assertFileComment("This is a nice file", parsedComments.get(0), comments.get(1).key.filename); + assertInlineComment("Also have a comment here.", parsedComments.get(1), comments.get(3)); } /** @@ -118,6 +117,6 @@ public abstract class HtmlParserTest extends AbstractParserTest { * @param fc1 Comment in reply to a comment on file 1. * @return A string with all inline comments and the original quoted email. */ - protected abstract String newHtmlBody(String changeMessage, String c1, - String c2, String c3, String f1, String f2, String fc1); + protected abstract String newHtmlBody( + String changeMessage, String c1, String c2, String c3, String f1, String f2, String fc1); } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/MetadataParserTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/MetadataParserTest.java index 67f3e46824..2c60b5d821 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/MetadataParserTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/MetadataParserTest.java @@ -20,7 +20,6 @@ import static com.google.gerrit.server.mail.MetadataName.toHeaderWithDelimiter; import com.google.gerrit.server.mail.Address; import com.google.gerrit.server.mail.MetadataName; - import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.junit.Test; @@ -35,13 +34,11 @@ public class MetadataParserTest { b.dateReceived(new DateTime()); b.subject(""); - b.addAdditionalHeader( - toHeaderWithDelimiter(MetadataName.CHANGE_ID) + "cid"); + b.addAdditionalHeader(toHeaderWithDelimiter(MetadataName.CHANGE_ID) + "cid"); b.addAdditionalHeader(toHeaderWithDelimiter(MetadataName.PATCH_SET) + "1"); + b.addAdditionalHeader(toHeaderWithDelimiter(MetadataName.MESSAGE_TYPE) + "comment"); b.addAdditionalHeader( - toHeaderWithDelimiter(MetadataName.MESSAGE_TYPE) +"comment"); - b.addAdditionalHeader(toHeaderWithDelimiter(MetadataName.TIMESTAMP) + - "Tue, 25 Oct 2016 02:11:35 -0700"); + toHeaderWithDelimiter(MetadataName.TIMESTAMP) + "Tue, 25 Oct 2016 02:11:35 -0700"); Address author = new Address("Diffy", "test@gerritcodereview.com"); b.from(author); @@ -51,8 +48,8 @@ public class MetadataParserTest { assertThat(meta.changeId).isEqualTo("cid"); assertThat(meta.patchSet).isEqualTo(1); assertThat(meta.messageType).isEqualTo("comment"); - assertThat(meta.timestamp.getTime()).isEqualTo( - new DateTime(2016, 10, 25, 9, 11, 35, 0, DateTimeZone.UTC).getMillis()); + assertThat(meta.timestamp.getTime()) + .isEqualTo(new DateTime(2016, 10, 25, 9, 11, 35, 0, DateTimeZone.UTC).getMillis()); } @Test @@ -65,14 +62,11 @@ public class MetadataParserTest { b.subject(""); StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(toFooterWithDelimiter(MetadataName.CHANGE_ID) + "cid" + "\n"); + stringBuilder.append(toFooterWithDelimiter(MetadataName.PATCH_SET) + "1" + "\n"); + stringBuilder.append(toFooterWithDelimiter(MetadataName.MESSAGE_TYPE) + "comment" + "\n"); stringBuilder.append( - toFooterWithDelimiter(MetadataName.CHANGE_ID) + "cid" + "\n"); - stringBuilder.append( - toFooterWithDelimiter(MetadataName.PATCH_SET) + "1" + "\n"); - stringBuilder.append( - toFooterWithDelimiter(MetadataName.MESSAGE_TYPE) + "comment" + "\n"); - stringBuilder.append(toFooterWithDelimiter(MetadataName.TIMESTAMP) + - "Tue, 25 Oct 2016 02:11:35 -0700" + "\n"); + toFooterWithDelimiter(MetadataName.TIMESTAMP) + "Tue, 25 Oct 2016 02:11:35 -0700" + "\n"); b.textContent(stringBuilder.toString()); Address author = new Address("Diffy", "test@gerritcodereview.com"); @@ -83,8 +77,8 @@ public class MetadataParserTest { assertThat(meta.changeId).isEqualTo("cid"); assertThat(meta.patchSet).isEqualTo(1); assertThat(meta.messageType).isEqualTo("comment"); - assertThat(meta.timestamp.getTime()).isEqualTo( - new DateTime(2016, 10, 25, 9, 11, 35, 0, DateTimeZone.UTC).getMillis()); + assertThat(meta.timestamp.getTime()) + .isEqualTo(new DateTime(2016, 10, 25, 9, 11, 35, 0, DateTimeZone.UTC).getMillis()); } @Test @@ -97,14 +91,15 @@ public class MetadataParserTest { b.subject(""); StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append("

        " + - toFooterWithDelimiter(MetadataName.CHANGE_ID) + "cid" + "

        "); - stringBuilder.append("

        " + toFooterWithDelimiter(MetadataName.PATCH_SET) + - "1" + "

        "); - stringBuilder.append("

        " + - toFooterWithDelimiter(MetadataName.MESSAGE_TYPE) + "comment" + "

        "); - stringBuilder.append("

        " + toFooterWithDelimiter(MetadataName.TIMESTAMP) + - "Tue, 25 Oct 2016 02:11:35 -0700" + "

        "); + stringBuilder.append("

        " + toFooterWithDelimiter(MetadataName.CHANGE_ID) + "cid" + "

        "); + stringBuilder.append("

        " + toFooterWithDelimiter(MetadataName.PATCH_SET) + "1" + "

        "); + stringBuilder.append( + "

        " + toFooterWithDelimiter(MetadataName.MESSAGE_TYPE) + "comment" + "

        "); + stringBuilder.append( + "

        " + + toFooterWithDelimiter(MetadataName.TIMESTAMP) + + "Tue, 25 Oct 2016 02:11:35 -0700" + + "

        "); b.htmlContent(stringBuilder.toString()); Address author = new Address("Diffy", "test@gerritcodereview.com"); @@ -115,7 +110,7 @@ public class MetadataParserTest { assertThat(meta.changeId).isEqualTo("cid"); assertThat(meta.patchSet).isEqualTo(1); assertThat(meta.messageType).isEqualTo("comment"); - assertThat(meta.timestamp.getTime()).isEqualTo( - new DateTime(2016, 10, 25, 9, 11, 35, 0, DateTimeZone.UTC).getMillis()); + assertThat(meta.timestamp.getTime()) + .isEqualTo(new DateTime(2016, 10, 25, 9, 11, 35, 0, DateTimeZone.UTC).getMillis()); } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/RawMailParserTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/RawMailParserTest.java index 2e5b4c2237..4efa8174eb 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/RawMailParserTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/RawMailParserTest.java @@ -24,40 +24,39 @@ import com.google.gerrit.server.mail.receive.data.QuotedPrintableHeaderMessage; import com.google.gerrit.server.mail.receive.data.RawMailMessage; import com.google.gerrit.server.mail.receive.data.SimpleTextMessage; import com.google.gerrit.testutil.GerritBaseTests; - import org.junit.Test; public class RawMailParserTest extends GerritBaseTests { @Test public void parseEmail() throws Exception { - RawMailMessage[] messages = new RawMailMessage[] { - new SimpleTextMessage(), - new Base64HeaderMessage(), - new QuotedPrintableHeaderMessage(), - new HtmlMimeMessage(), - new AttachmentMessage(), - new NonUTF8Message(), - }; + RawMailMessage[] messages = + new RawMailMessage[] { + new SimpleTextMessage(), + new Base64HeaderMessage(), + new QuotedPrintableHeaderMessage(), + new HtmlMimeMessage(), + new AttachmentMessage(), + new NonUTF8Message(), + }; for (RawMailMessage rawMailMessage : messages) { if (rawMailMessage.rawChars() != null) { // Assert Character to Mail Parser - MailMessage parsedMailMessage = - RawMailParser.parse(rawMailMessage.rawChars()); + MailMessage parsedMailMessage = RawMailParser.parse(rawMailMessage.rawChars()); assertMail(parsedMailMessage, rawMailMessage.expectedMailMessage()); } if (rawMailMessage.raw() != null) { // Assert String to Mail Parser - MailMessage parsedMailMessage = RawMailParser - .parse(rawMailMessage.raw()); + MailMessage parsedMailMessage = RawMailParser.parse(rawMailMessage.raw()); assertMail(parsedMailMessage, rawMailMessage.expectedMailMessage()); } } } /** - * This method makes it easier to debug failing tests by checking each - * property individual instead of calling equals as it will immediately - * reveal the property that diverges between the two objects. + * This method makes it easier to debug failing tests by checking each property individual instead + * of calling equals as it will immediately reveal the property that diverges between the two + * objects. + * * @param have MailMessage retrieved from the parser * @param want MailMessage that would be expected */ @@ -66,8 +65,7 @@ public class RawMailParserTest extends GerritBaseTests { assertThat(have.to()).isEqualTo(want.to()); assertThat(have.from()).isEqualTo(want.from()); assertThat(have.cc()).isEqualTo(want.cc()); - assertThat(have.dateReceived().getMillis()) - .isEqualTo(want.dateReceived().getMillis()); + assertThat(have.dateReceived().getMillis()).isEqualTo(want.dateReceived().getMillis()); assertThat(have.additionalHeaders()).isEqualTo(want.additionalHeaders()); assertThat(have.subject()).isEqualTo(want.subject()); assertThat(have.textContent()).isEqualTo(want.textContent()); diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/TextParserTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/TextParserTest.java index 7a556538b2..b23b3411c5 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/TextParserTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/TextParserTest.java @@ -17,23 +17,22 @@ package com.google.gerrit.server.mail.receive; import static com.google.common.truth.Truth.assertThat; import com.google.gerrit.reviewdb.client.Comment; - +import java.util.List; import org.junit.Test; -import java.util.List; - public class TextParserTest extends AbstractParserTest { - private static final String quotedFooter = "" + - "> To view, visit https://gerrit-review.googlesource.com/123\n" + - "> To unsubscribe, visit https://gerrit-review.googlesource.com\n" + - "> \n" + - "> Gerrit-MessageType: comment\n" + - "> Gerrit-Change-Id: Ie1234021bf1e8d1425641af58fd648fc011db153\n" + - "> Gerrit-PatchSet: 1\n" + - "> Gerrit-Project: gerrit\n" + - "> Gerrit-Branch: master\n" + - "> Gerrit-Owner: Foo Bar \n" + - "> Gerrit-HasComments: Yes"; + private static final String quotedFooter = + "" + + "> To view, visit https://gerrit-review.googlesource.com/123\n" + + "> To unsubscribe, visit https://gerrit-review.googlesource.com\n" + + "> \n" + + "> Gerrit-MessageType: comment\n" + + "> Gerrit-Change-Id: Ie1234021bf1e8d1425641af58fd648fc011db153\n" + + "> Gerrit-PatchSet: 1\n" + + "> Gerrit-Project: gerrit\n" + + "> Gerrit-Branch: master\n" + + "> Gerrit-Owner: Foo Bar \n" + + "> Gerrit-HasComments: Yes"; @Test public void simpleChangeMessage() { @@ -41,8 +40,7 @@ public class TextParserTest extends AbstractParserTest { b.textContent("Looks good to me\n" + quotedFooter); List comments = defaultComments(); - List parsedComments = - TextParser.parse(b.build(), comments, changeURL); + List parsedComments = TextParser.parse(b.build(), comments, changeURL); assertThat(parsedComments).hasSize(1); assertChangeMessage("Looks good to me", parsedComments.get(0)); @@ -51,50 +49,56 @@ public class TextParserTest extends AbstractParserTest { @Test public void simpleInlineComments() { MailMessage.Builder b = newMailMessageBuilder(); - b.textContent(newPlaintextBody("Looks good to me", - "I have a comment on this.", null, "Also have a comment here.", - null, null, null) + quotedFooter); + b.textContent( + newPlaintextBody( + "Looks good to me", + "I have a comment on this.", + null, + "Also have a comment here.", + null, + null, + null) + + quotedFooter); List comments = defaultComments(); - List parsedComments = - TextParser.parse(b.build(), comments, changeURL); + List parsedComments = TextParser.parse(b.build(), comments, changeURL); assertThat(parsedComments).hasSize(3); assertChangeMessage("Looks good to me", parsedComments.get(0)); - assertInlineComment("I have a comment on this.", parsedComments.get(1), - comments.get(1)); - assertInlineComment("Also have a comment here.", parsedComments.get(2), - comments.get(3)); + assertInlineComment("I have a comment on this.", parsedComments.get(1), comments.get(1)); + assertInlineComment("Also have a comment here.", parsedComments.get(2), comments.get(3)); } @Test public void simpleFileComment() { MailMessage.Builder b = newMailMessageBuilder(); - b.textContent(newPlaintextBody("Looks good to me", - null, null, "Also have a comment here.", - "This is a nice file", null, null) + quotedFooter); + b.textContent( + newPlaintextBody( + "Looks good to me", + null, + null, + "Also have a comment here.", + "This is a nice file", + null, + null) + + quotedFooter); List comments = defaultComments(); - List parsedComments = - TextParser.parse(b.build(), comments, changeURL); + List parsedComments = TextParser.parse(b.build(), comments, changeURL); assertThat(parsedComments).hasSize(3); assertChangeMessage("Looks good to me", parsedComments.get(0)); - assertFileComment("This is a nice file", parsedComments.get(1), - comments.get(1).key.filename); - assertInlineComment("Also have a comment here.", parsedComments.get(2), - comments.get(3)); + assertFileComment("This is a nice file", parsedComments.get(1), comments.get(1).key.filename); + assertInlineComment("Also have a comment here.", parsedComments.get(2), comments.get(3)); } @Test public void noComments() { MailMessage.Builder b = newMailMessageBuilder(); - b.textContent(newPlaintextBody(null, null, null, null, null, null, null) + - quotedFooter); + b.textContent(newPlaintextBody(null, null, null, null, null, null, null) + quotedFooter); List comments = defaultComments(); - List parsedComments = - TextParser.parse(b.build(), comments, changeURL); + List parsedComments = TextParser.parse(b.build(), comments, changeURL); assertThat(parsedComments).isEmpty(); } @@ -102,55 +106,63 @@ public class TextParserTest extends AbstractParserTest { @Test public void noChangeMessage() { MailMessage.Builder b = newMailMessageBuilder(); - b.textContent(newPlaintextBody(null, null, null, - "Also have a comment here.", "This is a nice file", null, null) + - quotedFooter); + b.textContent( + newPlaintextBody( + null, null, null, "Also have a comment here.", "This is a nice file", null, null) + + quotedFooter); List comments = defaultComments(); - List parsedComments = - TextParser.parse(b.build(), comments, changeURL); + List parsedComments = TextParser.parse(b.build(), comments, changeURL); assertThat(parsedComments).hasSize(2); - assertFileComment("This is a nice file", parsedComments.get(0), - comments.get(1).key.filename); - assertInlineComment("Also have a comment here.", parsedComments.get(1), - comments.get(3)); + assertFileComment("This is a nice file", parsedComments.get(0), comments.get(1).key.filename); + assertInlineComment("Also have a comment here.", parsedComments.get(1), comments.get(3)); } @Test public void allCommentsGmail() { MailMessage.Builder b = newMailMessageBuilder(); - b.textContent((newPlaintextBody("Looks good to me", - null, null, "Also have a comment here.", - "This is a nice file", null, null) + quotedFooter) - .replace("> ", ">> ")); + b.textContent( + (newPlaintextBody( + "Looks good to me", + null, + null, + "Also have a comment here.", + "This is a nice file", + null, + null) + + quotedFooter) + .replace("> ", ">> ")); List comments = defaultComments(); - List parsedComments = - TextParser.parse(b.build(), comments, changeURL); + List parsedComments = TextParser.parse(b.build(), comments, changeURL); assertThat(parsedComments).hasSize(3); assertChangeMessage("Looks good to me", parsedComments.get(0)); - assertFileComment("This is a nice file", parsedComments.get(1), - comments.get(1).key.filename); - assertInlineComment("Also have a comment here.", parsedComments.get(2), - comments.get(3)); + assertFileComment("This is a nice file", parsedComments.get(1), comments.get(1).key.filename); + assertInlineComment("Also have a comment here.", parsedComments.get(2), comments.get(3)); } @Test public void replyToFileComment() { MailMessage.Builder b = newMailMessageBuilder(); - b.textContent(newPlaintextBody("Looks good to me", null, null, null, null, - null, "Comment in reply to file comment") + quotedFooter); + b.textContent( + newPlaintextBody( + "Looks good to me", + null, + null, + null, + null, + null, + "Comment in reply to file comment") + + quotedFooter); List comments = defaultComments(); - List parsedComments = - TextParser.parse(b.build(), comments, changeURL); + List parsedComments = TextParser.parse(b.build(), comments, changeURL); assertThat(parsedComments).hasSize(2); assertChangeMessage("Looks good to me", parsedComments.get(0)); - assertInlineComment("Comment in reply to file comment", - parsedComments.get(1), comments.get(0)); + assertInlineComment("Comment in reply to file comment", parsedComments.get(1), comments.get(0)); } /** @@ -165,55 +177,69 @@ public class TextParserTest extends AbstractParserTest { * @param fc1 Comment in reply to a comment of file 1. * @return A string with all inline comments and the original quoted email. */ - private static String newPlaintextBody(String changeMessage, String c1, - String c2, String c3, String f1, String f2, String fc1) { - return (changeMessage == null ? "" : changeMessage + "\n") + - "> Foo Bar has posted comments on this change. ( \n" + - "> " + changeURL +"/1 )\n" + - "> \n" + - "> Change subject: Test change\n" + - "> ...............................................................\n" + - "> \n" + - "> \n" + - "> Patch Set 1: Code-Review+1\n" + - "> \n" + - "> (3 comments)\n" + - "> \n" + - "> " + changeURL + "/1/gerrit-server/test.txt\n" + - "> File \n" + - "> gerrit-server/test.txt:\n" + - (f1 == null ? "" : f1 + "\n") + - "> \n" + - "> Patch Set #4:\n" + - "> " + changeURL + "/1/gerrit-server/test.txt\n" + - "> \n" + - "> Some comment" + - "> \n" + - (fc1 == null ? "" : fc1 + "\n") + - "> " + changeURL + "/1/gerrit-server/test.txt@2\n" + - "> PS1, Line 2: throw new Exception(\"Object has unsupported: \" +\n" + - "> : entry.getValue() +\n" + - "> : \" must be java.util.Date\");\n" + - "> Should entry.getKey() be included in this message?\n" + - "> \n" + - (c1 == null ? "" : c1 + "\n") + - "> \n" + - "> " + changeURL + "/1/gerrit-server/test.txt@3\n" + - "> PS1, Line 3: throw new Exception(\"Object has: \" +\n" + - "> : entry.getValue().getClass() +\n" + - "> : \" must be java.util.Date\");\n" + - "> same here\n" + - "> \n" + - (c2 == null ? "" : c2 + "\n") + - "> \n" + - "> " + changeURL + "/1/gerrit-server/readme.txt\n" + - "> File \n" + - "> gerrit-server/readme.txt:\n" + - (f2 == null ? "" : f2 + "\n") + - "> \n" + - "> " + changeURL + "/1/gerrit-server/readme.txt@3\n" + - "> PS1, Line 3: E\n" + - "> Should this be EEE like in other places?\n" + - (c3 == null ? "" : c3 + "\n"); + private static String newPlaintextBody( + String changeMessage, String c1, String c2, String c3, String f1, String f2, String fc1) { + return (changeMessage == null ? "" : changeMessage + "\n") + + "> Foo Bar has posted comments on this change. ( \n" + + "> " + + changeURL + + "/1 )\n" + + "> \n" + + "> Change subject: Test change\n" + + "> ...............................................................\n" + + "> \n" + + "> \n" + + "> Patch Set 1: Code-Review+1\n" + + "> \n" + + "> (3 comments)\n" + + "> \n" + + "> " + + changeURL + + "/1/gerrit-server/test.txt\n" + + "> File \n" + + "> gerrit-server/test.txt:\n" + + (f1 == null ? "" : f1 + "\n") + + "> \n" + + "> Patch Set #4:\n" + + "> " + + changeURL + + "/1/gerrit-server/test.txt\n" + + "> \n" + + "> Some comment" + + "> \n" + + (fc1 == null ? "" : fc1 + "\n") + + "> " + + changeURL + + "/1/gerrit-server/test.txt@2\n" + + "> PS1, Line 2: throw new Exception(\"Object has unsupported: \" +\n" + + "> : entry.getValue() +\n" + + "> : \" must be java.util.Date\");\n" + + "> Should entry.getKey() be included in this message?\n" + + "> \n" + + (c1 == null ? "" : c1 + "\n") + + "> \n" + + "> " + + changeURL + + "/1/gerrit-server/test.txt@3\n" + + "> PS1, Line 3: throw new Exception(\"Object has: \" +\n" + + "> : entry.getValue().getClass() +\n" + + "> : \" must be java.util.Date\");\n" + + "> same here\n" + + "> \n" + + (c2 == null ? "" : c2 + "\n") + + "> \n" + + "> " + + changeURL + + "/1/gerrit-server/readme.txt\n" + + "> File \n" + + "> gerrit-server/readme.txt:\n" + + (f2 == null ? "" : f2 + "\n") + + "> \n" + + "> " + + changeURL + + "/1/gerrit-server/readme.txt@3\n" + + "> PS1, Line 3: E\n" + + "> Should this be EEE like in other places?\n" + + (c3 == null ? "" : c3 + "\n"); } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/AttachmentMessage.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/AttachmentMessage.java index 390209af36..2c418ec92e 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/AttachmentMessage.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/AttachmentMessage.java @@ -14,52 +14,48 @@ package com.google.gerrit.server.mail.receive.data; - import com.google.gerrit.server.mail.Address; import com.google.gerrit.server.mail.receive.MailMessage; - import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.junit.Ignore; -/** - * Tests that all mime parts that are neither text/plain, nor text/html are - * dropped. - */ +/** Tests that all mime parts that are neither text/plain, nor text/html are dropped. */ @Ignore public class AttachmentMessage extends RawMailMessage { - private static String raw = "MIME-Version: 1.0\n" + - "Date: Tue, 25 Oct 2016 02:11:35 -0700\n" + - "Message-ID: \n" + - "Subject: Test Subject\n" + - "From: Patrick Hiesel \n" + - "To: Patrick Hiesel \n" + - "Content-Type: multipart/mixed; boundary=001a114e019a56962d054062708f\n" + - "\n" + - "--001a114e019a56962d054062708f\n" + - "Content-Type: multipart/alternative; boundary=001a114e019a5696250540" + - "62708d\n" + - "\n" + - "--001a114e019a569625054062708d\n" + - "Content-Type: text/plain; charset=UTF-8\n" + - "\n" + - "Contains unwanted attachment" + - "\n" + - "--001a114e019a569625054062708d\n" + - "Content-Type: text/html; charset=UTF-8\n" + - "\n" + - "
        Contains unwanted attachment
        " + - "\n" + - "--001a114e019a569625054062708d--\n" + - "--001a114e019a56962d054062708f\n" + - "Content-Type: text/plain; charset=US-ASCII; name=\"test.txt\"\n" + - "Content-Disposition: attachment; filename=\"test.txt\"\n" + - "Content-Transfer-Encoding: base64\n" + - "X-Attachment-Id: f_iv264bt50\n" + - "\n" + - "VEVTVAo=\n" + - "--001a114e019a56962d054062708f--"; + private static String raw = + "MIME-Version: 1.0\n" + + "Date: Tue, 25 Oct 2016 02:11:35 -0700\n" + + "Message-ID: \n" + + "Subject: Test Subject\n" + + "From: Patrick Hiesel \n" + + "To: Patrick Hiesel \n" + + "Content-Type: multipart/mixed; boundary=001a114e019a56962d054062708f\n" + + "\n" + + "--001a114e019a56962d054062708f\n" + + "Content-Type: multipart/alternative; boundary=001a114e019a5696250540" + + "62708d\n" + + "\n" + + "--001a114e019a569625054062708d\n" + + "Content-Type: text/plain; charset=UTF-8\n" + + "\n" + + "Contains unwanted attachment" + + "\n" + + "--001a114e019a569625054062708d\n" + + "Content-Type: text/html; charset=UTF-8\n" + + "\n" + + "
        Contains unwanted attachment
        " + + "\n" + + "--001a114e019a569625054062708d--\n" + + "--001a114e019a56962d054062708f\n" + + "Content-Type: text/plain; charset=US-ASCII; name=\"test.txt\"\n" + + "Content-Disposition: attachment; filename=\"test.txt\"\n" + + "Content-Transfer-Encoding: base64\n" + + "X-Attachment-Id: f_iv264bt50\n" + + "\n" + + "VEVTVAo=\n" + + "--001a114e019a56962d054062708f--"; @Override public String raw() { @@ -76,16 +72,14 @@ public class AttachmentMessage extends RawMailMessage { System.out.println("\uD83D\uDE1B test"); MailMessage.Builder expect = MailMessage.builder(); expect - .id("") + .id("") .from(new Address("Patrick Hiesel", "hiesel@google.com")) .addTo(new Address("Patrick Hiesel", "hiesel@google.com")) .textContent("Contains unwanted attachment") .htmlContent("
        Contains unwanted attachment
        ") .subject("Test Subject") .addAdditionalHeader("MIME-Version: 1.0") - .dateReceived( - new DateTime(2016, 10, 25, 9, 11, 35, 0, DateTimeZone.UTC)); + .dateReceived(new DateTime(2016, 10, 25, 9, 11, 35, 0, DateTimeZone.UTC)); return expect.build(); } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/Base64HeaderMessage.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/Base64HeaderMessage.java index 5511e756e0..affa3bd976 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/Base64HeaderMessage.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/Base64HeaderMessage.java @@ -16,26 +16,25 @@ package com.google.gerrit.server.mail.receive.data; import com.google.gerrit.server.mail.Address; import com.google.gerrit.server.mail.receive.MailMessage; - import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.junit.Ignore; -/** - * Tests parsing a Base64 encoded subject. - */ +/** Tests parsing a Base64 encoded subject. */ @Ignore public class Base64HeaderMessage extends RawMailMessage { private static String textContent = "Some Text"; - private static String raw = "" + - "Date: Tue, 25 Oct 2016 02:11:35 -0700\n" + - "Message-ID: <001a114da7ae26e2eb053fe0c29c@google.com>\n" + - "Subject: =?UTF-8?B?8J+YmyB0ZXN0?=\n" + - "From: \"Jonathan Nieder (Gerrit)\" \n" + - "To: ekempin \n" + - "Content-Type: text/plain; charset=UTF-8; format=flowed; delsp=yes\n" + - "\n" + textContent; + private static String raw = + "" + + "Date: Tue, 25 Oct 2016 02:11:35 -0700\n" + + "Message-ID: <001a114da7ae26e2eb053fe0c29c@google.com>\n" + + "Subject: =?UTF-8?B?8J+YmyB0ZXN0?=\n" + + "From: \"Jonathan Nieder (Gerrit)\" \n" + + "To: ekempin \n" + + "Content-Type: text/plain; charset=UTF-8; format=flowed; delsp=yes\n" + + "\n" + + textContent; @Override public String raw() { @@ -52,13 +51,14 @@ public class Base64HeaderMessage extends RawMailMessage { MailMessage.Builder expect = MailMessage.builder(); expect .id("<001a114da7ae26e2eb053fe0c29c@google.com>") - .from(new Address("Jonathan Nieder (Gerrit)", - "noreply-gerritcodereview-CtTy0igsBrnvL7dKoWEIEg@google.com")) - .addTo(new Address("ekempin","ekempin@google.com")) + .from( + new Address( + "Jonathan Nieder (Gerrit)", + "noreply-gerritcodereview-CtTy0igsBrnvL7dKoWEIEg@google.com")) + .addTo(new Address("ekempin", "ekempin@google.com")) .textContent(textContent) .subject("\uD83D\uDE1B test") - .dateReceived( - new DateTime(2016, 10, 25, 9, 11, 35, 0, DateTimeZone.UTC)); + .dateReceived(new DateTime(2016, 10, 25, 9, 11, 35, 0, DateTimeZone.UTC)); return expect.build(); } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/HtmlMimeMessage.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/HtmlMimeMessage.java index 2ed096ed21..c19e618100 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/HtmlMimeMessage.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/HtmlMimeMessage.java @@ -16,63 +16,63 @@ package com.google.gerrit.server.mail.receive.data; import com.google.gerrit.server.mail.Address; import com.google.gerrit.server.mail.receive.MailMessage; - import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.junit.Ignore; -/** - * Tests a message containing mime/alternative (text + html) content. - */ +/** Tests a message containing mime/alternative (text + html) content. */ @Ignore public class HtmlMimeMessage extends RawMailMessage { private static String textContent = "Simple test"; // htmlContent is encoded in quoted-printable - private static String htmlContent = "
        Test Messa=\n" + - "ge in HTML=C2=A0=C3=9C
        "; + private static String htmlContent = + "
        Test Messa=\n" + + "ge in HTML=C2=A0=C3=9C
        "; - private static String unencodedHtmlContent = "" + - "
        Test " + - "Message in HTML Ü
        "; + private static String unencodedHtmlContent = + "" + + "
        Test " + + "Message in HTML Ü
        "; - private static String raw = "" + - "MIME-Version: 1.0\n" + - "Date: Tue, 25 Oct 2016 02:11:35 -0700\n" + - "Message-ID: <001a114cd8be55b4ab053face5cd@google.com>\n" + - "Subject: Change in gerrit[master]: Implement receiver class structure " + - "and bindings\n" + - "From: \"ekempin (Gerrit)\" \n" + - "To: Patrick Hiesel \n" + - "Cc: ekempin \n" + - "Content-Type: multipart/alternative; boundary=001a114cd8b" + - "e55b486053face5ca\n" + - "\n" + - "--001a114cd8be55b486053face5ca\n" + - "Content-Type: text/plain; charset=UTF-8; format=flowed; delsp=yes\n" + - "\n" + - textContent + - "\n" + - "--001a114cd8be55b486053face5ca\n" + - "Content-Type: text/html; charset=UTF-8\n" + - "Content-Transfer-Encoding: quoted-printable\n" + - "\n" + - htmlContent + - "\n" + - "--001a114cd8be55b486053face5ca--"; + private static String raw = + "" + + "MIME-Version: 1.0\n" + + "Date: Tue, 25 Oct 2016 02:11:35 -0700\n" + + "Message-ID: <001a114cd8be55b4ab053face5cd@google.com>\n" + + "Subject: Change in gerrit[master]: Implement receiver class structure " + + "and bindings\n" + + "From: \"ekempin (Gerrit)\" \n" + + "To: Patrick Hiesel \n" + + "Cc: ekempin \n" + + "Content-Type: multipart/alternative; boundary=001a114cd8b" + + "e55b486053face5ca\n" + + "\n" + + "--001a114cd8be55b486053face5ca\n" + + "Content-Type: text/plain; charset=UTF-8; format=flowed; delsp=yes\n" + + "\n" + + textContent + + "\n" + + "--001a114cd8be55b486053face5ca\n" + + "Content-Type: text/html; charset=UTF-8\n" + + "Content-Transfer-Encoding: quoted-printable\n" + + "\n" + + htmlContent + + "\n" + + "--001a114cd8be55b486053face5ca--"; @Override public String raw() { @@ -89,17 +89,16 @@ public class HtmlMimeMessage extends RawMailMessage { MailMessage.Builder expect = MailMessage.builder(); expect .id("<001a114cd8be55b4ab053face5cd@google.com>") - .from(new Address("ekempin (Gerrit)", - "noreply-gerritcodereview-qUgXfQecoDLHwp0MldAzig@google.com")) - .addCc(new Address("ekempin","ekempin@google.com")) - .addTo(new Address("Patrick Hiesel","hiesel@google.com")) + .from( + new Address( + "ekempin (Gerrit)", "noreply-gerritcodereview-qUgXfQecoDLHwp0MldAzig@google.com")) + .addCc(new Address("ekempin", "ekempin@google.com")) + .addTo(new Address("Patrick Hiesel", "hiesel@google.com")) .textContent(textContent) .htmlContent(unencodedHtmlContent) - .subject("Change in gerrit[master]: Implement " + - "receiver class structure and bindings") + .subject("Change in gerrit[master]: Implement " + "receiver class structure and bindings") .addAdditionalHeader("MIME-Version: 1.0") - .dateReceived( - new DateTime(2016, 10, 25, 9, 11, 35, 0, DateTimeZone.UTC)); + .dateReceived(new DateTime(2016, 10, 25, 9, 11, 35, 0, DateTimeZone.UTC)); return expect.build(); } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/NonUTF8Message.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/NonUTF8Message.java index 14720490bc..9f2af0df23 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/NonUTF8Message.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/NonUTF8Message.java @@ -15,26 +15,25 @@ package com.google.gerrit.server.mail.receive.data; import com.google.gerrit.server.mail.Address; import com.google.gerrit.server.mail.receive.MailMessage; - import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.junit.Ignore; -/** - * Tests that non-UTF8 encodings are handled correctly. - */ +/** Tests that non-UTF8 encodings are handled correctly. */ @Ignore public class NonUTF8Message extends RawMailMessage { private static String textContent = "Some Text"; - private static String raw = "" + - "Date: Tue, 25 Oct 2016 02:11:35 -0700\n" + - "Message-ID: <001a114da7ae26e2eb053fe0c29c@google.com>\n" + - "Subject: =?UTF-8?B?8J+YmyB0ZXN0?=\n" + - "From: \"Jonathan Nieder (Gerrit)\" \n" + - "To: ekempin \n" + - "Content-Type: text/plain; charset=UTF-8; format=flowed; delsp=yes\n" + - "\n" + textContent; + private static String raw = + "" + + "Date: Tue, 25 Oct 2016 02:11:35 -0700\n" + + "Message-ID: <001a114da7ae26e2eb053fe0c29c@google.com>\n" + + "Subject: =?UTF-8?B?8J+YmyB0ZXN0?=\n" + + "From: \"Jonathan Nieder (Gerrit)\" \n" + + "To: ekempin \n" + + "Content-Type: text/plain; charset=UTF-8; format=flowed; delsp=yes\n" + + "\n" + + textContent; @Override public String raw() { @@ -56,13 +55,14 @@ public class NonUTF8Message extends RawMailMessage { MailMessage.Builder expect = MailMessage.builder(); expect .id("<001a114da7ae26e2eb053fe0c29c@google.com>") - .from(new Address("Jonathan Nieder (Gerrit)", - "noreply-gerritcodereview-CtTy0igsBrnvL7dKoWEIEg@google.com")) - .addTo(new Address("ekempin","ekempin@google.com")) + .from( + new Address( + "Jonathan Nieder (Gerrit)", + "noreply-gerritcodereview-CtTy0igsBrnvL7dKoWEIEg@google.com")) + .addTo(new Address("ekempin", "ekempin@google.com")) .textContent(textContent) .subject("\uD83D\uDE1B test") - .dateReceived( - new DateTime(2016, 10, 25, 9, 11, 35, 0, DateTimeZone.UTC)); + .dateReceived(new DateTime(2016, 10, 25, 9, 11, 35, 0, DateTimeZone.UTC)); return expect.build(); } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/QuotedPrintableHeaderMessage.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/QuotedPrintableHeaderMessage.java index f694447f7a..2c17859968 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/QuotedPrintableHeaderMessage.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/QuotedPrintableHeaderMessage.java @@ -16,26 +16,25 @@ package com.google.gerrit.server.mail.receive.data; import com.google.gerrit.server.mail.Address; import com.google.gerrit.server.mail.receive.MailMessage; - import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.junit.Ignore; -/** - * Tests parsing a quoted printable encoded subject - */ +/** Tests parsing a quoted printable encoded subject */ @Ignore public class QuotedPrintableHeaderMessage extends RawMailMessage { private static String textContent = "Some Text"; - private static String raw = "" + - "Date: Tue, 25 Oct 2016 02:11:35 -0700\n" + - "Message-ID: <001a114da7ae26e2eb053fe0c29c@google.com>\n" + - "Subject: =?UTF-8?Q?=C3=A2me vulgaire?=\n" + - "From: \"Jonathan Nieder (Gerrit)\" \n" + - "To: ekempin \n" + - "Content-Type: text/plain; charset=UTF-8; format=flowed; delsp=yes\n" + - "\n" + textContent; + private static String raw = + "" + + "Date: Tue, 25 Oct 2016 02:11:35 -0700\n" + + "Message-ID: <001a114da7ae26e2eb053fe0c29c@google.com>\n" + + "Subject: =?UTF-8?Q?=C3=A2me vulgaire?=\n" + + "From: \"Jonathan Nieder (Gerrit)\" \n" + + "To: ekempin \n" + + "Content-Type: text/plain; charset=UTF-8; format=flowed; delsp=yes\n" + + "\n" + + textContent; @Override public String raw() { @@ -53,13 +52,14 @@ public class QuotedPrintableHeaderMessage extends RawMailMessage { MailMessage.Builder expect = MailMessage.builder(); expect .id("<001a114da7ae26e2eb053fe0c29c@google.com>") - .from(new Address("Jonathan Nieder (Gerrit)", - "noreply-gerritcodereview-CtTy0igsBrnvL7dKoWEIEg@google.com")) - .addTo(new Address("ekempin","ekempin@google.com")) + .from( + new Address( + "Jonathan Nieder (Gerrit)", + "noreply-gerritcodereview-CtTy0igsBrnvL7dKoWEIEg@google.com")) + .addTo(new Address("ekempin", "ekempin@google.com")) .textContent(textContent) .subject("âme vulgaire") - .dateReceived( - new DateTime(2016, 10, 25, 9, 11, 35, 0, DateTimeZone.UTC)); + .dateReceived(new DateTime(2016, 10, 25, 9, 11, 35, 0, DateTimeZone.UTC)); return expect.build(); } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/RawMailMessage.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/RawMailMessage.java index 8afa8cca78..2af82ad607 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/RawMailMessage.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/RawMailMessage.java @@ -15,16 +15,14 @@ package com.google.gerrit.server.mail.receive.data; import com.google.gerrit.server.mail.receive.MailMessage; - import org.junit.Ignore; -/** - * Base class for all email parsing tests. - */ +/** Base class for all email parsing tests. */ @Ignore public abstract class RawMailMessage { // Raw content to feed the parser public abstract String raw(); + public abstract int[] rawChars(); // Parsed representation for asserting the expected parser output public abstract MailMessage expectedMailMessage(); diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/SimpleTextMessage.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/SimpleTextMessage.java index 179c5148e4..8fc1dbced6 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/SimpleTextMessage.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/SimpleTextMessage.java @@ -16,88 +16,88 @@ package com.google.gerrit.server.mail.receive.data; import com.google.gerrit.server.mail.Address; import com.google.gerrit.server.mail.receive.MailMessage; - import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.junit.Ignore; -/** - * Tests parsing a simple text message with different headers. - */ +/** Tests parsing a simple text message with different headers. */ @Ignore public class SimpleTextMessage extends RawMailMessage { - private static String textContent = "" + - "Jonathan Nieder has posted comments on this change. ( \n" + - "https://gerrit-review.googlesource.com/90018 )\n" + - "\n" + - "Change subject: (Re)enable voting buttons for merged changes\n" + - "...........................................................\n" + - "\n" + - "\n" + - "Patch Set 2:\n" + - "\n" + - "This is producing NPEs server-side and 500s for the client. \n" + - "when I try to load this change:\n" + - "\n" + - " Error in GET /changes/90018/detail?O=10004\n" + - " com.google.gwtorm.OrmException: java.lang.NullPointerException\n" + - "\tat com.google.gerrit.change.ChangeJson.format(ChangeJson.java:303)\n" + - "\tat com.google.gerrit.change.ChangeJson.format(ChangeJson.java:285)\n" + - "\tat com.google.gerrit.change.ChangeJson.format(ChangeJson.java:263)\n" + - "\tat com.google.gerrit.change.GetChange.apply(GetChange.java:50)\n" + - "\tat com.google.gerrit.change.GetDetail.apply(GetDetail.java:51)\n" + - "\tat com.google.gerrit.change.GetDetail.apply(GetDetail.java:26)\n" + - "\tat \n" + - "com.google.gerrit.RestApiServlet.service(RestApiServlet.java:367)\n" + - "\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:717)\n" + - "[...]\n" + - " Caused by: java.lang.NullPointerException\n" + - "\tat \n" + - "com.google.gerrit.ChangeJson.setLabelScores(ChangeJson.java:670)\n" + - "\tat \n" + - "com.google.gerrit.ChangeJson.labelsFor(ChangeJson.java:845)\n" + - "\tat \n" + - "com.google.gerrit.change.ChangeJson.labelsFor(ChangeJson.java:598)\n" + - "\tat \n" + - "com.google.gerrit.change.ChangeJson.toChange(ChangeJson.java:499)\n" + - "\tat com.google.gerrit.change.ChangeJson.format(ChangeJson.java:294)\n" + - "\t... 105 more\n" + - "-- \n" + - "To view, visit https://gerrit-review.googlesource.com/90018\n" + - "To unsubscribe, visit https://gerrit-review.googlesource.com\n" + - "\n" + - "Gerrit-MessageType: comment\n" + - "Gerrit-Change-Id: Iba501e00bee77be3bd0ced72f88fd04ba0accaed\n" + - "Gerrit-PatchSet: 2\n" + - "Gerrit-Project: gerrit\n" + - "Gerrit-Branch: master\n" + - "Gerrit-Owner: ekempin \n" + - "Gerrit-Reviewer: Dave Borowitz \n" + - "Gerrit-Reviewer: Edwin Kempin \n" + - "Gerrit-Reviewer: GerritForge CI \n" + - "Gerrit-Reviewer: Jonathan Nieder \n" + - "Gerrit-Reviewer: Patrick Hiesel \n" + - "Gerrit-Reviewer: ekempin \n" + - "Gerrit-HasComments: No"; + private static String textContent = + "" + + "Jonathan Nieder has posted comments on this change. ( \n" + + "https://gerrit-review.googlesource.com/90018 )\n" + + "\n" + + "Change subject: (Re)enable voting buttons for merged changes\n" + + "...........................................................\n" + + "\n" + + "\n" + + "Patch Set 2:\n" + + "\n" + + "This is producing NPEs server-side and 500s for the client. \n" + + "when I try to load this change:\n" + + "\n" + + " Error in GET /changes/90018/detail?O=10004\n" + + " com.google.gwtorm.OrmException: java.lang.NullPointerException\n" + + "\tat com.google.gerrit.change.ChangeJson.format(ChangeJson.java:303)\n" + + "\tat com.google.gerrit.change.ChangeJson.format(ChangeJson.java:285)\n" + + "\tat com.google.gerrit.change.ChangeJson.format(ChangeJson.java:263)\n" + + "\tat com.google.gerrit.change.GetChange.apply(GetChange.java:50)\n" + + "\tat com.google.gerrit.change.GetDetail.apply(GetDetail.java:51)\n" + + "\tat com.google.gerrit.change.GetDetail.apply(GetDetail.java:26)\n" + + "\tat \n" + + "com.google.gerrit.RestApiServlet.service(RestApiServlet.java:367)\n" + + "\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:717)\n" + + "[...]\n" + + " Caused by: java.lang.NullPointerException\n" + + "\tat \n" + + "com.google.gerrit.ChangeJson.setLabelScores(ChangeJson.java:670)\n" + + "\tat \n" + + "com.google.gerrit.ChangeJson.labelsFor(ChangeJson.java:845)\n" + + "\tat \n" + + "com.google.gerrit.change.ChangeJson.labelsFor(ChangeJson.java:598)\n" + + "\tat \n" + + "com.google.gerrit.change.ChangeJson.toChange(ChangeJson.java:499)\n" + + "\tat com.google.gerrit.change.ChangeJson.format(ChangeJson.java:294)\n" + + "\t... 105 more\n" + + "-- \n" + + "To view, visit https://gerrit-review.googlesource.com/90018\n" + + "To unsubscribe, visit https://gerrit-review.googlesource.com\n" + + "\n" + + "Gerrit-MessageType: comment\n" + + "Gerrit-Change-Id: Iba501e00bee77be3bd0ced72f88fd04ba0accaed\n" + + "Gerrit-PatchSet: 2\n" + + "Gerrit-Project: gerrit\n" + + "Gerrit-Branch: master\n" + + "Gerrit-Owner: ekempin \n" + + "Gerrit-Reviewer: Dave Borowitz \n" + + "Gerrit-Reviewer: Edwin Kempin \n" + + "Gerrit-Reviewer: GerritForge CI \n" + + "Gerrit-Reviewer: Jonathan Nieder \n" + + "Gerrit-Reviewer: Patrick Hiesel \n" + + "Gerrit-Reviewer: ekempin \n" + + "Gerrit-HasComments: No"; - private static String raw = "" + - "Authentication-Results: mx.google.com; dkim=pass header.i=" + - "@google.com;\n" + - "Date: Tue, 25 Oct 2016 02:11:35 -0700\n" + - "In-Reply-To: \n" + - "References: \n" + - "Message-ID: <001a114da7ae26e2eb053fe0c29c@google.com>\n" + - "Subject: Change in gerrit[master]: (Re)enable voting buttons for " + - "merged changes\n" + - "From: \"Jonathan Nieder (Gerrit)\" \n" + - "To: ekempin \n" + - "Cc: Dave Borowitz , Jonathan Nieder " + - ", Patrick Hiesel \n" + - "Content-Type: text/plain; charset=UTF-8; format=flowed; delsp=yes\n" + - "\n" + textContent; + private static String raw = + "" + + "Authentication-Results: mx.google.com; dkim=pass header.i=" + + "@google.com;\n" + + "Date: Tue, 25 Oct 2016 02:11:35 -0700\n" + + "In-Reply-To: \n" + + "References: \n" + + "Message-ID: <001a114da7ae26e2eb053fe0c29c@google.com>\n" + + "Subject: Change in gerrit[master]: (Re)enable voting buttons for " + + "merged changes\n" + + "From: \"Jonathan Nieder (Gerrit)\" \n" + + "To: ekempin \n" + + "Cc: Dave Borowitz , Jonathan Nieder " + + ", Patrick Hiesel \n" + + "Content-Type: text/plain; charset=UTF-8; format=flowed; delsp=yes\n" + + "\n" + + textContent; @Override public String raw() { @@ -114,23 +114,25 @@ public class SimpleTextMessage extends RawMailMessage { MailMessage.Builder expect = MailMessage.builder(); expect .id("<001a114da7ae26e2eb053fe0c29c@google.com>") - .from(new Address("Jonathan Nieder (Gerrit)", - "noreply-gerritcodereview-CtTy0igsBrnvL7dKoWEIEg@google.com")) - .addTo(new Address("ekempin","ekempin@google.com")) + .from( + new Address( + "Jonathan Nieder (Gerrit)", + "noreply-gerritcodereview-CtTy0igsBrnvL7dKoWEIEg@google.com")) + .addTo(new Address("ekempin", "ekempin@google.com")) .addCc(new Address("Dave Borowitz", "dborowitz@google.com")) .addCc(new Address("Jonathan Nieder", "jrn@google.com")) .addCc(new Address("Patrick Hiesel", "hiesel@google.com")) .textContent(textContent) - .subject("Change in gerrit[master]: (Re)enable voting" - + " buttons for merged changes") - .dateReceived( - new DateTime(2016, 10, 25, 9, 11, 35, 0, DateTimeZone.UTC)) - .addAdditionalHeader("Authentication-Results: mx.google.com; " + - "dkim=pass header.i=@google.com;") - .addAdditionalHeader("In-Reply-To: ") - .addAdditionalHeader("References: "); + .subject("Change in gerrit[master]: (Re)enable voting" + " buttons for merged changes") + .dateReceived(new DateTime(2016, 10, 25, 9, 11, 35, 0, DateTimeZone.UTC)) + .addAdditionalHeader( + "Authentication-Results: mx.google.com; " + "dkim=pass header.i=@google.com;") + .addAdditionalHeader( + "In-Reply-To: ") + .addAdditionalHeader( + "References: "); return expect.build(); } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/send/CommentFormatterTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/send/CommentFormatterTest.java index ad068324df..f4fbc7846e 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/send/CommentFormatterTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/mail/send/CommentFormatterTest.java @@ -20,13 +20,12 @@ import static com.google.gerrit.server.mail.send.CommentFormatter.BlockType.PARA import static com.google.gerrit.server.mail.send.CommentFormatter.BlockType.PRE_FORMATTED; import static com.google.gerrit.server.mail.send.CommentFormatter.BlockType.QUOTE; +import java.util.List; import org.junit.Test; -import java.util.List; - public class CommentFormatterTest { - private void assertBlock(List list, int index, - CommentFormatter.BlockType type, String text) { + private void assertBlock( + List list, int index, CommentFormatter.BlockType type, String text) { CommentFormatter.Block block = list.get(index); assertThat(block.type).isEqualTo(type); assertThat(block.text).isEqualTo(text); @@ -34,8 +33,8 @@ public class CommentFormatterTest { assertThat(block.quotedBlocks).isNull(); } - private void assertListBlock(List list, int index, - int itemIndex, String text) { + private void assertListBlock( + List list, int index, int itemIndex, String text) { CommentFormatter.Block block = list.get(index); assertThat(block.type).isEqualTo(LIST); assertThat(block.items.get(itemIndex)).isEqualTo(text); @@ -43,8 +42,7 @@ public class CommentFormatterTest { assertThat(block.quotedBlocks).isNull(); } - private void assertQuoteBlock(List list, int index, - int size) { + private void assertQuoteBlock(List list, int index, int size) { CommentFormatter.Block block = list.get(index); assertThat(block.type).isEqualTo(QUOTE); assertThat(block.items).isNull(); @@ -128,8 +126,8 @@ public class CommentFormatterTest { assertThat(result).hasSize(1); assertQuoteBlock(result, 0, 1); - assertBlock(result.get(0).quotedBlocks, 0, PARAGRAPH, - "Quote line 1\nQuote line 2\nQuote line 3\n"); + assertBlock( + result.get(0).quotedBlocks, 0, PARAGRAPH, "Quote line 1\nQuote line 2\nQuote line 3\n"); } @Test @@ -204,26 +202,26 @@ public class CommentFormatterTest { @Test public void parseMixedBlockTypes() { - String comment = "Paragraph\nacross\na\nfew\nlines." - + "\n\n" - + "> Quote\n> across\n> not many lines." - + "\n\n" - + "Another paragraph" - + "\n\n" - + "* Series\n* of\n* list\n* items" - + "\n\n" - + "Yet another paragraph" - + "\n\n" - + "\tPreformatted text." - + "\n\n" - + "Parting words."; + String comment = + "Paragraph\nacross\na\nfew\nlines." + + "\n\n" + + "> Quote\n> across\n> not many lines." + + "\n\n" + + "Another paragraph" + + "\n\n" + + "* Series\n* of\n* list\n* items" + + "\n\n" + + "Yet another paragraph" + + "\n\n" + + "\tPreformatted text." + + "\n\n" + + "Parting words."; List result = CommentFormatter.parse(comment); assertThat(result).hasSize(7); assertBlock(result, 0, PARAGRAPH, "Paragraph\nacross\na\nfew\nlines."); assertQuoteBlock(result, 1, 1); - assertBlock(result.get(1).quotedBlocks, 0, PARAGRAPH, - "Quote\nacross\nnot many lines."); + assertBlock(result.get(1).quotedBlocks, 0, PARAGRAPH, "Quote\nacross\nnot many lines."); assertBlock(result, 2, PARAGRAPH, "Another paragraph"); assertListBlock(result, 3, 0, "Series"); assertListBlock(result, 3, 1, "of"); @@ -270,9 +268,10 @@ public class CommentFormatterTest { @Test public void bulletList4() { - String comment = "To see this bug, you have to:\n" // - + "* Be on IMAP or EAS (not on POP)\n"// - + "* Be very unlucky\n"; + String comment = + "To see this bug, you have to:\n" // + + "* Be on IMAP or EAS (not on POP)\n" // + + "* Be very unlucky\n"; List result = CommentFormatter.parse(comment); assertThat(result).hasSize(2); @@ -283,10 +282,11 @@ public class CommentFormatterTest { @Test public void bulletList5() { - String comment = "To see this bug,\n" // - + "you have to:\n" // - + "* Be on IMAP or EAS (not on POP)\n"// - + "* Be very unlucky\n"; + String comment = + "To see this bug,\n" // + + "you have to:\n" // + + "* Be on IMAP or EAS (not on POP)\n" // + + "* Be very unlucky\n"; List result = CommentFormatter.parse(comment); assertThat(result).hasSize(2); @@ -378,8 +378,7 @@ public class CommentFormatterTest { assertThat(result).hasSize(2); assertQuoteBlock(result, 0, 1); - assertBlock(result.get(0).quotedBlocks, 0, PARAGRAPH, - "I'm happy\nwith quotes!"); + assertBlock(result.get(0).quotedBlocks, 0, PARAGRAPH, "I'm happy\nwith quotes!"); assertBlock(result, 1, PARAGRAPH, "See above."); } @@ -391,8 +390,7 @@ public class CommentFormatterTest { assertThat(result).hasSize(3); assertBlock(result, 0, PARAGRAPH, "See this said:"); assertQuoteBlock(result, 1, 1); - assertBlock(result.get(1).quotedBlocks, 0, PARAGRAPH, - "a quoted\nstring block"); + assertBlock(result.get(1).quotedBlocks, 0, PARAGRAPH, "a quoted\nstring block"); assertBlock(result, 2, PARAGRAPH, "OK?"); } @@ -404,41 +402,39 @@ public class CommentFormatterTest { assertThat(result).hasSize(1); assertQuoteBlock(result, 0, 2); assertQuoteBlock(result.get(0).quotedBlocks, 0, 1); - assertBlock(result.get(0).quotedBlocks.get(0).quotedBlocks, 0, PARAGRAPH, - "prior"); + assertBlock(result.get(0).quotedBlocks.get(0).quotedBlocks, 0, PARAGRAPH, "prior"); assertBlock(result.get(0).quotedBlocks, 1, PARAGRAPH, "next\n"); } @Test public void largeMixedQuote() { String comment = - "> > Paragraph 1.\n" + - "> > \n" + - "> > > Paragraph 2.\n" + - "> > \n" + - "> > Paragraph 3.\n" + - "> > \n" + - "> > pre line 1;\n" + - "> > pre line 2;\n" + - "> > \n" + - "> > Paragraph 4.\n" + - "> > \n" + - "> > * List item 1.\n" + - "> > * List item 2.\n" + - "> > \n" + - "> > Paragraph 5.\n" + - "> \n" + - "> Paragraph 6.\n" + - "\n" + - "Paragraph 7.\n"; + "> > Paragraph 1.\n" + + "> > \n" + + "> > > Paragraph 2.\n" + + "> > \n" + + "> > Paragraph 3.\n" + + "> > \n" + + "> > pre line 1;\n" + + "> > pre line 2;\n" + + "> > \n" + + "> > Paragraph 4.\n" + + "> > \n" + + "> > * List item 1.\n" + + "> > * List item 2.\n" + + "> > \n" + + "> > Paragraph 5.\n" + + "> \n" + + "> Paragraph 6.\n" + + "\n" + + "Paragraph 7.\n"; List result = CommentFormatter.parse(comment); assertThat(result).hasSize(2); assertQuoteBlock(result, 0, 2); assertQuoteBlock(result.get(0).quotedBlocks, 0, 7); - List bigQuote = - result.get(0).quotedBlocks.get(0).quotedBlocks; + List bigQuote = result.get(0).quotedBlocks.get(0).quotedBlocks; assertBlock(bigQuote, 0, PARAGRAPH, "Paragraph 1."); assertQuoteBlock(bigQuote, 1, 1); assertBlock(bigQuote.get(1).quotedBlocks, 0, PARAGRAPH, "Paragraph 2."); diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/send/FromAddressGeneratorProviderTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/send/FromAddressGeneratorProviderTest.java index 33e34b60f1..ca8dc0c68f 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/send/FromAddressGeneratorProviderTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/mail/send/FromAddressGeneratorProviderTest.java @@ -30,17 +30,15 @@ import com.google.gerrit.server.account.AccountState; import com.google.gerrit.server.account.WatchConfig.NotifyType; import com.google.gerrit.server.account.WatchConfig.ProjectWatchKey; import com.google.gerrit.server.mail.Address; - -import org.eclipse.jgit.lib.Config; -import org.eclipse.jgit.lib.PersonIdent; -import org.junit.Before; -import org.junit.Test; - import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Set; +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.lib.PersonIdent; +import org.junit.Before; +import org.junit.Test; public class FromAddressGeneratorProviderTest { private Config config; @@ -55,8 +53,7 @@ public class FromAddressGeneratorProviderTest { } private FromAddressGenerator create() { - return new FromAddressGeneratorProvider(config, "Anonymous Coward", ident, - accountCache).get(); + return new FromAddressGeneratorProvider(config, "Anonymous Coward", ident, accountCache).get(); } private void setFrom(final String newFrom) { @@ -390,8 +387,10 @@ public class FromAddressGeneratorProviderTest { final Account account = new Account(userId, TimeUtil.nowTs()); account.setFullName(name); account.setPreferredEmail(email); - return new AccountState(account, Collections. emptySet(), - Collections. emptySet(), + return new AccountState( + account, + Collections.emptySet(), + Collections.emptySet(), new HashMap>()); } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/AbstractChangeNotesTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/AbstractChangeNotesTest.java index d827e6cda6..be153c92ac 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/AbstractChangeNotesTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/AbstractChangeNotesTest.java @@ -64,7 +64,8 @@ import com.google.inject.Guice; import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.util.Providers; - +import java.sql.Timestamp; +import java.util.TimeZone; import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.Config; @@ -75,9 +76,6 @@ import org.junit.Before; import org.junit.Ignore; import org.junit.runner.RunWith; -import java.sql.Timestamp; -import java.util.TimeZone; - @Ignore @RunWith(ConfigSuite.class) public abstract class AbstractChangeNotesTest extends GerritBaseTests { @@ -95,14 +93,11 @@ public abstract class AbstractChangeNotesTest extends GerritBaseTests { return cfg; } - @ConfigSuite.Parameter - public Config testConfig; + @ConfigSuite.Parameter public Config testConfig; - private static final TimeZone TZ = - TimeZone.getTimeZone("America/Los_Angeles"); + private static final TimeZone TZ = TimeZone.getTimeZone("America/Los_Angeles"); - private static final NotesMigration MIGRATION = - new TestNotesMigration().setAllEnabled(true); + private static final NotesMigration MIGRATION = new TestNotesMigration().setAllEnabled(true); protected Account.Id otherUserId; protected FakeAccountCache accountCache; @@ -116,21 +111,15 @@ public abstract class AbstractChangeNotesTest extends GerritBaseTests { protected RevWalk rw; protected TestRepository tr; - @Inject - protected IdentifiedUser.GenericFactory userFactory; + @Inject protected IdentifiedUser.GenericFactory userFactory; - @Inject - protected NoteDbUpdateManager.Factory updateManagerFactory; + @Inject protected NoteDbUpdateManager.Factory updateManagerFactory; - @Inject - protected AllUsersName allUsers; + @Inject protected AllUsersName allUsers; - @Inject - protected AbstractChangeNotes.Args args; + @Inject protected AbstractChangeNotes.Args args; - @Inject - @GerritServerId - private String serverId; + @Inject @GerritServerId private String serverId; protected Injector injector; private String systemTimeZone; @@ -139,8 +128,7 @@ public abstract class AbstractChangeNotesTest extends GerritBaseTests { public void setUp() throws Exception { setTimeForTesting(); - serverIdent = new PersonIdent( - "Gerrit Server", "noreply@gerrit.com", TimeUtil.nowTs(), TZ); + serverIdent = new PersonIdent("Gerrit Server", "noreply@gerrit.com", TimeUtil.nowTs(), TZ); project = new Project.NameKey("test-project"); repoManager = new InMemoryRepositoryManager(); repo = repoManager.createRepository(project); @@ -156,38 +144,41 @@ public abstract class AbstractChangeNotesTest extends GerritBaseTests { ou.setPreferredEmail("other@account.com"); accountCache.put(ou); - injector = Guice.createInjector(new FactoryModule() { - @Override - public void configure() { - install(new GitModule()); - install(NoteDbModule.forTest(testConfig)); - bind(AllUsersName.class).toProvider(AllUsersNameProvider.class); - bind(String.class).annotatedWith(GerritServerId.class) - .toInstance("gerrit"); - bind(NotesMigration.class).toInstance(MIGRATION); - bind(GitRepositoryManager.class).toInstance(repoManager); - bind(ProjectCache.class).toProvider(Providers. of(null)); - bind(CapabilityControl.Factory.class) - .toProvider(Providers. of(null)); - bind(Config.class).annotatedWith(GerritServerConfig.class) - .toInstance(testConfig); - bind(String.class).annotatedWith(AnonymousCowardName.class) - .toProvider(AnonymousCowardNameProvider.class); - bind(String.class).annotatedWith(CanonicalWebUrl.class) - .toInstance("http://localhost:8080/"); - bind(Boolean.class).annotatedWith(DisableReverseDnsLookup.class) - .toInstance(Boolean.FALSE); - bind(Realm.class).to(FakeRealm.class); - bind(GroupBackend.class).to(SystemGroupBackend.class).in(SINGLETON); - bind(AccountCache.class).toInstance(accountCache); - bind(PersonIdent.class).annotatedWith(GerritPersonIdent.class) - .toInstance(serverIdent); - bind(GitReferenceUpdated.class) - .toInstance(GitReferenceUpdated.DISABLED); - bind(MetricMaker.class).to(DisabledMetricMaker.class); - bind(ReviewDb.class).toProvider(Providers. of(null)); - } - }); + injector = + Guice.createInjector( + new FactoryModule() { + @Override + public void configure() { + install(new GitModule()); + install(NoteDbModule.forTest(testConfig)); + bind(AllUsersName.class).toProvider(AllUsersNameProvider.class); + bind(String.class).annotatedWith(GerritServerId.class).toInstance("gerrit"); + bind(NotesMigration.class).toInstance(MIGRATION); + bind(GitRepositoryManager.class).toInstance(repoManager); + bind(ProjectCache.class).toProvider(Providers.of(null)); + bind(CapabilityControl.Factory.class) + .toProvider(Providers.of(null)); + bind(Config.class).annotatedWith(GerritServerConfig.class).toInstance(testConfig); + bind(String.class) + .annotatedWith(AnonymousCowardName.class) + .toProvider(AnonymousCowardNameProvider.class); + bind(String.class) + .annotatedWith(CanonicalWebUrl.class) + .toInstance("http://localhost:8080/"); + bind(Boolean.class) + .annotatedWith(DisableReverseDnsLookup.class) + .toInstance(Boolean.FALSE); + bind(Realm.class).to(FakeRealm.class); + bind(GroupBackend.class).to(SystemGroupBackend.class).in(SINGLETON); + bind(AccountCache.class).toInstance(accountCache); + bind(PersonIdent.class) + .annotatedWith(GerritPersonIdent.class) + .toInstance(serverIdent); + bind(GitReferenceUpdated.class).toInstance(GitReferenceUpdated.DISABLED); + bind(MetricMaker.class).to(DisabledMetricMaker.class); + bind(ReviewDb.class).toProvider(Providers.of(null)); + } + }); injector.injectMembers(this); repoManager.createRepository(allUsers); @@ -217,8 +208,7 @@ public abstract class AbstractChangeNotesTest extends GerritBaseTests { return c; } - protected ChangeUpdate newUpdate(Change c, CurrentUser user) - throws Exception { + protected ChangeUpdate newUpdate(Change c, CurrentUser user) throws Exception { ChangeUpdate update = TestChanges.newUpdate(injector, c, user); update.setPatchSetId(c.currentPatchSetId()); update.setAllowWriteToNewRef(true); @@ -229,8 +219,8 @@ public abstract class AbstractChangeNotesTest extends GerritBaseTests { return new ChangeNotes(args, c).load(); } - protected static SubmitRecord submitRecord(String status, - String errorMessage, SubmitRecord.Label... labels) { + protected static SubmitRecord submitRecord( + String status, String errorMessage, SubmitRecord.Label... labels) { SubmitRecord rec = new SubmitRecord(); rec.status = SubmitRecord.Status.valueOf(status); rec.errorMessage = errorMessage; @@ -240,8 +230,8 @@ public abstract class AbstractChangeNotesTest extends GerritBaseTests { return rec; } - protected static SubmitRecord.Label submitLabel(String name, String status, - Account.Id appliedBy) { + protected static SubmitRecord.Label submitLabel( + String name, String status, Account.Id appliedBy) { SubmitRecord.Label label = new SubmitRecord.Label(); label.label = name; label.status = SubmitRecord.Label.Status.valueOf(status); @@ -249,24 +239,33 @@ public abstract class AbstractChangeNotesTest extends GerritBaseTests { return label; } - protected Comment newComment(PatchSet.Id psId, String filename, String UUID, - CommentRange range, int line, IdentifiedUser commenter, String parentUUID, - Timestamp t, String message, short side, String commitSHA1, + protected Comment newComment( + PatchSet.Id psId, + String filename, + String UUID, + CommentRange range, + int line, + IdentifiedUser commenter, + String parentUUID, + Timestamp t, + String message, + short side, + String commitSHA1, boolean unresolved) { - Comment c = new Comment( - new Comment.Key(UUID, filename, psId.get()), - commenter.getAccountId(), - t, - side, - message, - serverId, - unresolved); + Comment c = + new Comment( + new Comment.Key(UUID, filename, psId.get()), + commenter.getAccountId(), + t, + side, + message, + serverId, + unresolved); c.lineNbr = line; c.parentUuid = parentUUID; c.revId = commitSHA1; c.setRange(range); return c; - } protected static Timestamp truncate(Timestamp ts) { diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeBundleTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeBundleTest.java index f9c2c42c97..a3f8a7686b 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeBundleTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeBundleTest.java @@ -45,31 +45,28 @@ import com.google.gerrit.testutil.TestChanges; import com.google.gerrit.testutil.TestTimeUtil; import com.google.gwtorm.protobuf.CodecFactory; import com.google.gwtorm.protobuf.ProtobufCodec; - -import org.joda.time.DateTime; -import org.joda.time.DateTimeZone; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - import java.sql.Timestamp; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.TimeZone; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; public class ChangeBundleTest extends GerritBaseTests { - private static final ProtobufCodec CHANGE_CODEC = - CodecFactory.encoder(Change.class); + private static final ProtobufCodec CHANGE_CODEC = CodecFactory.encoder(Change.class); private static final ProtobufCodec CHANGE_MESSAGE_CODEC = CodecFactory.encoder(ChangeMessage.class); private static final ProtobufCodec PATCH_SET_CODEC = CodecFactory.encoder(PatchSet.class); - private static final ProtobufCodec - PATCH_SET_APPROVAL_CODEC = CodecFactory.encoder(PatchSetApproval.class); - private static final ProtobufCodec - PATCH_LINE_COMMENT_CODEC = CodecFactory.encoder(PatchLineComment.class); + private static final ProtobufCodec PATCH_SET_APPROVAL_CODEC = + CodecFactory.encoder(PatchSetApproval.class); + private static final ProtobufCodec PATCH_LINE_COMMENT_CODEC = + CodecFactory.encoder(PatchLineComment.class); private String systemTimeZoneProperty; private TimeZone systemTimeZone; @@ -98,8 +95,7 @@ public class ChangeBundleTest extends GerritBaseTests { } private void superWindowResolution() { - TestTimeUtil.setClockStep( - ChangeRebuilderImpl.MAX_WINDOW_MS * 2, MILLISECONDS); + TestTimeUtil.setClockStep(ChangeRebuilderImpl.MAX_WINDOW_MS * 2, MILLISECONDS); TimeUtil.nowTs(); } @@ -114,61 +110,73 @@ public class ChangeBundleTest extends GerritBaseTests { int id1 = c1.getId().get(); Change c2 = TestChanges.newChange(project, accountId); int id2 = c2.getId().get(); - ChangeBundle b1 = new ChangeBundle(c1, messages(), patchSets(), approvals(), - comments(), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c2, messages(), patchSets(), approvals(), - comments(), reviewers(), REVIEW_DB); + ChangeBundle b1 = + new ChangeBundle( + c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); - assertDiffs(b1, b2, + assertDiffs( + b1, + b2, "changeId differs for Changes: {" + id1 + "} != {" + id2 + "}", - "createdOn differs for Changes:" - + " {2009-09-30 17:00:00.0} != {2009-09-30 17:00:06.0}", + "createdOn differs for Changes:" + " {2009-09-30 17:00:00.0} != {2009-09-30 17:00:06.0}", "effective last updated time differs for Changes:" + " {2009-09-30 17:00:00.0} != {2009-09-30 17:00:06.0}"); } @Test public void diffChangesSameId() throws Exception { - Change c1 = TestChanges.newChange( - new Project.NameKey("project"), new Account.Id(100)); + Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100)); Change c2 = clone(c1); - ChangeBundle b1 = new ChangeBundle(c1, messages(), patchSets(), approvals(), - comments(), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c2, messages(), patchSets(), approvals(), - comments(), reviewers(), REVIEW_DB); + ChangeBundle b1 = + new ChangeBundle( + c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); assertNoDiffs(b1, b2); c2.setTopic("topic"); - assertDiffs(b1, b2, - "topic differs for Change.Id " + c1.getId() + ": {null} != {topic}"); + assertDiffs(b1, b2, "topic differs for Change.Id " + c1.getId() + ": {null} != {topic}"); } @Test public void diffChangesMixedSourcesAllowsSlop() throws Exception { subWindowResolution(); - Change c1 = TestChanges.newChange( - new Project.NameKey("project"), new Account.Id(100)); + Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100)); Change c2 = clone(c1); c2.setCreatedOn(TimeUtil.nowTs()); c2.setLastUpdatedOn(TimeUtil.nowTs()); // Both are ReviewDb, exact timestamp match is required. - ChangeBundle b1 = new ChangeBundle(c1, messages(), patchSets(), - approvals(), comments(), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c2, messages(), patchSets(), - approvals(), comments(), reviewers(), REVIEW_DB); - assertDiffs(b1, b2, - "createdOn differs for Change.Id " + c1.getId() + ":" + ChangeBundle b1 = + new ChangeBundle( + c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + assertDiffs( + b1, + b2, + "createdOn differs for Change.Id " + + c1.getId() + + ":" + " {2009-09-30 17:00:01.0} != {2009-09-30 17:00:02.0}", - "effective last updated time differs for Change.Id " + c1.getId() + ":" + "effective last updated time differs for Change.Id " + + c1.getId() + + ":" + " {2009-09-30 17:00:01.0} != {2009-09-30 17:00:03.0}"); // One NoteDb, slop is allowed. - b1 = new ChangeBundle(c1, messages(), patchSets(), approvals(), - comments(), reviewers(), NOTE_DB); - b2 = new ChangeBundle(c2, messages(), patchSets(), approvals(), - comments(), reviewers(), REVIEW_DB); + b1 = + new ChangeBundle( + c1, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB); + b2 = + new ChangeBundle( + c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); assertNoDiffs(b1, b2); assertNoDiffs(b2, b1); @@ -176,194 +184,215 @@ public class ChangeBundleTest extends GerritBaseTests { superWindowResolution(); Change c3 = clone(c1); c3.setLastUpdatedOn(TimeUtil.nowTs()); - b1 = new ChangeBundle(c1, messages(), patchSets(), approvals(), - comments(), reviewers(), NOTE_DB); - ChangeBundle b3 = new ChangeBundle(c3, messages(), patchSets(), approvals(), - comments(), reviewers(), REVIEW_DB); - String msg = "effective last updated time differs for Change.Id " - + c1.getId() + " in NoteDb vs. ReviewDb:" - + " {2009-09-30 17:00:01.0} != {2009-09-30 17:00:10.0}"; + b1 = + new ChangeBundle( + c1, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB); + ChangeBundle b3 = + new ChangeBundle( + c3, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + String msg = + "effective last updated time differs for Change.Id " + + c1.getId() + + " in NoteDb vs. ReviewDb:" + + " {2009-09-30 17:00:01.0} != {2009-09-30 17:00:10.0}"; assertDiffs(b1, b3, msg); assertDiffs(b3, b1, msg); } @Test - public void diffChangesIgnoresOriginalSubjectInReviewDb() - throws Exception { - Change c1 = TestChanges.newChange( - new Project.NameKey("project"), new Account.Id(100)); + public void diffChangesIgnoresOriginalSubjectInReviewDb() throws Exception { + Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100)); c1.setCurrentPatchSet(c1.currentPatchSetId(), "Subject", "Original A"); Change c2 = clone(c1); - c2.setCurrentPatchSet( - c2.currentPatchSetId(), c1.getSubject(), "Original B"); + c2.setCurrentPatchSet(c2.currentPatchSetId(), c1.getSubject(), "Original B"); // Both ReviewDb, exact match required. - ChangeBundle b1 = new ChangeBundle(c1, messages(), patchSets(), approvals(), - comments(), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c2, messages(), patchSets(), approvals(), - comments(), reviewers(), REVIEW_DB); - assertDiffs(b1, b2, - "originalSubject differs for Change.Id " + c1.getId() + ":" + ChangeBundle b1 = + new ChangeBundle( + c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + assertDiffs( + b1, + b2, + "originalSubject differs for Change.Id " + + c1.getId() + + ":" + " {Original A} != {Original B}"); // Both NoteDb, exact match required. - b1 = new ChangeBundle(c1, messages(), patchSets(), approvals(), comments(), - reviewers(), NOTE_DB); - b2 = new ChangeBundle(c2, messages(), patchSets(), approvals(), comments(), - reviewers(), NOTE_DB); - assertDiffs(b1, b2, - "originalSubject differs for Change.Id " + c1.getId() + ":" + b1 = + new ChangeBundle( + c1, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB); + b2 = + new ChangeBundle( + c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB); + assertDiffs( + b1, + b2, + "originalSubject differs for Change.Id " + + c1.getId() + + ":" + " {Original A} != {Original B}"); // One ReviewDb, one NoteDb, original subject is ignored. - b1 = new ChangeBundle(c1, messages(), patchSets(), approvals(), comments(), - reviewers(), REVIEW_DB); - b2 = new ChangeBundle(c2, messages(), patchSets(), approvals(), comments(), - reviewers(), NOTE_DB); + b1 = + new ChangeBundle( + c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + b2 = + new ChangeBundle( + c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB); assertNoDiffs(b1, b2); assertNoDiffs(b2, b1); } @Test - public void diffChangesConsidersEmptyReviewDbTopicEquivalentToNullInNoteDb() - throws Exception { - Change c1 = TestChanges.newChange( - new Project.NameKey("project"), new Account.Id(100)); + public void diffChangesConsidersEmptyReviewDbTopicEquivalentToNullInNoteDb() throws Exception { + Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100)); c1.setTopic(""); Change c2 = clone(c1); c2.setTopic(null); // Both ReviewDb, exact match required. - ChangeBundle b1 = new ChangeBundle(c1, messages(), patchSets(), approvals(), - comments(), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c2, messages(), patchSets(), approvals(), - comments(), reviewers(), REVIEW_DB); - assertDiffs(b1, b2, - "topic differs for Change.Id " + c1.getId() + ":" - + " {} != {null}"); + ChangeBundle b1 = + new ChangeBundle( + c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + assertDiffs(b1, b2, "topic differs for Change.Id " + c1.getId() + ":" + " {} != {null}"); // Topic ignored if ReviewDb is empty and NoteDb is null. - b1 = new ChangeBundle(c1, messages(), patchSets(), approvals(), comments(), - reviewers(), REVIEW_DB); - b2 = new ChangeBundle(c2, messages(), patchSets(), approvals(), comments(), - reviewers(), NOTE_DB); + b1 = + new ChangeBundle( + c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + b2 = + new ChangeBundle( + c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB); assertNoDiffs(b1, b2); // Exact match still required if NoteDb has empty value (not realistic). - b1 = new ChangeBundle(c1, messages(), patchSets(), approvals(), comments(), - reviewers(), NOTE_DB); - b2 = new ChangeBundle(c2, messages(), patchSets(), approvals(), comments(), - reviewers(), REVIEW_DB); - assertDiffs(b1, b2, - "topic differs for Change.Id " + c1.getId() + ":" - + " {} != {null}"); + b1 = + new ChangeBundle( + c1, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB); + b2 = + new ChangeBundle( + c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + assertDiffs(b1, b2, "topic differs for Change.Id " + c1.getId() + ":" + " {} != {null}"); // Null is not equal to a non-empty string. Change c3 = clone(c1); c3.setTopic("topic"); - b1 = new ChangeBundle(c3, messages(), patchSets(), approvals(), comments(), - reviewers(), REVIEW_DB); - b2 = new ChangeBundle(c2, messages(), patchSets(), approvals(), comments(), - reviewers(), NOTE_DB); - assertDiffs(b1, b2, - "topic differs for Change.Id " + c1.getId() + ":" - + " {topic} != {null}"); + b1 = + new ChangeBundle( + c3, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + b2 = + new ChangeBundle( + c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB); + assertDiffs(b1, b2, "topic differs for Change.Id " + c1.getId() + ":" + " {topic} != {null}"); // Null is equal to a string that is all whitespace. Change c4 = clone(c1); c4.setTopic(" "); - b1 = new ChangeBundle(c4, messages(), patchSets(), approvals(), comments(), - reviewers(), REVIEW_DB); - b2 = new ChangeBundle(c2, messages(), patchSets(), approvals(), comments(), - reviewers(), NOTE_DB); + b1 = + new ChangeBundle( + c4, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + b2 = + new ChangeBundle( + c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB); assertNoDiffs(b1, b2); assertNoDiffs(b2, b1); } @Test - public void diffChangesIgnoresLeadingWhitespaceInReviewDbTopics() - throws Exception { - Change c1 = TestChanges.newChange( - new Project.NameKey("project"), new Account.Id(100)); + public void diffChangesIgnoresLeadingWhitespaceInReviewDbTopics() throws Exception { + Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100)); c1.setTopic(" abc"); Change c2 = clone(c1); c2.setTopic("abc"); // Both ReviewDb, exact match required. - ChangeBundle b1 = new ChangeBundle(c1, messages(), patchSets(), approvals(), - comments(), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c2, messages(), patchSets(), approvals(), - comments(), reviewers(), REVIEW_DB); - assertDiffs(b1, b2, - "topic differs for Change.Id " + c1.getId() + ":" - + " { abc} != {abc}"); + ChangeBundle b1 = + new ChangeBundle( + c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + assertDiffs(b1, b2, "topic differs for Change.Id " + c1.getId() + ":" + " { abc} != {abc}"); // Leading whitespace in ReviewDb topic is ignored. - b1 = new ChangeBundle(c1, messages(), patchSets(), approvals(), comments(), - reviewers(), REVIEW_DB); - b2 = new ChangeBundle(c2, messages(), patchSets(), approvals(), comments(), - reviewers(), NOTE_DB); + b1 = + new ChangeBundle( + c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + b2 = + new ChangeBundle( + c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB); assertNoDiffs(b1, b2); assertNoDiffs(b2, b1); // Must match except for the leading whitespace. Change c3 = clone(c1); c3.setTopic("cba"); - b1 = new ChangeBundle(c1, messages(), patchSets(), approvals(), comments(), - reviewers(), REVIEW_DB); - b2 = new ChangeBundle(c3, messages(), patchSets(), approvals(), comments(), - reviewers(), NOTE_DB); - assertDiffs(b1, b2, - "topic differs for Change.Id " + c1.getId() + ":" - + " { abc} != {cba}"); + b1 = + new ChangeBundle( + c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + b2 = + new ChangeBundle( + c3, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB); + assertDiffs(b1, b2, "topic differs for Change.Id " + c1.getId() + ":" + " { abc} != {cba}"); } @Test - public void diffChangesTakesMaxEntityTimestampFromReviewDb() - throws Exception { - Change c1 = TestChanges.newChange( - new Project.NameKey("project"), new Account.Id(100)); + public void diffChangesTakesMaxEntityTimestampFromReviewDb() throws Exception { + Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100)); PatchSet ps = new PatchSet(c1.currentPatchSetId()); ps.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef")); ps.setUploader(accountId); ps.setCreatedOn(TimeUtil.nowTs()); - PatchSetApproval a = new PatchSetApproval( - new PatchSetApproval.Key( - c1.currentPatchSetId(), accountId, new LabelId("Code-Review")), - (short) 1, - TimeUtil.nowTs()); + PatchSetApproval a = + new PatchSetApproval( + new PatchSetApproval.Key(c1.currentPatchSetId(), accountId, new LabelId("Code-Review")), + (short) 1, + TimeUtil.nowTs()); Change c2 = clone(c1); c2.setLastUpdatedOn(a.getGranted()); // Both ReviewDb, exact match required. - ChangeBundle b1 = new ChangeBundle(c1, messages(), patchSets(ps), - approvals(a), comments(), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c2, messages(), patchSets(ps), - approvals(a), comments(), reviewers(), REVIEW_DB); - assertDiffs(b1, b2, - "effective last updated time differs for Change.Id " + c1.getId() + ":" + ChangeBundle b1 = + new ChangeBundle( + c1, messages(), patchSets(ps), approvals(a), comments(), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c2, messages(), patchSets(ps), approvals(a), comments(), reviewers(), REVIEW_DB); + assertDiffs( + b1, + b2, + "effective last updated time differs for Change.Id " + + c1.getId() + + ":" + " {2009-09-30 17:00:00.0} != {2009-09-30 17:00:12.0}"); // NoteDb allows latest timestamp from all entities in bundle. - b2 = new ChangeBundle(c2, messages(), patchSets(ps), - approvals(a), comments(), reviewers(), NOTE_DB); + b2 = + new ChangeBundle( + c2, messages(), patchSets(ps), approvals(a), comments(), reviewers(), NOTE_DB); assertNoDiffs(b1, b2); } @Test public void diffChangesIgnoresChangeTimestampIfAnyOtherEntitiesExist() { - Change c1 = TestChanges.newChange( - new Project.NameKey("project"), new Account.Id(100)); + Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100)); PatchSet ps = new PatchSet(c1.currentPatchSetId()); ps.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef")); ps.setUploader(accountId); ps.setCreatedOn(TimeUtil.nowTs()); - PatchSetApproval a = new PatchSetApproval( - new PatchSetApproval.Key( - c1.currentPatchSetId(), accountId, new LabelId("Code-Review")), - (short) 1, - TimeUtil.nowTs()); + PatchSetApproval a = + new PatchSetApproval( + new PatchSetApproval.Key(c1.currentPatchSetId(), accountId, new LabelId("Code-Review")), + (short) 1, + TimeUtil.nowTs()); c1.setLastUpdatedOn(a.getGranted()); Change c2 = clone(c1); @@ -371,116 +400,144 @@ public class ChangeBundleTest extends GerritBaseTests { // ReviewDb has later lastUpdatedOn timestamp than NoteDb, allowed since // NoteDb matches the latest timestamp of a non-Change entity. - ChangeBundle b1 = new ChangeBundle(c2, messages(), patchSets(ps), - approvals(a), comments(), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c1, messages(), patchSets(ps), - approvals(a), comments(), reviewers(), NOTE_DB); - assertThat(b1.getChange().getLastUpdatedOn()) - .isGreaterThan(b2.getChange().getLastUpdatedOn()); + ChangeBundle b1 = + new ChangeBundle( + c2, messages(), patchSets(ps), approvals(a), comments(), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c1, messages(), patchSets(ps), approvals(a), comments(), reviewers(), NOTE_DB); + assertThat(b1.getChange().getLastUpdatedOn()).isGreaterThan(b2.getChange().getLastUpdatedOn()); assertNoDiffs(b1, b2); // Timestamps must actually match if Change is the only entity. - b1 = new ChangeBundle(c2, messages(), patchSets(), approvals(), comments(), - reviewers(), REVIEW_DB); - b2 = new ChangeBundle(c1, messages(), patchSets(), approvals(), comments(), - reviewers(), NOTE_DB); - assertDiffs(b1, b2, - "effective last updated time differs for Change.Id " + c1.getId() + b1 = + new ChangeBundle( + c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + b2 = + new ChangeBundle( + c1, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB); + assertDiffs( + b1, + b2, + "effective last updated time differs for Change.Id " + + c1.getId() + " in NoteDb vs. ReviewDb:" + " {2009-09-30 17:00:12.0} != {2009-09-30 17:00:18.0}"); } @Test - public void diffChangesAllowsReviewDbSubjectToBePrefixOfNoteDbSubject() - throws Exception { - Change c1 = TestChanges.newChange( - new Project.NameKey("project"), new Account.Id(100)); + public void diffChangesAllowsReviewDbSubjectToBePrefixOfNoteDbSubject() throws Exception { + Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100)); Change c2 = clone(c1); - c2.setCurrentPatchSet(c1.currentPatchSetId(), - c1.getSubject().substring(0, 10), c1.getOriginalSubject()); + c2.setCurrentPatchSet( + c1.currentPatchSetId(), c1.getSubject().substring(0, 10), c1.getOriginalSubject()); assertThat(c2.getSubject()).isNotEqualTo(c1.getSubject()); // Both ReviewDb, exact match required. - ChangeBundle b1 = new ChangeBundle(c1, messages(), patchSets(), approvals(), - comments(), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c2, messages(), patchSets(), approvals(), - comments(), reviewers(), REVIEW_DB); - assertDiffs(b1, b2, - "subject differs for Change.Id " + c1.getId() + ":" - + " {Change subject} != {Change sub}"); + ChangeBundle b1 = + new ChangeBundle( + c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + assertDiffs( + b1, + b2, + "subject differs for Change.Id " + c1.getId() + ":" + " {Change subject} != {Change sub}"); // ReviewDb has shorter subject, allowed. - b1 = new ChangeBundle(c1, messages(), patchSets(), approvals(), - comments(), reviewers(), NOTE_DB); - b2 = new ChangeBundle(c2, messages(), patchSets(), approvals(), - comments(), reviewers(), REVIEW_DB); + b1 = + new ChangeBundle( + c1, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB); + b2 = + new ChangeBundle( + c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); assertNoDiffs(b1, b2); // NoteDb has shorter subject, not allowed. - b1 = new ChangeBundle(c1, messages(), latest(c1), approvals(), - comments(), reviewers(), REVIEW_DB); - b2 = new ChangeBundle(c2, messages(), latest(c2), approvals(), - comments(), reviewers(), NOTE_DB); - assertDiffs(b1, b2, - "subject differs for Change.Id " + c1.getId() + ":" - + " {Change subject} != {Change sub}"); + b1 = + new ChangeBundle( + c1, messages(), latest(c1), approvals(), comments(), reviewers(), REVIEW_DB); + b2 = + new ChangeBundle(c2, messages(), latest(c2), approvals(), comments(), reviewers(), NOTE_DB); + assertDiffs( + b1, + b2, + "subject differs for Change.Id " + c1.getId() + ":" + " {Change subject} != {Change sub}"); } @Test - public void diffChangesTrimsLeadingSpacesFromReviewDbComparingToNoteDb() - throws Exception { - Change c1 = TestChanges.newChange( - new Project.NameKey("project"), new Account.Id(100)); + public void diffChangesTrimsLeadingSpacesFromReviewDbComparingToNoteDb() throws Exception { + Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100)); Change c2 = clone(c1); - c2.setCurrentPatchSet(c1.currentPatchSetId(), - " " + c1.getSubject(), c1.getOriginalSubject()); + c2.setCurrentPatchSet(c1.currentPatchSetId(), " " + c1.getSubject(), c1.getOriginalSubject()); // Both ReviewDb, exact match required. - ChangeBundle b1 = new ChangeBundle(c1, messages(), patchSets(), approvals(), - comments(), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c2, messages(), patchSets(), approvals(), - comments(), reviewers(), REVIEW_DB); - assertDiffs(b1, b2, - "subject differs for Change.Id " + c1.getId() + ":" + ChangeBundle b1 = + new ChangeBundle( + c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + assertDiffs( + b1, + b2, + "subject differs for Change.Id " + + c1.getId() + + ":" + " {Change subject} != { Change subject}"); // ReviewDb is missing leading spaces, allowed. - b1 = new ChangeBundle(c1, messages(), patchSets(), approvals(), - comments(), reviewers(), NOTE_DB); - b2 = new ChangeBundle(c2, messages(), patchSets(), approvals(), - comments(), reviewers(), REVIEW_DB); + b1 = + new ChangeBundle( + c1, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB); + b2 = + new ChangeBundle( + c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); assertNoDiffs(b1, b2); assertNoDiffs(b2, b1); } @Test - public void diffChangesDoesntTrimLeadingNonSpaceWhitespaceFromSubject() - throws Exception { - Change c1 = TestChanges.newChange( - new Project.NameKey("project"), new Account.Id(100)); + public void diffChangesDoesntTrimLeadingNonSpaceWhitespaceFromSubject() throws Exception { + Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100)); Change c2 = clone(c1); - c2.setCurrentPatchSet(c1.currentPatchSetId(), - "\t" + c1.getSubject(), c1.getOriginalSubject()); + c2.setCurrentPatchSet(c1.currentPatchSetId(), "\t" + c1.getSubject(), c1.getOriginalSubject()); // Both ReviewDb. - ChangeBundle b1 = new ChangeBundle(c1, messages(), patchSets(), approvals(), - comments(), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c2, messages(), patchSets(), approvals(), - comments(), reviewers(), REVIEW_DB); - assertDiffs(b1, b2, - "subject differs for Change.Id " + c1.getId() + ":" + ChangeBundle b1 = + new ChangeBundle( + c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + assertDiffs( + b1, + b2, + "subject differs for Change.Id " + + c1.getId() + + ":" + " {Change subject} != {\tChange subject}"); // One NoteDb. - b1 = new ChangeBundle(c1, messages(), latest(c1), approvals(), - comments(), reviewers(), NOTE_DB); - b2 = new ChangeBundle(c2, messages(), latest(c2), approvals(), - comments(), reviewers(), REVIEW_DB); - assertDiffs(b1, b2, - "subject differs for Change.Id " + c1.getId() + ":" + b1 = + new ChangeBundle(c1, messages(), latest(c1), approvals(), comments(), reviewers(), NOTE_DB); + b2 = + new ChangeBundle( + c2, messages(), latest(c2), approvals(), comments(), reviewers(), REVIEW_DB); + assertDiffs( + b1, + b2, + "subject differs for Change.Id " + + c1.getId() + + ":" + " {Change subject} != {\tChange subject}"); - assertDiffs(b2, b1, - "subject differs for Change.Id " + c1.getId() + ":" + assertDiffs( + b2, + b1, + "subject differs for Change.Id " + + c1.getId() + + ":" + " {\tChange subject} != {Change subject}"); } @@ -493,43 +550,56 @@ public class ChangeBundleTest extends GerritBaseTests { c2.setCurrentPatchSet(c2.currentPatchSetId(), "Subject", "Subject"); // Both ReviewDb. - ChangeBundle b1 = new ChangeBundle(c1, messages(), patchSets(), approvals(), - comments(), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c2, messages(), patchSets(), approvals(), - comments(), reviewers(), REVIEW_DB); - assertDiffs(b1, b2, - "originalSubject differs for Change.Id " + c1.getId() + ":" + ChangeBundle b1 = + new ChangeBundle( + c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + assertDiffs( + b1, + b2, + "originalSubject differs for Change.Id " + + c1.getId() + + ":" + " {Subject\r \r Rest of message.} != {Subject}", - "subject differs for Change.Id " + c1.getId() + ":" + "subject differs for Change.Id " + + c1.getId() + + ":" + " {Subject\r \r Rest of message.} != {Subject}"); // NoteDb has correct subject without "\r ". - b1 = new ChangeBundle(c1, messages(), patchSets(), approvals(), - comments(), reviewers(), REVIEW_DB); - b2 = new ChangeBundle(c2, messages(), patchSets(), approvals(), - comments(), reviewers(), NOTE_DB); + b1 = + new ChangeBundle( + c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + b2 = + new ChangeBundle( + c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB); assertNoDiffs(b1, b2); assertNoDiffs(b2, b1); } @Test - public void diffChangesIgnoresInvalidCurrentPatchSetIdInReviewDb() - throws Exception { - Change c1 = TestChanges.newChange( - new Project.NameKey("project"), new Account.Id(100)); + public void diffChangesIgnoresInvalidCurrentPatchSetIdInReviewDb() throws Exception { + Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100)); Change c2 = clone(c1); - c2.setCurrentPatchSet(new PatchSet.Id(c2.getId(), 0), "Unrelated subject", - c2.getOriginalSubject()); + c2.setCurrentPatchSet( + new PatchSet.Id(c2.getId(), 0), "Unrelated subject", c2.getOriginalSubject()); // Both ReviewDb. - ChangeBundle b1 = new ChangeBundle(c1, messages(), patchSets(), - approvals(), comments(), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c2, messages(), patchSets(), - approvals(), comments(), reviewers(), REVIEW_DB); - assertDiffs(b1, b2, - "currentPatchSetId differs for Change.Id " + c1.getId() + ":" - + " {1} != {0}", - "subject differs for Change.Id " + c1.getId() + ":" + ChangeBundle b1 = + new ChangeBundle( + c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + assertDiffs( + b1, + b2, + "currentPatchSetId differs for Change.Id " + c1.getId() + ":" + " {1} != {0}", + "subject differs for Change.Id " + + c1.getId() + + ":" + " {Change subject} != {Unrelated subject}"); // One NoteDb. @@ -537,10 +607,12 @@ public class ChangeBundleTest extends GerritBaseTests { // This is based on a real corrupt change where all patch sets were deleted // but the Change entity stuck around, resulting in a currentPatchSetId of 0 // after converting to NoteDb. - b1 = new ChangeBundle(c1, messages(), patchSets(), approvals(), comments(), - reviewers(), REVIEW_DB); - b2 = new ChangeBundle(c2, messages(), patchSets(), approvals(), comments(), - reviewers(), NOTE_DB); + b1 = + new ChangeBundle( + c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB); + b2 = + new ChangeBundle( + c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB); assertNoDiffs(b1, b2); assertNoDiffs(b2, b1); } @@ -549,40 +621,63 @@ public class ChangeBundleTest extends GerritBaseTests { public void diffChangeMessageKeySets() throws Exception { Change c = TestChanges.newChange(project, accountId); int id = c.getId().get(); - ChangeMessage cm1 = new ChangeMessage( - new ChangeMessage.Key(c.getId(), "uuid1"), - accountId, TimeUtil.nowTs(), c.currentPatchSetId()); - ChangeMessage cm2 = new ChangeMessage( - new ChangeMessage.Key(c.getId(), "uuid2"), - accountId, TimeUtil.nowTs(), c.currentPatchSetId()); - ChangeBundle b1 = new ChangeBundle(c, messages(cm1), latest(c), approvals(), - comments(), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c, messages(cm2), latest(c), approvals(), - comments(), reviewers(), REVIEW_DB); + ChangeMessage cm1 = + new ChangeMessage( + new ChangeMessage.Key(c.getId(), "uuid1"), + accountId, + TimeUtil.nowTs(), + c.currentPatchSetId()); + ChangeMessage cm2 = + new ChangeMessage( + new ChangeMessage.Key(c.getId(), "uuid2"), + accountId, + TimeUtil.nowTs(), + c.currentPatchSetId()); + ChangeBundle b1 = + new ChangeBundle( + c, messages(cm1), latest(c), approvals(), comments(), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c, messages(cm2), latest(c), approvals(), comments(), reviewers(), REVIEW_DB); - assertDiffs(b1, b2, + assertDiffs( + b1, + b2, "ChangeMessage.Key sets differ:" - + " [" + id + ",uuid1] only in A; [" + id + ",uuid2] only in B"); + + " [" + + id + + ",uuid1] only in A; [" + + id + + ",uuid2] only in B"); } @Test public void diffChangeMessages() throws Exception { Change c = TestChanges.newChange(project, accountId); - ChangeMessage cm1 = new ChangeMessage( - new ChangeMessage.Key(c.getId(), "uuid"), - accountId, TimeUtil.nowTs(), c.currentPatchSetId()); + ChangeMessage cm1 = + new ChangeMessage( + new ChangeMessage.Key(c.getId(), "uuid"), + accountId, + TimeUtil.nowTs(), + c.currentPatchSetId()); cm1.setMessage("message 1"); ChangeMessage cm2 = clone(cm1); - ChangeBundle b1 = new ChangeBundle(c, messages(cm1), latest(c), approvals(), - comments(), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c, messages(cm2), latest(c), approvals(), - comments(), reviewers(), REVIEW_DB); + ChangeBundle b1 = + new ChangeBundle( + c, messages(cm1), latest(c), approvals(), comments(), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c, messages(cm2), latest(c), approvals(), comments(), reviewers(), REVIEW_DB); assertNoDiffs(b1, b2); cm2.setMessage("message 2"); - assertDiffs(b1, b2, - "message differs for ChangeMessage.Key " + c.getId() + ",uuid:" + assertDiffs( + b1, + b2, + "message differs for ChangeMessage.Key " + + c.getId() + + ",uuid:" + " {message 1} != {message 2}"); } @@ -590,27 +685,40 @@ public class ChangeBundleTest extends GerritBaseTests { public void diffChangeMessagesIgnoresUuids() throws Exception { Change c = TestChanges.newChange(project, accountId); int id = c.getId().get(); - ChangeMessage cm1 = new ChangeMessage( - new ChangeMessage.Key(c.getId(), "uuid1"), - accountId, TimeUtil.nowTs(), c.currentPatchSetId()); + ChangeMessage cm1 = + new ChangeMessage( + new ChangeMessage.Key(c.getId(), "uuid1"), + accountId, + TimeUtil.nowTs(), + c.currentPatchSetId()); cm1.setMessage("message 1"); ChangeMessage cm2 = clone(cm1); cm2.getKey().set("uuid2"); - ChangeBundle b1 = new ChangeBundle(c, messages(cm1), latest(c), approvals(), - comments(), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c, messages(cm2), latest(c), approvals(), - comments(), reviewers(), REVIEW_DB); + ChangeBundle b1 = + new ChangeBundle( + c, messages(cm1), latest(c), approvals(), comments(), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c, messages(cm2), latest(c), approvals(), comments(), reviewers(), REVIEW_DB); // Both are ReviewDb, exact UUID match is required. - assertDiffs(b1, b2, + assertDiffs( + b1, + b2, "ChangeMessage.Key sets differ:" - + " [" + id + ",uuid1] only in A; [" + id + ",uuid2] only in B"); + + " [" + + id + + ",uuid1] only in A; [" + + id + + ",uuid2] only in B"); // One NoteDb, UUIDs are ignored. - b1 = new ChangeBundle(c, messages(cm1), latest(c), approvals(), comments(), - reviewers(), REVIEW_DB); - b2 = new ChangeBundle(c, messages(cm2), latest(c), approvals(), comments(), - reviewers(), NOTE_DB); + b1 = + new ChangeBundle( + c, messages(cm1), latest(c), approvals(), comments(), reviewers(), REVIEW_DB); + b2 = + new ChangeBundle( + c, messages(cm2), latest(c), approvals(), comments(), reviewers(), NOTE_DB); assertNoDiffs(b1, b2); } @@ -618,91 +726,128 @@ public class ChangeBundleTest extends GerritBaseTests { public void diffChangeMessagesWithDifferentCounts() throws Exception { Change c = TestChanges.newChange(project, accountId); int id = c.getId().get(); - ChangeMessage cm1 = new ChangeMessage( - new ChangeMessage.Key(c.getId(), "uuid1"), - accountId, TimeUtil.nowTs(), c.currentPatchSetId()); + ChangeMessage cm1 = + new ChangeMessage( + new ChangeMessage.Key(c.getId(), "uuid1"), + accountId, + TimeUtil.nowTs(), + c.currentPatchSetId()); cm1.setMessage("message 1"); - ChangeMessage cm2 = new ChangeMessage( - new ChangeMessage.Key(c.getId(), "uuid2"), - accountId, TimeUtil.nowTs(), c.currentPatchSetId()); + ChangeMessage cm2 = + new ChangeMessage( + new ChangeMessage.Key(c.getId(), "uuid2"), + accountId, + TimeUtil.nowTs(), + c.currentPatchSetId()); cm1.setMessage("message 2"); // Both ReviewDb: Uses same keySet diff as other types. - ChangeBundle b1 = new ChangeBundle(c, messages(cm1, cm2), latest(c), - approvals(), comments(), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c, messages(cm1), latest(c), approvals(), - comments(), reviewers(), REVIEW_DB); - assertDiffs(b1, b2, - "ChangeMessage.Key sets differ: [" + id - + ",uuid2] only in A; [] only in B"); + ChangeBundle b1 = + new ChangeBundle( + c, messages(cm1, cm2), latest(c), approvals(), comments(), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c, messages(cm1), latest(c), approvals(), comments(), reviewers(), REVIEW_DB); + assertDiffs( + b1, b2, "ChangeMessage.Key sets differ: [" + id + ",uuid2] only in A; [] only in B"); // One NoteDb: UUIDs in keys can't be used for comparison, just diff counts. - b1 = new ChangeBundle(c, messages(cm1, cm2), latest(c), approvals(), - comments(), reviewers(), REVIEW_DB); - b2 = new ChangeBundle(c, messages(cm1), latest(c), approvals(), comments(), - reviewers(), NOTE_DB); - assertDiffs(b1, b2, - "ChangeMessages differ for Change.Id " + id + "\n" - + "Only in A:\n " + cm2); - assertDiffs(b2, b1, - "ChangeMessages differ for Change.Id " + id + "\n" - + "Only in B:\n " + cm2); + b1 = + new ChangeBundle( + c, messages(cm1, cm2), latest(c), approvals(), comments(), reviewers(), REVIEW_DB); + b2 = + new ChangeBundle( + c, messages(cm1), latest(c), approvals(), comments(), reviewers(), NOTE_DB); + assertDiffs( + b1, b2, "ChangeMessages differ for Change.Id " + id + "\n" + "Only in A:\n " + cm2); + assertDiffs( + b2, b1, "ChangeMessages differ for Change.Id " + id + "\n" + "Only in B:\n " + cm2); } @Test public void diffChangeMessagesMixedSourcesWithDifferences() throws Exception { Change c = TestChanges.newChange(project, accountId); int id = c.getId().get(); - ChangeMessage cm1 = new ChangeMessage( - new ChangeMessage.Key(c.getId(), "uuid1"), - accountId, TimeUtil.nowTs(), c.currentPatchSetId()); + ChangeMessage cm1 = + new ChangeMessage( + new ChangeMessage.Key(c.getId(), "uuid1"), + accountId, + TimeUtil.nowTs(), + c.currentPatchSetId()); cm1.setMessage("message 1"); ChangeMessage cm2 = clone(cm1); cm2.setMessage("message 2"); ChangeMessage cm3 = clone(cm1); cm3.getKey().set("uuid2"); // Differs only in UUID. - ChangeBundle b1 = new ChangeBundle(c, messages(cm1, cm3), latest(c), - approvals(), comments(), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c, messages(cm2, cm3), latest(c), - approvals(), comments(), reviewers(), NOTE_DB); + ChangeBundle b1 = + new ChangeBundle( + c, messages(cm1, cm3), latest(c), approvals(), comments(), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c, messages(cm2, cm3), latest(c), approvals(), comments(), reviewers(), NOTE_DB); // Implementation happens to pair up cm1 in b1 with cm3 in b2 because it // depends on iteration order and doesn't care about UUIDs. The important // thing is that there's some diff. - assertDiffs(b1, b2, - "ChangeMessages differ for Change.Id " + id + "\n" - + "Only in A:\n " + cm3 + "\n" - + "Only in B:\n " + cm2); - assertDiffs(b2, b1, - "ChangeMessages differ for Change.Id " + id + "\n" - + "Only in A:\n " + cm2 + "\n" - + "Only in B:\n " + cm3); + assertDiffs( + b1, + b2, + "ChangeMessages differ for Change.Id " + + id + + "\n" + + "Only in A:\n " + + cm3 + + "\n" + + "Only in B:\n " + + cm2); + assertDiffs( + b2, + b1, + "ChangeMessages differ for Change.Id " + + id + + "\n" + + "Only in A:\n " + + cm2 + + "\n" + + "Only in B:\n " + + cm3); } @Test public void diffChangeMessagesMixedSourcesAllowsSlop() throws Exception { subWindowResolution(); Change c = TestChanges.newChange(project, accountId); - ChangeMessage cm1 = new ChangeMessage( - new ChangeMessage.Key(c.getId(), "uuid1"), - accountId, TimeUtil.nowTs(), c.currentPatchSetId()); + ChangeMessage cm1 = + new ChangeMessage( + new ChangeMessage.Key(c.getId(), "uuid1"), + accountId, + TimeUtil.nowTs(), + c.currentPatchSetId()); ChangeMessage cm2 = clone(cm1); cm2.setWrittenOn(TimeUtil.nowTs()); // Both are ReviewDb, exact timestamp match is required. - ChangeBundle b1 = new ChangeBundle(c, messages(cm1), latest(c), approvals(), - comments(), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c, messages(cm2), latest(c), approvals(), - comments(), reviewers(), REVIEW_DB); - assertDiffs(b1, b2, - "writtenOn differs for ChangeMessage.Key " + c.getId() + ",uuid1:" + ChangeBundle b1 = + new ChangeBundle( + c, messages(cm1), latest(c), approvals(), comments(), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c, messages(cm2), latest(c), approvals(), comments(), reviewers(), REVIEW_DB); + assertDiffs( + b1, + b2, + "writtenOn differs for ChangeMessage.Key " + + c.getId() + + ",uuid1:" + " {2009-09-30 17:00:02.0} != {2009-09-30 17:00:03.0}"); // One NoteDb, slop is allowed. - b1 = new ChangeBundle(c, messages(cm1), latest(c), approvals(), comments(), - reviewers(), NOTE_DB); - b2 = new ChangeBundle(c, messages(cm2), latest(c), approvals(), comments(), - reviewers(), REVIEW_DB); + b1 = + new ChangeBundle( + c, messages(cm1), latest(c), approvals(), comments(), reviewers(), NOTE_DB); + b2 = + new ChangeBundle( + c, messages(cm2), latest(c), approvals(), comments(), reviewers(), REVIEW_DB); assertNoDiffs(b1, b2); assertNoDiffs(b2, b1); @@ -710,63 +855,107 @@ public class ChangeBundleTest extends GerritBaseTests { superWindowResolution(); ChangeMessage cm3 = clone(cm1); cm3.setWrittenOn(TimeUtil.nowTs()); - b1 = new ChangeBundle(c, messages(cm1), latest(c), approvals(), comments(), - reviewers(), NOTE_DB); - ChangeBundle b3 = new ChangeBundle(c, messages(cm3), latest(c), approvals(), - comments(), reviewers(), REVIEW_DB); + b1 = + new ChangeBundle( + c, messages(cm1), latest(c), approvals(), comments(), reviewers(), NOTE_DB); + ChangeBundle b3 = + new ChangeBundle( + c, messages(cm3), latest(c), approvals(), comments(), reviewers(), REVIEW_DB); int id = c.getId().get(); - assertDiffs(b1, b3, - "ChangeMessages differ for Change.Id " + id + "\n" - + "Only in A:\n " + cm1 + "\n" - + "Only in B:\n " + cm3); - assertDiffs(b3, b1, - "ChangeMessages differ for Change.Id " + id + "\n" - + "Only in A:\n " + cm3 + "\n" - + "Only in B:\n " + cm1); + assertDiffs( + b1, + b3, + "ChangeMessages differ for Change.Id " + + id + + "\n" + + "Only in A:\n " + + cm1 + + "\n" + + "Only in B:\n " + + cm3); + assertDiffs( + b3, + b1, + "ChangeMessages differ for Change.Id " + + id + + "\n" + + "Only in A:\n " + + cm3 + + "\n" + + "Only in B:\n " + + cm1); } @Test - public void diffChangeMessagesAllowsNullPatchSetIdFromReviewDb() - throws Exception { + public void diffChangeMessagesAllowsNullPatchSetIdFromReviewDb() throws Exception { Change c = TestChanges.newChange(project, accountId); int id = c.getId().get(); - ChangeMessage cm1 = new ChangeMessage( - new ChangeMessage.Key(c.getId(), "uuid"), - accountId, TimeUtil.nowTs(), c.currentPatchSetId()); + ChangeMessage cm1 = + new ChangeMessage( + new ChangeMessage.Key(c.getId(), "uuid"), + accountId, + TimeUtil.nowTs(), + c.currentPatchSetId()); cm1.setMessage("message 1"); ChangeMessage cm2 = clone(cm1); cm2.setPatchSetId(null); - ChangeBundle b1 = new ChangeBundle(c, messages(cm1), latest(c), approvals(), - comments(), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c, messages(cm2), latest(c), approvals(), - comments(), reviewers(), REVIEW_DB); + ChangeBundle b1 = + new ChangeBundle( + c, messages(cm1), latest(c), approvals(), comments(), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c, messages(cm2), latest(c), approvals(), comments(), reviewers(), REVIEW_DB); // Both are ReviewDb, exact patch set ID match is required. - assertDiffs(b1, b2, - "patchset differs for ChangeMessage.Key " + c.getId() + ",uuid:" - + " {" + id + ",1} != {null}"); + assertDiffs( + b1, + b2, + "patchset differs for ChangeMessage.Key " + + c.getId() + + ",uuid:" + + " {" + + id + + ",1} != {null}"); // Null patch set ID on ReviewDb is ignored. - b1 = new ChangeBundle(c, messages(cm1), latest(c), approvals(), comments(), - reviewers(), NOTE_DB); - b2 = new ChangeBundle(c, messages(cm2), latest(c), approvals(), comments(), - reviewers(), REVIEW_DB); + b1 = + new ChangeBundle( + c, messages(cm1), latest(c), approvals(), comments(), reviewers(), NOTE_DB); + b2 = + new ChangeBundle( + c, messages(cm2), latest(c), approvals(), comments(), reviewers(), REVIEW_DB); assertNoDiffs(b1, b2); // Null patch set ID on NoteDb is not ignored (but is not realistic). - b1 = new ChangeBundle(c, messages(cm1), latest(c), approvals(), comments(), - reviewers(), REVIEW_DB); - b2 = new ChangeBundle(c, messages(cm2), latest(c), approvals(), comments(), - reviewers(), NOTE_DB); - assertDiffs(b1, b2, - "ChangeMessages differ for Change.Id " + id + "\n" - + "Only in A:\n " + cm1 + "\n" - + "Only in B:\n " + cm2); - assertDiffs(b2, b1, - "ChangeMessages differ for Change.Id " + id + "\n" - + "Only in A:\n " + cm2 + "\n" - + "Only in B:\n " + cm1); + b1 = + new ChangeBundle( + c, messages(cm1), latest(c), approvals(), comments(), reviewers(), REVIEW_DB); + b2 = + new ChangeBundle( + c, messages(cm2), latest(c), approvals(), comments(), reviewers(), NOTE_DB); + assertDiffs( + b1, + b2, + "ChangeMessages differ for Change.Id " + + id + + "\n" + + "Only in A:\n " + + cm1 + + "\n" + + "Only in B:\n " + + cm2); + assertDiffs( + b2, + b1, + "ChangeMessages differ for Change.Id " + + id + + "\n" + + "Only in A:\n " + + cm2 + + "\n" + + "Only in B:\n " + + cm1); } @Test @@ -783,14 +972,15 @@ public class ChangeBundleTest extends GerritBaseTests { ps2.setUploader(accountId); ps2.setCreatedOn(TimeUtil.nowTs()); - ChangeBundle b1 = new ChangeBundle(c, messages(), patchSets(ps2), - approvals(), comments(), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c, messages(), patchSets(ps1, ps2), - approvals(), comments(), reviewers(), REVIEW_DB); + ChangeBundle b1 = + new ChangeBundle( + c, messages(), patchSets(ps2), approvals(), comments(), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c, messages(), patchSets(ps1, ps2), approvals(), comments(), reviewers(), REVIEW_DB); - assertDiffs(b1, b2, - "PatchSet.Id sets differ:" - + " [] only in A; [" + c.getId() + ",1] only in B"); + assertDiffs( + b1, b2, "PatchSet.Id sets differ:" + " [] only in A; [" + c.getId() + ",1] only in B"); } @Test @@ -801,16 +991,22 @@ public class ChangeBundleTest extends GerritBaseTests { ps1.setUploader(accountId); ps1.setCreatedOn(TimeUtil.nowTs()); PatchSet ps2 = clone(ps1); - ChangeBundle b1 = new ChangeBundle(c, messages(), patchSets(ps1), - approvals(), comments(), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c, messages(), patchSets(ps2), - approvals(), comments(), reviewers(), REVIEW_DB); + ChangeBundle b1 = + new ChangeBundle( + c, messages(), patchSets(ps1), approvals(), comments(), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c, messages(), patchSets(ps2), approvals(), comments(), reviewers(), REVIEW_DB); assertNoDiffs(b1, b2); ps2.setRevision(new RevId("badc0feebadc0feebadc0feebadc0feebadc0fee")); - assertDiffs(b1, b2, - "revision differs for PatchSet.Id " + c.getId() + ",1:" + assertDiffs( + b1, + b2, + "revision differs for PatchSet.Id " + + c.getId() + + ",1:" + " {RevId{deadbeefdeadbeefdeadbeefdeadbeefdeadbeef}}" + " != {RevId{badc0feebadc0feebadc0feebadc0feebadc0fee}}"); } @@ -827,39 +1023,50 @@ public class ChangeBundleTest extends GerritBaseTests { ps2.setCreatedOn(TimeUtil.nowTs()); // Both are ReviewDb, exact timestamp match is required. - ChangeBundle b1 = new ChangeBundle(c, messages(), patchSets(ps1), - approvals(), comments(), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c, messages(), patchSets(ps2), - approvals(), comments(), reviewers(), REVIEW_DB); - assertDiffs(b1, b2, - "createdOn differs for PatchSet.Id " + c.getId() + ",1:" + ChangeBundle b1 = + new ChangeBundle( + c, messages(), patchSets(ps1), approvals(), comments(), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c, messages(), patchSets(ps2), approvals(), comments(), reviewers(), REVIEW_DB); + assertDiffs( + b1, + b2, + "createdOn differs for PatchSet.Id " + + c.getId() + + ",1:" + " {2009-09-30 17:00:02.0} != {2009-09-30 17:00:03.0}"); // One NoteDb, slop is allowed. - b1 = new ChangeBundle(c, messages(), patchSets(ps1), approvals(), - comments(), reviewers(), NOTE_DB); - b2 = new ChangeBundle(c, messages(), patchSets(ps2), approvals(), - comments(), reviewers(), REVIEW_DB); + b1 = + new ChangeBundle( + c, messages(), patchSets(ps1), approvals(), comments(), reviewers(), NOTE_DB); + b2 = + new ChangeBundle( + c, messages(), patchSets(ps2), approvals(), comments(), reviewers(), REVIEW_DB); assertNoDiffs(b1, b2); // But not too much slop. superWindowResolution(); PatchSet ps3 = clone(ps1); ps3.setCreatedOn(TimeUtil.nowTs()); - b1 = new ChangeBundle(c, messages(), patchSets(ps1), approvals(), - comments(), reviewers(), NOTE_DB); - ChangeBundle b3 = new ChangeBundle(c, messages(), patchSets(ps3), - approvals(), comments(), reviewers(), REVIEW_DB); - String msg = "createdOn differs for PatchSet.Id " + c.getId() - + ",1 in NoteDb vs. ReviewDb:" - + " {2009-09-30 17:00:02.0} != {2009-09-30 17:00:10.0}"; + b1 = + new ChangeBundle( + c, messages(), patchSets(ps1), approvals(), comments(), reviewers(), NOTE_DB); + ChangeBundle b3 = + new ChangeBundle( + c, messages(), patchSets(ps3), approvals(), comments(), reviewers(), REVIEW_DB); + String msg = + "createdOn differs for PatchSet.Id " + + c.getId() + + ",1 in NoteDb vs. ReviewDb:" + + " {2009-09-30 17:00:02.0} != {2009-09-30 17:00:10.0}"; assertDiffs(b1, b3, msg); assertDiffs(b3, b1, msg); } @Test - public void diffPatchSetsIgnoresTrailingNewlinesInPushCertificate() - throws Exception { + public void diffPatchSetsIgnoresTrailingNewlinesInPushCertificate() throws Exception { subWindowResolution(); Change c = TestChanges.newChange(project, accountId); PatchSet ps1 = new PatchSet(c.currentPatchSetId()); @@ -870,17 +1077,21 @@ public class ChangeBundleTest extends GerritBaseTests { PatchSet ps2 = clone(ps1); ps2.setPushCertificate(ps2.getPushCertificate() + "\n\n"); - ChangeBundle b1 = new ChangeBundle(c, messages(), patchSets(ps1), - approvals(), comments(), reviewers(), NOTE_DB); - ChangeBundle b2 = new ChangeBundle(c, messages(), patchSets(ps2), - approvals(), comments(), reviewers(), REVIEW_DB); + ChangeBundle b1 = + new ChangeBundle( + c, messages(), patchSets(ps1), approvals(), comments(), reviewers(), NOTE_DB); + ChangeBundle b2 = + new ChangeBundle( + c, messages(), patchSets(ps2), approvals(), comments(), reviewers(), REVIEW_DB); assertNoDiffs(b1, b2); assertNoDiffs(b2, b1); - b1 = new ChangeBundle(c, messages(), patchSets(ps1), approvals(), - comments(), reviewers(), REVIEW_DB); - b2 = new ChangeBundle(c, messages(), patchSets(ps2), approvals(), - comments(), reviewers(), NOTE_DB); + b1 = + new ChangeBundle( + c, messages(), patchSets(ps1), approvals(), comments(), reviewers(), REVIEW_DB); + b2 = + new ChangeBundle( + c, messages(), patchSets(ps2), approvals(), comments(), reviewers(), NOTE_DB); assertNoDiffs(b1, b2); assertNoDiffs(b2, b1); } @@ -899,187 +1110,240 @@ public class ChangeBundleTest extends GerritBaseTests { ps2.setCreatedOn(TimeUtil.nowTs()); assertThat(ps2.getId().get()).isGreaterThan(c.currentPatchSetId().get()); - ChangeMessage cm1 = new ChangeMessage( - new ChangeMessage.Key(c.getId(), "uuid1"), - accountId, TimeUtil.nowTs(), c.currentPatchSetId()); - ChangeMessage cm2 = new ChangeMessage( - new ChangeMessage.Key(c.getId(), "uuid2"), - accountId, TimeUtil.nowTs(), c.currentPatchSetId()); + ChangeMessage cm1 = + new ChangeMessage( + new ChangeMessage.Key(c.getId(), "uuid1"), + accountId, + TimeUtil.nowTs(), + c.currentPatchSetId()); + ChangeMessage cm2 = + new ChangeMessage( + new ChangeMessage.Key(c.getId(), "uuid2"), + accountId, + TimeUtil.nowTs(), + c.currentPatchSetId()); - PatchSetApproval a1 = new PatchSetApproval( - new PatchSetApproval.Key( - ps1.getId(), accountId, new LabelId("Code-Review")), - (short) 1, - TimeUtil.nowTs()); - PatchSetApproval a2 = new PatchSetApproval( - new PatchSetApproval.Key( - ps2.getId(), accountId, new LabelId("Code-Review")), - (short) 1, - TimeUtil.nowTs()); + PatchSetApproval a1 = + new PatchSetApproval( + new PatchSetApproval.Key(ps1.getId(), accountId, new LabelId("Code-Review")), + (short) 1, + TimeUtil.nowTs()); + PatchSetApproval a2 = + new PatchSetApproval( + new PatchSetApproval.Key(ps2.getId(), accountId, new LabelId("Code-Review")), + (short) 1, + TimeUtil.nowTs()); // Both ReviewDb. - ChangeBundle b1 = new ChangeBundle(c, messages(cm1), patchSets(ps1), - approvals(a1), comments(), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c, messages(cm1, cm2), - patchSets(ps1, ps2), approvals(a1, a2), comments(), reviewers(), - REVIEW_DB); - assertDiffs(b1, b2, - "ChangeMessage.Key sets differ: [] only in A; [" + cm2.getKey() - + "] only in B", - "PatchSet.Id sets differ:" - + " [] only in A; [" + ps2.getId() + "] only in B", - "PatchSetApproval.Key sets differ:" - + " [] only in A; [" + a2.getKey() + "] only in B"); + ChangeBundle b1 = + new ChangeBundle( + c, messages(cm1), patchSets(ps1), approvals(a1), comments(), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c, + messages(cm1, cm2), + patchSets(ps1, ps2), + approvals(a1, a2), + comments(), + reviewers(), + REVIEW_DB); + assertDiffs( + b1, + b2, + "ChangeMessage.Key sets differ: [] only in A; [" + cm2.getKey() + "] only in B", + "PatchSet.Id sets differ:" + " [] only in A; [" + ps2.getId() + "] only in B", + "PatchSetApproval.Key sets differ:" + " [] only in A; [" + a2.getKey() + "] only in B"); // One NoteDb. - b1 = new ChangeBundle(c, messages(cm1), patchSets(ps1), approvals(a1), - comments(), reviewers(), NOTE_DB); - b2 = new ChangeBundle(c, messages(cm1, cm2), patchSets(ps1, ps2), approvals(a1, a2), - comments(), reviewers(), REVIEW_DB); - assertDiffs(b1, b2, - "ChangeMessages differ for Change.Id " + c.getId() + "\n" - + "Only in B:\n " + cm2, - "PatchSet.Id sets differ:" - + " [] only in A; [" + ps2.getId() + "] only in B", - "PatchSetApproval.Key sets differ:" - + " [] only in A; [" + a2.getKey() + "] only in B"); + b1 = + new ChangeBundle( + c, messages(cm1), patchSets(ps1), approvals(a1), comments(), reviewers(), NOTE_DB); + b2 = + new ChangeBundle( + c, + messages(cm1, cm2), + patchSets(ps1, ps2), + approvals(a1, a2), + comments(), + reviewers(), + REVIEW_DB); + assertDiffs( + b1, + b2, + "ChangeMessages differ for Change.Id " + c.getId() + "\n" + "Only in B:\n " + cm2, + "PatchSet.Id sets differ:" + " [] only in A; [" + ps2.getId() + "] only in B", + "PatchSetApproval.Key sets differ:" + " [] only in A; [" + a2.getKey() + "] only in B"); // Both NoteDb. - b1 = new ChangeBundle(c, messages(cm1), patchSets(ps1), approvals(a1), - comments(), reviewers(), NOTE_DB); - b2 = new ChangeBundle(c, messages(cm1, cm2), patchSets(ps1, ps2), approvals(a1, a2), - comments(), reviewers(), NOTE_DB); - assertDiffs(b1, b2, - "ChangeMessages differ for Change.Id " + c.getId() + "\n" - + "Only in B:\n " + cm2, - "PatchSet.Id sets differ:" - + " [] only in A; [" + ps2.getId() + "] only in B", - "PatchSetApproval.Key sets differ:" - + " [] only in A; [" + a2.getKey() + "] only in B"); + b1 = + new ChangeBundle( + c, messages(cm1), patchSets(ps1), approvals(a1), comments(), reviewers(), NOTE_DB); + b2 = + new ChangeBundle( + c, + messages(cm1, cm2), + patchSets(ps1, ps2), + approvals(a1, a2), + comments(), + reviewers(), + NOTE_DB); + assertDiffs( + b1, + b2, + "ChangeMessages differ for Change.Id " + c.getId() + "\n" + "Only in B:\n " + cm2, + "PatchSet.Id sets differ:" + " [] only in A; [" + ps2.getId() + "] only in B", + "PatchSetApproval.Key sets differ:" + " [] only in A; [" + a2.getKey() + "] only in B"); } @Test public void diffPatchSetApprovalKeySets() throws Exception { Change c = TestChanges.newChange(project, accountId); int id = c.getId().get(); - PatchSetApproval a1 = new PatchSetApproval( - new PatchSetApproval.Key( - c.currentPatchSetId(), accountId, new LabelId("Code-Review")), - (short) 1, - TimeUtil.nowTs()); - PatchSetApproval a2 = new PatchSetApproval( - new PatchSetApproval.Key( - c.currentPatchSetId(), accountId, new LabelId("Verified")), - (short) 1, - TimeUtil.nowTs()); + PatchSetApproval a1 = + new PatchSetApproval( + new PatchSetApproval.Key(c.currentPatchSetId(), accountId, new LabelId("Code-Review")), + (short) 1, + TimeUtil.nowTs()); + PatchSetApproval a2 = + new PatchSetApproval( + new PatchSetApproval.Key(c.currentPatchSetId(), accountId, new LabelId("Verified")), + (short) 1, + TimeUtil.nowTs()); - ChangeBundle b1 = new ChangeBundle(c, messages(), latest(c), approvals(a1), - comments(), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c, messages(), latest(c), approvals(a2), - comments(), reviewers(), REVIEW_DB); + ChangeBundle b1 = + new ChangeBundle( + c, messages(), latest(c), approvals(a1), comments(), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c, messages(), latest(c), approvals(a2), comments(), reviewers(), REVIEW_DB); - assertDiffs(b1, b2, + assertDiffs( + b1, + b2, "PatchSetApproval.Key sets differ:" - + " [" + id + "%2C1,100,Code-Review] only in A;" - + " [" + id + "%2C1,100,Verified] only in B"); + + " [" + + id + + "%2C1,100,Code-Review] only in A;" + + " [" + + id + + "%2C1,100,Verified] only in B"); } @Test public void diffPatchSetApprovals() throws Exception { Change c = TestChanges.newChange(project, accountId); - PatchSetApproval a1 = new PatchSetApproval( - new PatchSetApproval.Key( - c.currentPatchSetId(), accountId, new LabelId("Code-Review")), - (short) 1, - TimeUtil.nowTs()); + PatchSetApproval a1 = + new PatchSetApproval( + new PatchSetApproval.Key(c.currentPatchSetId(), accountId, new LabelId("Code-Review")), + (short) 1, + TimeUtil.nowTs()); PatchSetApproval a2 = clone(a1); - ChangeBundle b1 = new ChangeBundle(c, messages(), latest(c), approvals(a1), - comments(), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c, messages(), latest(c), approvals(a2), - comments(), reviewers(), REVIEW_DB); + ChangeBundle b1 = + new ChangeBundle( + c, messages(), latest(c), approvals(a1), comments(), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c, messages(), latest(c), approvals(a2), comments(), reviewers(), REVIEW_DB); assertNoDiffs(b1, b2); a2.setValue((short) -1); - assertDiffs(b1, b2, + assertDiffs( + b1, + b2, "value differs for PatchSetApproval.Key " - + c.getId() + "%2C1,100,Code-Review: {1} != {-1}"); + + c.getId() + + "%2C1,100,Code-Review: {1} != {-1}"); } @Test - public void diffPatchSetApprovalsMixedSourcesAllowsSlop() - throws Exception { + public void diffPatchSetApprovalsMixedSourcesAllowsSlop() throws Exception { Change c = TestChanges.newChange(project, accountId); subWindowResolution(); - PatchSetApproval a1 = new PatchSetApproval( - new PatchSetApproval.Key( - c.currentPatchSetId(), accountId, new LabelId("Code-Review")), - (short) 1, - roundToSecond(TimeUtil.nowTs())); + PatchSetApproval a1 = + new PatchSetApproval( + new PatchSetApproval.Key(c.currentPatchSetId(), accountId, new LabelId("Code-Review")), + (short) 1, + roundToSecond(TimeUtil.nowTs())); PatchSetApproval a2 = clone(a1); a2.setGranted(TimeUtil.nowTs()); // Both are ReviewDb, exact timestamp match is required. - ChangeBundle b1 = new ChangeBundle(c, messages(), latest(c), approvals(a1), - comments(), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c, messages(), latest(c), approvals(a2), - comments(), reviewers(), REVIEW_DB); - assertDiffs(b1, b2, + ChangeBundle b1 = + new ChangeBundle( + c, messages(), latest(c), approvals(a1), comments(), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c, messages(), latest(c), approvals(a2), comments(), reviewers(), REVIEW_DB); + assertDiffs( + b1, + b2, "granted differs for PatchSetApproval.Key " - + c.getId() + "%2C1,100,Code-Review:" + + c.getId() + + "%2C1,100,Code-Review:" + " {2009-09-30 17:00:07.0} != {2009-09-30 17:00:08.0}"); // One NoteDb, slop is allowed. - b1 = new ChangeBundle(c, messages(), latest(c), approvals(a1), comments(), - reviewers(), NOTE_DB); - b2 = new ChangeBundle(c, messages(), latest(c), approvals(a2), comments(), - reviewers(), REVIEW_DB); + b1 = + new ChangeBundle(c, messages(), latest(c), approvals(a1), comments(), reviewers(), NOTE_DB); + b2 = + new ChangeBundle( + c, messages(), latest(c), approvals(a2), comments(), reviewers(), REVIEW_DB); assertNoDiffs(b1, b2); // But not too much slop. superWindowResolution(); PatchSetApproval a3 = clone(a1); a3.setGranted(TimeUtil.nowTs()); - b1 = new ChangeBundle(c, messages(), latest(c), approvals(a1), comments(), - reviewers(), NOTE_DB); - ChangeBundle b3 = new ChangeBundle(c, messages(), latest(c), approvals(a3), - comments(), reviewers(), REVIEW_DB); - String msg = "granted differs for PatchSetApproval.Key " - + c.getId() + "%2C1,100,Code-Review in NoteDb vs. ReviewDb:" - + " {2009-09-30 17:00:07.0} != {2009-09-30 17:00:15.0}"; + b1 = + new ChangeBundle(c, messages(), latest(c), approvals(a1), comments(), reviewers(), NOTE_DB); + ChangeBundle b3 = + new ChangeBundle( + c, messages(), latest(c), approvals(a3), comments(), reviewers(), REVIEW_DB); + String msg = + "granted differs for PatchSetApproval.Key " + + c.getId() + + "%2C1,100,Code-Review in NoteDb vs. ReviewDb:" + + " {2009-09-30 17:00:07.0} != {2009-09-30 17:00:15.0}"; assertDiffs(b1, b3, msg); assertDiffs(b3, b1, msg); } @Test - public void diffPatchSetApprovalsAllowsTruncatedTimestampInNoteDb() - throws Exception { + public void diffPatchSetApprovalsAllowsTruncatedTimestampInNoteDb() throws Exception { Change c = TestChanges.newChange(project, accountId); - PatchSetApproval a1 = new PatchSetApproval( - new PatchSetApproval.Key( - c.currentPatchSetId(), accountId, new LabelId("Code-Review")), - (short) 1, - c.getCreatedOn()); + PatchSetApproval a1 = + new PatchSetApproval( + new PatchSetApproval.Key(c.currentPatchSetId(), accountId, new LabelId("Code-Review")), + (short) 1, + c.getCreatedOn()); PatchSetApproval a2 = clone(a1); - a2.setGranted(new Timestamp(new DateTime( - 1900, 1, 1, 0, 0, 0, DateTimeZone.forTimeZone(TimeZone.getDefault())) - .getMillis())); + a2.setGranted( + new Timestamp( + new DateTime(1900, 1, 1, 0, 0, 0, DateTimeZone.forTimeZone(TimeZone.getDefault())) + .getMillis())); // Both are ReviewDb, exact match is required. - ChangeBundle b1 = new ChangeBundle(c, messages(), latest(c), approvals(a1), - comments(), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c, messages(), latest(c), approvals(a2), - comments(), reviewers(), REVIEW_DB); - assertDiffs(b1, b2, + ChangeBundle b1 = + new ChangeBundle( + c, messages(), latest(c), approvals(a1), comments(), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c, messages(), latest(c), approvals(a2), comments(), reviewers(), REVIEW_DB); + assertDiffs( + b1, + b2, "granted differs for PatchSetApproval.Key " - + c.getId() + "%2C1,100,Code-Review:" + + c.getId() + + "%2C1,100,Code-Review:" + " {2009-09-30 17:00:00.0} != {1900-01-01 00:00:00.0}"); // Truncating NoteDb timestamp is allowed. - b1 = new ChangeBundle(c, messages(), latest(c), approvals(a1), comments(), - reviewers(), NOTE_DB); - b2 = new ChangeBundle(c, messages(), latest(c), approvals(a2), comments(), - reviewers(), REVIEW_DB); + b1 = + new ChangeBundle(c, messages(), latest(c), approvals(a1), comments(), reviewers(), NOTE_DB); + b2 = + new ChangeBundle( + c, messages(), latest(c), approvals(a2), comments(), reviewers(), REVIEW_DB); assertNoDiffs(b1, b2); assertNoDiffs(b2, b1); } @@ -1091,16 +1355,13 @@ public class ChangeBundleTest extends GerritBaseTests { ReviewerSet r1 = reviewers(REVIEWER, new Account.Id(1), now); ReviewerSet r2 = reviewers(REVIEWER, new Account.Id(2), now); - ChangeBundle b1 = new ChangeBundle(c, messages(), latest(c), approvals(), - comments(), r1, REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c, messages(), latest(c), approvals(), - comments(), r2, REVIEW_DB); + ChangeBundle b1 = + new ChangeBundle(c, messages(), latest(c), approvals(), comments(), r1, REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle(c, messages(), latest(c), approvals(), comments(), r2, REVIEW_DB); assertNoDiffs(b1, b1); assertNoDiffs(b2, b2); - assertDiffs(b1, b2, - "reviewer sets differ:" - + " [1] only in A;" - + " [2] only in B"); + assertDiffs(b1, b2, "reviewer sets differ:" + " [1] only in A;" + " [2] only in B"); } @Test @@ -1109,10 +1370,10 @@ public class ChangeBundleTest extends GerritBaseTests { ReviewerSet r1 = reviewers(REVIEWER, new Account.Id(1), TimeUtil.nowTs()); ReviewerSet r2 = reviewers(CC, new Account.Id(1), TimeUtil.nowTs()); - ChangeBundle b1 = new ChangeBundle(c, messages(), latest(c), approvals(), - comments(), r1, REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c, messages(), latest(c), approvals(), - comments(), r2, REVIEW_DB); + ChangeBundle b1 = + new ChangeBundle(c, messages(), latest(c), approvals(), comments(), r1, REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle(c, messages(), latest(c), approvals(), comments(), r2, REVIEW_DB); assertNoDiffs(b1, b1); assertNoDiffs(b2, b2); } @@ -1121,108 +1382,147 @@ public class ChangeBundleTest extends GerritBaseTests { public void diffPatchLineCommentKeySets() throws Exception { Change c = TestChanges.newChange(project, accountId); int id = c.getId().get(); - PatchLineComment c1 = new PatchLineComment( - new PatchLineComment.Key( - new Patch.Key(c.currentPatchSetId(), "filename1"), "uuid1"), - 5, accountId, null, TimeUtil.nowTs()); - PatchLineComment c2 = new PatchLineComment( - new PatchLineComment.Key( - new Patch.Key(c.currentPatchSetId(), "filename2"), "uuid2"), - 5, accountId, null, TimeUtil.nowTs()); + PatchLineComment c1 = + new PatchLineComment( + new PatchLineComment.Key(new Patch.Key(c.currentPatchSetId(), "filename1"), "uuid1"), + 5, + accountId, + null, + TimeUtil.nowTs()); + PatchLineComment c2 = + new PatchLineComment( + new PatchLineComment.Key(new Patch.Key(c.currentPatchSetId(), "filename2"), "uuid2"), + 5, + accountId, + null, + TimeUtil.nowTs()); - ChangeBundle b1 = new ChangeBundle(c, messages(), latest(c), approvals(), - comments(c1), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c, messages(), latest(c), approvals(), - comments(c2), reviewers(), REVIEW_DB); + ChangeBundle b1 = + new ChangeBundle( + c, messages(), latest(c), approvals(), comments(c1), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c, messages(), latest(c), approvals(), comments(c2), reviewers(), REVIEW_DB); - assertDiffs(b1, b2, + assertDiffs( + b1, + b2, "PatchLineComment.Key sets differ:" - + " [" + id + ",1,filename1,uuid1] only in A;" - + " [" + id + ",1,filename2,uuid2] only in B"); + + " [" + + id + + ",1,filename1,uuid1] only in A;" + + " [" + + id + + ",1,filename2,uuid2] only in B"); } @Test public void diffPatchLineComments() throws Exception { Change c = TestChanges.newChange(project, accountId); - PatchLineComment c1 = new PatchLineComment( - new PatchLineComment.Key( - new Patch.Key(c.currentPatchSetId(), "filename"), "uuid"), - 5, accountId, null, TimeUtil.nowTs()); + PatchLineComment c1 = + new PatchLineComment( + new PatchLineComment.Key(new Patch.Key(c.currentPatchSetId(), "filename"), "uuid"), + 5, + accountId, + null, + TimeUtil.nowTs()); PatchLineComment c2 = clone(c1); - ChangeBundle b1 = new ChangeBundle(c, messages(), latest(c), approvals(), - comments(c1), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c, messages(), latest(c), approvals(), - comments(c2), reviewers(), REVIEW_DB); + ChangeBundle b1 = + new ChangeBundle( + c, messages(), latest(c), approvals(), comments(c1), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c, messages(), latest(c), approvals(), comments(c2), reviewers(), REVIEW_DB); assertNoDiffs(b1, b2); c2.setStatus(PatchLineComment.Status.PUBLISHED); - assertDiffs(b1, b2, - "status differs for PatchLineComment.Key " - + c.getId() + ",1,filename,uuid: {d} != {P}"); + assertDiffs( + b1, + b2, + "status differs for PatchLineComment.Key " + c.getId() + ",1,filename,uuid: {d} != {P}"); } @Test - public void diffPatchLineCommentsMixedSourcesAllowsSlop() - throws Exception { + public void diffPatchLineCommentsMixedSourcesAllowsSlop() throws Exception { subWindowResolution(); Change c = TestChanges.newChange(project, accountId); - PatchLineComment c1 = new PatchLineComment( - new PatchLineComment.Key( - new Patch.Key(c.currentPatchSetId(), "filename"), "uuid"), - 5, accountId, null, roundToSecond(TimeUtil.nowTs())); + PatchLineComment c1 = + new PatchLineComment( + new PatchLineComment.Key(new Patch.Key(c.currentPatchSetId(), "filename"), "uuid"), + 5, + accountId, + null, + roundToSecond(TimeUtil.nowTs())); PatchLineComment c2 = clone(c1); c2.setWrittenOn(TimeUtil.nowTs()); // Both are ReviewDb, exact timestamp match is required. - ChangeBundle b1 = new ChangeBundle(c, messages(), latest(c), approvals(), - comments(c1), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c, messages(), latest(c), approvals(), - comments(c2), reviewers(), REVIEW_DB); - assertDiffs(b1, b2, + ChangeBundle b1 = + new ChangeBundle( + c, messages(), latest(c), approvals(), comments(c1), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c, messages(), latest(c), approvals(), comments(c2), reviewers(), REVIEW_DB); + assertDiffs( + b1, + b2, "writtenOn differs for PatchLineComment.Key " - + c.getId() + ",1,filename,uuid:" + + c.getId() + + ",1,filename,uuid:" + " {2009-09-30 17:00:02.0} != {2009-09-30 17:00:03.0}"); // One NoteDb, slop is allowed. - b1 = new ChangeBundle(c, messages(), latest(c), approvals(), comments(c1), - reviewers(), NOTE_DB); - b2 = new ChangeBundle(c, messages(), latest(c), approvals(), comments(c2), - reviewers(), REVIEW_DB); + b1 = + new ChangeBundle(c, messages(), latest(c), approvals(), comments(c1), reviewers(), NOTE_DB); + b2 = + new ChangeBundle( + c, messages(), latest(c), approvals(), comments(c2), reviewers(), REVIEW_DB); assertNoDiffs(b1, b2); // But not too much slop. superWindowResolution(); PatchLineComment c3 = clone(c1); c3.setWrittenOn(TimeUtil.nowTs()); - b1 = new ChangeBundle(c, messages(), latest(c), approvals(), comments(c1), - reviewers(), NOTE_DB); - ChangeBundle b3 = new ChangeBundle(c, messages(), latest(c), approvals(), - comments(c3), reviewers(), REVIEW_DB); - String msg = "writtenOn differs for PatchLineComment.Key " + c.getId() - + ",1,filename,uuid in NoteDb vs. ReviewDb:" - + " {2009-09-30 17:00:02.0} != {2009-09-30 17:00:10.0}"; + b1 = + new ChangeBundle(c, messages(), latest(c), approvals(), comments(c1), reviewers(), NOTE_DB); + ChangeBundle b3 = + new ChangeBundle( + c, messages(), latest(c), approvals(), comments(c3), reviewers(), REVIEW_DB); + String msg = + "writtenOn differs for PatchLineComment.Key " + + c.getId() + + ",1,filename,uuid in NoteDb vs. ReviewDb:" + + " {2009-09-30 17:00:02.0} != {2009-09-30 17:00:10.0}"; assertDiffs(b1, b3, msg); assertDiffs(b3, b1, msg); } @Test - public void diffPatchLineCommentsIgnoresCommentsOnInvalidPatchSet() - throws Exception { + public void diffPatchLineCommentsIgnoresCommentsOnInvalidPatchSet() throws Exception { Change c = TestChanges.newChange(project, accountId); - PatchLineComment c1 = new PatchLineComment( - new PatchLineComment.Key( - new Patch.Key(c.currentPatchSetId(), "filename1"), "uuid1"), - 5, accountId, null, TimeUtil.nowTs()); - PatchLineComment c2 = new PatchLineComment( - new PatchLineComment.Key( - new Patch.Key(new PatchSet.Id(c.getId(), 0), "filename2"), "uuid2"), - 5, accountId, null, TimeUtil.nowTs()); + PatchLineComment c1 = + new PatchLineComment( + new PatchLineComment.Key(new Patch.Key(c.currentPatchSetId(), "filename1"), "uuid1"), + 5, + accountId, + null, + TimeUtil.nowTs()); + PatchLineComment c2 = + new PatchLineComment( + new PatchLineComment.Key( + new Patch.Key(new PatchSet.Id(c.getId(), 0), "filename2"), "uuid2"), + 5, + accountId, + null, + TimeUtil.nowTs()); - ChangeBundle b1 = new ChangeBundle(c, messages(), latest(c), approvals(), - comments(c1, c2), reviewers(), REVIEW_DB); - ChangeBundle b2 = new ChangeBundle(c, messages(), latest(c), approvals(), - comments(c1), reviewers(), REVIEW_DB); + ChangeBundle b1 = + new ChangeBundle( + c, messages(), latest(c), approvals(), comments(c1, c2), reviewers(), REVIEW_DB); + ChangeBundle b2 = + new ChangeBundle( + c, messages(), latest(c), approvals(), comments(c1), reviewers(), REVIEW_DB); assertNoDiffs(b1, b2); } @@ -1231,8 +1531,7 @@ public class ChangeBundleTest extends GerritBaseTests { assertThat(b.differencesFrom(a)).isEmpty(); } - private static void assertDiffs(ChangeBundle a, ChangeBundle b, String first, - String... rest) { + private static void assertDiffs(ChangeBundle a, ChangeBundle b, String first, String... rest) { List actual = a.differencesFrom(b); if (actual.size() == 1 && rest.length == 0) { // This error message is much easier to read. @@ -1266,11 +1565,9 @@ public class ChangeBundleTest extends GerritBaseTests { private static ReviewerSet reviewers(Object... ents) { checkArgument(ents.length % 3 == 0); - Table t = - HashBasedTable.create(); + Table t = HashBasedTable.create(); for (int i = 0; i < ents.length; i += 3) { - t.put((ReviewerStateInternal) ents[i], (Account.Id) ents[i + 1], - (Timestamp) ents[i + 2]); + t.put((ReviewerStateInternal) ents[i], (Account.Id) ents[i + 1], (Timestamp) ents[i + 2]); } return ReviewerSet.fromTable(t); } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesParserTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesParserTest.java index a4f3438e1f..abc87d46b4 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesParserTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesParserTest.java @@ -19,7 +19,6 @@ import static org.junit.Assert.fail; import com.google.gerrit.common.TimeUtil; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.server.notedb.ChangeNotesCommit.ChangeNotesRevWalk; - import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository; import org.eclipse.jgit.junit.TestRepository; @@ -49,434 +48,426 @@ public class ChangeNotesParserTest extends AbstractChangeNotesTest { @Test public void parseAuthor() throws Exception { - assertParseSucceeds("Update change\n" - + "\n" - + "Branch: refs/heads/master\n" - + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" - + "Patch-set: 1\n" - + "Subject: This is a test change\n"); - assertParseFails(writeCommit("Update change\n" - + "\n" - + "Patch-set: 1\n", - new PersonIdent("Change Owner", "owner@example.com", - serverIdent.getWhen(), serverIdent.getTimeZone()))); - assertParseFails(writeCommit("Update change\n" - + "\n" - + "Patch-set: 1\n", - new PersonIdent("Change Owner", "x@gerrit", - serverIdent.getWhen(), serverIdent.getTimeZone()))); - assertParseFails(writeCommit("Update change\n" - + "\n" - + "Patch-set: 1\n", - new PersonIdent("Change\n\u1234", "\n\nx<@>\u0002gerrit", - serverIdent.getWhen(), serverIdent.getTimeZone()))); + assertParseSucceeds( + "Update change\n" + + "\n" + + "Branch: refs/heads/master\n" + + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" + + "Patch-set: 1\n" + + "Subject: This is a test change\n"); + assertParseFails( + writeCommit( + "Update change\n" + "\n" + "Patch-set: 1\n", + new PersonIdent( + "Change Owner", + "owner@example.com", + serverIdent.getWhen(), + serverIdent.getTimeZone()))); + assertParseFails( + writeCommit( + "Update change\n" + "\n" + "Patch-set: 1\n", + new PersonIdent( + "Change Owner", "x@gerrit", serverIdent.getWhen(), serverIdent.getTimeZone()))); + assertParseFails( + writeCommit( + "Update change\n" + "\n" + "Patch-set: 1\n", + new PersonIdent( + "Change\n\u1234", + "\n\nx<@>\u0002gerrit", + serverIdent.getWhen(), + serverIdent.getTimeZone()))); } @Test public void parseStatus() throws Exception { - assertParseSucceeds("Update change\n" - + "\n" - + "Branch: refs/heads/master\n" - + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" - + "Patch-set: 1\n" - + "Status: NEW\n" - + "Subject: This is a test change\n"); - assertParseSucceeds("Update change\n" - + "\n" - + "Branch: refs/heads/master\n" - + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" - + "Patch-set: 1\n" - + "Status: new\n" - + "Subject: This is a test change\n"); - assertParseFails("Update change\n" - + "\n" - + "Patch-set: 1\n" - + "Status: OOPS\n"); - assertParseFails("Update change\n" - + "\n" - + "Patch-set: 1\n" - + "Status: NEW\n" - + "Status: NEW\n"); + assertParseSucceeds( + "Update change\n" + + "\n" + + "Branch: refs/heads/master\n" + + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" + + "Patch-set: 1\n" + + "Status: NEW\n" + + "Subject: This is a test change\n"); + assertParseSucceeds( + "Update change\n" + + "\n" + + "Branch: refs/heads/master\n" + + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" + + "Patch-set: 1\n" + + "Status: new\n" + + "Subject: This is a test change\n"); + assertParseFails("Update change\n" + "\n" + "Patch-set: 1\n" + "Status: OOPS\n"); + assertParseFails( + "Update change\n" + "\n" + "Patch-set: 1\n" + "Status: NEW\n" + "Status: NEW\n"); } @Test public void parsePatchSetId() throws Exception { - assertParseSucceeds("Update change\n" - + "\n" - + "Branch: refs/heads/master\n" - + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" - + "Patch-set: 1\n" - + "Subject: This is a test change\n"); - assertParseFails("Update change\n" - + "\n"); - assertParseFails("Update change\n" - + "\n" - + "Patch-set: 1\n" - + "Patch-set: 1\n"); - assertParseSucceeds("Update change\n" - + "\n" - + "Branch: refs/heads/master\n" - + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" - + "Patch-set: 1\n" - + "Subject: This is a test change\n"); - assertParseFails("Update change\n" - + "\n" - + "Patch-set: x\n"); + assertParseSucceeds( + "Update change\n" + + "\n" + + "Branch: refs/heads/master\n" + + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" + + "Patch-set: 1\n" + + "Subject: This is a test change\n"); + assertParseFails("Update change\n" + "\n"); + assertParseFails("Update change\n" + "\n" + "Patch-set: 1\n" + "Patch-set: 1\n"); + assertParseSucceeds( + "Update change\n" + + "\n" + + "Branch: refs/heads/master\n" + + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" + + "Patch-set: 1\n" + + "Subject: This is a test change\n"); + assertParseFails("Update change\n" + "\n" + "Patch-set: x\n"); } @Test public void parseApproval() throws Exception { - assertParseSucceeds("Update change\n" - + "\n" - + "Branch: refs/heads/master\n" - + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" - + "Patch-set: 1\n" - + "Label: Label1=+1\n" - + "Label: Label2=1\n" - + "Label: Label3=0\n" - + "Label: Label4=-1\n" - + "Subject: This is a test change\n"); - assertParseSucceeds("Update change\n" - + "\n" - + "Branch: refs/heads/master\n" - + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" - + "Patch-set: 1\n" - + "Label: -Label1\n" - + "Label: -Label1 Other Account <2@gerrit>\n" - + "Subject: This is a test change\n"); - assertParseFails("Update change\n" - + "\n" - + "Patch-set: 1\n" - + "Label: Label1=X\n"); - assertParseFails("Update change\n" - + "\n" - + "Patch-set: 1\n" - + "Label: Label1 = 1\n"); - assertParseFails("Update change\n" - + "\n" - + "Patch-set: 1\n" - + "Label: X+Y\n"); - assertParseFails("Update change\n" - + "\n" - + "Patch-set: 1\n" - + "Label: Label1 Other Account <2@gerrit>\n"); - assertParseFails("Update change\n" - + "\n" - + "Patch-set: 1\n" - + "Label: -Label!1\n"); - assertParseFails("Update change\n" - + "\n" - + "Patch-set: 1\n" - + "Label: -Label!1 Other Account <2@gerrit>\n"); + assertParseSucceeds( + "Update change\n" + + "\n" + + "Branch: refs/heads/master\n" + + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" + + "Patch-set: 1\n" + + "Label: Label1=+1\n" + + "Label: Label2=1\n" + + "Label: Label3=0\n" + + "Label: Label4=-1\n" + + "Subject: This is a test change\n"); + assertParseSucceeds( + "Update change\n" + + "\n" + + "Branch: refs/heads/master\n" + + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" + + "Patch-set: 1\n" + + "Label: -Label1\n" + + "Label: -Label1 Other Account <2@gerrit>\n" + + "Subject: This is a test change\n"); + assertParseFails("Update change\n" + "\n" + "Patch-set: 1\n" + "Label: Label1=X\n"); + assertParseFails("Update change\n" + "\n" + "Patch-set: 1\n" + "Label: Label1 = 1\n"); + assertParseFails("Update change\n" + "\n" + "Patch-set: 1\n" + "Label: X+Y\n"); + assertParseFails( + "Update change\n" + "\n" + "Patch-set: 1\n" + "Label: Label1 Other Account <2@gerrit>\n"); + assertParseFails("Update change\n" + "\n" + "Patch-set: 1\n" + "Label: -Label!1\n"); + assertParseFails( + "Update change\n" + "\n" + "Patch-set: 1\n" + "Label: -Label!1 Other Account <2@gerrit>\n"); } @Test public void parseSubmitRecords() throws Exception { - assertParseSucceeds("Update change\n" - + "\n" - + "Branch: refs/heads/master\n" - + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" - + "Patch-set: 1\n" - + "Subject: This is a test change\n" - + "Submitted-with: NOT_READY\n" - + "Submitted-with: OK: Verified: Change Owner <1@gerrit>\n" - + "Submitted-with: NEED: Code-Review\n" - + "Submitted-with: NOT_READY\n" - + "Submitted-with: OK: Verified: Change Owner <1@gerrit>\n" - + "Submitted-with: NEED: Alternative-Code-Review\n"); - assertParseFails("Update change\n" - + "\n" - + "Patch-set: 1\n" - + "Submitted-with: OOPS\n"); - assertParseFails("Update change\n" - + "\n" - + "Patch-set: 1\n" - + "Submitted-with: NEED: X+Y\n"); - assertParseFails("Update change\n" - + "\n" - + "Patch-set: 1\n" - + "Submitted-with: OK: X+Y: Change Owner <1@gerrit>\n"); - assertParseFails("Update change\n" - + "\n" - + "Patch-set: 1\n" - + "Submitted-with: OK: Code-Review: 1@gerrit\n"); + assertParseSucceeds( + "Update change\n" + + "\n" + + "Branch: refs/heads/master\n" + + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" + + "Patch-set: 1\n" + + "Subject: This is a test change\n" + + "Submitted-with: NOT_READY\n" + + "Submitted-with: OK: Verified: Change Owner <1@gerrit>\n" + + "Submitted-with: NEED: Code-Review\n" + + "Submitted-with: NOT_READY\n" + + "Submitted-with: OK: Verified: Change Owner <1@gerrit>\n" + + "Submitted-with: NEED: Alternative-Code-Review\n"); + assertParseFails("Update change\n" + "\n" + "Patch-set: 1\n" + "Submitted-with: OOPS\n"); + assertParseFails("Update change\n" + "\n" + "Patch-set: 1\n" + "Submitted-with: NEED: X+Y\n"); + assertParseFails( + "Update change\n" + + "\n" + + "Patch-set: 1\n" + + "Submitted-with: OK: X+Y: Change Owner <1@gerrit>\n"); + assertParseFails( + "Update change\n" + + "\n" + + "Patch-set: 1\n" + + "Submitted-with: OK: Code-Review: 1@gerrit\n"); } @Test public void parseSubmissionId() throws Exception { - assertParseSucceeds("Update change\n" - + "\n" - + "Branch: refs/heads/master\n" - + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" - + "Patch-set: 1\n" - + "Subject: This is a test change\n" - + "Submission-id: 1-1453387607626-96fabc25"); - assertParseFails("Update change\n" - + "\n" - + "Patch-set: 1\n" - + "Submission-id: 1-1453387607626-96fabc25\n" - + "Submission-id: 1-1453387901516-5d1e2450"); + assertParseSucceeds( + "Update change\n" + + "\n" + + "Branch: refs/heads/master\n" + + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" + + "Patch-set: 1\n" + + "Subject: This is a test change\n" + + "Submission-id: 1-1453387607626-96fabc25"); + assertParseFails( + "Update change\n" + + "\n" + + "Patch-set: 1\n" + + "Submission-id: 1-1453387607626-96fabc25\n" + + "Submission-id: 1-1453387901516-5d1e2450"); } @Test public void parseReviewer() throws Exception { - assertParseSucceeds("Update change\n" - + "\n" - + "Branch: refs/heads/master\n" - + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" - + "Patch-set: 1\n" - + "Reviewer: Change Owner <1@gerrit>\n" - + "CC: Other Account <2@gerrit>\n" - + "Subject: This is a test change\n"); - assertParseFails("Update change\n" - + "\n" - + "Patch-set: 1\n" - + "Reviewer: 1@gerrit\n"); + assertParseSucceeds( + "Update change\n" + + "\n" + + "Branch: refs/heads/master\n" + + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" + + "Patch-set: 1\n" + + "Reviewer: Change Owner <1@gerrit>\n" + + "CC: Other Account <2@gerrit>\n" + + "Subject: This is a test change\n"); + assertParseFails("Update change\n" + "\n" + "Patch-set: 1\n" + "Reviewer: 1@gerrit\n"); } @Test public void parseTopic() throws Exception { - assertParseSucceeds("Update change\n" - + "\n" - + "Branch: refs/heads/master\n" - + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" - + "Patch-set: 1\n" - + "Topic: Some Topic\n" - + "Subject: This is a test change\n"); - assertParseSucceeds("Update change\n" - + "\n" - + "Branch: refs/heads/master\n" - + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" - + "Patch-set: 1\n" - + "Topic:\n" - + "Subject: This is a test change\n"); - assertParseFails("Update change\n" - + "\n" - + "Patch-set: 1\n" - + "Topic: Some Topic\n" - + "Topic: Other Topic"); + assertParseSucceeds( + "Update change\n" + + "\n" + + "Branch: refs/heads/master\n" + + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" + + "Patch-set: 1\n" + + "Topic: Some Topic\n" + + "Subject: This is a test change\n"); + assertParseSucceeds( + "Update change\n" + + "\n" + + "Branch: refs/heads/master\n" + + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" + + "Patch-set: 1\n" + + "Topic:\n" + + "Subject: This is a test change\n"); + assertParseFails( + "Update change\n" + "\n" + "Patch-set: 1\n" + "Topic: Some Topic\n" + "Topic: Other Topic"); } @Test public void parseBranch() throws Exception { - assertParseSucceeds("Update change\n" - + "\n" - + "Branch: refs/heads/master\n" - + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" - + "Patch-set: 1\n" - + "Subject: This is a test change\n"); - assertParseSucceeds("Update change\n" - + "\n" - + "Branch: master\n" - + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" - + "Patch-set: 1\n" - + "Subject: This is a test change\n"); - assertParseFails("Update change\n" - + "\n" - + "Patch-set: 1\n" - + "Branch: refs/heads/master\n" - + "Branch: refs/heads/stable"); + assertParseSucceeds( + "Update change\n" + + "\n" + + "Branch: refs/heads/master\n" + + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" + + "Patch-set: 1\n" + + "Subject: This is a test change\n"); + assertParseSucceeds( + "Update change\n" + + "\n" + + "Branch: master\n" + + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" + + "Patch-set: 1\n" + + "Subject: This is a test change\n"); + assertParseFails( + "Update change\n" + + "\n" + + "Patch-set: 1\n" + + "Branch: refs/heads/master\n" + + "Branch: refs/heads/stable"); } @Test public void parseChangeId() throws Exception { - assertParseSucceeds("Update change\n" - + "\n" - + "Branch: refs/heads/master\n" - + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" - + "Patch-set: 1\n" - + "Subject: This is a test change\n"); - assertParseFails("Update change\n" - + "\n" - + "Patch-set: 1\n" - + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" - + "Change-id: I159532ef4844d7c18f7f3fd37a0b275590d41b1b"); + assertParseSucceeds( + "Update change\n" + + "\n" + + "Branch: refs/heads/master\n" + + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" + + "Patch-set: 1\n" + + "Subject: This is a test change\n"); + assertParseFails( + "Update change\n" + + "\n" + + "Patch-set: 1\n" + + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" + + "Change-id: I159532ef4844d7c18f7f3fd37a0b275590d41b1b"); } @Test public void parseSubject() throws Exception { - assertParseSucceeds("Update change\n" - + "\n" - + "Patch-set: 1\n" - + "Branch: refs/heads/master\n" - + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" - + "Subject: Some subject of a change\n"); - assertParseFails("Update change\n" - + "\n" - + "Patch-set: 1\n" - + "Subject: Some subject of a change\n" - + "Subject: Some other subject\n"); + assertParseSucceeds( + "Update change\n" + + "\n" + + "Patch-set: 1\n" + + "Branch: refs/heads/master\n" + + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" + + "Subject: Some subject of a change\n"); + assertParseFails( + "Update change\n" + + "\n" + + "Patch-set: 1\n" + + "Subject: Some subject of a change\n" + + "Subject: Some other subject\n"); } @Test public void parseCommit() throws Exception { - assertParseSucceeds("Update change\n" - + "\n" - + "Patch-set: 2\n" - + "Branch: refs/heads/master\n" - + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" - + "Subject: Some subject of a change\n" - + "Commit: abcd1234abcd1234abcd1234abcd1234abcd1234"); - assertParseFails("Update change\n" - + "\n" - + "Patch-set: 2\n" - + "Branch: refs/heads/master\n" - + "Subject: Some subject of a change\n" - + "Commit: abcd1234abcd1234abcd1234abcd1234abcd1234\n" - + "Commit: deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"); - assertParseFails("Update patch set 1\n" - + "Uploaded patch set 1.\n" - + "Patch-set: 2\n" - + "Branch: refs/heads/master\n" - + "Subject: Some subject of a change\n" - + "Commit: beef"); + assertParseSucceeds( + "Update change\n" + + "\n" + + "Patch-set: 2\n" + + "Branch: refs/heads/master\n" + + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" + + "Subject: Some subject of a change\n" + + "Commit: abcd1234abcd1234abcd1234abcd1234abcd1234"); + assertParseFails( + "Update change\n" + + "\n" + + "Patch-set: 2\n" + + "Branch: refs/heads/master\n" + + "Subject: Some subject of a change\n" + + "Commit: abcd1234abcd1234abcd1234abcd1234abcd1234\n" + + "Commit: deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"); + assertParseFails( + "Update patch set 1\n" + + "Uploaded patch set 1.\n" + + "Patch-set: 2\n" + + "Branch: refs/heads/master\n" + + "Subject: Some subject of a change\n" + + "Commit: beef"); } @Test public void parsePatchSetState() throws Exception { - assertParseSucceeds("Update change\n" - + "\n" - + "Patch-set: 1 (PUBLISHED)\n" - + "Branch: refs/heads/master\n" - + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" - + "Subject: Some subject of a change\n"); - assertParseSucceeds("Update change\n" - + "\n" - + "Patch-set: 1 (DRAFT)\n" - + "Branch: refs/heads/master\n" - + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" - + "Subject: Some subject of a change\n"); - assertParseSucceeds("Update change\n" - + "\n" - + "Patch-set: 1 (DELETED)\n" - + "Branch: refs/heads/master\n" - + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" - + "Subject: Some subject of a change\n"); - assertParseFails("Update change\n" - + "\n" - + "Patch-set: 1 (NOT A STATUS)\n" - + "Branch: refs/heads/master\n" - + "Subject: Some subject of a change\n"); + assertParseSucceeds( + "Update change\n" + + "\n" + + "Patch-set: 1 (PUBLISHED)\n" + + "Branch: refs/heads/master\n" + + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" + + "Subject: Some subject of a change\n"); + assertParseSucceeds( + "Update change\n" + + "\n" + + "Patch-set: 1 (DRAFT)\n" + + "Branch: refs/heads/master\n" + + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" + + "Subject: Some subject of a change\n"); + assertParseSucceeds( + "Update change\n" + + "\n" + + "Patch-set: 1 (DELETED)\n" + + "Branch: refs/heads/master\n" + + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" + + "Subject: Some subject of a change\n"); + assertParseFails( + "Update change\n" + + "\n" + + "Patch-set: 1 (NOT A STATUS)\n" + + "Branch: refs/heads/master\n" + + "Subject: Some subject of a change\n"); } @Test public void parsePatchSetGroups() throws Exception { - assertParseSucceeds("Update change\n" - + "\n" - + "Patch-set: 2\n" - + "Branch: refs/heads/master\n" - + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" - + "Commit: abcd1234abcd1234abcd1234abcd1234abcd1234\n" - + "Subject: Change subject\n" - + "Groups: a,b,c\n"); - assertParseFails("Update change\n" - + "\n" - + "Patch-set: 2\n" - + "Branch: refs/heads/master\n" - + "Commit: abcd1234abcd1234abcd1234abcd1234abcd1234\n" - + "Subject: Change subject\n" - + "Groups: a,b,c\n" - + "Groups: d,e,f\n"); + assertParseSucceeds( + "Update change\n" + + "\n" + + "Patch-set: 2\n" + + "Branch: refs/heads/master\n" + + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" + + "Commit: abcd1234abcd1234abcd1234abcd1234abcd1234\n" + + "Subject: Change subject\n" + + "Groups: a,b,c\n"); + assertParseFails( + "Update change\n" + + "\n" + + "Patch-set: 2\n" + + "Branch: refs/heads/master\n" + + "Commit: abcd1234abcd1234abcd1234abcd1234abcd1234\n" + + "Subject: Change subject\n" + + "Groups: a,b,c\n" + + "Groups: d,e,f\n"); } @Test public void parseServerIdent() throws Exception { - String msg = "Update change\n" - + "\n" - + "Patch-set: 1\n" - + "Branch: refs/heads/master\n" - + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" - + "Subject: Change subject\n"; + String msg = + "Update change\n" + + "\n" + + "Patch-set: 1\n" + + "Branch: refs/heads/master\n" + + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" + + "Subject: Change subject\n"; assertParseSucceeds(msg); assertParseSucceeds(writeCommit(msg, serverIdent)); - msg = "Update change\n" - + "\n" - + "With a message." - + "\n" - + "Patch-set: 1\n" - + "Branch: refs/heads/master\n" - + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" - + "Subject: Change subject\n"; + msg = + "Update change\n" + + "\n" + + "With a message." + + "\n" + + "Patch-set: 1\n" + + "Branch: refs/heads/master\n" + + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" + + "Subject: Change subject\n"; assertParseSucceeds(msg); assertParseSucceeds(writeCommit(msg, serverIdent)); - msg = "Update change\n" - + "\n" - + "Patch-set: 1\n" - + "Branch: refs/heads/master\n" - + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" - + "Subject: Change subject\n" - + "Label: Label1=+1\n"; + msg = + "Update change\n" + + "\n" + + "Patch-set: 1\n" + + "Branch: refs/heads/master\n" + + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" + + "Subject: Change subject\n" + + "Label: Label1=+1\n"; assertParseSucceeds(msg); assertParseFails(writeCommit(msg, serverIdent)); } @Test public void parseTag() throws Exception { - assertParseSucceeds("Update change\n" - + "\n" - + "Patch-set: 1\n" - + "Branch: refs/heads/master\n" - + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" - + "Subject: Change subject\n" - + "Tag:\n"); - assertParseSucceeds("Update change\n" - + "\n" - + "Patch-set: 1\n" - + "Branch: refs/heads/master\n" - + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" - + "Subject: Change subject\n" - + "Tag: jenkins\n"); - assertParseFails("Update change\n" - + "\n" - + "Patch-set: 1\n" - + "Branch: refs/heads/master\n" - + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" - + "Subject: Change subject\n" - + "Tag: ci\n" - + "Tag: jenkins\n"); + assertParseSucceeds( + "Update change\n" + + "\n" + + "Patch-set: 1\n" + + "Branch: refs/heads/master\n" + + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" + + "Subject: Change subject\n" + + "Tag:\n"); + assertParseSucceeds( + "Update change\n" + + "\n" + + "Patch-set: 1\n" + + "Branch: refs/heads/master\n" + + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" + + "Subject: Change subject\n" + + "Tag: jenkins\n"); + assertParseFails( + "Update change\n" + + "\n" + + "Patch-set: 1\n" + + "Branch: refs/heads/master\n" + + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n" + + "Subject: Change subject\n" + + "Tag: ci\n" + + "Tag: jenkins\n"); } @Test public void caseInsensitiveFooters() throws Exception { - assertParseSucceeds("Update change\n" - + "\n" - + "BRaNch: refs/heads/master\n" - + "Change-ID: I577fb248e474018276351785930358ec0450e9f7\n" - + "patcH-set: 1\n" - + "subject: This is a test change\n"); + assertParseSucceeds( + "Update change\n" + + "\n" + + "BRaNch: refs/heads/master\n" + + "Change-ID: I577fb248e474018276351785930358ec0450e9f7\n" + + "patcH-set: 1\n" + + "subject: This is a test change\n"); } @Test public void currentPatchSet() throws Exception { - assertParseSucceeds("Update change\n" - + "\n" - + "Patch-set: 1\n" - + "Current: true"); - assertParseSucceeds("Update change\n" - + "\n" - + "Patch-set: 1\n" - + "Current: tRUe"); - assertParseFails("Update change\n" - + "\n" - + "Patch-set: 1\n" - + "Current: false"); - assertParseFails("Update change\n" - + "\n" - + "Patch-set: 1\n" - + "Current: blah"); + assertParseSucceeds("Update change\n" + "\n" + "Patch-set: 1\n" + "Current: true"); + assertParseSucceeds("Update change\n" + "\n" + "Patch-set: 1\n" + "Current: tRUe"); + assertParseFails("Update change\n" + "\n" + "Patch-set: 1\n" + "Current: false"); + assertParseFails("Update change\n" + "\n" + "Patch-set: 1\n" + "Current: blah"); } private RevCommit writeCommit(String body) throws Exception { ChangeNoteUtil noteUtil = injector.getInstance(ChangeNoteUtil.class); - return writeCommit(body, noteUtil.newIdent( - changeOwner.getAccount(), TimeUtil.nowTs(), serverIdent, - "Anonymous Coward")); + return writeCommit( + body, + noteUtil.newIdent( + changeOwner.getAccount(), TimeUtil.nowTs(), serverIdent, "Anonymous Coward")); } - private RevCommit writeCommit(String body, PersonIdent author) - throws Exception { + private RevCommit writeCommit(String body, PersonIdent author) throws Exception { Change change = newChange(); ChangeNotes notes = newNotes(change).load(); try (ObjectInserter ins = testRepo.getRepository().newObjectInserter()) { @@ -518,7 +509,6 @@ public class ChangeNotesParserTest extends AbstractChangeNotesTest { private ChangeNotesParser newParser(ObjectId tip) throws Exception { walk.reset(); ChangeNoteUtil noteUtil = injector.getInstance(ChangeNoteUtil.class); - return new ChangeNotesParser( - newChange().getId(), tip, walk, noteUtil, args.metrics); + return new ChangeNotesParser(newChange().getId(), tip, walk, noteUtil, args.metrics); } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesTest.java index 3d7abb05ce..a4990c1ad2 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesTest.java @@ -53,7 +53,11 @@ import com.google.gerrit.server.util.RequestId; import com.google.gerrit.testutil.TestChanges; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectId; @@ -65,21 +69,12 @@ import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; import org.junit.Test; -import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; - public class ChangeNotesTest extends AbstractChangeNotesTest { - @Inject - private DraftCommentNotes.Factory draftNotesFactory; + @Inject private DraftCommentNotes.Factory draftNotesFactory; - @Inject - private ChangeNoteUtil noteUtil; + @Inject private ChangeNoteUtil noteUtil; - @Inject - private @GerritServerId String serverId; + @Inject private @GerritServerId String serverId; @Test public void tagChangeMessage() throws Exception { @@ -105,8 +100,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { update.commit(); ChangeNotes notes = newNotes(c); - assertThat(notes.getCurrentPatchSet().getDescription()) - .isEqualTo(description); + assertThat(notes.getCurrentPatchSet().getDescription()).isEqualTo(description); description = "new, now more descriptive!"; update = newUpdate(c, changeOwner); @@ -114,8 +108,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { update.commit(); notes = newNotes(c); - assertThat(notes.getCurrentPatchSet().getDescription()) - .isEqualTo(description); + assertThat(notes.getCurrentPatchSet().getDescription()).isEqualTo(description); } @Test @@ -124,10 +117,21 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { Change c = newChange(); RevCommit commit = tr.commit().message("PS2").create(); ChangeUpdate update = newUpdate(c, changeOwner); - update.putComment(Status.PUBLISHED, - newComment(c.currentPatchSetId(), "a.txt", "uuid1", - new CommentRange(1, 2, 3, 4), 1, changeOwner, null, - TimeUtil.nowTs(), "Comment", (short) 1, commit.name(), false)); + update.putComment( + Status.PUBLISHED, + newComment( + c.currentPatchSetId(), + "a.txt", + "uuid1", + new CommentRange(1, 2, 3, 4), + 1, + changeOwner, + null, + TimeUtil.nowTs(), + "Comment", + (short) 1, + commit.name(), + false)); update.setTag(tag); update.commit(); @@ -135,9 +139,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { ImmutableListMultimap comments = notes.getComments(); assertThat(comments).hasSize(1); - assertThat( - comments.entries().asList().get(0).getValue().tag) - .isEqualTo(tag); + assertThat(comments.entries().asList().get(0).getValue().tag).isEqualTo(tag); } @Test @@ -157,11 +159,9 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { ChangeNotes notes = newNotes(c); - ImmutableListMultimap approvals = - notes.getApprovals(); + ImmutableListMultimap approvals = notes.getApprovals(); assertThat(approvals).hasSize(1); - assertThat(approvals.entries().asList().get(0).getValue().getTag()) - .isEqualTo(tag2); + assertThat(approvals.entries().asList().get(0).getValue().getTag()).isEqualTo(tag2); } @Test @@ -179,10 +179,21 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { RevCommit commit = tr.commit().message("PS2").create(); update = newUpdate(c, changeOwner); - update.putComment(Status.PUBLISHED, - newComment(c.currentPatchSetId(), "a.txt", "uuid1", - new CommentRange(1, 2, 3, 4), 1, changeOwner, null, - TimeUtil.nowTs(), "Comment", (short) 1, commit.name(), false)); + update.putComment( + Status.PUBLISHED, + newComment( + c.currentPatchSetId(), + "a.txt", + "uuid1", + new CommentRange(1, 2, 3, 4), + 1, + changeOwner, + null, + TimeUtil.nowTs(), + "Comment", + (short) 1, + commit.name(), + false)); update.setChangeMessage("coverage verification"); update.setTag(coverageTag); update.commit(); @@ -194,8 +205,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { ChangeNotes notes = newNotes(c); - ImmutableListMultimap approvals = - notes.getApprovals(); + ImmutableListMultimap approvals = notes.getApprovals(); assertThat(approvals).hasSize(1); PatchSetApproval approval = approvals.entries().asList().get(0).getValue(); assertThat(approval.getTag()).isEqualTo(integrationTag); @@ -203,8 +213,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { ImmutableListMultimap comments = notes.getComments(); assertThat(comments).hasSize(1); - assertThat(comments.entries().asList().get(0).getValue().tag) - .isEqualTo(coverageTag); + assertThat(comments.entries().asList().get(0).getValue().tag).isEqualTo(coverageTag); ImmutableList messages = notes.getChangeMessages(); assertThat(messages).hasSize(3); @@ -222,10 +231,8 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { update.commit(); ChangeNotes notes = newNotes(c); - assertThat(notes.getApprovals().keySet()) - .containsExactly(c.currentPatchSetId()); - List psas = - notes.getApprovals().get(c.currentPatchSetId()); + assertThat(notes.getApprovals().keySet()).containsExactly(c.currentPatchSetId()); + List psas = notes.getApprovals().get(c.currentPatchSetId()); assertThat(psas).hasSize(2); assertThat(psas.get(0).getPatchSetId()).isEqualTo(c.currentPatchSetId()); @@ -282,8 +289,8 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { update.commit(); ChangeNotes notes = newNotes(c); - PatchSetApproval psa = Iterables.getOnlyElement( - notes.getApprovals().get(c.currentPatchSetId())); + PatchSetApproval psa = + Iterables.getOnlyElement(notes.getApprovals().get(c.currentPatchSetId())); assertThat(psa.getLabel()).isEqualTo("Code-Review"); assertThat(psa.getValue()).isEqualTo((short) -1); @@ -292,8 +299,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { update.commit(); notes = newNotes(c); - psa = Iterables.getOnlyElement( - notes.getApprovals().get(c.currentPatchSetId())); + psa = Iterables.getOnlyElement(notes.getApprovals().get(c.currentPatchSetId())); assertThat(psa.getLabel()).isEqualTo("Code-Review"); assertThat(psa.getValue()).isEqualTo((short) 1); } @@ -310,10 +316,8 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { update.commit(); ChangeNotes notes = newNotes(c); - assertThat(notes.getApprovals().keySet()) - .containsExactly(c.currentPatchSetId()); - List psas = - notes.getApprovals().get(c.currentPatchSetId()); + assertThat(notes.getApprovals().keySet()).containsExactly(c.currentPatchSetId()); + List psas = notes.getApprovals().get(c.currentPatchSetId()); assertThat(psas).hasSize(2); assertThat(psas.get(0).getPatchSetId()).isEqualTo(c.currentPatchSetId()); @@ -337,8 +341,8 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { update.commit(); ChangeNotes notes = newNotes(c); - PatchSetApproval psa = Iterables.getOnlyElement( - notes.getApprovals().get(c.currentPatchSetId())); + PatchSetApproval psa = + Iterables.getOnlyElement(notes.getApprovals().get(c.currentPatchSetId())); assertThat(psa.getAccountId().get()).isEqualTo(1); assertThat(psa.getLabel()).isEqualTo("Not-For-Long"); assertThat(psa.getValue()).isEqualTo((short) 1); @@ -348,10 +352,11 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { update.commit(); notes = newNotes(c); - assertThat(notes.getApprovals()).containsExactlyEntriesIn( - ImmutableListMultimap.of( - psa.getPatchSetId(), - new PatchSetApproval(psa.getKey(), (short) 0, update.getWhen()))); + assertThat(notes.getApprovals()) + .containsExactlyEntriesIn( + ImmutableListMultimap.of( + psa.getPatchSetId(), + new PatchSetApproval(psa.getKey(), (short) 0, update.getWhen()))); } @Test @@ -362,8 +367,8 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { update.commit(); ChangeNotes notes = newNotes(c); - PatchSetApproval psa = Iterables.getOnlyElement( - notes.getApprovals().get(c.currentPatchSetId())); + PatchSetApproval psa = + Iterables.getOnlyElement(notes.getApprovals().get(c.currentPatchSetId())); assertThat(psa.getAccountId()).isEqualTo(otherUserId); assertThat(psa.getLabel()).isEqualTo("Not-For-Long"); assertThat(psa.getValue()).isEqualTo((short) 1); @@ -373,10 +378,11 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { update.commit(); notes = newNotes(c); - assertThat(notes.getApprovals()).containsExactlyEntriesIn( - ImmutableListMultimap.of( - psa.getPatchSetId(), - new PatchSetApproval(psa.getKey(), (short) 0, update.getWhen()))); + assertThat(notes.getApprovals()) + .containsExactlyEntriesIn( + ImmutableListMultimap.of( + psa.getPatchSetId(), + new PatchSetApproval(psa.getKey(), (short) 0, update.getWhen()))); // Add back approval on same label. update = newUpdate(c, otherUser); @@ -384,8 +390,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { update.commit(); notes = newNotes(c); - psa = Iterables.getOnlyElement( - notes.getApprovals().get(c.currentPatchSetId())); + psa = Iterables.getOnlyElement(notes.getApprovals().get(c.currentPatchSetId())); assertThat(psa.getAccountId()).isEqualTo(otherUserId); assertThat(psa.getLabel()).isEqualTo("Not-For-Long"); assertThat(psa.getValue()).isEqualTo((short) 2); @@ -400,18 +405,17 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { update.commit(); ChangeNotes notes = newNotes(c); - List approvals = ReviewDbUtil.intKeyOrdering() - .onResultOf(PatchSetApproval::getAccountId) - .sortedCopy(notes.getApprovals().get(c.currentPatchSetId())); + List approvals = + ReviewDbUtil.intKeyOrdering() + .onResultOf(PatchSetApproval::getAccountId) + .sortedCopy(notes.getApprovals().get(c.currentPatchSetId())); assertThat(approvals).hasSize(2); - assertThat(approvals.get(0).getAccountId()) - .isEqualTo(changeOwner.getAccountId()); + assertThat(approvals.get(0).getAccountId()).isEqualTo(changeOwner.getAccountId()); assertThat(approvals.get(0).getLabel()).isEqualTo("Code-Review"); assertThat(approvals.get(0).getValue()).isEqualTo((short) 1); - assertThat(approvals.get(1).getAccountId()) - .isEqualTo(otherUser.getAccountId()); + assertThat(approvals.get(1).getAccountId()).isEqualTo(otherUser.getAccountId()); assertThat(approvals.get(1).getLabel()).isEqualTo("Code-Review"); assertThat(approvals.get(1).getValue()).isEqualTo((short) -1); } @@ -426,10 +430,14 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { update.commit(); update = newUpdate(c, changeOwner); - update.merge(submissionId, ImmutableList.of( - submitRecord("NOT_READY", null, - submitLabel("Verified", "OK", changeOwner.getAccountId()), - submitLabel("Code-Review", "NEED", null)))); + update.merge( + submissionId, + ImmutableList.of( + submitRecord( + "NOT_READY", + null, + submitLabel("Verified", "OK", changeOwner.getAccountId()), + submitLabel("Code-Review", "NEED", null)))); update.commit(); update = newUpdate(c, changeOwner); @@ -437,8 +445,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { update.commit(); ChangeNotes notes = newNotes(c); - List approvals = - Lists.newArrayList(notes.getApprovals().values()); + List approvals = Lists.newArrayList(notes.getApprovals().values()); assertThat(approvals).hasSize(2); assertThat(approvals.get(0).getLabel()).isEqualTo("Verified"); assertThat(approvals.get(0).getValue()).isEqualTo((short) 1); @@ -460,10 +467,14 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { Account.Id ownerId = changeOwner.getAccountId(); Account.Id otherId = otherUser.getAccountId(); update = newUpdate(c, otherUser); - update.merge(submissionId, ImmutableList.of( - submitRecord("NOT_READY", null, - submitLabel("Verified", "OK", ownerId), - submitLabel("Code-Review", "NEED", null)))); + update.merge( + submissionId, + ImmutableList.of( + submitRecord( + "NOT_READY", + null, + submitLabel("Verified", "OK", ownerId), + submitLabel("Code-Review", "NEED", null)))); update.putApproval("Other-Label", (short) 1); update.putApprovalFor(ownerId, "Code-Review", (short) 2); update.commit(); @@ -474,8 +485,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { ChangeNotes notes = newNotes(c); - List approvals = - Lists.newArrayList(notes.getApprovals().values()); + List approvals = Lists.newArrayList(notes.getApprovals().values()); assertThat(approvals).hasSize(3); assertThat(approvals.get(0).getAccountId()).isEqualTo(ownerId); assertThat(approvals.get(0).getLabel()).isEqualTo("Verified"); @@ -501,11 +511,13 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { ChangeNotes notes = newNotes(c); Timestamp ts = new Timestamp(update.getWhen().getTime()); - assertThat(notes.getReviewers()).isEqualTo(ReviewerSet.fromTable( - ImmutableTable.builder() - .put(REVIEWER, new Account.Id(1), ts) - .put(REVIEWER, new Account.Id(2), ts) - .build())); + assertThat(notes.getReviewers()) + .isEqualTo( + ReviewerSet.fromTable( + ImmutableTable.builder() + .put(REVIEWER, new Account.Id(1), ts) + .put(REVIEWER, new Account.Id(2), ts) + .build())); } @Test @@ -518,11 +530,13 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { ChangeNotes notes = newNotes(c); Timestamp ts = new Timestamp(update.getWhen().getTime()); - assertThat(notes.getReviewers()).isEqualTo(ReviewerSet.fromTable( - ImmutableTable.builder() - .put(REVIEWER, new Account.Id(1), ts) - .put(CC, new Account.Id(2), ts) - .build())); + assertThat(notes.getReviewers()) + .isEqualTo( + ReviewerSet.fromTable( + ImmutableTable.builder() + .put(REVIEWER, new Account.Id(1), ts) + .put(CC, new Account.Id(2), ts) + .build())); } @Test @@ -534,8 +548,8 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { ChangeNotes notes = newNotes(c); Timestamp ts = new Timestamp(update.getWhen().getTime()); - assertThat(notes.getReviewers()).isEqualTo(ReviewerSet.fromTable( - ImmutableTable.of(REVIEWER, new Account.Id(2), ts))); + assertThat(notes.getReviewers()) + .isEqualTo(ReviewerSet.fromTable(ImmutableTable.of(REVIEWER, new Account.Id(2), ts))); update = newUpdate(c, otherUser); update.putReviewer(otherUser.getAccount().getId(), CC); @@ -543,8 +557,8 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { notes = newNotes(c); ts = new Timestamp(update.getWhen().getTime()); - assertThat(notes.getReviewers()).isEqualTo(ReviewerSet.fromTable( - ImmutableTable.of(CC, new Account.Id(2), ts))); + assertThat(notes.getReviewers()) + .isEqualTo(ReviewerSet.fromTable(ImmutableTable.of(CC, new Account.Id(2), ts))); } @Test @@ -563,13 +577,10 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { update.commit(); ChangeNotes notes = newNotes(c); - List psas = - notes.getApprovals().get(c.currentPatchSetId()); + List psas = notes.getApprovals().get(c.currentPatchSetId()); assertThat(psas).hasSize(2); - assertThat(psas.get(0).getAccountId()) - .isEqualTo(changeOwner.getAccount().getId()); - assertThat(psas.get(1).getAccountId()) - .isEqualTo(otherUser.getAccount().getId()); + assertThat(psas.get(0).getAccountId()).isEqualTo(changeOwner.getAccount().getId()); + assertThat(psas.get(1).getAccountId()).isEqualTo(otherUser.getAccount().getId()); update = newUpdate(c, changeOwner); update.removeReviewer(otherUser.getAccount().getId()); @@ -578,8 +589,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { notes = newNotes(c); psas = notes.getApprovals().get(c.currentPatchSetId()); assertThat(psas).hasSize(1); - assertThat(psas.get(0).getAccountId()) - .isEqualTo(changeOwner.getAccount().getId()); + assertThat(psas.get(0).getAccountId()).isEqualTo(changeOwner.getAccount().getId()); } @Test @@ -589,28 +599,39 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { ChangeUpdate update = newUpdate(c, changeOwner); update.setSubjectForCommit("Submit patch set 1"); - update.merge(submissionId, ImmutableList.of( - submitRecord("NOT_READY", null, - submitLabel("Verified", "OK", changeOwner.getAccountId()), - submitLabel("Code-Review", "NEED", null)), - submitRecord("NOT_READY", null, - submitLabel("Verified", "OK", changeOwner.getAccountId()), - submitLabel("Alternative-Code-Review", "NEED", null)))); + update.merge( + submissionId, + ImmutableList.of( + submitRecord( + "NOT_READY", + null, + submitLabel("Verified", "OK", changeOwner.getAccountId()), + submitLabel("Code-Review", "NEED", null)), + submitRecord( + "NOT_READY", + null, + submitLabel("Verified", "OK", changeOwner.getAccountId()), + submitLabel("Alternative-Code-Review", "NEED", null)))); update.commit(); ChangeNotes notes = newNotes(c); List recs = notes.getSubmitRecords(); assertThat(recs).hasSize(2); - assertThat(recs.get(0)).isEqualTo( - submitRecord("NOT_READY", null, - submitLabel("Verified", "OK", changeOwner.getAccountId()), - submitLabel("Code-Review", "NEED", null))); - assertThat(recs.get(1)).isEqualTo( - submitRecord("NOT_READY", null, - submitLabel("Verified", "OK", changeOwner.getAccountId()), - submitLabel("Alternative-Code-Review", "NEED", null))); - assertThat(notes.getChange().getSubmissionId()) - .isEqualTo(submissionId.toStringForStorage()); + assertThat(recs.get(0)) + .isEqualTo( + submitRecord( + "NOT_READY", + null, + submitLabel("Verified", "OK", changeOwner.getAccountId()), + submitLabel("Code-Review", "NEED", null))); + assertThat(recs.get(1)) + .isEqualTo( + submitRecord( + "NOT_READY", + null, + submitLabel("Verified", "OK", changeOwner.getAccountId()), + submitLabel("Alternative-Code-Review", "NEED", null))); + assertThat(notes.getChange().getSubmissionId()).isEqualTo(submissionId.toStringForStorage()); } @Test @@ -619,25 +640,27 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { RequestId submissionId = RequestId.forChange(c); ChangeUpdate update = newUpdate(c, changeOwner); update.setSubjectForCommit("Submit patch set 1"); - update.merge(submissionId, ImmutableList.of( - submitRecord("OK", null, - submitLabel("Code-Review", "OK", otherUser.getAccountId())))); + update.merge( + submissionId, + ImmutableList.of( + submitRecord("OK", null, submitLabel("Code-Review", "OK", otherUser.getAccountId())))); update.commit(); incrementPatchSet(c); update = newUpdate(c, changeOwner); update.setSubjectForCommit("Submit patch set 2"); - update.merge(submissionId, ImmutableList.of( - submitRecord("OK", null, - submitLabel("Code-Review", "OK", changeOwner.getAccountId())))); + update.merge( + submissionId, + ImmutableList.of( + submitRecord( + "OK", null, submitLabel("Code-Review", "OK", changeOwner.getAccountId())))); update.commit(); ChangeNotes notes = newNotes(c); - assertThat(notes.getSubmitRecords()).containsExactly( - submitRecord("OK", null, - submitLabel("Code-Review", "OK", changeOwner.getAccountId()))); - assertThat(notes.getChange().getSubmissionId()) - .isEqualTo(submissionId.toStringForStorage()); + assertThat(notes.getSubmitRecords()) + .containsExactly( + submitRecord("OK", null, submitLabel("Code-Review", "OK", changeOwner.getAccountId()))); + assertThat(notes.getChange().getSubmissionId()).isEqualTo(submissionId.toStringForStorage()); } @Test @@ -665,15 +688,8 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { try (RevWalk rw = new RevWalk(repo)) { RevCommit commit = rw.parseCommit(update.getResult()); rw.parseBody(commit); - String strIdent = - otherUser.getName() - + " <" - + otherUserId - + "@" - + serverId - + ">"; - assertThat(commit.getFullMessage()) - .contains("Assignee: " + strIdent); + String strIdent = otherUser.getName() + " <" + otherUserId + "@" + serverId + ">"; + assertThat(commit.getFullMessage()).contains("Assignee: " + strIdent); } } @@ -692,8 +708,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { update.commit(); notes = newNotes(c); - assertThat(notes.getChange().getAssignee()) - .isEqualTo(changeOwner.getAccountId()); + assertThat(notes.getChange().getAssignee()).isEqualTo(changeOwner.getAccountId()); } @Test @@ -807,8 +822,11 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { String otherChangeId = "I577fb248e474018276351785930358ec0450e9f7"; update = newUpdate(c, changeOwner); exception.expect(IllegalArgumentException.class); - exception.expectMessage("The Change-Id was already set to " + c.getKey() - + ", so we cannot set this Change-Id: " + otherChangeId); + exception.expectMessage( + "The Change-Id was already set to " + + c.getKey() + + ", so we cannot set this Change-Id: " + + otherChangeId); update.setChangeId(otherChangeId); } @@ -817,8 +835,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { Change c = newChange(); ChangeNotes notes = newNotes(c); - Branch.NameKey expectedBranch = - new Branch.NameKey(project, "refs/heads/master"); + Branch.NameKey expectedBranch = new Branch.NameKey(project, "refs/heads/master"); assertThat(notes.getChange().getDest()).isEqualTo(expectedBranch); // An update doesn't affect the branch @@ -832,23 +849,21 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { update = newUpdate(c, changeOwner); update.setBranch(otherBranch); update.commit(); - assertThat(newNotes(c).getChange().getDest()).isEqualTo( - new Branch.NameKey(project, otherBranch)); + assertThat(newNotes(c).getChange().getDest()) + .isEqualTo(new Branch.NameKey(project, otherBranch)); } @Test public void ownerChangeNotes() throws Exception { Change c = newChange(); - assertThat(newNotes(c).getChange().getOwner()).isEqualTo( - changeOwner.getAccountId()); + assertThat(newNotes(c).getChange().getOwner()).isEqualTo(changeOwner.getAccountId()); // An update doesn't affect the owner ChangeUpdate update = newUpdate(c, otherUser); update.setTopic("topic"); // Change something to get a new commit. update.commit(); - assertThat(newNotes(c).getChange().getOwner()).isEqualTo( - changeOwner.getAccountId()); + assertThat(newNotes(c).getChange().getOwner()).isEqualTo(changeOwner.getAccountId()); } @Test @@ -922,10 +937,14 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { // Finish off by merging the change. update = newUpdate(c, changeOwner); - update.merge(RequestId.forChange(c), ImmutableList.of( - submitRecord("NOT_READY", null, - submitLabel("Verified", "OK", changeOwner.getAccountId()), - submitLabel("Alternative-Code-Review", "NEED", null)))); + update.merge( + RequestId.forChange(c), + ImmutableList.of( + submitRecord( + "NOT_READY", + null, + submitLabel("Verified", "OK", changeOwner.getAccountId()), + submitLabel("Alternative-Code-Review", "NEED", null)))); update.commit(); Timestamp ts10 = newNotes(c).getChange().getLastUpdatedOn(); assertThat(ts10).isGreaterThan(ts9); @@ -935,8 +954,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { public void subjectLeadingWhitespaceChangeNotes() throws Exception { Change c = TestChanges.newChange(project, changeOwner.getAccountId()); String trimmedSubj = c.getSubject(); - c.setCurrentPatchSet(c.currentPatchSetId(), " " + trimmedSubj, - c.getOriginalSubject()); + c.setCurrentPatchSet(c.currentPatchSetId(), " " + trimmedSubj, c.getOriginalSubject()); ChangeUpdate update = newUpdate(c, changeOwner); update.setChangeId(c.getKey().get()); update.setBranch(c.getDest().get()); @@ -948,8 +966,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { String tabSubj = "\t\t" + trimmedSubj; c = TestChanges.newChange(project, changeOwner.getAccountId()); - c.setCurrentPatchSet(c.currentPatchSetId(), tabSubj, - c.getOriginalSubject()); + c.setCurrentPatchSet(c.currentPatchSetId(), tabSubj, c.getOriginalSubject()); update = newUpdate(c, changeOwner); update.setChangeId(c.getKey().get()); update.setBranch(c.getDest().get()); @@ -978,9 +995,14 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { notes = newNotes(c); fail("Expected IOException"); } catch (OrmException e) { - assertCause(e, ConfigInvalidException.class, + assertCause( + e, + ConfigInvalidException.class, "Multiple revisions parsed for patch set 1:" - + " RevId{" + commit.name() + "} and " + ps.getRevision().get()); + + " RevId{" + + commit.name() + + "} and " + + ps.getRevision().get()); } } @@ -993,8 +1015,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { PatchSet ps1 = notes.getCurrentPatchSet(); assertThat(notes.getChange().currentPatchSetId()).isEqualTo(ps1.getId()); assertThat(notes.getChange().getSubject()).isEqualTo("Change subject"); - assertThat(notes.getChange().getOriginalSubject()) - .isEqualTo("Change subject"); + assertThat(notes.getChange().getOriginalSubject()).isEqualTo("Change subject"); assertThat(ps1.getId()).isEqualTo(new PatchSet.Id(c.getId(), 1)); assertThat(ps1.getUploader()).isEqualTo(changeOwner.getAccountId()); @@ -1004,14 +1025,12 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { PatchSet ps2 = notes.getCurrentPatchSet(); assertThat(ps2.getId()).isEqualTo(new PatchSet.Id(c.getId(), 2)); assertThat(notes.getChange().getSubject()).isEqualTo("PS2"); - assertThat(notes.getChange().getOriginalSubject()) - .isEqualTo("Change subject"); + assertThat(notes.getChange().getOriginalSubject()).isEqualTo("Change subject"); assertThat(notes.getChange().currentPatchSetId()).isEqualTo(ps2.getId()); assertThat(ps2.getRevision().get()).isNotEqualTo(ps1.getRevision()); assertThat(ps2.getRevision().get()).isEqualTo(commit.name()); assertThat(ps2.getUploader()).isEqualTo(otherUser.getAccountId()); - assertThat(ps2.getCreatedOn()) - .isEqualTo(notes.getChange().getLastUpdatedOn()); + assertThat(ps2.getCreatedOn()).isEqualTo(notes.getChange().getLastUpdatedOn()); // comment on ps1, current patch set is still ps2 ChangeUpdate update = newUpdate(c, changeOwner); @@ -1035,10 +1054,21 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { update.setPatchSetState(PatchSetState.DRAFT); update.putApproval("Code-Review", (short) 1); update.setChangeMessage("This is a message"); - update.putComment(Status.PUBLISHED, - newComment(c.currentPatchSetId(), "a.txt", "uuid1", - new CommentRange(1, 2, 3, 4), 1, changeOwner, null, - TimeUtil.nowTs(), "Comment", (short) 1, commit.name(), false)); + update.putComment( + Status.PUBLISHED, + newComment( + c.currentPatchSetId(), + "a.txt", + "uuid1", + new CommentRange(1, 2, 3, 4), + 1, + changeOwner, + null, + TimeUtil.nowTs(), + "Comment", + (short) 1, + commit.name(), + false)); update.commit(); ChangeNotes notes = newNotes(c); @@ -1083,8 +1113,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { update.setGroups(ImmutableList.of("a", "b")); update.commit(); notes = newNotes(c); - assertThat(notes.getPatchSets().get(psId1).getGroups()) - .containsExactly("a", "b").inOrder(); + assertThat(notes.getPatchSets().get(psId1).getGroups()).containsExactly("a", "b").inOrder(); incrementCurrentPatchSetFieldOnly(c); PatchSet.Id psId2 = c.currentPatchSetId(); @@ -1093,21 +1122,20 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { update.setGroups(ImmutableList.of("d")); update.commit(); notes = newNotes(c); - assertThat(notes.getPatchSets().get(psId2).getGroups()) - .containsExactly("d"); - assertThat(notes.getPatchSets().get(psId1).getGroups()) - .containsExactly("a", "b").inOrder(); + assertThat(notes.getPatchSets().get(psId2).getGroups()).containsExactly("d"); + assertThat(notes.getPatchSets().get(psId1).getGroups()).containsExactly("a", "b").inOrder(); } @Test public void pushCertificate() throws Exception { - String pushCert = "certificate version 0.1\n" - + "pusher This is not a real push cert\n" - + "-----BEGIN PGP SIGNATURE-----\n" - + "Version: GnuPG v1\n" - + "\n" - + "Nor is this a real signature.\n" - + "-----END PGP SIGNATURE-----\n"; + String pushCert = + "certificate version 0.1\n" + + "pusher This is not a real push cert\n" + + "-----BEGIN PGP SIGNATURE-----\n" + + "Version: GnuPG v1\n" + + "\n" + + "Nor is this a real signature.\n" + + "-----END PGP SIGNATURE-----\n"; // ps2 with push cert Change c = newChange(); @@ -1134,9 +1162,21 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { update = newUpdate(c, changeOwner); update.setPatchSetId(psId2); Timestamp ts = TimeUtil.nowTs(); - update.putComment(Status.PUBLISHED, - newComment(psId2, "a.txt", "uuid1", new CommentRange(1, 2, 3, 4), 1, - changeOwner, null, ts, "Comment", (short) 1, commit.name(), false)); + update.putComment( + Status.PUBLISHED, + newComment( + psId2, + "a.txt", + "uuid1", + new CommentRange(1, 2, 3, 4), + 1, + changeOwner, + null, + ts, + "Comment", + (short) 1, + commit.name(), + false)); update.commit(); notes = newNotes(c); @@ -1147,20 +1187,24 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { assertThat(notes.getComments()).isNotEmpty(); if (!testJson()) { - assertThat(readNote(notes, commit)).isEqualTo( - pushCert - + "Revision: " + commit.name() + "\n" - + "Patch-set: 2\n" - + "File: a.txt\n" - + "\n" - + "1:2-3:4\n" - + ChangeNoteUtil.formatTime(serverIdent, ts) + "\n" - + "Author: Change Owner <1@gerrit>\n" - + "Unresolved: false\n" - + "UUID: uuid1\n" - + "Bytes: 7\n" - + "Comment\n" - + "\n"); + assertThat(readNote(notes, commit)) + .isEqualTo( + pushCert + + "Revision: " + + commit.name() + + "\n" + + "Patch-set: 2\n" + + "File: a.txt\n" + + "\n" + + "1:2-3:4\n" + + ChangeNoteUtil.formatTime(serverIdent, ts) + + "\n" + + "Author: Change Owner <1@gerrit>\n" + + "Unresolved: false\n" + + "UUID: uuid1\n" + + "Bytes: 7\n" + + "Comment\n" + + "\n"); } } @@ -1180,25 +1224,21 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { ChangeUpdate update2 = newUpdate(c, otherUser); update2.putApproval("Code-Review", (short) 2); - try (NoteDbUpdateManager updateManager = - updateManagerFactory.create(project)) { + try (NoteDbUpdateManager updateManager = updateManagerFactory.create(project)) { updateManager.add(update1); updateManager.add(update2); updateManager.execute(); } ChangeNotes notes = newNotes(c); - List psas = - notes.getApprovals().get(c.currentPatchSetId()); + List psas = notes.getApprovals().get(c.currentPatchSetId()); assertThat(psas).hasSize(2); - assertThat(psas.get(0).getAccountId()) - .isEqualTo(changeOwner.getAccount().getId()); + assertThat(psas.get(0).getAccountId()).isEqualTo(changeOwner.getAccount().getId()); assertThat(psas.get(0).getLabel()).isEqualTo("Verified"); assertThat(psas.get(0).getValue()).isEqualTo((short) 1); - assertThat(psas.get(1).getAccountId()) - .isEqualTo(otherUser.getAccount().getId()); + assertThat(psas.get(1).getAccountId()).isEqualTo(otherUser.getAccount().getId()); assertThat(psas.get(1).getLabel()).isEqualTo("Code-Review"); assertThat(psas.get(1).getValue()).isEqualTo((short) 2); } @@ -1213,11 +1253,21 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { Timestamp time1 = TimeUtil.nowTs(); PatchSet.Id psId = c.currentPatchSetId(); RevCommit tipCommit; - try (NoteDbUpdateManager updateManager = - updateManagerFactory.create(project)) { - Comment comment1 = newComment(psId, "file1", - uuid1, range1, range1.getEndLine(), otherUser, null, time1, message1, - (short) 0, "abcd1234abcd1234abcd1234abcd1234abcd1234", false); + try (NoteDbUpdateManager updateManager = updateManagerFactory.create(project)) { + Comment comment1 = + newComment( + psId, + "file1", + uuid1, + range1, + range1.getEndLine(), + otherUser, + null, + time1, + message1, + (short) 0, + "abcd1234abcd1234abcd1234abcd1234abcd1234", + false); update1.setPatchSetId(psId); update1.putComment(Status.PUBLISHED, comment1); updateManager.add(update1); @@ -1239,16 +1289,16 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { assertThat(commitWithComments).isNotNull(); try (ChangeNotesRevWalk rw = ChangeNotesCommit.newRevWalk(repo)) { - ChangeNotesParser notesWithComments = new ChangeNotesParser( - c.getId(), commitWithComments.copy(), rw, noteUtil, args.metrics); + ChangeNotesParser notesWithComments = + new ChangeNotesParser(c.getId(), commitWithComments.copy(), rw, noteUtil, args.metrics); ChangeNotesState state = notesWithComments.parseAll(); assertThat(state.approvals()).isEmpty(); assertThat(state.publishedComments()).hasSize(1); } try (ChangeNotesRevWalk rw = ChangeNotesCommit.newRevWalk(repo)) { - ChangeNotesParser notesWithApprovals = new ChangeNotesParser(c.getId(), - commitWithApprovals.copy(), rw, noteUtil, args.metrics); + ChangeNotesParser notesWithApprovals = + new ChangeNotesParser(c.getId(), commitWithApprovals.copy(), rw, noteUtil, args.metrics); ChangeNotesState state = notesWithApprovals.parseAll(); assertThat(state.approvals()).hasSize(1); assertThat(state.publishedComments()).hasSize(1); @@ -1270,8 +1320,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { Ref initial2 = repo.exactRef(update2.getRefName()); assertThat(initial2).isNotNull(); - try (NoteDbUpdateManager updateManager = - updateManagerFactory.create(project)) { + try (NoteDbUpdateManager updateManager = updateManagerFactory.create(project)) { updateManager.add(update1); updateManager.add(update2); updateManager.execute(); @@ -1284,12 +1333,12 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { assertThat(ref2.getObjectId()).isEqualTo(update2.getResult()); assertThat(ref2.getObjectId()).isNotEqualTo(initial2.getObjectId()); - PatchSetApproval approval1 = newNotes(c1).getApprovals() - .get(c1.currentPatchSetId()).iterator().next(); + PatchSetApproval approval1 = + newNotes(c1).getApprovals().get(c1.currentPatchSetId()).iterator().next(); assertThat(approval1.getLabel()).isEqualTo("Verified"); - PatchSetApproval approval2 = newNotes(c2).getApprovals() - .get(c2.currentPatchSetId()).iterator().next(); + PatchSetApproval approval2 = + newNotes(c2).getApprovals().get(c2.currentPatchSetId()).iterator().next(); assertThat(approval2.getLabel()).isEqualTo("Code-Review"); } @@ -1303,8 +1352,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { PatchSet.Id ps1 = c.currentPatchSetId(); ChangeNotes notes = newNotes(c); - ListMultimap changeMessages = - notes.getChangeMessagesByPatchSet(); + ListMultimap changeMessages = notes.getChangeMessagesByPatchSet(); assertThat(changeMessages.keySet()).containsExactly(ps1); ChangeMessage cm = Iterables.getOnlyElement(changeMessages.get(ps1)); @@ -1328,14 +1376,12 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { public void changeMessageWithTrailingDoubleNewline() throws Exception { Change c = newChange(); ChangeUpdate update = newUpdate(c, changeOwner); - update.setChangeMessage("Testing trailing double newline\n" - + "\n"); + update.setChangeMessage("Testing trailing double newline\n" + "\n"); update.commit(); PatchSet.Id ps1 = c.currentPatchSetId(); ChangeNotes notes = newNotes(c); - ListMultimap changeMessages = - notes.getChangeMessagesByPatchSet(); + ListMultimap changeMessages = notes.getChangeMessagesByPatchSet(); assertThat(changeMessages).hasSize(1); ChangeMessage cm1 = Iterables.getOnlyElement(changeMessages.get(ps1)); @@ -1347,25 +1393,23 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { public void changeMessageWithMultipleParagraphs() throws Exception { Change c = newChange(); ChangeUpdate update = newUpdate(c, changeOwner); - update.setChangeMessage("Testing paragraph 1\n" - + "\n" - + "Testing paragraph 2\n" - + "\n" - + "Testing paragraph 3"); + update.setChangeMessage( + "Testing paragraph 1\n" + "\n" + "Testing paragraph 2\n" + "\n" + "Testing paragraph 3"); update.commit(); PatchSet.Id ps1 = c.currentPatchSetId(); ChangeNotes notes = newNotes(c); - ListMultimap changeMessages = - notes.getChangeMessagesByPatchSet(); + ListMultimap changeMessages = notes.getChangeMessagesByPatchSet(); assertThat(changeMessages).hasSize(1); ChangeMessage cm1 = Iterables.getOnlyElement(changeMessages.get(ps1)); - assertThat(cm1.getMessage()).isEqualTo("Testing paragraph 1\n" - + "\n" - + "Testing paragraph 2\n" - + "\n" - + "Testing paragraph 3"); + assertThat(cm1.getMessage()) + .isEqualTo( + "Testing paragraph 1\n" + + "\n" + + "Testing paragraph 2\n" + + "\n" + + "Testing paragraph 3"); assertThat(cm1.getAuthor()).isEqualTo(changeOwner.getAccount().getId()); } @@ -1386,19 +1430,16 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { PatchSet.Id ps2 = c.currentPatchSetId(); ChangeNotes notes = newNotes(c); - ListMultimap changeMessages = - notes.getChangeMessagesByPatchSet(); + ListMultimap changeMessages = notes.getChangeMessagesByPatchSet(); assertThat(changeMessages).hasSize(2); ChangeMessage cm1 = Iterables.getOnlyElement(changeMessages.get(ps1)); - assertThat(cm1.getMessage()) - .isEqualTo("This is the change message for the first PS."); + assertThat(cm1.getMessage()).isEqualTo("This is the change message for the first PS."); assertThat(cm1.getAuthor()).isEqualTo(changeOwner.getAccount().getId()); ChangeMessage cm2 = Iterables.getOnlyElement(changeMessages.get(ps2)); assertThat(cm1.getPatchSetId()).isEqualTo(ps1); - assertThat(cm2.getMessage()) - .isEqualTo("This is the change message for the second PS."); + assertThat(cm2.getMessage()).isEqualTo("This is the change message for the second PS."); assertThat(cm2.getAuthor()).isEqualTo(changeOwner.getAccount().getId()); assertThat(cm2.getPatchSetId()).isEqualTo(ps2); } @@ -1419,19 +1460,16 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { update.commit(); ChangeNotes notes = newNotes(c); - ListMultimap changeMessages = - notes.getChangeMessagesByPatchSet(); + ListMultimap changeMessages = notes.getChangeMessagesByPatchSet(); assertThat(changeMessages.keySet()).hasSize(1); List cm = changeMessages.get(ps1); assertThat(cm).hasSize(2); assertThat(cm.get(0).getMessage()).isEqualTo("First change message.\n"); - assertThat(cm.get(0).getAuthor()) - .isEqualTo(changeOwner.getAccount().getId()); + assertThat(cm.get(0).getAuthor()).isEqualTo(changeOwner.getAccount().getId()); assertThat(cm.get(0).getPatchSetId()).isEqualTo(ps1); assertThat(cm.get(1).getMessage()).isEqualTo("Second change message.\n"); - assertThat(cm.get(1).getAuthor()) - .isEqualTo(changeOwner.getAccount().getId()); + assertThat(cm.get(1).getAuthor()).isEqualTo(changeOwner.getAccount().getId()); assertThat(cm.get(1).getPatchSetId()).isEqualTo(ps1); } @@ -1442,16 +1480,26 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { PatchSet.Id psId = c.currentPatchSetId(); RevId revId = new RevId("abcd1234abcd1234abcd1234abcd1234abcd1234"); - Comment comment = newComment(psId, "file1", - "uuid", null, 0, otherUser, null, - TimeUtil.nowTs(), "message", (short) 1, revId.get(), false); + Comment comment = + newComment( + psId, + "file1", + "uuid", + null, + 0, + otherUser, + null, + TimeUtil.nowTs(), + "message", + (short) 1, + revId.get(), + false); update.setPatchSetId(psId); update.putComment(Status.PUBLISHED, comment); update.commit(); ChangeNotes notes = newNotes(c); - assertThat(notes.getComments()) - .isEqualTo(ImmutableListMultimap.of(revId, comment)); + assertThat(notes.getComments()).isEqualTo(ImmutableListMultimap.of(revId, comment)); } @Test @@ -1462,16 +1510,26 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { RevId revId = new RevId("abcd1234abcd1234abcd1234abcd1234abcd1234"); CommentRange range = new CommentRange(1, 0, 2, 0); - Comment comment = newComment(psId, "file1", - "uuid", range, range.getEndLine(), otherUser, null, - TimeUtil.nowTs(), "message", (short) 1, revId.get(), false); + Comment comment = + newComment( + psId, + "file1", + "uuid", + range, + range.getEndLine(), + otherUser, + null, + TimeUtil.nowTs(), + "message", + (short) 1, + revId.get(), + false); update.setPatchSetId(psId); update.putComment(Status.PUBLISHED, comment); update.commit(); ChangeNotes notes = newNotes(c); - assertThat(notes.getComments()) - .isEqualTo(ImmutableListMultimap.of(revId, comment)); + assertThat(notes.getComments()).isEqualTo(ImmutableListMultimap.of(revId, comment)); } @Test @@ -1482,16 +1540,26 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { RevId revId = new RevId("abcd1234abcd1234abcd1234abcd1234abcd1234"); CommentRange range = new CommentRange(0, 0, 0, 0); - Comment comment = newComment(psId, "file", - "uuid", range, range.getEndLine(), otherUser, null, - TimeUtil.nowTs(), "message", (short) 1, revId.get(), false); + Comment comment = + newComment( + psId, + "file", + "uuid", + range, + range.getEndLine(), + otherUser, + null, + TimeUtil.nowTs(), + "message", + (short) 1, + revId.get(), + false); update.setPatchSetId(psId); update.putComment(Status.PUBLISHED, comment); update.commit(); ChangeNotes notes = newNotes(c); - assertThat(notes.getComments()) - .isEqualTo(ImmutableListMultimap.of(revId, comment)); + assertThat(notes.getComments()).isEqualTo(ImmutableListMultimap.of(revId, comment)); } @Test @@ -1502,16 +1570,26 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { RevId revId = new RevId("abcd1234abcd1234abcd1234abcd1234abcd1234"); CommentRange range = new CommentRange(1, 2, 3, 4); - Comment comment = newComment(psId, "", "uuid", range, range.getEndLine(), - otherUser, null, TimeUtil.nowTs(), "message", (short) 1, revId.get(), - false); + Comment comment = + newComment( + psId, + "", + "uuid", + range, + range.getEndLine(), + otherUser, + null, + TimeUtil.nowTs(), + "message", + (short) 1, + revId.get(), + false); update.setPatchSetId(psId); update.putComment(Status.PUBLISHED, comment); update.commit(); ChangeNotes notes = newNotes(c); - assertThat(notes.getComments()) - .isEqualTo(ImmutableListMultimap.of(revId, comment)); + assertThat(notes.getComments()).isEqualTo(ImmutableListMultimap.of(revId, comment)); } @Test @@ -1530,27 +1608,60 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { Timestamp time3 = TimeUtil.nowTs(); PatchSet.Id psId = c.currentPatchSetId(); - Comment comment1 = newComment(psId, "file1", uuid1, range1, - range1.getEndLine(), otherUser, null, time1, message1, (short) 1, - "abcd1234abcd1234abcd1234abcd1234abcd1234", false); + Comment comment1 = + newComment( + psId, + "file1", + uuid1, + range1, + range1.getEndLine(), + otherUser, + null, + time1, + message1, + (short) 1, + "abcd1234abcd1234abcd1234abcd1234abcd1234", + false); update.setPatchSetId(psId); update.putComment(Status.PUBLISHED, comment1); update.commit(); update = newUpdate(c, otherUser); CommentRange range2 = new CommentRange(2, 1, 3, 1); - Comment comment2 = newComment(psId, "file1", uuid2, range2, - range2.getEndLine(), otherUser, null, time2, message2, (short) 1, - "abcd1234abcd1234abcd1234abcd1234abcd1234", false); + Comment comment2 = + newComment( + psId, + "file1", + uuid2, + range2, + range2.getEndLine(), + otherUser, + null, + time2, + message2, + (short) 1, + "abcd1234abcd1234abcd1234abcd1234abcd1234", + false); update.setPatchSetId(psId); update.putComment(Status.PUBLISHED, comment2); update.commit(); update = newUpdate(c, otherUser); CommentRange range3 = new CommentRange(3, 0, 4, 1); - Comment comment3 = newComment(psId, "file2", uuid3, range3, - range3.getEndLine(), otherUser, null, time3, message3, (short) 1, - "abcd1234abcd1234abcd1234abcd1234abcd1234", false); + Comment comment3 = + newComment( + psId, + "file2", + uuid3, + range3, + range3.getEndLine(), + otherUser, + null, + time3, + message3, + (short) 1, + "abcd1234abcd1234abcd1234abcd1234abcd1234", + false); update.setPatchSetId(psId); update.putComment(Status.PUBLISHED, comment3); update.commit(); @@ -1558,47 +1669,48 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { ChangeNotes notes = newNotes(c); try (RevWalk walk = new RevWalk(repo)) { - ArrayList notesInTree = - Lists.newArrayList(notes.revisionNoteMap.noteMap.iterator()); + ArrayList notesInTree = Lists.newArrayList(notes.revisionNoteMap.noteMap.iterator()); Note note = Iterables.getOnlyElement(notesInTree); - byte[] bytes = - walk.getObjectReader().open( - note.getData(), Constants.OBJ_BLOB).getBytes(); + byte[] bytes = walk.getObjectReader().open(note.getData(), Constants.OBJ_BLOB).getBytes(); String noteString = new String(bytes, UTF_8); if (!testJson()) { - assertThat(noteString).isEqualTo( - "Revision: abcd1234abcd1234abcd1234abcd1234abcd1234\n" - + "Patch-set: 1\n" - + "File: file1\n" - + "\n" - + "1:1-2:1\n" - + ChangeNoteUtil.formatTime(serverIdent, time1) + "\n" - + "Author: Other Account <2@gerrit>\n" - + "Unresolved: false\n" - + "UUID: uuid1\n" - + "Bytes: 9\n" - + "comment 1\n" - + "\n" - + "2:1-3:1\n" - + ChangeNoteUtil.formatTime(serverIdent, time2) + "\n" - + "Author: Other Account <2@gerrit>\n" - + "Unresolved: false\n" - + "UUID: uuid2\n" - + "Bytes: 9\n" - + "comment 2\n" - + "\n" - + "File: file2\n" - + "\n" - + "3:0-4:1\n" - + ChangeNoteUtil.formatTime(serverIdent, time3) + "\n" - + "Author: Other Account <2@gerrit>\n" - + "Unresolved: false\n" - + "UUID: uuid3\n" - + "Bytes: 9\n" - + "comment 3\n" - + "\n"); + assertThat(noteString) + .isEqualTo( + "Revision: abcd1234abcd1234abcd1234abcd1234abcd1234\n" + + "Patch-set: 1\n" + + "File: file1\n" + + "\n" + + "1:1-2:1\n" + + ChangeNoteUtil.formatTime(serverIdent, time1) + + "\n" + + "Author: Other Account <2@gerrit>\n" + + "Unresolved: false\n" + + "UUID: uuid1\n" + + "Bytes: 9\n" + + "comment 1\n" + + "\n" + + "2:1-3:1\n" + + ChangeNoteUtil.formatTime(serverIdent, time2) + + "\n" + + "Author: Other Account <2@gerrit>\n" + + "Unresolved: false\n" + + "UUID: uuid2\n" + + "Bytes: 9\n" + + "comment 2\n" + + "\n" + + "File: file2\n" + + "\n" + + "3:0-4:1\n" + + ChangeNoteUtil.formatTime(serverIdent, time3) + + "\n" + + "Author: Other Account <2@gerrit>\n" + + "Unresolved: false\n" + + "UUID: uuid3\n" + + "Bytes: 9\n" + + "comment 3\n" + + "\n"); } } } @@ -1616,18 +1728,40 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { Timestamp time2 = TimeUtil.nowTs(); PatchSet.Id psId = c.currentPatchSetId(); - Comment comment1 = newComment(psId, "file1", - uuid1, range1, range1.getEndLine(), otherUser, null, time1, message1, - (short) 0, "abcd1234abcd1234abcd1234abcd1234abcd1234", false); + Comment comment1 = + newComment( + psId, + "file1", + uuid1, + range1, + range1.getEndLine(), + otherUser, + null, + time1, + message1, + (short) 0, + "abcd1234abcd1234abcd1234abcd1234abcd1234", + false); update.setPatchSetId(psId); update.putComment(Status.PUBLISHED, comment1); update.commit(); update = newUpdate(c, otherUser); CommentRange range2 = new CommentRange(2, 1, 3, 1); - Comment comment2 = newComment(psId, "file1", - uuid2, range2, range2.getEndLine(), otherUser, null, time2, message2, - (short) 0, "abcd1234abcd1234abcd1234abcd1234abcd1234", false); + Comment comment2 = + newComment( + psId, + "file1", + uuid2, + range2, + range2.getEndLine(), + otherUser, + null, + time2, + message2, + (short) 0, + "abcd1234abcd1234abcd1234abcd1234abcd1234", + false); update.setPatchSetId(psId); update.putComment(Status.PUBLISHED, comment2); update.commit(); @@ -1635,37 +1769,37 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { ChangeNotes notes = newNotes(c); try (RevWalk walk = new RevWalk(repo)) { - ArrayList notesInTree = - Lists.newArrayList(notes.revisionNoteMap.noteMap.iterator()); + ArrayList notesInTree = Lists.newArrayList(notes.revisionNoteMap.noteMap.iterator()); Note note = Iterables.getOnlyElement(notesInTree); - byte[] bytes = - walk.getObjectReader().open( - note.getData(), Constants.OBJ_BLOB).getBytes(); + byte[] bytes = walk.getObjectReader().open(note.getData(), Constants.OBJ_BLOB).getBytes(); String noteString = new String(bytes, UTF_8); if (!testJson()) { - assertThat(noteString).isEqualTo( - "Revision: abcd1234abcd1234abcd1234abcd1234abcd1234\n" - + "Base-for-patch-set: 1\n" - + "File: file1\n" - + "\n" - + "1:1-2:1\n" - + ChangeNoteUtil.formatTime(serverIdent, time1) + "\n" - + "Author: Other Account <2@gerrit>\n" - + "Unresolved: false\n" - + "UUID: uuid1\n" - + "Bytes: 9\n" - + "comment 1\n" - + "\n" - + "2:1-3:1\n" - + ChangeNoteUtil.formatTime(serverIdent, time2) + "\n" - + "Author: Other Account <2@gerrit>\n" - + "Unresolved: false\n" - + "UUID: uuid2\n" - + "Bytes: 9\n" - + "comment 2\n" - + "\n"); + assertThat(noteString) + .isEqualTo( + "Revision: abcd1234abcd1234abcd1234abcd1234abcd1234\n" + + "Base-for-patch-set: 1\n" + + "File: file1\n" + + "\n" + + "1:1-2:1\n" + + ChangeNoteUtil.formatTime(serverIdent, time1) + + "\n" + + "Author: Other Account <2@gerrit>\n" + + "Unresolved: false\n" + + "UUID: uuid1\n" + + "Bytes: 9\n" + + "comment 1\n" + + "\n" + + "2:1-3:1\n" + + ChangeNoteUtil.formatTime(serverIdent, time2) + + "\n" + + "Author: Other Account <2@gerrit>\n" + + "Unresolved: false\n" + + "UUID: uuid2\n" + + "Bytes: 9\n" + + "comment 2\n" + + "\n"); } } } @@ -1683,17 +1817,39 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { Timestamp time2 = TimeUtil.nowTs(); PatchSet.Id psId = c.currentPatchSetId(); - Comment comment1 = newComment(psId, "file1", - uuid1, range1, range1.getEndLine(), otherUser, null, time1, message1, - (short) 0, "abcd1234abcd1234abcd1234abcd1234abcd1234", false); + Comment comment1 = + newComment( + psId, + "file1", + uuid1, + range1, + range1.getEndLine(), + otherUser, + null, + time1, + message1, + (short) 0, + "abcd1234abcd1234abcd1234abcd1234abcd1234", + false); update.setPatchSetId(psId); update.putComment(Status.PUBLISHED, comment1); update.commit(); update = newUpdate(c, otherUser); - Comment comment2 = newComment(psId, "file1", - uuid2, range1, range1.getEndLine(), otherUser, uuid1, time2, message2, - (short) 0, "abcd1234abcd1234abcd1234abcd1234abcd1234", true); + Comment comment2 = + newComment( + psId, + "file1", + uuid2, + range1, + range1.getEndLine(), + otherUser, + uuid1, + time2, + message2, + (short) 0, + "abcd1234abcd1234abcd1234abcd1234abcd1234", + true); update.setPatchSetId(psId); update.putComment(Status.PUBLISHED, comment2); update.commit(); @@ -1701,45 +1857,44 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { ChangeNotes notes = newNotes(c); try (RevWalk walk = new RevWalk(repo)) { - ArrayList notesInTree = - Lists.newArrayList(notes.revisionNoteMap.noteMap.iterator()); + ArrayList notesInTree = Lists.newArrayList(notes.revisionNoteMap.noteMap.iterator()); Note note = Iterables.getOnlyElement(notesInTree); - byte[] bytes = - walk.getObjectReader().open( - note.getData(), Constants.OBJ_BLOB).getBytes(); + byte[] bytes = walk.getObjectReader().open(note.getData(), Constants.OBJ_BLOB).getBytes(); String noteString = new String(bytes, UTF_8); if (!testJson()) { - assertThat(noteString).isEqualTo( - "Revision: abcd1234abcd1234abcd1234abcd1234abcd1234\n" - + "Base-for-patch-set: 1\n" - + "File: file1\n" - + "\n" - + "1:1-2:1\n" - + ChangeNoteUtil.formatTime(serverIdent, time1) + "\n" - + "Author: Other Account <2@gerrit>\n" - + "Unresolved: false\n" - + "UUID: uuid1\n" - + "Bytes: 9\n" - + "comment 1\n" - + "\n" - + "1:1-2:1\n" - + ChangeNoteUtil.formatTime(serverIdent, time2) + "\n" - + "Author: Other Account <2@gerrit>\n" - + "Parent: uuid1\n" - + "Unresolved: true\n" - + "UUID: uuid2\n" - + "Bytes: 9\n" - + "comment 2\n" - + "\n"); + assertThat(noteString) + .isEqualTo( + "Revision: abcd1234abcd1234abcd1234abcd1234abcd1234\n" + + "Base-for-patch-set: 1\n" + + "File: file1\n" + + "\n" + + "1:1-2:1\n" + + ChangeNoteUtil.formatTime(serverIdent, time1) + + "\n" + + "Author: Other Account <2@gerrit>\n" + + "Unresolved: false\n" + + "UUID: uuid1\n" + + "Bytes: 9\n" + + "comment 1\n" + + "\n" + + "1:1-2:1\n" + + ChangeNoteUtil.formatTime(serverIdent, time2) + + "\n" + + "Author: Other Account <2@gerrit>\n" + + "Parent: uuid1\n" + + "Unresolved: true\n" + + "UUID: uuid2\n" + + "Bytes: 9\n" + + "comment 2\n" + + "\n"); } } } @Test - public void patchLineCommentNotesFormatMultiplePatchSetsSameRevId() - throws Exception { + public void patchLineCommentNotesFormatMultiplePatchSetsSameRevId() throws Exception { Change c = newChange(); PatchSet.Id psId1 = c.currentPatchSetId(); incrementPatchSet(c); @@ -1756,14 +1911,47 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { RevId revId = new RevId("abcd1234abcd1234abcd1234abcd1234abcd1234"); Comment comment1 = - newComment(psId1, "file1", uuid1, range1, range1.getEndLine(), - otherUser, null, time, message1, (short) 0, revId.get(), false); + newComment( + psId1, + "file1", + uuid1, + range1, + range1.getEndLine(), + otherUser, + null, + time, + message1, + (short) 0, + revId.get(), + false); Comment comment2 = - newComment(psId1, "file1", uuid2, range2, range2.getEndLine(), - otherUser, null, time, message2, (short) 0, revId.get(), false); + newComment( + psId1, + "file1", + uuid2, + range2, + range2.getEndLine(), + otherUser, + null, + time, + message2, + (short) 0, + revId.get(), + false); Comment comment3 = - newComment(psId2, "file1", uuid3, range1, range1.getEndLine(), - otherUser, null, time, message3, (short) 0, revId.get(), false); + newComment( + psId2, + "file1", + uuid3, + range1, + range1.getEndLine(), + otherUser, + null, + time, + message3, + (short) 0, + revId.get(), + false); ChangeUpdate update = newUpdate(c, otherUser); update.setPatchSetId(psId2); @@ -1775,63 +1963,64 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { ChangeNotes notes = newNotes(c); try (RevWalk walk = new RevWalk(repo)) { - ArrayList notesInTree = - Lists.newArrayList(notes.revisionNoteMap.noteMap.iterator()); + ArrayList notesInTree = Lists.newArrayList(notes.revisionNoteMap.noteMap.iterator()); Note note = Iterables.getOnlyElement(notesInTree); - byte[] bytes = - walk.getObjectReader().open( - note.getData(), Constants.OBJ_BLOB).getBytes(); + byte[] bytes = walk.getObjectReader().open(note.getData(), Constants.OBJ_BLOB).getBytes(); String noteString = new String(bytes, UTF_8); String timeStr = ChangeNoteUtil.formatTime(serverIdent, time); if (!testJson()) { - assertThat(noteString).isEqualTo( - "Revision: abcd1234abcd1234abcd1234abcd1234abcd1234\n" - + "Base-for-patch-set: 1\n" - + "File: file1\n" - + "\n" - + "1:1-2:1\n" - + timeStr + "\n" - + "Author: Other Account <2@gerrit>\n" - + "Unresolved: false\n" - + "UUID: uuid1\n" - + "Bytes: 9\n" - + "comment 1\n" - + "\n" - + "2:1-3:1\n" - + timeStr + "\n" - + "Author: Other Account <2@gerrit>\n" - + "Unresolved: false\n" - + "UUID: uuid2\n" - + "Bytes: 9\n" - + "comment 2\n" - + "\n" - + "Base-for-patch-set: 2\n" - + "File: file1\n" - + "\n" - + "1:1-2:1\n" - + timeStr + "\n" - + "Author: Other Account <2@gerrit>\n" - + "Unresolved: false\n" - + "UUID: uuid3\n" - + "Bytes: 9\n" - + "comment 3\n" - + "\n"); + assertThat(noteString) + .isEqualTo( + "Revision: abcd1234abcd1234abcd1234abcd1234abcd1234\n" + + "Base-for-patch-set: 1\n" + + "File: file1\n" + + "\n" + + "1:1-2:1\n" + + timeStr + + "\n" + + "Author: Other Account <2@gerrit>\n" + + "Unresolved: false\n" + + "UUID: uuid1\n" + + "Bytes: 9\n" + + "comment 1\n" + + "\n" + + "2:1-3:1\n" + + timeStr + + "\n" + + "Author: Other Account <2@gerrit>\n" + + "Unresolved: false\n" + + "UUID: uuid2\n" + + "Bytes: 9\n" + + "comment 2\n" + + "\n" + + "Base-for-patch-set: 2\n" + + "File: file1\n" + + "\n" + + "1:1-2:1\n" + + timeStr + + "\n" + + "Author: Other Account <2@gerrit>\n" + + "Unresolved: false\n" + + "UUID: uuid3\n" + + "Bytes: 9\n" + + "comment 3\n" + + "\n"); } } - assertThat(notes.getComments()).isEqualTo( - ImmutableListMultimap.of( - revId, comment1, - revId, comment2, - revId, comment3)); + assertThat(notes.getComments()) + .isEqualTo( + ImmutableListMultimap.of( + revId, comment1, + revId, comment2, + revId, comment3)); } @Test public void patchLineCommentNotesFormatRealAuthor() throws Exception { Change c = newChange(); - CurrentUser ownerAsOtherUser = - userFactory.runAs(null, otherUserId, changeOwner); + CurrentUser ownerAsOtherUser = userFactory.runAs(null, otherUserId, changeOwner); ChangeUpdate update = newUpdate(c, ownerAsOtherUser); String uuid = "uuid"; String message = "comment"; @@ -1840,9 +2029,20 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { PatchSet.Id psId = c.currentPatchSetId(); RevId revId = new RevId("abcd1234abcd1234abcd1234abcd1234abcd1234"); - Comment comment = newComment(psId, "file", uuid, range, - range.getEndLine(), otherUser, null, time, message, (short) 1, - revId.get(), false); + Comment comment = + newComment( + psId, + "file", + uuid, + range, + range.getEndLine(), + otherUser, + null, + time, + message, + (short) 1, + revId.get(), + false); comment.setRealAuthor(changeOwner.getAccountId()); update.setPatchSetId(psId); update.putComment(Status.PUBLISHED, comment); @@ -1851,34 +2051,32 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { ChangeNotes notes = newNotes(c); try (RevWalk walk = new RevWalk(repo)) { - ArrayList notesInTree = - Lists.newArrayList(notes.revisionNoteMap.noteMap.iterator()); + ArrayList notesInTree = Lists.newArrayList(notes.revisionNoteMap.noteMap.iterator()); Note note = Iterables.getOnlyElement(notesInTree); - byte[] bytes = - walk.getObjectReader().open( - note.getData(), Constants.OBJ_BLOB).getBytes(); + byte[] bytes = walk.getObjectReader().open(note.getData(), Constants.OBJ_BLOB).getBytes(); String noteString = new String(bytes, UTF_8); if (!testJson()) { - assertThat(noteString).isEqualTo( - "Revision: abcd1234abcd1234abcd1234abcd1234abcd1234\n" - + "Patch-set: 1\n" - + "File: file\n" - + "\n" - + "1:1-2:1\n" - + ChangeNoteUtil.formatTime(serverIdent, time) + "\n" - + "Author: Other Account <2@gerrit>\n" - + "Real-author: Change Owner <1@gerrit>\n" - + "Unresolved: false\n" - + "UUID: uuid\n" - + "Bytes: 7\n" - + "comment\n" - + "\n"); + assertThat(noteString) + .isEqualTo( + "Revision: abcd1234abcd1234abcd1234abcd1234abcd1234\n" + + "Patch-set: 1\n" + + "File: file\n" + + "\n" + + "1:1-2:1\n" + + ChangeNoteUtil.formatTime(serverIdent, time) + + "\n" + + "Author: Other Account <2@gerrit>\n" + + "Real-author: Change Owner <1@gerrit>\n" + + "Unresolved: false\n" + + "UUID: uuid\n" + + "Bytes: 7\n" + + "comment\n" + + "\n"); } } - assertThat(notes.getComments()) - .isEqualTo(ImmutableListMultimap.of(revId, comment)); + assertThat(notes.getComments()).isEqualTo(ImmutableListMultimap.of(revId, comment)); } @Test @@ -1896,9 +2094,20 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { Timestamp time = TimeUtil.nowTs(); PatchSet.Id psId = c.currentPatchSetId(); - Comment comment = newComment(psId, "file1", uuid, range, range.getEndLine(), - user, null, time, "comment", (short) 1, - "abcd1234abcd1234abcd1234abcd1234abcd1234", false); + Comment comment = + newComment( + psId, + "file1", + uuid, + range, + range.getEndLine(), + user, + null, + time, + "comment", + (short) 1, + "abcd1234abcd1234abcd1234abcd1234abcd1234", + false); update.setPatchSetId(psId); update.putComment(Status.PUBLISHED, comment); update.commit(); @@ -1906,30 +2115,29 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { ChangeNotes notes = newNotes(c); try (RevWalk walk = new RevWalk(repo)) { - ArrayList notesInTree = - Lists.newArrayList(notes.revisionNoteMap.noteMap.iterator()); + ArrayList notesInTree = Lists.newArrayList(notes.revisionNoteMap.noteMap.iterator()); Note note = Iterables.getOnlyElement(notesInTree); - byte[] bytes = - walk.getObjectReader().open( - note.getData(), Constants.OBJ_BLOB).getBytes(); + byte[] bytes = walk.getObjectReader().open(note.getData(), Constants.OBJ_BLOB).getBytes(); String noteString = new String(bytes, UTF_8); String timeStr = ChangeNoteUtil.formatTime(serverIdent, time); if (!testJson()) { - assertThat(noteString).isEqualTo( - "Revision: abcd1234abcd1234abcd1234abcd1234abcd1234\n" - + "Patch-set: 1\n" - + "File: file1\n" - + "\n" - + "1:1-2:1\n" - + timeStr + "\n" - + "Author: Weird\u0002User <3@gerrit>\n" - + "Unresolved: false\n" - + "UUID: uuid\n" - + "Bytes: 7\n" - + "comment\n" - + "\n"); + assertThat(noteString) + .isEqualTo( + "Revision: abcd1234abcd1234abcd1234abcd1234abcd1234\n" + + "Patch-set: 1\n" + + "File: file1\n" + + "\n" + + "1:1-2:1\n" + + timeStr + + "\n" + + "Author: Weird\u0002User <3@gerrit>\n" + + "Unresolved: false\n" + + "UUID: uuid\n" + + "Bytes: 7\n" + + "comment\n" + + "\n"); } } assertThat(notes.getComments()) @@ -1937,8 +2145,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { } @Test - public void patchLineCommentMultipleOnePatchsetOneFileBothSides() - throws Exception { + public void patchLineCommentMultipleOnePatchsetOneFileBothSides() throws Exception { Change c = newChange(); ChangeUpdate update = newUpdate(c, otherUser); String uuid1 = "uuid1"; @@ -1952,25 +2159,47 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { PatchSet.Id psId = c.currentPatchSetId(); Comment commentForBase = - newComment(psId, "filename", uuid1, range, range.getEndLine(), - otherUser, null, now, messageForBase, (short) 0, rev1, false); + newComment( + psId, + "filename", + uuid1, + range, + range.getEndLine(), + otherUser, + null, + now, + messageForBase, + (short) 0, + rev1, + false); update.setPatchSetId(psId); update.putComment(Status.PUBLISHED, commentForBase); update.commit(); update = newUpdate(c, otherUser); Comment commentForPS = - newComment(psId, "filename", uuid2, range, range.getEndLine(), - otherUser, null, now, messageForPS, - (short) 1, rev2, false); + newComment( + psId, + "filename", + uuid2, + range, + range.getEndLine(), + otherUser, + null, + now, + messageForPS, + (short) 1, + rev2, + false); update.setPatchSetId(psId); update.putComment(Status.PUBLISHED, commentForPS); update.commit(); - assertThat(newNotes(c).getComments()).containsExactlyEntriesIn( - ImmutableListMultimap.of( - new RevId(rev1), commentForBase, - new RevId(rev2), commentForPS)); + assertThat(newNotes(c).getComments()) + .containsExactlyEntriesIn( + ImmutableListMultimap.of( + new RevId(rev1), commentForBase, + new RevId(rev2), commentForPS)); } @Test @@ -1988,29 +2217,52 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { Timestamp timeForComment1 = TimeUtil.nowTs(); Timestamp timeForComment2 = TimeUtil.nowTs(); Comment comment1 = - newComment(psId, filename, uuid1, range, range.getEndLine(), otherUser, - null, timeForComment1, "comment 1", side, rev, false); + newComment( + psId, + filename, + uuid1, + range, + range.getEndLine(), + otherUser, + null, + timeForComment1, + "comment 1", + side, + rev, + false); update.setPatchSetId(psId); update.putComment(Status.PUBLISHED, comment1); update.commit(); update = newUpdate(c, otherUser); Comment comment2 = - newComment(psId, filename, uuid2, range, range.getEndLine(), otherUser, - null, timeForComment2, "comment 2", side, rev, false); + newComment( + psId, + filename, + uuid2, + range, + range.getEndLine(), + otherUser, + null, + timeForComment2, + "comment 2", + side, + rev, + false); update.setPatchSetId(psId); update.putComment(Status.PUBLISHED, comment2); update.commit(); - assertThat(newNotes(c).getComments()).containsExactlyEntriesIn( - ImmutableListMultimap.of( - new RevId(rev), comment1, - new RevId(rev), comment2)).inOrder(); + assertThat(newNotes(c).getComments()) + .containsExactlyEntriesIn( + ImmutableListMultimap.of( + new RevId(rev), comment1, + new RevId(rev), comment2)) + .inOrder(); } @Test - public void patchLineCommentMultipleOnePatchsetMultipleFiles() - throws Exception { + public void patchLineCommentMultipleOnePatchsetMultipleFiles() throws Exception { Change c = newChange(); String uuid = "uuid"; String rev = "abcd1234abcd1234abcd1234abcd1234abcd1234"; @@ -2022,25 +2274,49 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { ChangeUpdate update = newUpdate(c, otherUser); Timestamp now = TimeUtil.nowTs(); - Comment comment1 = newComment(psId, filename1, - uuid, range, range.getEndLine(), otherUser, null, now, "comment 1", - side, rev, false); + Comment comment1 = + newComment( + psId, + filename1, + uuid, + range, + range.getEndLine(), + otherUser, + null, + now, + "comment 1", + side, + rev, + false); update.setPatchSetId(psId); update.putComment(Status.PUBLISHED, comment1); update.commit(); update = newUpdate(c, otherUser); - Comment comment2 = newComment(psId, filename2, - uuid, range, range.getEndLine(), otherUser, null, now, "comment 2", - side, rev, false); + Comment comment2 = + newComment( + psId, + filename2, + uuid, + range, + range.getEndLine(), + otherUser, + null, + now, + "comment 2", + side, + rev, + false); update.setPatchSetId(psId); update.putComment(Status.PUBLISHED, comment2); update.commit(); - assertThat(newNotes(c).getComments()).containsExactlyEntriesIn( - ImmutableListMultimap.of( - new RevId(rev), comment1, - new RevId(rev), comment2)).inOrder(); + assertThat(newNotes(c).getComments()) + .containsExactlyEntriesIn( + ImmutableListMultimap.of( + new RevId(rev), comment1, + new RevId(rev), comment2)) + .inOrder(); } @Test @@ -2056,9 +2332,20 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { ChangeUpdate update = newUpdate(c, otherUser); Timestamp now = TimeUtil.nowTs(); - Comment comment1 = newComment(ps1, filename, uuid, range, - range.getEndLine(), otherUser, null, now, "comment on ps1", - side, rev1, false); + Comment comment1 = + newComment( + ps1, + filename, + uuid, + range, + range.getEndLine(), + otherUser, + null, + now, + "comment on ps1", + side, + rev1, + false); update.setPatchSetId(ps1); update.putComment(Status.PUBLISHED, comment1); update.commit(); @@ -2068,17 +2355,29 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { update = newUpdate(c, otherUser); now = TimeUtil.nowTs(); - Comment comment2 = newComment(ps2, filename, uuid, range, - range.getEndLine(), otherUser, null, now, "comment on ps2", - side, rev2, false); + Comment comment2 = + newComment( + ps2, + filename, + uuid, + range, + range.getEndLine(), + otherUser, + null, + now, + "comment on ps2", + side, + rev2, + false); update.setPatchSetId(ps2); update.putComment(Status.PUBLISHED, comment2); update.commit(); - assertThat(newNotes(c).getComments()).containsExactlyEntriesIn( - ImmutableListMultimap.of( - new RevId(rev1), comment1, - new RevId(rev2), comment2)); + assertThat(newNotes(c).getComments()) + .containsExactlyEntriesIn( + ImmutableListMultimap.of( + new RevId(rev1), comment1, + new RevId(rev2), comment2)); } @Test @@ -2093,16 +2392,27 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { ChangeUpdate update = newUpdate(c, otherUser); Timestamp now = TimeUtil.nowTs(); - Comment comment1 = newComment(ps1, filename, uuid, range, - range.getEndLine(), otherUser, null, now, "comment on ps1", - side, rev, false); + Comment comment1 = + newComment( + ps1, + filename, + uuid, + range, + range.getEndLine(), + otherUser, + null, + now, + "comment on ps1", + side, + rev, + false); update.setPatchSetId(ps1); update.putComment(Status.DRAFT, comment1); update.commit(); ChangeNotes notes = newNotes(c); - assertThat(notes.getDraftComments(otherUserId)).containsExactlyEntriesIn( - ImmutableListMultimap.of(new RevId(rev), comment1)); + assertThat(notes.getDraftComments(otherUserId)) + .containsExactlyEntriesIn(ImmutableListMultimap.of(new RevId(rev), comment1)); assertThat(notes.getComments()).isEmpty(); update = newUpdate(c, otherUser); @@ -2112,13 +2422,12 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { notes = newNotes(c); assertThat(notes.getDraftComments(otherUserId)).isEmpty(); - assertThat(notes.getComments()).containsExactlyEntriesIn( - ImmutableListMultimap.of(new RevId(rev), comment1)); + assertThat(notes.getComments()) + .containsExactlyEntriesIn(ImmutableListMultimap.of(new RevId(rev), comment1)); } @Test - public void patchLineCommentMultipleDraftsSameSidePublishOne() - throws Exception { + public void patchLineCommentMultipleDraftsSameSidePublishOne() throws Exception { Change c = newChange(); String uuid1 = "uuid1"; String uuid2 = "uuid2"; @@ -2133,21 +2442,45 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { // Write two drafts on the same side of one patch set. ChangeUpdate update = newUpdate(c, otherUser); update.setPatchSetId(psId); - Comment comment1 = newComment(psId, filename, uuid1, range1, - range1.getEndLine(), otherUser, null, now, "comment on ps1", - side, rev, false); - Comment comment2 = newComment(psId, filename, uuid2, range2, - range2.getEndLine(), otherUser, null, now, "other on ps1", - side, rev, false); + Comment comment1 = + newComment( + psId, + filename, + uuid1, + range1, + range1.getEndLine(), + otherUser, + null, + now, + "comment on ps1", + side, + rev, + false); + Comment comment2 = + newComment( + psId, + filename, + uuid2, + range2, + range2.getEndLine(), + otherUser, + null, + now, + "other on ps1", + side, + rev, + false); update.putComment(Status.DRAFT, comment1); update.putComment(Status.DRAFT, comment2); update.commit(); ChangeNotes notes = newNotes(c); - assertThat(notes.getDraftComments(otherUserId)).containsExactlyEntriesIn( - ImmutableListMultimap.of( - new RevId(rev), comment1, - new RevId(rev), comment2)).inOrder(); + assertThat(notes.getDraftComments(otherUserId)) + .containsExactlyEntriesIn( + ImmutableListMultimap.of( + new RevId(rev), comment1, + new RevId(rev), comment2)) + .inOrder(); assertThat(notes.getComments()).isEmpty(); // Publish first draft. @@ -2157,15 +2490,14 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { update.commit(); notes = newNotes(c); - assertThat(notes.getDraftComments(otherUserId)).containsExactlyEntriesIn( - ImmutableListMultimap.of(new RevId(rev), comment2)); - assertThat(notes.getComments()).containsExactlyEntriesIn( - ImmutableListMultimap.of(new RevId(rev), comment1)); + assertThat(notes.getDraftComments(otherUserId)) + .containsExactlyEntriesIn(ImmutableListMultimap.of(new RevId(rev), comment2)); + assertThat(notes.getComments()) + .containsExactlyEntriesIn(ImmutableListMultimap.of(new RevId(rev), comment1)); } @Test - public void patchLineCommentsMultipleDraftsBothSidesPublishAll() - throws Exception { + public void patchLineCommentsMultipleDraftsBothSidesPublishAll() throws Exception { Change c = newChange(); String uuid1 = "uuid1"; String uuid2 = "uuid2"; @@ -2181,21 +2513,44 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { ChangeUpdate update = newUpdate(c, otherUser); update.setPatchSetId(psId); Comment baseComment = - newComment(psId, filename, uuid1, range1, range1.getEndLine(), - otherUser, null, now, "comment on base", (short) 0, rev1, false); + newComment( + psId, + filename, + uuid1, + range1, + range1.getEndLine(), + otherUser, + null, + now, + "comment on base", + (short) 0, + rev1, + false); Comment psComment = - newComment(psId, filename, uuid2, range2, range2.getEndLine(), - otherUser, null, now, "comment on ps", (short) 1, rev2, false); + newComment( + psId, + filename, + uuid2, + range2, + range2.getEndLine(), + otherUser, + null, + now, + "comment on ps", + (short) 1, + rev2, + false); update.putComment(Status.DRAFT, baseComment); update.putComment(Status.DRAFT, psComment); update.commit(); ChangeNotes notes = newNotes(c); - assertThat(notes.getDraftComments(otherUserId)).containsExactlyEntriesIn( - ImmutableListMultimap.of( - new RevId(rev1), baseComment, - new RevId(rev2), psComment)); + assertThat(notes.getDraftComments(otherUserId)) + .containsExactlyEntriesIn( + ImmutableListMultimap.of( + new RevId(rev1), baseComment, + new RevId(rev2), psComment)); assertThat(notes.getComments()).isEmpty(); // Publish both comments. @@ -2208,10 +2563,11 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { notes = newNotes(c); assertThat(notes.getDraftComments(otherUserId)).isEmpty(); - assertThat(notes.getComments()).containsExactlyEntriesIn( - ImmutableListMultimap.of( - new RevId(rev1), baseComment, - new RevId(rev2), psComment)); + assertThat(notes.getComments()) + .containsExactlyEntriesIn( + ImmutableListMultimap.of( + new RevId(rev1), baseComment, + new RevId(rev2), psComment)); } @Test @@ -2227,17 +2583,27 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { ChangeUpdate update = newUpdate(c, otherUser); Timestamp now = TimeUtil.nowTs(); - Comment comment = newComment(psId, filename, uuid, range, - range.getEndLine(), otherUser, null, now, "comment on ps1", - side, rev, false); + Comment comment = + newComment( + psId, + filename, + uuid, + range, + range.getEndLine(), + otherUser, + null, + now, + "comment on ps1", + side, + rev, + false); update.setPatchSetId(psId); update.putComment(Status.DRAFT, comment); update.commit(); ChangeNotes notes = newNotes(c); assertThat(notes.getDraftComments(otherUserId)).hasSize(1); - assertThat(notes.getDraftCommentNotes().getNoteMap().contains(objId)) - .isTrue(); + assertThat(notes.getDraftCommentNotes().getNoteMap().contains(objId)).isTrue(); update = newUpdate(c, otherUser); now = TimeUtil.nowTs(); @@ -2251,8 +2617,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { } @Test - public void patchLineCommentsDeleteAllDraftsForOneRevision() - throws Exception { + public void patchLineCommentsDeleteAllDraftsForOneRevision() throws Exception { Change c = newChange(); String uuid = "uuid"; String rev1 = "abcd1234abcd1234abcd1234abcd1234abcd1234"; @@ -2266,9 +2631,20 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { ChangeUpdate update = newUpdate(c, otherUser); Timestamp now = TimeUtil.nowTs(); - Comment comment1 = newComment(ps1, filename, uuid, range, - range.getEndLine(), otherUser, null, now, "comment on ps1", - side, rev1, false); + Comment comment1 = + newComment( + ps1, + filename, + uuid, + range, + range.getEndLine(), + otherUser, + null, + now, + "comment on ps1", + side, + rev1, + false); update.setPatchSetId(ps1); update.putComment(Status.DRAFT, comment1); update.commit(); @@ -2278,9 +2654,20 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { update = newUpdate(c, otherUser); now = TimeUtil.nowTs(); - Comment comment2 = newComment(ps2, filename, uuid, range, - range.getEndLine(), otherUser, null, now, "comment on ps2", - side, rev2, false); + Comment comment2 = + newComment( + ps2, + filename, + uuid, + range, + range.getEndLine(), + otherUser, + null, + now, + "comment on ps2", + side, + rev2, + false); update.setPatchSetId(ps2); update.putComment(Status.DRAFT, comment2); update.commit(); @@ -2302,8 +2689,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { } @Test - public void addingPublishedCommentDoesNotCreateNoOpCommitOnEmptyDraftRef() - throws Exception { + public void addingPublishedCommentDoesNotCreateNoOpCommitOnEmptyDraftRef() throws Exception { Change c = newChange(); String uuid = "uuid"; String rev = "abcd4567abcd4567abcd4567abcd4567abcd4567"; @@ -2314,8 +2700,20 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { ChangeUpdate update = newUpdate(c, otherUser); Timestamp now = TimeUtil.nowTs(); - Comment comment = newComment(ps1, filename, uuid, range, range.getEndLine(), - otherUser, null, now, "comment on ps1", side, rev, false); + Comment comment = + newComment( + ps1, + filename, + uuid, + range, + range.getEndLine(), + otherUser, + null, + now, + "comment on ps1", + side, + rev, + false); update.putComment(Status.PUBLISHED, comment); update.commit(); @@ -2325,8 +2723,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { } @Test - public void addingPublishedCommentDoesNotCreateNoOpCommitOnNonEmptyDraftRef() - throws Exception { + public void addingPublishedCommentDoesNotCreateNoOpCommitOnNonEmptyDraftRef() throws Exception { Change c = newChange(); String rev = "abcd4567abcd4567abcd4567abcd4567abcd4567"; CommentRange range = new CommentRange(1, 1, 2, 1); @@ -2337,8 +2734,19 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { ChangeUpdate update = newUpdate(c, otherUser); Timestamp now = TimeUtil.nowTs(); Comment draft = - newComment(ps1, filename, "uuid1", range, range.getEndLine(), otherUser, - null, now, "draft comment on ps1", side, rev, false); + newComment( + ps1, + filename, + "uuid1", + range, + range.getEndLine(), + otherUser, + null, + now, + "draft comment on ps1", + side, + rev, + false); update.putComment(Status.DRAFT, draft); update.commit(); @@ -2347,8 +2755,20 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { assertThat(old).isNotNull(); update = newUpdate(c, otherUser); - Comment pub = newComment(ps1, filename, "uuid2", range, range.getEndLine(), - otherUser, null, now, "comment on ps1", side, rev, false); + Comment pub = + newComment( + ps1, + filename, + "uuid2", + range, + range.getEndLine(), + otherUser, + null, + now, + "comment on ps1", + side, + rev, + false); update.putComment(Status.PUBLISHED, pub); update.commit(); @@ -2365,14 +2785,26 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { Timestamp now = TimeUtil.nowTs(); PatchSet.Id psId = c.currentPatchSetId(); - Comment comment = newComment(psId, "filename", uuid, null, 0, otherUser, - null, now, messageForBase, (short) 0, rev, false); + Comment comment = + newComment( + psId, + "filename", + uuid, + null, + 0, + otherUser, + null, + now, + messageForBase, + (short) 0, + rev, + false); update.setPatchSetId(psId); update.putComment(Status.PUBLISHED, comment); update.commit(); - assertThat(newNotes(c).getComments()).containsExactlyEntriesIn( - ImmutableListMultimap.of(new RevId(rev), comment)); + assertThat(newNotes(c).getComments()) + .containsExactlyEntriesIn(ImmutableListMultimap.of(new RevId(rev), comment)); } @Test @@ -2385,14 +2817,26 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { Timestamp now = TimeUtil.nowTs(); PatchSet.Id psId = c.currentPatchSetId(); - Comment comment = newComment(psId, "filename", uuid, null, 1, otherUser, - null, now, messageForBase, (short) 0, rev, false); + Comment comment = + newComment( + psId, + "filename", + uuid, + null, + 1, + otherUser, + null, + now, + messageForBase, + (short) 0, + rev, + false); update.setPatchSetId(psId); update.putComment(Status.PUBLISHED, comment); update.commit(); - assertThat(newNotes(c).getComments()).containsExactlyEntriesIn( - ImmutableListMultimap.of(new RevId(rev), comment)); + assertThat(newNotes(c).getComments()) + .containsExactlyEntriesIn(ImmutableListMultimap.of(new RevId(rev), comment)); } @Test @@ -2412,12 +2856,34 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { ChangeUpdate update = newUpdate(c, otherUser); update.setPatchSetId(ps2); Timestamp now = TimeUtil.nowTs(); - Comment comment1 = newComment(ps1, filename, uuid, range, - range.getEndLine(), otherUser, null, now, "comment on ps1", - side, rev1, false); - Comment comment2 = newComment(ps2, filename, uuid, range, - range.getEndLine(), otherUser, null, now, "comment on ps2", - side, rev2, false); + Comment comment1 = + newComment( + ps1, + filename, + uuid, + range, + range.getEndLine(), + otherUser, + null, + now, + "comment on ps1", + side, + rev1, + false); + Comment comment2 = + newComment( + ps2, + filename, + uuid, + range, + range.getEndLine(), + otherUser, + null, + now, + "comment on ps2", + side, + rev2, + false); update.putComment(Status.DRAFT, comment1); update.putComment(Status.DRAFT, comment2); update.commit(); @@ -2448,19 +2914,40 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { ChangeUpdate update = newUpdate(c, otherUser); update.setPatchSetId(ps1); Timestamp now = TimeUtil.nowTs(); - Comment comment1 = newComment(ps1, "file1", "uuid1", range, - range.getEndLine(), otherUser, null, now, "comment1", - side, rev1.get(), false); - Comment comment2 = newComment(ps1, "file2", "uuid2", range, - range.getEndLine(), otherUser, null, now, "comment2", - side, rev1.get(), false); + Comment comment1 = + newComment( + ps1, + "file1", + "uuid1", + range, + range.getEndLine(), + otherUser, + null, + now, + "comment1", + side, + rev1.get(), + false); + Comment comment2 = + newComment( + ps1, + "file2", + "uuid2", + range, + range.getEndLine(), + otherUser, + null, + now, + "comment2", + side, + rev1.get(), + false); update.putComment(Status.DRAFT, comment1); update.putComment(Status.DRAFT, comment2); update.commit(); ChangeNotes notes = newNotes(c); - assertThat(notes.getDraftComments(otherUserId).get(rev1)) - .containsExactly(comment1, comment2); + assertThat(notes.getDraftComments(otherUserId).get(rev1)).containsExactly(comment1, comment2); assertThat(notes.getComments()).isEmpty(); update = newUpdate(c, otherUser); @@ -2469,8 +2956,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { update.commit(); notes = newNotes(c); - assertThat(notes.getDraftComments(otherUserId).get(rev1)) - .containsExactly(comment1); + assertThat(notes.getDraftComments(otherUserId).get(rev1)).containsExactly(comment1); assertThat(notes.getComments().get(rev1)).containsExactly(comment2); } @@ -2501,11 +2987,33 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { ChangeUpdate update = newUpdate(c, otherUser); Timestamp now = TimeUtil.nowTs(); Comment comment1 = - newComment(ps1, "file1", "uuid1", range, range.getEndLine(), otherUser, - null, now, "comment on ps1", side, rev1.get(), false); + newComment( + ps1, + "file1", + "uuid1", + range, + range.getEndLine(), + otherUser, + null, + now, + "comment on ps1", + side, + rev1.get(), + false); Comment comment2 = - newComment(ps1, "file2", "uuid2", range, range.getEndLine(), otherUser, - null, now, "another comment", side, rev1.get(), false); + newComment( + ps1, + "file2", + "uuid2", + range, + range.getEndLine(), + otherUser, + null, + now, + "another comment", + side, + rev1.get(), + false); update.putComment(Status.DRAFT, comment1); update.putComment(Status.DRAFT, comment2); update.commit(); @@ -2523,26 +3031,21 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { // Re-add draft version of comment2 back to draft ref without updating // change ref. Simulates the case where deleting the draft failed // non-atomically after adding the published comment succeeded. - ChangeDraftUpdate draftUpdate = - newUpdate(c, otherUser).createDraftUpdateIfNull(); + ChangeDraftUpdate draftUpdate = newUpdate(c, otherUser).createDraftUpdateIfNull(); draftUpdate.putComment(comment2); - try (NoteDbUpdateManager manager = - updateManagerFactory.create(c.getProject())) { + try (NoteDbUpdateManager manager = updateManagerFactory.create(c.getProject())) { manager.add(draftUpdate); manager.execute(); } // Looking at drafts directly shows the zombie comment. DraftCommentNotes draftNotes = draftNotesFactory.create(c, otherUserId); - assertThat(draftNotes.load().getComments().get(rev1)) - .containsExactly(comment1, comment2); + assertThat(draftNotes.load().getComments().get(rev1)).containsExactly(comment1, comment2); // Zombie comment is filtered out of drafts via ChangeNotes. ChangeNotes notes = newNotes(c); - assertThat(notes.getDraftComments(otherUserId).get(rev1)) - .containsExactly(comment1); - assertThat(notes.getComments().get(rev1)) - .containsExactly(comment2); + assertThat(notes.getDraftComments(otherUserId).get(rev1)).containsExactly(comment1); + assertThat(notes.getComments().get(rev1)).containsExactly(comment2); update = newUpdate(c, otherUser); update.setPatchSetId(ps1); @@ -2560,17 +3063,37 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { String rev = "abcd1234abcd1234abcd1234abcd1234abcd1234"; ChangeUpdate update1 = newUpdate(c, otherUser); - Comment comment1 = newComment(c.currentPatchSetId(), "filename", - "uuid1", range, range.getEndLine(), otherUser, null, - new Timestamp(update1.getWhen().getTime()), "comment 1", - (short) 1, rev, false); + Comment comment1 = + newComment( + c.currentPatchSetId(), + "filename", + "uuid1", + range, + range.getEndLine(), + otherUser, + null, + new Timestamp(update1.getWhen().getTime()), + "comment 1", + (short) 1, + rev, + false); update1.putComment(Status.PUBLISHED, comment1); ChangeUpdate update2 = newUpdate(c, otherUser); - Comment comment2 = newComment(c.currentPatchSetId(), "filename", - "uuid2", range, range.getEndLine(), otherUser, null, - new Timestamp(update2.getWhen().getTime()), "comment 2", - (short) 1, rev, false); + Comment comment2 = + newComment( + c.currentPatchSetId(), + "filename", + "uuid2", + range, + range.getEndLine(), + otherUser, + null, + new Timestamp(update2.getWhen().getTime()), + "comment 2", + (short) 1, + rev, + false); update2.putComment(Status.PUBLISHED, comment2); try (NoteDbUpdateManager manager = updateManagerFactory.create(project)) { @@ -2589,8 +3112,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { @Test public void realUser() throws Exception { Change c = newChange(); - CurrentUser ownerAsOtherUser = - userFactory.runAs(null, otherUserId, changeOwner); + CurrentUser ownerAsOtherUser = userFactory.runAs(null, otherUserId, changeOwner); ChangeUpdate update = newUpdate(c, ownerAsOtherUser); update.setChangeMessage("Message on behalf of other user"); update.commit(); @@ -2611,15 +3133,24 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { int numComments = notes.getComments().size(); ChangeUpdate update = newUpdate(c, changeOwner); - update.setPatchSetId( - new PatchSet.Id(c.getId(), c.currentPatchSetId().get() + 1)); + update.setPatchSetId(new PatchSet.Id(c.getId(), c.currentPatchSetId().get() + 1)); update.setChangeMessage("Should be ignored"); update.putApproval("Code-Review", (short) 2); CommentRange range = new CommentRange(1, 1, 2, 1); - Comment comment = newComment(update.getPatchSetId(), "filename", - "uuid", range, range.getEndLine(), changeOwner, null, - new Timestamp(update.getWhen().getTime()), "comment", (short) 1, - "abcd1234abcd1234abcd1234abcd1234abcd1234", false); + Comment comment = + newComment( + update.getPatchSetId(), + "filename", + "uuid", + range, + range.getEndLine(), + changeOwner, + null, + new Timestamp(update.getWhen().getTime()), + "comment", + (short) 1, + "abcd1234abcd1234abcd1234abcd1234abcd1234", + false); update.putComment(Status.PUBLISHED, comment); update.commit(); @@ -2668,8 +3199,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { private String readNote(ChangeNotes notes, ObjectId noteId) throws Exception { ObjectId dataId = notes.revisionNoteMap.noteMap.getNote(noteId).getData(); - return new String( - rw.getObjectReader().open(dataId, OBJ_BLOB).getCachedBytes(), UTF_8); + return new String(rw.getObjectReader().open(dataId, OBJ_BLOB).getCachedBytes(), UTF_8); } private ObjectId exactRefAllUsers(String refName) throws Exception { @@ -2679,8 +3209,8 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { } } - private void assertCause(Throwable e, - Class expectedClass, String expectedMsg) { + private void assertCause( + Throwable e, Class expectedClass, String expectedMsg) { Throwable cause = null; for (Throwable t : Throwables.getCausalChain(e)) { if (expectedClass.isAssignableFrom(t.getClass())) { @@ -2689,8 +3219,10 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { } } assertThat(cause) - .named(expectedClass.getSimpleName() + " in causal chain of:\n" - + Throwables.getStackTraceAsString(e)) + .named( + expectedClass.getSimpleName() + + " in causal chain of:\n" + + Throwables.getStackTraceAsString(e)) .isNotNull(); assertThat(cause.getMessage()).isEqualTo(expectedMsg); } @@ -2703,12 +3235,9 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { return incrementPatchSet(c, userFactory.create(c.getOwner())); } - private RevCommit incrementPatchSet(Change c, IdentifiedUser user) - throws Exception { + private RevCommit incrementPatchSet(Change c, IdentifiedUser user) throws Exception { incrementCurrentPatchSetFieldOnly(c); - RevCommit commit = tr.commit() - .message("PS" + c.currentPatchSetId().get()) - .create(); + RevCommit commit = tr.commit().message("PS" + c.currentPatchSetId().get()).create(); ChangeUpdate update = newUpdate(c, user); update.setCommit(rw, commit); update.commit(); diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/CommitMessageOutputTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/CommitMessageOutputTest.java index 1c1f653d93..2e58382685 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/CommitMessageOutputTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/CommitMessageOutputTest.java @@ -26,7 +26,8 @@ import com.google.gerrit.server.CurrentUser; import com.google.gerrit.server.util.RequestId; import com.google.gerrit.testutil.ConfigSuite; import com.google.gerrit.testutil.TestChanges; - +import java.util.Date; +import java.util.TimeZone; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.revwalk.RevCommit; @@ -34,9 +35,6 @@ import org.eclipse.jgit.revwalk.RevWalk; import org.junit.Test; import org.junit.runner.RunWith; -import java.util.Date; -import java.util.TimeZone; - @RunWith(ConfigSuite.class) public class CommitMessageOutputTest extends AbstractChangeNotesTest { @Test @@ -51,26 +49,29 @@ public class CommitMessageOutputTest extends AbstractChangeNotesTest { assertThat(update.getRefName()).isEqualTo("refs/changes/01/1/meta"); RevCommit commit = parseCommit(update.getResult()); - assertBodyEquals("Update patch set 1\n" - + "\n" - + "Patch-set: 1\n" - + "Change-id: " + c.getKey().get() + "\n" - + "Subject: Change subject\n" - + "Branch: refs/heads/master\n" - + "Commit: " + update.getCommit().name() + "\n" - + "Reviewer: Change Owner <1@gerrit>\n" - + "CC: Other Account <2@gerrit>\n" - + "Label: Code-Review=-1\n" - + "Label: Verified=+1\n", + assertBodyEquals( + "Update patch set 1\n" + + "\n" + + "Patch-set: 1\n" + + "Change-id: " + + c.getKey().get() + + "\n" + + "Subject: Change subject\n" + + "Branch: refs/heads/master\n" + + "Commit: " + + update.getCommit().name() + + "\n" + + "Reviewer: Change Owner <1@gerrit>\n" + + "CC: Other Account <2@gerrit>\n" + + "Label: Code-Review=-1\n" + + "Label: Verified=+1\n", commit); PersonIdent author = commit.getAuthorIdent(); assertThat(author.getName()).isEqualTo("Change Owner"); assertThat(author.getEmailAddress()).isEqualTo("1@gerrit"); - assertThat(author.getWhen()) - .isEqualTo(new Date(c.getCreatedOn().getTime() + 1000)); - assertThat(author.getTimeZone()) - .isEqualTo(TimeZone.getTimeZone("GMT-7:00")); + assertThat(author.getWhen()).isEqualTo(new Date(c.getCreatedOn().getTime() + 1000)); + assertThat(author.getTimeZone()).isEqualTo(TimeZone.getTimeZone("GMT-7:00")); PersonIdent committer = commit.getCommitterIdent(); assertThat(committer.getName()).isEqualTo("Gerrit Server"); @@ -83,21 +84,25 @@ public class CommitMessageOutputTest extends AbstractChangeNotesTest { public void changeMessageCommitFormatSimple() throws Exception { Change c = TestChanges.newChange(project, changeOwner.getAccountId(), 1); ChangeUpdate update = newUpdate(c, changeOwner); - update.setChangeMessage("Just a little code change.\n" - + "How about a new line"); + update.setChangeMessage("Just a little code change.\n" + "How about a new line"); update.commit(); assertThat(update.getRefName()).isEqualTo("refs/changes/01/1/meta"); - assertBodyEquals("Update patch set 1\n" - + "\n" - + "Just a little code change.\n" - + "How about a new line\n" - + "\n" - + "Patch-set: 1\n" - + "Change-id: " + c.getKey().get() + "\n" - + "Subject: Change subject\n" - + "Branch: refs/heads/master\n" - + "Commit: " + update.getCommit().name() + "\n", + assertBodyEquals( + "Update patch set 1\n" + + "\n" + + "Just a little code change.\n" + + "How about a new line\n" + + "\n" + + "Patch-set: 1\n" + + "Change-id: " + + c.getKey().get() + + "\n" + + "Subject: Change subject\n" + + "Branch: refs/heads/master\n" + + "Commit: " + + update.getCommit().name() + + "\n", update.getResult()); } @@ -111,15 +116,20 @@ public class CommitMessageOutputTest extends AbstractChangeNotesTest { update.commit(); assertThat(update.getRefName()).isEqualTo("refs/changes/01/1/meta"); - assertBodyEquals("Update patch set 1\n" - + "\n" - + "Foo\n" - + "\n" - + "Patch-set: 1\n" - + "Change-id: " + c.getKey().get() + "\n" - + "Subject: Subject\n" - + "Branch: refs/heads/master\n" - + "Commit: " + commit.name() + "\n", + assertBodyEquals( + "Update patch set 1\n" + + "\n" + + "Foo\n" + + "\n" + + "Patch-set: 1\n" + + "Change-id: " + + c.getKey().get() + + "\n" + + "Subject: Subject\n" + + "Branch: refs/heads/master\n" + + "Commit: " + + commit.name() + + "\n", update.getResult()); } @@ -130,10 +140,8 @@ public class CommitMessageOutputTest extends AbstractChangeNotesTest { update.removeApproval("Code-Review"); update.commit(); - assertBodyEquals("Update patch set 1\n" - + "\n" - + "Patch-set: 1\n" - + "Label: -Code-Review\n", + assertBodyEquals( + "Update patch set 1\n" + "\n" + "Patch-set: 1\n" + "Label: -Code-Review\n", update.getResult()); } @@ -144,36 +152,43 @@ public class CommitMessageOutputTest extends AbstractChangeNotesTest { update.setSubjectForCommit("Submit patch set 1"); RequestId submissionId = RequestId.forChange(c); - update.merge(submissionId, ImmutableList.of( - submitRecord("NOT_READY", null, - submitLabel("Verified", "OK", changeOwner.getAccountId()), - submitLabel("Code-Review", "NEED", null)), - submitRecord("NOT_READY", null, - submitLabel("Verified", "OK", changeOwner.getAccountId()), - submitLabel("Alternative-Code-Review", "NEED", null)))); + update.merge( + submissionId, + ImmutableList.of( + submitRecord( + "NOT_READY", + null, + submitLabel("Verified", "OK", changeOwner.getAccountId()), + submitLabel("Code-Review", "NEED", null)), + submitRecord( + "NOT_READY", + null, + submitLabel("Verified", "OK", changeOwner.getAccountId()), + submitLabel("Alternative-Code-Review", "NEED", null)))); update.commit(); RevCommit commit = parseCommit(update.getResult()); - assertBodyEquals("Submit patch set 1\n" - + "\n" - + "Patch-set: 1\n" - + "Status: merged\n" - + "Submission-id: " + submissionId.toStringForStorage() + "\n" - + "Submitted-with: NOT_READY\n" - + "Submitted-with: OK: Verified: Change Owner <1@gerrit>\n" - + "Submitted-with: NEED: Code-Review\n" - + "Submitted-with: NOT_READY\n" - + "Submitted-with: OK: Verified: Change Owner <1@gerrit>\n" - + "Submitted-with: NEED: Alternative-Code-Review\n", + assertBodyEquals( + "Submit patch set 1\n" + + "\n" + + "Patch-set: 1\n" + + "Status: merged\n" + + "Submission-id: " + + submissionId.toStringForStorage() + + "\n" + + "Submitted-with: NOT_READY\n" + + "Submitted-with: OK: Verified: Change Owner <1@gerrit>\n" + + "Submitted-with: NEED: Code-Review\n" + + "Submitted-with: NOT_READY\n" + + "Submitted-with: OK: Verified: Change Owner <1@gerrit>\n" + + "Submitted-with: NEED: Alternative-Code-Review\n", commit); PersonIdent author = commit.getAuthorIdent(); assertThat(author.getName()).isEqualTo("Change Owner"); assertThat(author.getEmailAddress()).isEqualTo("1@gerrit"); - assertThat(author.getWhen()) - .isEqualTo(new Date(c.getCreatedOn().getTime() + 2000)); - assertThat(author.getTimeZone()) - .isEqualTo(TimeZone.getTimeZone("GMT-7:00")); + assertThat(author.getWhen()).isEqualTo(new Date(c.getCreatedOn().getTime() + 2000)); + assertThat(author.getTimeZone()).isEqualTo(TimeZone.getTimeZone("GMT-7:00")); PersonIdent committer = commit.getCommitterIdent(); assertThat(committer.getName()).isEqualTo("Gerrit Server"); @@ -192,11 +207,8 @@ public class CommitMessageOutputTest extends AbstractChangeNotesTest { update.commit(); RevCommit commit = parseCommit(update.getResult()); - assertBodyEquals("Update patch set 1\n" - + "\n" - + "Comment on the change.\n" - + "\n" - + "Patch-set: 1\n", + assertBodyEquals( + "Update patch set 1\n" + "\n" + "Comment on the change.\n" + "\n" + "Patch-set: 1\n", commit); PersonIdent author = commit.getAuthorIdent(); @@ -211,16 +223,19 @@ public class CommitMessageOutputTest extends AbstractChangeNotesTest { update.setSubjectForCommit("Submit patch set 1"); RequestId submissionId = RequestId.forChange(c); - update.merge(submissionId, ImmutableList.of( - submitRecord("RULE_ERROR", "Problem with patch set:\n1"))); + update.merge( + submissionId, ImmutableList.of(submitRecord("RULE_ERROR", "Problem with patch set:\n1"))); update.commit(); - assertBodyEquals("Submit patch set 1\n" - + "\n" - + "Patch-set: 1\n" - + "Status: merged\n" - + "Submission-id: " + submissionId.toStringForStorage() + "\n" - + "Submitted-with: RULE_ERROR Problem with patch set: 1\n", + assertBodyEquals( + "Submit patch set 1\n" + + "\n" + + "Patch-set: 1\n" + + "Status: merged\n" + + "Submission-id: " + + submissionId.toStringForStorage() + + "\n" + + "Submitted-with: RULE_ERROR Problem with patch set: 1\n", update.getResult()); } @@ -231,10 +246,8 @@ public class CommitMessageOutputTest extends AbstractChangeNotesTest { update.putReviewer(changeOwner.getAccount().getId(), REVIEWER); update.commit(); - assertBodyEquals("Update patch set 1\n" - + "\n" - + "Patch-set: 1\n" - + "Reviewer: Change Owner <1@gerrit>\n", + assertBodyEquals( + "Update patch set 1\n" + "\n" + "Patch-set: 1\n" + "Reviewer: Change Owner <1@gerrit>\n", update.getResult()); } @@ -242,17 +255,17 @@ public class CommitMessageOutputTest extends AbstractChangeNotesTest { public void changeMessageWithTrailingDoubleNewline() throws Exception { Change c = newChange(); ChangeUpdate update = newUpdate(c, changeOwner); - update.setChangeMessage("Testing trailing double newline\n" - + "\n"); + update.setChangeMessage("Testing trailing double newline\n" + "\n"); update.commit(); - assertBodyEquals("Update patch set 1\n" - + "\n" - + "Testing trailing double newline\n" - + "\n" - + "\n" - + "\n" - + "Patch-set: 1\n", + assertBodyEquals( + "Update patch set 1\n" + + "\n" + + "Testing trailing double newline\n" + + "\n" + + "\n" + + "\n" + + "Patch-set: 1\n", update.getResult()); } @@ -260,22 +273,20 @@ public class CommitMessageOutputTest extends AbstractChangeNotesTest { public void changeMessageWithMultipleParagraphs() throws Exception { Change c = newChange(); ChangeUpdate update = newUpdate(c, changeOwner); - update.setChangeMessage("Testing paragraph 1\n" - + "\n" - + "Testing paragraph 2\n" - + "\n" - + "Testing paragraph 3"); + update.setChangeMessage( + "Testing paragraph 1\n" + "\n" + "Testing paragraph 2\n" + "\n" + "Testing paragraph 3"); update.commit(); - assertBodyEquals("Update patch set 1\n" - + "\n" - + "Testing paragraph 1\n" - + "\n" - + "Testing paragraph 2\n" - + "\n" - + "Testing paragraph 3\n" - + "\n" - + "Patch-set: 1\n", + assertBodyEquals( + "Update patch set 1\n" + + "\n" + + "Testing paragraph 1\n" + + "\n" + + "Testing paragraph 2\n" + + "\n" + + "Testing paragraph 3\n" + + "\n" + + "Patch-set: 1\n", update.getResult()); } @@ -287,57 +298,65 @@ public class CommitMessageOutputTest extends AbstractChangeNotesTest { update.setTag("jenkins"); update.commit(); - assertBodyEquals("Update patch set 1\n" - + "\n" - + "Change message with tag\n" - + "\n" - + "Patch-set: 1\n" - + "Tag: jenkins\n", + assertBodyEquals( + "Update patch set 1\n" + + "\n" + + "Change message with tag\n" + + "\n" + + "Patch-set: 1\n" + + "Tag: jenkins\n", update.getResult()); } @Test public void leadingWhitespace() throws Exception { Change c = TestChanges.newChange(project, changeOwner.getAccountId()); - c.setCurrentPatchSet(c.currentPatchSetId(), " " + c.getSubject(), - c.getOriginalSubject()); + c.setCurrentPatchSet(c.currentPatchSetId(), " " + c.getSubject(), c.getOriginalSubject()); ChangeUpdate update = newUpdate(c, changeOwner); update.setChangeId(c.getKey().get()); update.setBranch(c.getDest().get()); update.commit(); - assertBodyEquals("Update patch set 1\n" - + "\n" - + "Patch-set: 1\n" - + "Change-id: " + c.getKey().get() + "\n" - + "Subject: Change subject\n" - + "Branch: refs/heads/master\n" - + "Commit: " + update.getCommit().name() + "\n", + assertBodyEquals( + "Update patch set 1\n" + + "\n" + + "Patch-set: 1\n" + + "Change-id: " + + c.getKey().get() + + "\n" + + "Subject: Change subject\n" + + "Branch: refs/heads/master\n" + + "Commit: " + + update.getCommit().name() + + "\n", update.getResult()); c = TestChanges.newChange(project, changeOwner.getAccountId()); - c.setCurrentPatchSet(c.currentPatchSetId(), "\t\t" + c.getSubject(), - c.getOriginalSubject()); + c.setCurrentPatchSet(c.currentPatchSetId(), "\t\t" + c.getSubject(), c.getOriginalSubject()); update = newUpdate(c, changeOwner); update.setChangeId(c.getKey().get()); update.setBranch(c.getDest().get()); update.commit(); - assertBodyEquals("Update patch set 1\n" - + "\n" - + "Patch-set: 1\n" - + "Change-id: " + c.getKey().get() + "\n" - + "Subject: \t\tChange subject\n" - + "Branch: refs/heads/master\n" - + "Commit: " + update.getCommit().name() + "\n", + assertBodyEquals( + "Update patch set 1\n" + + "\n" + + "Patch-set: 1\n" + + "Change-id: " + + c.getKey().get() + + "\n" + + "Subject: \t\tChange subject\n" + + "Branch: refs/heads/master\n" + + "Commit: " + + update.getCommit().name() + + "\n", update.getResult()); } @Test public void realUser() throws Exception { Change c = newChange(); - CurrentUser ownerAsOtherUser = - userFactory.runAs(null, otherUserId, changeOwner); + CurrentUser ownerAsOtherUser = userFactory.runAs(null, otherUserId, changeOwner); ChangeUpdate update = newUpdate(c, ownerAsOtherUser); update.setChangeMessage("Message on behalf of other user"); update.commit(); @@ -347,12 +366,13 @@ public class CommitMessageOutputTest extends AbstractChangeNotesTest { assertThat(author.getName()).isEqualTo("Other Account"); assertThat(author.getEmailAddress()).isEqualTo("2@gerrit"); - assertBodyEquals("Update patch set 1\n" - + "\n" - + "Message on behalf of other user\n" - + "\n" - + "Patch-set: 1\n" - + "Real-user: Change Owner <1@gerrit>\n", + assertBodyEquals( + "Update patch set 1\n" + + "\n" + + "Message on behalf of other user\n" + + "\n" + + "Patch-set: 1\n" + + "Real-user: Change Owner <1@gerrit>\n", commit); } @@ -363,11 +383,8 @@ public class CommitMessageOutputTest extends AbstractChangeNotesTest { update.setCurrentPatchSet(); update.commit(); - assertBodyEquals("Update patch set 1\n" - + "\n" - + "Patch-set: 1\n" - + "Current: true\n", - update.getResult()); + assertBodyEquals( + "Update patch set 1\n" + "\n" + "Patch-set: 1\n" + "Current: true\n", update.getResult()); } private RevCommit parseCommit(ObjectId id) throws Exception { @@ -381,8 +398,7 @@ public class CommitMessageOutputTest extends AbstractChangeNotesTest { } } - private void assertBodyEquals(String expected, ObjectId commitId) - throws Exception { + private void assertBodyEquals(String expected, ObjectId commitId) throws Exception { RevCommit commit = parseCommit(commitId); assertThat(commit.getFullMessage()).isEqualTo(expected); } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/NoteDbChangeStateTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/NoteDbChangeStateTest.java index a7ccfc8b5d..0553dc5f1f 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/NoteDbChangeStateTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/NoteDbChangeStateTest.java @@ -17,10 +17,10 @@ package com.google.gerrit.server.notedb; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.truth.Truth.assertThat; import static com.google.gerrit.common.TimeUtil.nowTs; -import static com.google.gerrit.server.notedb.NoteDbChangeState.applyDelta; -import static com.google.gerrit.server.notedb.NoteDbChangeState.parse; import static com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage.NOTE_DB; import static com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage.REVIEW_DB; +import static com.google.gerrit.server.notedb.NoteDbChangeState.applyDelta; +import static com.google.gerrit.server.notedb.NoteDbChangeState.parse; import static org.eclipse.jgit.lib.ObjectId.zeroId; import com.google.common.collect.ImmutableMap; @@ -32,24 +32,19 @@ import com.google.gerrit.server.notedb.NoteDbChangeState.RefState; import com.google.gerrit.testutil.GerritBaseTests; import com.google.gerrit.testutil.TestChanges; import com.google.gerrit.testutil.TestTimeUtil; - +import java.sql.Timestamp; +import java.util.Optional; +import java.util.concurrent.TimeUnit; import org.eclipse.jgit.lib.ObjectId; import org.junit.After; import org.junit.Before; import org.junit.Test; -import java.sql.Timestamp; -import java.util.Optional; -import java.util.concurrent.TimeUnit; - /** Unit tests for {@link NoteDbChangeState}. */ public class NoteDbChangeStateTest extends GerritBaseTests { - ObjectId SHA1 = - ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"); - ObjectId SHA2 = - ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234"); - ObjectId SHA3 = - ObjectId.fromString("badc0feebadc0feebadc0feebadc0feebadc0fee"); + ObjectId SHA1 = ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"); + ObjectId SHA2 = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234"); + ObjectId SHA3 = ObjectId.fromString("badc0feebadc0feebadc0feebadc0feebadc0fee"); @Before public void setUp() { @@ -83,15 +78,15 @@ public class NoteDbChangeStateTest extends GerritBaseTests { @Test public void parseReviewDbWithDrafts() { String str = SHA1.name() + ",2003=" + SHA2.name() + ",1001=" + SHA3.name(); - String expected = - SHA1.name() + ",1001=" + SHA3.name() + ",2003=" + SHA2.name(); + String expected = SHA1.name() + ",1001=" + SHA3.name() + ",2003=" + SHA2.name(); NoteDbChangeState state = parse(new Change.Id(1), str); assertThat(state.getPrimaryStorage()).isEqualTo(REVIEW_DB); assertThat(state.getChangeId()).isEqualTo(new Change.Id(1)); assertThat(state.getChangeMetaId()).isEqualTo(SHA1); - assertThat(state.getDraftIds()).containsExactly( - new Account.Id(1001), SHA3, - new Account.Id(2003), SHA2); + assertThat(state.getDraftIds()) + .containsExactly( + new Account.Id(1001), SHA3, + new Account.Id(2003), SHA2); assertThat(state.getReadOnlyUntil().isPresent()).isFalse(); assertThat(state.toString()).isEqualTo(expected); @@ -99,9 +94,10 @@ public class NoteDbChangeStateTest extends GerritBaseTests { assertThat(state.getPrimaryStorage()).isEqualTo(REVIEW_DB); assertThat(state.getChangeId()).isEqualTo(new Change.Id(1)); assertThat(state.getChangeMetaId()).isEqualTo(SHA1); - assertThat(state.getDraftIds()).containsExactly( - new Account.Id(1001), SHA3, - new Account.Id(2003), SHA2); + assertThat(state.getDraftIds()) + .containsExactly( + new Account.Id(1001), SHA3, + new Account.Id(2003), SHA2); assertThat(state.getReadOnlyUntil().isPresent()).isFalse(); assertThat(state.toString()).isEqualTo(expected); } @@ -133,11 +129,7 @@ public class NoteDbChangeStateTest extends GerritBaseTests { applyDelta(c, Delta.create(c.getId(), noMetaId(), noDrafts())); assertThat(c.getNoteDbState()).isNull(); - applyDelta( - c, - Delta.create( - c.getId(), noMetaId(), - drafts(new Account.Id(1001), zeroId()))); + applyDelta(c, Delta.create(c.getId(), noMetaId(), drafts(new Account.Id(1001), zeroId()))); assertThat(c.getNoteDbState()).isNull(); } @@ -162,53 +154,40 @@ public class NoteDbChangeStateTest extends GerritBaseTests { @Test public void applyDeltaToDrafts() throws Exception { Change c = newChange(); - applyDelta( - c, - Delta.create( - c.getId(), metaId(SHA1), - drafts(new Account.Id(1001), SHA2))); - assertThat(c.getNoteDbState()).isEqualTo( - SHA1.name() + ",1001=" + SHA2.name()); + applyDelta(c, Delta.create(c.getId(), metaId(SHA1), drafts(new Account.Id(1001), SHA2))); + assertThat(c.getNoteDbState()).isEqualTo(SHA1.name() + ",1001=" + SHA2.name()); - applyDelta( - c, - Delta.create( - c.getId(), noMetaId(), - drafts(new Account.Id(2003), SHA3))); - assertThat(c.getNoteDbState()).isEqualTo( - SHA1.name() + ",1001=" + SHA2.name() + ",2003=" + SHA3.name()); + applyDelta(c, Delta.create(c.getId(), noMetaId(), drafts(new Account.Id(2003), SHA3))); + assertThat(c.getNoteDbState()) + .isEqualTo(SHA1.name() + ",1001=" + SHA2.name() + ",2003=" + SHA3.name()); - applyDelta( - c, - Delta.create( - c.getId(), noMetaId(), - drafts(new Account.Id(2003), zeroId()))); - assertThat(c.getNoteDbState()).isEqualTo( - SHA1.name() + ",1001=" + SHA2.name()); + applyDelta(c, Delta.create(c.getId(), noMetaId(), drafts(new Account.Id(2003), zeroId()))); + assertThat(c.getNoteDbState()).isEqualTo(SHA1.name() + ",1001=" + SHA2.name()); - applyDelta( - c, Delta.create(c.getId(), metaId(SHA3), noDrafts())); - assertThat(c.getNoteDbState()).isEqualTo( - SHA3.name() + ",1001=" + SHA2.name()); + applyDelta(c, Delta.create(c.getId(), metaId(SHA3), noDrafts())); + assertThat(c.getNoteDbState()).isEqualTo(SHA3.name() + ",1001=" + SHA2.name()); } @Test public void applyDeltaToReadOnly() throws Exception { Timestamp ts = nowTs(); Change c = newChange(); - NoteDbChangeState state = new NoteDbChangeState(c.getId(), - REVIEW_DB, - Optional.of(RefState.create(SHA1, ImmutableMap.of())), - Optional.of(new Timestamp(ts.getTime() + 10000))); + NoteDbChangeState state = + new NoteDbChangeState( + c.getId(), + REVIEW_DB, + Optional.of(RefState.create(SHA1, ImmutableMap.of())), + Optional.of(new Timestamp(ts.getTime() + 10000))); c.setNoteDbState(state.toString()); Delta delta = Delta.create(c.getId(), metaId(SHA2), noDrafts()); applyDelta(c, delta); - assertThat(NoteDbChangeState.parse(c)).isEqualTo( - new NoteDbChangeState( - state.getChangeId(), - state.getPrimaryStorage(), - Optional.of(RefState.create(SHA2, ImmutableMap.of())), - state.getReadOnlyUntil())); + assertThat(NoteDbChangeState.parse(c)) + .isEqualTo( + new NoteDbChangeState( + state.getChangeId(), + state.getPrimaryStorage(), + Optional.of(RefState.create(SHA2, ImmutableMap.of())), + state.getReadOnlyUntil())); } @Test @@ -228,14 +207,12 @@ public class NoteDbChangeStateTest extends GerritBaseTests { public void applyDeltaToNoteDbPrimaryIsNoOp() throws Exception { Change c = newChange(); c.setNoteDbState("N"); - applyDelta(c, Delta.create(c.getId(), metaId(SHA1), - drafts(new Account.Id(1001), SHA2))); + applyDelta(c, Delta.create(c.getId(), metaId(SHA1), drafts(new Account.Id(1001), SHA2))); assertThat(c.getNoteDbState()).isEqualTo("N"); } private static Change newChange() { - return TestChanges.newChange( - new Project.NameKey("project"), new Account.Id(12345)); + return TestChanges.newChange(new Project.NameKey("project"), new Account.Id(12345)); } // Static factory methods to avoid type arguments when using as method args. diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/RepoSequenceTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/RepoSequenceTest.java index cab6549b3f..df3e40560e 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/RepoSequenceTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/RepoSequenceTest.java @@ -19,17 +19,19 @@ import static java.nio.charset.StandardCharsets.UTF_8; import static org.eclipse.jgit.lib.Constants.OBJ_BLOB; import static org.junit.Assert.fail; +import com.github.rholder.retry.BlockStrategy; +import com.github.rholder.retry.Retryer; +import com.github.rholder.retry.RetryerBuilder; +import com.github.rholder.retry.StopStrategies; import com.google.common.util.concurrent.Runnables; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.reviewdb.client.RefNames; import com.google.gerrit.testutil.InMemoryRepositoryManager; import com.google.gwtorm.server.OrmException; - -import com.github.rholder.retry.BlockStrategy; -import com.github.rholder.retry.Retryer; -import com.github.rholder.retry.RetryerBuilder; -import com.github.rholder.retry.StopStrategies; - +import java.io.IOException; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.ObjectId; @@ -42,22 +44,19 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import java.io.IOException; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicInteger; - public class RepoSequenceTest { private static final Retryer RETRYER = - RepoSequence.retryerBuilder().withBlockStrategy(new BlockStrategy() { - @Override - public void block(long sleepTime) { - // Don't sleep in tests. - } - }).build(); + RepoSequence.retryerBuilder() + .withBlockStrategy( + new BlockStrategy() { + @Override + public void block(long sleepTime) { + // Don't sleep in tests. + } + }) + .build(); - @Rule - public ExpectedException exception = ExpectedException.none(); + @Rule public ExpectedException exception = ExpectedException.none(); private InMemoryRepositoryManager repoManager; private Project.NameKey project; @@ -79,8 +78,7 @@ public class RepoSequenceTest { try { assertThat(s.next()).named("i=" + i + " for " + name).isEqualTo(i); } catch (OrmException e) { - throw new AssertionError( - "failed batchSize=" + batchSize + ", i=" + i, e); + throw new AssertionError("failed batchSize=" + batchSize + ", i=" + i, e); } } assertThat(s.acquireCount) @@ -162,14 +160,15 @@ public class RepoSequenceTest { writeBlob("id", "1"); final AtomicBoolean doneBgUpdate = new AtomicBoolean(false); - Runnable bgUpdate = new Runnable() { - @Override - public void run() { - if (!doneBgUpdate.getAndSet(true)) { - writeBlob("id", "1234"); - } - } - }; + Runnable bgUpdate = + new Runnable() { + @Override + public void run() { + if (!doneBgUpdate.getAndSet(true)) { + writeBlob("id", "1234"); + } + } + }; RepoSequence s = newSequence("id", 1, 10, bgUpdate, RETRYER); assertThat(doneBgUpdate.get()).isFalse(); @@ -183,8 +182,7 @@ public class RepoSequenceTest { public void failOnInvalidValue() throws Exception { ObjectId id = writeBlob("id", "not a number"); exception.expect(OrmException.class); - exception.expectMessage( - "invalid value in refs/sequences/id blob at " + id.name()); + exception.expectMessage("invalid value in refs/sequences/id blob at " + id.name()); newSequence("id", 1, 3).next(); } @@ -198,8 +196,7 @@ public class RepoSequenceTest { fail(); } catch (OrmException e) { assertThat(e.getCause()).isInstanceOf(ExecutionException.class); - assertThat(e.getCause().getCause()) - .isInstanceOf(IncorrectObjectTypeException.class); + assertThat(e.getCause().getCause()).isInstanceOf(IncorrectObjectTypeException.class); } } } @@ -207,17 +204,22 @@ public class RepoSequenceTest { @Test public void failAfterRetryerGivesUp() throws Exception { final AtomicInteger bgCounter = new AtomicInteger(1234); - Runnable bgUpdate = new Runnable() { - @Override - public void run() { - writeBlob("id", Integer.toString(bgCounter.getAndAdd(1000))); - } - }; - RepoSequence s = newSequence( - "id", 1, 10, bgUpdate, - RetryerBuilder. newBuilder() - .withStopStrategy(StopStrategies.stopAfterAttempt(3)) - .build()); + Runnable bgUpdate = + new Runnable() { + @Override + public void run() { + writeBlob("id", Integer.toString(bgCounter.getAndAdd(1000))); + } + }; + RepoSequence s = + newSequence( + "id", + 1, + 10, + bgUpdate, + RetryerBuilder.newBuilder() + .withStopStrategy(StopStrategies.stopAfterAttempt(3)) + .build()); exception.expect(OrmException.class); exception.expectMessage("failed to update refs/sequences/id: LOCK_FAILURE"); s.next(); @@ -270,12 +272,15 @@ public class RepoSequenceTest { } private RepoSequence newSequence(String name, int start, int batchSize) { - return newSequence( - name, start, batchSize, Runnables.doNothing(), RETRYER); + return newSequence(name, start, batchSize, Runnables.doNothing(), RETRYER); } - private RepoSequence newSequence(String name, final int start, int batchSize, - Runnable afterReadRef, Retryer retryer) { + private RepoSequence newSequence( + String name, + final int start, + int batchSize, + Runnable afterReadRef, + Retryer retryer) { return new RepoSequence( repoManager, project, @@ -299,8 +304,7 @@ public class RepoSequenceTest { ins.flush(); RefUpdate ru = repo.updateRef(refName); ru.setNewObjectId(newId); - assertThat(ru.forceUpdate()) - .isAnyOf(RefUpdate.Result.NEW, RefUpdate.Result.FORCED); + assertThat(ru.forceUpdate()).isAnyOf(RefUpdate.Result.NEW, RefUpdate.Result.FORCED); return newId; } catch (IOException e) { throw new RuntimeException(e); diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/rebuild/EventSorterTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/rebuild/EventSorterTest.java index 1db59c58d6..1de82b14da 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/rebuild/EventSorterTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/rebuild/EventSorterTest.java @@ -26,23 +26,24 @@ import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.server.notedb.ChangeUpdate; import com.google.gerrit.testutil.TestTimeUtil; - -import org.junit.Before; -import org.junit.Test; - import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import java.util.stream.Stream; +import org.junit.Before; +import org.junit.Test; public class EventSorterTest { private class TestEvent extends Event { protected TestEvent(Timestamp when) { super( new PatchSet.Id(new Change.Id(1), 1), - new Account.Id(1000), new Account.Id(1000), - when, changeCreatedOn, null); + new Account.Id(1000), + new Account.Id(1000), + when, + changeCreatedOn, + null); } @Override @@ -113,10 +114,11 @@ public class EventSorterTest { } private List threeEventsOneDep(int depFromIdx, int depOnIdx) { - List events = Lists.newArrayList( - new TestEvent(TimeUtil.nowTs()), - new TestEvent(TimeUtil.nowTs()), - new TestEvent(TimeUtil.nowTs())); + List events = + Lists.newArrayList( + new TestEvent(TimeUtil.nowTs()), + new TestEvent(TimeUtil.nowTs()), + new TestEvent(TimeUtil.nowTs())); events.get(depFromIdx).addDep(events.get(depOnIdx)); return events; } @@ -155,9 +157,7 @@ public class EventSorterTest { e2.addDep(e3); e3.addDep(e4); - assertSorted( - events(e1, e2, e3, e4), - events(e4, e3, e2, e1)); + assertSorted(events(e1, e2, e3, e4), events(e4, e3, e2, e1)); } @Test @@ -171,9 +171,7 @@ public class EventSorterTest { e2.addDep(e3); // Processing 3 pops 2, processing 4 pops 1. - assertSorted( - events(e2, e3, e1, e4), - events(e3, e2, e4, e1)); + assertSorted(events(e2, e3, e1, e4), events(e3, e2, e4, e1)); } @Test @@ -187,9 +185,7 @@ public class EventSorterTest { e3.addDep(e4); // Processing 4 pops 1, 2, 3 in natural order. - assertSorted( - events(e4, e3, e2, e1), - events(e4, e1, e2, e3)); + assertSorted(events(e4, e3, e2, e1), events(e4, e1, e2, e3)); } @Test @@ -200,9 +196,7 @@ public class EventSorterTest { // Implementation is not really defined, but infinite looping would be bad. // According to current implementation details, 2 pops 1, 1 pops 2 which was // already seen. - assertSorted( - events(e2, e1), - events(e1, e2)); + assertSorted(events(e2, e1), events(e1, e2)); } @Test @@ -232,8 +226,6 @@ public class EventSorterTest { private static void assertSorted(List unsorted, List expected) { List actual = new ArrayList<>(unsorted); new EventSorter(actual).sort(); - assertThat(actual) - .named("sorted" + unsorted) - .isEqualTo(expected); + assertThat(actual).named("sorted" + unsorted).isEqualTo(expected); } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/patch/IntraLineLoaderTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/patch/IntraLineLoaderTest.java index eda2b82474..0859bf7f62 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/patch/IntraLineLoaderTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/patch/IntraLineLoaderTest.java @@ -17,67 +17,56 @@ package com.google.gerrit.server.patch; import static com.google.common.truth.Truth.assertThat; import static java.nio.charset.StandardCharsets.UTF_8; +import java.util.List; import org.eclipse.jgit.diff.Edit; import org.eclipse.jgit.diff.EditList; import org.eclipse.jgit.diff.ReplaceEdit; import org.junit.Test; -import java.util.List; - public class IntraLineLoaderTest { @Test public void rewriteAtStartOfLineIsRecognized() throws Exception { String a = "abc1\n"; String b = "def1\n"; - assertThat(intraline(a, b)).isEqualTo(ref() - .replace("abc", "def").common("1\n").edits - ); + assertThat(intraline(a, b)).isEqualTo(ref().replace("abc", "def").common("1\n").edits); } @Test public void rewriteAtEndOfLineIsRecognized() throws Exception { String a = "abc1\n"; String b = "abc2\n"; - assertThat(intraline(a, b)).isEqualTo(ref() - .common("abc").replace("1", "2").common("\n").edits - ); + assertThat(intraline(a, b)).isEqualTo(ref().common("abc").replace("1", "2").common("\n").edits); } @Test public void completeRewriteIncludesNewline() throws Exception { String a = "abc1\n"; String b = "def2\n"; - assertThat(intraline(a, b)).isEqualTo(ref() - .replace("abc1\n", "def2\n").edits - ); + assertThat(intraline(a, b)).isEqualTo(ref().replace("abc1\n", "def2\n").edits); } @Test public void closeEditsAreCombined() throws Exception { String a = "ab1cdef2gh\n"; String b = "ab2cdef3gh\n"; - assertThat(intraline(a, b)).isEqualTo(ref() - .common("ab").replace("1cdef2", "2cdef3").common("gh\n").edits - ); + assertThat(intraline(a, b)) + .isEqualTo(ref().common("ab").replace("1cdef2", "2cdef3").common("gh\n").edits); } @Test public void preferInsertAfterCommonPart1() throws Exception { String a = "start middle end\n"; String b = "start middlemiddle end\n"; - assertThat(intraline(a, b)).isEqualTo(ref() - .common("start middle").insert("middle").common(" end\n").edits - ); + assertThat(intraline(a, b)) + .isEqualTo(ref().common("start middle").insert("middle").common(" end\n").edits); } @Test public void preferInsertAfterCommonPart2() throws Exception { String a = "abc def\n"; String b = "abc def\n"; - assertThat(intraline(a, b)).isEqualTo(ref() - .common("abc ").insert(" ").common("def\n").edits - ); + assertThat(intraline(a, b)).isEqualTo(ref().common("abc ").insert(" ").common("def\n").edits); } @Test @@ -100,10 +89,8 @@ public class IntraLineLoaderTest { public void preferInsertAtLineBreak2() throws Exception { String a = " abc\n def\n"; String b = " abc\n def\n"; - assertThat(intraline(a, b)).isEqualTo(ref() - .insert(" ").common(" abc\n") - .insert(" ").common(" def\n").edits - ); + assertThat(intraline(a, b)) + .isEqualTo(ref().insert(" ").common(" abc\n").insert(" ").common(" def\n").edits); } //TODO: expected failure @@ -112,19 +99,16 @@ public class IntraLineLoaderTest { public void preferDeleteAtLineBreak() throws Exception { String a = " abc\n def\n"; String b = " abc\n def\n"; - assertThat(intraline(a, b)).isEqualTo(ref() - .remove(" ").common(" abc\n") - .remove(" ").common(" def\n").edits - ); + assertThat(intraline(a, b)) + .isEqualTo(ref().remove(" ").common(" abc\n").remove(" ").common(" def\n").edits); } @Test public void insertedWhitespaceIsRecognized() throws Exception { String a = " int *foobar\n"; String b = " int * foobar\n"; - assertThat(intraline(a, b)).isEqualTo(ref() - .common(" int *").insert(" ").common("foobar\n").edits - ); + assertThat(intraline(a, b)) + .isEqualTo(ref().common(" int *").insert(" ").common("foobar\n").edits); } @Test @@ -132,10 +116,16 @@ public class IntraLineLoaderTest { // |0 5 10 | 5 20 5 30 String a = " int *foobar\n int *foobar\n"; String b = " int * foobar\n int * foobar\n"; - assertThat(intraline(a, b)).isEqualTo(ref() - .common(" int *").insert(" ").common("foobar\n") - .common(" int *").insert(" ").common("foobar\n").edits - ); + assertThat(intraline(a, b)) + .isEqualTo( + ref() + .common(" int *") + .insert(" ") + .common("foobar\n") + .common(" int *") + .insert(" ") + .common("foobar\n") + .edits); } // helper functions to call IntraLineLoader.compute @@ -154,8 +144,7 @@ public class IntraLineLoaderTest { return intraline(a, b, new Edit(0, countLines(a), 0, countLines(b))); } - private static List intraline(String a, String b, Edit lines) - throws Exception { + private static List intraline(String a, String b, Edit lines) throws Exception { Text aText = new Text(a.getBytes(UTF_8)); Text bText = new Text(b.getBytes(UTF_8)); diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/patch/PatchListEntryTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/patch/PatchListEntryTest.java index 2721b3056e..81f03afea8 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/patch/PatchListEntryTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/patch/PatchListEntryTest.java @@ -20,7 +20,6 @@ import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import com.google.gerrit.reviewdb.client.Patch; - import org.junit.Test; public class PatchListEntryTest { diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/project/ProjectControlTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/project/ProjectControlTest.java index 79983f9322..92d7a5221d 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/project/ProjectControlTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/project/ProjectControlTest.java @@ -45,7 +45,6 @@ import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Provider; import com.google.inject.util.Providers; - import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.ObjectId; @@ -94,8 +93,7 @@ public class ProjectControlTest { admins = groupCache.get(new AccountGroup.NameKey("Administrators")).getGroupUUID(); setUpPermissions(); - Account.Id userId = accountManager.authenticate(AuthRequest.forUser("user")) - .getAccountId(); + Account.Id userId = accountManager.authenticate(AuthRequest.forUser("user")).getAccountId(); user = userFactory.create(userId); Project.NameKey name = new Project.NameKey("project"); @@ -104,17 +102,18 @@ public class ProjectControlTest { project.load(inMemoryRepo); repo = new TestRepository<>(inMemoryRepo); - requestContext.setContext(new RequestContext() { - @Override - public CurrentUser getUser() { - return user; - } + requestContext.setContext( + new RequestContext() { + @Override + public CurrentUser getUser() { + return user; + } - @Override - public Provider getReviewDbProvider() { - return Providers.of(db); - } - }); + @Override + public Provider getReviewDbProvider() { + return Providers.of(db); + } + }); } @After @@ -235,15 +234,13 @@ public class ProjectControlTest { return projectControlFactory.controlFor(project.getName(), user); } - protected void allow(ProjectConfig project, String permission, - AccountGroup.UUID id, String ref) + protected void allow(ProjectConfig project, String permission, AccountGroup.UUID id, String ref) throws Exception { Util.allow(project, permission, id, ref); saveProjectConfig(project); } - protected void deny(ProjectConfig project, String permission, - AccountGroup.UUID id, String ref) + protected void deny(ProjectConfig project, String permission, AccountGroup.UUID id, String ref) throws Exception { Util.deny(project, permission, id, ref); saveProjectConfig(project); diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/project/RefControlTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/project/RefControlTest.java index e2efc4a54b..21297e1ebc 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/project/RefControlTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/project/RefControlTest.java @@ -70,14 +70,6 @@ import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Provider; import com.google.inject.util.Providers; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository; -import org.eclipse.jgit.lib.Repository; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - import java.io.IOException; import java.util.ArrayList; import java.util.Collections; @@ -85,6 +77,12 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository; +import org.eclipse.jgit.lib.Repository; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; public class RefControlTest { private void assertAdminsAreOwnersAndDevsAreNot() { @@ -96,10 +94,9 @@ public class RefControlTest { } private void assertOwner(String ref, ProjectControl u) { - assertThat(u.controlForRef(ref).isOwner()) - .named("OWN " + ref) - .isTrue(); + assertThat(u.controlForRef(ref).isOwner()).named("OWN " + ref).isTrue(); } + private void assertNotOwner(ProjectControl u) { assertThat(u.isOwner()).named("not owner").isFalse(); } @@ -109,123 +106,84 @@ public class RefControlTest { } private void assertNotOwner(String ref, ProjectControl u) { - assertThat(u.controlForRef(ref).isOwner()) - .named("NOT OWN " + ref) - .isFalse(); + assertThat(u.controlForRef(ref).isOwner()).named("NOT OWN " + ref).isFalse(); } private void assertCanRead(ProjectControl u) { - assertThat(u.isVisible()) - .named("can read") - .isTrue(); + assertThat(u.isVisible()).named("can read").isTrue(); } private void assertCannotRead(ProjectControl u) { - assertThat(u.isVisible()) - .named("cannot read") - .isFalse(); + assertThat(u.isVisible()).named("cannot read").isFalse(); } private void assertCanRead(String ref, ProjectControl u) { - assertThat(u.controlForRef(ref).isVisible()) - .named("can read " + ref) - .isTrue(); + assertThat(u.controlForRef(ref).isVisible()).named("can read " + ref).isTrue(); } private void assertCannotRead(String ref, ProjectControl u) { - assertThat(u.controlForRef(ref).isVisible()) - .named("cannot read " + ref) - .isFalse(); + assertThat(u.controlForRef(ref).isVisible()).named("cannot read " + ref).isFalse(); } private void assertCanSubmit(String ref, ProjectControl u) { - assertThat(u.controlForRef(ref).canSubmit(false)) - .named("can submit " + ref) - .isTrue(); + assertThat(u.controlForRef(ref).canSubmit(false)).named("can submit " + ref).isTrue(); } private void assertCannotSubmit(String ref, ProjectControl u) { - assertThat(u.controlForRef(ref).canSubmit(false)) - .named("can submit " + ref) - .isFalse(); + assertThat(u.controlForRef(ref).canSubmit(false)).named("can submit " + ref).isFalse(); } private void assertCanUpload(ProjectControl u) { - assertThat(u.canPushToAtLeastOneRef()) - .named("can upload") - .isEqualTo(Capable.OK); + assertThat(u.canPushToAtLeastOneRef()).named("can upload").isEqualTo(Capable.OK); } private void assertCanUpload(String ref, ProjectControl u) { - assertThat(u.controlForRef(ref).canUpload()) - .named("can upload " + ref) - .isTrue(); + assertThat(u.controlForRef(ref).canUpload()).named("can upload " + ref).isTrue(); } private void assertCannotUpload(ProjectControl u) { - assertThat(u.canPushToAtLeastOneRef()) - .named("cannot upload") - .isNotEqualTo(Capable.OK); + assertThat(u.canPushToAtLeastOneRef()).named("cannot upload").isNotEqualTo(Capable.OK); } private void assertCannotUpload(String ref, ProjectControl u) { - assertThat(u.controlForRef(ref).canUpload()) - .named("cannot upload " + ref) - .isFalse(); + assertThat(u.controlForRef(ref).canUpload()).named("cannot upload " + ref).isFalse(); } private void assertBlocked(String p, String ref, ProjectControl u) { - assertThat(u.controlForRef(ref).isBlocked(p)) - .named(p + " is blocked for " + ref) - .isTrue(); + assertThat(u.controlForRef(ref).isBlocked(p)).named(p + " is blocked for " + ref).isTrue(); } private void assertNotBlocked(String p, String ref, ProjectControl u) { - assertThat(u.controlForRef(ref).isBlocked(p)) - .named(p + " is blocked for " + ref) - .isFalse(); + assertThat(u.controlForRef(ref).isBlocked(p)).named(p + " is blocked for " + ref).isFalse(); } private void assertCanUpdate(String ref, ProjectControl u) { - assertThat(u.controlForRef(ref).canUpdate()) - .named("can update " + ref) - .isTrue(); + assertThat(u.controlForRef(ref).canUpdate()).named("can update " + ref).isTrue(); } private void assertCannotUpdate(String ref, ProjectControl u) { - assertThat(u.controlForRef(ref).canUpdate()) - .named("cannot update " + ref) - .isFalse(); + assertThat(u.controlForRef(ref).canUpdate()).named("cannot update " + ref).isFalse(); } private void assertCanForceUpdate(String ref, ProjectControl u) { - assertThat(u.controlForRef(ref).canForceUpdate()) - .named("can force push " + ref) - .isTrue(); + assertThat(u.controlForRef(ref).canForceUpdate()).named("can force push " + ref).isTrue(); } private void assertCannotForceUpdate(String ref, ProjectControl u) { - assertThat(u.controlForRef(ref).canForceUpdate()) - .named("cannot force push " + ref) - .isFalse(); + assertThat(u.controlForRef(ref).canForceUpdate()).named("cannot force push " + ref).isFalse(); } private void assertCanVote(int score, PermissionRange range) { - assertThat(range.contains(score)) - .named("can vote " + score) - .isTrue(); + assertThat(range.contains(score)).named("can vote " + score).isTrue(); } private void assertCannotVote(int score, PermissionRange range) { - assertThat(range.contains(score)) - .named("cannot vote " + score) - .isFalse(); + assertThat(range.contains(score)).named("cannot vote " + score).isFalse(); } private final AllProjectsName allProjectsName = new AllProjectsName(AllProjectsNameProvider.DEFAULT); - private final AllUsersName allUsersName = - new AllUsersName(AllUsersNameProvider.DEFAULT); + private final AllUsersName allUsersName = new AllUsersName(AllUsersNameProvider.DEFAULT); private final AccountGroup.UUID fixers = new AccountGroup.UUID("test.fixers"); private final Map all = new HashMap<>(); private Project.NameKey localKey = new Project.NameKey("local"); @@ -249,67 +207,62 @@ public class RefControlTest { @Before public void setUp() throws Exception { repoManager = new InMemoryRepositoryManager(); - projectCache = new ProjectCache() { - @Override - public ProjectState getAllProjects() { - return get(allProjectsName); - } + projectCache = + new ProjectCache() { + @Override + public ProjectState getAllProjects() { + return get(allProjectsName); + } - @Override - public ProjectState getAllUsers() { - return null; - } + @Override + public ProjectState getAllUsers() { + return null; + } - @Override - public ProjectState get(Project.NameKey projectName) { - return all.get(projectName); - } + @Override + public ProjectState get(Project.NameKey projectName) { + return all.get(projectName); + } - @Override - public void evict(Project p) { - } + @Override + public void evict(Project p) {} - @Override - public void remove(Project p) { - } + @Override + public void remove(Project p) {} - @Override - public Iterable all() { - return Collections.emptySet(); - } + @Override + public Iterable all() { + return Collections.emptySet(); + } - @Override - public Iterable byName(String prefix) { - return Collections.emptySet(); - } + @Override + public Iterable byName(String prefix) { + return Collections.emptySet(); + } - @Override - public void onCreateProject(Project.NameKey newProjectName) { - } + @Override + public void onCreateProject(Project.NameKey newProjectName) {} - @Override - public Set guessRelevantGroupUUIDs() { - return Collections.emptySet(); - } + @Override + public Set guessRelevantGroupUUIDs() { + return Collections.emptySet(); + } - @Override - public ProjectState checkedGet(Project.NameKey projectName) - throws IOException { - return all.get(projectName); - } + @Override + public ProjectState checkedGet(Project.NameKey projectName) throws IOException { + return all.get(projectName); + } - @Override - public void evict(Project.NameKey p) { - } - }; + @Override + public void evict(Project.NameKey p) {} + }; Injector injector = Guice.createInjector(new InMemoryModule()); injector.injectMembers(this); try { Repository repo = repoManager.createRepository(allProjectsName); - ProjectConfig allProjects = - new ProjectConfig(new Project.NameKey(allProjectsName.get())); + ProjectConfig allProjects = new ProjectConfig(new Project.NameKey(allProjectsName.get())); allProjects.load(repo); LabelType cr = Util.codeReview(); allProjects.getLabelSections().put(cr.getName(), cr); @@ -339,17 +292,18 @@ public class RefControlTest { add(local); local.getProject().setParentName(parentKey); - requestContext.setContext(new RequestContext() { - @Override - public CurrentUser getUser() { - return null; - } + requestContext.setContext( + new RequestContext() { + @Override + public CurrentUser getUser() { + return null; + } - @Override - public Provider getReviewDbProvider() { - return Providers.of(db); - } - }); + @Override + public Provider getReviewDbProvider() { + return Providers.of(db); + } + }); changeControlFactory = injector.getInstance(ChangeControl.Factory.class); } @@ -632,13 +586,11 @@ public class RefControlTest { public void blockLabelRange_ParentBlocksChildEvenIfAlreadyBlockedInChild() { allow(local, LABEL + "Code-Review", -2, +2, DEVS, "refs/heads/*"); block(local, LABEL + "Code-Review", -2, +2, DEVS, "refs/heads/*"); - block(parent, LABEL + "Code-Review", -2, +2, DEVS, - "refs/heads/*"); + block(parent, LABEL + "Code-Review", -2, +2, DEVS, "refs/heads/*"); ProjectControl u = user(local, DEVS); - PermissionRange range = - u.controlForRef("refs/heads/master").getRange(LABEL + "Code-Review"); + PermissionRange range = u.controlForRef("refs/heads/master").getRange(LABEL + "Code-Review"); assertCanVote(-1, range); assertCanVote(1, range); assertCannotVote(-2, range); @@ -765,8 +717,8 @@ public class RefControlTest { ProjectControl u = user(local, REGISTERED_USERS); assertThat(u.controlForRef("refs/heads/master").isVisibleByRegisteredUsers()) - .named("u can read") - .isTrue(); + .named("u can read") + .isTrue(); } @Test @@ -776,8 +728,8 @@ public class RefControlTest { ProjectControl u = user(local, REGISTERED_USERS); assertThat(u.controlForRef("refs/heads/master").isVisibleByRegisteredUsers()) - .named("u can't read") - .isFalse(); + .named("u can't read") + .isFalse(); } @Test @@ -787,8 +739,8 @@ public class RefControlTest { ProjectControl u = user(local, DEVS); assertThat(u.controlForRef("refs/heads/master").canForceEditTopicName()) - .named("u can edit topic name") - .isTrue(); + .named("u can edit topic name") + .isTrue(); } @Test @@ -798,8 +750,8 @@ public class RefControlTest { ProjectControl u = user(local, REGISTERED_USERS); assertThat(u.controlForRef("refs/heads/master").canForceEditTopicName()) - .named("u can't edit topic name") - .isFalse(); + .named("u can't edit topic name") + .isFalse(); } @Test @@ -837,13 +789,11 @@ public class RefControlTest { @Test public void unblockInLocalRange_Fails() { - block(parent, LABEL + "Code-Review", -1, 1, ANONYMOUS_USERS, - "refs/heads/*"); + block(parent, LABEL + "Code-Review", -1, 1, ANONYMOUS_USERS, "refs/heads/*"); allow(local, LABEL + "Code-Review", -2, +2, DEVS, "refs/heads/*"); ProjectControl u = user(local, DEVS); - PermissionRange range = - u.controlForRef("refs/heads/master").getRange(LABEL + "Code-Review"); + PermissionRange range = u.controlForRef("refs/heads/master").getRange(LABEL + "Code-Review"); assertCannotVote(-2, range); assertCannotVote(2, range); } @@ -853,8 +803,8 @@ public class RefControlTest { allow(local, LABEL + "Code-Review", -2, +2, CHANGE_OWNER, "refs/heads/*"); ProjectControl u = user(local, DEVS); - PermissionRange range = u.controlForRef("refs/heads/master") - .getRange(LABEL + "Code-Review", true); + PermissionRange range = + u.controlForRef("refs/heads/master").getRange(LABEL + "Code-Review", true); assertCanVote(-2, range); assertCanVote(2, range); } @@ -864,8 +814,7 @@ public class RefControlTest { allow(local, LABEL + "Code-Review", -2, +2, CHANGE_OWNER, "refs/heads/*"); ProjectControl u = user(local, DEVS); - PermissionRange range = u.controlForRef("refs/heads/master") - .getRange(LABEL + "Code-Review"); + PermissionRange range = u.controlForRef("refs/heads/master").getRange(LABEL + "Code-Review"); assertCannotVote(-2, range); assertCannotVote(2, range); } @@ -893,8 +842,7 @@ public class RefControlTest { @Test(expected = InvalidNameException.class) public void testValidateBadRefPatternDanglingCharacter() throws Exception { - RefPattern - .validate("^refs/heads/tmp/sdk/[0-9]{3,3}_R[1-9][A-Z][0-9]{3,3}*"); + RefPattern.validate("^refs/heads/tmp/sdk/[0-9]{3,3}_R[1-9][A-Z][0-9]{3,3}*"); } @Test @@ -918,26 +866,43 @@ public class RefControlTest { } catch (IOException | ConfigInvalidException e) { throw new RuntimeException(e); } - all.put(pc.getName(), - new ProjectState(sitePaths, projectCache, allProjectsName, allUsersName, - projectControlFactory, envFactory, repoManager, rulesCache, - commentLinks, capabilityCollectionFactory, pc)); + all.put( + pc.getName(), + new ProjectState( + sitePaths, + projectCache, + allProjectsName, + allUsersName, + projectControlFactory, + envFactory, + repoManager, + rulesCache, + commentLinks, + capabilityCollectionFactory, + pc)); return repo; } - private ProjectControl user(ProjectConfig local, - AccountGroup.UUID... memberOf) { + private ProjectControl user(ProjectConfig local, AccountGroup.UUID... memberOf) { return user(local, null, memberOf); } - private ProjectControl user(ProjectConfig local, String name, - AccountGroup.UUID... memberOf) { + private ProjectControl user(ProjectConfig local, String name, AccountGroup.UUID... memberOf) { String canonicalWebUrl = "http://localhost"; - return new ProjectControl(Collections. emptySet(), - Collections. emptySet(), projectCache, - sectionSorter, null, changeControlFactory, null, queryProvider, null, - canonicalWebUrl, new MockUser(name, memberOf), newProjectState(local)); + return new ProjectControl( + Collections.emptySet(), + Collections.emptySet(), + projectCache, + sectionSorter, + null, + changeControlFactory, + null, + queryProvider, + null, + canonicalWebUrl, + new MockUser(name, memberOf), + newProjectState(local)); } private ProjectState newProjectState(ProjectConfig local) { diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/project/Util.java b/gerrit-server/src/test/java/com/google/gerrit/server/project/Util.java index d3f0bcbaec..3ad0116c9c 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/project/Util.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/project/Util.java @@ -24,7 +24,6 @@ import com.google.gerrit.common.data.PermissionRange; import com.google.gerrit.common.data.PermissionRule; import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gerrit.server.git.ProjectConfig; - import java.util.Arrays; public class Util { @@ -32,7 +31,8 @@ public class Util { public static final AccountGroup.UUID DEVS = new AccountGroup.UUID("test.devs"); public static final LabelType codeReview() { - return category("Code-Review", + return category( + "Code-Review", value(2, "Looks good to me, approved"), value(1, "Looks good to me, but someone else must approve"), value(0, "No score"), @@ -41,16 +41,12 @@ public class Util { } public static final LabelType verified() { - return category("Verified", - value(1, "Verified"), - value(0, "No score"), - value(-1, "Fails")); + return category("Verified", value(1, "Verified"), value(0, "No score"), value(-1, "Fails")); } public static final LabelType patchSetLock() { - LabelType label = category("Patch-Set-Lock", - value(1, "Patch Set Locked"), - value(0, "Patch Set Unlocked")); + LabelType label = + category("Patch-Set-Lock", value(1, "Patch Set Locked"), value(0, "Patch Set Unlocked")); label.setFunctionName("PatchSetLock"); return label; } @@ -63,16 +59,19 @@ public class Util { return new LabelType(name, Arrays.asList(values)); } - public static PermissionRule newRule(ProjectConfig project, - AccountGroup.UUID groupUUID) { + public static PermissionRule newRule(ProjectConfig project, AccountGroup.UUID groupUUID) { GroupReference group = new GroupReference(groupUUID, groupUUID.get()); group = project.resolve(group); return new PermissionRule(group); } - public static PermissionRule allow(ProjectConfig project, - String permissionName, int min, int max, AccountGroup.UUID group, + public static PermissionRule allow( + ProjectConfig project, + String permissionName, + int min, + int max, + AccountGroup.UUID group, String ref) { PermissionRule rule = newRule(project, group); rule.setMin(min); @@ -80,8 +79,12 @@ public class Util { return grant(project, permissionName, rule, ref); } - public static PermissionRule block(ProjectConfig project, - String permissionName, int min, int max, AccountGroup.UUID group, + public static PermissionRule block( + ProjectConfig project, + String permissionName, + int min, + int max, + AccountGroup.UUID group, String ref) { PermissionRule rule = newRule(project, group); rule.setMin(min); @@ -91,102 +94,104 @@ public class Util { return r; } - public static PermissionRule allow(ProjectConfig project, - String permissionName, AccountGroup.UUID group, String ref) { + public static PermissionRule allow( + ProjectConfig project, String permissionName, AccountGroup.UUID group, String ref) { return grant(project, permissionName, newRule(project, group), ref); } - public static PermissionRule allow(ProjectConfig project, - String permissionName, AccountGroup.UUID group, String ref, + public static PermissionRule allow( + ProjectConfig project, + String permissionName, + AccountGroup.UUID group, + String ref, boolean exclusive) { - return grant(project, permissionName, newRule(project, group), ref, - exclusive); + return grant(project, permissionName, newRule(project, group), ref, exclusive); } - public static PermissionRule allow(ProjectConfig project, - String capabilityName, AccountGroup.UUID group) { + public static PermissionRule allow( + ProjectConfig project, String capabilityName, AccountGroup.UUID group) { PermissionRule rule = newRule(project, group); - project.getAccessSection(AccessSection.GLOBAL_CAPABILITIES, true) + project + .getAccessSection(AccessSection.GLOBAL_CAPABILITIES, true) .getPermission(capabilityName, true) .add(rule); - if (GlobalCapability.hasRange(capabilityName)) { - PermissionRange.WithDefaults range = - GlobalCapability.getRange(capabilityName); - if (range != null) { - rule.setRange(range.getDefaultMin(), range.getDefaultMax()); - } + if (GlobalCapability.hasRange(capabilityName)) { + PermissionRange.WithDefaults range = GlobalCapability.getRange(capabilityName); + if (range != null) { + rule.setRange(range.getDefaultMin(), range.getDefaultMax()); } + } return rule; } - public static PermissionRule remove(ProjectConfig project, - String capabilityName, AccountGroup.UUID group) { + public static PermissionRule remove( + ProjectConfig project, String capabilityName, AccountGroup.UUID group) { PermissionRule rule = newRule(project, group); - project.getAccessSection(AccessSection.GLOBAL_CAPABILITIES, true) + project + .getAccessSection(AccessSection.GLOBAL_CAPABILITIES, true) .getPermission(capabilityName, true) .remove(rule); return rule; } - public static PermissionRule remove(ProjectConfig project, - String permissionName, AccountGroup.UUID group, String ref) { + public static PermissionRule remove( + ProjectConfig project, String permissionName, AccountGroup.UUID group, String ref) { PermissionRule rule = newRule(project, group); - project.getAccessSection(ref, true) - .getPermission(permissionName, true) - .remove(rule); + project.getAccessSection(ref, true).getPermission(permissionName, true).remove(rule); return rule; } - public static PermissionRule block(ProjectConfig project, - String capabilityName, AccountGroup.UUID group) { + public static PermissionRule block( + ProjectConfig project, String capabilityName, AccountGroup.UUID group) { PermissionRule rule = newRule(project, group); - project.getAccessSection(AccessSection.GLOBAL_CAPABILITIES, true) + project + .getAccessSection(AccessSection.GLOBAL_CAPABILITIES, true) .getPermission(capabilityName, true) .add(rule); return rule; } - public static PermissionRule block(ProjectConfig project, - String permissionName, AccountGroup.UUID group, String ref) { + public static PermissionRule block( + ProjectConfig project, String permissionName, AccountGroup.UUID group, String ref) { PermissionRule r = grant(project, permissionName, newRule(project, group), ref); r.setBlock(); return r; } - public static PermissionRule blockLabel(ProjectConfig project, - String labelName, AccountGroup.UUID group, String ref) { - PermissionRule r = - grant(project, Permission.LABEL + labelName, newRule(project, group), - ref); + public static PermissionRule blockLabel( + ProjectConfig project, String labelName, AccountGroup.UUID group, String ref) { + PermissionRule r = grant(project, Permission.LABEL + labelName, newRule(project, group), ref); r.setBlock(); r.setRange(-1, 1); return r; } - public static PermissionRule deny(ProjectConfig project, - String permissionName, AccountGroup.UUID group, String ref) { + public static PermissionRule deny( + ProjectConfig project, String permissionName, AccountGroup.UUID group, String ref) { PermissionRule r = grant(project, permissionName, newRule(project, group), ref); r.setDeny(); return r; } - public static void doNotInherit(ProjectConfig project, String permissionName, - String ref) { - project.getAccessSection(ref, true) // + public static void doNotInherit(ProjectConfig project, String permissionName, String ref) { + project + .getAccessSection(ref, true) // .getPermission(permissionName, true) // .setExclusiveGroup(true); } - private static PermissionRule grant(ProjectConfig project, - String permissionName, PermissionRule rule, String ref) { + private static PermissionRule grant( + ProjectConfig project, String permissionName, PermissionRule rule, String ref) { return grant(project, permissionName, rule, ref, false); } - private static PermissionRule grant(ProjectConfig project, - String permissionName, PermissionRule rule, String ref, + private static PermissionRule grant( + ProjectConfig project, + String permissionName, + PermissionRule rule, + String ref, boolean exclusive) { - Permission permission = project.getAccessSection(ref, true) - .getPermission(permissionName, true); + Permission permission = project.getAccessSection(ref, true).getPermission(permissionName, true); if (exclusive) { permission.setExclusiveGroup(exclusive); } @@ -194,6 +199,5 @@ public class Util { return rule; } - private Util() { - } + private Util() {} } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/AndPredicateTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/AndPredicateTest.java index 01efa1dbfb..cc590817c5 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/query/AndPredicateTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/AndPredicateTest.java @@ -23,9 +23,8 @@ import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import org.junit.Test; - import java.util.List; +import org.junit.Test; public class AndPredicateTest extends PredicateTest { @Test @@ -69,8 +68,8 @@ public class AndPredicateTest extends PredicateTest { assertChildren("iterator().remove()", n, of(a, b)); } - private static void assertChildren(String o, Predicate p, - List> l) { + private static void assertChildren( + String o, Predicate p, List> l) { assertEquals(o + " did not affect child", l, p.getChildren()); } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/FieldPredicateTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/FieldPredicateTest.java index 550bee5c43..ea22c0040b 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/query/FieldPredicateTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/FieldPredicateTest.java @@ -19,9 +19,8 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; -import org.junit.Test; - import java.util.Collections; +import org.junit.Test; public class FieldPredicateTest extends PredicateTest { @Test @@ -58,7 +57,7 @@ public class FieldPredicateTest extends PredicateTest { @Test public void testCopy() { final OperatorPredicate f = f("author", "alice"); - assertSame(f, f.copy(Collections.> emptyList())); + assertSame(f, f.copy(Collections.>emptyList())); assertSame(f, f.copy(f.getChildren())); exception.expect(IllegalArgumentException.class); diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/NotPredicateTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/NotPredicateTest.java index 93c1bf4b1a..05df2419be 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/query/NotPredicateTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/NotPredicateTest.java @@ -23,10 +23,9 @@ import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import org.junit.Test; - import java.util.Collections; import java.util.List; +import org.junit.Test; public class NotPredicateTest extends PredicateTest { @Test @@ -64,8 +63,7 @@ public class NotPredicateTest extends PredicateTest { assertOnlyChild("remove(0)", p, n); } - private static void assertOnlyChild(String o, Predicate c, - Predicate p) { + private static void assertOnlyChild(String o, Predicate c, Predicate p) { assertEquals(o + " did not affect child", 1, p.getChildCount()); assertSame(o + " did not affect child", c, p.getChild(0)); } @@ -105,7 +103,7 @@ public class NotPredicateTest extends PredicateTest { assertEquals(sb, n.copy(sb).getChildren()); try { - n.copy(Collections. emptyList()); + n.copy(Collections.emptyList()); fail("Expected IllegalArgumentException"); } catch (IllegalArgumentException e) { assertEquals("Expected exactly one child", e.getMessage()); diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/OrPredicateTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/OrPredicateTest.java index 27be48d721..7d97a0d861 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/query/OrPredicateTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/OrPredicateTest.java @@ -23,9 +23,8 @@ import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import org.junit.Test; - import java.util.List; +import org.junit.Test; public class OrPredicateTest extends PredicateTest { @Test @@ -69,8 +68,8 @@ public class OrPredicateTest extends PredicateTest { assertChildren("iterator().remove()", n, of(a, b)); } - private static void assertChildren(String o, Predicate p, - List> l) { + private static void assertChildren( + String o, Predicate p, List> l) { assertEquals(o + " did not affect child", l, p.getChildren()); } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/PredicateTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/PredicateTest.java index 7762e50c63..2d13876c5f 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/query/PredicateTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/PredicateTest.java @@ -15,7 +15,6 @@ package com.google.gerrit.server.query; import com.google.gerrit.testutil.GerritBaseTests; - import org.junit.Ignore; @Ignore diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/QueryParserTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/QueryParserTest.java index efa1039174..4c0bcc08b4 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/query/QueryParserTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/QueryParserTest.java @@ -13,6 +13,7 @@ // limitations under the License. package com.google.gerrit.server.query; + import static org.junit.Assert.assertEquals; import org.antlr.runtime.tree.Tree; @@ -30,8 +31,7 @@ public class QueryParserTest { assertSingleWord("project", "tools/*", r); } - private static void assertSingleWord(final String name, final String value, - final Tree r) { + private static void assertSingleWord(final String name, final String value, final Tree r) { assertEquals(QueryParser.FIELD_NAME, r.getType()); assertEquals(name, r.getText()); assertEquals(1, r.getChildCount()); diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/account/AbstractQueryAccountsTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/account/AbstractQueryAccountsTest.java index 037d1da427..3d13536510 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/query/account/AbstractQueryAccountsTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/account/AbstractQueryAccountsTest.java @@ -51,7 +51,11 @@ import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Provider; import com.google.inject.util.Providers; - +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; import org.eclipse.jgit.lib.Config; import org.junit.After; import org.junit.Before; @@ -60,12 +64,6 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.TestName; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; - @Ignore public abstract class AbstractQueryAccountsTest extends GerritServerTests { @ConfigSuite.Default @@ -75,41 +73,29 @@ public abstract class AbstractQueryAccountsTest extends GerritServerTests { return cfg; } - @Rule - public final TestName testName = new TestName(); + @Rule public final TestName testName = new TestName(); - @Inject - protected AccountCache accountCache; + @Inject protected AccountCache accountCache; - @Inject - protected AccountManager accountManager; + @Inject protected AccountManager accountManager; - @Inject - protected GerritApi gApi; + @Inject protected GerritApi gApi; - @Inject - protected IdentifiedUser.GenericFactory userFactory; + @Inject protected IdentifiedUser.GenericFactory userFactory; - @Inject - private Provider anonymousUser; + @Inject private Provider anonymousUser; - @Inject - protected InMemoryDatabase schemaFactory; + @Inject protected InMemoryDatabase schemaFactory; - @Inject - protected SchemaCreator schemaCreator; + @Inject protected SchemaCreator schemaCreator; - @Inject - protected ThreadLocalRequestContext requestContext; + @Inject protected ThreadLocalRequestContext requestContext; - @Inject - protected OneOffRequestContext oneOffRequestContext; + @Inject protected OneOffRequestContext oneOffRequestContext; - @Inject - protected InternalAccountQuery internalAccountQuery; + @Inject protected InternalAccountQuery internalAccountQuery; - @Inject - protected AllProjectsName allProjects; + @Inject protected AllProjectsName allProjects; protected LifecycleManager lifecycle; protected ReviewDb db; @@ -136,8 +122,7 @@ public abstract class AbstractQueryAccountsTest extends GerritServerTests { } protected RequestContext newRequestContext(Account.Id requestUserId) { - final CurrentUser requestUser = - userFactory.create(requestUserId); + final CurrentUser requestUser = userFactory.create(requestUserId); return new RequestContext() { @Override public CurrentUser getUser() { @@ -152,17 +137,18 @@ public abstract class AbstractQueryAccountsTest extends GerritServerTests { } protected void setAnonymous() { - requestContext.setContext(new RequestContext() { - @Override - public CurrentUser getUser() { - return anonymousUser.get(); - } + requestContext.setContext( + new RequestContext() { + @Override + public CurrentUser getUser() { + return anonymousUser.get(); + } - @Override - public Provider getReviewDbProvider() { - return Providers.of(db); - } - }); + @Override + public Provider getReviewDbProvider() { + return Providers.of(db); + } + }); } @After @@ -200,11 +186,9 @@ public abstract class AbstractQueryAccountsTest extends GerritServerTests { AccountInfo user3 = newAccountWithEmail("user3", "user3@" + domain); String prefix = name("prefix"); - AccountInfo user4 = - newAccountWithEmail("user4", prefix + "user4@example.com"); + AccountInfo user4 = newAccountWithEmail("user4", prefix + "user4@example.com"); - AccountInfo user5 = - newAccountWithEmail("user5", name("user5MixedCase@example.com")); + AccountInfo user5 = newAccountWithEmail("user5", name("user5MixedCase@example.com")); assertQuery("notexisting@test.com"); @@ -332,8 +316,7 @@ public abstract class AbstractQueryAccountsTest extends GerritServerTests { @Test public void withDetails() throws Exception { - AccountInfo user1 = - newAccount("myuser", "My User", "my.user@example.com", true); + AccountInfo user1 = newAccount("myuser", "My User", "my.user@example.com", true); List result = assertQuery(user1.username, user1); AccountInfo ai = result.get(0); @@ -343,8 +326,7 @@ public abstract class AbstractQueryAccountsTest extends GerritServerTests { assertThat(ai.email).isNull(); assertThat(ai.avatars).isNull(); - result = assertQuery( - newQuery(user1.username).withOption(ListAccountsOption.DETAILS), user1); + result = assertQuery(newQuery(user1.username).withOption(ListAccountsOption.DETAILS), user1); ai = result.get(0); assertThat(ai._accountId).isEqualTo(user1._accountId); assertThat(ai.name).isEqualTo(user1.name); @@ -355,30 +337,29 @@ public abstract class AbstractQueryAccountsTest extends GerritServerTests { @Test public void withSecondaryEmails() throws Exception { - AccountInfo user1 = - newAccount("myuser", "My User", "my.user@example.com", true); - String[] secondaryEmails = - new String[] {"bar@example.com", "foo@example.com"}; + AccountInfo user1 = newAccount("myuser", "My User", "my.user@example.com", true); + String[] secondaryEmails = new String[] {"bar@example.com", "foo@example.com"}; addEmails(user1, secondaryEmails); - List result = assertQuery(user1.username, user1); assertThat(result.get(0).secondaryEmails).isNull(); - result = assertQuery( - newQuery(user1.username).withOption(ListAccountsOption.DETAILS), user1); + result = assertQuery(newQuery(user1.username).withOption(ListAccountsOption.DETAILS), user1); assertThat(result.get(0).secondaryEmails).isNull(); - result = assertQuery( - newQuery(user1.username).withOption(ListAccountsOption.ALL_EMAILS), - user1); + result = assertQuery(newQuery(user1.username).withOption(ListAccountsOption.ALL_EMAILS), user1); assertThat(result.get(0).secondaryEmails) - .containsExactlyElementsIn(Arrays.asList(secondaryEmails)).inOrder(); + .containsExactlyElementsIn(Arrays.asList(secondaryEmails)) + .inOrder(); - result = assertQuery(newQuery(user1.username).withOptions( - ListAccountsOption.DETAILS, ListAccountsOption.ALL_EMAILS), user1); + result = + assertQuery( + newQuery(user1.username) + .withOptions(ListAccountsOption.DETAILS, ListAccountsOption.ALL_EMAILS), + user1); assertThat(result.get(0).secondaryEmails) - .containsExactlyElementsIn(Arrays.asList(secondaryEmails)).inOrder(); + .containsExactlyElementsIn(Arrays.asList(secondaryEmails)) + .inOrder(); } @Test @@ -414,23 +395,20 @@ public abstract class AbstractQueryAccountsTest extends GerritServerTests { return newAccountWithEmail(username, null); } - protected AccountInfo newAccountWithEmail(String username, String email) - throws Exception { + protected AccountInfo newAccountWithEmail(String username, String email) throws Exception { return newAccount(username, email, true); } - protected AccountInfo newAccountWithFullName(String username, String fullName) - throws Exception { + protected AccountInfo newAccountWithFullName(String username, String fullName) throws Exception { return newAccount(username, fullName, null, true); } - protected AccountInfo newAccount(String username, String email, - boolean active) throws Exception { + protected AccountInfo newAccount(String username, String email, boolean active) throws Exception { return newAccount(username, null, email, active); } - protected AccountInfo newAccount(String username, String fullName, - String email, boolean active) throws Exception { + protected AccountInfo newAccount(String username, String fullName, String email, boolean active) + throws Exception { String uniqueName = name(username); try { @@ -449,8 +427,8 @@ public abstract class AbstractQueryAccountsTest extends GerritServerTests { return new Project.NameKey(name); } - protected void watch(AccountInfo account, Project.NameKey project, - String filter) throws RestApiException { + protected void watch(AccountInfo account, Project.NameKey project, String filter) + throws RestApiException { List projectsToWatch = new ArrayList<>(); ProjectWatchInfo pwi = new ProjectWatchInfo(); pwi.project = project.get(); @@ -477,11 +455,10 @@ public abstract class AbstractQueryAccountsTest extends GerritServerTests { return name + "_" + suffix; } - private Account.Id createAccount(String username, String fullName, - String email, boolean active) throws Exception { + private Account.Id createAccount(String username, String fullName, String email, boolean active) + throws Exception { try (ManualRequestContext ctx = oneOffRequestContext.open()) { - Account.Id id = - accountManager.authenticate(AuthRequest.forUser(username)).getAccountId(); + Account.Id id = accountManager.authenticate(AuthRequest.forUser(username)).getAccountId(); if (email != null) { accountManager.link(id, AuthRequest.forEmail(email)); } @@ -495,8 +472,7 @@ public abstract class AbstractQueryAccountsTest extends GerritServerTests { } } - private void addEmails(AccountInfo account, String... emails) - throws Exception { + private void addEmails(AccountInfo account, String... emails) throws Exception { Account.Id id = new Account.Id(account._accountId); for (String email : emails) { accountManager.link(id, AuthRequest.forEmail(email)); @@ -508,39 +484,36 @@ public abstract class AbstractQueryAccountsTest extends GerritServerTests { return gApi.accounts().query(query.toString()); } - protected List assertQuery(Object query, AccountInfo... accounts) - throws Exception { + protected List assertQuery(Object query, AccountInfo... accounts) throws Exception { return assertQuery(newQuery(query), accounts); } - protected List assertQuery(QueryRequest query, - AccountInfo... accounts) throws Exception { + protected List assertQuery(QueryRequest query, AccountInfo... accounts) + throws Exception { return assertQuery(query, Arrays.asList(accounts)); } - - protected List assertQuery(QueryRequest query, - List accounts) throws Exception { + protected List assertQuery(QueryRequest query, List accounts) + throws Exception { List result = query.get(); Iterable ids = ids(result); - assertThat(ids).named(format(query, result, accounts)) - .containsExactlyElementsIn(ids(accounts)).inOrder(); + assertThat(ids) + .named(format(query, result, accounts)) + .containsExactlyElementsIn(ids(accounts)) + .inOrder(); return result; } - protected void assertAccounts(List accounts, - AccountInfo... expectedAccounts) { - assertThat(accounts.stream().map(a -> a.getAccount().getId().get()) - .collect(toList())) - .containsExactlyElementsIn(Arrays.asList(expectedAccounts).stream() - .map(a -> a._accountId).collect(toList())); + protected void assertAccounts(List accounts, AccountInfo... expectedAccounts) { + assertThat(accounts.stream().map(a -> a.getAccount().getId().get()).collect(toList())) + .containsExactlyElementsIn( + Arrays.asList(expectedAccounts).stream().map(a -> a._accountId).collect(toList())); } - private String format(QueryRequest query, List actualIds, - List expectedAccounts) { + private String format( + QueryRequest query, List actualIds, List expectedAccounts) { StringBuilder b = new StringBuilder(); - b.append("query '").append(query.getQuery()) - .append("' with expected accounts "); + b.append("query '").append(query.getQuery()).append("' with expected accounts "); b.append(format(expectedAccounts)); b.append(" and result "); b.append(format(actualIds)); @@ -553,9 +526,18 @@ public abstract class AbstractQueryAccountsTest extends GerritServerTests { Iterator it = accounts.iterator(); while (it.hasNext()) { AccountInfo a = it.next(); - b.append("{").append(a._accountId).append(", ").append("name=") - .append(a.name).append(", ").append("email=").append(a.email) - .append(", ").append("username=").append(a.username).append("}"); + b.append("{") + .append(a._accountId) + .append(", ") + .append("name=") + .append(a.name) + .append(", ") + .append("email=") + .append(a.email) + .append(", ") + .append("username=") + .append(a.username) + .append("}"); if (it.hasNext()) { b.append(", "); } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/account/LuceneQueryAccountsTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/account/LuceneQueryAccountsTest.java index 857b661ce0..978283ae37 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/query/account/LuceneQueryAccountsTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/account/LuceneQueryAccountsTest.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.query.account; import com.google.gerrit.testutil.InMemoryModule; import com.google.inject.Guice; import com.google.inject.Injector; - import org.eclipse.jgit.lib.Config; public class LuceneQueryAccountsTest extends AbstractQueryAccountsTest { @@ -25,7 +24,6 @@ public class LuceneQueryAccountsTest extends AbstractQueryAccountsTest { protected Injector createInjector() { Config luceneConfig = new Config(config); InMemoryModule.setDefaults(luceneConfig); - return Guice.createInjector( - new InMemoryModule(luceneConfig, notesMigration)); + return Guice.createInjector(new InMemoryModule(luceneConfig, notesMigration)); } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java index 64a71db2fa..bf3e618572 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java @@ -96,19 +96,6 @@ import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Provider; import com.google.inject.util.Providers; - -import org.eclipse.jgit.junit.TestRepository; -import org.eclipse.jgit.lib.Config; -import org.eclipse.jgit.lib.ObjectInserter; -import org.eclipse.jgit.lib.Ref; -import org.eclipse.jgit.lib.RefUpdate; -import org.eclipse.jgit.revwalk.RevCommit; -import org.eclipse.jgit.util.SystemReader; -import org.junit.After; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; - import java.sql.Timestamp; import java.util.ArrayList; import java.util.Arrays; @@ -120,6 +107,17 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.concurrent.TimeUnit; +import org.eclipse.jgit.junit.TestRepository; +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.lib.ObjectInserter; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.lib.RefUpdate; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.util.SystemReader; +import org.junit.After; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; @Ignore public abstract class AbstractQueryChangesTest extends GerritServerTests { @@ -176,8 +174,7 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { db = schemaFactory.open(); schemaCreator.create(db); - userId = accountManager.authenticate(AuthRequest.forUser("user")) - .getAccountId(); + userId = accountManager.authenticate(AuthRequest.forUser("user")).getAccountId(); Account userAccount = db.accounts().get(userId); userAccount.setPreferredEmail("user@example.com"); db.accounts().update(ImmutableList.of(userAccount)); @@ -186,8 +183,7 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { } protected RequestContext newRequestContext(Account.Id requestUserId) { - final CurrentUser requestUser = - userFactory.create(requestUserId); + final CurrentUser requestUser = userFactory.create(requestUserId); return new RequestContext() { @Override public CurrentUser getUser() { @@ -270,8 +266,7 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { assertQuery("change:repo~branch~" + k.substring(0, 10), change); assertQuery("foo~bar"); - assertThatQueryException("change:foo~bar") - .hasMessage("Invalid change format"); + assertThatQueryException("change:foo~bar").hasMessage("Invalid change format"); assertQuery("otherrepo~branch~" + k); assertQuery("change:otherrepo~branch~" + k); assertQuery("repo~otherbranch~" + k); @@ -369,10 +364,8 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { assertQuery("status:N", change1); assertQuery("status:nE", change1); assertQuery("status:neW", change1); - assertThatQueryException("status:nx") - .hasMessage("invalid change status: nx"); - assertThatQueryException("status:newx") - .hasMessage("invalid change status: newx"); + assertThatQueryException("status:nx").hasMessage("invalid change status: nx"); + assertThatQueryException("status:newx").hasMessage("invalid change status: newx"); } @Test @@ -393,8 +386,8 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { public void byOwner() throws Exception { TestRepository repo = createProject("repo"); Change change1 = insert(repo, newChange(repo), userId); - Account.Id user2 = accountManager.authenticate( - AuthRequest.forUser("anotheruser")).getAccountId(); + Account.Id user2 = + accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId(); Change change2 = insert(repo, newChange(repo), user2); assertQuery("owner:" + userId.get(), change1); @@ -462,8 +455,8 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { public void byOwnerIn() throws Exception { TestRepository repo = createProject("repo"); Change change1 = insert(repo, newChange(repo), userId); - Account.Id user2 = accountManager.authenticate( - AuthRequest.forUser("anotheruser")).getAccountId(); + Account.Id user2 = + accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId(); Change change2 = insert(repo, newChange(repo), user2); assertQuery("ownerin:Administrators", change1); @@ -557,11 +550,9 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { @Test public void fullTextWithNumbers() throws Exception { TestRepository repo = createProject("repo"); - RevCommit commit1 = - repo.parseBody(repo.commit().message("12345 67890").create()); + RevCommit commit1 = repo.parseBody(repo.commit().message("12345 67890").create()); Change change1 = insert(repo, newChangeForCommit(repo, commit1)); - RevCommit commit2 = - repo.parseBody(repo.commit().message("12346 67891").create()); + RevCommit commit2 = repo.parseBody(repo.commit().message("12346 67891").create()); Change change2 = insert(repo, newChangeForCommit(repo, commit2)); assertQuery("message:1234"); @@ -580,27 +571,24 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { ChangeInserter ins5 = newChange(repo, null, null, null, null); Change reviewMinus2Change = insert(repo, ins); - gApi.changes().id(reviewMinus2Change.getId().get()).current() - .review(ReviewInput.reject()); + gApi.changes().id(reviewMinus2Change.getId().get()).current().review(ReviewInput.reject()); Change reviewMinus1Change = insert(repo, ins2); - gApi.changes().id(reviewMinus1Change.getId().get()).current() - .review(ReviewInput.dislike()); + gApi.changes().id(reviewMinus1Change.getId().get()).current().review(ReviewInput.dislike()); Change noLabelChange = insert(repo, ins3); Change reviewPlus1Change = insert(repo, ins4); - gApi.changes().id(reviewPlus1Change.getId().get()).current() - .review(ReviewInput.recommend()); + gApi.changes().id(reviewPlus1Change.getId().get()).current().review(ReviewInput.recommend()); Change reviewPlus2Change = insert(repo, ins5); - gApi.changes().id(reviewPlus2Change.getId().get()).current() - .review(ReviewInput.approve()); + gApi.changes().id(reviewPlus2Change.getId().get()).current().review(ReviewInput.approve()); - Map m = gApi.changes() - .id(reviewPlus1Change.getId().get()) - .reviewer(user.getAccountId().toString()) - .votes(); + Map m = + gApi.changes() + .id(reviewPlus1Change.getId().get()) + .reviewer(user.getAccountId().toString()) + .votes(); assertThat(m).hasSize(1); assertThat(m).containsEntry("Code-Review", Short.valueOf((short) 1)); @@ -667,15 +655,13 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { // post a review with user1 requestContext.setContext(newRequestContext(user1)); - gApi.changes().id(reviewPlus1Change.getId().get()).current() - .review(ReviewInput.recommend()); + gApi.changes().id(reviewPlus1Change.getId().get()).current().review(ReviewInput.recommend()); assertQuery("label:Code-Review=+1,user=user1", reviewPlus1Change); assertQuery("label:Code-Review=+1,owner"); } - private Change[] codeReviewInRange(Map changes, int start, - int end) { + private Change[] codeReviewInRange(Map changes, int start, int end) { int size = 0; Change[] range = new Change[end - start + 1]; for (int i : changes.keySet()) { @@ -696,8 +682,7 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { } private Account.Id createAccount(String name) throws Exception { - return accountManager.authenticate( - AuthRequest.forUser(name)).getAccountId(); + return accountManager.authenticate(AuthRequest.forUser(name)).getAccountId(); } @Test @@ -717,8 +702,10 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { // post a review with user1 requestContext.setContext(newRequestContext(user1)); - gApi.changes().id(change1.getId().get()).current() - .review(new ReviewInput().label("Code-Review", 1)); + gApi.changes() + .id(change1.getId().get()) + .current() + .review(new ReviewInput().label("Code-Review", 1)); // verify that query with user1 will return results. requestContext.setContext(newRequestContext(userId)); @@ -751,7 +738,8 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { String q = "status:new limit:" + i; List results = newQuery(q).get(); assertThat(results).named(q).hasSize(expectedSize); - assertThat(results.get(results.size() - 1)._moreChanges).named(q) + assertThat(results.get(results.size() - 1)._moreChanges) + .named(q) .isEqualTo(expectedMoreChanges); assertThat(results.get(0)._number).isEqualTo(last.getId().get()); } @@ -780,9 +768,7 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { } assertQuery("status:new limit:2", changes.get(2), changes.get(1)); - assertQuery( - newQuery("status:new limit:2").withStart(1), - changes.get(1), changes.get(0)); + assertQuery(newQuery("status:new limit:2").withStart(1), changes.get(1), changes.get(0)); assertQuery(newQuery("status:new limit:2").withStart(2), changes.get(0)); assertQuery(newQuery("status:new limit:2").withStart(3)); } @@ -813,7 +799,9 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { } for (int i : ImmutableList.of(2, 0, 1, 4, 3)) { - gApi.changes().id(changes.get(i).getId().get()).current() + gApi.changes() + .id(changes.get(i).getId().get()) + .current() .review(new ReviewInput().message("modifying " + i)); } @@ -838,8 +826,7 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { assertQuery("status:new", change2, change1); gApi.changes().id(change1.getId().get()).topic("new-topic"); - change1 = notesFactory.create(db, change1.getProject(), change1.getId()) - .getChange(); + change1 = notesFactory.create(db, change1.getProject(), change1.getId()).getChange(); assertThat(lastUpdatedMs(change1)).isGreaterThan(lastUpdatedMs(change2)); assertThat(lastUpdatedMs(change1) - lastUpdatedMs(change2)) @@ -863,8 +850,7 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { assertQuery("status:new", change2, change1); gApi.changes().id(change1.getId().get()).topic("new-topic"); - change1 = notesFactory.create(db, change1.getProject(), change1.getId()) - .getChange(); + change1 = notesFactory.create(db, change1.getProject(), change1.getId()).getChange(); assertThat(lastUpdatedMs(change1)).isGreaterThan(lastUpdatedMs(change2)); assertThat(lastUpdatedMs(change1) - lastUpdatedMs(change2)) @@ -878,8 +864,8 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { public void filterOutMoreThanOnePageOfResults() throws Exception { TestRepository repo = createProject("repo"); Change change = insert(repo, newChange(repo), userId); - Account.Id user2 = accountManager.authenticate( - AuthRequest.forUser("anotheruser")).getAccountId(); + Account.Id user2 = + accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId(); for (int i = 0; i < 5; i++) { insert(repo, newChange(repo), user2); } @@ -891,8 +877,8 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { @Test public void filterOutAllResults() throws Exception { TestRepository repo = createProject("repo"); - Account.Id user2 = accountManager.authenticate( - AuthRequest.forUser("anotheruser")).getAccountId(); + Account.Id user2 = + accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId(); for (int i = 0; i < 5; i++) { insert(repo, newChange(repo), user2); } @@ -904,10 +890,13 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { @Test public void byFileExact() throws Exception { TestRepository repo = createProject("repo"); - RevCommit commit = repo.parseBody( - repo.commit().message("one") - .add("dir/file1", "contents1").add("dir/file2", "contents2") - .create()); + RevCommit commit = + repo.parseBody( + repo.commit() + .message("one") + .add("dir/file1", "contents1") + .add("dir/file2", "contents2") + .create()); Change change = insert(repo, newChangeForCommit(repo, commit)); assertQuery("file:file"); @@ -921,10 +910,13 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { @Test public void byFileRegex() throws Exception { TestRepository repo = createProject("repo"); - RevCommit commit = repo.parseBody( - repo.commit().message("one") - .add("dir/file1", "contents1").add("dir/file2", "contents2") - .create()); + RevCommit commit = + repo.parseBody( + repo.commit() + .message("one") + .add("dir/file1", "contents1") + .add("dir/file2", "contents2") + .create()); Change change = insert(repo, newChangeForCommit(repo, commit)); assertQuery("file:.*file.*"); @@ -935,10 +927,13 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { @Test public void byPathExact() throws Exception { TestRepository repo = createProject("repo"); - RevCommit commit = repo.parseBody( - repo.commit().message("one") - .add("dir/file1", "contents1").add("dir/file2", "contents2") - .create()); + RevCommit commit = + repo.parseBody( + repo.commit() + .message("one") + .add("dir/file1", "contents1") + .add("dir/file2", "contents2") + .create()); Change change = insert(repo, newChangeForCommit(repo, commit)); assertQuery("path:file"); @@ -952,10 +947,13 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { @Test public void byPathRegex() throws Exception { TestRepository repo = createProject("repo"); - RevCommit commit = repo.parseBody( - repo.commit().message("one") - .add("dir/file1", "contents1").add("dir/file2", "contents2") - .create()); + RevCommit commit = + repo.parseBody( + repo.commit() + .message("one") + .add("dir/file1", "contents1") + .add("dir/file2", "contents2") + .create()); Change change = insert(repo, newChangeForCommit(repo, commit)); assertQuery("path:.*file.*"); @@ -973,21 +971,19 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { ReviewInput.CommentInput commentInput = new ReviewInput.CommentInput(); commentInput.line = 1; commentInput.message = "inline"; - input.comments = ImmutableMap.> of( - Patch.COMMIT_MSG, - ImmutableList. of(commentInput)); + input.comments = + ImmutableMap.>of( + Patch.COMMIT_MSG, ImmutableList.of(commentInput)); gApi.changes().id(change.getId().get()).current().review(input); Map> comments = gApi.changes().id(change.getId().get()).current().comments(); assertThat(comments).hasSize(1); - CommentInfo comment = - Iterables.getOnlyElement(comments.get(Patch.COMMIT_MSG)); + CommentInfo comment = Iterables.getOnlyElement(comments.get(Patch.COMMIT_MSG)); assertThat(comment.message).isEqualTo(commentInput.message); - ChangeMessageInfo lastMsg = Iterables.getLast( - gApi.changes().id(change.getId().get()).get().messages, null); - assertThat(lastMsg.message) - .isEqualTo("Patch Set 1:\n\n(1 comment)\n\n" + input.message); + ChangeMessageInfo lastMsg = + Iterables.getLast(gApi.changes().id(change.getId().get()).get().messages, null); + assertThat(lastMsg.message).isEqualTo("Patch Set 1:\n\n(1 comment)\n\n" + input.message); assertQuery("comment:foo"); assertQuery("comment:toplevel", change); @@ -1000,19 +996,15 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { resetTimeWithClockStep(thirtyHoursInMs, MILLISECONDS); TestRepository repo = createProject("repo"); long startMs = TestTimeUtil.START.getMillis(); - Change change1 = - insert(repo, newChange(repo), null, new Timestamp(startMs)); - Change change2 = insert( - repo, newChange(repo), null, - new Timestamp(startMs + thirtyHoursInMs)); + Change change1 = insert(repo, newChange(repo), null, new Timestamp(startMs)); + Change change2 = insert(repo, newChange(repo), null, new Timestamp(startMs + thirtyHoursInMs)); // Stop time so age queries use the same endpoint. TestTimeUtil.setClockStep(0, MILLISECONDS); TestTimeUtil.setClock(new Timestamp(startMs + 2 * thirtyHoursInMs)); long nowMs = TimeUtil.nowMs(); - assertThat(lastUpdatedMs(change2) - lastUpdatedMs(change1)) - .isEqualTo(thirtyHoursInMs); + assertThat(lastUpdatedMs(change2) - lastUpdatedMs(change1)).isEqualTo(thirtyHoursInMs); assertThat(nowMs - lastUpdatedMs(change2)).isEqualTo(thirtyHoursInMs); assertThat(TimeUtil.nowMs()).isEqualTo(nowMs); @@ -1031,10 +1023,8 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { resetTimeWithClockStep(thirtyHoursInMs, MILLISECONDS); TestRepository repo = createProject("repo"); long startMs = TestTimeUtil.START.getMillis(); - Change change1 = - insert(repo, newChange(repo), null, new Timestamp(startMs)); - Change change2 = insert( - repo, newChange(repo), null, new Timestamp(startMs + thirtyHoursInMs)); + Change change1 = insert(repo, newChange(repo), null, new Timestamp(startMs)); + Change change2 = insert(repo, newChange(repo), null, new Timestamp(startMs + thirtyHoursInMs)); TestTimeUtil.setClockStep(0, MILLISECONDS); assertQuery("before:2009-09-29"); @@ -1055,10 +1045,8 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { resetTimeWithClockStep(thirtyHoursInMs, MILLISECONDS); TestRepository repo = createProject("repo"); long startMs = TestTimeUtil.START.getMillis(); - Change change1 = - insert(repo, newChange(repo), null, new Timestamp(startMs)); - Change change2 = insert( - repo, newChange(repo), null, new Timestamp(startMs + thirtyHoursInMs)); + Change change1 = insert(repo, newChange(repo), null, new Timestamp(startMs)); + Change change2 = insert(repo, newChange(repo), null, new Timestamp(startMs + thirtyHoursInMs)); TestTimeUtil.setClockStep(0, MILLISECONDS); assertQuery("after:2009-10-03"); @@ -1073,11 +1061,9 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { TestRepository repo = createProject("repo"); // added = 3, deleted = 0, delta = 3 - RevCommit commit1 = repo.parseBody( - repo.commit().add("file1", "foo\n\foo\nfoo").create()); + RevCommit commit1 = repo.parseBody(repo.commit().add("file1", "foo\n\foo\nfoo").create()); // added = 0, deleted = 2, delta = 2 - RevCommit commit2 = repo.parseBody( - repo.commit().parent(commit1).add("file1", "foo").create()); + RevCommit commit2 = repo.parseBody(repo.commit().parent(commit1).add("file1", "foo").create()); Change change1 = insert(repo, newChangeForCommit(repo, commit1)); Change change2 = insert(repo, newChangeForCommit(repo, commit2)); @@ -1190,21 +1176,17 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { Change change1 = insert(repo, newChange(repo)); - RevCommit commit2 = repo.parseBody( - repo.commit().message("foosubject").create()); + RevCommit commit2 = repo.parseBody(repo.commit().message("foosubject").create()); Change change2 = insert(repo, newChangeForCommit(repo, commit2)); - RevCommit commit3 = repo.parseBody( - repo.commit() - .add("Foo.java", "foo contents") - .create()); + RevCommit commit3 = repo.parseBody(repo.commit().add("Foo.java", "foo contents").create()); Change change3 = insert(repo, newChangeForCommit(repo, commit3)); ChangeInserter ins4 = newChange(repo); Change change4 = insert(repo, ins4); ReviewInput ri4 = new ReviewInput(); ri4.message = "toplevel"; - ri4.labels = ImmutableMap. of("Code-Review", (short) 1); + ri4.labels = ImmutableMap.of("Code-Review", (short) 1); gApi.changes().id(change4.getId().get()).current().review(ri4); ChangeInserter ins5 = newChangeWithTopic(repo, "feature5"); @@ -1222,8 +1204,7 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { assertQuery("branch6", change6); assertQuery("refs/heads/branch6", change6); - Change[] expected = - new Change[] {change6, change5, change4, change3, change2, change1}; + Change[] expected = new Change[] {change6, change5, change4, change3, change2, change1}; assertQuery("user@example.com", expected); assertQuery("repo", expected); } @@ -1232,15 +1213,15 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { public void implicitVisibleTo() throws Exception { TestRepository repo = createProject("repo"); Change change1 = insert(repo, newChange(repo), userId); - Change change2 = - insert(repo, newChangeWithStatus(repo, Change.Status.DRAFT), userId); + Change change2 = insert(repo, newChangeWithStatus(repo, Change.Status.DRAFT), userId); String q = "project:repo"; assertQuery(q, change2, change1); // Second user cannot see first user's drafts. - requestContext.setContext(newRequestContext(accountManager - .authenticate(AuthRequest.forUser("anotheruser")).getAccountId())); + requestContext.setContext( + newRequestContext( + accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId())); assertQuery(q, change1); } @@ -1248,16 +1229,14 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { public void explicitVisibleTo() throws Exception { TestRepository repo = createProject("repo"); Change change1 = insert(repo, newChange(repo), userId); - Change change2 = - insert(repo, newChangeWithStatus(repo, Change.Status.DRAFT), userId); + Change change2 = insert(repo, newChangeWithStatus(repo, Change.Status.DRAFT), userId); String q = "project:repo"; assertQuery(q, change2, change1); // Second user cannot see first user's drafts. - Account.Id user2 = accountManager - .authenticate(AuthRequest.forUser("anotheruser")) - .getAccountId(); + Account.Id user2 = + accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId(); assertQuery(q + " visibleto:" + user2.get(), change1); } @@ -1267,16 +1246,17 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { Change change1 = insert(repo, newChange(repo)); Change change2 = insert(repo, newChange(repo)); - int user2 = accountManager.authenticate(AuthRequest.forUser("anotheruser")) - .getAccountId().get(); + int user2 = + accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId().get(); ReviewInput input = new ReviewInput(); input.message = "toplevel"; ReviewInput.CommentInput comment = new ReviewInput.CommentInput(); comment.line = 1; comment.message = "inline"; - input.comments = ImmutableMap.> of( - Patch.COMMIT_MSG, ImmutableList. of(comment)); + input.comments = + ImmutableMap.>of( + Patch.COMMIT_MSG, ImmutableList.of(comment)); gApi.changes().id(change1.getId().get()).current().review(input); input = new ReviewInput(); @@ -1305,8 +1285,8 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { in.path = Patch.COMMIT_MSG; gApi.changes().id(change2.getId().get()).current().createDraft(in); - int user2 = accountManager.authenticate(AuthRequest.forUser("anotheruser")) - .getAccountId().get(); + int user2 = + accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId().get(); assertQuery("draftby:" + userId.get(), change2, change1); assertQuery("draftby:" + user2); @@ -1330,11 +1310,9 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { assertQuery("draftby:" + userId, change); assertQuery("commentby:" + userId); - TestRepository allUsers = - new TestRepository<>(repoManager.openRepository(allUsersName)); + TestRepository allUsers = new TestRepository<>(repoManager.openRepository(allUsersName)); - Ref draftsRef = allUsers.getRepository().exactRef( - RefNames.refsDraftComments(id, userId)); + Ref draftsRef = allUsers.getRepository().exactRef(RefNames.refsDraftComments(id, userId)); assertThat(draftsRef).isNotNull(); ReviewInput rin = ReviewInput.dislike(); @@ -1347,17 +1325,16 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { // Re-add drafts ref and ensure it gets filtered out during indexing. allUsers.update(draftsRef.getName(), draftsRef.getObjectId()); - assertThat(allUsers.getRepository().exactRef(draftsRef.getName())) - .isNotNull(); + assertThat(allUsers.getRepository().exactRef(draftsRef.getName())).isNotNull(); if (PrimaryStorage.of(change) == PrimaryStorage.REVIEW_DB) { // Record draft ref in noteDbState as well. ReviewDb db = ReviewDbUtil.unwrapDb(this.db); change = db.changes().get(id); - NoteDbChangeState.applyDelta(change, + NoteDbChangeState.applyDelta( + change, NoteDbChangeState.Delta.create( - id, Optional.empty(), - ImmutableMap.of(userId, draftsRef.getObjectId()))); + id, Optional.empty(), ImmutableMap.of(userId, draftsRef.getObjectId()))); db.changes().update(Collections.singleton(change)); } @@ -1375,8 +1352,8 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { gApi.accounts().self().starChange(change1.getId().toString()); gApi.accounts().self().starChange(change2.getId().toString()); - int user2 = accountManager.authenticate(AuthRequest.forUser("anotheruser")) - .getAccountId().get(); + int user2 = + accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId().get(); assertQuery("starredby:self", change2, change1); assertQuery("starredby:" + user2); @@ -1391,13 +1368,15 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { gApi.accounts() .self() - .setStars(change1.getId().toString(), + .setStars( + change1.getId().toString(), new StarsInput(new HashSet<>(Arrays.asList("red", "blue")))); gApi.accounts() .self() - .setStars(change2.getId().toString(), - new StarsInput(new HashSet<>(Arrays.asList( - StarredChangesUtil.DEFAULT_LABEL, "green", "blue")))); + .setStars( + change2.getId().toString(), + new StarsInput( + new HashSet<>(Arrays.asList(StarredChangesUtil.DEFAULT_LABEL, "green", "blue")))); // check labeled stars assertQuery("star:red", change1); @@ -1416,8 +1395,8 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { TestRepository repo = createProject("repo"); Change change1 = insert(repo, newChange(repo)); - Account.Id user2 = accountManager.authenticate( - AuthRequest.forUser("anotheruser")).getAccountId(); + Account.Id user2 = + accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId(); Change change2 = insert(repo, newChange(repo), user2); ReviewInput input = new ReviewInput(); @@ -1425,8 +1404,9 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { ReviewInput.CommentInput comment = new ReviewInput.CommentInput(); comment.line = 1; comment.message = "inline"; - input.comments = ImmutableMap.> of( - Patch.COMMIT_MSG, ImmutableList. of(comment)); + input.comments = + ImmutableMap.>of( + Patch.COMMIT_MSG, ImmutableList.of(comment)); gApi.changes().id(change2.getId().get()).current().review(input); assertQuery("from:" + userId.get(), change2, change1); @@ -1436,24 +1416,17 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { @Test public void conflicts() throws Exception { TestRepository repo = createProject("repo"); - RevCommit commit1 = repo.parseBody( - repo.commit() - .add("file1", "contents1") - .add("dir/file2", "contents2") - .add("dir/file3", "contents3") - .create()); - RevCommit commit2 = repo.parseBody( - repo.commit() - .add("file1", "contents1") - .create()); - RevCommit commit3 = repo.parseBody( - repo.commit() - .add("dir/file2", "contents2 different") - .create()); - RevCommit commit4 = repo.parseBody( - repo.commit() - .add("file4", "contents4") - .create()); + RevCommit commit1 = + repo.parseBody( + repo.commit() + .add("file1", "contents1") + .add("dir/file2", "contents2") + .add("dir/file3", "contents3") + .create()); + RevCommit commit2 = repo.parseBody(repo.commit().add("file1", "contents1").create()); + RevCommit commit3 = + repo.parseBody(repo.commit().add("dir/file2", "contents2 different").create()); + RevCommit commit4 = repo.parseBody(repo.commit().add("file4", "contents4").create()); Change change1 = insert(repo, newChangeForCommit(repo, commit1)); Change change2 = insert(repo, newChangeForCommit(repo, commit2)); Change change3 = insert(repo, newChangeForCommit(repo, commit3)); @@ -1473,20 +1446,13 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { Change change2 = insert(repo, newChange(repo)); Change change3 = insert(repo, newChange(repo)); - gApi.changes() - .id(change1.getId().get()) - .current() - .review(new ReviewInput().message("comment")); + gApi.changes().id(change1.getId().get()).current().review(new ReviewInput().message("comment")); - Account.Id user2 = accountManager - .authenticate(AuthRequest.forUser("anotheruser")) - .getAccountId(); + Account.Id user2 = + accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId(); requestContext.setContext(newRequestContext(user2)); - gApi.changes() - .id(change2.getId().get()) - .current() - .review(new ReviewInput().message("comment")); + gApi.changes().id(change2.getId().get()).current().review(new ReviewInput().message("comment")); PatchSet.Id ps3_1 = change3.currentPatchSetId(); change3 = newPatchSet(repo, change3); @@ -1498,22 +1464,17 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { .review(new ReviewInput().message("comment")); List actual; - actual = assertQuery( - newQuery("is:reviewed").withOption(REVIEWED), - change3, change2); + actual = assertQuery(newQuery("is:reviewed").withOption(REVIEWED), change3, change2); assertThat(actual.get(0).reviewed).isTrue(); assertThat(actual.get(1).reviewed).isTrue(); - actual = assertQuery( - newQuery("-is:reviewed").withOption(REVIEWED), - change1); + actual = assertQuery(newQuery("-is:reviewed").withOption(REVIEWED), change1); assertThat(actual.get(0).reviewed).isNull(); actual = assertQuery("reviewedby:" + userId.get()); - actual = assertQuery( - newQuery("reviewedby:" + user2.get()).withOption(REVIEWED), - change3, change2); + actual = + assertQuery(newQuery("reviewedby:" + user2.get()).withOption(REVIEWED), change3, change2); assertThat(actual.get(0).reviewed).isTrue(); assertThat(actual.get(1).reviewed).isTrue(); } @@ -1525,14 +1486,8 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { Change change2 = insert(repo, newChange(repo)); insert(repo, newChange(repo)); - gApi.changes() - .id(change1.getId().get()) - .current() - .review(ReviewInput.approve()); - gApi.changes() - .id(change2.getId().get()) - .current() - .review(ReviewInput.approve()); + gApi.changes().id(change1.getId().get()).current().review(ReviewInput.approve()); + gApi.changes().id(change2.getId().get()).current().review(ReviewInput.approve()); Account.Id id = user.getAccountId(); assertQuery("reviewer:" + id, change2, change1); @@ -1545,15 +1500,9 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { Change change1 = insert(repo, newChange(repo)); Change change2 = insert(repo, newChange(repo)); - gApi.changes() - .id(change1.getId().get()) - .current() - .review(ReviewInput.approve()); + gApi.changes().id(change1.getId().get()).current().review(ReviewInput.approve()); requestContext.setContext(newRequestContext(user1)); - gApi.changes() - .id(change2.getId().get()) - .current() - .review(ReviewInput.recommend()); + gApi.changes().id(change2.getId().get()).current().review(ReviewInput.recommend()); requestContext.setContext(newRequestContext(user.getAccountId())); assertQuery("is:submittable", change1); @@ -1585,21 +1534,12 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { requestContext.setContext(newRequestContext(user1)); assertQuery("has:edit"); - gApi.changes() - .id(changeId1) - .edit() - .create(); - gApi.changes() - .id(changeId2) - .edit() - .create(); + gApi.changes().id(changeId1).edit().create(); + gApi.changes().id(changeId2).edit().create(); requestContext.setContext(newRequestContext(user2)); assertQuery("has:edit"); - gApi.changes() - .id(changeId2) - .edit() - .create(); + gApi.changes().id(changeId2).edit().create(); requestContext.setContext(newRequestContext(user1)); assertQuery("has:edit", change2, change1); @@ -1626,14 +1566,12 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { } for (int i = 1; i <= 11; i++) { - Iterable cds = internalChangeQuery.byCommitsOnBranchNotMerged( - repo.getRepository(), db, dest, shas, i); - Iterable ids = FluentIterable.from(cds) - .transform(in -> in.getId().get()); + Iterable cds = + internalChangeQuery.byCommitsOnBranchNotMerged(repo.getRepository(), db, dest, shas, i); + Iterable ids = FluentIterable.from(cds).transform(in -> in.getId().get()); String name = "limit " + i; assertThat(ids).named(name).hasSize(n); - assertThat(ids).named(name) - .containsExactlyElementsIn(expectedIds); + assertThat(ids).named(name).containsExactlyElementsIn(expectedIds); } } @@ -1646,9 +1584,8 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { db = new DisabledReviewDb(); requestContext.setContext(newRequestContext(userId)); // Use QueryProcessor directly instead of API so we get ChangeDatas back. - List cds = queryProcessor - .query(queryBuilder.parse(change.getId().toString())) - .entities(); + List cds = + queryProcessor.query(queryBuilder.parse(change.getId().toString())).entities(); assertThat(cds).hasSize(1); ChangeData cd = cds.get(0); @@ -1676,12 +1613,12 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { db = new DisabledReviewDb(); requestContext.setContext(newRequestContext(userId)); // Use QueryProcessor directly instead of API so we get ChangeDatas back. - List cds = queryProcessor - .setRequestedFields(ImmutableSet.of( - ChangeField.PATCH_SET.getName(), - ChangeField.CHANGE.getName())) - .query(queryBuilder.parse(change.getId().toString())) - .entities(); + List cds = + queryProcessor + .setRequestedFields( + ImmutableSet.of(ChangeField.PATCH_SET.getName(), ChangeField.CHANGE.getName())) + .query(queryBuilder.parse(change.getId().toString())) + .entities(); assertThat(cds).hasSize(1); ChangeData cd = cds.get(0); @@ -1699,21 +1636,17 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { TestRepository repo = createProject(project.get()); Change change = insert(repo, newChange(repo)); String changeId = change.getKey().get(); - ChangeNotes notes = - notesFactory.create(db, change.getProject(), change.getId()); + ChangeNotes notes = notesFactory.create(db, change.getProject(), change.getId()); PatchSet ps = psUtil.get(db, notes, change.currentPatchSetId()); requestContext.setContext(newRequestContext(user)); - gApi.changes() - .id(changeId) - .edit() - .create(); + gApi.changes().id(changeId).edit().create(); assertQuery("has:edit", change); assertThat(indexer.reindexIfStale(project, change.getId()).get()).isFalse(); // Delete edit ref behind index's back. - RefUpdate ru = repo.getRepository().updateRef( - RefNames.refsEdit(user, change.getId(), ps.getId())); + RefUpdate ru = + repo.getRepository().updateRef(RefNames.refsEdit(user, change.getId(), ps.getId())); ru.setForceUpdate(true); assertThat(ru.delete()).isEqualTo(RefUpdate.Result.FORCED); @@ -1726,14 +1659,12 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { @Test public void refStateFields() throws Exception { // This test method manages primary storage manually. - assume().that(notesMigration.changePrimaryStorage()) - .isEqualTo(PrimaryStorage.REVIEW_DB); + assume().that(notesMigration.changePrimaryStorage()).isEqualTo(PrimaryStorage.REVIEW_DB); Account.Id user = createAccount("user"); Project.NameKey project = new Project.NameKey("repo"); TestRepository repo = createProject(project.get()); String path = "file"; - RevCommit commit = repo.parseBody( - repo.commit().message("one").add(path, "contents").create()); + RevCommit commit = repo.parseBody(repo.commit().message("one").add(path, "contents").create()); Change change = insert(repo, newChangeForCommit(repo, commit)); Change.Id id = change.getId(); int c = id.get(); @@ -1744,15 +1675,10 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { // any more refs are added, update this test to reflect them. // Edit - gApi.changes() - .id(changeId) - .edit() - .create(); + gApi.changes().id(changeId).edit().create(); // Star - gApi.accounts() - .self() - .starChange(change.getId().toString()); + gApi.accounts().self().starChange(change.getId().toString()); if (notesMigration.readChanges()) { // Robot comment. @@ -1782,71 +1708,72 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { indexer.index(db, change); } - QueryOptions opts = IndexedChangeQuery.createOptions( - indexConfig, 0, 1, StalenessChecker.FIELDS); + QueryOptions opts = + IndexedChangeQuery.createOptions(indexConfig, 0, 1, StalenessChecker.FIELDS); ChangeData cd = indexes.getSearchIndex().get(id, opts).get(); String cs = RefNames.shard(c); int u = user.get(); String us = RefNames.shard(u); - List expectedStates = Lists.newArrayList( - "repo:refs/users/" + us + "/edit-" + c + "/1", - "All-Users:refs/starred-changes/" + cs + "/" + u); + List expectedStates = + Lists.newArrayList( + "repo:refs/users/" + us + "/edit-" + c + "/1", + "All-Users:refs/starred-changes/" + cs + "/" + u); if (notesMigration.readChanges()) { expectedStates.add("repo:refs/changes/" + cs + "/meta"); expectedStates.add("repo:refs/changes/" + cs + "/robot-comments"); expectedStates.add("All-Users:refs/draft-comments/" + cs + "/" + u); } assertThat( - cd.getRefStates().stream() + cd.getRefStates() + .stream() .map(String::new) // Omit SHA-1, we're just concerned with the project/ref names. .map(s -> s.substring(0, s.lastIndexOf(':'))) .collect(toList())) .containsExactlyElementsIn(expectedStates); - List expectedPatterns = Lists.newArrayList( - "repo:refs/users/*/edit-" + c + "/*"); + List expectedPatterns = Lists.newArrayList("repo:refs/users/*/edit-" + c + "/*"); expectedPatterns.add("All-Users:refs/starred-changes/" + cs + "/*"); if (notesMigration.readChanges()) { expectedPatterns.add("All-Users:refs/draft-comments/" + cs + "/*"); } - assertThat( - cd.getRefStatePatterns().stream() - .map(String::new) - .collect(toList())) + assertThat(cd.getRefStatePatterns().stream().map(String::new).collect(toList())) .containsExactlyElementsIn(expectedPatterns); } - protected ChangeInserter newChange(TestRepository repo) - throws Exception { + protected ChangeInserter newChange(TestRepository repo) throws Exception { return newChange(repo, null, null, null, null); } - protected ChangeInserter newChangeForCommit(TestRepository repo, - RevCommit commit) throws Exception { + protected ChangeInserter newChangeForCommit(TestRepository repo, RevCommit commit) + throws Exception { return newChange(repo, commit, null, null, null); } - protected ChangeInserter newChangeForBranch(TestRepository repo, - String branch) throws Exception { + protected ChangeInserter newChangeForBranch(TestRepository repo, String branch) + throws Exception { return newChange(repo, null, branch, null, null); } - protected ChangeInserter newChangeWithStatus(TestRepository repo, - Change.Status status) throws Exception { + protected ChangeInserter newChangeWithStatus(TestRepository repo, Change.Status status) + throws Exception { return newChange(repo, null, null, status, null); } - protected ChangeInserter newChangeWithTopic(TestRepository repo, - String topic) throws Exception { + protected ChangeInserter newChangeWithTopic(TestRepository repo, String topic) + throws Exception { return newChange(repo, null, null, null, topic); } - protected ChangeInserter newChange(TestRepository repo, - @Nullable RevCommit commit, @Nullable String branch, - @Nullable Change.Status status, @Nullable String topic) throws Exception { + protected ChangeInserter newChange( + TestRepository repo, + @Nullable RevCommit commit, + @Nullable String branch, + @Nullable Change.Status status, + @Nullable String topic) + throws Exception { if (commit == null) { commit = repo.parseBody(repo.commit().message("message").create()); } @@ -1857,11 +1784,12 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { } Change.Id id = new Change.Id(seq.nextChangeId()); - ChangeInserter ins = changeFactory.create( - id, commit, branch) - .setValidatePolicy(CommitValidators.Policy.NONE) - .setStatus(status) - .setTopic(topic); + ChangeInserter ins = + changeFactory + .create(id, commit, branch) + .setValidatePolicy(CommitValidators.Policy.NONE) + .setStatus(status) + .setTopic(topic); return ins; } @@ -1869,15 +1797,19 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { return insert(repo, ins, null, TimeUtil.nowTs()); } - protected Change insert(TestRepository repo, ChangeInserter ins, - @Nullable Account.Id owner) throws Exception { + protected Change insert(TestRepository repo, ChangeInserter ins, @Nullable Account.Id owner) + throws Exception { return insert(repo, ins, owner, TimeUtil.nowTs()); } - protected Change insert(TestRepository repo, ChangeInserter ins, - @Nullable Account.Id owner, Timestamp createdOn) throws Exception { - Project.NameKey project = new Project.NameKey( - repo.getRepository().getDescription().getRepositoryName()); + protected Change insert( + TestRepository repo, + ChangeInserter ins, + @Nullable Account.Id owner, + Timestamp createdOn) + throws Exception { + Project.NameKey project = + new Project.NameKey(repo.getRepository().getDescription().getRepositoryName()); Account.Id ownerId = owner != null ? owner : userId; IdentifiedUser user = userFactory.create(ownerId); try (BatchUpdate bu = updateFactory.create(db, project, user, createdOn)) { @@ -1887,25 +1819,21 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { } } - protected Change newPatchSet(TestRepository repo, Change c) - throws Exception { + protected Change newPatchSet(TestRepository repo, Change c) throws Exception { // Add a new file so the patch set is not a trivial rebase, to avoid default // Code-Review label copying. int n = c.currentPatchSetId().get() + 1; - RevCommit commit = repo.parseBody( - repo.commit() - .message("message") - .add("file" + n, "contents " + n) - .create()); + RevCommit commit = + repo.parseBody(repo.commit().message("message").add("file" + n, "contents " + n).create()); ChangeControl ctl = changeControlFactory.controlFor(db, c, user); - PatchSetInserter inserter = patchSetFactory.create( - ctl, new PatchSet.Id(c.getId(), n), commit) - .setNotify(NotifyHandling.NONE) - .setFireRevisionCreated(false) - .setValidatePolicy(CommitValidators.Policy.NONE); - try (BatchUpdate bu = updateFactory.create( - db, c.getProject(), user, TimeUtil.nowTs()); + PatchSetInserter inserter = + patchSetFactory + .create(ctl, new PatchSet.Id(c.getId(), n), commit) + .setNotify(NotifyHandling.NONE) + .setFireRevisionCreated(false) + .setValidatePolicy(CommitValidators.Policy.NONE); + try (BatchUpdate bu = updateFactory.create(db, c.getProject(), user, TimeUtil.nowTs()); ObjectInserter oi = repo.getRepository().newObjectInserter()) { bu.setRepository(repo.getRepository(), repo.getRevWalk(), oi); bu.addOp(c.getId(), inserter); @@ -1915,17 +1843,14 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { return inserter.getChange(); } - protected ThrowableSubject assertThatQueryException(Object query) - throws Exception { + protected ThrowableSubject assertThatQueryException(Object query) throws Exception { return assertThatQueryException(newQuery(query)); } - protected ThrowableSubject assertThatQueryException(QueryRequest query) - throws Exception { + protected ThrowableSubject assertThatQueryException(QueryRequest query) throws Exception { try { query.get(); - throw new AssertionError( - "expected BadRequestException for query: " + query); + throw new AssertionError("expected BadRequestException for query: " + query); } catch (BadRequestException e) { return assertThat(e); } @@ -1933,35 +1858,32 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { protected TestRepository createProject(String name) throws Exception { gApi.projects().create(name).get(); - return new TestRepository<>( - repoManager.openRepository(new Project.NameKey(name))); + return new TestRepository<>(repoManager.openRepository(new Project.NameKey(name))); } protected QueryRequest newQuery(Object query) { return gApi.changes().query(query.toString()); } - protected List assertQuery(Object query, Change... changes) - throws Exception { + protected List assertQuery(Object query, Change... changes) throws Exception { return assertQuery(newQuery(query), changes); } - protected List assertQuery(QueryRequest query, Change... changes) - throws Exception { + protected List assertQuery(QueryRequest query, Change... changes) throws Exception { List result = query.get(); Iterable ids = ids(result); - assertThat(ids).named(format(query, ids, changes)) - .containsExactlyElementsIn(ids(changes)).inOrder(); + assertThat(ids) + .named(format(query, ids, changes)) + .containsExactlyElementsIn(ids(changes)) + .inOrder(); return result; } - private String format(QueryRequest query, Iterable actualIds, - Change... expectedChanges) throws RestApiException { + private String format(QueryRequest query, Iterable actualIds, Change... expectedChanges) + throws RestApiException { StringBuilder b = new StringBuilder(); - b.append("query '").append(query.getQuery()) - .append("' with expected changes "); - b.append(format( - Arrays.stream(expectedChanges).map(Change::getChangeId).iterator())); + b.append("query '").append(query.getQuery()).append("' with expected changes "); + b.append(format(Arrays.stream(expectedChanges).map(Change::getChangeId).iterator())); b.append(" and result "); b.append(format(actualIds)); return b.toString(); @@ -1977,12 +1899,19 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { while (changeIds.hasNext()) { int id = changeIds.next(); ChangeInfo c = gApi.changes().id(id).get(); - b.append("{").append(id).append(" (").append(c.changeId) - .append("), ").append("dest=").append( - new Branch.NameKey( - new Project.NameKey(c.project), c.branch)).append(", ") - .append("status=").append(c.status).append(", ") - .append("lastUpdated=").append(c.updated.getTime()) + b.append("{") + .append(id) + .append(" (") + .append(c.changeId) + .append("), ") + .append("dest=") + .append(new Branch.NameKey(new Project.NameKey(c.project), c.branch)) + .append(", ") + .append("status=") + .append(c.status) + .append(", ") + .append("lastUpdated=") + .append(c.updated.getTime()) .append("}"); if (changeIds.hasNext()) { b.append(", "); @@ -1993,13 +1922,11 @@ public abstract class AbstractQueryChangesTest extends GerritServerTests { } protected static Iterable ids(Change... changes) { - return FluentIterable.from(Arrays.asList(changes)) - .transform(in -> in.getId().get()); + return FluentIterable.from(Arrays.asList(changes)).transform(in -> in.getId().get()); } protected static Iterable ids(Iterable changes) { - return FluentIterable.from(changes) - .transform(in -> in._number); + return FluentIterable.from(changes).transform(in -> in._number); } protected static long lastUpdatedMs(Change c) { diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/ChangeDataTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/ChangeDataTest.java index eb19ebe497..def0b08f3b 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/ChangeDataTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/ChangeDataTest.java @@ -22,7 +22,6 @@ import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.testutil.TestChanges; - import org.junit.Test; public class ChangeDataTest { diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/LuceneQueryChangesTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/LuceneQueryChangesTest.java index 70493e848d..d3ecc296e9 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/LuceneQueryChangesTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/LuceneQueryChangesTest.java @@ -20,7 +20,6 @@ import com.google.gerrit.testutil.InMemoryModule; import com.google.gerrit.testutil.InMemoryRepositoryManager.Repo; import com.google.inject.Guice; import com.google.inject.Injector; - import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.revwalk.RevCommit; @@ -31,18 +30,15 @@ public class LuceneQueryChangesTest extends AbstractQueryChangesTest { protected Injector createInjector() { Config luceneConfig = new Config(config); InMemoryModule.setDefaults(luceneConfig); - return Guice.createInjector( - new InMemoryModule(luceneConfig, notesMigration)); + return Guice.createInjector(new InMemoryModule(luceneConfig, notesMigration)); } @Test public void fullTextWithSpecialChars() throws Exception { TestRepository repo = createProject("repo"); - RevCommit commit1 = - repo.parseBody(repo.commit().message("foo_bar_foo").create()); + RevCommit commit1 = repo.parseBody(repo.commit().message("foo_bar_foo").create()); Change change1 = insert(repo, newChangeForCommit(repo, commit1)); - RevCommit commit2 = - repo.parseBody(repo.commit().message("one.two.three").create()); + RevCommit commit2 = repo.parseBody(repo.commit().message("one.two.three").create()); Change change2 = insert(repo, newChangeForCommit(repo, commit2)); assertQuery("message:foo_ba"); diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/RegexPathPredicateTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/RegexPathPredicateTest.java index 0480c5e44c..a13a8f73b6 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/RegexPathPredicateTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/RegexPathPredicateTest.java @@ -20,10 +20,8 @@ import static org.junit.Assert.assertTrue; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Project; import com.google.gwtorm.server.OrmException; - -import org.junit.Test; - import java.util.Arrays; +import org.junit.Test; public class RegexPathPredicateTest { @Test @@ -85,8 +83,7 @@ public class RegexPathPredicateTest { private static ChangeData change(String... files) throws OrmException { Arrays.sort(files); - ChangeData cd = ChangeData.createForTest(new Project.NameKey("project"), - new Change.Id(1), 1); + ChangeData cd = ChangeData.createForTest(new Project.NameKey("project"), new Change.Id(1), 1); cd.setCurrentFilePaths(Arrays.asList(files)); return cd; } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/group/AbstractQueryGroupsTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/group/AbstractQueryGroupsTest.java index 0ecc12553b..2813c03205 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/query/group/AbstractQueryGroupsTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/group/AbstractQueryGroupsTest.java @@ -49,7 +49,11 @@ import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Provider; import com.google.inject.util.Providers; - +import java.util.Arrays; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; import org.eclipse.jgit.lib.Config; import org.junit.After; import org.junit.Before; @@ -58,12 +62,6 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.TestName; -import java.util.Arrays; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; - @Ignore public abstract class AbstractQueryGroupsTest extends GerritServerTests { @ConfigSuite.Default @@ -73,44 +71,31 @@ public abstract class AbstractQueryGroupsTest extends GerritServerTests { return cfg; } - @Rule - public final TestName testName = new TestName(); + @Rule public final TestName testName = new TestName(); - @Inject - protected AccountCache accountCache; + @Inject protected AccountCache accountCache; - @Inject - protected AccountManager accountManager; + @Inject protected AccountManager accountManager; - @Inject - protected GerritApi gApi; + @Inject protected GerritApi gApi; - @Inject - protected IdentifiedUser.GenericFactory userFactory; + @Inject protected IdentifiedUser.GenericFactory userFactory; - @Inject - private Provider anonymousUser; + @Inject private Provider anonymousUser; - @Inject - protected InMemoryDatabase schemaFactory; + @Inject protected InMemoryDatabase schemaFactory; - @Inject - protected SchemaCreator schemaCreator; + @Inject protected SchemaCreator schemaCreator; - @Inject - protected ThreadLocalRequestContext requestContext; + @Inject protected ThreadLocalRequestContext requestContext; - @Inject - protected OneOffRequestContext oneOffRequestContext; + @Inject protected OneOffRequestContext oneOffRequestContext; - @Inject - protected InternalAccountQuery internalAccountQuery; + @Inject protected InternalAccountQuery internalAccountQuery; - @Inject - protected AllProjectsName allProjects; + @Inject protected AllProjectsName allProjects; - @Inject - protected GroupCache groupCache; + @Inject protected GroupCache groupCache; protected LifecycleManager lifecycle; protected ReviewDb db; @@ -137,8 +122,7 @@ public abstract class AbstractQueryGroupsTest extends GerritServerTests { } protected RequestContext newRequestContext(Account.Id requestUserId) { - final CurrentUser requestUser = - userFactory.create(requestUserId); + final CurrentUser requestUser = userFactory.create(requestUserId); return new RequestContext() { @Override public CurrentUser getUser() { @@ -153,17 +137,18 @@ public abstract class AbstractQueryGroupsTest extends GerritServerTests { } protected void setAnonymous() { - requestContext.setContext(new RequestContext() { - @Override - public CurrentUser getUser() { - return anonymousUser.get(); - } + requestContext.setContext( + new RequestContext() { + @Override + public CurrentUser getUser() { + return anonymousUser.get(); + } - @Override - public Provider getReviewDbProvider() { - return Providers.of(db); - } - }); + @Override + public Provider getReviewDbProvider() { + return Providers.of(db); + } + }); } @After @@ -211,18 +196,14 @@ public abstract class AbstractQueryGroupsTest extends GerritServerTests { GroupInfo group2 = createGroup("group-" + namePart + "-2"); GroupInfo group3 = createGroup("group-" + namePart + "3"); assertQuery("inname:" + namePart, group1, group2, group3); - assertQuery("inname:" + namePart.toUpperCase(Locale.US), group1, group2, - group3); - assertQuery("inname:" + namePart.toLowerCase(Locale.US), group1, group2, - group3); + assertQuery("inname:" + namePart.toUpperCase(Locale.US), group1, group2, group3); + assertQuery("inname:" + namePart.toLowerCase(Locale.US), group1, group2, group3); } @Test public void byDescription() throws Exception { - GroupInfo group1 = - createGroupWithDescription(name("group1"), "This is a test group."); - GroupInfo group2 = - createGroupWithDescription(name("group2"), "ANOTHER TEST GROUP."); + GroupInfo group1 = createGroupWithDescription(name("group1"), "This is a test group."); + GroupInfo group2 = createGroupWithDescription(name("group2"), "ANOTHER TEST GROUP."); createGroupWithDescription(name("group3"), "Maintainers of project foo."); assertQuery("description:test", group1, group2); @@ -260,8 +241,9 @@ public abstract class AbstractQueryGroupsTest extends GerritServerTests { public void byDefaultField() throws Exception { GroupInfo group1 = createGroup(name("foo-group")); GroupInfo group2 = createGroup(name("group2")); - GroupInfo group3 = createGroupWithDescription(name("group3"), - "decription that contains foo and the UUID of group2: " + group2.id); + GroupInfo group3 = + createGroupWithDescription( + name("group3"), "decription that contains foo and the UUID of group2: " + group2.id); assertQuery("non-existing"); assertQuery("foo", group1, group3); @@ -274,8 +256,7 @@ public abstract class AbstractQueryGroupsTest extends GerritServerTests { GroupInfo group2 = createGroup(name("group2")); GroupInfo group3 = createGroup(name("group3")); - String query = - "uuid:" + group1.id + " OR uuid:" + group2.id + " OR uuid:" + group3.id; + String query = "uuid:" + group1.id + " OR uuid:" + group2.id + " OR uuid:" + group3.id; List result = assertQuery(query, group1, group2, group3); assertThat(result.get(result.size() - 1)._moreGroups).isNull(); @@ -289,8 +270,7 @@ public abstract class AbstractQueryGroupsTest extends GerritServerTests { GroupInfo group2 = createGroup(name("group2")); GroupInfo group3 = createGroup(name("group3")); - String query = - "uuid:" + group1.id + " OR uuid:" + group2.id + " OR uuid:" + group3.id; + String query = "uuid:" + group1.id + " OR uuid:" + group2.id + " OR uuid:" + group3.id; List result = assertQuery(query, group1, group2, group3); assertQuery(newQuery(query).withStart(1), result.subList(1, 3)); @@ -311,8 +291,7 @@ public abstract class AbstractQueryGroupsTest extends GerritServerTests { // update group in the database so that group index is stale String newDescription = "barY"; - AccountGroup group = - db.accountGroups().get(new AccountGroup.Id(group1.groupId)); + AccountGroup group = db.accountGroups().get(new AccountGroup.Id(group1.groupId)); group.setDescription(newDescription); db.accountGroups().update(Collections.singleton(group)); @@ -324,11 +303,10 @@ public abstract class AbstractQueryGroupsTest extends GerritServerTests { assertQuery("description:" + newDescription, group1); } - private Account.Id createAccount(String username, String fullName, - String email, boolean active) throws Exception { + private Account.Id createAccount(String username, String fullName, String email, boolean active) + throws Exception { try (ManualRequestContext ctx = oneOffRequestContext.open()) { - Account.Id id = - accountManager.authenticate(AuthRequest.forUser(username)).getAccountId(); + Account.Id id = accountManager.authenticate(AuthRequest.forUser(username)).getAccountId(); if (email != null) { accountManager.link(id, AuthRequest.forEmail(email)); } @@ -342,31 +320,28 @@ public abstract class AbstractQueryGroupsTest extends GerritServerTests { } } - protected GroupInfo createGroup(String name, AccountInfo... members) - throws Exception { + protected GroupInfo createGroup(String name, AccountInfo... members) throws Exception { return createGroupWithDescription(name, null, members); } - protected GroupInfo createGroupWithDescription(String name, - String description, AccountInfo... members) throws Exception { + protected GroupInfo createGroupWithDescription( + String name, String description, AccountInfo... members) throws Exception { GroupInput in = new GroupInput(); in.name = name; in.description = description; - in.members = Arrays.asList(members).stream() - .map(a -> String.valueOf(a._accountId)).collect(toList()); + in.members = + Arrays.asList(members).stream().map(a -> String.valueOf(a._accountId)).collect(toList()); return gApi.groups().create(in).get(); } - protected GroupInfo createGroupWithOwner(String name, GroupInfo ownerGroup) - throws Exception { + protected GroupInfo createGroupWithOwner(String name, GroupInfo ownerGroup) throws Exception { GroupInput in = new GroupInput(); in.name = name; in.ownerId = ownerGroup.id; return gApi.groups().create(in).get(); } - protected GroupInfo createGroupThatIsVisibleToAll(String name) - throws Exception { + protected GroupInfo createGroupThatIsVisibleToAll(String name) throws Exception { GroupInput in = new GroupInput(); in.name = name; in.visibleToAll = true; @@ -377,22 +352,19 @@ public abstract class AbstractQueryGroupsTest extends GerritServerTests { return gApi.groups().id(uuid.get()).get(); } - protected List assertQuery(Object query, GroupInfo... groups) - throws Exception { + protected List assertQuery(Object query, GroupInfo... groups) throws Exception { return assertQuery(newQuery(query), groups); } - protected List assertQuery(QueryRequest query, - GroupInfo... groups) throws Exception { + protected List assertQuery(QueryRequest query, GroupInfo... groups) throws Exception { return assertQuery(query, Arrays.asList(groups)); } - protected List assertQuery(QueryRequest query, - List groups) throws Exception { + protected List assertQuery(QueryRequest query, List groups) + throws Exception { List result = query.get(); Iterable uuids = uuids(result); - assertThat(uuids).named(format(query, result, groups)) - .containsExactlyElementsIn(uuids(groups)); + assertThat(uuids).named(format(query, result, groups)).containsExactlyElementsIn(uuids(groups)); return result; } @@ -400,11 +372,10 @@ public abstract class AbstractQueryGroupsTest extends GerritServerTests { return gApi.groups().query(query.toString()); } - protected String format(QueryRequest query, List actualGroups, - List expectedGroups) { + protected String format( + QueryRequest query, List actualGroups, List expectedGroups) { StringBuilder b = new StringBuilder(); - b.append("query '").append(query.getQuery()) - .append("' with expected groups "); + b.append("query '").append(query.getQuery()).append("' with expected groups "); b.append(format(expectedGroups)); b.append(" and result "); b.append(format(actualGroups)); @@ -417,13 +388,30 @@ public abstract class AbstractQueryGroupsTest extends GerritServerTests { Iterator it = groups.iterator(); while (it.hasNext()) { GroupInfo g = it.next(); - b.append("{").append(g.id).append(", ").append("name=").append(g.name) - .append(", ").append("groupId=").append(g.groupId).append(", ") - .append("url=").append(g.url).append(", ").append("ownerId=") - .append(g.ownerId).append(", ").append("owner=").append(g.owner) - .append(", ").append("description=").append(g.description) - .append(", ").append("visibleToAll=") - .append(toBoolean(g.options.visibleToAll)).append("}"); + b.append("{") + .append(g.id) + .append(", ") + .append("name=") + .append(g.name) + .append(", ") + .append("groupId=") + .append(g.groupId) + .append(", ") + .append("url=") + .append(g.url) + .append(", ") + .append("ownerId=") + .append(g.ownerId) + .append(", ") + .append("owner=") + .append(g.owner) + .append(", ") + .append("description=") + .append(g.description) + .append(", ") + .append("visibleToAll=") + .append(toBoolean(g.options.visibleToAll)) + .append("}"); if (it.hasNext()) { b.append(", "); } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/group/LuceneQueryGroupsTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/group/LuceneQueryGroupsTest.java index d8deca6800..0551e9240e 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/query/group/LuceneQueryGroupsTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/group/LuceneQueryGroupsTest.java @@ -17,7 +17,6 @@ package com.google.gerrit.server.query.group; import com.google.gerrit.testutil.InMemoryModule; import com.google.inject.Guice; import com.google.inject.Injector; - import org.eclipse.jgit.lib.Config; public class LuceneQueryGroupsTest extends AbstractQueryGroupsTest { @@ -25,7 +24,6 @@ public class LuceneQueryGroupsTest extends AbstractQueryGroupsTest { protected Injector createInjector() { Config luceneConfig = new Config(config); InMemoryModule.setDefaults(luceneConfig); - return Guice.createInjector( - new InMemoryModule(luceneConfig, notesMigration)); + return Guice.createInjector(new InMemoryModule(luceneConfig, notesMigration)); } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaCreatorTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaCreatorTest.java index ccd399f62a..cc3519d3f7 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaCreatorTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaCreatorTest.java @@ -30,12 +30,6 @@ import com.google.gerrit.testutil.InMemoryModule; import com.google.gwtorm.jdbc.JdbcSchema; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - -import org.eclipse.jgit.lib.Repository; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - import java.io.File; import java.io.IOException; import java.sql.ResultSet; @@ -43,16 +37,17 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import org.eclipse.jgit.lib.Repository; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; public class SchemaCreatorTest { - @Inject - private AllProjectsName allProjects; + @Inject private AllProjectsName allProjects; - @Inject - private GitRepositoryManager repoManager; + @Inject private GitRepositoryManager repoManager; - @Inject - private InMemoryDatabase db; + @Inject private InMemoryDatabase db; private LifecycleManager lifecycle; @@ -72,13 +67,11 @@ public class SchemaCreatorTest { } @Test - public void getCauses_CreateSchema() throws OrmException, SQLException, - IOException { + public void getCauses_CreateSchema() throws OrmException, SQLException, IOException { // Initially the schema should be empty. String[] types = {"TABLE", "VIEW"}; try (JdbcSchema d = (JdbcSchema) db.open(); - ResultSet rs = d.getConnection().getMetaData() - .getTables(null, null, null, types)) { + ResultSet rs = d.getConnection().getMetaData().getTables(null, null, null, types)) { assertThat(rs.next()).isFalse(); } @@ -93,8 +86,7 @@ public class SchemaCreatorTest { if (sitePath.getName().equals(".")) { sitePath = sitePath.getParentFile(); } - assertThat(db.getSystemConfig().sitePath) - .isEqualTo(sitePath.getCanonicalPath()); + assertThat(db.getSystemConfig().sitePath).isEqualTo(sitePath.getCanonicalPath()); } private LabelTypes getLabelTypes() throws Exception { @@ -102,8 +94,7 @@ public class SchemaCreatorTest { ProjectConfig c = new ProjectConfig(allProjects); try (Repository repo = repoManager.openRepository(allProjects)) { c.load(repo); - return new LabelTypes( - ImmutableList.copyOf(c.getLabelSections().values())); + return new LabelTypes(ImmutableList.copyOf(c.getLabelSections().values())); } } @@ -128,8 +119,7 @@ public class SchemaCreatorTest { } private void assertValueRange(LabelType label, Integer... range) { - assertThat(label.getValuesAsList()) - .containsExactlyElementsIn(Arrays.asList(range)).inOrder(); + assertThat(label.getValuesAsList()).containsExactlyElementsIn(Arrays.asList(range)).inOrder(); assertThat(label.getMax().getValue()).isEqualTo(range[0]); assertThat(label.getMin().getValue()).isEqualTo(range[range.length - 1]); for (LabelValue v : label.getValues()) { diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaUpdaterTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaUpdaterTest.java index dbb7db6a0a..112fdd60aa 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaUpdaterTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaUpdaterTest.java @@ -39,19 +39,17 @@ import com.google.gwtorm.server.StatementExecutor; import com.google.inject.Guice; import com.google.inject.ProvisionException; import com.google.inject.TypeLiteral; - -import org.eclipse.jgit.lib.Config; -import org.eclipse.jgit.lib.PersonIdent; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - import java.io.FileNotFoundException; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.UUID; +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.lib.PersonIdent; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; public class SchemaUpdaterTest { private LifecycleManager lifecycle; @@ -73,53 +71,52 @@ public class SchemaUpdaterTest { } @Test - public void update() throws OrmException, FileNotFoundException, - IOException { + public void update() throws OrmException, FileNotFoundException, IOException { db.create(); final Path site = Paths.get(UUID.randomUUID().toString()); final SitePaths paths = new SitePaths(site); - SchemaUpdater u = Guice.createInjector(new FactoryModule() { - @Override - protected void configure() { - bind(new TypeLiteral>() {}).toInstance(db); - bind(SitePaths.class).toInstance(paths); + SchemaUpdater u = + Guice.createInjector( + new FactoryModule() { + @Override + protected void configure() { + bind(new TypeLiteral>() {}).toInstance(db); + bind(SitePaths.class).toInstance(paths); - Config cfg = new Config(); - cfg.setString("user", null, "name", "Gerrit Code Review"); - cfg.setString("user", null, "email", "gerrit@localhost"); + Config cfg = new Config(); + cfg.setString("user", null, "name", "Gerrit Code Review"); + cfg.setString("user", null, "email", "gerrit@localhost"); - bind(Config.class) // - .annotatedWith(GerritServerConfig.class) // - .toInstance(cfg); + bind(Config.class) // + .annotatedWith(GerritServerConfig.class) // + .toInstance(cfg); - bind(PersonIdent.class) // - .annotatedWith(GerritPersonIdent.class) // - .toProvider(GerritPersonIdentProvider.class); + bind(PersonIdent.class) // + .annotatedWith(GerritPersonIdent.class) // + .toProvider(GerritPersonIdentProvider.class); - bind(AllProjectsName.class) - .toInstance(new AllProjectsName("All-Projects")); - bind(AllUsersName.class) - .toInstance(new AllUsersName("All-Users")); + bind(AllProjectsName.class).toInstance(new AllProjectsName("All-Projects")); + bind(AllUsersName.class).toInstance(new AllUsersName("All-Users")); - bind(GitRepositoryManager.class) - .toInstance(new InMemoryRepositoryManager()); + bind(GitRepositoryManager.class).toInstance(new InMemoryRepositoryManager()); - bind(String.class) // - .annotatedWith(AnonymousCowardName.class) // - .toProvider(AnonymousCowardNameProvider.class); + bind(String.class) // + .annotatedWith(AnonymousCowardName.class) // + .toProvider(AnonymousCowardNameProvider.class); - bind(DataSourceType.class).to(InMemoryH2Type.class); + bind(DataSourceType.class).to(InMemoryH2Type.class); - bind(SystemGroupBackend.class); - } - }).getInstance(SchemaUpdater.class); + bind(SystemGroupBackend.class); + } + }) + .getInstance(SchemaUpdater.class); - for (SchemaVersion s = u.getLatestSchemaVersion(); - s.getVersionNbr() > 1; s = s.getPrior()) { + for (SchemaVersion s = u.getLatestSchemaVersion(); s.getVersionNbr() > 1; s = s.getPrior()) { try { assertThat(s.getPrior().getVersionNbr()) - .named("schema %s has prior version %s. Not true that", + .named( + "schema %s has prior version %s. Not true that", s.getVersionNbr(), s.getPrior().getVersionNbr()) .isEqualTo(s.getVersionNbr() - 1); } catch (ProvisionException e) { @@ -130,33 +127,31 @@ public class SchemaUpdaterTest { } } - u.update(new UpdateUI() { - @Override - public void message(String msg) { - } + u.update( + new UpdateUI() { + @Override + public void message(String msg) {} - @Override - public boolean yesno(boolean def, String msg) { - return def; - } + @Override + public boolean yesno(boolean def, String msg) { + return def; + } - @Override - public boolean isBatch() { - return true; - } + @Override + public boolean isBatch() { + return true; + } - @Override - public void pruneSchema(StatementExecutor e, List pruneList) - throws OrmException { - for (String sql : pruneList) { - e.execute(sql); - } - } - }); + @Override + public void pruneSchema(StatementExecutor e, List pruneList) throws OrmException { + for (String sql : pruneList) { + e.execute(sql); + } + } + }); db.assertSchemaVersion(); final SystemConfig sc = db.getSystemConfig(); - assertThat(sc.sitePath) - .isEqualTo(paths.site_path.toAbsolutePath().toString()); + assertThat(sc.sitePath).isEqualTo(paths.site_path.toAbsolutePath().toString()); } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/tools/hooks/CommitMsgHookTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/tools/hooks/CommitMsgHookTest.java index 0d3dfb8c37..ec0dad59d7 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/tools/hooks/CommitMsgHookTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/tools/hooks/CommitMsgHookTest.java @@ -20,7 +20,10 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import com.google.gerrit.server.util.HostPlatform; - +import java.io.File; +import java.io.IOException; +import java.util.Date; +import java.util.TimeZone; import org.eclipse.jgit.dircache.DirCacheBuilder; import org.eclipse.jgit.dircache.DirCacheEntry; import org.eclipse.jgit.lib.CommitBuilder; @@ -35,11 +38,6 @@ import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; -import java.io.File; -import java.io.IOException; -import java.util.Date; -import java.util.TimeZone; - public class CommitMsgHookTest extends HookTestCase { private final String SOB1 = "Signed-off-by: J Author \n"; private final String SOB2 = "Signed-off-by: J Committer \n"; @@ -80,8 +78,9 @@ public class CommitMsgHookTest extends HookTestCase { hookDoesNotModify("\n# on branch master\n# Untracked files:\n"); hookDoesNotModify("\n\n# on branch master\n# Untracked files:\n"); - hookDoesNotModify("\n# on branch master\ndiff --git a/src b/src\n" - + "new file mode 100644\nindex 0000000..c78b7f0\n"); + hookDoesNotModify( + "\n# on branch master\ndiff --git a/src b/src\n" + + "new file mode 100644\nindex 0000000..c78b7f0\n"); } @Test @@ -89,316 +88,537 @@ public class CommitMsgHookTest extends HookTestCase { // If a Change-Id is already present in the footer, the hook must // not modify the message but instead must leave the identity alone. // - hookDoesNotModify("a\n" + // - "\n" + // - "Change-Id: Iaeac9b4149291060228ef0154db2985a31111335\n"); - hookDoesNotModify("fix: this thing\n" + // - "\n" + // - "Change-Id: I388bdaf52ed05b55e62a22d0a20d2c1ae0d33e7e\n"); - hookDoesNotModify("fix-a-widget: this thing\n" + // - "\n" + // - "Change-Id: Id3bc5359d768a6400450283e12bdfb6cd135ea4b\n"); - hookDoesNotModify("FIX: this thing\n" + // - "\n" + // - "Change-Id: I1b55098b5a2cce0b3f3da783dda50d5f79f873fa\n"); - hookDoesNotModify("Fix-A-Widget: this thing\n" + // - "\n" + // - "Change-Id: I4f4e2e1e8568ddc1509baecb8c1270a1fb4b6da7\n"); + hookDoesNotModify( + "a\n" + + // + "\n" + + // + "Change-Id: Iaeac9b4149291060228ef0154db2985a31111335\n"); + hookDoesNotModify( + "fix: this thing\n" + + // + "\n" + + // + "Change-Id: I388bdaf52ed05b55e62a22d0a20d2c1ae0d33e7e\n"); + hookDoesNotModify( + "fix-a-widget: this thing\n" + + // + "\n" + + // + "Change-Id: Id3bc5359d768a6400450283e12bdfb6cd135ea4b\n"); + hookDoesNotModify( + "FIX: this thing\n" + + // + "\n" + + // + "Change-Id: I1b55098b5a2cce0b3f3da783dda50d5f79f873fa\n"); + hookDoesNotModify( + "Fix-A-Widget: this thing\n" + + // + "\n" + + // + "Change-Id: I4f4e2e1e8568ddc1509baecb8c1270a1fb4b6da7\n"); } @Test public void timeAltersId() throws Exception { - assertEquals("a\n" + // - "\n" + // - "Change-Id: I7fc3876fee63c766a2063df97fbe04a2dddd8d7c\n",// + assertEquals( + "a\n" + + // + "\n" + + // + "Change-Id: I7fc3876fee63c766a2063df97fbe04a2dddd8d7c\n", // call("a\n")); tick(); - assertEquals("a\n" + // - "\n" + // - "Change-Id: I3251906b99dda598a58a6346d8126237ee1ea800\n",// + assertEquals( + "a\n" + + // + "\n" + + // + "Change-Id: I3251906b99dda598a58a6346d8126237ee1ea800\n", // call("a\n")); tick(); - assertEquals("a\n" + // - "\n" + // - "Change-Id: I69adf9208d828f41a3d7e41afbca63aff37c0c5c\n",// + assertEquals( + "a\n" + + // + "\n" + + // + "Change-Id: I69adf9208d828f41a3d7e41afbca63aff37c0c5c\n", // call("a\n")); } @Test public void firstParentAltersId() throws Exception { - assertEquals("a\n" + // - "\n" + // - "Change-Id: I7fc3876fee63c766a2063df97fbe04a2dddd8d7c\n",// + assertEquals( + "a\n" + + // + "\n" + + // + "Change-Id: I7fc3876fee63c766a2063df97fbe04a2dddd8d7c\n", // call("a\n")); setHEAD(); - assertEquals("a\n" + // - "\n" + // - "Change-Id: I51e86482bde7f92028541aaf724d3a3f996e7ea2\n",// + assertEquals( + "a\n" + + // + "\n" + + // + "Change-Id: I51e86482bde7f92028541aaf724d3a3f996e7ea2\n", // call("a\n")); } @Test public void dirCacheAltersId() throws Exception { - assertEquals("a\n" + // - "\n" + // - "Change-Id: I7fc3876fee63c766a2063df97fbe04a2dddd8d7c\n",// + assertEquals( + "a\n" + + // + "\n" + + // + "Change-Id: I7fc3876fee63c766a2063df97fbe04a2dddd8d7c\n", // call("a\n")); final DirCacheBuilder builder = repository.lockDirCache().builder(); builder.add(file("A")); assertTrue(builder.commit()); - assertEquals("a\n" + // - "\n" + // - "Change-Id: If56597ea9759f23b070677ea6f064c60c38da631\n",// + assertEquals( + "a\n" + + // + "\n" + + // + "Change-Id: If56597ea9759f23b070677ea6f064c60c38da631\n", // call("a\n")); } @Test public void singleLineMessages() throws Exception { - assertEquals("a\n" + // - "\n" + // - "Change-Id: I7fc3876fee63c766a2063df97fbe04a2dddd8d7c\n",// + assertEquals( + "a\n" + + // + "\n" + + // + "Change-Id: I7fc3876fee63c766a2063df97fbe04a2dddd8d7c\n", // call("a\n")); - assertEquals("fix: this thing\n" + // - "\n" + // - "Change-Id: I0f13d0e6c739ca3ae399a05a93792e80feb97f37\n",// + assertEquals( + "fix: this thing\n" + + // + "\n" + + // + "Change-Id: I0f13d0e6c739ca3ae399a05a93792e80feb97f37\n", // call("fix: this thing\n")); - assertEquals("fix-a-widget: this thing\n" + // - "\n" + // - "Change-Id: I1a1a0c751e4273d532e4046a501a612b9b8a775e\n",// + assertEquals( + "fix-a-widget: this thing\n" + + // + "\n" + + // + "Change-Id: I1a1a0c751e4273d532e4046a501a612b9b8a775e\n", // call("fix-a-widget: this thing\n")); - assertEquals("FIX: this thing\n" + // - "\n" + // - "Change-Id: If816d944c57d3893b60cf10c65931fead1290d97\n",// + assertEquals( + "FIX: this thing\n" + + // + "\n" + + // + "Change-Id: If816d944c57d3893b60cf10c65931fead1290d97\n", // call("FIX: this thing\n")); - assertEquals("Fix-A-Widget: this thing\n" + // - "\n" + // - "Change-Id: I3e18d00cbda2ba1f73aeb63ed8c7d57d7fd16c76\n",// + assertEquals( + "Fix-A-Widget: this thing\n" + + // + "\n" + + // + "Change-Id: I3e18d00cbda2ba1f73aeb63ed8c7d57d7fd16c76\n", // call("Fix-A-Widget: this thing\n")); } @Test public void multiLineMessagesWithoutFooter() throws Exception { - assertEquals("a\n" + // - "\n" + // - "b\n" + // - "\n" + // - "Change-Id: Id0b4f42d3d6fc1569595c9b97cb665e738486f5d\n",// + assertEquals( + "a\n" + + // + "\n" + + // + "b\n" + + // + "\n" + + // + "Change-Id: Id0b4f42d3d6fc1569595c9b97cb665e738486f5d\n", // call("a\n" + "\n" + "b\n")); - assertEquals("a\n" + // - "\n" + // - "b\nc\nd\ne\n" + // - "\n" + // - "Change-Id: I7d237b20058a0f46cc3f5fabc4a0476877289d75\n",// + assertEquals( + "a\n" + + // + "\n" + + // + "b\nc\nd\ne\n" + + // + "\n" + + // + "Change-Id: I7d237b20058a0f46cc3f5fabc4a0476877289d75\n", // call("a\n" + "\n" + "b\nc\nd\ne\n")); - assertEquals("a\n" + // - "\n" + // - "b\nc\nd\ne\n" + // - "\n" + // - "f\ng\nh\n" + // - "\n" + // - "Change-Id: I382e662f47bf164d6878b7fe61637873ab7fa4e8\n",// + assertEquals( + "a\n" + + // + "\n" + + // + "b\nc\nd\ne\n" + + // + "\n" + + // + "f\ng\nh\n" + + // + "\n" + + // + "Change-Id: I382e662f47bf164d6878b7fe61637873ab7fa4e8\n", // call("a\n" + "\n" + "b\nc\nd\ne\n" + "\n" + "f\ng\nh\n")); } @Test public void singleLineMessagesWithSignedOffBy() throws Exception { - assertEquals("a\n" + // - "\n" + // - "Change-Id: I7fc3876fee63c766a2063df97fbe04a2dddd8d7c\n" + // - SOB1,// + assertEquals( + "a\n" + + // + "\n" + + // + "Change-Id: I7fc3876fee63c766a2063df97fbe04a2dddd8d7c\n" + + // + SOB1, // call("a\n" + "\n" + SOB1)); - assertEquals("a\n" + // - "\n" + // - "Change-Id: I7fc3876fee63c766a2063df97fbe04a2dddd8d7c\n" + // - SOB1 + // - SOB2,// + assertEquals( + "a\n" + + // + "\n" + + // + "Change-Id: I7fc3876fee63c766a2063df97fbe04a2dddd8d7c\n" + + // + SOB1 + + // + SOB2, // call("a\n" + "\n" + SOB1 + SOB2)); } @Test public void multiLineMessagesWithSignedOffBy() throws Exception { - assertEquals("a\n" + // - "\n" + // - "b\nc\nd\ne\n" + // - "\n" + // - "f\ng\nh\n" + // - "\n" + // - "Change-Id: I382e662f47bf164d6878b7fe61637873ab7fa4e8\n" + // - SOB1,// + assertEquals( + "a\n" + + // + "\n" + + // + "b\nc\nd\ne\n" + + // + "\n" + + // + "f\ng\nh\n" + + // + "\n" + + // + "Change-Id: I382e662f47bf164d6878b7fe61637873ab7fa4e8\n" + + // + SOB1, // call("a\n" + "\n" + "b\nc\nd\ne\n" + "\n" + "f\ng\nh\n" + "\n" + SOB1)); - assertEquals("a\n" + // - "\n" + // - "b\nc\nd\ne\n" + // - "\n" + // - "f\ng\nh\n" + // - "\n" + // - "Change-Id: I382e662f47bf164d6878b7fe61637873ab7fa4e8\n" + // - SOB1 + // - SOB2,// - call("a\n" + // - "\n" + // - "b\nc\nd\ne\n" + // - "\n" + // - "f\ng\nh\n" + // - "\n" + // - SOB1 + // - SOB2)); + assertEquals( + "a\n" + + // + "\n" + + // + "b\nc\nd\ne\n" + + // + "\n" + + // + "f\ng\nh\n" + + // + "\n" + + // + "Change-Id: I382e662f47bf164d6878b7fe61637873ab7fa4e8\n" + + // + SOB1 + + // + SOB2, // + call( + "a\n" + + // + "\n" + + // + "b\nc\nd\ne\n" + + // + "\n" + + // + "f\ng\nh\n" + + // + "\n" + + // + SOB1 + + // + SOB2)); - assertEquals("a\n" + // - "\n" + // - "b: not a footer\nc\nd\ne\n" + // - "\n" + // - "f\ng\nh\n" + // - "\n" + // - "Change-Id: I8869aabd44b3017cd55d2d7e0d546a03e3931ee2\n" + // - SOB1 + // - SOB2,// - call("a\n" + // - "\n" + // - "b: not a footer\nc\nd\ne\n" + // - "\n" + // - "f\ng\nh\n" + // - "\n" + // - SOB1 + // - SOB2)); + assertEquals( + "a\n" + + // + "\n" + + // + "b: not a footer\nc\nd\ne\n" + + // + "\n" + + // + "f\ng\nh\n" + + // + "\n" + + // + "Change-Id: I8869aabd44b3017cd55d2d7e0d546a03e3931ee2\n" + + // + SOB1 + + // + SOB2, // + call( + "a\n" + + // + "\n" + + // + "b: not a footer\nc\nd\ne\n" + + // + "\n" + + // + "f\ng\nh\n" + + // + "\n" + + // + SOB1 + + // + SOB2)); } @Test public void noteInMiddle() throws Exception { - assertEquals("a\n" + // - "\n" + // - "NOTE: This\n" + // - "does not fix it.\n" + // - "\n" + // - "Change-Id: I988a127969a6ee5e58db546aab74fc46e66847f8\n", // - call("a\n" + // - "\n" + // - "NOTE: This\n" + // - "does not fix it.\n")); + assertEquals( + "a\n" + + // + "\n" + + // + "NOTE: This\n" + + // + "does not fix it.\n" + + // + "\n" + + // + "Change-Id: I988a127969a6ee5e58db546aab74fc46e66847f8\n", // + call( + "a\n" + + // + "\n" + + // + "NOTE: This\n" + + // + "does not fix it.\n")); } @Test public void kernelStyleFooter() throws Exception { - assertEquals("a\n" + // - "\n" + // - "Change-Id: I1bd787f9e7590a2ac82b02c404c955ffb21877c4\n" + // - SOB1 + // - "[ja: Fixed\n" + // - " the indentation]\n" + // - SOB2, // - call("a\n" + // - "\n" + // - SOB1 + // - "[ja: Fixed\n" + // - " the indentation]\n" + // - SOB2)); + assertEquals( + "a\n" + + // + "\n" + + // + "Change-Id: I1bd787f9e7590a2ac82b02c404c955ffb21877c4\n" + + // + SOB1 + + // + "[ja: Fixed\n" + + // + " the indentation]\n" + + // + SOB2, // + call( + "a\n" + + // + "\n" + + // + SOB1 + + // + "[ja: Fixed\n" + + // + " the indentation]\n" + + // + SOB2)); } @Test public void changeIdAfterBugOrIssue() throws Exception { - assertEquals("a\n" + // - "\n" + // - "Bug: 42\n" + // - "Change-Id: I8c0321227c4324e670b9ae8cf40eccc87af21b1b\n" + // - SOB1,// - call("a\n" + // - "\n" + // - "Bug: 42\n" + // - SOB1)); + assertEquals( + "a\n" + + // + "\n" + + // + "Bug: 42\n" + + // + "Change-Id: I8c0321227c4324e670b9ae8cf40eccc87af21b1b\n" + + // + SOB1, // + call( + "a\n" + + // + "\n" + + // + "Bug: 42\n" + + // + SOB1)); - assertEquals("a\n" + // - "\n" + // - "Issue: 42\n" + // - "Change-Id: Ie66e07d89ae5b114c0975b49cf326e90331dd822\n" + // - SOB1,// - call("a\n" + // - "\n" + // - "Issue: 42\n" + // - SOB1)); + assertEquals( + "a\n" + + // + "\n" + + // + "Issue: 42\n" + + // + "Change-Id: Ie66e07d89ae5b114c0975b49cf326e90331dd822\n" + + // + SOB1, // + call( + "a\n" + + // + "\n" + + // + "Issue: 42\n" + + // + SOB1)); } @Test public void commitDashV() throws Exception { - assertEquals("a\n" + // - "\n" + // - "Change-Id: I7fc3876fee63c766a2063df97fbe04a2dddd8d7c\n" + // - SOB1 + // - SOB2, // - call("a\n" + // - "\n" + // - SOB1 + // - SOB2 + // - "\n" + // - "# on branch master\n" + // - "diff --git a/src b/src\n" + // - "new file mode 100644\n" + // - "index 0000000..c78b7f0\n")); + assertEquals( + "a\n" + + // + "\n" + + // + "Change-Id: I7fc3876fee63c766a2063df97fbe04a2dddd8d7c\n" + + // + SOB1 + + // + SOB2, // + call( + "a\n" + + // + "\n" + + // + SOB1 + + // + SOB2 + + // + "\n" + + // + "# on branch master\n" + + // + "diff --git a/src b/src\n" + + // + "new file mode 100644\n" + + // + "index 0000000..c78b7f0\n")); } @Test public void withEndingURL() throws Exception { - assertEquals("a\n" + // - "\n" + // - "http://example.com/ fixes this\n" + // - "\n" + // - "Change-Id: I3b7e4e16b503ce00f07ba6ad01d97a356dad7701\n", // - call("a\n" + // - "\n" + // - "http://example.com/ fixes this\n")); - assertEquals("a\n" + // - "\n" + // - "https://example.com/ fixes this\n" + // - "\n" + // - "Change-Id: I62b9039e2fc0dce274af55e8f99312a8a80a805d\n", // - call("a\n" + // - "\n" + // - "https://example.com/ fixes this\n")); - assertEquals("a\n" + // - "\n" + // - "ftp://example.com/ fixes this\n" + // - "\n" + // - "Change-Id: I71b05dc1f6b9a5540a53a693e64d58b65a8910e8\n", // - call("a\n" + // - "\n" + // - "ftp://example.com/ fixes this\n")); - assertEquals("a\n" + // - "\n" + // - "git://example.com/ fixes this\n" + // - "\n" + // - "Change-Id: Id34e942baa68d790633737d815ddf11bac9183e5\n", // - call("a\n" + // - "\n" + // - "git://example.com/ fixes this\n")); + assertEquals( + "a\n" + + // + "\n" + + // + "http://example.com/ fixes this\n" + + // + "\n" + + // + "Change-Id: I3b7e4e16b503ce00f07ba6ad01d97a356dad7701\n", // + call( + "a\n" + + // + "\n" + + // + "http://example.com/ fixes this\n")); + assertEquals( + "a\n" + + // + "\n" + + // + "https://example.com/ fixes this\n" + + // + "\n" + + // + "Change-Id: I62b9039e2fc0dce274af55e8f99312a8a80a805d\n", // + call( + "a\n" + + // + "\n" + + // + "https://example.com/ fixes this\n")); + assertEquals( + "a\n" + + // + "\n" + + // + "ftp://example.com/ fixes this\n" + + // + "\n" + + // + "Change-Id: I71b05dc1f6b9a5540a53a693e64d58b65a8910e8\n", // + call( + "a\n" + + // + "\n" + + // + "ftp://example.com/ fixes this\n")); + assertEquals( + "a\n" + + // + "\n" + + // + "git://example.com/ fixes this\n" + + // + "\n" + + // + "Change-Id: Id34e942baa68d790633737d815ddf11bac9183e5\n", // + call( + "a\n" + + // + "\n" + + // + "git://example.com/ fixes this\n")); } @Test public void withFalseTags() throws Exception { - assertEquals("foo\n" + // - "\n" + // - "FakeLine:\n" + // - " foo\n" + // - " bar\n" + // - "\n" + // - "Change-Id: I67632a37fd2e08a35f766f52fc9a47f4ea868c55\n" + // - "RealTag: abc\n", // - call("foo\n" + // - "\n" + // - "FakeLine:\n" + // - " foo\n" + // - " bar\n" + // - "\n" + // - "RealTag: abc\n")); + assertEquals( + "foo\n" + + // + "\n" + + // + "FakeLine:\n" + + // + " foo\n" + + // + " bar\n" + + // + "\n" + + // + "Change-Id: I67632a37fd2e08a35f766f52fc9a47f4ea868c55\n" + + // + "RealTag: abc\n", // + call( + "foo\n" + + // + "\n" + + // + "FakeLine:\n" + + // + " foo\n" + + // + " bar\n" + + // + "\n" + + // + "RealTag: abc\n")); } private void hookDoesNotModify(final String in) throws Exception { @@ -439,9 +659,9 @@ public class CommitMsgHookTest extends HookTestCase { ref.setNewObjectId(commitId); Result result = ref.forceUpdate(); assert_() - .withFailureMessage(Constants.HEAD + " did not change: " + ref.getResult()) - .that(result) - .isAnyOf(Result.FAST_FORWARD, Result.FORCED, Result.NEW, Result.NO_CHANGE); + .withFailureMessage(Constants.HEAD + " did not change: " + ref.getResult()) + .that(result) + .isAnyOf(Result.FAST_FORWARD, Result.FORCED, Result.NEW, Result.NO_CHANGE); } } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/tools/hooks/HookTestCase.java b/gerrit-server/src/test/java/com/google/gerrit/server/tools/hooks/HookTestCase.java index 69a8487a0e..21c876462f 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/tools/hooks/HookTestCase.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/tools/hooks/HookTestCase.java @@ -53,13 +53,6 @@ package com.google.gerrit.server.tools.hooks; import static com.google.common.truth.Truth.assert_; import com.google.common.io.ByteStreams; - -import org.eclipse.jgit.junit.LocalDiskRepositoryTestCase; -import org.eclipse.jgit.lib.Repository; -import org.junit.After; -import org.junit.Before; -import org.junit.Ignore; - import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -69,6 +62,11 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.TreeMap; +import org.eclipse.jgit.junit.LocalDiskRepositoryTestCase; +import org.eclipse.jgit.lib.Repository; +import org.junit.After; +import org.junit.Before; +import org.junit.Ignore; @Ignore public abstract class HookTestCase extends LocalDiskRepositoryTestCase { @@ -105,20 +103,14 @@ public abstract class HookTestCase extends LocalDiskRepositoryTestCase { String path = scproot + "/hooks/" + name; String errorMessage = "Cannot locate " + path + " in CLASSPATH"; URL url = cl().getResource(path); - assert_() - .withFailureMessage(errorMessage) - .that(url).isNotNull(); + assert_().withFailureMessage(errorMessage).that(url).isNotNull(); String protocol = url.getProtocol(); - assert_() - .withFailureMessage("Cannot invoke " + url) - .that(protocol).isAnyOf("file", "jar"); + assert_().withFailureMessage("Cannot invoke " + url).that(protocol).isAnyOf("file", "jar"); if ("file".equals(protocol)) { hook = new File(url.getPath()); - assert_() - .withFailureMessage(errorMessage) - .that(hook.isFile()).isTrue(); + assert_().withFailureMessage(errorMessage).that(hook.isFile()).isTrue(); long time = hook.lastModified(); hook.setExecutable(true); hook.setLastModified(time); diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/util/IdGeneratorTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/util/IdGeneratorTest.java index 2a611658cc..39afcacb9a 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/util/IdGeneratorTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/util/IdGeneratorTest.java @@ -17,9 +17,8 @@ package com.google.gerrit.server.util; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import org.junit.Test; - import java.util.HashSet; +import org.junit.Test; public class IdGeneratorTest { @Test diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/util/LabelVoteTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/util/LabelVoteTest.java index 4fdbdb2f6f..0592041c8f 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/util/LabelVoteTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/util/LabelVoteTest.java @@ -79,15 +79,10 @@ public class LabelVoteTest { @Test public void formatWithEquals() { - assertEquals("Code-Review=-2", - LabelVote.parseWithEquals("Code-Review=-2").formatWithEquals()); - assertEquals("Code-Review=-1", - LabelVote.parseWithEquals("Code-Review=-1").formatWithEquals()); - assertEquals("Code-Review=0", - LabelVote.parseWithEquals("Code-Review=0").formatWithEquals()); - assertEquals("Code-Review=+1", - LabelVote.parseWithEquals("Code-Review=+1").formatWithEquals()); - assertEquals("Code-Review=+2", - LabelVote.parseWithEquals("Code-Review=+2").formatWithEquals()); + assertEquals("Code-Review=-2", LabelVote.parseWithEquals("Code-Review=-2").formatWithEquals()); + assertEquals("Code-Review=-1", LabelVote.parseWithEquals("Code-Review=-1").formatWithEquals()); + assertEquals("Code-Review=0", LabelVote.parseWithEquals("Code-Review=0").formatWithEquals()); + assertEquals("Code-Review=+1", LabelVote.parseWithEquals("Code-Review=+1").formatWithEquals()); + assertEquals("Code-Review=+2", LabelVote.parseWithEquals("Code-Review=+2").formatWithEquals()); } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/util/MostSpecificComparatorTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/util/MostSpecificComparatorTest.java index e974f1f6e9..025bf847eb 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/util/MostSpecificComparatorTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/util/MostSpecificComparatorTest.java @@ -33,9 +33,8 @@ public class MostSpecificComparatorTest { } /** - * Assuming two patterns have the same Levenshtein distance, - * the pattern which represents a finite language wins over a pattern - * which represents an infinite language. + * Assuming two patterns have the same Levenshtein distance, the pattern which represents a finite + * language wins over a pattern which represents an infinite language. */ @Test public void finiteWinsOverInfinite() { @@ -45,9 +44,8 @@ public class MostSpecificComparatorTest { } /** - * Assuming two patterns have the same Levenshtein distance - * and are both either finite or infinite the one with the higher - * number of state transitions (in an equivalent automaton) wins + * Assuming two patterns have the same Levenshtein distance and are both either finite or infinite + * the one with the higher number of state transitions (in an equivalent automaton) wins */ @Test public void higherNumberOfTransitionsWins() { @@ -65,8 +63,8 @@ public class MostSpecificComparatorTest { } /** - * Assuming the same Levenshtein distance, (in)finity and the number - * of transitions, the longer pattern wins + * Assuming the same Levenshtein distance, (in)finity and the number of transitions, the longer + * pattern wins */ @Test public void longerPatternWins() { diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/util/ParboiledTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/util/ParboiledTest.java index 6efc881448..3bcfb565ad 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/util/ParboiledTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/util/ParboiledTest.java @@ -29,14 +29,14 @@ import org.parboiled.support.ParsingResult; public class ParboiledTest { private static final String EXPECTED = - "[Expression] '42'\n" + - " [Term] '42'\n" + - " [Factor] '42'\n" + - " [Number] '42'\n" + - " [0..9] '4'\n" + - " [0..9] '2'\n" + - " [zeroOrMore]\n" + - " [zeroOrMore]\n"; + "[Expression] '42'\n" + + " [Term] '42'\n" + + " [Factor] '42'\n" + + " [Number] '42'\n" + + " [0..9] '4'\n" + + " [0..9] '2'\n" + + " [zeroOrMore]\n" + + " [zeroOrMore]\n"; private CalculatorParser parser; @@ -47,8 +47,7 @@ public class ParboiledTest { @Test public void test() { - ParsingResult result = - new ReportingParseRunner(parser.Expression()).run("42"); + ParsingResult result = new ReportingParseRunner(parser.Expression()).run("42"); assertThat(result.isSuccess()).isTrue(); // next test is optional; we could stop here. assertThat(ParseTreeUtils.printNodeTree(result)).isEqualTo(EXPECTED); diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/util/RegexListSearcherTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/util/RegexListSearcherTest.java index 8f7300516c..322484aee1 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/util/RegexListSearcherTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/util/RegexListSearcherTest.java @@ -20,10 +20,8 @@ import static org.junit.Assert.assertTrue; import com.google.common.collect.ImmutableList; import com.google.common.collect.Ordering; - -import org.junit.Test; - import java.util.List; +import org.junit.Test; public class RegexListSearcherTest { private static final List EMPTY = ImmutableList.of(); @@ -55,30 +53,20 @@ public class RegexListSearcherTest { List list = ImmutableList.of("bar", "foo", "quux"); assertSearchReturns(ImmutableList.of("foo"), "f.*", list); assertSearchReturns(ImmutableList.of("foo"), ".*o.*", list); - assertSearchReturns(ImmutableList.of("bar", "foo", "quux"), ".*[aou].*", - list); + assertSearchReturns(ImmutableList.of("bar", "foo", "quux"), ".*[aou].*", list); } @Test public void commonPrefix() { - List list = ImmutableList.of( - "bar", - "baz", - "foo1", - "foo2", - "foo3", - "quux"); + List list = ImmutableList.of("bar", "baz", "foo1", "foo2", "foo3", "quux"); assertSearchReturns(ImmutableList.of("bar", "baz"), "b.*", list); assertSearchReturns(ImmutableList.of("foo1", "foo2"), "foo[12]", list); - assertSearchReturns(ImmutableList.of("foo1", "foo2", "foo3"), "foo.*", - list); + assertSearchReturns(ImmutableList.of("foo1", "foo2", "foo3"), "foo.*", list); assertSearchReturns(ImmutableList.of("quux"), "q.*", list); } - private void assertSearchReturns(List expected, String re, - List inputs) { + private void assertSearchReturns(List expected, String re, List inputs) { assertTrue(Ordering.natural().isOrdered(inputs)); - assertEquals(expected, - ImmutableList.copyOf(RegexListSearcher.ofStrings(re).search(inputs))); + assertEquals(expected, ImmutableList.copyOf(RegexListSearcher.ofStrings(re).search(inputs))); } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/util/SocketUtilTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/util/SocketUtilTest.java index 3e3c13e5c1..473c44d74c 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/util/SocketUtilTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/util/SocketUtilTest.java @@ -25,14 +25,12 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import com.google.gerrit.testutil.GerritBaseTests; - -import org.junit.Test; - import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.UnknownHostException; +import org.junit.Test; public class SocketUtilTest extends GerritBaseTests { @Test @@ -61,15 +59,19 @@ public class SocketUtilTest extends GerritBaseTests { assertEquals("foo:1234", SocketUtil.format(createUnresolved("foo", 1234), 80)); assertEquals("foo", SocketUtil.format(createUnresolved("foo", 80), 80)); - assertEquals("[1:2:3:4:5:6:7:8]:1234",// + assertEquals( + "[1:2:3:4:5:6:7:8]:1234", // SocketUtil.format(new InetSocketAddress(getByName("1:2:3:4:5:6:7:8"), 1234), 80)); - assertEquals("[1:2:3:4:5:6:7:8]",// + assertEquals( + "[1:2:3:4:5:6:7:8]", // SocketUtil.format(new InetSocketAddress(getByName("1:2:3:4:5:6:7:8"), 80), 80)); - assertEquals("localhost:1234",// + assertEquals( + "localhost:1234", // SocketUtil.format(new InetSocketAddress("localhost", 1234), 80)); - assertEquals("localhost",// - SocketUtil. format(new InetSocketAddress("localhost", 80), 80)); + assertEquals( + "localhost", // + SocketUtil.format(new InetSocketAddress("localhost", 80), 80)); } @Test @@ -79,19 +81,25 @@ public class SocketUtilTest extends GerritBaseTests { assertEquals(new InetSocketAddress(1234), parse(":1234", 80)); assertEquals(new InetSocketAddress(80), parse("", 80)); - assertEquals(createUnresolved("1:2:3:4:5:6:7:8", 1234), // + assertEquals( + createUnresolved("1:2:3:4:5:6:7:8", 1234), // parse("[1:2:3:4:5:6:7:8]:1234", 80)); - assertEquals(createUnresolved("1:2:3:4:5:6:7:8", 80), // + assertEquals( + createUnresolved("1:2:3:4:5:6:7:8", 80), // parse("[1:2:3:4:5:6:7:8]", 80)); - assertEquals(createUnresolved("localhost", 1234), // + assertEquals( + createUnresolved("localhost", 1234), // parse("[localhost]:1234", 80)); - assertEquals(createUnresolved("localhost", 80), // + assertEquals( + createUnresolved("localhost", 80), // parse("[localhost]", 80)); - assertEquals(createUnresolved("foo.bar.example.com", 1234), // + assertEquals( + createUnresolved("foo.bar.example.com", 1234), // parse("[foo.bar.example.com]:1234", 80)); - assertEquals(createUnresolved("foo.bar.example.com", 80), // + assertEquals( + createUnresolved("foo.bar.example.com", 80), // parse("[foo.bar.example.com]", 80)); } @@ -116,14 +124,18 @@ public class SocketUtilTest extends GerritBaseTests { assertEquals(new InetSocketAddress(1234), resolve(":1234", 80)); assertEquals(new InetSocketAddress(80), resolve("", 80)); - assertEquals(new InetSocketAddress(getByName("1:2:3:4:5:6:7:8"), 1234), // + assertEquals( + new InetSocketAddress(getByName("1:2:3:4:5:6:7:8"), 1234), // resolve("[1:2:3:4:5:6:7:8]:1234", 80)); - assertEquals(new InetSocketAddress(getByName("1:2:3:4:5:6:7:8"), 80), // + assertEquals( + new InetSocketAddress(getByName("1:2:3:4:5:6:7:8"), 80), // resolve("[1:2:3:4:5:6:7:8]", 80)); - assertEquals(new InetSocketAddress(getByName("localhost"), 1234), // + assertEquals( + new InetSocketAddress(getByName("localhost"), 1234), // resolve("[localhost]:1234", 80)); - assertEquals(new InetSocketAddress(getByName("localhost"), 80), // + assertEquals( + new InetSocketAddress(getByName("localhost"), 80), // resolve("[localhost]", 80)); } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/ConfigSuite.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/ConfigSuite.java index d769bcc836..eaa9bc4364 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/testutil/ConfigSuite.java +++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/ConfigSuite.java @@ -22,13 +22,6 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.google.common.base.MoreObjects; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; - -import org.junit.runner.Runner; -import org.junit.runners.BlockJUnit4ClassRunner; -import org.junit.runners.Suite; -import org.junit.runners.model.FrameworkMethod; -import org.junit.runners.model.InitializationError; - import java.lang.annotation.Annotation; import java.lang.annotation.Retention; import java.lang.annotation.Target; @@ -37,12 +30,17 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.List; +import org.junit.runner.Runner; +import org.junit.runners.BlockJUnit4ClassRunner; +import org.junit.runners.Suite; +import org.junit.runners.model.FrameworkMethod; +import org.junit.runners.model.InitializationError; /** * Suite to run tests with different {@code gerrit.config} values. - *

        - * For each {@link Config} method in the class and base classes, a new group of - * tests is created with the {@link Parameter} field set to the config. + * + *

        For each {@link Config} method in the class and base classes, a new group of tests is created + * with the {@link Parameter} field set to the config. * *

          * {@literal @}RunWith(ConfigSuite.class)
        @@ -72,40 +70,37 @@ import java.util.List;
          * 
        * * This creates a suite of tests with three groups: + * *
          - *
        • default: {@code MyTest.myTest}
        • - *
        • firstConfig: {@code MyTest.myTest[firstConfig]}
        • - *
        • secondConfig: {@code MyTest.myTest[secondConfig]}
        • + *
        • default: {@code MyTest.myTest} + *
        • firstConfig: {@code MyTest.myTest[firstConfig]} + *
        • secondConfig: {@code MyTest.myTest[secondConfig]} *
        * - * Additionally, config values used by default can be set - * in a method annotated with {@code @ConfigSuite.Default}. - *

        - * The name of the config method corresponding to the currently-running test can - * be stored in a field annotated with {@code @ConfigSuite.Name}. + * Additionally, config values used by default can be set in a method annotated + * with {@code @ConfigSuite.Default}. + * + *

        The name of the config method corresponding to the currently-running test can be stored in a + * field annotated with {@code @ConfigSuite.Name}. */ public class ConfigSuite extends Suite { private static final String DEFAULT = "default"; @Target({METHOD}) @Retention(RUNTIME) - public static @interface Default { - } + public static @interface Default {} @Target({METHOD}) @Retention(RUNTIME) - public static @interface Config { - } + public static @interface Config {} @Target({FIELD}) @Retention(RUNTIME) - public static @interface Parameter { - } + public static @interface Parameter {} @Target({FIELD}) @Retention(RUNTIME) - public static @interface Name { - } + public static @interface Name {} private static class ConfigRunner extends BlockJUnit4ClassRunner { private final Method configMethod; @@ -113,8 +108,9 @@ public class ConfigSuite extends Suite { private final Field nameField; private final String name; - private ConfigRunner(Class clazz, Field parameterField, Field nameField, - String name, Method configMethod) throws InitializationError { + private ConfigRunner( + Class clazz, Field parameterField, Field nameField, String name, Method configMethod) + throws InitializationError { super(clazz); this.parameterField = parameterField; this.nameField = nameField; @@ -152,11 +148,9 @@ public class ConfigSuite extends Suite { Field nameField = getOnlyField(clazz, Name.class); List result = Lists.newArrayListWithCapacity(configs.size() + 1); try { - result.add(new ConfigRunner( - clazz, parameterField, nameField, null, defaultConfig)); + result.add(new ConfigRunner(clazz, parameterField, nameField, null, defaultConfig)); for (Method m : configs) { - result.add(new ConfigRunner( - clazz, parameterField, nameField, m.getName(), m)); + result.add(new ConfigRunner(clazz, parameterField, nameField, m.getName(), m)); } return result; } catch (InitializationError e) { @@ -173,9 +167,11 @@ public class ConfigSuite extends Suite { for (Method m : clazz.getMethods()) { Default ann = m.getAnnotation(Default.class); if (ann != null) { - checkArgument(result == null, + checkArgument( + result == null, "Multiple methods annotated with @ConfigSuite.Method: %s, %s", - result, m); + result, + m); result = m; } } @@ -187,8 +183,8 @@ public class ConfigSuite extends Suite { for (Method m : clazz.getMethods()) { Config ann = m.getAnnotation(Config.class); if (ann != null) { - checkArgument(!m.getName().equals(DEFAULT), - "@ConfigSuite.Config cannot be named %s", DEFAULT); + checkArgument( + !m.getName().equals(DEFAULT), "@ConfigSuite.Config cannot be named %s", DEFAULT); result.add(m); } } @@ -201,30 +197,29 @@ public class ConfigSuite extends Suite { } checkArgument( org.eclipse.jgit.lib.Config.class.isAssignableFrom(m.getReturnType()), - "%s must return Config", m); - checkArgument((m.getModifiers() & Modifier.STATIC) != 0, - "%s must be static", m); - checkArgument(m.getParameterTypes().length == 0, - "%s must take no parameters", m); + "%s must return Config", + m); + checkArgument((m.getModifiers() & Modifier.STATIC) != 0, "%s must be static", m); + checkArgument(m.getParameterTypes().length == 0, "%s must take no parameters", m); try { return (org.eclipse.jgit.lib.Config) m.invoke(null); - } catch (IllegalAccessException | IllegalArgumentException - | InvocationTargetException e) { + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { throw new IllegalArgumentException(e); } } - private static Field getOnlyField(Class clazz, - Class ann) { + private static Field getOnlyField(Class clazz, Class ann) { List fields = Lists.newArrayListWithExpectedSize(1); for (Field f : clazz.getFields()) { if (f.getAnnotation(ann) != null) { fields.add(f); } } - checkArgument(fields.size() <= 1, + checkArgument( + fields.size() <= 1, "expected 1 @ConfigSuite.%s field, found: %s", - ann.getSimpleName(), fields); + ann.getSimpleName(), + fields); return Iterables.getFirst(fields, null); } diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/FakeAccountCache.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/FakeAccountCache.java index 76f24df9fd..d495c77d29 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/testutil/FakeAccountCache.java +++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/FakeAccountCache.java @@ -23,7 +23,6 @@ import com.google.gerrit.server.account.AccountCache; import com.google.gerrit.server.account.AccountState; import com.google.gerrit.server.account.WatchConfig.NotifyType; import com.google.gerrit.server.account.WatchConfig.ProjectWatchKey; - import java.util.HashMap; import java.util.Map; import java.util.Set; @@ -82,8 +81,10 @@ public class FakeAccountCache implements AccountCache { } private static AccountState newState(Account account) { - return new AccountState(account, ImmutableSet. of(), - ImmutableSet. of(), + return new AccountState( + account, + ImmutableSet.of(), + ImmutableSet.of(), new HashMap>()); } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/FakeEmailSender.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/FakeEmailSender.java index 875d43fb6d..5d40187297 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/testutil/FakeEmailSender.java +++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/FakeEmailSender.java @@ -27,29 +27,26 @@ import com.google.gerrit.server.mail.send.EmailSender; import com.google.inject.AbstractModule; import com.google.inject.Inject; import com.google.inject.Singleton; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Email sender implementation that records messages in memory. - *

        - * This class is mostly threadsafe. The only exception is that not all {@link - * EmailHeader} subclasses are immutable. In particular, if a caller holds a - * reference to an {@code AddressList} and mutates it after sending, the message - * returned by {@link #getMessages()} may or may not reflect mutations. + * + *

        This class is mostly threadsafe. The only exception is that not all {@link EmailHeader} + * subclasses are immutable. In particular, if a caller holds a reference to an {@code AddressList} + * and mutates it after sending, the message returned by {@link #getMessages()} may or may not + * reflect mutations. */ @Singleton public class FakeEmailSender implements EmailSender { - private static final Logger log = - LoggerFactory.getLogger(FakeEmailSender.class); + private static final Logger log = LoggerFactory.getLogger(FakeEmailSender.class); public static class Module extends AbstractModule { @Override @@ -60,15 +57,18 @@ public class FakeEmailSender implements EmailSender { @AutoValue public abstract static class Message { - private static Message create(Address from, Collection

        rcpt, - Map headers, String body) { - return new AutoValue_FakeEmailSender_Message(from, - ImmutableList.copyOf(rcpt), ImmutableMap.copyOf(headers), body); + private static Message create( + Address from, Collection
        rcpt, Map headers, String body) { + return new AutoValue_FakeEmailSender_Message( + from, ImmutableList.copyOf(rcpt), ImmutableMap.copyOf(headers), body); } public abstract Address from(); + public abstract ImmutableList
        rcpt(); + public abstract ImmutableMap headers(); + public abstract String body(); } @@ -92,8 +92,9 @@ public class FakeEmailSender implements EmailSender { } @Override - public void send(Address from, Collection
        rcpt, - Map headers, String body) throws EmailException { + public void send( + Address from, Collection
        rcpt, Map headers, String body) + throws EmailException { messages.add(Message.create(from, rcpt, headers, body)); } @@ -116,8 +117,7 @@ public class FakeEmailSender implements EmailSender { final String typeFooter = "\nGerrit-MessageType: " + type + "\n"; return getMessages() .stream() - .filter(in -> in.body().contains(idFooter) - && in.body().contains(typeFooter)) + .filter(in -> in.body().contains(idFooter) && in.body().contains(typeFooter)) .collect(toList()); } diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/GerritBaseTests.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/GerritBaseTests.java index 3edc9f43a7..4f08c9e73b 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/testutil/GerritBaseTests.java +++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/GerritBaseTests.java @@ -16,7 +16,6 @@ package com.google.gerrit.testutil; import com.google.gwtorm.client.KeyUtil; import com.google.gwtorm.server.StandardKeyEncoder; - import org.junit.Ignore; import org.junit.Rule; import org.junit.rules.ExpectedException; @@ -27,6 +26,5 @@ public abstract class GerritBaseTests { KeyUtil.setEncoderImpl(new StandardKeyEncoder()); } - @Rule - public ExpectedException exception = ExpectedException.none(); + @Rule public ExpectedException exception = ExpectedException.none(); } diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/GerritServerTests.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/GerritServerTests.java index 797f1cb25a..038baacdb6 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/testutil/GerritServerTests.java +++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/GerritServerTests.java @@ -23,36 +23,34 @@ import org.junit.runners.model.Statement; @RunWith(ConfigSuite.class) public class GerritServerTests extends GerritBaseTests { - @ConfigSuite.Parameter - public Config config; + @ConfigSuite.Parameter public Config config; - @ConfigSuite.Name - private String configName; + @ConfigSuite.Name private String configName; protected TestNotesMigration notesMigration; @Rule - public TestRule testRunner = new TestRule() { - @Override - public Statement apply(final Statement base, final Description description) { - return new Statement() { + public TestRule testRunner = + new TestRule() { @Override - public void evaluate() throws Throwable { - beforeTest(); - try { - base.evaluate(); - } finally { - afterTest(); - } + public Statement apply(final Statement base, final Description description) { + return new Statement() { + @Override + public void evaluate() throws Throwable { + beforeTest(); + try { + base.evaluate(); + } finally { + afterTest(); + } + } + }; } }; - } - }; public void beforeTest() throws Exception { notesMigration = new TestNotesMigration().setFromEnv(); } - public void afterTest() { - } + public void afterTest() {} } diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryDatabase.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryDatabase.java index ae0a23aa5b..9a41a9c00b 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryDatabase.java +++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryDatabase.java @@ -34,23 +34,20 @@ import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Inject; import com.google.inject.Injector; - -import org.eclipse.jgit.errors.ConfigInvalidException; - import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; - import javax.sql.DataSource; +import org.eclipse.jgit.errors.ConfigInvalidException; /** * An in-memory test instance of {@link ReviewDb} database. - *

        - * Test classes should create one instance of this class for each unique test - * database they want to use. When the tests needing this instance are complete, - * ensure that {@link #drop(InMemoryDatabase)} is called to free the resources so - * the JVM running the unit tests doesn't run out of heap space. + * + *

        Test classes should create one instance of this class for each unique test database they want + * to use. When the tests needing this instance are complete, ensure that {@link + * #drop(InMemoryDatabase)} is called to free the resources so the JVM running the unit tests + * doesn't run out of heap space. */ public class InMemoryDatabase implements SchemaFactory { public static InMemoryDatabase newDatabase(LifecycleManager lifecycle) { @@ -78,36 +75,36 @@ public class InMemoryDatabase implements SchemaFactory { private final SchemaCreator schemaCreator; private final SingleVersionListener singleVersionListener; - private Connection openHandle; private Database database; private boolean created; @Inject InMemoryDatabase(Injector injector) throws OrmException { - Injector childInjector = injector.createChildInjector(new AbstractModule() { - @Override - protected void configure() { - switch (IndexModule.getIndexType(injector)) { - case LUCENE: - install(new LuceneIndexModuleOnInit()); - break; - case ELASTICSEARCH: - install(new ElasticIndexModuleOnInit()); - break; - default: - throw new IllegalStateException("unsupported index.type"); - } - } - }); + Injector childInjector = + injector.createChildInjector( + new AbstractModule() { + @Override + protected void configure() { + switch (IndexModule.getIndexType(injector)) { + case LUCENE: + install(new LuceneIndexModuleOnInit()); + break; + case ELASTICSEARCH: + install(new ElasticIndexModuleOnInit()); + break; + default: + throw new IllegalStateException("unsupported index.type"); + } + } + }); this.schemaCreator = childInjector.getInstance(SchemaCreator.class); - this.singleVersionListener = - childInjector.getInstance(SingleVersionListener.class); + this.singleVersionListener = childInjector.getInstance(SingleVersionListener.class); initDatabase(); } - InMemoryDatabase(SchemaCreator schemaCreator, - SingleVersionListener singleVersionListener) throws OrmException { + InMemoryDatabase(SchemaCreator schemaCreator, SingleVersionListener singleVersionListener) + throws OrmException { this.schemaCreator = schemaCreator; this.singleVersionListener = singleVersionListener; initDatabase(); @@ -184,7 +181,6 @@ public class InMemoryDatabase implements SchemaFactory { } public void assertSchemaVersion() throws OrmException { - assertThat(getSchemaVersion().versionNbr) - .isEqualTo(SchemaVersion.getBinaryVersion()); + assertThat(getSchemaVersion().versionNbr).isEqualTo(SchemaVersion.getBinaryVersion()); } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryModule.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryModule.java index 254c7e7b94..93502527d4 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryModule.java +++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryModule.java @@ -78,10 +78,6 @@ import com.google.inject.Singleton; import com.google.inject.TypeLiteral; import com.google.inject.servlet.RequestScoped; import com.google.inject.util.Providers; - -import org.eclipse.jgit.lib.Config; -import org.eclipse.jgit.lib.PersonIdent; - import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.nio.file.Path; @@ -89,6 +85,8 @@ import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ExecutorService; +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.lib.PersonIdent; public class InMemoryModule extends FactoryModule { public static Config newDefaultConfig() { @@ -139,13 +137,14 @@ public class InMemoryModule extends FactoryModule { // For simplicity, don't create child injectors, just use this one to get a // few required modules. - Injector cfgInjector = Guice.createInjector(new AbstractModule() { - @Override - protected void configure() { - bind(Config.class).annotatedWith(GerritServerConfig.class) - .toInstance(cfg); - } - }); + Injector cfgInjector = + Guice.createInjector( + new AbstractModule() { + @Override + protected void configure() { + bind(Config.class).annotatedWith(GerritServerConfig.class).toInstance(cfg); + } + }); bind(MetricMaker.class).to(DisabledMetricMaker.class); install(cfgInjector.getInstance(GerritGlobalModule.class)); install(new SearchingChangeCacheImpl.Module()); @@ -156,58 +155,51 @@ public class InMemoryModule extends FactoryModule { // TODO(dborowitz): Use jimfs. bind(Path.class).annotatedWith(SitePath.class).toInstance(Paths.get(".")); bind(Config.class).annotatedWith(GerritServerConfig.class).toInstance(cfg); - bind(GerritOptions.class) - .toInstance(new GerritOptions(cfg, false, false, false)); + bind(GerritOptions.class).toInstance(new GerritOptions(cfg, false, false, false)); bind(PersonIdent.class) .annotatedWith(GerritPersonIdent.class) .toProvider(GerritPersonIdentProvider.class); bind(String.class) .annotatedWith(AnonymousCowardName.class) .toProvider(AnonymousCowardNameProvider.class); - bind(String.class) - .annotatedWith(GerritServerId.class) - .toInstance("gerrit"); - bind(AllProjectsName.class) - .toProvider(AllProjectsNameProvider.class); - bind(AllUsersName.class) - .toProvider(AllUsersNameProvider.class); - bind(GitRepositoryManager.class) - .to(InMemoryRepositoryManager.class); + bind(String.class).annotatedWith(GerritServerId.class).toInstance("gerrit"); + bind(AllProjectsName.class).toProvider(AllProjectsNameProvider.class); + bind(AllUsersName.class).toProvider(AllUsersNameProvider.class); + bind(GitRepositoryManager.class).to(InMemoryRepositoryManager.class); bind(InMemoryRepositoryManager.class).in(SINGLETON); - bind(TrackingFooters.class).toProvider(TrackingFootersProvider.class) - .in(SINGLETON); + bind(TrackingFooters.class).toProvider(TrackingFootersProvider.class).in(SINGLETON); bind(NotesMigration.class).toInstance(notesMigration); bind(ListeningExecutorService.class) .annotatedWith(ChangeUpdateExecutor.class) .toInstance(MoreExecutors.newDirectExecutorService()); - bind(DataSourceType.class) - .to(InMemoryH2Type.class); - bind(new TypeLiteral>() {}) - .to(InMemoryDatabase.class); + bind(DataSourceType.class).to(InMemoryH2Type.class); + bind(new TypeLiteral>() {}).to(InMemoryDatabase.class); bind(ChangeBundleReader.class).to(GwtormChangeBundleReader.class); bind(SecureStore.class).to(DefaultSecureStore.class); install(NoSshKeyCache.module()); - install(new CanonicalWebUrlModule() { - @Override - protected Class> provider() { - return CanonicalWebUrlProvider.class; - } - }); + install( + new CanonicalWebUrlModule() { + @Override + protected Class> provider() { + return CanonicalWebUrlProvider.class; + } + }); //Replacement of DiffExecutorModule to not use thread pool in the tests - install(new AbstractModule() { - @Override - protected void configure() { - } - @Provides - @Singleton - @DiffExecutor - public ExecutorService createDiffExecutor() { - return MoreExecutors.newDirectExecutorService(); - } - }); + install( + new AbstractModule() { + @Override + protected void configure() {} + + @Provides + @Singleton + @DiffExecutor + public ExecutorService createDiffExecutor() { + return MoreExecutors.newDirectExecutorService(); + } + }); install(new DefaultCacheFactory.Module()); install(new FakeEmailSender.Module()); install(new SignedTokenEmailTokenVerifier.Module()); @@ -233,8 +225,7 @@ public class InMemoryModule extends FactoryModule { install(elasticIndexModule()); break; default: - throw new ProvisionException( - "index type unsupported in tests: " + indexType); + throw new ProvisionException("index type unsupported in tests: " + indexType); } } } @@ -248,8 +239,9 @@ public class InMemoryModule extends FactoryModule { @Provides @Singleton - InMemoryDatabase getInMemoryDatabase(SchemaCreator schemaCreator, - SingleVersionListener singleVersionListener) throws OrmException { + InMemoryDatabase getInMemoryDatabase( + SchemaCreator schemaCreator, SingleVersionListener singleVersionListener) + throws OrmException { return new InMemoryDatabase(schemaCreator, singleVersionListener); } @@ -269,11 +261,13 @@ public class InMemoryModule extends FactoryModule { singleVersions.put(ChangeSchemaDefinitions.INSTANCE.getName(), version); } Class clazz = Class.forName(moduleClassName); - Method m = clazz.getMethod( - "singleVersionWithExplicitVersions", Map.class, int.class); + Method m = clazz.getMethod("singleVersionWithExplicitVersions", Map.class, int.class); return (Module) m.invoke(null, singleVersions, 0); - } catch (ClassNotFoundException | SecurityException | NoSuchMethodException - | IllegalArgumentException | IllegalAccessException + } catch (ClassNotFoundException + | SecurityException + | NoSuchMethodException + | IllegalArgumentException + | IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); ProvisionException pe = new ProvisionException(e.getMessage()); diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryRepositoryManager.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryRepositoryManager.java index b6e59dd64d..4826d9e3e9 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryRepositoryManager.java +++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryRepositoryManager.java @@ -19,16 +19,14 @@ import com.google.common.collect.Sets; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.git.GitRepositoryManager; import com.google.gerrit.server.git.RepositoryCaseMismatchException; - +import java.util.HashMap; +import java.util.Map; +import java.util.SortedSet; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.internal.storage.dfs.DfsRepository; import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription; import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository; -import java.util.HashMap; -import java.util.Map; -import java.util.SortedSet; - /** Repository manager that uses in-memory repositories. */ public class InMemoryRepositoryManager implements GitRepositoryManager { public static InMemoryRepository newRepository(Project.NameKey name) { @@ -77,8 +75,7 @@ public class InMemoryRepositoryManager implements GitRepositoryManager { private Map repos = new HashMap<>(); @Override - public synchronized Repo openRepository(Project.NameKey name) - throws RepositoryNotFoundException { + public synchronized Repo openRepository(Project.NameKey name) throws RepositoryNotFoundException { return get(name); } @@ -111,8 +108,7 @@ public class InMemoryRepositoryManager implements GitRepositoryManager { repos.remove(normalize(name)); } - private synchronized Repo get(Project.NameKey name) - throws RepositoryNotFoundException { + private synchronized Repo get(Project.NameKey name) throws RepositoryNotFoundException { Repo repo = repos.get(normalize(name)); if (repo != null) { repo.incrementOpen(); diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/NoteDbChecker.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/NoteDbChecker.java index ae0e5159de..aeaaa4773e 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/testutil/NoteDbChecker.java +++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/NoteDbChecker.java @@ -36,18 +36,16 @@ import com.google.gwtorm.server.OrmRuntimeException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Stream; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.Repository; import org.junit.runner.Description; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Stream; - @Singleton public class NoteDbChecker { static final Logger log = LoggerFactory.getLogger(NoteDbChecker.class); @@ -61,7 +59,8 @@ public class NoteDbChecker { private final CommentsUtil commentsUtil; @Inject - NoteDbChecker(Provider dbProvider, + NoteDbChecker( + Provider dbProvider, GitRepositoryManager repoManager, TestNotesMigration notesMigration, ChangeBundleReader bundleReader, @@ -78,16 +77,14 @@ public class NoteDbChecker { } public void rebuildAndCheckAllChanges() throws Exception { - rebuildAndCheckChanges( - getUnwrappedDb().changes().all().toList().stream().map(Change::getId)); + rebuildAndCheckChanges(getUnwrappedDb().changes().all().toList().stream().map(Change::getId)); } public void rebuildAndCheckChanges(Change.Id... changeIds) throws Exception { rebuildAndCheckChanges(Arrays.stream(changeIds)); } - private void rebuildAndCheckChanges(Stream changeIds) - throws Exception { + private void rebuildAndCheckChanges(Stream changeIds) throws Exception { ReviewDb db = getUnwrappedDb(); List allExpected = readExpected(changeIds); @@ -118,8 +115,7 @@ public class NoteDbChecker { checkActual(readExpected(Arrays.stream(changeIds)), new ArrayList<>()); } - public void assertNoChangeRef(Project.NameKey project, Change.Id changeId) - throws Exception { + public void assertNoChangeRef(Project.NameKey project, Change.Id changeId) throws Exception { try (Repository repo = repoManager.openRepository(project)) { assertThat(repo.exactRef(RefNames.changeMetaRef(changeId))).isNull(); } @@ -127,9 +123,7 @@ public class NoteDbChecker { public void assertNoReviewDbChanges(Description desc) throws Exception { ReviewDb db = getUnwrappedDb(); - assertThat(db.changes().all().toList()) - .named("Changes in " + desc.getTestClass()) - .isEmpty(); + assertThat(db.changes().all().toList()).named("Changes in " + desc.getTestClass()).isEmpty(); assertThat(db.changeMessages().all().toList()) .named("ChangeMessages in " + desc.getTestClass()) .isEmpty(); @@ -144,13 +138,14 @@ public class NoteDbChecker { .isEmpty(); } - private List readExpected(Stream changeIds) - throws Exception { + private List readExpected(Stream changeIds) throws Exception { boolean old = notesMigration.readChanges(); try { notesMigration.setReadChanges(false); - return changeIds.sorted(comparing(IntKey::get)) - .map(this::readBundleUnchecked).collect(toList()); + return changeIds + .sorted(comparing(IntKey::get)) + .map(this::readBundleUnchecked) + .collect(toList()); } finally { notesMigration.setReadChanges(old); } @@ -164,8 +159,7 @@ public class NoteDbChecker { } } - private void checkActual(List allExpected, List msgs) - throws Exception { + private void checkActual(List allExpected, List msgs) throws Exception { ReviewDb db = getUnwrappedDb(); boolean oldRead = notesMigration.readChanges(); boolean oldWrite = notesMigration.writeChanges(); @@ -176,8 +170,9 @@ public class NoteDbChecker { Change c = expected.getChange(); ChangeBundle actual; try { - actual = ChangeBundle.fromNotes( - commentsUtil, notesFactory.create(db, c.getProject(), c.getId())); + actual = + ChangeBundle.fromNotes( + commentsUtil, notesFactory.create(db, c.getProject(), c.getId())); } catch (Throwable t) { String msg = "Error converting change: " + c; msgs.add(msg); @@ -190,8 +185,7 @@ public class NoteDbChecker { msgs.addAll(diff); msgs.add(""); } else { - System.err.println( - "NoteDb conversion of change " + c.getId() + " successful"); + System.err.println("NoteDb conversion of change " + c.getId() + " successful"); } } } finally { @@ -205,6 +199,6 @@ public class NoteDbChecker { private ReviewDb getUnwrappedDb() { ReviewDb db = dbProvider.get(); - return ReviewDbUtil.unwrapDb(db); + return ReviewDbUtil.unwrapDb(db); } } diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/NoteDbMode.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/NoteDbMode.java index 7db76fd9e4..093812f346 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/testutil/NoteDbMode.java +++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/NoteDbMode.java @@ -33,8 +33,8 @@ public enum NoteDbMode { PRIMARY, /** - * Run tests with NoteDb disabled, then convert ReviewDb to NoteDb and check - * that the results match. + * Run tests with NoteDb disabled, then convert ReviewDb to NoteDb and check that the results + * match. */ CHECK; @@ -52,11 +52,14 @@ public enum NoteDbMode { value = value.toUpperCase().replace("-", "_"); NoteDbMode mode = Enums.getIfPresent(NoteDbMode.class, value).orNull(); if (!Strings.isNullOrEmpty(System.getenv(ENV_VAR))) { - checkArgument(mode != null, "Invalid value for env variable %s: %s", - ENV_VAR, System.getenv(ENV_VAR)); + checkArgument( + mode != null, "Invalid value for env variable %s: %s", ENV_VAR, System.getenv(ENV_VAR)); } else { - checkArgument(mode != null, "Invalid value for system property %s: %s", - SYS_PROP, System.getProperty(SYS_PROP)); + checkArgument( + mode != null, + "Invalid value for system property %s: %s", + SYS_PROP, + System.getProperty(SYS_PROP)); } return mode; } diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/SshMode.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/SshMode.java index bc4e4e9df2..9320331cea 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/testutil/SshMode.java +++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/SshMode.java @@ -40,11 +40,14 @@ public enum SshMode { value = value.toUpperCase(); SshMode mode = Enums.getIfPresent(SshMode.class, value).orNull(); if (!Strings.isNullOrEmpty(System.getenv(ENV_VAR))) { - checkArgument(mode != null, "Invalid value for env variable %s: %s", - ENV_VAR, System.getenv(ENV_VAR)); + checkArgument( + mode != null, "Invalid value for env variable %s: %s", ENV_VAR, System.getenv(ENV_VAR)); } else { - checkArgument(mode != null, "Invalid value for system property %s: %s", - SYS_PROP, System.getProperty(SYS_PROP)); + checkArgument( + mode != null, + "Invalid value for system property %s: %s", + SYS_PROP, + System.getProperty(SYS_PROP)); } return mode; } diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/TempFileUtil.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/TempFileUtil.java index 72c2b5ab97..eb50b4784a 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/testutil/TempFileUtil.java +++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/TempFileUtil.java @@ -62,6 +62,5 @@ public class TempFileUtil { } } - private TempFileUtil() { - } + private TempFileUtil() {} } diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/TestChanges.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/TestChanges.java index 594ce82500..459bccd023 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/testutil/TestChanges.java +++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/TestChanges.java @@ -36,7 +36,8 @@ import com.google.gerrit.server.notedb.NotesMigration; import com.google.gerrit.server.project.ChangeControl; import com.google.gwtorm.server.OrmException; import com.google.inject.Injector; - +import java.util.TimeZone; +import java.util.concurrent.atomic.AtomicInteger; import org.easymock.EasyMock; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.ObjectId; @@ -44,12 +45,9 @@ import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; -import java.util.TimeZone; -import java.util.concurrent.atomic.AtomicInteger; - /** - * Utility functions to create and manipulate Change, ChangeUpdate, and - * ChangeControl objects for testing. + * Utility functions to create and manipulate Change, ChangeUpdate, and ChangeControl objects for + * testing. */ public class TestChanges { private static final AtomicInteger nextChangeId = new AtomicInteger(1); @@ -58,26 +56,24 @@ public class TestChanges { return newChange(project, userId, nextChangeId.getAndIncrement()); } - public static Change newChange(Project.NameKey project, Account.Id userId, - int id) { + public static Change newChange(Project.NameKey project, Account.Id userId, int id) { Change.Id changeId = new Change.Id(id); - Change c = new Change( - new Change.Key("Iabcd1234abcd1234abcd1234abcd1234abcd1234"), - changeId, - userId, - new Branch.NameKey(project, "master"), - TimeUtil.nowTs()); + Change c = + new Change( + new Change.Key("Iabcd1234abcd1234abcd1234abcd1234abcd1234"), + changeId, + userId, + new Branch.NameKey(project, "master"), + TimeUtil.nowTs()); incrementPatchSet(c); return c; } - public static PatchSet newPatchSet(PatchSet.Id id, ObjectId revision, - Account.Id userId) { + public static PatchSet newPatchSet(PatchSet.Id id, ObjectId revision, Account.Id userId) { return newPatchSet(id, revision.name(), userId); } - public static PatchSet newPatchSet(PatchSet.Id id, String revision, - Account.Id userId) { + public static PatchSet newPatchSet(PatchSet.Id id, String revision, Account.Id userId) { PatchSet ps = new PatchSet(id); ps.setRevision(new RevId(revision)); ps.setUploader(userId); @@ -85,25 +81,26 @@ public class TestChanges { return ps; } - public static ChangeUpdate newUpdate(Injector injector, - Change c, final CurrentUser user) throws Exception { - injector = injector.createChildInjector(new FactoryModule() { - @Override - public void configure() { - bind(CurrentUser.class).toInstance(user); - } - }); - ChangeUpdate update = injector.getInstance(ChangeUpdate.Factory.class) - .create( - stubChangeControl( - injector.getInstance(AbstractChangeNotes.Args.class), - c, - user), - TimeUtil.nowTs(), Ordering. natural()); + public static ChangeUpdate newUpdate(Injector injector, Change c, final CurrentUser user) + throws Exception { + injector = + injector.createChildInjector( + new FactoryModule() { + @Override + public void configure() { + bind(CurrentUser.class).toInstance(user); + } + }); + ChangeUpdate update = + injector + .getInstance(ChangeUpdate.Factory.class) + .create( + stubChangeControl(injector.getInstance(AbstractChangeNotes.Args.class), c, user), + TimeUtil.nowTs(), + Ordering.natural()); ChangeNotes notes = update.getNotes(); - boolean hasPatchSets = notes.getPatchSets() != null - && !notes.getPatchSets().isEmpty(); + boolean hasPatchSets = notes.getPatchSets() != null && !notes.getPatchSets().isEmpty(); NotesMigration migration = injector.getInstance(NotesMigration.class); if (hasPatchSets || !migration.readChanges()) { return update; @@ -111,16 +108,16 @@ public class TestChanges { // Change doesn't exist yet. NoteDb requires that there be a commit for the // first patch set, so create one. - GitRepositoryManager repoManager = - injector.getInstance(GitRepositoryManager.class); + GitRepositoryManager repoManager = injector.getInstance(GitRepositoryManager.class); try (Repository repo = repoManager.openRepository(c.getProject())) { TestRepository tr = new TestRepository<>(repo); - PersonIdent ident = user.asIdentifiedUser() - .newCommitterIdent(update.getWhen(), TimeZone.getDefault()); - TestRepository.CommitBuilder cb = tr.commit() - .author(ident) - .committer(ident) - .message(firstNonNull(c.getSubject(), "Test change")); + PersonIdent ident = + user.asIdentifiedUser().newCommitterIdent(update.getWhen(), TimeZone.getDefault()); + TestRepository.CommitBuilder cb = + tr.commit() + .author(ident) + .committer(ident) + .message(firstNonNull(c.getSubject(), "Test change")); Ref parent = repo.exactRef(c.getDest().get()); if (parent != null) { cb.parent(tr.getRevWalk().parseCommit(parent.getObjectId())); @@ -133,8 +130,7 @@ public class TestChanges { } private static ChangeControl stubChangeControl( - AbstractChangeNotes.Args args, - Change c, CurrentUser user) throws OrmException { + AbstractChangeNotes.Args args, Change c, CurrentUser user) throws OrmException { ChangeControl ctl = EasyMock.createMock(ChangeControl.class); expect(ctl.getChange()).andStubReturn(c); expect(ctl.getProject()).andStubReturn(new Project(c.getProject())); @@ -148,8 +144,8 @@ public class TestChanges { public static void incrementPatchSet(Change change) { PatchSet.Id curr = change.currentPatchSetId(); - PatchSetInfo ps = new PatchSetInfo(new PatchSet.Id( - change.getId(), curr != null ? curr.get() + 1 : 1)); + PatchSetInfo ps = + new PatchSetInfo(new PatchSet.Id(change.getId(), curr != null ? curr.get() + 1 : 1)); ps.setSubject("Change subject"); change.setCurrentPatchSet(ps); } diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/TestNotesMigration.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/TestNotesMigration.java index b11b2cd9fc..2c373d5ae2 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/testutil/TestNotesMigration.java +++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/TestNotesMigration.java @@ -25,8 +25,7 @@ import com.google.inject.Singleton; public class TestNotesMigration extends NotesMigration { private volatile boolean readChanges; private volatile boolean writeChanges; - private volatile PrimaryStorage changePrimaryStorage = - PrimaryStorage.REVIEW_DB; + private volatile PrimaryStorage changePrimaryStorage = PrimaryStorage.REVIEW_DB; private volatile boolean failOnLoad; @Override @@ -78,8 +77,7 @@ public class TestNotesMigration extends NotesMigration { return this; } - public TestNotesMigration setChangePrimaryStorage( - PrimaryStorage changePrimaryStorage) { + public TestNotesMigration setChangePrimaryStorage(PrimaryStorage changePrimaryStorage) { this.changePrimaryStorage = checkNotNull(changePrimaryStorage); return this; } diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/TestTimeUtil.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/TestTimeUtil.java index 32f0af8384..dd44cb9ae5 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/testutil/TestTimeUtil.java +++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/TestTimeUtil.java @@ -17,15 +17,14 @@ package com.google.gerrit.testutil; import static com.google.common.base.Preconditions.checkState; import static java.util.concurrent.TimeUnit.MILLISECONDS; +import java.sql.Timestamp; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; import org.joda.time.DateTime; import org.joda.time.DateTimeUtils; import org.joda.time.DateTimeUtils.MillisProvider; import org.joda.time.DateTimeZone; -import java.sql.Timestamp; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicLong; - /** Static utility methods for dealing with dates and times in tests. */ public class TestTimeUtil { public static final DateTime START = @@ -36,14 +35,13 @@ public class TestTimeUtil { /** * Reset the clock to a known start point, then set the clock step. - *

        - * The clock is initially set to 2009/09/30 17:00:00 -0400. + * + *

        The clock is initially set to 2009/09/30 17:00:00 -0400. * * @param clockStep amount to increment clock by on each lookup. * @param clockStepUnit time unit for {@code clockStep}. */ - public static synchronized void resetWithClockStep( - long clockStep, TimeUnit clockStepUnit) { + public static synchronized void resetWithClockStep(long clockStep, TimeUnit clockStepUnit) { // Set an arbitrary start point so tests are more repeatable. clockMs = new AtomicLong(START.getMillis()); setClockStep(clockStep, clockStepUnit); @@ -55,16 +53,16 @@ public class TestTimeUtil { * @param clockStep amount to increment clock by on each lookup. * @param clockStepUnit time unit for {@code clockStep}. */ - public static synchronized void setClockStep( - long clockStep, TimeUnit clockStepUnit) { + public static synchronized void setClockStep(long clockStep, TimeUnit clockStepUnit) { checkState(clockMs != null, "call resetWithClockStep first"); clockStepMs = MILLISECONDS.convert(clockStep, clockStepUnit); - DateTimeUtils.setCurrentMillisProvider(new MillisProvider() { - @Override - public long getMillis() { - return clockMs.getAndAdd(clockStepMs); - } - }); + DateTimeUtils.setCurrentMillisProvider( + new MillisProvider() { + @Override + public long getMillis() { + return clockMs.getAndAdd(clockStepMs); + } + }); } /** @@ -83,8 +81,7 @@ public class TestTimeUtil { * @param clockStep amount to increment clock by. * @param clockStepUnit time unit for {@code clockStep}. */ - public static synchronized void incrementClock( - long clockStep, TimeUnit clockStepUnit) { + public static synchronized void incrementClock(long clockStep, TimeUnit clockStepUnit) { checkState(clockMs != null, "call resetWithClockStep first"); clockMs.addAndGet(clockStepUnit.toMillis(clockStep)); } @@ -95,6 +92,5 @@ public class TestTimeUtil { DateTimeUtils.setCurrentMillisSystem(); } - private TestTimeUtil() { - } + private TestTimeUtil() {} } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AbstractGitCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AbstractGitCommand.java index 90ffebd4f0..4144ed2d8b 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AbstractGitCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AbstractGitCommand.java @@ -21,35 +21,27 @@ import com.google.gerrit.server.git.GitRepositoryManager; import com.google.gerrit.server.project.ProjectControl; import com.google.gerrit.sshd.SshScope.Context; import com.google.inject.Inject; - +import java.io.IOException; import org.apache.sshd.server.Environment; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.Repository; import org.kohsuke.args4j.Argument; -import java.io.IOException; - public abstract class AbstractGitCommand extends BaseCommand { @Argument(index = 0, metaVar = "PROJECT.git", required = true, usage = "project name") protected ProjectControl projectControl; - @Inject - private SshScope sshScope; + @Inject private SshScope sshScope; - @Inject - private GitRepositoryManager repoManager; + @Inject private GitRepositoryManager repoManager; - @Inject - private SshSession session; + @Inject private SshSession session; - @Inject - private SshScope.Context context; + @Inject private SshScope.Context context; - @Inject - private IdentifiedUser user; + @Inject private IdentifiedUser user; - @Inject - private IdentifiedUser.GenericFactory userFactory; + @Inject private IdentifiedUser.GenericFactory userFactory; protected Repository repo; protected Project project; @@ -59,31 +51,35 @@ public abstract class AbstractGitCommand extends BaseCommand { Context ctx = context.subContext(newSession(), context.getCommandLine()); final Context old = sshScope.set(ctx); try { - startThread(new ProjectCommandRunnable() { - @Override - public void executeParseCommand() throws Exception { - parseCommandLine(); - } + startThread( + new ProjectCommandRunnable() { + @Override + public void executeParseCommand() throws Exception { + parseCommandLine(); + } - @Override - public void run() throws Exception { - AbstractGitCommand.this.service(); - } + @Override + public void run() throws Exception { + AbstractGitCommand.this.service(); + } - @Override - public Project.NameKey getProjectName() { - Project project = projectControl.getProjectState().getProject(); - return project.getNameKey(); - } - }); + @Override + public Project.NameKey getProjectName() { + Project project = projectControl.getProjectState().getProject(); + return project.getNameKey(); + } + }); } finally { sshScope.set(old); } } private SshSession newSession() { - SshSession n = new SshSession(session, session.getRemoteAddress(), - userFactory.create(session.getRemoteAddress(), user.getAccountId())); + SshSession n = + new SshSession( + session, + session.getRemoteAddress(), + userFactory.create(session.getRemoteAddress(), user.getAccountId())); n.setAccessPath(AccessPath.GIT); return n; } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AdminHighPriorityCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AdminHighPriorityCommand.java index 04f6eb84f7..d5ce462a6d 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AdminHighPriorityCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AdminHighPriorityCommand.java @@ -21,11 +21,11 @@ import java.lang.annotation.Retention; import java.lang.annotation.Target; /** - * Annotation tagged on a concrete Command that requires - * high priority thread creation whenever called by administrators users. + * Annotation tagged on a concrete Command that requires high priority thread creation whenever + * called by administrators users. + * *

        */ -@Target( {ElementType.TYPE}) +@Target({ElementType.TYPE}) @Retention(RUNTIME) -public @interface AdminHighPriorityCommand { -} +public @interface AdminHighPriorityCommand {} diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AliasCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AliasCommand.java index 4ddca0c84c..45835d9828 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AliasCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AliasCommand.java @@ -19,14 +19,12 @@ import com.google.common.util.concurrent.Atomics; import com.google.gerrit.extensions.annotations.RequiresCapability; import com.google.gerrit.server.CurrentUser; import com.google.gerrit.server.account.CapabilityControl; - -import org.apache.sshd.server.Command; -import org.apache.sshd.server.Environment; - import java.io.IOException; import java.util.LinkedList; import java.util.Map; import java.util.concurrent.atomic.AtomicReference; +import org.apache.sshd.server.Command; +import org.apache.sshd.server.Environment; /** Command that executes some other command. */ public class AliasCommand extends BaseCommand { @@ -35,8 +33,10 @@ public class AliasCommand extends BaseCommand { private final CommandName command; private final AtomicReference atomicCmd; - AliasCommand(@CommandName(Commands.ROOT) DispatchCommandProvider root, - CurrentUser currentUser, CommandName command) { + AliasCommand( + @CommandName(Commands.ROOT) DispatchCommandProvider root, + CurrentUser currentUser, + CommandName command) { this.root = root; this.currentUser = currentUser; this.command = command; @@ -81,7 +81,7 @@ public class AliasCommand extends BaseCommand { Command cmd = p.getProvider().get(); checkRequiresCapability(cmd); if (cmd instanceof BaseCommand) { - BaseCommand bc = (BaseCommand)cmd; + BaseCommand bc = (BaseCommand) cmd; bc.setName(getName()); bc.setArguments(getArguments()); } @@ -108,9 +108,10 @@ public class AliasCommand extends BaseCommand { if (rc != null) { CapabilityControl ctl = currentUser.getCapabilities(); if (!ctl.canPerform(rc.value()) && !ctl.canAdministrateServer()) { - String msg = String.format( - "fatal: %s does not have \"%s\" capability.", - currentUser.getUserName(), rc.value()); + String msg = + String.format( + "fatal: %s does not have \"%s\" capability.", + currentUser.getUserName(), rc.value()); throw new UnloggedFailure(BaseCommand.STATUS_NOT_ADMIN, msg); } } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AliasCommandProvider.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AliasCommandProvider.java index 432844c685..10beb40774 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AliasCommandProvider.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AliasCommandProvider.java @@ -17,7 +17,6 @@ package com.google.gerrit.sshd; import com.google.gerrit.server.CurrentUser; import com.google.inject.Inject; import com.google.inject.Provider; - import org.apache.sshd.server.Command; /** Resolves an alias to another command. */ @@ -28,8 +27,7 @@ public class AliasCommandProvider implements Provider { @CommandName(Commands.ROOT) private DispatchCommandProvider root; - @Inject - private CurrentUser currentUser; + @Inject private CurrentUser currentUser; public AliasCommandProvider(CommandName command) { this.command = command; diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/BaseCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/BaseCommand.java index 3e31fabb8c..bc465ec89f 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/BaseCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/BaseCommand.java @@ -33,17 +33,6 @@ import com.google.gerrit.sshd.SshScope.Context; import com.google.gerrit.util.cli.CmdLineParser; import com.google.gerrit.util.cli.EndOfOptionsHandler; import com.google.inject.Inject; - -import org.apache.sshd.common.SshException; -import org.apache.sshd.server.Command; -import org.apache.sshd.server.Environment; -import org.apache.sshd.server.ExitCallback; -import org.kohsuke.args4j.Argument; -import org.kohsuke.args4j.CmdLineException; -import org.kohsuke.args4j.Option; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; @@ -55,6 +44,15 @@ import java.io.StringWriter; import java.nio.charset.Charset; import java.util.concurrent.Future; import java.util.concurrent.atomic.AtomicReference; +import org.apache.sshd.common.SshException; +import org.apache.sshd.server.Command; +import org.apache.sshd.server.Environment; +import org.apache.sshd.server.ExitCallback; +import org.kohsuke.args4j.Argument; +import org.kohsuke.args4j.CmdLineException; +import org.kohsuke.args4j.Option; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public abstract class BaseCommand implements Command { private static final Logger log = LoggerFactory.getLogger(BaseCommand.class); @@ -74,24 +72,17 @@ public abstract class BaseCommand implements Command { private ExitCallback exit; - @Inject - private SshScope sshScope; + @Inject private SshScope sshScope; - @Inject - private CmdLineParser.Factory cmdLineParserFactory; + @Inject private CmdLineParser.Factory cmdLineParserFactory; - @Inject - private RequestCleanup cleanup; + @Inject private RequestCleanup cleanup; - @Inject - @CommandExecutor - private WorkQueue.Executor executor; + @Inject @CommandExecutor private WorkQueue.Executor executor; - @Inject - private CurrentUser user; + @Inject private CurrentUser user; - @Inject - private SshScope.Context context; + @Inject private SshScope.Context context; /** Commands declared by a plugin can be scoped by the plugin name. */ @Inject(optional = true) @@ -162,10 +153,10 @@ public abstract class BaseCommand implements Command { /** * Pass all state into the command, then run its start method. - *

        - * This method copies all critical state, like the input and output streams, - * into the supplied command. The caller must still invoke {@code cmd.start()} - * if wants to pass control to the command. + * + *

        This method copies all critical state, like the input and output streams, into the supplied + * command. The caller must still invoke {@code cmd.start()} if wants to pass control to the + * command. * * @param cmd the command that will receive the current state. */ @@ -178,8 +169,8 @@ public abstract class BaseCommand implements Command { /** * Parses the command line argument, injecting parsed values into fields. - *

        - * This method must be explicitly invoked to cause a parse. + * + *

        This method must be explicitly invoked to cause a parse. * * @throws UnloggedFailure if the command line arguments were invalid. * @see Option @@ -191,11 +182,11 @@ public abstract class BaseCommand implements Command { /** * Parses the command line argument, injecting parsed values into fields. - *

        - * This method must be explicitly invoked to cause a parse. * - * @param options object whose fields declare Option and Argument annotations - * to describe the parameters of the command. Usually {@code this}. + *

        This method must be explicitly invoked to cause a parse. + * + * @param options object whose fields declare Option and Argument annotations to describe the + * parameters of the command. Usually {@code this}. * @throws UnloggedFailure if the command line arguments were invalid. * @see Option * @see Argument @@ -229,9 +220,8 @@ public abstract class BaseCommand implements Command { /** * Spawn a function into its own thread. - *

        - * Typically this should be invoked within {@link Command#start(Environment)}, - * such as: + * + *

        Typically this should be invoked within {@link Command#start(Environment)}, such as: * *

            * startThread(new Runnable() {
        @@ -241,23 +231,22 @@ public abstract class BaseCommand implements Command {
            * });
            * 
        * - * @param thunk the runnable to execute on the thread, performing the - * command's logic. + * @param thunk the runnable to execute on the thread, performing the command's logic. */ protected void startThread(final Runnable thunk) { - startThread(new CommandRunnable() { - @Override - public void run() throws Exception { - thunk.run(); - } - }); + startThread( + new CommandRunnable() { + @Override + public void run() throws Exception { + thunk.run(); + } + }); } /** * Spawn a function into its own thread. - *

        - * Typically this should be invoked within {@link Command#start(Environment)}, - * such as: + * + *

        Typically this should be invoked within {@link Command#start(Environment)}, such as: * *

            * startThread(new CommandRunnable() {
        @@ -266,18 +255,16 @@ public abstract class BaseCommand implements Command {
            *   }
            * });
            * 
        - *

        - * If the function throws an exception, it is translated to a simple message - * for the client, a non-zero exit code, and the stack trace is logged. * - * @param thunk the runnable to execute on the thread, performing the - * command's logic. + *

        If the function throws an exception, it is translated to a simple message for the client, a + * non-zero exit code, and the stack trace is logged. + * + * @param thunk the runnable to execute on the thread, performing the command's logic. */ protected void startThread(final CommandRunnable thunk) { final TaskThunk tt = new TaskThunk(thunk); - if (isAdminHighPriorityCommand() - && user.getCapabilities().canAdministrateServer()) { + if (isAdminHighPriorityCommand() && user.getCapabilities().canAdministrateServer()) { // Admin commands should not block the main work threads (there // might be an interactive shell there), nor should they wait // for the main work threads. @@ -294,10 +281,10 @@ public abstract class BaseCommand implements Command { /** * Terminate this command and return a result code to the remote client. - *

        - * Commands should invoke this at most once. Once invoked, the command may - * lose access to request based resources as any callbacks previously - * registered with {@link RequestCleanup} will fire. + * + *

        Commands should invoke this at most once. Once invoked, the command may lose access to + * request based resources as any callbacks previously registered with {@link RequestCleanup} will + * fire. * * @param rc exit code for the remote client. */ @@ -314,11 +301,9 @@ public abstract class BaseCommand implements Command { } private int handleError(final Throwable e) { - if ((e.getClass() == IOException.class - && "Pipe closed".equals(e.getMessage())) + if ((e.getClass() == IOException.class && "Pipe closed".equals(e.getMessage())) || // - (e.getClass() == SshException.class - && "Already closed".equals(e.getMessage())) + (e.getClass() == SshException.class && "Already closed".equals(e.getMessage())) || // e.getClass() == InterruptedIOException.class) { // This is sshd telling us the client just dropped off while @@ -355,7 +340,6 @@ public abstract class BaseCommand implements Command { log.warn("Cannot send failure message to client", e2); } return f.exitCode; - } try { @@ -507,9 +491,8 @@ public abstract class BaseCommand implements Command { /** * Create a new failure. * - * @param exitCode exit code to return the client, which indicates the - * failure status of this command. Should be between 1 and 255, - * inclusive. + * @param exitCode exit code to return the client, which indicates the failure status of this + * command. Should be between 1 and 255, inclusive. * @param msg message to also send to the client's stderr. */ public Failure(final int exitCode, final String msg) { @@ -519,12 +502,11 @@ public abstract class BaseCommand implements Command { /** * Create a new failure. * - * @param exitCode exit code to return the client, which indicates the - * failure status of this command. Should be between 1 and 255, - * inclusive. + * @param exitCode exit code to return the client, which indicates the failure status of this + * command. Should be between 1 and 255, inclusive. * @param msg message to also send to the client's stderr. - * @param why stack trace to include in the server's log, but is not sent to - * the client's stderr. + * @param why stack trace to include in the server's log, but is not sent to the client's + * stderr. */ public Failure(final int exitCode, final String msg, final Throwable why) { super(msg, why); @@ -548,9 +530,8 @@ public abstract class BaseCommand implements Command { /** * Create a new failure. * - * @param exitCode exit code to return the client, which indicates the - * failure status of this command. Should be between 1 and 255, - * inclusive. + * @param exitCode exit code to return the client, which indicates the failure status of this + * command. Should be between 1 and 255, inclusive. * @param msg message to also send to the client's stderr. */ public UnloggedFailure(final int exitCode, final String msg) { @@ -560,15 +541,13 @@ public abstract class BaseCommand implements Command { /** * Create a new failure. * - * @param exitCode exit code to return the client, which indicates the - * failure status of this command. Should be between 1 and 255, - * inclusive. + * @param exitCode exit code to return the client, which indicates the failure status of this + * command. Should be between 1 and 255, inclusive. * @param msg message to also send to the client's stderr. - * @param why stack trace to include in the server's log, but is not sent to - * the client's stderr. + * @param why stack trace to include in the server's log, but is not sent to the client's + * stderr. */ - public UnloggedFailure(final int exitCode, final String msg, - final Throwable why) { + public UnloggedFailure(final int exitCode, final String msg, final Throwable why) { super(exitCode, msg, why); } } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/ChangeArgumentParser.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/ChangeArgumentParser.java index 93a508cbbc..e956be37dd 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/ChangeArgumentParser.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/ChangeArgumentParser.java @@ -30,7 +30,6 @@ import com.google.gerrit.server.project.ProjectControl; import com.google.gerrit.sshd.BaseCommand.UnloggedFailure; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -46,7 +45,8 @@ public class ChangeArgumentParser { private final ChangeControl.GenericFactory changeControlFactory; @Inject - ChangeArgumentParser(CurrentUser currentUser, + ChangeArgumentParser( + CurrentUser currentUser, ChangesCollection changesCollection, ChangeFinder changeFinder, ReviewDb db, @@ -65,18 +65,20 @@ public class ChangeArgumentParser { addChange(id, changes, null); } - public void addChange(String id, Map changes, - ProjectControl projectControl) throws UnloggedFailure, OrmException { + public void addChange( + String id, Map changes, ProjectControl projectControl) + throws UnloggedFailure, OrmException { addChange(id, changes, projectControl, true); } - public void addChange(String id, Map changes, - ProjectControl projectControl, boolean useIndex) throws UnloggedFailure, - OrmException { + public void addChange( + String id, + Map changes, + ProjectControl projectControl, + boolean useIndex) + throws UnloggedFailure, OrmException { List matched = - useIndex ? - changeFinder.find(id, currentUser) : - changeFromNotesFactory(id, currentUser); + useIndex ? changeFinder.find(id, currentUser) : changeFromNotesFactory(id, currentUser); List toAdd = new ArrayList<>(changes.size()); for (ChangeControl ctl : matched) { if (!changes.containsKey(ctl.getId()) @@ -97,7 +99,8 @@ public class ChangeArgumentParser { private List changeFromNotesFactory(String id, CurrentUser currentUser) throws OrmException, UnloggedFailure { - return changeNotesFactory.create(db, parseId(id)) + return changeNotesFactory + .create(db, parseId(id)) .stream() .map(changeNote -> controlForChange(changeNote, currentUser)) .filter(changeControl -> changeControl.isPresent()) @@ -107,14 +110,13 @@ public class ChangeArgumentParser { private List parseId(String id) throws UnloggedFailure { try { - return Arrays.asList(new Change.Id(Integer.parseInt(id))); + return Arrays.asList(new Change.Id(Integer.parseInt(id))); } catch (NumberFormatException e) { throw new UnloggedFailure(2, "Invalid change ID " + id, e); } } - private Optional controlForChange(ChangeNotes change, - CurrentUser user) { + private Optional controlForChange(ChangeNotes change, CurrentUser user) { try { return Optional.of(changeControlFactory.controlFor(change, user)); } catch (NoSuchChangeException e) { @@ -130,4 +132,4 @@ public class ChangeArgumentParser { // No --project option, so they want every project. return true; } -} \ No newline at end of file +} diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandExecutor.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandExecutor.java index 1b50d88d8a..fa21c5818c 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandExecutor.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandExecutor.java @@ -18,11 +18,9 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.google.gerrit.server.git.WorkQueue.Executor; import com.google.inject.BindingAnnotation; - import java.lang.annotation.Retention; /** Marker on {@link Executor} used by SSH threads. */ @Retention(RUNTIME) @BindingAnnotation -public @interface CommandExecutor { -} +public @interface CommandExecutor {} diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandExecutorProvider.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandExecutorProvider.java index 5c6f80acd3..8c471447ac 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandExecutorProvider.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandExecutorProvider.java @@ -26,8 +26,7 @@ class CommandExecutorProvider implements Provider { private final CurrentUser user; @Inject - CommandExecutorProvider(QueueProvider queues, - CurrentUser user) { + CommandExecutorProvider(QueueProvider queues, CurrentUser user) { this.queues = queues; this.user = user; } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandExecutorQueueProvider.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandExecutorQueueProvider.java index 88e114272e..075dca3b00 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandExecutorQueueProvider.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandExecutorQueueProvider.java @@ -19,10 +19,8 @@ import com.google.gerrit.server.config.ThreadSettingsConfig; import com.google.gerrit.server.git.QueueProvider; import com.google.gerrit.server.git.WorkQueue; import com.google.inject.Inject; - -import org.eclipse.jgit.lib.Config; - import java.util.concurrent.ThreadFactory; +import org.eclipse.jgit.lib.Config; public class CommandExecutorQueueProvider implements QueueProvider { @@ -37,34 +35,33 @@ public class CommandExecutorQueueProvider implements QueueProvider { ThreadSettingsConfig threadsSettingsConfig, WorkQueue queues) { poolSize = threadsSettingsConfig.getSshdThreads(); - batchThreads = config.getInt("sshd", "batchThreads", - threadsSettingsConfig.getSshdBatchTreads()); + batchThreads = + config.getInt("sshd", "batchThreads", threadsSettingsConfig.getSshdBatchTreads()); if (batchThreads > poolSize) { poolSize += batchThreads; } int interactiveThreads = Math.max(1, poolSize - batchThreads); - interactiveExecutor = queues.createQueue(interactiveThreads, - "SSH-Interactive-Worker"); - if (batchThreads != 0) { + interactiveExecutor = queues.createQueue(interactiveThreads, "SSH-Interactive-Worker"); + if (batchThreads != 0) { batchExecutor = queues.createQueue(batchThreads, "SSH-Batch-Worker"); setThreadFactory(batchExecutor); } else { batchExecutor = interactiveExecutor; } setThreadFactory(interactiveExecutor); - } private void setThreadFactory(WorkQueue.Executor executor) { final ThreadFactory parent = executor.getThreadFactory(); - executor.setThreadFactory(new ThreadFactory() { - @Override - public Thread newThread(final Runnable task) { - final Thread t = parent.newThread(task); - t.setPriority(Thread.MIN_PRIORITY); - return t; - } - }); + executor.setThreadFactory( + new ThreadFactory() { + @Override + public Thread newThread(final Runnable task) { + final Thread t = parent.newThread(task); + t.setPriority(Thread.MIN_PRIORITY); + return t; + } + }); } @Override diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandFactoryProvider.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandFactoryProvider.java index ee4984b79e..c6d750c438 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandFactoryProvider.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandFactoryProvider.java @@ -25,17 +25,6 @@ import com.google.gwtorm.server.SchemaFactory; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - -import org.apache.sshd.server.Command; -import org.apache.sshd.server.CommandFactory; -import org.apache.sshd.server.Environment; -import org.apache.sshd.server.ExitCallback; -import org.apache.sshd.server.SessionAware; -import org.apache.sshd.server.session.ServerSession; -import org.eclipse.jgit.lib.Config; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -47,15 +36,20 @@ import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; +import org.apache.sshd.server.Command; +import org.apache.sshd.server.CommandFactory; +import org.apache.sshd.server.Environment; +import org.apache.sshd.server.ExitCallback; +import org.apache.sshd.server.SessionAware; +import org.apache.sshd.server.session.ServerSession; +import org.eclipse.jgit.lib.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -/** - * Creates a CommandFactory using commands registered by {@link CommandModule}. - */ +/** Creates a CommandFactory using commands registered by {@link CommandModule}. */ @Singleton -class CommandFactoryProvider implements Provider, - LifecycleListener { - private static final Logger logger = LoggerFactory - .getLogger(CommandFactoryProvider.class); +class CommandFactoryProvider implements Provider, LifecycleListener { + private static final Logger logger = LoggerFactory.getLogger(CommandFactoryProvider.class); private final DispatchCommandProvider dispatcher; private final SshLog log; @@ -67,25 +61,28 @@ class CommandFactoryProvider implements Provider, @Inject CommandFactoryProvider( @CommandName(Commands.ROOT) final DispatchCommandProvider d, - @GerritServerConfig final Config cfg, final WorkQueue workQueue, - final SshLog l, final SshScope s, SchemaFactory sf) { + @GerritServerConfig final Config cfg, + final WorkQueue workQueue, + final SshLog l, + final SshScope s, + SchemaFactory sf) { dispatcher = d; log = l; sshScope = s; schemaFactory = sf; - int threads = cfg.getInt("sshd","commandStartThreads", 2); + int threads = cfg.getInt("sshd", "commandStartThreads", 2); startExecutor = workQueue.createQueue(threads, "SshCommandStart"); - destroyExecutor = Executors.newSingleThreadExecutor( - new ThreadFactoryBuilder() - .setNameFormat("SshCommandDestroy-%s") - .setDaemon(true) - .build()); + destroyExecutor = + Executors.newSingleThreadExecutor( + new ThreadFactoryBuilder() + .setNameFormat("SshCommandDestroy-%s") + .setDaemon(true) + .build()); } @Override - public void start() { - } + public void start() {} @Override public void stop() { @@ -152,22 +149,28 @@ class CommandFactoryProvider implements Provider, public void start(final Environment env) throws IOException { this.env = env; final Context ctx = this.ctx; - task.set(startExecutor.submit(new Runnable() { - @Override - public void run() { - try { - onStart(); - } catch (Exception e) { - logger.warn("Cannot start command \"" + ctx.getCommandLine() - + "\" for user " + ctx.getSession().getUsername(), e); - } - } + task.set( + startExecutor.submit( + new Runnable() { + @Override + public void run() { + try { + onStart(); + } catch (Exception e) { + logger.warn( + "Cannot start command \"" + + ctx.getCommandLine() + + "\" for user " + + ctx.getSession().getUsername(), + e); + } + } - @Override - public String toString() { - return "start (user " + ctx.getSession().getUsername() + ")"; - } - })); + @Override + public String toString() { + return "start (user " + ctx.getSession().getUsername() + ")"; + } + })); } private void onStart() throws IOException { @@ -179,19 +182,20 @@ class CommandFactoryProvider implements Provider, cmd.setInputStream(in); cmd.setOutputStream(out); cmd.setErrorStream(err); - cmd.setExitCallback(new ExitCallback() { - @Override - public void onExit(int rc, String exitMessage) { - exit.onExit(translateExit(rc), exitMessage); - log(rc); - } + cmd.setExitCallback( + new ExitCallback() { + @Override + public void onExit(int rc, String exitMessage) { + exit.onExit(translateExit(rc), exitMessage); + log(rc); + } - @Override - public void onExit(int rc) { - exit.onExit(translateExit(rc)); - log(rc); - } - }); + @Override + public void onExit(int rc) { + exit.onExit(translateExit(rc)); + log(rc); + } + }); cmd.start(env); } finally { sshScope.set(old); @@ -226,12 +230,13 @@ class CommandFactoryProvider implements Provider, Future future = task.getAndSet(null); if (future != null) { future.cancel(true); - destroyExecutor.execute(new Runnable() { - @Override - public void run() { - onDestroy(); - } - }); + destroyExecutor.execute( + new Runnable() { + @Override + public void run() { + onDestroy(); + } + }); } } @@ -258,7 +263,7 @@ class CommandFactoryProvider implements Provider, boolean inquote = false; boolean inDblQuote = false; StringBuilder r = new StringBuilder(); - for (int ip = 0; ip < commandLine.length();) { + for (int ip = 0; ip < commandLine.length(); ) { final char b = commandLine.charAt(ip++); switch (b) { case '\t': diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandMetaData.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandMetaData.java index 5b8f5fac40..12d0890b1e 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandMetaData.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandMetaData.java @@ -21,19 +21,24 @@ import java.lang.annotation.Retention; import java.lang.annotation.Target; /** - * Annotation tagged on a concrete Command to describe what it is doing and - * whether it can be run on slaves. + * Annotation tagged on a concrete Command to describe what it is doing and whether it can be run on + * slaves. */ @Target({ElementType.TYPE}) @Retention(RUNTIME) public @interface CommandMetaData { enum Mode { - MASTER, MASTER_OR_SLAVE; + MASTER, + MASTER_OR_SLAVE; + public boolean isSupported(boolean slaveMode) { return this == MASTER_OR_SLAVE || !slaveMode; } } + String name(); + String description() default ""; + Mode runsAt() default Mode.MASTER; } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandModule.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandModule.java index 1e409d2502..54ffba6451 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandModule.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandModule.java @@ -16,7 +16,6 @@ package com.google.gerrit.sshd; import com.google.gerrit.lifecycle.LifecycleModule; import com.google.inject.binder.LinkedBindingBuilder; - import org.apache.sshd.server.Command; /** Module to register commands in the SSH daemon. */ @@ -26,10 +25,8 @@ public abstract class CommandModule extends LifecycleModule { /** * Configure a command to be invoked by name. * - * @param name the name of the command the client will provide in order to - * call the command. - * @return a binding that must be bound to a non-singleton provider for a - * {@link Command} object. + * @param name the name of the command the client will provide in order to call the command. + * @return a binding that must be bound to a non-singleton provider for a {@link Command} object. */ protected LinkedBindingBuilder command(final String name) { return bind(Commands.key(name)); @@ -38,10 +35,8 @@ public abstract class CommandModule extends LifecycleModule { /** * Configure a command to be invoked by name. * - * @param name the name of the command the client will provide in order to - * call the command. - * @return a binding that must be bound to a non-singleton provider for a - * {@link Command} object. + * @param name the name of the command the client will provide in order to call the command. + * @return a binding that must be bound to a non-singleton provider for a {@link Command} object. */ protected LinkedBindingBuilder command(final CommandName name) { return bind(Commands.key(name)); @@ -50,28 +45,22 @@ public abstract class CommandModule extends LifecycleModule { /** * Configure a command to be invoked by name. * - * @param parent context of the parent command, that this command is a - * subcommand of. - * @param name the name of the command the client will provide in order to - * call the command. - * @return a binding that must be bound to a non-singleton provider for a - * {@link Command} object. + * @param parent context of the parent command, that this command is a subcommand of. + * @param name the name of the command the client will provide in order to call the command. + * @return a binding that must be bound to a non-singleton provider for a {@link Command} object. */ - protected LinkedBindingBuilder command(final CommandName parent, - final String name) { + protected LinkedBindingBuilder command(final CommandName parent, final String name) { return bind(Commands.key(parent, name)); } /** * Configure a command to be invoked by name. The command is bound to the passed class. * - * @param parent context of the parent command, that this command is a - * subcommand of. - * @param clazz class of the command with {@link CommandMetaData} annotation - * to retrieve the name and the description from + * @param parent context of the parent command, that this command is a subcommand of. + * @param clazz class of the command with {@link CommandMetaData} annotation to retrieve the name + * and the description from */ - protected void command(final CommandName parent, - final Class clazz) { + protected void command(final CommandName parent, final Class clazz) { CommandMetaData meta = clazz.getAnnotation(CommandMetaData.class); if (meta == null) { throw new IllegalStateException("no CommandMetaData annotation found"); @@ -84,15 +73,13 @@ public abstract class CommandModule extends LifecycleModule { /** * Alias one command to another. The alias is bound to the passed class. * - * @param parent context of the parent command, that this command is a - * subcommand of. - * @param name the name of the command the client will provide in order to - * call the command. - * @param clazz class of the command with {@link CommandMetaData} annotation - * to retrieve the description from + * @param parent context of the parent command, that this command is a subcommand of. + * @param name the name of the command the client will provide in order to call the command. + * @param clazz class of the command with {@link CommandMetaData} annotation to retrieve the + * description from */ - protected void alias(final CommandName parent, final String name, - final Class clazz) { + protected void alias( + final CommandName parent, final String name, final Class clazz) { CommandMetaData meta = clazz.getAnnotation(CommandMetaData.class); if (meta == null) { throw new IllegalStateException("no CommandMetaData annotation found"); @@ -103,10 +90,10 @@ public abstract class CommandModule extends LifecycleModule { /** * Alias one command to another. * - * @param from the new command name that when called will actually delegate to - * {@code to}'s implementation. - * @param to name of an already registered command that will perform the - * action when {@code from} is invoked by a client. + * @param from the new command name that when called will actually delegate to {@code to}'s + * implementation. + * @param to name of an already registered command that will perform the action when {@code from} + * is invoked by a client. */ protected void alias(final String from, final String to) { bind(Commands.key(from)).to(Commands.key(to)); diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandName.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandName.java index 09503bb3ee..846183183e 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandName.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandName.java @@ -17,13 +17,12 @@ package com.google.gerrit.sshd; import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.google.inject.BindingAnnotation; - import java.lang.annotation.Retention; /** * Name of a command registered in an SSH daemon. - *

        - * Use {@link Commands#key(String)} to construct a key for a command name. + * + *

        Use {@link Commands#key(String)} to construct a key for a command name. * * @see CommandModule#command(String) * @see Commands#key(String) diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandProvider.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandProvider.java index 9a7c97bbc5..200d3a0f27 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandProvider.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandProvider.java @@ -15,7 +15,6 @@ package com.google.gerrit.sshd; import com.google.inject.Provider; - import org.apache.sshd.server.Command; final class CommandProvider { diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/Commands.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/Commands.java index e9648193de..620ffbe84d 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/Commands.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/Commands.java @@ -16,10 +16,8 @@ package com.google.gerrit.sshd; import com.google.auto.value.AutoAnnotation; import com.google.inject.Key; - -import org.apache.sshd.server.Command; - import java.lang.annotation.Annotation; +import org.apache.sshd.server.Command; /** Utilities to support {@link CommandName} construction. */ public class Commands { @@ -37,13 +35,11 @@ public class Commands { return Key.get(Command.class, name); } - public static Key key(final CommandName parent, - final String name) { + public static Key key(final CommandName parent, final String name) { return Key.get(Command.class, named(parent, name)); } - public static Key key(final CommandName parent, - final String name, final String descr) { + public static Key key(final CommandName parent, final String name, final String descr) { return Key.get(Command.class, named(parent, name, descr)); } @@ -59,8 +55,7 @@ public class Commands { } /** Create a CommandName annotation for the supplied name and description. */ - public static CommandName named(final CommandName parent, final String name, - final String descr) { + public static CommandName named(final CommandName parent, final String name, final String descr) { return new NestedCommandNameImpl(parent, name, descr); } @@ -101,8 +96,7 @@ public class Commands { this.descr = ""; } - NestedCommandNameImpl(final CommandName parent, final String name, - final String descr) { + NestedCommandNameImpl(final CommandName parent, final String name, final String descr) { this.parent = parent; this.name = name; this.descr = descr; @@ -140,6 +134,5 @@ public class Commands { } } - private Commands() { - } + private Commands() {} } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DatabasePubKeyAuth.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DatabasePubKeyAuth.java index 3adc8d1901..5f425d1aa5 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DatabasePubKeyAuth.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DatabasePubKeyAuth.java @@ -25,17 +25,6 @@ import com.google.gerrit.server.PeerDaemonUser; import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.config.SitePaths; import com.google.inject.Inject; - -import org.apache.commons.codec.binary.Base64; -import org.apache.sshd.common.SshException; -import org.apache.sshd.common.keyprovider.KeyPairProvider; -import org.apache.sshd.common.util.buffer.ByteArrayBuffer; -import org.apache.sshd.server.auth.pubkey.PublickeyAuthenticator; -import org.apache.sshd.server.session.ServerSession; -import org.eclipse.jgit.lib.Config; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.BufferedReader; import java.io.IOException; import java.nio.file.Files; @@ -48,13 +37,19 @@ import java.util.Collections; import java.util.HashSet; import java.util.Locale; import java.util.Set; +import org.apache.commons.codec.binary.Base64; +import org.apache.sshd.common.SshException; +import org.apache.sshd.common.keyprovider.KeyPairProvider; +import org.apache.sshd.common.util.buffer.ByteArrayBuffer; +import org.apache.sshd.server.auth.pubkey.PublickeyAuthenticator; +import org.apache.sshd.server.session.ServerSession; +import org.eclipse.jgit.lib.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -/** - * Authenticates by public key through {@link AccountSshKey} entities. - */ +/** Authenticates by public key through {@link AccountSshKey} entities. */ class DatabasePubKeyAuth implements PublickeyAuthenticator { - private static final Logger log = - LoggerFactory.getLogger(DatabasePubKeyAuth.class); + private static final Logger log = LoggerFactory.getLogger(DatabasePubKeyAuth.class); private final SshKeyCacheImpl sshKeyCache; private final SshLog sshLog; @@ -66,10 +61,15 @@ class DatabasePubKeyAuth implements PublickeyAuthenticator { private volatile PeerKeyCache peerKeyCache; @Inject - DatabasePubKeyAuth(final SshKeyCacheImpl skc, final SshLog l, - final IdentifiedUser.GenericFactory uf, final PeerDaemonUser.Factory pf, - final SitePaths site, final KeyPairProvider hostKeyProvider, - @GerritServerConfig final Config cfg, final SshScope s) { + DatabasePubKeyAuth( + final SshKeyCacheImpl skc, + final SshLog l, + final IdentifiedUser.GenericFactory uf, + final PeerDaemonUser.Factory pf, + final SitePaths site, + final KeyPairProvider hostKeyProvider, + @GerritServerConfig final Config cfg, + final SshScope s) { sshKeyCache = skc; sshLog = l; userFactory = uf; @@ -87,8 +87,8 @@ class DatabasePubKeyAuth implements PublickeyAuthenticator { return keys; } - private static void addPublicKey(final Collection out, - final KeyPairProvider p, final String type) { + private static void addPublicKey( + final Collection out, final KeyPairProvider p, final String type) { final KeyPair pair = p.loadKey(type); if (pair != null && pair.getPublic() != null) { out.add(pair.getPublic()); @@ -96,16 +96,13 @@ class DatabasePubKeyAuth implements PublickeyAuthenticator { } @Override - public boolean authenticate(String username, PublicKey suppliedKey, - ServerSession session) { + public boolean authenticate(String username, PublicKey suppliedKey, ServerSession session) { SshSession sd = session.getAttribute(SshSession.KEY); Preconditions.checkState(sd.getUser() == null); if (PeerDaemonUser.USER_NAME.equals(username)) { - if (myHostKeys.contains(suppliedKey) - || getPeerKeys().contains(suppliedKey)) { + if (myHostKeys.contains(suppliedKey) || getPeerKeys().contains(suppliedKey)) { PeerDaemonUser user = peerFactory.create(sd.getRemoteAddress()); return SshUtil.success(username, session, sshScope, sshLog, sd, user); - } sd.authenticationError(username, "no-matching-key"); return false; @@ -161,8 +158,8 @@ class DatabasePubKeyAuth implements PublickeyAuthenticator { return p.keys; } - private SshKeyCacheEntry find(final Iterable keyList, - final PublicKey suppliedKey) { + private SshKeyCacheEntry find( + final Iterable keyList, final PublicKey suppliedKey) { for (final SshKeyCacheEntry k : keyList) { if (k.match(suppliedKey)) { return k; diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommand.java index f3243c6dc1..2f3d10f61b 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommand.java @@ -24,21 +24,17 @@ import com.google.gerrit.server.account.CapabilityUtils; import com.google.gerrit.server.args4j.SubcommandHandler; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - -import org.apache.sshd.server.Command; -import org.apache.sshd.server.Environment; -import org.kohsuke.args4j.Argument; - import java.io.IOException; import java.io.StringWriter; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicReference; +import org.apache.sshd.server.Command; +import org.apache.sshd.server.Environment; +import org.kohsuke.args4j.Argument; -/** - * Command that dispatches to a subcommand from its command table. - */ +/** Command that dispatches to a subcommand from its command table. */ final class DispatchCommand extends BaseCommand { interface Factory { DispatchCommand create(Map map); @@ -55,8 +51,7 @@ final class DispatchCommand extends BaseCommand { private List args = new ArrayList<>(); @Inject - DispatchCommand(CurrentUser cu, - @Assisted final Map all) { + DispatchCommand(CurrentUser cu, @Assisted final Map all) { currentUser = cu; commands = all; atomicCmd = Atomics.newReference(); @@ -79,8 +74,10 @@ final class DispatchCommand extends BaseCommand { final CommandProvider p = commands.get(commandName); if (p == null) { String msg = - (getName().isEmpty() ? "Gerrit Code Review" : getName()) + ": " - + commandName + ": not found"; + (getName().isEmpty() ? "Gerrit Code Review" : getName()) + + ": " + + commandName + + ": not found"; throw die(msg); } @@ -114,18 +111,15 @@ final class DispatchCommand extends BaseCommand { } } - private void checkRequiresCapability(Command cmd) - throws UnloggedFailure { + private void checkRequiresCapability(Command cmd) throws UnloggedFailure { String pluginName = null; if (cmd instanceof BaseCommand) { pluginName = ((BaseCommand) cmd).getPluginName(); } try { - CapabilityUtils.checkRequiresCapability(currentUser, - pluginName, cmd.getClass()); + CapabilityUtils.checkRequiresCapability(currentUser, pluginName, cmd.getClass()); } catch (AuthException e) { - throw new UnloggedFailure(BaseCommand.STATUS_NOT_ADMIN, - e.getMessage()); + throw new UnloggedFailure(BaseCommand.STATUS_NOT_ADMIN, e.getMessage()); } } @@ -161,8 +155,7 @@ final class DispatchCommand extends BaseCommand { for (String name : Sets.newTreeSet(commands.keySet())) { final CommandProvider p = commands.get(name); usage.append(" "); - usage.append(String.format(format, name, - Strings.nullToEmpty(p.getDescription()))); + usage.append(String.format(format, name, Strings.nullToEmpty(p.getDescription()))); usage.append("\n"); } usage.append("\n"); diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommandProvider.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommandProvider.java index ce1da95fed..2a88f63b2c 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommandProvider.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommandProvider.java @@ -21,22 +21,16 @@ import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Provider; import com.google.inject.TypeLiteral; - -import org.apache.sshd.server.Command; - import java.lang.annotation.Annotation; import java.util.List; import java.util.concurrent.ConcurrentMap; +import org.apache.sshd.server.Command; -/** - * Creates DispatchCommand using commands registered by {@link CommandModule}. - */ +/** Creates DispatchCommand using commands registered by {@link CommandModule}. */ public class DispatchCommandProvider implements Provider { - @Inject - private Injector injector; + @Inject private Injector injector; - @Inject - private DispatchCommand.Factory factory; + @Inject private DispatchCommand.Factory factory; private final CommandName parent; private volatile ConcurrentMap map; @@ -50,8 +44,7 @@ public class DispatchCommandProvider implements Provider { return factory.create(getMap()); } - public RegistrationHandle register(final CommandName name, - final Provider cmd) { + public RegistrationHandle register(final CommandName name, final Provider cmd) { final ConcurrentMap m = getMap(); final CommandProvider commandProvider = new CommandProvider(cmd, null); if (m.putIfAbsent(name.value(), commandProvider) != null) { @@ -65,8 +58,7 @@ public class DispatchCommandProvider implements Provider { }; } - public RegistrationHandle replace(final CommandName name, - final Provider cmd) { + public RegistrationHandle replace(final CommandName name, final Provider cmd) { final ConcurrentMap m = getMap(); final CommandProvider commandProvider = new CommandProvider(cmd, null); m.put(name.value(), commandProvider); @@ -99,20 +91,17 @@ public class DispatchCommandProvider implements Provider { if (!Commands.CMD_ROOT.equals(n) && Commands.isChild(parent, n)) { String descr = null; if (annotation instanceof Commands.NestedCommandNameImpl) { - Commands.NestedCommandNameImpl impl = - ((Commands.NestedCommandNameImpl) annotation); + Commands.NestedCommandNameImpl impl = ((Commands.NestedCommandNameImpl) annotation); descr = impl.descr(); } - m.put(n.value(), - new CommandProvider((Provider) b.getProvider(), descr)); + m.put(n.value(), new CommandProvider((Provider) b.getProvider(), descr)); } } } return m; } - private static final TypeLiteral type = - new TypeLiteral() {}; + private static final TypeLiteral type = new TypeLiteral() {}; private List> allCommands() { return injector.findBindingsByType(type); diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/GerritGSSAuthenticator.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/GerritGSSAuthenticator.java index b33155523d..0b1f3aea9c 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/GerritGSSAuthenticator.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/GerritGSSAuthenticator.java @@ -22,16 +22,12 @@ import com.google.gerrit.server.account.AccountState; import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; import com.google.inject.Singleton; - +import java.util.Locale; import org.apache.sshd.server.auth.gss.GSSAuthenticator; import org.apache.sshd.server.session.ServerSession; import org.eclipse.jgit.lib.Config; -import java.util.Locale; - -/** - * Authenticates users with kerberos (gssapi-with-mic). - */ +/** Authenticates users with kerberos (gssapi-with-mic). */ @Singleton class GerritGSSAuthenticator extends GSSAuthenticator { private final AccountCache accounts; @@ -41,7 +37,8 @@ class GerritGSSAuthenticator extends GSSAuthenticator { private final Config config; @Inject - GerritGSSAuthenticator(AccountCache accounts, + GerritGSSAuthenticator( + AccountCache accounts, SshScope sshScope, SshLog sshLog, IdentifiedUser.GenericFactory userFactory, @@ -54,8 +51,7 @@ class GerritGSSAuthenticator extends GSSAuthenticator { } @Override - public boolean validateIdentity(final ServerSession session, - final String identity) { + public boolean validateIdentity(final ServerSession session, final String identity) { final SshSession sd = session.getAttribute(SshSession.KEY); int at = identity.indexOf('@'); String username; @@ -71,7 +67,12 @@ class GerritGSSAuthenticator extends GSSAuthenticator { Account account = state == null ? null : state.getAccount(); boolean active = account != null && account.isActive(); if (active) { - return SshUtil.success(username, session, sshScope, sshLog, sd, + return SshUtil.success( + username, + session, + sshScope, + sshLog, + sd, SshUtil.createUser(sd, userFactory, account.getId())); } return false; diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/HostKeyProvider.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/HostKeyProvider.java index 8190836e83..c245667163 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/HostKeyProvider.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/HostKeyProvider.java @@ -18,17 +18,15 @@ import com.google.gerrit.server.config.SitePaths; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.ProvisionException; - -import org.apache.sshd.common.keyprovider.AbstractFileKeyPairProvider; -import org.apache.sshd.common.keyprovider.KeyPairProvider; -import org.apache.sshd.common.util.SecurityUtils; -import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider; - import java.io.File; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; +import org.apache.sshd.common.keyprovider.AbstractFileKeyPairProvider; +import org.apache.sshd.common.keyprovider.KeyPairProvider; +import org.apache.sshd.common.util.SecurityUtils; +import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider; class HostKeyProvider implements Provider { private final SitePaths site; @@ -57,21 +55,22 @@ class HostKeyProvider implements Provider { SimpleGeneratorHostKeyProvider p = new SimpleGeneratorHostKeyProvider(); p.setPath(objKey.toAbsolutePath()); return p; - } // Both formats of host key exist, we don't know which format // should be authoritative. Complain and abort. // stdKeys.add(objKey.toAbsolutePath().toFile()); throw new ProvisionException("Multiple host keys exist: " + stdKeys); - } if (stdKeys.isEmpty()) { throw new ProvisionException("No SSH keys under " + site.etc_dir); } if (!SecurityUtils.isBouncyCastleRegistered()) { - throw new ProvisionException("Bouncy Castle Crypto not installed;" - + " needed to read server host keys: " + stdKeys + ""); + throw new ProvisionException( + "Bouncy Castle Crypto not installed;" + + " needed to read server host keys: " + + stdKeys + + ""); } AbstractFileKeyPairProvider kp = SecurityUtils.createFileKeyPairProvider(); kp.setFiles(stdKeys); diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/NoShell.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/NoShell.java index 0207ede598..eafdcd6d28 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/NoShell.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/NoShell.java @@ -23,7 +23,11 @@ import com.google.gerrit.sshd.SshScope.Context; import com.google.gwtorm.server.SchemaFactory; import com.google.inject.Inject; import com.google.inject.Provider; - +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.MalformedURLException; +import java.net.URL; import org.apache.sshd.common.Factory; import org.apache.sshd.server.Command; import org.apache.sshd.server.Environment; @@ -33,18 +37,11 @@ import org.apache.sshd.server.session.ServerSession; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.util.SystemReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.MalformedURLException; -import java.net.URL; - /** * Dummy shell which prints a message and terminates. - *

        - * This implementation is used to ensure clients who try to SSH directly to this - * server without supplying a command will get a reasonable error message, but - * cannot continue further. + * + *

        This implementation is used to ensure clients who try to SSH directly to this server without + * supplying a command will get a reasonable error message, but cannot continue further. */ class NoShell implements Factory { private final Provider shell; @@ -71,8 +68,8 @@ class NoShell implements Factory { private Context context; @Inject - SendMessage(Provider messageFactory, - SchemaFactory sf, SshScope sshScope) { + SendMessage( + Provider messageFactory, SchemaFactory sf, SshScope sshScope) { this.messageFactory = messageFactory; this.schemaFactory = sf; this.sshScope = sshScope; @@ -123,8 +120,7 @@ class NoShell implements Factory { } @Override - public void destroy() { - } + public void destroy() {} } static class MessageFactory { @@ -133,8 +129,8 @@ class NoShell implements Factory { private final Provider urlProvider; @Inject - MessageFactory(IdentifiedUser user, SshInfo sshInfo, - @CanonicalWebUrl Provider urlProvider) { + MessageFactory( + IdentifiedUser user, SshInfo sshInfo, @CanonicalWebUrl Provider urlProvider) { this.user = user; this.sshInfo = sshInfo; this.urlProvider = urlProvider; diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/PluginCommandModule.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/PluginCommandModule.java index b5378f1d4d..fe8197d43a 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/PluginCommandModule.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/PluginCommandModule.java @@ -18,7 +18,6 @@ import com.google.common.base.Preconditions; import com.google.gerrit.extensions.annotations.PluginName; import com.google.inject.Inject; import com.google.inject.binder.LinkedBindingBuilder; - import org.apache.sshd.server.Command; public abstract class PluginCommandModule extends CommandModule { @@ -50,5 +49,4 @@ public abstract class PluginCommandModule extends CommandModule { protected void alias(final String name, Class clazz) { alias(command, name, clazz); } - } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SingleCommandPluginModule.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SingleCommandPluginModule.java index 14911b5245..079661ad02 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SingleCommandPluginModule.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SingleCommandPluginModule.java @@ -18,13 +18,12 @@ import com.google.common.base.Preconditions; import com.google.gerrit.extensions.annotations.PluginName; import com.google.inject.Inject; import com.google.inject.binder.LinkedBindingBuilder; - import org.apache.sshd.server.Command; /** * Binds one SSH command to the plugin name itself. - *

        - * Cannot be combined with {@link PluginCommandModule}. + * + *

        Cannot be combined with {@link PluginCommandModule}. */ public abstract class SingleCommandPluginModule extends CommandModule { private CommandName command; diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshAutoRegisterModuleGenerator.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshAutoRegisterModuleGenerator.java index effed2cc18..0fdde816ce 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshAutoRegisterModuleGenerator.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshAutoRegisterModuleGenerator.java @@ -25,25 +25,19 @@ import com.google.gerrit.server.plugins.ModuleGenerator; import com.google.inject.AbstractModule; import com.google.inject.Module; import com.google.inject.TypeLiteral; - -import org.apache.sshd.server.Command; - import java.lang.annotation.Annotation; import java.util.HashMap; import java.util.Map; +import org.apache.sshd.server.Command; -class SshAutoRegisterModuleGenerator - extends AbstractModule - implements ModuleGenerator { +class SshAutoRegisterModuleGenerator extends AbstractModule implements ModuleGenerator { private final Map> commands = new HashMap<>(); - private final ListMultimap, Class> listeners = - LinkedListMultimap.create(); + private final ListMultimap, Class> listeners = LinkedListMultimap.create(); private CommandName command; @Override protected void configure() { - bind(Commands.key(command)) - .toProvider(new DispatchCommandProvider(command)); + bind(Commands.key(command)).toProvider(new DispatchCommandProvider(command)); for (Map.Entry> e : commands.entrySet()) { bind(Commands.key(command, e.getKey())).to(e.getValue()); } @@ -66,26 +60,25 @@ class SshAutoRegisterModuleGenerator @SuppressWarnings("unchecked") @Override - public void export(Export export, Class type) - throws InvalidPluginException { + public void export(Export export, Class type) throws InvalidPluginException { Preconditions.checkState(command != null, "pluginName must be provided"); if (Command.class.isAssignableFrom(type)) { Class old = commands.get(export.value()); if (old != null) { - throw new InvalidPluginException(String.format( - "@Export(\"%s\") has duplicate bindings:\n %s\n %s", - export.value(), old.getName(), type.getName())); + throw new InvalidPluginException( + String.format( + "@Export(\"%s\") has duplicate bindings:\n %s\n %s", + export.value(), old.getName(), type.getName())); } commands.put(export.value(), (Class) type); } else { - throw new InvalidPluginException(String.format( - "Class %s with @Export(\"%s\") must extend %s or implement %s", - type.getName(), export.value(), - SshCommand.class.getName(), Command.class.getName())); + throw new InvalidPluginException( + String.format( + "Class %s with @Export(\"%s\") must extend %s or implement %s", + type.getName(), export.value(), SshCommand.class.getName(), Command.class.getName())); } } - @Override public void listen(TypeLiteral tl, Class clazz) { listeners.put(tl, clazz); diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshCommand.java index f6209babff..3e42ebee09 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshCommand.java @@ -14,10 +14,9 @@ package com.google.gerrit.sshd; -import org.apache.sshd.server.Environment; - import java.io.IOException; import java.io.PrintWriter; +import org.apache.sshd.server.Environment; public abstract class SshCommand extends BaseCommand { protected PrintWriter stdout; @@ -25,20 +24,21 @@ public abstract class SshCommand extends BaseCommand { @Override public void start(Environment env) throws IOException { - startThread(new CommandRunnable() { - @Override - public void run() throws Exception { - parseCommandLine(); - stdout = toPrintWriter(out); - stderr = toPrintWriter(err); - try { - SshCommand.this.run(); - } finally { - stdout.flush(); - stderr.flush(); - } - } - }); + startThread( + new CommandRunnable() { + @Override + public void run() throws Exception { + parseCommandLine(); + stdout = toPrintWriter(out); + stderr = toPrintWriter(err); + try { + SshCommand.this.run(); + } finally { + stdout.flush(); + stderr.flush(); + } + } + }); } protected abstract void run() throws UnloggedFailure, Failure, Exception; diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshDaemon.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshDaemon.java index 466edf53aa..d5b1712341 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshDaemon.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshDaemon.java @@ -35,10 +35,32 @@ import com.google.gerrit.server.util.IdGenerator; import com.google.gerrit.server.util.SocketUtil; import com.google.inject.Inject; import com.google.inject.Singleton; - import com.jcraft.jsch.HostKey; import com.jcraft.jsch.JSchException; - +import java.io.File; +import java.io.IOException; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.net.UnknownHostException; +import java.nio.file.FileStore; +import java.nio.file.FileSystem; +import java.nio.file.Path; +import java.nio.file.PathMatcher; +import java.nio.file.WatchService; +import java.nio.file.attribute.UserPrincipalLookupService; +import java.nio.file.spi.FileSystemProvider; +import java.security.InvalidKeyException; +import java.security.KeyPair; +import java.security.PublicKey; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; import org.apache.mina.transport.socket.SocketSessionConfig; import org.apache.sshd.common.BaseBuilder; import org.apache.sshd.common.NamedFactory; @@ -90,54 +112,26 @@ import org.eclipse.jgit.lib.Config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.File; -import java.io.IOException; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.net.SocketAddress; -import java.net.UnknownHostException; -import java.nio.file.FileStore; -import java.nio.file.FileSystem; -import java.nio.file.Path; -import java.nio.file.PathMatcher; -import java.nio.file.WatchService; -import java.nio.file.attribute.UserPrincipalLookupService; -import java.nio.file.spi.FileSystemProvider; -import java.security.InvalidKeyException; -import java.security.KeyPair; -import java.security.PublicKey; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import java.util.concurrent.atomic.AtomicInteger; - /** * SSH daemon to communicate with Gerrit. - *

        - * Use a Git URL such as ssh://${email}@${host}:${port}/${path}, - * e.g. {@code ssh://sop@google.com@gerrit.com:8010/tools/gerrit.git} to - * access the SSH daemon itself. - *

        - * Versions of Git before 1.5.3 may require setting the username and port - * properties in the user's {@code ~/.ssh/config} file, and using a host - * alias through a URL such as {@code gerrit-alias:/tools/gerrit.git}: - *

        - * {@code
        + *
        + * 

        Use a Git URL such as ssh://${email}@${host}:${port}/${path}, e.g. {@code + * ssh://sop@google.com@gerrit.com:8010/tools/gerrit.git} to access the SSH daemon itself. + * + *

        Versions of Git before 1.5.3 may require setting the username and port properties in the + * user's {@code ~/.ssh/config} file, and using a host alias through a URL such as {@code + * gerrit-alias:/tools/gerrit.git}: + * + *

        {@code
          * Host gerrit-alias
          *  User sop@google.com
          *  Hostname gerrit.com
          *  Port 8010
        - * }
        - * 
        + * }
        */ @Singleton public class SshDaemon extends SshServer implements SshInfo, LifecycleListener { - private static final Logger sshDaemonLog = - LoggerFactory.getLogger(SshDaemon.class); + private static final Logger sshDaemonLog = LoggerFactory.getLogger(SshDaemon.class); public enum SshSessionBackend { MINA, @@ -152,11 +146,15 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener { private final Config cfg; @Inject - SshDaemon(final CommandFactory commandFactory, final NoShell noShell, + SshDaemon( + final CommandFactory commandFactory, + final NoShell noShell, final PublickeyAuthenticator userAuth, final GerritGSSAuthenticator kerberosAuth, - final KeyPairProvider hostKeyProvider, final IdGenerator idGenerator, - @GerritServerConfig final Config cfg, final SshLog sshLog, + final KeyPairProvider hostKeyProvider, + final IdGenerator idGenerator, + @GerritServerConfig final Config cfg, + final SshLog sshLog, @SshListenAddresses final List listen, @SshAdvertisedAddresses final List advertised, MetricMaker metricMaker) { @@ -167,52 +165,51 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener { this.advertised = advertised; keepAlive = cfg.getBoolean("sshd", "tcpkeepalive", true); - getProperties().put(SERVER_IDENTIFICATION, - "GerritCodeReview_" + Version.getVersion() // - + " (" + super.getVersion() + ")"); + getProperties() + .put( + SERVER_IDENTIFICATION, + "GerritCodeReview_" + + Version.getVersion() // + + " (" + + super.getVersion() + + ")"); - getProperties().put(MAX_AUTH_REQUESTS, - String.valueOf(cfg.getInt("sshd", "maxAuthTries", 6))); + getProperties().put(MAX_AUTH_REQUESTS, String.valueOf(cfg.getInt("sshd", "maxAuthTries", 6))); - getProperties().put( - AUTH_TIMEOUT, - String.valueOf(MILLISECONDS.convert(ConfigUtil.getTimeUnit(cfg, "sshd", - null, "loginGraceTime", 120, SECONDS), SECONDS))); + getProperties() + .put( + AUTH_TIMEOUT, + String.valueOf( + MILLISECONDS.convert( + ConfigUtil.getTimeUnit(cfg, "sshd", null, "loginGraceTime", 120, SECONDS), + SECONDS))); - long idleTimeoutSeconds = ConfigUtil.getTimeUnit(cfg, "sshd", null, - "idleTimeout", 0, SECONDS); - getProperties().put( - IDLE_TIMEOUT, - String.valueOf(SECONDS.toMillis(idleTimeoutSeconds))); + long idleTimeoutSeconds = ConfigUtil.getTimeUnit(cfg, "sshd", null, "idleTimeout", 0, SECONDS); + getProperties().put(IDLE_TIMEOUT, String.valueOf(SECONDS.toMillis(idleTimeoutSeconds))); - long rekeyTimeLimit = ConfigUtil.getTimeUnit(cfg, "sshd", null, - "rekeyTimeLimit", 3600, SECONDS); - getProperties().put( - REKEY_TIME_LIMIT, - String.valueOf(SECONDS.toMillis(rekeyTimeLimit))); + long rekeyTimeLimit = + ConfigUtil.getTimeUnit(cfg, "sshd", null, "rekeyTimeLimit", 3600, SECONDS); + getProperties().put(REKEY_TIME_LIMIT, String.valueOf(SECONDS.toMillis(rekeyTimeLimit))); - getProperties().put(REKEY_BYTES_LIMIT, - String.valueOf(cfg.getLong("sshd", "rekeyBytesLimit", 1024 * 1024 * 1024 /* 1GB */))); + getProperties() + .put( + REKEY_BYTES_LIMIT, + String.valueOf(cfg.getLong("sshd", "rekeyBytesLimit", 1024 * 1024 * 1024 /* 1GB */))); - final int maxConnectionsPerUser = - cfg.getInt("sshd", "maxConnectionsPerUser", 64); + final int maxConnectionsPerUser = cfg.getInt("sshd", "maxConnectionsPerUser", 64); if (0 < maxConnectionsPerUser) { - getProperties().put(MAX_CONCURRENT_SESSIONS, - String.valueOf(maxConnectionsPerUser)); + getProperties().put(MAX_CONCURRENT_SESSIONS, String.valueOf(maxConnectionsPerUser)); } - final String kerberosKeytab = cfg.getString( - "sshd", null, "kerberosKeytab"); - final String kerberosPrincipal = cfg.getString( - "sshd", null, "kerberosPrincipal"); + final String kerberosKeytab = cfg.getString("sshd", null, "kerberosKeytab"); + final String kerberosPrincipal = cfg.getString("sshd", null, "kerberosPrincipal"); - final boolean enableCompression = cfg.getBoolean( - "sshd", "enableCompression", false); + final boolean enableCompression = cfg.getBoolean("sshd", "enableCompression", false); - SshSessionBackend backend = cfg.getEnum( - "sshd", null, "backend", SshSessionBackend.NIO2); + SshSessionBackend backend = cfg.getEnum("sshd", null, "backend", SshSessionBackend.NIO2); - System.setProperty(IoServiceFactoryFactory.class.getName(), + System.setProperty( + IoServiceFactoryFactory.class.getName(), backend == SshSessionBackend.MINA ? MinaServiceFactoryFactory.class.getName() : Nio2ServiceFactoryFactory.class.getName()); @@ -240,9 +237,7 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener { metricMaker.newCallbackMetric( "sshd/sessions/connected", Integer.class, - new Description("Currently connected SSH sessions") - .setGauge() - .setUnit("sessions"), + new Description("Currently connected SSH sessions").setGauge().setUnit("sessions"), new Supplier() { @Override public Integer get() { @@ -250,66 +245,62 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener { } }); - final Counter0 sessionsCreated = metricMaker.newCounter( - "sshd/sessions/created", - new Description("Rate of new SSH sessions") - .setRate() - .setUnit("sessions")); + final Counter0 sessionsCreated = + metricMaker.newCounter( + "sshd/sessions/created", + new Description("Rate of new SSH sessions").setRate().setUnit("sessions")); - final Counter0 authFailures = metricMaker.newCounter( - "sshd/sessions/authentication_failures", - new Description("Rate of SSH authentication failures") - .setRate() - .setUnit("failures")); + final Counter0 authFailures = + metricMaker.newCounter( + "sshd/sessions/authentication_failures", + new Description("Rate of SSH authentication failures").setRate().setUnit("failures")); - setSessionFactory(new SessionFactory(this) { - @Override - protected ServerSessionImpl createSession(final IoSession io) - throws Exception { - connected.incrementAndGet(); - sessionsCreated.increment(); - if (io instanceof MinaSession) { - if (((MinaSession) io).getSession() - .getConfig() instanceof SocketSessionConfig) { - ((SocketSessionConfig) ((MinaSession) io).getSession() - .getConfig()) - .setKeepAlive(keepAlive); - } - } - - ServerSessionImpl s = super.createSession(io); - int id = idGenerator.next(); - SocketAddress peer = io.getRemoteAddress(); - final SshSession sd = new SshSession(id, peer); - s.setAttribute(SshSession.KEY, sd); - - // Log a session close without authentication as a failure. - // - s.addCloseFutureListener(new SshFutureListener() { + setSessionFactory( + new SessionFactory(this) { @Override - public void operationComplete(CloseFuture future) { - connected.decrementAndGet(); - if (sd.isAuthenticationError()) { - authFailures.increment(); - sshLog.onAuthFail(sd); + protected ServerSessionImpl createSession(final IoSession io) throws Exception { + connected.incrementAndGet(); + sessionsCreated.increment(); + if (io instanceof MinaSession) { + if (((MinaSession) io).getSession().getConfig() instanceof SocketSessionConfig) { + ((SocketSessionConfig) ((MinaSession) io).getSession().getConfig()) + .setKeepAlive(keepAlive); + } } + + ServerSessionImpl s = super.createSession(io); + int id = idGenerator.next(); + SocketAddress peer = io.getRemoteAddress(); + final SshSession sd = new SshSession(id, peer); + s.setAttribute(SshSession.KEY, sd); + + // Log a session close without authentication as a failure. + // + s.addCloseFutureListener( + new SshFutureListener() { + @Override + public void operationComplete(CloseFuture future) { + connected.decrementAndGet(); + if (sd.isAuthenticationError()) { + authFailures.increment(); + sshLog.onAuthFail(sd); + } + } + }); + return s; + } + + @Override + protected ServerSessionImpl doCreateSession(IoSession ioSession) throws Exception { + return new ServerSessionImpl(getServer(), ioSession); } }); - return s; - } - - @Override - protected ServerSessionImpl doCreateSession(IoSession ioSession) - throws Exception { - return new ServerSessionImpl(getServer(), ioSession); - } - }); - setGlobalRequestHandlers(Arrays.> asList( - new KeepAliveHandler(), - new NoMoreSessionsHandler(), - new TcpipForwardHandler(), - new CancelTcpipForwardHandler() - )); + setGlobalRequestHandlers( + Arrays.>asList( + new KeepAliveHandler(), + new NoMoreSessionsHandler(), + new TcpipForwardHandler(), + new CancelTcpipForwardHandler())); hostKeys = computeHostKeys(); } @@ -335,19 +326,17 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener { try { String listenAddress = cfg.getString("sshd", null, "listenAddress"); - boolean rewrite = !Strings.isNullOrEmpty(listenAddress) - && listenAddress.endsWith(":0"); + boolean rewrite = !Strings.isNullOrEmpty(listenAddress) && listenAddress.endsWith(":0"); daemonAcceptor.bind(listen); if (rewrite) { SocketAddress bound = Iterables.getOnlyElement(daemonAcceptor.getBoundAddresses()); - cfg.setString("sshd", null, "listenAddress", format((InetSocketAddress)bound)); + cfg.setString("sshd", null, "listenAddress", format((InetSocketAddress) bound)); } } catch (IOException e) { throw new IllegalStateException("Cannot bind to " + addressList(), e); } - sshDaemonLog.info(String.format("Started Gerrit %s on %s", - getVersion(), addressList())); + sshDaemonLog.info(String.format("Started Gerrit %s on %s", getVersion(), addressList())); } } @@ -408,8 +397,8 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener { return keys; } - private static void addPublicKey(final Collection out, - final KeyPairProvider p, final String type) { + private static void addPublicKey( + final Collection out, final KeyPairProvider p, final String type) { final KeyPair pair = p.loadKey(type); if (pair != null && pair.getPublic() != null) { out.add(pair.getPublic()); @@ -418,7 +407,7 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener { private String addressList() { final StringBuilder r = new StringBuilder(); - for (Iterator i = listen.iterator(); i.hasNext();) { + for (Iterator i = listen.iterator(); i.hasNext(); ) { r.append(SocketUtil.format(i.next(), IANA_SSH_PORT)); if (i.hasNext()) { r.append(", "); @@ -429,10 +418,9 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener { @SuppressWarnings("unchecked") private void initKeyExchanges(Config cfg) { - List> a = - ServerBuilder.setUpDefaultKeyExchanges(true); - setKeyExchangeFactories(filter(cfg, "kex", - (NamedFactory[])a.toArray(new NamedFactory[a.size()]))); + List> a = ServerBuilder.setUpDefaultKeyExchanges(true); + setKeyExchangeFactories( + filter(cfg, "kex", (NamedFactory[]) a.toArray(new NamedFactory[a.size()]))); } private void initProviderBouncyCastle(Config cfg) { @@ -484,7 +472,7 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener { public int random(int n) { if (n > 0) { if ((n & -n) == n) { - return (int)((n * (long) next(31)) >> 31); + return (int) ((n * (long) next(31)) >> 31); } int bits; int val; @@ -517,7 +505,7 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener { private void initCiphers(final Config cfg) { final List> a = BaseBuilder.setUpDefaultCiphers(true); - for (Iterator> i = a.iterator(); i.hasNext();) { + for (Iterator> i = a.iterator(); i.hasNext(); ) { final NamedFactory f = i.next(); try { final Cipher c = f.create(); @@ -525,8 +513,12 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener { final byte[] iv = new byte[c.getIVSize()]; c.init(Cipher.Mode.Encrypt, key, iv); } catch (InvalidKeyException e) { - sshDaemonLog.warn("Disabling cipher " + f.getName() + ": " + e.getMessage() - + "; try installing unlimited cryptography extension"); + sshDaemonLog.warn( + "Disabling cipher " + + f.getName() + + ": " + + e.getMessage() + + "; try installing unlimited cryptography extension"); i.remove(); } catch (Exception e) { sshDaemonLog.warn("Disabling cipher " + f.getName() + ": " + e.getMessage()); @@ -535,20 +527,20 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener { } a.add(null); - setCipherFactories(filter(cfg, "cipher", - (NamedFactory[])a.toArray(new NamedFactory[a.size()]))); + setCipherFactories( + filter(cfg, "cipher", (NamedFactory[]) a.toArray(new NamedFactory[a.size()]))); } @SuppressWarnings("unchecked") private void initMacs(Config cfg) { List> m = BaseBuilder.setUpDefaultMacs(true); - setMacFactories(filter(cfg, "mac", - (NamedFactory[]) m.toArray(new NamedFactory[m.size()]))); + setMacFactories( + filter(cfg, "mac", (NamedFactory[]) m.toArray(new NamedFactory[m.size()]))); } @SafeVarargs - private static List> filter(final Config cfg, - final String key, final NamedFactory... avail) { + private static List> filter( + final Config cfg, final String key, final NamedFactory... avail) { final ArrayList> def = new ArrayList<>(); for (final NamedFactory n : avail) { if (n == null) { @@ -579,8 +571,7 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener { final NamedFactory n = find(name, avail); if (n == null) { final StringBuilder msg = new StringBuilder(); - msg.append("sshd.").append(key).append(" = ").append(name) - .append(" unsupported; only "); + msg.append("sshd.").append(key).append(" = ").append(name).append(" unsupported; only "); for (int i = 0; i < avail.length; i++) { if (avail[i] == null) { continue; @@ -605,8 +596,7 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener { } @SafeVarargs - private static NamedFactory find(final String name, - final NamedFactory... avail) { + private static NamedFactory find(final String name, final NamedFactory... avail) { for (final NamedFactory n : avail) { if (n != null && name.equals(n.getName())) { return n; @@ -649,33 +639,37 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener { } private void initSubsystems() { - setSubsystemFactories(Collections.> emptyList()); + setSubsystemFactories(Collections.>emptyList()); } - private void initUserAuth(final PublickeyAuthenticator pubkey, + private void initUserAuth( + final PublickeyAuthenticator pubkey, final GSSAuthenticator kerberosAuthenticator, - String kerberosKeytab, String kerberosPrincipal) { + String kerberosKeytab, + String kerberosPrincipal) { List> authFactories = new ArrayList<>(); if (kerberosKeytab != null) { authFactories.add(UserAuthGSSFactory.INSTANCE); log.info("Enabling kerberos with keytab " + kerberosKeytab); if (!new File(kerberosKeytab).canRead()) { - sshDaemonLog.error("Keytab " + kerberosKeytab + - " does not exist or is not readable; further errors are possible"); + sshDaemonLog.error( + "Keytab " + + kerberosKeytab + + " does not exist or is not readable; further errors are possible"); } kerberosAuthenticator.setKeytabFile(kerberosKeytab); if (kerberosPrincipal == null) { try { - kerberosPrincipal = "host/" + - InetAddress.getLocalHost().getCanonicalHostName(); + kerberosPrincipal = "host/" + InetAddress.getLocalHost().getCanonicalHostName(); } catch (UnknownHostException e) { kerberosPrincipal = "host/localhost"; } } sshDaemonLog.info("Using kerberos principal " + kerberosPrincipal); if (!kerberosPrincipal.startsWith("host/")) { - sshDaemonLog.warn("Host principal does not start with host/ " + - "which most SSH clients will supply automatically"); + sshDaemonLog.warn( + "Host principal does not start with host/ " + + "which most SSH clients will supply automatically"); } kerberosAuthenticator.setServicePrincipalName(kerberosPrincipal); setGSSAuthenticator(kerberosAuthenticator); @@ -686,96 +680,96 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener { } private void initForwarding() { - setTcpipForwardingFilter(new ForwardingFilter() { - @Override - public boolean canForwardAgent(Session session) { - return false; - } + setTcpipForwardingFilter( + new ForwardingFilter() { + @Override + public boolean canForwardAgent(Session session) { + return false; + } - @Override - public boolean canForwardX11(Session session) { - return false; - } + @Override + public boolean canForwardX11(Session session) { + return false; + } - @Override - public boolean canListen(SshdSocketAddress address, Session session) { - return false; - } + @Override + public boolean canListen(SshdSocketAddress address, Session session) { + return false; + } - @Override - public boolean canConnect(Type type, SshdSocketAddress address, Session session) { - return false; - } - }); + @Override + public boolean canConnect(Type type, SshdSocketAddress address, Session session) { + return false; + } + }); setTcpipForwarderFactory(new DefaultTcpipForwarderFactory()); } private void initFileSystemFactory() { - setFileSystemFactory(new FileSystemFactory() { - @Override - public FileSystem createFileSystem(Session session) - throws IOException { - return new FileSystem() { + setFileSystemFactory( + new FileSystemFactory() { @Override - public void close() throws IOException { - } + public FileSystem createFileSystem(Session session) throws IOException { + return new FileSystem() { + @Override + public void close() throws IOException {} - @Override - public Iterable getFileStores() { - return null; - } + @Override + public Iterable getFileStores() { + return null; + } - @Override - public Path getPath(String arg0, String... arg1) { - return null; - } + @Override + public Path getPath(String arg0, String... arg1) { + return null; + } - @Override - public PathMatcher getPathMatcher(String arg0) { - return null; - } + @Override + public PathMatcher getPathMatcher(String arg0) { + return null; + } - @Override - public Iterable getRootDirectories() { - return null; - } + @Override + public Iterable getRootDirectories() { + return null; + } - @Override - public String getSeparator() { - return null; - } + @Override + public String getSeparator() { + return null; + } - @Override - public UserPrincipalLookupService getUserPrincipalLookupService() { - return null; - } + @Override + public UserPrincipalLookupService getUserPrincipalLookupService() { + return null; + } - @Override - public boolean isOpen() { - return false; - } + @Override + public boolean isOpen() { + return false; + } - @Override - public boolean isReadOnly() { - return false; - } + @Override + public boolean isReadOnly() { + return false; + } - @Override - public WatchService newWatchService() throws IOException { - return null; - } + @Override + public WatchService newWatchService() throws IOException { + return null; + } - @Override - public FileSystemProvider provider() { - return null; - } + @Override + public FileSystemProvider provider() { + return null; + } - @Override - public Set supportedFileAttributeViews() { - return null; + @Override + public Set supportedFileAttributeViews() { + return null; + } + }; } - }; - } - }); + }); } } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshHostKeyModule.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshHostKeyModule.java index 2f88fa97d6..d5b8eee044 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshHostKeyModule.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshHostKeyModule.java @@ -17,7 +17,6 @@ package com.google.gerrit.sshd; import static com.google.inject.Scopes.SINGLETON; import com.google.inject.AbstractModule; - import org.apache.sshd.common.keyprovider.KeyPairProvider; public class SshHostKeyModule extends AbstractModule { diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshKeyCacheEntry.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshKeyCacheEntry.java index 0d2f1fce28..2cab00b5fc 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshKeyCacheEntry.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshKeyCacheEntry.java @@ -16,7 +16,6 @@ package com.google.gerrit.sshd; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.AccountSshKey; - import java.security.PublicKey; class SshKeyCacheEntry { diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshKeyCacheImpl.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshKeyCacheImpl.java index bf3e6bce90..45193f3f5f 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshKeyCacheImpl.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshKeyCacheImpl.java @@ -31,23 +31,20 @@ import com.google.inject.Module; import com.google.inject.Singleton; import com.google.inject.TypeLiteral; import com.google.inject.name.Named; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.concurrent.ExecutionException; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** Provides the {@link SshKeyCacheEntry}. */ @Singleton public class SshKeyCacheImpl implements SshKeyCache { - private static final Logger log = - LoggerFactory.getLogger(SshKeyCacheImpl.class); + private static final Logger log = LoggerFactory.getLogger(SshKeyCacheImpl.class); private static final String CACHE_NAME = "sshkeys"; static final Iterable NO_SUCH_USER = none(); @@ -57,10 +54,8 @@ public class SshKeyCacheImpl implements SshKeyCache { return new CacheModule() { @Override protected void configure() { - cache(CACHE_NAME, - String.class, - new TypeLiteral>(){}) - .loader(Loader.class); + cache(CACHE_NAME, String.class, new TypeLiteral>() {}) + .loader(Loader.class); bind(SshKeyCacheImpl.class); bind(SshKeyCache.class).to(SshKeyCacheImpl.class); bind(SshKeyCreator.class).to(SshKeyCreatorImpl.class); @@ -69,15 +64,13 @@ public class SshKeyCacheImpl implements SshKeyCache { } private static Iterable none() { - return Collections.unmodifiableCollection(Arrays - .asList(new SshKeyCacheEntry[0])); + return Collections.unmodifiableCollection(Arrays.asList(new SshKeyCacheEntry[0])); } private final LoadingCache> cache; @Inject - SshKeyCacheImpl( - @Named(CACHE_NAME) LoadingCache> cache) { + SshKeyCacheImpl(@Named(CACHE_NAME) LoadingCache> cache) { this.cache = cache; } @@ -102,8 +95,7 @@ public class SshKeyCacheImpl implements SshKeyCache { private final VersionedAuthorizedKeys.Accessor authorizedKeys; @Inject - Loader(SchemaFactory schema, - VersionedAuthorizedKeys.Accessor authorizedKeys) { + Loader(SchemaFactory schema, VersionedAuthorizedKeys.Accessor authorizedKeys) { this.schema = schema; this.authorizedKeys = authorizedKeys; } @@ -111,8 +103,7 @@ public class SshKeyCacheImpl implements SshKeyCache { @Override public Iterable load(String username) throws Exception { try (ReviewDb db = schema.open()) { - AccountExternalId.Key key = - new AccountExternalId.Key(SCHEME_USERNAME, username); + AccountExternalId.Key key = new AccountExternalId.Key(SCHEME_USERNAME, username); AccountExternalId user = db.accountExternalIds().get(key); if (user == null) { return NO_SUCH_USER; diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshKeyCreatorImpl.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshKeyCreatorImpl.java index 0fd6db4b2a..637f98edda 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshKeyCreatorImpl.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshKeyCreatorImpl.java @@ -17,24 +17,19 @@ package com.google.gerrit.sshd; import com.google.gerrit.common.errors.InvalidSshKeyException; import com.google.gerrit.reviewdb.client.AccountSshKey; import com.google.gerrit.server.ssh.SshKeyCreator; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.spec.InvalidKeySpecException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class SshKeyCreatorImpl implements SshKeyCreator { - private static final Logger log = - LoggerFactory.getLogger(SshKeyCreatorImpl.class); + private static final Logger log = LoggerFactory.getLogger(SshKeyCreatorImpl.class); @Override - public AccountSshKey create(AccountSshKey.Id id, String encoded) - throws InvalidSshKeyException { + public AccountSshKey create(AccountSshKey.Id id, String encoded) throws InvalidSshKeyException { try { - AccountSshKey key = - new AccountSshKey(id, SshUtil.toOpenSshPublicKey(encoded)); + AccountSshKey key = new AccountSshKey(id, SshUtil.toOpenSshPublicKey(encoded)); SshUtil.parse(key); return key; } catch (NoSuchAlgorithmException | InvalidKeySpecException e) { diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshLog.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshLog.java index 74f2017c77..dfd56f1f88 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshLog.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshLog.java @@ -30,7 +30,6 @@ import com.google.gerrit.sshd.SshScope.Context; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import org.apache.log4j.AsyncAppender; import org.apache.log4j.Level; import org.apache.log4j.Logger; @@ -55,8 +54,11 @@ class SshLog implements LifecycleListener { private final AuditService auditService; @Inject - SshLog(final Provider session, final Provider context, - SystemLog systemLog, @GerritServerConfig Config config, + SshLog( + final Provider session, + final Provider context, + SystemLog systemLog, + @GerritServerConfig Config config, AuditService auditService) { this.session = session; this.context = context; @@ -70,8 +72,7 @@ class SshLog implements LifecycleListener { } @Override - public void start() { - } + public void start() {} @Override public void stop() { @@ -81,8 +82,7 @@ class SshLog implements LifecycleListener { } void onLogin() { - LoggingEvent entry = - log("LOGIN FROM " + session.get().getRemoteAddressAsString()); + LoggingEvent entry = log("LOGIN FROM " + session.get().getRemoteAddressAsString()); if (async != null) { async.append(entry); } @@ -90,18 +90,19 @@ class SshLog implements LifecycleListener { } void onAuthFail(final SshSession sd) { - final LoggingEvent event = new LoggingEvent( // - Logger.class.getName(), // fqnOfCategoryClass - log, // logger - TimeUtil.nowMs(), // when - Level.INFO, // level - "AUTH FAILURE FROM " + sd.getRemoteAddressAsString(), // message text - "SSHD", // thread name - null, // exception information - null, // current NDC string - null, // caller location - null // MDC properties - ); + final LoggingEvent event = + new LoggingEvent( // + Logger.class.getName(), // fqnOfCategoryClass + log, // logger + TimeUtil.nowMs(), // when + Level.INFO, // level + "AUTH FAILURE FROM " + sd.getRemoteAddressAsString(), // message text + "SSHD", // thread name + null, // exception information + null, // current NDC string + null, // caller location + null // MDC properties + ); event.setProperty(P_SESSION, id(sd.getSessionId())); event.setProperty(P_USER_NAME, sd.getUsername()); @@ -163,8 +164,7 @@ class SshLog implements LifecycleListener { String[] cmdArgs = dcmd.getArguments(); String paramName = null; int argPos = 0; - ListMultimap parms = - MultimapBuilder.hashKeys().arrayListValues().build(); + ListMultimap parms = MultimapBuilder.hashKeys().arrayListValues().build(); for (int i = 2; i < cmdArgs.length; i++) { String arg = cmdArgs[i]; // -- stop parameters parsing @@ -214,18 +214,19 @@ class SshLog implements LifecycleListener { final SshSession sd = session.get(); final CurrentUser user = sd.getUser(); - final LoggingEvent event = new LoggingEvent( // - Logger.class.getName(), // fqnOfCategoryClass - log, // logger - TimeUtil.nowMs(), // when - Level.INFO, // level - msg, // message text - "SSHD", // thread name - null, // exception information - null, // current NDC string - null, // caller location - null // MDC properties - ); + final LoggingEvent event = + new LoggingEvent( // + Logger.class.getName(), // fqnOfCategoryClass + log, // logger + TimeUtil.nowMs(), // when + Level.INFO, // level + msg, // message text + "SSHD", // thread name + null, // exception information + null, // current NDC string + null, // caller location + null // MDC properties + ); event.setProperty(P_SESSION, id(sd.getSessionId())); @@ -259,8 +260,7 @@ class SshLog implements LifecycleListener { audit(ctx, result, extractWhat(cmd), extractParameters(cmd)); } - private void audit(Context ctx, Object result, String cmd, - ListMultimap params) { + private void audit(Context ctx, Object result, String cmd, ListMultimap params) { String sessionId; CurrentUser currentUser; long created; @@ -274,8 +274,7 @@ class SshLog implements LifecycleListener { currentUser = session.getUser(); created = ctx.created; } - auditService.dispatch(new SshAuditEvent(sessionId, currentUser, - cmd, created, params, result)); + auditService.dispatch(new SshAuditEvent(sessionId, currentUser, cmd, created, params, result)); } private String extractWhat(DispatchCommand dcmd) { diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshLogLayout.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshLogLayout.java index 541081e0b6..627bf71a31 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshLogLayout.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshLogLayout.java @@ -14,13 +14,12 @@ package com.google.gerrit.sshd; -import org.apache.log4j.Layout; -import org.apache.log4j.spi.LoggingEvent; -import org.eclipse.jgit.util.QuotedString; - import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.TimeZone; +import org.apache.log4j.Layout; +import org.apache.log4j.spi.LoggingEvent; +import org.eclipse.jgit.util.QuotedString; public final class SshLogLayout extends Layout { @@ -38,7 +37,7 @@ public final class SshLogLayout extends Layout { private final SimpleDateFormat tzFormat; private char[] timeZone; - public SshLogLayout() { + public SshLogLayout() { final TimeZone tz = TimeZone.getDefault(); calendar = Calendar.getInstance(tz); @@ -134,6 +133,5 @@ public final class SshLogLayout extends Layout { } @Override - public void activateOptions() { - } + public void activateOptions() {} } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshModule.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshModule.java index 3429587a66..d25c58be3a 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshModule.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshModule.java @@ -34,16 +34,14 @@ import com.google.gerrit.sshd.commands.QueryShell; import com.google.inject.Inject; import com.google.inject.internal.UniqueAnnotations; import com.google.inject.servlet.RequestScoped; - +import java.net.SocketAddress; +import java.util.HashMap; +import java.util.Map; import org.apache.sshd.server.CommandFactory; import org.apache.sshd.server.auth.gss.GSSAuthenticator; import org.apache.sshd.server.auth.pubkey.PublickeyAuthenticator; import org.eclipse.jgit.lib.Config; -import java.net.SocketAddress; -import java.util.HashMap; -import java.util.Map; - /** Configures standard dependencies for {@link SshDaemon}. */ public class SshModule extends LifecycleModule { private final Map aliases; @@ -72,12 +70,15 @@ public class SshModule extends LifecycleModule { factory(QueryShell.Factory.class); factory(PeerDaemonUser.Factory.class); - bind(DispatchCommandProvider.class).annotatedWith(Commands.CMD_ROOT) + bind(DispatchCommandProvider.class) + .annotatedWith(Commands.CMD_ROOT) .toInstance(new DispatchCommandProvider(Commands.CMD_ROOT)); bind(CommandFactoryProvider.class); bind(CommandFactory.class).toProvider(CommandFactoryProvider.class); - bind(WorkQueue.Executor.class).annotatedWith(StreamCommandExecutor.class) - .toProvider(StreamCommandExecutorProvider.class).in(SINGLETON); + bind(WorkQueue.Executor.class) + .annotatedWith(StreamCommandExecutor.class) + .toProvider(StreamCommandExecutorProvider.class) + .in(SINGLETON); bind(QueueProvider.class).to(CommandExecutorQueueProvider.class).in(SINGLETON); bind(GSSAuthenticator.class).to(GerritGSSAuthenticator.class); @@ -86,12 +87,12 @@ public class SshModule extends LifecycleModule { bind(ModuleGenerator.class).to(SshAutoRegisterModuleGenerator.class); bind(SshPluginStarterCallback.class); bind(StartPluginListener.class) - .annotatedWith(UniqueAnnotations.create()) - .to(SshPluginStarterCallback.class); + .annotatedWith(UniqueAnnotations.create()) + .to(SshPluginStarterCallback.class); bind(ReloadPluginListener.class) - .annotatedWith(UniqueAnnotations.create()) - .to(SshPluginStarterCallback.class); + .annotatedWith(UniqueAnnotations.create()) + .to(SshPluginStarterCallback.class); listener().toInstance(registerInParentInjectors()); listener().to(SshLog.class); @@ -108,21 +109,23 @@ public class SshModule extends LifecycleModule { for (int i = 1; i < dest.length; i++) { cmd = Commands.named(cmd, dest[i]); } - bind(Commands.key(gerrit, name)) - .toProvider(new AliasCommandProvider(cmd)); + bind(Commands.key(gerrit, name)).toProvider(new AliasCommandProvider(cmd)); } } private void configureRequestScope() { bind(SshScope.Context.class).toProvider(SshScope.ContextProvider.class); - bind(SshSession.class).toProvider(SshScope.SshSessionProvider.class).in( - SshScope.REQUEST); - bind(SocketAddress.class).annotatedWith(RemotePeer.class).toProvider( - SshRemotePeerProvider.class).in(SshScope.REQUEST); + bind(SshSession.class).toProvider(SshScope.SshSessionProvider.class).in(SshScope.REQUEST); + bind(SocketAddress.class) + .annotatedWith(RemotePeer.class) + .toProvider(SshRemotePeerProvider.class) + .in(SshScope.REQUEST); - bind(WorkQueue.Executor.class).annotatedWith(CommandExecutor.class) - .toProvider(CommandExecutorProvider.class).in(SshScope.REQUEST); + bind(WorkQueue.Executor.class) + .annotatedWith(CommandExecutor.class) + .toProvider(CommandExecutorProvider.class) + .in(SshScope.REQUEST); install(new GerritRequestModule()); } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshPluginStarterCallback.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshPluginStarterCallback.java index f134d4836b..7f76ec6c83 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshPluginStarterCallback.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshPluginStarterCallback.java @@ -21,22 +21,18 @@ import com.google.inject.Inject; import com.google.inject.Key; import com.google.inject.Provider; import com.google.inject.Singleton; - import org.apache.sshd.server.Command; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Singleton -class SshPluginStarterCallback - implements StartPluginListener, ReloadPluginListener { - private static final Logger log = LoggerFactory - .getLogger(SshPluginStarterCallback.class); +class SshPluginStarterCallback implements StartPluginListener, ReloadPluginListener { + private static final Logger log = LoggerFactory.getLogger(SshPluginStarterCallback.class); private final DispatchCommandProvider root; @Inject - SshPluginStarterCallback( - @CommandName(Commands.ROOT) DispatchCommandProvider root) { + SshPluginStarterCallback(@CommandName(Commands.ROOT) DispatchCommandProvider root) { this.root = root; } @@ -62,9 +58,8 @@ class SshPluginStarterCallback try { return plugin.getSshInjector().getProvider(key); } catch (RuntimeException err) { - log.warn(String.format( - "Plugin %s did not define its top-level command", - plugin.getName()), err); + log.warn( + String.format("Plugin %s did not define its top-level command", plugin.getName()), err); } } return null; diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshRemotePeerProvider.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshRemotePeerProvider.java index 2c7736016d..44554ca13c 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshRemotePeerProvider.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshRemotePeerProvider.java @@ -17,7 +17,6 @@ package com.google.gerrit.sshd; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.net.SocketAddress; @Singleton diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshScope.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshScope.java index 9616aeca37..202a80eed8 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshScope.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshScope.java @@ -30,14 +30,12 @@ import com.google.inject.OutOfScopeException; import com.google.inject.Provider; import com.google.inject.Scope; import com.google.inject.util.Providers; - import java.util.HashMap; import java.util.Map; /** Guice scopes for state during an SSH connection. */ public class SshScope { - private static final Key RC_KEY = - Key.get(RequestCleanup.class); + private static final Key RC_KEY = Key.get(RequestCleanup.class); private static final Key DB_KEY = Key.get(RequestScopedReviewDbProvider.class); @@ -53,16 +51,13 @@ public class SshScope { volatile long started; volatile long finished; - private Context(SchemaFactory sf, final SshSession s, - final String c, final long at) { + private Context(SchemaFactory sf, final SshSession s, final String c, final long at) { schemaFactory = sf; session = s; commandLine = c; created = started = finished = at; map.put(RC_KEY, cleanup); - map.put(DB_KEY, new RequestScopedReviewDbProvider( - schemaFactory, - Providers.of(cleanup))); + map.put(DB_KEY, new RequestScopedReviewDbProvider(schemaFactory, Providers.of(cleanup))); } private Context(Context p, SshSession s, String c) { @@ -130,7 +125,9 @@ public class SshScope { private final SshScope sshScope; @Inject - Propagator(SshScope sshScope, ThreadLocalRequestContext local, + Propagator( + SshScope sshScope, + ThreadLocalRequestContext local, Provider dbProviderProvider) { super(REQUEST, current, local, dbProviderProvider); this.sshScope = sshScope; @@ -158,8 +155,7 @@ public class SshScope { private final IdentifiedUser.RequestFactory userFactory; @Inject - SshScope(ThreadLocalRequestContext local, - IdentifiedUser.RequestFactory userFactory) { + SshScope(ThreadLocalRequestContext local, IdentifiedUser.RequestFactory userFactory) { this.local = local; this.userFactory = userFactory; } @@ -180,25 +176,26 @@ public class SshScope { } /** Returns exactly one instance per command executed. */ - public static final Scope REQUEST = new Scope() { - @Override - public Provider scope(final Key key, final Provider creator) { - return new Provider() { + public static final Scope REQUEST = + new Scope() { @Override - public T get() { - return requireContext().get(key, creator); + public Provider scope(final Key key, final Provider creator) { + return new Provider() { + @Override + public T get() { + return requireContext().get(key, creator); + } + + @Override + public String toString() { + return String.format("%s[%s]", creator, REQUEST); + } + }; } @Override public String toString() { - return String.format("%s[%s]", creator, REQUEST); + return "SshScopes.REQUEST"; } }; - } - - @Override - public String toString() { - return "SshScopes.REQUEST"; - } - }; } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshSession.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshSession.java index 17c330fc86..f08fb432a5 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshSession.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshSession.java @@ -16,12 +16,10 @@ package com.google.gerrit.sshd; import com.google.gerrit.server.AccessPath; import com.google.gerrit.server.CurrentUser; - -import org.apache.sshd.common.AttributeStore.AttributeKey; - import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; +import org.apache.sshd.common.AttributeStore.AttributeKey; /** Global data related to an active SSH connection. */ public class SshSession { diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshUtil.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshUtil.java index c2c07e1f02..33d253ab54 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshUtil.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshUtil.java @@ -19,16 +19,6 @@ import com.google.gerrit.reviewdb.client.AccountSshKey; import com.google.gerrit.server.CurrentUser; import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.sshd.SshScope.Context; - -import org.apache.commons.codec.binary.Base64; -import org.apache.sshd.common.SshException; -import org.apache.sshd.common.future.CloseFuture; -import org.apache.sshd.common.future.SshFutureListener; -import org.apache.sshd.common.keyprovider.KeyPairProvider; -import org.apache.sshd.common.util.buffer.ByteArrayBuffer; -import org.apache.sshd.server.session.ServerSession; -import org.eclipse.jgit.lib.Constants; - import java.io.BufferedReader; import java.io.IOException; import java.io.StringReader; @@ -38,6 +28,14 @@ import java.security.PublicKey; import java.security.interfaces.DSAPublicKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.InvalidKeySpecException; +import org.apache.commons.codec.binary.Base64; +import org.apache.sshd.common.SshException; +import org.apache.sshd.common.future.CloseFuture; +import org.apache.sshd.common.future.SshFutureListener; +import org.apache.sshd.common.keyprovider.KeyPairProvider; +import org.apache.sshd.common.util.buffer.ByteArrayBuffer; +import org.apache.sshd.server.session.ServerSession; +import org.eclipse.jgit.lib.Constants; /** Utilities to support SSH operations. */ public class SshUtil { @@ -51,8 +49,7 @@ public class SshUtil { * @throws NoSuchProviderException the JVM is missing the provider. */ public static PublicKey parse(final AccountSshKey key) - throws NoSuchAlgorithmException, InvalidKeySpecException, - NoSuchProviderException { + throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchProviderException { try { final String s = key.getEncodedKey(); if (s == null) { @@ -69,8 +66,8 @@ public class SshUtil { * Convert an RFC 4716 style key to an OpenSSH style key. * * @param keyStr the key string to convert. - * @return {@code keyStr} if conversion failed; otherwise the converted - * key, in OpenSSH key format. + * @return {@code keyStr} if conversion failed; otherwise the converted key, in OpenSSH key + * format. */ public static String toOpenSshPublicKey(final String keyStr) { try { @@ -96,8 +93,8 @@ public class SshUtil { } final PublicKey key = - new ByteArrayBuffer(Base64.decodeBase64(Constants.encodeASCII(strBuf - .toString()))).getRawPublicKey(); + new ByteArrayBuffer(Base64.decodeBase64(Constants.encodeASCII(strBuf.toString()))) + .getRawPublicKey(); if (key instanceof RSAPublicKey) { strBuf.insert(0, KeyPairProvider.SSH_RSA + " "); @@ -118,9 +115,13 @@ public class SshUtil { } } - public static boolean success(final String username, final ServerSession session, - final SshScope sshScope, final SshLog sshLog, - final SshSession sd, final CurrentUser user) { + public static boolean success( + final String username, + final ServerSession session, + final SshScope sshScope, + final SshLog sshLog, + final SshSession sd, + final CurrentUser user) { if (sd.getUser() == null) { sd.authenticationSuccess(username, user); @@ -154,7 +155,8 @@ public class SshUtil { return true; } - public static IdentifiedUser createUser(final SshSession sd, + public static IdentifiedUser createUser( + final SshSession sd, final IdentifiedUser.GenericFactory userFactory, final Account.Id account) { return userFactory.create(sd.getRemoteAddress(), account); diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/StreamCommandExecutor.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/StreamCommandExecutor.java index 06f7de6ab6..794ff76701 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/StreamCommandExecutor.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/StreamCommandExecutor.java @@ -18,11 +18,9 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; import com.google.gerrit.server.git.WorkQueue.Executor; import com.google.inject.BindingAnnotation; - import java.lang.annotation.Retention; /** Marker on {@link Executor} used by delayed event streaming. */ @Retention(RUNTIME) @BindingAnnotation -public @interface StreamCommandExecutor { -} +public @interface StreamCommandExecutor {} diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/StreamCommandExecutorProvider.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/StreamCommandExecutorProvider.java index 2c9dc4538f..58fd027e53 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/StreamCommandExecutorProvider.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/StreamCommandExecutorProvider.java @@ -18,18 +18,15 @@ import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.git.WorkQueue; import com.google.inject.Inject; import com.google.inject.Provider; - -import org.eclipse.jgit.lib.Config; - import java.util.concurrent.ThreadFactory; +import org.eclipse.jgit.lib.Config; class StreamCommandExecutorProvider implements Provider { private final int poolSize; private final WorkQueue queues; @Inject - StreamCommandExecutorProvider(@GerritServerConfig final Config config, - final WorkQueue wq) { + StreamCommandExecutorProvider(@GerritServerConfig final Config config, final WorkQueue wq) { final int cores = Runtime.getRuntime().availableProcessors(); poolSize = config.getInt("sshd", "streamThreads", cores + 1); queues = wq; @@ -42,14 +39,15 @@ class StreamCommandExecutorProvider implements Provider { executor = queues.createQueue(poolSize, "SSH-Stream-Worker"); final ThreadFactory parent = executor.getThreadFactory(); - executor.setThreadFactory(new ThreadFactory() { - @Override - public Thread newThread(final Runnable task) { - final Thread t = parent.newThread(task); - t.setPriority(Thread.MIN_PRIORITY); - return t; - } - }); + executor.setThreadFactory( + new ThreadFactory() { + @Override + public Thread newThread(final Runnable task) { + final Thread t = parent.newThread(task); + t.setPriority(Thread.MIN_PRIORITY); + return t; + } + }); return executor; } } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SuExec.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SuExec.java index c88a02cbe7..53a98ebeeb 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SuExec.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SuExec.java @@ -25,24 +25,22 @@ import com.google.gerrit.server.PeerDaemonUser; import com.google.gerrit.server.config.AuthConfig; import com.google.gerrit.sshd.SshScope.Context; import com.google.inject.Inject; - -import org.apache.sshd.server.Command; -import org.apache.sshd.server.Environment; -import org.kohsuke.args4j.Argument; -import org.kohsuke.args4j.Option; - import java.io.IOException; import java.net.SocketAddress; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicReference; +import org.apache.sshd.server.Command; +import org.apache.sshd.server.Environment; +import org.kohsuke.args4j.Argument; +import org.kohsuke.args4j.Option; /** * Executes any other command as a different user identity. - *

        - * The calling user must be authenticated as a {@link PeerDaemonUser}, which - * usually requires public key authentication using this daemon's private host - * key, or a key on this daemon's peer host key ring. + * + *

        The calling user must be authenticated as a {@link PeerDaemonUser}, which usually requires + * public key authentication using this daemon's private host key, or a key on this daemon's peer + * host key ring. */ public final class SuExec extends BaseCommand { private final SshScope sshScope; @@ -66,7 +64,8 @@ public final class SuExec extends BaseCommand { private final AtomicReference atomicCmd; @Inject - SuExec(final SshScope sshScope, + SuExec( + final SshScope sshScope, @CommandName(Commands.ROOT) final DispatchCommandProvider dispatcher, final CurrentUser caller, final SshSession session, @@ -131,8 +130,7 @@ public final class SuExec extends BaseCommand { if (caller instanceof PeerDaemonUser) { caller = null; } - return new SshSession(session, peer, - userFactory.runAs(peer, accountId, caller)); + return new SshSession(session, peer, userFactory.runAs(peer, accountId, caller)); } private static String join(List args) { diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AdminQueryShell.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AdminQueryShell.java index 237d84400e..42c75782f9 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AdminQueryShell.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AdminQueryShell.java @@ -22,7 +22,6 @@ import com.google.gerrit.sshd.AdminHighPriorityCommand; import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.inject.Inject; - import org.kohsuke.args4j.Option; /** Opens a query processor. */ @@ -30,11 +29,9 @@ import org.kohsuke.args4j.Option; @RequiresCapability(GlobalCapability.ACCESS_DATABASE) @CommandMetaData(name = "gsql", description = "Administrative interface to active database") final class AdminQueryShell extends SshCommand { - @Inject - private QueryShell.Factory factory; + @Inject private QueryShell.Factory factory; - @Inject - private IdentifiedUser currentUser; + @Inject private IdentifiedUser currentUser; @Option(name = "--format", usage = "Set output format") private QueryShell.OutputFormat format = QueryShell.OutputFormat.PRETTY; @@ -61,20 +58,19 @@ final class AdminQueryShell extends SshCommand { /** * Assert that the current user is permitted to perform raw queries. - *

        - * As the @RequireCapability guards at various entry points of internal - * commands implicitly add administrators (which we want to avoid), we also - * check permissions within QueryShell and grant access only to those who - * can access the database, regardless of whether they are administrators or - * not. + * + *

        As the @RequireCapability guards at various entry points of internal commands implicitly add + * administrators (which we want to avoid), we also check permissions within QueryShell and grant + * access only to those who can access the database, regardless of whether they are administrators + * or not. * * @throws PermissionDeniedException */ private void checkPermission() throws PermissionDeniedException { if (!currentUser.getCapabilities().canAccessDatabase()) { - throw new PermissionDeniedException(String.format( - "%s does not have \"Access Database\" capability.", - currentUser.getUserName())); + throw new PermissionDeniedException( + String.format( + "%s does not have \"Access Database\" capability.", currentUser.getUserName())); } } } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AdminSetParent.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AdminSetParent.java index bd5e9f3a37..35ddc2a5d1 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AdminSetParent.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AdminSetParent.java @@ -29,7 +29,12 @@ import com.google.gerrit.server.project.ProjectState; import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.inject.Inject; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.kohsuke.args4j.Argument; @@ -37,52 +42,61 @@ import org.kohsuke.args4j.Option; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER) -@CommandMetaData(name = "set-project-parent", description = "Change the project permissions are inherited from") +@CommandMetaData( + name = "set-project-parent", + description = "Change the project permissions are inherited from" +) final class AdminSetParent extends SshCommand { private static final Logger log = LoggerFactory.getLogger(AdminSetParent.class); - @Option(name = "--parent", aliases = {"-p"}, metaVar = "NAME", usage = "new parent project") + @Option( + name = "--parent", + aliases = {"-p"}, + metaVar = "NAME", + usage = "new parent project" + ) private ProjectControl newParent; - @Option(name = "--children-of", metaVar = "NAME", - usage = "parent project for which the child projects should be reparented") + @Option( + name = "--children-of", + metaVar = "NAME", + usage = "parent project for which the child projects should be reparented" + ) private ProjectControl oldParent; - @Option(name = "--exclude", metaVar = "NAME", - usage = "child project of old parent project which should not be reparented") + @Option( + name = "--exclude", + metaVar = "NAME", + usage = "child project of old parent project which should not be reparented" + ) private List excludedChildren = new ArrayList<>(); - @Argument(index = 0, required = false, multiValued = true, metaVar = "NAME", - usage = "projects to modify") + @Argument( + index = 0, + required = false, + multiValued = true, + metaVar = "NAME", + usage = "projects to modify" + ) private List children = new ArrayList<>(); - @Inject - private ProjectCache projectCache; + @Inject private ProjectCache projectCache; - @Inject - private MetaDataUpdate.User metaDataUpdateFactory; + @Inject private MetaDataUpdate.User metaDataUpdateFactory; - @Inject - private AllProjectsName allProjectsName; + @Inject private AllProjectsName allProjectsName; - @Inject - private ListChildProjects listChildProjects; + @Inject private ListChildProjects listChildProjects; private Project.NameKey newParentKey; @Override protected void run() throws Failure { if (oldParent == null && children.isEmpty()) { - throw die("child projects have to be specified as " + - "arguments or the --children-of option has to be set"); + throw die( + "child projects have to be specified as " + + "arguments or the --children-of option has to be set"); } if (oldParent == null && !excludedChildren.isEmpty()) { throw die("--exclude can only be used together with --children-of"); @@ -132,18 +146,20 @@ final class AdminSetParent extends SshCommand { // Try to avoid creating a cycle in the parent pointers. // err.append("error: Cycle exists between '") - .append(name) - .append("' and '") - .append(newParentKey != null ? newParentKey.get() : allProjectsName.get()) - .append("'\n"); + .append(name) + .append("' and '") + .append(newParentKey != null ? newParentKey.get() : allProjectsName.get()) + .append("'\n"); continue; } try (MetaDataUpdate md = metaDataUpdateFactory.create(nameKey)) { ProjectConfig config = ProjectConfig.read(md); config.getProject().setParentName(newParentKey); - md.setMessage("Inherit access from " - + (newParentKey != null ? newParentKey.get() : allProjectsName.get()) + "\n"); + md.setMessage( + "Inherit access from " + + (newParentKey != null ? newParentKey.get() : allProjectsName.get()) + + "\n"); config.commit(md); } catch (RepositoryNotFoundException notFound) { err.append("error: Project ").append(name).append(" not found\n"); @@ -165,32 +181,34 @@ final class AdminSetParent extends SshCommand { } /** - * Returns the children of the specified parent project that should be - * reparented. The returned list of child projects does not contain projects - * that were specified to be excluded from reparenting. + * Returns the children of the specified parent project that should be reparented. The returned + * list of child projects does not contain projects that were specified to be excluded from + * reparenting. */ private List getChildrenForReparenting(final ProjectControl parent) { final List childProjects = new ArrayList<>(); - final List excluded = - new ArrayList<>(excludedChildren.size()); + final List excluded = new ArrayList<>(excludedChildren.size()); for (final ProjectControl excludedChild : excludedChildren) { excluded.add(excludedChild.getProject().getNameKey()); } - final List automaticallyExcluded = - new ArrayList<>(excludedChildren.size()); + final List automaticallyExcluded = new ArrayList<>(excludedChildren.size()); if (newParentKey != null) { automaticallyExcluded.addAll(getAllParents(newParentKey)); } - for (final ProjectInfo child : listChildProjects.apply( - new ProjectResource(parent))) { + for (final ProjectInfo child : listChildProjects.apply(new ProjectResource(parent))) { final Project.NameKey childName = new Project.NameKey(child.name); if (!excluded.contains(childName)) { if (!automaticallyExcluded.contains(childName)) { childProjects.add(childName); } else { - stdout.println("Automatically excluded '" + childName + "' " + - "from reparenting because it is in the parent " + - "line of the new parent '" + newParentKey + "'."); + stdout.println( + "Automatically excluded '" + + childName + + "' " + + "from reparenting because it is in the parent " + + "line of the new parent '" + + newParentKey + + "'."); } } } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ApproveOption.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ApproveOption.java index fb961d8a2e..92098cc893 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ApproveOption.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ApproveOption.java @@ -16,7 +16,8 @@ package com.google.gerrit.sshd.commands; import com.google.gerrit.common.data.LabelType; import com.google.gerrit.common.data.LabelValue; - +import java.lang.annotation.Annotation; +import java.lang.reflect.AnnotatedElement; import org.kohsuke.args4j.CmdLineException; import org.kohsuke.args4j.CmdLineParser; import org.kohsuke.args4j.Option; @@ -26,9 +27,6 @@ import org.kohsuke.args4j.spi.OneArgumentOptionHandler; import org.kohsuke.args4j.spi.OptionHandler; import org.kohsuke.args4j.spi.Setter; -import java.lang.annotation.Annotation; -import java.lang.reflect.AnnotatedElement; - final class ApproveOption implements Option, Setter { private final String name; private final String usage; @@ -124,15 +122,13 @@ final class ApproveOption implements Option, Setter { private final ApproveOption cmdOption; // CS IGNORE RedundantModifier FOR NEXT 1 LINES. REASON: needed by org.kohsuke.args4j.Option - public Handler(final CmdLineParser parser, final OptionDef option, - final Setter setter) { + public Handler(final CmdLineParser parser, final OptionDef option, final Setter setter) { super(parser, option, setter); this.cmdOption = (ApproveOption) setter; } @Override - protected Short parse(final String token) throws NumberFormatException, - CmdLineException { + protected Short parse(final String token) throws NumberFormatException, CmdLineException { String argument = token; if (argument.startsWith("+")) { argument = argument.substring(1); @@ -145,8 +141,15 @@ final class ApproveOption implements Option, Setter { if (value < min.getValue() || value > max.getValue()) { final String name = cmdOption.name(); final String e = - "\"" + token + "\" must be in range " + min.formatValue() + ".." - + max.formatValue() + " for \"" + name + "\""; + "\"" + + token + + "\" must be in range " + + min.formatValue() + + ".." + + max.formatValue() + + " for \"" + + name + + "\""; throw new CmdLineException(owner, e); } return value; diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AproposCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AproposCommand.java index 12f69ed45e..577b58fec3 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AproposCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AproposCommand.java @@ -23,18 +23,17 @@ import com.google.gerrit.server.documentation.QueryDocumentationExecutor.DocResu import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.inject.Inject; - +import java.util.List; import org.kohsuke.args4j.Argument; -import java.util.List; - -@CommandMetaData(name = "apropos", description = "Search in Gerrit documentation", - runsAt = MASTER_OR_SLAVE) +@CommandMetaData( + name = "apropos", + description = "Search in Gerrit documentation", + runsAt = MASTER_OR_SLAVE +) final class AproposCommand extends SshCommand { - @Inject - private QueryDocumentationExecutor searcher; - @Inject - @CanonicalWebUrl String url; + @Inject private QueryDocumentationExecutor searcher; + @Inject @CanonicalWebUrl String url; @Argument(index = 0, required = true, metaVar = "QUERY") private String q; @@ -44,8 +43,7 @@ final class AproposCommand extends SshCommand { try { List res = searcher.doQuery(q); for (DocResult docResult : res) { - stdout.println(String.format("%s:\n%s%s\n", docResult.title, url, - docResult.url)); + stdout.println(String.format("%s:\n%s%s\n", docResult.title, url, docResult.url)); } } catch (DocQueryException dqe) { throw die(dqe); diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/BanCommitCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/BanCommitCommand.java index e15a792f06..78726a0ce5 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/BanCommitCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/BanCommitCommand.java @@ -26,37 +26,51 @@ import com.google.gerrit.server.project.ProjectResource; import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.inject.Inject; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import org.eclipse.jgit.lib.ObjectId; import org.kohsuke.args4j.Argument; import org.kohsuke.args4j.Option; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -@CommandMetaData(name = "ban-commit", description = "Ban a commit from a project's repository", - runsAt = MASTER_OR_SLAVE) +@CommandMetaData( + name = "ban-commit", + description = "Ban a commit from a project's repository", + runsAt = MASTER_OR_SLAVE +) public class BanCommitCommand extends SshCommand { - @Option(name = "--reason", aliases = {"-r"}, metaVar = "REASON", usage = "reason for banning the commit") + @Option( + name = "--reason", + aliases = {"-r"}, + metaVar = "REASON", + usage = "reason for banning the commit" + ) private String reason; - @Argument(index = 0, required = true, metaVar = "PROJECT", - usage = "name of the project for which the commit should be banned") + @Argument( + index = 0, + required = true, + metaVar = "PROJECT", + usage = "name of the project for which the commit should be banned" + ) private ProjectControl projectControl; - @Argument(index = 1, required = true, multiValued = true, metaVar = "COMMIT", - usage = "commit(s) that should be banned") + @Argument( + index = 1, + required = true, + multiValued = true, + metaVar = "COMMIT", + usage = "commit(s) that should be banned" + ) private List commitsToBan = new ArrayList<>(); - @Inject - private BanCommit banCommit; + @Inject private BanCommit banCommit; @Override protected void run() throws Failure { try { - BanCommit.Input input = BanCommit.Input.fromCommits( - Lists.transform(commitsToBan, ObjectId::getName)); + BanCommit.Input input = + BanCommit.Input.fromCommits(Lists.transform(commitsToBan, ObjectId::getName)); input.reason = reason; BanResultInfo r = banCommit.apply(new ProjectResource(projectControl), input); diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/BaseTestPrologCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/BaseTestPrologCommand.java index 9f31ddc887..56ff5eacac 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/BaseTestPrologCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/BaseTestPrologCommand.java @@ -25,32 +25,34 @@ import com.google.gerrit.server.change.RevisionResource; import com.google.gerrit.server.change.Revisions; import com.google.gerrit.sshd.SshCommand; import com.google.inject.Inject; - +import java.nio.ByteBuffer; import org.eclipse.jgit.util.IO; import org.eclipse.jgit.util.RawParseUtils; import org.kohsuke.args4j.Argument; import org.kohsuke.args4j.Option; -import java.nio.ByteBuffer; - abstract class BaseTestPrologCommand extends SshCommand { private TestSubmitRuleInput input = new TestSubmitRuleInput(); - @Inject - private ChangesCollection changes; + @Inject private ChangesCollection changes; - @Inject - private Revisions revisions; + @Inject private Revisions revisions; @Argument(index = 0, required = true, usage = "ChangeId to load in prolog environment") protected String changeId; - @Option(name = "-s", - usage = "Read prolog script from stdin instead of reading rules.pl from the refs/meta/config branch") + @Option( + name = "-s", + usage = + "Read prolog script from stdin instead of reading rules.pl from the refs/meta/config branch" + ) protected boolean useStdin; - @Option(name = "--no-filters", aliases = {"-n"}, - usage = "Don't run the submit_filter/2 from the parent projects") + @Option( + name = "--no-filters", + aliases = {"-n"}, + usage = "Don't run the submit_filter/2 from the parent projects" + ) void setNoFilters(boolean no) { input.filters = no ? Filters.SKIP : Filters.RUN; } @@ -60,17 +62,13 @@ abstract class BaseTestPrologCommand extends SshCommand { @Override protected final void run() throws UnloggedFailure { try { - RevisionResource revision = revisions.parse( - changes.parse( - TopLevelResource.INSTANCE, - IdString.fromUrl(changeId)), - IdString.fromUrl("current")); + RevisionResource revision = + revisions.parse( + changes.parse(TopLevelResource.INSTANCE, IdString.fromUrl(changeId)), + IdString.fromUrl("current")); if (useStdin) { ByteBuffer buf = IO.readWholeStream(in, 4096); - input.rule = RawParseUtils.decode( - buf.array(), - buf.arrayOffset(), - buf.limit()); + input.rule = RawParseUtils.decode(buf.array(), buf.arrayOffset(), buf.limit()); } Object result = createView().apply(revision, input); OutputFormat.JSON.newGson().toJson(result, stdout); diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CloseConnection.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CloseConnection.java index 83b97450d3..0e101a900a 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CloseConnection.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CloseConnection.java @@ -24,7 +24,9 @@ import com.google.gerrit.sshd.SshCommand; import com.google.gerrit.sshd.SshDaemon; import com.google.gerrit.sshd.SshSession; import com.google.inject.Inject; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import org.apache.sshd.common.future.CloseFuture; import org.apache.sshd.common.io.IoAcceptor; import org.apache.sshd.common.io.IoSession; @@ -34,28 +36,30 @@ import org.kohsuke.args4j.Option; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - /** Close specified SSH connections */ @AdminHighPriorityCommand @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER) -@CommandMetaData(name = "close-connection", - description = "Close the specified SSH connection", runsAt = MASTER_OR_SLAVE) +@CommandMetaData( + name = "close-connection", + description = "Close the specified SSH connection", + runsAt = MASTER_OR_SLAVE +) final class CloseConnection extends SshCommand { private static final Logger log = LoggerFactory.getLogger(CloseConnection.class); - @Inject - private SshDaemon sshDaemon; + @Inject private SshDaemon sshDaemon; - @Argument(index = 0, multiValued = true, required = true, - metaVar = "SESSION_ID", usage = "List of SSH session IDs to be closed") + @Argument( + index = 0, + multiValued = true, + required = true, + metaVar = "SESSION_ID", + usage = "List of SSH session IDs to be closed" + ) private final List sessionIds = new ArrayList<>(); - @Option(name = "--wait", - usage = "wait for connection to close before exiting") + @Option(name = "--wait", usage = "wait for connection to close before exiting") private boolean wait; @Override @@ -70,9 +74,7 @@ final class CloseConnection extends SshCommand { for (IoSession io : acceptor.getManagedSessions().values()) { AbstractSession serverSession = AbstractSession.getSession(io, true); SshSession sshSession = - serverSession != null - ? serverSession.getAttribute(SshSession.KEY) - : null; + serverSession != null ? serverSession.getAttribute(SshSession.KEY) : null; if (sshSession != null && sshSession.getSessionId() == id) { connectionFound = true; stdout.println("closing connection " + sessionId + "..."); @@ -82,8 +84,7 @@ final class CloseConnection extends SshCommand { future.await(); stdout.println("closed connection " + sessionId); } catch (IOException e) { - log.warn("Wait for connection to close interrupted: " - + e.getMessage()); + log.warn("Wait for connection to close interrupted: " + e.getMessage()); } } break; diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateAccountCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateAccountCommand.java index 4ecf284a6f..0c63fb3271 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateAccountCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateAccountCommand.java @@ -28,22 +28,25 @@ import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.kohsuke.args4j.Argument; -import org.kohsuke.args4j.Option; - import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.kohsuke.args4j.Argument; +import org.kohsuke.args4j.Option; -/** Create a new user account. **/ +/** Create a new user account. * */ @RequiresCapability(GlobalCapability.CREATE_ACCOUNT) @CommandMetaData(name = "create-account", description = "Create a new batch/role account") final class CreateAccountCommand extends SshCommand { - @Option(name = "--group", aliases = {"-g"}, metaVar = "GROUP", usage = "groups to add account to") + @Option( + name = "--group", + aliases = {"-g"}, + metaVar = "GROUP", + usage = "groups to add account to" + ) private List groups = new ArrayList<>(); @Option(name = "--full-name", metaVar = "NAME", usage = "display name of the account") @@ -55,18 +58,20 @@ final class CreateAccountCommand extends SshCommand { @Option(name = "--ssh-key", metaVar = "-|KEY", usage = "public key for SSH authentication") private String sshKey; - @Option(name = "--http-password", metaVar = "PASSWORD", usage = "password for HTTP authentication") + @Option( + name = "--http-password", + metaVar = "PASSWORD", + usage = "password for HTTP authentication" + ) private String httpPassword; @Argument(index = 0, required = true, metaVar = "USERNAME", usage = "name of the user account") private String username; - @Inject - private CreateAccount.Factory createAccountFactory; + @Inject private CreateAccount.Factory createAccountFactory; @Override - protected void run() throws OrmException, IOException, ConfigInvalidException, - UnloggedFailure { + protected void run() throws OrmException, IOException, ConfigInvalidException, UnloggedFailure { AccountInput input = new AccountInput(); input.username = username; input.email = email; @@ -87,8 +92,7 @@ final class CreateAccountCommand extends SshCommand { } if ("-".equals(sshKey)) { sshKey = ""; - BufferedReader br = - new BufferedReader(new InputStreamReader(in, UTF_8)); + BufferedReader br = new BufferedReader(new InputStreamReader(in, UTF_8)); String line; while ((line = br.readLine()) != null) { sshKey += line + "\n"; diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateBranchCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateBranchCommand.java index d3ec69cfbb..5962faaa32 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateBranchCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateBranchCommand.java @@ -21,10 +21,9 @@ import com.google.gerrit.server.project.ProjectControl; import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.inject.Inject; - import org.kohsuke.args4j.Argument; -/** Create a new branch. **/ +/** Create a new branch. * */ @CommandMetaData(name = "create-branch", description = "Create a new branch") public final class CreateBranchCommand extends SshCommand { @@ -34,19 +33,22 @@ public final class CreateBranchCommand extends SshCommand { @Argument(index = 1, required = true, metaVar = "NAME", usage = "name of branch to be created") private String name; - @Argument(index = 2, required = true, metaVar = "REVISION", usage = "base revision of the new branch") + @Argument( + index = 2, + required = true, + metaVar = "REVISION", + usage = "base revision of the new branch" + ) private String revision; - @Inject - GerritApi gApi; + @Inject GerritApi gApi; @Override protected void run() throws UnloggedFailure { try { BranchInput in = new BranchInput(); in.revision = revision; - gApi.projects().name(project.getProject().getNameKey().get()) - .branch(name).create(in); + gApi.projects().name(project.getProject().getNameKey().get()).branch(name).create(in); } catch (RestApiException e) { throw die(e); } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateGroupCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateGroupCommand.java index f9fd1a9806..22bca56a6b 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateGroupCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateGroupCommand.java @@ -34,26 +34,34 @@ import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - -import org.kohsuke.args4j.Argument; -import org.kohsuke.args4j.Option; - import java.io.IOException; import java.util.HashSet; import java.util.Set; +import org.kohsuke.args4j.Argument; +import org.kohsuke.args4j.Option; /** * Creates a new group. - *

        - * Optionally, puts an initial set of user in the newly created group. + * + *

        Optionally, puts an initial set of user in the newly created group. */ @RequiresCapability(GlobalCapability.CREATE_GROUP) @CommandMetaData(name = "create-group", description = "Create a new account group") final class CreateGroupCommand extends SshCommand { - @Option(name = "--owner", aliases = {"-o"}, metaVar = "GROUP", usage = "owning group, if not specified the group will be self-owning") + @Option( + name = "--owner", + aliases = {"-o"}, + metaVar = "GROUP", + usage = "owning group, if not specified the group will be self-owning" + ) private AccountGroup.Id ownerGroupId; - @Option(name = "--description", aliases = {"-d"}, metaVar = "DESC", usage = "description of group") + @Option( + name = "--description", + aliases = {"-d"}, + metaVar = "DESC", + usage = "description of group" + ) private String groupDescription = ""; @Argument(index = 0, required = true, metaVar = "GROUP", usage = "name of group to be created") @@ -61,7 +69,12 @@ final class CreateGroupCommand extends SshCommand { private final Set initialMembers = new HashSet<>(); - @Option(name = "--member", aliases = {"-m"}, metaVar = "USERNAME", usage = "initial set of users to become members of the group") + @Option( + name = "--member", + aliases = {"-m"}, + metaVar = "USERNAME", + usage = "initial set of users to become members of the group" + ) void addMember(final Account.Id id) { initialMembers.add(id); } @@ -71,22 +84,23 @@ final class CreateGroupCommand extends SshCommand { private final Set initialGroups = new HashSet<>(); - @Option(name = "--group", aliases = "-g", metaVar = "GROUP", usage = "initial set of groups to be included in the group") + @Option( + name = "--group", + aliases = "-g", + metaVar = "GROUP", + usage = "initial set of groups to be included in the group" + ) void addGroup(final AccountGroup.UUID id) { initialGroups.add(id); } - @Inject - private CreateGroup.Factory createGroupFactory; + @Inject private CreateGroup.Factory createGroupFactory; - @Inject - private GroupsCollection groups; + @Inject private GroupsCollection groups; - @Inject - private AddMembers addMembers; + @Inject private AddMembers addMembers; - @Inject - private AddIncludedGroups addIncludedGroups; + @Inject private AddIncludedGroups addIncludedGroups; @Override protected void run() throws Failure, OrmException, IOException { @@ -105,8 +119,7 @@ final class CreateGroupCommand extends SshCommand { } } - private GroupResource createGroup() - throws RestApiException, OrmException, IOException { + private GroupResource createGroup() throws RestApiException, OrmException, IOException { GroupInput input = new GroupInput(); input.description = groupDescription; input.visibleToAll = visibleToAll; @@ -115,23 +128,21 @@ final class CreateGroupCommand extends SshCommand { input.ownerId = String.valueOf(ownerGroupId.get()); } - GroupInfo group = createGroupFactory.create(groupName) - .apply(TopLevelResource.INSTANCE, input); - return groups.parse(TopLevelResource.INSTANCE, - IdString.fromUrl(group.id)); + GroupInfo group = createGroupFactory.create(groupName).apply(TopLevelResource.INSTANCE, input); + return groups.parse(TopLevelResource.INSTANCE, IdString.fromUrl(group.id)); } - private void addMembers(GroupResource rsrc) throws RestApiException, - OrmException, IOException { - AddMembers.Input input = AddMembers.Input.fromMembers( - initialMembers.stream().map(Object::toString).collect(toList())); + private void addMembers(GroupResource rsrc) throws RestApiException, OrmException, IOException { + AddMembers.Input input = + AddMembers.Input.fromMembers( + initialMembers.stream().map(Object::toString).collect(toList())); addMembers.apply(rsrc, input); } - private void addIncludedGroups(GroupResource rsrc) throws RestApiException, - OrmException { - AddIncludedGroups.Input input = AddIncludedGroups.Input.fromGroups( - initialGroups.stream().map(AccountGroup.UUID::get).collect(toList())); + private void addIncludedGroups(GroupResource rsrc) throws RestApiException, OrmException { + AddIncludedGroups.Input input = + AddIncludedGroups.Input.fromGroups( + initialGroups.stream().map(AccountGroup.UUID::get).collect(toList())); addIncludedGroups.apply(rsrc, input); } } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java index 3ef33097a8..1c85518ded 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java @@ -33,35 +33,59 @@ import com.google.gerrit.server.project.SuggestParentCandidates; import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.inject.Inject; - -import org.kohsuke.args4j.Argument; -import org.kohsuke.args4j.Option; - import java.util.HashMap; import java.util.List; import java.util.Map; +import org.kohsuke.args4j.Argument; +import org.kohsuke.args4j.Option; -/** Create a new project. **/ +/** Create a new project. * */ @RequiresCapability(GlobalCapability.CREATE_PROJECT) -@CommandMetaData(name = "create-project", description = "Create a new project and associated Git repository") +@CommandMetaData( + name = "create-project", + description = "Create a new project and associated Git repository" +) final class CreateProjectCommand extends SshCommand { - @Option(name = "--suggest-parents", aliases = {"-S"}, usage = "suggest parent candidates, " - + "if this option is used all other options and arguments are ignored") + @Option( + name = "--suggest-parents", + aliases = {"-S"}, + usage = + "suggest parent candidates, " + + "if this option is used all other options and arguments are ignored" + ) private boolean suggestParent; - @Option(name = "--owner", aliases = {"-o"}, usage = "owner(s) of project") + @Option( + name = "--owner", + aliases = {"-o"}, + usage = "owner(s) of project" + ) private List ownerIds; - @Option(name = "--parent", aliases = {"-p"}, metaVar = "NAME", usage = "parent project") + @Option( + name = "--parent", + aliases = {"-p"}, + metaVar = "NAME", + usage = "parent project" + ) private ProjectControl newParent; @Option(name = "--permissions-only", usage = "create project for use only as parent") private boolean permissionsOnly; - @Option(name = "--description", aliases = {"-d"}, metaVar = "DESCRIPTION", usage = "description of project") + @Option( + name = "--description", + aliases = {"-d"}, + metaVar = "DESCRIPTION", + usage = "description of project" + ) private String projectDescription = ""; - @Option(name = "--submit-type", aliases = {"-t"}, usage = "project submit type") + @Option( + name = "--submit-type", + aliases = {"-t"}, + usage = "project submit type" + ) private SubmitType submitType; @Option(name = "--contributor-agreements", usage = "if contributor agreement is required") @@ -76,15 +100,26 @@ final class CreateProjectCommand extends SshCommand { @Option(name = "--change-id", usage = "if change-id is required") private InheritableBoolean requireChangeID = InheritableBoolean.INHERIT; - @Option(name = "--new-change-for-all-not-in-target", usage = "if a new change will be created for every commit not in target branch") + @Option( + name = "--new-change-for-all-not-in-target", + usage = "if a new change will be created for every commit not in target branch" + ) private InheritableBoolean createNewChangeForAllNotInTarget = InheritableBoolean.INHERIT; - @Option(name = "--use-contributor-agreements", aliases = {"--ca"}, usage = "if contributor agreement is required") + @Option( + name = "--use-contributor-agreements", + aliases = {"--ca"}, + usage = "if contributor agreement is required" + ) void setUseContributorArgreements(@SuppressWarnings("unused") boolean on) { contributorAgreements = InheritableBoolean.TRUE; } - @Option(name = "--use-signed-off-by", aliases = {"--so"}, usage = "if signed-off-by is required") + @Option( + name = "--use-signed-off-by", + aliases = {"--so"}, + usage = "if signed-off-by is required" + ) void setUseSignedOffBy(@SuppressWarnings("unused") boolean on) { signedOffBy = InheritableBoolean.TRUE; } @@ -94,19 +129,30 @@ final class CreateProjectCommand extends SshCommand { contentMerge = InheritableBoolean.TRUE; } - @Option(name = "--require-change-id", aliases = {"--id"}, usage = "if change-id is required") + @Option( + name = "--require-change-id", + aliases = {"--id"}, + usage = "if change-id is required" + ) void setRequireChangeId(@SuppressWarnings("unused") boolean on) { requireChangeID = InheritableBoolean.TRUE; } - @Option(name = "--create-new-change-for-all-not-in-target", aliases = {"--ncfa"}, - usage = "if a new change will be created for every commit not in target branch") + @Option( + name = "--create-new-change-for-all-not-in-target", + aliases = {"--ncfa"}, + usage = "if a new change will be created for every commit not in target branch" + ) void setNewChangeForAllNotInTarget(@SuppressWarnings("unused") boolean on) { createNewChangeForAllNotInTarget = InheritableBoolean.TRUE; } - @Option(name = "--branch", aliases = {"-b"}, metaVar = "BRANCH", usage = "initial branch name\n" - + "(default: master)") + @Option( + name = "--branch", + aliases = {"-b"}, + metaVar = "BRANCH", + usage = "initial branch name\n" + "(default: master)" + ) private List branch; @Option(name = "--empty-commit", usage = "to create initial empty commit") @@ -115,18 +161,18 @@ final class CreateProjectCommand extends SshCommand { @Option(name = "--max-object-size-limit", usage = "max Git object size for this project") private String maxObjectSizeLimit; - @Option(name = "--plugin-config", - usage = "plugin configuration parameter with format '.='") + @Option( + name = "--plugin-config", + usage = "plugin configuration parameter with format '.='" + ) private List pluginConfigValues; @Argument(index = 0, metaVar = "NAME", usage = "name of project to be created") private String projectName; - @Inject - private GerritApi gApi; + @Inject private GerritApi gApi; - @Inject - private SuggestParentCandidates suggestParentCandidates; + @Inject private SuggestParentCandidates suggestParentCandidates; @Override protected void run() throws UnloggedFailure { @@ -161,8 +207,7 @@ final class CreateProjectCommand extends SshCommand { gApi.projects().create(input); } else { - List parentCandidates = - suggestParentCandidates.getNameKeys(); + List parentCandidates = suggestParentCandidates.getNameKeys(); for (Project.NameKey parent : parentCandidates) { stdout.print(parent + "\n"); @@ -174,17 +219,18 @@ final class CreateProjectCommand extends SshCommand { } @VisibleForTesting - Map> parsePluginConfigValues( - List pluginConfigValues) throws UnloggedFailure { + Map> parsePluginConfigValues(List pluginConfigValues) + throws UnloggedFailure { Map> m = new HashMap<>(); for (String pluginConfigValue : pluginConfigValues) { String[] s = pluginConfigValue.split("="); String[] s2 = s[0].split("\\."); if (s.length != 2 || s2.length != 2) { - throw die("Invalid plugin config value '" - + pluginConfigValue - + "', expected format '.='" - + " or '.='"); + throw die( + "Invalid plugin config value '" + + pluginConfigValue + + "', expected format '.='" + + " or '.='"); } ConfigValue value = new ConfigValue(); String v = s[1]; diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/DefaultCommandModule.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/DefaultCommandModule.java index c9cdbe05d5..108252ec99 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/DefaultCommandModule.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/DefaultCommandModule.java @@ -23,14 +23,13 @@ import com.google.gerrit.sshd.DispatchCommandProvider; import com.google.gerrit.sshd.SuExec; import com.google.gerrit.sshd.plugin.LfsPluginAuthCommand; - /** Register the commands a Gerrit server supports. */ public class DefaultCommandModule extends CommandModule { private final DownloadConfig downloadConfig; private final LfsPluginAuthCommand.Module lfsPluginAuthModule; - public DefaultCommandModule(boolean slave, DownloadConfig downloadCfg, - LfsPluginAuthCommand.Module module) { + public DefaultCommandModule( + boolean slave, DownloadConfig downloadCfg, LfsPluginAuthCommand.Module module) { slaveMode = slave; downloadConfig = downloadCfg; lfsPluginAuthModule = module; @@ -103,8 +102,7 @@ public class DefaultCommandModule extends CommandModule { command("gerrit-receive-pack").to(Commands.key(git, "receive-pack")); command(git, "receive-pack").to(Commands.key(gerrit, "receive-pack")); } - command(gerrit, "test-submit").toProvider( - new DispatchCommandProvider(testSubmit)); + command(gerrit, "test-submit").toProvider(new DispatchCommandProvider(testSubmit)); } command(gerrit, Receive.class); diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/FlushCaches.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/FlushCaches.java index 1f032251fe..21bfe9bddf 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/FlushCaches.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/FlushCaches.java @@ -29,16 +29,17 @@ import com.google.gerrit.server.config.PostCaches; import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.inject.Inject; - -import org.kohsuke.args4j.Option; - import java.util.ArrayList; import java.util.List; +import org.kohsuke.args4j.Option; /** Causes the caches to purge all entries and reload. */ @RequiresAnyCapability({FLUSH_CACHES, MAINTAIN_SERVER}) -@CommandMetaData(name = "flush-caches", description = "Flush some/all server caches from memory", - runsAt = MASTER_OR_SLAVE) +@CommandMetaData( + name = "flush-caches", + description = "Flush some/all server caches from memory", + runsAt = MASTER_OR_SLAVE +) final class FlushCaches extends SshCommand { @Option(name = "--cache", usage = "flush named cache", metaVar = "NAME") private List caches = new ArrayList<>(); @@ -49,11 +50,9 @@ final class FlushCaches extends SshCommand { @Option(name = "--list", usage = "list available caches") private boolean list; - @Inject - private ListCaches listCaches; + @Inject private ListCaches listCaches; - @Inject - private PostCaches postCaches; + @Inject private PostCaches postCaches; @Override protected void run() throws Failure { @@ -76,11 +75,9 @@ final class FlushCaches extends SshCommand { } if (all) { - postCaches.apply(new ConfigResource(), - new PostCaches.Input(FLUSH_ALL)); + postCaches.apply(new ConfigResource(), new PostCaches.Input(FLUSH_ALL)); } else { - postCaches.apply(new ConfigResource(), - new PostCaches.Input(FLUSH, caches)); + postCaches.apply(new ConfigResource(), new PostCaches.Input(FLUSH, caches)); } } catch (RestApiException e) { throw die(e.getMessage()); @@ -89,8 +86,8 @@ final class FlushCaches extends SshCommand { @SuppressWarnings("unchecked") private void doList() { - for (String name : (List) listCaches - .setFormat(OutputFormat.LIST).apply(new ConfigResource())) { + for (String name : + (List) listCaches.setFormat(OutputFormat.LIST).apply(new ConfigResource())) { stderr.print(name); stderr.print('\n'); } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/GarbageCollectionCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/GarbageCollectionCommand.java index 520d194ee0..b0b26faf1d 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/GarbageCollectionCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/GarbageCollectionCommand.java @@ -28,17 +28,14 @@ import com.google.gerrit.server.project.ProjectControl; import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.inject.Inject; - +import java.util.ArrayList; +import java.util.List; import org.kohsuke.args4j.Argument; import org.kohsuke.args4j.Option; -import java.util.ArrayList; -import java.util.List; - /** Runs the Git garbage collection. */ @RequiresAnyCapability({RUN_GC, MAINTAIN_SERVER}) -@CommandMetaData(name = "gc", description = "Run Git garbage collection", - runsAt = MASTER_OR_SLAVE) +@CommandMetaData(name = "gc", description = "Run Git garbage collection", runsAt = MASTER_OR_SLAVE) public class GarbageCollectionCommand extends SshCommand { @Option(name = "--all", usage = "runs the Git garbage collection for all projects") @@ -50,15 +47,18 @@ public class GarbageCollectionCommand extends SshCommand { @Option(name = "--aggressive", usage = "run aggressive garbage collection") private boolean aggressive; - @Argument(index = 0, required = false, multiValued = true, metaVar = "NAME", - usage = "projects for which the Git garbage collection should be run") + @Argument( + index = 0, + required = false, + multiValued = true, + metaVar = "NAME", + usage = "projects for which the Git garbage collection should be run" + ) private List projects = new ArrayList<>(); - @Inject - private ProjectCache projectCache; + @Inject private ProjectCache projectCache; - @Inject - private GarbageCollection.Factory garbageCollectionFactory; + @Inject private GarbageCollection.Factory garbageCollectionFactory; @Override public void run() throws Exception { @@ -71,8 +71,7 @@ public class GarbageCollectionCommand extends SshCommand { throw die("needs projects as command arguments or --all option"); } if (all && !projects.isEmpty()) { - throw die( - "either specify projects as command arguments or use --all option"); + throw die("either specify projects as command arguments or use --all option"); } } @@ -88,8 +87,9 @@ public class GarbageCollectionCommand extends SshCommand { } GarbageCollectionResult result = - garbageCollectionFactory.create().run(projectNames, aggressive, - showProgress ? stdout : null); + garbageCollectionFactory + .create() + .run(projectNames, aggressive, showProgress ? stdout : null); if (result.hasErrors()) { for (GarbageCollectionResult.Error e : result.getErrors()) { String msg; @@ -98,16 +98,20 @@ public class GarbageCollectionCommand extends SshCommand { msg = "error: project \"" + e.getProjectName() + "\" not found"; break; case GC_ALREADY_SCHEDULED: - msg = "error: garbage collection for project \"" - + e.getProjectName() + "\" was already scheduled"; + msg = + "error: garbage collection for project \"" + + e.getProjectName() + + "\" was already scheduled"; break; case GC_FAILED: - msg = "error: garbage collection for project \"" + e.getProjectName() - + "\" failed"; + msg = "error: garbage collection for project \"" + e.getProjectName() + "\" failed"; break; default: - msg = "error: garbage collection for project \"" + e.getProjectName() - + "\" failed: " + e.getType(); + msg = + "error: garbage collection for project \"" + + e.getProjectName() + + "\" failed: " + + e.getType(); } stdout.print(msg + "\n"); } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/IndexActivateCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/IndexActivateCommand.java index 49917003dc..bff14dd05d 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/IndexActivateCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/IndexActivateCommand.java @@ -21,20 +21,16 @@ import com.google.gerrit.lucene.ReindexerAlreadyRunningException; import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.inject.Inject; - import org.kohsuke.args4j.Argument; @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER) -@CommandMetaData(name = "activate", - description = "Activate the latest index version available") +@CommandMetaData(name = "activate", description = "Activate the latest index version available") public class IndexActivateCommand extends SshCommand { - @Argument(index = 0, required = true, metaVar = "INDEX", - usage = "index name to activate") + @Argument(index = 0, required = true, metaVar = "INDEX", usage = "index name to activate") private String name; - @Inject - private LuceneVersionManager luceneVersionManager; + @Inject private LuceneVersionManager luceneVersionManager; @Override protected void run() throws UnloggedFailure { diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/IndexChangesCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/IndexChangesCommand.java index f7d5c873a3..fc65cf3733 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/IndexChangesCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/IndexChangesCommand.java @@ -23,23 +23,24 @@ import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - -import org.kohsuke.args4j.Argument; - import java.io.IOException; import java.util.LinkedHashMap; import java.util.Map; +import org.kohsuke.args4j.Argument; @CommandMetaData(name = "changes", description = "Index changes") final class IndexChangesCommand extends SshCommand { - @Inject - private Index index; + @Inject private Index index; - @Inject - private ChangeArgumentParser changeArgumentParser; + @Inject private ChangeArgumentParser changeArgumentParser; - @Argument(index = 0, required = true, multiValued = true, metaVar = "CHANGE", - usage = "changes to index") + @Argument( + index = 0, + required = true, + multiValued = true, + metaVar = "CHANGE", + usage = "changes to index" + ) void addChange(String token) { try { changeArgumentParser.addChange(token, changes, null, false); @@ -58,8 +59,8 @@ final class IndexChangesCommand extends SshCommand { index.apply(rsrc, new Index.Input()); } catch (IOException | RestApiException | OrmException e) { ok = false; - writeError("error", String.format( - "failed to index change %s: %s", rsrc.getId(), e.getMessage())); + writeError( + "error", String.format("failed to index change %s: %s", rsrc.getId(), e.getMessage())); } } if (!ok) { diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/IndexStartCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/IndexStartCommand.java index 6629e3c74d..cee016c356 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/IndexStartCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/IndexStartCommand.java @@ -21,7 +21,6 @@ import com.google.gerrit.lucene.ReindexerAlreadyRunningException; import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.inject.Inject; - import org.kohsuke.args4j.Argument; import org.kohsuke.args4j.Option; @@ -32,12 +31,10 @@ public class IndexStartCommand extends SshCommand { @Option(name = "--force", usage = "force a re-index") private boolean force; - @Argument(index = 0, required = true, metaVar = "INDEX", - usage = "index name to start") + @Argument(index = 0, required = true, metaVar = "INDEX", usage = "index name to start") private String name; - @Inject - private LuceneVersionManager luceneVersionManager; + @Inject private LuceneVersionManager luceneVersionManager; @Override protected void run() throws UnloggedFailure { diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/KillCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/KillCommand.java index db9b0cc2f5..4ebc5683ac 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/KillCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/KillCommand.java @@ -28,21 +28,17 @@ import com.google.gerrit.server.config.TasksCollection; import com.google.gerrit.sshd.AdminHighPriorityCommand; import com.google.gerrit.sshd.SshCommand; import com.google.inject.Inject; - -import org.kohsuke.args4j.Argument; - import java.util.ArrayList; import java.util.List; +import org.kohsuke.args4j.Argument; /** Kill a task in the work queue. */ @AdminHighPriorityCommand @RequiresAnyCapability({KILL_TASK, MAINTAIN_SERVER}) final class KillCommand extends SshCommand { - @Inject - private TasksCollection tasksCollection; + @Inject private TasksCollection tasksCollection; - @Inject - private DeleteTask deleteTask; + @Inject private DeleteTask deleteTask; @Argument(index = 0, multiValued = true, required = true, metaVar = "ID") private final List taskIds = new ArrayList<>(); diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListGroupsCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListGroupsCommand.java index 2e11ef9b9b..8357a919e5 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListGroupsCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListGroupsCommand.java @@ -35,16 +35,16 @@ import com.google.gerrit.sshd.SshCommand; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; - +import java.io.PrintWriter; import org.kohsuke.args4j.Option; -import java.io.PrintWriter; - -@CommandMetaData(name = "ls-groups", description = "List groups visible to the caller", - runsAt = MASTER_OR_SLAVE) +@CommandMetaData( + name = "ls-groups", + description = "List groups visible to the caller", + runsAt = MASTER_OR_SLAVE +) public class ListGroupsCommand extends SshCommand { - @Inject - private MyListGroups impl; + @Inject private MyListGroups impl; @Override public void run() throws Exception { @@ -59,15 +59,20 @@ public class ListGroupsCommand extends SshCommand { parseCommandLine(impl); } - private static class MyListGroups extends ListGroups { - @Option(name = "--verbose", aliases = {"-v"}, - usage = "verbose output format with tab-separated columns for the " + - "group name, UUID, description, owner group name, " + - "owner group UUID, and whether the group is visible to all") + private static class MyListGroups extends ListGroups { + @Option( + name = "--verbose", + aliases = {"-v"}, + usage = + "verbose output format with tab-separated columns for the " + + "group name, UUID, description, owner group name, " + + "owner group UUID, and whether the group is visible to all" + ) private boolean verboseOutput; @Inject - MyListGroups(final GroupCache groupCache, + MyListGroups( + final GroupCache groupCache, final GroupControl.Factory groupControlFactory, final GroupControl.GenericFactory genericGroupControlFactory, final Provider identifiedUser, @@ -75,8 +80,15 @@ public class ListGroupsCommand extends SshCommand { final GetGroups accountGetGroups, final GroupJson json, GroupBackend groupBackend) { - super(groupCache, groupControlFactory, genericGroupControlFactory, - identifiedUser, userFactory, accountGetGroups, json, groupBackend); + super( + groupCache, + groupControlFactory, + genericGroupControlFactory, + identifiedUser, + userFactory, + accountGetGroups, + json, + groupBackend); } void display(final PrintWriter out) throws OrmException, BadRequestException { @@ -84,16 +96,17 @@ public class ListGroupsCommand extends SshCommand { for (final GroupInfo info : get()) { formatter.addColumn(MoreObjects.firstNonNull(info.name, "n/a")); if (verboseOutput) { - AccountGroup o = info.ownerId != null - ? groupCache.get(new AccountGroup.UUID(Url.decode(info.ownerId))) - : null; + AccountGroup o = + info.ownerId != null + ? groupCache.get(new AccountGroup.UUID(Url.decode(info.ownerId))) + : null; formatter.addColumn(Url.decode(info.id)); formatter.addColumn(Strings.nullToEmpty(info.description)); formatter.addColumn(o != null ? o.getName() : "n/a"); formatter.addColumn(o != null ? o.getGroupUUID().get() : ""); - formatter.addColumn(Boolean.toString(MoreObjects.firstNonNull( - info.options.visibleToAll, Boolean.FALSE))); + formatter.addColumn( + Boolean.toString(MoreObjects.firstNonNull(info.options.visibleToAll, Boolean.FALSE))); } formatter.nextLine(); } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListLoggingLevelCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListLoggingLevelCommand.java index bc6bc17ba0..bb50fb1606 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListLoggingLevelCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListLoggingLevelCommand.java @@ -20,18 +20,19 @@ import com.google.gerrit.common.data.GlobalCapability; import com.google.gerrit.extensions.annotations.RequiresCapability; import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; - +import java.util.Enumeration; +import java.util.Map; +import java.util.TreeMap; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.kohsuke.args4j.Argument; -import java.util.Enumeration; -import java.util.Map; -import java.util.TreeMap; - @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER) -@CommandMetaData(name = "ls-level", description = "list the level of loggers", - runsAt = MASTER_OR_SLAVE) +@CommandMetaData( + name = "ls-level", + description = "list the level of loggers", + runsAt = MASTER_OR_SLAVE +) public class ListLoggingLevelCommand extends SshCommand { @Argument(index = 0, required = false, metaVar = "NAME", usage = "used to match loggers") @@ -41,8 +42,7 @@ public class ListLoggingLevelCommand extends SshCommand { @Override protected void run() { Map logs = new TreeMap<>(); - for (Enumeration logger = LogManager.getCurrentLoggers(); logger - .hasMoreElements();) { + for (Enumeration logger = LogManager.getCurrentLoggers(); logger.hasMoreElements(); ) { Logger log = logger.nextElement(); if (name == null || log.getName().contains(name)) { logs.put(log.getName(), log.getEffectiveLevel().toString()); diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListMembersCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListMembersCommand.java index b24c4bfccf..ca7b18bead 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListMembersCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListMembersCommand.java @@ -29,20 +29,18 @@ import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - -import org.kohsuke.args4j.Argument; - import java.io.PrintWriter; import java.util.List; +import org.kohsuke.args4j.Argument; -/** - * Implements a command that allows the user to see the members of a group. - */ -@CommandMetaData(name = "ls-members", description = "List the members of a given group", - runsAt = MASTER_OR_SLAVE) +/** Implements a command that allows the user to see the members of a group. */ +@CommandMetaData( + name = "ls-members", + description = "List the members of a given group", + runsAt = MASTER_OR_SLAVE +) public class ListMembersCommand extends SshCommand { - @Inject - ListMembersCommandImpl impl; + @Inject ListMembersCommandImpl impl; @Override public void run() throws Exception { @@ -61,7 +59,8 @@ public class ListMembersCommand extends SshCommand { private final GroupCache groupCache; @Inject - protected ListMembersCommandImpl(GroupCache groupCache, + protected ListMembersCommandImpl( + GroupCache groupCache, Factory groupDetailFactory, AccountLoader.Factory accountLoaderFactory) { super(groupCache, groupDetailFactory, accountLoaderFactory); @@ -91,10 +90,8 @@ public class ListMembersCommand extends SshCommand { } formatter.addColumn(Integer.toString(member._accountId)); - formatter.addColumn(MoreObjects.firstNonNull( - member.username, "n/a")); - formatter.addColumn(MoreObjects.firstNonNull( - Strings.emptyToNull(member.name), "n/a")); + formatter.addColumn(MoreObjects.firstNonNull(member.username, "n/a")); + formatter.addColumn(MoreObjects.firstNonNull(Strings.emptyToNull(member.name), "n/a")); formatter.addColumn(MoreObjects.firstNonNull(member.email, "n/a")); formatter.nextLine(); } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListProjectsCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListProjectsCommand.java index d81c153cd7..0c3cdcb35b 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListProjectsCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListProjectsCommand.java @@ -20,14 +20,15 @@ import com.google.gerrit.server.project.ListProjects; import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.inject.Inject; - import java.util.List; -@CommandMetaData(name = "ls-projects", description = "List projects visible to the caller", - runsAt = MASTER_OR_SLAVE) +@CommandMetaData( + name = "ls-projects", + description = "List projects visible to the caller", + runsAt = MASTER_OR_SLAVE +) final class ListProjectsCommand extends SshCommand { - @Inject - private ListProjects impl; + @Inject private ListProjects impl; @Override public void run() throws Exception { diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/LsUserRefs.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/LsUserRefs.java index 2173652545..5b7f23b75d 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/LsUserRefs.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/LsUserRefs.java @@ -35,51 +35,54 @@ import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - +import java.io.IOException; +import java.util.Map; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; import org.kohsuke.args4j.Option; -import java.io.IOException; -import java.util.Map; - @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER) -@CommandMetaData(name = "ls-user-refs", description = "List refs visible to a specific user", - runsAt = MASTER_OR_SLAVE) +@CommandMetaData( + name = "ls-user-refs", + description = "List refs visible to a specific user", + runsAt = MASTER_OR_SLAVE +) public class LsUserRefs extends SshCommand { - @Inject - private AccountResolver accountResolver; + @Inject private AccountResolver accountResolver; - @Inject - private IdentifiedUser.GenericFactory userFactory; + @Inject private IdentifiedUser.GenericFactory userFactory; - @Inject - private ReviewDb db; + @Inject private ReviewDb db; - @Inject - private TagCache tagCache; + @Inject private TagCache tagCache; - @Inject - private ChangeNotes.Factory changeNotesFactory; + @Inject private ChangeNotes.Factory changeNotesFactory; - @Inject - @Nullable - private SearchingChangeCacheImpl changeCache; + @Inject @Nullable private SearchingChangeCacheImpl changeCache; - @Option(name = "--project", aliases = {"-p"}, metaVar = "PROJECT", - required = true, usage = "project for which the refs should be listed") + @Option( + name = "--project", + aliases = {"-p"}, + metaVar = "PROJECT", + required = true, + usage = "project for which the refs should be listed" + ) private ProjectControl projectControl; - @Option(name = "--user", aliases = {"-u"}, metaVar = "USER", - required = true, usage = "user for which the groups should be listed") + @Option( + name = "--user", + aliases = {"-u"}, + metaVar = "USER", + required = true, + usage = "user for which the groups should be listed" + ) private String userName; @Option(name = "--only-refs-heads", usage = "list only refs under refs/heads") private boolean onlyRefsHeads; - @Inject - private GitRepositoryManager repoManager; + @Inject private GitRepositoryManager repoManager; @Override protected void run() throws Failure { @@ -98,13 +101,13 @@ public class LsUserRefs extends SshCommand { IdentifiedUser user = userFactory.create(userAccount.getId()); ProjectControl userProjectControl = projectControl.forUser(user); - try (Repository repo = repoManager.openRepository( - userProjectControl.getProject().getNameKey())) { + try (Repository repo = + repoManager.openRepository(userProjectControl.getProject().getNameKey())) { try { - Map refsMap = new VisibleRefFilter( - tagCache, changeNotesFactory, changeCache, repo, - userProjectControl, db, true) - .filter(repo.getRefDatabase().getRefs(ALL), false); + Map refsMap = + new VisibleRefFilter( + tagCache, changeNotesFactory, changeCache, repo, userProjectControl, db, true) + .filter(repo.getRefDatabase().getRefs(ALL), false); for (final String ref : refsMap.keySet()) { if (!onlyRefsHeads || ref.startsWith(RefNames.REFS_HEADS)) { @@ -112,12 +115,11 @@ public class LsUserRefs extends SshCommand { } } } catch (IOException e) { - throw new Failure(1, "fatal: Error reading refs: '" - + projectControl.getProject().getNameKey(), e); + throw new Failure( + 1, "fatal: Error reading refs: '" + projectControl.getProject().getNameKey(), e); } } catch (RepositoryNotFoundException e) { - throw die("'" + projectControl.getProject().getNameKey() - + "': not a git archive"); + throw die("'" + projectControl.getProject().getNameKey() + "': not a git archive"); } catch (IOException e) { throw die("Error opening: '" + projectControl.getProject().getNameKey()); } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PatchSetParser.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PatchSetParser.java index a51876d481..9b02f384cb 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PatchSetParser.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PatchSetParser.java @@ -34,7 +34,6 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; - import java.util.ArrayList; import java.util.List; @@ -48,7 +47,8 @@ public class PatchSetParser { private final Provider self; @Inject - PatchSetParser(Provider db, + PatchSetParser( + Provider db, Provider queryProvider, ChangeNotes.Factory notesFactory, PatchSetUtil psUtil, @@ -62,8 +62,8 @@ public class PatchSetParser { this.self = self; } - public PatchSet parsePatchSet(String token, ProjectControl projectControl, - String branch) throws UnloggedFailure, OrmException { + public PatchSet parsePatchSet(String token, ProjectControl projectControl, String branch) + throws UnloggedFailure, OrmException { // By commit? // if (token.matches("^([0-9a-fA-F]{4," + RevId.LEN + "})$")) { @@ -119,8 +119,11 @@ public class PatchSetParser { if (projectControl != null || branch != null) { Change change = notes.getChange(); if (!inProject(change, projectControl)) { - throw error("change " + change.getId() + " not in project " - + projectControl.getProject().getName()); + throw error( + "change " + + change.getId() + + " not in project " + + projectControl.getProject().getName()); } if (!inBranch(change, branch)) { throw error("change " + change.getId() + " not in branch " + branch); @@ -132,23 +135,20 @@ public class PatchSetParser { throw error("\"" + token + "\" is not a valid patch set"); } - private ChangeNotes getNotes(@Nullable ProjectControl projectControl, - Change.Id changeId) throws OrmException, UnloggedFailure { + private ChangeNotes getNotes(@Nullable ProjectControl projectControl, Change.Id changeId) + throws OrmException, UnloggedFailure { if (projectControl != null) { - return notesFactory.create(db.get(), projectControl.getProject().getNameKey(), - changeId); + return notesFactory.create(db.get(), projectControl.getProject().getNameKey(), changeId); } try { ChangeControl ctl = changeFinder.findOne(changeId, self.get()); - return notesFactory.create(db.get(), ctl.getProject().getNameKey(), - changeId); + return notesFactory.create(db.get(), ctl.getProject().getNameKey(), changeId); } catch (NoSuchChangeException e) { throw error("\"" + changeId + "\" no such change"); } } - private static boolean inProject(Change change, - ProjectControl projectControl) { + private static boolean inProject(Change change, ProjectControl projectControl) { if (projectControl == null) { // No --project option, so they want every project. return true; diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginEnableCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginEnableCommand.java index 1d3ee9fbd4..d7c8f3ae58 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginEnableCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginEnableCommand.java @@ -24,20 +24,16 @@ import com.google.gerrit.server.plugins.PluginLoader; import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.inject.Inject; - +import java.util.List; import org.kohsuke.args4j.Argument; -import java.util.List; - @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER) -@CommandMetaData(name = "enable", description = "Enable plugins", - runsAt = MASTER_OR_SLAVE) +@CommandMetaData(name = "enable", description = "Enable plugins", runsAt = MASTER_OR_SLAVE) final class PluginEnableCommand extends SshCommand { @Argument(index = 0, metaVar = "NAME", required = true, usage = "plugin(s) to enable") List names; - @Inject - private PluginLoader loader; + @Inject private PluginLoader loader; @Override protected void run() throws UnloggedFailure { diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginInstallCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginInstallCommand.java index 5d6621f48e..5a47cb0899 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginInstallCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginInstallCommand.java @@ -24,10 +24,6 @@ import com.google.gerrit.server.plugins.PluginLoader; import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.inject.Inject; - -import org.kohsuke.args4j.Argument; -import org.kohsuke.args4j.Option; - import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -35,12 +31,17 @@ import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; +import org.kohsuke.args4j.Argument; +import org.kohsuke.args4j.Option; @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER) -@CommandMetaData(name = "install", description = "Install/Add a plugin", - runsAt = MASTER_OR_SLAVE) +@CommandMetaData(name = "install", description = "Install/Add a plugin", runsAt = MASTER_OR_SLAVE) final class PluginInstallCommand extends SshCommand { - @Option(name = "--name", aliases = {"-n"}, usage = "install under name") + @Option( + name = "--name", + aliases = {"-n"}, + usage = "install under name" + ) private String name; @Option(name = "-") @@ -51,8 +52,7 @@ final class PluginInstallCommand extends SshCommand { @Argument(index = 0, metaVar = "-|URL", usage = "JAR to load") private String source; - @Inject - private PluginLoader loader; + @Inject private PluginLoader loader; @Override protected void run() throws UnloggedFailure { @@ -78,8 +78,7 @@ final class PluginInstallCommand extends SshCommand { InputStream data; if ("-".equalsIgnoreCase(source)) { data = in; - } else if (new File(source).isFile() - && source.equals(new File(source).getAbsolutePath())) { + } else if (new File(source).isFile() && source.equals(new File(source).getAbsolutePath())) { try { data = new FileInputStream(new File(source)); } catch (FileNotFoundException e) { @@ -100,8 +99,7 @@ final class PluginInstallCommand extends SshCommand { throw die("cannot install plugin"); } catch (PluginInstallException e) { e.printStackTrace(stderr); - String msg = - String.format("Plugin failed to install. Cause: %s", e.getMessage()); + String msg = String.format("Plugin failed to install. Cause: %s", e.getMessage()); throw die(msg); } finally { try { diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginLsCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginLsCommand.java index d45d76e604..78c952679d 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginLsCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginLsCommand.java @@ -24,11 +24,9 @@ import com.google.gerrit.sshd.SshCommand; import com.google.inject.Inject; @RequiresCapability(GlobalCapability.VIEW_PLUGINS) -@CommandMetaData(name = "ls", description = "List the installed plugins", - runsAt = MASTER_OR_SLAVE) +@CommandMetaData(name = "ls", description = "List the installed plugins", runsAt = MASTER_OR_SLAVE) final class PluginLsCommand extends SshCommand { - @Inject - private ListPlugins impl; + @Inject private ListPlugins impl; @Override public void run() throws Exception { diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginReloadCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginReloadCommand.java index 4e195ca6fd..0f2c912db9 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginReloadCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginReloadCommand.java @@ -24,20 +24,16 @@ import com.google.gerrit.server.plugins.PluginLoader; import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.inject.Inject; - +import java.util.List; import org.kohsuke.args4j.Argument; -import java.util.List; - @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER) -@CommandMetaData(name = "reload", description = "Reload/Restart plugins", - runsAt = MASTER_OR_SLAVE) +@CommandMetaData(name = "reload", description = "Reload/Restart plugins", runsAt = MASTER_OR_SLAVE) final class PluginReloadCommand extends SshCommand { @Argument(index = 0, metaVar = "NAME", usage = "plugins to reload/restart") private List names; - @Inject - private PluginLoader loader; + @Inject private PluginLoader loader; @Override protected void run() throws UnloggedFailure { diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginRemoveCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginRemoveCommand.java index 8e87b0f4de..8a38739820 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginRemoveCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginRemoveCommand.java @@ -23,20 +23,16 @@ import com.google.gerrit.server.plugins.PluginLoader; import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.inject.Inject; - +import java.util.List; import org.kohsuke.args4j.Argument; -import java.util.List; - @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER) -@CommandMetaData(name = "remove", description = "Disable plugins", - runsAt = MASTER_OR_SLAVE) +@CommandMetaData(name = "remove", description = "Disable plugins", runsAt = MASTER_OR_SLAVE) final class PluginRemoveCommand extends SshCommand { @Argument(index = 0, metaVar = "NAME", required = true, usage = "plugin to remove") List names; - @Inject - private PluginLoader loader; + @Inject private PluginLoader loader; @Override protected void run() throws UnloggedFailure { diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Query.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Query.java index 8bde7439e9..1192eb5a39 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Query.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Query.java @@ -19,16 +19,13 @@ import com.google.gerrit.server.query.change.OutputStreamQuery.OutputFormat; import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.inject.Inject; - +import java.util.List; import org.kohsuke.args4j.Argument; import org.kohsuke.args4j.Option; -import java.util.List; - @CommandMetaData(name = "query", description = "Query the change database") class Query extends SshCommand { - @Inject - private OutputStreamQuery processor; + @Inject private OutputStreamQuery processor; @Option(name = "--format", metaVar = "FMT", usage = "Output display format") void setFormat(OutputFormat format) { @@ -45,7 +42,10 @@ class Query extends SshCommand { processor.setIncludePatchSets(on); } - @Option(name = "--all-approvals", usage = "Include information about all patch sets and approvals") + @Option( + name = "--all-approvals", + usage = "Include information about all patch sets and approvals" + ) void setApprovals(boolean on) { if (on) { processor.setIncludePatchSets(on); @@ -83,12 +83,22 @@ class Query extends SshCommand { processor.setIncludeSubmitRecords(on); } - @Option(name = "--start", aliases = {"-S"}, usage = "Number of changes to skip") + @Option( + name = "--start", + aliases = {"-S"}, + usage = "Number of changes to skip" + ) void setStart(int start) { processor.setStart(start); } - @Argument(index = 0, required = true, multiValued = true, metaVar = "QUERY", usage = "Query to execute") + @Argument( + index = 0, + required = true, + multiValued = true, + metaVar = "QUERY", + usage = "Query to execute" + ) private List query; @Override @@ -100,8 +110,8 @@ class Query extends SshCommand { protected void parseCommandLine() throws UnloggedFailure { processor.setOutput(out, OutputFormat.TEXT); super.parseCommandLine(); - if (processor.getIncludeFiles() && - !(processor.getIncludePatchSets() || processor.getIncludeCurrentPatchSet())) { + if (processor.getIncludeFiles() + && !(processor.getIncludePatchSets() || processor.getIncludeCurrentPatchSet())) { throw die("--files option needs --patch-sets or --current-patch-set"); } } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/QueryShell.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/QueryShell.java index 25e49b200a..4201c2cc99 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/QueryShell.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/QueryShell.java @@ -27,7 +27,6 @@ import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.SchemaFactory; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -53,7 +52,9 @@ public class QueryShell { } public enum OutputFormat { - PRETTY, JSON, JSON_SINGLE + PRETTY, + JSON, + JSON_SINGLE } private final BufferedReader in; @@ -66,8 +67,10 @@ public class QueryShell { private Statement statement; @Inject - QueryShell(final SchemaFactory dbFactory, - @Assisted final InputStream in, @Assisted final OutputStream out) { + QueryShell( + final SchemaFactory dbFactory, + @Assisted final InputStream in, + @Assisted final OutputStream out) { this.dbFactory = dbFactory; this.in = new BufferedReader(new InputStreamReader(in, UTF_8)); this.out = new PrintWriter(new OutputStreamWriter(out, UTF_8)); @@ -131,7 +134,7 @@ public class QueryShell { private void readEvalPrintLoop() { final StringBuilder buffer = new StringBuilder(); boolean executed = false; - for (;;) { + for (; ; ) { if (outputFormat == OutputFormat.PRETTY) { print(buffer.length() == 0 || executed ? "gerrit> " : " -> "); } @@ -176,13 +179,14 @@ public class QueryShell { final String msg = "'\\" + line + "' not supported"; switch (outputFormat) { case JSON_SINGLE: - case JSON: { - final JsonObject err = new JsonObject(); - err.addProperty("type", "error"); - err.addProperty("message", msg); - println(err.toString()); - break; - } + case JSON: + { + final JsonObject err = new JsonObject(); + err.addProperty("type", "error"); + err.addProperty("message", msg); + println(err.toString()); + break; + } case PRETTY: default: println("ERROR: " + msg); @@ -224,7 +228,10 @@ public class QueryShell { if (outputFormat == OutputFormat.PRETTY) { println(" List of relations"); } - showResultSet(rs, false, 0, + showResultSet( + rs, + false, + 0, Identity.create(rs, "TABLE_SCHEM"), Identity.create(rs, "TABLE_NAME"), Identity.create(rs, "TABLE_TYPE")); @@ -258,7 +265,10 @@ public class QueryShell { if (outputFormat == OutputFormat.PRETTY) { println(" Table " + tableName); } - showResultSet(rs, true, 0, + showResultSet( + rs, + true, + 0, Identity.create(rs, "COLUMN_NAME"), new Function("TYPE") { @Override @@ -355,14 +365,15 @@ public class QueryShell { final long ms = TimeUtil.nowMs() - start; switch (outputFormat) { case JSON_SINGLE: - case JSON: { - final JsonObject tail = new JsonObject(); - tail.addProperty("type", "update-stats"); - tail.addProperty("rowCount", updateCount); - tail.addProperty("runTimeMilliseconds", ms); - println(tail.toString()); - break; - } + case JSON: + { + final JsonObject tail = new JsonObject(); + tail.addProperty("type", "update-stats"); + tail.addProperty("rowCount", updateCount); + tail.addProperty("runTimeMilliseconds", ms); + println(tail.toString()); + break; + } case PRETTY: default: @@ -379,20 +390,19 @@ public class QueryShell { * Outputs a result set to stdout. * * @param rs ResultSet to show. - * @param alreadyOnRow true if rs is already on the first row. false - * otherwise. - * @param start Timestamp in milliseconds when executing the statement - * started. This timestamp is used to compute statistics about the - * statement. If no statistics should be shown, set it to 0. + * @param alreadyOnRow true if rs is already on the first row. false otherwise. + * @param start Timestamp in milliseconds when executing the statement started. This timestamp is + * used to compute statistics about the statement. If no statistics should be shown, set it to + * 0. * @param show Functions to map columns * @throws SQLException */ - private void showResultSet(final ResultSet rs, boolean alreadyOnRow, - long start, Function... show) throws SQLException { + private void showResultSet(final ResultSet rs, boolean alreadyOnRow, long start, Function... show) + throws SQLException { switch (outputFormat) { case JSON_SINGLE: case JSON: - showResultSetJson(rs, alreadyOnRow, start, show); + showResultSetJson(rs, alreadyOnRow, start, show); break; case PRETTY: default: @@ -405,16 +415,15 @@ public class QueryShell { * Outputs a result set to stdout in Json format. * * @param rs ResultSet to show. - * @param alreadyOnRow true if rs is already on the first row. false - * otherwise. - * @param start Timestamp in milliseconds when executing the statement - * started. This timestamp is used to compute statistics about the - * statement. If no statistics should be shown, set it to 0. + * @param alreadyOnRow true if rs is already on the first row. false otherwise. + * @param start Timestamp in milliseconds when executing the statement started. This timestamp is + * used to compute statistics about the statement. If no statistics should be shown, set it to + * 0. * @param show Functions to map columns * @throws SQLException */ - private void showResultSetJson(final ResultSet rs, boolean alreadyOnRow, - long start, Function... show) throws SQLException { + private void showResultSetJson( + final ResultSet rs, boolean alreadyOnRow, long start, Function... show) throws SQLException { JsonArray collector = new JsonArray(); final ResultSetMetaData meta = rs.getMetaData(); final Function[] columnMap; @@ -497,16 +506,15 @@ public class QueryShell { * Outputs a result set to stdout in plain text format. * * @param rs ResultSet to show. - * @param alreadyOnRow true if rs is already on the first row. false - * otherwise. - * @param start Timestamp in milliseconds when executing the statement - * started. This timestamp is used to compute statistics about the - * statement. If no statistics should be shown, set it to 0. + * @param alreadyOnRow true if rs is already on the first row. false otherwise. + * @param start Timestamp in milliseconds when executing the statement started. This timestamp is + * used to compute statistics about the statement. If no statistics should be shown, set it to + * 0. * @param show Functions to map columns * @throws SQLException */ - private void showResultSetPretty(final ResultSet rs, boolean alreadyOnRow, - long start, Function... show) throws SQLException { + private void showResultSetPretty( + final ResultSet rs, boolean alreadyOnRow, long start, Function... show) throws SQLException { final ResultSetMetaData meta = rs.getMetaData(); final Function[] columnMap; @@ -608,21 +616,21 @@ public class QueryShell { if (start != 0) { final int rowCount = rows.size(); final long ms = TimeUtil.nowMs() - start; - println("(" + rowCount + (rowCount == 1 ? " row" : " rows") - + "; " + ms + " ms)"); + println("(" + rowCount + (rowCount == 1 ? " row" : " rows") + "; " + ms + " ms)"); } } private void warning(final String msg) { switch (outputFormat) { case JSON_SINGLE: - case JSON: { - final JsonObject obj = new JsonObject(); - obj.addProperty("type", "warning"); - obj.addProperty("message", msg); - println(obj.toString()); - break; - } + case JSON: + { + final JsonObject obj = new JsonObject(); + obj.addProperty("type", "warning"); + obj.addProperty("message", msg); + println(obj.toString()); + break; + } case PRETTY: default: @@ -634,13 +642,14 @@ public class QueryShell { private void error(final SQLException err) { switch (outputFormat) { case JSON_SINGLE: - case JSON: { - final JsonObject obj = new JsonObject(); - obj.addProperty("type", "error"); - obj.addProperty("message", err.getMessage()); - println(obj.toString()); - break; - } + case JSON: + { + final JsonObject obj = new JsonObject(); + obj.addProperty("type", "error"); + obj.addProperty("message", err.getMessage()); + println(obj.toString()); + break; + } case PRETTY: default: @@ -717,8 +726,7 @@ public class QueryShell { } private static class Identity extends Function { - static Identity create(final ResultSet rs, final String name) - throws SQLException { + static Identity create(final ResultSet rs, final String name) throws SQLException { return new Identity(rs.findColumn(name), name); } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Receive.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Receive.java index 011cb91a85..2dc439b4f5 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Receive.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Receive.java @@ -24,7 +24,12 @@ import com.google.gerrit.sshd.AbstractGitCommand; import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshSession; import com.google.inject.Inject; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; import org.eclipse.jgit.errors.TooLargeObjectInPackException; import org.eclipse.jgit.errors.UnpackException; import org.eclipse.jgit.lib.Ref; @@ -35,39 +40,41 @@ import org.kohsuke.args4j.Option; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - /** Receives change upload over SSH using the Git receive-pack protocol. */ -@CommandMetaData(name = "receive-pack", description = "Standard Git server side command for client side git push") +@CommandMetaData( + name = "receive-pack", + description = "Standard Git server side command for client side git push" +) final class Receive extends AbstractGitCommand { private static final Logger log = LoggerFactory.getLogger(Receive.class); - @Inject - private AsyncReceiveCommits.Factory factory; + @Inject private AsyncReceiveCommits.Factory factory; - @Inject - private IdentifiedUser currentUser; + @Inject private IdentifiedUser currentUser; - @Inject - private IdentifiedUser.GenericFactory identifiedUserFactory; + @Inject private IdentifiedUser.GenericFactory identifiedUserFactory; - @Inject - private SshSession session; + @Inject private SshSession session; private final Set reviewerId = new HashSet<>(); private final Set ccId = new HashSet<>(); - @Option(name = "--reviewer", aliases = {"--re"}, metaVar = "EMAIL", usage = "request reviewer for change(s)") + @Option( + name = "--reviewer", + aliases = {"--re"}, + metaVar = "EMAIL", + usage = "request reviewer for change(s)" + ) void addReviewer(final Account.Id id) { reviewerId.add(id); } - @Option(name = "--cc", aliases = {}, metaVar = "EMAIL", usage = "CC user on change(s)") + @Option( + name = "--cc", + aliases = {}, + metaVar = "EMAIL", + usage = "CC user on change(s)" + ) void addCC(final Account.Id id) { ccId.add(id); } @@ -78,8 +85,7 @@ final class Receive extends AbstractGitCommand { throw new Failure(1, "fatal: receive-pack not permitted on this server"); } - final ReceiveCommits receive = factory.create(projectControl, repo) - .getReceiveCommits(); + final ReceiveCommits receive = factory.create(projectControl, repo).getReceiveCommits(); Capable r = receive.canUpload(); if (r != Capable.OK) { @@ -103,7 +109,8 @@ final class Receive extends AbstractGitCommand { if (badStream.getCause() instanceof TooLargeObjectInPackException) { StringBuilder msg = new StringBuilder(); msg.append("Receive error on project \"") - .append(projectControl.getProject().getName()).append("\""); + .append(projectControl.getProject().getName()) + .append("\""); msg.append(" (user "); msg.append(currentUser.getAccount().getUserName()); msg.append(" account "); @@ -119,7 +126,8 @@ final class Receive extends AbstractGitCommand { // StringBuilder msg = new StringBuilder(); msg.append("Unpack error on project \"") - .append(projectControl.getProject().getName()).append("\":\n"); + .append(projectControl.getProject().getName()) + .append("\":\n"); msg.append(" AdvertiseRefsHook: ").append(rp.getAdvertiseRefsHook()); if (rp.getAdvertiseRefsHook() == AdvertiseRefsHook.DEFAULT) { @@ -135,12 +143,14 @@ final class Receive extends AbstractGitCommand { Map adv = rp.getAdvertisedRefs(); msg.append(" Visible references (").append(adv.size()).append("):\n"); for (Ref ref : adv.values()) { - msg.append(" - ").append(ref.getObjectId().abbreviate(8).name()) - .append(" ").append(ref.getName()).append("\n"); + msg.append(" - ") + .append(ref.getObjectId().abbreviate(8).name()) + .append(" ") + .append(ref.getName()) + .append("\n"); } - Map allRefs = - rp.getRepository().getRefDatabase().getRefs(RefDatabase.ALL); + Map allRefs = rp.getRepository().getRefDatabase().getRefs(RefDatabase.ALL); List hidden = new ArrayList<>(); for (Ref ref : allRefs.values()) { if (!adv.containsKey(ref.getName())) { @@ -150,8 +160,11 @@ final class Receive extends AbstractGitCommand { msg.append(" Hidden references (").append(hidden.size()).append("):\n"); for (Ref ref : hidden) { - msg.append(" - ").append(ref.getObjectId().abbreviate(8).name()) - .append(" ").append(ref.getName()).append("\n"); + msg.append(" - ") + .append(ref.getObjectId().abbreviate(8).name()) + .append(" ") + .append(ref.getName()) + .append("\n"); } } @@ -165,8 +178,7 @@ final class Receive extends AbstractGitCommand { for (final Account.Id id : who) { final IdentifiedUser user = identifiedUserFactory.create(id); if (!projectControl.forUser(user).isVisible()) { - throw die(type + " " - + user.getAccount().getFullName() + " cannot access the project"); + throw die(type + " " + user.getAccount().getFullName() + " cannot access the project"); } } } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/RenameGroupCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/RenameGroupCommand.java index fa20219324..49b468f072 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/RenameGroupCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/RenameGroupCommand.java @@ -25,35 +25,34 @@ import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - -import org.kohsuke.args4j.Argument; - import java.io.IOException; +import org.kohsuke.args4j.Argument; @CommandMetaData(name = "rename-group", description = "Rename an account group") public class RenameGroupCommand extends SshCommand { - @Argument(index = 0, required = true, metaVar = "GROUP", usage = "name of the group to be renamed") + @Argument( + index = 0, + required = true, + metaVar = "GROUP", + usage = "name of the group to be renamed" + ) private String groupName; @Argument(index = 1, required = true, metaVar = "NEWNAME", usage = "new name of the group") private String newGroupName; - @Inject - private GroupsCollection groups; + @Inject private GroupsCollection groups; - @Inject - private PutName putName; + @Inject private PutName putName; @Override protected void run() throws Failure { try { - GroupResource rsrc = groups.parse(TopLevelResource.INSTANCE, - IdString.fromDecoded(groupName)); + GroupResource rsrc = groups.parse(TopLevelResource.INSTANCE, IdString.fromDecoded(groupName)); PutName.Input input = new PutName.Input(); input.name = newGroupName; putName.apply(rsrc, input); - } catch (RestApiException | OrmException | IOException - | NoSuchGroupException e) { + } catch (RestApiException | OrmException | IOException | NoSuchGroupException e) { throw die(e); } } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ReviewCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ReviewCommand.java index 02aab64d9b..a405a8f7a0 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ReviewCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ReviewCommand.java @@ -42,12 +42,6 @@ import com.google.gerrit.util.cli.CmdLineParser; import com.google.gson.JsonSyntaxException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - -import org.kohsuke.args4j.Argument; -import org.kohsuke.args4j.Option; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; @@ -57,11 +51,14 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeMap; +import org.kohsuke.args4j.Argument; +import org.kohsuke.args4j.Option; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @CommandMetaData(name = "review", description = "Apply reviews to one or more patch sets") public class ReviewCommand extends SshCommand { - private static final Logger log = - LoggerFactory.getLogger(ReviewCommand.class); + private static final Logger log = LoggerFactory.getLogger(ReviewCommand.class); @Override protected final CmdLineParser newCmdLineParser(Object options) { @@ -74,9 +71,13 @@ public class ReviewCommand extends SshCommand { private final Set patchSets = new HashSet<>(); - @Argument(index = 0, required = true, multiValued = true, - metaVar = "{COMMIT | CHANGE,PATCHSET}", - usage = "list of commits or patch sets to review") + @Argument( + index = 0, + required = true, + multiValued = true, + metaVar = "{COMMIT | CHANGE,PATCHSET}", + usage = "list of commits or patch sets to review" + ) void addPatchSetId(final String token) { try { PatchSet ps = psParser.parsePatchSet(token, projectControl, branch); @@ -88,16 +89,30 @@ public class ReviewCommand extends SshCommand { } } - @Option(name = "--project", aliases = "-p", usage = "project containing the specified patch set(s)") + @Option( + name = "--project", + aliases = "-p", + usage = "project containing the specified patch set(s)" + ) private ProjectControl projectControl; @Option(name = "--branch", aliases = "-b", usage = "branch containing the specified patch set(s)") private String branch; - @Option(name = "--message", aliases = "-m", usage = "cover message to publish on change(s)", metaVar = "MESSAGE") + @Option( + name = "--message", + aliases = "-m", + usage = "cover message to publish on change(s)", + metaVar = "MESSAGE" + ) private String changeComment; - @Option(name = "--notify", aliases = "-n", usage = "Who to send email notifications to after the review is stored.", metaVar = "NOTIFYHANDLING") + @Option( + name = "--notify", + aliases = "-n", + usage = "Who to send email notifications to after the review is stored.", + metaVar = "NOTIFYHANDLING" + ) private NotifyHandling notify; @Option(name = "--abandon", usage = "abandon the specified change(s)") @@ -124,31 +139,39 @@ public class ReviewCommand extends SshCommand { @Option(name = "--json", aliases = "-j", usage = "read review input json from stdin") private boolean json; - @Option(name = "--strict-labels", usage = "Strictly check if the labels " - + "specified can be applied to the given patch set(s)") + @Option( + name = "--strict-labels", + usage = "Strictly check if the labels " + "specified can be applied to the given patch set(s)" + ) private boolean strictLabels; - @Option(name = "--tag", aliases = "-t", usage = "applies a tag to the given review", metaVar = "TAG") + @Option( + name = "--tag", + aliases = "-t", + usage = "applies a tag to the given review", + metaVar = "TAG" + ) private String changeTag; - @Option(name = "--label", aliases = "-l", usage = "custom label(s) to assign", metaVar = "LABEL=VALUE") + @Option( + name = "--label", + aliases = "-l", + usage = "custom label(s) to assign", + metaVar = "LABEL=VALUE" + ) void addLabel(final String token) { LabelVote v = LabelVote.parseWithEquals(token); LabelType.checkName(v.label()); // Disallow SUBM. customLabels.put(v.label(), v.value()); } - @Inject - private ProjectControl.Factory projectControlFactory; + @Inject private ProjectControl.Factory projectControlFactory; - @Inject - private AllProjectsName allProjects; + @Inject private AllProjectsName allProjects; - @Inject - private GerritApi gApi; + @Inject private GerritApi gApi; - @Inject - private PatchSetParser psParser; + @Inject private PatchSetParser psParser; private List optionList; private Map customLabels; @@ -245,12 +268,10 @@ public class ReviewCommand extends SshCommand { writeError("error", e.getMessage() + "\n"); } catch (NoSuchChangeException e) { ok = false; - writeError("error", - "no such change " + patchSet.getId().getParentKey().get()); + writeError("error", "no such change " + patchSet.getId().getParentKey().get()); } catch (Exception e) { ok = false; - writeError("fatal", "internal server error while reviewing " - + patchSet.getId() + "\n"); + writeError("fatal", "internal server error while reviewing " + patchSet.getId() + "\n"); log.error("internal error while reviewing " + patchSet.getId(), e); } } @@ -260,8 +281,7 @@ public class ReviewCommand extends SshCommand { } } - private void applyReview(PatchSet patchSet, - final ReviewInput review) throws RestApiException { + private void applyReview(PatchSet patchSet, final ReviewInput review) throws RestApiException { gApi.changes() .id(patchSet.getId().getParentKey().get()) .revision(patchSet.getRevision().get()) @@ -270,8 +290,7 @@ public class ReviewCommand extends SshCommand { private ReviewInput reviewFromJson() throws UnloggedFailure { try (InputStreamReader r = new InputStreamReader(in, UTF_8)) { - return OutputFormat.JSON.newGson(). - fromJson(CharStreams.toString(r), ReviewInput.class); + return OutputFormat.JSON.newGson().fromJson(CharStreams.toString(r), ReviewInput.class); } catch (IOException | JsonSyntaxException e) { writeError("error", e.getMessage() + '\n'); throw die("internal error while reading review input"); @@ -364,9 +383,7 @@ public class ReviewCommand extends SshCommand { } for (LabelType type : allProjectsControl.getLabelTypes().getLabelTypes()) { - StringBuilder usage = new StringBuilder("score for ") - .append(type.getName()) - .append("\n"); + StringBuilder usage = new StringBuilder("score for ").append(type.getName()).append("\n"); for (LabelValue v : type.getValues()) { usage.append(v.format()).append("\n"); diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ScpCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ScpCommand.java index 5fc877cbd0..5bc19d5061 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ScpCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ScpCommand.java @@ -28,15 +28,13 @@ import com.google.gerrit.server.tools.ToolsCatalog; import com.google.gerrit.server.tools.ToolsCatalog.Entry; import com.google.gerrit.sshd.BaseCommand; import com.google.inject.Inject; - -import org.apache.sshd.server.Environment; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.ByteArrayOutputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.UnsupportedEncodingException; +import org.apache.sshd.server.Environment; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; final class ScpCommand extends BaseCommand { private static final String TYPE_DIR = "D"; @@ -48,8 +46,7 @@ final class ScpCommand extends BaseCommand { private boolean opt_f; private String root; - @Inject - private ToolsCatalog toc; + @Inject private ToolsCatalog toc; private IOException error; @Override @@ -85,12 +82,13 @@ final class ScpCommand extends BaseCommand { @Override public void start(final Environment env) { - startThread(new Runnable() { - @Override - public void run() { - runImp(); - } - }); + startThread( + new Runnable() { + @Override + public void run() { + runImp(); + } + }); } private void runImp() { @@ -130,8 +128,7 @@ final class ScpCommand extends BaseCommand { throw new IOException("Unsupported mode"); } } catch (IOException e) { - if (e.getClass() == IOException.class - && "Pipe closed".equals(e.getMessage())) { + if (e.getClass() == IOException.class && "Pipe closed".equals(e.getMessage())) { // Ignore a pipe closed error, its the user disconnecting from us // while we are waiting for them to stalk. // @@ -152,7 +149,7 @@ final class ScpCommand extends BaseCommand { private String readLine() throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); - for (;;) { + for (; ; ) { int c = in.read(); if (c == '\n') { return baos.toString(); @@ -195,8 +192,8 @@ final class ScpCommand extends BaseCommand { readAck(); } - private void header(final Entry dir, final int len) throws IOException, - UnsupportedEncodingException { + private void header(final Entry dir, final int len) + throws IOException, UnsupportedEncodingException { final StringBuilder buf = new StringBuilder(); switch (dir.getType()) { case DIR: diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetAccountCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetAccountCommand.java index 082395c7e1..7f3a90fa75 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetAccountCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetAccountCommand.java @@ -46,12 +46,6 @@ import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - -import org.eclipse.jgit.errors.ConfigInvalidException; -import org.eclipse.jgit.errors.RepositoryNotFoundException; -import org.kohsuke.args4j.Argument; -import org.kohsuke.args4j.Option; - import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; @@ -59,13 +53,22 @@ import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.errors.RepositoryNotFoundException; +import org.kohsuke.args4j.Argument; +import org.kohsuke.args4j.Option; -/** Set a user's account settings. **/ +/** Set a user's account settings. * */ @CommandMetaData(name = "set-account", description = "Change an account's settings") @RequiresCapability(GlobalCapability.MODIFY_ACCOUNT) final class SetAccountCommand extends SshCommand { - @Argument(index = 0, required = true, metaVar = "USER", usage = "full name, email-address, ssh username or account id") + @Argument( + index = 0, + required = true, + metaVar = "USER", + usage = "full name, email-address, ssh username or account id" + ) private Account.Id id; @Option(name = "--full-name", metaVar = "NAME", usage = "display name of the account") @@ -80,59 +83,63 @@ final class SetAccountCommand extends SshCommand { @Option(name = "--add-email", metaVar = "EMAIL", usage = "email addresses to add to the account") private List addEmails = new ArrayList<>(); - @Option(name = "--delete-email", metaVar = "EMAIL", usage = "email addresses to delete from the account") + @Option( + name = "--delete-email", + metaVar = "EMAIL", + usage = "email addresses to delete from the account" + ) private List deleteEmails = new ArrayList<>(); - @Option(name = "--preferred-email", metaVar = "EMAIL", usage = "a registered email address from the account") + @Option( + name = "--preferred-email", + metaVar = "EMAIL", + usage = "a registered email address from the account" + ) private String preferredEmail; @Option(name = "--add-ssh-key", metaVar = "-|KEY", usage = "public keys to add to the account") private List addSshKeys = new ArrayList<>(); - @Option(name = "--delete-ssh-key", metaVar = "-|KEY", usage = "public keys to delete from the account") + @Option( + name = "--delete-ssh-key", + metaVar = "-|KEY", + usage = "public keys to delete from the account" + ) private List deleteSshKeys = new ArrayList<>(); - @Option(name = "--http-password", metaVar = "PASSWORD", usage = "password for HTTP authentication for the account") + @Option( + name = "--http-password", + metaVar = "PASSWORD", + usage = "password for HTTP authentication for the account" + ) private String httpPassword; @Option(name = "--clear-http-password", usage = "clear HTTP password for the account") private boolean clearHttpPassword; - @Inject - private IdentifiedUser.GenericFactory genericUserFactory; + @Inject private IdentifiedUser.GenericFactory genericUserFactory; - @Inject - private CreateEmail.Factory createEmailFactory; + @Inject private CreateEmail.Factory createEmailFactory; - @Inject - private GetEmails getEmails; + @Inject private GetEmails getEmails; - @Inject - private DeleteEmail deleteEmail; + @Inject private DeleteEmail deleteEmail; - @Inject - private PutPreferred putPreferred; + @Inject private PutPreferred putPreferred; - @Inject - private PutName putName; + @Inject private PutName putName; - @Inject - private PutHttpPassword putHttpPassword; + @Inject private PutHttpPassword putHttpPassword; - @Inject - private PutActive putActive; + @Inject private PutActive putActive; - @Inject - private DeleteActive deleteActive; + @Inject private DeleteActive deleteActive; - @Inject - private AddSshKey addSshKey; + @Inject private AddSshKey addSshKey; - @Inject - private GetSshKeys getSshKeys; + @Inject private GetSshKeys getSshKeys; - @Inject - private DeleteSshKey deleteSshKey; + @Inject private DeleteSshKey deleteSshKey; private IdentifiedUser user; private AccountResource rsrc; @@ -148,8 +155,7 @@ final class SetAccountCommand extends SshCommand { throw die("--active and --inactive options are mutually exclusive."); } if (clearHttpPassword && !Strings.isNullOrEmpty(httpPassword)) { - throw die("--http-password and --clear-http-password options are " - + "mutually exclusive."); + throw die("--http-password and --clear-http-password options are " + "mutually exclusive."); } if (addSshKeys.contains("-") && deleteSshKeys.contains("-")) { throw die("Only one option may use the stdin"); @@ -161,13 +167,14 @@ final class SetAccountCommand extends SshCommand { deleteEmails = Collections.singletonList("ALL"); } if (deleteEmails.contains(preferredEmail)) { - throw die("--preferred-email and --delete-email options are mutually " + - "exclusive for the same email address."); + throw die( + "--preferred-email and --delete-email options are mutually " + + "exclusive for the same email address."); } } - private void setAccount() throws OrmException, IOException, UnloggedFailure, - ConfigInvalidException { + private void setAccount() + throws OrmException, IOException, UnloggedFailure, ConfigInvalidException { user = genericUserFactory.create(id); rsrc = new AccountResource(user); try { @@ -219,8 +226,8 @@ final class SetAccountCommand extends SshCommand { } } - private void addSshKeys(List sshKeys) throws RestApiException, - OrmException, IOException, ConfigInvalidException { + private void addSshKeys(List sshKeys) + throws RestApiException, OrmException, IOException, ConfigInvalidException { for (final String sshKey : sshKeys) { AddSshKey.Input in = new AddSshKey.Input(); in.raw = RawInputUtil.create(sshKey.getBytes(), "plain/text"); @@ -229,8 +236,8 @@ final class SetAccountCommand extends SshCommand { } private void deleteSshKeys(List sshKeys) - throws RestApiException, OrmException, RepositoryNotFoundException, - IOException, ConfigInvalidException { + throws RestApiException, OrmException, RepositoryNotFoundException, IOException, + ConfigInvalidException { List infos = getSshKeys.apply(rsrc); if (sshKeys.contains("ALL")) { for (SshKeyInfo i : infos) { @@ -239,8 +246,7 @@ final class SetAccountCommand extends SshCommand { } else { for (String sshKey : sshKeys) { for (SshKeyInfo i : infos) { - if (sshKey.trim().equals(i.sshPublicKey) - || sshKey.trim().equals(i.comment)) { + if (sshKey.trim().equals(i.sshPublicKey) || sshKey.trim().equals(i.comment)) { deleteSshKey(i); } } @@ -248,12 +254,12 @@ final class SetAccountCommand extends SshCommand { } } - private void deleteSshKey(SshKeyInfo i) throws AuthException, OrmException, - RepositoryNotFoundException, IOException, ConfigInvalidException { - AccountSshKey sshKey = new AccountSshKey( - new AccountSshKey.Id(user.getAccountId(), i.seq), i.sshPublicKey); - deleteSshKey.apply( - new AccountResource.SshKey(user, sshKey), null); + private void deleteSshKey(SshKeyInfo i) + throws AuthException, OrmException, RepositoryNotFoundException, IOException, + ConfigInvalidException { + AccountSshKey sshKey = + new AccountSshKey(new AccountSshKey.Id(user.getAccountId(), i.seq), i.sshPublicKey); + deleteSshKey.apply(new AccountResource.SshKey(user, sshKey), null); } private void addEmail(String email) @@ -268,22 +274,18 @@ final class SetAccountCommand extends SshCommand { } } - private void deleteEmail(String email) - throws RestApiException, OrmException, IOException { + private void deleteEmail(String email) throws RestApiException, OrmException, IOException { if (email.equals("ALL")) { List emails = getEmails.apply(rsrc); for (EmailInfo e : emails) { - deleteEmail.apply(new AccountResource.Email(user, e.email), - new DeleteEmail.Input()); + deleteEmail.apply(new AccountResource.Email(user, e.email), new DeleteEmail.Input()); } } else { - deleteEmail.apply(new AccountResource.Email(user, email), - new DeleteEmail.Input()); + deleteEmail.apply(new AccountResource.Email(user, email), new DeleteEmail.Input()); } } - private void putPreferred(String email) - throws RestApiException, OrmException, IOException { + private void putPreferred(String email) throws RestApiException, OrmException, IOException { for (EmailInfo e : getEmails.apply(rsrc)) { if (e.email.equals(email)) { putPreferred.apply(new AccountResource.Email(user, email), null); @@ -299,12 +301,10 @@ final class SetAccountCommand extends SshCommand { int idx = sshKeys.indexOf("-"); if (idx >= 0) { StringBuilder sshKey = new StringBuilder(); - BufferedReader br = - new BufferedReader(new InputStreamReader(in, UTF_8)); + BufferedReader br = new BufferedReader(new InputStreamReader(in, UTF_8)); String line; while ((line = br.readLine()) != null) { - sshKey.append(line) - .append("\n"); + sshKey.append(line).append("\n"); } sshKeys.set(idx, sshKey.toString()); } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetHeadCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetHeadCommand.java index 4fef018120..ce4116dece 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetHeadCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetHeadCommand.java @@ -22,7 +22,6 @@ import com.google.gerrit.server.project.SetHead.Input; import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.inject.Inject; - import org.kohsuke.args4j.Argument; import org.kohsuke.args4j.Option; diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetLoggingLevelCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetLoggingLevelCommand.java index 6277eb4943..4957a60fd8 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetLoggingLevelCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetLoggingLevelCommand.java @@ -21,7 +21,9 @@ import com.google.gerrit.common.data.GlobalCapability; import com.google.gerrit.extensions.annotations.RequiresCapability; import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; - +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Enumeration; import org.apache.log4j.Level; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; @@ -29,13 +31,12 @@ import org.apache.log4j.PropertyConfigurator; import org.apache.log4j.helpers.Loader; import org.kohsuke.args4j.Argument; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.Enumeration; - @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER) -@CommandMetaData(name = "set-level", description = "Change the level of loggers", - runsAt = MASTER_OR_SLAVE) +@CommandMetaData( + name = "set-level", + description = "Change the level of loggers", + runsAt = MASTER_OR_SLAVE +) public class SetLoggingLevelCommand extends SshCommand { private static final String LOG_CONFIGURATION = "log4j.properties"; private static final String JAVA_OPTIONS_LOG_CONFIG = "log4j.configuration"; @@ -64,8 +65,9 @@ public class SetLoggingLevelCommand extends SshCommand { if (level == LevelOption.RESET) { reset(); } else { - for (Enumeration logger = LogManager.getCurrentLoggers(); logger - .hasMoreElements();) { + for (Enumeration logger = LogManager.getCurrentLoggers(); + logger.hasMoreElements(); + ) { Logger log = logger.nextElement(); if (name == null || log.getName().contains(name)) { log.setLevel(Level.toLevel(level.name())); @@ -76,8 +78,7 @@ public class SetLoggingLevelCommand extends SshCommand { @SuppressWarnings("unchecked") private static void reset() throws MalformedURLException { - for (Enumeration logger = LogManager.getCurrentLoggers(); - logger.hasMoreElements();) { + for (Enumeration logger = LogManager.getCurrentLoggers(); logger.hasMoreElements(); ) { logger.nextElement().setLevel(null); } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetMembersCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetMembersCommand.java index 893c8f287a..ae47175ecb 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetMembersCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetMembersCommand.java @@ -34,61 +34,80 @@ import com.google.gerrit.server.group.GroupsCollection; import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.inject.Inject; - -import org.kohsuke.args4j.Argument; -import org.kohsuke.args4j.Option; - import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; +import org.kohsuke.args4j.Argument; +import org.kohsuke.args4j.Option; -@CommandMetaData(name = "set-members", description = "Modify members of specific group or number of groups") +@CommandMetaData( + name = "set-members", + description = "Modify members of specific group or number of groups" +) public class SetMembersCommand extends SshCommand { - @Option(name = "--add", aliases = {"-a"}, metaVar = "USER", usage = "users that should be added as group member") + @Option( + name = "--add", + aliases = {"-a"}, + metaVar = "USER", + usage = "users that should be added as group member" + ) private List accountsToAdd = new ArrayList<>(); - @Option(name = "--remove", aliases = {"-r"}, metaVar = "USER", usage = "users that should be removed from the group") + @Option( + name = "--remove", + aliases = {"-r"}, + metaVar = "USER", + usage = "users that should be removed from the group" + ) private List accountsToRemove = new ArrayList<>(); - @Option(name = "--include", aliases = {"-i"}, metaVar = "GROUP", usage = "group that should be included as group member") + @Option( + name = "--include", + aliases = {"-i"}, + metaVar = "GROUP", + usage = "group that should be included as group member" + ) private List groupsToInclude = new ArrayList<>(); - @Option(name = "--exclude", aliases = {"-e"}, metaVar = "GROUP", usage = "group that should be excluded from the group") + @Option( + name = "--exclude", + aliases = {"-e"}, + metaVar = "GROUP", + usage = "group that should be excluded from the group" + ) private List groupsToRemove = new ArrayList<>(); - @Argument(index = 0, required = true, multiValued = true, metaVar = "GROUP", usage = "groups to modify") + @Argument( + index = 0, + required = true, + multiValued = true, + metaVar = "GROUP", + usage = "groups to modify" + ) private List groups = new ArrayList<>(); - @Inject - private AddMembers addMembers; + @Inject private AddMembers addMembers; - @Inject - private DeleteMembers deleteMembers; + @Inject private DeleteMembers deleteMembers; - @Inject - private AddIncludedGroups addIncludedGroups; + @Inject private AddIncludedGroups addIncludedGroups; - @Inject - private DeleteIncludedGroups deleteIncludedGroups; + @Inject private DeleteIncludedGroups deleteIncludedGroups; - @Inject - private GroupsCollection groupsCollection; + @Inject private GroupsCollection groupsCollection; - @Inject - private GroupCache groupCache; + @Inject private GroupCache groupCache; - @Inject - private AccountCache accountCache; + @Inject private AccountCache accountCache; @Override protected void run() throws UnloggedFailure, Failure, Exception { try { for (AccountGroup.UUID groupUuid : groups) { GroupResource resource = - groupsCollection.parse(TopLevelResource.INSTANCE, - IdString.fromUrl(groupUuid.get())); + groupsCollection.parse(TopLevelResource.INSTANCE, IdString.fromUrl(groupUuid.get())); if (!accountsToRemove.isEmpty()) { deleteMembers.apply(resource, fromMembers(accountsToRemove)); reportMembersAction("removed from", resource, accountsToRemove); @@ -111,31 +130,28 @@ public class SetMembersCommand extends SshCommand { } } - private void reportMembersAction(String action, GroupResource group, - List accountIdList) throws UnsupportedEncodingException, - IOException { - String names = accountIdList.stream() - .map(accountId -> - MoreObjects.firstNonNull( - accountCache.get(accountId).getAccount().getPreferredEmail(), - "n/a")) - .collect(joining(", ")); + private void reportMembersAction( + String action, GroupResource group, List accountIdList) + throws UnsupportedEncodingException, IOException { + String names = + accountIdList + .stream() + .map( + accountId -> + MoreObjects.firstNonNull( + accountCache.get(accountId).getAccount().getPreferredEmail(), "n/a")) + .collect(joining(", ")); out.write( - String.format( - "Members %s group %s: %s\n", action, group.getName(), names) - .getBytes(ENC)); + String.format("Members %s group %s: %s\n", action, group.getName(), names).getBytes(ENC)); } - private void reportGroupsAction(String action, GroupResource group, - List groupUuidList) + private void reportGroupsAction( + String action, GroupResource group, List groupUuidList) throws UnsupportedEncodingException, IOException { - String names = groupUuidList.stream() - .map(uuid -> groupCache.get(uuid).getName()) - .collect(joining(", ")); + String names = + groupUuidList.stream().map(uuid -> groupCache.get(uuid).getName()).collect(joining(", ")); out.write( - String.format( - "Groups %s group %s: %s\n", action, group.getName(), names) - .getBytes(ENC)); + String.format("Groups %s group %s: %s\n", action, group.getName(), names).getBytes(ENC)); } private AddIncludedGroups.Input fromGroups(List accounts) { @@ -144,7 +160,6 @@ public class SetMembersCommand extends SshCommand { } private AddMembers.Input fromMembers(List accounts) { - return AddMembers.Input.fromMembers( - accounts.stream().map(Object::toString).collect(toList())); + return AddMembers.Input.fromMembers(accounts.stream().map(Object::toString).collect(toList())); } } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetProjectCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetProjectCommand.java index 6328fb4272..53f76e904d 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetProjectCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetProjectCommand.java @@ -27,7 +27,7 @@ import com.google.gerrit.server.project.ProjectControl; import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.inject.Inject; - +import java.io.IOException; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.kohsuke.args4j.Argument; @@ -35,22 +35,27 @@ import org.kohsuke.args4j.Option; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; - @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER) @CommandMetaData(name = "set-project", description = "Change a project's settings") final class SetProjectCommand extends SshCommand { - private static final Logger log = LoggerFactory - .getLogger(SetProjectCommand.class); + private static final Logger log = LoggerFactory.getLogger(SetProjectCommand.class); @Argument(index = 0, required = true, metaVar = "NAME", usage = "name of the project") private ProjectControl projectControl; - @Option(name = "--description", aliases = {"-d"}, metaVar = "DESCRIPTION", usage = "description of project") + @Option( + name = "--description", + aliases = {"-d"}, + metaVar = "DESCRIPTION", + usage = "description of project" + ) private String projectDescription; - @Option(name = "--submit-type", aliases = {"-t"}, usage = "project submit type\n" - + "(default: MERGE_IF_NECESSARY)") + @Option( + name = "--submit-type", + aliases = {"-t"}, + usage = "project submit type\n" + "(default: MERGE_IF_NECESSARY)" + ) private SubmitType submitType; @Option(name = "--contributor-agreements", usage = "if contributor agreement is required") @@ -65,22 +70,38 @@ final class SetProjectCommand extends SshCommand { @Option(name = "--change-id", usage = "if change-id is required") private InheritableBoolean requireChangeID; - @Option(name = "--use-contributor-agreements", aliases = {"--ca"}, usage = "if contributor agreement is required") + @Option( + name = "--use-contributor-agreements", + aliases = {"--ca"}, + usage = "if contributor agreement is required" + ) void setUseContributorArgreements(@SuppressWarnings("unused") boolean on) { contributorAgreements = InheritableBoolean.TRUE; } - @Option(name = "--no-contributor-agreements", aliases = {"--nca"}, usage = "if contributor agreement is not required") + @Option( + name = "--no-contributor-agreements", + aliases = {"--nca"}, + usage = "if contributor agreement is not required" + ) void setNoContributorArgreements(@SuppressWarnings("unused") boolean on) { contributorAgreements = InheritableBoolean.FALSE; } - @Option(name = "--use-signed-off-by", aliases = {"--so"}, usage = "if signed-off-by is required") + @Option( + name = "--use-signed-off-by", + aliases = {"--so"}, + usage = "if signed-off-by is required" + ) void setUseSignedOffBy(@SuppressWarnings("unused") boolean on) { signedOffBy = InheritableBoolean.TRUE; } - @Option(name = "--no-signed-off-by", aliases = {"--nso"}, usage = "if signed-off-by is not required") + @Option( + name = "--no-signed-off-by", + aliases = {"--nso"}, + usage = "if signed-off-by is not required" + ) void setNoSignedOffBy(@SuppressWarnings("unused") boolean on) { signedOffBy = InheritableBoolean.FALSE; } @@ -90,32 +111,45 @@ final class SetProjectCommand extends SshCommand { contentMerge = InheritableBoolean.TRUE; } - @Option(name = "--no-content-merge", usage = "don't allow automatic conflict resolving within files") + @Option( + name = "--no-content-merge", + usage = "don't allow automatic conflict resolving within files" + ) void setNoContentMerge(@SuppressWarnings("unused") boolean on) { contentMerge = InheritableBoolean.FALSE; } - @Option(name = "--require-change-id", aliases = {"--id"}, usage = "if change-id is required") + @Option( + name = "--require-change-id", + aliases = {"--id"}, + usage = "if change-id is required" + ) void setRequireChangeId(@SuppressWarnings("unused") boolean on) { requireChangeID = InheritableBoolean.TRUE; } - @Option(name = "--no-change-id", aliases = {"--nid"}, usage = "if change-id is not required") + @Option( + name = "--no-change-id", + aliases = {"--nid"}, + usage = "if change-id is not required" + ) void setNoChangeId(@SuppressWarnings("unused") boolean on) { requireChangeID = InheritableBoolean.FALSE; } - @Option(name = "--project-state", aliases = {"--ps"}, usage = "project's visibility state") + @Option( + name = "--project-state", + aliases = {"--ps"}, + usage = "project's visibility state" + ) private ProjectState state; @Option(name = "--max-object-size-limit", usage = "max Git object size for this project") private String maxObjectSizeLimit; - @Inject - private MetaDataUpdate.User metaDataUpdateFactory; + @Inject private MetaDataUpdate.User metaDataUpdateFactory; - @Inject - private ProjectCache projectCache; + @Inject private ProjectCache projectCache; @Override protected void run() throws Failure { diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetReviewersCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetReviewersCommand.java index bffb11481e..5ea5bf7416 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetReviewersCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetReviewersCommand.java @@ -29,36 +29,49 @@ import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; - -import org.kohsuke.args4j.Argument; -import org.kohsuke.args4j.Option; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; +import org.kohsuke.args4j.Argument; +import org.kohsuke.args4j.Option; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @CommandMetaData(name = "set-reviewers", description = "Add or remove reviewers on a change") public class SetReviewersCommand extends SshCommand { - private static final Logger log = - LoggerFactory.getLogger(SetReviewersCommand.class); + private static final Logger log = LoggerFactory.getLogger(SetReviewersCommand.class); @Option(name = "--project", aliases = "-p", usage = "project containing the change") private ProjectControl projectControl; - @Option(name = "--add", aliases = {"-a"}, metaVar = "REVIEWER", usage = "user or group that should be added as reviewer") + @Option( + name = "--add", + aliases = {"-a"}, + metaVar = "REVIEWER", + usage = "user or group that should be added as reviewer" + ) private List toAdd = new ArrayList<>(); - @Option(name = "--remove", aliases = {"-r"}, metaVar = "REVIEWER", usage = "user that should be removed from the reviewer list") + @Option( + name = "--remove", + aliases = {"-r"}, + metaVar = "REVIEWER", + usage = "user that should be removed from the reviewer list" + ) void optionRemove(Account.Id who) { toRemove.add(who); } - @Argument(index = 0, required = true, multiValued = true, metaVar = "CHANGE", usage = "changes to modify") + @Argument( + index = 0, + required = true, + multiValued = true, + metaVar = "CHANGE", + usage = "changes to modify" + ) void addChange(String token) { try { changeArgumentParser.addChange(token, changes, projectControl); @@ -69,17 +82,13 @@ public class SetReviewersCommand extends SshCommand { } } - @Inject - private ReviewerResource.Factory reviewerFactory; + @Inject private ReviewerResource.Factory reviewerFactory; - @Inject - private PostReviewers postReviewers; + @Inject private PostReviewers postReviewers; - @Inject - private DeleteReviewer deleteReviewer; + @Inject private DeleteReviewer deleteReviewer; - @Inject - private ChangeArgumentParser changeArgumentParser; + @Inject private ChangeArgumentParser changeArgumentParser; private Set toRemove = new HashSet<>(); @@ -116,8 +125,7 @@ public class SetReviewersCommand extends SshCommand { } catch (ResourceNotFoundException e) { error = String.format("could not remove %s: not found", reviewer); } catch (Exception e) { - error = String.format("could not remove %s: %s", - reviewer, e.getMessage()); + error = String.format("could not remove %s: %s", reviewer, e.getMessage()); } if (error != null) { ok = false; diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ShowCaches.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ShowCaches.java index 3e0cec325f..e16f270119 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ShowCaches.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ShowCaches.java @@ -38,24 +38,25 @@ import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.gerrit.sshd.SshDaemon; import com.google.inject.Inject; - -import org.apache.sshd.common.io.IoAcceptor; -import org.apache.sshd.common.io.IoSession; -import org.apache.sshd.common.io.mina.MinaSession; -import org.apache.sshd.server.Environment; -import org.kohsuke.args4j.Option; - import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Collection; import java.util.Date; import java.util.Map; import java.util.Map.Entry; +import org.apache.sshd.common.io.IoAcceptor; +import org.apache.sshd.common.io.IoSession; +import org.apache.sshd.common.io.mina.MinaSession; +import org.apache.sshd.server.Environment; +import org.kohsuke.args4j.Option; /** Show the current cache states. */ @RequiresAnyCapability({VIEW_CACHES, MAINTAIN_SERVER}) -@CommandMetaData(name = "show-caches", description = "Display current cache statistics", - runsAt = MASTER_OR_SLAVE) +@CommandMetaData( + name = "show-caches", + description = "Display current cache statistics", + runsAt = MASTER_OR_SLAVE +) final class ShowCaches extends SshCommand { private static volatile long serverStarted; @@ -66,8 +67,7 @@ final class ShowCaches extends SshCommand { } @Override - public void stop() { - } + public void stop() {} } @Option(name = "--gc", usage = "perform Java GC before printing memory stats") @@ -79,20 +79,22 @@ final class ShowCaches extends SshCommand { @Option(name = "--show-threads", usage = "show detailed thread counts") private boolean showThreads; - @Inject - private SshDaemon daemon; + @Inject private SshDaemon daemon; - @Inject - private ListCaches listCaches; + @Inject private ListCaches listCaches; - @Inject - private GetSummary getSummary; + @Inject private GetSummary getSummary; - @Inject - private CurrentUser self; + @Inject private CurrentUser self; - @Option(name = "--width", aliases = {"-w"}, metaVar = "COLS", usage = "width of output table") + @Option( + name = "--width", + aliases = {"-w"}, + metaVar = "COLS", + usage = "width of output table" + ) private int columns = 80; + private int nw; @Override @@ -117,31 +119,43 @@ final class ShowCaches extends SshCommand { "Gerrit Code Review", Version.getVersion() != null ? Version.getVersion() : "", new SimpleDateFormat("HH:mm:ss zzz").format(now)); - stdout.format( - "%-25s %-20s uptime %16s\n", - "", "", - uptime(now.getTime() - serverStarted)); + stdout.format("%-25s %-20s uptime %16s\n", "", "", uptime(now.getTime() - serverStarted)); stdout.print('\n'); - stdout.print(String.format(// - "%1s %-" + nw + "s|%-21s| %-5s |%-9s|\n" // - , "" // - , "Name" // - , "Entries" // - , "AvgGet" // - , "Hit Ratio" // - )); - stdout.print(String.format(// - "%1s %-" + nw + "s|%6s %6s %7s| %-5s |%-4s %-4s|\n" // - , "" // - , "" // - , "Mem" // - , "Disk" // - , "Space" // - , "" // - , "Mem" // - , "Disk" // - )); + stdout.print( + String.format( // + "%1s %-" + nw + "s|%-21s| %-5s |%-9s|\n" // + , + "" // + , + "Name" // + , + "Entries" // + , + "AvgGet" // + , + "Hit Ratio" // + )); + stdout.print( + String.format( // + "%1s %-" + nw + "s|%6s %6s %7s| %-5s |%-4s %-4s|\n" // + , + "" // + , + "" // + , + "Mem" // + , + "Disk" // + , + "Space" // + , + "" // + , + "Mem" // + , + "Disk" // + )); stdout.print("--"); for (int i = 0; i < nw; i++) { stdout.print('-'); @@ -157,8 +171,7 @@ final class ShowCaches extends SshCommand { if (self.getCapabilities().canMaintainServer()) { sshSummary(); - SummaryInfo summary = - getSummary.setGc(gc).setJvm(showJVM).apply(new ConfigResource()); + SummaryInfo summary = getSummary.setGc(gc).setJvm(showJVM).apply(new ConfigResource()); taskSummary(summary.taskSummary); memSummary(summary.memSummary); threadSummary(summary.threadSummary); @@ -173,8 +186,7 @@ final class ShowCaches extends SshCommand { private Collection getCaches() { @SuppressWarnings("unchecked") - Map caches = - (Map) listCaches.apply(new ConfigResource()); + Map caches = (Map) listCaches.apply(new ConfigResource()); for (Map.Entry entry : caches.entrySet()) { CacheInfo cache = entry.getValue(); cache.name = entry.getKey(); @@ -207,17 +219,17 @@ final class ShowCaches extends SshCommand { } private void printCache(CacheInfo cache) { - stdout.print(String.format( - "%1s %-" + nw + "s|%6s %6s %7s| %7s |%4s %4s|\n", - CacheType.DISK.equals(cache.type) ? "D" : "", - cache.name, - nullToEmpty(cache.entries.mem), - nullToEmpty(cache.entries.disk), - Strings.nullToEmpty(cache.entries.space), - Strings.nullToEmpty(cache.averageGet), - formatAsPercent(cache.hitRatio.mem), - formatAsPercent(cache.hitRatio.disk) - )); + stdout.print( + String.format( + "%1s %-" + nw + "s|%6s %6s %7s| %7s |%4s %4s|\n", + CacheType.DISK.equals(cache.type) ? "D" : "", + cache.name, + nullToEmpty(cache.entries.mem), + nullToEmpty(cache.entries.disk), + Strings.nullToEmpty(cache.entries.space), + Strings.nullToEmpty(cache.averageGet), + formatAsPercent(cache.hitRatio.mem), + formatAsPercent(cache.hitRatio.disk))); } private static String nullToEmpty(Long l) { @@ -229,20 +241,17 @@ final class ShowCaches extends SshCommand { } private void memSummary(MemSummaryInfo memSummary) { - stdout.format("Mem: %s total = %s used + %s free + %s buffers\n", - memSummary.total, - memSummary.used, - memSummary.free, - memSummary.buffers); + stdout.format( + "Mem: %s total = %s used + %s free + %s buffers\n", + memSummary.total, memSummary.used, memSummary.free, memSummary.buffers); stdout.format(" %s max\n", memSummary.max); - stdout.format(" %8d open files\n", - nullToZero(memSummary.openFiles)); + stdout.format(" %8d open files\n", nullToZero(memSummary.openFiles)); stdout.print('\n'); } private void threadSummary(ThreadSummaryInfo threadSummary) { - stdout.format("Threads: %d CPUs available, %d threads\n", - threadSummary.cpus, threadSummary.threads); + stdout.format( + "Threads: %d CPUs available, %d threads\n", threadSummary.cpus, threadSummary.threads); if (showThreads) { stdout.print(String.format(" %22s", "")); @@ -250,8 +259,7 @@ final class ShowCaches extends SshCommand { stdout.print(String.format(" %14s", s.name())); } stdout.print('\n'); - for (Entry> e : - threadSummary.counts.entrySet()) { + for (Entry> e : threadSummary.counts.entrySet()) { stdout.print(String.format(" %-22s", e.getKey())); for (Thread.State s : Thread.State.values()) { stdout.print(String.format(" %14d", nullToZero(e.getValue().get(s)))); @@ -287,29 +295,19 @@ final class ShowCaches extends SshCommand { for (IoSession s : list) { if (s instanceof MinaSession) { - MinaSession minaSession = (MinaSession)s; + MinaSession minaSession = (MinaSession) s; oldest = Math.min(oldest, minaSession.getSession().getCreationTime()); } } stdout.format( - "SSH: %4d users, oldest session started %s ago\n", - list.size(), - uptime(now - oldest)); + "SSH: %4d users, oldest session started %s ago\n", list.size(), uptime(now - oldest)); } private void jvmSummary(JvmSummaryInfo jvmSummary) { - stdout.format("JVM: %s %s %s\n", - jvmSummary.vmVendor, - jvmSummary.vmName, - jvmSummary.vmVersion); - stdout.format(" on %s %s %s\n", - jvmSummary.osName, - jvmSummary.osVersion, - jvmSummary.osArch); - stdout.format(" running as %s on %s\n", - jvmSummary.user, - Strings.nullToEmpty(jvmSummary.host)); + stdout.format("JVM: %s %s %s\n", jvmSummary.vmVendor, jvmSummary.vmName, jvmSummary.vmVersion); + stdout.format(" on %s %s %s\n", jvmSummary.osName, jvmSummary.osVersion, jvmSummary.osArch); + stdout.format(" running as %s on %s\n", jvmSummary.user, Strings.nullToEmpty(jvmSummary.host)); stdout.format(" cwd %s\n", jvmSummary.currentWorkingDirectory); stdout.format(" site %s\n", jvmSummary.site); } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ShowConnections.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ShowConnections.java index 5e4568fb6b..5dee10563d 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ShowConnections.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ShowConnections.java @@ -28,16 +28,6 @@ import com.google.gerrit.sshd.SshCommand; import com.google.gerrit.sshd.SshDaemon; import com.google.gerrit.sshd.SshSession; import com.google.inject.Inject; - -import org.apache.sshd.common.io.IoAcceptor; -import org.apache.sshd.common.io.IoSession; -import org.apache.sshd.common.io.mina.MinaAcceptor; -import org.apache.sshd.common.io.mina.MinaSession; -import org.apache.sshd.common.io.nio2.Nio2Acceptor; -import org.apache.sshd.common.session.helpers.AbstractSession; -import org.apache.sshd.server.Environment; -import org.kohsuke.args4j.Option; - import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; @@ -48,20 +38,38 @@ import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.List; +import org.apache.sshd.common.io.IoAcceptor; +import org.apache.sshd.common.io.IoSession; +import org.apache.sshd.common.io.mina.MinaAcceptor; +import org.apache.sshd.common.io.mina.MinaSession; +import org.apache.sshd.common.io.nio2.Nio2Acceptor; +import org.apache.sshd.common.session.helpers.AbstractSession; +import org.apache.sshd.server.Environment; +import org.kohsuke.args4j.Option; /** Show the current SSH connections. */ @RequiresCapability(GlobalCapability.VIEW_CONNECTIONS) -@CommandMetaData(name = "show-connections", description = "Display active client SSH connections", - runsAt = MASTER_OR_SLAVE) +@CommandMetaData( + name = "show-connections", + description = "Display active client SSH connections", + runsAt = MASTER_OR_SLAVE +) final class ShowConnections extends SshCommand { - @Option(name = "--numeric", aliases = {"-n"}, usage = "don't resolve names") + @Option( + name = "--numeric", + aliases = {"-n"}, + usage = "don't resolve names" + ) private boolean numeric; - @Option(name = "--wide", aliases = {"-w"}, usage = "display without line width truncation") + @Option( + name = "--wide", + aliases = {"-w"}, + usage = "display without line width truncation" + ) private boolean wide; - @Inject - private SshDaemon daemon; + @Inject private SshDaemon daemon; private int hostNameWidth; private int columns = 80; @@ -77,7 +85,7 @@ final class ShowConnections extends SshCommand { } } super.start(env); - } + } @Override protected void run() throws Failure { @@ -86,32 +94,33 @@ final class ShowConnections extends SshCommand { throw new Failure(1, "fatal: sshd no longer running"); } - final List list = - new ArrayList<>(acceptor.getManagedSessions().values()); - Collections.sort(list, new Comparator() { - @Override - public int compare(IoSession arg0, IoSession arg1) { - if (arg0 instanceof MinaSession) { - MinaSession mArg0 = (MinaSession) arg0; - MinaSession mArg1 = (MinaSession) arg1; - if (mArg0.getSession().getCreationTime() < mArg1.getSession() - .getCreationTime()) { - return -1; - } else if (mArg0.getSession().getCreationTime() > mArg1.getSession() - .getCreationTime()) { - return 1; + final List list = new ArrayList<>(acceptor.getManagedSessions().values()); + Collections.sort( + list, + new Comparator() { + @Override + public int compare(IoSession arg0, IoSession arg1) { + if (arg0 instanceof MinaSession) { + MinaSession mArg0 = (MinaSession) arg0; + MinaSession mArg1 = (MinaSession) arg1; + if (mArg0.getSession().getCreationTime() < mArg1.getSession().getCreationTime()) { + return -1; + } else if (mArg0.getSession().getCreationTime() + > mArg1.getSession().getCreationTime()) { + return 1; + } + } + return (int) (arg0.getId() - arg1.getId()); } - } - return (int) (arg0.getId() - arg1.getId()); - } - }); + }); hostNameWidth = wide ? Integer.MAX_VALUE : columns - 9 - 9 - 10 - 32; if (getBackend().equals("mina")) { long now = TimeUtil.nowMs(); - stdout.print(String.format("%-8s %8s %8s %-15s %s\n", - "Session", "Start", "Idle", "User", "Remote Host")); + stdout.print( + String.format( + "%-8s %8s %8s %-15s %s\n", "Session", "Start", "Idle", "User", "Remote Host")); stdout.print("--------------------------------------------------------------\n"); for (final IoSession io : list) { checkState(io instanceof MinaSession, "expected MinaSession"); @@ -121,25 +130,25 @@ final class ShowConnections extends SshCommand { AbstractSession s = AbstractSession.getSession(io, true); SshSession sd = s != null ? s.getAttribute(SshSession.KEY) : null; - stdout.print(String.format("%8s %8s %8s %-15.15s %s\n", - id(sd), - time(now, start), - age(idle), - username(sd), - hostname(io.getRemoteAddress()))); + stdout.print( + String.format( + "%8s %8s %8s %-15.15s %s\n", + id(sd), + time(now, start), + age(idle), + username(sd), + hostname(io.getRemoteAddress()))); } } else { - stdout.print(String.format("%-8s %-15s %s\n", - "Session", "User", "Remote Host")); + stdout.print(String.format("%-8s %-15s %s\n", "Session", "User", "Remote Host")); stdout.print("--------------------------------------------------------------\n"); for (final IoSession io : list) { AbstractSession s = AbstractSession.getSession(io, true); SshSession sd = s != null ? s.getAttribute(SshSession.KEY) : null; - stdout.print(String.format("%8s %-15.15s %s\n", - id(sd), - username(sd), - hostname(io.getRemoteAddress()))); + stdout.print( + String.format( + "%8s %-15.15s %s\n", id(sd), username(sd), hostname(io.getRemoteAddress()))); } } @@ -201,7 +210,6 @@ final class ShowConnections extends SshCommand { } return "a/" + u.getAccountId().toString(); - } return ""; } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ShowQueue.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ShowQueue.java index 9a20ba80ad..2b8f9aabc5 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ShowQueue.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ShowQueue.java @@ -31,37 +31,40 @@ import com.google.gerrit.sshd.AdminHighPriorityCommand; import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; import com.google.inject.Inject; - -import org.apache.sshd.server.Environment; -import org.kohsuke.args4j.Option; - import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; +import org.apache.sshd.server.Environment; +import org.kohsuke.args4j.Option; /** Display the current work queue. */ @AdminHighPriorityCommand -@CommandMetaData(name = "show-queue", - description = "Display the background work queues", - runsAt = MASTER_OR_SLAVE) +@CommandMetaData( + name = "show-queue", + description = "Display the background work queues", + runsAt = MASTER_OR_SLAVE +) final class ShowQueue extends SshCommand { - @Option(name = "--wide", aliases = {"-w"}, - usage = "display without line width truncation") + @Option( + name = "--wide", + aliases = {"-w"}, + usage = "display without line width truncation" + ) private boolean wide; - @Option(name = "--by-queue", aliases = {"-q"}, - usage = "group tasks by queue and print queue info") + @Option( + name = "--by-queue", + aliases = {"-q"}, + usage = "group tasks by queue and print queue info" + ) private boolean groupByQueue; - @Inject - private ListTasks listTasks; + @Inject private ListTasks listTasks; - @Inject - private IdentifiedUser currentUser; + @Inject private IdentifiedUser currentUser; - @Inject - private WorkQueue workQueue; + @Inject private WorkQueue workQueue; private int columns = 80; private int maxCommandWidth; @@ -82,10 +85,12 @@ final class ShowQueue extends SshCommand { @Override protected void run() throws UnloggedFailure { maxCommandWidth = wide ? Integer.MAX_VALUE : columns - 8 - 12 - 12 - 4 - 4; - stdout.print(String.format("%-8s %-12s %-12s %-4s %s\n", // - "Task", "State", "StartTime", "", "Command")); - stdout.print("----------------------------------------------" - + "--------------------------------\n"); + stdout.print( + String.format( + "%-8s %-12s %-12s %-4s %s\n", // + "Task", "State", "StartTime", "", "Command")); + stdout.print( + "----------------------------------------------" + "--------------------------------\n"); List tasks; try { @@ -116,8 +121,7 @@ final class ShowQueue extends SshCommand { return byQueue; } - private void print(List tasks, long now, boolean viewAll, - int threadPoolSize) { + private void print(List tasks, long now, boolean viewAll, int threadPoolSize) { for (TaskInfo task : tasks) { String start; switch (task.state) { @@ -136,24 +140,30 @@ final class ShowQueue extends SshCommand { // Shows information about tasks depending on the user rights if (viewAll || task.projectName == null) { - String command = task.command.length() < maxCommandWidth - ? task.command + String command = + task.command.length() < maxCommandWidth + ? task.command : task.command.substring(0, maxCommandWidth); - stdout.print(String.format("%8s %-12s %-12s %-4s %s\n", - task.id, start, startTime(task.startTime), "", command)); + stdout.print( + String.format( + "%8s %-12s %-12s %-4s %s\n", + task.id, start, startTime(task.startTime), "", command)); } else { - String remoteName = task.remoteName != null - ? task.remoteName + "/" + task.projectName - : task.projectName; + String remoteName = + task.remoteName != null ? task.remoteName + "/" + task.projectName : task.projectName; - stdout.print(String.format("%8s %-12s %-4s %s\n", - task.id, start, startTime(task.startTime), - MoreObjects.firstNonNull(remoteName, "n/a"))); + stdout.print( + String.format( + "%8s %-12s %-4s %s\n", + task.id, + start, + startTime(task.startTime), + MoreObjects.firstNonNull(remoteName, "n/a"))); } } - stdout.print("----------------------------------------------" - + "--------------------------------\n"); + stdout.print( + "----------------------------------------------" + "--------------------------------\n"); stdout.print(" " + tasks.size() + " tasks"); if (threadPoolSize > 0) { stdout.print(", " + threadPoolSize + " worker threads"); diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/StreamEvents.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/StreamEvents.java index f8070747b4..1c0a4247ac 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/StreamEvents.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/StreamEvents.java @@ -37,24 +37,21 @@ import com.google.gerrit.sshd.StreamCommandExecutor; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.inject.Inject; - -import org.apache.sshd.server.Environment; -import org.kohsuke.args4j.Option; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Future; import java.util.concurrent.LinkedBlockingQueue; +import org.apache.sshd.server.Environment; +import org.kohsuke.args4j.Option; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @RequiresCapability(GlobalCapability.STREAM_EVENTS) @CommandMetaData(name = "stream-events", description = "Monitor events occurring in real time") final class StreamEvents extends BaseCommand { - private static final Logger log = - LoggerFactory.getLogger(StreamEvents.class); + private static final Logger log = LoggerFactory.getLogger(StreamEvents.class); /** Maximum number of events that may be queued up for each connection. */ private static final int MAX_EVENTS = 128; @@ -62,23 +59,22 @@ final class StreamEvents extends BaseCommand { /** Number of events to write before yielding off the thread. */ private static final int BATCH_SIZE = 32; - @Option(name = "--subscribe", aliases = {"-s"}, metaVar = "SUBSCRIBE", - usage = "subscribe to specific stream-events") + @Option( + name = "--subscribe", + aliases = {"-s"}, + metaVar = "SUBSCRIBE", + usage = "subscribe to specific stream-events" + ) private List subscribedToEvents = new ArrayList<>(); - @Inject - private IdentifiedUser currentUser; + @Inject private IdentifiedUser currentUser; - @Inject - private DynamicSet eventListeners; + @Inject private DynamicSet eventListeners; - @Inject - @StreamCommandExecutor - private WorkQueue.Executor pool; + @Inject @StreamCommandExecutor private WorkQueue.Executor pool; /** Queue of events to stream to the connected user. */ - private final LinkedBlockingQueue queue = - new LinkedBlockingQueue<>(MAX_EVENTS); + private final LinkedBlockingQueue queue = new LinkedBlockingQueue<>(MAX_EVENTS); private Gson gson; @@ -87,6 +83,7 @@ final class StreamEvents extends BaseCommand { /** Special event to notify clients they missed other events. */ private static final class DroppedOutputEvent extends Event { private static final String TYPE = "dropped-output"; + DroppedOutputEvent() { super(TYPE); } @@ -96,22 +93,23 @@ final class StreamEvents extends BaseCommand { EventTypes.register(DroppedOutputEvent.TYPE, DroppedOutputEvent.class); } - private final CancelableRunnable writer = new CancelableRunnable() { - @Override - public void run() { - writeEvents(); - } + private final CancelableRunnable writer = + new CancelableRunnable() { + @Override + public void run() { + writeEvents(); + } - @Override - public void cancel() { - onExit(0); - } + @Override + public void cancel() { + onExit(0); + } - @Override - public String toString() { - return "Stream Events (" + currentUser.getAccount().getUserName() + ")"; - } - }; + @Override + public String toString() { + return "Stream Events (" + currentUser.getAccount().getUserName() + ")"; + } + }; /** True if {@link DroppedOutputEvent} needs to be sent. */ private volatile boolean dropped; @@ -124,10 +122,9 @@ final class StreamEvents extends BaseCommand { /** * Currently scheduled task to spin out {@link #queue}. - *

        - * This field is usually {@code null}, unless there is at least one object - * present inside of {@link #queue} ready for delivery. Tasks are only started - * when there are events to be sent. + * + *

        This field is usually {@code null}, unless there is at least one object present inside of + * {@link #queue} ready for delivery. Tasks are only started when there are events to be sent. */ private Future task; @@ -150,26 +147,26 @@ final class StreamEvents extends BaseCommand { stdout = toPrintWriter(out); eventListenerRegistration = - eventListeners.add(new UserScopedEventListener() { - @Override - public void onEvent(final Event event) { - if (subscribedToEvents.isEmpty() - || subscribedToEvents.contains(event.getType())) { - offer(event); - } - } + eventListeners.add( + new UserScopedEventListener() { + @Override + public void onEvent(final Event event) { + if (subscribedToEvents.isEmpty() || subscribedToEvents.contains(event.getType())) { + offer(event); + } + } - @Override - public CurrentUser getUser() { - return currentUser; - } - }); + @Override + public CurrentUser getUser() { + return currentUser; + } + }); - gson = new GsonBuilder() - .registerTypeAdapter(Supplier.class, new SupplierSerializer()) - .registerTypeAdapter( - Project.NameKey.class, new ProjectNameKeySerializer()) - .create(); + gson = + new GsonBuilder() + .registerTypeAdapter(Supplier.class, new SupplierSerializer()) + .registerTypeAdapter(Project.NameKey.class, new ProjectNameKeySerializer()) + .create(); } @Override diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/TestSubmitRuleCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/TestSubmitRuleCommand.java index 7e74ef018e..a7d529b507 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/TestSubmitRuleCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/TestSubmitRuleCommand.java @@ -24,8 +24,7 @@ import com.google.inject.Inject; /** Command that allows testing of prolog submit-rules in a live instance. */ @CommandMetaData(name = "rule", description = "Test prolog submit rules") final class TestSubmitRuleCommand extends BaseTestPrologCommand { - @Inject - private TestSubmitRule view; + @Inject private TestSubmitRule view; @Override protected RestModifyView createView() { diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/TestSubmitTypeCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/TestSubmitTypeCommand.java index 3a885f994b..ebe8925e9d 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/TestSubmitTypeCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/TestSubmitTypeCommand.java @@ -24,8 +24,7 @@ import com.google.inject.Inject; @CommandMetaData(name = "type", description = "Test prolog submit type") final class TestSubmitTypeCommand extends BaseTestPrologCommand { - @Inject - private TestSubmitType view; + @Inject private TestSubmitType view; @Override protected RestModifyView createView() { diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Upload.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Upload.java index 181b0c6e49..67dfe96b36 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Upload.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Upload.java @@ -28,65 +28,51 @@ import com.google.gerrit.server.notedb.ChangeNotes; import com.google.gerrit.sshd.AbstractGitCommand; import com.google.gerrit.sshd.SshSession; import com.google.inject.Inject; - +import java.io.IOException; +import java.util.List; import org.eclipse.jgit.transport.PostUploadHook; import org.eclipse.jgit.transport.PostUploadHookChain; import org.eclipse.jgit.transport.PreUploadHook; import org.eclipse.jgit.transport.PreUploadHookChain; import org.eclipse.jgit.transport.UploadPack; -import java.io.IOException; -import java.util.List; - /** Publishes Git repositories over SSH using the Git upload-pack protocol. */ final class Upload extends AbstractGitCommand { - @Inject - private ReviewDb db; + @Inject private ReviewDb db; - @Inject - private TransferConfig config; + @Inject private TransferConfig config; - @Inject - private TagCache tagCache; + @Inject private TagCache tagCache; - @Inject - private ChangeNotes.Factory changeNotesFactory; + @Inject private ChangeNotes.Factory changeNotesFactory; - @Inject - @Nullable - private SearchingChangeCacheImpl changeCache; + @Inject @Nullable private SearchingChangeCacheImpl changeCache; - @Inject - private DynamicSet preUploadHooks; + @Inject private DynamicSet preUploadHooks; - @Inject - private DynamicSet postUploadHooks; + @Inject private DynamicSet postUploadHooks; - @Inject - private UploadValidators.Factory uploadValidatorsFactory; + @Inject private UploadValidators.Factory uploadValidatorsFactory; - @Inject - private SshSession session; + @Inject private SshSession session; @Override protected void runImpl() throws IOException, Failure { if (!projectControl.canRunUploadPack()) { - throw new Failure(1, "fatal: upload-pack not permitted on this server"); + throw new Failure(1, "fatal: upload-pack not permitted on this server"); } final UploadPack up = new UploadPack(repo); up.setAdvertiseRefsHook( new VisibleRefFilter( - tagCache, changeNotesFactory, changeCache, repo, projectControl, db, - true)); + tagCache, changeNotesFactory, changeCache, repo, projectControl, db, true)); up.setPackConfig(config.getPackConfig()); up.setTimeout(config.getTimeout()); - up.setPostUploadHook( - PostUploadHookChain.newChain(Lists.newArrayList(postUploadHooks))); + up.setPostUploadHook(PostUploadHookChain.newChain(Lists.newArrayList(postUploadHooks))); List allPreUploadHooks = Lists.newArrayList(preUploadHooks); - allPreUploadHooks.add(uploadValidatorsFactory.create(project, repo, - session.getRemoteAddressAsString())); + allPreUploadHooks.add( + uploadValidatorsFactory.create(project, repo, session.getRemoteAddressAsString())); up.setPreUploadHook(PreUploadHookChain.newChain(allPreUploadHooks)); try { up.upload(in, out, err); diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/UploadArchive.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/UploadArchive.java index 99ced68277..1ce3dc9a05 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/UploadArchive.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/UploadArchive.java @@ -22,7 +22,12 @@ import com.google.gerrit.server.change.AllowedFormats; import com.google.gerrit.server.change.ArchiveFormat; import com.google.gerrit.sshd.AbstractGitCommand; import com.google.inject.Inject; - +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; import org.eclipse.jgit.api.ArchiveCommand; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.lib.ObjectId; @@ -36,80 +41,91 @@ import org.kohsuke.args4j.CmdLineException; import org.kohsuke.args4j.CmdLineParser; import org.kohsuke.args4j.Option; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -/** - * Allows getting archives for Git repositories over SSH using the Git - * upload-archive protocol. - */ +/** Allows getting archives for Git repositories over SSH using the Git upload-archive protocol. */ public class UploadArchive extends AbstractGitCommand { /** * Options for parsing Git commands. - *

        - * These options are not passed on command line, but received through input - * stream in pkt-line format. + * + *

        These options are not passed on command line, but received through input stream in pkt-line + * format. */ static class Options { - @Option(name = "-f", aliases = {"--format"}, usage = "Format of the" - + " resulting archive: tar or zip... If this option is not given, and" - + " the output file is specified, the format is inferred from the" - + " filename if possible (e.g. writing to \"foo.zip\" makes the output" - + " to be in the zip format). Otherwise the output format is tar.") + @Option( + name = "-f", + aliases = {"--format"}, + usage = + "Format of the" + + " resulting archive: tar or zip... If this option is not given, and" + + " the output file is specified, the format is inferred from the" + + " filename if possible (e.g. writing to \"foo.zip\" makes the output" + + " to be in the zip format). Otherwise the output format is tar." + ) private String format = "tar"; - @Option(name = "--prefix", - usage = "Prepend / to each filename in the archive.") + @Option(name = "--prefix", usage = "Prepend / to each filename in the archive.") private String prefix; @Option(name = "-0", usage = "Store the files instead of deflating them.") private boolean level0; + @Option(name = "-1") private boolean level1; + @Option(name = "-2") private boolean level2; + @Option(name = "-3") private boolean level3; + @Option(name = "-4") private boolean level4; + @Option(name = "-5") private boolean level5; + @Option(name = "-6") private boolean level6; + @Option(name = "-7") private boolean level7; + @Option(name = "-8") private boolean level8; - @Option(name = "-9", usage = "Highest and slowest compression level. You " - + "can specify any number from 1 to 9 to adjust compression speed and " - + "ratio.") + + @Option( + name = "-9", + usage = + "Highest and slowest compression level. You " + + "can specify any number from 1 to 9 to adjust compression speed and " + + "ratio." + ) private boolean level9; - @Argument(index = 0, required = true, usage = "The tree or commit to " - + "produce an archive for.") + @Argument( + index = 0, + required = true, + usage = "The tree or commit to " + "produce an archive for." + ) private String treeIsh = "master"; - @Argument(index = 1, multiValued = true, usage = - "Without an optional path parameter, all files and subdirectories of " - + "the current working directory are included in the archive. If one " - + "or more paths are specified, only these are included.") + @Argument( + index = 1, + multiValued = true, + usage = + "Without an optional path parameter, all files and subdirectories of " + + "the current working directory are included in the archive. If one " + + "or more paths are specified, only these are included." + ) private List path; } - @Inject - private AllowedFormats allowedFormats; - @Inject - private ReviewDb db; + @Inject private AllowedFormats allowedFormats; + @Inject private ReviewDb db; private Options options = new Options(); /** - * Read and parse arguments from input stream. - * This method gets the arguments from input stream, in Pkt-line format, - * then parses them to fill the options object. + * Read and parse arguments from input stream. This method gets the arguments from input stream, + * in Pkt-line format, then parses them to fill the options object. */ protected void readArguments() throws IOException, Failure { String argCmd = "argument "; @@ -117,7 +133,7 @@ public class UploadArchive extends AbstractGitCommand { // Read arguments in Pkt-Line format PacketLineIn packetIn = new PacketLineIn(in); - for (;;) { + for (; ; ) { String s = packetIn.readString(); if (s == PacketLineIn.END) { break; @@ -167,13 +183,13 @@ public class UploadArchive extends AbstractGitCommand { // Verify the user has permissions to read the specified reference if (!projectControl.allRefsAreVisible() && !canRead(treeId)) { - throw new Failure(5, "fatal: cannot perform upload-archive operation"); + throw new Failure(5, "fatal: cannot perform upload-archive operation"); } - // The archive is sent in DATA sideband channel + // The archive is sent in DATA sideband channel try (SideBandOutputStream sidebandOut = - new SideBandOutputStream(SideBandOutputStream.CH_DATA, - SideBandOutputStream.MAX_BUF, out)) { + new SideBandOutputStream( + SideBandOutputStream.CH_DATA, SideBandOutputStream.MAX_BUF, out)) { new ArchiveCommand(repo) .setFormat(f.name()) .setFormatOptions(getFormatOptions(f)) @@ -189,8 +205,8 @@ public class UploadArchive extends AbstractGitCommand { } catch (Failure f) { // Report the error in ERROR sideband channel try (SideBandOutputStream sidebandError = - new SideBandOutputStream(SideBandOutputStream.CH_ERROR, - SideBandOutputStream.MAX_BUF, out)) { + new SideBandOutputStream( + SideBandOutputStream.CH_ERROR, SideBandOutputStream.MAX_BUF, out)) { sidebandError.write(f.getMessage().getBytes(UTF_8)); sidebandError.flush(); } @@ -203,12 +219,21 @@ public class UploadArchive extends AbstractGitCommand { private Map getFormatOptions(ArchiveFormat f) { if (f == ArchiveFormat.ZIP) { - int value = Arrays.asList(options.level0, options.level1, options.level2, - options.level3, options.level4, options.level5, options.level6, - options.level7, options.level8, options.level9).indexOf(true); + int value = + Arrays.asList( + options.level0, + options.level1, + options.level2, + options.level3, + options.level4, + options.level5, + options.level6, + options.level7, + options.level8, + options.level9) + .indexOf(true); if (value >= 0) { - return ImmutableMap. of( - "level", Integer.valueOf(value)); + return ImmutableMap.of("level", Integer.valueOf(value)); } } return Collections.emptyMap(); diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/VersionCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/VersionCommand.java index 50f880d405..8fac979be2 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/VersionCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/VersionCommand.java @@ -20,8 +20,7 @@ import com.google.gerrit.common.Version; import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshCommand; -@CommandMetaData(name = "version", description = "Display gerrit version", - runsAt = MASTER_OR_SLAVE) +@CommandMetaData(name = "version", description = "Display gerrit version", runsAt = MASTER_OR_SLAVE) final class VersionCommand extends SshCommand { @Override diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/plugin/LfsPluginAuthCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/plugin/LfsPluginAuthCommand.java index 0c8d024f1a..af52e3d3cf 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/plugin/LfsPluginAuthCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/plugin/LfsPluginAuthCommand.java @@ -21,17 +21,14 @@ import com.google.gerrit.sshd.CommandModule; import com.google.gerrit.sshd.SshCommand; import com.google.inject.Inject; import com.google.inject.Provider; - +import java.util.ArrayList; +import java.util.List; import org.eclipse.jgit.lib.Config; import org.kohsuke.args4j.Argument; -import java.util.ArrayList; -import java.util.List; - public class LfsPluginAuthCommand extends SshCommand { public interface LfsSshPluginAuth { - String authenticate(CurrentUser user, List args) - throws UnloggedFailure, Failure; + String authenticate(CurrentUser user, List args) throws UnloggedFailure, Failure; } public static class Module extends CommandModule { @@ -58,8 +55,7 @@ public class LfsPluginAuthCommand extends SshCommand { private List args = new ArrayList<>(); @Inject - LfsPluginAuthCommand(DynamicItem auth, - Provider user) { + LfsPluginAuthCommand(DynamicItem auth, Provider user) { this.auth = auth; this.user = user; } @@ -68,8 +64,8 @@ public class LfsPluginAuthCommand extends SshCommand { protected void run() throws UnloggedFailure, Failure, Exception { LfsSshPluginAuth pluginAuth = auth.get(); if (pluginAuth == null) { - throw new Failure(1, "Server configuration error:" - + " LFS auth over SSH is not properly configured."); + throw new Failure( + 1, "Server configuration error:" + " LFS auth over SSH is not properly configured."); } stdout.print(pluginAuth.authenticate(user.get(), args)); diff --git a/gerrit-sshd/src/test/java/com/google/gerrit/sshd/commands/ProjectConfigParamParserTest.java b/gerrit-sshd/src/test/java/com/google/gerrit/sshd/commands/ProjectConfigParamParserTest.java index ae2a0a06a6..777cb4fb1e 100644 --- a/gerrit-sshd/src/test/java/com/google/gerrit/sshd/commands/ProjectConfigParamParserTest.java +++ b/gerrit-sshd/src/test/java/com/google/gerrit/sshd/commands/ProjectConfigParamParserTest.java @@ -17,16 +17,15 @@ package com.google.gerrit.sshd.commands; import static com.google.common.truth.Truth.assertThat; import com.google.gerrit.extensions.api.projects.ConfigValue; - -import org.junit.Before; -import org.junit.Test; - import java.util.Collections; import java.util.Map; +import org.junit.Before; +import org.junit.Test; public class ProjectConfigParamParserTest { private CreateProjectCommand cmd; + @Before public void setUp() { cmd = new CreateProjectCommand(); diff --git a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/client/RangeSubject.java b/gerrit-test-util/src/main/java/com/google/gerrit/extensions/client/RangeSubject.java index 310276e249..70f5ec637e 100644 --- a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/client/RangeSubject.java +++ b/gerrit-test-util/src/main/java/com/google/gerrit/extensions/client/RangeSubject.java @@ -24,19 +24,16 @@ import com.google.common.truth.Truth; public class RangeSubject extends Subject { - private static final SubjectFactory - RANGE_SUBJECT_FACTORY = + private static final SubjectFactory RANGE_SUBJECT_FACTORY = new SubjectFactory() { @Override - public RangeSubject getSubject(FailureStrategy failureStrategy, - Comment.Range range) { + public RangeSubject getSubject(FailureStrategy failureStrategy, Comment.Range range) { return new RangeSubject(failureStrategy, range); } }; public static RangeSubject assertThat(Comment.Range range) { - return assertAbout(RANGE_SUBJECT_FACTORY) - .that(range); + return assertAbout(RANGE_SUBJECT_FACTORY).that(range); } private RangeSubject(FailureStrategy failureStrategy, Comment.Range range) { diff --git a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/CommitInfoSubject.java b/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/CommitInfoSubject.java index 9af2e1f08c..b2717af8fe 100644 --- a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/CommitInfoSubject.java +++ b/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/CommitInfoSubject.java @@ -25,23 +25,20 @@ import com.google.gerrit.truth.ListSubject; public class CommitInfoSubject extends Subject { - private static final SubjectFactory - COMMIT_INFO_SUBJECT_FACTORY = + private static final SubjectFactory COMMIT_INFO_SUBJECT_FACTORY = new SubjectFactory() { @Override - public CommitInfoSubject getSubject(FailureStrategy failureStrategy, - CommitInfo commitInfo) { + public CommitInfoSubject getSubject( + FailureStrategy failureStrategy, CommitInfo commitInfo) { return new CommitInfoSubject(failureStrategy, commitInfo); } }; public static CommitInfoSubject assertThat(CommitInfo commitInfo) { - return assertAbout(COMMIT_INFO_SUBJECT_FACTORY) - .that(commitInfo); + return assertAbout(COMMIT_INFO_SUBJECT_FACTORY).that(commitInfo); } - private CommitInfoSubject(FailureStrategy failureStrategy, - CommitInfo commitInfo) { + private CommitInfoSubject(FailureStrategy failureStrategy, CommitInfo commitInfo) { super(failureStrategy, commitInfo); } @@ -54,8 +51,8 @@ public class CommitInfoSubject extends Subject { public ListSubject parents() { isNotNull(); CommitInfo commitInfo = actual(); - return ListSubject.assertThat(commitInfo.parents, - CommitInfoSubject::assertThat).named("parents"); + return ListSubject.assertThat(commitInfo.parents, CommitInfoSubject::assertThat) + .named("parents"); } public GitPersonSubject committer() { diff --git a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/EditInfoSubject.java b/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/EditInfoSubject.java index 1471411f0d..95b215887f 100644 --- a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/EditInfoSubject.java +++ b/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/EditInfoSubject.java @@ -22,30 +22,25 @@ import com.google.common.truth.Subject; import com.google.common.truth.SubjectFactory; import com.google.common.truth.Truth; import com.google.gerrit.truth.OptionalSubject; - import java.util.Optional; public class EditInfoSubject extends Subject { - private static final SubjectFactory - EDIT_INFO_SUBJECT_FACTORY = + private static final SubjectFactory EDIT_INFO_SUBJECT_FACTORY = new SubjectFactory() { @Override - public EditInfoSubject getSubject(FailureStrategy failureStrategy, - EditInfo editInfo) { + public EditInfoSubject getSubject(FailureStrategy failureStrategy, EditInfo editInfo) { return new EditInfoSubject(failureStrategy, editInfo); } }; public static EditInfoSubject assertThat(EditInfo editInfo) { - return assertAbout(EDIT_INFO_SUBJECT_FACTORY) - .that(editInfo); + return assertAbout(EDIT_INFO_SUBJECT_FACTORY).that(editInfo); } public static OptionalSubject assertThat( Optional editInfoOptional) { - return OptionalSubject.assertThat(editInfoOptional, - EditInfoSubject::assertThat); + return OptionalSubject.assertThat(editInfoOptional, EditInfoSubject::assertThat); } private EditInfoSubject(FailureStrategy failureStrategy, EditInfo editInfo) { diff --git a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/FixReplacementInfoSubject.java b/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/FixReplacementInfoSubject.java index 1f393264b4..f798622ccd 100644 --- a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/FixReplacementInfoSubject.java +++ b/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/FixReplacementInfoSubject.java @@ -26,26 +26,22 @@ import com.google.gerrit.extensions.client.RangeSubject; public class FixReplacementInfoSubject extends Subject { - private static final SubjectFactory FIX_REPLACEMENT_INFO_SUBJECT_FACTORY = - new SubjectFactory() { - @Override - public FixReplacementInfoSubject getSubject( - FailureStrategy failureStrategy, - FixReplacementInfo fixReplacementInfo) { - return new FixReplacementInfoSubject(failureStrategy, - fixReplacementInfo); - } - }; + private static final SubjectFactory + FIX_REPLACEMENT_INFO_SUBJECT_FACTORY = + new SubjectFactory() { + @Override + public FixReplacementInfoSubject getSubject( + FailureStrategy failureStrategy, FixReplacementInfo fixReplacementInfo) { + return new FixReplacementInfoSubject(failureStrategy, fixReplacementInfo); + } + }; - public static FixReplacementInfoSubject assertThat( - FixReplacementInfo fixReplacementInfo) { - return assertAbout(FIX_REPLACEMENT_INFO_SUBJECT_FACTORY) - .that(fixReplacementInfo); + public static FixReplacementInfoSubject assertThat(FixReplacementInfo fixReplacementInfo) { + return assertAbout(FIX_REPLACEMENT_INFO_SUBJECT_FACTORY).that(fixReplacementInfo); } - private FixReplacementInfoSubject(FailureStrategy failureStrategy, - FixReplacementInfo fixReplacementInfo) { + private FixReplacementInfoSubject( + FailureStrategy failureStrategy, FixReplacementInfo fixReplacementInfo) { super(failureStrategy, fixReplacementInfo); } diff --git a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/FixSuggestionInfoSubject.java b/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/FixSuggestionInfoSubject.java index cc75505add..9af4d1f506 100644 --- a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/FixSuggestionInfoSubject.java +++ b/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/FixSuggestionInfoSubject.java @@ -23,29 +23,24 @@ import com.google.common.truth.SubjectFactory; import com.google.common.truth.Truth; import com.google.gerrit.truth.ListSubject; -public class FixSuggestionInfoSubject - extends Subject { +public class FixSuggestionInfoSubject extends Subject { - private static final SubjectFactory FIX_SUGGESTION_INFO_SUBJECT_FACTORY = - new SubjectFactory() { - @Override - public FixSuggestionInfoSubject getSubject( - FailureStrategy failureStrategy, - FixSuggestionInfo fixSuggestionInfo) { - return new FixSuggestionInfoSubject(failureStrategy, - fixSuggestionInfo); - } - }; + private static final SubjectFactory + FIX_SUGGESTION_INFO_SUBJECT_FACTORY = + new SubjectFactory() { + @Override + public FixSuggestionInfoSubject getSubject( + FailureStrategy failureStrategy, FixSuggestionInfo fixSuggestionInfo) { + return new FixSuggestionInfoSubject(failureStrategy, fixSuggestionInfo); + } + }; - public static FixSuggestionInfoSubject assertThat( - FixSuggestionInfo fixSuggestionInfo) { - return assertAbout(FIX_SUGGESTION_INFO_SUBJECT_FACTORY) - .that(fixSuggestionInfo); + public static FixSuggestionInfoSubject assertThat(FixSuggestionInfo fixSuggestionInfo) { + return assertAbout(FIX_SUGGESTION_INFO_SUBJECT_FACTORY).that(fixSuggestionInfo); } - private FixSuggestionInfoSubject(FailureStrategy failureStrategy, - FixSuggestionInfo fixSuggestionInfo) { + private FixSuggestionInfoSubject( + FailureStrategy failureStrategy, FixSuggestionInfo fixSuggestionInfo) { super(failureStrategy, fixSuggestionInfo); } @@ -53,10 +48,9 @@ public class FixSuggestionInfoSubject return Truth.assertThat(actual().fixId).named("fixId"); } - public ListSubject replacements() { - return ListSubject.assertThat(actual().replacements, - FixReplacementInfoSubject::assertThat).named("replacements"); + public ListSubject replacements() { + return ListSubject.assertThat(actual().replacements, FixReplacementInfoSubject::assertThat) + .named("replacements"); } public FixReplacementInfoSubject onlyReplacement() { diff --git a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/GitPersonSubject.java b/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/GitPersonSubject.java index 3782e94707..9ef06dc5d4 100644 --- a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/GitPersonSubject.java +++ b/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/GitPersonSubject.java @@ -21,28 +21,23 @@ import com.google.common.truth.FailureStrategy; import com.google.common.truth.Subject; import com.google.common.truth.SubjectFactory; import com.google.common.truth.Truth; - import java.sql.Timestamp; public class GitPersonSubject extends Subject { - private static final SubjectFactory - GIT_PERSON_SUBJECT_FACTORY = + private static final SubjectFactory GIT_PERSON_SUBJECT_FACTORY = new SubjectFactory() { @Override - public GitPersonSubject getSubject(FailureStrategy failureStrategy, - GitPerson gitPerson) { + public GitPersonSubject getSubject(FailureStrategy failureStrategy, GitPerson gitPerson) { return new GitPersonSubject(failureStrategy, gitPerson); } }; public static GitPersonSubject assertThat(GitPerson gitPerson) { - return assertAbout(GIT_PERSON_SUBJECT_FACTORY) - .that(gitPerson); + return assertAbout(GIT_PERSON_SUBJECT_FACTORY).that(gitPerson); } - private GitPersonSubject(FailureStrategy failureStrategy, - GitPerson gitPerson) { + private GitPersonSubject(FailureStrategy failureStrategy, GitPerson gitPerson) { super(failureStrategy, gitPerson); } diff --git a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/RobotCommentInfoSubject.java b/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/RobotCommentInfoSubject.java index 6fb9b1b598..afa1b9b9de 100644 --- a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/RobotCommentInfoSubject.java +++ b/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/RobotCommentInfoSubject.java @@ -20,45 +20,38 @@ import com.google.common.truth.FailureStrategy; import com.google.common.truth.Subject; import com.google.common.truth.SubjectFactory; import com.google.gerrit.truth.ListSubject; - import java.util.List; -public class RobotCommentInfoSubject - extends Subject { +public class RobotCommentInfoSubject extends Subject { private static final SubjectFactory ROBOT_COMMENT_INFO_SUBJECT_FACTORY = - new SubjectFactory() { - @Override - public RobotCommentInfoSubject getSubject( - FailureStrategy failureStrategy, - RobotCommentInfo robotCommentInfo) { - return new RobotCommentInfoSubject(failureStrategy, robotCommentInfo); - } - }; + new SubjectFactory() { + @Override + public RobotCommentInfoSubject getSubject( + FailureStrategy failureStrategy, RobotCommentInfo robotCommentInfo) { + return new RobotCommentInfoSubject(failureStrategy, robotCommentInfo); + } + }; - public static ListSubject assertThatList( - List robotCommentInfos) { - return ListSubject.assertThat(robotCommentInfos, - RobotCommentInfoSubject::assertThat).named("robotCommentInfos"); + public static ListSubject assertThatList( + List robotCommentInfos) { + return ListSubject.assertThat(robotCommentInfos, RobotCommentInfoSubject::assertThat) + .named("robotCommentInfos"); } - public static RobotCommentInfoSubject assertThat( - RobotCommentInfo robotCommentInfo) { - return assertAbout(ROBOT_COMMENT_INFO_SUBJECT_FACTORY) - .that(robotCommentInfo); + public static RobotCommentInfoSubject assertThat(RobotCommentInfo robotCommentInfo) { + return assertAbout(ROBOT_COMMENT_INFO_SUBJECT_FACTORY).that(robotCommentInfo); } - private RobotCommentInfoSubject(FailureStrategy failureStrategy, - RobotCommentInfo robotCommentInfo) { + private RobotCommentInfoSubject( + FailureStrategy failureStrategy, RobotCommentInfo robotCommentInfo) { super(failureStrategy, robotCommentInfo); } - public ListSubject fixSuggestions() { - return ListSubject.assertThat(actual().fixSuggestions, - FixSuggestionInfoSubject::assertThat).named("fixSuggestions"); + public ListSubject fixSuggestions() { + return ListSubject.assertThat(actual().fixSuggestions, FixSuggestionInfoSubject::assertThat) + .named("fixSuggestions"); } public FixSuggestionInfoSubject onlyFixSuggestion() { diff --git a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/restapi/BinaryResultSubject.java b/gerrit-test-util/src/main/java/com/google/gerrit/extensions/restapi/BinaryResultSubject.java index daaf283837..989ab0f1f8 100644 --- a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/restapi/BinaryResultSubject.java +++ b/gerrit-test-util/src/main/java/com/google/gerrit/extensions/restapi/BinaryResultSubject.java @@ -22,38 +22,32 @@ import com.google.common.truth.Subject; import com.google.common.truth.SubjectFactory; import com.google.common.truth.Truth; import com.google.gerrit.truth.OptionalSubject; - import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Optional; -public class BinaryResultSubject - extends Subject { +public class BinaryResultSubject extends Subject { private static final SubjectFactory BINARY_RESULT_SUBJECT_FACTORY = - new SubjectFactory() { - @Override - public BinaryResultSubject getSubject(FailureStrategy failureStrategy, - BinaryResult binaryResult) { - return new BinaryResultSubject(failureStrategy, - binaryResult); - } - }; + new SubjectFactory() { + @Override + public BinaryResultSubject getSubject( + FailureStrategy failureStrategy, BinaryResult binaryResult) { + return new BinaryResultSubject(failureStrategy, binaryResult); + } + }; public static BinaryResultSubject assertThat(BinaryResult binaryResult) { - return assertAbout(BINARY_RESULT_SUBJECT_FACTORY) - .that(binaryResult); + return assertAbout(BINARY_RESULT_SUBJECT_FACTORY).that(binaryResult); } public static OptionalSubject assertThat( Optional binaryResultOptional) { - return OptionalSubject.assertThat(binaryResultOptional, - BinaryResultSubject::assertThat); + return OptionalSubject.assertThat(binaryResultOptional, BinaryResultSubject::assertThat); } - private BinaryResultSubject(FailureStrategy failureStrategy, - BinaryResult binaryResult) { + private BinaryResultSubject(FailureStrategy failureStrategy, BinaryResult binaryResult) { super(failureStrategy, binaryResult); } diff --git a/gerrit-test-util/src/main/java/com/google/gerrit/truth/ListSubject.java b/gerrit-test-util/src/main/java/com/google/gerrit/truth/ListSubject.java index 55f948e27e..e7f1074c49 100644 --- a/gerrit-test-util/src/main/java/com/google/gerrit/truth/ListSubject.java +++ b/gerrit-test-util/src/main/java/com/google/gerrit/truth/ListSubject.java @@ -21,7 +21,6 @@ import com.google.common.truth.FailureStrategy; import com.google.common.truth.IterableSubject; import com.google.common.truth.Subject; import com.google.common.truth.SubjectFactory; - import java.util.List; import java.util.function.Function; @@ -34,12 +33,12 @@ public class ListSubject, E> extends IterableSubject { List list, Function elementAssertThatFunction) { // The ListSubjectFactory always returns ListSubjects. // -> Casting is appropriate. - return (ListSubject) assertAbout( - new ListSubjectFactory<>(elementAssertThatFunction)).that(list); + return (ListSubject) + assertAbout(new ListSubjectFactory<>(elementAssertThatFunction)).that(list); } - private ListSubject(FailureStrategy failureStrategy, List list, - Function elementAssertThatFunction) { + private ListSubject( + FailureStrategy failureStrategy, List list, Function elementAssertThatFunction) { super(failureStrategy, list); this.elementAssertThatFunction = elementAssertThatFunction; } @@ -82,12 +81,10 @@ public class ListSubject, E> extends IterableSubject { @SuppressWarnings("unchecked") @Override - public ListSubject getSubject(FailureStrategy failureStrategy, - Iterable objects) { + public ListSubject getSubject(FailureStrategy failureStrategy, Iterable objects) { // The constructor of ListSubject only accepts lists. // -> Casting is appropriate. - return new ListSubject<>(failureStrategy, (List) objects, - elementAssertThatFunction); + return new ListSubject<>(failureStrategy, (List) objects, elementAssertThatFunction); } } } diff --git a/gerrit-test-util/src/main/java/com/google/gerrit/truth/OptionalSubject.java b/gerrit-test-util/src/main/java/com/google/gerrit/truth/OptionalSubject.java index daece878f1..49e91a847d 100644 --- a/gerrit-test-util/src/main/java/com/google/gerrit/truth/OptionalSubject.java +++ b/gerrit-test-util/src/main/java/com/google/gerrit/truth/OptionalSubject.java @@ -21,7 +21,6 @@ import com.google.common.truth.FailureStrategy; import com.google.common.truth.Subject; import com.google.common.truth.SubjectFactory; import com.google.common.truth.Truth; - import java.util.Optional; import java.util.function.Function; @@ -30,16 +29,14 @@ public class OptionalSubject, T> private final Function valueAssertThatFunction; - public static , T> OptionalSubject - assertThat(Optional optional, - Function elementAssertThatFunction) { + public static , T> OptionalSubject assertThat( + Optional optional, Function elementAssertThatFunction) { OptionalSubjectFactory optionalSubjectFactory = new OptionalSubjectFactory<>(elementAssertThatFunction); return assertAbout(optionalSubjectFactory).that(optional); } - public static OptionalSubject assertThat( - Optional optional) { + public static OptionalSubject assertThat(Optional optional) { // Unfortunately, we need to cast to DefaultSubject as Truth.assertThat() // only returns Subject. There shouldn't be a way // for that method not to return a DefaultSubject because the generic type @@ -49,7 +46,9 @@ public class OptionalSubject, T> return assertThat(optional, valueAssertThatFunction); } - private OptionalSubject(FailureStrategy failureStrategy, Optional optional, + private OptionalSubject( + FailureStrategy failureStrategy, + Optional optional, Function valueAssertThatFunction) { super(failureStrategy, optional); this.valueAssertThatFunction = valueAssertThatFunction; @@ -82,22 +81,18 @@ public class OptionalSubject, T> return valueAssertThatFunction.apply(optional.get()); } - private static class OptionalSubjectFactory, - T> extends SubjectFactory, Optional> { + private static class OptionalSubjectFactory, T> + extends SubjectFactory, Optional> { private Function valueAssertThatFunction; - OptionalSubjectFactory( - Function valueAssertThatFunction) { + OptionalSubjectFactory(Function valueAssertThatFunction) { this.valueAssertThatFunction = valueAssertThatFunction; } @Override - public OptionalSubject getSubject(FailureStrategy failureStrategy, - Optional optional) { - return new OptionalSubject<>(failureStrategy, optional, - valueAssertThatFunction); + public OptionalSubject getSubject(FailureStrategy failureStrategy, Optional optional) { + return new OptionalSubject<>(failureStrategy, optional, valueAssertThatFunction); } - } } diff --git a/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/CmdLineParser.java b/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/CmdLineParser.java index 75f11f24f7..11f380d2de 100644 --- a/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/CmdLineParser.java +++ b/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/CmdLineParser.java @@ -40,7 +40,15 @@ import com.google.common.collect.Lists; import com.google.common.collect.MultimapBuilder; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; - +import java.io.StringWriter; +import java.io.Writer; +import java.lang.annotation.Annotation; +import java.lang.reflect.AnnotatedElement; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.ResourceBundle; import org.kohsuke.args4j.Argument; import org.kohsuke.args4j.CmdLineException; import org.kohsuke.args4j.IllegalAnnotationError; @@ -53,23 +61,12 @@ import org.kohsuke.args4j.spi.FieldSetter; import org.kohsuke.args4j.spi.OptionHandler; import org.kohsuke.args4j.spi.Setter; -import java.io.StringWriter; -import java.io.Writer; -import java.lang.annotation.Annotation; -import java.lang.reflect.AnnotatedElement; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.ResourceBundle; - /** * Extended command line parser which handles --foo=value arguments. - *

        - * The args4j package does not natively handle --foo=value and instead prefers - * to see --foo value on the command line. Many users are used to the GNU style - * --foo=value long option, so we convert from the GNU style format to the - * args4j style format prior to invoking args4j for parsing. + * + *

        The args4j package does not natively handle --foo=value and instead prefers to see --foo value + * on the command line. Many users are used to the GNU style --foo=value long option, so we convert + * from the GNU style format to the args4j style format prior to invoking args4j for parsing. */ public class CmdLineParser { public interface Factory { @@ -83,16 +80,13 @@ public class CmdLineParser { private Map options; /** - * Creates a new command line owner that parses arguments/options and set them - * into the given object. + * Creates a new command line owner that parses arguments/options and set them into the given + * object. * - * @param bean instance of a class annotated by - * {@link org.kohsuke.args4j.Option} and - * {@link org.kohsuke.args4j.Argument}. this object will receive - * values. - * - * @throws IllegalAnnotationError if the option bean class is using args4j - * annotations incorrectly. + * @param bean instance of a class annotated by {@link org.kohsuke.args4j.Option} and {@link + * org.kohsuke.args4j.Argument}. this object will receive values. + * @throws IllegalAnnotationError if the option bean class is using args4j annotations + * incorrectly. */ @Inject public CmdLineParser(OptionHandlers handlers, @Assisted final Object bean) @@ -222,10 +216,8 @@ public class CmdLineParser { parser.parseArgument(tmp.toArray(new String[tmp.size()])); } - public void parseOptionMap(Map parameters) - throws CmdLineException { - ListMultimap map = - MultimapBuilder.hashKeys().arrayListValues().build(); + public void parseOptionMap(Map parameters) throws CmdLineException { + ListMultimap map = MultimapBuilder.hashKeys().arrayListValues().build(); for (Map.Entry ent : parameters.entrySet()) { for (String val : ent.getValue()) { map.put(ent.getKey(), val); @@ -234,8 +226,7 @@ public class CmdLineParser { parseOptionMap(map); } - public void parseOptionMap(ListMultimap params) - throws CmdLineException { + public void parseOptionMap(ListMultimap params) throws CmdLineException { List tmp = Lists.newArrayListWithCapacity(2 * params.size()); for (final String key : params.keySet()) { String name = makeOption(key); @@ -299,28 +290,33 @@ public class CmdLineParser { } private boolean toBoolean(String name, String value) throws CmdLineException { - if ("true".equals(value) || "t".equals(value) - || "yes".equals(value) || "y".equals(value) + if ("true".equals(value) + || "t".equals(value) + || "yes".equals(value) + || "y".equals(value) || "on".equals(value) || "1".equals(value) - || value == null || "".equals(value)) { + || value == null + || "".equals(value)) { return true; } - if ("false".equals(value) || "f".equals(value) - || "no".equals(value) || "n".equals(value) + if ("false".equals(value) + || "f".equals(value) + || "no".equals(value) + || "n".equals(value) || "off".equals(value) || "0".equals(value)) { return false; } - throw new CmdLineException(parser, String.format( - "invalid boolean \"%s=%s\"", name, value)); + throw new CmdLineException(parser, String.format("invalid boolean \"%s=%s\"", name, value)); } private class MyParser extends org.kohsuke.args4j.CmdLineParser { @SuppressWarnings("rawtypes") private List optionsList; + private HelpOption help; MyParser(final Object bean) { @@ -330,8 +326,7 @@ public class CmdLineParser { @SuppressWarnings({"unchecked", "rawtypes"}) @Override - protected OptionHandler createOptionHandler(final OptionDef option, - final Setter setter) { + protected OptionHandler createOptionHandler(final OptionDef option, final Setter setter) { if (isHandlerSpecified(option) || isEnum(setter) || isPrimitive(setter)) { return add(super.createOptionHandler(option, setter)); } diff --git a/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/EndOfOptionsHandler.java b/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/EndOfOptionsHandler.java index 2c7f7318e1..4a24ac9dba 100644 --- a/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/EndOfOptionsHandler.java +++ b/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/EndOfOptionsHandler.java @@ -23,8 +23,8 @@ import org.kohsuke.args4j.spi.Setter; /** Typically used with {@code @Option(name="--")} to signal end of options. */ public class EndOfOptionsHandler extends OptionHandler { - public EndOfOptionsHandler(CmdLineParser parser, OptionDef option, - Setter setter) { + public EndOfOptionsHandler( + CmdLineParser parser, OptionDef option, Setter setter) { super(parser, option, setter); } diff --git a/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/OptionHandlerFactory.java b/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/OptionHandlerFactory.java index 8e997786d9..47477a27e8 100644 --- a/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/OptionHandlerFactory.java +++ b/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/OptionHandlerFactory.java @@ -20,6 +20,6 @@ import org.kohsuke.args4j.spi.Setter; /** Creates an args4j OptionHandler through a Guice Injector. */ public interface OptionHandlerFactory { - OptionHandler create(org.kohsuke.args4j.CmdLineParser cmdLineParser, - OptionDef optionDef, Setter setter); + OptionHandler create( + org.kohsuke.args4j.CmdLineParser cmdLineParser, OptionDef optionDef, Setter setter); } diff --git a/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/OptionHandlerUtil.java b/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/OptionHandlerUtil.java index 1ea73ccb58..582bee2143 100644 --- a/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/OptionHandlerUtil.java +++ b/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/OptionHandlerUtil.java @@ -18,10 +18,8 @@ import com.google.inject.Key; import com.google.inject.Module; import com.google.inject.assistedinject.FactoryModuleBuilder; import com.google.inject.util.Types; - -import org.kohsuke.args4j.spi.OptionHandler; - import java.lang.reflect.Type; +import org.kohsuke.args4j.spi.OptionHandler; /** Utilities to support creating OptionHandler instances. */ public class OptionHandlerUtil { @@ -39,11 +37,8 @@ public class OptionHandlerUtil { } public static Module moduleFor(final Class type, Class> impl) { - return new FactoryModuleBuilder() - .implement(handlerOf(type), impl) - .build(keyFor(type)); + return new FactoryModuleBuilder().implement(handlerOf(type), impl).build(keyFor(type)); } - private OptionHandlerUtil() { - } + private OptionHandlerUtil() {} } diff --git a/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/OptionHandlers.java b/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/OptionHandlers.java index 50cad12ebf..84a0809b28 100644 --- a/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/OptionHandlers.java +++ b/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/OptionHandlers.java @@ -23,15 +23,13 @@ import com.google.inject.Key; import com.google.inject.Provider; import com.google.inject.Singleton; import com.google.inject.TypeLiteral; - import java.lang.reflect.ParameterizedType; import java.util.Map.Entry; @Singleton public class OptionHandlers { public static OptionHandlers empty() { - ImmutableMap, Provider>> m = - ImmutableMap.of(); + ImmutableMap, Provider>> m = ImmutableMap.of(); return new OptionHandlers(m); } @@ -53,8 +51,7 @@ public class OptionHandlers { } private static ImmutableMap, Provider>> build(Injector i) { - ImmutableMap.Builder, Provider>> map = - ImmutableMap.builder(); + ImmutableMap.Builder, Provider>> map = ImmutableMap.builder(); for (; i != null; i = i.getParent()) { for (Entry, Binding> e : i.getBindings().entrySet()) { TypeLiteral type = e.getKey().getTypeLiteral(); diff --git a/gerrit-util-http/src/main/java/com/google/gerrit/util/http/RequestUtil.java b/gerrit-util-http/src/main/java/com/google/gerrit/util/http/RequestUtil.java index 888ad2f126..2a359cacd0 100644 --- a/gerrit-util-http/src/main/java/com/google/gerrit/util/http/RequestUtil.java +++ b/gerrit-util-http/src/main/java/com/google/gerrit/util/http/RequestUtil.java @@ -31,8 +31,8 @@ public class RequestUtil { } /** - * @return the same value as {@link HttpServletRequest#getPathInfo()}, but - * without decoding URL-encoded characters. + * @return the same value as {@link HttpServletRequest#getPathInfo()}, but without decoding + * URL-encoded characters. */ public static String getEncodedPathInfo(HttpServletRequest req) { // CS IGNORE LineLength FOR NEXT 3 LINES. REASON: URL. @@ -41,8 +41,8 @@ public class RequestUtil { String servletPath = req.getServletPath(); int servletPathLength = servletPath.length(); String requestUri = req.getRequestURI(); - String pathInfo = requestUri.substring(req.getContextPath().length()) - .replaceAll("[/]{2,}", "/"); + String pathInfo = + requestUri.substring(req.getContextPath().length()).replaceAll("[/]{2,}", "/"); if (pathInfo.startsWith(servletPath)) { pathInfo = pathInfo.substring(servletPathLength); // Corner case: when servlet path & request path match exactly (without @@ -56,6 +56,5 @@ public class RequestUtil { return pathInfo; } - private RequestUtil() { - } + private RequestUtil() {} } diff --git a/gerrit-util-http/src/test/java/com/google/gerrit/util/http/RequestUtilTest.java b/gerrit-util-http/src/test/java/com/google/gerrit/util/http/RequestUtilTest.java index e656e56f70..48b7b9c95b 100644 --- a/gerrit-util-http/src/test/java/com/google/gerrit/util/http/RequestUtilTest.java +++ b/gerrit-util-http/src/test/java/com/google/gerrit/util/http/RequestUtilTest.java @@ -17,48 +17,46 @@ package com.google.gerrit.util.http; import static com.google.common.truth.Truth.assertThat; import com.google.gerrit.util.http.testutil.FakeHttpServletRequest; - import org.junit.Test; public class RequestUtilTest { @Test public void emptyContextPath() { - assertThat(RequestUtil.getEncodedPathInfo( - fakeRequest("", "/s", "/foo/bar"))).isEqualTo("/foo/bar"); - assertThat(RequestUtil.getEncodedPathInfo( - fakeRequest("", "/s", "/foo%2Fbar"))).isEqualTo("/foo%2Fbar"); + assertThat(RequestUtil.getEncodedPathInfo(fakeRequest("", "/s", "/foo/bar"))) + .isEqualTo("/foo/bar"); + assertThat(RequestUtil.getEncodedPathInfo(fakeRequest("", "/s", "/foo%2Fbar"))) + .isEqualTo("/foo%2Fbar"); } @Test public void emptyServletPath() { - assertThat(RequestUtil.getEncodedPathInfo( - fakeRequest("", "/c", "/foo/bar"))).isEqualTo("/foo/bar"); - assertThat(RequestUtil.getEncodedPathInfo( - fakeRequest("", "/c", "/foo%2Fbar"))).isEqualTo("/foo%2Fbar"); + assertThat(RequestUtil.getEncodedPathInfo(fakeRequest("", "/c", "/foo/bar"))) + .isEqualTo("/foo/bar"); + assertThat(RequestUtil.getEncodedPathInfo(fakeRequest("", "/c", "/foo%2Fbar"))) + .isEqualTo("/foo%2Fbar"); } @Test public void trailingSlashes() { - assertThat(RequestUtil.getEncodedPathInfo( - fakeRequest("/c", "/s", "/foo/bar/"))).isEqualTo("/foo/bar/"); - assertThat(RequestUtil.getEncodedPathInfo( - fakeRequest("/c", "/s", "/foo/bar///"))).isEqualTo("/foo/bar/"); - assertThat(RequestUtil.getEncodedPathInfo( - fakeRequest("/c", "/s", "/foo%2Fbar/"))).isEqualTo("/foo%2Fbar/"); - assertThat(RequestUtil.getEncodedPathInfo( - fakeRequest("/c", "/s", "/foo%2Fbar///"))).isEqualTo("/foo%2Fbar/"); + assertThat(RequestUtil.getEncodedPathInfo(fakeRequest("/c", "/s", "/foo/bar/"))) + .isEqualTo("/foo/bar/"); + assertThat(RequestUtil.getEncodedPathInfo(fakeRequest("/c", "/s", "/foo/bar///"))) + .isEqualTo("/foo/bar/"); + assertThat(RequestUtil.getEncodedPathInfo(fakeRequest("/c", "/s", "/foo%2Fbar/"))) + .isEqualTo("/foo%2Fbar/"); + assertThat(RequestUtil.getEncodedPathInfo(fakeRequest("/c", "/s", "/foo%2Fbar///"))) + .isEqualTo("/foo%2Fbar/"); } @Test public void emptyPathInfo() { - assertThat(RequestUtil.getEncodedPathInfo( - fakeRequest("/c", "/s", ""))).isNull(); + assertThat(RequestUtil.getEncodedPathInfo(fakeRequest("/c", "/s", ""))).isNull(); } - private FakeHttpServletRequest fakeRequest(String contextPath, - String servletPath, String pathInfo) { - FakeHttpServletRequest req = new FakeHttpServletRequest( - "gerrit.example.com", 80, contextPath, servletPath); + private FakeHttpServletRequest fakeRequest( + String contextPath, String servletPath, String pathInfo) { + FakeHttpServletRequest req = + new FakeHttpServletRequest("gerrit.example.com", 80, contextPath, servletPath); return req.setPathInfo(pathInfo); } } diff --git a/gerrit-util-http/src/test/java/com/google/gerrit/util/http/testutil/FakeHttpServletRequest.java b/gerrit-util-http/src/test/java/com/google/gerrit/util/http/testutil/FakeHttpServletRequest.java index 4eee495877..cb8ed39150 100644 --- a/gerrit-util-http/src/test/java/com/google/gerrit/util/http/testutil/FakeHttpServletRequest.java +++ b/gerrit-util-http/src/test/java/com/google/gerrit/util/http/testutil/FakeHttpServletRequest.java @@ -24,7 +24,6 @@ import com.google.common.collect.LinkedListMultimap; import com.google.common.collect.ListMultimap; import com.google.common.collect.Maps; import com.google.gerrit.extensions.restapi.Url; - import java.io.BufferedReader; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; @@ -37,7 +36,6 @@ import java.util.Enumeration; import java.util.List; import java.util.Locale; import java.util.Map; - import javax.servlet.AsyncContext; import javax.servlet.DispatcherType; import javax.servlet.RequestDispatcher; @@ -72,8 +70,7 @@ public class FakeHttpServletRequest implements HttpServletRequest { this("gerrit.example.com", 80, "", SERVLET_PATH); } - public FakeHttpServletRequest(String hostName, int port, String contextPath, - String servletPath) { + public FakeHttpServletRequest(String hostName, int port, String contextPath, String servletPath) { this.hostName = checkNotNull(hostName, "hostName"); checkArgument(port > 0); this.port = port; @@ -147,9 +144,7 @@ public class FakeHttpServletRequest implements HttpServletRequest { @Override public Map getParameterMap() { return Collections.unmodifiableMap( - Maps.transformValues( - parameters.asMap(), - vs -> vs.toArray(new String[0]))); + Maps.transformValues(parameters.asMap(), vs -> vs.toArray(new String[0]))); } @Override @@ -167,7 +162,8 @@ public class FakeHttpServletRequest implements HttpServletRequest { for (String entry : Splitter.on('&').split(qs)) { List kv = Splitter.on('=').limit(2).splitToList(entry); try { - params.put(URLDecoder.decode(kv.get(0), UTF_8.name()), + params.put( + URLDecoder.decode(kv.get(0), UTF_8.name()), kv.size() == 2 ? URLDecoder.decode(kv.get(1), UTF_8.name()) : ""); } catch (UnsupportedEncodingException e) { throw new IllegalArgumentException(e); @@ -265,8 +261,7 @@ public class FakeHttpServletRequest implements HttpServletRequest { @Override public long getDateHeader(String name) { String v = getHeader(name); - return v == null ? 0 : - rfcDateformatter.parse(v, Instant::from).getEpochSecond(); + return v == null ? 0 : rfcDateformatter.parse(v, Instant::from).getEpochSecond(); } @Override @@ -472,8 +467,7 @@ public class FakeHttpServletRequest implements HttpServletRequest { } @Override - public T upgrade( - Class httpUpgradeHandlerClass) { + public T upgrade(Class httpUpgradeHandlerClass) { throw new UnsupportedOperationException(); } diff --git a/gerrit-util-http/src/test/java/com/google/gerrit/util/http/testutil/FakeHttpServletResponse.java b/gerrit-util-http/src/test/java/com/google/gerrit/util/http/testutil/FakeHttpServletResponse.java index 442c4744b2..2b1a07e4fd 100644 --- a/gerrit-util-http/src/test/java/com/google/gerrit/util/http/testutil/FakeHttpServletResponse.java +++ b/gerrit-util-http/src/test/java/com/google/gerrit/util/http/testutil/FakeHttpServletResponse.java @@ -23,20 +23,17 @@ import com.google.common.collect.Iterables; import com.google.common.collect.LinkedListMultimap; import com.google.common.collect.ListMultimap; import com.google.common.net.HttpHeaders; - -import org.eclipse.jgit.util.RawParseUtils; - import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.nio.charset.Charset; import java.util.Collection; import java.util.Locale; - import javax.servlet.ServletOutputStream; import javax.servlet.WriteListener; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletResponse; +import org.eclipse.jgit.util.RawParseUtils; /** Simple fake implementation of {@link HttpServletResponse}. */ public class FakeHttpServletResponse implements HttpServletResponse { @@ -48,8 +45,7 @@ public class FakeHttpServletResponse implements HttpServletResponse { private ServletOutputStream outputStream; private PrintWriter writer; - public FakeHttpServletResponse() { - } + public FakeHttpServletResponse() {} @Override public synchronized void flushBuffer() throws IOException { @@ -85,22 +81,23 @@ public class FakeHttpServletResponse implements HttpServletResponse { public synchronized ServletOutputStream getOutputStream() { checkState(writer == null, "getWriter() already called"); if (outputStream == null) { - outputStream = new ServletOutputStream() { - @Override - public void write(int c) throws IOException { - actualBody.write(c); - } + outputStream = + new ServletOutputStream() { + @Override + public void write(int c) throws IOException { + actualBody.write(c); + } - @Override - public boolean isReady() { - return true; - } + @Override + public boolean isReady() { + return true; + } - @Override - public void setWriteListener(WriteListener listener) { - throw new UnsupportedOperationException(); - } - }; + @Override + public void setWriteListener(WriteListener listener) { + throw new UnsupportedOperationException(); + } + }; } return outputStream; } @@ -136,8 +133,7 @@ public class FakeHttpServletResponse implements HttpServletResponse { @Override public void setCharacterEncoding(String name) { - checkArgument(UTF_8.equals(Charset.forName(name)), - "unsupported charset: %s", name); + checkArgument(UTF_8.equals(Charset.forName(name)), "unsupported charset: %s", name); } @Override @@ -265,8 +261,7 @@ public class FakeHttpServletResponse implements HttpServletResponse { @Override public String getHeader(String name) { - return Iterables.getFirst( - headers.get(checkNotNull(name.toLowerCase())), null); + return Iterables.getFirst(headers.get(checkNotNull(name.toLowerCase())), null); } @Override diff --git a/gerrit-util-ssl/src/main/java/com/google/gerrit/util/ssl/BlindSSLSocketFactory.java b/gerrit-util-ssl/src/main/java/com/google/gerrit/util/ssl/BlindSSLSocketFactory.java index b8af85e53e..171e059ca3 100644 --- a/gerrit-util-ssl/src/main/java/com/google/gerrit/util/ssl/BlindSSLSocketFactory.java +++ b/gerrit-util-ssl/src/main/java/com/google/gerrit/util/ssl/BlindSSLSocketFactory.java @@ -21,7 +21,6 @@ import java.net.UnknownHostException; import java.security.GeneralSecurityException; import java.security.SecureRandom; import java.security.cert.X509Certificate; - import javax.net.SocketFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; @@ -33,20 +32,19 @@ public class BlindSSLSocketFactory extends SSLSocketFactory { private static final BlindSSLSocketFactory INSTANCE; static { - final X509TrustManager dummyTrustManager = new X509TrustManager() { - @Override - public X509Certificate[] getAcceptedIssuers() { - return null; - } + final X509TrustManager dummyTrustManager = + new X509TrustManager() { + @Override + public X509Certificate[] getAcceptedIssuers() { + return null; + } - @Override - public void checkClientTrusted(X509Certificate[] chain, String authType) { - } + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) {} - @Override - public void checkServerTrusted(X509Certificate[] chain, String authType) { - } - }; + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) {} + }; try { final SSLContext context = SSLContext.getInstance("SSL"); @@ -91,8 +89,7 @@ public class BlindSSLSocketFactory extends SSLSocketFactory { } @Override - public Socket createSocket(String host, int port) throws IOException, - UnknownHostException { + public Socket createSocket(String host, int port) throws IOException, UnknownHostException { return sslFactory.createSocket(host, port); } @@ -102,14 +99,14 @@ public class BlindSSLSocketFactory extends SSLSocketFactory { } @Override - public Socket createSocket(String host, int port, InetAddress localHost, - int localPort) throws IOException, UnknownHostException { + public Socket createSocket(String host, int port, InetAddress localHost, int localPort) + throws IOException, UnknownHostException { return sslFactory.createSocket(host, port, localHost, localPort); } @Override - public Socket createSocket(InetAddress address, int port, - InetAddress localAddress, int localPort) throws IOException { + public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) + throws IOException { return sslFactory.createSocket(address, port, localAddress, localPort); } } diff --git a/gerrit-war/src/main/java/com/google/gerrit/httpd/ReviewDbDataSourceProvider.java b/gerrit-war/src/main/java/com/google/gerrit/httpd/ReviewDbDataSourceProvider.java index 86e75969c5..269334032b 100644 --- a/gerrit-war/src/main/java/com/google/gerrit/httpd/ReviewDbDataSourceProvider.java +++ b/gerrit-war/src/main/java/com/google/gerrit/httpd/ReviewDbDataSourceProvider.java @@ -18,15 +18,13 @@ import com.google.gerrit.extensions.events.LifecycleListener; import com.google.inject.Provider; import com.google.inject.ProvisionException; import com.google.inject.Singleton; - import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; /** Provides access to the {@code ReviewDb} DataSource. */ @Singleton -final class ReviewDbDataSourceProvider implements Provider, - LifecycleListener { +final class ReviewDbDataSourceProvider implements Provider, LifecycleListener { private DataSource ds; @Override @@ -38,8 +36,7 @@ final class ReviewDbDataSourceProvider implements Provider, } @Override - public void start() { - } + public void start() {} @Override public synchronized void stop() { diff --git a/gerrit-war/src/main/java/com/google/gerrit/httpd/SiteInitializer.java b/gerrit-war/src/main/java/com/google/gerrit/httpd/SiteInitializer.java index ea4a3ea1a9..07e662beea 100644 --- a/gerrit-war/src/main/java/com/google/gerrit/httpd/SiteInitializer.java +++ b/gerrit-war/src/main/java/com/google/gerrit/httpd/SiteInitializer.java @@ -16,10 +16,6 @@ package com.google.gerrit.httpd; import com.google.gerrit.pgm.init.BaseInit; import com.google.gerrit.pgm.init.PluginsDistribution; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.nio.file.Path; import java.nio.file.Paths; import java.sql.Connection; @@ -27,18 +23,22 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public final class SiteInitializer { - private static final Logger LOG = LoggerFactory - .getLogger(SiteInitializer.class); + private static final Logger LOG = LoggerFactory.getLogger(SiteInitializer.class); private final String sitePath; private final String initPath; private final PluginsDistribution pluginsDistribution; private final List pluginsToInstall; - SiteInitializer(String sitePath, String initPath, - PluginsDistribution pluginsDistribution, List pluginsToInstall) { + SiteInitializer( + String sitePath, + String initPath, + PluginsDistribution pluginsDistribution, + List pluginsToInstall) { this.sitePath = sitePath; this.initPath = initPath; this.pluginsDistribution = pluginsDistribution; @@ -61,8 +61,14 @@ public final class SiteInitializer { } if (site != null) { LOG.info("Initializing site at " + site.toRealPath().normalize()); - new BaseInit(site, new ReviewDbDataSourceProvider(), false, false, - pluginsDistribution, pluginsToInstall).run(); + new BaseInit( + site, + new ReviewDbDataSourceProvider(), + false, + false, + pluginsDistribution, + pluginsToInstall) + .run(); } } } catch (Exception e) { @@ -77,8 +83,7 @@ public final class SiteInitializer { private Path getSiteFromReviewDb(Connection conn) { try (Statement stmt = conn.createStatement(); - ResultSet rs = stmt.executeQuery( - "SELECT site_path FROM system_config")) { + ResultSet rs = stmt.executeQuery("SELECT site_path FROM system_config")) { if (rs.next()) { return Paths.get(rs.getString(1)); } diff --git a/gerrit-war/src/main/java/com/google/gerrit/httpd/SitePathFromSystemConfigProvider.java b/gerrit-war/src/main/java/com/google/gerrit/httpd/SitePathFromSystemConfigProvider.java index 33f9ae34bf..dee56210f7 100644 --- a/gerrit-war/src/main/java/com/google/gerrit/httpd/SitePathFromSystemConfigProvider.java +++ b/gerrit-war/src/main/java/com/google/gerrit/httpd/SitePathFromSystemConfigProvider.java @@ -21,7 +21,6 @@ import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.SchemaFactory; import com.google.inject.Inject; import com.google.inject.Provider; - import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; @@ -31,8 +30,7 @@ class SitePathFromSystemConfigProvider implements Provider { private final Path path; @Inject - SitePathFromSystemConfigProvider(SchemaFactory schemaFactory) - throws OrmException { + SitePathFromSystemConfigProvider(SchemaFactory schemaFactory) throws OrmException { path = read(schemaFactory); } @@ -41,8 +39,7 @@ class SitePathFromSystemConfigProvider implements Provider { return path; } - private static Path read(SchemaFactory schemaFactory) - throws OrmException { + private static Path read(SchemaFactory schemaFactory) throws OrmException { try (ReviewDb db = schemaFactory.open()) { List all = db.systemConfig().all().toList(); switch (all.size()) { @@ -51,8 +48,8 @@ class SitePathFromSystemConfigProvider implements Provider { case 0: throw new OrmException("system_config table is empty"); default: - throw new OrmException("system_config must have exactly 1 row;" - + " found " + all.size() + " rows instead"); + throw new OrmException( + "system_config must have exactly 1 row;" + " found " + all.size() + " rows instead"); } } } diff --git a/gerrit-war/src/main/java/com/google/gerrit/httpd/UnzippedDistribution.java b/gerrit-war/src/main/java/com/google/gerrit/httpd/UnzippedDistribution.java index d35f31d292..b5a1daef90 100644 --- a/gerrit-war/src/main/java/com/google/gerrit/httpd/UnzippedDistribution.java +++ b/gerrit-war/src/main/java/com/google/gerrit/httpd/UnzippedDistribution.java @@ -19,7 +19,6 @@ import static com.google.gerrit.pgm.init.InitPlugins.PLUGIN_DIR; import com.google.gerrit.pgm.init.PluginsDistribution; import com.google.inject.Singleton; - import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -27,7 +26,6 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; - import javax.servlet.ServletContext; @Singleton @@ -46,8 +44,7 @@ class UnzippedDistribution implements PluginsDistribution { if (list != null) { for (File p : list) { String pluginJarName = p.getName(); - String pluginName = pluginJarName.substring(0, - pluginJarName.length() - JAR.length()); + String pluginName = pluginJarName.substring(0, pluginJarName.length() - JAR.length()); try (InputStream in = new FileInputStream(p)) { processor.process(pluginName, in); } @@ -61,8 +58,7 @@ class UnzippedDistribution implements PluginsDistribution { String[] list = getPluginsDir().list(); if (list != null) { for (String pluginJarName : list) { - String pluginName = pluginJarName.substring(0, - pluginJarName.length() - JAR.length()); + String pluginName = pluginJarName.substring(0, pluginJarName.length() - JAR.length()); names.add(pluginName); } } diff --git a/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java b/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java index 6a8cd2f400..027a18c3a6 100644 --- a/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java +++ b/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java @@ -90,18 +90,12 @@ import com.google.inject.servlet.GuiceFilter; import com.google.inject.servlet.GuiceServletContextListener; import com.google.inject.spi.Message; import com.google.inject.util.Providers; - -import org.eclipse.jgit.lib.Config; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collections; import java.util.List; - import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -112,12 +106,13 @@ import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.sql.DataSource; +import org.eclipse.jgit.lib.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** Configures the web application environment for Gerrit Code Review. */ -public class WebAppInitializer extends GuiceServletContextListener - implements Filter { - private static final Logger log = - LoggerFactory.getLogger(WebAppInitializer.class); +public class WebAppInitializer extends GuiceServletContextListener implements Filter { + private static final Logger log = LoggerFactory.getLogger(WebAppInitializer.class); private Path sitePath; private Injector dbInjector; @@ -133,8 +128,8 @@ public class WebAppInitializer extends GuiceServletContextListener private IndexType indexType; @Override - public void doFilter(ServletRequest req, ServletResponse res, - FilterChain chain) throws IOException, ServletException { + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) + throws IOException, ServletException { filter.doFilter(req, res, chain); } @@ -151,11 +146,15 @@ public class WebAppInitializer extends GuiceServletContextListener if (installPlugins == null) { pluginsToInstall = null; } else { - pluginsToInstall = Splitter.on(",").trimResults().omitEmptyStrings() - .splitToList(installPlugins); + pluginsToInstall = + Splitter.on(",").trimResults().omitEmptyStrings().splitToList(installPlugins); } - new SiteInitializer(path, System.getProperty("gerrit.init_path"), - new UnzippedDistribution(servletContext), pluginsToInstall).init(); + new SiteInitializer( + path, + System.getProperty("gerrit.init_path"), + new UnzippedDistribution(servletContext), + pluginsToInstall) + .init(); } try { @@ -181,8 +180,7 @@ public class WebAppInitializer extends GuiceServletContextListener cfgInjector = createCfgInjector(); initIndexType(); - config = cfgInjector.getInstance( - Key.get(Config.class, GerritServerConfig.class)); + config = cfgInjector.getInstance(Key.get(Config.class, GerritServerConfig.class)); sysInjector = createSysInjector(); if (!sshdOff()) { sshInjector = createSshInjector(); @@ -205,9 +203,9 @@ public class WebAppInitializer extends GuiceServletContextListener // injection here because the HTTP environment is not visible // to the core server modules. // - sysInjector.getInstance(HttpCanonicalWebUrlProvider.class) - .setHttpServletRequest( - webInjector.getProvider(HttpServletRequest.class)); + sysInjector + .getInstance(HttpCanonicalWebUrlProvider.class) + .setHttpServletRequest(webInjector.getProvider(HttpServletRequest.class)); filter = webInjector.getInstance(GuiceFilter.class); manager = new LifecycleManager(); @@ -230,46 +228,50 @@ public class WebAppInitializer extends GuiceServletContextListener AbstractModule secureStore = createSecureStoreModule(); modules.add(secureStore); if (sitePath != null) { - Module sitePathModule = new AbstractModule() { - @Override - protected void configure() { - bind(Path.class).annotatedWith(SitePath.class).toInstance(sitePath); - } - }; + Module sitePathModule = + new AbstractModule() { + @Override + protected void configure() { + bind(Path.class).annotatedWith(SitePath.class).toInstance(sitePath); + } + }; modules.add(sitePathModule); Module configModule = new GerritServerConfigModule(); modules.add(configModule); Injector cfgInjector = Guice.createInjector(sitePathModule, configModule, secureStore); - Config cfg = cfgInjector.getInstance(Key.get(Config.class, - GerritServerConfig.class)); + Config cfg = cfgInjector.getInstance(Key.get(Config.class, GerritServerConfig.class)); String dbType = cfg.getString("database", null, "type"); - final DataSourceType dst = Guice.createInjector(new DataSourceModule(), - configModule, sitePathModule, secureStore).getInstance( - Key.get(DataSourceType.class, Names.named(dbType.toLowerCase()))); - modules.add(new LifecycleModule() { - @Override - protected void configure() { - bind(DataSourceType.class).toInstance(dst); - bind(DataSourceProvider.Context.class).toInstance( - DataSourceProvider.Context.MULTI_USER); - bind(Key.get(DataSource.class, Names.named("ReviewDb"))).toProvider( - DataSourceProvider.class).in(SINGLETON); - listener().to(DataSourceProvider.class); - } - }); + final DataSourceType dst = + Guice.createInjector(new DataSourceModule(), configModule, sitePathModule, secureStore) + .getInstance(Key.get(DataSourceType.class, Names.named(dbType.toLowerCase()))); + modules.add( + new LifecycleModule() { + @Override + protected void configure() { + bind(DataSourceType.class).toInstance(dst); + bind(DataSourceProvider.Context.class) + .toInstance(DataSourceProvider.Context.MULTI_USER); + bind(Key.get(DataSource.class, Names.named("ReviewDb"))) + .toProvider(DataSourceProvider.class) + .in(SINGLETON); + listener().to(DataSourceProvider.class); + } + }); } else { - modules.add(new LifecycleModule() { - @Override - protected void configure() { - bind(Key.get(DataSource.class, Names.named("ReviewDb"))).toProvider( - ReviewDbDataSourceProvider.class).in(SINGLETON); - listener().to(ReviewDbDataSourceProvider.class); - } - }); + modules.add( + new LifecycleModule() { + @Override + protected void configure() { + bind(Key.get(DataSource.class, Names.named("ReviewDb"))) + .toProvider(ReviewDbDataSourceProvider.class) + .in(SINGLETON); + listener().to(ReviewDbDataSourceProvider.class); + } + }); } modules.add(new DatabaseModule()); modules.add(new DropWizardMetricMaker.ApiModule()); @@ -283,13 +285,16 @@ public class WebAppInitializer extends GuiceServletContextListener // we need to get it from the database, as that's our old // method of locating the site path on disk. // - modules.add(new AbstractModule() { - @Override - protected void configure() { - bind(Path.class).annotatedWith(SitePath.class).toProvider( - SitePathFromSystemConfigProvider.class).in(SINGLETON); - } - }); + modules.add( + new AbstractModule() { + @Override + protected void configure() { + bind(Path.class) + .annotatedWith(SitePath.class) + .toProvider(SitePathFromSystemConfigProvider.class) + .in(SINGLETON); + } + }); modules.add(new GerritServerConfigModule()); } modules.add(new SchemaModule()); @@ -327,20 +332,21 @@ public class WebAppInitializer extends GuiceServletContextListener modules.add(createIndexModule()); modules.add(new WorkQueue.Module()); - modules.add(new CanonicalWebUrlModule() { - @Override - protected Class> provider() { - return HttpCanonicalWebUrlProvider.class; - } - }); + modules.add( + new CanonicalWebUrlModule() { + @Override + protected Class> provider() { + return HttpCanonicalWebUrlProvider.class; + } + }); modules.add(SshKeyCacheImpl.module()); - modules.add(new AbstractModule() { - @Override - protected void configure() { - bind(GerritOptions.class) - .toInstance(new GerritOptions(config, false, false, false)); - } - }); + modules.add( + new AbstractModule() { + @Override + protected void configure() { + bind(GerritOptions.class).toInstance(new GerritOptions(config, false, false, false)); + } + }); modules.add(new GarbageCollectionModule()); modules.add(new ChangeCleanupRunner.Module()); modules.addAll(LibModuleLoader.loadModules(cfgInjector)); @@ -366,9 +372,11 @@ public class WebAppInitializer extends GuiceServletContextListener final List modules = new ArrayList<>(); modules.add(sysInjector.getInstance(SshModule.class)); modules.add(new SshHostKeyModule()); - modules.add(new DefaultCommandModule(false, - sysInjector.getInstance(DownloadConfig.class), - sysInjector.getInstance(LfsPluginAuthCommand.Module.class))); + modules.add( + new DefaultCommandModule( + false, + sysInjector.getInstance(DownloadConfig.class), + sysInjector.getInstance(LfsPluginAuthCommand.Module.class))); if (indexType == IndexType.LUCENE) { modules.add(new IndexCommandsModule()); } @@ -431,10 +439,10 @@ public class WebAppInitializer extends GuiceServletContextListener return new AbstractModule() { @Override public void configure() { - String secureStoreClassName = - GerritServerConfigModule.getSecureStoreClassName(sitePath); - bind(String.class).annotatedWith(SecureStoreClassName.class).toProvider( - Providers.of(secureStoreClassName)); + String secureStoreClassName = GerritServerConfigModule.getSecureStoreClassName(sitePath); + bind(String.class) + .annotatedWith(SecureStoreClassName.class) + .toProvider(Providers.of(secureStoreClassName)); } }; } diff --git a/lib/asciidoctor/java/AsciiDoctor.java b/lib/asciidoctor/java/AsciiDoctor.java index 1871b0c324..4dbc763958 100644 --- a/lib/asciidoctor/java/AsciiDoctor.java +++ b/lib/asciidoctor/java/AsciiDoctor.java @@ -13,18 +13,6 @@ // limitations under the License. import com.google.common.io.ByteStreams; - -import org.asciidoctor.Asciidoctor; -import org.asciidoctor.AttributesBuilder; -import org.asciidoctor.Options; -import org.asciidoctor.OptionsBuilder; -import org.asciidoctor.SafeMode; -import org.asciidoctor.internal.JRubyAsciidoctor; -import org.kohsuke.args4j.Argument; -import org.kohsuke.args4j.CmdLineException; -import org.kohsuke.args4j.CmdLineParser; -import org.kohsuke.args4j.Option; - import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; @@ -39,6 +27,16 @@ import java.util.List; import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; +import org.asciidoctor.Asciidoctor; +import org.asciidoctor.AttributesBuilder; +import org.asciidoctor.Options; +import org.asciidoctor.OptionsBuilder; +import org.asciidoctor.SafeMode; +import org.asciidoctor.internal.JRubyAsciidoctor; +import org.kohsuke.args4j.Argument; +import org.kohsuke.args4j.CmdLineException; +import org.kohsuke.args4j.CmdLineParser; +import org.kohsuke.args4j.Option; public class AsciiDoctor { @@ -67,16 +65,16 @@ public class AsciiDoctor { @Option(name = "--mktmp", usage = "create a temporary output path") private boolean mktmp; - @Option(name = "-a", usage = - "a list of attributes, in the form key or key=value pair") + @Option(name = "-a", usage = "a list of attributes, in the form key or key=value pair") private List attributes = new ArrayList<>(); - @Option(name = "--bazel", usage = - "bazel mode: generate multiple output files instead of a single zip file") + @Option( + name = "--bazel", + usage = "bazel mode: generate multiple output files instead of a single zip file" + ) private boolean bazel; - @Option(name = "--revnumber-file", usage = - "the file contains revnumber string") + @Option(name = "--revnumber-file", usage = "the file contains revnumber string") private File revnumberFile; @Argument(usage = "input files") @@ -84,8 +82,7 @@ public class AsciiDoctor { private String revnumber; - public static String mapInFileToOutFile( - String inFile, String inExt, String outExt) { + public static String mapInFileToOutFile(String inFile, String inExt, String outExt) { String basename = new File(inFile).getName(); if (basename.endsWith(inExt)) { basename = basename.substring(0, basename.length() - inExt.length()); @@ -147,8 +144,7 @@ public class AsciiDoctor { try { parser.parseArgument(parameters); if (inputFiles.isEmpty()) { - throw new CmdLineException(parser, - "asciidoctor: FAILED: input file missing"); + throw new CmdLineException(parser, "asciidoctor: FAILED: input file missing"); } } catch (CmdLineException e) { System.err.println(e.getMessage()); @@ -158,8 +154,7 @@ public class AsciiDoctor { } if (revnumberFile != null) { - try (BufferedReader reader = - new BufferedReader(new FileReader(revnumberFile))) { + try (BufferedReader reader = new BufferedReader(new FileReader(revnumberFile))) { revnumber = reader.readLine(); } } @@ -171,16 +166,17 @@ public class AsciiDoctor { if (bazel) { renderFiles(inputFiles, null); } else { - try (ZipOutputStream zip = - new ZipOutputStream(new FileOutputStream(zipFile))) { + try (ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(zipFile))) { renderFiles(inputFiles, zip); - File[] cssFiles = tmpdir.listFiles(new FilenameFilter() { - @Override - public boolean accept(File dir, String name) { - return name.endsWith(".css"); - } - }); + File[] cssFiles = + tmpdir.listFiles( + new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + return name.endsWith(".css"); + } + }); for (File css : cssFiles) { zipFile(css, css.getName(), zip); } @@ -188,8 +184,7 @@ public class AsciiDoctor { } } - private void renderFiles(List inputFiles, ZipOutputStream zip) - throws IOException { + private void renderFiles(List inputFiles, ZipOutputStream zip) throws IOException { Asciidoctor asciidoctor = JRubyAsciidoctor.create(); for (String inputFile : inputFiles) { String outName = mapInFileToOutFile(inputFile, inExt, outExt); @@ -198,8 +193,7 @@ public class AsciiDoctor { out.getParentFile().mkdirs(); } File input = new File(inputFile); - Options options = - createOptions(basedir != null ? basedir : input.getParentFile(), out); + Options options = createOptions(basedir != null ? basedir : input.getParentFile(), out); asciidoctor.renderFile(input, options); if (zip != null) { zipFile(out, outName, zip); @@ -207,8 +201,7 @@ public class AsciiDoctor { } } - public static void zipFile(File file, String name, ZipOutputStream zip) - throws IOException { + public static void zipFile(File file, String name, ZipOutputStream zip) throws IOException { zip.putNextEntry(new ZipEntry(name)); try (FileInputStream input = new FileInputStream(file)) { ByteStreams.copy(input, zip); diff --git a/lib/asciidoctor/java/DocIndexer.java b/lib/asciidoctor/java/DocIndexer.java index aa29d35634..395f9fe82f 100644 --- a/lib/asciidoctor/java/DocIndexer.java +++ b/lib/asciidoctor/java/DocIndexer.java @@ -15,23 +15,6 @@ import static java.nio.charset.StandardCharsets.UTF_8; import com.google.gerrit.server.documentation.Constants; - -import org.apache.lucene.analysis.standard.StandardAnalyzer; -import org.apache.lucene.analysis.util.CharArraySet; -import org.apache.lucene.document.Document; -import org.apache.lucene.document.Field; -import org.apache.lucene.document.StringField; -import org.apache.lucene.document.TextField; -import org.apache.lucene.index.IndexWriter; -import org.apache.lucene.index.IndexWriterConfig; -import org.apache.lucene.index.IndexWriterConfig.OpenMode; -import org.apache.lucene.store.IndexInput; -import org.apache.lucene.store.RAMDirectory; -import org.kohsuke.args4j.Argument; -import org.kohsuke.args4j.CmdLineException; -import org.kohsuke.args4j.CmdLineParser; -import org.kohsuke.args4j.Option; - import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.File; @@ -50,6 +33,21 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; +import org.apache.lucene.analysis.standard.StandardAnalyzer; +import org.apache.lucene.analysis.util.CharArraySet; +import org.apache.lucene.document.Document; +import org.apache.lucene.document.Field; +import org.apache.lucene.document.StringField; +import org.apache.lucene.document.TextField; +import org.apache.lucene.index.IndexWriter; +import org.apache.lucene.index.IndexWriterConfig; +import org.apache.lucene.index.IndexWriterConfig.OpenMode; +import org.apache.lucene.store.IndexInput; +import org.apache.lucene.store.RAMDirectory; +import org.kohsuke.args4j.Argument; +import org.kohsuke.args4j.CmdLineException; +import org.kohsuke.args4j.CmdLineParser; +import org.kohsuke.args4j.Option; public class DocIndexer { private static final Pattern SECTION_HEADER = Pattern.compile("^=+ (.*)"); @@ -85,8 +83,7 @@ public class DocIndexer { try (JarOutputStream jar = new JarOutputStream(new FileOutputStream(outFile))) { byte[] compressedIndex = zip(index()); - JarEntry entry = new JarEntry( - String.format("%s/%s", Constants.PACKAGE, Constants.INDEX_ZIP)); + JarEntry entry = new JarEntry(String.format("%s/%s", Constants.PACKAGE, Constants.INDEX_ZIP)); entry.setSize(compressedIndex.length); jar.putNextEntry(entry); jar.write(compressedIndex); @@ -94,11 +91,10 @@ public class DocIndexer { } } - private RAMDirectory index() throws IOException, - UnsupportedEncodingException, FileNotFoundException { + private RAMDirectory index() + throws IOException, UnsupportedEncodingException, FileNotFoundException { RAMDirectory directory = new RAMDirectory(); - IndexWriterConfig config = new IndexWriterConfig( - new StandardAnalyzer(CharArraySet.EMPTY_SET)); + IndexWriterConfig config = new IndexWriterConfig(new StandardAnalyzer(CharArraySet.EMPTY_SET)); config.setOpenMode(OpenMode.CREATE); config.setCommitOnClose(true); try (IndexWriter iwriter = new IndexWriter(directory, config)) { @@ -109,8 +105,8 @@ public class DocIndexer { } String title; - try (BufferedReader titleReader = new BufferedReader( - new InputStreamReader(new FileInputStream(file), UTF_8))) { + try (BufferedReader titleReader = + new BufferedReader(new InputStreamReader(new FileInputStream(file), UTF_8))) { title = titleReader.readLine(); if (title != null && title.startsWith("[[")) { // Generally the first line of the txt is the title. In a few cases the @@ -123,13 +119,11 @@ public class DocIndexer { title = matcher.group(1); } - String outputFile = AsciiDoctor.mapInFileToOutFile( - inputFile, inExt, outExt); + String outputFile = AsciiDoctor.mapInFileToOutFile(inputFile, inExt, outExt); try (FileReader reader = new FileReader(file)) { Document doc = new Document(); doc.add(new TextField(Constants.DOC_FIELD, reader)); - doc.add(new StringField( - Constants.URL_FIELD, prefix + outputFile, Field.Store.YES)); + doc.add(new StringField(Constants.URL_FIELD, prefix + outputFile, Field.Store.YES)); doc.add(new TextField(Constants.TITLE_FIELD, title, Field.Store.YES)); iwriter.addDocument(doc); } diff --git a/lib/prolog/java/BuckPrologCompiler.java b/lib/prolog/java/BuckPrologCompiler.java index 6010be25d5..d3f41c08cf 100644 --- a/lib/prolog/java/BuckPrologCompiler.java +++ b/lib/prolog/java/BuckPrologCompiler.java @@ -14,7 +14,6 @@ import com.googlecode.prolog_cafe.compiler.Compiler; import com.googlecode.prolog_cafe.exceptions.CompileException; - import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -58,8 +57,7 @@ public class BuckPrologCompiler { } } - private static void add(JarOutputStream out, File classes, String prefix) - throws IOException { + private static void add(JarOutputStream out, File classes, String prefix) throws IOException { String[] list = classes.list(); if (list == null) { return;